@rxap/layout 16.0.0-dev.9 → 16.0.1-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +261 -0
  2. package/LICENSE +621 -0
  3. package/LICENSE.md +621 -0
  4. package/README.md +1 -1
  5. package/esm2022/index.mjs +1 -4
  6. package/esm2022/lib/app-url.service.mjs +38 -25
  7. package/esm2022/lib/footer/footer.component.mjs +3 -3
  8. package/esm2022/lib/header/apps-button/apps-button.component.mjs +3 -5
  9. package/esm2022/lib/header/header.component.mjs +30 -47
  10. package/esm2022/lib/header/language-selector/language-selector.component.mjs +6 -6
  11. package/esm2022/lib/header/reset-button/reset-button.component.mjs +3 -3
  12. package/esm2022/lib/header/settings-button/settings-button.component.mjs +87 -0
  13. package/esm2022/lib/header/sidenav-toggle-button/sidenav-toggle-button.component.mjs +15 -18
  14. package/esm2022/lib/header/sign-out/sign-out.component.mjs +3 -3
  15. package/esm2022/lib/header/user-profile-icon/user-profile-icon.component.mjs +24 -21
  16. package/esm2022/lib/layout/layout.component.mjs +50 -29
  17. package/esm2022/lib/layout/layout.component.service.mjs +53 -19
  18. package/esm2022/lib/navigation/navigation-item/navigation-item.component.mjs +3 -8
  19. package/esm2022/lib/navigation/navigation.component.mjs +6 -10
  20. package/esm2022/lib/sidenav/sidenav.component.mjs +6 -12
  21. package/esm2022/lib/sidenav/version/version.component.mjs +6 -14
  22. package/esm2022/lib/toggle-window-sidenav-button/toggle-window-sidenav-button.component.mjs +3 -3
  23. package/esm2022/lib/window-container-sidenav/window-container-sidenav.component.mjs +6 -8
  24. package/fesm2022/rxap-layout.mjs +364 -343
  25. package/fesm2022/rxap-layout.mjs.map +1 -1
  26. package/index.d.ts +0 -3
  27. package/lib/app-url.service.d.ts +7 -4
  28. package/lib/header/header.component.d.ts +10 -17
  29. package/lib/header/language-selector/language-selector.component.d.ts +1 -1
  30. package/lib/header/settings-button/settings-button.component.d.ts +39 -0
  31. package/lib/header/sidenav-toggle-button/sidenav-toggle-button.component.d.ts +6 -3
  32. package/lib/header/user-profile-icon/user-profile-icon.component.d.ts +10 -10
  33. package/lib/layout/layout.component.d.ts +17 -5
  34. package/lib/layout/layout.component.service.d.ts +15 -9
  35. package/lib/navigation/navigation-item/navigation-item.component.d.ts +1 -1
  36. package/lib/navigation/navigation.component.d.ts +1 -1
  37. package/package.json +83 -47
  38. package/theme.css +1 -1
  39. package/esm2022/lib/i18n-check.guard.mjs +0 -34
  40. package/esm2022/lib/i18n.service.mjs +0 -36
  41. package/esm2022/lib/language-selector.service.mjs +0 -34
  42. package/lib/i18n-check.guard.d.ts +0 -14
  43. package/lib/i18n.service.d.ts +0 -12
  44. package/lib/language-selector.service.d.ts +0 -15
@@ -1,55 +1,61 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Component, ChangeDetectionStrategy, LOCALE_ID, Injectable, Inject, signal, Optional, isDevMode, Input, ElementRef, Renderer2, ViewContainerRef, ViewEncapsulation, forwardRef, ViewChild, HostBinding, INJECTOR, ChangeDetectorRef, TemplateRef, Directive, ContentChild, EventEmitter, Output } from '@angular/core';
2
+ import { InjectionToken, Component, ChangeDetectionStrategy, signal, computed, effect, Injectable, Optional, Inject, LOCALE_ID, isDevMode, Input, ElementRef, Renderer2, ViewContainerRef, ViewEncapsulation, forwardRef, ViewChild, HostBinding, INJECTOR, ChangeDetectorRef, inject, TemplateRef, Directive, ContentChild, EventEmitter, Output } from '@angular/core';
3
3
  import * as i1 from '@rxap/services';
4
4
  import { HeaderService, ResetService, VersionService, WindowContainerSidenavService, FooterService } from '@rxap/services';
5
5
  import * as i3 from '@angular/cdk/portal';
6
6
  import { PortalModule, ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
7
7
  import * as i2 from '@angular/material/toolbar';
8
8
  import { MatToolbarModule } from '@angular/material/toolbar';
9
- import { NgIf, NgFor, AsyncPipe, KeyValuePipe, NgOptimizedImage, NgClass, NgTemplateOutlet } from '@angular/common';
10
- import { filter as filter$1, switchMap as switchMap$1, Subscription, BehaviorSubject, debounceTime, ReplaySubject, of, from, combineLatest } from 'rxjs';
11
- import { filter, map, switchMap, tap, startWith, catchError } from 'rxjs/operators';
12
- import * as i2$4 from '@angular/material/sidenav';
13
- import { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';
14
- import * as i4 from '@angular/material/core';
15
- import { MatOptionModule, MatRippleModule } from '@angular/material/core';
16
- import { MatSlideToggleModule } from '@angular/material/slide-toggle';
17
- import { DataSourceCollectionDirective } from '@rxap/data-source/directive';
9
+ import * as i4$2 from '@angular/common';
10
+ import { NgIf, NgFor, AsyncPipe, NgOptimizedImage, KeyValuePipe, CommonModule, NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
18
11
  import * as i5 from '@angular/forms';
19
12
  import { FormsModule } from '@angular/forms';
20
- import * as i3$1 from '@angular/material/select';
21
- import { MatSelectModule } from '@angular/material/select';
22
- import { StopPropagationDirective } from '@rxap/directives';
23
- import * as i2$1 from '@angular/material/form-field';
13
+ import * as i3$1 from '@angular/material/button';
14
+ import { MatButtonModule } from '@angular/material/button';
15
+ import * as i4$1 from '@angular/material/core';
16
+ import { MatOptionModule, MatRippleModule } from '@angular/material/core';
17
+ import * as i2$5 from '@angular/material/form-field';
24
18
  import { MatFormFieldModule } from '@angular/material/form-field';
25
- import * as i1$2 from '@rxap/config';
26
- import { ConfigService } from '@rxap/config';
27
- import * as i1$1 from '@rxap/authentication';
28
- import * as i2$3 from '@angular/material/icon';
19
+ import * as i4 from '@angular/material/icon';
29
20
  import { MatIconModule } from '@angular/material/icon';
30
- import * as i3$2 from '@angular/material/menu';
21
+ import * as i7 from '@angular/material/menu';
31
22
  import { MatMenuModule } from '@angular/material/menu';
32
- import * as i3$3 from '@angular/material/button';
33
- import { MatButtonModule } from '@angular/material/button';
34
- import * as i2$2 from '@angular/router';
23
+ import * as i3$2 from '@angular/material/select';
24
+ import { MatSelectModule } from '@angular/material/select';
25
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
26
+ import { DataSourceCollectionDirective } from '@rxap/data-source/directive';
27
+ import { StopPropagationDirective } from '@rxap/directives';
28
+ import * as i2$1 from '@angular/cdk/layout';
29
+ import { toSignal } from '@angular/core/rxjs-interop';
30
+ import * as i1$1 from '@rxap/config';
31
+ import { ConfigService } from '@rxap/config';
32
+ import * as i1$4 from '@rxap/ngx-theme';
33
+ import { ObserveCurrentThemeDensity, ThemeService } from '@rxap/ngx-theme';
34
+ import * as i2$2 from '@rxap/authorization';
35
+ import { ClickOnLink } from '@rxap/browser-utilities';
36
+ import { RXAP_ENVIRONMENT, DetermineReleaseName } from '@rxap/environment';
37
+ import { JoinPath, coerceBoolean } from '@rxap/utilities';
38
+ import { firstValueFrom, switchMap, filter as filter$1, skip, distinctUntilChanged, BehaviorSubject, Subscription, debounceTime, ReplaySubject, of, from, combineLatest } from 'rxjs';
39
+ import * as i2$3 from '@rxap/authentication';
40
+ import { filter, tap, map, switchMap as switchMap$1, startWith, catchError } from 'rxjs/operators';
41
+ import * as i2$4 from '@angular/router';
35
42
  import { NavigationStart, NavigationEnd, NavigationCancel, Router, RouterLinkActive, RouterLink, RouterOutlet } from '@angular/router';
36
- import * as i1$3 from '@angular/material/progress-bar';
43
+ import * as i1$2 from '@angular/material/progress-bar';
37
44
  import { MatProgressBarModule } from '@angular/material/progress-bar';
38
- import * as i1$4 from '@angular/flex-layout/flex';
39
- import { FlexModule } from '@angular/flex-layout/flex';
40
- import { JoinPath, Required, coerceBoolean } from '@rxap/utilities';
41
- import { ClickOnLink } from '@rxap/browser-utilities';
42
- import { __decorate, __metadata } from 'tslib';
43
- import { DetermineReleaseName, RXAP_ENVIRONMENT } from '@rxap/environment';
44
- import { FlexLayoutModule } from '@angular/flex-layout';
45
+ import * as i3$3 from '@rxap/ngx-changelog';
46
+ import * as i1$3 from '@rxap/ngx-localize';
47
+ import * as i1$5 from '@rxap/ngx-user';
48
+ import { UserSettingsThemeService, IsThemeDensity, ThemeDensity } from '@rxap/ngx-user';
49
+ import * as i3$5 from '@angular/material/sidenav';
50
+ import { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';
51
+ import * as i2$6 from '@rxap/icon';
52
+ import { StatusIndicatorComponent } from '@rxap/ngx-status-check';
53
+ import * as i3$4 from '@angular/material/divider';
54
+ import { MatDividerModule } from '@angular/material/divider';
45
55
  import { trigger, transition, style, animate } from '@angular/animations';
46
56
  import * as i6 from '@angular/cdk/overlay';
47
57
  import { Overlay } from '@angular/cdk/overlay';
48
- import * as i3$4 from '@angular/material/divider';
49
- import { MatDividerModule } from '@angular/material/divider';
50
58
  import { IconDirective } from '@rxap/material-directives/icon';
51
- import * as i2$5 from '@angular/flex-layout/extended';
52
- import { ExtendedModule } from '@angular/flex-layout/extended';
53
59
 
54
60
  const RXAP_NAVIGATION_CONFIG = new InjectionToken('rxap/layout/navigation-config');
55
61
  const RXAP_NAVIGATION_CONFIG_INSERTS = new InjectionToken('rxap/layout/navigation-config-inserts');
@@ -63,163 +69,104 @@ class FooterComponent {
63
69
  this.footerService = footerService;
64
70
  }
65
71
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: FooterComponent, deps: [{ token: i1.FooterService }], target: i0.ɵɵFactoryTarget.Component }); }
66
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: FooterComponent, isStandalone: true, selector: "rxap-footer", ngImport: i0, template: "<ng-template [ngIf]=\"footerService.portals$ | async\" let-portals>\n <mat-toolbar *ngIf=\"portals.length\" class=\"footer mat-elevation-z1\">\n <mat-toolbar-row *ngFor=\"let portal of portals\">\n <ng-template [cdkPortalOutlet]=\"portal\"></ng-template>\n </mat-toolbar-row>\n </mat-toolbar>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i2.MatToolbarRow, selector: "mat-toolbar-row", exportAs: ["matToolbarRow"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
72
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: FooterComponent, isStandalone: true, selector: "rxap-footer", ngImport: i0, template: "<ng-template [ngIf]=\"footerService.portals()\" let-portals>\n <mat-toolbar *ngIf=\"portals.length\" class=\"footer mat-elevation-z1\">\n <mat-toolbar-row *ngFor=\"let portal of portals\">\n <ng-template [cdkPortalOutlet]=\"portal\"></ng-template>\n </mat-toolbar-row>\n </mat-toolbar>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i2.MatToolbarRow, selector: "mat-toolbar-row", exportAs: ["matToolbarRow"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
67
73
  }
68
74
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: FooterComponent, decorators: [{
69
75
  type: Component,
70
- args: [{ selector: 'rxap-footer', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, MatToolbarModule, NgFor, PortalModule, AsyncPipe], template: "<ng-template [ngIf]=\"footerService.portals$ | async\" let-portals>\n <mat-toolbar *ngIf=\"portals.length\" class=\"footer mat-elevation-z1\">\n <mat-toolbar-row *ngFor=\"let portal of portals\">\n <ng-template [cdkPortalOutlet]=\"portal\"></ng-template>\n </mat-toolbar-row>\n </mat-toolbar>\n</ng-template>\n" }]
76
+ args: [{ selector: 'rxap-footer', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, MatToolbarModule, NgFor, PortalModule, AsyncPipe], template: "<ng-template [ngIf]=\"footerService.portals()\" let-portals>\n <mat-toolbar *ngIf=\"portals.length\" class=\"footer mat-elevation-z1\">\n <mat-toolbar-row *ngFor=\"let portal of portals\">\n <ng-template [cdkPortalOutlet]=\"portal\"></ng-template>\n </mat-toolbar-row>\n </mat-toolbar>\n</ng-template>\n" }]
71
77
  }], ctorParameters: function () { return [{ type: i1.FooterService }]; } });
72
78
 
73
- class I18nService {
74
- constructor(localId, userProfileService) {
75
- this.localId = localId;
76
- this.userProfileService = userProfileService;
77
- this.currentLanguage = this.localId.replace(/-[A-Z]+$/, '');
79
+ class LayoutComponentService {
80
+ constructor(footerComponentService, headerComponentService, logoConfig = null, config, mediaMatcher) {
81
+ this.footerComponentService = footerComponentService;
82
+ this.headerComponentService = headerComponentService;
83
+ this.config = config;
84
+ this.currentThemeDensity = toSignal(ObserveCurrentThemeDensity());
85
+ const mobileQuery = mediaMatcher.matchMedia('(max-width: 959px)');
86
+ const mobile = mobileQuery.matches;
87
+ const initialCollapsable = this.config.get('navigation.collapsable', true);
88
+ const collapsable = initialCollapsable && !mobile;
89
+ const pinned = this.config.get('navigation.pinned', false);
90
+ const mode = this.config.get('navigation.mode', pinned || !collapsable ? 'side' : 'over');
91
+ const opened = this.config.get('navigation.opened', (!collapsable || pinned) && !mobile);
92
+ this.opened = signal(opened);
93
+ this.mode = signal(mode);
94
+ this.pinned = signal(pinned);
95
+ this.collapsable = signal(collapsable);
96
+ this.fixedBottomGap = computed(() => this.footerComponentService.portalCount() * (64 + (this.currentThemeDensity() ?? 0) * 4));
97
+ this.fixedTopGap = computed(() => this.headerComponentService.componentCount() * (64 + (this.currentThemeDensity() ?? 0) * 4));
98
+ this.logo = logoConfig ?? {
99
+ src: 'assets/logo.png',
100
+ width: 192,
101
+ };
102
+ mobileQuery.addEventListener('change', (event) => {
103
+ if (initialCollapsable) {
104
+ this.collapsable.set(!event.matches);
105
+ if (this.collapsable()) {
106
+ if (!this.pinned()) {
107
+ this.opened.set(false);
108
+ }
109
+ }
110
+ }
111
+ });
112
+ effect(() => {
113
+ if (this.pinned()) {
114
+ this.mode.set('side');
115
+ this.opened.set(true);
116
+ }
117
+ else {
118
+ this.mode.set('over');
119
+ this.opened.set(false);
120
+ }
121
+ }, { allowSignalWrites: true });
78
122
  }
79
- async setLanguage(language) {
80
- await this.userProfileService.setLanguage(language);
81
- this.redirect(language);
123
+ toggleOpened() {
124
+ this.opened.set(!this.opened());
82
125
  }
83
- redirect(next, current = this.currentLanguage) {
84
- if (current === next) {
85
- console.warn('[I18nService] redirect not required - language unchanged');
86
- return;
87
- }
88
- const redirectUrl = location.origin +
89
- location.pathname.replace(new RegExp(`^/${current}`), `/${next}`) +
90
- location.search;
91
- console.log('[I18nService] redirect to: ' + redirectUrl);
92
- location.replace(redirectUrl);
93
- }
94
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nService, deps: [{ token: LOCALE_ID }, { token: i1$1.RxapUserProfileService }], target: i0.ɵɵFactoryTarget.Injectable }); }
95
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nService, providedIn: 'root' }); }
96
- }
97
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nService, decorators: [{
98
- type: Injectable,
99
- args: [{ providedIn: 'root' }]
100
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
101
- type: Inject,
102
- args: [LOCALE_ID]
103
- }] }, { type: i1$1.RxapUserProfileService }]; } });
104
-
105
- class LanguageSelectorService {
106
- constructor(config, localId, i18nService) {
107
- this.config = config;
108
- this.localId = localId;
109
- this.i18nService = i18nService;
110
- this.languages = this.config.get('i18n.languages') ?? {};
111
- this.defaultLanguage =
112
- this.config.get('i18n.defaultLanguage') ??
113
- Object.keys(this.languages)[0] ??
114
- 'en';
115
- this.selectedLanguage = this.i18nService.currentLanguage;
116
- }
117
- async setLanguage(language) {
118
- if (language !== this.i18nService.currentLanguage) {
119
- await this.i18nService.setLanguage(language);
120
- }
126
+ togglePinned() {
127
+ this.pinned.set(!this.pinned());
121
128
  }
122
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorService, deps: [{ token: i1$2.ConfigService }, { token: LOCALE_ID }, { token: I18nService }], target: i0.ɵɵFactoryTarget.Injectable }); }
123
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorService, providedIn: 'root' }); }
129
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponentService, deps: [{ token: i1.FooterService }, { token: i1.HeaderService }, { token: RXAP_LOGO_CONFIG, optional: true }, { token: ConfigService }, { token: i2$1.MediaMatcher }], target: i0.ɵɵFactoryTarget.Injectable }); }
130
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponentService, providedIn: 'root' }); }
124
131
  }
125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorService, decorators: [{
132
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponentService, decorators: [{
126
133
  type: Injectable,
127
134
  args: [{ providedIn: 'root' }]
128
- }], ctorParameters: function () { return [{ type: i1$2.ConfigService }, { type: undefined, decorators: [{
135
+ }], ctorParameters: function () { return [{ type: i1.FooterService }, { type: i1.HeaderService }, { type: undefined, decorators: [{
136
+ type: Optional
137
+ }, {
129
138
  type: Inject,
130
- args: [LOCALE_ID]
131
- }] }, { type: I18nService }]; } });
132
-
133
- class LanguageSelectorComponent {
134
- constructor(language) {
135
- this.language = language;
136
- }
137
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorComponent, deps: [{ token: LanguageSelectorService }], target: i0.ɵɵFactoryTarget.Component }); }
138
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: LanguageSelectorComponent, isStandalone: true, selector: "rxap-language-selector", ngImport: i0, template: "<ng-template [ngIf]=\"(language.languages | keyvalue).length\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-selector\" rxapStopPropagation>\n <mat-label i18n>Select Language</mat-label>\n <mat-select (ngModelChange)=\"language.setLanguage($event)\" [ngModel]=\"language.selectedLanguage\">\n <mat-option *ngFor=\"let item of language.languages | keyvalue\" [value]=\"item.key\">{{item.value}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n</ng-template>\n", styles: [".language-selector{width:calc(100% - 32px);margin:0 16px}.language-selector ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:12px 0;border-width:6px}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix .mat-select-arrow-wrapper{transform:translateY(0)}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: StopPropagationDirective, selector: "[rxapStopPropagation]" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3$1.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
139
- }
140
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorComponent, decorators: [{
141
- type: Component,
142
- args: [{ selector: 'rxap-language-selector', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
143
- NgIf,
144
- MatFormFieldModule,
145
- StopPropagationDirective,
146
- MatSelectModule,
147
- FormsModule,
148
- NgFor,
149
- MatOptionModule,
150
- KeyValuePipe,
151
- ], template: "<ng-template [ngIf]=\"(language.languages | keyvalue).length\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-selector\" rxapStopPropagation>\n <mat-label i18n>Select Language</mat-label>\n <mat-select (ngModelChange)=\"language.setLanguage($event)\" [ngModel]=\"language.selectedLanguage\">\n <mat-option *ngFor=\"let item of language.languages | keyvalue\" [value]=\"item.key\">{{item.value}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n</ng-template>\n", styles: [".language-selector{width:calc(100% - 32px);margin:0 16px}.language-selector ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:12px 0;border-width:6px}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix .mat-select-arrow-wrapper{transform:translateY(0)}\n"] }]
152
- }], ctorParameters: function () { return [{ type: LanguageSelectorService }]; } });
153
-
154
- class NavigationProgressBarComponent {
155
- constructor(router) {
156
- this.router = router;
157
- this.navigating$ = this.router.events.pipe(filter(event => event instanceof NavigationStart ||
158
- event instanceof NavigationEnd ||
159
- event instanceof NavigationCancel), map(event => event instanceof NavigationStart));
160
- }
161
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationProgressBarComponent, deps: [{ token: Router }], target: i0.ɵɵFactoryTarget.Component }); }
162
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: NavigationProgressBarComponent, isStandalone: true, selector: "rxap-navigation-progress-bar", ngImport: i0, template: "<mat-progress-bar\n *ngIf=\"navigating$ | async\"\n color=\"accent\"\n mode=\"indeterminate\"\n></mat-progress-bar>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i1$3.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
163
- }
164
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationProgressBarComponent, decorators: [{
165
- type: Component,
166
- args: [{ selector: 'rxap-navigation-progress-bar', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
167
- NgIf,
168
- MatProgressBarModule,
169
- AsyncPipe,
170
- ], template: "<mat-progress-bar\n *ngIf=\"navigating$ | async\"\n color=\"accent\"\n mode=\"indeterminate\"\n></mat-progress-bar>\n" }]
171
- }], ctorParameters: function () { return [{ type: i2$2.Router, decorators: [{
139
+ args: [RXAP_LOGO_CONFIG]
140
+ }] }, { type: i1$1.ConfigService, decorators: [{
172
141
  type: Inject,
173
- args: [Router]
174
- }] }]; } });
175
-
176
- class UserProfileIconComponent {
177
- constructor(userProfileService, authenticationService) {
178
- this.userProfileService = userProfileService;
179
- this.authenticationService = authenticationService;
180
- this.username = signal(null);
181
- }
182
- ngOnInit() {
183
- this._subscription = this.authenticationService.isAuthenticated$.pipe(filter$1(Boolean), switchMap(() => this.userProfileService.getProfile()), filter$1(Boolean), tap((user) => this.username.set(user.username ?? null))).subscribe();
184
- }
185
- ngOnDestroy() {
186
- this._subscription?.unsubscribe();
187
- }
188
- async logout() {
189
- await this.authenticationService.signOut();
190
- }
191
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: UserProfileIconComponent, deps: [{ token: i1$1.RxapUserProfileService }, { token: i1$1.RxapAuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
192
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: UserProfileIconComponent, isStandalone: true, selector: "rxap-user-profile-icon", ngImport: i0, template: "<button [matMenuTriggerFor]=\"menu\"\n [disabled]=\"!username()\"\n class=\"profile-icon\"\n fxLayout=\"row\"\n fxLayoutAlign=\"center center\">\n <mat-icon class=\"avatar-icon\">account_circle</mat-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\" [yPosition]=\"'below'\">\n <button mat-menu-item>\n <mat-icon>account_circle</mat-icon>\n <span>{{username()}}</span>\n </button>\n <button (click)=\"logout()\" mat-menu-item>\n <mat-icon>login</mat-icon>\n <span i18n>Logout</span>\n </button>\n</mat-menu>\n", styles: [".profile-icon{border-radius:100%;border:none;height:32px;width:32px;overflow:hidden;background-position:center center;background-repeat:no-repeat;background-size:cover}.profile-icon .avatar-icon{width:32px;height:32px;font-size:32px}.profile-icon:hover{cursor:pointer}.profile-icon:focus{outline:none}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i1$4.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i1$4.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3$2.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i3$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3$2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
193
- }
194
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: UserProfileIconComponent, decorators: [{
195
- type: Component,
196
- args: [{ selector: 'rxap-user-profile-icon', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
197
- FlexModule,
198
- MatMenuModule,
199
- MatIconModule,
200
- NgIf,
201
- AsyncPipe,
202
- ], template: "<button [matMenuTriggerFor]=\"menu\"\n [disabled]=\"!username()\"\n class=\"profile-icon\"\n fxLayout=\"row\"\n fxLayoutAlign=\"center center\">\n <mat-icon class=\"avatar-icon\">account_circle</mat-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\" [yPosition]=\"'below'\">\n <button mat-menu-item>\n <mat-icon>account_circle</mat-icon>\n <span>{{username()}}</span>\n </button>\n <button (click)=\"logout()\" mat-menu-item>\n <mat-icon>login</mat-icon>\n <span i18n>Logout</span>\n </button>\n</mat-menu>\n", styles: [".profile-icon{border-radius:100%;border:none;height:32px;width:32px;overflow:hidden;background-position:center center;background-repeat:no-repeat;background-size:cover}.profile-icon .avatar-icon{width:32px;height:32px;font-size:32px}.profile-icon:hover{cursor:pointer}.profile-icon:focus{outline:none}\n"] }]
203
- }], ctorParameters: function () { return [{ type: i1$1.RxapUserProfileService }, { type: i1$1.RxapAuthenticationService }]; } });
142
+ args: [ConfigService]
143
+ }] }, { type: i2$1.MediaMatcher }]; } });
204
144
 
205
145
  class AppUrlService {
206
- constructor(config, localeId, userProfileService) {
146
+ constructor(config, localeId, authorizationService, environment) {
207
147
  this.config = config;
208
148
  this.localeId = localeId;
209
- this.userProfileService = userProfileService;
210
- this._apps = this.config.get('navigation.apps') ?? [];
149
+ this.authorizationService = authorizationService;
150
+ this.environment = environment;
151
+ this._apps = this.config.get('navigation.apps', []);
211
152
  }
212
153
  getApp(appId) {
213
154
  return this._apps.find(app => app.id === appId) ?? null;
214
155
  }
215
- getAppUrl(appId, path) {
156
+ getAppUrl(appId, path, infix = this.getPathPrefix()) {
216
157
  const app = this.getApp(appId);
217
158
  if (app) {
218
- const prefix = this.getPathPrefix();
219
- return JoinPath(app.href, prefix, path);
159
+ return JoinPath(app.href, infix, path);
220
160
  }
221
161
  return null;
222
162
  }
163
+ getAppUrlOrThrow(appId, path) {
164
+ const url = this.getAppUrl(appId, path);
165
+ if (url) {
166
+ return url;
167
+ }
168
+ throw new Error(`Could not find app with id "${appId}"`);
169
+ }
223
170
  navigate(appId, path) {
224
171
  const url = this.getAppUrl(appId, path);
225
172
  if (url) {
@@ -227,36 +174,40 @@ class AppUrlService {
227
174
  }
228
175
  }
229
176
  async getAppList() {
230
- const roles = await this.userProfileService.getRoleList();
231
- return this._apps.filter(app => !app.hidden)
177
+ const appList = this
178
+ ._apps
179
+ .filter(app => !app.hidden)
232
180
  .map(app => ({
233
181
  ...app,
234
182
  href: JoinPath(app.href, this.getPathPrefix()),
235
- }))
236
- .filter(app => !app.permissions ||
237
- !app.permissions.length ||
238
- app.permissions.every(permission => roles.includes(permission)));
183
+ }));
184
+ const filteredAppList = [];
185
+ for (const app of appList) {
186
+ if (await firstValueFrom(this.authorizationService.hasPermission$(app.permissions))) {
187
+ filteredAppList.push(app);
188
+ }
189
+ }
190
+ return filteredAppList;
239
191
  }
240
192
  getPathPrefix() {
241
- switch (this.localeId) {
242
- case 'de-DE':
243
- return 'de';
244
- case 'en-US':
245
- return 'en';
246
- default:
247
- return 'de';
193
+ if (this.environment.production && this.localeId) {
194
+ return this.localeId.replace(/-.+$/, '');
248
195
  }
196
+ return '';
249
197
  }
250
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppUrlService, deps: [{ token: i1$2.ConfigService }, { token: LOCALE_ID }, { token: i1$1.RxapUserProfileService }], target: i0.ɵɵFactoryTarget.Injectable }); }
198
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppUrlService, deps: [{ token: i1$1.ConfigService }, { token: LOCALE_ID }, { token: i2$2.AuthorizationService }, { token: RXAP_ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
251
199
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppUrlService, providedIn: 'root' }); }
252
200
  }
253
201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppUrlService, decorators: [{
254
202
  type: Injectable,
255
203
  args: [{ providedIn: 'root' }]
256
- }], ctorParameters: function () { return [{ type: i1$2.ConfigService }, { type: undefined, decorators: [{
204
+ }], ctorParameters: function () { return [{ type: i1$1.ConfigService }, { type: undefined, decorators: [{
257
205
  type: Inject,
258
206
  args: [LOCALE_ID]
259
- }] }, { type: i1$1.RxapUserProfileService }]; } });
207
+ }] }, { type: i2$2.AuthorizationService }, { type: undefined, decorators: [{
208
+ type: Inject,
209
+ args: [RXAP_ENVIRONMENT]
210
+ }] }]; } });
260
211
 
261
212
  class AppsButtonComponent {
262
213
  constructor(grid, appUrlService, authenticationService) {
@@ -266,55 +217,199 @@ class AppsButtonComponent {
266
217
  this.appList = signal([]);
267
218
  }
268
219
  ngOnInit() {
269
- this._subscription = this.authenticationService.isAuthenticated$.pipe(filter(Boolean), switchMap$1(() => this.appUrlService.getAppList()), tap((apps) => this.appList.set(apps))).subscribe();
220
+ this._subscription = this.authenticationService.isAuthenticated$.pipe(filter(Boolean), switchMap(() => this.appUrlService.getAppList()), tap((apps) => this.appList.set(apps))).subscribe();
270
221
  }
271
222
  ngOnDestroy() {
272
223
  this._subscription?.unsubscribe();
273
224
  }
274
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppsButtonComponent, deps: [{ token: RXAP_LAYOUT_APPS_GRID, optional: true }, { token: AppUrlService }, { token: i1$1.RxapAuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
275
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: AppsButtonComponent, isStandalone: true, selector: "rxap-apps-button", ngImport: i0, template: "<div *ngIf=\"appList()?.length\" class=\"flex flex-row items-center gap-8\">\n\n <div *ngIf=\"isOpen\" class=\"flex flex-row items-center gap-6\">\n\n <div *ngFor=\"let app of appList()\" class=\"h-10\">\n <a [href]=\"app.href\" mat-stroked-button>\n <span class=\"flex flex-row items-center gap-4\">\n <img *ngIf=\"app.image\" [alt]=\"app.label\" [ngSrc]=\"app.image\" height=\"40\" width=\"40\">\n <span class=\"label grow-0\">{{app.label}}</span>\n </span>\n </a>\n </div>\n\n </div>\n\n <button (click)=\"isOpen = !isOpen\" mat-icon-button>\n <mat-icon>apps</mat-icon>\n </button>\n\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FlexModule }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$3.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
225
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppsButtonComponent, deps: [{ token: RXAP_LAYOUT_APPS_GRID, optional: true }, { token: AppUrlService }, { token: i2$3.RxapAuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
226
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: AppsButtonComponent, isStandalone: true, selector: "rxap-apps-button", ngImport: i0, template: "<div *ngIf=\"appList()?.length\" class=\"flex flex-row items-center gap-8\">\n\n <div *ngIf=\"isOpen\" class=\"flex flex-row items-center gap-6\">\n\n <div *ngFor=\"let app of appList()\" class=\"h-10\">\n <a [href]=\"app.href\" mat-stroked-button>\n <span class=\"flex flex-row items-center gap-4\">\n <img *ngIf=\"app.image\" [alt]=\"app.label\" [ngSrc]=\"app.image\" height=\"40\" width=\"40\">\n <span class=\"label grow-0\">{{app.label}}</span>\n </span>\n </a>\n </div>\n\n </div>\n\n <button (click)=\"isOpen = !isOpen\" mat-icon-button>\n <mat-icon svgIcon=\"apps\"></mat-icon>\n </button>\n\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
276
227
  }
277
228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppsButtonComponent, decorators: [{
278
229
  type: Component,
279
230
  args: [{ selector: 'rxap-apps-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
280
231
  NgIf,
281
- FlexModule,
282
232
  NgFor,
283
233
  MatButtonModule,
284
234
  MatIconModule,
285
235
  NgOptimizedImage,
286
- ], template: "<div *ngIf=\"appList()?.length\" class=\"flex flex-row items-center gap-8\">\n\n <div *ngIf=\"isOpen\" class=\"flex flex-row items-center gap-6\">\n\n <div *ngFor=\"let app of appList()\" class=\"h-10\">\n <a [href]=\"app.href\" mat-stroked-button>\n <span class=\"flex flex-row items-center gap-4\">\n <img *ngIf=\"app.image\" [alt]=\"app.label\" [ngSrc]=\"app.image\" height=\"40\" width=\"40\">\n <span class=\"label grow-0\">{{app.label}}</span>\n </span>\n </a>\n </div>\n\n </div>\n\n <button (click)=\"isOpen = !isOpen\" mat-icon-button>\n <mat-icon>apps</mat-icon>\n </button>\n\n</div>\n" }]
236
+ ], template: "<div *ngIf=\"appList()?.length\" class=\"flex flex-row items-center gap-8\">\n\n <div *ngIf=\"isOpen\" class=\"flex flex-row items-center gap-6\">\n\n <div *ngFor=\"let app of appList()\" class=\"h-10\">\n <a [href]=\"app.href\" mat-stroked-button>\n <span class=\"flex flex-row items-center gap-4\">\n <img *ngIf=\"app.image\" [alt]=\"app.label\" [ngSrc]=\"app.image\" height=\"40\" width=\"40\">\n <span class=\"label grow-0\">{{app.label}}</span>\n </span>\n </a>\n </div>\n\n </div>\n\n <button (click)=\"isOpen = !isOpen\" mat-icon-button>\n <mat-icon svgIcon=\"apps\"></mat-icon>\n </button>\n\n</div>\n" }]
287
237
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
288
238
  type: Optional
289
239
  }, {
290
240
  type: Inject,
291
241
  args: [RXAP_LAYOUT_APPS_GRID]
292
- }] }, { type: AppUrlService }, { type: i1$1.RxapAuthenticationService }]; } });
242
+ }] }, { type: AppUrlService }, { type: i2$3.RxapAuthenticationService }]; } });
293
243
 
294
- class HeaderComponent {
295
- constructor(headerComponentService, headerComponent, theme) {
296
- this.headerComponentService = headerComponentService;
297
- this.headerComponent = headerComponent;
244
+ class NavigationProgressBarComponent {
245
+ constructor(router) {
246
+ this.router = router;
247
+ this.navigating$ = this.router.events.pipe(filter(event => event instanceof NavigationStart ||
248
+ event instanceof NavigationEnd ||
249
+ event instanceof NavigationCancel), map(event => event instanceof NavigationStart));
250
+ }
251
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationProgressBarComponent, deps: [{ token: Router }], target: i0.ɵɵFactoryTarget.Component }); }
252
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: NavigationProgressBarComponent, isStandalone: true, selector: "rxap-navigation-progress-bar", ngImport: i0, template: "<mat-progress-bar\n *ngIf=\"navigating$ | async\"\n color=\"accent\"\n mode=\"indeterminate\"\n></mat-progress-bar>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i1$2.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
253
+ }
254
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationProgressBarComponent, decorators: [{
255
+ type: Component,
256
+ args: [{ selector: 'rxap-navigation-progress-bar', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
257
+ NgIf,
258
+ MatProgressBarModule,
259
+ AsyncPipe,
260
+ ], template: "<mat-progress-bar\n *ngIf=\"navigating$ | async\"\n color=\"accent\"\n mode=\"indeterminate\"\n></mat-progress-bar>\n" }]
261
+ }], ctorParameters: function () { return [{ type: i2$4.Router, decorators: [{
262
+ type: Inject,
263
+ args: [Router]
264
+ }] }]; } });
265
+
266
+ class LanguageSelectorComponent {
267
+ constructor(language) {
268
+ this.language = language;
269
+ }
270
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorComponent, deps: [{ token: i1$3.LanguageSelectorService }], target: i0.ɵɵFactoryTarget.Component }); }
271
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: LanguageSelectorComponent, isStandalone: true, selector: "rxap-language-selector", ngImport: i0, template: "<ng-template [ngIf]=\"(language.languages | keyvalue).length\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-selector\" rxapStopPropagation>\n <mat-label i18n>Select Language</mat-label>\n <mat-select (ngModelChange)=\"language.setLanguage($event)\" [ngModel]=\"language.selectedLanguage\">\n <mat-option *ngFor=\"let item of language.languages | keyvalue\" [value]=\"item.key\">{{item.value}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n</ng-template>\n", styles: [".language-selector{width:calc(100% - 32px);margin:0 16px}.language-selector ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:12px 0;border-width:6px}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix .mat-select-arrow-wrapper{transform:translateY(0)}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$5.MatLabel, selector: "mat-label" }, { kind: "directive", type: StopPropagationDirective, selector: "[rxapStopPropagation]" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3$2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i4$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
272
+ }
273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorComponent, decorators: [{
274
+ type: Component,
275
+ args: [{ selector: 'rxap-language-selector', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
276
+ NgIf,
277
+ MatFormFieldModule,
278
+ StopPropagationDirective,
279
+ MatSelectModule,
280
+ FormsModule,
281
+ NgFor,
282
+ MatOptionModule,
283
+ KeyValuePipe,
284
+ ], template: "<ng-template [ngIf]=\"(language.languages | keyvalue).length\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-selector\" rxapStopPropagation>\n <mat-label i18n>Select Language</mat-label>\n <mat-select (ngModelChange)=\"language.setLanguage($event)\" [ngModel]=\"language.selectedLanguage\">\n <mat-option *ngFor=\"let item of language.languages | keyvalue\" [value]=\"item.key\">{{item.value}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n</ng-template>\n", styles: [".language-selector{width:calc(100% - 32px);margin:0 16px}.language-selector ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:12px 0;border-width:6px}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix .mat-select-arrow-wrapper{transform:translateY(0)}\n"] }]
285
+ }], ctorParameters: function () { return [{ type: i1$3.LanguageSelectorService }]; } });
286
+
287
+ class SettingsButtonComponent {
288
+ constructor(theme, route, injector, changelogService) {
298
289
  this.theme = theme;
299
- this.components = [];
300
- this.subscriptions = new Subscription();
301
- this.color = 'primary';
290
+ this.route = route;
291
+ this.injector = injector;
292
+ this.changelogService = changelogService;
302
293
  this.isDevMode = isDevMode();
294
+ this.items = signal([]);
295
+ this.savePreviewDensityValue = false;
296
+ this.currentDensityValue = null;
297
+ this.savePreviewTypographyValue = false;
298
+ this.currentTypographyValue = null;
299
+ this.savePreviewThemeValue = false;
300
+ this.currentThemeValue = null;
301
+ this.availableThemes = this.theme.getAvailableThemes();
302
+ this.availableTypographies = this.theme.getAvailableTypographies();
303
+ }
304
+ ngOnDestroy() {
305
+ this._subscription?.unsubscribe();
303
306
  }
304
307
  ngOnInit() {
305
- this.updateComponents();
306
- this.subscriptions.add(this.headerComponentService.update$
307
- .pipe(tap(() => this.updateComponents()))
308
- .subscribe());
308
+ this._subscription = this.route.data.pipe(map(data => this.getCustomMenuItems(data)), map(items => items.map(item => new ComponentPortal(item, undefined, this.injector))), tap(items => this.items.set(items))).subscribe();
309
+ }
310
+ getCustomMenuItems(data) {
311
+ if (data?.layout?.header?.menu?.items?.length) {
312
+ return data.layout.header.menu.items;
313
+ }
314
+ return [];
309
315
  }
310
- updateComponents() {
311
- this.components = this.headerComponentService.getComponents();
316
+ openChangelogDialog() {
317
+ this.changelogService.showChangelogDialog();
312
318
  }
313
- ngOnDestroy() {
314
- this.subscriptions.unsubscribe();
319
+ previewDensity(density) {
320
+ this.theme.applyDensity(density);
315
321
  }
316
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HeaderComponent, deps: [{ token: HeaderService }, { token: RXAP_HEADER_COMPONENT, optional: true }, { token: i1.ThemeService }], target: i0.ɵɵFactoryTarget.Component }); }
317
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: HeaderComponent, isStandalone: true, selector: "rxap-header", inputs: { sidenav: "sidenav", color: "color" }, ngImport: i0, template: "<mat-toolbar [color]=\"color\" [ngClass]=\"{ open: sidenav?.opened }\" class=\"mat-elevation-z3 header\">\n <div class=\"w-full flex flex-row gap-x-4 justify-between items-center\">\n <div class=\"grow\">\n <ng-content></ng-content>\n </div>\n <rxap-apps-button class=\"grow-0\"></rxap-apps-button>\n <div class=\"grow-0\">\n <button [matMenuTriggerFor]=\"menu\" mat-icon-button>\n <mat-icon>settings</mat-icon>\n </button>\n </div>\n <rxap-user-profile-icon class=\"grow-0\"></rxap-user-profile-icon>\n </div>\n</mat-toolbar>\n\n<rxap-navigation-progress-bar></rxap-navigation-progress-bar>\n<mat-menu #menu=\"matMenu\">\n <button (click)=\"theme.toggleDarkTheme()\" mat-menu-item>\n <mat-icon *ngIf=\"theme.darkMode\">brightness_2</mat-icon>\n <mat-icon *ngIf=\"!theme.darkMode\">brightness_5</mat-icon>\n <span i18n>Mode</span>\n </button>\n <rxap-language-selector *ngIf=\"!isDevMode\"></rxap-language-selector>\n</mat-menu>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3$2.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i3$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3$2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: LanguageSelectorComponent, selector: "rxap-language-selector" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: NavigationProgressBarComponent, selector: "rxap-navigation-progress-bar" }, { kind: "component", type: UserProfileIconComponent, selector: "rxap-user-profile-icon" }, { kind: "component", type: AppsButtonComponent, selector: "rxap-apps-button" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
322
+ restoreDensity() {
323
+ this.theme.applyDensity(this.theme.density());
324
+ }
325
+ setDensity(density) {
326
+ this.theme.setDensity(density);
327
+ }
328
+ previewTypography(typography) {
329
+ this.theme.applyTypography(typography);
330
+ }
331
+ restoreTypography() {
332
+ this.theme.applyTypography(this.theme.typography());
333
+ }
334
+ setTypography(typography) {
335
+ this.theme.setTypography(typography);
336
+ }
337
+ previewTheme(theme) {
338
+ this.theme.applyTheme(theme);
339
+ }
340
+ restoreTheme() {
341
+ this.theme.applyTheme(this.theme.themeName());
342
+ }
343
+ setTheme(theme) {
344
+ this.theme.setTheme(theme);
345
+ }
346
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SettingsButtonComponent, deps: [{ token: i1$4.ThemeService }, { token: i2$4.ActivatedRoute }, { token: i0.Injector }, { token: i3$3.ChangelogService }], target: i0.ɵɵFactoryTarget.Component }); }
347
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SettingsButtonComponent, isStandalone: true, selector: "rxap-settings-button", ngImport: i0, template: "<button [matMenuTriggerFor]=\"menu\" mat-icon-button>\n <mat-icon svgIcon=\"cog\"></mat-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\">\n <button (click)=\"theme.toggleDarkTheme()\" mat-menu-item>\n <mat-icon *ngIf=\"theme.darkMode()\" svgIcon=\"brightness-2\"></mat-icon>\n <mat-icon *ngIf=\"!theme.darkMode()\" svgIcon=\"brightness-5\"></mat-icon>\n <span i18n>Mode</span>\n </button>\n <button [matMenuTriggerFor]=\"themeMenu\" mat-menu-item>\n <mat-icon svgIcon=\"compare\"></mat-icon>\n <span i18n>Theme</span>\n </button>\n <rxap-language-selector></rxap-language-selector>\n <button (click)=\"openChangelogDialog()\" mat-menu-item>\n <mat-icon svgIcon=\"format-list-numbered\"></mat-icon>\n <span i18n>What's new</span>\n </button>\n <ng-container *ngFor=\"let item of items()\">\n <ng-template [cdkPortalOutlet]=\"item\"></ng-template>\n </ng-container>\n</mat-menu>\n\n<mat-menu #themeMenu=\"matMenu\" xPosition=\"before\">\n <button [matMenuTriggerFor]=\"themeDensityMenu\" mat-menu-item>\n <mat-icon svgIcon=\"move-resize\"></mat-icon>\n <span i18n>Density</span>\n </button>\n <button [matMenuTriggerFor]=\"themeFontMenu\" mat-menu-item>\n <mat-icon svgIcon=\"format-font\"></mat-icon>\n <span i18n>Font</span>\n </button>\n <button [matMenuTriggerFor]=\"themePresetMenu\" mat-menu-item>\n <mat-icon svgIcon=\"shape-outline\"></mat-icon>\n <span i18n>Preset</span>\n </button>\n</mat-menu>\n\n<mat-menu #themeDensityMenu=\"matMenu\" xPosition=\"before\">\n <button (click)=\"setDensity(0)\" (mouseenter)=\"previewDensity(0)\" (mouseleave)=\"restoreDensity()\" mat-menu-item>\n <mat-icon svgIcon=\"size-l\"></mat-icon>\n <span i18n>Normal</span>\n </button>\n <button (click)=\"setDensity(-1)\" (mouseenter)=\"previewDensity(-1)\" (mouseleave)=\"restoreDensity()\" mat-menu-item>\n <mat-icon svgIcon=\"size-m\"></mat-icon>\n <span i18n>Dense</span>\n </button>\n <button (click)=\"setDensity(-2)\" (mouseenter)=\"previewDensity(-2)\" (mouseleave)=\"restoreDensity()\" mat-menu-item>\n <mat-icon svgIcon=\"size-s\"></mat-icon>\n <span i18n>Very Dense</span>\n </button>\n <button (click)=\"setDensity(-3)\" (mouseenter)=\"previewDensity(-3)\" (mouseleave)=\"restoreDensity()\" mat-menu-item>\n <mat-icon svgIcon=\"size-xs\"></mat-icon>\n <span i18n>Extreme Dense</span>\n </button>\n</mat-menu>\n<mat-menu #themeFontMenu=\"matMenu\" xPosition=\"before\">\n <button (click)=\"setTypography(typographyName)\"\n (mouseenter)=\"previewTypography(typographyName)\"\n (mouseleave)=\"restoreTypography()\"\n *ngFor=\"let typographyName of availableTypographies\"\n mat-menu-item>\n {{ typographyName }}\n </button>\n</mat-menu>\n\n<mat-menu #themePresetMenu=\"matMenu\" xPosition=\"before\">\n <button (click)=\"setTheme(themeName)\"\n (mouseenter)=\"previewTheme(themeName)\"\n (mouseleave)=\"restoreTheme()\"\n *ngFor=\"let themeName of availableThemes\"\n mat-menu-item>\n {{ themeName }}\n </button>\n</mat-menu>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: LanguageSelectorComponent, selector: "rxap-language-selector" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] }); }
348
+ }
349
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SettingsButtonComponent, decorators: [{
350
+ type: Component,
351
+ args: [{ selector: 'rxap-settings-button', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, LanguageSelectorComponent, MatMenuModule, PortalModule], template: "<button [matMenuTriggerFor]=\"menu\" mat-icon-button>\n <mat-icon svgIcon=\"cog\"></mat-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\">\n <button (click)=\"theme.toggleDarkTheme()\" mat-menu-item>\n <mat-icon *ngIf=\"theme.darkMode()\" svgIcon=\"brightness-2\"></mat-icon>\n <mat-icon *ngIf=\"!theme.darkMode()\" svgIcon=\"brightness-5\"></mat-icon>\n <span i18n>Mode</span>\n </button>\n <button [matMenuTriggerFor]=\"themeMenu\" mat-menu-item>\n <mat-icon svgIcon=\"compare\"></mat-icon>\n <span i18n>Theme</span>\n </button>\n <rxap-language-selector></rxap-language-selector>\n <button (click)=\"openChangelogDialog()\" mat-menu-item>\n <mat-icon svgIcon=\"format-list-numbered\"></mat-icon>\n <span i18n>What's new</span>\n </button>\n <ng-container *ngFor=\"let item of items()\">\n <ng-template [cdkPortalOutlet]=\"item\"></ng-template>\n </ng-container>\n</mat-menu>\n\n<mat-menu #themeMenu=\"matMenu\" xPosition=\"before\">\n <button [matMenuTriggerFor]=\"themeDensityMenu\" mat-menu-item>\n <mat-icon svgIcon=\"move-resize\"></mat-icon>\n <span i18n>Density</span>\n </button>\n <button [matMenuTriggerFor]=\"themeFontMenu\" mat-menu-item>\n <mat-icon svgIcon=\"format-font\"></mat-icon>\n <span i18n>Font</span>\n </button>\n <button [matMenuTriggerFor]=\"themePresetMenu\" mat-menu-item>\n <mat-icon svgIcon=\"shape-outline\"></mat-icon>\n <span i18n>Preset</span>\n </button>\n</mat-menu>\n\n<mat-menu #themeDensityMenu=\"matMenu\" xPosition=\"before\">\n <button (click)=\"setDensity(0)\" (mouseenter)=\"previewDensity(0)\" (mouseleave)=\"restoreDensity()\" mat-menu-item>\n <mat-icon svgIcon=\"size-l\"></mat-icon>\n <span i18n>Normal</span>\n </button>\n <button (click)=\"setDensity(-1)\" (mouseenter)=\"previewDensity(-1)\" (mouseleave)=\"restoreDensity()\" mat-menu-item>\n <mat-icon svgIcon=\"size-m\"></mat-icon>\n <span i18n>Dense</span>\n </button>\n <button (click)=\"setDensity(-2)\" (mouseenter)=\"previewDensity(-2)\" (mouseleave)=\"restoreDensity()\" mat-menu-item>\n <mat-icon svgIcon=\"size-s\"></mat-icon>\n <span i18n>Very Dense</span>\n </button>\n <button (click)=\"setDensity(-3)\" (mouseenter)=\"previewDensity(-3)\" (mouseleave)=\"restoreDensity()\" mat-menu-item>\n <mat-icon svgIcon=\"size-xs\"></mat-icon>\n <span i18n>Extreme Dense</span>\n </button>\n</mat-menu>\n<mat-menu #themeFontMenu=\"matMenu\" xPosition=\"before\">\n <button (click)=\"setTypography(typographyName)\"\n (mouseenter)=\"previewTypography(typographyName)\"\n (mouseleave)=\"restoreTypography()\"\n *ngFor=\"let typographyName of availableTypographies\"\n mat-menu-item>\n {{ typographyName }}\n </button>\n</mat-menu>\n\n<mat-menu #themePresetMenu=\"matMenu\" xPosition=\"before\">\n <button (click)=\"setTheme(themeName)\"\n (mouseenter)=\"previewTheme(themeName)\"\n (mouseleave)=\"restoreTheme()\"\n *ngFor=\"let themeName of availableThemes\"\n mat-menu-item>\n {{ themeName }}\n </button>\n</mat-menu>\n" }]
352
+ }], ctorParameters: function () { return [{ type: i1$4.ThemeService }, { type: i2$4.ActivatedRoute }, { type: i0.Injector }, { type: i3$3.ChangelogService }]; } });
353
+
354
+ class SidenavToggleButtonComponent {
355
+ constructor(layoutComponentService) {
356
+ this.layoutComponentService = layoutComponentService;
357
+ this.opened = layoutComponentService.opened;
358
+ }
359
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavToggleButtonComponent, deps: [{ token: LayoutComponentService }], target: i0.ɵɵFactoryTarget.Component }); }
360
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SidenavToggleButtonComponent, isStandalone: true, selector: "rxap-sidenav-toggle-button", ngImport: i0, template: "<button (click)=\"layoutComponentService.toggleOpened()\" mat-icon-button>\n <mat-icon *ngIf=\"!opened()\">menu</mat-icon>\n <mat-icon *ngIf=\"opened()\">menu_open</mat-icon>\n</button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
361
+ }
362
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavToggleButtonComponent, decorators: [{
363
+ type: Component,
364
+ args: [{ selector: 'rxap-sidenav-toggle-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
365
+ MatButtonModule,
366
+ NgIf,
367
+ MatIconModule,
368
+ ], template: "<button (click)=\"layoutComponentService.toggleOpened()\" mat-icon-button>\n <mat-icon *ngIf=\"!opened()\">menu</mat-icon>\n <mat-icon *ngIf=\"opened()\">menu_open</mat-icon>\n</button>\n" }]
369
+ }], ctorParameters: function () { return [{ type: LayoutComponentService }]; } });
370
+
371
+ const EXTRACT_USERNAME_FROM_PROFILE = new InjectionToken('extract-username-from-profile', {
372
+ providedIn: 'root',
373
+ factory: () => (profile) => (profile ? profile.username ?? profile.email ?? profile.name : null) ?? null,
374
+ });
375
+ class UserProfileIconComponent {
376
+ constructor(userProfileService, authenticationService, extractUsernameFromProfile) {
377
+ this.userProfileService = userProfileService;
378
+ this.authenticationService = authenticationService;
379
+ this.username = toSignal(this.authenticationService.isAuthenticated$.pipe(filter$1(Boolean), switchMap$1(() => this.userProfileService.connect({
380
+ viewChange: this.authenticationService.isAuthenticated$.pipe(skip(1), filter$1(Boolean), distinctUntilChanged()),
381
+ })), filter$1(Boolean), map(extractUsernameFromProfile)), { initialValue: null });
382
+ }
383
+ async logout() {
384
+ await this.authenticationService.signOut();
385
+ }
386
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: UserProfileIconComponent, deps: [{ token: i1$5.UserProfileDataSource }, { token: i2$3.RxapAuthenticationService }, { token: EXTRACT_USERNAME_FROM_PROFILE }], target: i0.ɵɵFactoryTarget.Component }); }
387
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: UserProfileIconComponent, isStandalone: true, selector: "rxap-user-profile-icon", ngImport: i0, template: "<button [matMenuTriggerFor]=\"menu\"\n [disabled]=\"!username()\"\n class=\"profile-icon flex flex-row justify-center items-center\">\n <mat-icon class=\"avatar-icon\" svgIcon=\"account-circle\"></mat-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\" [yPosition]=\"'below'\" class=\"!max-w-none\">\n <button mat-menu-item>\n <span class=\"flex flex-row gap-2\">\n <mat-icon svgIcon=\"account\"></mat-icon>\n <span>{{username()}}</span>\n </span>\n </button>\n <button (click)=\"logout()\" mat-menu-item>\n <span class=\"flex flex-row gap-2\">\n <mat-icon svgIcon=\"logout\"></mat-icon>\n <span i18n>Logout</span>\n </span>\n </button>\n</mat-menu>\n", styles: [".profile-icon{border-radius:100%;border:none;height:32px;width:32px;overflow:hidden;background-position:center center;background-repeat:no-repeat;background-size:cover}.profile-icon .avatar-icon{width:32px;height:32px;font-size:32px}.profile-icon:hover{cursor:pointer}.profile-icon:focus{outline:none}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
388
+ }
389
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: UserProfileIconComponent, decorators: [{
390
+ type: Component,
391
+ args: [{ selector: 'rxap-user-profile-icon', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
392
+ MatMenuModule,
393
+ MatIconModule,
394
+ NgIf,
395
+ AsyncPipe,
396
+ ], template: "<button [matMenuTriggerFor]=\"menu\"\n [disabled]=\"!username()\"\n class=\"profile-icon flex flex-row justify-center items-center\">\n <mat-icon class=\"avatar-icon\" svgIcon=\"account-circle\"></mat-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\" [yPosition]=\"'below'\" class=\"!max-w-none\">\n <button mat-menu-item>\n <span class=\"flex flex-row gap-2\">\n <mat-icon svgIcon=\"account\"></mat-icon>\n <span>{{username()}}</span>\n </span>\n </button>\n <button (click)=\"logout()\" mat-menu-item>\n <span class=\"flex flex-row gap-2\">\n <mat-icon svgIcon=\"logout\"></mat-icon>\n <span i18n>Logout</span>\n </span>\n </button>\n</mat-menu>\n", styles: [".profile-icon{border-radius:100%;border:none;height:32px;width:32px;overflow:hidden;background-position:center center;background-repeat:no-repeat;background-size:cover}.profile-icon .avatar-icon{width:32px;height:32px;font-size:32px}.profile-icon:hover{cursor:pointer}.profile-icon:focus{outline:none}\n"] }]
397
+ }], ctorParameters: function () { return [{ type: i1$5.UserProfileDataSource }, { type: i2$3.RxapAuthenticationService }, { type: undefined, decorators: [{
398
+ type: Inject,
399
+ args: [EXTRACT_USERNAME_FROM_PROFILE]
400
+ }] }]; } });
401
+
402
+ class HeaderComponent {
403
+ constructor(headerComponentService, layoutComponentService, headerComponent) {
404
+ this.headerComponentService = headerComponentService;
405
+ this.layoutComponentService = layoutComponentService;
406
+ this.headerComponent = headerComponent;
407
+ this.color = undefined;
408
+ this.collapsable = layoutComponentService.collapsable;
409
+ this.opened = layoutComponentService.opened;
410
+ }
411
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HeaderComponent, deps: [{ token: HeaderService }, { token: LayoutComponentService }, { token: RXAP_HEADER_COMPONENT, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
412
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: HeaderComponent, isStandalone: true, selector: "rxap-header", inputs: { color: "color" }, ngImport: i0, template: "<mat-toolbar [color]=\"color\" [ngClass]=\"{ open: opened() }\" class=\"mat-elevation-z3 header\">\n <div class=\"w-full flex flex-row gap-x-4 justify-between items-center\">\n <rxap-sidenav-toggle-button *ngIf=\"!collapsable()\"></rxap-sidenav-toggle-button>\n <div class=\"grow\">\n <ng-content></ng-content>\n </div>\n <rxap-apps-button class=\"grow-0\"></rxap-apps-button>\n <rxap-settings-button class=\"grow-0\"></rxap-settings-button>\n <rxap-user-profile-icon class=\"grow-0\"></rxap-user-profile-icon>\n </div>\n</mat-toolbar>\n\n<rxap-navigation-progress-bar></rxap-navigation-progress-bar>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: NavigationProgressBarComponent, selector: "rxap-navigation-progress-bar" }, { kind: "component", type: UserProfileIconComponent, selector: "rxap-user-profile-icon" }, { kind: "component", type: AppsButtonComponent, selector: "rxap-apps-button" }, { kind: "component", type: SettingsButtonComponent, selector: "rxap-settings-button" }, { kind: "component", type: SidenavToggleButtonComponent, selector: "rxap-sidenav-toggle-button" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
318
413
  }
319
414
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HeaderComponent, decorators: [{
320
415
  type: Component,
@@ -325,7 +420,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
325
420
  MatButtonModule,
326
421
  MatMenuModule,
327
422
  MatIconModule,
328
- LanguageSelectorComponent,
329
423
  MatFormFieldModule,
330
424
  StopPropagationDirective,
331
425
  MatSelectModule,
@@ -337,18 +431,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
337
431
  NavigationProgressBarComponent,
338
432
  UserProfileIconComponent,
339
433
  AppsButtonComponent,
340
- ], template: "<mat-toolbar [color]=\"color\" [ngClass]=\"{ open: sidenav?.opened }\" class=\"mat-elevation-z3 header\">\n <div class=\"w-full flex flex-row gap-x-4 justify-between items-center\">\n <div class=\"grow\">\n <ng-content></ng-content>\n </div>\n <rxap-apps-button class=\"grow-0\"></rxap-apps-button>\n <div class=\"grow-0\">\n <button [matMenuTriggerFor]=\"menu\" mat-icon-button>\n <mat-icon>settings</mat-icon>\n </button>\n </div>\n <rxap-user-profile-icon class=\"grow-0\"></rxap-user-profile-icon>\n </div>\n</mat-toolbar>\n\n<rxap-navigation-progress-bar></rxap-navigation-progress-bar>\n<mat-menu #menu=\"matMenu\">\n <button (click)=\"theme.toggleDarkTheme()\" mat-menu-item>\n <mat-icon *ngIf=\"theme.darkMode\">brightness_2</mat-icon>\n <mat-icon *ngIf=\"!theme.darkMode\">brightness_5</mat-icon>\n <span i18n>Mode</span>\n </button>\n <rxap-language-selector *ngIf=\"!isDevMode\"></rxap-language-selector>\n</mat-menu>\n" }]
434
+ SettingsButtonComponent,
435
+ SidenavToggleButtonComponent,
436
+ ], template: "<mat-toolbar [color]=\"color\" [ngClass]=\"{ open: opened() }\" class=\"mat-elevation-z3 header\">\n <div class=\"w-full flex flex-row gap-x-4 justify-between items-center\">\n <rxap-sidenav-toggle-button *ngIf=\"!collapsable()\"></rxap-sidenav-toggle-button>\n <div class=\"grow\">\n <ng-content></ng-content>\n </div>\n <rxap-apps-button class=\"grow-0\"></rxap-apps-button>\n <rxap-settings-button class=\"grow-0\"></rxap-settings-button>\n <rxap-user-profile-icon class=\"grow-0\"></rxap-user-profile-icon>\n </div>\n</mat-toolbar>\n\n<rxap-navigation-progress-bar></rxap-navigation-progress-bar>\n" }]
341
437
  }], ctorParameters: function () { return [{ type: i1.HeaderService, decorators: [{
342
438
  type: Inject,
343
439
  args: [HeaderService]
344
- }] }, { type: undefined, decorators: [{
440
+ }] }, { type: LayoutComponentService }, { type: undefined, decorators: [{
345
441
  type: Optional
346
442
  }, {
347
443
  type: Inject,
348
444
  args: [RXAP_HEADER_COMPONENT]
349
- }] }, { type: i1.ThemeService }]; }, propDecorators: { sidenav: [{
350
- type: Input
351
- }], color: [{
445
+ }] }]; }, propDecorators: { color: [{
352
446
  type: Input
353
447
  }] } });
354
448
 
@@ -359,82 +453,29 @@ class SignOutComponent {
359
453
  async logout() {
360
454
  await this.authenticationService.signOut();
361
455
  }
362
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SignOutComponent, deps: [{ token: i1$1.RxapAuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
363
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SignOutComponent, isStandalone: true, selector: "rxap-sign-out", ngImport: i0, template: "<button\n mat-icon-button\n (click)=\"logout()\"\n>\n <mat-icon>login</mat-icon>\n</button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
456
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SignOutComponent, deps: [{ token: i2$3.RxapAuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
457
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SignOutComponent, isStandalone: true, selector: "rxap-sign-out", ngImport: i0, template: "<button\n mat-icon-button\n (click)=\"logout()\"\n>\n <mat-icon svgIcon=\"logout\"></mat-icon>\n</button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
364
458
  }
365
459
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SignOutComponent, decorators: [{
366
460
  type: Component,
367
- args: [{ selector: 'rxap-sign-out', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatButtonModule, MatIconModule], template: "<button\n mat-icon-button\n (click)=\"logout()\"\n>\n <mat-icon>login</mat-icon>\n</button>\n" }]
368
- }], ctorParameters: function () { return [{ type: i1$1.RxapAuthenticationService }]; } });
461
+ args: [{ selector: 'rxap-sign-out', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatButtonModule, MatIconModule], template: "<button\n mat-icon-button\n (click)=\"logout()\"\n>\n <mat-icon svgIcon=\"logout\"></mat-icon>\n</button>\n" }]
462
+ }], ctorParameters: function () { return [{ type: i2$3.RxapAuthenticationService }]; } });
369
463
 
370
464
  class ResetButtonComponent {
371
465
  constructor(resetService) {
372
466
  this.resetService = resetService;
373
467
  }
374
468
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ResetButtonComponent, deps: [{ token: ResetService }], target: i0.ɵɵFactoryTarget.Component }); }
375
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: ResetButtonComponent, isStandalone: true, selector: "rxap-reset-button", ngImport: i0, template: "<button (click)=\"resetService.resetAll()\" mat-icon-button>\n <mat-icon>refresh</mat-icon>\n</button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
469
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: ResetButtonComponent, isStandalone: true, selector: "rxap-reset-button", ngImport: i0, template: "<button (click)=\"resetService.resetAll()\" mat-icon-button>\n <mat-icon svgIcon=\"refresh\"></mat-icon>\n</button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
376
470
  }
377
471
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ResetButtonComponent, decorators: [{
378
472
  type: Component,
379
- args: [{ selector: 'rxap-reset-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatButtonModule, MatIconModule], template: "<button (click)=\"resetService.resetAll()\" mat-icon-button>\n <mat-icon>refresh</mat-icon>\n</button>\n" }]
473
+ args: [{ selector: 'rxap-reset-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatButtonModule, MatIconModule], template: "<button (click)=\"resetService.resetAll()\" mat-icon-button>\n <mat-icon svgIcon=\"refresh\"></mat-icon>\n</button>\n" }]
380
474
  }], ctorParameters: function () { return [{ type: i1.ResetService, decorators: [{
381
475
  type: Inject,
382
476
  args: [ResetService]
383
477
  }] }]; } });
384
478
 
385
- class SidenavToggleButtonComponent {
386
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavToggleButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
387
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SidenavToggleButtonComponent, isStandalone: true, selector: "rxap-sidenav-toggle-button", inputs: { sidenav: "sidenav" }, ngImport: i0, template: "<button (click)=\"sidenav.toggle()\" mat-icon-button>\n <mat-icon *ngIf=\"!sidenav.opened\">menu</mat-icon>\n <mat-icon *ngIf=\"sidenav.opened\">menu_open</mat-icon>\n</button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
388
- }
389
- __decorate([
390
- Required,
391
- __metadata("design:type", MatSidenav)
392
- ], SidenavToggleButtonComponent.prototype, "sidenav", void 0);
393
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavToggleButtonComponent, decorators: [{
394
- type: Component,
395
- args: [{ selector: 'rxap-sidenav-toggle-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
396
- MatButtonModule,
397
- NgIf,
398
- MatIconModule,
399
- ], template: "<button (click)=\"sidenav.toggle()\" mat-icon-button>\n <mat-icon *ngIf=\"!sidenav.opened\">menu</mat-icon>\n <mat-icon *ngIf=\"sidenav.opened\">menu_open</mat-icon>\n</button>\n" }]
400
- }], propDecorators: { sidenav: [{
401
- type: Input
402
- }] } });
403
-
404
- class LayoutComponentService {
405
- constructor(footerComponentService, headerComponentService, logoConfig = null, config) {
406
- this.footerComponentService = footerComponentService;
407
- this.headerComponentService = headerComponentService;
408
- this.config = config;
409
- this.opened$ = new BehaviorSubject(true);
410
- this.mode$ = new BehaviorSubject('side');
411
- this.fixedTopGap$ = new BehaviorSubject(64);
412
- this.mode$.next(this.config.get('navigation.mode', this.mode$.value));
413
- this.opened$.next(this.config.get('navigation.open', this.opened$.value));
414
- this.fixedBottomGap$ = this.footerComponentService.portalCount$.pipe(map(count => count * 64));
415
- this.fixedTopGap$.next(this.headerComponentService.countComponent * 64);
416
- this.headerComponentService.update$.pipe(tap(() => this.fixedTopGap$.next(this.headerComponentService.countComponent * 64))).subscribe();
417
- this.logo = logoConfig ?? {
418
- src: '/assets/logo.png',
419
- width: 192,
420
- };
421
- }
422
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponentService, deps: [{ token: i1.FooterService }, { token: i1.HeaderService }, { token: RXAP_LOGO_CONFIG, optional: true }, { token: ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
423
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponentService, providedIn: 'root' }); }
424
- }
425
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponentService, decorators: [{
426
- type: Injectable,
427
- args: [{ providedIn: 'root' }]
428
- }], ctorParameters: function () { return [{ type: i1.FooterService }, { type: i1.HeaderService }, { type: undefined, decorators: [{
429
- type: Optional
430
- }, {
431
- type: Inject,
432
- args: [RXAP_LOGO_CONFIG]
433
- }] }, { type: i1$2.ConfigService, decorators: [{
434
- type: Inject,
435
- args: [ConfigService]
436
- }] }]; } });
437
-
438
479
  class SidenavComponentService {
439
480
  constructor(config) {
440
481
  this.config = config;
@@ -444,13 +485,13 @@ class SidenavComponentService {
444
485
  toggleNavigationCollapse() {
445
486
  this.collapsed$.next(!this.collapsed$.value);
446
487
  }
447
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponentService, deps: [{ token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
488
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponentService, deps: [{ token: i1$1.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
448
489
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponentService, providedIn: 'root' }); }
449
490
  }
450
491
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponentService, decorators: [{
451
492
  type: Injectable,
452
493
  args: [{ providedIn: 'root' }]
453
- }], ctorParameters: function () { return [{ type: i1$2.ConfigService }]; } });
494
+ }], ctorParameters: function () { return [{ type: i1$1.ConfigService }]; } });
454
495
 
455
496
  class NavigationItemComponent {
456
497
  get isActive() {
@@ -522,7 +563,7 @@ class NavigationItemComponent {
522
563
  return item;
523
564
  }
524
565
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationItemComponent, deps: [{ token: Router }, { token: SidenavComponentService }, { token: ElementRef }, { token: Renderer2 }, { token: Overlay }, { token: ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
525
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: NavigationItemComponent, isStandalone: true, selector: "li[rxap-navigation-item]", inputs: { level: "level", item: "item" }, host: { properties: { "class.active": "this.isActive" } }, viewQueries: [{ propertyName: "routerLinkActive", first: true, predicate: RouterLinkActive, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"{\n 'border-l-4 text-accent-400 border-accent-600': active(),\n }\">\n <a [routerLink]=\"item.routerLink\"\n class=\"h-12 pl-4 pr-5 flex flex-row justify-between items-center gap-x-4\"\n matRipple\n routerLinkActive\n\n >\n <span\n [ngClass]=\"{\n 'pl-0': level === 0,\n 'pl-4': level === 1,\n 'pl-8': level === 2,\n 'pl-12': level === 3\n }\"\n class=\"grow whitespace-nowrap\"\n >\n {{ item.label }}\n </span>\n <mat-icon *ngIf=\"item.icon\" [rxapIcon]=\"item.icon\"></mat-icon>\n </a>\n\n <ng-container *ngIf=\"item.children?.length && active()\">\n\n <mat-divider></mat-divider>\n\n <ul [@sub-nav]\n [items]=\"children ?? []\"\n [level]=\"level + 1\"\n rxap-navigation\n >\n </ul>\n\n <mat-divider></mat-divider>\n\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return RouterLinkActive; }), selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i0.forwardRef(function () { return RouterLink; }), selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i0.forwardRef(function () { return NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatRippleModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i4.MatRipple; }), selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatIconModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i2$3.MatIcon; }), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i0.forwardRef(function () { return IconDirective; }), selector: "mat-icon[rxapIcon]", inputs: ["rxapIcon"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatDividerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i3$4.MatDivider; }), selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i0.forwardRef(function () { return NavigationComponent; }), selector: "ul[rxap-navigation]", inputs: ["items", "level", "root"] }, { kind: "directive", type: i0.forwardRef(function () { return NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [
566
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: NavigationItemComponent, isStandalone: true, selector: "li[rxap-navigation-item]", inputs: { level: "level", item: "item" }, host: { properties: { "class.active": "this.isActive" } }, viewQueries: [{ propertyName: "routerLinkActive", first: true, predicate: RouterLinkActive, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"{\n 'border-l-4 text-accent-400 border-accent-600': active(),\n }\">\n <a [routerLink]=\"item.routerLink\"\n class=\"h-12 pl-4 pr-5 flex flex-row justify-between items-center gap-x-4\"\n matRipple\n routerLinkActive\n\n >\n <span\n [ngClass]=\"{\n 'pl-0': level === 0,\n 'pl-4': level === 1,\n 'pl-8': level === 2,\n 'pl-12': level === 3\n }\"\n class=\"grow whitespace-nowrap\"\n >\n {{ item.label }}\n </span>\n <mat-icon *ngIf=\"item.icon\" [rxapIcon]=\"item.icon\"></mat-icon>\n </a>\n\n <ng-container *ngIf=\"item.children?.length && active()\">\n\n <mat-divider></mat-divider>\n\n <ul [@sub-nav]\n [items]=\"children ?? []\"\n [level]=\"level + 1\"\n rxap-navigation\n >\n </ul>\n\n <mat-divider></mat-divider>\n\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return RouterLinkActive; }), selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i0.forwardRef(function () { return RouterLink; }), selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i0.forwardRef(function () { return NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatRippleModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i4$1.MatRipple; }), selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatIconModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i4.MatIcon; }), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i0.forwardRef(function () { return IconDirective; }), selector: "mat-icon[rxapIcon]", inputs: ["rxapIcon"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatDividerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i3$4.MatDivider; }), selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i0.forwardRef(function () { return NavigationComponent; }), selector: "ul[rxap-navigation]", inputs: ["items", "level", "root"] }, { kind: "directive", type: i0.forwardRef(function () { return NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [
526
567
  trigger('sub-nav', [
527
568
  transition(':enter', [
528
569
  style({
@@ -540,10 +581,6 @@ class NavigationItemComponent {
540
581
  ]),
541
582
  ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
542
583
  }
543
- __decorate([
544
- Required,
545
- __metadata("design:type", Object)
546
- ], NavigationItemComponent.prototype, "item", void 0);
547
584
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationItemComponent, decorators: [{
548
585
  type: Component,
549
586
  args: [{ selector: 'li[rxap-navigation-item]', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, animations: [
@@ -573,7 +610,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
573
610
  forwardRef(() => NavigationComponent),
574
611
  NgClass,
575
612
  ], template: "<div [ngClass]=\"{\n 'border-l-4 text-accent-400 border-accent-600': active(),\n }\">\n <a [routerLink]=\"item.routerLink\"\n class=\"h-12 pl-4 pr-5 flex flex-row justify-between items-center gap-x-4\"\n matRipple\n routerLinkActive\n\n >\n <span\n [ngClass]=\"{\n 'pl-0': level === 0,\n 'pl-4': level === 1,\n 'pl-8': level === 2,\n 'pl-12': level === 3\n }\"\n class=\"grow whitespace-nowrap\"\n >\n {{ item.label }}\n </span>\n <mat-icon *ngIf=\"item.icon\" [rxapIcon]=\"item.icon\"></mat-icon>\n </a>\n\n <ng-container *ngIf=\"item.children?.length && active()\">\n\n <mat-divider></mat-divider>\n\n <ul [@sub-nav]\n [items]=\"children ?? []\"\n [level]=\"level + 1\"\n rxap-navigation\n >\n </ul>\n\n <mat-divider></mat-divider>\n\n </ng-container>\n</div>\n" }]
576
- }], ctorParameters: function () { return [{ type: i2$2.Router, decorators: [{
613
+ }], ctorParameters: function () { return [{ type: i2$4.Router, decorators: [{
577
614
  type: Inject,
578
615
  args: [Router]
579
616
  }] }, { type: SidenavComponentService, decorators: [{
@@ -597,7 +634,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
597
634
  type: ViewChild,
598
635
  args: [RouterLinkActive, { static: true }]
599
636
  }], item: [{
600
- type: Input
637
+ type: Input,
638
+ args: [{ required: true }]
601
639
  }], isActive: [{
602
640
  type: HostBinding,
603
641
  args: ['class.active']
@@ -628,7 +666,7 @@ class NavigationService {
628
666
  Object.entries(inserts).forEach(([id, insert]) => this.insert(id, insert, false));
629
667
  }
630
668
  this.updateNavigation();
631
- this.config$ = this.navigation$.pipe(switchMap((navigationWithoutStatusCheck) => this.checkNavigationStatusProviders(navigationWithoutStatusCheck)));
669
+ this.config$ = this.navigation$.pipe(switchMap$1((navigationWithoutStatusCheck) => this.checkNavigationStatusProviders(navigationWithoutStatusCheck)));
632
670
  }
633
671
  /**
634
672
  * @deprecated use add instead
@@ -685,7 +723,7 @@ class NavigationService {
685
723
  return of(false);
686
724
  })));
687
725
  // TODO : dont wait for all status services to complete, but cancel waiting if one returns false
688
- return combineLatest(isVisibleArray$).pipe(map((isVisibleArray) => isVisibleArray.reduce((acc, isVisible) => acc && isVisible, true)), map((isVisible) => (isVisible ? navigationItem : null)), switchMap((navigationItemOrNull) => {
726
+ return combineLatest(isVisibleArray$).pipe(map((isVisibleArray) => isVisibleArray.reduce((acc, isVisible) => acc && isVisible, true)), map((isVisible) => (isVisible ? navigationItem : null)), switchMap$1((navigationItemOrNull) => {
689
727
  if (navigationItemOrNull) {
690
728
  if (navigationItemOrNull.children?.length) {
691
729
  return this.checkNavigationStatusProviders(navigationItemOrNull.children).pipe(map((children) => ({
@@ -770,6 +808,7 @@ class NavigationComponent {
770
808
  .pipe(tap((navigation) => (this.items = navigation)), tap(() => this.cdr.detectChanges()))
771
809
  .subscribe();
772
810
  }
811
+ this.items ??= [];
773
812
  }
774
813
  ngOnDestroy() {
775
814
  this.subscription?.unsubscribe();
@@ -791,10 +830,6 @@ class NavigationComponent {
791
830
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationComponent, deps: [{ token: NavigationService }, { token: ChangeDetectorRef }, { token: SidenavComponentService }], target: i0.ɵɵFactoryTarget.Component }); }
792
831
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: NavigationComponent, isStandalone: true, selector: "ul[rxap-navigation]", inputs: { items: "items", level: "level", root: "root" }, host: { properties: { "class.rxap-root-navigation": "this._root" }, classAttribute: "list-none dark:text-neutral-400 text-neutral-700" }, ngImport: i0, template: "<ng-template [ngForOf]=\"items\" let-item ngFor>\n <ng-template [ngIf]=\"isNavigationDividerItem(item)\">\n <mat-divider></mat-divider>\n <div *ngIf=\"(sidenav.collapsed$ | async) === false\" class=\"pl-5 h-6\">\n <span *ngIf=\"item.title\">{{item.title}}</span>\n </div>\n </ng-template>\n <ng-template [ngIf]=\"isNavigationItem(item)\">\n <li [item]=\"asNavigationItem(item)\" [level]=\"level\" class=\"dark:hover:text-white hover:text-black\"\n rxap-navigation-item></li>\n </ng-template>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return NgFor; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatDividerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i3$4.MatDivider; }), selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i0.forwardRef(function () { return NavigationItemComponent; }), selector: "li[rxap-navigation-item]", inputs: ["level", "item"] }, { kind: "pipe", type: i0.forwardRef(function () { return AsyncPipe; }), name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
793
832
  }
794
- __decorate([
795
- Required,
796
- __metadata("design:type", Array)
797
- ], NavigationComponent.prototype, "items", void 0);
798
833
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationComponent, decorators: [{
799
834
  type: Component,
800
835
  args: [{ selector: 'ul[rxap-navigation]', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, host: {
@@ -827,25 +862,41 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
827
862
  }] } });
828
863
 
829
864
  class LayoutComponent {
830
- constructor(layoutComponentService, environment) {
865
+ constructor(layoutComponentService, environment, iconLoaderService) {
831
866
  this.layoutComponentService = layoutComponentService;
832
867
  this.environment = environment;
833
- this.sidenavMode = 'over';
868
+ this.userSettingsThemeService = inject(UserSettingsThemeService);
869
+ this.themeService = inject(ThemeService);
870
+ iconLoaderService.load();
871
+ this.fixedBottomGap = layoutComponentService.fixedBottomGap;
872
+ this.fixedTopGap = layoutComponentService.fixedTopGap;
873
+ this.pinned = layoutComponentService.pinned;
874
+ this.collapsable = layoutComponentService.collapsable;
875
+ this.opened = layoutComponentService.opened;
876
+ this.sidenavMode = layoutComponentService.mode;
877
+ this.logoSrc = this.layoutComponentService.logo.src ?? 'https://via.placeholder.com/256x128px';
878
+ this.logoWidth = this.layoutComponentService.logo.width ?? 256;
879
+ this.release = DetermineReleaseName(this.environment);
834
880
  }
835
- get release() {
836
- return DetermineReleaseName(this.environment);
881
+ ngOnDestroy() {
882
+ this.userSettingsThemeService.stopSync();
837
883
  }
838
- toggleSidenavMode() {
839
- if (this.sidenavMode === 'over') {
840
- this.sidenavMode = 'side';
841
- this.sidenav.open();
842
- }
843
- else {
844
- this.sidenavMode = 'over';
845
- }
884
+ ngOnInit() {
885
+ this.userSettingsThemeService.startSync();
886
+ this.userSettingsThemeService.get().then(theme => {
887
+ if (theme.preset && theme.preset !== 'default') {
888
+ this.themeService.setTheme(theme.preset, true);
889
+ }
890
+ if (theme.density && IsThemeDensity(theme.density) && theme.density !== ThemeDensity.Normal) {
891
+ this.themeService.setDensity(theme.density, true);
892
+ }
893
+ if (theme.typography && theme.typography !== 'default') {
894
+ this.themeService.setTypography(theme.typography, true);
895
+ }
896
+ });
846
897
  }
847
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponent, deps: [{ token: LayoutComponentService }, { token: RXAP_ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component }); }
848
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: LayoutComponent, isStandalone: true, selector: "rxap-layout", viewQueries: [{ propertyName: "sidenav", first: true, predicate: MatSidenav, descendants: true, static: true }], ngImport: i0, template: "<div class=\"flex flex-col h-screen justify-between\">\n <rxap-header [sidenav]=\"sidenav\" class=\"z-10 w-full fixed top-0\"></rxap-header>\n <mat-sidenav-container [ngClass]=\"{\n 'mb-16': (layoutComponentService.fixedBottomGap$ | async) === 64,\n 'mb-32': (layoutComponentService.fixedBottomGap$ | async) === 128,\n }\" class=\"grow mt-16\">\n <mat-sidenav\n #matSidenav=\"matSidenav\"\n (mouseenter)=\"sidenavMode === 'over' && matSidenav.open()\"\n (mouseleave)=\"sidenavMode === 'over' && matSidenav.close()\"\n [fixedBottomGap]=\"layoutComponentService.fixedBottomGap$ | async\"\n [fixedInViewport]=\"true\"\n [fixedTopGap]=\"layoutComponentService.fixedTopGap$ | async\"\n [mode]=\"sidenavMode\"\n [opened]=\"false\"\n class=\"sidenav\"\n >\n <div class=\"h-full py-2 flex flex-col items-center gap-y-5 justify-items-stretch\">\n\n <div (click)=\"toggleSidenavMode()\"\n class=\"pl-2 pr-2 self-stretch grow-0 flex flex-row justify-between items-center\">\n <span class=\"text-lg\" i18n>Navigation</span>\n <button mat-icon-button>\n <mat-icon *ngIf=\"sidenavMode === 'over'\">radio_button_unchecked</mat-icon>\n <mat-icon *ngIf=\"sidenavMode === 'side'\">radio_button_checked</mat-icon>\n </button>\n </div>\n\n <ul class=\"grow self-stretch\" root rxap-navigation></ul>\n\n <img\n [src]=\"layoutComponentService.logo.src ?? 'https://via.placeholder.com/256x128px'\"\n [routerLink]=\"['/']\"\n [width]=\"layoutComponentService.logo.width ?? 256\"\n alt=\"logo\"\n class=\"grow-0 mx-16\"\n />\n <div class=\"grow-0 px-16\">\n <span>{{release}}</span>\n </div>\n </div>\n </mat-sidenav>\n <mat-sidenav-content\n [ngClass]=\"{ opened: matSidenav.opened, side: sidenavMode === 'side' }\"\n class=\"ml-16 p-4\"\n >\n <router-outlet></router-outlet>\n </mat-sidenav-content>\n </mat-sidenav-container>\n <rxap-footer class=\"z-10 w-full fixed bottom-0\"></rxap-footer>\n</div>\n<!--<rxap-window-task-bar-container></rxap-window-task-bar-container>-->\n", styles: [":host .sidenav:not(.mat-drawer-opened){transform:translate(calc(-100% + 64px))!important;visibility:visible!important;box-shadow:inherit!important;transition-property:transform;transition-delay:.25s;display:flex;border-right:solid 1px rgba(0,0,0,.12)}:host .sidenav ::ng-deep .mat-drawer-inner-container::-webkit-scrollbar{display:none}.footer{position:fixed;bottom:0;left:0;right:0;z-index:100}.header{position:fixed;top:0;left:0;right:0;z-index:100}.task-bar{position:fixed;bottom:0;right:0;left:0;z-index:100}\n"], dependencies: [{ kind: "component", type: HeaderComponent, selector: "rxap-header", inputs: ["sidenav", "color"] }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i2$4.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i2$4.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i2$4.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FlexLayoutModule }, { kind: "directive", type: i2$5.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FooterComponent, selector: "rxap-footer" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: NavigationComponent, selector: "ul[rxap-navigation]", inputs: ["items", "level", "root"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
898
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponent, deps: [{ token: LayoutComponentService }, { token: RXAP_ENVIRONMENT }, { token: i2$6.IconLoaderService }], target: i0.ɵɵFactoryTarget.Component }); }
899
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: LayoutComponent, isStandalone: true, selector: "rxap-layout", viewQueries: [{ propertyName: "sidenav", first: true, predicate: MatSidenav, descendants: true, static: true }], ngImport: i0, template: "<rxap-status-indicator class=\"fixed bottom-0 right-0 z-10\"></rxap-status-indicator>\n<div class=\"flex flex-col h-screen justify-between\">\n <rxap-header class=\"z-10 w-full fixed top-0\"></rxap-header>\n <mat-sidenav-container [ngStyle]=\"{\n 'margin-top.px': fixedTopGap(),\n 'margin-bottom.px': fixedBottomGap(),\n }\" class=\"grow\">\n <mat-sidenav\n #matSidenav=\"matSidenav\"\n [fixedBottomGap]=\"fixedBottomGap()\"\n [fixedInViewport]=\"true\"\n [fixedTopGap]=\"fixedTopGap()\"\n [mode]=\"sidenavMode()\"\n [ngClass]=\"{ collapsable: collapsable() }\"\n class=\"sidenav\"\n [opened]=\"opened()\"\n >\n <div (mouseleave)=\"collapsable() && !pinned() && matSidenav.close()\"\n class=\"h-full py-2 flex flex-col items-center gap-y-5 justify-items-stretch\">\n\n <div (click)=\"layoutComponentService.togglePinned()\" *ngIf=\"collapsable()\"\n class=\"pl-2 self-stretch grow-0 flex flex-row justify-between items-center\">\n <span class=\"text-lg\" i18n>Navigation</span>\n <div class=\"flex flex-row items-center justify-center\" style=\"width: 64px\">\n <button mat-icon-button>\n <mat-icon *ngIf=\"!pinned()\">radio_button_unchecked</mat-icon>\n <mat-icon *ngIf=\"pinned()\">radio_button_checked</mat-icon>\n </button>\n </div>\n </div>\n\n <ul\n (mouseenter)=\"collapsable() && !pinned() && matSidenav.open()\"\n class=\"grow self-stretch\"\n root\n rxap-navigation\n >\n </ul>\n\n <img\n [src]=\"logoSrc\"\n [routerLink]=\"['/']\"\n [width]=\"logoWidth\"\n alt=\"logo\"\n class=\"grow-0 mx-16\"\n />\n <div class=\"grow-0 px-16\">\n <span>{{release}}</span>\n </div>\n </div>\n </mat-sidenav>\n <mat-sidenav-content [ngClass]=\"{ 'ml-16': collapsable() }\" class=\"p-4\">\n <router-outlet></router-outlet>\n </mat-sidenav-content>\n </mat-sidenav-container>\n <rxap-footer class=\"z-10 w-full fixed bottom-0\"></rxap-footer>\n</div>\n<!--<rxap-window-task-bar-container></rxap-window-task-bar-container>-->\n", styles: [":host .sidenav.collapsable:not(.mat-drawer-opened){transform:translate(calc(-100% + 64px))!important;visibility:visible!important;box-shadow:inherit!important;transition-property:transform;transition-delay:.25s;display:flex;border-right:solid 1px rgba(0,0,0,.12)}:host .sidenav.collapsable ::ng-deep .mat-drawer-inner-container::-webkit-scrollbar{display:none}\n"], dependencies: [{ kind: "component", type: HeaderComponent, selector: "rxap-header", inputs: ["color"] }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i3$5.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i3$5.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i3$5.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FooterComponent, selector: "rxap-footer" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: NavigationComponent, selector: "ul[rxap-navigation]", inputs: ["items", "level", "root"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: StatusIndicatorComponent, selector: "rxap-status-indicator" }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
849
900
  }
850
901
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponent, decorators: [{
851
902
  type: Component,
@@ -853,7 +904,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
853
904
  HeaderComponent,
854
905
  MatSidenavModule,
855
906
  AsyncPipe,
856
- FlexLayoutModule,
857
907
  MatIconModule,
858
908
  MatButtonModule,
859
909
  RouterLink,
@@ -863,11 +913,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
863
913
  NgOptimizedImage,
864
914
  NavigationComponent,
865
915
  RouterOutlet,
866
- ], template: "<div class=\"flex flex-col h-screen justify-between\">\n <rxap-header [sidenav]=\"sidenav\" class=\"z-10 w-full fixed top-0\"></rxap-header>\n <mat-sidenav-container [ngClass]=\"{\n 'mb-16': (layoutComponentService.fixedBottomGap$ | async) === 64,\n 'mb-32': (layoutComponentService.fixedBottomGap$ | async) === 128,\n }\" class=\"grow mt-16\">\n <mat-sidenav\n #matSidenav=\"matSidenav\"\n (mouseenter)=\"sidenavMode === 'over' && matSidenav.open()\"\n (mouseleave)=\"sidenavMode === 'over' && matSidenav.close()\"\n [fixedBottomGap]=\"layoutComponentService.fixedBottomGap$ | async\"\n [fixedInViewport]=\"true\"\n [fixedTopGap]=\"layoutComponentService.fixedTopGap$ | async\"\n [mode]=\"sidenavMode\"\n [opened]=\"false\"\n class=\"sidenav\"\n >\n <div class=\"h-full py-2 flex flex-col items-center gap-y-5 justify-items-stretch\">\n\n <div (click)=\"toggleSidenavMode()\"\n class=\"pl-2 pr-2 self-stretch grow-0 flex flex-row justify-between items-center\">\n <span class=\"text-lg\" i18n>Navigation</span>\n <button mat-icon-button>\n <mat-icon *ngIf=\"sidenavMode === 'over'\">radio_button_unchecked</mat-icon>\n <mat-icon *ngIf=\"sidenavMode === 'side'\">radio_button_checked</mat-icon>\n </button>\n </div>\n\n <ul class=\"grow self-stretch\" root rxap-navigation></ul>\n\n <img\n [src]=\"layoutComponentService.logo.src ?? 'https://via.placeholder.com/256x128px'\"\n [routerLink]=\"['/']\"\n [width]=\"layoutComponentService.logo.width ?? 256\"\n alt=\"logo\"\n class=\"grow-0 mx-16\"\n />\n <div class=\"grow-0 px-16\">\n <span>{{release}}</span>\n </div>\n </div>\n </mat-sidenav>\n <mat-sidenav-content\n [ngClass]=\"{ opened: matSidenav.opened, side: sidenavMode === 'side' }\"\n class=\"ml-16 p-4\"\n >\n <router-outlet></router-outlet>\n </mat-sidenav-content>\n </mat-sidenav-container>\n <rxap-footer class=\"z-10 w-full fixed bottom-0\"></rxap-footer>\n</div>\n<!--<rxap-window-task-bar-container></rxap-window-task-bar-container>-->\n", styles: [":host .sidenav:not(.mat-drawer-opened){transform:translate(calc(-100% + 64px))!important;visibility:visible!important;box-shadow:inherit!important;transition-property:transform;transition-delay:.25s;display:flex;border-right:solid 1px rgba(0,0,0,.12)}:host .sidenav ::ng-deep .mat-drawer-inner-container::-webkit-scrollbar{display:none}.footer{position:fixed;bottom:0;left:0;right:0;z-index:100}.header{position:fixed;top:0;left:0;right:0;z-index:100}.task-bar{position:fixed;bottom:0;right:0;left:0;z-index:100}\n"] }]
916
+ StatusIndicatorComponent,
917
+ NgStyle,
918
+ NgClass,
919
+ ], template: "<rxap-status-indicator class=\"fixed bottom-0 right-0 z-10\"></rxap-status-indicator>\n<div class=\"flex flex-col h-screen justify-between\">\n <rxap-header class=\"z-10 w-full fixed top-0\"></rxap-header>\n <mat-sidenav-container [ngStyle]=\"{\n 'margin-top.px': fixedTopGap(),\n 'margin-bottom.px': fixedBottomGap(),\n }\" class=\"grow\">\n <mat-sidenav\n #matSidenav=\"matSidenav\"\n [fixedBottomGap]=\"fixedBottomGap()\"\n [fixedInViewport]=\"true\"\n [fixedTopGap]=\"fixedTopGap()\"\n [mode]=\"sidenavMode()\"\n [ngClass]=\"{ collapsable: collapsable() }\"\n class=\"sidenav\"\n [opened]=\"opened()\"\n >\n <div (mouseleave)=\"collapsable() && !pinned() && matSidenav.close()\"\n class=\"h-full py-2 flex flex-col items-center gap-y-5 justify-items-stretch\">\n\n <div (click)=\"layoutComponentService.togglePinned()\" *ngIf=\"collapsable()\"\n class=\"pl-2 self-stretch grow-0 flex flex-row justify-between items-center\">\n <span class=\"text-lg\" i18n>Navigation</span>\n <div class=\"flex flex-row items-center justify-center\" style=\"width: 64px\">\n <button mat-icon-button>\n <mat-icon *ngIf=\"!pinned()\">radio_button_unchecked</mat-icon>\n <mat-icon *ngIf=\"pinned()\">radio_button_checked</mat-icon>\n </button>\n </div>\n </div>\n\n <ul\n (mouseenter)=\"collapsable() && !pinned() && matSidenav.open()\"\n class=\"grow self-stretch\"\n root\n rxap-navigation\n >\n </ul>\n\n <img\n [src]=\"logoSrc\"\n [routerLink]=\"['/']\"\n [width]=\"logoWidth\"\n alt=\"logo\"\n class=\"grow-0 mx-16\"\n />\n <div class=\"grow-0 px-16\">\n <span>{{release}}</span>\n </div>\n </div>\n </mat-sidenav>\n <mat-sidenav-content [ngClass]=\"{ 'ml-16': collapsable() }\" class=\"p-4\">\n <router-outlet></router-outlet>\n </mat-sidenav-content>\n </mat-sidenav-container>\n <rxap-footer class=\"z-10 w-full fixed bottom-0\"></rxap-footer>\n</div>\n<!--<rxap-window-task-bar-container></rxap-window-task-bar-container>-->\n", styles: [":host .sidenav.collapsable:not(.mat-drawer-opened){transform:translate(calc(-100% + 64px))!important;visibility:visible!important;box-shadow:inherit!important;transition-property:transform;transition-delay:.25s;display:flex;border-right:solid 1px rgba(0,0,0,.12)}:host .sidenav.collapsable ::ng-deep .mat-drawer-inner-container::-webkit-scrollbar{display:none}\n"] }]
867
920
  }], ctorParameters: function () { return [{ type: LayoutComponentService }, { type: undefined, decorators: [{
868
921
  type: Inject,
869
922
  args: [RXAP_ENVIRONMENT]
870
- }] }]; }, propDecorators: { sidenav: [{
923
+ }] }, { type: i2$6.IconLoaderService }]; }, propDecorators: { sidenav: [{
871
924
  type: ViewChild,
872
925
  args: [MatSidenav, { static: true }]
873
926
  }] } });
@@ -925,16 +978,14 @@ class SidenavComponent {
925
978
  this.sidenav = sidenav;
926
979
  }
927
980
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponent, deps: [{ token: SidenavComponentService }], target: i0.ɵɵFactoryTarget.Component }); }
928
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SidenavComponent, isStandalone: true, selector: "rxap-sidenav", host: { classAttribute: "rxap-layout-sidenav" }, queries: [{ propertyName: "sidenavFooterDirective", first: true, predicate: SidenavFooterDirective, descendants: true }, { propertyName: "sidenavHeaderDirective", first: true, predicate: SidenavHeaderDirective, descendants: true }], ngImport: i0, template: "<div [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\" class=\"container\">\n <div class=\"inner\"\n fxLayout=\"column\"\n fxLayoutAlign=\"space-between stretch\">\n <ng-template [ngIf]=\"sidenavHeaderDirective?.template\">\n <div [fxHide]=\"sidenav.collapsed$ | async\" class=\"header\" fxFlex=\"nogrow\">\n <ng-container *ngTemplateOutlet=\"sidenavHeaderDirective?.template ?? null\"></ng-container>\n </div>\n <mat-divider [fxHide]=\"sidenav.collapsed$ | async\" fxFlex=\"nogrow\"></mat-divider>\n </ng-template>\n <div class=\"nav-container\" fxFlex=\"grow\">\n <ul fxLayout=\"column\" root rxap-navigation></ul>\n </div>\n <mat-divider fxFlex=\"nogrow\"></mat-divider>\n <button (click)=\"sidenav.toggleNavigationCollapse()\" [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\"\n class=\"sidebar-toggle\"\n fxFlex=\"nogrow\"\n mat-button>\n <span class=\"sidebar-toggle-inner\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"16px\">\n <mat-icon class=\"arrow\" fxFlex=\"nogrow\">double_arrow</mat-icon>\n <span [fxHide]=\"sidenav.collapsed$ | async\" class=\"label\" fxFlex=\"grow\" i18n>Collapse sidebar</span>\n </span>\n </button>\n <ng-template [ngIf]=\"sidenavFooterDirective?.template ?? null\">\n <mat-divider [fxHide]=\"sidenav.collapsed$ | async\" fxFlex=\"nogrow\"></mat-divider>\n <div [fxHide]=\"sidenav.collapsed$ | async\" class=\"footer\" fxFlex=\"nogrow\">\n <ng-container *ngTemplateOutlet=\"sidenavFooterDirective?.template ?? null\"></ng-container>\n </div>\n </ng-template>\n </div>\n</div>\n", styles: [".container,.container .inner{height:100%}.container .inner .header{padding-bottom:12px}.container .inner .footer{padding-top:12px}.container .inner .nav-container{overflow-y:scroll;padding-top:12px}.container .inner .nav-container::-webkit-scrollbar{width:6px}.container .inner .nav-container::-webkit-scrollbar-track{border-radius:2px}.container .inner .nav-container::-webkit-scrollbar-thumb{border-radius:10px}.container .sidebar-toggle{min-height:48px}.container .sidebar-toggle .sidebar-toggle-inner{padding:0}.container .sidebar-toggle .arrow{transform:rotate(180deg)}.container .sidebar-toggle.collapsed .arrow{transform:initial}.container .sidebar-toggle.collapsed .sidebar-toggle-inner{justify-content:space-around!important}\n"], dependencies: [{ kind: "ngmodule", type: ExtendedModule }, { kind: "directive", type: i2$5.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i2$5.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i1$4.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i1$4.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i1$4.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i1$4.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i3$4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: NavigationComponent, selector: "ul[rxap-navigation]", inputs: ["items", "level", "root"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
981
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SidenavComponent, isStandalone: true, selector: "rxap-sidenav", host: { classAttribute: "rxap-layout-sidenav" }, queries: [{ propertyName: "sidenavFooterDirective", first: true, predicate: SidenavFooterDirective, descendants: true }, { propertyName: "sidenavHeaderDirective", first: true, predicate: SidenavHeaderDirective, descendants: true }], ngImport: i0, template: "<div [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\" class=\"rxap-container\">\n <div class=\"inner flex flex-col justify-between items-stretch\">\n <ng-template [ngIf]=\"sidenavHeaderDirective?.template\">\n <div [ngClass]=\"{ hide: sidenav.collapsed$ | async }\" class=\"header grow-0\">\n <ng-container *ngTemplateOutlet=\"sidenavHeaderDirective?.template ?? null\"></ng-container>\n </div>\n <mat-divider [ngClass]=\"{ hide: sidenav.collapsed$ | async }\" class=\"grow-0\"></mat-divider>\n </ng-template>\n <div class=\"nav-container grow\">\n <ul class=\"flex flex-col\" root rxap-navigation></ul>\n </div>\n <mat-divider class=\"grow-0\"></mat-divider>\n <button (click)=\"sidenav.toggleNavigationCollapse()\" [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\"\n class=\"sidebar-toggle grow-0\"\n mat-button>\n <span class=\"sidebar-toggle-inner flex flex-row items-center gap-4\">\n <mat-icon class=\"arrow grow-0\">double_arrow</mat-icon>\n <span [ngClass]=\"{ hide: sidenav.collapsed$ | async }\" class=\"label grow-0\" i18n>Collapse sidebar</span>\n </span>\n </button>\n <ng-template [ngIf]=\"sidenavFooterDirective?.template ?? null\">\n <mat-divider [ngClass]=\"{ hide: sidenav.collapsed$ | async }\" class=\"grow-0\"></mat-divider>\n <div [ngClass]=\"{ hide: sidenav.collapsed$ | async }\" class=\"footer grow-0\">\n <ng-container *ngTemplateOutlet=\"sidenavFooterDirective?.template ?? null\"></ng-container>\n </div>\n </ng-template>\n </div>\n</div>\n", styles: [".rxap-container,.rxap-container .inner{height:100%}.rxap-container .inner .header{padding-bottom:12px}.rxap-container .inner .footer{padding-top:12px}.rxap-container .inner .nav-container{overflow-y:scroll;padding-top:12px}.rxap-container .inner .nav-container::-webkit-scrollbar{width:6px}.rxap-container .inner .nav-container::-webkit-scrollbar-track{border-radius:2px}.rxap-container .inner .nav-container::-webkit-scrollbar-thumb{border-radius:10px}.rxap-container .sidebar-toggle{min-height:48px}.rxap-container .sidebar-toggle .sidebar-toggle-inner{padding:0}.rxap-container .sidebar-toggle .arrow{transform:rotate(180deg)}.rxap-container .sidebar-toggle.collapsed .arrow{transform:initial}.rxap-container .sidebar-toggle.collapsed .sidebar-toggle-inner{justify-content:space-around!important}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i3$4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: NavigationComponent, selector: "ul[rxap-navigation]", inputs: ["items", "level", "root"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
929
982
  }
930
983
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponent, decorators: [{
931
984
  type: Component,
932
985
  args: [{ selector: 'rxap-sidenav', changeDetection: ChangeDetectionStrategy.OnPush, host: {
933
986
  class: 'rxap-layout-sidenav',
934
987
  }, standalone: true, imports: [
935
- ExtendedModule,
936
988
  NgClass,
937
- FlexModule,
938
989
  NgIf,
939
990
  NgTemplateOutlet,
940
991
  MatDividerModule,
@@ -942,7 +993,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
942
993
  MatButtonModule,
943
994
  MatIconModule,
944
995
  AsyncPipe,
945
- ], template: "<div [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\" class=\"container\">\n <div class=\"inner\"\n fxLayout=\"column\"\n fxLayoutAlign=\"space-between stretch\">\n <ng-template [ngIf]=\"sidenavHeaderDirective?.template\">\n <div [fxHide]=\"sidenav.collapsed$ | async\" class=\"header\" fxFlex=\"nogrow\">\n <ng-container *ngTemplateOutlet=\"sidenavHeaderDirective?.template ?? null\"></ng-container>\n </div>\n <mat-divider [fxHide]=\"sidenav.collapsed$ | async\" fxFlex=\"nogrow\"></mat-divider>\n </ng-template>\n <div class=\"nav-container\" fxFlex=\"grow\">\n <ul fxLayout=\"column\" root rxap-navigation></ul>\n </div>\n <mat-divider fxFlex=\"nogrow\"></mat-divider>\n <button (click)=\"sidenav.toggleNavigationCollapse()\" [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\"\n class=\"sidebar-toggle\"\n fxFlex=\"nogrow\"\n mat-button>\n <span class=\"sidebar-toggle-inner\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"16px\">\n <mat-icon class=\"arrow\" fxFlex=\"nogrow\">double_arrow</mat-icon>\n <span [fxHide]=\"sidenav.collapsed$ | async\" class=\"label\" fxFlex=\"grow\" i18n>Collapse sidebar</span>\n </span>\n </button>\n <ng-template [ngIf]=\"sidenavFooterDirective?.template ?? null\">\n <mat-divider [fxHide]=\"sidenav.collapsed$ | async\" fxFlex=\"nogrow\"></mat-divider>\n <div [fxHide]=\"sidenav.collapsed$ | async\" class=\"footer\" fxFlex=\"nogrow\">\n <ng-container *ngTemplateOutlet=\"sidenavFooterDirective?.template ?? null\"></ng-container>\n </div>\n </ng-template>\n </div>\n</div>\n", styles: [".container,.container .inner{height:100%}.container .inner .header{padding-bottom:12px}.container .inner .footer{padding-top:12px}.container .inner .nav-container{overflow-y:scroll;padding-top:12px}.container .inner .nav-container::-webkit-scrollbar{width:6px}.container .inner .nav-container::-webkit-scrollbar-track{border-radius:2px}.container .inner .nav-container::-webkit-scrollbar-thumb{border-radius:10px}.container .sidebar-toggle{min-height:48px}.container .sidebar-toggle .sidebar-toggle-inner{padding:0}.container .sidebar-toggle .arrow{transform:rotate(180deg)}.container .sidebar-toggle.collapsed .arrow{transform:initial}.container .sidebar-toggle.collapsed .sidebar-toggle-inner{justify-content:space-around!important}\n"] }]
996
+ ], template: "<div [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\" class=\"rxap-container\">\n <div class=\"inner flex flex-col justify-between items-stretch\">\n <ng-template [ngIf]=\"sidenavHeaderDirective?.template\">\n <div [ngClass]=\"{ hide: sidenav.collapsed$ | async }\" class=\"header grow-0\">\n <ng-container *ngTemplateOutlet=\"sidenavHeaderDirective?.template ?? null\"></ng-container>\n </div>\n <mat-divider [ngClass]=\"{ hide: sidenav.collapsed$ | async }\" class=\"grow-0\"></mat-divider>\n </ng-template>\n <div class=\"nav-container grow\">\n <ul class=\"flex flex-col\" root rxap-navigation></ul>\n </div>\n <mat-divider class=\"grow-0\"></mat-divider>\n <button (click)=\"sidenav.toggleNavigationCollapse()\" [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\"\n class=\"sidebar-toggle grow-0\"\n mat-button>\n <span class=\"sidebar-toggle-inner flex flex-row items-center gap-4\">\n <mat-icon class=\"arrow grow-0\">double_arrow</mat-icon>\n <span [ngClass]=\"{ hide: sidenav.collapsed$ | async }\" class=\"label grow-0\" i18n>Collapse sidebar</span>\n </span>\n </button>\n <ng-template [ngIf]=\"sidenavFooterDirective?.template ?? null\">\n <mat-divider [ngClass]=\"{ hide: sidenav.collapsed$ | async }\" class=\"grow-0\"></mat-divider>\n <div [ngClass]=\"{ hide: sidenav.collapsed$ | async }\" class=\"footer grow-0\">\n <ng-container *ngTemplateOutlet=\"sidenavFooterDirective?.template ?? null\"></ng-container>\n </div>\n </ng-template>\n </div>\n</div>\n", styles: [".rxap-container,.rxap-container .inner{height:100%}.rxap-container .inner .header{padding-bottom:12px}.rxap-container .inner .footer{padding-top:12px}.rxap-container .inner .nav-container{overflow-y:scroll;padding-top:12px}.rxap-container .inner .nav-container::-webkit-scrollbar{width:6px}.rxap-container .inner .nav-container::-webkit-scrollbar-track{border-radius:2px}.rxap-container .inner .nav-container::-webkit-scrollbar-thumb{border-radius:10px}.rxap-container .sidebar-toggle{min-height:48px}.rxap-container .sidebar-toggle .sidebar-toggle-inner{padding:0}.rxap-container .sidebar-toggle .arrow{transform:rotate(180deg)}.rxap-container .sidebar-toggle.collapsed .arrow{transform:initial}.rxap-container .sidebar-toggle.collapsed .sidebar-toggle-inner{justify-content:space-around!important}\n"] }]
946
997
  }], ctorParameters: function () { return [{ type: SidenavComponentService }]; }, propDecorators: { sidenavFooterDirective: [{
947
998
  type: ContentChild,
948
999
  args: [SidenavFooterDirective]
@@ -963,19 +1014,15 @@ class VersionComponent {
963
1014
  this.subscription?.unsubscribe();
964
1015
  }
965
1016
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: VersionComponent, deps: [{ token: VersionService }], target: i0.ɵɵFactoryTarget.Component }); }
966
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: VersionComponent, isStandalone: true, selector: "rxap-version", ngImport: i0, template: "<div class=\"version\" fxFlex=\"nogrow\" fxLayout=\"column\" fxLayoutAlign=\"start start\" fxLayoutGap=\"8px\">\n <div *ngFor=\"let module of modules | keyvalue\" fxFlex=\"nogrow\" fxLayout=\"column\">\n <span class=\"name\" fxFlex=\"nogrow\">{{module.value.name}}</span>\n <span class=\"semantic\" fxFlex=\"nogrow\">{{module.value.semantic}}</span>\n <span class=\"hash\" fxFlex=\"nogrow\">{{module.value.hash}}</span>\n </div>\n</div>\n", styles: [".version{width:100%;font-size:9px;padding:8px}.version .name{padding-bottom:12px;font-size:10px}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i1$4.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i1$4.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i1$4.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i1$4.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1017
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: VersionComponent, isStandalone: true, selector: "rxap-version", ngImport: i0, template: "<div class=\"version flex flex-col gap-2\">\n <div *ngFor=\"let module of modules | keyvalue\" class=\"flex flex-col\">\n <span class=\"name grow-0\">{{module.value.name}}</span>\n <span class=\"semantic grow-0\">{{module.value.semantic}}</span>\n <span class=\"hash grow-0\">{{module.value.hash}}</span>\n </div>\n</div>\n", styles: [".version{width:100%;font-size:9px;padding:8px}.version .name{padding-bottom:12px;font-size:10px}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
967
1018
  }
968
- __decorate([
969
- Required,
970
- __metadata("design:type", Object)
971
- ], VersionComponent.prototype, "modules", void 0);
972
1019
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: VersionComponent, decorators: [{
973
1020
  type: Component,
974
- args: [{ selector: 'rxap-version', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FlexModule, NgFor, KeyValuePipe], template: "<div class=\"version\" fxFlex=\"nogrow\" fxLayout=\"column\" fxLayoutAlign=\"start start\" fxLayoutGap=\"8px\">\n <div *ngFor=\"let module of modules | keyvalue\" fxFlex=\"nogrow\" fxLayout=\"column\">\n <span class=\"name\" fxFlex=\"nogrow\">{{module.value.name}}</span>\n <span class=\"semantic\" fxFlex=\"nogrow\">{{module.value.semantic}}</span>\n <span class=\"hash\" fxFlex=\"nogrow\">{{module.value.hash}}</span>\n </div>\n</div>\n", styles: [".version{width:100%;font-size:9px;padding:8px}.version .name{padding-bottom:12px;font-size:10px}\n"] }]
1021
+ args: [{ selector: 'rxap-version', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgFor, KeyValuePipe], template: "<div class=\"version flex flex-col gap-2\">\n <div *ngFor=\"let module of modules | keyvalue\" class=\"flex flex-col\">\n <span class=\"name grow-0\">{{module.value.name}}</span>\n <span class=\"semantic grow-0\">{{module.value.semantic}}</span>\n <span class=\"hash grow-0\">{{module.value.hash}}</span>\n </div>\n</div>\n", styles: [".version{width:100%;font-size:9px;padding:8px}.version .name{padding-bottom:12px;font-size:10px}\n"] }]
975
1022
  }], ctorParameters: function () { return [{ type: i1.VersionService, decorators: [{
976
1023
  type: Inject,
977
1024
  args: [VersionService]
978
- }] }]; }, propDecorators: { modules: [] } });
1025
+ }] }]; } });
979
1026
 
980
1027
  class ToggleWindowSidenavButtonComponent {
981
1028
  constructor() {
@@ -987,13 +1034,13 @@ class ToggleWindowSidenavButtonComponent {
987
1034
  this.openWindowSidenavChange.emit(this.openWindowSidenav);
988
1035
  }
989
1036
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ToggleWindowSidenavButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
990
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: ToggleWindowSidenavButtonComponent, isStandalone: true, selector: "rxap-toggle-window-sidenav-button", inputs: { openWindowSidenav: "openWindowSidenav" }, outputs: { openWindowSidenavChange: "openWindowSidenavChange" }, host: { classAttribute: "rxap-toggle-window-sidenav-button" }, ngImport: i0, template: "<div class=\"toggle-button\">\n <button (click)=\"toggle()\" mat-icon-button>\n <ng-template [ngIfElse]=\"hide\" [ngIf]=\"!openWindowSidenav\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </ng-template>\n <ng-template #hide>\n <mat-icon>keyboard_arrow_right</mat-icon>\n </ng-template>\n </button>\n</div>\n", styles: [".toggle-button{position:absolute;top:70px;right:0;z-index:10000;border-radius:15px 0 0 15px;border:1px solid black;background:black}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1037
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: ToggleWindowSidenavButtonComponent, isStandalone: true, selector: "rxap-toggle-window-sidenav-button", inputs: { openWindowSidenav: "openWindowSidenav" }, outputs: { openWindowSidenavChange: "openWindowSidenavChange" }, host: { classAttribute: "rxap-toggle-window-sidenav-button" }, ngImport: i0, template: "<div class=\"toggle-button\">\n <button (click)=\"toggle()\" mat-icon-button>\n <ng-template [ngIfElse]=\"hide\" [ngIf]=\"!openWindowSidenav\">\n <mat-icon svgIcon=\"arrow-left-bold\"></mat-icon>\n </ng-template>\n <ng-template #hide>\n <mat-icon svgIcon=\"arrow-right-bold\"></mat-icon>\n </ng-template>\n </button>\n</div>\n", styles: [".toggle-button{position:absolute;top:70px;right:0;z-index:10000;border-radius:15px 0 0 15px;border:1px solid black;background:black}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
991
1038
  }
992
1039
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ToggleWindowSidenavButtonComponent, decorators: [{
993
1040
  type: Component,
994
1041
  args: [{ selector: 'rxap-toggle-window-sidenav-button', changeDetection: ChangeDetectionStrategy.OnPush, host: {
995
1042
  class: 'rxap-toggle-window-sidenav-button',
996
- }, standalone: true, imports: [MatButtonModule, NgIf, MatIconModule], template: "<div class=\"toggle-button\">\n <button (click)=\"toggle()\" mat-icon-button>\n <ng-template [ngIfElse]=\"hide\" [ngIf]=\"!openWindowSidenav\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </ng-template>\n <ng-template #hide>\n <mat-icon>keyboard_arrow_right</mat-icon>\n </ng-template>\n </button>\n</div>\n", styles: [".toggle-button{position:absolute;top:70px;right:0;z-index:10000;border-radius:15px 0 0 15px;border:1px solid black;background:black}\n"] }]
1043
+ }, standalone: true, imports: [MatButtonModule, NgIf, MatIconModule], template: "<div class=\"toggle-button\">\n <button (click)=\"toggle()\" mat-icon-button>\n <ng-template [ngIfElse]=\"hide\" [ngIf]=\"!openWindowSidenav\">\n <mat-icon svgIcon=\"arrow-left-bold\"></mat-icon>\n </ng-template>\n <ng-template #hide>\n <mat-icon svgIcon=\"arrow-right-bold\"></mat-icon>\n </ng-template>\n </button>\n</div>\n", styles: [".toggle-button{position:absolute;top:70px;right:0;z-index:10000;border-radius:15px 0 0 15px;border:1px solid black;background:black}\n"] }]
997
1044
  }], propDecorators: { openWindowSidenav: [{
998
1045
  type: Input
999
1046
  }], openWindowSidenavChange: [{
@@ -1035,11 +1082,11 @@ class WindowContainerSidenavComponent {
1035
1082
  }
1036
1083
  }
1037
1084
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: WindowContainerSidenavComponent, deps: [{ token: WindowContainerSidenavService }], target: i0.ɵɵFactoryTarget.Component }); }
1038
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: WindowContainerSidenavComponent, isStandalone: true, selector: "rxap-window-container-sidenav", ngImport: i0, template: "<div class=\"container\" fxLayout=\"column\" fxLayoutGap=\"16px\">\n\n <div *ngFor=\"let portalId of portals.keys(); trackBy: trackBy\" fxFlex=\"nogrow\">\n <ng-template [cdkPortalOutlet]=\"portals.get(portalId)\"></ng-template>\n </div>\n\n</div>\n", styles: [".container{padding:8px}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i1$4.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i1$4.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i1$4.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1085
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: WindowContainerSidenavComponent, isStandalone: true, selector: "rxap-window-container-sidenav", ngImport: i0, template: "<div class=\"flex flex-col gap-4 p-2\">\n\n <div *ngFor=\"let portalId of portals.keys(); trackBy: trackBy\" class=\"grow-0\">\n <ng-template [cdkPortalOutlet]=\"portals.get(portalId)\"></ng-template>\n </div>\n\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1039
1086
  }
1040
1087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: WindowContainerSidenavComponent, decorators: [{
1041
1088
  type: Component,
1042
- args: [{ selector: 'rxap-window-container-sidenav', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FlexModule, NgFor, PortalModule], template: "<div class=\"container\" fxLayout=\"column\" fxLayoutGap=\"16px\">\n\n <div *ngFor=\"let portalId of portals.keys(); trackBy: trackBy\" fxFlex=\"nogrow\">\n <ng-template [cdkPortalOutlet]=\"portals.get(portalId)\"></ng-template>\n </div>\n\n</div>\n", styles: [".container{padding:8px}\n"] }]
1089
+ args: [{ selector: 'rxap-window-container-sidenav', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgFor, PortalModule], template: "<div class=\"flex flex-col gap-4 p-2\">\n\n <div *ngFor=\"let portalId of portals.keys(); trackBy: trackBy\" class=\"grow-0\">\n <ng-template [cdkPortalOutlet]=\"portals.get(portalId)\"></ng-template>\n </div>\n\n</div>\n" }]
1043
1090
  }], ctorParameters: function () { return [{ type: i1.WindowContainerSidenavService, decorators: [{
1044
1091
  type: Inject,
1045
1092
  args: [WindowContainerSidenavService]
@@ -1080,35 +1127,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
1080
1127
  args: [ViewContainerRef]
1081
1128
  }] }]; } });
1082
1129
 
1083
- class I18nCheckGuard {
1084
- constructor(config, localId, i18nService, userProfileService) {
1085
- this.config = config;
1086
- this.localId = localId;
1087
- this.i18nService = i18nService;
1088
- this.userProfileService = userProfileService;
1089
- }
1090
- async canActivate() {
1091
- const selectedLanguage = (await this.userProfileService.getLanguage()) ?? 'en';
1092
- if (this.i18nService.currentLanguage !== selectedLanguage) {
1093
- await this.i18nService.redirect(selectedLanguage);
1094
- return false;
1095
- }
1096
- return true;
1097
- }
1098
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nCheckGuard, deps: [{ token: i1$2.ConfigService }, { token: LOCALE_ID }, { token: I18nService }, { token: i1$1.RxapUserProfileService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1099
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nCheckGuard, providedIn: 'root' }); }
1100
- }
1101
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nCheckGuard, decorators: [{
1102
- type: Injectable,
1103
- args: [{ providedIn: 'root' }]
1104
- }], ctorParameters: function () { return [{ type: i1$2.ConfigService }, { type: undefined, decorators: [{
1105
- type: Inject,
1106
- args: [LOCALE_ID]
1107
- }] }, { type: I18nService }, { type: i1$1.RxapUserProfileService }]; } });
1108
-
1109
1130
  /**
1110
1131
  * Generated bundle index. Do not edit.
1111
1132
  */
1112
1133
 
1113
- export { AppUrlService, AppsButtonComponent, FooterComponent, FooterDirective, HeaderComponent, I18nCheckGuard, I18nService, IsNavigationDividerItem, IsNavigationInsertItem, IsNavigationItem, LanguageSelectorService, LayoutComponent, LayoutComponentService, NavigationComponent, NavigationItemComponent, NavigationProgressBarComponent, NavigationService, RXAP_FOOTER_COMPONENT, RXAP_HEADER_COMPONENT, RXAP_LAYOUT_APPS_GRID, RXAP_LOGO_CONFIG, RXAP_NAVIGATION_CONFIG, RXAP_NAVIGATION_CONFIG_INSERTS, ReplaceRouterPathsService, ResetButtonComponent, SidenavComponent, SidenavComponentService, SidenavFooterDirective, SidenavHeaderDirective, SidenavToggleButtonComponent, SignOutComponent, ToggleWindowSidenavButtonComponent, UserProfileIconComponent, VersionComponent, WindowContainerSidenavComponent };
1134
+ export { AppUrlService, AppsButtonComponent, EXTRACT_USERNAME_FROM_PROFILE, FooterComponent, FooterDirective, HeaderComponent, IsNavigationDividerItem, IsNavigationInsertItem, IsNavigationItem, LayoutComponent, LayoutComponentService, NavigationComponent, NavigationItemComponent, NavigationProgressBarComponent, NavigationService, RXAP_FOOTER_COMPONENT, RXAP_HEADER_COMPONENT, RXAP_LAYOUT_APPS_GRID, RXAP_LOGO_CONFIG, RXAP_NAVIGATION_CONFIG, RXAP_NAVIGATION_CONFIG_INSERTS, ReplaceRouterPathsService, ResetButtonComponent, SidenavComponent, SidenavComponentService, SidenavFooterDirective, SidenavHeaderDirective, SidenavToggleButtonComponent, SignOutComponent, ToggleWindowSidenavButtonComponent, UserProfileIconComponent, VersionComponent, WindowContainerSidenavComponent };
1114
1135
  //# sourceMappingURL=rxap-layout.mjs.map