@flusys/ng-layout 1.0.0-rc → 1.0.1

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,6 +1,10 @@
1
- import { isPlatformBrowser, NgClass, DOCUMENT as DOCUMENT$1 } from '@angular/common';
2
1
  import * as i0 from '@angular/core';
3
- import { inject, PLATFORM_ID, Injectable, DOCUMENT, signal, computed, effect, afterNextRender, ChangeDetectionStrategy, Component, InjectionToken, DestroyRef, ElementRef, viewChild, input, Renderer2 } from '@angular/core';
2
+ import { inject, PLATFORM_ID, Injectable, DOCUMENT, signal, computed, effect, ChangeDetectionStrategy, Component, afterNextRender, InjectionToken, DestroyRef, ElementRef, viewChild, input, Renderer2 } from '@angular/core';
3
+ import { isPlatformBrowser, NgClass, DOCUMENT as DOCUMENT$1 } from '@angular/common';
4
+ import { APP_CONFIG, DEFAULT_APP_NAME, DEFAULT_AUTHOR, isCompanyFeatureEnabled } from '@flusys/ng-core';
5
+ import * as i2$2 from '@flusys/ng-shared';
6
+ import { evaluateLogicNode, PermissionValidatorService, AngularModule, IconComponent } from '@flusys/ng-shared';
7
+ import { Subject, fromEvent, filter as filter$1 } from 'rxjs';
4
8
  import * as i1 from '@angular/forms';
5
9
  import { FormsModule } from '@angular/forms';
6
10
  import * as i1$2 from '@angular/router';
@@ -11,10 +15,6 @@ import Lara from '@primeuix/themes/lara';
11
15
  import Nora from '@primeuix/themes/nora';
12
16
  import * as i2 from 'primeng/selectbutton';
13
17
  import { SelectButtonModule } from 'primeng/selectbutton';
14
- import { APP_CONFIG, DEFAULT_APP_NAME, DEFAULT_AUTHOR, isCompanyFeatureEnabled } from '@flusys/ng-core';
15
- import * as i2$2 from '@flusys/ng-shared';
16
- import { evaluateLogicNode, PermissionValidatorService, AngularModule, IconComponent } from '@flusys/ng-shared';
17
- import { Subject, fromEvent, filter as filter$1 } from 'rxjs';
18
18
  import * as i1$1 from 'primeng/button';
19
19
  import { ButtonModule } from 'primeng/button';
20
20
  import * as i2$1 from 'primeng/styleclass';
@@ -192,90 +192,61 @@ class LayoutPersistenceService {
192
192
  const { _version, ...cleanConfig } = config;
193
193
  return cleanConfig;
194
194
  }
195
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutPersistenceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
196
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutPersistenceService, providedIn: 'root' });
195
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: LayoutPersistenceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
196
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: LayoutPersistenceService, providedIn: 'root' });
197
197
  }
198
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutPersistenceService, decorators: [{
198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: LayoutPersistenceService, decorators: [{
199
199
  type: Injectable,
200
200
  args: [{
201
201
  providedIn: 'root',
202
202
  }]
203
203
  }] });
204
204
 
205
- /**
206
- * Service managing layout configuration and state.
207
- * Provides signals for reactive layout updates.
208
- */
205
+ /** Layout configuration and state management service */
209
206
  class LayoutService {
210
207
  document = inject(DOCUMENT);
211
208
  platformId = inject(PLATFORM_ID);
212
209
  isBrowser = isPlatformBrowser(this.platformId);
213
210
  persistence = inject(LayoutPersistenceService);
214
211
  appConfig = inject(APP_CONFIG, { optional: true });
215
- defaultConfig = {
212
+ DEFAULT_CONFIG = {
216
213
  preset: 'Aura',
217
214
  primary: 'emerald',
218
215
  surface: null,
219
216
  darkTheme: false,
220
217
  menuMode: 'static',
221
218
  };
222
- // Load persisted config merged with defaults
223
- initialConfig = (() => {
224
- const persisted = this.persistence.load();
225
- return persisted
226
- ? { ...this.defaultConfig, ...persisted }
227
- : this.defaultConfig;
228
- })();
229
- defaultState = {
219
+ DEFAULT_STATE = {
230
220
  staticMenuDesktopInactive: false,
231
221
  overlayMenuActive: false,
232
222
  configSidebarVisible: false,
233
223
  staticMenuMobileActive: false,
234
224
  menuHoverActive: false,
235
225
  };
236
- // Private writable signals with public readonly accessors
237
- _layoutConfig = signal(this.initialConfig, ...(ngDevMode ? [{ debugName: "_layoutConfig" }] : []));
238
- _layoutState = signal(this.defaultState, ...(ngDevMode ? [{ debugName: "_layoutState" }] : []));
226
+ _layoutConfig = signal({
227
+ ...this.DEFAULT_CONFIG,
228
+ ...this.persistence.load(),
229
+ }, ...(ngDevMode ? [{ debugName: "_layoutConfig" }] : []));
230
+ _layoutState = signal(this.DEFAULT_STATE, ...(ngDevMode ? [{ debugName: "_layoutState" }] : []));
239
231
  _transitionComplete = signal(false, ...(ngDevMode ? [{ debugName: "_transitionComplete" }] : []));
240
232
  layoutConfig = this._layoutConfig.asReadonly();
241
233
  layoutState = this._layoutState.asReadonly();
242
234
  transitionComplete = this._transitionComplete.asReadonly();
243
- // User Profile Signals (private writable, public readonly)
244
235
  _userProfile = signal(null, ...(ngDevMode ? [{ debugName: "_userProfile" }] : []));
245
236
  _companyProfile = signal(null, ...(ngDevMode ? [{ debugName: "_companyProfile" }] : []));
246
- _appName = signal(this.appConfig?.appName ?? DEFAULT_APP_NAME, ...(ngDevMode ? [{ debugName: "_appName" }] : []));
247
- userProfile = this._userProfile.asReadonly();
248
- companyProfile = this._companyProfile.asReadonly();
249
- appName = this._appName.asReadonly();
250
- // Author/Brand Signals (private writable, public readonly)
251
- _authorName = signal(this.appConfig?.author?.name ?? DEFAULT_AUTHOR.name, ...(ngDevMode ? [{ debugName: "_authorName" }] : []));
252
- _authorUrl = signal(this.appConfig?.author?.url ?? DEFAULT_AUTHOR.url, ...(ngDevMode ? [{ debugName: "_authorUrl" }] : []));
253
- authorName = this._authorName.asReadonly();
254
- authorUrl = this._authorUrl.asReadonly();
255
- // App Launcher Signals
256
- _rawApps = signal([], ...(ngDevMode ? [{ debugName: "_rawApps" }] : []));
257
- /**
258
- * Filtered launcher apps based on user permissions.
259
- * Automatically recomputes when raw apps or permissions change.
260
- */
261
- apps = computed(() => {
262
- const raw = this._rawApps();
263
- const permission = this.permissionValidator.permissions();
264
- return filterAppsByPermissions(raw, permission);
265
- }, ...(ngDevMode ? [{ debugName: "apps" }] : []));
266
- // Menu Signals
267
237
  _rawMenu = signal([], ...(ngDevMode ? [{ debugName: "_rawMenu" }] : []));
238
+ _rawApps = signal([], ...(ngDevMode ? [{ debugName: "_rawApps" }] : []));
268
239
  permissionValidator = inject(PermissionValidatorService);
269
- /**
270
- * Filtered menu items based on user permissions.
271
- * Automatically recomputes when raw menu or permission checker changes.
272
- * Role checker is optional - if not set, role-based permissions will be denied.
273
- */
274
- menu = computed(() => {
275
- const raw = this._rawMenu(); // Track permission changes
276
- const permission = this.permissionValidator.permissions();
277
- return filterMenuByPermissions(raw, permission);
278
- }, ...(ngDevMode ? [{ debugName: "menu" }] : []));
240
+ userProfile = this._userProfile.asReadonly();
241
+ companyProfile = this._companyProfile.asReadonly();
242
+ // Static app info from config
243
+ appName = this.appConfig?.appName ?? DEFAULT_APP_NAME;
244
+ authorName = this.appConfig?.author?.name ?? DEFAULT_AUTHOR.name;
245
+ authorUrl = this.appConfig?.author?.url ?? DEFAULT_AUTHOR.url;
246
+ // Permission-filtered menu and apps
247
+ menu = computed(() => filterMenuByPermissions(this._rawMenu(), this.permissionValidator.permissions()), ...(ngDevMode ? [{ debugName: "menu" }] : []));
248
+ apps = computed(() => filterAppsByPermissions(this._rawApps(), this.permissionValidator.permissions()), ...(ngDevMode ? [{ debugName: "apps" }] : []));
249
+ hasApps = computed(() => this.apps().length > 0, ...(ngDevMode ? [{ debugName: "hasApps" }] : []));
279
250
  // Computed signals - Layout
280
251
  isSidebarActive = computed(() => this._layoutState().overlayMenuActive ||
281
252
  this._layoutState().staticMenuMobileActive, ...(ngDevMode ? [{ debugName: "isSidebarActive" }] : []));
@@ -283,21 +254,17 @@ class LayoutService {
283
254
  getPrimary = computed(() => this._layoutConfig().primary, ...(ngDevMode ? [{ debugName: "getPrimary" }] : []));
284
255
  getSurface = computed(() => this._layoutConfig().surface, ...(ngDevMode ? [{ debugName: "getSurface" }] : []));
285
256
  isOverlay = computed(() => this._layoutConfig().menuMode === 'overlay', ...(ngDevMode ? [{ debugName: "isOverlay" }] : []));
286
- // Computed signals - User Profile
257
+ // User profile computed signals
287
258
  userName = computed(() => this._userProfile()?.name ?? 'User', ...(ngDevMode ? [{ debugName: "userName" }] : []));
288
259
  userEmail = computed(() => this._userProfile()?.email ?? '', ...(ngDevMode ? [{ debugName: "userEmail" }] : []));
289
260
  userProfilePictureUrl = computed(() => this._userProfile()?.profilePictureUrl ?? null, ...(ngDevMode ? [{ debugName: "userProfilePictureUrl" }] : []));
290
- companyName = computed(() => {
291
- // If company feature is disabled, always show app name
292
- if (!this.appConfig || !isCompanyFeatureEnabled(this.appConfig)) {
293
- return this._appName();
294
- }
295
- return this._companyProfile()?.name ?? this._appName();
296
- }, ...(ngDevMode ? [{ debugName: "companyName" }] : []));
297
261
  companyLogoUrl = computed(() => this._companyProfile()?.logoUrl ?? null, ...(ngDevMode ? [{ debugName: "companyLogoUrl" }] : []));
298
262
  isAuthenticated = computed(() => !!this._userProfile(), ...(ngDevMode ? [{ debugName: "isAuthenticated" }] : []));
299
- // Computed signals - App Launcher
300
- hasApps = computed(() => this.apps().length > 0, ...(ngDevMode ? [{ debugName: "hasApps" }] : []));
263
+ companyName = computed(() => {
264
+ if (!this.appConfig || !isCompanyFeatureEnabled(this.appConfig))
265
+ return this.appName;
266
+ return this._companyProfile()?.name ?? this.appName;
267
+ }, ...(ngDevMode ? [{ debugName: "companyName" }] : []));
301
268
  // RxJS Subjects for event communication
302
269
  configUpdate = new Subject();
303
270
  overlayOpen = new Subject();
@@ -311,80 +278,55 @@ class LayoutService {
311
278
  constructor() {
312
279
  effect(() => {
313
280
  const config = this._layoutConfig();
314
- if (config) {
315
- this.onConfigUpdate();
316
- }
317
- });
318
- effect(() => {
319
- const config = this._layoutConfig();
320
- if (!this.initialized || !config) {
321
- this.initialized = true;
322
- return;
323
- }
324
- this.handleDarkModeTransition(config);
325
- });
326
- // Auto-save configuration changes to localStorage
327
- effect(() => {
328
- const config = this._layoutConfig();
329
- if (config && this.initialized) {
281
+ this.configUpdate.next(config);
282
+ if (this.initialized) {
283
+ this.handleDarkModeTransition(config);
330
284
  this.persistence.save(config);
331
285
  }
286
+ this.initialized = true;
332
287
  });
333
288
  }
289
+ toggleDarkMode(config) {
290
+ const isDark = (config ?? this._layoutConfig()).darkTheme;
291
+ this.document.documentElement.classList.toggle('app-dark', isDark);
292
+ }
334
293
  handleDarkModeTransition(config) {
335
294
  const doc = this.document;
336
- // Check for View Transitions API support (not all browsers support it)
337
295
  if ('startViewTransition' in doc && typeof doc.startViewTransition === 'function') {
338
- this.startViewTransition(config, doc);
296
+ doc
297
+ .startViewTransition(() => this.toggleDarkMode(config))
298
+ .ready.then(() => this.onTransitionEnd())
299
+ .catch(() => { });
339
300
  }
340
301
  else {
341
302
  this.toggleDarkMode(config);
342
303
  this.onTransitionEnd();
343
304
  }
344
305
  }
345
- startViewTransition(config, doc) {
346
- const transition = doc.startViewTransition(() => {
347
- this.toggleDarkMode(config);
348
- });
349
- transition.ready.then(() => this.onTransitionEnd()).catch(() => { });
350
- }
351
- toggleDarkMode(config) {
352
- const _config = config || this._layoutConfig();
353
- if (_config.darkTheme) {
354
- this.document.documentElement.classList.add('app-dark');
355
- }
356
- else {
357
- this.document.documentElement.classList.remove('app-dark');
358
- }
359
- }
360
306
  onTransitionEnd() {
361
307
  this._transitionComplete.set(true);
362
308
  setTimeout(() => this._transitionComplete.set(false));
363
309
  }
364
310
  onMenuToggle() {
311
+ const state = this._layoutState();
365
312
  if (this.isOverlay()) {
366
- this._layoutState.update((prev) => ({
367
- ...prev,
368
- overlayMenuActive: !this._layoutState().overlayMenuActive,
369
- }));
370
- if (this._layoutState().overlayMenuActive) {
313
+ const newOverlayActive = !state.overlayMenuActive;
314
+ this._layoutState.update((prev) => ({ ...prev, overlayMenuActive: newOverlayActive }));
315
+ if (newOverlayActive)
371
316
  this.overlayOpen.next();
372
- }
317
+ return;
373
318
  }
374
319
  if (this.isDesktop()) {
375
320
  this._layoutState.update((prev) => ({
376
321
  ...prev,
377
- staticMenuDesktopInactive: !this._layoutState().staticMenuDesktopInactive,
322
+ staticMenuDesktopInactive: !state.staticMenuDesktopInactive,
378
323
  }));
379
324
  }
380
325
  else {
381
- this._layoutState.update((prev) => ({
382
- ...prev,
383
- staticMenuMobileActive: !this._layoutState().staticMenuMobileActive,
384
- }));
385
- if (this._layoutState().staticMenuMobileActive) {
326
+ const newMobileActive = !state.staticMenuMobileActive;
327
+ this._layoutState.update((prev) => ({ ...prev, staticMenuMobileActive: newMobileActive }));
328
+ if (newMobileActive)
386
329
  this.overlayOpen.next();
387
- }
388
330
  }
389
331
  }
390
332
  isDesktop() {
@@ -393,94 +335,70 @@ class LayoutService {
393
335
  isMobile() {
394
336
  return !this.isDesktop();
395
337
  }
396
- onConfigUpdate() {
397
- this.configUpdate.next(this._layoutConfig());
398
- }
399
338
  onMenuStateChange(event) {
400
339
  this.menuSource.next(event);
401
340
  }
402
341
  reset() {
403
342
  this.resetSource.next(true);
404
343
  }
405
- // ==========================================================================
406
- // Layout Config Methods
407
- // ==========================================================================
408
- /**
409
- * Update layout configuration.
410
- * Called by configurator component.
411
- */
344
+ // Config & state updates
412
345
  updateLayoutConfig(config) {
413
346
  this._layoutConfig.update((prev) => ({ ...prev, ...config }));
414
347
  }
415
- /**
416
- * Update layout state.
417
- * Called internally and by layout components.
418
- */
419
348
  updateLayoutState(state) {
420
349
  this._layoutState.update((prev) => ({ ...prev, ...state }));
421
350
  }
422
- // ==========================================================================
423
- // User Profile Methods
424
- // ==========================================================================
425
- /**
426
- * Set the current user profile for display in layout.
427
- * Called by auth integration to sync user data.
428
- */
351
+ // Profile setters
429
352
  setUserProfile(profile) {
430
353
  this._userProfile.set(profile);
431
354
  }
432
- /**
433
- * Set the current company profile for display in layout.
434
- * Called by auth integration to sync company data.
435
- */
436
355
  setCompanyProfile(profile) {
437
356
  this._companyProfile.set(profile);
438
357
  }
439
- // ==========================================================================
440
- // Menu Methods
441
- // ==========================================================================
442
- /**
443
- * Set the raw menu items (unfiltered).
444
- * Menu will be automatically filtered based on permission checker.
445
- * Called by app initialization to set menu from IAM or other source.
446
- */
358
+ // Menu & apps
447
359
  setMenu(items) {
448
360
  this._rawMenu.set(items);
449
361
  }
450
- /**
451
- * Clear menu and permission/role checkers.
452
- * Called on logout.
453
- */
454
362
  clearMenu() {
455
363
  this._rawMenu.set([]);
456
364
  }
457
- // ==========================================================================
458
- // App Launcher Methods
459
- // ==========================================================================
460
- /**
461
- * Set launcher apps for display in header.
462
- * Apps will be automatically filtered based on user permissions.
463
- * If empty after filtering, the app launcher button is hidden.
464
- */
465
365
  setApps(apps) {
466
366
  this._rawApps.set(apps);
467
367
  }
468
- /**
469
- * Clear launcher apps.
470
- * Called on logout.
471
- */
472
368
  clearApps() {
473
369
  this._rawApps.set([]);
474
370
  }
475
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
476
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutService, providedIn: 'root' });
371
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
372
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: LayoutService, providedIn: 'root' });
477
373
  }
478
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutService, decorators: [{
374
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: LayoutService, decorators: [{
479
375
  type: Injectable,
376
+ args: [{ providedIn: 'root' }]
377
+ }], ctorParameters: () => [] });
378
+
379
+ class AppFooter {
380
+ layoutService = inject(LayoutService);
381
+ // Footer shows product branding (appName), not user's company
382
+ appName = this.layoutService.appName;
383
+ authorName = this.layoutService.authorName;
384
+ authorUrl = this.layoutService.authorUrl;
385
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppFooter, deps: [], target: i0.ɵɵFactoryTarget.Component });
386
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.5", type: AppFooter, isStandalone: true, selector: "app-footer", ngImport: i0, template: `<div class="layout-footer">
387
+ {{ appName }} by
388
+ <a [href]="authorUrl" target="_blank" rel="noopener noreferrer" class="text-primary font-bold hover:underline">{{ authorName }}</a>
389
+ </div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
390
+ }
391
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppFooter, decorators: [{
392
+ type: Component,
480
393
  args: [{
481
- providedIn: 'root',
394
+ selector: 'app-footer',
395
+ changeDetection: ChangeDetectionStrategy.OnPush,
396
+ template: `<div class="layout-footer">
397
+ {{ appName }} by
398
+ <a [href]="authorUrl" target="_blank" rel="noopener noreferrer" class="text-primary font-bold hover:underline">{{ authorName }}</a>
399
+ </div>`,
482
400
  }]
483
- }], ctorParameters: () => [] });
401
+ }] });
484
402
 
485
403
  const presets = {
486
404
  Aura,
@@ -839,8 +757,8 @@ class AppConfigurator {
839
757
  onMenuModeChange(event) {
840
758
  this.layoutService.updateLayoutConfig({ menuMode: event });
841
759
  }
842
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
843
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppConfigurator, isStandalone: true, selector: "app-configurator", host: { styleAttribute: "background-color: var(--surface-overlay)", classAttribute: "hidden absolute top-[3.25rem] right-0 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: `
760
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
761
+ 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)", classAttribute: "hidden absolute top-[3.25rem] right-0 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: `
844
762
  <div class="flex flex-col gap-4">
845
763
  <div>
846
764
  <span class="text-sm text-muted-color font-semibold">Primary</span>
@@ -909,11 +827,10 @@ class AppConfigurator {
909
827
  </div>
910
828
  `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
911
829
  }
912
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppConfigurator, decorators: [{
830
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppConfigurator, decorators: [{
913
831
  type: Component,
914
832
  args: [{
915
833
  selector: 'app-configurator',
916
- standalone: true,
917
834
  changeDetection: ChangeDetectionStrategy.OnPush,
918
835
  imports: [NgClass, FormsModule, SelectButtonModule],
919
836
  template: `
@@ -998,8 +915,8 @@ class AppFloatingConfigurator {
998
915
  const currentDarkTheme = this.layoutService.layoutConfig().darkTheme;
999
916
  this.layoutService.updateLayoutConfig({ darkTheme: !currentDarkTheme });
1000
917
  }
1001
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppFloatingConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
1002
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AppFloatingConfigurator, isStandalone: true, selector: "app-floating-configurator", ngImport: i0, template: `
918
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppFloatingConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
919
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.5", type: AppFloatingConfigurator, isStandalone: true, selector: "app-floating-configurator", ngImport: i0, template: `
1003
920
  <div class="fixed flex flex-col md:flex-row gap-2 md:gap-4 top-4 md:top-8 right-2 md:right-8 z-50">
1004
921
  <p-button type="button" (onClick)="toggleDarkMode()" [rounded]="true" [icon]="isDarkTheme() ? 'pi pi-moon' : 'pi pi-sun'" severity="secondary" />
1005
922
  <div class="relative">
@@ -1009,11 +926,10 @@ class AppFloatingConfigurator {
1009
926
  </div>
1010
927
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i2$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfigurator, selector: "app-configurator" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1011
928
  }
1012
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppFloatingConfigurator, decorators: [{
929
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppFloatingConfigurator, decorators: [{
1013
930
  type: Component,
1014
931
  args: [{
1015
932
  selector: 'app-floating-configurator',
1016
- standalone: true,
1017
933
  changeDetection: ChangeDetectionStrategy.OnPush,
1018
934
  imports: [ButtonModule, StyleClassModule, AppConfigurator],
1019
935
  template: `
@@ -1028,31 +944,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1028
944
  }]
1029
945
  }] });
1030
946
 
1031
- class AppFooter {
1032
- layoutService = inject(LayoutService);
1033
- // Footer shows product branding (appName), not user's company
1034
- appName = this.layoutService.appName;
1035
- authorName = this.layoutService.authorName;
1036
- authorUrl = this.layoutService.authorUrl;
1037
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppFooter, deps: [], target: i0.ɵɵFactoryTarget.Component });
1038
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AppFooter, isStandalone: true, selector: "app-footer", ngImport: i0, template: `<div class="layout-footer">
1039
- {{ appName() }} by
1040
- <a [href]="authorUrl()" target="_blank" rel="noopener noreferrer" class="text-primary font-bold hover:underline">{{ authorName() }}</a>
1041
- </div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
1042
- }
1043
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppFooter, decorators: [{
1044
- type: Component,
1045
- args: [{
1046
- standalone: true,
1047
- selector: 'app-footer',
1048
- changeDetection: ChangeDetectionStrategy.OnPush,
1049
- template: `<div class="layout-footer">
1050
- {{ appName() }} by
1051
- <a [href]="authorUrl()" target="_blank" rel="noopener noreferrer" class="text-primary font-bold hover:underline">{{ authorName() }}</a>
1052
- </div>`,
1053
- }]
1054
- }] });
1055
-
1056
947
  const LAYOUT_AUTH_STATE = new InjectionToken('LAYOUT_AUTH_STATE');
1057
948
  const LAYOUT_AUTH_API = new InjectionToken('LAYOUT_AUTH_API');
1058
949
 
@@ -1190,8 +1081,8 @@ class AppCompanyBranchSelector {
1190
1081
  },
1191
1082
  });
1192
1083
  }
1193
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppCompanyBranchSelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
1194
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppCompanyBranchSelector, isStandalone: true, selector: "app-company-branch-selector", host: { classAttribute: "relative" }, ngImport: i0, template: `
1084
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppCompanyBranchSelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
1085
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: AppCompanyBranchSelector, isStandalone: true, selector: "app-company-branch-selector", host: { classAttribute: "relative" }, ngImport: i0, template: `
1195
1086
  <button
1196
1087
  type="button"
1197
1088
  class="layout-topbar-action"
@@ -1266,11 +1157,10 @@ class AppCompanyBranchSelector {
1266
1157
  </div>
1267
1158
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { 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: StyleClassModule }, { kind: "directive", type: i2$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i4.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1268
1159
  }
1269
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppCompanyBranchSelector, decorators: [{
1160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppCompanyBranchSelector, decorators: [{
1270
1161
  type: Component,
1271
1162
  args: [{
1272
1163
  selector: 'app-company-branch-selector',
1273
- standalone: true,
1274
1164
  changeDetection: ChangeDetectionStrategy.OnPush,
1275
1165
  imports: [AngularModule, StyleClassModule, ButtonModule, SelectModule],
1276
1166
  host: { class: 'relative' },
@@ -1371,8 +1261,8 @@ class AppLauncher {
1371
1261
  togglePanel() {
1372
1262
  this._isActive.update((v) => !v);
1373
1263
  }
1374
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppLauncher, deps: [], target: i0.ɵɵFactoryTarget.Component });
1375
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppLauncher, isStandalone: true, selector: "app-launcher", host: { classAttribute: "relative" }, ngImport: i0, template: `
1264
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppLauncher, deps: [], target: i0.ɵɵFactoryTarget.Component });
1265
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: AppLauncher, isStandalone: true, selector: "app-launcher", host: { classAttribute: "relative" }, ngImport: i0, template: `
1376
1266
  <button
1377
1267
  type="button"
1378
1268
  class="layout-topbar-action"
@@ -1422,11 +1312,10 @@ class AppLauncher {
1422
1312
  </div>
1423
1313
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i2$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: IconComponent, selector: "lib-icon", inputs: ["icon", "iconType"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1424
1314
  }
1425
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppLauncher, decorators: [{
1315
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppLauncher, decorators: [{
1426
1316
  type: Component,
1427
1317
  args: [{
1428
1318
  selector: 'app-launcher',
1429
- standalone: true,
1430
1319
  changeDetection: ChangeDetectionStrategy.OnPush,
1431
1320
  imports: [StyleClassModule, IconComponent],
1432
1321
  host: { class: 'relative' },
@@ -1548,8 +1437,8 @@ class AppProfile {
1548
1437
  });
1549
1438
  });
1550
1439
  }
1551
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppProfile, deps: [], target: i0.ɵɵFactoryTarget.Component });
1552
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppProfile, isStandalone: true, selector: "app-profile", host: { classAttribute: "relative" }, ngImport: i0, template: `
1440
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppProfile, deps: [], target: i0.ɵɵFactoryTarget.Component });
1441
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: AppProfile, isStandalone: true, selector: "app-profile", host: { classAttribute: "relative" }, ngImport: i0, template: `
1553
1442
  <button
1554
1443
  type="button"
1555
1444
  class="layout-topbar-action"
@@ -1618,11 +1507,10 @@ class AppProfile {
1618
1507
  </div>
1619
1508
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2$2.IsEmptyImageDirective, selector: "img", inputs: ["src"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i2$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1620
1509
  }
1621
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppProfile, decorators: [{
1510
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppProfile, decorators: [{
1622
1511
  type: Component,
1623
1512
  args: [{
1624
1513
  selector: 'app-profile',
1625
- standalone: true,
1626
1514
  changeDetection: ChangeDetectionStrategy.OnPush,
1627
1515
  imports: [AngularModule, StyleClassModule],
1628
1516
  host: { class: 'relative' },
@@ -1729,8 +1617,8 @@ class AppTopbar {
1729
1617
  this.activePanel.set(null);
1730
1618
  }
1731
1619
  }
1732
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppTopbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
1733
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppTopbar, isStandalone: true, selector: "app-topbar", viewQueries: [{ propertyName: "configContainer", first: true, predicate: ["configContainer"], descendants: true, isSignal: true }], ngImport: i0, template: ` <div class="layout-topbar">
1620
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppTopbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
1621
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: AppTopbar, isStandalone: true, selector: "app-topbar", viewQueries: [{ propertyName: "configContainer", first: true, predicate: ["configContainer"], descendants: true, isSignal: true }], ngImport: i0, template: ` <div class="layout-topbar">
1734
1622
  <div class="layout-topbar-logo-container">
1735
1623
  <button
1736
1624
  class="layout-menu-button layout-topbar-action"
@@ -1800,11 +1688,10 @@ class AppTopbar {
1800
1688
  </div>
1801
1689
  </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i2$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfigurator, selector: "app-configurator" }, { kind: "component", type: AppProfile, selector: "app-profile" }, { kind: "component", type: AppCompanyBranchSelector, selector: "app-company-branch-selector" }, { kind: "component", type: AppLauncher, selector: "app-launcher" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1802
1690
  }
1803
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppTopbar, decorators: [{
1691
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppTopbar, decorators: [{
1804
1692
  type: Component,
1805
1693
  args: [{
1806
1694
  selector: 'app-topbar',
1807
- standalone: true,
1808
1695
  changeDetection: ChangeDetectionStrategy.OnPush,
1809
1696
  imports: [
1810
1697
  RouterModule,
@@ -1981,8 +1868,8 @@ class AppMenuitem {
1981
1868
  }
1982
1869
  this.layoutService.onMenuStateChange({ key: this.key() });
1983
1870
  }
1984
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppMenuitem, deps: [], target: i0.ɵɵFactoryTarget.Component });
1985
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppMenuitem, isStandalone: true, selector: "[app-menuitem]", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null }, parentKey: { classPropertyName: "parentKey", publicName: "parentKey", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.active-menuitem": "active()" } }, ngImport: i0, template: `
1871
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppMenuitem, deps: [], target: i0.ɵɵFactoryTarget.Component });
1872
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: AppMenuitem, isStandalone: true, selector: "[app-menuitem]", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null }, parentKey: { classPropertyName: "parentKey", publicName: "parentKey", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.active-menuitem": "active()" } }, ngImport: i0, template: `
1986
1873
  <ng-container>
1987
1874
  @if (item().children?.length) {
1988
1875
  <a (click)="itemClick()" tabindex="0" pRipple>
@@ -2040,9 +1927,9 @@ class AppMenuitem {
2040
1927
  </ng-container>
2041
1928
  `, isInline: true, styles: [":host ul{overflow:hidden;transition:max-height .4s cubic-bezier(.86,0,.07,1)}:host ul.submenu-collapsed{max-height:0}:host ul.submenu-expanded{max-height:1000px}\n"], dependencies: [{ kind: "component", type: AppMenuitem, selector: "[app-menuitem]", inputs: ["item", "index", "parentKey"] }, { kind: "component", type: IconComponent, selector: "lib-icon", inputs: ["icon", "iconType"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i2$3.Ripple, selector: "[pRipple]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2042
1929
  }
2043
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppMenuitem, decorators: [{
1930
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppMenuitem, decorators: [{
2044
1931
  type: Component,
2045
- args: [{ selector: '[app-menuitem]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [IconComponent, RouterModule, RippleModule], template: `
1932
+ args: [{ selector: '[app-menuitem]', changeDetection: ChangeDetectionStrategy.OnPush, imports: [IconComponent, RouterModule, RippleModule], template: `
2046
1933
  <ng-container>
2047
1934
  @if (item().children?.length) {
2048
1935
  <a (click)="itemClick()" tabindex="0" pRipple>
@@ -2117,8 +2004,8 @@ class AppMenu {
2117
2004
  * - Permission state changes (user permissions updated)
2118
2005
  */
2119
2006
  menuItems = this.layoutService.menu;
2120
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
2121
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppMenu, isStandalone: true, selector: "app-menu", ngImport: i0, template: `<div class="layout-menu">
2007
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
2008
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: AppMenu, isStandalone: true, selector: "app-menu", ngImport: i0, template: `<div class="layout-menu">
2122
2009
  <ul>
2123
2010
  @for (
2124
2011
  item of menuItems();
@@ -2130,11 +2017,10 @@ class AppMenu {
2130
2017
  </ul>
2131
2018
  </div>`, isInline: true, dependencies: [{ kind: "component", type: AppMenuitem, selector: "[app-menuitem]", inputs: ["item", "index", "parentKey"] }, { kind: "ngmodule", type: RouterModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2132
2019
  }
2133
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppMenu, decorators: [{
2020
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppMenu, decorators: [{
2134
2021
  type: Component,
2135
2022
  args: [{
2136
2023
  selector: 'app-menu',
2137
- standalone: true,
2138
2024
  changeDetection: ChangeDetectionStrategy.OnPush,
2139
2025
  imports: [AppMenuitem, RouterModule],
2140
2026
  template: `<div class="layout-menu">
@@ -2152,18 +2038,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2152
2038
  }] });
2153
2039
 
2154
2040
  class AppSidebar {
2155
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
2156
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AppSidebar, isStandalone: true, selector: "app-sidebar", ngImport: i0, template: `
2041
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
2042
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.5", type: AppSidebar, isStandalone: true, selector: "app-sidebar", ngImport: i0, template: `
2157
2043
  <div class="layout-sidebar">
2158
2044
  <app-menu />
2159
2045
  </div>
2160
2046
  `, isInline: true, dependencies: [{ kind: "component", type: AppMenu, selector: "app-menu" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2161
2047
  }
2162
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppSidebar, decorators: [{
2048
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppSidebar, decorators: [{
2163
2049
  type: Component,
2164
2050
  args: [{
2165
2051
  selector: 'app-sidebar',
2166
- standalone: true,
2167
2052
  changeDetection: ChangeDetectionStrategy.OnPush,
2168
2053
  imports: [AppMenu],
2169
2054
  template: `
@@ -2238,8 +2123,8 @@ class AppLayout {
2238
2123
  'layout-mobile-active': state.staticMenuMobileActive,
2239
2124
  };
2240
2125
  }, ...(ngDevMode ? [{ debugName: "containerClass" }] : []));
2241
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppLayout, deps: [], target: i0.ɵɵFactoryTarget.Component });
2242
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AppLayout, isStandalone: true, selector: "app-layout", ngImport: i0, template: `
2126
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppLayout, deps: [], target: i0.ɵɵFactoryTarget.Component });
2127
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.5", type: AppLayout, isStandalone: true, selector: "app-layout", ngImport: i0, template: `
2243
2128
  <div class="layout-wrapper" [ngClass]="containerClass()">
2244
2129
  <app-topbar></app-topbar>
2245
2130
  <app-sidebar></app-sidebar>
@@ -2253,11 +2138,10 @@ class AppLayout {
2253
2138
  </div>
2254
2139
  `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: AppTopbar, selector: "app-topbar" }, { kind: "component", type: AppSidebar, selector: "app-sidebar" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AppFooter, selector: "app-footer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2255
2140
  }
2256
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppLayout, decorators: [{
2141
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: AppLayout, decorators: [{
2257
2142
  type: Component,
2258
2143
  args: [{
2259
2144
  selector: 'app-layout',
2260
- standalone: true,
2261
2145
  changeDetection: ChangeDetectionStrategy.OnPush,
2262
2146
  imports: [NgClass, AppTopbar, AppSidebar, RouterModule, AppFooter],
2263
2147
  template: `
@@ -2276,42 +2160,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2276
2160
  }]
2277
2161
  }], ctorParameters: () => [] });
2278
2162
 
2279
- const GreenTheme = definePreset(Material, {
2163
+ const NavyBlueTheme = definePreset(Material, {
2280
2164
  semantic: {
2281
2165
  colorScheme: {
2282
2166
  light: {
2283
2167
  primary: {
2284
- color: '#01712c',
2285
- inverseColor: '#119744',
2286
- hoverColor: '#119744',
2287
- activeColor: '#119744',
2168
+ color: '#3535cd',
2169
+ inverseColor: '#0707a9',
2170
+ hoverColor: '#0707a9',
2171
+ activeColor: '#0707a9',
2288
2172
  },
2289
2173
  highlight: {
2290
2174
  background: '#e2e8f0',
2291
2175
  focusBackground: '#e2e8f0',
2292
- color: '#01712c',
2293
- focusColor: '#01712c',
2176
+ color: '#3535cd',
2177
+ focusColor: '#3535cd',
2294
2178
  },
2295
2179
  },
2296
2180
  },
2297
2181
  },
2298
2182
  });
2299
2183
 
2300
- const NavyBlueTheme = definePreset(Material, {
2184
+ const GreenTheme = definePreset(Material, {
2301
2185
  semantic: {
2302
2186
  colorScheme: {
2303
2187
  light: {
2304
2188
  primary: {
2305
- color: '#3535cd',
2306
- inverseColor: '#0707a9',
2307
- hoverColor: '#0707a9',
2308
- activeColor: '#0707a9',
2189
+ color: '#01712c',
2190
+ inverseColor: '#119744',
2191
+ hoverColor: '#119744',
2192
+ activeColor: '#119744',
2309
2193
  },
2310
2194
  highlight: {
2311
2195
  background: '#e2e8f0',
2312
2196
  focusBackground: '#e2e8f0',
2313
- color: '#3535cd',
2314
- focusColor: '#3535cd',
2197
+ color: '#01712c',
2198
+ focusColor: '#01712c',
2315
2199
  },
2316
2200
  },
2317
2201
  },