@flusys/ng-layout 5.5.0 → 6.0.0-beta.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,35 +1,19 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, PLATFORM_ID, Injectable, DOCUMENT, signal, computed, effect, Component, InjectionToken, input, DestroyRef, viewChild, ElementRef, Renderer2 } from '@angular/core';
3
- import * as i2$3 from '@flusys/ng-shared';
4
- import { evaluateLogicNode, PermissionValidatorService, InlineSvgComponent, TranslatePipe, TranslateService, IconComponent, AngularModule, PrimeModule } from '@flusys/ng-shared';
5
- import { isPlatformBrowser, NgComponentOutlet, DOCUMENT as DOCUMENT$1, NgClass } from '@angular/common';
2
+ import { inject, PLATFORM_ID, Injectable, DOCUMENT, signal, DestroyRef, computed, effect, Component, InjectionToken, input, viewChild, ElementRef, Renderer2 } from '@angular/core';
3
+ import * as i3 from '@flusys/ng-shared';
4
+ import { evaluateLogicNode, PermissionValidatorService, InlineSvgComponent, TranslatePipe, TranslateService, IconComponent, AngularModule } from '@flusys/ng-shared';
5
+ import { isPlatformBrowser, NgComponentOutlet, DOCUMENT as DOCUMENT$1 } from '@angular/common';
6
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
7
  import { APP_CONFIG, DEFAULT_APP_NAME, DEFAULT_AUTHOR, isCompanyFeatureEnabled, isSignUpEnabled } from '@flusys/ng-core';
7
8
  import { Subject, fromEvent, filter as filter$1 } from 'rxjs';
8
- import * as i1 from '@angular/forms';
9
+ import * as i2 from '@angular/forms';
9
10
  import { FormsModule } from '@angular/forms';
10
- import * as i1$1 from '@angular/router';
11
+ import * as i2$1 from '@angular/router';
11
12
  import { Router, NavigationEnd, isActive, RouterModule } from '@angular/router';
12
- import { definePreset, updatePreset, updateSurfacePalette, $t } from '@primeuix/themes';
13
- import Aura from '@primeuix/themes/aura';
14
- import Lara from '@primeuix/themes/lara';
15
- import Nora from '@primeuix/themes/nora';
16
- import * as i2 from 'primeng/selectbutton';
17
- import { SelectButtonModule } from 'primeng/selectbutton';
18
- import * as i3 from 'primeng/button';
19
- import { ButtonModule } from 'primeng/button';
20
- import * as i2$1 from 'primeng/styleclass';
21
- import { StyleClassModule } from 'primeng/styleclass';
22
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
13
+ import * as i1 from '@flusys/ng-ui';
14
+ import { PRESET_NAMES, applyTheme, SURFACE_PALETTES, PRIMARY_PALETTES, applyPrimaryPalette, applySurfacePalette, UiModule, MessageService } from '@flusys/ng-ui';
15
+ export { applyTheme, buildBootstrapPreset } from '@flusys/ng-ui';
23
16
  import { filter } from 'rxjs/operators';
24
- import * as i2$2 from 'primeng/ripple';
25
- import { RippleModule } from 'primeng/ripple';
26
- import { MessageService } from 'primeng/api';
27
- import * as i4 from 'primeng/select';
28
- import { SelectModule } from 'primeng/select';
29
- import * as i3$1 from 'primeng/iconfield';
30
- import * as i4$1 from 'primeng/inputicon';
31
- import * as i5 from 'primeng/inputtext';
32
- import Material from '@primeuix/themes/material';
33
17
 
34
18
  /** Filter launcher apps based on user permission codes */
35
19
  function filterAppsByPermissions(apps, permissionCodes) {
@@ -148,14 +132,15 @@ class LayoutPersistenceService {
148
132
  const { _version, ...cleanConfig } = config;
149
133
  return cleanConfig;
150
134
  }
151
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: LayoutPersistenceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
152
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: LayoutPersistenceService, providedIn: 'root' });
135
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: LayoutPersistenceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
136
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: LayoutPersistenceService, providedIn: 'root' });
153
137
  }
154
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: LayoutPersistenceService, decorators: [{
138
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: LayoutPersistenceService, decorators: [{
155
139
  type: Injectable,
156
140
  args: [{ providedIn: 'root' }]
157
141
  }] });
158
142
 
143
+ const DESKTOP_BREAKPOINT = 991;
159
144
  class LayoutService {
160
145
  document = inject(DOCUMENT);
161
146
  platformId = inject(PLATFORM_ID);
@@ -199,6 +184,9 @@ class LayoutService {
199
184
  _rawApps = signal([], /* @ts-ignore */
200
185
  ...(ngDevMode ? [{ debugName: "_rawApps" }] : /* istanbul ignore next */ []));
201
186
  permissionValidator = inject(PermissionValidatorService);
187
+ destroyRef = inject(DestroyRef);
188
+ _windowWidth = signal(this.isBrowser ? window.innerWidth : DESKTOP_BREAKPOINT + 1, /* @ts-ignore */
189
+ ...(ngDevMode ? [{ debugName: "_windowWidth" }] : /* istanbul ignore next */ []));
202
190
  userProfile = this._userProfile.asReadonly();
203
191
  companyProfile = this._companyProfile.asReadonly();
204
192
  appName = this.appConfig?.appName ?? DEFAULT_APP_NAME;
@@ -215,6 +203,10 @@ class LayoutService {
215
203
  isSidebarActive = computed(() => this._layoutState().overlayMenuActive ||
216
204
  this._layoutState().staticMenuMobileActive, /* @ts-ignore */
217
205
  ...(ngDevMode ? [{ debugName: "isSidebarActive" }] : /* istanbul ignore next */ []));
206
+ isDesktop = computed(() => this._windowWidth() > DESKTOP_BREAKPOINT, /* @ts-ignore */
207
+ ...(ngDevMode ? [{ debugName: "isDesktop" }] : /* istanbul ignore next */ []));
208
+ isMobile = computed(() => !this.isDesktop(), /* @ts-ignore */
209
+ ...(ngDevMode ? [{ debugName: "isMobile" }] : /* istanbul ignore next */ []));
218
210
  isDarkTheme = computed(() => this._layoutConfig().darkTheme, /* @ts-ignore */
219
211
  ...(ngDevMode ? [{ debugName: "isDarkTheme" }] : /* istanbul ignore next */ []));
220
212
  isOverlay = computed(() => this._layoutConfig().menuMode === 'overlay', /* @ts-ignore */
@@ -249,6 +241,14 @@ class LayoutService {
249
241
  overlayOpen$ = this.overlayOpen.asObservable();
250
242
  initialized = false;
251
243
  constructor() {
244
+ if (this.isBrowser) {
245
+ this.toggleDarkMode();
246
+ fromEvent(window, 'resize')
247
+ .pipe(takeUntilDestroyed(this.destroyRef))
248
+ .subscribe(() => {
249
+ this._windowWidth.set(window.innerWidth);
250
+ });
251
+ }
252
252
  effect(() => {
253
253
  const config = this._layoutConfig();
254
254
  if (this.initialized) {
@@ -319,12 +319,6 @@ class LayoutService {
319
319
  }));
320
320
  }
321
321
  }
322
- isDesktop() {
323
- return this.isBrowser ? window.innerWidth > 991 : true;
324
- }
325
- isMobile() {
326
- return !this.isDesktop();
327
- }
328
322
  onMenuStateChange(event) {
329
323
  this.menuSource.next(event);
330
324
  }
@@ -355,10 +349,10 @@ class LayoutService {
355
349
  clearApps() {
356
350
  this._rawApps.set([]);
357
351
  }
358
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
359
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: LayoutService, providedIn: 'root' });
352
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
353
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: LayoutService, providedIn: 'root' });
360
354
  }
361
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: LayoutService, decorators: [{
355
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: LayoutService, decorators: [{
362
356
  type: Injectable,
363
357
  args: [{ providedIn: 'root' }]
364
358
  }], ctorParameters: () => [] });
@@ -370,8 +364,8 @@ class AppFooter {
370
364
  isLogoSvg = this.layoutService.isAppLogoSvg;
371
365
  authorName = this.layoutService.authorName;
372
366
  authorUrl = this.layoutService.authorUrl;
373
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppFooter, deps: [], target: i0.ɵɵFactoryTarget.Component });
374
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AppFooter, isStandalone: true, selector: "app-footer", ngImport: i0, template: `<div class="layout-footer">
367
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppFooter, deps: [], target: i0.ɵɵFactoryTarget.Component });
368
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: AppFooter, isStandalone: true, selector: "app-footer", ngImport: i0, template: `<div class="layout-footer">
375
369
  @if (displayLogo) {
376
370
  @if (isLogoSvg) {
377
371
  <inline-svg [src]="displayLogo" class="logo-image" />
@@ -391,7 +385,7 @@ class AppFooter {
391
385
  </span>
392
386
  </div>`, isInline: true, dependencies: [{ kind: "component", type: InlineSvgComponent, selector: "inline-svg", inputs: ["src"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
393
387
  }
394
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppFooter, decorators: [{
388
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppFooter, decorators: [{
395
389
  type: Component,
396
390
  args: [{
397
391
  selector: 'app-footer',
@@ -418,313 +412,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
418
412
  }]
419
413
  }] });
420
414
 
421
- const _presets = { Aura, Lara, Nora };
422
- const _noirPrimary = {
423
- 50: '{surface.50}', 100: '{surface.100}', 200: '{surface.200}',
424
- 300: '{surface.300}', 400: '{surface.400}', 500: '{surface.500}',
425
- 600: '{surface.600}', 700: '{surface.700}', 800: '{surface.800}',
426
- 900: '{surface.900}', 950: '{surface.950}',
427
- };
428
- const _noraScheme = {
429
- light: {
430
- primary: { color: '{primary.600}', contrastColor: '#ffffff', hoverColor: '{primary.700}', activeColor: '{primary.800}' },
431
- highlight: { background: '{primary.600}', focusBackground: '{primary.700}', color: '#ffffff', focusColor: '#ffffff' },
432
- },
433
- dark: {
434
- primary: { color: '{primary.500}', contrastColor: '{surface.900}', hoverColor: '{primary.400}', activeColor: '{primary.300}' },
435
- highlight: { background: '{primary.500}', focusBackground: '{primary.400}', color: '{surface.900}', focusColor: '{surface.900}' },
436
- },
437
- };
438
- const _defaultScheme = {
439
- light: {
440
- primary: { color: '{primary.500}', contrastColor: '#ffffff', hoverColor: '{primary.600}', activeColor: '{primary.700}' },
441
- highlight: { background: '{primary.50}', focusBackground: '{primary.100}', color: '{primary.700}', focusColor: '{primary.800}' },
442
- },
443
- dark: {
444
- primary: { color: '{primary.400}', contrastColor: '{surface.900}', hoverColor: '{primary.300}', activeColor: '{primary.200}' },
445
- highlight: {
446
- background: 'color-mix(in srgb, {primary.400}, transparent 84%)',
447
- focusBackground: 'color-mix(in srgb, {primary.400}, transparent 76%)',
448
- color: 'rgba(255,255,255,.87)',
449
- focusColor: 'rgba(255,255,255,.87)',
450
- },
451
- },
452
- };
453
- function buildSemanticExt(palette, presetName) {
454
- if (palette === null) {
455
- return {
456
- semantic: {
457
- primary: _noirPrimary,
458
- colorScheme: {
459
- light: {
460
- primary: { color: '{primary.950}', contrastColor: '#ffffff', hoverColor: '{primary.800}', activeColor: '{primary.700}' },
461
- highlight: { background: '{primary.950}', focusBackground: '{primary.700}', color: '#ffffff', focusColor: '#ffffff' },
462
- },
463
- dark: {
464
- primary: { color: '{primary.50}', contrastColor: '{primary.950}', hoverColor: '{primary.200}', activeColor: '{primary.300}' },
465
- highlight: { background: '{primary.50}', focusBackground: '{primary.300}', color: '{primary.950}', focusColor: '{primary.950}' },
466
- },
467
- },
468
- },
469
- };
470
- }
471
- return { semantic: { primary: palette, colorScheme: presetName === 'Nora' ? _noraScheme : _defaultScheme } };
472
- }
473
- function buildPreset(presetName, primary) {
474
- const base = _presets[presetName in _presets ? presetName : 'Aura'];
475
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
476
- const palette = primary === 'noir' ? null : base.primitive?.[primary];
477
- if (primary !== 'noir' && !palette)
478
- return base;
479
- return definePreset(base, buildSemanticExt(palette, presetName));
480
- }
481
- function buildBootstrapPreset(envConfig) {
482
- const preset = envConfig?.preset ?? 'Aura';
483
- const primary = envConfig?.primary ?? 'violet';
484
- if (envConfig?.isMemorable !== false) {
485
- try {
486
- const stored = localStorage.getItem('flusys.layout.config');
487
- if (stored) {
488
- const parsed = JSON.parse(stored);
489
- return buildPreset(parsed.preset ?? preset, parsed.primary ?? primary);
490
- }
491
- }
492
- catch { /* SSR or storage disabled */ }
493
- }
494
- return buildPreset(preset, primary);
495
- }
496
-
497
- const presets = {
498
- Aura,
499
- Lara,
500
- Nora,
501
- };
502
415
  class AppConfigurator {
503
416
  router = inject(Router);
504
417
  translateAdapter = inject(TranslateService, { optional: true });
505
418
  platformId = inject(PLATFORM_ID);
506
419
  layoutService = inject(LayoutService);
507
- presets = Object.keys(presets);
420
+ presets = PRESET_NAMES;
508
421
  showMenuModeButton = signal(!this.router.url.includes('auth'), /* @ts-ignore */
509
422
  ...(ngDevMode ? [{ debugName: "showMenuModeButton" }] : /* istanbul ignore next */ []));
510
423
  menuModeOptions = computed(() => {
511
424
  const options = [
512
- {
513
- label: this.translate('layout.configurator.menu.mode.static'),
514
- value: 'static',
515
- },
516
- {
517
- label: this.translate('layout.configurator.menu.mode.overlay'),
518
- value: 'overlay',
519
- },
425
+ { label: this.translate('layout.configurator.menu.mode.static'), value: 'static' },
426
+ { label: this.translate('layout.configurator.menu.mode.overlay'), value: 'overlay' },
520
427
  ];
521
428
  if (this.layoutService.isDesktop()) {
522
- options.push({
523
- label: this.translate('layout.configurator.menu.mode.topbar'),
524
- value: 'topbar',
525
- });
429
+ options.push({ label: this.translate('layout.configurator.menu.mode.topbar'), value: 'topbar' });
526
430
  }
527
431
  return options;
528
432
  }, /* @ts-ignore */
529
433
  ...(ngDevMode ? [{ debugName: "menuModeOptions" }] : /* istanbul ignore next */ []));
530
434
  constructor() {
531
435
  if (isPlatformBrowser(this.platformId)) {
532
- const preset = this.layoutService.layoutConfig().preset ?? 'Aura';
533
- this.onPresetChange(preset);
436
+ effect(() => {
437
+ const config = this.layoutService.layoutConfig();
438
+ applyTheme({
439
+ preset: (config.preset ?? 'Aura'),
440
+ primary: config.primary ?? 'violet',
441
+ surface: config.surface ?? null,
442
+ darkTheme: config.darkTheme ?? false,
443
+ });
444
+ });
534
445
  }
535
446
  }
536
- surfaces = [
537
- {
538
- name: 'slate',
539
- palette: {
540
- 0: '#ffffff',
541
- 50: '#f8fafc',
542
- 100: '#f1f5f9',
543
- 200: '#e2e8f0',
544
- 300: '#cbd5e1',
545
- 400: '#94a3b8',
546
- 500: '#64748b',
547
- 600: '#475569',
548
- 700: '#334155',
549
- 800: '#1e293b',
550
- 900: '#0f172a',
551
- 950: '#020617',
552
- },
553
- },
554
- {
555
- name: 'gray',
556
- palette: {
557
- 0: '#ffffff',
558
- 50: '#f9fafb',
559
- 100: '#f3f4f6',
560
- 200: '#e5e7eb',
561
- 300: '#d1d5db',
562
- 400: '#9ca3af',
563
- 500: '#6b7280',
564
- 600: '#4b5563',
565
- 700: '#374151',
566
- 800: '#1f2937',
567
- 900: '#111827',
568
- 950: '#030712',
569
- },
570
- },
571
- {
572
- name: 'zinc',
573
- palette: {
574
- 0: '#ffffff',
575
- 50: '#fafafa',
576
- 100: '#f4f4f5',
577
- 200: '#e4e4e7',
578
- 300: '#d4d4d8',
579
- 400: '#a1a1aa',
580
- 500: '#71717a',
581
- 600: '#52525b',
582
- 700: '#3f3f46',
583
- 800: '#27272a',
584
- 900: '#18181b',
585
- 950: '#09090b',
586
- },
587
- },
588
- {
589
- name: 'neutral',
590
- palette: {
591
- 0: '#ffffff',
592
- 50: '#fafafa',
593
- 100: '#f5f5f5',
594
- 200: '#e5e5e5',
595
- 300: '#d4d4d4',
596
- 400: '#a3a3a3',
597
- 500: '#737373',
598
- 600: '#525252',
599
- 700: '#404040',
600
- 800: '#262626',
601
- 900: '#171717',
602
- 950: '#0a0a0a',
603
- },
604
- },
605
- {
606
- name: 'stone',
607
- palette: {
608
- 0: '#ffffff',
609
- 50: '#fafaf9',
610
- 100: '#f5f5f4',
611
- 200: '#e7e5e4',
612
- 300: '#d6d3d1',
613
- 400: '#a8a29e',
614
- 500: '#78716c',
615
- 600: '#57534e',
616
- 700: '#44403c',
617
- 800: '#292524',
618
- 900: '#1c1917',
619
- 950: '#0c0a09',
620
- },
621
- },
622
- {
623
- name: 'soho',
624
- palette: {
625
- 0: '#ffffff',
626
- 50: '#ececec',
627
- 100: '#dedfdf',
628
- 200: '#c4c4c6',
629
- 300: '#adaeb0',
630
- 400: '#97979b',
631
- 500: '#7f8084',
632
- 600: '#6a6b70',
633
- 700: '#55565b',
634
- 800: '#3f4046',
635
- 900: '#2c2c34',
636
- 950: '#16161d',
637
- },
638
- },
639
- {
640
- name: 'viva',
641
- palette: {
642
- 0: '#ffffff',
643
- 50: '#f3f3f3',
644
- 100: '#e7e7e8',
645
- 200: '#cfd0d0',
646
- 300: '#b7b8b9',
647
- 400: '#9fa1a1',
648
- 500: '#87898a',
649
- 600: '#6e7173',
650
- 700: '#565a5b',
651
- 800: '#3e4244',
652
- 900: '#262b2c',
653
- 950: '#0e1315',
654
- },
655
- },
656
- {
657
- name: 'ocean',
658
- palette: {
659
- 0: '#ffffff',
660
- 50: '#fbfcfc',
661
- 100: '#F7F9F8',
662
- 200: '#EFF3F2',
663
- 300: '#DADEDD',
664
- 400: '#B1B7B6',
665
- 500: '#828787',
666
- 600: '#5F7274',
667
- 700: '#415B61',
668
- 800: '#29444E',
669
- 900: '#183240',
670
- 950: '#0c1920',
671
- },
672
- },
673
- ];
447
+ surfaces = Object.entries(SURFACE_PALETTES).map(([name, pal]) => ({
448
+ name,
449
+ palette: pal,
450
+ }));
674
451
  selectedPrimaryColor = computed(() => this.layoutService.layoutConfig().primary, /* @ts-ignore */
675
452
  ...(ngDevMode ? [{ debugName: "selectedPrimaryColor" }] : /* istanbul ignore next */ []));
676
453
  selectedSurfaceColor = computed(() => this.layoutService.layoutConfig().surface, /* @ts-ignore */
677
454
  ...(ngDevMode ? [{ debugName: "selectedSurfaceColor" }] : /* istanbul ignore next */ []));
678
455
  isSurfaceSelected(surfaceName) {
679
- const selectedSurface = this.selectedSurfaceColor();
680
- if (selectedSurface) {
681
- return selectedSurface === surfaceName;
682
- }
683
- // Default: zinc for dark theme, slate for light theme
684
- return this.layoutService.layoutConfig().darkTheme
685
- ? surfaceName === 'zinc'
686
- : surfaceName === 'slate';
456
+ const sel = this.selectedSurfaceColor();
457
+ if (sel)
458
+ return sel === surfaceName;
459
+ const isDark = this.layoutService.layoutConfig().darkTheme;
460
+ return isDark ? surfaceName === 'zinc' : surfaceName === 'slate';
687
461
  }
688
462
  selectedPreset = computed(() => this.layoutService.layoutConfig().preset, /* @ts-ignore */
689
463
  ...(ngDevMode ? [{ debugName: "selectedPreset" }] : /* istanbul ignore next */ []));
690
464
  menuMode = computed(() => this.layoutService.layoutConfig().menuMode, /* @ts-ignore */
691
465
  ...(ngDevMode ? [{ debugName: "menuMode" }] : /* istanbul ignore next */ []));
692
466
  primaryColors = computed(() => {
693
- const presetPalette = presets[this.layoutService.layoutConfig().preset].primitive;
694
- const colors = [
695
- 'emerald',
696
- 'green',
697
- 'lime',
698
- 'orange',
699
- 'amber',
700
- 'yellow',
701
- 'teal',
702
- 'cyan',
703
- 'sky',
704
- 'blue',
705
- 'indigo',
706
- 'violet',
707
- 'purple',
708
- 'fuchsia',
709
- 'pink',
710
- 'rose',
711
- ];
712
467
  const palettes = [{ name: 'noir', palette: {} }];
713
- colors.forEach((color) => {
714
- palettes.push({
715
- name: color,
716
- palette: presetPalette?.[color],
717
- });
718
- });
468
+ for (const [name, pal] of Object.entries(PRIMARY_PALETTES)) {
469
+ palettes.push({ name, palette: pal });
470
+ }
719
471
  return palettes;
720
472
  }, /* @ts-ignore */
721
473
  ...(ngDevMode ? [{ debugName: "primaryColors" }] : /* istanbul ignore next */ []));
722
- getPresetExt() {
723
- const color = this.primaryColors().find(c => c.name === this.selectedPrimaryColor()) ?? {};
724
- const preset = this.layoutService.layoutConfig().preset ?? 'Aura';
725
- const palette = color.name === 'noir' ? null : (color.palette ?? {});
726
- return buildSemanticExt(palette, preset);
727
- }
728
474
  updateColors(event, type, color) {
729
475
  if (type === 'primary') {
730
476
  this.layoutService.updateLayoutConfig({ primary: color.name });
@@ -732,31 +478,31 @@ class AppConfigurator {
732
478
  else if (type === 'surface') {
733
479
  this.layoutService.updateLayoutConfig({ surface: color.name });
734
480
  }
735
- this.applyTheme(type, color);
481
+ this._applyColorChange(type, color);
736
482
  event.stopPropagation();
737
483
  }
738
- applyTheme(type, color) {
484
+ _applyColorChange(type, color) {
485
+ const isDark = this.layoutService.layoutConfig().darkTheme ?? false;
739
486
  if (type === 'primary') {
740
- updatePreset(this.getPresetExt());
487
+ const primary = color.name ?? 'violet';
488
+ const pal = primary === 'noir'
489
+ ? Object.fromEntries(Object.entries(SURFACE_PALETTES['slate']).map(([k, v]) => [k, v]))
490
+ : PRIMARY_PALETTES[primary];
491
+ if (pal)
492
+ applyPrimaryPalette(pal, isDark);
741
493
  }
742
494
  else if (type === 'surface') {
743
- updateSurfacePalette(color.palette);
495
+ const surfacePal = SURFACE_PALETTES[color.name ?? 'slate'];
496
+ if (surfacePal)
497
+ applySurfacePalette(surfacePal);
744
498
  }
745
499
  }
746
500
  onPresetChange(event) {
747
501
  this.layoutService.updateLayoutConfig({ preset: event });
748
- const preset = presets[event];
749
- // Use selected surface or default (slate for light, zinc for dark)
750
- const selectedSurface = this.selectedSurfaceColor();
751
- const defaultSurface = this.layoutService.layoutConfig().darkTheme
752
- ? 'zinc'
753
- : 'slate';
754
- const surfacePalette = this.surfaces.find((s) => s.name === (selectedSurface || defaultSurface))?.palette;
755
- $t()
756
- .preset(preset)
757
- .preset(this.getPresetExt())
758
- .surfacePalette(surfacePalette)
759
- .use({ useDefaultOptions: true });
502
+ const isDark = this.layoutService.layoutConfig().darkTheme ?? false;
503
+ const primary = this.layoutService.layoutConfig().primary ?? 'violet';
504
+ const surface = this.layoutService.layoutConfig().surface ?? null;
505
+ applyTheme({ preset: event, primary, surface, darkTheme: isDark });
760
506
  }
761
507
  onMenuModeChange(event) {
762
508
  this.layoutService.updateLayoutConfig({ menuMode: event });
@@ -764,8 +510,8 @@ class AppConfigurator {
764
510
  translate(key) {
765
511
  return this.translateAdapter?.translate(key) ?? key;
766
512
  }
767
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
768
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AppConfigurator, isStandalone: true, selector: "app-configurator", host: { styleAttribute: "background-color: var(--surface-overlay); inset-inline-end: 0;", classAttribute: "hidden absolute top-[3.25rem] w-[calc(100vw-2rem)] sm:w-72 max-w-72 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]" }, ngImport: i0, template: `
513
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
514
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: AppConfigurator, isStandalone: true, selector: "app-configurator", host: { styleAttribute: "background-color: var(--surface-overlay); inset-inline-end: 0;", classAttribute: "hidden absolute top-[3.25rem] w-[calc(100vw-2rem)] sm:w-72 max-w-72 p-4 border border-surface rounded-border origin-top shadow-xl" }, ngImport: i0, template: `
769
515
  <div class="flex flex-col gap-4">
770
516
  <div>
771
517
  <span class="text-sm text-muted-color font-semibold">{{
@@ -777,13 +523,11 @@ class AppConfigurator {
777
523
  type="button"
778
524
  [title]="primaryColor.name"
779
525
  (click)="updateColors($event, 'primary', primaryColor)"
780
- [class.outline-primary]="
781
- primaryColor.name === selectedPrimaryColor()
782
- "
526
+ [class.outline-primary]="primaryColor.name === selectedPrimaryColor()"
783
527
  class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
784
528
  [style.background-color]="
785
529
  primaryColor?.name === 'noir'
786
- ? 'var(--text-color)'
530
+ ? 'var(--f-text-color)'
787
531
  : primaryColor?.palette?.['500']
788
532
  "
789
533
  ></button>
@@ -804,7 +548,7 @@ class AppConfigurator {
804
548
  class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
805
549
  [style.background-color]="
806
550
  surface?.name === 'noir'
807
- ? 'var(--text-color)'
551
+ ? 'var(--f-text-color)'
808
552
  : surface?.palette?.['500']
809
553
  "
810
554
  ></button>
@@ -815,7 +559,7 @@ class AppConfigurator {
815
559
  <span class="text-sm text-muted-color font-semibold">{{
816
560
  'layout.configurator.presets' | translate
817
561
  }}</span>
818
- <p-selectbutton
562
+ <f-selectbutton
819
563
  [options]="presets"
820
564
  [ngModel]="selectedPreset()"
821
565
  (ngModelChange)="onPresetChange($event)"
@@ -828,7 +572,7 @@ class AppConfigurator {
828
572
  <span class="text-sm text-muted-color font-semibold">{{
829
573
  'layout.configurator.menu.mode' | translate
830
574
  }}</span>
831
- <p-selectbutton
575
+ <f-selectbutton
832
576
  [ngModel]="menuMode()"
833
577
  (ngModelChange)="onMenuModeChange($event)"
834
578
  [options]="menuModeOptions()"
@@ -838,13 +582,13 @@ class AppConfigurator {
838
582
  </div>
839
583
  }
840
584
  </div>
841
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i2.SelectButton, selector: "p-selectbutton, p-select-button", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "styleClass", "ariaLabelledBy", "dataKey", "autofocus", "size", "fluid"], outputs: ["onOptionClick", "onChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
585
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "component", type: i1.SelectButtonComponent, selector: "f-selectbutton", inputs: ["options", "optionLabel", "optionValue", "multiple", "disabled", "allowEmpty", "size"], outputs: ["onChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
842
586
  }
843
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppConfigurator, decorators: [{
587
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppConfigurator, decorators: [{
844
588
  type: Component,
845
589
  args: [{
846
590
  selector: 'app-configurator',
847
- imports: [FormsModule, SelectButtonModule, TranslatePipe],
591
+ imports: [UiModule, FormsModule, TranslatePipe],
848
592
  template: `
849
593
  <div class="flex flex-col gap-4">
850
594
  <div>
@@ -857,13 +601,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
857
601
  type="button"
858
602
  [title]="primaryColor.name"
859
603
  (click)="updateColors($event, 'primary', primaryColor)"
860
- [class.outline-primary]="
861
- primaryColor.name === selectedPrimaryColor()
862
- "
604
+ [class.outline-primary]="primaryColor.name === selectedPrimaryColor()"
863
605
  class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
864
606
  [style.background-color]="
865
607
  primaryColor?.name === 'noir'
866
- ? 'var(--text-color)'
608
+ ? 'var(--f-text-color)'
867
609
  : primaryColor?.palette?.['500']
868
610
  "
869
611
  ></button>
@@ -884,7 +626,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
884
626
  class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
885
627
  [style.background-color]="
886
628
  surface?.name === 'noir'
887
- ? 'var(--text-color)'
629
+ ? 'var(--f-text-color)'
888
630
  : surface?.palette?.['500']
889
631
  "
890
632
  ></button>
@@ -895,7 +637,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
895
637
  <span class="text-sm text-muted-color font-semibold">{{
896
638
  'layout.configurator.presets' | translate
897
639
  }}</span>
898
- <p-selectbutton
640
+ <f-selectbutton
899
641
  [options]="presets"
900
642
  [ngModel]="selectedPreset()"
901
643
  (ngModelChange)="onPresetChange($event)"
@@ -908,7 +650,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
908
650
  <span class="text-sm text-muted-color font-semibold">{{
909
651
  'layout.configurator.menu.mode' | translate
910
652
  }}</span>
911
- <p-selectbutton
653
+ <f-selectbutton
912
654
  [ngModel]="menuMode()"
913
655
  (ngModelChange)="onMenuModeChange($event)"
914
656
  [options]="menuModeOptions()"
@@ -920,7 +662,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
920
662
  </div>
921
663
  `,
922
664
  host: {
923
- class: 'hidden absolute top-[3.25rem] w-[calc(100vw-2rem)] sm:w-72 max-w-72 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]',
665
+ class: 'hidden absolute top-[3.25rem] w-[calc(100vw-2rem)] sm:w-72 max-w-72 p-4 border border-surface rounded-border origin-top shadow-xl',
924
666
  style: 'background-color: var(--surface-overlay); inset-inline-end: 0;',
925
667
  },
926
668
  }]
@@ -946,25 +688,25 @@ class AppFloatingConfigurator {
946
688
  const currentDarkTheme = this.layoutService.layoutConfig().darkTheme;
947
689
  this.layoutService.updateLayoutConfig({ darkTheme: !currentDarkTheme });
948
690
  }
949
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppFloatingConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
950
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AppFloatingConfigurator, isStandalone: true, selector: "app-floating-configurator", ngImport: i0, template: `
691
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppFloatingConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
692
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: AppFloatingConfigurator, isStandalone: true, selector: "app-floating-configurator", ngImport: i0, template: `
951
693
  <div
952
694
  class="floating-configurator fixed flex flex-col md:flex-row gap-2 md:gap-4 top-4 md:top-8 z-50"
953
695
  >
954
696
  <button
955
- pButton
697
+ fButton
956
698
  type="button"
957
699
  (click)="toggleDarkMode()"
958
700
  [rounded]="true"
959
701
  severity="secondary"
960
702
  >
961
- <span pButtonIcon [class]="isDarkTheme() ? 'pi pi-moon' : 'pi pi-sun'"></span>
703
+ <ui-icon pButtonIcon [name]="isDarkTheme() ? 'moon' : 'sun'"></ui-icon>
962
704
  </button>
963
705
  @if (languageSelectorPanel) {
964
706
  <div class="relative">
965
707
  <button
966
- pButton
967
- pStyleClass="@next"
708
+ fButton
709
+ fStyleClass="@next"
968
710
  enterFromClass="hidden"
969
711
  enterActiveClass="animate-scalein"
970
712
  leaveToClass="hidden"
@@ -973,15 +715,15 @@ class AppFloatingConfigurator {
973
715
  type="button"
974
716
  rounded
975
717
  >
976
- <span pButtonIcon class="pi pi-globe"></span>
718
+ <ui-icon pButtonIcon name="globe"></ui-icon>
977
719
  </button>
978
720
  <ng-container *ngComponentOutlet="languageSelectorPanel" />
979
721
  </div>
980
722
  }
981
723
  <div class="relative">
982
724
  <button
983
- pButton
984
- pStyleClass="@next"
725
+ fButton
726
+ fStyleClass="@next"
985
727
  enterFromClass="hidden"
986
728
  enterActiveClass="animate-scalein"
987
729
  leaveToClass="hidden"
@@ -990,33 +732,33 @@ class AppFloatingConfigurator {
990
732
  type="button"
991
733
  rounded
992
734
  >
993
- <span pButtonIcon class="pi pi-palette"></span>
735
+ <ui-icon pButtonIcon name="palette"></ui-icon>
994
736
  </button>
995
737
  <app-configurator />
996
738
  </div>
997
739
  </div>
998
- `, isInline: true, styles: [".floating-configurator{inset-inline-end:.5rem}@media(min-width:768px){.floating-configurator{inset-inline-end:2rem}}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["pButton", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "link", "rounded", "fluid", "variant", "iconOnly", "loading", "severity"] }, { kind: "directive", type: i3.ButtonIcon, selector: "[pButtonIcon]", inputs: ["pButtonIconPT", "pButtonUnstyled"] }, { 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" }] });
740
+ `, isInline: true, styles: [".floating-configurator{inset-inline-end:.5rem}@media(min-width:768px){.floating-configurator{inset-inline-end:2rem}}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "directive", type: i1.StyleClassDirective, selector: "[fStyleClass]", inputs: ["fStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "component", type: AppConfigurator, selector: "app-configurator" }] });
999
741
  }
1000
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppFloatingConfigurator, decorators: [{
742
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppFloatingConfigurator, decorators: [{
1001
743
  type: Component,
1002
- args: [{ selector: 'app-floating-configurator', imports: [NgComponentOutlet, ButtonModule, StyleClassModule, AppConfigurator], template: `
744
+ args: [{ selector: 'app-floating-configurator', imports: [NgComponentOutlet, UiModule, AppConfigurator], template: `
1003
745
  <div
1004
746
  class="floating-configurator fixed flex flex-col md:flex-row gap-2 md:gap-4 top-4 md:top-8 z-50"
1005
747
  >
1006
748
  <button
1007
- pButton
749
+ fButton
1008
750
  type="button"
1009
751
  (click)="toggleDarkMode()"
1010
752
  [rounded]="true"
1011
753
  severity="secondary"
1012
754
  >
1013
- <span pButtonIcon [class]="isDarkTheme() ? 'pi pi-moon' : 'pi pi-sun'"></span>
755
+ <ui-icon pButtonIcon [name]="isDarkTheme() ? 'moon' : 'sun'"></ui-icon>
1014
756
  </button>
1015
757
  @if (languageSelectorPanel) {
1016
758
  <div class="relative">
1017
759
  <button
1018
- pButton
1019
- pStyleClass="@next"
760
+ fButton
761
+ fStyleClass="@next"
1020
762
  enterFromClass="hidden"
1021
763
  enterActiveClass="animate-scalein"
1022
764
  leaveToClass="hidden"
@@ -1025,15 +767,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1025
767
  type="button"
1026
768
  rounded
1027
769
  >
1028
- <span pButtonIcon class="pi pi-globe"></span>
770
+ <ui-icon pButtonIcon name="globe"></ui-icon>
1029
771
  </button>
1030
772
  <ng-container *ngComponentOutlet="languageSelectorPanel" />
1031
773
  </div>
1032
774
  }
1033
775
  <div class="relative">
1034
776
  <button
1035
- pButton
1036
- pStyleClass="@next"
777
+ fButton
778
+ fStyleClass="@next"
1037
779
  enterFromClass="hidden"
1038
780
  enterActiveClass="animate-scalein"
1039
781
  leaveToClass="hidden"
@@ -1042,7 +784,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1042
784
  type="button"
1043
785
  rounded
1044
786
  >
1045
- <span pButtonIcon class="pi pi-palette"></span>
787
+ <ui-icon pButtonIcon name="palette"></ui-icon>
1046
788
  </button>
1047
789
  <app-configurator />
1048
790
  </div>
@@ -1180,8 +922,8 @@ class AppMenuitem {
1180
922
  }
1181
923
  this.layoutService.onMenuStateChange({ key: this.key() });
1182
924
  }
1183
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppMenuitem, deps: [], target: i0.ɵɵFactoryTarget.Component });
1184
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.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()" } }, viewQueries: [{ propertyName: "parentLink", first: true, predicate: ["parentLink"], descendants: true, isSignal: true }], ngImport: i0, template: `
925
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppMenuitem, deps: [], target: i0.ɵɵFactoryTarget.Component });
926
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", 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()" } }, viewQueries: [{ propertyName: "parentLink", first: true, predicate: ["parentLink"], descendants: true, isSignal: true }], ngImport: i0, template: `
1185
927
  <ng-container>
1186
928
  @if (item().children?.length) {
1187
929
  <a
@@ -1189,7 +931,6 @@ class AppMenuitem {
1189
931
  (mouseenter)="onMouseEnter()"
1190
932
  #parentLink
1191
933
  tabindex="0"
1192
- pRipple
1193
934
  >
1194
935
  @if (item().icon) {
1195
936
  <lib-icon
@@ -1203,9 +944,9 @@ class AppMenuitem {
1203
944
  }}</span>
1204
945
  @if (item().children) {
1205
946
  @if (layoutService.isTopbar()) {
1206
- <i class="pi pi-fw pi-chevron-right layout-submenu-toggler"></i>
947
+ <ui-icon name="chevron-right" class="layout-submenu-toggler"></ui-icon>
1207
948
  } @else {
1208
- <i class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
949
+ <ui-icon name="angle-down" class="layout-submenu-toggler"></ui-icon>
1209
950
  }
1210
951
  }
1211
952
  </a>
@@ -1217,7 +958,6 @@ class AppMenuitem {
1217
958
  routerLinkActive="active-route"
1218
959
  [routerLinkActiveOptions]="routerLinkActiveOptions()"
1219
960
  tabindex="0"
1220
- pRipple
1221
961
  >
1222
962
  @if (item().icon) {
1223
963
  <lib-icon
@@ -1252,11 +992,11 @@ class AppMenuitem {
1252
992
  </ul>
1253
993
  }
1254
994
  </ng-container>
1255
- `, 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$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: i1$1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i2$2.Ripple, selector: "[pRipple]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
995
+ `, 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: "ngmodule", type: UiModule }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "component", type: IconComponent, selector: "lib-icon", inputs: ["icon", "iconType"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: i2$1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1256
996
  }
1257
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppMenuitem, decorators: [{
997
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppMenuitem, decorators: [{
1258
998
  type: Component,
1259
- args: [{ selector: '[app-menuitem]', imports: [IconComponent, RouterModule, RippleModule, TranslatePipe], template: `
999
+ args: [{ selector: '[app-menuitem]', imports: [UiModule, IconComponent, RouterModule, TranslatePipe], template: `
1260
1000
  <ng-container>
1261
1001
  @if (item().children?.length) {
1262
1002
  <a
@@ -1264,7 +1004,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1264
1004
  (mouseenter)="onMouseEnter()"
1265
1005
  #parentLink
1266
1006
  tabindex="0"
1267
- pRipple
1268
1007
  >
1269
1008
  @if (item().icon) {
1270
1009
  <lib-icon
@@ -1278,9 +1017,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1278
1017
  }}</span>
1279
1018
  @if (item().children) {
1280
1019
  @if (layoutService.isTopbar()) {
1281
- <i class="pi pi-fw pi-chevron-right layout-submenu-toggler"></i>
1020
+ <ui-icon name="chevron-right" class="layout-submenu-toggler"></ui-icon>
1282
1021
  } @else {
1283
- <i class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
1022
+ <ui-icon name="angle-down" class="layout-submenu-toggler"></ui-icon>
1284
1023
  }
1285
1024
  }
1286
1025
  </a>
@@ -1292,7 +1031,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1292
1031
  routerLinkActive="active-route"
1293
1032
  [routerLinkActiveOptions]="routerLinkActiveOptions()"
1294
1033
  tabindex="0"
1295
- pRipple
1296
1034
  >
1297
1035
  @if (item().icon) {
1298
1036
  <lib-icon
@@ -1346,8 +1084,8 @@ class AppMenu {
1346
1084
  * - Permission state changes (user permissions updated)
1347
1085
  */
1348
1086
  menuItems = this.layoutService.menu;
1349
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
1350
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AppMenu, isStandalone: true, selector: "app-menu", ngImport: i0, template: `<div class="layout-menu">
1087
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
1088
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: AppMenu, isStandalone: true, selector: "app-menu", ngImport: i0, template: `<div class="layout-menu">
1351
1089
  <ul>
1352
1090
  @for (
1353
1091
  item of menuItems();
@@ -1359,7 +1097,7 @@ class AppMenu {
1359
1097
  </ul>
1360
1098
  </div>`, isInline: true, dependencies: [{ kind: "component", type: AppMenuitem, selector: "[app-menuitem]", inputs: ["item", "index", "parentKey"] }, { kind: "ngmodule", type: RouterModule }] });
1361
1099
  }
1362
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppMenu, decorators: [{
1100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppMenu, decorators: [{
1363
1101
  type: Component,
1364
1102
  args: [{
1365
1103
  selector: 'app-menu',
@@ -1530,13 +1268,13 @@ class AppCompanyBranchSelector {
1530
1268
  translate(key) {
1531
1269
  return this.translateAdapter?.translate(key) ?? key;
1532
1270
  }
1533
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppCompanyBranchSelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
1534
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AppCompanyBranchSelector, isStandalone: true, selector: "app-company-branch-selector", host: { classAttribute: "relative" }, ngImport: i0, template: `
1271
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppCompanyBranchSelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
1272
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: AppCompanyBranchSelector, isStandalone: true, selector: "app-company-branch-selector", host: { classAttribute: "relative" }, ngImport: i0, template: `
1535
1273
  <button
1536
1274
  type="button"
1537
1275
  class="layout-topbar-action"
1538
1276
  [class.layout-topbar-action-highlight]="isActive()"
1539
- pStyleClass="@next"
1277
+ fStyleClass="@next"
1540
1278
  enterFromClass="hidden"
1541
1279
  enterActiveClass="animate-scalein"
1542
1280
  leaveToClass="hidden"
@@ -1544,14 +1282,14 @@ class AppCompanyBranchSelector {
1544
1282
  [hideOnOutsideClick]="true"
1545
1283
  (click)="onPanelToggle()"
1546
1284
  >
1547
- <i class="pi pi-building"></i>
1285
+ <ui-icon name="building"></ui-icon>
1548
1286
  <span>{{ currentCompanyName() }}</span>
1549
1287
  @if (currentBranchName()) {
1550
1288
  <span class="text-xs opacity-70"> | {{ currentBranchName() }}</span>
1551
1289
  }
1552
1290
  </button>
1553
1291
  <div
1554
- class="hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[300px] max-w-[360px]"
1292
+ class="hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-xl w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[300px] max-w-[360px]"
1555
1293
  style="background-color: var(--surface-overlay); inset-inline-end: 0;"
1556
1294
  >
1557
1295
  <div class="flex flex-col gap-4">
@@ -1564,7 +1302,7 @@ class AppCompanyBranchSelector {
1564
1302
  <label class="text-sm text-muted-color font-semibold">{{
1565
1303
  'shared.company' | translate
1566
1304
  }}</label>
1567
- <p-select
1305
+ <f-select
1568
1306
  [options]="companies()"
1569
1307
  [ngModel]="selectedCompanyId()"
1570
1308
  (ngModelChange)="onCompanyChange($event)"
@@ -1584,7 +1322,7 @@ class AppCompanyBranchSelector {
1584
1322
  <label class="text-sm text-muted-color font-semibold">{{
1585
1323
  'layout.company.branch.selector.branch' | translate
1586
1324
  }}</label>
1587
- <p-select
1325
+ <f-select
1588
1326
  [options]="branches()"
1589
1327
  [ngModel]="selectedBranchId()"
1590
1328
  (ngModelChange)="onBranchChange($event)"
@@ -1602,41 +1340,36 @@ class AppCompanyBranchSelector {
1602
1340
  <!-- Actions -->
1603
1341
  <div class="flex gap-2 pt-2">
1604
1342
  <button
1605
- pButton
1343
+ fButton
1606
1344
  class="flex-1"
1607
1345
  [disabled]="!canSwitch() || isSwitching()"
1608
1346
  (click)="onSwitch()"
1609
1347
  >
1610
1348
  @if (isSwitching()) {
1611
- <span pButtonIcon class="pi pi-spinner pi-spin"></span>
1349
+ <ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
1612
1350
  } @else {
1613
- <span pButtonIcon class="pi pi-sync"></span>
1351
+ <ui-icon pButtonIcon name="sync"></ui-icon>
1614
1352
  }
1615
1353
  <span pButtonLabel>{{ 'layout.company.branch.selector.switch.button' | translate }}</span>
1616
1354
  </button>
1617
1355
  </div>
1618
1356
  </div>
1619
1357
  </div>
1620
- `, 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: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["pButton", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "link", "rounded", "fluid", "variant", "iconOnly", "loading", "severity"] }, { kind: "directive", type: i3.ButtonLabel, selector: "[pButtonLabel]", inputs: ["pButtonLabelPT", "pButtonLabelUnstyled"] }, { kind: "directive", type: i3.ButtonIcon, selector: "[pButtonIcon]", inputs: ["pButtonIconPT", "pButtonUnstyled"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i4.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "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", "multiple", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1358
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "showClear", "loading", "inputId", "invalid", "touched", "styleClass", "editable"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur"] }, { kind: "directive", type: i1.StyleClassDirective, selector: "[fStyleClass]", inputs: ["fStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1621
1359
  }
1622
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppCompanyBranchSelector, decorators: [{
1360
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppCompanyBranchSelector, decorators: [{
1623
1361
  type: Component,
1624
1362
  args: [{
1625
1363
  selector: 'app-company-branch-selector',
1626
- imports: [
1627
- AngularModule,
1628
- StyleClassModule,
1629
- ButtonModule,
1630
- SelectModule,
1631
- TranslatePipe,
1632
- ],
1364
+ imports: [UiModule, AngularModule,
1365
+ TranslatePipe,],
1633
1366
  host: { class: 'relative' },
1634
1367
  template: `
1635
1368
  <button
1636
1369
  type="button"
1637
1370
  class="layout-topbar-action"
1638
1371
  [class.layout-topbar-action-highlight]="isActive()"
1639
- pStyleClass="@next"
1372
+ fStyleClass="@next"
1640
1373
  enterFromClass="hidden"
1641
1374
  enterActiveClass="animate-scalein"
1642
1375
  leaveToClass="hidden"
@@ -1644,14 +1377,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1644
1377
  [hideOnOutsideClick]="true"
1645
1378
  (click)="onPanelToggle()"
1646
1379
  >
1647
- <i class="pi pi-building"></i>
1380
+ <ui-icon name="building"></ui-icon>
1648
1381
  <span>{{ currentCompanyName() }}</span>
1649
1382
  @if (currentBranchName()) {
1650
1383
  <span class="text-xs opacity-70"> | {{ currentBranchName() }}</span>
1651
1384
  }
1652
1385
  </button>
1653
1386
  <div
1654
- class="hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[300px] max-w-[360px]"
1387
+ class="hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-xl w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[300px] max-w-[360px]"
1655
1388
  style="background-color: var(--surface-overlay); inset-inline-end: 0;"
1656
1389
  >
1657
1390
  <div class="flex flex-col gap-4">
@@ -1664,7 +1397,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1664
1397
  <label class="text-sm text-muted-color font-semibold">{{
1665
1398
  'shared.company' | translate
1666
1399
  }}</label>
1667
- <p-select
1400
+ <f-select
1668
1401
  [options]="companies()"
1669
1402
  [ngModel]="selectedCompanyId()"
1670
1403
  (ngModelChange)="onCompanyChange($event)"
@@ -1684,7 +1417,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1684
1417
  <label class="text-sm text-muted-color font-semibold">{{
1685
1418
  'layout.company.branch.selector.branch' | translate
1686
1419
  }}</label>
1687
- <p-select
1420
+ <f-select
1688
1421
  [options]="branches()"
1689
1422
  [ngModel]="selectedBranchId()"
1690
1423
  (ngModelChange)="onBranchChange($event)"
@@ -1702,15 +1435,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1702
1435
  <!-- Actions -->
1703
1436
  <div class="flex gap-2 pt-2">
1704
1437
  <button
1705
- pButton
1438
+ fButton
1706
1439
  class="flex-1"
1707
1440
  [disabled]="!canSwitch() || isSwitching()"
1708
1441
  (click)="onSwitch()"
1709
1442
  >
1710
1443
  @if (isSwitching()) {
1711
- <span pButtonIcon class="pi pi-spinner pi-spin"></span>
1444
+ <ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
1712
1445
  } @else {
1713
- <span pButtonIcon class="pi pi-sync"></span>
1446
+ <ui-icon pButtonIcon name="sync"></ui-icon>
1714
1447
  }
1715
1448
  <span pButtonLabel>{{ 'layout.company.branch.selector.switch.button' | translate }}</span>
1716
1449
  </button>
@@ -1722,16 +1455,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
1722
1455
  }], ctorParameters: () => [] });
1723
1456
 
1724
1457
  class AppLauncher {
1458
+ layoutService = inject(LayoutService);
1725
1459
  destroyRef = inject(DestroyRef);
1726
1460
  document = inject(DOCUMENT$1);
1727
1461
  elementRef = inject(ElementRef);
1728
- layoutService = inject(LayoutService);
1729
1462
  _isActive = signal(false, /* @ts-ignore */
1730
1463
  ...(ngDevMode ? [{ debugName: "_isActive" }] : /* istanbul ignore next */ []));
1731
1464
  isActive = this._isActive.asReadonly();
1732
1465
  constructor() {
1733
1466
  fromEvent(this.document, 'click')
1734
- .pipe(takeUntilDestroyed(this.destroyRef), filter(() => this._isActive()))
1467
+ .pipe(takeUntilDestroyed(this.destroyRef), filter(() => this.isActive()))
1735
1468
  .subscribe((event) => {
1736
1469
  const target = event.target;
1737
1470
  if (!this.elementRef.nativeElement.contains(target)) {
@@ -1739,117 +1472,121 @@ class AppLauncher {
1739
1472
  }
1740
1473
  });
1741
1474
  }
1742
- togglePanel() {
1475
+ toggleActive() {
1743
1476
  this._isActive.update((v) => !v);
1744
1477
  }
1745
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppLauncher, deps: [], target: i0.ɵɵFactoryTarget.Component });
1746
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AppLauncher, isStandalone: true, selector: "app-launcher", host: { classAttribute: "relative" }, ngImport: i0, template: `
1478
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppLauncher, deps: [], target: i0.ɵɵFactoryTarget.Component });
1479
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: AppLauncher, isStandalone: true, selector: "app-launcher", host: { classAttribute: "relative" }, ngImport: i0, template: `
1747
1480
  <button
1748
1481
  type="button"
1749
1482
  class="layout-topbar-action"
1750
1483
  [class.layout-topbar-action-highlight]="isActive()"
1751
- pStyleClass="@next"
1484
+ fStyleClass="@next"
1752
1485
  enterFromClass="hidden"
1753
1486
  enterActiveClass="animate-scalein"
1754
1487
  leaveToClass="hidden"
1755
1488
  leaveActiveClass="animate-fadeout"
1756
1489
  [hideOnOutsideClick]="true"
1757
- (click)="togglePanel()"
1490
+ (click)="toggleActive()"
1758
1491
  >
1759
- <i class="pi pi-th-large"></i>
1492
+ <ui-icon name="th-large"></ui-icon>
1760
1493
  <span>{{ 'layout.launcher.apps' | translate }}</span>
1761
1494
  </button>
1762
1495
  <div
1763
- class="hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]"
1764
- style="background-color: var(--surface-overlay); inset-inline-end: 0;"
1496
+ class="hidden absolute top-[3.25rem] z-50 border border-surface rounded-border origin-top surface-overlay"
1497
+ style="inset-inline-end: 0; min-width: 16rem; max-width: 22rem; width: calc(100vw - 2rem); box-shadow: var(--f-shadow-xl);"
1765
1498
  >
1766
- <div class="flex flex-col gap-2">
1767
- <span class="text-sm text-muted-color font-semibold">{{
1499
+ <div class="px-4 py-3 border-b border-surface">
1500
+ <span class="text-xs font-semibold uppercase tracking-wide text-muted-color">{{
1768
1501
  'layout.launcher.applications' | translate
1769
1502
  }}</span>
1770
- <div class="grid grid-cols-2 sm:grid-cols-3 gap-2">
1503
+ </div>
1504
+ @if (layoutService.apps().length === 0) {
1505
+ <div class="px-4 py-6 text-center text-muted-color text-sm">
1506
+ {{ 'layout.launcher.no.apps' | translate }}
1507
+ </div>
1508
+ } @else {
1509
+ <div class="p-3 grid grid-cols-3 gap-1">
1771
1510
  @for (app of layoutService.apps(); track app.id) {
1772
1511
  <a
1773
- class="group flex flex-col items-center p-2 rounded-border cursor-pointer no-underline transition-all duration-200 hover:bg-emphasis"
1512
+ class="group flex flex-col items-center gap-2 p-3 rounded-border cursor-pointer no-underline transition-colors duration-150 hover:bg-emphasis"
1774
1513
  [href]="app.url"
1775
1514
  target="_blank"
1776
1515
  rel="noopener noreferrer"
1777
1516
  >
1778
- <div
1779
- class="flex items-center justify-center w-10 h-10 rounded-border bg-emphasis group-hover:bg-primary transition-all duration-200"
1780
- >
1781
- <lib-icon
1782
- [icon]="app.icon"
1783
- [iconType]="app.iconType"
1784
- class="text-xl text-primary group-hover:text-primary-contrast transition-colors duration-200"
1785
- />
1517
+ <div class="flex items-center justify-center w-9 h-9 rounded-border bg-primary/10 group-hover:bg-primary transition-colors duration-150">
1518
+ <ui-icon
1519
+ [name]="app.icon"
1520
+ class="text-base text-primary group-hover:text-primary-contrast transition-colors duration-150"
1521
+ ></ui-icon>
1786
1522
  </div>
1787
- <span
1788
- class="text-xs mt-2 text-center text-muted-color group-hover:text-color transition-colors duration-200 truncate max-w-full"
1789
- >{{ app.nameKey ? (app.nameKey | translate) : app.name }}</span
1790
- >
1523
+ <span class="text-xs text-center text-muted-color group-hover:text-color transition-colors duration-150 truncate w-full text-center leading-tight">
1524
+ {{ app.nameKey ? (app.nameKey | translate) : app.name }}
1525
+ </span>
1791
1526
  </a>
1792
1527
  }
1793
1528
  </div>
1794
- </div>
1529
+ }
1795
1530
  </div>
1796
- `, 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"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1531
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1.StyleClassDirective, selector: "[fStyleClass]", inputs: ["fStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1797
1532
  }
1798
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppLauncher, decorators: [{
1533
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppLauncher, decorators: [{
1799
1534
  type: Component,
1800
1535
  args: [{
1801
1536
  selector: 'app-launcher',
1802
- imports: [StyleClassModule, IconComponent, TranslatePipe],
1537
+ imports: [UiModule, TranslatePipe],
1803
1538
  host: { class: 'relative' },
1804
1539
  template: `
1805
1540
  <button
1806
1541
  type="button"
1807
1542
  class="layout-topbar-action"
1808
1543
  [class.layout-topbar-action-highlight]="isActive()"
1809
- pStyleClass="@next"
1544
+ fStyleClass="@next"
1810
1545
  enterFromClass="hidden"
1811
1546
  enterActiveClass="animate-scalein"
1812
1547
  leaveToClass="hidden"
1813
1548
  leaveActiveClass="animate-fadeout"
1814
1549
  [hideOnOutsideClick]="true"
1815
- (click)="togglePanel()"
1550
+ (click)="toggleActive()"
1816
1551
  >
1817
- <i class="pi pi-th-large"></i>
1552
+ <ui-icon name="th-large"></ui-icon>
1818
1553
  <span>{{ 'layout.launcher.apps' | translate }}</span>
1819
1554
  </button>
1820
1555
  <div
1821
- class="hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]"
1822
- style="background-color: var(--surface-overlay); inset-inline-end: 0;"
1556
+ class="hidden absolute top-[3.25rem] z-50 border border-surface rounded-border origin-top surface-overlay"
1557
+ style="inset-inline-end: 0; min-width: 16rem; max-width: 22rem; width: calc(100vw - 2rem); box-shadow: var(--f-shadow-xl);"
1823
1558
  >
1824
- <div class="flex flex-col gap-2">
1825
- <span class="text-sm text-muted-color font-semibold">{{
1559
+ <div class="px-4 py-3 border-b border-surface">
1560
+ <span class="text-xs font-semibold uppercase tracking-wide text-muted-color">{{
1826
1561
  'layout.launcher.applications' | translate
1827
1562
  }}</span>
1828
- <div class="grid grid-cols-2 sm:grid-cols-3 gap-2">
1563
+ </div>
1564
+ @if (layoutService.apps().length === 0) {
1565
+ <div class="px-4 py-6 text-center text-muted-color text-sm">
1566
+ {{ 'layout.launcher.no.apps' | translate }}
1567
+ </div>
1568
+ } @else {
1569
+ <div class="p-3 grid grid-cols-3 gap-1">
1829
1570
  @for (app of layoutService.apps(); track app.id) {
1830
1571
  <a
1831
- class="group flex flex-col items-center p-2 rounded-border cursor-pointer no-underline transition-all duration-200 hover:bg-emphasis"
1572
+ class="group flex flex-col items-center gap-2 p-3 rounded-border cursor-pointer no-underline transition-colors duration-150 hover:bg-emphasis"
1832
1573
  [href]="app.url"
1833
1574
  target="_blank"
1834
1575
  rel="noopener noreferrer"
1835
1576
  >
1836
- <div
1837
- class="flex items-center justify-center w-10 h-10 rounded-border bg-emphasis group-hover:bg-primary transition-all duration-200"
1838
- >
1839
- <lib-icon
1840
- [icon]="app.icon"
1841
- [iconType]="app.iconType"
1842
- class="text-xl text-primary group-hover:text-primary-contrast transition-colors duration-200"
1843
- />
1577
+ <div class="flex items-center justify-center w-9 h-9 rounded-border bg-primary/10 group-hover:bg-primary transition-colors duration-150">
1578
+ <ui-icon
1579
+ [name]="app.icon"
1580
+ class="text-base text-primary group-hover:text-primary-contrast transition-colors duration-150"
1581
+ ></ui-icon>
1844
1582
  </div>
1845
- <span
1846
- class="text-xs mt-2 text-center text-muted-color group-hover:text-color transition-colors duration-200 truncate max-w-full"
1847
- >{{ app.nameKey ? (app.nameKey | translate) : app.name }}</span
1848
- >
1583
+ <span class="text-xs text-center text-muted-color group-hover:text-color transition-colors duration-150 truncate w-full text-center leading-tight">
1584
+ {{ app.nameKey ? (app.nameKey | translate) : app.name }}
1585
+ </span>
1849
1586
  </a>
1850
1587
  }
1851
1588
  </div>
1852
- </div>
1589
+ }
1853
1590
  </div>
1854
1591
  `,
1855
1592
  }]
@@ -1938,13 +1675,13 @@ class AppProfile {
1938
1675
  translate(key, vars) {
1939
1676
  return this.translateAdapter?.translate(key, vars) ?? key;
1940
1677
  }
1941
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppProfile, deps: [], target: i0.ɵɵFactoryTarget.Component });
1942
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AppProfile, isStandalone: true, selector: "app-profile", host: { classAttribute: "relative" }, ngImport: i0, template: `
1678
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppProfile, deps: [], target: i0.ɵɵFactoryTarget.Component });
1679
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: AppProfile, isStandalone: true, selector: "app-profile", host: { classAttribute: "relative" }, ngImport: i0, template: `
1943
1680
  <button
1944
1681
  type="button"
1945
1682
  class="layout-topbar-action"
1946
1683
  [class.layout-topbar-action-highlight]="isActive()"
1947
- pStyleClass="@next"
1684
+ fStyleClass="@next"
1948
1685
  enterFromClass="hidden"
1949
1686
  enterActiveClass="animate-scalein"
1950
1687
  leaveToClass="hidden"
@@ -1952,11 +1689,11 @@ class AppProfile {
1952
1689
  [hideOnOutsideClick]="true"
1953
1690
  (click)="togglePanel()"
1954
1691
  >
1955
- <i class="pi pi-user"></i>
1692
+ <ui-icon name="user"></ui-icon>
1956
1693
  <span>{{ 'layout.profile.title' | translate }}</span>
1957
1694
  </button>
1958
1695
  <div
1959
- class="hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]"
1696
+ class="hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-xl w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]"
1960
1697
  style="background-color: var(--surface-overlay); inset-inline-end: 0;"
1961
1698
  >
1962
1699
  <div class="flex flex-col gap-3">
@@ -1975,7 +1712,7 @@ class AppProfile {
1975
1712
  <div
1976
1713
  class="w-12 h-12 rounded-border bg-primary flex items-center justify-center"
1977
1714
  >
1978
- <i class="pi pi-user text-xl text-primary-contrast"></i>
1715
+ <ui-icon name="user" class="text-xl text-primary-contrast"></ui-icon>
1979
1716
  </div>
1980
1717
  }
1981
1718
  <div class="flex flex-col min-w-0 flex-1">
@@ -1998,7 +1735,7 @@ class AppProfile {
1998
1735
  class="flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200"
1999
1736
  (click)="copySignUpLink()"
2000
1737
  >
2001
- <i class="pi pi-link text-muted-color"></i>
1738
+ <ui-icon name="link" class="text-muted-color"></ui-icon>
2002
1739
  <span>{{ 'layout.profile.copy.sign.up.link' | translate }}</span>
2003
1740
  </a>
2004
1741
  }
@@ -2006,26 +1743,26 @@ class AppProfile {
2006
1743
  class="flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200"
2007
1744
  (click)="logout()"
2008
1745
  >
2009
- <i class="pi pi-sign-out text-muted-color"></i>
1746
+ <ui-icon name="sign-out" class="text-muted-color"></ui-icon>
2010
1747
  <span>{{ 'layout.profile.logout' | translate }}</span>
2011
1748
  </a>
2012
1749
  </div>
2013
1750
  </div>
2014
1751
  </div>
2015
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: i2$3.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"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
1752
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1.StyleClassDirective, selector: "[fStyleClass]", inputs: ["fStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: i3.IsEmptyImageDirective, selector: "img", inputs: ["src"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
2016
1753
  }
2017
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppProfile, decorators: [{
1754
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppProfile, decorators: [{
2018
1755
  type: Component,
2019
1756
  args: [{
2020
1757
  selector: 'app-profile',
2021
- imports: [AngularModule, StyleClassModule, TranslatePipe],
1758
+ imports: [UiModule, AngularModule, TranslatePipe],
2022
1759
  host: { class: 'relative' },
2023
1760
  template: `
2024
1761
  <button
2025
1762
  type="button"
2026
1763
  class="layout-topbar-action"
2027
1764
  [class.layout-topbar-action-highlight]="isActive()"
2028
- pStyleClass="@next"
1765
+ fStyleClass="@next"
2029
1766
  enterFromClass="hidden"
2030
1767
  enterActiveClass="animate-scalein"
2031
1768
  leaveToClass="hidden"
@@ -2033,11 +1770,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2033
1770
  [hideOnOutsideClick]="true"
2034
1771
  (click)="togglePanel()"
2035
1772
  >
2036
- <i class="pi pi-user"></i>
1773
+ <ui-icon name="user"></ui-icon>
2037
1774
  <span>{{ 'layout.profile.title' | translate }}</span>
2038
1775
  </button>
2039
1776
  <div
2040
- class="hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)] w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]"
1777
+ class="hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-xl w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]"
2041
1778
  style="background-color: var(--surface-overlay); inset-inline-end: 0;"
2042
1779
  >
2043
1780
  <div class="flex flex-col gap-3">
@@ -2056,7 +1793,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2056
1793
  <div
2057
1794
  class="w-12 h-12 rounded-border bg-primary flex items-center justify-center"
2058
1795
  >
2059
- <i class="pi pi-user text-xl text-primary-contrast"></i>
1796
+ <ui-icon name="user" class="text-xl text-primary-contrast"></ui-icon>
2060
1797
  </div>
2061
1798
  }
2062
1799
  <div class="flex flex-col min-w-0 flex-1">
@@ -2079,7 +1816,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2079
1816
  class="flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200"
2080
1817
  (click)="copySignUpLink()"
2081
1818
  >
2082
- <i class="pi pi-link text-muted-color"></i>
1819
+ <ui-icon name="link" class="text-muted-color"></ui-icon>
2083
1820
  <span>{{ 'layout.profile.copy.sign.up.link' | translate }}</span>
2084
1821
  </a>
2085
1822
  }
@@ -2087,7 +1824,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2087
1824
  class="flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200"
2088
1825
  (click)="logout()"
2089
1826
  >
2090
- <i class="pi pi-sign-out text-muted-color"></i>
1827
+ <ui-icon name="sign-out" class="text-muted-color"></ui-icon>
2091
1828
  <span>{{ 'layout.profile.logout' | translate }}</span>
2092
1829
  </a>
2093
1830
  </div>
@@ -2236,8 +1973,8 @@ class AppSearchbar {
2236
1973
  this.searchAdapter.onSearch(query);
2237
1974
  }
2238
1975
  }
2239
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppSearchbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
2240
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AppSearchbar, isStandalone: true, selector: "app-searchbar", viewQueries: [{ propertyName: "searchWrapper", first: true, predicate: ["searchWrapper"], descendants: true, isSignal: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], ngImport: i0, template: `
1976
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppSearchbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
1977
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: AppSearchbar, isStandalone: true, selector: "app-searchbar", viewQueries: [{ propertyName: "searchWrapper", first: true, predicate: ["searchWrapper"], descendants: true, isSignal: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], ngImport: i0, template: `
2241
1978
  <div
2242
1979
  class="search-container h-full"
2243
1980
  #searchWrapper
@@ -2247,23 +1984,20 @@ class AppSearchbar {
2247
1984
  <!-- Topbar/Mobile Icon Mode -->
2248
1985
  <button
2249
1986
  type="button"
2250
- pButton
2251
- pRipple
2252
- class="search-toggle-btn"
2253
- icon="pi pi-search"
1987
+ class="search-toggle-btn layout-topbar-action"
2254
1988
  (click)="toggleSearch()"
2255
1989
  [attr.aria-label]="'layout.topbar.search' | translate"
2256
- severity="secondary"
2257
- text
2258
- ></button>
1990
+ >
1991
+ <ui-icon name="search"></ui-icon>
1992
+ </button>
2259
1993
 
2260
1994
  @if (isSearchExpanded()) {
2261
1995
  <div class="search-dropdown-panel">
2262
- <p-iconfield class="search-iconfield">
2263
- <p-inputicon class="pi pi-search search-icon" />
1996
+ <f-iconfield class="search-iconfield">
1997
+ <f-inputicon class="search-icon"><ui-icon name="search" /></f-inputicon>
2264
1998
  <input
2265
1999
  type="text"
2266
- pInputText
2000
+ fInputText
2267
2001
  class="search-input w-full"
2268
2002
  [placeholder]="'layout.topbar.search.placeholder' | translate"
2269
2003
  [(ngModel)]="searchTerm"
@@ -2274,7 +2008,7 @@ class AppSearchbar {
2274
2008
  #searchInput
2275
2009
  autocomplete="off"
2276
2010
  />
2277
- </p-iconfield>
2011
+ </f-iconfield>
2278
2012
 
2279
2013
  @if (suggestionsOpen() && suggestions().length > 0) {
2280
2014
  <div class="search-suggestions">
@@ -2293,7 +2027,7 @@ class AppSearchbar {
2293
2027
  [attr.aria-selected]="idx === focusedIndex()"
2294
2028
  >
2295
2029
  @if (item.icon) {
2296
- <i [class]="item.icon" class="suggestion-icon"></i>
2030
+ <ui-icon [name]="item.icon" class="suggestion-icon"></ui-icon>
2297
2031
  }
2298
2032
  <span class="suggestion-label">{{ item.label }}</span>
2299
2033
  </li>
@@ -2305,11 +2039,11 @@ class AppSearchbar {
2305
2039
  }
2306
2040
  } @else {
2307
2041
  <!-- Desktop Full Input Mode -->
2308
- <p-iconfield class="search-iconfield">
2309
- <p-inputicon class="pi pi-search search-icon" (click)="onSearch()" />
2042
+ <f-iconfield class="search-iconfield">
2043
+ <f-inputicon class="search-icon cursor-pointer" (click)="onSearch()"><ui-icon name="search" /></f-inputicon>
2310
2044
  <input
2311
2045
  type="text"
2312
- pInputText
2046
+ fInputText
2313
2047
  class="search-input w-full"
2314
2048
  [placeholder]="'layout.topbar.search.placeholder' | translate"
2315
2049
  [(ngModel)]="searchTerm"
@@ -2319,7 +2053,7 @@ class AppSearchbar {
2319
2053
  [attr.aria-label]="'layout.topbar.search' | translate"
2320
2054
  #searchInput
2321
2055
  />
2322
- </p-iconfield>
2056
+ </f-iconfield>
2323
2057
 
2324
2058
  @if (suggestionsOpen() && suggestions().length > 0) {
2325
2059
  <div class="search-dropdown">
@@ -2334,7 +2068,7 @@ class AppSearchbar {
2334
2068
  [attr.aria-selected]="idx === focusedIndex()"
2335
2069
  >
2336
2070
  @if (item.icon) {
2337
- <i [class]="item.icon" class="suggestion-icon"></i>
2071
+ <ui-icon [name]="item.icon" class="suggestion-icon"></ui-icon>
2338
2072
  }
2339
2073
  <span class="suggestion-label">{{ item.label }}</span>
2340
2074
  </li>
@@ -2344,11 +2078,11 @@ class AppSearchbar {
2344
2078
  }
2345
2079
  }
2346
2080
  </div>
2347
- `, isInline: true, styles: [".search-container{display:flex;align-items:center;position:relative;width:100%;flex:0 1 auto}.search-container.topbar-mode{width:auto}.search-dropdown-panel{position:absolute;top:100%;right:0;margin-top:.5rem;background-color:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--p-content-border-radius);box-shadow:0 4px 20px #00000026;z-index:1100;padding:1rem .75rem .75rem;min-width:300px;max-width:450px;animation:slideDown .2s ease-out}.search-suggestions{margin-top:.5rem;border-top:1px solid var(--surface-border);padding-top:.5rem;background-color:inherit}.suggestions-list{list-style:none;margin:0;padding:0;max-height:360px;overflow-y:auto;background-color:inherit}.suggestion-item{padding:.75rem 1rem;cursor:pointer;display:flex;align-items:center;gap:.75rem;color:var(--text-color);border-bottom:1px solid var(--surface-border);transition:background-color .15s ease,color .15s ease}.suggestion-item:last-child{border-bottom:none}.suggestion-item:hover,.suggestion-item.focused{background-color:var(--surface-50);color:var(--primary-color)}.suggestion-icon{color:var(--text-color-secondary);font-size:1rem;flex-shrink:0;transition:color .15s ease}.suggestion-item:hover .suggestion-icon,.suggestion-item.focused .suggestion-icon{color:var(--primary-color)}.suggestion-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-dropdown{position:absolute;top:calc(100% + .5rem);left:0;right:0;background-color:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--p-content-border-radius);box-shadow:0 4px 16px #0000001f;z-index:1000;overflow:hidden}.search-dropdown .suggestions-list{background-color:inherit}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@media(max-width:768px){.search-dropdown-panel{min-width:280px;max-width:400px}}@media(max-width:576px){.search-dropdown-panel{position:fixed;top:4rem;left:0;right:0;bottom:auto;width:100vw;min-width:100vw;max-width:100vw;margin-top:0;padding:1rem;border-radius:0;border-bottom:1px solid var(--surface-border);z-index:1200}.search-dropdown-panel .search-iconfield{margin-bottom:1rem}.search-dropdown{max-width:100%;left:0!important;right:0!important;transform:none;position:static;border-radius:var(--p-content-border-radius);margin-top:0}.suggestion-item{padding:.75rem}}\n"], dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { 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: PrimeModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["pButton", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "link", "rounded", "fluid", "variant", "iconOnly", "loading", "severity"] }, { kind: "component", type: i3$1.IconField, selector: "p-iconfield, p-icon-field", inputs: ["hostName", "iconPosition"] }, { kind: "component", type: i4$1.InputIcon, selector: "p-inputicon", inputs: ["hostName"] }, { kind: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["hostName", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "directive", type: i2$2.Ripple, selector: "[pRipple]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
2081
+ `, isInline: true, styles: [".search-container{display:flex;align-items:center;position:relative;width:100%;flex:0 1 auto}.search-container.topbar-mode{width:auto}.search-dropdown-panel{position:absolute;top:100%;right:0;margin-top:.5rem;background-color:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--f-content-border-radius);box-shadow:var(--f-shadow-xl);z-index:1100;padding:1rem .75rem .75rem;min-width:300px;max-width:450px;animation:slideDown .2s ease-out}.search-suggestions{margin-top:.5rem;border-top:1px solid var(--surface-border);padding-top:.5rem;background-color:inherit}.suggestions-list{list-style:none;margin:0;padding:0;max-height:360px;overflow-y:auto;background-color:inherit}.suggestion-item{padding:.75rem 1rem;cursor:pointer;display:flex;align-items:center;gap:.75rem;color:var(--text-color);border-bottom:1px solid var(--surface-border);transition:background-color .15s ease,color .15s ease}.suggestion-item:last-child{border-bottom:none}.suggestion-item:hover,.suggestion-item.focused{background-color:var(--surface-50);color:var(--primary-color)}.suggestion-icon{color:var(--text-color-secondary);font-size:1rem;flex-shrink:0;transition:color .15s ease}.suggestion-item:hover .suggestion-icon,.suggestion-item.focused .suggestion-icon{color:var(--primary-color)}.suggestion-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-dropdown{position:absolute;top:calc(100% + .5rem);left:0;right:0;background-color:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--f-content-border-radius);box-shadow:var(--f-shadow-xl);z-index:1000;overflow:hidden}.search-dropdown .suggestions-list{background-color:inherit}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@media(max-width:768px){.search-dropdown-panel{min-width:280px;max-width:400px}}@media(max-width:576px){.search-dropdown-panel{position:fixed;top:4rem;left:0;right:0;bottom:auto;width:100vw;min-width:100vw;max-width:100vw;margin-top:0;padding:1rem;border-radius:0;border-bottom:1px solid var(--surface-border);z-index:1200}.search-dropdown-panel .search-iconfield{margin-bottom:1rem}.search-dropdown{max-width:100%;left:0!important;right:0!important;transform:none;position:static;border-radius:var(--f-content-border-radius);margin-top:0}.suggestion-item{padding:.75rem}}\n"], dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "component", type: i1.IconFieldComponent, selector: "f-iconfield" }, { kind: "component", type: i1.InputIconComponent, selector: "f-inputicon", inputs: ["styleClass"] }, { kind: "directive", type: i1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
2348
2082
  }
2349
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppSearchbar, decorators: [{
2083
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppSearchbar, decorators: [{
2350
2084
  type: Component,
2351
- args: [{ selector: 'app-searchbar', imports: [AngularModule, PrimeModule, TranslatePipe], template: `
2085
+ args: [{ selector: 'app-searchbar', imports: [UiModule, AngularModule, TranslatePipe], template: `
2352
2086
  <div
2353
2087
  class="search-container h-full"
2354
2088
  #searchWrapper
@@ -2358,23 +2092,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2358
2092
  <!-- Topbar/Mobile Icon Mode -->
2359
2093
  <button
2360
2094
  type="button"
2361
- pButton
2362
- pRipple
2363
- class="search-toggle-btn"
2364
- icon="pi pi-search"
2095
+ class="search-toggle-btn layout-topbar-action"
2365
2096
  (click)="toggleSearch()"
2366
2097
  [attr.aria-label]="'layout.topbar.search' | translate"
2367
- severity="secondary"
2368
- text
2369
- ></button>
2098
+ >
2099
+ <ui-icon name="search"></ui-icon>
2100
+ </button>
2370
2101
 
2371
2102
  @if (isSearchExpanded()) {
2372
2103
  <div class="search-dropdown-panel">
2373
- <p-iconfield class="search-iconfield">
2374
- <p-inputicon class="pi pi-search search-icon" />
2104
+ <f-iconfield class="search-iconfield">
2105
+ <f-inputicon class="search-icon"><ui-icon name="search" /></f-inputicon>
2375
2106
  <input
2376
2107
  type="text"
2377
- pInputText
2108
+ fInputText
2378
2109
  class="search-input w-full"
2379
2110
  [placeholder]="'layout.topbar.search.placeholder' | translate"
2380
2111
  [(ngModel)]="searchTerm"
@@ -2385,7 +2116,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2385
2116
  #searchInput
2386
2117
  autocomplete="off"
2387
2118
  />
2388
- </p-iconfield>
2119
+ </f-iconfield>
2389
2120
 
2390
2121
  @if (suggestionsOpen() && suggestions().length > 0) {
2391
2122
  <div class="search-suggestions">
@@ -2404,7 +2135,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2404
2135
  [attr.aria-selected]="idx === focusedIndex()"
2405
2136
  >
2406
2137
  @if (item.icon) {
2407
- <i [class]="item.icon" class="suggestion-icon"></i>
2138
+ <ui-icon [name]="item.icon" class="suggestion-icon"></ui-icon>
2408
2139
  }
2409
2140
  <span class="suggestion-label">{{ item.label }}</span>
2410
2141
  </li>
@@ -2416,11 +2147,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2416
2147
  }
2417
2148
  } @else {
2418
2149
  <!-- Desktop Full Input Mode -->
2419
- <p-iconfield class="search-iconfield">
2420
- <p-inputicon class="pi pi-search search-icon" (click)="onSearch()" />
2150
+ <f-iconfield class="search-iconfield">
2151
+ <f-inputicon class="search-icon cursor-pointer" (click)="onSearch()"><ui-icon name="search" /></f-inputicon>
2421
2152
  <input
2422
2153
  type="text"
2423
- pInputText
2154
+ fInputText
2424
2155
  class="search-input w-full"
2425
2156
  [placeholder]="'layout.topbar.search.placeholder' | translate"
2426
2157
  [(ngModel)]="searchTerm"
@@ -2430,7 +2161,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2430
2161
  [attr.aria-label]="'layout.topbar.search' | translate"
2431
2162
  #searchInput
2432
2163
  />
2433
- </p-iconfield>
2164
+ </f-iconfield>
2434
2165
 
2435
2166
  @if (suggestionsOpen() && suggestions().length > 0) {
2436
2167
  <div class="search-dropdown">
@@ -2445,7 +2176,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2445
2176
  [attr.aria-selected]="idx === focusedIndex()"
2446
2177
  >
2447
2178
  @if (item.icon) {
2448
- <i [class]="item.icon" class="suggestion-icon"></i>
2179
+ <ui-icon [name]="item.icon" class="suggestion-icon"></ui-icon>
2449
2180
  }
2450
2181
  <span class="suggestion-label">{{ item.label }}</span>
2451
2182
  </li>
@@ -2455,7 +2186,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2455
2186
  }
2456
2187
  }
2457
2188
  </div>
2458
- `, styles: [".search-container{display:flex;align-items:center;position:relative;width:100%;flex:0 1 auto}.search-container.topbar-mode{width:auto}.search-dropdown-panel{position:absolute;top:100%;right:0;margin-top:.5rem;background-color:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--p-content-border-radius);box-shadow:0 4px 20px #00000026;z-index:1100;padding:1rem .75rem .75rem;min-width:300px;max-width:450px;animation:slideDown .2s ease-out}.search-suggestions{margin-top:.5rem;border-top:1px solid var(--surface-border);padding-top:.5rem;background-color:inherit}.suggestions-list{list-style:none;margin:0;padding:0;max-height:360px;overflow-y:auto;background-color:inherit}.suggestion-item{padding:.75rem 1rem;cursor:pointer;display:flex;align-items:center;gap:.75rem;color:var(--text-color);border-bottom:1px solid var(--surface-border);transition:background-color .15s ease,color .15s ease}.suggestion-item:last-child{border-bottom:none}.suggestion-item:hover,.suggestion-item.focused{background-color:var(--surface-50);color:var(--primary-color)}.suggestion-icon{color:var(--text-color-secondary);font-size:1rem;flex-shrink:0;transition:color .15s ease}.suggestion-item:hover .suggestion-icon,.suggestion-item.focused .suggestion-icon{color:var(--primary-color)}.suggestion-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-dropdown{position:absolute;top:calc(100% + .5rem);left:0;right:0;background-color:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--p-content-border-radius);box-shadow:0 4px 16px #0000001f;z-index:1000;overflow:hidden}.search-dropdown .suggestions-list{background-color:inherit}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@media(max-width:768px){.search-dropdown-panel{min-width:280px;max-width:400px}}@media(max-width:576px){.search-dropdown-panel{position:fixed;top:4rem;left:0;right:0;bottom:auto;width:100vw;min-width:100vw;max-width:100vw;margin-top:0;padding:1rem;border-radius:0;border-bottom:1px solid var(--surface-border);z-index:1200}.search-dropdown-panel .search-iconfield{margin-bottom:1rem}.search-dropdown{max-width:100%;left:0!important;right:0!important;transform:none;position:static;border-radius:var(--p-content-border-radius);margin-top:0}.suggestion-item{padding:.75rem}}\n"] }]
2189
+ `, styles: [".search-container{display:flex;align-items:center;position:relative;width:100%;flex:0 1 auto}.search-container.topbar-mode{width:auto}.search-dropdown-panel{position:absolute;top:100%;right:0;margin-top:.5rem;background-color:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--f-content-border-radius);box-shadow:var(--f-shadow-xl);z-index:1100;padding:1rem .75rem .75rem;min-width:300px;max-width:450px;animation:slideDown .2s ease-out}.search-suggestions{margin-top:.5rem;border-top:1px solid var(--surface-border);padding-top:.5rem;background-color:inherit}.suggestions-list{list-style:none;margin:0;padding:0;max-height:360px;overflow-y:auto;background-color:inherit}.suggestion-item{padding:.75rem 1rem;cursor:pointer;display:flex;align-items:center;gap:.75rem;color:var(--text-color);border-bottom:1px solid var(--surface-border);transition:background-color .15s ease,color .15s ease}.suggestion-item:last-child{border-bottom:none}.suggestion-item:hover,.suggestion-item.focused{background-color:var(--surface-50);color:var(--primary-color)}.suggestion-icon{color:var(--text-color-secondary);font-size:1rem;flex-shrink:0;transition:color .15s ease}.suggestion-item:hover .suggestion-icon,.suggestion-item.focused .suggestion-icon{color:var(--primary-color)}.suggestion-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-dropdown{position:absolute;top:calc(100% + .5rem);left:0;right:0;background-color:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--f-content-border-radius);box-shadow:var(--f-shadow-xl);z-index:1000;overflow:hidden}.search-dropdown .suggestions-list{background-color:inherit}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@media(max-width:768px){.search-dropdown-panel{min-width:280px;max-width:400px}}@media(max-width:576px){.search-dropdown-panel{position:fixed;top:4rem;left:0;right:0;bottom:auto;width:100vw;min-width:100vw;max-width:100vw;margin-top:0;padding:1rem;border-radius:0;border-bottom:1px solid var(--surface-border);z-index:1200}.search-dropdown-panel .search-iconfield{margin-bottom:1rem}.search-dropdown{max-width:100%;left:0!important;right:0!important;transform:none;position:static;border-radius:var(--f-content-border-radius);margin-top:0}.suggestion-item{padding:.75rem}}\n"] }]
2459
2190
  }], ctorParameters: () => [], propDecorators: { searchWrapper: [{ type: i0.ViewChild, args: ['searchWrapper', { isSignal: true }] }], searchInput: [{ type: i0.ViewChild, args: ['searchInput', { isSignal: true }] }] } });
2460
2191
 
2461
2192
  class AppTopbar {
@@ -2525,8 +2256,8 @@ class AppTopbar {
2525
2256
  li.style.setProperty('--submenu-top', `${top}px`);
2526
2257
  });
2527
2258
  }
2528
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppTopbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
2529
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AppTopbar, isStandalone: true, selector: "app-topbar", viewQueries: [{ propertyName: "configContainer", first: true, predicate: ["configContainer"], descendants: true, isSignal: true }, { propertyName: "navContainer", first: true, predicate: ["navContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `<div class="layout-topbar">
2259
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppTopbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
2260
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: AppTopbar, isStandalone: true, selector: "app-topbar", viewQueries: [{ propertyName: "configContainer", first: true, predicate: ["configContainer"], descendants: true, isSignal: true }, { propertyName: "navContainer", first: true, predicate: ["navContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `<div class="layout-topbar">
2530
2261
  <div
2531
2262
  class="layout-topbar-logo-container"
2532
2263
  [class.layout-topbar-logo-container-desktop]="layoutService.isDesktop()"
@@ -2537,7 +2268,7 @@ class AppTopbar {
2537
2268
  [attr.aria-label]="'layout.topbar.toggle.menu' | translate"
2538
2269
  (click)="layoutService.onMenuToggle()"
2539
2270
  >
2540
- <i class="pi pi-bars"></i>
2271
+ <ui-icon name="bars"></ui-icon>
2541
2272
  </button>
2542
2273
  }
2543
2274
  <a class="layout-topbar-logo" routerLink="/">
@@ -2560,7 +2291,7 @@ class AppTopbar {
2560
2291
  [attr.aria-label]="'layout.topbar.toggle.menu' | translate"
2561
2292
  (click)="layoutService.onMenuToggle()"
2562
2293
  >
2563
- <i class="pi pi-bars"></i>
2294
+ <ui-icon name="bars"></ui-icon>
2564
2295
  </button>
2565
2296
  }
2566
2297
  </div>
@@ -2588,18 +2319,14 @@ class AppTopbar {
2588
2319
  [attr.aria-label]="'layout.topbar.toggle.dark.mode' | translate"
2589
2320
  (click)="toggleDarkMode()"
2590
2321
  >
2591
- <i
2592
- class="pi"
2593
- [class.pi-moon]="layoutService.isDarkTheme()"
2594
- [class.pi-sun]="!layoutService.isDarkTheme()"
2595
- ></i>
2322
+ <ui-icon [name]="layoutService.isDarkTheme() ? 'moon' : 'sun'"></ui-icon>
2596
2323
  </button>
2597
2324
  <div class="relative" #configContainer>
2598
2325
  <button
2599
2326
  class="layout-topbar-action"
2600
2327
  [class.layout-topbar-action-highlight]="activePanel() === 'config'"
2601
2328
  [attr.aria-label]="'layout.topbar.open.theme.settings' | translate"
2602
- pStyleClass="@next"
2329
+ fStyleClass="@next"
2603
2330
  enterFromClass="hidden"
2604
2331
  enterActiveClass="animate-scalein"
2605
2332
  leaveToClass="hidden"
@@ -2607,7 +2334,7 @@ class AppTopbar {
2607
2334
  [hideOnOutsideClick]="true"
2608
2335
  (click)="togglePanel('config')"
2609
2336
  >
2610
- <i class="pi pi-palette"></i>
2337
+ <ui-icon name="palette"></ui-icon>
2611
2338
  </button>
2612
2339
  <app-configurator />
2613
2340
  </div>
@@ -2616,14 +2343,14 @@ class AppTopbar {
2616
2343
  <button
2617
2344
  class="layout-topbar-menu-button layout-topbar-action"
2618
2345
  [attr.aria-label]="'layout.topbar.more.options' | translate"
2619
- pStyleClass="@next"
2346
+ fStyleClass="@next"
2620
2347
  enterFromClass="hidden"
2621
2348
  enterActiveClass="animate-scalein"
2622
2349
  leaveToClass="hidden"
2623
2350
  leaveActiveClass="animate-fadeout"
2624
2351
  [hideOnOutsideClick]="true"
2625
2352
  >
2626
- <i class="pi pi-ellipsis-v"></i>
2353
+ <ui-icon name="ellipsis-v"></ui-icon>
2627
2354
  </button>
2628
2355
 
2629
2356
  <div class="layout-topbar-menu hidden lg:block">
@@ -2644,15 +2371,13 @@ class AppTopbar {
2644
2371
  </div>
2645
2372
  </div>
2646
2373
  </div>
2647
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "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: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: InlineSvgComponent, selector: "inline-svg", inputs: ["src"] }, { kind: "component", type: AppConfigurator, selector: "app-configurator" }, { kind: "component", type: AppMenu, selector: "app-menu" }, { kind: "component", type: AppProfile, selector: "app-profile" }, { kind: "component", type: AppCompanyBranchSelector, selector: "app-company-branch-selector" }, { kind: "component", type: AppLauncher, selector: "app-launcher" }, { kind: "component", type: AppSearchbar, selector: "app-searchbar" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
2374
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1.StyleClassDirective, selector: "[fStyleClass]", inputs: ["fStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: InlineSvgComponent, selector: "inline-svg", inputs: ["src"] }, { kind: "component", type: AppConfigurator, selector: "app-configurator" }, { kind: "component", type: AppMenu, selector: "app-menu" }, { kind: "component", type: AppProfile, selector: "app-profile" }, { kind: "component", type: AppCompanyBranchSelector, selector: "app-company-branch-selector" }, { kind: "component", type: AppLauncher, selector: "app-launcher" }, { kind: "component", type: AppSearchbar, selector: "app-searchbar" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
2648
2375
  }
2649
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppTopbar, decorators: [{
2376
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppTopbar, decorators: [{
2650
2377
  type: Component,
2651
2378
  args: [{
2652
2379
  selector: 'app-topbar',
2653
- imports: [
2654
- RouterModule,
2655
- StyleClassModule,
2380
+ imports: [UiModule, RouterModule,
2656
2381
  NgComponentOutlet,
2657
2382
  TranslatePipe,
2658
2383
  InlineSvgComponent,
@@ -2661,8 +2386,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2661
2386
  AppProfile,
2662
2387
  AppCompanyBranchSelector,
2663
2388
  AppLauncher,
2664
- AppSearchbar,
2665
- ],
2389
+ AppSearchbar,],
2666
2390
  template: `<div class="layout-topbar">
2667
2391
  <div
2668
2392
  class="layout-topbar-logo-container"
@@ -2674,7 +2398,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2674
2398
  [attr.aria-label]="'layout.topbar.toggle.menu' | translate"
2675
2399
  (click)="layoutService.onMenuToggle()"
2676
2400
  >
2677
- <i class="pi pi-bars"></i>
2401
+ <ui-icon name="bars"></ui-icon>
2678
2402
  </button>
2679
2403
  }
2680
2404
  <a class="layout-topbar-logo" routerLink="/">
@@ -2697,7 +2421,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2697
2421
  [attr.aria-label]="'layout.topbar.toggle.menu' | translate"
2698
2422
  (click)="layoutService.onMenuToggle()"
2699
2423
  >
2700
- <i class="pi pi-bars"></i>
2424
+ <ui-icon name="bars"></ui-icon>
2701
2425
  </button>
2702
2426
  }
2703
2427
  </div>
@@ -2725,18 +2449,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2725
2449
  [attr.aria-label]="'layout.topbar.toggle.dark.mode' | translate"
2726
2450
  (click)="toggleDarkMode()"
2727
2451
  >
2728
- <i
2729
- class="pi"
2730
- [class.pi-moon]="layoutService.isDarkTheme()"
2731
- [class.pi-sun]="!layoutService.isDarkTheme()"
2732
- ></i>
2452
+ <ui-icon [name]="layoutService.isDarkTheme() ? 'moon' : 'sun'"></ui-icon>
2733
2453
  </button>
2734
2454
  <div class="relative" #configContainer>
2735
2455
  <button
2736
2456
  class="layout-topbar-action"
2737
2457
  [class.layout-topbar-action-highlight]="activePanel() === 'config'"
2738
2458
  [attr.aria-label]="'layout.topbar.open.theme.settings' | translate"
2739
- pStyleClass="@next"
2459
+ fStyleClass="@next"
2740
2460
  enterFromClass="hidden"
2741
2461
  enterActiveClass="animate-scalein"
2742
2462
  leaveToClass="hidden"
@@ -2744,7 +2464,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2744
2464
  [hideOnOutsideClick]="true"
2745
2465
  (click)="togglePanel('config')"
2746
2466
  >
2747
- <i class="pi pi-palette"></i>
2467
+ <ui-icon name="palette"></ui-icon>
2748
2468
  </button>
2749
2469
  <app-configurator />
2750
2470
  </div>
@@ -2753,14 +2473,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2753
2473
  <button
2754
2474
  class="layout-topbar-menu-button layout-topbar-action"
2755
2475
  [attr.aria-label]="'layout.topbar.more.options' | translate"
2756
- pStyleClass="@next"
2476
+ fStyleClass="@next"
2757
2477
  enterFromClass="hidden"
2758
2478
  enterActiveClass="animate-scalein"
2759
2479
  leaveToClass="hidden"
2760
2480
  leaveActiveClass="animate-fadeout"
2761
2481
  [hideOnOutsideClick]="true"
2762
2482
  >
2763
- <i class="pi pi-ellipsis-v"></i>
2483
+ <ui-icon name="ellipsis-v"></ui-icon>
2764
2484
  </button>
2765
2485
 
2766
2486
  <div class="layout-topbar-menu hidden lg:block">
@@ -2786,14 +2506,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2786
2506
  }], ctorParameters: () => [], propDecorators: { configContainer: [{ type: i0.ViewChild, args: ['configContainer', { isSignal: true }] }], navContainer: [{ type: i0.ViewChild, args: ['navContainer', { isSignal: true }] }] } });
2787
2507
 
2788
2508
  class AppSidebar {
2789
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
2790
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: AppSidebar, isStandalone: true, selector: "app-sidebar", ngImport: i0, template: `
2509
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
2510
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.6", type: AppSidebar, isStandalone: true, selector: "app-sidebar", ngImport: i0, template: `
2791
2511
  <div class="layout-sidebar">
2792
2512
  <app-menu />
2793
2513
  </div>
2794
2514
  `, isInline: true, dependencies: [{ kind: "component", type: AppMenu, selector: "app-menu" }] });
2795
2515
  }
2796
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppSidebar, decorators: [{
2516
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppSidebar, decorators: [{
2797
2517
  type: Component,
2798
2518
  args: [{
2799
2519
  selector: 'app-sidebar',
@@ -2862,23 +2582,32 @@ class AppLayout {
2862
2582
  unblockBodyScroll() {
2863
2583
  this.document.body.classList.remove('blocked-scroll');
2864
2584
  }
2865
- containerClass = computed(() => {
2866
- const config = this.layoutService.layoutConfig();
2867
- const state = this.layoutService.layoutState();
2868
- return {
2869
- 'layout-overlay': config.menuMode === 'overlay',
2870
- 'layout-static': config.menuMode === 'static',
2871
- 'layout-topbar-mode': config.menuMode === 'topbar',
2872
- 'layout-static-inactive': state.staticMenuDesktopInactive && config.menuMode === 'static',
2873
- 'layout-overlay-active': state.overlayMenuActive,
2874
- 'layout-mobile-active': state.staticMenuMobileActive,
2875
- 'layout-topbar-nav-hidden': !state.topbarMenuVisible && config.menuMode === 'topbar',
2876
- };
2877
- }, /* @ts-ignore */
2878
- ...(ngDevMode ? [{ debugName: "containerClass" }] : /* istanbul ignore next */ []));
2879
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppLayout, deps: [], target: i0.ɵɵFactoryTarget.Component });
2880
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: AppLayout, isStandalone: true, selector: "app-layout", ngImport: i0, template: `
2881
- <div class="layout-wrapper" [ngClass]="containerClass()">
2585
+ isOverlay = computed(() => this.layoutService.layoutConfig().menuMode === 'overlay', /* @ts-ignore */
2586
+ ...(ngDevMode ? [{ debugName: "isOverlay" }] : /* istanbul ignore next */ []));
2587
+ isStatic = computed(() => this.layoutService.layoutConfig().menuMode === 'static', /* @ts-ignore */
2588
+ ...(ngDevMode ? [{ debugName: "isStatic" }] : /* istanbul ignore next */ []));
2589
+ isTopbarMode = computed(() => this.layoutService.layoutConfig().menuMode === 'topbar', /* @ts-ignore */
2590
+ ...(ngDevMode ? [{ debugName: "isTopbarMode" }] : /* istanbul ignore next */ []));
2591
+ isStaticInactive = computed(() => this.layoutService.layoutState().staticMenuDesktopInactive && this.isStatic(), /* @ts-ignore */
2592
+ ...(ngDevMode ? [{ debugName: "isStaticInactive" }] : /* istanbul ignore next */ []));
2593
+ isOverlayActive = computed(() => this.layoutService.layoutState().overlayMenuActive, /* @ts-ignore */
2594
+ ...(ngDevMode ? [{ debugName: "isOverlayActive" }] : /* istanbul ignore next */ []));
2595
+ isMobileActive = computed(() => this.layoutService.layoutState().staticMenuMobileActive, /* @ts-ignore */
2596
+ ...(ngDevMode ? [{ debugName: "isMobileActive" }] : /* istanbul ignore next */ []));
2597
+ isTopbarNavHidden = computed(() => !this.layoutService.layoutState().topbarMenuVisible && this.isTopbarMode(), /* @ts-ignore */
2598
+ ...(ngDevMode ? [{ debugName: "isTopbarNavHidden" }] : /* istanbul ignore next */ []));
2599
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppLayout, deps: [], target: i0.ɵɵFactoryTarget.Component });
2600
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.6", type: AppLayout, isStandalone: true, selector: "app-layout", ngImport: i0, template: `
2601
+ <div
2602
+ class="layout-wrapper"
2603
+ [class.layout-overlay]="isOverlay()"
2604
+ [class.layout-static]="isStatic()"
2605
+ [class.layout-topbar-mode]="isTopbarMode()"
2606
+ [class.layout-static-inactive]="isStaticInactive()"
2607
+ [class.layout-overlay-active]="isOverlayActive()"
2608
+ [class.layout-mobile-active]="isMobileActive()"
2609
+ [class.layout-topbar-nav-hidden]="isTopbarNavHidden()"
2610
+ >
2882
2611
  <app-topbar></app-topbar>
2883
2612
  <app-sidebar></app-sidebar>
2884
2613
  <div class="layout-main-container">
@@ -2889,15 +2618,24 @@ class AppLayout {
2889
2618
  </div>
2890
2619
  <div class="layout-mask animate-fadein"></div>
2891
2620
  </div>
2892
- `, 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$1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AppFooter, selector: "app-footer" }] });
2621
+ `, isInline: true, dependencies: [{ kind: "component", type: AppTopbar, selector: "app-topbar" }, { kind: "component", type: AppSidebar, selector: "app-sidebar" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AppFooter, selector: "app-footer" }] });
2893
2622
  }
2894
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppLayout, decorators: [{
2623
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppLayout, decorators: [{
2895
2624
  type: Component,
2896
2625
  args: [{
2897
2626
  selector: 'app-layout',
2898
- imports: [NgClass, AppTopbar, AppSidebar, RouterModule, AppFooter],
2627
+ imports: [AppTopbar, AppSidebar, RouterModule, AppFooter],
2899
2628
  template: `
2900
- <div class="layout-wrapper" [ngClass]="containerClass()">
2629
+ <div
2630
+ class="layout-wrapper"
2631
+ [class.layout-overlay]="isOverlay()"
2632
+ [class.layout-static]="isStatic()"
2633
+ [class.layout-topbar-mode]="isTopbarMode()"
2634
+ [class.layout-static-inactive]="isStaticInactive()"
2635
+ [class.layout-overlay-active]="isOverlayActive()"
2636
+ [class.layout-mobile-active]="isMobileActive()"
2637
+ [class.layout-topbar-nav-hidden]="isTopbarNavHidden()"
2638
+ >
2901
2639
  <app-topbar></app-topbar>
2902
2640
  <app-sidebar></app-sidebar>
2903
2641
  <div class="layout-main-container">
@@ -2912,47 +2650,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2912
2650
  }]
2913
2651
  }], ctorParameters: () => [] });
2914
2652
 
2915
- const NavyBlueTheme = definePreset(Material, {
2916
- semantic: {
2917
- colorScheme: {
2918
- light: {
2919
- primary: {
2920
- color: '#3535cd',
2921
- inverseColor: '#0707a9',
2922
- hoverColor: '#0707a9',
2923
- activeColor: '#0707a9',
2924
- },
2925
- highlight: {
2926
- background: '#e2e8f0',
2927
- focusBackground: '#e2e8f0',
2928
- color: '#3535cd',
2929
- focusColor: '#3535cd',
2930
- },
2931
- },
2932
- },
2933
- },
2934
- });
2653
+ function buildPreset(presetName, primary) {
2654
+ return { preset: presetName, primary };
2655
+ }
2935
2656
 
2936
- const GreenTheme = definePreset(Material, {
2937
- semantic: {
2938
- colorScheme: {
2939
- light: {
2940
- primary: {
2941
- color: '#01712c',
2942
- inverseColor: '#119744',
2943
- hoverColor: '#119744',
2944
- activeColor: '#119744',
2945
- },
2946
- highlight: {
2947
- background: '#e2e8f0',
2948
- focusBackground: '#e2e8f0',
2949
- color: '#01712c',
2950
- focusColor: '#01712c',
2951
- },
2952
- },
2953
- },
2954
- },
2955
- });
2657
+ const NavyBlueTheme = {
2658
+ preset: 'Aura',
2659
+ primary: 'indigo',
2660
+ };
2661
+
2662
+ const GreenTheme = {
2663
+ preset: 'Aura',
2664
+ primary: 'green',
2665
+ };
2956
2666
 
2957
2667
  const LAYOUT_MESSAGES = {
2958
2668
  // components/top-bar/app.profile.ts
@@ -3005,6 +2715,15 @@ const LAYOUT_MESSAGES = {
3005
2715
  'menu.task.manager': 'Task Manager',
3006
2716
  'menu.notifications': 'Notifications',
3007
2717
  'menu.localization': 'Localization',
2718
+ 'menu.components': 'Components',
2719
+ 'menu.components.display': 'Display',
2720
+ 'menu.components.menu': 'Menu',
2721
+ 'menu.components.form': 'Form',
2722
+ 'menu.components.overlay': 'Overlay',
2723
+ 'menu.components.data': 'Data',
2724
+ 'menu.components.panel': 'Panel',
2725
+ 'menu.components.media': 'Media',
2726
+ 'menu.components.misc': 'Directives',
3008
2727
  'menu.projects': 'Projects',
3009
2728
  'menu.projects.active': 'Active Projects',
3010
2729
  'menu.projects.archived': 'Archived',
@@ -3029,5 +2748,5 @@ const LAYOUT_MESSAGES = {
3029
2748
  * Generated bundle index. Do not edit.
3030
2749
  */
3031
2750
 
3032
- export { AppCompanyBranchSelector, AppConfigurator, AppFloatingConfigurator, AppFooter, AppLauncher, AppLayout, AppMenu, AppMenuitem, AppProfile, AppSearchbar, AppSidebar, AppTopbar, GreenTheme, LAYOUT_AUTH_API, LAYOUT_AUTH_STATE, LAYOUT_IS_RTL, LAYOUT_LANGUAGE_SELECTOR, LAYOUT_LANGUAGE_SELECTOR_PANEL, LAYOUT_MESSAGES, LAYOUT_NOTIFICATION_BELL, LAYOUT_SEARCHBAR, LAYOUT_SEARCH_ADAPTER, LayoutPersistenceService, LayoutService, NavyBlueTheme, buildBootstrapPreset, buildPreset, buildSemanticExt, filterAppsByPermissions, filterMenuByPermissions };
2751
+ export { AppCompanyBranchSelector, AppConfigurator, AppFloatingConfigurator, AppFooter, AppLauncher, AppLayout, AppMenu, AppMenuitem, AppProfile, AppSearchbar, AppSidebar, AppTopbar, GreenTheme, LAYOUT_AUTH_API, LAYOUT_AUTH_STATE, LAYOUT_IS_RTL, LAYOUT_LANGUAGE_SELECTOR, LAYOUT_LANGUAGE_SELECTOR_PANEL, LAYOUT_MESSAGES, LAYOUT_NOTIFICATION_BELL, LAYOUT_SEARCHBAR, LAYOUT_SEARCH_ADAPTER, LayoutPersistenceService, LayoutService, NavyBlueTheme, buildPreset, filterAppsByPermissions, filterMenuByPermissions };
3033
2752
  //# sourceMappingURL=flusys-ng-layout.mjs.map