@flusys/ng-layout 5.5.0 → 6.0.0-beta.2

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
- <span class="text-xs opacity-70"> | {{ currentBranchName() }}</span>
1288
+ <span class="text-xs opacity-70 ml-1">| {{ 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
- <span class="text-xs opacity-70"> | {{ currentBranchName() }}</span>
1383
+ <span class="text-xs opacity-70 ml-1">| {{ 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,129 @@ 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 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
1517
  <div
1779
- class="flex items-center justify-center w-10 h-10 rounded-border bg-emphasis group-hover:bg-primary transition-all duration-200"
1518
+ class="flex items-center justify-center w-9 h-9 rounded-border bg-primary/10 group-hover:bg-primary transition-colors duration-150"
1780
1519
  >
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
- />
1520
+ <ui-icon
1521
+ [name]="app.icon"
1522
+ class="text-base text-primary group-hover:text-primary-contrast transition-colors duration-150"
1523
+ ></ui-icon>
1786
1524
  </div>
1787
1525
  <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
1526
+ class="text-xs text-center text-muted-color group-hover:text-color transition-colors duration-150 truncate w-full text-center leading-tight"
1790
1527
  >
1528
+ {{ app.nameKey ? (app.nameKey | translate) : app.name }}
1529
+ </span>
1791
1530
  </a>
1792
1531
  }
1793
1532
  </div>
1794
- </div>
1533
+ }
1795
1534
  </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" }] });
1535
+ `, 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
1536
  }
1798
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppLauncher, decorators: [{
1537
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppLauncher, decorators: [{
1799
1538
  type: Component,
1800
1539
  args: [{
1801
1540
  selector: 'app-launcher',
1802
- imports: [StyleClassModule, IconComponent, TranslatePipe],
1541
+ imports: [UiModule, TranslatePipe],
1803
1542
  host: { class: 'relative' },
1804
1543
  template: `
1805
1544
  <button
1806
1545
  type="button"
1807
1546
  class="layout-topbar-action"
1808
1547
  [class.layout-topbar-action-highlight]="isActive()"
1809
- pStyleClass="@next"
1548
+ fStyleClass="@next"
1810
1549
  enterFromClass="hidden"
1811
1550
  enterActiveClass="animate-scalein"
1812
1551
  leaveToClass="hidden"
1813
1552
  leaveActiveClass="animate-fadeout"
1814
1553
  [hideOnOutsideClick]="true"
1815
- (click)="togglePanel()"
1554
+ (click)="toggleActive()"
1816
1555
  >
1817
- <i class="pi pi-th-large"></i>
1556
+ <ui-icon name="th-large"></ui-icon>
1818
1557
  <span>{{ 'layout.launcher.apps' | translate }}</span>
1819
1558
  </button>
1820
1559
  <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;"
1560
+ class="hidden absolute top-[3.25rem] z-50 border border-surface rounded-border origin-top surface-overlay"
1561
+ style="inset-inline-end: 0; min-width: 16rem; max-width: 22rem; width: calc(100vw - 2rem); box-shadow: var(--f-shadow-xl);"
1823
1562
  >
1824
- <div class="flex flex-col gap-2">
1825
- <span class="text-sm text-muted-color font-semibold">{{
1563
+ <div class="px-4 py-3 border-b border-surface">
1564
+ <span class="text-xs font-semibold tracking-wide text-muted-color">{{
1826
1565
  'layout.launcher.applications' | translate
1827
1566
  }}</span>
1828
- <div class="grid grid-cols-2 sm:grid-cols-3 gap-2">
1567
+ </div>
1568
+ @if (layoutService.apps().length === 0) {
1569
+ <div class="px-4 py-6 text-center text-muted-color text-sm">
1570
+ {{ 'layout.launcher.no.apps' | translate }}
1571
+ </div>
1572
+ } @else {
1573
+ <div class="p-3 grid grid-cols-3 gap-1">
1829
1574
  @for (app of layoutService.apps(); track app.id) {
1830
1575
  <a
1831
- class="group flex flex-col items-center p-2 rounded-border cursor-pointer no-underline transition-all duration-200 hover:bg-emphasis"
1576
+ 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
1577
  [href]="app.url"
1833
1578
  target="_blank"
1834
1579
  rel="noopener noreferrer"
1835
1580
  >
1836
1581
  <div
1837
- class="flex items-center justify-center w-10 h-10 rounded-border bg-emphasis group-hover:bg-primary transition-all duration-200"
1582
+ class="flex items-center justify-center w-9 h-9 rounded-border bg-primary/10 group-hover:bg-primary transition-colors duration-150"
1838
1583
  >
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
- />
1584
+ <ui-icon
1585
+ [name]="app.icon"
1586
+ class="text-base text-primary group-hover:text-primary-contrast transition-colors duration-150"
1587
+ ></ui-icon>
1844
1588
  </div>
1845
1589
  <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
1590
+ class="text-xs text-center text-muted-color group-hover:text-color transition-colors duration-150 truncate w-full text-center leading-tight"
1848
1591
  >
1592
+ {{ app.nameKey ? (app.nameKey | translate) : app.name }}
1593
+ </span>
1849
1594
  </a>
1850
1595
  }
1851
1596
  </div>
1852
- </div>
1597
+ }
1853
1598
  </div>
1854
1599
  `,
1855
1600
  }]
@@ -1938,13 +1683,13 @@ class AppProfile {
1938
1683
  translate(key, vars) {
1939
1684
  return this.translateAdapter?.translate(key, vars) ?? key;
1940
1685
  }
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: `
1686
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppProfile, deps: [], target: i0.ɵɵFactoryTarget.Component });
1687
+ 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
1688
  <button
1944
1689
  type="button"
1945
1690
  class="layout-topbar-action"
1946
1691
  [class.layout-topbar-action-highlight]="isActive()"
1947
- pStyleClass="@next"
1692
+ fStyleClass="@next"
1948
1693
  enterFromClass="hidden"
1949
1694
  enterActiveClass="animate-scalein"
1950
1695
  leaveToClass="hidden"
@@ -1952,11 +1697,11 @@ class AppProfile {
1952
1697
  [hideOnOutsideClick]="true"
1953
1698
  (click)="togglePanel()"
1954
1699
  >
1955
- <i class="pi pi-user"></i>
1700
+ <ui-icon name="user"></ui-icon>
1956
1701
  <span>{{ 'layout.profile.title' | translate }}</span>
1957
1702
  </button>
1958
1703
  <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]"
1704
+ 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
1705
  style="background-color: var(--surface-overlay); inset-inline-end: 0;"
1961
1706
  >
1962
1707
  <div class="flex flex-col gap-3">
@@ -1975,7 +1720,7 @@ class AppProfile {
1975
1720
  <div
1976
1721
  class="w-12 h-12 rounded-border bg-primary flex items-center justify-center"
1977
1722
  >
1978
- <i class="pi pi-user text-xl text-primary-contrast"></i>
1723
+ <ui-icon name="user" class="text-xl text-primary-contrast"></ui-icon>
1979
1724
  </div>
1980
1725
  }
1981
1726
  <div class="flex flex-col min-w-0 flex-1">
@@ -1998,7 +1743,7 @@ class AppProfile {
1998
1743
  class="flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200"
1999
1744
  (click)="copySignUpLink()"
2000
1745
  >
2001
- <i class="pi pi-link text-muted-color"></i>
1746
+ <ui-icon name="link" class="text-muted-color"></ui-icon>
2002
1747
  <span>{{ 'layout.profile.copy.sign.up.link' | translate }}</span>
2003
1748
  </a>
2004
1749
  }
@@ -2006,26 +1751,26 @@ class AppProfile {
2006
1751
  class="flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200"
2007
1752
  (click)="logout()"
2008
1753
  >
2009
- <i class="pi pi-sign-out text-muted-color"></i>
1754
+ <ui-icon name="sign-out" class="text-muted-color"></ui-icon>
2010
1755
  <span>{{ 'layout.profile.logout' | translate }}</span>
2011
1756
  </a>
2012
1757
  </div>
2013
1758
  </div>
2014
1759
  </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" }] });
1760
+ `, 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
1761
  }
2017
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppProfile, decorators: [{
1762
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppProfile, decorators: [{
2018
1763
  type: Component,
2019
1764
  args: [{
2020
1765
  selector: 'app-profile',
2021
- imports: [AngularModule, StyleClassModule, TranslatePipe],
1766
+ imports: [UiModule, AngularModule, TranslatePipe],
2022
1767
  host: { class: 'relative' },
2023
1768
  template: `
2024
1769
  <button
2025
1770
  type="button"
2026
1771
  class="layout-topbar-action"
2027
1772
  [class.layout-topbar-action-highlight]="isActive()"
2028
- pStyleClass="@next"
1773
+ fStyleClass="@next"
2029
1774
  enterFromClass="hidden"
2030
1775
  enterActiveClass="animate-scalein"
2031
1776
  leaveToClass="hidden"
@@ -2033,11 +1778,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2033
1778
  [hideOnOutsideClick]="true"
2034
1779
  (click)="togglePanel()"
2035
1780
  >
2036
- <i class="pi pi-user"></i>
1781
+ <ui-icon name="user"></ui-icon>
2037
1782
  <span>{{ 'layout.profile.title' | translate }}</span>
2038
1783
  </button>
2039
1784
  <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]"
1785
+ 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
1786
  style="background-color: var(--surface-overlay); inset-inline-end: 0;"
2042
1787
  >
2043
1788
  <div class="flex flex-col gap-3">
@@ -2056,7 +1801,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2056
1801
  <div
2057
1802
  class="w-12 h-12 rounded-border bg-primary flex items-center justify-center"
2058
1803
  >
2059
- <i class="pi pi-user text-xl text-primary-contrast"></i>
1804
+ <ui-icon name="user" class="text-xl text-primary-contrast"></ui-icon>
2060
1805
  </div>
2061
1806
  }
2062
1807
  <div class="flex flex-col min-w-0 flex-1">
@@ -2079,7 +1824,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2079
1824
  class="flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200"
2080
1825
  (click)="copySignUpLink()"
2081
1826
  >
2082
- <i class="pi pi-link text-muted-color"></i>
1827
+ <ui-icon name="link" class="text-muted-color"></ui-icon>
2083
1828
  <span>{{ 'layout.profile.copy.sign.up.link' | translate }}</span>
2084
1829
  </a>
2085
1830
  }
@@ -2087,7 +1832,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2087
1832
  class="flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200"
2088
1833
  (click)="logout()"
2089
1834
  >
2090
- <i class="pi pi-sign-out text-muted-color"></i>
1835
+ <ui-icon name="sign-out" class="text-muted-color"></ui-icon>
2091
1836
  <span>{{ 'layout.profile.logout' | translate }}</span>
2092
1837
  </a>
2093
1838
  </div>
@@ -2236,8 +1981,8 @@ class AppSearchbar {
2236
1981
  this.searchAdapter.onSearch(query);
2237
1982
  }
2238
1983
  }
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: `
1984
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppSearchbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
1985
+ 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
1986
  <div
2242
1987
  class="search-container h-full"
2243
1988
  #searchWrapper
@@ -2247,23 +1992,20 @@ class AppSearchbar {
2247
1992
  <!-- Topbar/Mobile Icon Mode -->
2248
1993
  <button
2249
1994
  type="button"
2250
- pButton
2251
- pRipple
2252
- class="search-toggle-btn"
2253
- icon="pi pi-search"
1995
+ class="search-toggle-btn layout-topbar-action"
2254
1996
  (click)="toggleSearch()"
2255
1997
  [attr.aria-label]="'layout.topbar.search' | translate"
2256
- severity="secondary"
2257
- text
2258
- ></button>
1998
+ >
1999
+ <ui-icon name="search"></ui-icon>
2000
+ </button>
2259
2001
 
2260
2002
  @if (isSearchExpanded()) {
2261
2003
  <div class="search-dropdown-panel">
2262
- <p-iconfield class="search-iconfield">
2263
- <p-inputicon class="pi pi-search search-icon" />
2004
+ <f-iconfield class="search-iconfield">
2005
+ <f-inputicon class="search-icon"><ui-icon name="search" /></f-inputicon>
2264
2006
  <input
2265
2007
  type="text"
2266
- pInputText
2008
+ fInputText
2267
2009
  class="search-input w-full"
2268
2010
  [placeholder]="'layout.topbar.search.placeholder' | translate"
2269
2011
  [(ngModel)]="searchTerm"
@@ -2274,7 +2016,7 @@ class AppSearchbar {
2274
2016
  #searchInput
2275
2017
  autocomplete="off"
2276
2018
  />
2277
- </p-iconfield>
2019
+ </f-iconfield>
2278
2020
 
2279
2021
  @if (suggestionsOpen() && suggestions().length > 0) {
2280
2022
  <div class="search-suggestions">
@@ -2293,7 +2035,7 @@ class AppSearchbar {
2293
2035
  [attr.aria-selected]="idx === focusedIndex()"
2294
2036
  >
2295
2037
  @if (item.icon) {
2296
- <i [class]="item.icon" class="suggestion-icon"></i>
2038
+ <ui-icon [name]="item.icon" class="suggestion-icon"></ui-icon>
2297
2039
  }
2298
2040
  <span class="suggestion-label">{{ item.label }}</span>
2299
2041
  </li>
@@ -2305,11 +2047,11 @@ class AppSearchbar {
2305
2047
  }
2306
2048
  } @else {
2307
2049
  <!-- Desktop Full Input Mode -->
2308
- <p-iconfield class="search-iconfield">
2309
- <p-inputicon class="pi pi-search search-icon" (click)="onSearch()" />
2050
+ <f-iconfield class="search-iconfield">
2051
+ <f-inputicon class="search-icon cursor-pointer" (click)="onSearch()"><ui-icon name="search" /></f-inputicon>
2310
2052
  <input
2311
2053
  type="text"
2312
- pInputText
2054
+ fInputText
2313
2055
  class="search-input w-full"
2314
2056
  [placeholder]="'layout.topbar.search.placeholder' | translate"
2315
2057
  [(ngModel)]="searchTerm"
@@ -2319,7 +2061,7 @@ class AppSearchbar {
2319
2061
  [attr.aria-label]="'layout.topbar.search' | translate"
2320
2062
  #searchInput
2321
2063
  />
2322
- </p-iconfield>
2064
+ </f-iconfield>
2323
2065
 
2324
2066
  @if (suggestionsOpen() && suggestions().length > 0) {
2325
2067
  <div class="search-dropdown">
@@ -2334,7 +2076,7 @@ class AppSearchbar {
2334
2076
  [attr.aria-selected]="idx === focusedIndex()"
2335
2077
  >
2336
2078
  @if (item.icon) {
2337
- <i [class]="item.icon" class="suggestion-icon"></i>
2079
+ <ui-icon [name]="item.icon" class="suggestion-icon"></ui-icon>
2338
2080
  }
2339
2081
  <span class="suggestion-label">{{ item.label }}</span>
2340
2082
  </li>
@@ -2344,11 +2086,11 @@ class AppSearchbar {
2344
2086
  }
2345
2087
  }
2346
2088
  </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" }] });
2089
+ `, 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
2090
  }
2349
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppSearchbar, decorators: [{
2091
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppSearchbar, decorators: [{
2350
2092
  type: Component,
2351
- args: [{ selector: 'app-searchbar', imports: [AngularModule, PrimeModule, TranslatePipe], template: `
2093
+ args: [{ selector: 'app-searchbar', imports: [UiModule, AngularModule, TranslatePipe], template: `
2352
2094
  <div
2353
2095
  class="search-container h-full"
2354
2096
  #searchWrapper
@@ -2358,23 +2100,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2358
2100
  <!-- Topbar/Mobile Icon Mode -->
2359
2101
  <button
2360
2102
  type="button"
2361
- pButton
2362
- pRipple
2363
- class="search-toggle-btn"
2364
- icon="pi pi-search"
2103
+ class="search-toggle-btn layout-topbar-action"
2365
2104
  (click)="toggleSearch()"
2366
2105
  [attr.aria-label]="'layout.topbar.search' | translate"
2367
- severity="secondary"
2368
- text
2369
- ></button>
2106
+ >
2107
+ <ui-icon name="search"></ui-icon>
2108
+ </button>
2370
2109
 
2371
2110
  @if (isSearchExpanded()) {
2372
2111
  <div class="search-dropdown-panel">
2373
- <p-iconfield class="search-iconfield">
2374
- <p-inputicon class="pi pi-search search-icon" />
2112
+ <f-iconfield class="search-iconfield">
2113
+ <f-inputicon class="search-icon"><ui-icon name="search" /></f-inputicon>
2375
2114
  <input
2376
2115
  type="text"
2377
- pInputText
2116
+ fInputText
2378
2117
  class="search-input w-full"
2379
2118
  [placeholder]="'layout.topbar.search.placeholder' | translate"
2380
2119
  [(ngModel)]="searchTerm"
@@ -2385,7 +2124,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2385
2124
  #searchInput
2386
2125
  autocomplete="off"
2387
2126
  />
2388
- </p-iconfield>
2127
+ </f-iconfield>
2389
2128
 
2390
2129
  @if (suggestionsOpen() && suggestions().length > 0) {
2391
2130
  <div class="search-suggestions">
@@ -2404,7 +2143,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2404
2143
  [attr.aria-selected]="idx === focusedIndex()"
2405
2144
  >
2406
2145
  @if (item.icon) {
2407
- <i [class]="item.icon" class="suggestion-icon"></i>
2146
+ <ui-icon [name]="item.icon" class="suggestion-icon"></ui-icon>
2408
2147
  }
2409
2148
  <span class="suggestion-label">{{ item.label }}</span>
2410
2149
  </li>
@@ -2416,11 +2155,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2416
2155
  }
2417
2156
  } @else {
2418
2157
  <!-- Desktop Full Input Mode -->
2419
- <p-iconfield class="search-iconfield">
2420
- <p-inputicon class="pi pi-search search-icon" (click)="onSearch()" />
2158
+ <f-iconfield class="search-iconfield">
2159
+ <f-inputicon class="search-icon cursor-pointer" (click)="onSearch()"><ui-icon name="search" /></f-inputicon>
2421
2160
  <input
2422
2161
  type="text"
2423
- pInputText
2162
+ fInputText
2424
2163
  class="search-input w-full"
2425
2164
  [placeholder]="'layout.topbar.search.placeholder' | translate"
2426
2165
  [(ngModel)]="searchTerm"
@@ -2430,7 +2169,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2430
2169
  [attr.aria-label]="'layout.topbar.search' | translate"
2431
2170
  #searchInput
2432
2171
  />
2433
- </p-iconfield>
2172
+ </f-iconfield>
2434
2173
 
2435
2174
  @if (suggestionsOpen() && suggestions().length > 0) {
2436
2175
  <div class="search-dropdown">
@@ -2445,7 +2184,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2445
2184
  [attr.aria-selected]="idx === focusedIndex()"
2446
2185
  >
2447
2186
  @if (item.icon) {
2448
- <i [class]="item.icon" class="suggestion-icon"></i>
2187
+ <ui-icon [name]="item.icon" class="suggestion-icon"></ui-icon>
2449
2188
  }
2450
2189
  <span class="suggestion-label">{{ item.label }}</span>
2451
2190
  </li>
@@ -2455,7 +2194,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2455
2194
  }
2456
2195
  }
2457
2196
  </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"] }]
2197
+ `, 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
2198
  }], ctorParameters: () => [], propDecorators: { searchWrapper: [{ type: i0.ViewChild, args: ['searchWrapper', { isSignal: true }] }], searchInput: [{ type: i0.ViewChild, args: ['searchInput', { isSignal: true }] }] } });
2460
2199
 
2461
2200
  class AppTopbar {
@@ -2525,8 +2264,8 @@ class AppTopbar {
2525
2264
  li.style.setProperty('--submenu-top', `${top}px`);
2526
2265
  });
2527
2266
  }
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">
2267
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppTopbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
2268
+ 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
2269
  <div
2531
2270
  class="layout-topbar-logo-container"
2532
2271
  [class.layout-topbar-logo-container-desktop]="layoutService.isDesktop()"
@@ -2537,7 +2276,7 @@ class AppTopbar {
2537
2276
  [attr.aria-label]="'layout.topbar.toggle.menu' | translate"
2538
2277
  (click)="layoutService.onMenuToggle()"
2539
2278
  >
2540
- <i class="pi pi-bars"></i>
2279
+ <ui-icon name="bars"></ui-icon>
2541
2280
  </button>
2542
2281
  }
2543
2282
  <a class="layout-topbar-logo" routerLink="/">
@@ -2560,7 +2299,7 @@ class AppTopbar {
2560
2299
  [attr.aria-label]="'layout.topbar.toggle.menu' | translate"
2561
2300
  (click)="layoutService.onMenuToggle()"
2562
2301
  >
2563
- <i class="pi pi-bars"></i>
2302
+ <ui-icon name="bars"></ui-icon>
2564
2303
  </button>
2565
2304
  }
2566
2305
  </div>
@@ -2588,18 +2327,14 @@ class AppTopbar {
2588
2327
  [attr.aria-label]="'layout.topbar.toggle.dark.mode' | translate"
2589
2328
  (click)="toggleDarkMode()"
2590
2329
  >
2591
- <i
2592
- class="pi"
2593
- [class.pi-moon]="layoutService.isDarkTheme()"
2594
- [class.pi-sun]="!layoutService.isDarkTheme()"
2595
- ></i>
2330
+ <ui-icon [name]="layoutService.isDarkTheme() ? 'moon' : 'sun'"></ui-icon>
2596
2331
  </button>
2597
2332
  <div class="relative" #configContainer>
2598
2333
  <button
2599
2334
  class="layout-topbar-action"
2600
2335
  [class.layout-topbar-action-highlight]="activePanel() === 'config'"
2601
2336
  [attr.aria-label]="'layout.topbar.open.theme.settings' | translate"
2602
- pStyleClass="@next"
2337
+ fStyleClass="@next"
2603
2338
  enterFromClass="hidden"
2604
2339
  enterActiveClass="animate-scalein"
2605
2340
  leaveToClass="hidden"
@@ -2607,7 +2342,7 @@ class AppTopbar {
2607
2342
  [hideOnOutsideClick]="true"
2608
2343
  (click)="togglePanel('config')"
2609
2344
  >
2610
- <i class="pi pi-palette"></i>
2345
+ <ui-icon name="palette"></ui-icon>
2611
2346
  </button>
2612
2347
  <app-configurator />
2613
2348
  </div>
@@ -2616,14 +2351,14 @@ class AppTopbar {
2616
2351
  <button
2617
2352
  class="layout-topbar-menu-button layout-topbar-action"
2618
2353
  [attr.aria-label]="'layout.topbar.more.options' | translate"
2619
- pStyleClass="@next"
2354
+ fStyleClass="@next"
2620
2355
  enterFromClass="hidden"
2621
2356
  enterActiveClass="animate-scalein"
2622
2357
  leaveToClass="hidden"
2623
2358
  leaveActiveClass="animate-fadeout"
2624
2359
  [hideOnOutsideClick]="true"
2625
2360
  >
2626
- <i class="pi pi-ellipsis-v"></i>
2361
+ <ui-icon name="ellipsis-v"></ui-icon>
2627
2362
  </button>
2628
2363
 
2629
2364
  <div class="layout-topbar-menu hidden lg:block">
@@ -2644,15 +2379,13 @@ class AppTopbar {
2644
2379
  </div>
2645
2380
  </div>
2646
2381
  </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" }] });
2382
+ </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
2383
  }
2649
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppTopbar, decorators: [{
2384
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppTopbar, decorators: [{
2650
2385
  type: Component,
2651
2386
  args: [{
2652
2387
  selector: 'app-topbar',
2653
- imports: [
2654
- RouterModule,
2655
- StyleClassModule,
2388
+ imports: [UiModule, RouterModule,
2656
2389
  NgComponentOutlet,
2657
2390
  TranslatePipe,
2658
2391
  InlineSvgComponent,
@@ -2661,8 +2394,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2661
2394
  AppProfile,
2662
2395
  AppCompanyBranchSelector,
2663
2396
  AppLauncher,
2664
- AppSearchbar,
2665
- ],
2397
+ AppSearchbar,],
2666
2398
  template: `<div class="layout-topbar">
2667
2399
  <div
2668
2400
  class="layout-topbar-logo-container"
@@ -2674,7 +2406,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2674
2406
  [attr.aria-label]="'layout.topbar.toggle.menu' | translate"
2675
2407
  (click)="layoutService.onMenuToggle()"
2676
2408
  >
2677
- <i class="pi pi-bars"></i>
2409
+ <ui-icon name="bars"></ui-icon>
2678
2410
  </button>
2679
2411
  }
2680
2412
  <a class="layout-topbar-logo" routerLink="/">
@@ -2697,7 +2429,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2697
2429
  [attr.aria-label]="'layout.topbar.toggle.menu' | translate"
2698
2430
  (click)="layoutService.onMenuToggle()"
2699
2431
  >
2700
- <i class="pi pi-bars"></i>
2432
+ <ui-icon name="bars"></ui-icon>
2701
2433
  </button>
2702
2434
  }
2703
2435
  </div>
@@ -2725,18 +2457,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2725
2457
  [attr.aria-label]="'layout.topbar.toggle.dark.mode' | translate"
2726
2458
  (click)="toggleDarkMode()"
2727
2459
  >
2728
- <i
2729
- class="pi"
2730
- [class.pi-moon]="layoutService.isDarkTheme()"
2731
- [class.pi-sun]="!layoutService.isDarkTheme()"
2732
- ></i>
2460
+ <ui-icon [name]="layoutService.isDarkTheme() ? 'moon' : 'sun'"></ui-icon>
2733
2461
  </button>
2734
2462
  <div class="relative" #configContainer>
2735
2463
  <button
2736
2464
  class="layout-topbar-action"
2737
2465
  [class.layout-topbar-action-highlight]="activePanel() === 'config'"
2738
2466
  [attr.aria-label]="'layout.topbar.open.theme.settings' | translate"
2739
- pStyleClass="@next"
2467
+ fStyleClass="@next"
2740
2468
  enterFromClass="hidden"
2741
2469
  enterActiveClass="animate-scalein"
2742
2470
  leaveToClass="hidden"
@@ -2744,7 +2472,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2744
2472
  [hideOnOutsideClick]="true"
2745
2473
  (click)="togglePanel('config')"
2746
2474
  >
2747
- <i class="pi pi-palette"></i>
2475
+ <ui-icon name="palette"></ui-icon>
2748
2476
  </button>
2749
2477
  <app-configurator />
2750
2478
  </div>
@@ -2753,14 +2481,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2753
2481
  <button
2754
2482
  class="layout-topbar-menu-button layout-topbar-action"
2755
2483
  [attr.aria-label]="'layout.topbar.more.options' | translate"
2756
- pStyleClass="@next"
2484
+ fStyleClass="@next"
2757
2485
  enterFromClass="hidden"
2758
2486
  enterActiveClass="animate-scalein"
2759
2487
  leaveToClass="hidden"
2760
2488
  leaveActiveClass="animate-fadeout"
2761
2489
  [hideOnOutsideClick]="true"
2762
2490
  >
2763
- <i class="pi pi-ellipsis-v"></i>
2491
+ <ui-icon name="ellipsis-v"></ui-icon>
2764
2492
  </button>
2765
2493
 
2766
2494
  <div class="layout-topbar-menu hidden lg:block">
@@ -2786,14 +2514,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2786
2514
  }], ctorParameters: () => [], propDecorators: { configContainer: [{ type: i0.ViewChild, args: ['configContainer', { isSignal: true }] }], navContainer: [{ type: i0.ViewChild, args: ['navContainer', { isSignal: true }] }] } });
2787
2515
 
2788
2516
  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: `
2517
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
2518
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.6", type: AppSidebar, isStandalone: true, selector: "app-sidebar", ngImport: i0, template: `
2791
2519
  <div class="layout-sidebar">
2792
2520
  <app-menu />
2793
2521
  </div>
2794
2522
  `, isInline: true, dependencies: [{ kind: "component", type: AppMenu, selector: "app-menu" }] });
2795
2523
  }
2796
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppSidebar, decorators: [{
2524
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppSidebar, decorators: [{
2797
2525
  type: Component,
2798
2526
  args: [{
2799
2527
  selector: 'app-sidebar',
@@ -2862,23 +2590,32 @@ class AppLayout {
2862
2590
  unblockBodyScroll() {
2863
2591
  this.document.body.classList.remove('blocked-scroll');
2864
2592
  }
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()">
2593
+ isOverlay = computed(() => this.layoutService.layoutConfig().menuMode === 'overlay', /* @ts-ignore */
2594
+ ...(ngDevMode ? [{ debugName: "isOverlay" }] : /* istanbul ignore next */ []));
2595
+ isStatic = computed(() => this.layoutService.layoutConfig().menuMode === 'static', /* @ts-ignore */
2596
+ ...(ngDevMode ? [{ debugName: "isStatic" }] : /* istanbul ignore next */ []));
2597
+ isTopbarMode = computed(() => this.layoutService.layoutConfig().menuMode === 'topbar', /* @ts-ignore */
2598
+ ...(ngDevMode ? [{ debugName: "isTopbarMode" }] : /* istanbul ignore next */ []));
2599
+ isStaticInactive = computed(() => this.layoutService.layoutState().staticMenuDesktopInactive && this.isStatic(), /* @ts-ignore */
2600
+ ...(ngDevMode ? [{ debugName: "isStaticInactive" }] : /* istanbul ignore next */ []));
2601
+ isOverlayActive = computed(() => this.layoutService.layoutState().overlayMenuActive, /* @ts-ignore */
2602
+ ...(ngDevMode ? [{ debugName: "isOverlayActive" }] : /* istanbul ignore next */ []));
2603
+ isMobileActive = computed(() => this.layoutService.layoutState().staticMenuMobileActive, /* @ts-ignore */
2604
+ ...(ngDevMode ? [{ debugName: "isMobileActive" }] : /* istanbul ignore next */ []));
2605
+ isTopbarNavHidden = computed(() => !this.layoutService.layoutState().topbarMenuVisible && this.isTopbarMode(), /* @ts-ignore */
2606
+ ...(ngDevMode ? [{ debugName: "isTopbarNavHidden" }] : /* istanbul ignore next */ []));
2607
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppLayout, deps: [], target: i0.ɵɵFactoryTarget.Component });
2608
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.6", type: AppLayout, isStandalone: true, selector: "app-layout", ngImport: i0, template: `
2609
+ <div
2610
+ class="layout-wrapper"
2611
+ [class.layout-overlay]="isOverlay()"
2612
+ [class.layout-static]="isStatic()"
2613
+ [class.layout-topbar-mode]="isTopbarMode()"
2614
+ [class.layout-static-inactive]="isStaticInactive()"
2615
+ [class.layout-overlay-active]="isOverlayActive()"
2616
+ [class.layout-mobile-active]="isMobileActive()"
2617
+ [class.layout-topbar-nav-hidden]="isTopbarNavHidden()"
2618
+ >
2882
2619
  <app-topbar></app-topbar>
2883
2620
  <app-sidebar></app-sidebar>
2884
2621
  <div class="layout-main-container">
@@ -2889,15 +2626,24 @@ class AppLayout {
2889
2626
  </div>
2890
2627
  <div class="layout-mask animate-fadein"></div>
2891
2628
  </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" }] });
2629
+ `, 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
2630
  }
2894
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AppLayout, decorators: [{
2631
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: AppLayout, decorators: [{
2895
2632
  type: Component,
2896
2633
  args: [{
2897
2634
  selector: 'app-layout',
2898
- imports: [NgClass, AppTopbar, AppSidebar, RouterModule, AppFooter],
2635
+ imports: [AppTopbar, AppSidebar, RouterModule, AppFooter],
2899
2636
  template: `
2900
- <div class="layout-wrapper" [ngClass]="containerClass()">
2637
+ <div
2638
+ class="layout-wrapper"
2639
+ [class.layout-overlay]="isOverlay()"
2640
+ [class.layout-static]="isStatic()"
2641
+ [class.layout-topbar-mode]="isTopbarMode()"
2642
+ [class.layout-static-inactive]="isStaticInactive()"
2643
+ [class.layout-overlay-active]="isOverlayActive()"
2644
+ [class.layout-mobile-active]="isMobileActive()"
2645
+ [class.layout-topbar-nav-hidden]="isTopbarNavHidden()"
2646
+ >
2901
2647
  <app-topbar></app-topbar>
2902
2648
  <app-sidebar></app-sidebar>
2903
2649
  <div class="layout-main-container">
@@ -2912,47 +2658,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
2912
2658
  }]
2913
2659
  }], ctorParameters: () => [] });
2914
2660
 
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
- });
2661
+ function buildPreset(presetName, primary) {
2662
+ return { preset: presetName, primary };
2663
+ }
2935
2664
 
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
- });
2665
+ const NavyBlueTheme = {
2666
+ preset: 'Aura',
2667
+ primary: 'indigo',
2668
+ };
2669
+
2670
+ const GreenTheme = {
2671
+ preset: 'Aura',
2672
+ primary: 'green',
2673
+ };
2956
2674
 
2957
2675
  const LAYOUT_MESSAGES = {
2958
2676
  // components/top-bar/app.profile.ts
@@ -3005,6 +2723,15 @@ const LAYOUT_MESSAGES = {
3005
2723
  'menu.task.manager': 'Task Manager',
3006
2724
  'menu.notifications': 'Notifications',
3007
2725
  'menu.localization': 'Localization',
2726
+ 'menu.components': 'Components',
2727
+ 'menu.components.display': 'Display',
2728
+ 'menu.components.menu': 'Menu',
2729
+ 'menu.components.form': 'Form',
2730
+ 'menu.components.overlay': 'Overlay',
2731
+ 'menu.components.data': 'Data',
2732
+ 'menu.components.panel': 'Panel',
2733
+ 'menu.components.media': 'Media',
2734
+ 'menu.components.misc': 'Directives',
3008
2735
  'menu.projects': 'Projects',
3009
2736
  'menu.projects.active': 'Active Projects',
3010
2737
  'menu.projects.archived': 'Archived',
@@ -3029,5 +2756,5 @@ const LAYOUT_MESSAGES = {
3029
2756
  * Generated bundle index. Do not edit.
3030
2757
  */
3031
2758
 
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 };
2759
+ 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
2760
  //# sourceMappingURL=flusys-ng-layout.mjs.map