@es.framework/ng.ui.theme 2.0.56 → 2.0.57

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.
@@ -210,36 +210,36 @@ class LanguagesComponent {
210
210
  }
211
211
  }
212
212
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LanguagesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
213
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: LanguagesComponent, isStandalone: true, selector: "abp-languages", ngImport: i0, template: `
214
- @if (languages(); as langs) {
215
- <div>
216
- <!-- -->
217
- <button
218
- pButton
219
- type="button"
220
- icon="pi pi-globe"
221
- class="p-button-text"
222
- [title]="'اختر اللغة'"
223
- (click)="overlay.toggle($event)"
224
- ></button>
225
- <p-popover #overlay >
226
- <ul class="w-48">
227
- @for (lang of langs; track lang) {
228
- <li
229
- class="flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-gray-100"
230
- (click)="onSelectLanguage(lang.cultureName ?? ''); overlay.hide()"
231
- >
232
- <span>{{ lang.displayName }}</span>
233
- @if (lang.cultureName === selectedLang()) {
234
- <i class="pi pi-check text-green-500"></i>
235
- }
236
- </li>
237
- }
238
- </ul>
239
- </p-popover>
240
- </div>
241
- }
242
-
213
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: LanguagesComponent, isStandalone: true, selector: "abp-languages", ngImport: i0, template: `
214
+ @if (languages(); as langs) {
215
+ <div>
216
+ <!-- -->
217
+ <button
218
+ pButton
219
+ type="button"
220
+ icon="pi pi-globe"
221
+ class="p-button-text"
222
+ [title]="'اختر اللغة'"
223
+ (click)="overlay.toggle($event)"
224
+ ></button>
225
+ <p-popover #overlay >
226
+ <ul class="w-48">
227
+ @for (lang of langs; track lang) {
228
+ <li
229
+ class="flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-gray-100"
230
+ (click)="onSelectLanguage(lang.cultureName ?? ''); overlay.hide()"
231
+ >
232
+ <span>{{ lang.displayName }}</span>
233
+ @if (lang.cultureName === selectedLang()) {
234
+ <i class="pi pi-check text-green-500"></i>
235
+ }
236
+ </li>
237
+ }
238
+ </ul>
239
+ </p-popover>
240
+ </div>
241
+ }
242
+
243
243
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: SelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i1.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }] });
244
244
  }
245
245
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LanguagesComponent, decorators: [{
@@ -248,36 +248,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
248
248
  selector: 'abp-languages',
249
249
  standalone: true,
250
250
  imports: [SelectModule, FormsModule, PopoverModule, ButtonModule],
251
- template: `
252
- @if (languages(); as langs) {
253
- <div>
254
- <!-- -->
255
- <button
256
- pButton
257
- type="button"
258
- icon="pi pi-globe"
259
- class="p-button-text"
260
- [title]="'اختر اللغة'"
261
- (click)="overlay.toggle($event)"
262
- ></button>
263
- <p-popover #overlay >
264
- <ul class="w-48">
265
- @for (lang of langs; track lang) {
266
- <li
267
- class="flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-gray-100"
268
- (click)="onSelectLanguage(lang.cultureName ?? ''); overlay.hide()"
269
- >
270
- <span>{{ lang.displayName }}</span>
271
- @if (lang.cultureName === selectedLang()) {
272
- <i class="pi pi-check text-green-500"></i>
273
- }
274
- </li>
275
- }
276
- </ul>
277
- </p-popover>
278
- </div>
279
- }
280
-
251
+ template: `
252
+ @if (languages(); as langs) {
253
+ <div>
254
+ <!-- -->
255
+ <button
256
+ pButton
257
+ type="button"
258
+ icon="pi pi-globe"
259
+ class="p-button-text"
260
+ [title]="'اختر اللغة'"
261
+ (click)="overlay.toggle($event)"
262
+ ></button>
263
+ <p-popover #overlay >
264
+ <ul class="w-48">
265
+ @for (lang of langs; track lang) {
266
+ <li
267
+ class="flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-gray-100"
268
+ (click)="onSelectLanguage(lang.cultureName ?? ''); overlay.hide()"
269
+ >
270
+ <span>{{ lang.displayName }}</span>
271
+ @if (lang.cultureName === selectedLang()) {
272
+ <i class="pi pi-check text-green-500"></i>
273
+ }
274
+ </li>
275
+ }
276
+ </ul>
277
+ </p-popover>
278
+ </div>
279
+ }
280
+
281
281
  `
282
282
  }]
283
283
  }], ctorParameters: () => [] });
@@ -636,53 +636,53 @@ class AppConfigurator {
636
636
  this.layoutService.layoutConfig.update((prev) => ({ ...prev, menuMode: event }));
637
637
  }
638
638
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
639
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppConfigurator, isStandalone: true, selector: "app-configurator", ngImport: i0, template: `
640
- <div class="flex flex-col gap-4">
641
- <div>
642
- <span class="text-sm text-muted-color font-semibold">Primary</span>
643
- <div class="pt-2 flex gap-2 flex-wrap justify-start">
644
- @for (primaryColor of primaryColors(); track primaryColor.name) {
645
- <button
646
- type="button"
647
- [title]="primaryColor.name"
648
- (click)="updateColors($event, 'primary', primaryColor)"
649
- [ngClass]="{ 'outline-primary': primaryColor.name === selectedPrimaryColor() }"
650
- class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
651
- [style]="{
652
- 'background-color': primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']
653
- }"
654
- ></button>
655
- }
656
- </div>
657
- </div>
658
- <div>
659
- <span class="text-sm text-muted-color font-semibold">Surface</span>
660
- <div class="pt-2 flex gap-2 flex-wrap justify-start">
661
- @for (surface of surfaces; track surface.name) {
662
- <button
663
- type="button"
664
- [title]="surface.name"
665
- (click)="updateColors($event, 'surface', surface)"
666
- [ngClass]="{ 'outline-primary': selectedSurfaceColor() ? selectedSurfaceColor() === surface.name : layoutService.layoutConfig().darkTheme ? surface.name === 'zinc' : surface.name === 'slate' }"
667
- class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
668
- [style]="{
669
- 'background-color': surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']
670
- }"
671
- ></button>
672
- }
673
- </div>
674
- </div>
675
- <div class="flex flex-col gap-2">
676
- <span class="text-sm text-muted-color font-semibold">Presets</span>
677
- <p-selectbutton [options]="presets" [ngModel]="selectedPreset()" (ngModelChange)="onPresetChange($event)" [allowEmpty]="false" size="small" />
678
- </div>
679
- @if (showMenuModeButton()) {
680
- <div class="flex flex-col gap-2">
681
- <span class="text-sm text-muted-color font-semibold">Menu Mode</span>
682
- <p-selectbutton [ngModel]="menuMode()" (ngModelChange)="onMenuModeChange($event)" [options]="menuModeOptions" [allowEmpty]="false" size="small" />
683
- </div>
684
- }
685
- </div>
639
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppConfigurator, isStandalone: true, selector: "app-configurator", ngImport: i0, template: `
640
+ <div class="flex flex-col gap-4">
641
+ <div>
642
+ <span class="text-sm text-muted-color font-semibold">Primary</span>
643
+ <div class="pt-2 flex gap-2 flex-wrap justify-start">
644
+ @for (primaryColor of primaryColors(); track primaryColor.name) {
645
+ <button
646
+ type="button"
647
+ [title]="primaryColor.name"
648
+ (click)="updateColors($event, 'primary', primaryColor)"
649
+ [ngClass]="{ 'outline-primary': primaryColor.name === selectedPrimaryColor() }"
650
+ class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
651
+ [style]="{
652
+ 'background-color': primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']
653
+ }"
654
+ ></button>
655
+ }
656
+ </div>
657
+ </div>
658
+ <div>
659
+ <span class="text-sm text-muted-color font-semibold">Surface</span>
660
+ <div class="pt-2 flex gap-2 flex-wrap justify-start">
661
+ @for (surface of surfaces; track surface.name) {
662
+ <button
663
+ type="button"
664
+ [title]="surface.name"
665
+ (click)="updateColors($event, 'surface', surface)"
666
+ [ngClass]="{ 'outline-primary': selectedSurfaceColor() ? selectedSurfaceColor() === surface.name : layoutService.layoutConfig().darkTheme ? surface.name === 'zinc' : surface.name === 'slate' }"
667
+ class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
668
+ [style]="{
669
+ 'background-color': surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']
670
+ }"
671
+ ></button>
672
+ }
673
+ </div>
674
+ </div>
675
+ <div class="flex flex-col gap-2">
676
+ <span class="text-sm text-muted-color font-semibold">Presets</span>
677
+ <p-selectbutton [options]="presets" [ngModel]="selectedPreset()" (ngModelChange)="onPresetChange($event)" [allowEmpty]="false" size="small" />
678
+ </div>
679
+ @if (showMenuModeButton()) {
680
+ <div class="flex flex-col gap-2">
681
+ <span class="text-sm text-muted-color font-semibold">Menu Mode</span>
682
+ <p-selectbutton [ngModel]="menuMode()" (ngModelChange)="onMenuModeChange($event)" [options]="menuModeOptions" [allowEmpty]="false" size="small" />
683
+ </div>
684
+ }
685
+ </div>
686
686
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i3.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"] }] });
687
687
  }
688
688
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppConfigurator, decorators: [{
@@ -691,53 +691,53 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
691
691
  selector: 'app-configurator',
692
692
  standalone: true,
693
693
  imports: [CommonModule, FormsModule, SelectButtonModule],
694
- template: `
695
- <div class="flex flex-col gap-4">
696
- <div>
697
- <span class="text-sm text-muted-color font-semibold">Primary</span>
698
- <div class="pt-2 flex gap-2 flex-wrap justify-start">
699
- @for (primaryColor of primaryColors(); track primaryColor.name) {
700
- <button
701
- type="button"
702
- [title]="primaryColor.name"
703
- (click)="updateColors($event, 'primary', primaryColor)"
704
- [ngClass]="{ 'outline-primary': primaryColor.name === selectedPrimaryColor() }"
705
- class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
706
- [style]="{
707
- 'background-color': primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']
708
- }"
709
- ></button>
710
- }
711
- </div>
712
- </div>
713
- <div>
714
- <span class="text-sm text-muted-color font-semibold">Surface</span>
715
- <div class="pt-2 flex gap-2 flex-wrap justify-start">
716
- @for (surface of surfaces; track surface.name) {
717
- <button
718
- type="button"
719
- [title]="surface.name"
720
- (click)="updateColors($event, 'surface', surface)"
721
- [ngClass]="{ 'outline-primary': selectedSurfaceColor() ? selectedSurfaceColor() === surface.name : layoutService.layoutConfig().darkTheme ? surface.name === 'zinc' : surface.name === 'slate' }"
722
- class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
723
- [style]="{
724
- 'background-color': surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']
725
- }"
726
- ></button>
727
- }
728
- </div>
729
- </div>
730
- <div class="flex flex-col gap-2">
731
- <span class="text-sm text-muted-color font-semibold">Presets</span>
732
- <p-selectbutton [options]="presets" [ngModel]="selectedPreset()" (ngModelChange)="onPresetChange($event)" [allowEmpty]="false" size="small" />
733
- </div>
734
- @if (showMenuModeButton()) {
735
- <div class="flex flex-col gap-2">
736
- <span class="text-sm text-muted-color font-semibold">Menu Mode</span>
737
- <p-selectbutton [ngModel]="menuMode()" (ngModelChange)="onMenuModeChange($event)" [options]="menuModeOptions" [allowEmpty]="false" size="small" />
738
- </div>
739
- }
740
- </div>
694
+ template: `
695
+ <div class="flex flex-col gap-4">
696
+ <div>
697
+ <span class="text-sm text-muted-color font-semibold">Primary</span>
698
+ <div class="pt-2 flex gap-2 flex-wrap justify-start">
699
+ @for (primaryColor of primaryColors(); track primaryColor.name) {
700
+ <button
701
+ type="button"
702
+ [title]="primaryColor.name"
703
+ (click)="updateColors($event, 'primary', primaryColor)"
704
+ [ngClass]="{ 'outline-primary': primaryColor.name === selectedPrimaryColor() }"
705
+ class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
706
+ [style]="{
707
+ 'background-color': primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']
708
+ }"
709
+ ></button>
710
+ }
711
+ </div>
712
+ </div>
713
+ <div>
714
+ <span class="text-sm text-muted-color font-semibold">Surface</span>
715
+ <div class="pt-2 flex gap-2 flex-wrap justify-start">
716
+ @for (surface of surfaces; track surface.name) {
717
+ <button
718
+ type="button"
719
+ [title]="surface.name"
720
+ (click)="updateColors($event, 'surface', surface)"
721
+ [ngClass]="{ 'outline-primary': selectedSurfaceColor() ? selectedSurfaceColor() === surface.name : layoutService.layoutConfig().darkTheme ? surface.name === 'zinc' : surface.name === 'slate' }"
722
+ class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
723
+ [style]="{
724
+ 'background-color': surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']
725
+ }"
726
+ ></button>
727
+ }
728
+ </div>
729
+ </div>
730
+ <div class="flex flex-col gap-2">
731
+ <span class="text-sm text-muted-color font-semibold">Presets</span>
732
+ <p-selectbutton [options]="presets" [ngModel]="selectedPreset()" (ngModelChange)="onPresetChange($event)" [allowEmpty]="false" size="small" />
733
+ </div>
734
+ @if (showMenuModeButton()) {
735
+ <div class="flex flex-col gap-2">
736
+ <span class="text-sm text-muted-color font-semibold">Menu Mode</span>
737
+ <p-selectbutton [ngModel]="menuMode()" (ngModelChange)="onMenuModeChange($event)" [options]="menuModeOptions" [allowEmpty]="false" size="small" />
738
+ </div>
739
+ }
740
+ </div>
741
741
  `,
742
742
  }]
743
743
  }] });
@@ -868,167 +868,167 @@ class NavItemsComponent {
868
868
  this.authService.navigateToLogin();
869
869
  }
870
870
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: NavItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
871
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: NavItemsComponent, isStandalone: true, selector: "app-nav-items", ngImport: i0, template: `
872
- <header class="flex items-center justify-between px-6 h-16 bg-white shadow sticky top-0 z-9">
873
- <!-- Left: Logo / Title -->
874
- <div class="flex items-center space-x-3 rtl:space-x-reverse">
875
- <img src="assets/logo.png" alt="Logo" class="h-8 w-8" />
876
- <span class="text-lg font-semibold text-gray-800">{{ '' | translate }}</span>
877
- </div>
878
-
879
- <!-- Center: Nav Items -->
880
- <div class="flex items-center space-x-4 rtl:space-x-reverse">
881
- <ul class="flex space-x-4">
882
- @for (item of navItems.items$ | async; track item.id) {
883
- @if (!item.visible || item.visible(item)) {
884
- <ng-container *frameworkVisible="!item.visible || item.visible(item)">
885
- <li class="flex items-center">
886
- @if (item.component) {
887
- <ng-container
888
- [ngComponentOutlet]="item.component"
889
- [ngComponentOutletInjector]="item | toInjector"
890
- ></ng-container>
891
- } @else {
892
- <button
893
- pButton
894
- type="button"
895
- class="p-button-text hover:bg-gray-100 focus:outline-none flex items-center"
896
- (click)="item.action?.()"
897
- >
898
- <span [innerHTML]="item.html"></span>
899
- </button>
900
- }
901
- </li>
902
- </ng-container>
903
- }
904
- }
905
- </ul>
906
- </div>
907
-
908
- <!-- Right: Actions -->
909
- <div class="flex items-center rtl:space-x-reverse">
910
- <!-- Configurator -->
911
-
912
- <div>
913
- <!-- -->
914
- <button
915
- pButton
916
- type="button"
917
- icon="pi pi-palette"
918
- class="p-button-text"
919
- [title]="''"
920
- (click)="overlay.toggle($event)"
921
- >
922
- </button>
923
-
924
- <p-popover #overlay >
925
- <app-configurator />
926
- </p-popover>
927
- </div>
928
-
929
-
930
- <!-- Dark Mode Toggle -->
931
- <button
932
- pButton
933
- type="button"
934
- [icon]="layoutService.isDarkTheme() ?'pi pi-moon': 'pi pi-sun'"
935
- class="p-button-text"
936
- (click)="toggleDarkMode()">
937
- </button>
938
-
939
- <!-- Language Switcher -->
940
- <abp-languages></abp-languages>
941
-
942
- <!-- User Menu -->
943
- <div class="relative">
944
- <button
945
- class="p-link p-2"
946
- (click)="menu.toggle($event)"
947
- aria-label="User menu"
948
- >
949
- <p-avatar
950
- [label]="loading ? '' : userName"
951
- [icon]="loading ? 'pi pi-spinner' : ''"
952
- [class]="{'pi-spin': loading}"
953
- shape="circle"
954
- class="bg-blue-600 text-white cursor-pointer"
955
- [title]="(currentUser$ | async)?.name || ''"
956
- ></p-avatar>
957
- </button>
958
-
959
- <p-menu
960
- #menu
961
- [model]="userMenuItems"
962
- [popup]="true"
963
- [appendTo]="'body'"
964
- styleClass="w-64 sm:w-72 shadow-lg rounded-md"
965
- >
966
- <ng-template pTemplate="start">
967
- <div class="px-5 py-4 border-b border-gray-200 bg-gray-50 flex flex-col items-center text-center">
968
- <p-avatar
969
- [label]="userName"
970
- shape="circle"
971
- size="xlarge"
972
- styleClass="bg-blue-600 text-white mb-3 shadow-lg"
973
- [title]="(currentUser$ | async)?.name || ''"
974
- ></p-avatar>
975
- <h5 class="text-xl font-semibold text-gray-800 leading-tight">
976
- {{ (currentUser$ | async)?.name || 'اسم المستخدم' }}
977
- </h5>
978
- <p class="text-sm text-gray-600 truncate max-w-full">
979
- {{ (currentUser$ | async)?.email || 'لا يوجد بريد إلكتروني' }}
980
- </p>
981
- @if ((selectedTenant$ | async); as tenant) {
982
- <span
983
- class="inline-block mt-2 px-3 py-1 text-xs rounded-full font-semibold"
984
- [ngClass]="{
985
- 'bg-green-100 text-green-800': true
986
- }"
987
- >
988
- {{ tenant?.name || '_' }}
989
- </span>
990
- }
991
- </div>
992
- </ng-template>
993
-
994
- <ng-template pTemplate="item" let-item>
995
- <!-- *frameworkVisible="!item.visible || item.visible(item)" -->
996
- <ng-container >
997
- <!-- *hasPermission="item.requiredPolicy" -->
998
- <a
999
-
1000
- class="p-menuitem-link flex items-center space-x-3 rtl:space-x-reverse px-5 py-2 hover:bg-gray-100 rounded-md"
1001
- [ngClass]="item.styleClass || ''"
1002
- (click)="item.command ? item.command() : null"
1003
- [routerLink]="item.routerLink ? item.routerLink : null"
1004
- tabindex="0"
1005
- >
1006
- @if (item.component) {
1007
- <ng-container
1008
- [ngComponentOutlet]="item.component"
1009
- [ngComponentOutletInjector]="item | toInjector"
1010
- ></ng-container>
1011
- } @else {
1012
- <i [class]="item.icon + ' text-lg text-gray-600'"></i>
1013
- <span class="text-gray-700">{{ item.label | translate }}</span>
1014
- }
1015
- </a>
1016
- </ng-container>
1017
- </ng-template>
1018
- </p-menu>
1019
- </div>
1020
-
1021
- <!-- Logout Button (separate from menu) -->
1022
- <!-- <button
1023
- type="button"
1024
- class="layout-topbar-action"
1025
- (click)="logout()"
1026
- title="تسجيل الخروج"
1027
- >
1028
- <i class="pi pi-sign-out"></i>
1029
- </button> -->
1030
- </div>
1031
- </header>
871
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: NavItemsComponent, isStandalone: true, selector: "app-nav-items", ngImport: i0, template: `
872
+ <header class="flex items-center justify-between px-6 h-16 bg-white shadow sticky top-0 z-9">
873
+ <!-- Left: Logo / Title -->
874
+ <div class="flex items-center space-x-3 rtl:space-x-reverse">
875
+ <img src="assets/logo.png" alt="Logo" class="h-8 w-8" />
876
+ <span class="text-lg font-semibold text-gray-800">{{ '' | translate }}</span>
877
+ </div>
878
+
879
+ <!-- Center: Nav Items -->
880
+ <div class="flex items-center space-x-4 rtl:space-x-reverse">
881
+ <ul class="flex space-x-4">
882
+ @for (item of navItems.items$ | async; track item.id) {
883
+ @if (!item.visible || item.visible(item)) {
884
+ <ng-container *frameworkVisible="!item.visible || item.visible(item)">
885
+ <li class="flex items-center">
886
+ @if (item.component) {
887
+ <ng-container
888
+ [ngComponentOutlet]="item.component"
889
+ [ngComponentOutletInjector]="item | toInjector"
890
+ ></ng-container>
891
+ } @else {
892
+ <button
893
+ pButton
894
+ type="button"
895
+ class="p-button-text hover:bg-gray-100 focus:outline-none flex items-center"
896
+ (click)="item.action?.()"
897
+ >
898
+ <span [innerHTML]="item.html"></span>
899
+ </button>
900
+ }
901
+ </li>
902
+ </ng-container>
903
+ }
904
+ }
905
+ </ul>
906
+ </div>
907
+
908
+ <!-- Right: Actions -->
909
+ <div class="flex items-center rtl:space-x-reverse">
910
+ <!-- Configurator -->
911
+
912
+ <div>
913
+ <!-- -->
914
+ <button
915
+ pButton
916
+ type="button"
917
+ icon="pi pi-palette"
918
+ class="p-button-text"
919
+ [title]="''"
920
+ (click)="overlay.toggle($event)"
921
+ >
922
+ </button>
923
+
924
+ <p-popover #overlay >
925
+ <app-configurator />
926
+ </p-popover>
927
+ </div>
928
+
929
+
930
+ <!-- Dark Mode Toggle -->
931
+ <button
932
+ pButton
933
+ type="button"
934
+ [icon]="layoutService.isDarkTheme() ?'pi pi-moon': 'pi pi-sun'"
935
+ class="p-button-text"
936
+ (click)="toggleDarkMode()">
937
+ </button>
938
+
939
+ <!-- Language Switcher -->
940
+ <abp-languages></abp-languages>
941
+
942
+ <!-- User Menu -->
943
+ <div class="relative">
944
+ <button
945
+ class="p-link p-2"
946
+ (click)="menu.toggle($event)"
947
+ aria-label="User menu"
948
+ >
949
+ <p-avatar
950
+ [label]="loading ? '' : userName"
951
+ [icon]="loading ? 'pi pi-spinner' : ''"
952
+ [class]="{'pi-spin': loading}"
953
+ shape="circle"
954
+ class="bg-blue-600 text-white cursor-pointer"
955
+ [title]="(currentUser$ | async)?.name || ''"
956
+ ></p-avatar>
957
+ </button>
958
+
959
+ <p-menu
960
+ #menu
961
+ [model]="userMenuItems"
962
+ [popup]="true"
963
+ [appendTo]="'body'"
964
+ styleClass="w-64 sm:w-72 shadow-lg rounded-md"
965
+ >
966
+ <ng-template pTemplate="start">
967
+ <div class="px-5 py-4 border-b border-gray-200 bg-gray-50 flex flex-col items-center text-center">
968
+ <p-avatar
969
+ [label]="userName"
970
+ shape="circle"
971
+ size="xlarge"
972
+ styleClass="bg-blue-600 text-white mb-3 shadow-lg"
973
+ [title]="(currentUser$ | async)?.name || ''"
974
+ ></p-avatar>
975
+ <h5 class="text-xl font-semibold text-gray-800 leading-tight">
976
+ {{ (currentUser$ | async)?.name || 'اسم المستخدم' }}
977
+ </h5>
978
+ <p class="text-sm text-gray-600 truncate max-w-full">
979
+ {{ (currentUser$ | async)?.email || 'لا يوجد بريد إلكتروني' }}
980
+ </p>
981
+ @if ((selectedTenant$ | async); as tenant) {
982
+ <span
983
+ class="inline-block mt-2 px-3 py-1 text-xs rounded-full font-semibold"
984
+ [ngClass]="{
985
+ 'bg-green-100 text-green-800': true
986
+ }"
987
+ >
988
+ {{ tenant?.name || '_' }}
989
+ </span>
990
+ }
991
+ </div>
992
+ </ng-template>
993
+
994
+ <ng-template pTemplate="item" let-item>
995
+ <!-- *frameworkVisible="!item.visible || item.visible(item)" -->
996
+ <ng-container >
997
+ <!-- *hasPermission="item.requiredPolicy" -->
998
+ <a
999
+
1000
+ class="p-menuitem-link flex items-center space-x-3 rtl:space-x-reverse px-5 py-2 hover:bg-gray-100 rounded-md"
1001
+ [ngClass]="item.styleClass || ''"
1002
+ (click)="item.command ? item.command() : null"
1003
+ [routerLink]="item.routerLink ? item.routerLink : null"
1004
+ tabindex="0"
1005
+ >
1006
+ @if (item.component) {
1007
+ <ng-container
1008
+ [ngComponentOutlet]="item.component"
1009
+ [ngComponentOutletInjector]="item | toInjector"
1010
+ ></ng-container>
1011
+ } @else {
1012
+ <i [class]="item.icon + ' text-lg text-gray-600'"></i>
1013
+ <span class="text-gray-700">{{ item.label | translate }}</span>
1014
+ }
1015
+ </a>
1016
+ </ng-container>
1017
+ </ng-template>
1018
+ </p-menu>
1019
+ </div>
1020
+
1021
+ <!-- Logout Button (separate from menu) -->
1022
+ <!-- <button
1023
+ type="button"
1024
+ class="layout-topbar-action"
1025
+ (click)="logout()"
1026
+ title="تسجيل الخروج"
1027
+ >
1028
+ <i class="pi pi-sign-out"></i>
1029
+ </button> -->
1030
+ </div>
1031
+ </header>
1032
1032
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "component", type: AppConfigurator, selector: "app-configurator" }, { kind: "component", type: LanguagesComponent, selector: "abp-languages" }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i3$1.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: MenuModule }, { kind: "component", type: i5.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex", "appendTo"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: VisibleDirective, selector: "[frameworkVisible]", inputs: ["frameworkVisible"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i1.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: ToInjectorPipe, name: "toInjector" }] });
1033
1033
  }
1034
1034
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: NavItemsComponent, decorators: [{
@@ -1052,167 +1052,167 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1052
1052
  ToInjectorPipe,
1053
1053
  PopoverModule
1054
1054
  ],
1055
- template: `
1056
- <header class="flex items-center justify-between px-6 h-16 bg-white shadow sticky top-0 z-9">
1057
- <!-- Left: Logo / Title -->
1058
- <div class="flex items-center space-x-3 rtl:space-x-reverse">
1059
- <img src="assets/logo.png" alt="Logo" class="h-8 w-8" />
1060
- <span class="text-lg font-semibold text-gray-800">{{ '' | translate }}</span>
1061
- </div>
1062
-
1063
- <!-- Center: Nav Items -->
1064
- <div class="flex items-center space-x-4 rtl:space-x-reverse">
1065
- <ul class="flex space-x-4">
1066
- @for (item of navItems.items$ | async; track item.id) {
1067
- @if (!item.visible || item.visible(item)) {
1068
- <ng-container *frameworkVisible="!item.visible || item.visible(item)">
1069
- <li class="flex items-center">
1070
- @if (item.component) {
1071
- <ng-container
1072
- [ngComponentOutlet]="item.component"
1073
- [ngComponentOutletInjector]="item | toInjector"
1074
- ></ng-container>
1075
- } @else {
1076
- <button
1077
- pButton
1078
- type="button"
1079
- class="p-button-text hover:bg-gray-100 focus:outline-none flex items-center"
1080
- (click)="item.action?.()"
1081
- >
1082
- <span [innerHTML]="item.html"></span>
1083
- </button>
1084
- }
1085
- </li>
1086
- </ng-container>
1087
- }
1088
- }
1089
- </ul>
1090
- </div>
1091
-
1092
- <!-- Right: Actions -->
1093
- <div class="flex items-center rtl:space-x-reverse">
1094
- <!-- Configurator -->
1095
-
1096
- <div>
1097
- <!-- -->
1098
- <button
1099
- pButton
1100
- type="button"
1101
- icon="pi pi-palette"
1102
- class="p-button-text"
1103
- [title]="''"
1104
- (click)="overlay.toggle($event)"
1105
- >
1106
- </button>
1107
-
1108
- <p-popover #overlay >
1109
- <app-configurator />
1110
- </p-popover>
1111
- </div>
1112
-
1113
-
1114
- <!-- Dark Mode Toggle -->
1115
- <button
1116
- pButton
1117
- type="button"
1118
- [icon]="layoutService.isDarkTheme() ?'pi pi-moon': 'pi pi-sun'"
1119
- class="p-button-text"
1120
- (click)="toggleDarkMode()">
1121
- </button>
1122
-
1123
- <!-- Language Switcher -->
1124
- <abp-languages></abp-languages>
1125
-
1126
- <!-- User Menu -->
1127
- <div class="relative">
1128
- <button
1129
- class="p-link p-2"
1130
- (click)="menu.toggle($event)"
1131
- aria-label="User menu"
1132
- >
1133
- <p-avatar
1134
- [label]="loading ? '' : userName"
1135
- [icon]="loading ? 'pi pi-spinner' : ''"
1136
- [class]="{'pi-spin': loading}"
1137
- shape="circle"
1138
- class="bg-blue-600 text-white cursor-pointer"
1139
- [title]="(currentUser$ | async)?.name || ''"
1140
- ></p-avatar>
1141
- </button>
1142
-
1143
- <p-menu
1144
- #menu
1145
- [model]="userMenuItems"
1146
- [popup]="true"
1147
- [appendTo]="'body'"
1148
- styleClass="w-64 sm:w-72 shadow-lg rounded-md"
1149
- >
1150
- <ng-template pTemplate="start">
1151
- <div class="px-5 py-4 border-b border-gray-200 bg-gray-50 flex flex-col items-center text-center">
1152
- <p-avatar
1153
- [label]="userName"
1154
- shape="circle"
1155
- size="xlarge"
1156
- styleClass="bg-blue-600 text-white mb-3 shadow-lg"
1157
- [title]="(currentUser$ | async)?.name || ''"
1158
- ></p-avatar>
1159
- <h5 class="text-xl font-semibold text-gray-800 leading-tight">
1160
- {{ (currentUser$ | async)?.name || 'اسم المستخدم' }}
1161
- </h5>
1162
- <p class="text-sm text-gray-600 truncate max-w-full">
1163
- {{ (currentUser$ | async)?.email || 'لا يوجد بريد إلكتروني' }}
1164
- </p>
1165
- @if ((selectedTenant$ | async); as tenant) {
1166
- <span
1167
- class="inline-block mt-2 px-3 py-1 text-xs rounded-full font-semibold"
1168
- [ngClass]="{
1169
- 'bg-green-100 text-green-800': true
1170
- }"
1171
- >
1172
- {{ tenant?.name || '_' }}
1173
- </span>
1174
- }
1175
- </div>
1176
- </ng-template>
1177
-
1178
- <ng-template pTemplate="item" let-item>
1179
- <!-- *frameworkVisible="!item.visible || item.visible(item)" -->
1180
- <ng-container >
1181
- <!-- *hasPermission="item.requiredPolicy" -->
1182
- <a
1183
-
1184
- class="p-menuitem-link flex items-center space-x-3 rtl:space-x-reverse px-5 py-2 hover:bg-gray-100 rounded-md"
1185
- [ngClass]="item.styleClass || ''"
1186
- (click)="item.command ? item.command() : null"
1187
- [routerLink]="item.routerLink ? item.routerLink : null"
1188
- tabindex="0"
1189
- >
1190
- @if (item.component) {
1191
- <ng-container
1192
- [ngComponentOutlet]="item.component"
1193
- [ngComponentOutletInjector]="item | toInjector"
1194
- ></ng-container>
1195
- } @else {
1196
- <i [class]="item.icon + ' text-lg text-gray-600'"></i>
1197
- <span class="text-gray-700">{{ item.label | translate }}</span>
1198
- }
1199
- </a>
1200
- </ng-container>
1201
- </ng-template>
1202
- </p-menu>
1203
- </div>
1204
-
1205
- <!-- Logout Button (separate from menu) -->
1206
- <!-- <button
1207
- type="button"
1208
- class="layout-topbar-action"
1209
- (click)="logout()"
1210
- title="تسجيل الخروج"
1211
- >
1212
- <i class="pi pi-sign-out"></i>
1213
- </button> -->
1214
- </div>
1215
- </header>
1055
+ template: `
1056
+ <header class="flex items-center justify-between px-6 h-16 bg-white shadow sticky top-0 z-9">
1057
+ <!-- Left: Logo / Title -->
1058
+ <div class="flex items-center space-x-3 rtl:space-x-reverse">
1059
+ <img src="assets/logo.png" alt="Logo" class="h-8 w-8" />
1060
+ <span class="text-lg font-semibold text-gray-800">{{ '' | translate }}</span>
1061
+ </div>
1062
+
1063
+ <!-- Center: Nav Items -->
1064
+ <div class="flex items-center space-x-4 rtl:space-x-reverse">
1065
+ <ul class="flex space-x-4">
1066
+ @for (item of navItems.items$ | async; track item.id) {
1067
+ @if (!item.visible || item.visible(item)) {
1068
+ <ng-container *frameworkVisible="!item.visible || item.visible(item)">
1069
+ <li class="flex items-center">
1070
+ @if (item.component) {
1071
+ <ng-container
1072
+ [ngComponentOutlet]="item.component"
1073
+ [ngComponentOutletInjector]="item | toInjector"
1074
+ ></ng-container>
1075
+ } @else {
1076
+ <button
1077
+ pButton
1078
+ type="button"
1079
+ class="p-button-text hover:bg-gray-100 focus:outline-none flex items-center"
1080
+ (click)="item.action?.()"
1081
+ >
1082
+ <span [innerHTML]="item.html"></span>
1083
+ </button>
1084
+ }
1085
+ </li>
1086
+ </ng-container>
1087
+ }
1088
+ }
1089
+ </ul>
1090
+ </div>
1091
+
1092
+ <!-- Right: Actions -->
1093
+ <div class="flex items-center rtl:space-x-reverse">
1094
+ <!-- Configurator -->
1095
+
1096
+ <div>
1097
+ <!-- -->
1098
+ <button
1099
+ pButton
1100
+ type="button"
1101
+ icon="pi pi-palette"
1102
+ class="p-button-text"
1103
+ [title]="''"
1104
+ (click)="overlay.toggle($event)"
1105
+ >
1106
+ </button>
1107
+
1108
+ <p-popover #overlay >
1109
+ <app-configurator />
1110
+ </p-popover>
1111
+ </div>
1112
+
1113
+
1114
+ <!-- Dark Mode Toggle -->
1115
+ <button
1116
+ pButton
1117
+ type="button"
1118
+ [icon]="layoutService.isDarkTheme() ?'pi pi-moon': 'pi pi-sun'"
1119
+ class="p-button-text"
1120
+ (click)="toggleDarkMode()">
1121
+ </button>
1122
+
1123
+ <!-- Language Switcher -->
1124
+ <abp-languages></abp-languages>
1125
+
1126
+ <!-- User Menu -->
1127
+ <div class="relative">
1128
+ <button
1129
+ class="p-link p-2"
1130
+ (click)="menu.toggle($event)"
1131
+ aria-label="User menu"
1132
+ >
1133
+ <p-avatar
1134
+ [label]="loading ? '' : userName"
1135
+ [icon]="loading ? 'pi pi-spinner' : ''"
1136
+ [class]="{'pi-spin': loading}"
1137
+ shape="circle"
1138
+ class="bg-blue-600 text-white cursor-pointer"
1139
+ [title]="(currentUser$ | async)?.name || ''"
1140
+ ></p-avatar>
1141
+ </button>
1142
+
1143
+ <p-menu
1144
+ #menu
1145
+ [model]="userMenuItems"
1146
+ [popup]="true"
1147
+ [appendTo]="'body'"
1148
+ styleClass="w-64 sm:w-72 shadow-lg rounded-md"
1149
+ >
1150
+ <ng-template pTemplate="start">
1151
+ <div class="px-5 py-4 border-b border-gray-200 bg-gray-50 flex flex-col items-center text-center">
1152
+ <p-avatar
1153
+ [label]="userName"
1154
+ shape="circle"
1155
+ size="xlarge"
1156
+ styleClass="bg-blue-600 text-white mb-3 shadow-lg"
1157
+ [title]="(currentUser$ | async)?.name || ''"
1158
+ ></p-avatar>
1159
+ <h5 class="text-xl font-semibold text-gray-800 leading-tight">
1160
+ {{ (currentUser$ | async)?.name || 'اسم المستخدم' }}
1161
+ </h5>
1162
+ <p class="text-sm text-gray-600 truncate max-w-full">
1163
+ {{ (currentUser$ | async)?.email || 'لا يوجد بريد إلكتروني' }}
1164
+ </p>
1165
+ @if ((selectedTenant$ | async); as tenant) {
1166
+ <span
1167
+ class="inline-block mt-2 px-3 py-1 text-xs rounded-full font-semibold"
1168
+ [ngClass]="{
1169
+ 'bg-green-100 text-green-800': true
1170
+ }"
1171
+ >
1172
+ {{ tenant?.name || '_' }}
1173
+ </span>
1174
+ }
1175
+ </div>
1176
+ </ng-template>
1177
+
1178
+ <ng-template pTemplate="item" let-item>
1179
+ <!-- *frameworkVisible="!item.visible || item.visible(item)" -->
1180
+ <ng-container >
1181
+ <!-- *hasPermission="item.requiredPolicy" -->
1182
+ <a
1183
+
1184
+ class="p-menuitem-link flex items-center space-x-3 rtl:space-x-reverse px-5 py-2 hover:bg-gray-100 rounded-md"
1185
+ [ngClass]="item.styleClass || ''"
1186
+ (click)="item.command ? item.command() : null"
1187
+ [routerLink]="item.routerLink ? item.routerLink : null"
1188
+ tabindex="0"
1189
+ >
1190
+ @if (item.component) {
1191
+ <ng-container
1192
+ [ngComponentOutlet]="item.component"
1193
+ [ngComponentOutletInjector]="item | toInjector"
1194
+ ></ng-container>
1195
+ } @else {
1196
+ <i [class]="item.icon + ' text-lg text-gray-600'"></i>
1197
+ <span class="text-gray-700">{{ item.label | translate }}</span>
1198
+ }
1199
+ </a>
1200
+ </ng-container>
1201
+ </ng-template>
1202
+ </p-menu>
1203
+ </div>
1204
+
1205
+ <!-- Logout Button (separate from menu) -->
1206
+ <!-- <button
1207
+ type="button"
1208
+ class="layout-topbar-action"
1209
+ (click)="logout()"
1210
+ title="تسجيل الخروج"
1211
+ >
1212
+ <i class="pi pi-sign-out"></i>
1213
+ </button> -->
1214
+ </div>
1215
+ </header>
1216
1216
  `
1217
1217
  }]
1218
1218
  }], ctorParameters: () => [] });
@@ -1434,11 +1434,11 @@ class RoutesComponent {
1434
1434
  };
1435
1435
  }
1436
1436
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: RoutesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1437
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: RoutesComponent, isStandalone: true, selector: "app-routes", host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<aside class=\"flex h-screen bg-white dark:bg-gray-900 transition-all duration-300\"\n [ngClass]=\"{ 'w-0 overflow-hidden': !sidebarVisible && isMobile }\">\n\n <!-- \uD83C\uDFA8 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0627\u0644\u0631\u0626\u064A\u0633\u064A -->\n <div\n class=\"flex flex-col justify-between pt-4 pb-2 w-16 border-l shadow-xl\n bg-gradient-to-b from-primary-500 via-primary-600 to-primary-700\n text-white rounded-r-3xl\">\n\n <!-- \uD83D\uDD1D \u0627\u0644\u0623\u0639\u0644\u0649 -->\n <div class=\"flex flex-col items-center gap-4\">\n <img src=\"/assets/logo.png\" alt=\"Logo\"\n class=\"w-9 h-9 mt-1 rounded-lg shadow-sm\"/>\n\n <!-- \u0632\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 -->\n <!-- [pTooltip]=\"'TOGGLE_MENU' | translate\" -->\n <button (click)=\"toggleAll()\"\n tooltipPosition=\"right\"\n class=\"text-white hover:scale-110 transition-transform duration-200\">\n <i class=\"pi pi-bars text-lg\"></i>\n </button>\n\n <!-- \u0623\u064A\u0642\u0648\u0646\u0627\u062A -->\n @for (item of secondToLastLevel$ | async; track item) {\n <div class=\"relative flex flex-col items-center\">\n <!-- \u0627\u0644\u0623\u064A\u0642\u0648\u0646\u0629 -->\n <div (click)=\"onMainClick(item)\"\n [pTooltip]=\"item.label | translate\"\n tooltipPosition=\"right\"\n class=\"relative flex items-center justify-center w-10 h-10 rounded-xl cursor-pointer\n hover:bg-white/20 transition-all duration-200\"\n [ngClass]=\"{ 'bg-white/30 scale-105 shadow-inner': item.expanded }\">\n <i [class]=\"item.icon + ' text-xl'\"></i>\n </div>\n </div>\n }\n </div>\n\n <!-- \u2699\uFE0F \u0627\u0644\u0623\u0633\u0641\u0644 -->\n <div class=\"flex flex-col items-center pb-3 text-white/80\">\n <i class=\"pi pi-cog text-lg hover:text-white cursor-pointer transition\"></i>\n </div>\n </div>\n\n <!-- \uD83D\uDCCB \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0641\u0631\u0639\u064A\u0629 -->\n @if (subSidebarVisible) {\n <div\n class=\"w-65 border-l border-gray-200 dark:border-gray-700 glass-bg animate-slideIn\n shadow-2xl rounded-l-3xl p-4 rtl:text-right overflow-y-auto transition-all duration-300\"\n [ngClass]=\"{ 'absolute top-0 right-16 h-full z-40': isMobile }\">\n <!-- \u0632\u0631 \u0631\u062C\u0648\u0639 -->\n <button (click)=\"closeMenu()\"\n class=\"flex items-center gap-2 mb-4 text-gray-500 dark:text-gray-300 hover:text-primary-600 transition\">\n <i class=\"pi\" [ngClass]=\"isMobile ? 'pi-angle-right' : 'pi-angle-right'\"></i>\n <span>{{ 'back' | translate }}</span>\n </button>\n <!-- Recursive rendering -->\n @if (menuItems$ | async; as menuItems) {\n <ng-container *ngTemplateOutlet=\"renderMenu; context:{ $implicit: menuItems, level: 1 }\"></ng-container>\n}\n\n<ng-template #renderMenu let-items let-level=\"level\">\n @for (item of items; track item) {\n\n @if (!item.items?.length) {\n @let link = getLinkProps(item);\n <div class=\"mb-1\">\n @if (link.isExternal) {\n <a [href]=\"link.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n class=\"flex items-center gap-2 px-3 py-2 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\n <i [class]=\"item.icon + ' text-base'\"></i>\n <span>{{ item.label | translate }}</span>\n <i class=\"pi pi-external-link text-[10px] opacity-50\"></i>\n </a>\n } @else {\n <div class=\"flex items-center gap-2\">\n <a [routerLink]=\"link.routerLink\"\n (click)=\"onNavigate()\"\n routerLinkActive=\"active-link\"\n class=\"flex-1 flex items-center gap-2 px-2 py-1 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\n <i [class]=\"item.icon + ' text-base'\"></i>\n <span>{{ item.label | translate }}</span>\n </a>\n\n@if (link.addRoute) {\n <a\n [routerLink]=\"[link.addRoute]\"\n (click)=\"$event.stopPropagation(); onNavigate()\"\n class=\"shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full text-gray-400 hover:text-primary-500 hover:bg-primary-50 dark:text-gray-500 dark:hover:text-primary-400 dark:hover:bg-primary-900/20 transition-all duration-200\"\n [pTooltip]=\"'ADD' | translate\"\n tooltipPosition=\"top\">\n <i class=\"pi pi-plus text-xs\"></i>\n </a>\n}\n </div>\n }\n</div>\n}\n\n @if (item.items?.length) {\n <div class=\"mb-1\">\n\n <div\n (click)=\"onParentClick(item)\"\n [style.font-size.rem]=\"1.1 - (level * 0.05)\"\n [ngClass]=\"{\n 'font-bold': level === 1,\n 'font-semibold': level === 2,\n 'font-medium': level >= 3,\n 'bg-primary-50 text-primary-700 border-r-4 border-primary-500': item.expanded\n }\"\n class=\"flex justify-between items-center py-2 px-3 rounded-lg cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition text-gray-800 dark:text-gray-200\">\n\n <div class=\"flex items-center gap-2\">\n\n <i [class]=\"item.icon + ' text-base'\"></i>\n\n <span>\n {{ item.label | translate }}\n </span>\n\n </div>\n\n <i\n class=\"pi\"\n [ngClass]=\"item.expanded ? 'pi-chevron-down' : 'pi-chevron-left'\"\n style=\"font-size:0.6rem;\">\n </i>\n\n </div>\n\n @if (item.expanded) {\n <div class=\"mr-4 border-r border-gray-200 dark:border-gray-700 pr-2 mt-1\">\n\n <ng-container\n *ngTemplateOutlet=\"renderMenu; context:{ $implicit: item.items, level: level + 1 }\">\n </ng-container>\n\n </div>\n }\n\n </div>\n }\n\n }\n</ng-template>\n\n </div>\n}\n\n</aside>\n\n<!-- \uD83C\uDF1F \u0627\u0644\u0632\u0631 \u0627\u0644\u0639\u0627\u0626\u0645 \u0627\u0644\u062D\u062F\u064A\u062B -->\n@if (isMobile && !sidebarVisible) {\n <button\n class=\"floating-btn\"\n (click)=\"openMenu()\"\n pTooltip=\"{{ 'MENU.OPEN' | translate }}\"\n tooltipPosition=\"top\">\n <img src=\"/assets/logo.png\" alt=\"App Icon\" />\n </button>\n}\n", styles: ["@charset \"UTF-8\";@keyframes slideIn{0%{transform:translate(60px);opacity:0}to{transform:translate(0);opacity:1}}.animate-slideIn{animation:slideIn .35s cubic-bezier(.25,1,.5,1)}.glass-bg{background:#ffffffbf;backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%);border:1px solid rgba(255,255,255,.25)}@media(max-width:1024px){aside{position:fixed;top:0;right:0;height:100vh;z-index:50}}.floating-btn{position:fixed;bottom:1.25rem;right:1.25rem;z-index:60;width:60px;height:60px;border-radius:50%;background:linear-gradient(135deg,var(--p-primary-500),var(--p-primary-700));box-shadow:0 4px 18px #00000040;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.floating-btn:hover{transform:scale(1.1) rotate(5deg)}.floating-btn img{width:28px;height:28px;border-radius:10px}.active-link{background-color:var(--p-primary-500)!important;color:#fff!important;font-weight:600;box-shadow:0 4px 6px -1px #0000001a;transform:translate(-3px)}.active-link i{color:#fff!important}.render-menu-container span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-item-link{background:linear-gradient(to left,var(--p-primary-50),transparent);color:var(--p-primary-600)!important;position:relative;border-right:3px solid var(--p-primary-500);border-radius:0 12px 12px 0}.active-item-link i{color:var(--p-primary-500);filter:drop-shadow(0 0 5px rgba(var(--p-primary-500-rgb),.4))}.active-item-link span{font-weight:700}.animate-slideIn{animation:slideIn .3s ease-out}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.glass-bg::-webkit-scrollbar{width:4px}.glass-bg::-webkit-scrollbar-thumb{background:#0000001a;border-radius:10px}.active-link{background-color:var(--p-primary-50)!important;color:var(--p-primary-700)!important;border-right:4px solid var(--p-primary-500)!important;border-radius:4px 12px 12px 4px!important}.active-link span{font-weight:800!important}.active-link i{color:var(--p-primary-600)!important;transform:scale(1.1)}aside{-webkit-font-smoothing:antialiased;letter-spacing:-.01em}.dark .active-link{background-color:rgba(var(--p-primary-500-rgb),.15)!important;color:var(--p-primary-300)!important}.submenu{animation:menuOpen .25s ease}@keyframes menuOpen{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}aside{box-shadow:0 10px 40px #00000026}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i3$2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1437
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: RoutesComponent, isStandalone: true, selector: "app-routes", host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<aside class=\"flex h-screen bg-white dark:bg-gray-900 transition-all duration-300\"\r\n [ngClass]=\"{ 'w-0 overflow-hidden': !sidebarVisible && isMobile }\">\r\n\r\n <!-- \uD83C\uDFA8 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0627\u0644\u0631\u0626\u064A\u0633\u064A -->\r\n <div\r\n class=\"flex flex-col justify-between pt-4 pb-2 w-16 border-l shadow-xl\r\n bg-gradient-to-b from-primary-500 via-primary-600 to-primary-700\r\n text-white rounded-r-3xl\">\r\n\r\n <!-- \uD83D\uDD1D \u0627\u0644\u0623\u0639\u0644\u0649 -->\r\n <div class=\"flex flex-col items-center gap-4\">\r\n <img src=\"/assets/logo.png\" alt=\"Logo\"\r\n class=\"w-9 h-9 mt-1 rounded-lg shadow-sm\"/>\r\n\r\n <!-- \u0632\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 -->\r\n <!-- [pTooltip]=\"'TOGGLE_MENU' | translate\" -->\r\n <button (click)=\"toggleAll()\"\r\n tooltipPosition=\"right\"\r\n class=\"text-white hover:scale-110 transition-transform duration-200\">\r\n <i class=\"pi pi-bars text-lg\"></i>\r\n </button>\r\n\r\n <!-- \u0623\u064A\u0642\u0648\u0646\u0627\u062A -->\r\n @for (item of secondToLastLevel$ | async; track item) {\r\n <div class=\"relative flex flex-col items-center\">\r\n <!-- \u0627\u0644\u0623\u064A\u0642\u0648\u0646\u0629 -->\r\n <div (click)=\"onMainClick(item)\"\r\n [pTooltip]=\"item.label | translate\"\r\n tooltipPosition=\"right\"\r\n class=\"relative flex items-center justify-center w-10 h-10 rounded-xl cursor-pointer\r\n hover:bg-white/20 transition-all duration-200\"\r\n [ngClass]=\"{ 'bg-white/30 scale-105 shadow-inner': item.expanded }\">\r\n <i [class]=\"item.icon + ' text-xl'\"></i>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- \u2699\uFE0F \u0627\u0644\u0623\u0633\u0641\u0644 -->\r\n <div class=\"flex flex-col items-center pb-3 text-white/80\">\r\n <i class=\"pi pi-cog text-lg hover:text-white cursor-pointer transition\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- \uD83D\uDCCB \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0641\u0631\u0639\u064A\u0629 -->\r\n @if (subSidebarVisible) {\r\n <div\r\n class=\"w-[290px] max-w-[290px] min-w-[260px] border-l border-gray-200 dark:border-gray-700 glass-bg animate-slideIn\r\n shadow-2xl rounded-l-3xl p-4 rtl:text-right overflow-y-auto overflow-x-hidden transition-all duration-300\"\r\n [ngClass]=\"{ 'absolute top-0 right-16 h-full z-40': isMobile }\">\r\n <!-- \u0632\u0631 \u0631\u062C\u0648\u0639 -->\r\n <button (click)=\"closeMenu()\"\r\n class=\"flex items-center gap-2 mb-4 text-gray-500 dark:text-gray-300 hover:text-primary-600 transition\">\r\n <i class=\"pi\" [ngClass]=\"isMobile ? 'pi-angle-right' : 'pi-angle-right'\"></i>\r\n <span>{{ 'back' | translate }}</span>\r\n </button>\r\n <!-- Recursive rendering -->\r\n @if (menuItems$ | async; as menuItems) {\r\n <ng-container *ngTemplateOutlet=\"renderMenu; context:{ $implicit: menuItems, level: 1 }\"></ng-container>\r\n}\r\n\r\n<ng-template #renderMenu let-items let-level=\"level\">\r\n @for (item of items; track item) {\r\n\r\n @if (!item.items?.length) {\r\n @let link = getLinkProps(item);\r\n <div class=\"mb-1\">\r\n @if (link.isExternal) {\r\n <a [href]=\"link.href\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"flex items-center gap-2 px-3 py-2 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n <span class=\"min-w-0 break-words whitespace-normal\">{{ item.label | translate }}</span>\r\n <i class=\"pi pi-external-link text-[10px] opacity-50\"></i>\r\n </a>\r\n } @else {\r\n <div class=\"flex items-center gap-2\">\r\n <a [routerLink]=\"link.routerLink\"\r\n (click)=\"onNavigate()\"\r\n routerLinkActive=\"active-link\"\r\n class=\"flex-1 min-w-0 flex items-center gap-2 px-2 py-1 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n <span class=\"min-w-0 break-words whitespace-normal\">\r\n {{ item.label | translate }}</span>\r\n </a>\r\n\r\n@if (link.addRoute) {\r\n <a\r\n [routerLink]=\"[link.addRoute]\"\r\n (click)=\"$event.stopPropagation(); onNavigate()\"\r\n class=\"shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full text-gray-400 hover:text-primary-500 hover:bg-primary-50 dark:text-gray-500 dark:hover:text-primary-400 dark:hover:bg-primary-900/20 transition-all duration-200\"\r\n [pTooltip]=\"'ADD' | translate\"\r\n tooltipPosition=\"top\">\r\n <i class=\"pi pi-plus text-xs\"></i>\r\n </a>\r\n}\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n @if (item.items?.length) {\r\n <div class=\"mb-1\">\r\n\r\n <div\r\n (click)=\"onParentClick(item)\"\r\n [style.font-size.rem]=\"1.1 - (level * 0.05)\"\r\n [ngClass]=\"{\r\n 'font-bold': level === 1,\r\n 'font-semibold': level === 2,\r\n 'font-medium': level >= 3,\r\n 'bg-primary-50 text-primary-700 border-r-4 border-primary-500': item.expanded\r\n }\"\r\n class=\"flex justify-between items-center py-2 px-3 rounded-lg cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition text-gray-800 dark:text-gray-200\">\r\n\r\n <div class=\"flex items-center gap-2\">\r\n\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n\r\n <span>\r\n {{ item.label | translate }}\r\n </span>\r\n\r\n </div>\r\n\r\n <i\r\n class=\"pi\"\r\n [ngClass]=\"item.expanded ? 'pi-chevron-down' : 'pi-chevron-left'\"\r\n style=\"font-size:0.6rem;\">\r\n </i>\r\n\r\n </div>\r\n\r\n @if (item.expanded) {\r\n <div class=\"mr-4 border-r border-gray-200 dark:border-gray-700 pr-2 mt-1\">\r\n\r\n <ng-container\r\n *ngTemplateOutlet=\"renderMenu; context:{ $implicit: item.items, level: level + 1 }\">\r\n </ng-container>\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n }\r\n\r\n }\r\n</ng-template>\r\n\r\n </div>\r\n}\r\n\r\n</aside>\r\n\r\n<!-- \uD83C\uDF1F \u0627\u0644\u0632\u0631 \u0627\u0644\u0639\u0627\u0626\u0645 \u0627\u0644\u062D\u062F\u064A\u062B -->\r\n@if (isMobile && !sidebarVisible) {\r\n <button\r\n class=\"floating-btn\"\r\n (click)=\"openMenu()\"\r\n pTooltip=\"{{ 'MENU.OPEN' | translate }}\"\r\n tooltipPosition=\"top\">\r\n <img src=\"/assets/logo.png\" alt=\"App Icon\" />\r\n </button>\r\n}\r\n", styles: ["@charset \"UTF-8\";@keyframes slideIn{0%{transform:translate(60px);opacity:0}to{transform:translate(0);opacity:1}}.animate-slideIn{animation:slideIn .35s cubic-bezier(.25,1,.5,1)}.glass-bg{background:#ffffffbf;backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%);border:1px solid rgba(255,255,255,.25)}@media(max-width:1024px){aside{position:fixed;top:0;right:0;height:100vh;z-index:50}}.floating-btn{position:fixed;bottom:1.25rem;right:1.25rem;z-index:60;width:60px;height:60px;border-radius:50%;background:linear-gradient(135deg,var(--p-primary-500),var(--p-primary-700));box-shadow:0 4px 18px #00000040;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.floating-btn:hover{transform:scale(1.1) rotate(5deg)}.floating-btn img{width:28px;height:28px;border-radius:10px}.active-link{background-color:var(--p-primary-500)!important;color:#fff!important;font-weight:600;box-shadow:0 4px 6px -1px #0000001a;transform:translate(-3px)}.active-link i{color:#fff!important}.active-item-link{background:linear-gradient(to left,var(--p-primary-50),transparent);color:var(--p-primary-600)!important;position:relative;border-right:3px solid var(--p-primary-500);border-radius:0 12px 12px 0}.active-item-link i{color:var(--p-primary-500);filter:drop-shadow(0 0 5px rgba(var(--p-primary-500-rgb),.4))}.active-item-link span{font-weight:700}.animate-slideIn{animation:slideIn .3s ease-out}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.glass-bg::-webkit-scrollbar{width:4px}.glass-bg::-webkit-scrollbar-thumb{background:#0000001a;border-radius:10px}.active-link{background-color:var(--p-primary-50)!important;color:var(--p-primary-700)!important;border-right:4px solid var(--p-primary-500)!important;border-radius:4px 12px 12px 4px!important}.active-link span{font-weight:800!important}.active-link i{color:var(--p-primary-600)!important;transform:scale(1.1)}aside{-webkit-font-smoothing:antialiased;letter-spacing:-.01em}.dark .active-link{background-color:rgba(var(--p-primary-500-rgb),.15)!important;color:var(--p-primary-300)!important}.submenu{animation:menuOpen .25s ease}@keyframes menuOpen{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}aside{box-shadow:0 10px 40px #00000026}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i3$2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1438
1438
  }
1439
1439
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: RoutesComponent, decorators: [{
1440
1440
  type: Component,
1441
- args: [{ selector: 'app-routes', standalone: true, imports: [CommonModule, RouterModule, TooltipModule, TranslatePipe, StyleClassModule], template: "<aside class=\"flex h-screen bg-white dark:bg-gray-900 transition-all duration-300\"\n [ngClass]=\"{ 'w-0 overflow-hidden': !sidebarVisible && isMobile }\">\n\n <!-- \uD83C\uDFA8 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0627\u0644\u0631\u0626\u064A\u0633\u064A -->\n <div\n class=\"flex flex-col justify-between pt-4 pb-2 w-16 border-l shadow-xl\n bg-gradient-to-b from-primary-500 via-primary-600 to-primary-700\n text-white rounded-r-3xl\">\n\n <!-- \uD83D\uDD1D \u0627\u0644\u0623\u0639\u0644\u0649 -->\n <div class=\"flex flex-col items-center gap-4\">\n <img src=\"/assets/logo.png\" alt=\"Logo\"\n class=\"w-9 h-9 mt-1 rounded-lg shadow-sm\"/>\n\n <!-- \u0632\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 -->\n <!-- [pTooltip]=\"'TOGGLE_MENU' | translate\" -->\n <button (click)=\"toggleAll()\"\n tooltipPosition=\"right\"\n class=\"text-white hover:scale-110 transition-transform duration-200\">\n <i class=\"pi pi-bars text-lg\"></i>\n </button>\n\n <!-- \u0623\u064A\u0642\u0648\u0646\u0627\u062A -->\n @for (item of secondToLastLevel$ | async; track item) {\n <div class=\"relative flex flex-col items-center\">\n <!-- \u0627\u0644\u0623\u064A\u0642\u0648\u0646\u0629 -->\n <div (click)=\"onMainClick(item)\"\n [pTooltip]=\"item.label | translate\"\n tooltipPosition=\"right\"\n class=\"relative flex items-center justify-center w-10 h-10 rounded-xl cursor-pointer\n hover:bg-white/20 transition-all duration-200\"\n [ngClass]=\"{ 'bg-white/30 scale-105 shadow-inner': item.expanded }\">\n <i [class]=\"item.icon + ' text-xl'\"></i>\n </div>\n </div>\n }\n </div>\n\n <!-- \u2699\uFE0F \u0627\u0644\u0623\u0633\u0641\u0644 -->\n <div class=\"flex flex-col items-center pb-3 text-white/80\">\n <i class=\"pi pi-cog text-lg hover:text-white cursor-pointer transition\"></i>\n </div>\n </div>\n\n <!-- \uD83D\uDCCB \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0641\u0631\u0639\u064A\u0629 -->\n @if (subSidebarVisible) {\n <div\n class=\"w-65 border-l border-gray-200 dark:border-gray-700 glass-bg animate-slideIn\n shadow-2xl rounded-l-3xl p-4 rtl:text-right overflow-y-auto transition-all duration-300\"\n [ngClass]=\"{ 'absolute top-0 right-16 h-full z-40': isMobile }\">\n <!-- \u0632\u0631 \u0631\u062C\u0648\u0639 -->\n <button (click)=\"closeMenu()\"\n class=\"flex items-center gap-2 mb-4 text-gray-500 dark:text-gray-300 hover:text-primary-600 transition\">\n <i class=\"pi\" [ngClass]=\"isMobile ? 'pi-angle-right' : 'pi-angle-right'\"></i>\n <span>{{ 'back' | translate }}</span>\n </button>\n <!-- Recursive rendering -->\n @if (menuItems$ | async; as menuItems) {\n <ng-container *ngTemplateOutlet=\"renderMenu; context:{ $implicit: menuItems, level: 1 }\"></ng-container>\n}\n\n<ng-template #renderMenu let-items let-level=\"level\">\n @for (item of items; track item) {\n\n @if (!item.items?.length) {\n @let link = getLinkProps(item);\n <div class=\"mb-1\">\n @if (link.isExternal) {\n <a [href]=\"link.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n class=\"flex items-center gap-2 px-3 py-2 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\n <i [class]=\"item.icon + ' text-base'\"></i>\n <span>{{ item.label | translate }}</span>\n <i class=\"pi pi-external-link text-[10px] opacity-50\"></i>\n </a>\n } @else {\n <div class=\"flex items-center gap-2\">\n <a [routerLink]=\"link.routerLink\"\n (click)=\"onNavigate()\"\n routerLinkActive=\"active-link\"\n class=\"flex-1 flex items-center gap-2 px-2 py-1 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\n <i [class]=\"item.icon + ' text-base'\"></i>\n <span>{{ item.label | translate }}</span>\n </a>\n\n@if (link.addRoute) {\n <a\n [routerLink]=\"[link.addRoute]\"\n (click)=\"$event.stopPropagation(); onNavigate()\"\n class=\"shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full text-gray-400 hover:text-primary-500 hover:bg-primary-50 dark:text-gray-500 dark:hover:text-primary-400 dark:hover:bg-primary-900/20 transition-all duration-200\"\n [pTooltip]=\"'ADD' | translate\"\n tooltipPosition=\"top\">\n <i class=\"pi pi-plus text-xs\"></i>\n </a>\n}\n </div>\n }\n</div>\n}\n\n @if (item.items?.length) {\n <div class=\"mb-1\">\n\n <div\n (click)=\"onParentClick(item)\"\n [style.font-size.rem]=\"1.1 - (level * 0.05)\"\n [ngClass]=\"{\n 'font-bold': level === 1,\n 'font-semibold': level === 2,\n 'font-medium': level >= 3,\n 'bg-primary-50 text-primary-700 border-r-4 border-primary-500': item.expanded\n }\"\n class=\"flex justify-between items-center py-2 px-3 rounded-lg cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition text-gray-800 dark:text-gray-200\">\n\n <div class=\"flex items-center gap-2\">\n\n <i [class]=\"item.icon + ' text-base'\"></i>\n\n <span>\n {{ item.label | translate }}\n </span>\n\n </div>\n\n <i\n class=\"pi\"\n [ngClass]=\"item.expanded ? 'pi-chevron-down' : 'pi-chevron-left'\"\n style=\"font-size:0.6rem;\">\n </i>\n\n </div>\n\n @if (item.expanded) {\n <div class=\"mr-4 border-r border-gray-200 dark:border-gray-700 pr-2 mt-1\">\n\n <ng-container\n *ngTemplateOutlet=\"renderMenu; context:{ $implicit: item.items, level: level + 1 }\">\n </ng-container>\n\n </div>\n }\n\n </div>\n }\n\n }\n</ng-template>\n\n </div>\n}\n\n</aside>\n\n<!-- \uD83C\uDF1F \u0627\u0644\u0632\u0631 \u0627\u0644\u0639\u0627\u0626\u0645 \u0627\u0644\u062D\u062F\u064A\u062B -->\n@if (isMobile && !sidebarVisible) {\n <button\n class=\"floating-btn\"\n (click)=\"openMenu()\"\n pTooltip=\"{{ 'MENU.OPEN' | translate }}\"\n tooltipPosition=\"top\">\n <img src=\"/assets/logo.png\" alt=\"App Icon\" />\n </button>\n}\n", styles: ["@charset \"UTF-8\";@keyframes slideIn{0%{transform:translate(60px);opacity:0}to{transform:translate(0);opacity:1}}.animate-slideIn{animation:slideIn .35s cubic-bezier(.25,1,.5,1)}.glass-bg{background:#ffffffbf;backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%);border:1px solid rgba(255,255,255,.25)}@media(max-width:1024px){aside{position:fixed;top:0;right:0;height:100vh;z-index:50}}.floating-btn{position:fixed;bottom:1.25rem;right:1.25rem;z-index:60;width:60px;height:60px;border-radius:50%;background:linear-gradient(135deg,var(--p-primary-500),var(--p-primary-700));box-shadow:0 4px 18px #00000040;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.floating-btn:hover{transform:scale(1.1) rotate(5deg)}.floating-btn img{width:28px;height:28px;border-radius:10px}.active-link{background-color:var(--p-primary-500)!important;color:#fff!important;font-weight:600;box-shadow:0 4px 6px -1px #0000001a;transform:translate(-3px)}.active-link i{color:#fff!important}.render-menu-container span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-item-link{background:linear-gradient(to left,var(--p-primary-50),transparent);color:var(--p-primary-600)!important;position:relative;border-right:3px solid var(--p-primary-500);border-radius:0 12px 12px 0}.active-item-link i{color:var(--p-primary-500);filter:drop-shadow(0 0 5px rgba(var(--p-primary-500-rgb),.4))}.active-item-link span{font-weight:700}.animate-slideIn{animation:slideIn .3s ease-out}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.glass-bg::-webkit-scrollbar{width:4px}.glass-bg::-webkit-scrollbar-thumb{background:#0000001a;border-radius:10px}.active-link{background-color:var(--p-primary-50)!important;color:var(--p-primary-700)!important;border-right:4px solid var(--p-primary-500)!important;border-radius:4px 12px 12px 4px!important}.active-link span{font-weight:800!important}.active-link i{color:var(--p-primary-600)!important;transform:scale(1.1)}aside{-webkit-font-smoothing:antialiased;letter-spacing:-.01em}.dark .active-link{background-color:rgba(var(--p-primary-500-rgb),.15)!important;color:var(--p-primary-300)!important}.submenu{animation:menuOpen .25s ease}@keyframes menuOpen{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}aside{box-shadow:0 10px 40px #00000026}\n"] }]
1441
+ args: [{ selector: 'app-routes', standalone: true, imports: [CommonModule, RouterModule, TooltipModule, TranslatePipe, StyleClassModule], template: "<aside class=\"flex h-screen bg-white dark:bg-gray-900 transition-all duration-300\"\r\n [ngClass]=\"{ 'w-0 overflow-hidden': !sidebarVisible && isMobile }\">\r\n\r\n <!-- \uD83C\uDFA8 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0627\u0644\u0631\u0626\u064A\u0633\u064A -->\r\n <div\r\n class=\"flex flex-col justify-between pt-4 pb-2 w-16 border-l shadow-xl\r\n bg-gradient-to-b from-primary-500 via-primary-600 to-primary-700\r\n text-white rounded-r-3xl\">\r\n\r\n <!-- \uD83D\uDD1D \u0627\u0644\u0623\u0639\u0644\u0649 -->\r\n <div class=\"flex flex-col items-center gap-4\">\r\n <img src=\"/assets/logo.png\" alt=\"Logo\"\r\n class=\"w-9 h-9 mt-1 rounded-lg shadow-sm\"/>\r\n\r\n <!-- \u0632\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 -->\r\n <!-- [pTooltip]=\"'TOGGLE_MENU' | translate\" -->\r\n <button (click)=\"toggleAll()\"\r\n tooltipPosition=\"right\"\r\n class=\"text-white hover:scale-110 transition-transform duration-200\">\r\n <i class=\"pi pi-bars text-lg\"></i>\r\n </button>\r\n\r\n <!-- \u0623\u064A\u0642\u0648\u0646\u0627\u062A -->\r\n @for (item of secondToLastLevel$ | async; track item) {\r\n <div class=\"relative flex flex-col items-center\">\r\n <!-- \u0627\u0644\u0623\u064A\u0642\u0648\u0646\u0629 -->\r\n <div (click)=\"onMainClick(item)\"\r\n [pTooltip]=\"item.label | translate\"\r\n tooltipPosition=\"right\"\r\n class=\"relative flex items-center justify-center w-10 h-10 rounded-xl cursor-pointer\r\n hover:bg-white/20 transition-all duration-200\"\r\n [ngClass]=\"{ 'bg-white/30 scale-105 shadow-inner': item.expanded }\">\r\n <i [class]=\"item.icon + ' text-xl'\"></i>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- \u2699\uFE0F \u0627\u0644\u0623\u0633\u0641\u0644 -->\r\n <div class=\"flex flex-col items-center pb-3 text-white/80\">\r\n <i class=\"pi pi-cog text-lg hover:text-white cursor-pointer transition\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- \uD83D\uDCCB \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0641\u0631\u0639\u064A\u0629 -->\r\n @if (subSidebarVisible) {\r\n <div\r\n class=\"w-[290px] max-w-[290px] min-w-[260px] border-l border-gray-200 dark:border-gray-700 glass-bg animate-slideIn\r\n shadow-2xl rounded-l-3xl p-4 rtl:text-right overflow-y-auto overflow-x-hidden transition-all duration-300\"\r\n [ngClass]=\"{ 'absolute top-0 right-16 h-full z-40': isMobile }\">\r\n <!-- \u0632\u0631 \u0631\u062C\u0648\u0639 -->\r\n <button (click)=\"closeMenu()\"\r\n class=\"flex items-center gap-2 mb-4 text-gray-500 dark:text-gray-300 hover:text-primary-600 transition\">\r\n <i class=\"pi\" [ngClass]=\"isMobile ? 'pi-angle-right' : 'pi-angle-right'\"></i>\r\n <span>{{ 'back' | translate }}</span>\r\n </button>\r\n <!-- Recursive rendering -->\r\n @if (menuItems$ | async; as menuItems) {\r\n <ng-container *ngTemplateOutlet=\"renderMenu; context:{ $implicit: menuItems, level: 1 }\"></ng-container>\r\n}\r\n\r\n<ng-template #renderMenu let-items let-level=\"level\">\r\n @for (item of items; track item) {\r\n\r\n @if (!item.items?.length) {\r\n @let link = getLinkProps(item);\r\n <div class=\"mb-1\">\r\n @if (link.isExternal) {\r\n <a [href]=\"link.href\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"flex items-center gap-2 px-3 py-2 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n <span class=\"min-w-0 break-words whitespace-normal\">{{ item.label | translate }}</span>\r\n <i class=\"pi pi-external-link text-[10px] opacity-50\"></i>\r\n </a>\r\n } @else {\r\n <div class=\"flex items-center gap-2\">\r\n <a [routerLink]=\"link.routerLink\"\r\n (click)=\"onNavigate()\"\r\n routerLinkActive=\"active-link\"\r\n class=\"flex-1 min-w-0 flex items-center gap-2 px-2 py-1 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n <span class=\"min-w-0 break-words whitespace-normal\">\r\n {{ item.label | translate }}</span>\r\n </a>\r\n\r\n@if (link.addRoute) {\r\n <a\r\n [routerLink]=\"[link.addRoute]\"\r\n (click)=\"$event.stopPropagation(); onNavigate()\"\r\n class=\"shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full text-gray-400 hover:text-primary-500 hover:bg-primary-50 dark:text-gray-500 dark:hover:text-primary-400 dark:hover:bg-primary-900/20 transition-all duration-200\"\r\n [pTooltip]=\"'ADD' | translate\"\r\n tooltipPosition=\"top\">\r\n <i class=\"pi pi-plus text-xs\"></i>\r\n </a>\r\n}\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n @if (item.items?.length) {\r\n <div class=\"mb-1\">\r\n\r\n <div\r\n (click)=\"onParentClick(item)\"\r\n [style.font-size.rem]=\"1.1 - (level * 0.05)\"\r\n [ngClass]=\"{\r\n 'font-bold': level === 1,\r\n 'font-semibold': level === 2,\r\n 'font-medium': level >= 3,\r\n 'bg-primary-50 text-primary-700 border-r-4 border-primary-500': item.expanded\r\n }\"\r\n class=\"flex justify-between items-center py-2 px-3 rounded-lg cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition text-gray-800 dark:text-gray-200\">\r\n\r\n <div class=\"flex items-center gap-2\">\r\n\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n\r\n <span>\r\n {{ item.label | translate }}\r\n </span>\r\n\r\n </div>\r\n\r\n <i\r\n class=\"pi\"\r\n [ngClass]=\"item.expanded ? 'pi-chevron-down' : 'pi-chevron-left'\"\r\n style=\"font-size:0.6rem;\">\r\n </i>\r\n\r\n </div>\r\n\r\n @if (item.expanded) {\r\n <div class=\"mr-4 border-r border-gray-200 dark:border-gray-700 pr-2 mt-1\">\r\n\r\n <ng-container\r\n *ngTemplateOutlet=\"renderMenu; context:{ $implicit: item.items, level: level + 1 }\">\r\n </ng-container>\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n }\r\n\r\n }\r\n</ng-template>\r\n\r\n </div>\r\n}\r\n\r\n</aside>\r\n\r\n<!-- \uD83C\uDF1F \u0627\u0644\u0632\u0631 \u0627\u0644\u0639\u0627\u0626\u0645 \u0627\u0644\u062D\u062F\u064A\u062B -->\r\n@if (isMobile && !sidebarVisible) {\r\n <button\r\n class=\"floating-btn\"\r\n (click)=\"openMenu()\"\r\n pTooltip=\"{{ 'MENU.OPEN' | translate }}\"\r\n tooltipPosition=\"top\">\r\n <img src=\"/assets/logo.png\" alt=\"App Icon\" />\r\n </button>\r\n}\r\n", styles: ["@charset \"UTF-8\";@keyframes slideIn{0%{transform:translate(60px);opacity:0}to{transform:translate(0);opacity:1}}.animate-slideIn{animation:slideIn .35s cubic-bezier(.25,1,.5,1)}.glass-bg{background:#ffffffbf;backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%);border:1px solid rgba(255,255,255,.25)}@media(max-width:1024px){aside{position:fixed;top:0;right:0;height:100vh;z-index:50}}.floating-btn{position:fixed;bottom:1.25rem;right:1.25rem;z-index:60;width:60px;height:60px;border-radius:50%;background:linear-gradient(135deg,var(--p-primary-500),var(--p-primary-700));box-shadow:0 4px 18px #00000040;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.floating-btn:hover{transform:scale(1.1) rotate(5deg)}.floating-btn img{width:28px;height:28px;border-radius:10px}.active-link{background-color:var(--p-primary-500)!important;color:#fff!important;font-weight:600;box-shadow:0 4px 6px -1px #0000001a;transform:translate(-3px)}.active-link i{color:#fff!important}.active-item-link{background:linear-gradient(to left,var(--p-primary-50),transparent);color:var(--p-primary-600)!important;position:relative;border-right:3px solid var(--p-primary-500);border-radius:0 12px 12px 0}.active-item-link i{color:var(--p-primary-500);filter:drop-shadow(0 0 5px rgba(var(--p-primary-500-rgb),.4))}.active-item-link span{font-weight:700}.animate-slideIn{animation:slideIn .3s ease-out}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.glass-bg::-webkit-scrollbar{width:4px}.glass-bg::-webkit-scrollbar-thumb{background:#0000001a;border-radius:10px}.active-link{background-color:var(--p-primary-50)!important;color:var(--p-primary-700)!important;border-right:4px solid var(--p-primary-500)!important;border-radius:4px 12px 12px 4px!important}.active-link span{font-weight:800!important}.active-link i{color:var(--p-primary-600)!important;transform:scale(1.1)}aside{-webkit-font-smoothing:antialiased;letter-spacing:-.01em}.dark .active-link{background-color:rgba(var(--p-primary-500-rgb),.15)!important;color:var(--p-primary-300)!important}.submenu{animation:menuOpen .25s ease}@keyframes menuOpen{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}aside{box-shadow:0 10px 40px #00000026}\n"] }]
1442
1442
  }], ctorParameters: () => [], propDecorators: { onResize: [{
1443
1443
  type: HostListener,
1444
1444
  args: ['window:resize']
@@ -1447,11 +1447,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1447
1447
  class AuthWrapperComponent {
1448
1448
  constructor() { }
1449
1449
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AuthWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1450
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AuthWrapperComponent, isStandalone: true, selector: "abp-auth-wrapper", ngImport: i0, template: " <ng-content></ng-content>\n\n\n<!-- <div class=\"row\">\n <div class=\"mx-auto col col-md-5\">\n @if ((service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible) {\n <abp-tenant-box\n *abpReplaceableTemplate=\"{ componentKey: service.tenantBoxKey }\"\n ></abp-tenant-box>\n }\n\n <div class=\"abp-account-container\">\n @if (service.enableLocalLogin$ | async) {\n <div class=\"card mt-3 shadow-sm rounded\">\n <div class=\"card-body p-5\">\n <ng-content></ng-content>\n </div>\n </div>\n } @else {\n <div class=\"alert alert-warning\">\n <strong>{{ 'AbpAccount::InvalidLoginRequest' | localize }}</strong>\n {{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | localize }}\n </div>\n }\n </div>\n </div>\n</div> -->\n" });
1450
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AuthWrapperComponent, isStandalone: true, selector: "abp-auth-wrapper", ngImport: i0, template: " <ng-content></ng-content>\r\n\r\n\r\n<!-- <div class=\"row\">\r\n <div class=\"mx-auto col col-md-5\">\r\n @if ((service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible) {\r\n <abp-tenant-box\r\n *abpReplaceableTemplate=\"{ componentKey: service.tenantBoxKey }\"\r\n ></abp-tenant-box>\r\n }\r\n\r\n <div class=\"abp-account-container\">\r\n @if (service.enableLocalLogin$ | async) {\r\n <div class=\"card mt-3 shadow-sm rounded\">\r\n <div class=\"card-body p-5\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"alert alert-warning\">\r\n <strong>{{ 'AbpAccount::InvalidLoginRequest' | localize }}</strong>\r\n {{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | localize }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div> -->\r\n" });
1451
1451
  }
1452
1452
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AuthWrapperComponent, decorators: [{
1453
1453
  type: Component,
1454
- args: [{ standalone: true, imports: [], selector: 'abp-auth-wrapper', template: " <ng-content></ng-content>\n\n\n<!-- <div class=\"row\">\n <div class=\"mx-auto col col-md-5\">\n @if ((service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible) {\n <abp-tenant-box\n *abpReplaceableTemplate=\"{ componentKey: service.tenantBoxKey }\"\n ></abp-tenant-box>\n }\n\n <div class=\"abp-account-container\">\n @if (service.enableLocalLogin$ | async) {\n <div class=\"card mt-3 shadow-sm rounded\">\n <div class=\"card-body p-5\">\n <ng-content></ng-content>\n </div>\n </div>\n } @else {\n <div class=\"alert alert-warning\">\n <strong>{{ 'AbpAccount::InvalidLoginRequest' | localize }}</strong>\n {{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | localize }}\n </div>\n }\n </div>\n </div>\n</div> -->\n" }]
1454
+ args: [{ standalone: true, imports: [], selector: 'abp-auth-wrapper', template: " <ng-content></ng-content>\r\n\r\n\r\n<!-- <div class=\"row\">\r\n <div class=\"mx-auto col col-md-5\">\r\n @if ((service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible) {\r\n <abp-tenant-box\r\n *abpReplaceableTemplate=\"{ componentKey: service.tenantBoxKey }\"\r\n ></abp-tenant-box>\r\n }\r\n\r\n <div class=\"abp-account-container\">\r\n @if (service.enableLocalLogin$ | async) {\r\n <div class=\"card mt-3 shadow-sm rounded\">\r\n <div class=\"card-body p-5\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"alert alert-warning\">\r\n <strong>{{ 'AbpAccount::InvalidLoginRequest' | localize }}</strong>\r\n {{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | localize }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div> -->\r\n" }]
1455
1455
  }], ctorParameters: () => [] });
1456
1456
 
1457
1457
  class AccountLayoutComponent {
@@ -1466,11 +1466,11 @@ class AccountLayoutComponent {
1466
1466
  // this.service.subscribeWindowSize();
1467
1467
  }
1468
1468
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AccountLayoutComponent, deps: [{ token: LayoutService }], target: i0.ɵɵFactoryTarget.Component });
1469
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AccountLayoutComponent, isStandalone: true, selector: "abp-layout-account", providers: [LayoutService, SubscriptionService], ngImport: i0, template: " <abp-auth-wrapper\n *abpReplaceableTemplate=\"{\n componentKey: authWrapperKey\n }\"\n >\n <router-outlet #outlet=\"outlet\"></router-outlet>\n </abp-auth-wrapper>\n", dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AuthWrapperComponent, selector: "abp-auth-wrapper" }, { kind: "directive", type: ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }] });
1469
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AccountLayoutComponent, isStandalone: true, selector: "abp-layout-account", providers: [LayoutService, SubscriptionService], ngImport: i0, template: " <abp-auth-wrapper\r\n *abpReplaceableTemplate=\"{\r\n componentKey: authWrapperKey\r\n }\"\r\n >\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n </abp-auth-wrapper>\r\n", dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AuthWrapperComponent, selector: "abp-auth-wrapper" }, { kind: "directive", type: ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }] });
1470
1470
  }
1471
1471
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AccountLayoutComponent, decorators: [{
1472
1472
  type: Component,
1473
- args: [{ standalone: true, imports: [RoutesComponent, NavItemsComponent, RouterOutlet, AuthWrapperComponent, ReplaceableTemplateDirective], selector: 'abp-layout-account', providers: [LayoutService, SubscriptionService], template: " <abp-auth-wrapper\n *abpReplaceableTemplate=\"{\n componentKey: authWrapperKey\n }\"\n >\n <router-outlet #outlet=\"outlet\"></router-outlet>\n </abp-auth-wrapper>\n" }]
1473
+ args: [{ standalone: true, imports: [RoutesComponent, NavItemsComponent, RouterOutlet, AuthWrapperComponent, ReplaceableTemplateDirective], selector: 'abp-layout-account', providers: [LayoutService, SubscriptionService], template: " <abp-auth-wrapper\r\n *abpReplaceableTemplate=\"{\r\n componentKey: authWrapperKey\r\n }\"\r\n >\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n </abp-auth-wrapper>\r\n" }]
1474
1474
  }], ctorParameters: () => [{ type: LayoutService }] });
1475
1475
 
1476
1476
  class ApplicationLayoutComponent {
@@ -1646,11 +1646,11 @@ class ApplicationLayoutComponent {
1646
1646
  }
1647
1647
  }
1648
1648
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ApplicationLayoutComponent, deps: [{ token: LayoutService }, { token: i0.Renderer2 }, { token: i2$2.Router }, { token: i0.NgZone }, { token: i3$3.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
1649
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ApplicationLayoutComponent, isStandalone: true, selector: "abp-layout-application", providers: [LayoutService, SubscriptionService], ngImport: i0, template: "\n\n<div class=\"flex h-screen overflow-hidden\">\n\n <!-- Sidebar stays fixed -->\n\n <app-routes\n *abpReplaceableTemplate=\"{\n componentKey: service.routesComponentKey,\n inputs: { smallScreen: { value: service.smallScreen } }\n }\"\n class=\"mb-2 md:mb-0\"\n ></app-routes>\n\n <!-- Main content scrolls -->\n <main class=\"flex-1 flex flex-col overflow-hidden\">\n\n <!-- Optional Topbar -->\n <!-- @if (showTopbar) { -->\n\n <app-nav-items\n *abpReplaceableTemplate=\"{\n componentKey: service.navItemsComponentKey\n }\"\n ></app-nav-items>\n\n <!-- p-6 space-y-6 -->\n <div class=\"flex-1 overflow-y-auto\">\n <router-outlet #outlet=\"outlet\"></router-outlet>\n </div>\n\n <!-- <app-footer></app-footer> -->\n\n </main>\n\n </div>\n\n", dependencies: [{ kind: "component", type: RoutesComponent, selector: "app-routes" }, { kind: "component", type: NavItemsComponent, selector: "app-nav-items" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }], animations: [ /* slideFromBottom, */ /* appModuleAnimation() */] });
1649
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ApplicationLayoutComponent, isStandalone: true, selector: "abp-layout-application", providers: [LayoutService, SubscriptionService], ngImport: i0, template: "\r\n\r\n<div class=\"flex h-screen overflow-hidden\">\r\n\r\n <!-- Sidebar stays fixed -->\r\n\r\n <app-routes\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.routesComponentKey,\r\n inputs: { smallScreen: { value: service.smallScreen } }\r\n }\"\r\n class=\"mb-2 md:mb-0\"\r\n ></app-routes>\r\n\r\n <!-- Main content scrolls -->\r\n <main class=\"flex-1 flex flex-col overflow-hidden\">\r\n\r\n <!-- Optional Topbar -->\r\n <!-- @if (showTopbar) { -->\r\n\r\n <app-nav-items\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.navItemsComponentKey\r\n }\"\r\n ></app-nav-items>\r\n\r\n <!-- p-6 space-y-6 -->\r\n <div class=\"flex-1 overflow-y-auto\">\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n </div>\r\n\r\n <!-- <app-footer></app-footer> -->\r\n\r\n </main>\r\n\r\n </div>\r\n\r\n", dependencies: [{ kind: "component", type: RoutesComponent, selector: "app-routes" }, { kind: "component", type: NavItemsComponent, selector: "app-nav-items" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }], animations: [ /* slideFromBottom, */ /* appModuleAnimation() */] });
1650
1650
  }
1651
1651
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ApplicationLayoutComponent, decorators: [{
1652
1652
  type: Component,
1653
- args: [{ standalone: true, imports: [RoutesComponent, NavItemsComponent, RouterOutlet, ReplaceableTemplateDirective], selector: 'abp-layout-application', animations: [ /* slideFromBottom, */ /* appModuleAnimation() */], providers: [LayoutService, SubscriptionService], template: "\n\n<div class=\"flex h-screen overflow-hidden\">\n\n <!-- Sidebar stays fixed -->\n\n <app-routes\n *abpReplaceableTemplate=\"{\n componentKey: service.routesComponentKey,\n inputs: { smallScreen: { value: service.smallScreen } }\n }\"\n class=\"mb-2 md:mb-0\"\n ></app-routes>\n\n <!-- Main content scrolls -->\n <main class=\"flex-1 flex flex-col overflow-hidden\">\n\n <!-- Optional Topbar -->\n <!-- @if (showTopbar) { -->\n\n <app-nav-items\n *abpReplaceableTemplate=\"{\n componentKey: service.navItemsComponentKey\n }\"\n ></app-nav-items>\n\n <!-- p-6 space-y-6 -->\n <div class=\"flex-1 overflow-y-auto\">\n <router-outlet #outlet=\"outlet\"></router-outlet>\n </div>\n\n <!-- <app-footer></app-footer> -->\n\n </main>\n\n </div>\n\n" }]
1653
+ args: [{ standalone: true, imports: [RoutesComponent, NavItemsComponent, RouterOutlet, ReplaceableTemplateDirective], selector: 'abp-layout-application', animations: [ /* slideFromBottom, */ /* appModuleAnimation() */], providers: [LayoutService, SubscriptionService], template: "\r\n\r\n<div class=\"flex h-screen overflow-hidden\">\r\n\r\n <!-- Sidebar stays fixed -->\r\n\r\n <app-routes\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.routesComponentKey,\r\n inputs: { smallScreen: { value: service.smallScreen } }\r\n }\"\r\n class=\"mb-2 md:mb-0\"\r\n ></app-routes>\r\n\r\n <!-- Main content scrolls -->\r\n <main class=\"flex-1 flex flex-col overflow-hidden\">\r\n\r\n <!-- Optional Topbar -->\r\n <!-- @if (showTopbar) { -->\r\n\r\n <app-nav-items\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.navItemsComponentKey\r\n }\"\r\n ></app-nav-items>\r\n\r\n <!-- p-6 space-y-6 -->\r\n <div class=\"flex-1 overflow-y-auto\">\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n </div>\r\n\r\n <!-- <app-footer></app-footer> -->\r\n\r\n </main>\r\n\r\n </div>\r\n\r\n" }]
1654
1654
  }], ctorParameters: () => [{ type: LayoutService }, { type: i0.Renderer2 }, { type: i2$2.Router }, { type: i0.NgZone }, { type: i3$3.LocalizationService }] });
1655
1655
 
1656
1656
  class EmptyLayoutComponent {