@flusys/ng-layout 5.0.3 → 5.0.4
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.
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, PLATFORM_ID, Injectable, DOCUMENT, signal, computed, effect, Component, afterNextRender, InjectionToken, input, DestroyRef, viewChild, ElementRef, Renderer2 } from '@angular/core';
|
|
3
3
|
import * as i2$3 from '@flusys/ng-shared';
|
|
4
|
-
import { evaluateLogicNode, PermissionValidatorService, TranslatePipe, IconComponent, AngularModule, PrimeModule } from '@flusys/ng-shared';
|
|
4
|
+
import { evaluateLogicNode, TranslateService, PermissionValidatorService, TranslatePipe, IconComponent, AngularModule, PrimeModule } from '@flusys/ng-shared';
|
|
5
5
|
import { isPlatformBrowser, NgComponentOutlet, DOCUMENT as DOCUMENT$1, NgClass } from '@angular/common';
|
|
6
|
-
import { APP_CONFIG,
|
|
6
|
+
import { APP_CONFIG, DEFAULT_APP_NAME, DEFAULT_AUTHOR, isCompanyFeatureEnabled, isSignUpEnabled } from '@flusys/ng-core';
|
|
7
7
|
import { Subject, fromEvent, filter as filter$1 } from 'rxjs';
|
|
8
8
|
import * as i1 from '@angular/forms';
|
|
9
9
|
import { FormsModule } from '@angular/forms';
|
|
@@ -212,7 +212,9 @@ class LayoutService {
|
|
|
212
212
|
isBrowser = isPlatformBrowser(this.platformId);
|
|
213
213
|
persistence = inject(LayoutPersistenceService);
|
|
214
214
|
appConfig = inject(APP_CONFIG, { optional: true });
|
|
215
|
-
translateAdapter = inject(
|
|
215
|
+
translateAdapter = inject(TranslateService, {
|
|
216
|
+
optional: true,
|
|
217
|
+
});
|
|
216
218
|
DEFAULT_CONFIG = {
|
|
217
219
|
preset: 'Aura',
|
|
218
220
|
primary: 'emerald',
|
|
@@ -262,7 +264,9 @@ class LayoutService {
|
|
|
262
264
|
isOverlay = computed(() => this._layoutConfig().menuMode === 'overlay', ...(ngDevMode ? [{ debugName: "isOverlay" }] : []));
|
|
263
265
|
isTopbar = computed(() => this._layoutConfig().menuMode === 'topbar', ...(ngDevMode ? [{ debugName: "isTopbar" }] : []));
|
|
264
266
|
// User profile computed signals
|
|
265
|
-
userName = computed(() => this._userProfile()?.name ??
|
|
267
|
+
userName = computed(() => this._userProfile()?.name ??
|
|
268
|
+
this.translateAdapter?.translate('layout.profile.guest') ??
|
|
269
|
+
'Guest', ...(ngDevMode ? [{ debugName: "userName" }] : []));
|
|
266
270
|
userEmail = computed(() => this._userProfile()?.email ?? '', ...(ngDevMode ? [{ debugName: "userEmail" }] : []));
|
|
267
271
|
userProfilePictureUrl = computed(() => this._userProfile()?.profilePictureUrl ?? null, ...(ngDevMode ? [{ debugName: "userProfilePictureUrl" }] : []));
|
|
268
272
|
companyLogoUrl = computed(() => this._companyProfile()?.logoUrl ?? null, ...(ngDevMode ? [{ debugName: "companyLogoUrl" }] : []));
|
|
@@ -300,7 +304,8 @@ class LayoutService {
|
|
|
300
304
|
}
|
|
301
305
|
handleDarkModeTransition(config) {
|
|
302
306
|
const doc = this.document;
|
|
303
|
-
if ('startViewTransition' in doc &&
|
|
307
|
+
if ('startViewTransition' in doc &&
|
|
308
|
+
typeof doc.startViewTransition === 'function') {
|
|
304
309
|
doc
|
|
305
310
|
.startViewTransition(() => this.toggleDarkMode(config))
|
|
306
311
|
.ready.then(() => this.onTransitionEnd())
|
|
@@ -328,7 +333,10 @@ class LayoutService {
|
|
|
328
333
|
// Mobile always uses staticMenuMobileActive regardless of menu mode
|
|
329
334
|
if (!this.isDesktop()) {
|
|
330
335
|
const newMobileActive = !state.staticMenuMobileActive;
|
|
331
|
-
this._layoutState.update((prev) => ({
|
|
336
|
+
this._layoutState.update((prev) => ({
|
|
337
|
+
...prev,
|
|
338
|
+
staticMenuMobileActive: newMobileActive,
|
|
339
|
+
}));
|
|
332
340
|
if (newMobileActive)
|
|
333
341
|
this.overlayOpen.next();
|
|
334
342
|
return;
|
|
@@ -336,7 +344,10 @@ class LayoutService {
|
|
|
336
344
|
// Desktop: use overlay or static mode
|
|
337
345
|
if (this.isOverlay()) {
|
|
338
346
|
const newOverlayActive = !state.overlayMenuActive;
|
|
339
|
-
this._layoutState.update((prev) => ({
|
|
347
|
+
this._layoutState.update((prev) => ({
|
|
348
|
+
...prev,
|
|
349
|
+
overlayMenuActive: newOverlayActive,
|
|
350
|
+
}));
|
|
340
351
|
if (newOverlayActive)
|
|
341
352
|
this.overlayOpen.next();
|
|
342
353
|
}
|
|
@@ -447,18 +458,29 @@ const presets = {
|
|
|
447
458
|
};
|
|
448
459
|
class AppConfigurator {
|
|
449
460
|
router = inject(Router);
|
|
450
|
-
translateAdapter = inject(
|
|
461
|
+
translateAdapter = inject(TranslateService, {
|
|
462
|
+
optional: true,
|
|
463
|
+
});
|
|
451
464
|
layoutService = inject(LayoutService);
|
|
452
465
|
presets = Object.keys(presets);
|
|
453
466
|
showMenuModeButton = signal(!this.router.url.includes('auth'), ...(ngDevMode ? [{ debugName: "showMenuModeButton" }] : []));
|
|
454
467
|
menuModeOptions = computed(() => {
|
|
455
468
|
const options = [
|
|
456
|
-
{
|
|
457
|
-
|
|
469
|
+
{
|
|
470
|
+
label: this.translate('layout.configurator.menu.mode.static'),
|
|
471
|
+
value: 'static',
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
label: this.translate('layout.configurator.menu.mode.overlay'),
|
|
475
|
+
value: 'overlay',
|
|
476
|
+
},
|
|
458
477
|
];
|
|
459
478
|
// Only show topbar mode on desktop
|
|
460
479
|
if (this.layoutService.isDesktop()) {
|
|
461
|
-
options.push({
|
|
480
|
+
options.push({
|
|
481
|
+
label: this.translate('layout.configurator.menu.mode.topbar'),
|
|
482
|
+
value: 'topbar',
|
|
483
|
+
});
|
|
462
484
|
}
|
|
463
485
|
return options;
|
|
464
486
|
}, ...(ngDevMode ? [{ debugName: "menuModeOptions" }] : []));
|
|
@@ -804,7 +826,9 @@ class AppConfigurator {
|
|
|
804
826
|
const preset = presets[event];
|
|
805
827
|
// Use selected surface or default (slate for light, zinc for dark)
|
|
806
828
|
const selectedSurface = this.selectedSurfaceColor();
|
|
807
|
-
const defaultSurface = this.layoutService.layoutConfig().darkTheme
|
|
829
|
+
const defaultSurface = this.layoutService.layoutConfig().darkTheme
|
|
830
|
+
? 'zinc'
|
|
831
|
+
: 'slate';
|
|
808
832
|
const surfacePalette = this.surfaces.find((s) => s.name === (selectedSurface || defaultSurface))?.palette;
|
|
809
833
|
$t()
|
|
810
834
|
.preset(preset)
|
|
@@ -822,22 +846,32 @@ class AppConfigurator {
|
|
|
822
846
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: AppConfigurator, isStandalone: true, selector: "app-configurator", host: { styleAttribute: "background-color: var(--surface-overlay); inset-inline-end: 0;", classAttribute: "hidden absolute top-[3.25rem] w-[calc(100vw-2rem)] sm:w-72 max-w-72 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]" }, ngImport: i0, template: `
|
|
823
847
|
<div class="flex flex-col gap-4">
|
|
824
848
|
<div>
|
|
825
|
-
<span class="text-sm text-muted-color font-semibold">{{
|
|
849
|
+
<span class="text-sm text-muted-color font-semibold">{{
|
|
850
|
+
'layout.configurator.primary' | translate
|
|
851
|
+
}}</span>
|
|
826
852
|
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
827
853
|
@for (primaryColor of primaryColors(); track primaryColor.name) {
|
|
828
854
|
<button
|
|
829
855
|
type="button"
|
|
830
856
|
[title]="primaryColor.name"
|
|
831
857
|
(click)="updateColors($event, 'primary', primaryColor)"
|
|
832
|
-
[class.outline-primary]="
|
|
858
|
+
[class.outline-primary]="
|
|
859
|
+
primaryColor.name === selectedPrimaryColor()
|
|
860
|
+
"
|
|
833
861
|
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
834
|
-
[style.background-color]="
|
|
862
|
+
[style.background-color]="
|
|
863
|
+
primaryColor?.name === 'noir'
|
|
864
|
+
? 'var(--text-color)'
|
|
865
|
+
: primaryColor?.palette?.['500']
|
|
866
|
+
"
|
|
835
867
|
></button>
|
|
836
868
|
}
|
|
837
869
|
</div>
|
|
838
870
|
</div>
|
|
839
871
|
<div>
|
|
840
|
-
<span class="text-sm text-muted-color font-semibold">{{
|
|
872
|
+
<span class="text-sm text-muted-color font-semibold">{{
|
|
873
|
+
'layout.configurator.surface' | translate
|
|
874
|
+
}}</span>
|
|
841
875
|
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
842
876
|
@for (surface of surfaces; track surface.name) {
|
|
843
877
|
<button
|
|
@@ -846,35 +880,43 @@ class AppConfigurator {
|
|
|
846
880
|
(click)="updateColors($event, 'surface', surface)"
|
|
847
881
|
[class.outline-primary]="isSurfaceSelected(surface.name)"
|
|
848
882
|
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
849
|
-
[style.background-color]="
|
|
883
|
+
[style.background-color]="
|
|
884
|
+
surface?.name === 'noir'
|
|
885
|
+
? 'var(--text-color)'
|
|
886
|
+
: surface?.palette?.['500']
|
|
887
|
+
"
|
|
850
888
|
></button>
|
|
851
889
|
}
|
|
852
890
|
</div>
|
|
853
891
|
</div>
|
|
854
892
|
<div class="flex flex-col gap-2">
|
|
855
|
-
<span class="text-sm text-muted-color font-semibold">{{
|
|
893
|
+
<span class="text-sm text-muted-color font-semibold">{{
|
|
894
|
+
'layout.configurator.presets' | translate
|
|
895
|
+
}}</span>
|
|
856
896
|
<p-selectbutton
|
|
857
897
|
[options]="presets"
|
|
858
898
|
[ngModel]="selectedPreset()"
|
|
859
899
|
(ngModelChange)="onPresetChange($event)"
|
|
860
900
|
[allowEmpty]="false"
|
|
861
901
|
size="small"
|
|
862
|
-
|
|
902
|
+
/>
|
|
863
903
|
</div>
|
|
864
904
|
@if (showMenuModeButton()) {
|
|
865
905
|
<div class="flex flex-col gap-2">
|
|
866
|
-
<span class="text-sm text-muted-color font-semibold">{{
|
|
906
|
+
<span class="text-sm text-muted-color font-semibold">{{
|
|
907
|
+
'layout.configurator.menu.mode' | translate
|
|
908
|
+
}}</span>
|
|
867
909
|
<p-selectbutton
|
|
868
910
|
[ngModel]="menuMode()"
|
|
869
911
|
(ngModelChange)="onMenuModeChange($event)"
|
|
870
912
|
[options]="menuModeOptions()"
|
|
871
913
|
[allowEmpty]="false"
|
|
872
914
|
size="small"
|
|
873
|
-
|
|
915
|
+
/>
|
|
874
916
|
</div>
|
|
875
917
|
}
|
|
876
918
|
</div>
|
|
877
|
-
|
|
919
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i2.SelectButton, selector: "p-selectButton, p-selectbutton, p-select-button", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "styleClass", "ariaLabelledBy", "dataKey", "autofocus", "size", "fluid"], outputs: ["onOptionClick", "onChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
878
920
|
}
|
|
879
921
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppConfigurator, decorators: [{
|
|
880
922
|
type: Component,
|
|
@@ -884,22 +926,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
884
926
|
template: `
|
|
885
927
|
<div class="flex flex-col gap-4">
|
|
886
928
|
<div>
|
|
887
|
-
<span class="text-sm text-muted-color font-semibold">{{
|
|
929
|
+
<span class="text-sm text-muted-color font-semibold">{{
|
|
930
|
+
'layout.configurator.primary' | translate
|
|
931
|
+
}}</span>
|
|
888
932
|
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
889
933
|
@for (primaryColor of primaryColors(); track primaryColor.name) {
|
|
890
934
|
<button
|
|
891
935
|
type="button"
|
|
892
936
|
[title]="primaryColor.name"
|
|
893
937
|
(click)="updateColors($event, 'primary', primaryColor)"
|
|
894
|
-
[class.outline-primary]="
|
|
938
|
+
[class.outline-primary]="
|
|
939
|
+
primaryColor.name === selectedPrimaryColor()
|
|
940
|
+
"
|
|
895
941
|
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
896
|
-
[style.background-color]="
|
|
942
|
+
[style.background-color]="
|
|
943
|
+
primaryColor?.name === 'noir'
|
|
944
|
+
? 'var(--text-color)'
|
|
945
|
+
: primaryColor?.palette?.['500']
|
|
946
|
+
"
|
|
897
947
|
></button>
|
|
898
948
|
}
|
|
899
949
|
</div>
|
|
900
950
|
</div>
|
|
901
951
|
<div>
|
|
902
|
-
<span class="text-sm text-muted-color font-semibold">{{
|
|
952
|
+
<span class="text-sm text-muted-color font-semibold">{{
|
|
953
|
+
'layout.configurator.surface' | translate
|
|
954
|
+
}}</span>
|
|
903
955
|
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
904
956
|
@for (surface of surfaces; track surface.name) {
|
|
905
957
|
<button
|
|
@@ -908,35 +960,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
908
960
|
(click)="updateColors($event, 'surface', surface)"
|
|
909
961
|
[class.outline-primary]="isSurfaceSelected(surface.name)"
|
|
910
962
|
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
911
|
-
[style.background-color]="
|
|
963
|
+
[style.background-color]="
|
|
964
|
+
surface?.name === 'noir'
|
|
965
|
+
? 'var(--text-color)'
|
|
966
|
+
: surface?.palette?.['500']
|
|
967
|
+
"
|
|
912
968
|
></button>
|
|
913
969
|
}
|
|
914
970
|
</div>
|
|
915
971
|
</div>
|
|
916
972
|
<div class="flex flex-col gap-2">
|
|
917
|
-
<span class="text-sm text-muted-color font-semibold">{{
|
|
973
|
+
<span class="text-sm text-muted-color font-semibold">{{
|
|
974
|
+
'layout.configurator.presets' | translate
|
|
975
|
+
}}</span>
|
|
918
976
|
<p-selectbutton
|
|
919
977
|
[options]="presets"
|
|
920
978
|
[ngModel]="selectedPreset()"
|
|
921
979
|
(ngModelChange)="onPresetChange($event)"
|
|
922
980
|
[allowEmpty]="false"
|
|
923
981
|
size="small"
|
|
924
|
-
|
|
982
|
+
/>
|
|
925
983
|
</div>
|
|
926
984
|
@if (showMenuModeButton()) {
|
|
927
985
|
<div class="flex flex-col gap-2">
|
|
928
|
-
<span class="text-sm text-muted-color font-semibold">{{
|
|
986
|
+
<span class="text-sm text-muted-color font-semibold">{{
|
|
987
|
+
'layout.configurator.menu.mode' | translate
|
|
988
|
+
}}</span>
|
|
929
989
|
<p-selectbutton
|
|
930
990
|
[ngModel]="menuMode()"
|
|
931
991
|
(ngModelChange)="onMenuModeChange($event)"
|
|
932
992
|
[options]="menuModeOptions()"
|
|
933
993
|
[allowEmpty]="false"
|
|
934
994
|
size="small"
|
|
935
|
-
|
|
995
|
+
/>
|
|
936
996
|
</div>
|
|
937
997
|
}
|
|
938
998
|
</div>
|
|
939
|
-
|
|
999
|
+
`,
|
|
940
1000
|
host: {
|
|
941
1001
|
class: 'hidden absolute top-[3.25rem] w-[calc(100vw-2rem)] sm:w-72 max-w-72 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]',
|
|
942
1002
|
style: 'background-color: var(--surface-overlay); inset-inline-end: 0;',
|
|
@@ -1386,7 +1446,7 @@ class AppCompanyBranchSelector {
|
|
|
1386
1446
|
authState = inject(LAYOUT_AUTH_STATE, { optional: true });
|
|
1387
1447
|
authApi = inject(LAYOUT_AUTH_API, { optional: true });
|
|
1388
1448
|
messageService = inject(MessageService);
|
|
1389
|
-
translateAdapter = inject(
|
|
1449
|
+
translateAdapter = inject(TranslateService, {
|
|
1390
1450
|
optional: true,
|
|
1391
1451
|
});
|
|
1392
1452
|
document = inject(DOCUMENT$1);
|
|
@@ -1836,7 +1896,7 @@ class AppProfile {
|
|
|
1836
1896
|
authApi = inject(LAYOUT_AUTH_API, { optional: true });
|
|
1837
1897
|
layoutService = inject(LayoutService);
|
|
1838
1898
|
messageService = inject(MessageService);
|
|
1839
|
-
translateAdapter = inject(
|
|
1899
|
+
translateAdapter = inject(TranslateService, {
|
|
1840
1900
|
optional: true,
|
|
1841
1901
|
});
|
|
1842
1902
|
appConfig = inject(APP_CONFIG, { optional: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-layout.mjs","sources":["../../../projects/ng-layout/utils/apps-filter.util.ts","../../../projects/ng-layout/utils/menu-filter.util.ts","../../../projects/ng-layout/services/layout-persistence.service.ts","../../../projects/ng-layout/services/layout.service.ts","../../../projects/ng-layout/components/app.footer.ts","../../../projects/ng-layout/components/app.configurator.ts","../../../projects/ng-layout/interfaces/layout-auth.interface.ts","../../../projects/ng-layout/components/app.floatingconfigurator.ts","../../../projects/ng-layout/components/app.menuitem.ts","../../../projects/ng-layout/components/app.menu.ts","../../../projects/ng-layout/interfaces/view-transitions.ts","../../../projects/ng-layout/components/top-bar/app.company-branch-selector.ts","../../../projects/ng-layout/components/top-bar/app.launcher.ts","../../../projects/ng-layout/components/top-bar/app.profile.ts","../../../projects/ng-layout/components/top-bar/app.searchbar.ts","../../../projects/ng-layout/components/app.topbar.ts","../../../projects/ng-layout/components/app.sidebar.ts","../../../projects/ng-layout/components/app.layout.ts","../../../projects/ng-layout/theme/navy-blue-theme.ts","../../../projects/ng-layout/theme/green-theme.ts","../../../projects/ng-layout/constants/messages.ts","../../../projects/ng-layout/public-api.ts","../../../projects/ng-layout/flusys-ng-layout.ts"],"sourcesContent":["import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { ILauncherApp } from '../interfaces/layout-auth.interface';\n\n/** Filter launcher apps based on user permission codes */\nexport function filterAppsByPermissions(\n apps: ILauncherApp[],\n permissionCodes: string[],\n): ILauncherApp[] {\n return apps.filter(\n (app) =>\n !app.permissionLogic ||\n evaluateLogicNode(app.permissionLogic, permissionCodes),\n );\n}\n","import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { IMenuItem } from '../interfaces/layout-auth.interface';\n\n/**\n * Filter menu items based on permission and role checker\n *\n * @param items - Array of menu items to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role (optional, defaults to always false)\n * @returns Filtered menu items array\n *\n * @example\n * ```typescript\n * const filteredMenu = filterMenuByPermissions(\n * menuItems,\n * (actionCode) => permissionState.hasAction(actionCode)\n * );\n * ```\n */\nexport function filterMenuByPermissions(\n items: IMenuItem[],\n permissionCode: string[],\n): IMenuItem[] {\n return items\n .map((item) => filterMenuItem(item, permissionCode))\n .filter((item): item is IMenuItem => item !== null);\n}\n\n/**\n * Filter a single menu item and its children recursively\n *\n * @param item - Menu item to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role\n * @returns Filtered menu item or null if user doesn't have permission\n */\nfunction filterMenuItem(\n item: IMenuItem,\n permissionCode: string[],\n): IMenuItem | null {\n // Skip separators - they have no permission checks\n if (item.separator) {\n return item;\n }\n\n // Check permission logic tree\n if (item.permissionLogic) {\n const hasAccess = evaluateLogicNode(item.permissionLogic, permissionCode);\n if (!hasAccess) {\n return null; // User doesn't pass permission logic\n }\n }\n\n // Filter child items recursively\n if (item.children && item.children.length > 0) {\n const filteredChildren = filterMenuByPermissions(\n item.children,\n permissionCode,\n );\n\n // If parent has no visible children, hide parent too\n if (filteredChildren.length === 0) {\n return null;\n }\n\n return { ...item, children: filteredChildren };\n }\n\n return item;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { LayoutConfig } from './layout.service';\n\nconst STORAGE_KEY = 'flusys.layout.config';\nconst STORAGE_VERSION = 1;\n\ninterface PersistedLayoutConfig extends LayoutConfig {\n _version?: number;\n}\n\n/**\n * Service for persisting layout configuration to localStorage.\n * Handles loading, saving, and validation of layout preferences with SSR-safe checks.\n *\n * @example\n * ```typescript\n * const persistence = inject(LayoutPersistenceService);\n *\n * // Load saved config\n * const config = persistence.load();\n *\n * // Save config\n * persistence.save({ darkTheme: true, preset: 'Aura' });\n *\n * // Clear saved config\n * persistence.clear();\n * ```\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LayoutPersistenceService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private readonly validPresets = ['Aura', 'Lara', 'Nora'];\n private readonly validMenuModes = ['static', 'overlay', 'topbar'];\n\n /**\n * Load configuration from localStorage.\n * Returns null if no saved config or invalid data.\n * SSR-safe (returns null on server).\n *\n * @returns Validated layout configuration or null\n */\n load(): LayoutConfig | null {\n if (!this.isBrowser) return null;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return null;\n\n const parsed = JSON.parse(stored) as PersistedLayoutConfig;\n return this.validateConfig(parsed);\n } catch {\n this.clear();\n return null;\n }\n }\n\n /**\n * Save configuration to localStorage.\n * SSR-safe (no-op on server).\n *\n * @param config Layout configuration to save\n */\n save(config: LayoutConfig): void {\n if (!this.isBrowser) return;\n\n try {\n const toStore: PersistedLayoutConfig = {\n ...config,\n _version: STORAGE_VERSION,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(toStore));\n } catch {\n // Silent fail - localStorage may be full or disabled\n }\n }\n\n /**\n * Clear stored configuration.\n * SSR-safe (no-op on server).\n */\n clear(): void {\n if (!this.isBrowser) return;\n localStorage.removeItem(STORAGE_KEY);\n }\n\n /**\n * Validate and sanitize configuration.\n * Returns null if version mismatch.\n *\n * @param config Configuration to validate\n * @returns Validated configuration or null\n */\n private validateConfig(config: PersistedLayoutConfig): LayoutConfig | null {\n // Version mismatch - clear and return null\n if (config._version && config._version !== STORAGE_VERSION) {\n this.clear();\n return null;\n }\n\n // Validate preset - silently fix invalid values\n if (config.preset && !this.validPresets.includes(config.preset)) {\n config.preset = 'Aura';\n }\n\n // Validate menuMode - silently fix invalid values\n if (config.menuMode && !this.validMenuModes.includes(config.menuMode)) {\n config.menuMode = 'static';\n }\n\n // Validate darkTheme\n if (typeof config.darkTheme !== 'boolean') {\n config.darkTheme = false;\n }\n\n // Remove version field from returned config\n const { _version, ...cleanConfig } = config;\n return cleanConfig as LayoutConfig;\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DOCUMENT,\n effect,\n inject,\n Injectable,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport { APP_CONFIG, DEFAULT_APP_NAME, DEFAULT_AUTHOR, isCompanyFeatureEnabled, TRANSLATE_ADAPTER, ITranslateAdapter } from '@flusys/ng-core';\nimport { PermissionValidatorService } from '@flusys/ng-shared';\nimport { Subject } from 'rxjs';\nimport { ILauncherApp, IMenuItem } from '../interfaces/layout-auth.interface';\nimport { DocumentWithViewTransition } from '../interfaces/view-transitions';\nimport { filterAppsByPermissions } from '../utils/apps-filter.util';\nimport { filterMenuByPermissions } from '../utils/menu-filter.util';\nimport { LayoutPersistenceService } from './layout-persistence.service';\n\nexport interface LayoutConfig {\n preset?: string;\n primary?: string;\n surface?: string | null;\n darkTheme?: boolean;\n menuMode?: 'static' | 'overlay' | 'topbar';\n}\n\nexport interface LayoutState {\n staticMenuDesktopInactive?: boolean;\n overlayMenuActive?: boolean;\n configSidebarVisible?: boolean;\n staticMenuMobileActive?: boolean;\n menuHoverActive?: boolean;\n topbarMenuVisible?: boolean;\n}\n\nexport interface MenuChangeEvent {\n key: string;\n routeEvent?: boolean;\n}\n\nexport interface UserProfile {\n id: string;\n name: string;\n email: string;\n profilePictureUrl?: string | null;\n}\n\nexport interface CompanyProfile {\n id: string;\n name: string;\n slug: string;\n logoUrl?: string | null;\n}\n\n/** Layout configuration and state management service */\n@Injectable({ providedIn: 'root' })\nexport class LayoutService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly persistence = inject(LayoutPersistenceService);\n private readonly appConfig = inject(APP_CONFIG, { optional: true });\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true }) as ITranslateAdapter | null;\n\n private readonly DEFAULT_CONFIG: LayoutConfig = {\n preset: 'Aura',\n primary: 'emerald',\n surface: null,\n darkTheme: false,\n menuMode: 'static',\n };\n\n private readonly DEFAULT_STATE: LayoutState = {\n staticMenuDesktopInactive: false,\n overlayMenuActive: false,\n configSidebarVisible: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n topbarMenuVisible: true,\n };\n\n private readonly _layoutConfig = signal<LayoutConfig>({\n ...this.DEFAULT_CONFIG,\n ...this.persistence.load(),\n });\n private readonly _layoutState = signal<LayoutState>(this.DEFAULT_STATE);\n private readonly _transitionComplete = signal<boolean>(false);\n\n readonly layoutConfig = this._layoutConfig.asReadonly();\n readonly layoutState = this._layoutState.asReadonly();\n readonly transitionComplete = this._transitionComplete.asReadonly();\n\n private readonly _userProfile = signal<UserProfile | null>(null);\n private readonly _companyProfile = signal<CompanyProfile | null>(null);\n private readonly _rawMenu = signal<IMenuItem[]>([]);\n private readonly _rawApps = signal<ILauncherApp[]>([]);\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n readonly userProfile = this._userProfile.asReadonly();\n readonly companyProfile = this._companyProfile.asReadonly();\n\n // Static app info from config\n readonly appName = this.appConfig?.appName ?? DEFAULT_APP_NAME;\n readonly appLogo = this.appConfig?.appLogo ?? '';\n readonly authorName = this.appConfig?.author?.name ?? DEFAULT_AUTHOR.name;\n readonly authorUrl = this.appConfig?.author?.url ?? DEFAULT_AUTHOR.url;\n\n // Permission-filtered menu and apps\n readonly menu = computed(() =>\n filterMenuByPermissions(this._rawMenu(), this.permissionValidator.permissions()),\n );\n readonly apps = computed(() =>\n filterAppsByPermissions(this._rawApps(), this.permissionValidator.permissions()),\n );\n readonly hasApps = computed(() => this.apps().length > 0);\n\n // Computed signals - Layout\n readonly isSidebarActive = computed(\n () =>\n this._layoutState().overlayMenuActive ||\n this._layoutState().staticMenuMobileActive,\n );\n readonly isDarkTheme = computed(() => this._layoutConfig().darkTheme);\n readonly getPrimary = computed(() => this._layoutConfig().primary);\n readonly getSurface = computed(() => this._layoutConfig().surface);\n readonly isOverlay = computed(\n () => this._layoutConfig().menuMode === 'overlay',\n );\n readonly isTopbar = computed(\n () => this._layoutConfig().menuMode === 'topbar',\n );\n\n // User profile computed signals\n readonly userName = computed(() => this._userProfile()?.name ?? this.translateAdapter?.translate('layout.profile.guest') ?? 'Guest');\n readonly userEmail = computed(() => this._userProfile()?.email ?? '');\n readonly userProfilePictureUrl = computed(() => this._userProfile()?.profilePictureUrl ?? null);\n readonly companyLogoUrl = computed(() => this._companyProfile()?.logoUrl ?? null);\n readonly isAuthenticated = computed(() => !!this._userProfile());\n readonly companyName = computed(() => {\n if (!this.appConfig || !isCompanyFeatureEnabled(this.appConfig)) return this.appName;\n return this._companyProfile()?.name ?? this.appName;\n });\n readonly displayLogo = computed(() => this.companyLogoUrl() ?? this.appLogo);\n\n // RxJS Subjects for event communication\n private readonly configUpdate = new Subject<LayoutConfig>();\n private readonly overlayOpen = new Subject<void>();\n private readonly menuSource = new Subject<MenuChangeEvent>();\n private readonly resetSource = new Subject<boolean>();\n\n readonly menuSource$ = this.menuSource.asObservable();\n readonly resetSource$ = this.resetSource.asObservable();\n readonly configUpdate$ = this.configUpdate.asObservable();\n readonly overlayOpen$ = this.overlayOpen.asObservable();\n\n private initialized = false;\n\n constructor() {\n effect(() => {\n const config = this._layoutConfig();\n this.configUpdate.next(config);\n\n if (this.initialized) {\n this.handleDarkModeTransition(config);\n this.persistence.save(config);\n }\n this.initialized = true;\n });\n }\n\n toggleDarkMode(config?: LayoutConfig): void {\n const isDark = (config ?? this._layoutConfig()).darkTheme;\n this.document.documentElement.classList.toggle('app-dark', isDark);\n }\n\n private handleDarkModeTransition(config: LayoutConfig): void {\n const doc = this.document as DocumentWithViewTransition;\n if ('startViewTransition' in doc && typeof doc.startViewTransition === 'function') {\n doc\n .startViewTransition(() => this.toggleDarkMode(config))\n .ready.then(() => this.onTransitionEnd())\n .catch(() => {});\n } else {\n this.toggleDarkMode(config);\n this.onTransitionEnd();\n }\n }\n\n private onTransitionEnd(): void {\n this._transitionComplete.set(true);\n setTimeout(() => this._transitionComplete.set(false));\n }\n\n onMenuToggle(): void {\n const state = this._layoutState();\n\n // Desktop topbar mode: toggle topbar nav visibility\n if (this.isDesktop() && this.isTopbar()) {\n this._layoutState.update((prev) => ({\n ...prev,\n topbarMenuVisible: !prev.topbarMenuVisible,\n }));\n return;\n }\n\n // Mobile always uses staticMenuMobileActive regardless of menu mode\n if (!this.isDesktop()) {\n const newMobileActive = !state.staticMenuMobileActive;\n this._layoutState.update((prev) => ({ ...prev, staticMenuMobileActive: newMobileActive }));\n if (newMobileActive) this.overlayOpen.next();\n return;\n }\n\n // Desktop: use overlay or static mode\n if (this.isOverlay()) {\n const newOverlayActive = !state.overlayMenuActive;\n this._layoutState.update((prev) => ({ ...prev, overlayMenuActive: newOverlayActive }));\n if (newOverlayActive) this.overlayOpen.next();\n } else {\n this._layoutState.update((prev) => ({\n ...prev,\n staticMenuDesktopInactive: !state.staticMenuDesktopInactive,\n }));\n }\n }\n\n isDesktop(): boolean {\n return this.isBrowser ? window.innerWidth > 991 : true;\n }\n\n isMobile(): boolean {\n return !this.isDesktop();\n }\n\n onMenuStateChange(event: MenuChangeEvent): void {\n this.menuSource.next(event);\n }\n\n reset(): void {\n this.resetSource.next(true);\n }\n\n // Config & state updates\n updateLayoutConfig(config: Partial<LayoutConfig>): void {\n this._layoutConfig.update((prev) => ({ ...prev, ...config }));\n }\n\n updateLayoutState(state: Partial<LayoutState>): void {\n this._layoutState.update((prev) => ({ ...prev, ...state }));\n }\n\n // Profile setters\n setUserProfile(profile: UserProfile | null): void {\n this._userProfile.set(profile);\n }\n\n setCompanyProfile(profile: CompanyProfile | null): void {\n this._companyProfile.set(profile);\n }\n\n // Menu & apps\n setMenu(items: IMenuItem[]): void {\n this._rawMenu.set(items);\n }\n\n clearMenu(): void {\n this._rawMenu.set([]);\n }\n\n setApps(apps: ILauncherApp[]): void {\n this._rawApps.set(apps);\n }\n\n clearApps(): void {\n this._rawApps.set([]);\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-footer',\n imports: [TranslatePipe],\n template: `<div class=\"layout-footer\">\n @if (displayLogo) {\n <img [src]=\"displayLogo\" [alt]=\"appName\" class=\"logo-image\" />\n }\n <span class=\"hidden sm:inline\">\n {{ appName }} {{ 'layout.footer.by' | translate }}\n <a\n [href]=\"authorUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-primary font-bold hover:underline\"\n >{{ authorName }}</a\n >\n </span>\n </div>`,\n})\nexport class AppFooter {\n private readonly layoutService = inject(LayoutService);\n\n readonly appName = this.layoutService.appName;\n readonly displayLogo = this.layoutService.appLogo;\n readonly authorName = this.layoutService.authorName;\n readonly authorUrl = this.layoutService.authorUrl;\n}\n","import { afterNextRender, Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { $t, updatePreset, updateSurfacePalette } from '@primeuix/themes';\nimport Aura from '@primeuix/themes/aura';\nimport Lara from '@primeuix/themes/lara';\nimport Nora from '@primeuix/themes/nora';\nimport { SelectButtonModule } from 'primeng/selectbutton';\nimport { LayoutService } from '../services/public-api';\n\nconst presets = {\n Aura,\n Lara,\n Nora,\n} as const;\n\ndeclare type KeyOfType<T> = keyof T extends infer U ? U : never;\n\ndeclare type SurfacesType = {\n name?: string;\n palette?: {\n 0?: string;\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n 950?: string;\n };\n};\n\n@Component({\n selector: 'app-configurator',\n imports: [FormsModule, SelectButtonModule, TranslatePipe],\n template: `\n <div class=\"flex flex-col gap-4\">\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">{{ 'layout.configurator.primary' | translate }}</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (primaryColor of primaryColors(); track primaryColor.name) {\n <button\n type=\"button\"\n [title]=\"primaryColor.name\"\n (click)=\"updateColors($event, 'primary', primaryColor)\"\n [class.outline-primary]=\"primaryColor.name === selectedPrimaryColor()\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style.background-color]=\"primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']\"\n ></button>\n }\n </div>\n </div>\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">{{ 'layout.configurator.surface' | translate }}</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (surface of surfaces; track surface.name) {\n <button\n type=\"button\"\n [title]=\"surface.name\"\n (click)=\"updateColors($event, 'surface', surface)\"\n [class.outline-primary]=\"isSurfaceSelected(surface.name)\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style.background-color]=\"surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']\"\n ></button>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">{{ 'layout.configurator.presets' | translate }}</span>\n <p-selectbutton\n [options]=\"presets\"\n [ngModel]=\"selectedPreset()\"\n (ngModelChange)=\"onPresetChange($event)\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n @if (showMenuModeButton()) {\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">{{ 'layout.configurator.menu.mode' | translate }}</span>\n <p-selectbutton\n [ngModel]=\"menuMode()\"\n (ngModelChange)=\"onMenuModeChange($event)\"\n [options]=\"menuModeOptions()\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n }\n </div>\n `,\n host: {\n class:\n 'hidden absolute top-[3.25rem] w-[calc(100vw-2rem)] sm:w-72 max-w-72 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]',\n style: 'background-color: var(--surface-overlay); inset-inline-end: 0;',\n },\n})\nexport class AppConfigurator {\n private readonly router = inject(Router);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n readonly layoutService = inject(LayoutService);\n\n readonly presets = Object.keys(presets);\n readonly showMenuModeButton = signal(!this.router.url.includes('auth'));\n readonly menuModeOptions = computed(() => {\n const options: Array<{ label: string; value: 'static' | 'overlay' | 'topbar' }> = [\n { label: this.translate('layout.configurator.menu.mode.static'), value: 'static' },\n { label: this.translate('layout.configurator.menu.mode.overlay'), value: 'overlay' },\n ];\n // Only show topbar mode on desktop\n if (this.layoutService.isDesktop()) {\n options.push({ label: this.translate('layout.configurator.menu.mode.topbar'), value: 'topbar' });\n }\n return options;\n });\n\n constructor() {\n // Use afterNextRender for browser-only initialization (replaces isServer check)\n afterNextRender(() => {\n const preset = this.layoutService.layoutConfig().preset ?? 'Aura';\n this.onPresetChange(preset);\n });\n }\n\n readonly surfaces: SurfacesType[] = [\n {\n name: 'slate',\n palette: {\n 0: '#ffffff',\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n },\n {\n name: 'gray',\n palette: {\n 0: '#ffffff',\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n },\n {\n name: 'zinc',\n palette: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f4f4f5',\n 200: '#e4e4e7',\n 300: '#d4d4d8',\n 400: '#a1a1aa',\n 500: '#71717a',\n 600: '#52525b',\n 700: '#3f3f46',\n 800: '#27272a',\n 900: '#18181b',\n 950: '#09090b',\n },\n },\n {\n name: 'neutral',\n palette: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#e5e5e5',\n 300: '#d4d4d4',\n 400: '#a3a3a3',\n 500: '#737373',\n 600: '#525252',\n 700: '#404040',\n 800: '#262626',\n 900: '#171717',\n 950: '#0a0a0a',\n },\n },\n {\n name: 'stone',\n palette: {\n 0: '#ffffff',\n 50: '#fafaf9',\n 100: '#f5f5f4',\n 200: '#e7e5e4',\n 300: '#d6d3d1',\n 400: '#a8a29e',\n 500: '#78716c',\n 600: '#57534e',\n 700: '#44403c',\n 800: '#292524',\n 900: '#1c1917',\n 950: '#0c0a09',\n },\n },\n {\n name: 'soho',\n palette: {\n 0: '#ffffff',\n 50: '#ececec',\n 100: '#dedfdf',\n 200: '#c4c4c6',\n 300: '#adaeb0',\n 400: '#97979b',\n 500: '#7f8084',\n 600: '#6a6b70',\n 700: '#55565b',\n 800: '#3f4046',\n 900: '#2c2c34',\n 950: '#16161d',\n },\n },\n {\n name: 'viva',\n palette: {\n 0: '#ffffff',\n 50: '#f3f3f3',\n 100: '#e7e7e8',\n 200: '#cfd0d0',\n 300: '#b7b8b9',\n 400: '#9fa1a1',\n 500: '#87898a',\n 600: '#6e7173',\n 700: '#565a5b',\n 800: '#3e4244',\n 900: '#262b2c',\n 950: '#0e1315',\n },\n },\n {\n name: 'ocean',\n palette: {\n 0: '#ffffff',\n 50: '#fbfcfc',\n 100: '#F7F9F8',\n 200: '#EFF3F2',\n 300: '#DADEDD',\n 400: '#B1B7B6',\n 500: '#828787',\n 600: '#5F7274',\n 700: '#415B61',\n 800: '#29444E',\n 900: '#183240',\n 950: '#0c1920',\n },\n },\n ];\n\n readonly selectedPrimaryColor = computed(() => {\n return this.layoutService.layoutConfig().primary;\n });\n\n readonly selectedSurfaceColor = computed(\n () => this.layoutService.layoutConfig().surface\n );\n\n isSurfaceSelected(surfaceName: string | undefined): boolean {\n const selectedSurface = this.selectedSurfaceColor();\n if (selectedSurface) {\n return selectedSurface === surfaceName;\n }\n // Default: zinc for dark theme, slate for light theme\n return this.layoutService.layoutConfig().darkTheme\n ? surfaceName === 'zinc'\n : surfaceName === 'slate';\n }\n\n readonly selectedPreset = computed(() => this.layoutService.layoutConfig().preset);\n\n readonly menuMode = computed(() => this.layoutService.layoutConfig().menuMode);\n\n readonly primaryColors = computed<SurfacesType[]>(() => {\n const presetPalette =\n presets[\n this.layoutService.layoutConfig().preset as KeyOfType<typeof presets>\n ].primitive;\n const colors = [\n 'emerald',\n 'green',\n 'lime',\n 'orange',\n 'amber',\n 'yellow',\n 'teal',\n 'cyan',\n 'sky',\n 'blue',\n 'indigo',\n 'violet',\n 'purple',\n 'fuchsia',\n 'pink',\n 'rose',\n ];\n const palettes: SurfacesType[] = [{ name: 'noir', palette: {} }];\n\n colors.forEach((color) => {\n palettes.push({\n name: color,\n palette: presetPalette?.[\n color as KeyOfType<typeof presetPalette>\n ] as SurfacesType['palette'],\n });\n });\n\n return palettes;\n });\n\n getPresetExt() {\n const color: SurfacesType =\n this.primaryColors().find(\n (c) => c.name === this.selectedPrimaryColor()\n ) || {};\n const preset = this.layoutService.layoutConfig().preset;\n\n if (color.name === 'noir') {\n return {\n semantic: {\n primary: {\n 50: '{surface.50}',\n 100: '{surface.100}',\n 200: '{surface.200}',\n 300: '{surface.300}',\n 400: '{surface.400}',\n 500: '{surface.500}',\n 600: '{surface.600}',\n 700: '{surface.700}',\n 800: '{surface.800}',\n 900: '{surface.900}',\n 950: '{surface.950}',\n },\n colorScheme: {\n light: {\n primary: {\n color: '{primary.950}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.800}',\n activeColor: '{primary.700}',\n },\n highlight: {\n background: '{primary.950}',\n focusBackground: '{primary.700}',\n color: '#ffffff',\n focusColor: '#ffffff',\n },\n },\n dark: {\n primary: {\n color: '{primary.50}',\n contrastColor: '{primary.950}',\n hoverColor: '{primary.200}',\n activeColor: '{primary.300}',\n },\n highlight: {\n background: '{primary.50}',\n focusBackground: '{primary.300}',\n color: '{primary.950}',\n focusColor: '{primary.950}',\n },\n },\n },\n },\n };\n } else {\n if (preset === 'Nora') {\n return {\n semantic: {\n primary: color.palette,\n colorScheme: {\n light: {\n primary: {\n color: '{primary.600}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.700}',\n activeColor: '{primary.800}',\n },\n highlight: {\n background: '{primary.600}',\n focusBackground: '{primary.700}',\n color: '#ffffff',\n focusColor: '#ffffff',\n },\n },\n dark: {\n primary: {\n color: '{primary.500}',\n contrastColor: '{surface.900}',\n hoverColor: '{primary.400}',\n activeColor: '{primary.300}',\n },\n highlight: {\n background: '{primary.500}',\n focusBackground: '{primary.400}',\n color: '{surface.900}',\n focusColor: '{surface.900}',\n },\n },\n },\n },\n };\n } else {\n return {\n semantic: {\n primary: color.palette,\n colorScheme: {\n light: {\n primary: {\n color: '{primary.500}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.600}',\n activeColor: '{primary.700}',\n },\n highlight: {\n background: '{primary.50}',\n focusBackground: '{primary.100}',\n color: '{primary.700}',\n focusColor: '{primary.800}',\n },\n },\n dark: {\n primary: {\n color: '{primary.400}',\n contrastColor: '{surface.900}',\n hoverColor: '{primary.300}',\n activeColor: '{primary.200}',\n },\n highlight: {\n background:\n 'color-mix(in srgb, {primary.400}, transparent 84%)',\n focusBackground:\n 'color-mix(in srgb, {primary.400}, transparent 76%)',\n color: 'rgba(255,255,255,.87)',\n focusColor: 'rgba(255,255,255,.87)',\n },\n },\n },\n },\n };\n }\n }\n }\n\n updateColors(event: MouseEvent, type: string, color: SurfacesType): void {\n if (type === 'primary') {\n this.layoutService.updateLayoutConfig({ primary: color.name });\n } else if (type === 'surface') {\n this.layoutService.updateLayoutConfig({ surface: color.name });\n }\n this.applyTheme(type, color);\n\n event.stopPropagation();\n }\n\n applyTheme(type: string, color: SurfacesType): void {\n if (type === 'primary') {\n updatePreset(this.getPresetExt());\n } else if (type === 'surface') {\n updateSurfacePalette(color.palette);\n }\n }\n\n onPresetChange(event: string): void {\n this.layoutService.updateLayoutConfig({ preset: event });\n const preset = presets[event as KeyOfType<typeof presets>];\n // Use selected surface or default (slate for light, zinc for dark)\n const selectedSurface = this.selectedSurfaceColor();\n const defaultSurface = this.layoutService.layoutConfig().darkTheme ? 'zinc' : 'slate';\n const surfacePalette = this.surfaces.find(\n (s) => s.name === (selectedSurface || defaultSurface)\n )?.palette;\n $t()\n .preset(preset)\n .preset(this.getPresetExt())\n .surfacePalette(surfacePalette)\n .use({ useDefaultOptions: true });\n }\n\n onMenuModeChange(event: 'static' | 'overlay' | 'topbar'): void {\n this.layoutService.updateLayoutConfig({ menuMode: event });\n }\n\n private translate(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\n}\n","import { InjectionToken, Signal, Type } from '@angular/core';\nimport type { IconTypeEnum, ILogicNode } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\n\nexport interface ILauncherApp {\n id: string;\n /** Display name (use nameKey for localization instead) */\n name?: string;\n /** Translation key for the name - preferred over name for localization */\n nameKey?: string;\n iconType: IconTypeEnum;\n icon: string;\n url: string;\n /** Optional permission logic - if set, app only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ICompanyInfo {\n id: string;\n name: string;\n slug: string;\n imageId: string;\n}\n\nexport interface IBranchInfo {\n id: string;\n name: string;\n slug: string;\n imageId?: string;\n}\n\nexport interface IUserInfo {\n id: string;\n name: string;\n email: string;\n profilePicture?: { url: string } | null;\n}\n\nexport interface IMenuItem {\n id?: string;\n /** Display label (use labelKey for localization instead) */\n label?: string;\n /** Translation key for the label - preferred over label for localization */\n labelKey?: string;\n icon?: string;\n iconType?: number;\n routerLink?: string[];\n children?: IMenuItem[];\n parent?: { id: string } | null;\n separator?: boolean;\n /** Optional permission logic - if set, item only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ILayoutAuthState {\n currentCompanyInfo: Signal<ICompanyInfo | null>;\n currentBranchInfo: Signal<IBranchInfo | null>;\n loginUserData: Signal<IUserInfo | null>;\n}\n\nexport interface ILayoutAuthApi {\n logOut(): Observable<any>;\n navigateLogin(withUrl?: boolean): void;\n switchCompany(companyId: string, branchId: string): Observable<any>;\n getUserCompanies(): Observable<ICompanyInfo[]>;\n getCompanyBranches(companyId: string): Observable<IBranchInfo[]>;\n}\n\nexport const LAYOUT_AUTH_STATE = new InjectionToken<ILayoutAuthState>(\n 'LAYOUT_AUTH_STATE',\n);\n\nexport const LAYOUT_AUTH_API = new InjectionToken<ILayoutAuthApi>(\n 'LAYOUT_AUTH_API',\n);\n\nexport const LAYOUT_NOTIFICATION_BELL = new InjectionToken<Type<unknown>>(\n 'LAYOUT_NOTIFICATION_BELL',\n);\n\nexport const LAYOUT_LANGUAGE_SELECTOR = new InjectionToken<Type<unknown>>(\n 'LAYOUT_LANGUAGE_SELECTOR',\n);\n\nexport const LAYOUT_LANGUAGE_SELECTOR_PANEL = new InjectionToken<Type<unknown>>(\n 'LAYOUT_LANGUAGE_SELECTOR_PANEL',\n);\n\nexport const LAYOUT_SEARCHBAR = new InjectionToken<Type<unknown>>(\n 'LAYOUT_SEARCHBAR',\n);\n\nexport const LAYOUT_IS_RTL = new InjectionToken<Signal<boolean>>(\n 'LAYOUT_IS_RTL',\n);\n\nexport interface ISearchSuggestion {\n label: string;\n icon?: string;\n routerLink?: string[];\n data?: unknown;\n}\n\nexport interface ISearchAdapter {\n getSuggestions(query: string): Observable<ISearchSuggestion[]>;\n onSearch?(query: string): void;\n}\n\nexport const LAYOUT_SEARCH_ADAPTER = new InjectionToken<ISearchAdapter>(\n 'LAYOUT_SEARCH_ADAPTER',\n);\n","import { NgComponentOutlet } from '@angular/common';\nimport { Component, computed, inject } from '@angular/core';\nimport { ButtonModule } from 'primeng/button';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { LAYOUT_LANGUAGE_SELECTOR_PANEL } from '../interfaces/layout-auth.interface';\nimport { LayoutService } from '../services/public-api';\nimport { AppConfigurator } from './app.configurator';\n\n@Component({\n selector: 'app-floating-configurator',\n imports: [NgComponentOutlet, ButtonModule, StyleClassModule, AppConfigurator],\n template: `\n <div\n class=\"floating-configurator fixed flex flex-col md:flex-row gap-2 md:gap-4 top-4 md:top-8 z-50\"\n >\n <p-button\n type=\"button\"\n (onClick)=\"toggleDarkMode()\"\n [rounded]=\"true\"\n [icon]=\"isDarkTheme() ? 'pi pi-moon' : 'pi pi-sun'\"\n severity=\"secondary\"\n />\n @if (languageSelectorPanel) {\n <div class=\"relative\">\n <p-button\n icon=\"pi pi-globe\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n type=\"button\"\n rounded\n />\n <ng-container *ngComponentOutlet=\"languageSelectorPanel\" />\n </div>\n }\n <div class=\"relative\">\n <p-button\n icon=\"pi pi-palette\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n type=\"button\"\n rounded\n />\n <app-configurator />\n </div>\n </div>\n `,\n styles: `\n .floating-configurator {\n inset-inline-end: 0.5rem;\n }\n @media (min-width: 768px) {\n .floating-configurator {\n inset-inline-end: 2rem;\n }\n }\n `,\n})\nexport class AppFloatingConfigurator {\n private readonly layoutService = inject(LayoutService);\n readonly languageSelectorPanel = inject(LAYOUT_LANGUAGE_SELECTOR_PANEL, {\n optional: true,\n });\n\n readonly isDarkTheme = computed(\n () => this.layoutService.layoutConfig().darkTheme,\n );\n\n toggleDarkMode(): void {\n const currentDarkTheme = this.layoutService.layoutConfig().darkTheme;\n this.layoutService.updateLayoutConfig({ darkTheme: !currentDarkTheme });\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { IconComponent, TranslatePipe } from '@flusys/ng-shared';\nimport { RippleModule } from 'primeng/ripple';\nimport { filter } from 'rxjs/operators';\nimport { IMenuItem } from '../interfaces/public-api';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: '[app-menuitem]',\n imports: [IconComponent, RouterModule, RippleModule, TranslatePipe],\n template: `\n <ng-container>\n @if (item().children?.length) {\n <a\n (click)=\"itemClick()\"\n (mouseenter)=\"onMouseEnter()\"\n #parentLink\n tabindex=\"0\"\n pRipple\n >\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{\n item().labelKey ? (item().labelKey! | translate) : item().label\n }}</span>\n @if (item().children) {\n @if (layoutService.isTopbar()) {\n <i class=\"pi pi-fw pi-chevron-right layout-submenu-toggler\"></i>\n } @else {\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"></i>\n }\n }\n </a>\n }\n @if (item().routerLink && !item().children?.length) {\n <a\n (click)=\"itemClick()\"\n [routerLink]=\"routerLink()\"\n routerLinkActive=\"active-route\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n tabindex=\"0\"\n pRipple\n >\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{\n item().labelKey ? (item().labelKey! | translate) : item().label\n }}</span>\n </a>\n }\n @if (item().children) {\n <ul\n (mouseenter)=\"onMouseEnter()\"\n [class.submenu-expanded]=\"active() && !layoutService.isTopbar()\"\n [class.submenu-collapsed]=\"!active() && !layoutService.isTopbar()\"\n >\n @for (\n child of item().children;\n track 'menu' + child.id + '' + i;\n let i = $index\n ) {\n <li\n app-menuitem\n [item]=\"child\"\n [index]=\"i\"\n [parentKey]=\"key()\"\n ></li>\n }\n </ul>\n }\n </ng-container>\n `,\n styles: `\n :host ul {\n overflow: hidden;\n transition: max-height 400ms cubic-bezier(0.86, 0, 0.07, 1);\n }\n :host ul.submenu-collapsed {\n max-height: 0;\n }\n :host ul.submenu-expanded {\n max-height: 1000px;\n }\n `,\n host: {\n '[class.active-menuitem]': 'active()',\n },\n})\nexport class AppMenuitem {\n // Signal inputs\n readonly item = input.required<IMenuItem>();\n readonly index = input.required<number>();\n readonly parentKey = input<string>('');\n\n // Injected services\n private readonly router = inject(Router);\n readonly layoutService = inject(LayoutService);\n private readonly destroyRef = inject(DestroyRef);\n\n // View references\n private readonly parentLink =\n viewChild<ElementRef<HTMLElement>>('parentLink');\n\n // State signals - private writable + public readonly pattern\n private readonly _active = signal(false);\n readonly active = this._active.asReadonly();\n\n // Computed signals\n readonly key = computed(() => {\n const parent = this.parentKey();\n return parent ? `${parent}-${this.index()}` : String(this.index());\n });\n\n readonly routerLink = computed(() => {\n const menuItem = this.item();\n return menuItem.routerLink ?? [];\n });\n\n // Computed options for routerLinkActive - use 'exact' for root, 'subset' for others\n readonly routerLinkActiveOptions = computed(() => {\n const link = this.routerLink();\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n return {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n } as const;\n });\n\n constructor() {\n // Subscribe to menu source changes\n this.layoutService.menuSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n Promise.resolve(null).then(() => {\n const currentKey = this.key();\n if (value.routeEvent) {\n this._active.set(\n value.key === currentKey ||\n value.key?.startsWith(currentKey + '-'),\n );\n } else if (\n value.key !== currentKey &&\n !value.key?.startsWith(currentKey + '-')\n ) {\n this._active.set(false);\n }\n });\n });\n\n // Subscribe to menu reset\n this.layoutService.resetSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this._active.set(false));\n\n // Subscribe to navigation events\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n if (this.item().routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n\n // Effect to update active state on init when item has routerLink\n effect(() => {\n const menuItem = this.item();\n if (menuItem.routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n\n // Effect to update submenu position when active in topbar mode\n effect(() => {\n if (this.active() && this.parentLink()) {\n Promise.resolve().then(() => this.updateSubmenuPosition());\n }\n });\n }\n\n onMouseEnter(): void {\n if (this.layoutService.isTopbar() && this.item().children) {\n this.updateSubmenuPosition();\n }\n }\n\n private updateSubmenuPosition(): void {\n const linkEl = this.parentLink()?.nativeElement;\n if (!linkEl || typeof linkEl.getBoundingClientRect !== 'function') return;\n\n const rect = linkEl.getBoundingClientRect();\n const hostEl = linkEl.closest('[app-menuitem]');\n if (!hostEl) return;\n\n // Position submenu to the left of the parent link and above it\n const left = rect.left;\n const top = rect.top + 30; // 8px gap above the menu item\n\n (hostEl as HTMLElement).style.setProperty('--submenu-left', `${left}px`);\n (hostEl as HTMLElement).style.setProperty('--submenu-top', `${top}px`);\n }\n\n private updateActiveStateFromRoute(): void {\n const link = this.routerLink();\n if (!link.length) return;\n\n // Use 'exact' for root path to avoid matching all routes\n // Use 'subset' for all other paths to match child routes\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n\n const isActive = this.router.isActive(link[0], {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n });\n\n if (isActive) {\n this.layoutService.onMenuStateChange({\n key: this.key(),\n routeEvent: true,\n });\n }\n }\n\n itemClick(): void {\n if (this.item().children && !this.layoutService.isTopbar()) {\n this._active.update((prev) => !prev);\n }\n this.layoutService.onMenuStateChange({ key: this.key() });\n }\n}\n","import { Component, inject } from '@angular/core';\n\nimport { RouterModule } from '@angular/router';\nimport { LayoutService } from '../services/layout.service';\nimport { AppMenuitem } from './app.menuitem';\n\n/**\n * Main menu component that displays filtered menu items.\n * Menu is automatically filtered based on user permissions using the permission checker (logicNode pattern).\n * The filtering happens internally in LayoutService via computed signal.\n */\n@Component({\n selector: 'app-menu',\n imports: [AppMenuitem, RouterModule],\n template: `<div class=\"layout-menu\">\n <ul>\n @for (\n item of menuItems();\n track 'menu' + item.id + '' + i;\n let i = $index\n ) {\n <li app-menuitem [item]=\"item\" [index]=\"i\"></li>\n }\n </ul>\n </div>`,\n})\nexport class AppMenu {\n private readonly layoutService = inject(LayoutService);\n\n /**\n * Filtered menu items from layout service.\n * This signal is computed in LayoutService and automatically updates when:\n * - Raw menu changes (setMenu called)\n * - Permission state changes (user permissions updated)\n */\n readonly menuItems = this.layoutService.menu;\n}\n","/**\n * View Transitions API type definitions\n * @see https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API\n */\n\nexport interface ViewTransition {\n /** Promise fulfilled when the transition animation is complete */\n finished: Promise<void>;\n /** Promise fulfilled when the pseudo-element tree is ready */\n ready: Promise<void>;\n /** Promise fulfilled when the callback finishes */\n updateCallbackDone: Promise<void>;\n /** Skip the transition animation */\n skipTransition(): void;\n}\n\n/**\n * Extended Document interface with View Transitions API support.\n * Uses the native Document type with startViewTransition which is now\n * part of the standard TypeScript DOM library.\n */\nexport type DocumentWithViewTransition = Document;\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { ButtonModule } from 'primeng/button';\nimport { SelectModule } from 'primeng/select';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type { IBranchInfo, ICompanyInfo } from '../../interfaces/public-api';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\n\n/** Company/branch switcher displayed in top bar */\n@Component({\n selector: 'app-company-branch-selector',\n imports: [\n AngularModule,\n StyleClassModule,\n ButtonModule,\n SelectModule,\n TranslatePipe,\n ],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"onPanelToggle()\"\n >\n <i class=\"pi pi-building\"></i>\n <span>{{ currentCompanyName() }}</span>\n @if (currentBranchName()) {\n <span class=\"text-xs opacity-70\"> | {{ currentBranchName() }}</span>\n }\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[300px] max-w-[360px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\"\n >\n <div class=\"flex flex-col gap-4\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.company.branch.selector.title' | translate\n }}</span>\n\n <!-- Company Selector -->\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">{{\n 'shared.company' | translate\n }}</label>\n <p-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"onCompanyChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'layout.company.branch.selector.select.company' | translate\n \"\n class=\"w-full\"\n [loading]=\"isLoadingCompanies()\"\n />\n </div>\n\n <!-- Branch Selector -->\n @if (selectedCompanyId() && branches().length > 0) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.company.branch.selector.branch' | translate\n }}</label>\n <p-select\n [options]=\"branches()\"\n [ngModel]=\"selectedBranchId()\"\n (ngModelChange)=\"onBranchChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'layout.company.branch.selector.select.branch' | translate\n \"\n class=\"w-full\"\n [loading]=\"isLoadingBranches()\"\n />\n </div>\n }\n\n <!-- Actions -->\n <div class=\"flex gap-2 pt-2\">\n <p-button\n [label]=\"'layout.company.branch.selector.switch.button' | translate\"\n icon=\"pi pi-sync\"\n styleClass=\"flex-1\"\n [loading]=\"isSwitching()\"\n [disabled]=\"!canSwitch()\"\n (onClick)=\"onSwitch()\"\n />\n </div>\n </div>\n </div>\n `,\n})\nexport class AppCompanyBranchSelector {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, {\n optional: true,\n });\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n readonly currentCompanyName = computed(\n () =>\n this.authState?.currentCompanyInfo()?.name ??\n this.translate('layout.company.branch.selector.no.company'),\n );\n readonly currentBranchName = computed(\n () => this.authState?.currentBranchInfo()?.name ?? null,\n );\n\n private readonly _companies = signal<ICompanyInfo[]>([]);\n readonly companies = this._companies.asReadonly();\n private readonly _branches = signal<IBranchInfo[]>([]);\n readonly branches = this._branches.asReadonly();\n private readonly _selectedCompanyId = signal<string | null>(null);\n readonly selectedCompanyId = this._selectedCompanyId.asReadonly();\n private readonly _selectedBranchId = signal<string | null>(null);\n readonly selectedBranchId = this._selectedBranchId.asReadonly();\n private readonly _isLoadingCompanies = signal(false);\n readonly isLoadingCompanies = this._isLoadingCompanies.asReadonly();\n private readonly _isLoadingBranches = signal(false);\n readonly isLoadingBranches = this._isLoadingBranches.asReadonly();\n private readonly _isSwitching = signal(false);\n readonly isSwitching = this._isSwitching.asReadonly();\n\n readonly canSwitch = computed(() => {\n const selectedCompany = this.selectedCompanyId();\n if (!selectedCompany) return false;\n\n const currentCompanyId = this.authState?.currentCompanyInfo()?.id;\n const currentBranchId = this.authState?.currentBranchInfo()?.id;\n const selectedBranch = this.selectedBranchId();\n\n return (\n selectedCompany !== currentCompanyId || selectedBranch !== currentBranchId\n );\n });\n\n onPanelToggle(): void {\n this._isActive.update((v) => !v);\n if (this.isActive() && this.companies().length === 0) {\n this.loadCompanies();\n }\n }\n\n private loadCompanies(): void {\n if (!this.authApi) return;\n\n this._isLoadingCompanies.set(true);\n this.authApi\n .getUserCompanies()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (companies) => {\n this._companies.set(companies);\n this._isLoadingCompanies.set(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n this._isLoadingCompanies.set(false);\n },\n });\n }\n\n onCompanyChange(companyId: string | null): void {\n this._selectedCompanyId.set(companyId);\n\n if (!companyId) {\n this._branches.set([]);\n this._selectedBranchId.set(null);\n return;\n }\n\n this.loadBranches(companyId);\n }\n\n onBranchChange(branchId: string | null): void {\n this._selectedBranchId.set(branchId);\n }\n\n private loadBranches(companyId: string): void {\n if (!this.authApi) return;\n\n this._isLoadingBranches.set(true);\n this._selectedBranchId.set(null);\n\n this.authApi\n .getCompanyBranches(companyId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (branches) => {\n this._branches.set(branches);\n this._isLoadingBranches.set(false);\n\n // Auto-select if only one branch available\n if (branches.length === 1) {\n this._selectedBranchId.set(branches[0].id);\n }\n },\n error: () => {\n // Error toast handled by global interceptor\n this._isLoadingBranches.set(false);\n },\n });\n }\n\n onSwitch(): void {\n const selectedCompany = this.selectedCompanyId();\n const selectedBranch = this.selectedBranchId();\n\n if (!this.authApi || !selectedCompany) return;\n\n if (this.branches().length > 0 && !selectedBranch) {\n this.messageService.add({\n severity: 'warn',\n summary: this.translate(\n 'layout.company.branch.selector.branch.required',\n ),\n detail: this.translate(\n 'layout.company.branch.selector.please.select.branch',\n ),\n });\n return;\n }\n\n this._isSwitching.set(true);\n\n this.authApi\n .switchCompany(selectedCompany, selectedBranch || '')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {},\n error: () => {\n // Error toast handled by global interceptor\n this._isSwitching.set(false);\n },\n });\n }\n\n private translate(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IconComponent, TranslatePipe } from '@flusys/ng-shared';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-launcher',\n imports: [StyleClassModule, IconComponent, TranslatePipe],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\"\n >\n <i class=\"pi pi-th-large\"></i>\n <span>{{ 'layout.launcher.apps' | translate }}</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\"\n >\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.launcher.applications' | translate\n }}</span>\n <div class=\"grid grid-cols-2 sm:grid-cols-3 gap-2\">\n @for (app of layoutService.apps(); track app.id) {\n <a\n class=\"group flex flex-col items-center p-2 rounded-border cursor-pointer no-underline transition-all duration-200 hover:bg-emphasis\"\n [href]=\"app.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <div\n class=\"flex items-center justify-center w-10 h-10 rounded-border bg-emphasis group-hover:bg-primary transition-all duration-200\"\n >\n <lib-icon\n [icon]=\"app.icon\"\n [iconType]=\"app.iconType\"\n class=\"text-xl text-primary group-hover:text-primary-contrast transition-colors duration-200\"\n />\n </div>\n <span\n class=\"text-xs mt-2 text-center text-muted-color group-hover:text-color transition-colors duration-200 truncate max-w-full\"\n >{{ app.nameKey ? (app.nameKey | translate) : app.name }}</span\n >\n </a>\n }\n </div>\n </div>\n </div>\n `,\n})\nexport class AppLauncher {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n readonly layoutService = inject(LayoutService);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this._isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this._isActive.update((v) => !v);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n APP_CONFIG,\n isSignUpEnabled,\n TRANSLATE_ADAPTER,\n} from '@flusys/ng-core';\nimport { AngularModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-profile',\n imports: [AngularModule, StyleClassModule, TranslatePipe],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\"\n >\n <i class=\"pi pi-user\"></i>\n <span>{{ 'layout.profile.title' | translate }}</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\"\n >\n <div class=\"flex flex-col gap-3\">\n <!-- User Info -->\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline hover:bg-emphasis transition-all duration-200\"\n routerLink=\"/profile\"\n >\n @if (profilePicture()) {\n <img\n [src]=\"profilePicture()\"\n class=\"w-12 h-12 rounded-border object-cover\"\n [alt]=\"'layout.profile.profile.picture.alt' | translate\"\n />\n } @else {\n <div\n class=\"w-12 h-12 rounded-border bg-primary flex items-center justify-center\"\n >\n <i class=\"pi pi-user text-xl text-primary-contrast\"></i>\n </div>\n }\n <div class=\"flex flex-col min-w-0 flex-1\">\n <span class=\"font-semibold text-color truncate\">{{\n userName()\n }}</span>\n <span class=\"text-sm text-muted-color truncate\">{{\n userEmail()\n }}</span>\n </div>\n </a>\n\n <!-- Divider -->\n <div class=\"border-t border-surface\"></div>\n\n <!-- Menu Items -->\n <div class=\"flex flex-col gap-1\">\n @if (signUpEnabled()) {\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"copySignUpLink()\"\n >\n <i class=\"pi pi-link text-muted-color\"></i>\n <span>{{ 'layout.profile.copy.sign.up.link' | translate }}</span>\n </a>\n }\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"logout()\"\n >\n <i class=\"pi pi-sign-out text-muted-color\"></i>\n <span>{{ 'layout.profile.logout' | translate }}</span>\n </a>\n </div>\n </div>\n </div>\n `,\n})\nexport class AppProfile {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly layoutService = inject(LayoutService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, {\n optional: true,\n });\n private readonly appConfig = inject(APP_CONFIG, { optional: true });\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this._isActive.update((v) => !v);\n }\n\n readonly userName = computed(\n () =>\n this.authState?.loginUserData()?.name ??\n this.translate('layout.profile.guest'),\n );\n readonly userEmail = computed(\n () => this.authState?.loginUserData()?.email ?? '',\n );\n readonly profilePicture = computed(\n () => this.layoutService.userProfilePictureUrl() ?? '',\n );\n readonly signUpEnabled = computed(() =>\n this.appConfig ? isSignUpEnabled(this.appConfig) : false,\n );\n\n logout(): void {\n if (!this.authApi) return;\n\n this.authApi\n .logOut()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (result) => {\n const r = result as unknown as {\n messageKey?: string;\n messageVariables?: Record<string, string | number>;\n message?: string;\n };\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: r?.messageKey\n ? this.translate(r.messageKey, r.messageVariables)\n : (r?.message ?? ''),\n });\n this.authApi?.navigateLogin(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n },\n });\n }\n\n copySignUpLink(): void {\n const slug = this.authState?.currentCompanyInfo()?.slug ?? '';\n const signUpLink = `${window.location.origin}/auth/register?companySlug=${slug}`;\n navigator.clipboard\n .writeText(signUpLink)\n .then(() => {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('layout.profile.link.copied'),\n detail: this.translate('layout.profile.sign.up.link.copied'),\n });\n })\n .catch(() => {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.error'),\n detail: this.translate('layout.profile.failed.copy.sign.up.link'),\n });\n });\n }\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { fromEvent } from 'rxjs';\nimport {\n ISearchSuggestion,\n LAYOUT_SEARCH_ADAPTER,\n} from '../../interfaces/layout-auth.interface';\nimport { LayoutService } from '../../services/public-api';\n\n@Component({\n selector: 'app-searchbar',\n imports: [AngularModule, PrimeModule, TranslatePipe],\n template: `\n <div\n class=\"search-container h-full\"\n #searchWrapper\n [class.topbar-mode]=\"layoutService.isTopbar() || isResponsive()\"\n >\n @if (layoutService.isTopbar() || isResponsive()) {\n <!-- Topbar/Mobile Icon Mode -->\n <button\n type=\"button\"\n pButton\n pRipple\n class=\"search-toggle-btn\"\n icon=\"pi pi-search\"\n (click)=\"toggleSearch()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n severity=\"secondary\"\n text\n ></button>\n\n @if (isSearchExpanded()) {\n <div class=\"search-dropdown-panel\">\n <p-iconfield class=\"search-iconfield\">\n <p-inputicon class=\"pi pi-search search-icon\" />\n <input\n type=\"text\"\n pInputText\n class=\"search-input w-full\"\n [placeholder]=\"'layout.topbar.search.placeholder' | translate\"\n [(ngModel)]=\"searchTerm\"\n (keyup.enter)=\"handleEnter()\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n #searchInput\n autocomplete=\"off\"\n />\n </p-iconfield>\n\n @if (suggestionsOpen() && suggestions().length > 0) {\n <div class=\"search-suggestions\">\n <ul class=\"suggestions-list\">\n @for (\n item of suggestions();\n track item.label;\n let idx = $index\n ) {\n <li\n class=\"suggestion-item\"\n [class.focused]=\"idx === focusedIndex()\"\n (click)=\"selectSuggestion(item)\"\n (mouseenter)=\"focusedIndex.set(idx)\"\n role=\"option\"\n [attr.aria-selected]=\"idx === focusedIndex()\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" class=\"suggestion-icon\"></i>\n }\n <span class=\"suggestion-label\">{{ item.label }}</span>\n </li>\n }\n </ul>\n </div>\n }\n </div>\n }\n } @else {\n <!-- Desktop Full Input Mode -->\n <p-iconfield class=\"search-iconfield\">\n <p-inputicon class=\"pi pi-search search-icon\" (click)=\"onSearch()\" />\n <input\n type=\"text\"\n pInputText\n class=\"search-input w-full\"\n [placeholder]=\"'layout.topbar.search.placeholder' | translate\"\n [(ngModel)]=\"searchTerm\"\n (keyup.enter)=\"handleEnter()\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n #searchInput\n />\n </p-iconfield>\n\n @if (suggestionsOpen() && suggestions().length > 0) {\n <div class=\"search-dropdown\">\n <ul class=\"suggestions-list\">\n @for (item of suggestions(); track item.label; let idx = $index) {\n <li\n class=\"suggestion-item\"\n [class.focused]=\"idx === focusedIndex()\"\n (click)=\"selectSuggestion(item)\"\n (mouseenter)=\"focusedIndex.set(idx)\"\n role=\"option\"\n [attr.aria-selected]=\"idx === focusedIndex()\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" class=\"suggestion-icon\"></i>\n }\n <span class=\"suggestion-label\">{{ item.label }}</span>\n </li>\n }\n </ul>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n .search-container {\n display: flex;\n align-items: center;\n position: relative;\n width: 100%;\n flex: 0 1 auto;\n }\n\n .search-container.topbar-mode {\n width: auto;\n }\n\n .search-dropdown-panel {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 0.5rem;\n background-color: var(--surface-card);\n border: 1px solid var(--surface-border);\n border-radius: var(--border-radius);\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n z-index: 1100;\n padding: 1rem 0.75rem 0.75rem 0.75rem;\n min-width: 300px;\n max-width: 450px;\n animation: slideDown 0.2s ease-out;\n }\n\n .search-suggestions {\n margin-top: 0.5rem;\n border-top: 1px solid var(--surface-border);\n padding-top: 0.5rem;\n background-color: inherit;\n }\n\n .suggestions-list {\n list-style: none;\n margin: 0;\n padding: 0;\n max-height: 360px;\n overflow-y: auto;\n background-color: inherit;\n }\n\n .suggestion-item {\n padding: 0.75rem 1rem;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n color: var(--text-color);\n border-bottom: 1px solid var(--surface-border);\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n .suggestion-item:last-child {\n border-bottom: none;\n }\n\n .suggestion-item:hover,\n .suggestion-item.focused {\n background-color: var(--surface-50);\n color: var(--primary-color);\n }\n\n .suggestion-icon {\n color: var(--text-color-secondary);\n font-size: 1rem;\n flex-shrink: 0;\n transition: color 0.15s ease;\n }\n\n .suggestion-item:hover .suggestion-icon,\n .suggestion-item.focused .suggestion-icon {\n color: var(--primary-color);\n }\n\n .suggestion-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .search-dropdown {\n position: absolute;\n top: calc(100% + 0.5rem);\n left: 0;\n right: 0;\n background-color: var(--surface-card);\n border: 1px solid var(--surface-border);\n border-radius: var(--border-radius);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n overflow: hidden;\n }\n\n .search-dropdown .suggestions-list {\n background-color: inherit;\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Responsive styles */\n @media (max-width: 768px) {\n .search-dropdown-panel {\n min-width: 280px;\n max-width: 400px;\n }\n }\n\n @media (max-width: 576px) {\n .search-dropdown-panel {\n position: fixed;\n top: 4rem;\n left: 0;\n right: 0;\n bottom: auto;\n width: 100vw;\n min-width: 100vw;\n max-width: 100vw;\n margin-top: 0;\n padding: 1rem;\n border-radius: 0;\n border-bottom: 1px solid var(--surface-border);\n z-index: 1200;\n }\n\n .search-dropdown-panel .search-iconfield {\n margin-bottom: 1rem;\n }\n\n .search-dropdown {\n max-width: 100%;\n left: 0 !important;\n right: 0 !important;\n transform: none;\n position: static;\n border-radius: var(--border-radius);\n margin-top: 0;\n }\n\n .suggestion-item {\n padding: 0.75rem;\n }\n }\n `,\n ],\n})\nexport class AppSearchbar {\n readonly layoutService = inject(LayoutService);\n private readonly router = inject(Router);\n private readonly searchAdapter = inject(LAYOUT_SEARCH_ADAPTER, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n\n readonly searchTerm = signal<string>('');\n readonly suggestionsOpen = signal<boolean>(false);\n readonly suggestions = signal<ISearchSuggestion[]>([]);\n readonly focusedIndex = signal<number>(-1);\n readonly isSearchExpanded = signal<boolean>(false);\n readonly isResponsive = signal<boolean>(\n typeof window !== 'undefined' ? window.innerWidth < 768 : false,\n );\n\n private readonly searchWrapper = viewChild<ElementRef>('searchWrapper');\n private readonly searchInput = viewChild<ElementRef>('searchInput');\n private searchTimeout?: ReturnType<typeof setTimeout>;\n\n constructor() {\n // Track responsive breakpoint (mobile < 768px)\n if (typeof window !== 'undefined') {\n fromEvent(window, 'resize')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.isResponsive.set(window.innerWidth < 768);\n });\n }\n\n // Close dropdown/search on outside click\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n const wrapper = this.searchWrapper()?.nativeElement;\n const target = event.target as HTMLElement;\n\n if (wrapper && !wrapper.contains(target)) {\n if (this.suggestionsOpen()) {\n this.closeSuggestions();\n }\n if (\n this.isSearchExpanded() &&\n (this.layoutService.isTopbar() || this.isResponsive())\n ) {\n this.closeSearch();\n }\n }\n });\n\n // Debounced search for suggestions\n effect(() => {\n const query = this.searchTerm();\n clearTimeout(this.searchTimeout);\n\n if (!this.searchAdapter || !query.trim()) {\n this.suggestions.set([]);\n this.focusedIndex.set(-1);\n return;\n }\n\n this.searchTimeout = setTimeout(() => {\n this.searchAdapter!.getSuggestions(query)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((results) => {\n this.suggestions.set(results);\n this.focusedIndex.set(-1);\n this.suggestionsOpen.set(results.length > 0);\n });\n }, 300);\n });\n }\n\n onFocus(): void {\n if (this.suggestions().length > 0) {\n this.suggestionsOpen.set(true);\n }\n }\n\n handleKeydown(event: KeyboardEvent): void {\n const items = this.suggestions();\n const current = this.focusedIndex();\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.focusedIndex.set(current < items.length - 1 ? current + 1 : 0);\n this.suggestionsOpen.set(items.length > 0);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.focusedIndex.set(current > 0 ? current - 1 : items.length - 1);\n break;\n case 'Escape':\n event.preventDefault();\n this.closeSuggestions();\n break;\n }\n }\n\n handleEnter(): void {\n const current = this.focusedIndex();\n const items = this.suggestions();\n\n if (current >= 0 && current < items.length) {\n this.selectSuggestion(items[current]);\n } else if (items.length > 0) {\n this.selectSuggestion(items[0]);\n } else {\n this.onSearch();\n }\n }\n\n selectSuggestion(item: ISearchSuggestion): void {\n if (item.routerLink) {\n this.router.navigate(item.routerLink);\n }\n this.searchTerm.set('');\n this.closeSuggestions();\n if (this.layoutService.isTopbar() || this.isResponsive()) {\n this.closeSearch();\n }\n }\n\n private closeSuggestions(): void {\n this.suggestionsOpen.set(false);\n this.focusedIndex.set(-1);\n }\n\n toggleSearch(): void {\n this.isSearchExpanded.set(!this.isSearchExpanded());\n if (this.isSearchExpanded()) {\n setTimeout(() => {\n this.searchInput()?.nativeElement?.focus();\n }, 100);\n }\n }\n\n private closeSearch(): void {\n this.isSearchExpanded.set(false);\n this.closeSuggestions();\n }\n\n onSearch(): void {\n const query = this.searchTerm();\n if (this.searchAdapter?.onSearch && query.trim()) {\n this.searchAdapter.onSearch(query);\n }\n }\n}\n","import { DOCUMENT, NgComponentOutlet } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n computed,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterModule } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n LAYOUT_LANGUAGE_SELECTOR,\n LAYOUT_NOTIFICATION_BELL,\n LAYOUT_SEARCH_ADAPTER,\n} from '../interfaces/layout-auth.interface';\nimport { LayoutService } from '../services/public-api';\nimport { AppConfigurator } from './app.configurator';\nimport { AppMenu } from './app.menu';\nimport { AppCompanyBranchSelector } from './top-bar/app.company-branch-selector';\nimport { AppLauncher } from './top-bar/app.launcher';\nimport { AppProfile } from './top-bar/app.profile';\nimport { AppSearchbar } from './top-bar/app.searchbar';\n\ntype ActivePanel = 'config' | null;\n\n@Component({\n selector: 'app-topbar',\n imports: [\n RouterModule,\n StyleClassModule,\n NgComponentOutlet,\n TranslatePipe,\n AppConfigurator,\n AppMenu,\n AppProfile,\n AppCompanyBranchSelector,\n AppLauncher,\n AppSearchbar,\n ],\n template: `<div class=\"layout-topbar\">\n <div\n class=\"layout-topbar-logo-container\"\n [class.layout-topbar-logo-container-desktop]=\"layoutService.isDesktop()\"\n >\n @if (!layoutService.isTopbar() && layoutService.isMobile()) {\n <button\n class=\"layout-menu-button layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.toggle.menu' | translate\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <i class=\"pi pi-bars\"></i>\n </button>\n }\n <a class=\"layout-topbar-logo\" routerLink=\"/\">\n @if (displayLogo()) {\n <img [src]=\"displayLogo()\" [alt]=\"companyName()\" class=\"logo-image\" />\n }\n <span class=\"hidden sm:inline\">{{ companyName() }}</span>\n </a>\n @if (!layoutService.isTopbar() && layoutService.isDesktop()) {\n <button\n class=\"layout-menu-button layout-topbar-action layout-topbar-action-right\"\n [attr.aria-label]=\"'layout.topbar.toggle.menu' | translate\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <i class=\"pi pi-bars\"></i>\n </button>\n }\n </div>\n\n @if (layoutService.isTopbar() && layoutService.isDesktop()) {\n <div\n #navContainer\n class=\"layout-topbar-nav-horizontal\"\n [class.layout-topbar-nav-hidden]=\"\n !layoutService.layoutState().topbarMenuVisible\n \"\n >\n <app-menu />\n </div>\n }\n\n <div class=\"layout-topbar-actions\">\n @if (hasSearchAdapter()) {\n <app-searchbar />\n }\n <div class=\"layout-config-menu\">\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.toggle.dark.mode' | translate\"\n (click)=\"toggleDarkMode()\"\n >\n <i\n class=\"pi\"\n [class.pi-moon]=\"layoutService.isDarkTheme()\"\n [class.pi-sun]=\"!layoutService.isDarkTheme()\"\n ></i>\n </button>\n <div class=\"relative\" #configContainer>\n <button\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"activePanel() === 'config'\"\n [attr.aria-label]=\"'layout.topbar.open.theme.settings' | translate\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel('config')\"\n >\n <i class=\"pi pi-palette\"></i>\n </button>\n <app-configurator />\n </div>\n </div>\n\n <button\n class=\"layout-topbar-menu-button layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.more.options' | translate\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n >\n <i class=\"pi pi-ellipsis-v\"></i>\n </button>\n\n <div class=\"layout-topbar-menu hidden lg:block\">\n <div class=\"layout-topbar-menu-content\">\n @if (layoutService.hasApps()) {\n <app-launcher />\n }\n @if (languageSelectorComponent) {\n <ng-container *ngComponentOutlet=\"languageSelectorComponent\" />\n }\n @if (enableCompanyFeature) {\n <app-company-branch-selector />\n }\n @if (notificationBellComponent) {\n <ng-container *ngComponentOutlet=\"notificationBellComponent\" />\n }\n <app-profile />\n </div>\n </div>\n </div>\n </div>`,\n})\nexport class AppTopbar {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n readonly layoutService = inject(LayoutService);\n readonly notificationBellComponent = inject(LAYOUT_NOTIFICATION_BELL, {\n optional: true,\n });\n readonly languageSelectorComponent = inject(LAYOUT_LANGUAGE_SELECTOR, {\n optional: true,\n });\n private readonly searchAdapter = inject(LAYOUT_SEARCH_ADAPTER, {\n optional: true,\n });\n\n readonly hasSearchAdapter = computed(() => !!this.searchAdapter);\n\n private readonly configContainer =\n viewChild<ElementRef<HTMLElement>>('configContainer');\n private readonly navContainer =\n viewChild<ElementRef<HTMLElement>>('navContainer');\n\n readonly activePanel = signal<ActivePanel>(null);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.activePanel() !== null),\n )\n .subscribe((event) => {\n this.handleOutsideClick(event);\n });\n\n effect(() => {\n const nav = this.navContainer();\n if (nav && this.layoutService.isTopbar()) {\n fromEvent(nav.nativeElement, 'scroll')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.recalculateHoveredSubmenu(nav.nativeElement));\n }\n });\n }\n\n readonly companyName = this.layoutService.companyName;\n readonly displayLogo = this.layoutService.displayLogo;\n\n readonly enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);\n\n toggleDarkMode(): void {\n const currentDarkTheme = this.layoutService.layoutConfig().darkTheme;\n this.layoutService.updateLayoutConfig({ darkTheme: !currentDarkTheme });\n }\n\n togglePanel(panel: ActivePanel): void {\n this.activePanel.update((current) => (current === panel ? null : panel));\n }\n\n private handleOutsideClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n const configEl = this.configContainer()?.nativeElement;\n\n if (configEl && !configEl.contains(target)) {\n this.activePanel.set(null);\n }\n }\n\n private recalculateHoveredSubmenu(navEl: HTMLElement): void {\n const hoveredItems = navEl.querySelectorAll('li:hover');\n hoveredItems.forEach((li) => {\n const link = li.querySelector(':scope > a') as HTMLElement | null;\n if (!link) return;\n const rect = link.getBoundingClientRect();\n const top = rect.bottom + 12;\n const left = rect.left - 12;\n (li as HTMLElement).style.setProperty('--submenu-left', `${left}px`);\n (li as HTMLElement).style.setProperty('--submenu-top', `${top}px`);\n });\n }\n}\n","import { Component } from '@angular/core';\nimport { AppMenu } from './app.menu';\n\n@Component({\n selector: 'app-sidebar',\n imports: [AppMenu],\n template: `\n <div class=\"layout-sidebar\">\n <app-menu />\n </div>\n `,\n})\nexport class AppSidebar {}\n","import { NgClass } from '@angular/common';\nimport { Component, computed, DestroyRef, DOCUMENT, inject, Renderer2 } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AppTopbar } from './app.topbar';\nimport { AppSidebar } from './app.sidebar';\nimport { AppFooter } from './app.footer';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-layout',\n imports: [NgClass, AppTopbar, AppSidebar, RouterModule, AppFooter],\n template: `\n <div class=\"layout-wrapper\" [ngClass]=\"containerClass()\">\n <app-topbar></app-topbar>\n <app-sidebar></app-sidebar>\n <div class=\"layout-main-container\">\n <div class=\"layout-main\">\n <router-outlet></router-outlet>\n </div>\n <app-footer></app-footer>\n </div>\n <div class=\"layout-mask animate-fadein\"></div>\n </div>\n `,\n})\nexport class AppLayout {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n readonly layoutService = inject(LayoutService);\n private readonly renderer = inject(Renderer2);\n private readonly router = inject(Router);\n\n private menuOutsideClickListener: (() => void) | null = null;\n\n constructor() {\n this.layoutService.overlayOpen$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (!this.menuOutsideClickListener) {\n this.menuOutsideClickListener = this.renderer.listen(\n this.document,\n 'click',\n (event) => {\n if (this.isOutsideClicked(event)) {\n this.hideMenu();\n }\n }\n );\n }\n if (this.layoutService.layoutState().staticMenuMobileActive) {\n this.blockBodyScroll();\n }\n });\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => this.hideMenu());\n }\n\n isOutsideClicked(event: MouseEvent): boolean {\n const sidebarEl = this.document.querySelector('.layout-sidebar');\n const topbarEl = this.document.querySelector('.layout-menu-button');\n const topbarNavEl = this.document.querySelector('.layout-topbar-nav');\n const eventTarget = event.target as Node;\n\n return !(\n sidebarEl?.isSameNode(eventTarget) ||\n sidebarEl?.contains(eventTarget) ||\n topbarEl?.isSameNode(eventTarget) ||\n topbarEl?.contains(eventTarget) ||\n topbarNavEl?.isSameNode(eventTarget) ||\n topbarNavEl?.contains(eventTarget)\n );\n }\n\n hideMenu(): void {\n this.layoutService.updateLayoutState({\n overlayMenuActive: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n });\n if (this.menuOutsideClickListener) {\n this.menuOutsideClickListener();\n this.menuOutsideClickListener = null;\n }\n this.unblockBodyScroll();\n }\n\n blockBodyScroll(): void {\n this.document.body.classList.add('blocked-scroll');\n }\n\n unblockBodyScroll(): void {\n this.document.body.classList.remove('blocked-scroll');\n }\n\n readonly containerClass = computed(() => {\n const config = this.layoutService.layoutConfig();\n const state = this.layoutService.layoutState();\n return {\n 'layout-overlay': config.menuMode === 'overlay',\n 'layout-static': config.menuMode === 'static',\n 'layout-topbar-mode': config.menuMode === 'topbar',\n 'layout-static-inactive': state.staticMenuDesktopInactive && config.menuMode === 'static',\n 'layout-overlay-active': state.overlayMenuActive,\n 'layout-mobile-active': state.staticMenuMobileActive,\n 'layout-topbar-nav-hidden': !state.topbarMenuVisible && config.menuMode === 'topbar',\n };\n });\n}\n","\nimport Material from '@primeuix/themes/material';\nimport { definePreset } from '@primeuix/themes';\n\nexport const NavyBlueTheme = definePreset(Material, {\n semantic: {\n colorScheme: {\n light: {\n primary: {\n color: '#3535cd',\n inverseColor: '#0707a9',\n hoverColor: '#0707a9',\n activeColor: '#0707a9',\n },\n highlight: {\n background: '#e2e8f0',\n focusBackground: '#e2e8f0',\n color: '#3535cd',\n focusColor: '#3535cd',\n },\n },\n },\n },\n });","\nimport Material from '@primeuix/themes/material';\nimport { definePreset } from '@primeuix/themes';\n\nexport const GreenTheme = definePreset(Material, {\n semantic: {\n colorScheme: {\n light: {\n primary: {\n color: '#01712c',\n inverseColor: '#119744',\n hoverColor: '#119744',\n activeColor: '#119744',\n },\n highlight: {\n background: '#e2e8f0',\n focusBackground: '#e2e8f0',\n color: '#01712c',\n focusColor: '#01712c',\n },\n },\n },\n },\n});","export const LAYOUT_MESSAGES: Record<string, string> = {\n // components/top-bar/app.profile.ts\n 'layout.profile.title': 'Profile',\n 'layout.profile.profile.picture.alt': 'Profile picture',\n 'layout.profile.copy.sign.up.link': 'Copy SignUp Link',\n 'layout.profile.logout': 'Logout',\n 'layout.profile.guest': 'Guest',\n 'layout.profile.link.copied': 'Link Copied',\n 'layout.profile.sign.up.link.copied': 'Sign Up Link copied.',\n 'layout.profile.failed.copy.sign.up.link': 'Failed to copy signup link.',\n\n // components/top-bar/app.launcher.ts\n 'layout.launcher.apps': 'Apps',\n 'layout.launcher.applications': 'Applications',\n\n // components/top-bar/app.company-branch-selector.ts\n 'layout.company.branch.selector.title': 'Switch Company & Branch',\n 'layout.company.branch.selector.select.company': 'Select Company',\n 'layout.company.branch.selector.branch': 'Branch',\n 'layout.company.branch.selector.select.branch': 'Select Branch',\n 'layout.company.branch.selector.switch.button': 'Switch',\n 'layout.company.branch.selector.no.company': 'No Company',\n 'layout.company.branch.selector.branch.required': 'Branch Required',\n 'layout.company.branch.selector.please.select.branch':\n 'Please select a branch',\n\n // components/top-bar/app.searchbar.ts\n 'layout.topbar.search': 'Search',\n 'layout.topbar.search.placeholder': 'Search for content...',\n\n // components/app.topbar.ts\n 'layout.topbar.toggle.menu': 'Toggle menu',\n 'layout.topbar.toggle.dark.mode': 'Toggle dark mode',\n 'layout.topbar.open.theme.settings': 'Open theme settings',\n 'layout.topbar.more.options': 'More options',\n\n // components/app.configurator.ts\n 'layout.configurator.primary': 'Primary',\n 'layout.configurator.surface': 'Surface',\n 'layout.configurator.presets': 'Presets',\n 'layout.configurator.menu.mode': 'Menu Mode',\n 'layout.configurator.menu.mode.static': 'Static',\n 'layout.configurator.menu.mode.overlay': 'Overlay',\n 'layout.configurator.menu.mode.topbar': 'Topbar',\n\n // components/app.footer.ts\n 'layout.footer.by': 'by',\n\n // app-menu.config.ts (main app menu configuration)\n 'menu.dashboard': 'Dashboard',\n 'menu.administration': 'Administration',\n 'menu.iam': 'IAM',\n 'menu.storage': 'Storage',\n 'menu.forms': 'Forms',\n 'menu.email': 'Email',\n 'menu.event.manager': 'Event Manager',\n 'menu.notifications': 'Notifications',\n 'menu.localization': 'Localization',\n\n // Those are layout part from notification module, but we put them here to avoid circular dependency between layout and notification module\n\n // components/notification-bell/notification-bell.component.ts\n 'notification.title': 'Notifications',\n\n // components/notification-list/notification-list.component.ts\n 'notification.mark.all.read': 'Mark all read',\n 'notification.view.all': 'View all notifications',\n 'notification.empty': 'No notifications',\n\n // components/notification-item/notification-item.component.ts\n 'notification.time.just.now': 'Just now',\n 'notification.time.minutes.ago': '{{count}}m ago',\n 'notification.time.hours.ago': '{{count}}h ago',\n 'notification.time.days.ago': '{{count}}d ago',\n};\n","// Components\nexport * from './components/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Services\nexport * from './services/public-api';\n\n// Utils\nexport * from './utils/public-api';\n\n// Themes\nexport * from './theme/public-api';\n\n// Constants\nexport * from './constants/index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","DOCUMENT","i2","i3","i4","i6","filter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;AACM,SAAU,uBAAuB,CACrC,IAAoB,EACpB,eAAyB,EAAA;AAEzB,IAAA,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,GAAG,KACF,CAAC,GAAG,CAAC,eAAe;QACpB,iBAAiB,CAAC,GAAG,CAAC,eAAe,EAAE,eAAe,CAAC,CAC1D;AACH;;ACVA;;;;;;;;;;;;;;;AAeG;AACG,SAAU,uBAAuB,CACrC,KAAkB,EAClB,cAAwB,EAAA;AAExB,IAAA,OAAO;AACJ,SAAA,GAAG,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC;SAClD,MAAM,CAAC,CAAC,IAAI,KAAwB,IAAI,KAAK,IAAI,CAAC;AACvD;AAEA;;;;;;;AAOG;AACH,SAAS,cAAc,CACrB,IAAe,EACf,cAAwB,EAAA;;AAGxB,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,IAAI,IAAI,CAAC,eAAe,EAAE;QACxB,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC;QACzE,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,IAAI,CAAC;QACd;IACF;;AAGA,IAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QAC7C,MAAM,gBAAgB,GAAG,uBAAuB,CAC9C,IAAI,CAAC,QAAQ,EACb,cAAc,CACf;;AAGD,QAAA,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;AACjC,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE;IAChD;AAEA,IAAA,OAAO,IAAI;AACb;;ACjEA,MAAM,WAAW,GAAG,sBAAsB;AAC1C,MAAM,eAAe,GAAG,CAAC;AAMzB;;;;;;;;;;;;;;;;;AAiBG;MAIU,wBAAwB,CAAA;AAClB,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;IAE9C,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACvC,cAAc,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;AAEjE;;;;;;AAMG;IACH,IAAI,GAAA;QACF,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;AAEhC,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;AAChD,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI;YAExB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA0B;AAC1D,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;QACpC;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;;;;AAKG;AACH,IAAA,IAAI,CAAC,MAAoB,EAAA;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,IAAI;AACF,YAAA,MAAM,OAAO,GAA0B;AACrC,gBAAA,GAAG,MAAM;AACT,gBAAA,QAAQ,EAAE,eAAe;aAC1B;AACD,YAAA,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5D;AAAE,QAAA,MAAM;;QAER;IACF;AAEA;;;AAGG;IACH,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AACrB,QAAA,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC;IACtC;AAEA;;;;;;AAMG;AACK,IAAA,cAAc,CAAC,MAA6B,EAAA;;QAElD,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,eAAe,EAAE;YAC1D,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;AAC/D,YAAA,MAAM,CAAC,MAAM,GAAG,MAAM;QACxB;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AACrE,YAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ;QAC5B;;AAGA,QAAA,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;AACzC,YAAA,MAAM,CAAC,SAAS,GAAG,KAAK;QAC1B;;QAGA,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM;AAC3C,QAAA,OAAO,WAA2B;IACpC;uGA1FW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cAFvB,MAAM,EAAA,CAAA;;2FAEP,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACwBD;MAEa,aAAa,CAAA;AACP,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AAC9C,IAAA,WAAW,GAAG,MAAM,CAAC,wBAAwB,CAAC;IAC9C,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAClD,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAA6B;AAE5F,IAAA,cAAc,GAAiB;AAC9C,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,SAAS,EAAE,KAAK;AAChB,QAAA,QAAQ,EAAE,QAAQ;KACnB;AAEgB,IAAA,aAAa,GAAgB;AAC5C,QAAA,yBAAyB,EAAE,KAAK;AAChC,QAAA,iBAAiB,EAAE,KAAK;AACxB,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,sBAAsB,EAAE,KAAK;AAC7B,QAAA,eAAe,EAAE,KAAK;AACtB,QAAA,iBAAiB,EAAE,IAAI;KACxB;IAEgB,aAAa,GAAG,MAAM,CAAe;QACpD,GAAG,IAAI,CAAC,cAAc;AACtB,QAAA,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AAC3B,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACe,IAAA,YAAY,GAAG,MAAM,CAAc,IAAI,CAAC,aAAa,wDAAC;AACtD,IAAA,mBAAmB,GAAG,MAAM,CAAU,KAAK,+DAAC;AAEpD,IAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;AAC9C,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAC5C,IAAA,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;AAElD,IAAA,YAAY,GAAG,MAAM,CAAqB,IAAI,wDAAC;AAC/C,IAAA,eAAe,GAAG,MAAM,CAAwB,IAAI,2DAAC;AACrD,IAAA,QAAQ,GAAG,MAAM,CAAc,EAAE,oDAAC;AAClC,IAAA,QAAQ,GAAG,MAAM,CAAiB,EAAE,oDAAC;AACrC,IAAA,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,CAAC;AAEhE,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAC5C,IAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;;IAGlD,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,gBAAgB;IACrD,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,EAAE;AACvC,IAAA,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,IAAI,cAAc,CAAC,IAAI;AAChE,IAAA,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,GAAG;;IAG7D,IAAI,GAAG,QAAQ,CAAC,MACvB,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACjF;IACQ,IAAI,GAAG,QAAQ,CAAC,MACvB,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACjF;AACQ,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,mDAAC;;IAGhD,eAAe,GAAG,QAAQ,CACjC,MACE,IAAI,CAAC,YAAY,EAAE,CAAC,iBAAiB;AACrC,QAAA,IAAI,CAAC,YAAY,EAAE,CAAC,sBAAsB,2DAC7C;AACQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,SAAS,uDAAC;AAC5D,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,sDAAC;AACzD,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,sDAAC;AACzD,IAAA,SAAS,GAAG,QAAQ,CAC3B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,KAAK,SAAS,qDAClD;AACQ,IAAA,QAAQ,GAAG,QAAQ,CAC1B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,KAAK,QAAQ,oDACjD;;IAGQ,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,sBAAsB,CAAC,IAAI,OAAO,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAC3H,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI,EAAE,qDAAC;AAC5D,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,iBAAiB,IAAI,IAAI,iEAAC;AACtF,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,IAAI,IAAI,0DAAC;AACxE,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,2DAAC;AACvD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC,OAAO;QACpF,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,OAAO;AACrD,IAAA,CAAC,uDAAC;AACO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,OAAO,uDAAC;;AAG3D,IAAA,YAAY,GAAG,IAAI,OAAO,EAAgB;AAC1C,IAAA,WAAW,GAAG,IAAI,OAAO,EAAQ;AACjC,IAAA,UAAU,GAAG,IAAI,OAAO,EAAmB;AAC3C,IAAA,WAAW,GAAG,IAAI,OAAO,EAAW;AAE5C,IAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;AAC5C,IAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;AAC9C,IAAA,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;AAChD,IAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;IAE/C,WAAW,GAAG,KAAK;AAE3B,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;AAE9B,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,gBAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;AACrC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/B;AACA,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACzB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,cAAc,CAAC,MAAqB,EAAA;AAClC,QAAA,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS;AACzD,QAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IACpE;AAEQ,IAAA,wBAAwB,CAAC,MAAoB,EAAA;AACnD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAsC;QACvD,IAAI,qBAAqB,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,mBAAmB,KAAK,UAAU,EAAE;YACjF;iBACG,mBAAmB,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;iBACrD,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE;AACvC,iBAAA,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;QACpB;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;YAC3B,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvD;IAEA,YAAY,GAAA;AACV,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;;QAGjC,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACvC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM;AAClC,gBAAA,GAAG,IAAI;AACP,gBAAA,iBAAiB,EAAE,CAAC,IAAI,CAAC,iBAAiB;AAC3C,aAAA,CAAC,CAAC;YACH;QACF;;AAGA,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AACrB,YAAA,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,sBAAsB;YACrD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,sBAAsB,EAAE,eAAe,EAAE,CAAC,CAAC;AAC1F,YAAA,IAAI,eAAe;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;YAC5C;QACF;;AAGA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC,iBAAiB;YACjD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACtF,YAAA,IAAI,gBAAgB;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;QAC/C;aAAO;YACL,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM;AAClC,gBAAA,GAAG,IAAI;AACP,gBAAA,yBAAyB,EAAE,CAAC,KAAK,CAAC,yBAAyB;AAC5D,aAAA,CAAC,CAAC;QACL;IACF;IAEA,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,GAAG,GAAG,GAAG,IAAI;IACxD;IAEA,QAAQ,GAAA;AACN,QAAA,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;IAC1B;AAEA,IAAA,iBAAiB,CAAC,KAAsB,EAAA;AACtC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;;AAGA,IAAA,kBAAkB,CAAC,MAA6B,EAAA;QAC9C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC/D;AAEA,IAAA,iBAAiB,CAAC,KAA2B,EAAA;QAC3C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC7D;;AAGA,IAAA,cAAc,CAAC,OAA2B,EAAA;AACxC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;IAChC;AAEA,IAAA,iBAAiB,CAAC,OAA8B,EAAA;AAC9C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;IACnC;;AAGA,IAAA,OAAO,CAAC,KAAkB,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IACvB;AAEA,IAAA,OAAO,CAAC,IAAoB,EAAA;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IACvB;uGA3NW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;2FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCjCrB,SAAS,CAAA;AACH,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAE7C,IAAA,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO;AACpC,IAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO;AACxC,IAAA,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU;AAC1C,IAAA,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS;uGANtC,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhBV,CAAA;;;;;;;;;;;;;;AAcH,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAfG,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAiBZ,SAAS,EAAA,UAAA,EAAA,CAAA;kBAnBrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;oBACtB,OAAO,EAAE,CAAC,aAAa,CAAC;AACxB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;AAcH,QAAA,CAAA;AACR,iBAAA;;;ACVD,MAAM,OAAO,GAAG;IACd,IAAI;IACJ,IAAI;IACJ,IAAI;CACI;MAuFG,eAAe,CAAA;AACT,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACvB,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACxE,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAErC,IAAA,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;AAC9B,IAAA,kBAAkB,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,8DAAC;AAC9D,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACvC,QAAA,MAAM,OAAO,GAAqE;AAChF,YAAA,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,sCAAsC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;AAClF,YAAA,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,uCAAuC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;SACrF;;AAED,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE;AAClC,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,sCAAsC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAClG;AACA,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC,2DAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,eAAe,CAAC,MAAK;AACnB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,MAAM,IAAI,MAAM;AACjE,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAC7B,QAAA,CAAC,CAAC;IACJ;AAES,IAAA,QAAQ,GAAmB;AAClC,QAAA;AACE,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,OAAO,EAAE;AACP,gBAAA,CAAC,EAAE,SAAS;AACZ,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACf,aAAA;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,OAAO,EAAE;AACP,gBAAA,CAAC,EAAE,SAAS;AACZ,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACf,aAAA;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,OAAO,EAAE;AACP,gBAAA,CAAC,EAAE,SAAS;AACZ,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACf,aAAA;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,OAAO,EAAE;AACP,gBAAA,CAAC,EAAE,SAAS;AACZ,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACf,aAAA;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,OAAO,EAAE;AACP,gBAAA,CAAC,EAAE,SAAS;AACZ,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACf,aAAA;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,OAAO,EAAE;AACP,gBAAA,CAAC,EAAE,SAAS;AACZ,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACf,aAAA;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,OAAO,EAAE;AACP,gBAAA,CAAC,EAAE,SAAS;AACZ,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACf,aAAA;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,OAAO,EAAE;AACP,gBAAA,CAAC,EAAE,SAAS;AACZ,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,GAAG,EAAE,SAAS;AACf,aAAA;AACF,SAAA;KACF;AAEQ,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;QAC5C,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,OAAO;AAClD,IAAA,CAAC,gEAAC;AAEO,IAAA,oBAAoB,GAAG,QAAQ,CACtC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,OAAO,gEAChD;AAED,IAAA,iBAAiB,CAAC,WAA+B,EAAA;AAC/C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,EAAE;QACnD,IAAI,eAAe,EAAE;YACnB,OAAO,eAAe,KAAK,WAAW;QACxC;;AAEA,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;cACrC,WAAW,KAAK;AAClB,cAAE,WAAW,KAAK,OAAO;IAC7B;AAES,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,MAAM,0DAAC;AAEzE,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,QAAQ,oDAAC;AAErE,IAAA,aAAa,GAAG,QAAQ,CAAiB,MAAK;AACrD,QAAA,MAAM,aAAa,GACjB,OAAO,CACL,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,MAAmC,CACtE,CAAC,SAAS;AACb,QAAA,MAAM,MAAM,GAAG;YACb,SAAS;YACT,OAAO;YACP,MAAM;YACN,QAAQ;YACR,OAAO;YACP,QAAQ;YACR,MAAM;YACN,MAAM;YACN,KAAK;YACL,MAAM;YACN,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR,SAAS;YACT,MAAM;YACN,MAAM;SACP;AACD,QAAA,MAAM,QAAQ,GAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAEhE,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YACvB,QAAQ,CAAC,IAAI,CAAC;AACZ,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,OAAO,EAAE,aAAa,GACpB,KAAwC,CACd;AAC7B,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,QAAQ;AACjB,IAAA,CAAC,yDAAC;IAEF,YAAY,GAAA;QACV,MAAM,KAAK,GACT,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CACvB,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAC9C,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,MAAM;AAEvD,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;YACzB,OAAO;AACL,gBAAA,QAAQ,EAAE;AACR,oBAAA,OAAO,EAAE;AACP,wBAAA,EAAE,EAAE,cAAc;AAClB,wBAAA,GAAG,EAAE,eAAe;AACpB,wBAAA,GAAG,EAAE,eAAe;AACpB,wBAAA,GAAG,EAAE,eAAe;AACpB,wBAAA,GAAG,EAAE,eAAe;AACpB,wBAAA,GAAG,EAAE,eAAe;AACpB,wBAAA,GAAG,EAAE,eAAe;AACpB,wBAAA,GAAG,EAAE,eAAe;AACpB,wBAAA,GAAG,EAAE,eAAe;AACpB,wBAAA,GAAG,EAAE,eAAe;AACpB,wBAAA,GAAG,EAAE,eAAe;AACrB,qBAAA;AACD,oBAAA,WAAW,EAAE;AACX,wBAAA,KAAK,EAAE;AACL,4BAAA,OAAO,EAAE;AACP,gCAAA,KAAK,EAAE,eAAe;AACtB,gCAAA,aAAa,EAAE,SAAS;AACxB,gCAAA,UAAU,EAAE,eAAe;AAC3B,gCAAA,WAAW,EAAE,eAAe;AAC7B,6BAAA;AACD,4BAAA,SAAS,EAAE;AACT,gCAAA,UAAU,EAAE,eAAe;AAC3B,gCAAA,eAAe,EAAE,eAAe;AAChC,gCAAA,KAAK,EAAE,SAAS;AAChB,gCAAA,UAAU,EAAE,SAAS;AACtB,6BAAA;AACF,yBAAA;AACD,wBAAA,IAAI,EAAE;AACJ,4BAAA,OAAO,EAAE;AACP,gCAAA,KAAK,EAAE,cAAc;AACrB,gCAAA,aAAa,EAAE,eAAe;AAC9B,gCAAA,UAAU,EAAE,eAAe;AAC3B,gCAAA,WAAW,EAAE,eAAe;AAC7B,6BAAA;AACD,4BAAA,SAAS,EAAE;AACT,gCAAA,UAAU,EAAE,cAAc;AAC1B,gCAAA,eAAe,EAAE,eAAe;AAChC,gCAAA,KAAK,EAAE,eAAe;AACtB,gCAAA,UAAU,EAAE,eAAe;AAC5B,6BAAA;AACF,yBAAA;AACF,qBAAA;AACF,iBAAA;aACF;QACH;aAAO;AACL,YAAA,IAAI,MAAM,KAAK,MAAM,EAAE;gBACrB,OAAO;AACL,oBAAA,QAAQ,EAAE;wBACR,OAAO,EAAE,KAAK,CAAC,OAAO;AACtB,wBAAA,WAAW,EAAE;AACX,4BAAA,KAAK,EAAE;AACL,gCAAA,OAAO,EAAE;AACP,oCAAA,KAAK,EAAE,eAAe;AACtB,oCAAA,aAAa,EAAE,SAAS;AACxB,oCAAA,UAAU,EAAE,eAAe;AAC3B,oCAAA,WAAW,EAAE,eAAe;AAC7B,iCAAA;AACD,gCAAA,SAAS,EAAE;AACT,oCAAA,UAAU,EAAE,eAAe;AAC3B,oCAAA,eAAe,EAAE,eAAe;AAChC,oCAAA,KAAK,EAAE,SAAS;AAChB,oCAAA,UAAU,EAAE,SAAS;AACtB,iCAAA;AACF,6BAAA;AACD,4BAAA,IAAI,EAAE;AACJ,gCAAA,OAAO,EAAE;AACP,oCAAA,KAAK,EAAE,eAAe;AACtB,oCAAA,aAAa,EAAE,eAAe;AAC9B,oCAAA,UAAU,EAAE,eAAe;AAC3B,oCAAA,WAAW,EAAE,eAAe;AAC7B,iCAAA;AACD,gCAAA,SAAS,EAAE;AACT,oCAAA,UAAU,EAAE,eAAe;AAC3B,oCAAA,eAAe,EAAE,eAAe;AAChC,oCAAA,KAAK,EAAE,eAAe;AACtB,oCAAA,UAAU,EAAE,eAAe;AAC5B,iCAAA;AACF,6BAAA;AACF,yBAAA;AACF,qBAAA;iBACF;YACH;iBAAO;gBACL,OAAO;AACL,oBAAA,QAAQ,EAAE;wBACR,OAAO,EAAE,KAAK,CAAC,OAAO;AACtB,wBAAA,WAAW,EAAE;AACX,4BAAA,KAAK,EAAE;AACL,gCAAA,OAAO,EAAE;AACP,oCAAA,KAAK,EAAE,eAAe;AACtB,oCAAA,aAAa,EAAE,SAAS;AACxB,oCAAA,UAAU,EAAE,eAAe;AAC3B,oCAAA,WAAW,EAAE,eAAe;AAC7B,iCAAA;AACD,gCAAA,SAAS,EAAE;AACT,oCAAA,UAAU,EAAE,cAAc;AAC1B,oCAAA,eAAe,EAAE,eAAe;AAChC,oCAAA,KAAK,EAAE,eAAe;AACtB,oCAAA,UAAU,EAAE,eAAe;AAC5B,iCAAA;AACF,6BAAA;AACD,4BAAA,IAAI,EAAE;AACJ,gCAAA,OAAO,EAAE;AACP,oCAAA,KAAK,EAAE,eAAe;AACtB,oCAAA,aAAa,EAAE,eAAe;AAC9B,oCAAA,UAAU,EAAE,eAAe;AAC3B,oCAAA,WAAW,EAAE,eAAe;AAC7B,iCAAA;AACD,gCAAA,SAAS,EAAE;AACT,oCAAA,UAAU,EACR,oDAAoD;AACtD,oCAAA,eAAe,EACb,oDAAoD;AACtD,oCAAA,KAAK,EAAE,uBAAuB;AAC9B,oCAAA,UAAU,EAAE,uBAAuB;AACpC,iCAAA;AACF,6BAAA;AACF,yBAAA;AACF,qBAAA;iBACF;YACH;QACF;IACF;AAEA,IAAA,YAAY,CAAC,KAAiB,EAAE,IAAY,EAAE,KAAmB,EAAA;AAC/D,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAChE;AAAO,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAChE;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;QAE5B,KAAK,CAAC,eAAe,EAAE;IACzB;IAEA,UAAU,CAAC,IAAY,EAAE,KAAmB,EAAA;AAC1C,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC;AAAO,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC;QACrC;IACF;AAEA,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACxD,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,KAAkC,CAAC;;AAE1D,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACnD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS,GAAG,MAAM,GAAG,OAAO;QACrF,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,eAAe,IAAI,cAAc,CAAC,CACtD,EAAE,OAAO;AACV,QAAA,EAAE;aACC,MAAM,CAAC,MAAM;AACb,aAAA,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE;aAC1B,cAAc,CAAC,cAAc;AAC7B,aAAA,GAAG,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACrC;AAEA,IAAA,gBAAgB,CAAC,KAAsC,EAAA;QACrD,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC5D;AAEQ,IAAA,SAAS,CAAC,GAAW,EAAA;QAC3B,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG;IACrD;uGAjZW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,gEAAA,EAAA,cAAA,EAAA,yNAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9DhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDP,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAxDO,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA+D7C,eAAe,EAAA,UAAA,EAAA,CAAA;kBAjE3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,OAAO,EAAE,CAAC,WAAW,EAAE,kBAAkB,EAAE,aAAa,CAAC;AACzD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDP,IAAA,CAAA;AACH,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EACH,yNAAyN;AAC3N,wBAAA,KAAK,EAAE,gEAAgE;AACxE,qBAAA;AACF,iBAAA;;;MClCY,iBAAiB,GAAG,IAAI,cAAc,CACjD,mBAAmB;MAGR,eAAe,GAAG,IAAI,cAAc,CAC/C,iBAAiB;MAGN,wBAAwB,GAAG,IAAI,cAAc,CACxD,0BAA0B;MAGf,wBAAwB,GAAG,IAAI,cAAc,CACxD,0BAA0B;MAGf,8BAA8B,GAAG,IAAI,cAAc,CAC9D,gCAAgC;MAGrB,gBAAgB,GAAG,IAAI,cAAc,CAChD,kBAAkB;MAGP,aAAa,GAAG,IAAI,cAAc,CAC7C,eAAe;MAeJ,qBAAqB,GAAG,IAAI,cAAc,CACrD,uBAAuB;;MC5CZ,uBAAuB,CAAA;AACjB,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7C,IAAA,qBAAqB,GAAG,MAAM,CAAC,8BAA8B,EAAE;AACtE,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAC7B,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS,uDAClD;IAED,cAAc,GAAA;QACZ,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS;AACpE,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACzE;uGAbW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtDxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA3CS,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,oUAAE,eAAe,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,CAAA;;2FAuDjE,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAzDnC,SAAS;+BACE,2BAA2B,EAAA,OAAA,EAC5B,CAAC,iBAAiB,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAA,QAAA,EACnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wHAAA,CAAA,EAAA;;;MCyDU,WAAW,CAAA;;AAEb,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAa;AAClC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAU;AAChC,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;;AAGrB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC/B,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAG/B,IAAA,UAAU,GACzB,SAAS,CAA0B,YAAY,sDAAC;;AAGjC,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,mDAAC;AAC/B,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;;AAGlC,IAAA,GAAG,GAAG,QAAQ,CAAC,MAAK;AAC3B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;QAC/B,OAAO,MAAM,GAAG,GAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACpE,IAAA,CAAC,+CAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5B,QAAA,OAAO,QAAQ,CAAC,UAAU,IAAI,EAAE;AAClC,IAAA,CAAC,sDAAC;;AAGO,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,OAAO,GAAG,QAAQ;QACvD,OAAO;AACL,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,QAAQ,EAAE,SAAS;SACX;AACZ,IAAA,CAAC,mEAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,IAAI,CAAC,aAAa,CAAC;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAK;AAC9B,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;AAC7B,gBAAA,IAAI,KAAK,CAAC,UAAU,EAAE;oBACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CACd,KAAK,CAAC,GAAG,KAAK,UAAU;wBACtB,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC,CAC1C;gBACH;AAAO,qBAAA,IACL,KAAK,CAAC,GAAG,KAAK,UAAU;oBACxB,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC,EACxC;AACA,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACzB;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;;QAGJ,IAAI,CAAC,aAAa,CAAC;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;QAG3C,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC,EACjD,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAEpC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE;gBAC1B,IAAI,CAAC,0BAA0B,EAAE;YACnC;AACF,QAAA,CAAC,CAAC;;QAGJ,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5B,YAAA,IAAI,QAAQ,CAAC,UAAU,EAAE;gBACvB,IAAI,CAAC,0BAA0B,EAAE;YACnC;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACtC,gBAAA,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC5D;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;YACzD,IAAI,CAAC,qBAAqB,EAAE;QAC9B;IACF;IAEQ,qBAAqB,GAAA;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa;QAC/C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,qBAAqB,KAAK,UAAU;YAAE;AAEnE,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAC/C,QAAA,IAAI,CAAC,MAAM;YAAE;;AAGb,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QAEzB,MAAsB,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAA,EAAG,IAAI,CAAA,EAAA,CAAI,CAAC;QACvE,MAAsB,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAA,EAAG,GAAG,CAAA,EAAA,CAAI,CAAC;IACxE;IAEQ,0BAA0B,GAAA;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;;;AAIlB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,OAAO,GAAG,QAAQ;AAEvD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;AAC7C,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,QAAQ,EAAE,SAAS;AACpB,SAAA,CAAC;QAEF,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC;AACnC,gBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;AACf,gBAAA,UAAU,EAAE,IAAI;AACjB,aAAA,CAAC;QACJ;IACF;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE;AAC1D,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;QACtC;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC3D;uGAlJW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxFZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuET,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAiBU,WAAW,mGAzFZ,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,2FAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAyFvD,WAAW,EAAA,UAAA,EAAA,CAAA;kBA3FvB,SAAS;+BACE,gBAAgB,EAAA,OAAA,EACjB,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC,EAAA,QAAA,EACzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuET,EAAA,IAAA,EAaK;AACJ,wBAAA,yBAAyB,EAAE,UAAU;AACtC,qBAAA,EAAA,MAAA,EAAA,CAAA,qKAAA,CAAA,EAAA;oXAeoC,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACrHnD;;;;AAIG;MAgBU,OAAO,CAAA;AACD,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAEtD;;;;;AAKG;AACM,IAAA,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI;uGATjC,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAZR,CAAA;;;;;;;;;;SAUH,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAXG,WAAW,kGAAE,YAAY,EAAA,CAAA,EAAA,CAAA;;2FAaxB,OAAO,EAAA,UAAA,EAAA,CAAA;kBAfnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,OAAO,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;AACpC,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;AAUH,QAAA,CAAA;AACR,iBAAA;;;ACzBD;;;AAGG;;ACqBH;MA8Fa,wBAAwB,CAAA;AAClB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/B,SAAS,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzD,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACrD,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,EAAE;AAC5D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACe,IAAA,QAAQ,GAAG,MAAM,CAACC,UAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAE/B,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;AACjC,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAE/C,IAAA,WAAA,GAAA;AACE,QAAA,SAAS,CAAa,IAAI,CAAC,QAAQ,EAAE,OAAO;AACzC,aAAA,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnC,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAE9B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACnD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;IACN;AAES,IAAA,kBAAkB,GAAG,QAAQ,CACpC,MACE,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,EAAE,IAAI;AAC1C,QAAA,IAAI,CAAC,SAAS,CAAC,2CAA2C,CAAC,8DAC9D;AACQ,IAAA,iBAAiB,GAAG,QAAQ,CACnC,MAAM,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,IAAI,IAAI,IAAI,6DACxD;AAEgB,IAAA,UAAU,GAAG,MAAM,CAAiB,EAAE,sDAAC;AAC/C,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AAChC,IAAA,SAAS,GAAG,MAAM,CAAgB,EAAE,qDAAC;AAC7C,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAC9B,IAAA,kBAAkB,GAAG,MAAM,CAAgB,IAAI,8DAAC;AACxD,IAAA,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE;AAChD,IAAA,iBAAiB,GAAG,MAAM,CAAgB,IAAI,6DAAC;AACvD,IAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE;AAC9C,IAAA,mBAAmB,GAAG,MAAM,CAAC,KAAK,+DAAC;AAC3C,IAAA,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;AAClD,IAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,8DAAC;AAC1C,IAAA,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE;AAChD,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AACpC,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAE5C,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAChD,QAAA,IAAI,CAAC,eAAe;AAAE,YAAA,OAAO,KAAK;QAElC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,EAAE,EAAE;QACjE,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE;AAC/D,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAE9C,QACE,eAAe,KAAK,gBAAgB,IAAI,cAAc,KAAK,eAAe;AAE9E,IAAA,CAAC,qDAAC;IAEF,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAChC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;YACpD,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;IAEQ,aAAa,GAAA;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAEnB,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC;AACF,aAAA,gBAAgB;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,SAAS,KAAI;AAClB,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC,CAAC;YACD,KAAK,EAAE,MAAK;;AAEV,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC,CAAC;AACF,SAAA,CAAC;IACN;AAEA,IAAA,eAAe,CAAC,SAAwB,EAAA;AACtC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;QAEtC,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAChC;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;IAC9B;AAEA,IAAA,cAAc,CAAC,QAAuB,EAAA;AACpC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtC;AAEQ,IAAA,YAAY,CAAC,SAAiB,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAEnB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAEhC,QAAA,IAAI,CAAC;aACF,kBAAkB,CAAC,SAAS;AAC5B,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGlC,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,oBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C;YACF,CAAC;YACD,KAAK,EAAE,MAAK;;AAEV,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,CAAC;AACF,SAAA,CAAC;IACN;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAChD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAE9C,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,eAAe;YAAE;AAEvC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE;AACjD,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,MAAM;AAChB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CACrB,gDAAgD,CACjD;AACD,gBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CACpB,qDAAqD,CACtD;AACF,aAAA,CAAC;YACF;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAE3B,QAAA,IAAI,CAAC;AACF,aAAA,aAAa,CAAC,eAAe,EAAE,cAAc,IAAI,EAAE;AACnD,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,MAAK,EAAE,CAAC;YACd,KAAK,EAAE,MAAK;;AAEV,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC9B,CAAC;AACF,SAAA,CAAC;IACN;AAEQ,IAAA,SAAS,CAAC,GAAW,EAAA;QAC3B,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG;IACrD;uGAxKW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnFzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiFT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAxFC,aAAa,8VACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,qgCACZ,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAsFJ,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA7FpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,6BAA6B;AACvC,oBAAA,OAAO,EAAE;wBACP,aAAa;wBACb,gBAAgB;wBAChB,YAAY;wBACZ,YAAY;wBACZ,aAAa;AACd,qBAAA;AACD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;AAC3B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiFT,EAAA,CAAA;AACF,iBAAA;;;MC9CY,WAAW,CAAA;AACL,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAACF,UAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACvC,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAE7B,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;AACjC,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAE/C,IAAA,WAAA,GAAA;AACE,QAAA,SAAS,CAAa,IAAI,CAAC,QAAQ,EAAE,OAAO;AACzC,aAAA,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnC,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;AAE/B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACnD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;IACN;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC;uGAzBW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApDZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApDS,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAsD7C,WAAW,EAAA,UAAA,EAAA,CAAA;kBAxDvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,OAAO,EAAE,CAAC,gBAAgB,EAAE,aAAa,EAAE,aAAa,CAAC;AACzD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;AAC3B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDT,EAAA,CAAA;AACF,iBAAA;;;MCmCY,UAAU,CAAA;AACJ,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/B,SAAS,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzD,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACrD,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,EAAE;AAC5D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;IACe,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClD,IAAA,QAAQ,GAAG,MAAM,CAACC,UAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAE/B,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;AACjC,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAE/C,IAAA,WAAA,GAAA;AACE,QAAA,SAAS,CAAa,IAAI,CAAC,QAAQ,EAAE,OAAO;AACzC,aAAA,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnC,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAE9B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACnD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;IACN;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC;AAES,IAAA,QAAQ,GAAG,QAAQ,CAC1B,MACE,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,IAAI;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,oDACzC;AACQ,IAAA,SAAS,GAAG,QAAQ,CAC3B,MAAM,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,KAAK,IAAI,EAAE,qDACnD;AACQ,IAAA,cAAc,GAAG,QAAQ,CAChC,MAAM,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,IAAI,EAAE,0DACvD;IACQ,aAAa,GAAG,QAAQ,CAAC,MAChC,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACzD;IAED,MAAM,GAAA;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAEnB,QAAA,IAAI,CAAC;AACF,aAAA,MAAM;AACN,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,MAAM,KAAI;gBACf,MAAM,CAAC,GAAG,MAIT;AACD,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;oBACzC,MAAM,EAAE,CAAC,EAAE;AACT,0BAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,gBAAgB;AACjD,2BAAG,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;AACvB,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC;YACpC,CAAC;YACD,KAAK,EAAE,MAAK;;YAEZ,CAAC;AACF,SAAA,CAAC;IACN;IAEA,cAAc,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,EAAE,IAAI,IAAI,EAAE;QAC7D,MAAM,UAAU,GAAG,CAAA,EAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAE;AAChF,QAAA,SAAS,CAAC;aACP,SAAS,CAAC,UAAU;aACpB,IAAI,CAAC,MAAK;AACT,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,4BAA4B,CAAC;AACrD,gBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,oCAAoC,CAAC;AAC7D,aAAA,CAAC;AACJ,QAAA,CAAC;aACA,KAAK,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;AACvC,gBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,yCAAyC,CAAC;AAClE,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACN;IAEQ,SAAS,CACf,GAAW,EACX,IAAsC,EAAA;AAEtC,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG;IAC3D;uGAvGW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3EX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA3ES,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA6E7C,UAAU,EAAA,UAAA,EAAA,CAAA;kBA/EtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,gBAAgB,EAAE,aAAa,CAAC;AACzD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;AAC3B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyET,EAAA,CAAA;AACF,iBAAA;;;MC6LY,YAAY,CAAA;AACd,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,aAAa,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAC7D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACe,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAACF,UAAQ,CAAC;AAEnC,IAAA,UAAU,GAAG,MAAM,CAAS,EAAE,sDAAC;AAC/B,IAAA,eAAe,GAAG,MAAM,CAAU,KAAK,2DAAC;AACxC,IAAA,WAAW,GAAG,MAAM,CAAsB,EAAE,uDAAC;AAC7C,IAAA,YAAY,GAAG,MAAM,CAAS,CAAC,CAAC,wDAAC;AACjC,IAAA,gBAAgB,GAAG,MAAM,CAAU,KAAK,4DAAC;IACzC,YAAY,GAAG,MAAM,CAC5B,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,CAAC,UAAU,GAAG,GAAG,GAAG,KAAK,wDAChE;AAEgB,IAAA,aAAa,GAAG,SAAS,CAAa,eAAe,yDAAC;AACtD,IAAA,WAAW,GAAG,SAAS,CAAa,aAAa,uDAAC;AAC3D,IAAA,aAAa;AAErB,IAAA,WAAA,GAAA;;AAEE,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AACjC,YAAA,SAAS,CAAC,MAAM,EAAE,QAAQ;AACvB,iBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;iBACxC,SAAS,CAAC,MAAK;gBACd,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;AAChD,YAAA,CAAC,CAAC;QACN;;AAGA,QAAA,SAAS,CAAa,IAAI,CAAC,QAAQ,EAAE,OAAO;AACzC,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa;AACnD,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;YAE1C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACxC,gBAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;oBAC1B,IAAI,CAAC,gBAAgB,EAAE;gBACzB;gBACA,IACE,IAAI,CAAC,gBAAgB,EAAE;AACvB,qBAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,EACtD;oBACA,IAAI,CAAC,WAAW,EAAE;gBACpB;YACF;AACF,QAAA,CAAC,CAAC;;QAGJ,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;YAEhC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;AACxC,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzB;YACF;AAEA,YAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAK;AACnC,gBAAA,IAAI,CAAC,aAAc,CAAC,cAAc,CAAC,KAAK;AACrC,qBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,qBAAA,SAAS,CAAC,CAAC,OAAO,KAAI;AACrB,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;oBAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACzB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9C,gBAAA,CAAC,CAAC;YACN,CAAC,EAAE,GAAG,CAAC;AACT,QAAA,CAAC,CAAC;IACJ;IAEA,OAAO,GAAA;QACL,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC;IACF;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AAEnC,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC1C;AACF,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnE;AACF,YAAA,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,gBAAgB,EAAE;gBACvB;;IAEN;IAEA,WAAW,GAAA;AACT,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;QAEhC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE;YAC1C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC;AAAO,aAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC;aAAO;YACL,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;AAEA,IAAA,gBAAgB,CAAC,IAAuB,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QACvC;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACxD,IAAI,CAAC,WAAW,EAAE;QACpB;IACF;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACnD,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;YAC3B,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;YAC5C,CAAC,EAAE,GAAG,CAAC;QACT;IACF;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;QAC/B,IAAI,IAAI,CAAC,aAAa,EAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;AAChD,YAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpC;IACF;uGAtJW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9Qb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2GT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gyEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA5GS,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,wCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA+QxC,YAAY,EAAA,UAAA,EAAA,CAAA;kBAjRxB,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,aAAa,EAAE,WAAW,EAAE,aAAa,CAAC,EAAA,QAAA,EAC1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2GT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,gyEAAA,CAAA,EAAA;AAqLsD,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,eAAe,qEACjB,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MCzJvD,SAAS,CAAA;AACH,IAAA,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;AAC9B,IAAA,QAAQ,GAAG,MAAM,CAACJ,UAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACvC,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,yBAAyB,GAAG,MAAM,CAAC,wBAAwB,EAAE;AACpE,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACO,IAAA,yBAAyB,GAAG,MAAM,CAAC,wBAAwB,EAAE;AACpE,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACe,IAAA,aAAa,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAC7D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AAEO,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAE/C,IAAA,eAAe,GAC9B,SAAS,CAA0B,iBAAiB,2DAAC;AACtC,IAAA,YAAY,GAC3B,SAAS,CAA0B,cAAc,wDAAC;AAE3C,IAAA,WAAW,GAAG,MAAM,CAAc,IAAI,uDAAC;AAEhD,IAAA,WAAA,GAAA;AACE,QAAA,SAAS,CAAa,IAAI,CAAC,QAAQ,EAAE,OAAO;aACzC,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnC,MAAM,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC;AAE1C,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAChC,QAAA,CAAC,CAAC;QAEJ,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;YAC/B,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE;AACxC,gBAAA,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ;AAClC,qBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,qBAAA,SAAS,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvE;AACF,QAAA,CAAC,CAAC;IACJ;AAES,IAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW;AAC5C,IAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW;AAE5C,IAAA,oBAAoB,GAAG,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC;IAEvE,cAAc,GAAA;QACZ,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS;AACpE,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACzE;AAEA,IAAA,WAAW,CAAC,KAAkB,EAAA;QAC5B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,OAAO,KAAK,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC;IAC1E;AAEQ,IAAA,kBAAkB,CAAC,KAAiB,EAAA;AAC1C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa;QAEtD,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC5B;IACF;AAEQ,IAAA,yBAAyB,CAAC,KAAkB,EAAA;QAClD,MAAM,YAAY,GAAG,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC;AACvD,QAAA,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;YAC1B,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC,YAAY,CAAuB;AACjE,YAAA,IAAI,CAAC,IAAI;gBAAE;AACX,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACzC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE;AAC5B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;YAC1B,EAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAA,EAAG,IAAI,CAAA,EAAA,CAAI,CAAC;YACnE,EAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAA,EAAG,GAAG,CAAA,EAAA,CAAI,CAAC;AACpE,QAAA,CAAC,CAAC;IACJ;uGA9EW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhHV,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8GH,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzHL,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,gBAAgB,oUAChB,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEjB,eAAe,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,UAAU,wDACV,wBAAwB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,WAAW,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,YAAY,qDANZ,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAwHJ,SAAS,EAAA,UAAA,EAAA,CAAA;kBA9HrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,gBAAgB;wBAChB,iBAAiB;wBACjB,aAAa;wBACb,eAAe;wBACf,OAAO;wBACP,UAAU;wBACV,wBAAwB;wBACxB,WAAW;wBACX,YAAY;AACb,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8GH,QAAA,CAAA;AACR,iBAAA;AAmBsC,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,iBAAiB,sEAEjB,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MCvKxC,UAAU,CAAA;uGAAV,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EANX;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EALS,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA;;2FAON,UAAU,EAAA,UAAA,EAAA,CAAA;kBATtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;oBACvB,OAAO,EAAE,CAAC,OAAO,CAAC;AAClB,oBAAA,QAAQ,EAAE;;;;AAIT,EAAA,CAAA;AACF,iBAAA;;;MCgBY,SAAS,CAAA;AACH,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACnC,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7B,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAEhC,wBAAwB,GAAwB,IAAI;AAE5D,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,aAAa,CAAC;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAClC,gBAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClD,IAAI,CAAC,QAAQ,EACb,OAAO,EACP,CAAC,KAAK,KAAI;AACR,oBAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE;wBAChC,IAAI,CAAC,QAAQ,EAAE;oBACjB;AACF,gBAAA,CAAC,CACF;YACH;YACA,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,sBAAsB,EAAE;gBAC3D,IAAI,CAAC,eAAe,EAAE;YACxB;AACF,QAAA,CAAC,CAAC;QAEJ,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CACHM,QAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC,EACjD,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAEpC,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IACrC;AAEA,IAAA,gBAAgB,CAAC,KAAiB,EAAA;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,qBAAqB,CAAC;QACnE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAC;AACrE,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAc;AAExC,QAAA,OAAO,EACL,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC;AAClC,YAAA,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC;AAChC,YAAA,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC;AACjC,YAAA,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC;AAC/B,YAAA,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC;AACpC,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,CACnC;IACH;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC;AACnC,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,sBAAsB,EAAE,KAAK;AAC7B,YAAA,eAAe,EAAE,KAAK;AACvB,SAAA,CAAC;AACF,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACjC,IAAI,CAAC,wBAAwB,EAAE;AAC/B,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;QACtC;QACA,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACpD;IAEA,iBAAiB,GAAA;QACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;IACvD;AAES,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;QAC9C,OAAO;AACL,YAAA,gBAAgB,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS;AAC/C,YAAA,eAAe,EAAE,MAAM,CAAC,QAAQ,KAAK,QAAQ;AAC7C,YAAA,oBAAoB,EAAE,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAClD,wBAAwB,EAAE,KAAK,CAAC,yBAAyB,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;YACzF,uBAAuB,EAAE,KAAK,CAAC,iBAAiB;YAChD,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;YACpD,0BAA0B,EAAE,CAAC,KAAK,CAAC,iBAAiB,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;SACrF;AACH,IAAA,CAAC,0DAAC;uGAtFS,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAdV;;;;;;;;;;;;GAYT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAbS,OAAO,oFAAE,SAAS,EAAA,QAAA,EAAA,YAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,+NAAE,SAAS,EAAA,QAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA;;2FAetD,SAAS,EAAA,UAAA,EAAA,CAAA;kBAjBrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;oBACtB,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,CAAC;AAClE,oBAAA,QAAQ,EAAE;;;;;;;;;;;;AAYT,EAAA,CAAA;AACF,iBAAA;;;ACtBM,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,EAAE;AAChD,IAAA,QAAQ,EAAE;AACR,QAAA,WAAW,EAAE;AACX,YAAA,KAAK,EAAE;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA,KAAK,EAAE,SAAS;AAChB,oBAAA,YAAY,EAAE,SAAS;AACvB,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,WAAW,EAAE,SAAS;AACvB,iBAAA;AACD,gBAAA,SAAS,EAAE;AACT,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,eAAe,EAAE,SAAS;AAC1B,oBAAA,KAAK,EAAE,SAAS;AAChB,oBAAA,UAAU,EAAE,SAAS;AACtB,iBAAA;AACF,aAAA;AACF,SAAA;AACF,KAAA;AACF,CAAA;;ACnBI,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,EAAE;AAC/C,IAAA,QAAQ,EAAE;AACR,QAAA,WAAW,EAAE;AACX,YAAA,KAAK,EAAE;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA,KAAK,EAAE,SAAS;AAChB,oBAAA,YAAY,EAAE,SAAS;AACvB,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,WAAW,EAAE,SAAS;AACvB,iBAAA;AACD,gBAAA,SAAS,EAAE;AACT,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,eAAe,EAAE,SAAS;AAC1B,oBAAA,KAAK,EAAE,SAAS;AAChB,oBAAA,UAAU,EAAE,SAAS;AACtB,iBAAA;AACF,aAAA;AACF,SAAA;AACF,KAAA;AACF,CAAA;;ACvBM,MAAM,eAAe,GAA2B;;AAErD,IAAA,sBAAsB,EAAE,SAAS;AACjC,IAAA,oCAAoC,EAAE,iBAAiB;AACvD,IAAA,kCAAkC,EAAE,kBAAkB;AACtD,IAAA,uBAAuB,EAAE,QAAQ;AACjC,IAAA,sBAAsB,EAAE,OAAO;AAC/B,IAAA,4BAA4B,EAAE,aAAa;AAC3C,IAAA,oCAAoC,EAAE,sBAAsB;AAC5D,IAAA,yCAAyC,EAAE,6BAA6B;;AAGxE,IAAA,sBAAsB,EAAE,MAAM;AAC9B,IAAA,8BAA8B,EAAE,cAAc;;AAG9C,IAAA,sCAAsC,EAAE,yBAAyB;AACjE,IAAA,+CAA+C,EAAE,gBAAgB;AACjE,IAAA,uCAAuC,EAAE,QAAQ;AACjD,IAAA,8CAA8C,EAAE,eAAe;AAC/D,IAAA,8CAA8C,EAAE,QAAQ;AACxD,IAAA,2CAA2C,EAAE,YAAY;AACzD,IAAA,gDAAgD,EAAE,iBAAiB;AACnE,IAAA,qDAAqD,EACnD,wBAAwB;;AAG1B,IAAA,sBAAsB,EAAE,QAAQ;AAChC,IAAA,kCAAkC,EAAE,uBAAuB;;AAG3D,IAAA,2BAA2B,EAAE,aAAa;AAC1C,IAAA,gCAAgC,EAAE,kBAAkB;AACpD,IAAA,mCAAmC,EAAE,qBAAqB;AAC1D,IAAA,4BAA4B,EAAE,cAAc;;AAG5C,IAAA,6BAA6B,EAAE,SAAS;AACxC,IAAA,6BAA6B,EAAE,SAAS;AACxC,IAAA,6BAA6B,EAAE,SAAS;AACxC,IAAA,+BAA+B,EAAE,WAAW;AAC5C,IAAA,sCAAsC,EAAE,QAAQ;AAChD,IAAA,uCAAuC,EAAE,SAAS;AAClD,IAAA,sCAAsC,EAAE,QAAQ;;AAGhD,IAAA,kBAAkB,EAAE,IAAI;;AAGxB,IAAA,gBAAgB,EAAE,WAAW;AAC7B,IAAA,qBAAqB,EAAE,gBAAgB;AACvC,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,oBAAoB,EAAE,eAAe;AACrC,IAAA,oBAAoB,EAAE,eAAe;AACrC,IAAA,mBAAmB,EAAE,cAAc;;;AAKnC,IAAA,oBAAoB,EAAE,eAAe;;AAGrC,IAAA,4BAA4B,EAAE,eAAe;AAC7C,IAAA,uBAAuB,EAAE,wBAAwB;AACjD,IAAA,oBAAoB,EAAE,kBAAkB;;AAGxC,IAAA,4BAA4B,EAAE,UAAU;AACxC,IAAA,+BAA+B,EAAE,gBAAgB;AACjD,IAAA,6BAA6B,EAAE,gBAAgB;AAC/C,IAAA,4BAA4B,EAAE,gBAAgB;;;ACzEhD;;ACAA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"flusys-ng-layout.mjs","sources":["../../../projects/ng-layout/utils/apps-filter.util.ts","../../../projects/ng-layout/utils/menu-filter.util.ts","../../../projects/ng-layout/services/layout-persistence.service.ts","../../../projects/ng-layout/services/layout.service.ts","../../../projects/ng-layout/components/app.footer.ts","../../../projects/ng-layout/components/app.configurator.ts","../../../projects/ng-layout/interfaces/layout-auth.interface.ts","../../../projects/ng-layout/components/app.floatingconfigurator.ts","../../../projects/ng-layout/components/app.menuitem.ts","../../../projects/ng-layout/components/app.menu.ts","../../../projects/ng-layout/interfaces/view-transitions.ts","../../../projects/ng-layout/components/top-bar/app.company-branch-selector.ts","../../../projects/ng-layout/components/top-bar/app.launcher.ts","../../../projects/ng-layout/components/top-bar/app.profile.ts","../../../projects/ng-layout/components/top-bar/app.searchbar.ts","../../../projects/ng-layout/components/app.topbar.ts","../../../projects/ng-layout/components/app.sidebar.ts","../../../projects/ng-layout/components/app.layout.ts","../../../projects/ng-layout/theme/navy-blue-theme.ts","../../../projects/ng-layout/theme/green-theme.ts","../../../projects/ng-layout/constants/messages.ts","../../../projects/ng-layout/public-api.ts","../../../projects/ng-layout/flusys-ng-layout.ts"],"sourcesContent":["import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { ILauncherApp } from '../interfaces/layout-auth.interface';\n\n/** Filter launcher apps based on user permission codes */\nexport function filterAppsByPermissions(\n apps: ILauncherApp[],\n permissionCodes: string[],\n): ILauncherApp[] {\n return apps.filter(\n (app) =>\n !app.permissionLogic ||\n evaluateLogicNode(app.permissionLogic, permissionCodes),\n );\n}\n","import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { IMenuItem } from '../interfaces/layout-auth.interface';\n\n/**\n * Filter menu items based on permission and role checker\n *\n * @param items - Array of menu items to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role (optional, defaults to always false)\n * @returns Filtered menu items array\n *\n * @example\n * ```typescript\n * const filteredMenu = filterMenuByPermissions(\n * menuItems,\n * (actionCode) => permissionState.hasAction(actionCode)\n * );\n * ```\n */\nexport function filterMenuByPermissions(\n items: IMenuItem[],\n permissionCode: string[],\n): IMenuItem[] {\n return items\n .map((item) => filterMenuItem(item, permissionCode))\n .filter((item): item is IMenuItem => item !== null);\n}\n\n/**\n * Filter a single menu item and its children recursively\n *\n * @param item - Menu item to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role\n * @returns Filtered menu item or null if user doesn't have permission\n */\nfunction filterMenuItem(\n item: IMenuItem,\n permissionCode: string[],\n): IMenuItem | null {\n // Skip separators - they have no permission checks\n if (item.separator) {\n return item;\n }\n\n // Check permission logic tree\n if (item.permissionLogic) {\n const hasAccess = evaluateLogicNode(item.permissionLogic, permissionCode);\n if (!hasAccess) {\n return null; // User doesn't pass permission logic\n }\n }\n\n // Filter child items recursively\n if (item.children && item.children.length > 0) {\n const filteredChildren = filterMenuByPermissions(\n item.children,\n permissionCode,\n );\n\n // If parent has no visible children, hide parent too\n if (filteredChildren.length === 0) {\n return null;\n }\n\n return { ...item, children: filteredChildren };\n }\n\n return item;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { LayoutConfig } from './layout.service';\n\nconst STORAGE_KEY = 'flusys.layout.config';\nconst STORAGE_VERSION = 1;\n\ninterface PersistedLayoutConfig extends LayoutConfig {\n _version?: number;\n}\n\n/**\n * Service for persisting layout configuration to localStorage.\n * Handles loading, saving, and validation of layout preferences with SSR-safe checks.\n *\n * @example\n * ```typescript\n * const persistence = inject(LayoutPersistenceService);\n *\n * // Load saved config\n * const config = persistence.load();\n *\n * // Save config\n * persistence.save({ darkTheme: true, preset: 'Aura' });\n *\n * // Clear saved config\n * persistence.clear();\n * ```\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LayoutPersistenceService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private readonly validPresets = ['Aura', 'Lara', 'Nora'];\n private readonly validMenuModes = ['static', 'overlay', 'topbar'];\n\n /**\n * Load configuration from localStorage.\n * Returns null if no saved config or invalid data.\n * SSR-safe (returns null on server).\n *\n * @returns Validated layout configuration or null\n */\n load(): LayoutConfig | null {\n if (!this.isBrowser) return null;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return null;\n\n const parsed = JSON.parse(stored) as PersistedLayoutConfig;\n return this.validateConfig(parsed);\n } catch {\n this.clear();\n return null;\n }\n }\n\n /**\n * Save configuration to localStorage.\n * SSR-safe (no-op on server).\n *\n * @param config Layout configuration to save\n */\n save(config: LayoutConfig): void {\n if (!this.isBrowser) return;\n\n try {\n const toStore: PersistedLayoutConfig = {\n ...config,\n _version: STORAGE_VERSION,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(toStore));\n } catch {\n // Silent fail - localStorage may be full or disabled\n }\n }\n\n /**\n * Clear stored configuration.\n * SSR-safe (no-op on server).\n */\n clear(): void {\n if (!this.isBrowser) return;\n localStorage.removeItem(STORAGE_KEY);\n }\n\n /**\n * Validate and sanitize configuration.\n * Returns null if version mismatch.\n *\n * @param config Configuration to validate\n * @returns Validated configuration or null\n */\n private validateConfig(config: PersistedLayoutConfig): LayoutConfig | null {\n // Version mismatch - clear and return null\n if (config._version && config._version !== STORAGE_VERSION) {\n this.clear();\n return null;\n }\n\n // Validate preset - silently fix invalid values\n if (config.preset && !this.validPresets.includes(config.preset)) {\n config.preset = 'Aura';\n }\n\n // Validate menuMode - silently fix invalid values\n if (config.menuMode && !this.validMenuModes.includes(config.menuMode)) {\n config.menuMode = 'static';\n }\n\n // Validate darkTheme\n if (typeof config.darkTheme !== 'boolean') {\n config.darkTheme = false;\n }\n\n // Remove version field from returned config\n const { _version, ...cleanConfig } = config;\n return cleanConfig as LayoutConfig;\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DOCUMENT,\n effect,\n inject,\n Injectable,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport {\n APP_CONFIG,\n DEFAULT_APP_NAME,\n DEFAULT_AUTHOR,\n isCompanyFeatureEnabled,\n ITranslateAdapter,\n} from '@flusys/ng-core';\nimport {\n PermissionValidatorService,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { Subject } from 'rxjs';\nimport { ILauncherApp, IMenuItem } from '../interfaces/layout-auth.interface';\nimport { DocumentWithViewTransition } from '../interfaces/view-transitions';\nimport { filterAppsByPermissions } from '../utils/apps-filter.util';\nimport { filterMenuByPermissions } from '../utils/menu-filter.util';\nimport { LayoutPersistenceService } from './layout-persistence.service';\n\nexport interface LayoutConfig {\n preset?: string;\n primary?: string;\n surface?: string | null;\n darkTheme?: boolean;\n menuMode?: 'static' | 'overlay' | 'topbar';\n}\n\nexport interface LayoutState {\n staticMenuDesktopInactive?: boolean;\n overlayMenuActive?: boolean;\n configSidebarVisible?: boolean;\n staticMenuMobileActive?: boolean;\n menuHoverActive?: boolean;\n topbarMenuVisible?: boolean;\n}\n\nexport interface MenuChangeEvent {\n key: string;\n routeEvent?: boolean;\n}\n\nexport interface UserProfile {\n id: string;\n name: string;\n email: string;\n profilePictureUrl?: string | null;\n}\n\nexport interface CompanyProfile {\n id: string;\n name: string;\n slug: string;\n logoUrl?: string | null;\n}\n\n/** Layout configuration and state management service */\n@Injectable({ providedIn: 'root' })\nexport class LayoutService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly persistence = inject(LayoutPersistenceService);\n private readonly appConfig = inject(APP_CONFIG, { optional: true });\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n }) as ITranslateAdapter | null;\n\n private readonly DEFAULT_CONFIG: LayoutConfig = {\n preset: 'Aura',\n primary: 'emerald',\n surface: null,\n darkTheme: false,\n menuMode: 'static',\n };\n\n private readonly DEFAULT_STATE: LayoutState = {\n staticMenuDesktopInactive: false,\n overlayMenuActive: false,\n configSidebarVisible: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n topbarMenuVisible: true,\n };\n\n private readonly _layoutConfig = signal<LayoutConfig>({\n ...this.DEFAULT_CONFIG,\n ...this.persistence.load(),\n });\n private readonly _layoutState = signal<LayoutState>(this.DEFAULT_STATE);\n private readonly _transitionComplete = signal<boolean>(false);\n\n readonly layoutConfig = this._layoutConfig.asReadonly();\n readonly layoutState = this._layoutState.asReadonly();\n readonly transitionComplete = this._transitionComplete.asReadonly();\n\n private readonly _userProfile = signal<UserProfile | null>(null);\n private readonly _companyProfile = signal<CompanyProfile | null>(null);\n private readonly _rawMenu = signal<IMenuItem[]>([]);\n private readonly _rawApps = signal<ILauncherApp[]>([]);\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n readonly userProfile = this._userProfile.asReadonly();\n readonly companyProfile = this._companyProfile.asReadonly();\n\n // Static app info from config\n readonly appName = this.appConfig?.appName ?? DEFAULT_APP_NAME;\n readonly appLogo = this.appConfig?.appLogo ?? '';\n readonly authorName = this.appConfig?.author?.name ?? DEFAULT_AUTHOR.name;\n readonly authorUrl = this.appConfig?.author?.url ?? DEFAULT_AUTHOR.url;\n\n // Permission-filtered menu and apps\n readonly menu = computed(() =>\n filterMenuByPermissions(\n this._rawMenu(),\n this.permissionValidator.permissions(),\n ),\n );\n readonly apps = computed(() =>\n filterAppsByPermissions(\n this._rawApps(),\n this.permissionValidator.permissions(),\n ),\n );\n readonly hasApps = computed(() => this.apps().length > 0);\n\n // Computed signals - Layout\n readonly isSidebarActive = computed(\n () =>\n this._layoutState().overlayMenuActive ||\n this._layoutState().staticMenuMobileActive,\n );\n readonly isDarkTheme = computed(() => this._layoutConfig().darkTheme);\n readonly getPrimary = computed(() => this._layoutConfig().primary);\n readonly getSurface = computed(() => this._layoutConfig().surface);\n readonly isOverlay = computed(\n () => this._layoutConfig().menuMode === 'overlay',\n );\n readonly isTopbar = computed(\n () => this._layoutConfig().menuMode === 'topbar',\n );\n\n // User profile computed signals\n readonly userName = computed(\n () =>\n this._userProfile()?.name ??\n this.translateAdapter?.translate('layout.profile.guest') ??\n 'Guest',\n );\n readonly userEmail = computed(() => this._userProfile()?.email ?? '');\n readonly userProfilePictureUrl = computed(\n () => this._userProfile()?.profilePictureUrl ?? null,\n );\n readonly companyLogoUrl = computed(\n () => this._companyProfile()?.logoUrl ?? null,\n );\n readonly isAuthenticated = computed(() => !!this._userProfile());\n readonly companyName = computed(() => {\n if (!this.appConfig || !isCompanyFeatureEnabled(this.appConfig))\n return this.appName;\n return this._companyProfile()?.name ?? this.appName;\n });\n readonly displayLogo = computed(() => this.companyLogoUrl() ?? this.appLogo);\n\n // RxJS Subjects for event communication\n private readonly configUpdate = new Subject<LayoutConfig>();\n private readonly overlayOpen = new Subject<void>();\n private readonly menuSource = new Subject<MenuChangeEvent>();\n private readonly resetSource = new Subject<boolean>();\n\n readonly menuSource$ = this.menuSource.asObservable();\n readonly resetSource$ = this.resetSource.asObservable();\n readonly configUpdate$ = this.configUpdate.asObservable();\n readonly overlayOpen$ = this.overlayOpen.asObservable();\n\n private initialized = false;\n\n constructor() {\n effect(() => {\n const config = this._layoutConfig();\n this.configUpdate.next(config);\n\n if (this.initialized) {\n this.handleDarkModeTransition(config);\n this.persistence.save(config);\n }\n this.initialized = true;\n });\n }\n\n toggleDarkMode(config?: LayoutConfig): void {\n const isDark = (config ?? this._layoutConfig()).darkTheme;\n this.document.documentElement.classList.toggle('app-dark', isDark);\n }\n\n private handleDarkModeTransition(config: LayoutConfig): void {\n const doc = this.document as DocumentWithViewTransition;\n if (\n 'startViewTransition' in doc &&\n typeof doc.startViewTransition === 'function'\n ) {\n doc\n .startViewTransition(() => this.toggleDarkMode(config))\n .ready.then(() => this.onTransitionEnd())\n .catch(() => {});\n } else {\n this.toggleDarkMode(config);\n this.onTransitionEnd();\n }\n }\n\n private onTransitionEnd(): void {\n this._transitionComplete.set(true);\n setTimeout(() => this._transitionComplete.set(false));\n }\n\n onMenuToggle(): void {\n const state = this._layoutState();\n\n // Desktop topbar mode: toggle topbar nav visibility\n if (this.isDesktop() && this.isTopbar()) {\n this._layoutState.update((prev) => ({\n ...prev,\n topbarMenuVisible: !prev.topbarMenuVisible,\n }));\n return;\n }\n\n // Mobile always uses staticMenuMobileActive regardless of menu mode\n if (!this.isDesktop()) {\n const newMobileActive = !state.staticMenuMobileActive;\n this._layoutState.update((prev) => ({\n ...prev,\n staticMenuMobileActive: newMobileActive,\n }));\n if (newMobileActive) this.overlayOpen.next();\n return;\n }\n\n // Desktop: use overlay or static mode\n if (this.isOverlay()) {\n const newOverlayActive = !state.overlayMenuActive;\n this._layoutState.update((prev) => ({\n ...prev,\n overlayMenuActive: newOverlayActive,\n }));\n if (newOverlayActive) this.overlayOpen.next();\n } else {\n this._layoutState.update((prev) => ({\n ...prev,\n staticMenuDesktopInactive: !state.staticMenuDesktopInactive,\n }));\n }\n }\n\n isDesktop(): boolean {\n return this.isBrowser ? window.innerWidth > 991 : true;\n }\n\n isMobile(): boolean {\n return !this.isDesktop();\n }\n\n onMenuStateChange(event: MenuChangeEvent): void {\n this.menuSource.next(event);\n }\n\n reset(): void {\n this.resetSource.next(true);\n }\n\n // Config & state updates\n updateLayoutConfig(config: Partial<LayoutConfig>): void {\n this._layoutConfig.update((prev) => ({ ...prev, ...config }));\n }\n\n updateLayoutState(state: Partial<LayoutState>): void {\n this._layoutState.update((prev) => ({ ...prev, ...state }));\n }\n\n // Profile setters\n setUserProfile(profile: UserProfile | null): void {\n this._userProfile.set(profile);\n }\n\n setCompanyProfile(profile: CompanyProfile | null): void {\n this._companyProfile.set(profile);\n }\n\n // Menu & apps\n setMenu(items: IMenuItem[]): void {\n this._rawMenu.set(items);\n }\n\n clearMenu(): void {\n this._rawMenu.set([]);\n }\n\n setApps(apps: ILauncherApp[]): void {\n this._rawApps.set(apps);\n }\n\n clearApps(): void {\n this._rawApps.set([]);\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-footer',\n imports: [TranslatePipe],\n template: `<div class=\"layout-footer\">\n @if (displayLogo) {\n <img [src]=\"displayLogo\" [alt]=\"appName\" class=\"logo-image\" />\n }\n <span class=\"hidden sm:inline\">\n {{ appName }} {{ 'layout.footer.by' | translate }}\n <a\n [href]=\"authorUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-primary font-bold hover:underline\"\n >{{ authorName }}</a\n >\n </span>\n </div>`,\n})\nexport class AppFooter {\n private readonly layoutService = inject(LayoutService);\n\n readonly appName = this.layoutService.appName;\n readonly displayLogo = this.layoutService.appLogo;\n readonly authorName = this.layoutService.authorName;\n readonly authorUrl = this.layoutService.authorUrl;\n}\n","import {\n afterNextRender,\n Component,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { TranslatePipe, TranslateService } from '@flusys/ng-shared';\nimport { $t, updatePreset, updateSurfacePalette } from '@primeuix/themes';\nimport Aura from '@primeuix/themes/aura';\nimport Lara from '@primeuix/themes/lara';\nimport Nora from '@primeuix/themes/nora';\nimport { SelectButtonModule } from 'primeng/selectbutton';\nimport { LayoutService } from '../services/public-api';\n\nconst presets = {\n Aura,\n Lara,\n Nora,\n} as const;\n\ndeclare type KeyOfType<T> = keyof T extends infer U ? U : never;\n\ndeclare type SurfacesType = {\n name?: string;\n palette?: {\n 0?: string;\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n 950?: string;\n };\n};\n\n@Component({\n selector: 'app-configurator',\n imports: [FormsModule, SelectButtonModule, TranslatePipe],\n template: `\n <div class=\"flex flex-col gap-4\">\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.primary' | translate\n }}</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (primaryColor of primaryColors(); track primaryColor.name) {\n <button\n type=\"button\"\n [title]=\"primaryColor.name\"\n (click)=\"updateColors($event, 'primary', primaryColor)\"\n [class.outline-primary]=\"\n primaryColor.name === selectedPrimaryColor()\n \"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style.background-color]=\"\n primaryColor?.name === 'noir'\n ? 'var(--text-color)'\n : primaryColor?.palette?.['500']\n \"\n ></button>\n }\n </div>\n </div>\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.surface' | translate\n }}</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (surface of surfaces; track surface.name) {\n <button\n type=\"button\"\n [title]=\"surface.name\"\n (click)=\"updateColors($event, 'surface', surface)\"\n [class.outline-primary]=\"isSurfaceSelected(surface.name)\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style.background-color]=\"\n surface?.name === 'noir'\n ? 'var(--text-color)'\n : surface?.palette?.['500']\n \"\n ></button>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.presets' | translate\n }}</span>\n <p-selectbutton\n [options]=\"presets\"\n [ngModel]=\"selectedPreset()\"\n (ngModelChange)=\"onPresetChange($event)\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n @if (showMenuModeButton()) {\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.menu.mode' | translate\n }}</span>\n <p-selectbutton\n [ngModel]=\"menuMode()\"\n (ngModelChange)=\"onMenuModeChange($event)\"\n [options]=\"menuModeOptions()\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n }\n </div>\n `,\n host: {\n class:\n 'hidden absolute top-[3.25rem] w-[calc(100vw-2rem)] sm:w-72 max-w-72 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]',\n style: 'background-color: var(--surface-overlay); inset-inline-end: 0;',\n },\n})\nexport class AppConfigurator {\n private readonly router = inject(Router);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n readonly layoutService = inject(LayoutService);\n\n readonly presets = Object.keys(presets);\n readonly showMenuModeButton = signal(!this.router.url.includes('auth'));\n readonly menuModeOptions = computed(() => {\n const options: Array<{\n label: string;\n value: 'static' | 'overlay' | 'topbar';\n }> = [\n {\n label: this.translate('layout.configurator.menu.mode.static'),\n value: 'static',\n },\n {\n label: this.translate('layout.configurator.menu.mode.overlay'),\n value: 'overlay',\n },\n ];\n // Only show topbar mode on desktop\n if (this.layoutService.isDesktop()) {\n options.push({\n label: this.translate('layout.configurator.menu.mode.topbar'),\n value: 'topbar',\n });\n }\n return options;\n });\n\n constructor() {\n // Use afterNextRender for browser-only initialization (replaces isServer check)\n afterNextRender(() => {\n const preset = this.layoutService.layoutConfig().preset ?? 'Aura';\n this.onPresetChange(preset);\n });\n }\n\n readonly surfaces: SurfacesType[] = [\n {\n name: 'slate',\n palette: {\n 0: '#ffffff',\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n },\n {\n name: 'gray',\n palette: {\n 0: '#ffffff',\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n },\n {\n name: 'zinc',\n palette: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f4f4f5',\n 200: '#e4e4e7',\n 300: '#d4d4d8',\n 400: '#a1a1aa',\n 500: '#71717a',\n 600: '#52525b',\n 700: '#3f3f46',\n 800: '#27272a',\n 900: '#18181b',\n 950: '#09090b',\n },\n },\n {\n name: 'neutral',\n palette: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#e5e5e5',\n 300: '#d4d4d4',\n 400: '#a3a3a3',\n 500: '#737373',\n 600: '#525252',\n 700: '#404040',\n 800: '#262626',\n 900: '#171717',\n 950: '#0a0a0a',\n },\n },\n {\n name: 'stone',\n palette: {\n 0: '#ffffff',\n 50: '#fafaf9',\n 100: '#f5f5f4',\n 200: '#e7e5e4',\n 300: '#d6d3d1',\n 400: '#a8a29e',\n 500: '#78716c',\n 600: '#57534e',\n 700: '#44403c',\n 800: '#292524',\n 900: '#1c1917',\n 950: '#0c0a09',\n },\n },\n {\n name: 'soho',\n palette: {\n 0: '#ffffff',\n 50: '#ececec',\n 100: '#dedfdf',\n 200: '#c4c4c6',\n 300: '#adaeb0',\n 400: '#97979b',\n 500: '#7f8084',\n 600: '#6a6b70',\n 700: '#55565b',\n 800: '#3f4046',\n 900: '#2c2c34',\n 950: '#16161d',\n },\n },\n {\n name: 'viva',\n palette: {\n 0: '#ffffff',\n 50: '#f3f3f3',\n 100: '#e7e7e8',\n 200: '#cfd0d0',\n 300: '#b7b8b9',\n 400: '#9fa1a1',\n 500: '#87898a',\n 600: '#6e7173',\n 700: '#565a5b',\n 800: '#3e4244',\n 900: '#262b2c',\n 950: '#0e1315',\n },\n },\n {\n name: 'ocean',\n palette: {\n 0: '#ffffff',\n 50: '#fbfcfc',\n 100: '#F7F9F8',\n 200: '#EFF3F2',\n 300: '#DADEDD',\n 400: '#B1B7B6',\n 500: '#828787',\n 600: '#5F7274',\n 700: '#415B61',\n 800: '#29444E',\n 900: '#183240',\n 950: '#0c1920',\n },\n },\n ];\n\n readonly selectedPrimaryColor = computed(() => {\n return this.layoutService.layoutConfig().primary;\n });\n\n readonly selectedSurfaceColor = computed(\n () => this.layoutService.layoutConfig().surface,\n );\n\n isSurfaceSelected(surfaceName: string | undefined): boolean {\n const selectedSurface = this.selectedSurfaceColor();\n if (selectedSurface) {\n return selectedSurface === surfaceName;\n }\n // Default: zinc for dark theme, slate for light theme\n return this.layoutService.layoutConfig().darkTheme\n ? surfaceName === 'zinc'\n : surfaceName === 'slate';\n }\n\n readonly selectedPreset = computed(\n () => this.layoutService.layoutConfig().preset,\n );\n\n readonly menuMode = computed(\n () => this.layoutService.layoutConfig().menuMode,\n );\n\n readonly primaryColors = computed<SurfacesType[]>(() => {\n const presetPalette =\n presets[\n this.layoutService.layoutConfig().preset as KeyOfType<typeof presets>\n ].primitive;\n const colors = [\n 'emerald',\n 'green',\n 'lime',\n 'orange',\n 'amber',\n 'yellow',\n 'teal',\n 'cyan',\n 'sky',\n 'blue',\n 'indigo',\n 'violet',\n 'purple',\n 'fuchsia',\n 'pink',\n 'rose',\n ];\n const palettes: SurfacesType[] = [{ name: 'noir', palette: {} }];\n\n colors.forEach((color) => {\n palettes.push({\n name: color,\n palette: presetPalette?.[\n color as KeyOfType<typeof presetPalette>\n ] as SurfacesType['palette'],\n });\n });\n\n return palettes;\n });\n\n getPresetExt() {\n const color: SurfacesType =\n this.primaryColors().find(\n (c) => c.name === this.selectedPrimaryColor(),\n ) || {};\n const preset = this.layoutService.layoutConfig().preset;\n\n if (color.name === 'noir') {\n return {\n semantic: {\n primary: {\n 50: '{surface.50}',\n 100: '{surface.100}',\n 200: '{surface.200}',\n 300: '{surface.300}',\n 400: '{surface.400}',\n 500: '{surface.500}',\n 600: '{surface.600}',\n 700: '{surface.700}',\n 800: '{surface.800}',\n 900: '{surface.900}',\n 950: '{surface.950}',\n },\n colorScheme: {\n light: {\n primary: {\n color: '{primary.950}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.800}',\n activeColor: '{primary.700}',\n },\n highlight: {\n background: '{primary.950}',\n focusBackground: '{primary.700}',\n color: '#ffffff',\n focusColor: '#ffffff',\n },\n },\n dark: {\n primary: {\n color: '{primary.50}',\n contrastColor: '{primary.950}',\n hoverColor: '{primary.200}',\n activeColor: '{primary.300}',\n },\n highlight: {\n background: '{primary.50}',\n focusBackground: '{primary.300}',\n color: '{primary.950}',\n focusColor: '{primary.950}',\n },\n },\n },\n },\n };\n } else {\n if (preset === 'Nora') {\n return {\n semantic: {\n primary: color.palette,\n colorScheme: {\n light: {\n primary: {\n color: '{primary.600}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.700}',\n activeColor: '{primary.800}',\n },\n highlight: {\n background: '{primary.600}',\n focusBackground: '{primary.700}',\n color: '#ffffff',\n focusColor: '#ffffff',\n },\n },\n dark: {\n primary: {\n color: '{primary.500}',\n contrastColor: '{surface.900}',\n hoverColor: '{primary.400}',\n activeColor: '{primary.300}',\n },\n highlight: {\n background: '{primary.500}',\n focusBackground: '{primary.400}',\n color: '{surface.900}',\n focusColor: '{surface.900}',\n },\n },\n },\n },\n };\n } else {\n return {\n semantic: {\n primary: color.palette,\n colorScheme: {\n light: {\n primary: {\n color: '{primary.500}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.600}',\n activeColor: '{primary.700}',\n },\n highlight: {\n background: '{primary.50}',\n focusBackground: '{primary.100}',\n color: '{primary.700}',\n focusColor: '{primary.800}',\n },\n },\n dark: {\n primary: {\n color: '{primary.400}',\n contrastColor: '{surface.900}',\n hoverColor: '{primary.300}',\n activeColor: '{primary.200}',\n },\n highlight: {\n background:\n 'color-mix(in srgb, {primary.400}, transparent 84%)',\n focusBackground:\n 'color-mix(in srgb, {primary.400}, transparent 76%)',\n color: 'rgba(255,255,255,.87)',\n focusColor: 'rgba(255,255,255,.87)',\n },\n },\n },\n },\n };\n }\n }\n }\n\n updateColors(event: MouseEvent, type: string, color: SurfacesType): void {\n if (type === 'primary') {\n this.layoutService.updateLayoutConfig({ primary: color.name });\n } else if (type === 'surface') {\n this.layoutService.updateLayoutConfig({ surface: color.name });\n }\n this.applyTheme(type, color);\n\n event.stopPropagation();\n }\n\n applyTheme(type: string, color: SurfacesType): void {\n if (type === 'primary') {\n updatePreset(this.getPresetExt());\n } else if (type === 'surface') {\n updateSurfacePalette(color.palette);\n }\n }\n\n onPresetChange(event: string): void {\n this.layoutService.updateLayoutConfig({ preset: event });\n const preset = presets[event as KeyOfType<typeof presets>];\n // Use selected surface or default (slate for light, zinc for dark)\n const selectedSurface = this.selectedSurfaceColor();\n const defaultSurface = this.layoutService.layoutConfig().darkTheme\n ? 'zinc'\n : 'slate';\n const surfacePalette = this.surfaces.find(\n (s) => s.name === (selectedSurface || defaultSurface),\n )?.palette;\n $t()\n .preset(preset)\n .preset(this.getPresetExt())\n .surfacePalette(surfacePalette)\n .use({ useDefaultOptions: true });\n }\n\n onMenuModeChange(event: 'static' | 'overlay' | 'topbar'): void {\n this.layoutService.updateLayoutConfig({ menuMode: event });\n }\n\n private translate(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\n}\n","import { InjectionToken, Signal, Type } from '@angular/core';\nimport type { IconTypeEnum, ILogicNode } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\n\nexport interface ILauncherApp {\n id: string;\n /** Display name (use nameKey for localization instead) */\n name?: string;\n /** Translation key for the name - preferred over name for localization */\n nameKey?: string;\n iconType: IconTypeEnum;\n icon: string;\n url: string;\n /** Optional permission logic - if set, app only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ICompanyInfo {\n id: string;\n name: string;\n slug: string;\n imageId: string;\n}\n\nexport interface IBranchInfo {\n id: string;\n name: string;\n slug: string;\n imageId?: string;\n}\n\nexport interface IUserInfo {\n id: string;\n name: string;\n email: string;\n profilePicture?: { url: string } | null;\n}\n\nexport interface IMenuItem {\n id?: string;\n /** Display label (use labelKey for localization instead) */\n label?: string;\n /** Translation key for the label - preferred over label for localization */\n labelKey?: string;\n icon?: string;\n iconType?: number;\n routerLink?: string[];\n children?: IMenuItem[];\n parent?: { id: string } | null;\n separator?: boolean;\n /** Optional permission logic - if set, item only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ILayoutAuthState {\n currentCompanyInfo: Signal<ICompanyInfo | null>;\n currentBranchInfo: Signal<IBranchInfo | null>;\n loginUserData: Signal<IUserInfo | null>;\n}\n\nexport interface ILayoutAuthApi {\n logOut(): Observable<any>;\n navigateLogin(withUrl?: boolean): void;\n switchCompany(companyId: string, branchId: string): Observable<any>;\n getUserCompanies(): Observable<ICompanyInfo[]>;\n getCompanyBranches(companyId: string): Observable<IBranchInfo[]>;\n}\n\nexport const LAYOUT_AUTH_STATE = new InjectionToken<ILayoutAuthState>(\n 'LAYOUT_AUTH_STATE',\n);\n\nexport const LAYOUT_AUTH_API = new InjectionToken<ILayoutAuthApi>(\n 'LAYOUT_AUTH_API',\n);\n\nexport const LAYOUT_NOTIFICATION_BELL = new InjectionToken<Type<unknown>>(\n 'LAYOUT_NOTIFICATION_BELL',\n);\n\nexport const LAYOUT_LANGUAGE_SELECTOR = new InjectionToken<Type<unknown>>(\n 'LAYOUT_LANGUAGE_SELECTOR',\n);\n\nexport const LAYOUT_LANGUAGE_SELECTOR_PANEL = new InjectionToken<Type<unknown>>(\n 'LAYOUT_LANGUAGE_SELECTOR_PANEL',\n);\n\nexport const LAYOUT_SEARCHBAR = new InjectionToken<Type<unknown>>(\n 'LAYOUT_SEARCHBAR',\n);\n\nexport const LAYOUT_IS_RTL = new InjectionToken<Signal<boolean>>(\n 'LAYOUT_IS_RTL',\n);\n\nexport interface ISearchSuggestion {\n label: string;\n icon?: string;\n routerLink?: string[];\n data?: unknown;\n}\n\nexport interface ISearchAdapter {\n getSuggestions(query: string): Observable<ISearchSuggestion[]>;\n onSearch?(query: string): void;\n}\n\nexport const LAYOUT_SEARCH_ADAPTER = new InjectionToken<ISearchAdapter>(\n 'LAYOUT_SEARCH_ADAPTER',\n);\n","import { NgComponentOutlet } from '@angular/common';\nimport { Component, computed, inject } from '@angular/core';\nimport { ButtonModule } from 'primeng/button';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { LAYOUT_LANGUAGE_SELECTOR_PANEL } from '../interfaces/layout-auth.interface';\nimport { LayoutService } from '../services/public-api';\nimport { AppConfigurator } from './app.configurator';\n\n@Component({\n selector: 'app-floating-configurator',\n imports: [NgComponentOutlet, ButtonModule, StyleClassModule, AppConfigurator],\n template: `\n <div\n class=\"floating-configurator fixed flex flex-col md:flex-row gap-2 md:gap-4 top-4 md:top-8 z-50\"\n >\n <p-button\n type=\"button\"\n (onClick)=\"toggleDarkMode()\"\n [rounded]=\"true\"\n [icon]=\"isDarkTheme() ? 'pi pi-moon' : 'pi pi-sun'\"\n severity=\"secondary\"\n />\n @if (languageSelectorPanel) {\n <div class=\"relative\">\n <p-button\n icon=\"pi pi-globe\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n type=\"button\"\n rounded\n />\n <ng-container *ngComponentOutlet=\"languageSelectorPanel\" />\n </div>\n }\n <div class=\"relative\">\n <p-button\n icon=\"pi pi-palette\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n type=\"button\"\n rounded\n />\n <app-configurator />\n </div>\n </div>\n `,\n styles: `\n .floating-configurator {\n inset-inline-end: 0.5rem;\n }\n @media (min-width: 768px) {\n .floating-configurator {\n inset-inline-end: 2rem;\n }\n }\n `,\n})\nexport class AppFloatingConfigurator {\n private readonly layoutService = inject(LayoutService);\n readonly languageSelectorPanel = inject(LAYOUT_LANGUAGE_SELECTOR_PANEL, {\n optional: true,\n });\n\n readonly isDarkTheme = computed(\n () => this.layoutService.layoutConfig().darkTheme,\n );\n\n toggleDarkMode(): void {\n const currentDarkTheme = this.layoutService.layoutConfig().darkTheme;\n this.layoutService.updateLayoutConfig({ darkTheme: !currentDarkTheme });\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { IconComponent, TranslatePipe } from '@flusys/ng-shared';\nimport { RippleModule } from 'primeng/ripple';\nimport { filter } from 'rxjs/operators';\nimport { IMenuItem } from '../interfaces/public-api';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: '[app-menuitem]',\n imports: [IconComponent, RouterModule, RippleModule, TranslatePipe],\n template: `\n <ng-container>\n @if (item().children?.length) {\n <a\n (click)=\"itemClick()\"\n (mouseenter)=\"onMouseEnter()\"\n #parentLink\n tabindex=\"0\"\n pRipple\n >\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{\n item().labelKey ? (item().labelKey! | translate) : item().label\n }}</span>\n @if (item().children) {\n @if (layoutService.isTopbar()) {\n <i class=\"pi pi-fw pi-chevron-right layout-submenu-toggler\"></i>\n } @else {\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"></i>\n }\n }\n </a>\n }\n @if (item().routerLink && !item().children?.length) {\n <a\n (click)=\"itemClick()\"\n [routerLink]=\"routerLink()\"\n routerLinkActive=\"active-route\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n tabindex=\"0\"\n pRipple\n >\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{\n item().labelKey ? (item().labelKey! | translate) : item().label\n }}</span>\n </a>\n }\n @if (item().children) {\n <ul\n (mouseenter)=\"onMouseEnter()\"\n [class.submenu-expanded]=\"active() && !layoutService.isTopbar()\"\n [class.submenu-collapsed]=\"!active() && !layoutService.isTopbar()\"\n >\n @for (\n child of item().children;\n track 'menu' + child.id + '' + i;\n let i = $index\n ) {\n <li\n app-menuitem\n [item]=\"child\"\n [index]=\"i\"\n [parentKey]=\"key()\"\n ></li>\n }\n </ul>\n }\n </ng-container>\n `,\n styles: `\n :host ul {\n overflow: hidden;\n transition: max-height 400ms cubic-bezier(0.86, 0, 0.07, 1);\n }\n :host ul.submenu-collapsed {\n max-height: 0;\n }\n :host ul.submenu-expanded {\n max-height: 1000px;\n }\n `,\n host: {\n '[class.active-menuitem]': 'active()',\n },\n})\nexport class AppMenuitem {\n // Signal inputs\n readonly item = input.required<IMenuItem>();\n readonly index = input.required<number>();\n readonly parentKey = input<string>('');\n\n // Injected services\n private readonly router = inject(Router);\n readonly layoutService = inject(LayoutService);\n private readonly destroyRef = inject(DestroyRef);\n\n // View references\n private readonly parentLink =\n viewChild<ElementRef<HTMLElement>>('parentLink');\n\n // State signals - private writable + public readonly pattern\n private readonly _active = signal(false);\n readonly active = this._active.asReadonly();\n\n // Computed signals\n readonly key = computed(() => {\n const parent = this.parentKey();\n return parent ? `${parent}-${this.index()}` : String(this.index());\n });\n\n readonly routerLink = computed(() => {\n const menuItem = this.item();\n return menuItem.routerLink ?? [];\n });\n\n // Computed options for routerLinkActive - use 'exact' for root, 'subset' for others\n readonly routerLinkActiveOptions = computed(() => {\n const link = this.routerLink();\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n return {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n } as const;\n });\n\n constructor() {\n // Subscribe to menu source changes\n this.layoutService.menuSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n Promise.resolve(null).then(() => {\n const currentKey = this.key();\n if (value.routeEvent) {\n this._active.set(\n value.key === currentKey ||\n value.key?.startsWith(currentKey + '-'),\n );\n } else if (\n value.key !== currentKey &&\n !value.key?.startsWith(currentKey + '-')\n ) {\n this._active.set(false);\n }\n });\n });\n\n // Subscribe to menu reset\n this.layoutService.resetSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this._active.set(false));\n\n // Subscribe to navigation events\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n if (this.item().routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n\n // Effect to update active state on init when item has routerLink\n effect(() => {\n const menuItem = this.item();\n if (menuItem.routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n\n // Effect to update submenu position when active in topbar mode\n effect(() => {\n if (this.active() && this.parentLink()) {\n Promise.resolve().then(() => this.updateSubmenuPosition());\n }\n });\n }\n\n onMouseEnter(): void {\n if (this.layoutService.isTopbar() && this.item().children) {\n this.updateSubmenuPosition();\n }\n }\n\n private updateSubmenuPosition(): void {\n const linkEl = this.parentLink()?.nativeElement;\n if (!linkEl || typeof linkEl.getBoundingClientRect !== 'function') return;\n\n const rect = linkEl.getBoundingClientRect();\n const hostEl = linkEl.closest('[app-menuitem]');\n if (!hostEl) return;\n\n // Position submenu to the left of the parent link and above it\n const left = rect.left;\n const top = rect.top + 30; // 8px gap above the menu item\n\n (hostEl as HTMLElement).style.setProperty('--submenu-left', `${left}px`);\n (hostEl as HTMLElement).style.setProperty('--submenu-top', `${top}px`);\n }\n\n private updateActiveStateFromRoute(): void {\n const link = this.routerLink();\n if (!link.length) return;\n\n // Use 'exact' for root path to avoid matching all routes\n // Use 'subset' for all other paths to match child routes\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n\n const isActive = this.router.isActive(link[0], {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n });\n\n if (isActive) {\n this.layoutService.onMenuStateChange({\n key: this.key(),\n routeEvent: true,\n });\n }\n }\n\n itemClick(): void {\n if (this.item().children && !this.layoutService.isTopbar()) {\n this._active.update((prev) => !prev);\n }\n this.layoutService.onMenuStateChange({ key: this.key() });\n }\n}\n","import { Component, inject } from '@angular/core';\n\nimport { RouterModule } from '@angular/router';\nimport { LayoutService } from '../services/layout.service';\nimport { AppMenuitem } from './app.menuitem';\n\n/**\n * Main menu component that displays filtered menu items.\n * Menu is automatically filtered based on user permissions using the permission checker (logicNode pattern).\n * The filtering happens internally in LayoutService via computed signal.\n */\n@Component({\n selector: 'app-menu',\n imports: [AppMenuitem, RouterModule],\n template: `<div class=\"layout-menu\">\n <ul>\n @for (\n item of menuItems();\n track 'menu' + item.id + '' + i;\n let i = $index\n ) {\n <li app-menuitem [item]=\"item\" [index]=\"i\"></li>\n }\n </ul>\n </div>`,\n})\nexport class AppMenu {\n private readonly layoutService = inject(LayoutService);\n\n /**\n * Filtered menu items from layout service.\n * This signal is computed in LayoutService and automatically updates when:\n * - Raw menu changes (setMenu called)\n * - Permission state changes (user permissions updated)\n */\n readonly menuItems = this.layoutService.menu;\n}\n","/**\n * View Transitions API type definitions\n * @see https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API\n */\n\nexport interface ViewTransition {\n /** Promise fulfilled when the transition animation is complete */\n finished: Promise<void>;\n /** Promise fulfilled when the pseudo-element tree is ready */\n ready: Promise<void>;\n /** Promise fulfilled when the callback finishes */\n updateCallbackDone: Promise<void>;\n /** Skip the transition animation */\n skipTransition(): void;\n}\n\n/**\n * Extended Document interface with View Transitions API support.\n * Uses the native Document type with startViewTransition which is now\n * part of the standard TypeScript DOM library.\n */\nexport type DocumentWithViewTransition = Document;\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { ButtonModule } from 'primeng/button';\nimport { SelectModule } from 'primeng/select';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type { IBranchInfo, ICompanyInfo } from '../../interfaces/public-api';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\n\n/** Company/branch switcher displayed in top bar */\n@Component({\n selector: 'app-company-branch-selector',\n imports: [\n AngularModule,\n StyleClassModule,\n ButtonModule,\n SelectModule,\n TranslatePipe,\n ],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"onPanelToggle()\"\n >\n <i class=\"pi pi-building\"></i>\n <span>{{ currentCompanyName() }}</span>\n @if (currentBranchName()) {\n <span class=\"text-xs opacity-70\"> | {{ currentBranchName() }}</span>\n }\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[300px] max-w-[360px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\"\n >\n <div class=\"flex flex-col gap-4\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.company.branch.selector.title' | translate\n }}</span>\n\n <!-- Company Selector -->\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">{{\n 'shared.company' | translate\n }}</label>\n <p-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"onCompanyChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'layout.company.branch.selector.select.company' | translate\n \"\n class=\"w-full\"\n [loading]=\"isLoadingCompanies()\"\n />\n </div>\n\n <!-- Branch Selector -->\n @if (selectedCompanyId() && branches().length > 0) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.company.branch.selector.branch' | translate\n }}</label>\n <p-select\n [options]=\"branches()\"\n [ngModel]=\"selectedBranchId()\"\n (ngModelChange)=\"onBranchChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'layout.company.branch.selector.select.branch' | translate\n \"\n class=\"w-full\"\n [loading]=\"isLoadingBranches()\"\n />\n </div>\n }\n\n <!-- Actions -->\n <div class=\"flex gap-2 pt-2\">\n <p-button\n [label]=\"'layout.company.branch.selector.switch.button' | translate\"\n icon=\"pi pi-sync\"\n styleClass=\"flex-1\"\n [loading]=\"isSwitching()\"\n [disabled]=\"!canSwitch()\"\n (onClick)=\"onSwitch()\"\n />\n </div>\n </div>\n </div>\n `,\n})\nexport class AppCompanyBranchSelector {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n readonly currentCompanyName = computed(\n () =>\n this.authState?.currentCompanyInfo()?.name ??\n this.translate('layout.company.branch.selector.no.company'),\n );\n readonly currentBranchName = computed(\n () => this.authState?.currentBranchInfo()?.name ?? null,\n );\n\n private readonly _companies = signal<ICompanyInfo[]>([]);\n readonly companies = this._companies.asReadonly();\n private readonly _branches = signal<IBranchInfo[]>([]);\n readonly branches = this._branches.asReadonly();\n private readonly _selectedCompanyId = signal<string | null>(null);\n readonly selectedCompanyId = this._selectedCompanyId.asReadonly();\n private readonly _selectedBranchId = signal<string | null>(null);\n readonly selectedBranchId = this._selectedBranchId.asReadonly();\n private readonly _isLoadingCompanies = signal(false);\n readonly isLoadingCompanies = this._isLoadingCompanies.asReadonly();\n private readonly _isLoadingBranches = signal(false);\n readonly isLoadingBranches = this._isLoadingBranches.asReadonly();\n private readonly _isSwitching = signal(false);\n readonly isSwitching = this._isSwitching.asReadonly();\n\n readonly canSwitch = computed(() => {\n const selectedCompany = this.selectedCompanyId();\n if (!selectedCompany) return false;\n\n const currentCompanyId = this.authState?.currentCompanyInfo()?.id;\n const currentBranchId = this.authState?.currentBranchInfo()?.id;\n const selectedBranch = this.selectedBranchId();\n\n return (\n selectedCompany !== currentCompanyId || selectedBranch !== currentBranchId\n );\n });\n\n onPanelToggle(): void {\n this._isActive.update((v) => !v);\n if (this.isActive() && this.companies().length === 0) {\n this.loadCompanies();\n }\n }\n\n private loadCompanies(): void {\n if (!this.authApi) return;\n\n this._isLoadingCompanies.set(true);\n this.authApi\n .getUserCompanies()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (companies) => {\n this._companies.set(companies);\n this._isLoadingCompanies.set(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n this._isLoadingCompanies.set(false);\n },\n });\n }\n\n onCompanyChange(companyId: string | null): void {\n this._selectedCompanyId.set(companyId);\n\n if (!companyId) {\n this._branches.set([]);\n this._selectedBranchId.set(null);\n return;\n }\n\n this.loadBranches(companyId);\n }\n\n onBranchChange(branchId: string | null): void {\n this._selectedBranchId.set(branchId);\n }\n\n private loadBranches(companyId: string): void {\n if (!this.authApi) return;\n\n this._isLoadingBranches.set(true);\n this._selectedBranchId.set(null);\n\n this.authApi\n .getCompanyBranches(companyId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (branches) => {\n this._branches.set(branches);\n this._isLoadingBranches.set(false);\n\n // Auto-select if only one branch available\n if (branches.length === 1) {\n this._selectedBranchId.set(branches[0].id);\n }\n },\n error: () => {\n // Error toast handled by global interceptor\n this._isLoadingBranches.set(false);\n },\n });\n }\n\n onSwitch(): void {\n const selectedCompany = this.selectedCompanyId();\n const selectedBranch = this.selectedBranchId();\n\n if (!this.authApi || !selectedCompany) return;\n\n if (this.branches().length > 0 && !selectedBranch) {\n this.messageService.add({\n severity: 'warn',\n summary: this.translate(\n 'layout.company.branch.selector.branch.required',\n ),\n detail: this.translate(\n 'layout.company.branch.selector.please.select.branch',\n ),\n });\n return;\n }\n\n this._isSwitching.set(true);\n\n this.authApi\n .switchCompany(selectedCompany, selectedBranch || '')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {},\n error: () => {\n // Error toast handled by global interceptor\n this._isSwitching.set(false);\n },\n });\n }\n\n private translate(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IconComponent, TranslatePipe } from '@flusys/ng-shared';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-launcher',\n imports: [StyleClassModule, IconComponent, TranslatePipe],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\"\n >\n <i class=\"pi pi-th-large\"></i>\n <span>{{ 'layout.launcher.apps' | translate }}</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\"\n >\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.launcher.applications' | translate\n }}</span>\n <div class=\"grid grid-cols-2 sm:grid-cols-3 gap-2\">\n @for (app of layoutService.apps(); track app.id) {\n <a\n class=\"group flex flex-col items-center p-2 rounded-border cursor-pointer no-underline transition-all duration-200 hover:bg-emphasis\"\n [href]=\"app.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <div\n class=\"flex items-center justify-center w-10 h-10 rounded-border bg-emphasis group-hover:bg-primary transition-all duration-200\"\n >\n <lib-icon\n [icon]=\"app.icon\"\n [iconType]=\"app.iconType\"\n class=\"text-xl text-primary group-hover:text-primary-contrast transition-colors duration-200\"\n />\n </div>\n <span\n class=\"text-xs mt-2 text-center text-muted-color group-hover:text-color transition-colors duration-200 truncate max-w-full\"\n >{{ app.nameKey ? (app.nameKey | translate) : app.name }}</span\n >\n </a>\n }\n </div>\n </div>\n </div>\n `,\n})\nexport class AppLauncher {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n readonly layoutService = inject(LayoutService);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this._isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this._isActive.update((v) => !v);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { APP_CONFIG, isSignUpEnabled } from '@flusys/ng-core';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-profile',\n imports: [AngularModule, StyleClassModule, TranslatePipe],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\"\n >\n <i class=\"pi pi-user\"></i>\n <span>{{ 'layout.profile.title' | translate }}</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\"\n >\n <div class=\"flex flex-col gap-3\">\n <!-- User Info -->\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline hover:bg-emphasis transition-all duration-200\"\n routerLink=\"/profile\"\n >\n @if (profilePicture()) {\n <img\n [src]=\"profilePicture()\"\n class=\"w-12 h-12 rounded-border object-cover\"\n [alt]=\"'layout.profile.profile.picture.alt' | translate\"\n />\n } @else {\n <div\n class=\"w-12 h-12 rounded-border bg-primary flex items-center justify-center\"\n >\n <i class=\"pi pi-user text-xl text-primary-contrast\"></i>\n </div>\n }\n <div class=\"flex flex-col min-w-0 flex-1\">\n <span class=\"font-semibold text-color truncate\">{{\n userName()\n }}</span>\n <span class=\"text-sm text-muted-color truncate\">{{\n userEmail()\n }}</span>\n </div>\n </a>\n\n <!-- Divider -->\n <div class=\"border-t border-surface\"></div>\n\n <!-- Menu Items -->\n <div class=\"flex flex-col gap-1\">\n @if (signUpEnabled()) {\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"copySignUpLink()\"\n >\n <i class=\"pi pi-link text-muted-color\"></i>\n <span>{{ 'layout.profile.copy.sign.up.link' | translate }}</span>\n </a>\n }\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"logout()\"\n >\n <i class=\"pi pi-sign-out text-muted-color\"></i>\n <span>{{ 'layout.profile.logout' | translate }}</span>\n </a>\n </div>\n </div>\n </div>\n `,\n})\nexport class AppProfile {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly layoutService = inject(LayoutService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly appConfig = inject(APP_CONFIG, { optional: true });\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this._isActive.update((v) => !v);\n }\n\n readonly userName = computed(\n () =>\n this.authState?.loginUserData()?.name ??\n this.translate('layout.profile.guest'),\n );\n readonly userEmail = computed(\n () => this.authState?.loginUserData()?.email ?? '',\n );\n readonly profilePicture = computed(\n () => this.layoutService.userProfilePictureUrl() ?? '',\n );\n readonly signUpEnabled = computed(() =>\n this.appConfig ? isSignUpEnabled(this.appConfig) : false,\n );\n\n logout(): void {\n if (!this.authApi) return;\n\n this.authApi\n .logOut()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (result) => {\n const r = result as unknown as {\n messageKey?: string;\n messageVariables?: Record<string, string | number>;\n message?: string;\n };\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: r?.messageKey\n ? this.translate(r.messageKey, r.messageVariables)\n : (r?.message ?? ''),\n });\n this.authApi?.navigateLogin(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n },\n });\n }\n\n copySignUpLink(): void {\n const slug = this.authState?.currentCompanyInfo()?.slug ?? '';\n const signUpLink = `${window.location.origin}/auth/register?companySlug=${slug}`;\n navigator.clipboard\n .writeText(signUpLink)\n .then(() => {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('layout.profile.link.copied'),\n detail: this.translate('layout.profile.sign.up.link.copied'),\n });\n })\n .catch(() => {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.error'),\n detail: this.translate('layout.profile.failed.copy.sign.up.link'),\n });\n });\n }\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { fromEvent } from 'rxjs';\nimport {\n ISearchSuggestion,\n LAYOUT_SEARCH_ADAPTER,\n} from '../../interfaces/layout-auth.interface';\nimport { LayoutService } from '../../services/public-api';\n\n@Component({\n selector: 'app-searchbar',\n imports: [AngularModule, PrimeModule, TranslatePipe],\n template: `\n <div\n class=\"search-container h-full\"\n #searchWrapper\n [class.topbar-mode]=\"layoutService.isTopbar() || isResponsive()\"\n >\n @if (layoutService.isTopbar() || isResponsive()) {\n <!-- Topbar/Mobile Icon Mode -->\n <button\n type=\"button\"\n pButton\n pRipple\n class=\"search-toggle-btn\"\n icon=\"pi pi-search\"\n (click)=\"toggleSearch()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n severity=\"secondary\"\n text\n ></button>\n\n @if (isSearchExpanded()) {\n <div class=\"search-dropdown-panel\">\n <p-iconfield class=\"search-iconfield\">\n <p-inputicon class=\"pi pi-search search-icon\" />\n <input\n type=\"text\"\n pInputText\n class=\"search-input w-full\"\n [placeholder]=\"'layout.topbar.search.placeholder' | translate\"\n [(ngModel)]=\"searchTerm\"\n (keyup.enter)=\"handleEnter()\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n #searchInput\n autocomplete=\"off\"\n />\n </p-iconfield>\n\n @if (suggestionsOpen() && suggestions().length > 0) {\n <div class=\"search-suggestions\">\n <ul class=\"suggestions-list\">\n @for (\n item of suggestions();\n track item.label;\n let idx = $index\n ) {\n <li\n class=\"suggestion-item\"\n [class.focused]=\"idx === focusedIndex()\"\n (click)=\"selectSuggestion(item)\"\n (mouseenter)=\"focusedIndex.set(idx)\"\n role=\"option\"\n [attr.aria-selected]=\"idx === focusedIndex()\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" class=\"suggestion-icon\"></i>\n }\n <span class=\"suggestion-label\">{{ item.label }}</span>\n </li>\n }\n </ul>\n </div>\n }\n </div>\n }\n } @else {\n <!-- Desktop Full Input Mode -->\n <p-iconfield class=\"search-iconfield\">\n <p-inputicon class=\"pi pi-search search-icon\" (click)=\"onSearch()\" />\n <input\n type=\"text\"\n pInputText\n class=\"search-input w-full\"\n [placeholder]=\"'layout.topbar.search.placeholder' | translate\"\n [(ngModel)]=\"searchTerm\"\n (keyup.enter)=\"handleEnter()\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n #searchInput\n />\n </p-iconfield>\n\n @if (suggestionsOpen() && suggestions().length > 0) {\n <div class=\"search-dropdown\">\n <ul class=\"suggestions-list\">\n @for (item of suggestions(); track item.label; let idx = $index) {\n <li\n class=\"suggestion-item\"\n [class.focused]=\"idx === focusedIndex()\"\n (click)=\"selectSuggestion(item)\"\n (mouseenter)=\"focusedIndex.set(idx)\"\n role=\"option\"\n [attr.aria-selected]=\"idx === focusedIndex()\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" class=\"suggestion-icon\"></i>\n }\n <span class=\"suggestion-label\">{{ item.label }}</span>\n </li>\n }\n </ul>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n .search-container {\n display: flex;\n align-items: center;\n position: relative;\n width: 100%;\n flex: 0 1 auto;\n }\n\n .search-container.topbar-mode {\n width: auto;\n }\n\n .search-dropdown-panel {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 0.5rem;\n background-color: var(--surface-card);\n border: 1px solid var(--surface-border);\n border-radius: var(--border-radius);\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n z-index: 1100;\n padding: 1rem 0.75rem 0.75rem 0.75rem;\n min-width: 300px;\n max-width: 450px;\n animation: slideDown 0.2s ease-out;\n }\n\n .search-suggestions {\n margin-top: 0.5rem;\n border-top: 1px solid var(--surface-border);\n padding-top: 0.5rem;\n background-color: inherit;\n }\n\n .suggestions-list {\n list-style: none;\n margin: 0;\n padding: 0;\n max-height: 360px;\n overflow-y: auto;\n background-color: inherit;\n }\n\n .suggestion-item {\n padding: 0.75rem 1rem;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n color: var(--text-color);\n border-bottom: 1px solid var(--surface-border);\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n .suggestion-item:last-child {\n border-bottom: none;\n }\n\n .suggestion-item:hover,\n .suggestion-item.focused {\n background-color: var(--surface-50);\n color: var(--primary-color);\n }\n\n .suggestion-icon {\n color: var(--text-color-secondary);\n font-size: 1rem;\n flex-shrink: 0;\n transition: color 0.15s ease;\n }\n\n .suggestion-item:hover .suggestion-icon,\n .suggestion-item.focused .suggestion-icon {\n color: var(--primary-color);\n }\n\n .suggestion-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .search-dropdown {\n position: absolute;\n top: calc(100% + 0.5rem);\n left: 0;\n right: 0;\n background-color: var(--surface-card);\n border: 1px solid var(--surface-border);\n border-radius: var(--border-radius);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n overflow: hidden;\n }\n\n .search-dropdown .suggestions-list {\n background-color: inherit;\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Responsive styles */\n @media (max-width: 768px) {\n .search-dropdown-panel {\n min-width: 280px;\n max-width: 400px;\n }\n }\n\n @media (max-width: 576px) {\n .search-dropdown-panel {\n position: fixed;\n top: 4rem;\n left: 0;\n right: 0;\n bottom: auto;\n width: 100vw;\n min-width: 100vw;\n max-width: 100vw;\n margin-top: 0;\n padding: 1rem;\n border-radius: 0;\n border-bottom: 1px solid var(--surface-border);\n z-index: 1200;\n }\n\n .search-dropdown-panel .search-iconfield {\n margin-bottom: 1rem;\n }\n\n .search-dropdown {\n max-width: 100%;\n left: 0 !important;\n right: 0 !important;\n transform: none;\n position: static;\n border-radius: var(--border-radius);\n margin-top: 0;\n }\n\n .suggestion-item {\n padding: 0.75rem;\n }\n }\n `,\n ],\n})\nexport class AppSearchbar {\n readonly layoutService = inject(LayoutService);\n private readonly router = inject(Router);\n private readonly searchAdapter = inject(LAYOUT_SEARCH_ADAPTER, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n\n readonly searchTerm = signal<string>('');\n readonly suggestionsOpen = signal<boolean>(false);\n readonly suggestions = signal<ISearchSuggestion[]>([]);\n readonly focusedIndex = signal<number>(-1);\n readonly isSearchExpanded = signal<boolean>(false);\n readonly isResponsive = signal<boolean>(\n typeof window !== 'undefined' ? window.innerWidth < 768 : false,\n );\n\n private readonly searchWrapper = viewChild<ElementRef>('searchWrapper');\n private readonly searchInput = viewChild<ElementRef>('searchInput');\n private searchTimeout?: ReturnType<typeof setTimeout>;\n\n constructor() {\n // Track responsive breakpoint (mobile < 768px)\n if (typeof window !== 'undefined') {\n fromEvent(window, 'resize')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.isResponsive.set(window.innerWidth < 768);\n });\n }\n\n // Close dropdown/search on outside click\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n const wrapper = this.searchWrapper()?.nativeElement;\n const target = event.target as HTMLElement;\n\n if (wrapper && !wrapper.contains(target)) {\n if (this.suggestionsOpen()) {\n this.closeSuggestions();\n }\n if (\n this.isSearchExpanded() &&\n (this.layoutService.isTopbar() || this.isResponsive())\n ) {\n this.closeSearch();\n }\n }\n });\n\n // Debounced search for suggestions\n effect(() => {\n const query = this.searchTerm();\n clearTimeout(this.searchTimeout);\n\n if (!this.searchAdapter || !query.trim()) {\n this.suggestions.set([]);\n this.focusedIndex.set(-1);\n return;\n }\n\n this.searchTimeout = setTimeout(() => {\n this.searchAdapter!.getSuggestions(query)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((results) => {\n this.suggestions.set(results);\n this.focusedIndex.set(-1);\n this.suggestionsOpen.set(results.length > 0);\n });\n }, 300);\n });\n }\n\n onFocus(): void {\n if (this.suggestions().length > 0) {\n this.suggestionsOpen.set(true);\n }\n }\n\n handleKeydown(event: KeyboardEvent): void {\n const items = this.suggestions();\n const current = this.focusedIndex();\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.focusedIndex.set(current < items.length - 1 ? current + 1 : 0);\n this.suggestionsOpen.set(items.length > 0);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.focusedIndex.set(current > 0 ? current - 1 : items.length - 1);\n break;\n case 'Escape':\n event.preventDefault();\n this.closeSuggestions();\n break;\n }\n }\n\n handleEnter(): void {\n const current = this.focusedIndex();\n const items = this.suggestions();\n\n if (current >= 0 && current < items.length) {\n this.selectSuggestion(items[current]);\n } else if (items.length > 0) {\n this.selectSuggestion(items[0]);\n } else {\n this.onSearch();\n }\n }\n\n selectSuggestion(item: ISearchSuggestion): void {\n if (item.routerLink) {\n this.router.navigate(item.routerLink);\n }\n this.searchTerm.set('');\n this.closeSuggestions();\n if (this.layoutService.isTopbar() || this.isResponsive()) {\n this.closeSearch();\n }\n }\n\n private closeSuggestions(): void {\n this.suggestionsOpen.set(false);\n this.focusedIndex.set(-1);\n }\n\n toggleSearch(): void {\n this.isSearchExpanded.set(!this.isSearchExpanded());\n if (this.isSearchExpanded()) {\n setTimeout(() => {\n this.searchInput()?.nativeElement?.focus();\n }, 100);\n }\n }\n\n private closeSearch(): void {\n this.isSearchExpanded.set(false);\n this.closeSuggestions();\n }\n\n onSearch(): void {\n const query = this.searchTerm();\n if (this.searchAdapter?.onSearch && query.trim()) {\n this.searchAdapter.onSearch(query);\n }\n }\n}\n","import { DOCUMENT, NgComponentOutlet } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n computed,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterModule } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n LAYOUT_LANGUAGE_SELECTOR,\n LAYOUT_NOTIFICATION_BELL,\n LAYOUT_SEARCH_ADAPTER,\n} from '../interfaces/layout-auth.interface';\nimport { LayoutService } from '../services/public-api';\nimport { AppConfigurator } from './app.configurator';\nimport { AppMenu } from './app.menu';\nimport { AppCompanyBranchSelector } from './top-bar/app.company-branch-selector';\nimport { AppLauncher } from './top-bar/app.launcher';\nimport { AppProfile } from './top-bar/app.profile';\nimport { AppSearchbar } from './top-bar/app.searchbar';\n\ntype ActivePanel = 'config' | null;\n\n@Component({\n selector: 'app-topbar',\n imports: [\n RouterModule,\n StyleClassModule,\n NgComponentOutlet,\n TranslatePipe,\n AppConfigurator,\n AppMenu,\n AppProfile,\n AppCompanyBranchSelector,\n AppLauncher,\n AppSearchbar,\n ],\n template: `<div class=\"layout-topbar\">\n <div\n class=\"layout-topbar-logo-container\"\n [class.layout-topbar-logo-container-desktop]=\"layoutService.isDesktop()\"\n >\n @if (!layoutService.isTopbar() && layoutService.isMobile()) {\n <button\n class=\"layout-menu-button layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.toggle.menu' | translate\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <i class=\"pi pi-bars\"></i>\n </button>\n }\n <a class=\"layout-topbar-logo\" routerLink=\"/\">\n @if (displayLogo()) {\n <img [src]=\"displayLogo()\" [alt]=\"companyName()\" class=\"logo-image\" />\n }\n <span class=\"hidden sm:inline\">{{ companyName() }}</span>\n </a>\n @if (!layoutService.isTopbar() && layoutService.isDesktop()) {\n <button\n class=\"layout-menu-button layout-topbar-action layout-topbar-action-right\"\n [attr.aria-label]=\"'layout.topbar.toggle.menu' | translate\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <i class=\"pi pi-bars\"></i>\n </button>\n }\n </div>\n\n @if (layoutService.isTopbar() && layoutService.isDesktop()) {\n <div\n #navContainer\n class=\"layout-topbar-nav-horizontal\"\n [class.layout-topbar-nav-hidden]=\"\n !layoutService.layoutState().topbarMenuVisible\n \"\n >\n <app-menu />\n </div>\n }\n\n <div class=\"layout-topbar-actions\">\n @if (hasSearchAdapter()) {\n <app-searchbar />\n }\n <div class=\"layout-config-menu\">\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.toggle.dark.mode' | translate\"\n (click)=\"toggleDarkMode()\"\n >\n <i\n class=\"pi\"\n [class.pi-moon]=\"layoutService.isDarkTheme()\"\n [class.pi-sun]=\"!layoutService.isDarkTheme()\"\n ></i>\n </button>\n <div class=\"relative\" #configContainer>\n <button\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"activePanel() === 'config'\"\n [attr.aria-label]=\"'layout.topbar.open.theme.settings' | translate\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel('config')\"\n >\n <i class=\"pi pi-palette\"></i>\n </button>\n <app-configurator />\n </div>\n </div>\n\n <button\n class=\"layout-topbar-menu-button layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.more.options' | translate\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n >\n <i class=\"pi pi-ellipsis-v\"></i>\n </button>\n\n <div class=\"layout-topbar-menu hidden lg:block\">\n <div class=\"layout-topbar-menu-content\">\n @if (layoutService.hasApps()) {\n <app-launcher />\n }\n @if (languageSelectorComponent) {\n <ng-container *ngComponentOutlet=\"languageSelectorComponent\" />\n }\n @if (enableCompanyFeature) {\n <app-company-branch-selector />\n }\n @if (notificationBellComponent) {\n <ng-container *ngComponentOutlet=\"notificationBellComponent\" />\n }\n <app-profile />\n </div>\n </div>\n </div>\n </div>`,\n})\nexport class AppTopbar {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n readonly layoutService = inject(LayoutService);\n readonly notificationBellComponent = inject(LAYOUT_NOTIFICATION_BELL, {\n optional: true,\n });\n readonly languageSelectorComponent = inject(LAYOUT_LANGUAGE_SELECTOR, {\n optional: true,\n });\n private readonly searchAdapter = inject(LAYOUT_SEARCH_ADAPTER, {\n optional: true,\n });\n\n readonly hasSearchAdapter = computed(() => !!this.searchAdapter);\n\n private readonly configContainer =\n viewChild<ElementRef<HTMLElement>>('configContainer');\n private readonly navContainer =\n viewChild<ElementRef<HTMLElement>>('navContainer');\n\n readonly activePanel = signal<ActivePanel>(null);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.activePanel() !== null),\n )\n .subscribe((event) => {\n this.handleOutsideClick(event);\n });\n\n effect(() => {\n const nav = this.navContainer();\n if (nav && this.layoutService.isTopbar()) {\n fromEvent(nav.nativeElement, 'scroll')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.recalculateHoveredSubmenu(nav.nativeElement));\n }\n });\n }\n\n readonly companyName = this.layoutService.companyName;\n readonly displayLogo = this.layoutService.displayLogo;\n\n readonly enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);\n\n toggleDarkMode(): void {\n const currentDarkTheme = this.layoutService.layoutConfig().darkTheme;\n this.layoutService.updateLayoutConfig({ darkTheme: !currentDarkTheme });\n }\n\n togglePanel(panel: ActivePanel): void {\n this.activePanel.update((current) => (current === panel ? null : panel));\n }\n\n private handleOutsideClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n const configEl = this.configContainer()?.nativeElement;\n\n if (configEl && !configEl.contains(target)) {\n this.activePanel.set(null);\n }\n }\n\n private recalculateHoveredSubmenu(navEl: HTMLElement): void {\n const hoveredItems = navEl.querySelectorAll('li:hover');\n hoveredItems.forEach((li) => {\n const link = li.querySelector(':scope > a') as HTMLElement | null;\n if (!link) return;\n const rect = link.getBoundingClientRect();\n const top = rect.bottom + 12;\n const left = rect.left - 12;\n (li as HTMLElement).style.setProperty('--submenu-left', `${left}px`);\n (li as HTMLElement).style.setProperty('--submenu-top', `${top}px`);\n });\n }\n}\n","import { Component } from '@angular/core';\nimport { AppMenu } from './app.menu';\n\n@Component({\n selector: 'app-sidebar',\n imports: [AppMenu],\n template: `\n <div class=\"layout-sidebar\">\n <app-menu />\n </div>\n `,\n})\nexport class AppSidebar {}\n","import { NgClass } from '@angular/common';\nimport { Component, computed, DestroyRef, DOCUMENT, inject, Renderer2 } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AppTopbar } from './app.topbar';\nimport { AppSidebar } from './app.sidebar';\nimport { AppFooter } from './app.footer';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-layout',\n imports: [NgClass, AppTopbar, AppSidebar, RouterModule, AppFooter],\n template: `\n <div class=\"layout-wrapper\" [ngClass]=\"containerClass()\">\n <app-topbar></app-topbar>\n <app-sidebar></app-sidebar>\n <div class=\"layout-main-container\">\n <div class=\"layout-main\">\n <router-outlet></router-outlet>\n </div>\n <app-footer></app-footer>\n </div>\n <div class=\"layout-mask animate-fadein\"></div>\n </div>\n `,\n})\nexport class AppLayout {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n readonly layoutService = inject(LayoutService);\n private readonly renderer = inject(Renderer2);\n private readonly router = inject(Router);\n\n private menuOutsideClickListener: (() => void) | null = null;\n\n constructor() {\n this.layoutService.overlayOpen$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (!this.menuOutsideClickListener) {\n this.menuOutsideClickListener = this.renderer.listen(\n this.document,\n 'click',\n (event) => {\n if (this.isOutsideClicked(event)) {\n this.hideMenu();\n }\n }\n );\n }\n if (this.layoutService.layoutState().staticMenuMobileActive) {\n this.blockBodyScroll();\n }\n });\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => this.hideMenu());\n }\n\n isOutsideClicked(event: MouseEvent): boolean {\n const sidebarEl = this.document.querySelector('.layout-sidebar');\n const topbarEl = this.document.querySelector('.layout-menu-button');\n const topbarNavEl = this.document.querySelector('.layout-topbar-nav');\n const eventTarget = event.target as Node;\n\n return !(\n sidebarEl?.isSameNode(eventTarget) ||\n sidebarEl?.contains(eventTarget) ||\n topbarEl?.isSameNode(eventTarget) ||\n topbarEl?.contains(eventTarget) ||\n topbarNavEl?.isSameNode(eventTarget) ||\n topbarNavEl?.contains(eventTarget)\n );\n }\n\n hideMenu(): void {\n this.layoutService.updateLayoutState({\n overlayMenuActive: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n });\n if (this.menuOutsideClickListener) {\n this.menuOutsideClickListener();\n this.menuOutsideClickListener = null;\n }\n this.unblockBodyScroll();\n }\n\n blockBodyScroll(): void {\n this.document.body.classList.add('blocked-scroll');\n }\n\n unblockBodyScroll(): void {\n this.document.body.classList.remove('blocked-scroll');\n }\n\n readonly containerClass = computed(() => {\n const config = this.layoutService.layoutConfig();\n const state = this.layoutService.layoutState();\n return {\n 'layout-overlay': config.menuMode === 'overlay',\n 'layout-static': config.menuMode === 'static',\n 'layout-topbar-mode': config.menuMode === 'topbar',\n 'layout-static-inactive': state.staticMenuDesktopInactive && config.menuMode === 'static',\n 'layout-overlay-active': state.overlayMenuActive,\n 'layout-mobile-active': state.staticMenuMobileActive,\n 'layout-topbar-nav-hidden': !state.topbarMenuVisible && config.menuMode === 'topbar',\n };\n });\n}\n","\nimport Material from '@primeuix/themes/material';\nimport { definePreset } from '@primeuix/themes';\n\nexport const NavyBlueTheme = definePreset(Material, {\n semantic: {\n colorScheme: {\n light: {\n primary: {\n color: '#3535cd',\n inverseColor: '#0707a9',\n hoverColor: '#0707a9',\n activeColor: '#0707a9',\n },\n highlight: {\n background: '#e2e8f0',\n focusBackground: '#e2e8f0',\n color: '#3535cd',\n focusColor: '#3535cd',\n },\n },\n },\n },\n });","\nimport Material from '@primeuix/themes/material';\nimport { definePreset } from '@primeuix/themes';\n\nexport const GreenTheme = definePreset(Material, {\n semantic: {\n colorScheme: {\n light: {\n primary: {\n color: '#01712c',\n inverseColor: '#119744',\n hoverColor: '#119744',\n activeColor: '#119744',\n },\n highlight: {\n background: '#e2e8f0',\n focusBackground: '#e2e8f0',\n color: '#01712c',\n focusColor: '#01712c',\n },\n },\n },\n },\n});","export const LAYOUT_MESSAGES: Record<string, string> = {\n // components/top-bar/app.profile.ts\n 'layout.profile.title': 'Profile',\n 'layout.profile.profile.picture.alt': 'Profile picture',\n 'layout.profile.copy.sign.up.link': 'Copy SignUp Link',\n 'layout.profile.logout': 'Logout',\n 'layout.profile.guest': 'Guest',\n 'layout.profile.link.copied': 'Link Copied',\n 'layout.profile.sign.up.link.copied': 'Sign Up Link copied.',\n 'layout.profile.failed.copy.sign.up.link': 'Failed to copy signup link.',\n\n // components/top-bar/app.launcher.ts\n 'layout.launcher.apps': 'Apps',\n 'layout.launcher.applications': 'Applications',\n\n // components/top-bar/app.company-branch-selector.ts\n 'layout.company.branch.selector.title': 'Switch Company & Branch',\n 'layout.company.branch.selector.select.company': 'Select Company',\n 'layout.company.branch.selector.branch': 'Branch',\n 'layout.company.branch.selector.select.branch': 'Select Branch',\n 'layout.company.branch.selector.switch.button': 'Switch',\n 'layout.company.branch.selector.no.company': 'No Company',\n 'layout.company.branch.selector.branch.required': 'Branch Required',\n 'layout.company.branch.selector.please.select.branch':\n 'Please select a branch',\n\n // components/top-bar/app.searchbar.ts\n 'layout.topbar.search': 'Search',\n 'layout.topbar.search.placeholder': 'Search for content...',\n\n // components/app.topbar.ts\n 'layout.topbar.toggle.menu': 'Toggle menu',\n 'layout.topbar.toggle.dark.mode': 'Toggle dark mode',\n 'layout.topbar.open.theme.settings': 'Open theme settings',\n 'layout.topbar.more.options': 'More options',\n\n // components/app.configurator.ts\n 'layout.configurator.primary': 'Primary',\n 'layout.configurator.surface': 'Surface',\n 'layout.configurator.presets': 'Presets',\n 'layout.configurator.menu.mode': 'Menu Mode',\n 'layout.configurator.menu.mode.static': 'Static',\n 'layout.configurator.menu.mode.overlay': 'Overlay',\n 'layout.configurator.menu.mode.topbar': 'Topbar',\n\n // components/app.footer.ts\n 'layout.footer.by': 'by',\n\n // app-menu.config.ts (main app menu configuration)\n 'menu.dashboard': 'Dashboard',\n 'menu.administration': 'Administration',\n 'menu.iam': 'IAM',\n 'menu.storage': 'Storage',\n 'menu.forms': 'Forms',\n 'menu.email': 'Email',\n 'menu.event.manager': 'Event Manager',\n 'menu.notifications': 'Notifications',\n 'menu.localization': 'Localization',\n\n // Those are layout part from notification module, but we put them here to avoid circular dependency between layout and notification module\n\n // components/notification-bell/notification-bell.component.ts\n 'notification.title': 'Notifications',\n\n // components/notification-list/notification-list.component.ts\n 'notification.mark.all.read': 'Mark all read',\n 'notification.view.all': 'View all notifications',\n 'notification.empty': 'No notifications',\n\n // components/notification-item/notification-item.component.ts\n 'notification.time.just.now': 'Just now',\n 'notification.time.minutes.ago': '{{count}}m ago',\n 'notification.time.hours.ago': '{{count}}h ago',\n 'notification.time.days.ago': '{{count}}d ago',\n};\n","// Components\nexport * from './components/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Services\nexport * from './services/public-api';\n\n// Utils\nexport * from './utils/public-api';\n\n// Themes\nexport * from './theme/public-api';\n\n// Constants\nexport * from './constants/index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","DOCUMENT","i2","i3","i4","i6","filter"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flusys/ng-layout",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.4",
|
|
4
4
|
"description": "Layout components for FLUSYS Angular applications",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"peerDependencies": {
|
|
7
7
|
"@angular/common": ">=21.0.0",
|
|
8
8
|
"@angular/core": ">=21.0.0",
|
|
9
9
|
"@angular/router": ">=21.0.0",
|
|
10
|
-
"@flusys/ng-core": ">=5.0.
|
|
11
|
-
"@flusys/ng-shared": ">=5.0.
|
|
10
|
+
"@flusys/ng-core": ">=5.0.4",
|
|
11
|
+
"@flusys/ng-shared": ">=5.0.4",
|
|
12
12
|
"@primeuix/themes": ">=1.0.0",
|
|
13
13
|
"primeicons": ">=7.0.0",
|
|
14
14
|
"primeng": ">=21.0.0",
|