@flusys/ng-layout 6.0.0-beta.1 → 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,7 +1,7 @@
1
1
  // RTL Support using CSS Logical Properties and dir="rtl" overrides
2
2
 
3
3
  // Base RTL styles
4
- html[dir='rtl'] {
4
+ html[dir="rtl"] {
5
5
  // Note: Topbar RTL styles are in _topbar.scss for better specificity
6
6
 
7
7
  // Layout sidebar positioning - move to right side
@@ -104,11 +104,11 @@ html[dir='rtl'] {
104
104
 
105
105
  // Flip navigation arrows
106
106
  .pi-chevron-left::before {
107
- content: '\e901'; // pi-chevron-right icon code
107
+ content: "\e901"; // pi-chevron-right icon code
108
108
  }
109
109
 
110
110
  .pi-chevron-right::before {
111
- content: '\e900'; // pi-chevron-left icon code
111
+ content: "\e900"; // pi-chevron-left icon code
112
112
  }
113
113
 
114
114
  // Calendar grid direction
@@ -364,7 +364,7 @@ html[dir='rtl'] {
364
364
 
365
365
  // Desktop RTL layout adjustments
366
366
  @media (min-width: 992px) {
367
- html[dir='rtl'] {
367
+ html[dir="rtl"] {
368
368
  .layout-wrapper {
369
369
  &.layout-overlay {
370
370
  .layout-main-container {
@@ -423,7 +423,7 @@ html[dir='rtl'] {
423
423
 
424
424
  // Mobile RTL layout adjustments
425
425
  @media (max-width: 991px) {
426
- html[dir='rtl'] {
426
+ html[dir="rtl"] {
427
427
  .layout-wrapper {
428
428
  .layout-main-container {
429
429
  margin-left: 0;
@@ -67,7 +67,7 @@
67
67
  @include focused();
68
68
  }
69
69
 
70
- i {
70
+ ui-icon {
71
71
  font-size: 1.25rem;
72
72
  }
73
73
 
@@ -163,15 +163,16 @@
163
163
 
164
164
  .layout-topbar-action {
165
165
  display: flex;
166
+ align-items: center;
166
167
  width: 100%;
167
168
  height: auto;
168
169
  justify-content: flex-start;
170
+ gap: 0.5rem;
169
171
  border-radius: var(--content-border-radius);
170
172
  padding: 0.5rem 1rem;
171
173
 
172
- i {
174
+ ui-icon {
173
175
  font-size: 1rem;
174
- margin-right: 0.5rem;
175
176
  }
176
177
 
177
178
  span {
@@ -1285,7 +1285,7 @@ class AppCompanyBranchSelector {
1285
1285
  <ui-icon name="building"></ui-icon>
1286
1286
  <span>{{ currentCompanyName() }}</span>
1287
1287
  @if (currentBranchName()) {
1288
- <span class="text-xs opacity-70"> | {{ currentBranchName() }}</span>
1288
+ <span class="text-xs opacity-70 ml-1">| {{ currentBranchName() }}</span>
1289
1289
  }
1290
1290
  </button>
1291
1291
  <div
@@ -1380,7 +1380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1380
1380
  <ui-icon name="building"></ui-icon>
1381
1381
  <span>{{ currentCompanyName() }}</span>
1382
1382
  @if (currentBranchName()) {
1383
- <span class="text-xs opacity-70"> | {{ currentBranchName() }}</span>
1383
+ <span class="text-xs opacity-70 ml-1">| {{ currentBranchName() }}</span>
1384
1384
  }
1385
1385
  </button>
1386
1386
  <div
@@ -1497,7 +1497,7 @@ class AppLauncher {
1497
1497
  style="inset-inline-end: 0; min-width: 16rem; max-width: 22rem; width: calc(100vw - 2rem); box-shadow: var(--f-shadow-xl);"
1498
1498
  >
1499
1499
  <div class="px-4 py-3 border-b border-surface">
1500
- <span class="text-xs font-semibold uppercase tracking-wide text-muted-color">{{
1500
+ <span class="text-xs font-semibold tracking-wide text-muted-color">{{
1501
1501
  'layout.launcher.applications' | translate
1502
1502
  }}</span>
1503
1503
  </div>
@@ -1514,13 +1514,17 @@ class AppLauncher {
1514
1514
  target="_blank"
1515
1515
  rel="noopener noreferrer"
1516
1516
  >
1517
- <div class="flex items-center justify-center w-9 h-9 rounded-border bg-primary/10 group-hover:bg-primary transition-colors duration-150">
1517
+ <div
1518
+ class="flex items-center justify-center w-9 h-9 rounded-border bg-primary/10 group-hover:bg-primary transition-colors duration-150"
1519
+ >
1518
1520
  <ui-icon
1519
1521
  [name]="app.icon"
1520
1522
  class="text-base text-primary group-hover:text-primary-contrast transition-colors duration-150"
1521
1523
  ></ui-icon>
1522
1524
  </div>
1523
- <span class="text-xs text-center text-muted-color group-hover:text-color transition-colors duration-150 truncate w-full text-center leading-tight">
1525
+ <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"
1527
+ >
1524
1528
  {{ app.nameKey ? (app.nameKey | translate) : app.name }}
1525
1529
  </span>
1526
1530
  </a>
@@ -1557,7 +1561,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1557
1561
  style="inset-inline-end: 0; min-width: 16rem; max-width: 22rem; width: calc(100vw - 2rem); box-shadow: var(--f-shadow-xl);"
1558
1562
  >
1559
1563
  <div class="px-4 py-3 border-b border-surface">
1560
- <span class="text-xs font-semibold uppercase tracking-wide text-muted-color">{{
1564
+ <span class="text-xs font-semibold tracking-wide text-muted-color">{{
1561
1565
  'layout.launcher.applications' | translate
1562
1566
  }}</span>
1563
1567
  </div>
@@ -1574,13 +1578,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1574
1578
  target="_blank"
1575
1579
  rel="noopener noreferrer"
1576
1580
  >
1577
- <div class="flex items-center justify-center w-9 h-9 rounded-border bg-primary/10 group-hover:bg-primary transition-colors duration-150">
1581
+ <div
1582
+ class="flex items-center justify-center w-9 h-9 rounded-border bg-primary/10 group-hover:bg-primary transition-colors duration-150"
1583
+ >
1578
1584
  <ui-icon
1579
1585
  [name]="app.icon"
1580
1586
  class="text-base text-primary group-hover:text-primary-contrast transition-colors duration-150"
1581
1587
  ></ui-icon>
1582
1588
  </div>
1583
- <span class="text-xs text-center text-muted-color group-hover:text-color transition-colors duration-150 truncate w-full text-center leading-tight">
1589
+ <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"
1591
+ >
1584
1592
  {{ app.nameKey ? (app.nameKey | translate) : app.name }}
1585
1593
  </span>
1586
1594
  </a>
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-layout.mjs","sources":["../../../projects/ng-layout/utils/apps-filter.util.ts","../../../projects/ng-layout/utils/menu-filter.util.ts","../../../projects/ng-layout/services/layout-persistence.service.ts","../../../projects/ng-layout/services/layout.service.ts","../../../projects/ng-layout/components/app.footer.ts","../../../projects/ng-layout/components/app.configurator.ts","../../../projects/ng-layout/interfaces/layout-auth.interface.ts","../../../projects/ng-layout/components/app.floatingconfigurator.ts","../../../projects/ng-layout/components/app.menuitem.ts","../../../projects/ng-layout/components/app.menu.ts","../../../projects/ng-layout/interfaces/view-transitions.ts","../../../projects/ng-layout/components/top-bar/app.company-branch-selector.ts","../../../projects/ng-layout/components/top-bar/app.launcher.ts","../../../projects/ng-layout/components/top-bar/app.profile.ts","../../../projects/ng-layout/components/top-bar/app.searchbar.ts","../../../projects/ng-layout/components/app.topbar.ts","../../../projects/ng-layout/components/app.sidebar.ts","../../../projects/ng-layout/components/app.layout.ts","../../../projects/ng-layout/utils/theme-preset.util.ts","../../../projects/ng-layout/theme/navy-blue-theme.ts","../../../projects/ng-layout/theme/green-theme.ts","../../../projects/ng-layout/constants/messages.ts","../../../projects/ng-layout/public-api.ts","../../../projects/ng-layout/flusys-ng-layout.ts"],"sourcesContent":["import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { ILauncherApp } from '../interfaces/layout-auth.interface';\n\n/** Filter launcher apps based on user permission codes */\nexport function filterAppsByPermissions(\n apps: ILauncherApp[],\n permissionCodes: string[],\n): ILauncherApp[] {\n return apps.filter(\n (app) =>\n !app.permissionLogic ||\n evaluateLogicNode(app.permissionLogic, permissionCodes),\n );\n}\n","import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { IMenuItem } from '../interfaces/layout-auth.interface';\n\n/**\n * Filter menu items based on permission and role checker\n *\n * @param items - Array of menu items to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role (optional, defaults to always false)\n * @returns Filtered menu items array\n *\n * @example\n * ```typescript\n * const filteredMenu = filterMenuByPermissions(\n * menuItems,\n * (actionCode) => permissionState.hasAction(actionCode)\n * );\n * ```\n */\nexport function filterMenuByPermissions(\n items: IMenuItem[],\n permissionCode: string[],\n): IMenuItem[] {\n return items\n .map((item) => filterMenuItem(item, permissionCode))\n .filter((item): item is IMenuItem => item !== null);\n}\n\n/**\n * Filter a single menu item and its children recursively\n *\n * @param item - Menu item to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role\n * @returns Filtered menu item or null if user doesn't have permission\n */\nfunction filterMenuItem(\n item: IMenuItem,\n permissionCode: string[],\n): IMenuItem | null {\n // Skip separators - they have no permission checks\n if (item.separator) {\n return item;\n }\n\n // Check permission logic tree\n if (item.permissionLogic) {\n const hasAccess = evaluateLogicNode(item.permissionLogic, permissionCode);\n if (!hasAccess) {\n return null; // User doesn't pass permission logic\n }\n }\n\n // Filter child items recursively\n if (item.children && item.children.length > 0) {\n const filteredChildren = filterMenuByPermissions(\n item.children,\n permissionCode,\n );\n\n // If parent has no visible children, hide parent too\n if (filteredChildren.length === 0) {\n return null;\n }\n\n return { ...item, children: filteredChildren };\n }\n\n return item;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { LayoutConfig } from '@flusys/ng-core';\n\nconst STORAGE_KEY = 'flusys.layout.config';\nconst STORAGE_VERSION = 1;\n\ninterface PersistedLayoutConfig extends LayoutConfig {\n _version?: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LayoutPersistenceService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private readonly validPresets = ['Aura', 'Lara', 'Nora'];\n private readonly validMenuModes = ['static', 'overlay', 'topbar'];\n\n load(): LayoutConfig | null {\n if (!this.isBrowser) return null;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return null;\n\n const parsed = JSON.parse(stored) as PersistedLayoutConfig;\n return this.validateConfig(parsed);\n } catch {\n this.clear();\n return null;\n }\n }\n\n save(config: LayoutConfig): void {\n if (!this.isBrowser) return;\n\n try {\n const toStore: PersistedLayoutConfig = {\n ...config,\n _version: STORAGE_VERSION,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(toStore));\n } catch {\n // Silent fail - localStorage may be full or disabled\n }\n }\n\n clear(): void {\n if (!this.isBrowser) return;\n localStorage.removeItem(STORAGE_KEY);\n }\n\n private validateConfig(config: PersistedLayoutConfig): LayoutConfig | null {\n if (config._version && config._version !== STORAGE_VERSION) {\n this.clear();\n return null;\n }\n\n if (config.preset && !this.validPresets.includes(config.preset)) {\n config.preset = 'Aura';\n }\n\n if (config.menuMode && !this.validMenuModes.includes(config.menuMode)) {\n config.menuMode = 'static';\n }\n\n if (typeof config.darkTheme !== 'boolean') {\n config.darkTheme = false;\n }\n\n const { _version, ...cleanConfig } = config;\n return cleanConfig as LayoutConfig;\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n DOCUMENT,\n effect,\n inject,\n Injectable,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n APP_CONFIG,\n DEFAULT_APP_NAME,\n DEFAULT_AUTHOR,\n isCompanyFeatureEnabled,\n LayoutConfig,\n} from '@flusys/ng-core';\nimport { PermissionValidatorService } from '@flusys/ng-shared';\nimport { fromEvent, Subject } from 'rxjs';\n\nconst DESKTOP_BREAKPOINT = 991;\nimport { ILauncherApp, IMenuItem } from '../interfaces/layout-auth.interface';\nimport { DocumentWithViewTransition } from '../interfaces/view-transitions';\nimport { filterAppsByPermissions } from '../utils/apps-filter.util';\nimport { filterMenuByPermissions } from '../utils/menu-filter.util';\nimport { LayoutPersistenceService } from './layout-persistence.service';\n\nexport interface LayoutState {\n staticMenuDesktopInactive?: boolean;\n overlayMenuActive?: boolean;\n configSidebarVisible?: boolean;\n staticMenuMobileActive?: boolean;\n menuHoverActive?: boolean;\n topbarMenuVisible?: boolean;\n}\n\nexport interface MenuChangeEvent {\n key: string;\n routeEvent?: boolean;\n}\n\nexport interface UserProfile {\n id: string;\n name: string;\n email: string;\n profilePictureUrl?: string | null;\n}\n\nexport interface CompanyProfile {\n id: string;\n name: string;\n slug: string;\n logoUrl?: string | null;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LayoutService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly persistence = inject(LayoutPersistenceService);\n private readonly appConfig = inject(APP_CONFIG, { optional: true });\n\n private readonly DEFAULT_CONFIG: LayoutConfig = this.appConfig?.layoutConfig ?? {\n preset: 'Aura',\n primary: 'violet',\n surface: null,\n darkTheme: false,\n menuMode: 'static',\n };\n\n private readonly DEFAULT_STATE: LayoutState = {\n staticMenuDesktopInactive: false,\n overlayMenuActive: false,\n configSidebarVisible: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n topbarMenuVisible: true,\n };\n\n private readonly memorable = this.DEFAULT_CONFIG.isMemorable !== false;\n\n private readonly _layoutConfig = signal<LayoutConfig>({\n ...this.DEFAULT_CONFIG,\n ...(this.memorable ? this.persistence.load() : null),\n });\n private readonly _layoutState = signal<LayoutState>(this.DEFAULT_STATE);\n private readonly _transitionComplete = signal<boolean>(false);\n\n readonly layoutConfig = this._layoutConfig.asReadonly();\n readonly layoutState = this._layoutState.asReadonly();\n readonly transitionComplete = this._transitionComplete.asReadonly();\n\n private readonly _userProfile = signal<UserProfile | null>(null);\n private readonly _companyProfile = signal<CompanyProfile | null>(null);\n private readonly _rawMenu = signal<IMenuItem[]>([]);\n private readonly _rawApps = signal<ILauncherApp[]>([]);\n private readonly permissionValidator = inject(PermissionValidatorService);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly _windowWidth = signal<number>(\n this.isBrowser ? window.innerWidth : DESKTOP_BREAKPOINT + 1,\n );\n\n readonly userProfile = this._userProfile.asReadonly();\n readonly companyProfile = this._companyProfile.asReadonly();\n\n readonly appName = this.appConfig?.appName ?? DEFAULT_APP_NAME;\n readonly appLogo = this.appConfig?.appLogo ?? '';\n readonly isAppLogoSvg = this.appLogo.toLowerCase().endsWith('.svg');\n readonly authorName = this.appConfig?.author?.name ?? DEFAULT_AUTHOR.name;\n readonly authorUrl = this.appConfig?.author?.url ?? DEFAULT_AUTHOR.url;\n\n readonly menu = computed(() =>\n filterMenuByPermissions(\n this._rawMenu(),\n this.permissionValidator.permissions(),\n ),\n );\n readonly apps = computed(() =>\n filterAppsByPermissions(\n this._rawApps(),\n this.permissionValidator.permissions(),\n ),\n );\n readonly hasApps = computed(() => this.apps().length > 0);\n\n readonly isSidebarActive = computed(\n () =>\n this._layoutState().overlayMenuActive ||\n this._layoutState().staticMenuMobileActive,\n );\n readonly isDesktop = computed(() => this._windowWidth() > DESKTOP_BREAKPOINT);\n readonly isMobile = computed(() => !this.isDesktop());\n readonly isDarkTheme = computed(() => this._layoutConfig().darkTheme);\n readonly isOverlay = computed(\n () => this._layoutConfig().menuMode === 'overlay',\n );\n readonly isTopbar = computed(\n () => this._layoutConfig().menuMode === 'topbar',\n );\n\n readonly userName = computed(() => this._userProfile()?.name ?? 'Guest');\n readonly userEmail = computed(() => this._userProfile()?.email ?? '');\n readonly userProfilePictureUrl = computed(\n () => this._userProfile()?.profilePictureUrl ?? null,\n );\n readonly companyLogoUrl = computed(\n () => this._companyProfile()?.logoUrl ?? null,\n );\n readonly isAuthenticated = computed(() => !!this._userProfile());\n readonly companyName = computed(() => {\n if (!this.appConfig || !isCompanyFeatureEnabled(this.appConfig))\n return this.appName;\n return this._companyProfile()?.name ?? this.appName;\n });\n readonly displayLogo = computed(() => this.companyLogoUrl() ?? this.appLogo);\n readonly isDisplayLogoSvg = computed(() =>\n this.displayLogo().toLowerCase().endsWith('.svg'),\n );\n\n private readonly overlayOpen = new Subject<void>();\n private readonly menuSource = new Subject<MenuChangeEvent>();\n private readonly resetSource = new Subject<boolean>();\n\n readonly menuSource$ = this.menuSource.asObservable();\n readonly resetSource$ = this.resetSource.asObservable();\n readonly overlayOpen$ = this.overlayOpen.asObservable();\n\n private initialized = false;\n\n constructor() {\n if (this.isBrowser) {\n this.toggleDarkMode();\n\n fromEvent(window, 'resize')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this._windowWidth.set(window.innerWidth);\n });\n }\n\n effect(() => {\n const config = this._layoutConfig();\n\n if (this.initialized) {\n this.handleDarkModeTransition(config);\n if (this.memorable) this.persistence.save(config);\n }\n this.initialized = true;\n });\n }\n\n toggleDarkMode(config?: LayoutConfig): void {\n const isDark = (config ?? this._layoutConfig()).darkTheme;\n this.document.documentElement.classList.toggle('app-dark', isDark);\n }\n\n private handleDarkModeTransition(config: LayoutConfig): void {\n const doc = this.document as DocumentWithViewTransition;\n if (\n 'startViewTransition' in doc &&\n typeof doc.startViewTransition === 'function'\n ) {\n doc\n .startViewTransition(() => this.toggleDarkMode(config))\n .ready.then(() => this.onTransitionEnd())\n .catch(() => {});\n } else {\n this.toggleDarkMode(config);\n this.onTransitionEnd();\n }\n }\n\n private onTransitionEnd(): void {\n this._transitionComplete.set(true);\n setTimeout(() => this._transitionComplete.set(false));\n }\n\n onMenuToggle(): void {\n const state = this._layoutState();\n\n // Desktop topbar mode: toggle topbar nav visibility\n if (this.isDesktop() && this.isTopbar()) {\n this._layoutState.update((prev) => ({\n ...prev,\n topbarMenuVisible: !prev.topbarMenuVisible,\n }));\n return;\n }\n\n // Mobile always uses staticMenuMobileActive regardless of menu mode\n if (!this.isDesktop()) {\n const newMobileActive = !state.staticMenuMobileActive;\n this._layoutState.update((prev) => ({\n ...prev,\n staticMenuMobileActive: newMobileActive,\n }));\n if (newMobileActive) this.overlayOpen.next();\n return;\n }\n\n // Desktop: use overlay or static mode\n if (this.isOverlay()) {\n const newOverlayActive = !state.overlayMenuActive;\n this._layoutState.update((prev) => ({\n ...prev,\n overlayMenuActive: newOverlayActive,\n }));\n if (newOverlayActive) this.overlayOpen.next();\n } else {\n this._layoutState.update((prev) => ({\n ...prev,\n staticMenuDesktopInactive: !state.staticMenuDesktopInactive,\n }));\n }\n }\n\n onMenuStateChange(event: MenuChangeEvent): void {\n this.menuSource.next(event);\n }\n\n reset(): void {\n this.resetSource.next(true);\n }\n\n updateLayoutConfig(config: Partial<LayoutConfig>): void {\n this._layoutConfig.update((prev) => ({ ...prev, ...config }));\n }\n\n updateLayoutState(state: Partial<LayoutState>): void {\n this._layoutState.update((prev) => ({ ...prev, ...state }));\n }\n\n setUserProfile(profile: UserProfile | null): void {\n this._userProfile.set(profile);\n }\n\n setCompanyProfile(profile: CompanyProfile | null): void {\n this._companyProfile.set(profile);\n }\n\n setMenu(items: IMenuItem[]): void {\n this._rawMenu.set(items);\n }\n\n clearMenu(): void {\n this._rawMenu.set([]);\n }\n\n setApps(apps: ILauncherApp[]): void {\n this._rawApps.set(apps);\n }\n\n clearApps(): void {\n this._rawApps.set([]);\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { InlineSvgComponent, TranslatePipe } from '@flusys/ng-shared';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-footer',\n imports: [TranslatePipe, InlineSvgComponent],\n template: `<div class=\"layout-footer\">\n @if (displayLogo) {\n @if (isLogoSvg) {\n <inline-svg [src]=\"displayLogo\" class=\"logo-image\" />\n } @else {\n <img [src]=\"displayLogo\" [alt]=\"appName\" class=\"logo-image\" />\n }\n }\n <span class=\"hidden sm:inline\">\n {{ appName }} {{ 'layout.footer.by' | translate }}\n <a\n [href]=\"authorUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-primary font-bold hover:underline\"\n >{{ authorName }}</a\n >\n </span>\n </div>`,\n})\nexport class AppFooter {\n private readonly layoutService = inject(LayoutService);\n\n readonly appName = this.layoutService.appName;\n readonly displayLogo = this.layoutService.appLogo;\n readonly isLogoSvg = this.layoutService.isAppLogoSvg;\n readonly authorName = this.layoutService.authorName;\n readonly authorUrl = this.layoutService.authorUrl;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { TranslatePipe, TranslateService } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport {\n applyPrimaryPalette,\n applySurfacePalette,\n applyTheme,\n PRIMARY_PALETTES,\n SURFACE_PALETTES,\n PRESET_NAMES,\n PresetName,\n} from '@flusys/ng-ui';\nimport { LayoutService } from '../services/public-api';\n\ndeclare type SurfacesType = {\n name?: string;\n palette?: {\n 0?: string;\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n 950?: string;\n };\n};\n\n@Component({\n selector: 'app-configurator',\n imports: [UiModule, FormsModule, TranslatePipe],\n template: `\n <div class=\"flex flex-col gap-4\">\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.primary' | translate\n }}</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (primaryColor of primaryColors(); track primaryColor.name) {\n <button\n type=\"button\"\n [title]=\"primaryColor.name\"\n (click)=\"updateColors($event, 'primary', primaryColor)\"\n [class.outline-primary]=\"primaryColor.name === selectedPrimaryColor()\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style.background-color]=\"\n primaryColor?.name === 'noir'\n ? 'var(--f-text-color)'\n : primaryColor?.palette?.['500']\n \"\n ></button>\n }\n </div>\n </div>\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.surface' | translate\n }}</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (surface of surfaces; track surface.name) {\n <button\n type=\"button\"\n [title]=\"surface.name\"\n (click)=\"updateColors($event, 'surface', surface)\"\n [class.outline-primary]=\"isSurfaceSelected(surface.name)\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style.background-color]=\"\n surface?.name === 'noir'\n ? 'var(--f-text-color)'\n : surface?.palette?.['500']\n \"\n ></button>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.presets' | translate\n }}</span>\n <f-selectbutton\n [options]=\"presets\"\n [ngModel]=\"selectedPreset()\"\n (ngModelChange)=\"onPresetChange($event)\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n @if (showMenuModeButton()) {\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.menu.mode' | translate\n }}</span>\n <f-selectbutton\n [ngModel]=\"menuMode()\"\n (ngModelChange)=\"onMenuModeChange($event)\"\n [options]=\"menuModeOptions()\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n }\n </div>\n `,\n host: {\n class:\n 'hidden absolute top-[3.25rem] w-[calc(100vw-2rem)] sm:w-72 max-w-72 p-4 border border-surface rounded-border origin-top shadow-xl',\n style: 'background-color: var(--surface-overlay); inset-inline-end: 0;',\n },\n})\nexport class AppConfigurator {\n private readonly router = inject(Router);\n private readonly translateAdapter = inject(TranslateService, { optional: true });\n private readonly platformId = inject(PLATFORM_ID);\n readonly layoutService = inject(LayoutService);\n\n readonly presets: PresetName[] = PRESET_NAMES;\n readonly showMenuModeButton = signal(!this.router.url.includes('auth'));\n\n readonly menuModeOptions = computed(() => {\n const options: Array<{ label: string; value: 'static' | 'overlay' | 'topbar' }> = [\n { label: this.translate('layout.configurator.menu.mode.static'), value: 'static' },\n { label: this.translate('layout.configurator.menu.mode.overlay'), value: 'overlay' },\n ];\n if (this.layoutService.isDesktop()) {\n options.push({ label: this.translate('layout.configurator.menu.mode.topbar'), value: 'topbar' });\n }\n return options;\n });\n\n constructor() {\n if (isPlatformBrowser(this.platformId)) {\n effect(() => {\n const config = this.layoutService.layoutConfig();\n applyTheme({\n preset: (config.preset ?? 'Aura') as PresetName,\n primary: config.primary ?? 'violet',\n surface: config.surface ?? null,\n darkTheme: config.darkTheme ?? false,\n });\n });\n }\n }\n\n readonly surfaces: SurfacesType[] = Object.entries(SURFACE_PALETTES).map(([name, pal]) => ({\n name,\n palette: pal as SurfacesType['palette'],\n }));\n\n readonly selectedPrimaryColor = computed(() => this.layoutService.layoutConfig().primary);\n readonly selectedSurfaceColor = computed(() => this.layoutService.layoutConfig().surface);\n\n isSurfaceSelected(surfaceName: string | undefined): boolean {\n const sel = this.selectedSurfaceColor();\n if (sel) return sel === surfaceName;\n const isDark = this.layoutService.layoutConfig().darkTheme;\n return isDark ? surfaceName === 'zinc' : surfaceName === 'slate';\n }\n\n readonly selectedPreset = computed(() => this.layoutService.layoutConfig().preset);\n readonly menuMode = computed(() => this.layoutService.layoutConfig().menuMode);\n\n readonly primaryColors = computed<SurfacesType[]>(() => {\n const palettes: SurfacesType[] = [{ name: 'noir', palette: {} }];\n for (const [name, pal] of Object.entries(PRIMARY_PALETTES)) {\n palettes.push({ name, palette: pal as SurfacesType['palette'] });\n }\n return palettes;\n });\n\n updateColors(event: MouseEvent, type: string, color: SurfacesType): void {\n if (type === 'primary') {\n this.layoutService.updateLayoutConfig({ primary: color.name });\n } else if (type === 'surface') {\n this.layoutService.updateLayoutConfig({ surface: color.name });\n }\n this._applyColorChange(type, color);\n event.stopPropagation();\n }\n\n private _applyColorChange(type: string, color: SurfacesType): void {\n const isDark = this.layoutService.layoutConfig().darkTheme ?? false;\n if (type === 'primary') {\n const primary = color.name ?? 'violet';\n const pal = primary === 'noir'\n ? Object.fromEntries(Object.entries(SURFACE_PALETTES['slate']).map(([k, v]) => [k, v])) as Record<string, string>\n : PRIMARY_PALETTES[primary] as unknown as Record<string, string>;\n if (pal) applyPrimaryPalette(pal as Parameters<typeof applyPrimaryPalette>[0], isDark);\n } else if (type === 'surface') {\n const surfacePal = SURFACE_PALETTES[color.name ?? 'slate'];\n if (surfacePal) applySurfacePalette(surfacePal);\n }\n }\n\n onPresetChange(event: string): void {\n this.layoutService.updateLayoutConfig({ preset: event });\n const isDark = this.layoutService.layoutConfig().darkTheme ?? false;\n const primary = this.layoutService.layoutConfig().primary ?? 'violet';\n const surface = this.layoutService.layoutConfig().surface ?? null;\n applyTheme({ preset: event as PresetName, primary, surface, darkTheme: isDark });\n }\n\n onMenuModeChange(event: 'static' | 'overlay' | 'topbar'): void {\n this.layoutService.updateLayoutConfig({ menuMode: event });\n }\n\n private translate(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\n}\n","import { InjectionToken, Signal, Type } from '@angular/core';\nimport type { IconTypeEnum, ILogicNode } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\n\nexport interface ILauncherApp {\n id: string;\n /** Display name (use nameKey for localization instead) */\n name?: string;\n /** Translation key for the name - preferred over name for localization */\n nameKey?: string;\n iconType?: IconTypeEnum;\n icon: string;\n url: string;\n /** Optional permission logic - if set, app only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ICompanyInfo {\n id: string;\n name: string;\n slug: string;\n imageId: string;\n}\n\nexport interface IBranchInfo {\n id: string;\n name: string;\n slug: string;\n imageId?: string;\n}\n\nexport interface IUserInfo {\n id: string;\n name: string;\n email: string;\n profilePicture?: { url: string } | null;\n}\n\nexport interface IMenuItem {\n id?: string;\n /** Display label (use labelKey for localization instead) */\n label?: string;\n /** Translation key for the label - preferred over label for localization */\n labelKey?: string;\n icon?: string;\n iconType?: number;\n routerLink?: string[];\n children?: IMenuItem[];\n parent?: { id: string } | null;\n separator?: boolean;\n /** Optional permission logic - if set, item only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ILayoutAuthState {\n currentCompanyInfo: Signal<ICompanyInfo | null>;\n currentBranchInfo: Signal<IBranchInfo | null>;\n loginUserData: Signal<IUserInfo | null>;\n}\n\nexport interface ILayoutAuthApi {\n logOut(): Observable<unknown>;\n navigateLogin(withUrl?: boolean): void;\n switchCompany(companyId: string, branchId: string): Observable<unknown>;\n getUserCompanies(): Observable<ICompanyInfo[]>;\n getCompanyBranches(companyId: string): Observable<IBranchInfo[]>;\n}\n\nexport const LAYOUT_AUTH_STATE = new InjectionToken<ILayoutAuthState>(\n 'LAYOUT_AUTH_STATE',\n);\n\nexport const LAYOUT_AUTH_API = new InjectionToken<ILayoutAuthApi>(\n 'LAYOUT_AUTH_API',\n);\n\nexport const LAYOUT_NOTIFICATION_BELL = new InjectionToken<Type<unknown>>(\n 'LAYOUT_NOTIFICATION_BELL',\n);\n\nexport const LAYOUT_LANGUAGE_SELECTOR = new InjectionToken<Type<unknown>>(\n 'LAYOUT_LANGUAGE_SELECTOR',\n);\n\nexport const LAYOUT_LANGUAGE_SELECTOR_PANEL = new InjectionToken<Type<unknown>>(\n 'LAYOUT_LANGUAGE_SELECTOR_PANEL',\n);\n\nexport const LAYOUT_SEARCHBAR = new InjectionToken<Type<unknown>>(\n 'LAYOUT_SEARCHBAR',\n);\n\nexport const LAYOUT_IS_RTL = new InjectionToken<Signal<boolean>>(\n 'LAYOUT_IS_RTL',\n);\n\nexport interface ISearchSuggestion {\n label: string;\n icon?: string;\n routerLink?: string[];\n data?: unknown;\n}\n\nexport interface ISearchAdapter {\n getSuggestions(query: string): Observable<ISearchSuggestion[]>;\n onSearch?(query: string): void;\n}\n\nexport const LAYOUT_SEARCH_ADAPTER = new InjectionToken<ISearchAdapter>(\n 'LAYOUT_SEARCH_ADAPTER',\n);\n","import { NgComponentOutlet } from '@angular/common';\nimport { UiModule } from '@flusys/ng-ui';\nimport { Component, computed, inject } from '@angular/core';\nimport { LAYOUT_LANGUAGE_SELECTOR_PANEL } from '../interfaces/layout-auth.interface';\nimport { LayoutService } from '../services/public-api';\nimport { AppConfigurator } from './app.configurator';\n\n@Component({\n selector: 'app-floating-configurator',\n imports: [NgComponentOutlet, UiModule, AppConfigurator],\n template: `\n <div\n class=\"floating-configurator fixed flex flex-col md:flex-row gap-2 md:gap-4 top-4 md:top-8 z-50\"\n >\n <button\n fButton\n type=\"button\"\n (click)=\"toggleDarkMode()\"\n [rounded]=\"true\"\n severity=\"secondary\"\n >\n <ui-icon pButtonIcon [name]=\"isDarkTheme() ? 'moon' : 'sun'\"></ui-icon>\n </button>\n @if (languageSelectorPanel) {\n <div class=\"relative\">\n <button\n fButton\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n type=\"button\"\n rounded\n >\n <ui-icon pButtonIcon name=\"globe\"></ui-icon>\n </button>\n <ng-container *ngComponentOutlet=\"languageSelectorPanel\" />\n </div>\n }\n <div class=\"relative\">\n <button\n fButton\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n type=\"button\"\n rounded\n >\n <ui-icon pButtonIcon name=\"palette\"></ui-icon>\n </button>\n <app-configurator />\n </div>\n </div>\n `,\n styles: `\n .floating-configurator {\n inset-inline-end: 0.5rem;\n }\n @media (min-width: 768px) {\n .floating-configurator {\n inset-inline-end: 2rem;\n }\n }\n `,\n})\nexport class AppFloatingConfigurator {\n private readonly layoutService = inject(LayoutService);\n readonly languageSelectorPanel = inject(LAYOUT_LANGUAGE_SELECTOR_PANEL, {\n optional: true,\n });\n\n readonly isDarkTheme = computed(\n () => this.layoutService.layoutConfig().darkTheme,\n );\n\n toggleDarkMode(): void {\n const currentDarkTheme = this.layoutService.layoutConfig().darkTheme;\n this.layoutService.updateLayoutConfig({ darkTheme: !currentDarkTheme });\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n isActive as isRouteActive,\n NavigationEnd,\n Router,\n RouterModule,\n} from '@angular/router';\nimport { IconComponent, TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { filter } from 'rxjs/operators';\nimport { IMenuItem } from '../interfaces/public-api';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: '[app-menuitem]',\n imports: [UiModule, IconComponent, RouterModule, TranslatePipe],\n template: `\n <ng-container>\n @if (item().children?.length) {\n <a\n (click)=\"itemClick()\"\n (mouseenter)=\"onMouseEnter()\"\n #parentLink\n tabindex=\"0\"\n >\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{\n item().labelKey ? (item().labelKey! | translate) : item().label\n }}</span>\n @if (item().children) {\n @if (layoutService.isTopbar()) {\n <ui-icon name=\"chevron-right\" class=\"layout-submenu-toggler\"></ui-icon>\n } @else {\n <ui-icon name=\"angle-down\" class=\"layout-submenu-toggler\"></ui-icon>\n }\n }\n </a>\n }\n @if (item().routerLink && !item().children?.length) {\n <a\n (click)=\"itemClick()\"\n [routerLink]=\"routerLink()\"\n routerLinkActive=\"active-route\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n tabindex=\"0\"\n >\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{\n item().labelKey ? (item().labelKey! | translate) : item().label\n }}</span>\n </a>\n }\n @if (item().children) {\n <ul\n (mouseenter)=\"onMouseEnter()\"\n [class.submenu-expanded]=\"active() && !layoutService.isTopbar()\"\n [class.submenu-collapsed]=\"!active() && !layoutService.isTopbar()\"\n >\n @for (\n child of item().children;\n track 'menu' + child.id + '' + i;\n let i = $index\n ) {\n <li\n app-menuitem\n [item]=\"child\"\n [index]=\"i\"\n [parentKey]=\"key()\"\n ></li>\n }\n </ul>\n }\n </ng-container>\n `,\n styles: `\n :host ul {\n overflow: hidden;\n transition: max-height 400ms cubic-bezier(0.86, 0, 0.07, 1);\n }\n :host ul.submenu-collapsed {\n max-height: 0;\n }\n :host ul.submenu-expanded {\n max-height: 1000px;\n }\n `,\n host: {\n '[class.active-menuitem]': 'active()',\n },\n})\nexport class AppMenuitem {\n // Signal inputs\n readonly item = input.required<IMenuItem>();\n readonly index = input.required<number>();\n readonly parentKey = input<string>('');\n\n // Injected services\n private readonly router = inject(Router);\n readonly layoutService = inject(LayoutService);\n private readonly destroyRef = inject(DestroyRef);\n\n // View references\n private readonly parentLink =\n viewChild<ElementRef<HTMLElement>>('parentLink');\n\n // State signals - private writable + public readonly pattern\n private readonly _active = signal(false);\n readonly active = this._active.asReadonly();\n\n // Computed signals\n readonly key = computed(() => {\n const parent = this.parentKey();\n return parent ? `${parent}-${this.index()}` : String(this.index());\n });\n\n readonly routerLink = computed(() => {\n const menuItem = this.item();\n return menuItem.routerLink ?? [];\n });\n\n // Computed options for routerLinkActive - use 'exact' for root, 'subset' for others\n readonly routerLinkActiveOptions = computed(() => {\n const link = this.routerLink();\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n return {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n } as const;\n });\n\n constructor() {\n // Subscribe to menu source changes\n this.layoutService.menuSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n Promise.resolve(null).then(() => {\n const currentKey = this.key();\n if (value.routeEvent) {\n this._active.set(\n value.key === currentKey ||\n value.key?.startsWith(currentKey + '-'),\n );\n } else if (\n value.key !== currentKey &&\n !value.key?.startsWith(currentKey + '-')\n ) {\n this._active.set(false);\n }\n });\n });\n\n // Subscribe to menu reset\n this.layoutService.resetSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this._active.set(false));\n\n // Subscribe to navigation events\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n if (this.item().routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n\n // Effect to update active state on init when item has routerLink\n effect(() => {\n const menuItem = this.item();\n if (menuItem.routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n\n // Effect to update submenu position when active in topbar mode\n effect(() => {\n if (this.active() && this.parentLink()) {\n Promise.resolve().then(() => this.updateSubmenuPosition());\n }\n });\n }\n\n onMouseEnter(): void {\n if (this.layoutService.isTopbar() && this.item().children) {\n this.updateSubmenuPosition();\n }\n }\n\n private updateSubmenuPosition(): void {\n const linkEl = this.parentLink()?.nativeElement;\n if (!linkEl || typeof linkEl.getBoundingClientRect !== 'function') return;\n\n const rect = linkEl.getBoundingClientRect();\n const hostEl = linkEl.closest('[app-menuitem]');\n if (!hostEl) return;\n\n // Position submenu to the left of the parent link and above it\n const left = rect.left;\n const top = rect.top + 30; // 8px gap above the menu item\n\n (hostEl as HTMLElement).style.setProperty('--submenu-left', `${left}px`);\n (hostEl as HTMLElement).style.setProperty('--submenu-top', `${top}px`);\n }\n\n private updateActiveStateFromRoute(): void {\n const link = this.routerLink();\n if (!link.length) return;\n\n // Use 'exact' for root path to avoid matching all routes\n // Use 'subset' for all other paths to match child routes\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n\n const active = isRouteActive(link[0], this.router, {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n })();\n\n if (active) {\n this.layoutService.onMenuStateChange({\n key: this.key(),\n routeEvent: true,\n });\n }\n }\n\n itemClick(): void {\n if (this.item().children && !this.layoutService.isTopbar()) {\n this._active.update((prev) => !prev);\n }\n this.layoutService.onMenuStateChange({ key: this.key() });\n }\n}\n","import { Component, inject } from '@angular/core';\n\nimport { RouterModule } from '@angular/router';\nimport { LayoutService } from '../services/layout.service';\nimport { AppMenuitem } from './app.menuitem';\n\n/**\n * Main menu component that displays filtered menu items.\n * Menu is automatically filtered based on user permissions using the permission checker (logicNode pattern).\n * The filtering happens internally in LayoutService via computed signal.\n */\n@Component({\n selector: 'app-menu',\n imports: [AppMenuitem, RouterModule],\n template: `<div class=\"layout-menu\">\n <ul>\n @for (\n item of menuItems();\n track 'menu' + item.id + '' + i;\n let i = $index\n ) {\n <li app-menuitem [item]=\"item\" [index]=\"i\"></li>\n }\n </ul>\n </div>`,\n})\nexport class AppMenu {\n private readonly layoutService = inject(LayoutService);\n\n /**\n * Filtered menu items from layout service.\n * This signal is computed in LayoutService and automatically updates when:\n * - Raw menu changes (setMenu called)\n * - Permission state changes (user permissions updated)\n */\n readonly menuItems = this.layoutService.menu;\n}\n","/**\n * View Transitions API type definitions\n * @see https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API\n */\n\nexport interface ViewTransition {\n /** Promise fulfilled when the transition animation is complete */\n finished: Promise<void>;\n /** Promise fulfilled when the pseudo-element tree is ready */\n ready: Promise<void>;\n /** Promise fulfilled when the callback finishes */\n updateCallbackDone: Promise<void>;\n /** Skip the transition animation */\n skipTransition(): void;\n}\n\n/**\n * Extended Document interface with View Transitions API support.\n * Uses the native Document type with startViewTransition which is now\n * part of the standard TypeScript DOM library.\n */\nexport type DocumentWithViewTransition = Document;\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MessageService } from '@flusys/ng-ui';\nimport { UiModule } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type { IBranchInfo, ICompanyInfo } from '../../interfaces/public-api';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\n\n/** Company/branch switcher displayed in top bar */\n@Component({\n selector: 'app-company-branch-selector',\n imports: [UiModule, AngularModule,\n TranslatePipe,],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"onPanelToggle()\"\n >\n <ui-icon name=\"building\"></ui-icon>\n <span>{{ currentCompanyName() }}</span>\n @if (currentBranchName()) {\n <span class=\"text-xs opacity-70\"> | {{ currentBranchName() }}</span>\n }\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-xl w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[300px] max-w-[360px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\"\n >\n <div class=\"flex flex-col gap-4\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.company.branch.selector.title' | translate\n }}</span>\n\n <!-- Company Selector -->\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">{{\n 'shared.company' | translate\n }}</label>\n <f-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"onCompanyChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'layout.company.branch.selector.select.company' | translate\n \"\n class=\"w-full\"\n [loading]=\"isLoadingCompanies()\"\n />\n </div>\n\n <!-- Branch Selector -->\n @if (selectedCompanyId() && branches().length > 0) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.company.branch.selector.branch' | translate\n }}</label>\n <f-select\n [options]=\"branches()\"\n [ngModel]=\"selectedBranchId()\"\n (ngModelChange)=\"onBranchChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'layout.company.branch.selector.select.branch' | translate\n \"\n class=\"w-full\"\n [loading]=\"isLoadingBranches()\"\n />\n </div>\n }\n\n <!-- Actions -->\n <div class=\"flex gap-2 pt-2\">\n <button\n fButton\n class=\"flex-1\"\n [disabled]=\"!canSwitch() || isSwitching()\"\n (click)=\"onSwitch()\"\n >\n @if (isSwitching()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"sync\"></ui-icon>\n }\n <span pButtonLabel>{{ 'layout.company.branch.selector.switch.button' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n `,\n})\nexport class AppCompanyBranchSelector {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n readonly currentCompanyName = computed(\n () =>\n this.authState?.currentCompanyInfo()?.name ??\n this.translate('layout.company.branch.selector.no.company'),\n );\n readonly currentBranchName = computed(\n () => this.authState?.currentBranchInfo()?.name ?? null,\n );\n\n private readonly _companies = signal<ICompanyInfo[]>([]);\n readonly companies = this._companies.asReadonly();\n private readonly _branches = signal<IBranchInfo[]>([]);\n readonly branches = this._branches.asReadonly();\n private readonly _selectedCompanyId = signal<string | null>(null);\n readonly selectedCompanyId = this._selectedCompanyId.asReadonly();\n private readonly _selectedBranchId = signal<string | null>(null);\n readonly selectedBranchId = this._selectedBranchId.asReadonly();\n private readonly _isLoadingCompanies = signal(false);\n readonly isLoadingCompanies = this._isLoadingCompanies.asReadonly();\n private readonly _isLoadingBranches = signal(false);\n readonly isLoadingBranches = this._isLoadingBranches.asReadonly();\n private readonly _isSwitching = signal(false);\n readonly isSwitching = this._isSwitching.asReadonly();\n\n readonly canSwitch = computed(() => {\n const selectedCompany = this.selectedCompanyId();\n if (!selectedCompany) return false;\n\n const currentCompanyId = this.authState?.currentCompanyInfo()?.id;\n const currentBranchId = this.authState?.currentBranchInfo()?.id;\n const selectedBranch = this.selectedBranchId();\n\n return (\n selectedCompany !== currentCompanyId || selectedBranch !== currentBranchId\n );\n });\n\n onPanelToggle(): void {\n this._isActive.update((v) => !v);\n if (this.isActive() && this.companies().length === 0) {\n this.loadCompanies();\n }\n }\n\n private loadCompanies(): void {\n if (!this.authApi) return;\n\n this._isLoadingCompanies.set(true);\n this.authApi\n .getUserCompanies()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (companies) => {\n this._companies.set(companies);\n this._isLoadingCompanies.set(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n this._isLoadingCompanies.set(false);\n },\n });\n }\n\n onCompanyChange(companyId: string | null): void {\n this._selectedCompanyId.set(companyId);\n\n if (!companyId) {\n this._branches.set([]);\n this._selectedBranchId.set(null);\n return;\n }\n\n this.loadBranches(companyId);\n }\n\n onBranchChange(branchId: string | null): void {\n this._selectedBranchId.set(branchId);\n }\n\n private loadBranches(companyId: string): void {\n if (!this.authApi) return;\n\n this._isLoadingBranches.set(true);\n this._selectedBranchId.set(null);\n\n this.authApi\n .getCompanyBranches(companyId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (branches) => {\n this._branches.set(branches);\n this._isLoadingBranches.set(false);\n\n // Auto-select if only one branch available\n if (branches.length === 1) {\n this._selectedBranchId.set(branches[0].id);\n }\n },\n error: () => {\n // Error toast handled by global interceptor\n this._isLoadingBranches.set(false);\n },\n });\n }\n\n onSwitch(): void {\n const selectedCompany = this.selectedCompanyId();\n const selectedBranch = this.selectedBranchId();\n\n if (!this.authApi || !selectedCompany) return;\n\n if (this.branches().length > 0 && !selectedBranch) {\n this.messageService.add({\n severity: 'warn',\n summary: this.translate(\n 'layout.company.branch.selector.branch.required',\n ),\n detail: this.translate(\n 'layout.company.branch.selector.please.select.branch',\n ),\n });\n return;\n }\n\n this._isSwitching.set(true);\n\n this.authApi\n .switchCompany(selectedCompany, selectedBranch || '')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {},\n error: () => {\n // Error toast handled by global interceptor\n this._isSwitching.set(false);\n },\n });\n }\n\n private translate(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-launcher',\n imports: [UiModule, TranslatePipe],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"toggleActive()\"\n >\n <ui-icon name=\"th-large\"></ui-icon>\n <span>{{ 'layout.launcher.apps' | translate }}</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 border border-surface rounded-border origin-top surface-overlay\"\n style=\"inset-inline-end: 0; min-width: 16rem; max-width: 22rem; width: calc(100vw - 2rem); box-shadow: var(--f-shadow-xl);\"\n >\n <div class=\"px-4 py-3 border-b border-surface\">\n <span class=\"text-xs font-semibold uppercase tracking-wide text-muted-color\">{{\n 'layout.launcher.applications' | translate\n }}</span>\n </div>\n @if (layoutService.apps().length === 0) {\n <div class=\"px-4 py-6 text-center text-muted-color text-sm\">\n {{ 'layout.launcher.no.apps' | translate }}\n </div>\n } @else {\n <div class=\"p-3 grid grid-cols-3 gap-1\">\n @for (app of layoutService.apps(); track app.id) {\n <a\n class=\"group flex flex-col items-center gap-2 p-3 rounded-border cursor-pointer no-underline transition-colors duration-150 hover:bg-emphasis\"\n [href]=\"app.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <div class=\"flex items-center justify-center w-9 h-9 rounded-border bg-primary/10 group-hover:bg-primary transition-colors duration-150\">\n <ui-icon\n [name]=\"app.icon\"\n class=\"text-base text-primary group-hover:text-primary-contrast transition-colors duration-150\"\n ></ui-icon>\n </div>\n <span class=\"text-xs text-center text-muted-color group-hover:text-color transition-colors duration-150 truncate w-full text-center leading-tight\">\n {{ app.nameKey ? (app.nameKey | translate) : app.name }}\n </span>\n </a>\n }\n </div>\n }\n </div>\n `,\n})\nexport class AppLauncher {\n readonly layoutService = inject(LayoutService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n toggleActive(): void {\n this._isActive.update((v) => !v);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { APP_CONFIG, isSignUpEnabled } from '@flusys/ng-core';\nimport { MessageService } from '@flusys/ng-ui';\nimport { UiModule } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-profile',\n imports: [UiModule, AngularModule, TranslatePipe],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\"\n >\n <ui-icon name=\"user\"></ui-icon>\n <span>{{ 'layout.profile.title' | translate }}</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-xl w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\"\n >\n <div class=\"flex flex-col gap-3\">\n <!-- User Info -->\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline hover:bg-emphasis transition-all duration-200\"\n routerLink=\"/profile\"\n >\n @if (profilePicture()) {\n <img\n [src]=\"profilePicture()\"\n class=\"w-12 h-12 rounded-border object-cover\"\n [alt]=\"'layout.profile.profile.picture.alt' | translate\"\n />\n } @else {\n <div\n class=\"w-12 h-12 rounded-border bg-primary flex items-center justify-center\"\n >\n <ui-icon name=\"user\" class=\"text-xl text-primary-contrast\"></ui-icon>\n </div>\n }\n <div class=\"flex flex-col min-w-0 flex-1\">\n <span class=\"font-semibold text-color truncate\">{{\n userName()\n }}</span>\n <span class=\"text-sm text-muted-color truncate\">{{\n userEmail()\n }}</span>\n </div>\n </a>\n\n <!-- Divider -->\n <div class=\"border-t border-surface\"></div>\n\n <!-- Menu Items -->\n <div class=\"flex flex-col gap-1\">\n @if (signUpEnabled()) {\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"copySignUpLink()\"\n >\n <ui-icon name=\"link\" class=\"text-muted-color\"></ui-icon>\n <span>{{ 'layout.profile.copy.sign.up.link' | translate }}</span>\n </a>\n }\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"logout()\"\n >\n <ui-icon name=\"sign-out\" class=\"text-muted-color\"></ui-icon>\n <span>{{ 'layout.profile.logout' | translate }}</span>\n </a>\n </div>\n </div>\n </div>\n `,\n})\nexport class AppProfile {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly layoutService = inject(LayoutService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly appConfig = inject(APP_CONFIG, { optional: true });\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this._isActive.update((v) => !v);\n }\n\n readonly userName = computed(\n () =>\n this.authState?.loginUserData()?.name ??\n this.translate('layout.profile.guest'),\n );\n readonly userEmail = computed(\n () => this.authState?.loginUserData()?.email ?? '',\n );\n readonly profilePicture = computed(\n () => this.layoutService.userProfilePictureUrl() ?? '',\n );\n readonly signUpEnabled = computed(() =>\n this.appConfig ? isSignUpEnabled(this.appConfig) : false,\n );\n\n logout(): void {\n if (!this.authApi) return;\n\n this.authApi\n .logOut()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (result) => {\n const r = result as unknown as {\n messageKey?: string;\n messageVariables?: Record<string, string | number>;\n message?: string;\n };\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: r?.messageKey\n ? this.translate(r.messageKey, r.messageVariables)\n : (r?.message ?? ''),\n });\n this.authApi?.navigateLogin(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n },\n });\n }\n\n copySignUpLink(): void {\n const slug = this.authState?.currentCompanyInfo()?.slug ?? '';\n const signUpLink = `${window.location.origin}/auth/register?companySlug=${slug}`;\n navigator.clipboard\n .writeText(signUpLink)\n .then(() => {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('layout.profile.link.copied'),\n detail: this.translate('layout.profile.sign.up.link.copied'),\n });\n })\n .catch(() => {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.error'),\n detail: this.translate('layout.profile.failed.copy.sign.up.link'),\n });\n });\n }\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { AngularModule, TranslatePipe } from '@flusys/ng-shared';\nimport { fromEvent } from 'rxjs';\nimport {\n ISearchSuggestion,\n LAYOUT_SEARCH_ADAPTER,\n} from '../../interfaces/layout-auth.interface';\nimport { LayoutService } from '../../services/public-api';\nimport { UiModule } from '@flusys/ng-ui';\n\n@Component({\n selector: 'app-searchbar',\n imports: [UiModule, AngularModule, TranslatePipe],\n template: `\n <div\n class=\"search-container h-full\"\n #searchWrapper\n [class.topbar-mode]=\"layoutService.isTopbar() || isResponsive()\"\n >\n @if (layoutService.isTopbar() || isResponsive()) {\n <!-- Topbar/Mobile Icon Mode -->\n <button\n type=\"button\"\n class=\"search-toggle-btn layout-topbar-action\"\n (click)=\"toggleSearch()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n >\n <ui-icon name=\"search\"></ui-icon>\n </button>\n\n @if (isSearchExpanded()) {\n <div class=\"search-dropdown-panel\">\n <f-iconfield class=\"search-iconfield\">\n <f-inputicon class=\"search-icon\"><ui-icon name=\"search\" /></f-inputicon>\n <input\n type=\"text\"\n fInputText\n class=\"search-input w-full\"\n [placeholder]=\"'layout.topbar.search.placeholder' | translate\"\n [(ngModel)]=\"searchTerm\"\n (keyup.enter)=\"handleEnter()\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n #searchInput\n autocomplete=\"off\"\n />\n </f-iconfield>\n\n @if (suggestionsOpen() && suggestions().length > 0) {\n <div class=\"search-suggestions\">\n <ul class=\"suggestions-list\">\n @for (\n item of suggestions();\n track item.label;\n let idx = $index\n ) {\n <li\n class=\"suggestion-item\"\n [class.focused]=\"idx === focusedIndex()\"\n (click)=\"selectSuggestion(item)\"\n (mouseenter)=\"focusedIndex.set(idx)\"\n role=\"option\"\n [attr.aria-selected]=\"idx === focusedIndex()\"\n >\n @if (item.icon) {\n <ui-icon [name]=\"item.icon\" class=\"suggestion-icon\"></ui-icon>\n }\n <span class=\"suggestion-label\">{{ item.label }}</span>\n </li>\n }\n </ul>\n </div>\n }\n </div>\n }\n } @else {\n <!-- Desktop Full Input Mode -->\n <f-iconfield class=\"search-iconfield\">\n <f-inputicon class=\"search-icon cursor-pointer\" (click)=\"onSearch()\"><ui-icon name=\"search\" /></f-inputicon>\n <input\n type=\"text\"\n fInputText\n class=\"search-input w-full\"\n [placeholder]=\"'layout.topbar.search.placeholder' | translate\"\n [(ngModel)]=\"searchTerm\"\n (keyup.enter)=\"handleEnter()\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n #searchInput\n />\n </f-iconfield>\n\n @if (suggestionsOpen() && suggestions().length > 0) {\n <div class=\"search-dropdown\">\n <ul class=\"suggestions-list\">\n @for (item of suggestions(); track item.label; let idx = $index) {\n <li\n class=\"suggestion-item\"\n [class.focused]=\"idx === focusedIndex()\"\n (click)=\"selectSuggestion(item)\"\n (mouseenter)=\"focusedIndex.set(idx)\"\n role=\"option\"\n [attr.aria-selected]=\"idx === focusedIndex()\"\n >\n @if (item.icon) {\n <ui-icon [name]=\"item.icon\" class=\"suggestion-icon\"></ui-icon>\n }\n <span class=\"suggestion-label\">{{ item.label }}</span>\n </li>\n }\n </ul>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n .search-container {\n display: flex;\n align-items: center;\n position: relative;\n width: 100%;\n flex: 0 1 auto;\n }\n\n .search-container.topbar-mode {\n width: auto;\n }\n\n .search-dropdown-panel {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 0.5rem;\n background-color: var(--surface-card);\n border: 1px solid var(--surface-border);\n border-radius: var(--f-content-border-radius);\n box-shadow: var(--f-shadow-xl);\n z-index: 1100;\n padding: 1rem 0.75rem 0.75rem 0.75rem;\n min-width: 300px;\n max-width: 450px;\n animation: slideDown 0.2s ease-out;\n }\n\n .search-suggestions {\n margin-top: 0.5rem;\n border-top: 1px solid var(--surface-border);\n padding-top: 0.5rem;\n background-color: inherit;\n }\n\n .suggestions-list {\n list-style: none;\n margin: 0;\n padding: 0;\n max-height: 360px;\n overflow-y: auto;\n background-color: inherit;\n }\n\n .suggestion-item {\n padding: 0.75rem 1rem;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n color: var(--text-color);\n border-bottom: 1px solid var(--surface-border);\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n .suggestion-item:last-child {\n border-bottom: none;\n }\n\n .suggestion-item:hover,\n .suggestion-item.focused {\n background-color: var(--surface-50);\n color: var(--primary-color);\n }\n\n .suggestion-icon {\n color: var(--text-color-secondary);\n font-size: 1rem;\n flex-shrink: 0;\n transition: color 0.15s ease;\n }\n\n .suggestion-item:hover .suggestion-icon,\n .suggestion-item.focused .suggestion-icon {\n color: var(--primary-color);\n }\n\n .suggestion-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .search-dropdown {\n position: absolute;\n top: calc(100% + 0.5rem);\n left: 0;\n right: 0;\n background-color: var(--surface-card);\n border: 1px solid var(--surface-border);\n border-radius: var(--f-content-border-radius);\n box-shadow: var(--f-shadow-xl);\n z-index: 1000;\n overflow: hidden;\n }\n\n .search-dropdown .suggestions-list {\n background-color: inherit;\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Responsive styles */\n @media (max-width: 768px) {\n .search-dropdown-panel {\n min-width: 280px;\n max-width: 400px;\n }\n }\n\n @media (max-width: 576px) {\n .search-dropdown-panel {\n position: fixed;\n top: 4rem;\n left: 0;\n right: 0;\n bottom: auto;\n width: 100vw;\n min-width: 100vw;\n max-width: 100vw;\n margin-top: 0;\n padding: 1rem;\n border-radius: 0;\n border-bottom: 1px solid var(--surface-border);\n z-index: 1200;\n }\n\n .search-dropdown-panel .search-iconfield {\n margin-bottom: 1rem;\n }\n\n .search-dropdown {\n max-width: 100%;\n left: 0 !important;\n right: 0 !important;\n transform: none;\n position: static;\n border-radius: var(--f-content-border-radius);\n margin-top: 0;\n }\n\n .suggestion-item {\n padding: 0.75rem;\n }\n }\n `,\n ],\n})\nexport class AppSearchbar {\n readonly layoutService = inject(LayoutService);\n private readonly router = inject(Router);\n private readonly searchAdapter = inject(LAYOUT_SEARCH_ADAPTER, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n\n readonly searchTerm = signal<string>('');\n readonly suggestionsOpen = signal<boolean>(false);\n readonly suggestions = signal<ISearchSuggestion[]>([]);\n readonly focusedIndex = signal<number>(-1);\n readonly isSearchExpanded = signal<boolean>(false);\n readonly isResponsive = signal<boolean>(\n typeof window !== 'undefined' ? window.innerWidth < 768 : false,\n );\n\n private readonly searchWrapper = viewChild<ElementRef>('searchWrapper');\n private readonly searchInput = viewChild<ElementRef>('searchInput');\n private searchTimeout?: ReturnType<typeof setTimeout>;\n\n constructor() {\n // Track responsive breakpoint (mobile < 768px)\n if (typeof window !== 'undefined') {\n fromEvent(window, 'resize')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.isResponsive.set(window.innerWidth < 768);\n });\n }\n\n // Close dropdown/search on outside click\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n const wrapper = this.searchWrapper()?.nativeElement;\n const target = event.target as HTMLElement;\n\n if (wrapper && !wrapper.contains(target)) {\n if (this.suggestionsOpen()) {\n this.closeSuggestions();\n }\n if (\n this.isSearchExpanded() &&\n (this.layoutService.isTopbar() || this.isResponsive())\n ) {\n this.closeSearch();\n }\n }\n });\n\n // Debounced search for suggestions\n effect(() => {\n const query = this.searchTerm();\n clearTimeout(this.searchTimeout);\n\n if (!this.searchAdapter || !query.trim()) {\n this.suggestions.set([]);\n this.focusedIndex.set(-1);\n return;\n }\n\n this.searchTimeout = setTimeout(() => {\n this.searchAdapter!.getSuggestions(query)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((results) => {\n this.suggestions.set(results);\n this.focusedIndex.set(-1);\n this.suggestionsOpen.set(results.length > 0);\n });\n }, 300);\n });\n }\n\n onFocus(): void {\n if (this.suggestions().length > 0) {\n this.suggestionsOpen.set(true);\n }\n }\n\n handleKeydown(event: KeyboardEvent): void {\n const items = this.suggestions();\n const current = this.focusedIndex();\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.focusedIndex.set(current < items.length - 1 ? current + 1 : 0);\n this.suggestionsOpen.set(items.length > 0);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.focusedIndex.set(current > 0 ? current - 1 : items.length - 1);\n break;\n case 'Escape':\n event.preventDefault();\n this.closeSuggestions();\n break;\n }\n }\n\n handleEnter(): void {\n const current = this.focusedIndex();\n const items = this.suggestions();\n\n if (current >= 0 && current < items.length) {\n this.selectSuggestion(items[current]);\n } else if (items.length > 0) {\n this.selectSuggestion(items[0]);\n } else {\n this.onSearch();\n }\n }\n\n selectSuggestion(item: ISearchSuggestion): void {\n if (item.routerLink) {\n this.router.navigate(item.routerLink);\n }\n this.searchTerm.set('');\n this.closeSuggestions();\n if (this.layoutService.isTopbar() || this.isResponsive()) {\n this.closeSearch();\n }\n }\n\n private closeSuggestions(): void {\n this.suggestionsOpen.set(false);\n this.focusedIndex.set(-1);\n }\n\n toggleSearch(): void {\n this.isSearchExpanded.set(!this.isSearchExpanded());\n if (this.isSearchExpanded()) {\n setTimeout(() => {\n this.searchInput()?.nativeElement?.focus();\n }, 100);\n }\n }\n\n private closeSearch(): void {\n this.isSearchExpanded.set(false);\n this.closeSuggestions();\n }\n\n onSearch(): void {\n const query = this.searchTerm();\n if (this.searchAdapter?.onSearch && query.trim()) {\n this.searchAdapter.onSearch(query);\n }\n }\n}\n","import { DOCUMENT, NgComponentOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterModule } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { InlineSvgComponent, TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n LAYOUT_LANGUAGE_SELECTOR,\n LAYOUT_NOTIFICATION_BELL,\n LAYOUT_SEARCH_ADAPTER,\n} from '../interfaces/layout-auth.interface';\nimport { LayoutService } from '../services/public-api';\nimport { AppConfigurator } from './app.configurator';\nimport { AppMenu } from './app.menu';\nimport { AppCompanyBranchSelector } from './top-bar/app.company-branch-selector';\nimport { AppLauncher } from './top-bar/app.launcher';\nimport { AppProfile } from './top-bar/app.profile';\nimport { AppSearchbar } from './top-bar/app.searchbar';\n\ntype ActivePanel = 'config' | null;\n\n@Component({\n selector: 'app-topbar',\n imports: [UiModule, RouterModule,\n NgComponentOutlet,\n TranslatePipe,\n InlineSvgComponent,\n AppConfigurator,\n AppMenu,\n AppProfile,\n AppCompanyBranchSelector,\n AppLauncher,\n AppSearchbar,],\n template: `<div class=\"layout-topbar\">\n <div\n class=\"layout-topbar-logo-container\"\n [class.layout-topbar-logo-container-desktop]=\"layoutService.isDesktop()\"\n >\n @if (!layoutService.isTopbar() && layoutService.isMobile()) {\n <button\n class=\"layout-menu-button layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.toggle.menu' | translate\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <ui-icon name=\"bars\"></ui-icon>\n </button>\n }\n <a class=\"layout-topbar-logo\" routerLink=\"/\">\n @if (displayLogo()) {\n @if (layoutService.isDisplayLogoSvg()) {\n <inline-svg [src]=\"displayLogo()\" class=\"logo-image\" />\n } @else {\n <img\n [src]=\"displayLogo()\"\n [alt]=\"companyName()\"\n class=\"logo-image\"\n />\n }\n }\n <span class=\"hidden sm:inline\">{{ companyName() }}</span>\n </a>\n @if (!layoutService.isTopbar() && layoutService.isDesktop()) {\n <button\n class=\"layout-menu-button layout-topbar-action layout-topbar-action-right\"\n [attr.aria-label]=\"'layout.topbar.toggle.menu' | translate\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <ui-icon name=\"bars\"></ui-icon>\n </button>\n }\n </div>\n\n @if (layoutService.isTopbar() && layoutService.isDesktop()) {\n <div\n #navContainer\n class=\"layout-topbar-nav-horizontal\"\n [class.layout-topbar-nav-hidden]=\"\n !layoutService.layoutState().topbarMenuVisible\n \"\n >\n <app-menu />\n </div>\n }\n\n <div class=\"layout-topbar-actions\">\n @if (hasSearchAdapter()) {\n <app-searchbar />\n }\n <div class=\"layout-config-menu\">\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.toggle.dark.mode' | translate\"\n (click)=\"toggleDarkMode()\"\n >\n <ui-icon [name]=\"layoutService.isDarkTheme() ? 'moon' : 'sun'\"></ui-icon>\n </button>\n <div class=\"relative\" #configContainer>\n <button\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"activePanel() === 'config'\"\n [attr.aria-label]=\"'layout.topbar.open.theme.settings' | translate\"\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel('config')\"\n >\n <ui-icon name=\"palette\"></ui-icon>\n </button>\n <app-configurator />\n </div>\n </div>\n\n <button\n class=\"layout-topbar-menu-button layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.more.options' | translate\"\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n >\n <ui-icon name=\"ellipsis-v\"></ui-icon>\n </button>\n\n <div class=\"layout-topbar-menu hidden lg:block\">\n <div class=\"layout-topbar-menu-content\">\n @if (layoutService.hasApps()) {\n <app-launcher />\n }\n @if (languageSelectorComponent) {\n <ng-container *ngComponentOutlet=\"languageSelectorComponent\" />\n }\n @if (enableCompanyFeature) {\n <app-company-branch-selector />\n }\n @if (notificationBellComponent) {\n <ng-container *ngComponentOutlet=\"notificationBellComponent\" />\n }\n <app-profile />\n </div>\n </div>\n </div>\n </div>`,\n})\nexport class AppTopbar {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n readonly layoutService = inject(LayoutService);\n readonly notificationBellComponent = inject(LAYOUT_NOTIFICATION_BELL, {\n optional: true,\n });\n readonly languageSelectorComponent = inject(LAYOUT_LANGUAGE_SELECTOR, {\n optional: true,\n });\n private readonly searchAdapter = inject(LAYOUT_SEARCH_ADAPTER, {\n optional: true,\n });\n\n readonly hasSearchAdapter = computed(() => !!this.searchAdapter);\n\n private readonly configContainer =\n viewChild<ElementRef<HTMLElement>>('configContainer');\n private readonly navContainer =\n viewChild<ElementRef<HTMLElement>>('navContainer');\n\n readonly activePanel = signal<ActivePanel>(null);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.activePanel() !== null),\n )\n .subscribe((event) => {\n this.handleOutsideClick(event);\n });\n\n effect(() => {\n const nav = this.navContainer();\n if (nav && this.layoutService.isTopbar()) {\n fromEvent(nav.nativeElement, 'scroll')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.recalculateHoveredSubmenu(nav.nativeElement));\n }\n });\n }\n\n readonly companyName = this.layoutService.companyName;\n readonly displayLogo = this.layoutService.displayLogo;\n\n readonly enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);\n\n toggleDarkMode(): void {\n const currentDarkTheme = this.layoutService.layoutConfig().darkTheme;\n this.layoutService.updateLayoutConfig({ darkTheme: !currentDarkTheme });\n }\n\n togglePanel(panel: ActivePanel): void {\n this.activePanel.update((current) => (current === panel ? null : panel));\n }\n\n private handleOutsideClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n const configEl = this.configContainer()?.nativeElement;\n\n if (configEl && !configEl.contains(target)) {\n this.activePanel.set(null);\n }\n }\n\n private recalculateHoveredSubmenu(navEl: HTMLElement): void {\n const hoveredItems = navEl.querySelectorAll('li:hover');\n hoveredItems.forEach((li) => {\n const link = li.querySelector(':scope > a') as HTMLElement | null;\n if (!link) return;\n const rect = link.getBoundingClientRect();\n const top = rect.bottom + 12;\n const left = rect.left - 12;\n (li as HTMLElement).style.setProperty('--submenu-left', `${left}px`);\n (li as HTMLElement).style.setProperty('--submenu-top', `${top}px`);\n });\n }\n}\n","import { Component } from '@angular/core';\nimport { AppMenu } from './app.menu';\n\n@Component({\n selector: 'app-sidebar',\n imports: [AppMenu],\n template: `\n <div class=\"layout-sidebar\">\n <app-menu />\n </div>\n `,\n})\nexport class AppSidebar {}\n","import { Component, computed, DestroyRef, DOCUMENT, inject, Renderer2 } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AppTopbar } from './app.topbar';\nimport { AppSidebar } from './app.sidebar';\nimport { AppFooter } from './app.footer';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-layout',\n imports: [AppTopbar, AppSidebar, RouterModule, AppFooter],\n template: `\n <div\n class=\"layout-wrapper\"\n [class.layout-overlay]=\"isOverlay()\"\n [class.layout-static]=\"isStatic()\"\n [class.layout-topbar-mode]=\"isTopbarMode()\"\n [class.layout-static-inactive]=\"isStaticInactive()\"\n [class.layout-overlay-active]=\"isOverlayActive()\"\n [class.layout-mobile-active]=\"isMobileActive()\"\n [class.layout-topbar-nav-hidden]=\"isTopbarNavHidden()\"\n >\n <app-topbar></app-topbar>\n <app-sidebar></app-sidebar>\n <div class=\"layout-main-container\">\n <div class=\"layout-main\">\n <router-outlet></router-outlet>\n </div>\n <app-footer></app-footer>\n </div>\n <div class=\"layout-mask animate-fadein\"></div>\n </div>\n `,\n})\nexport class AppLayout {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n readonly layoutService = inject(LayoutService);\n private readonly renderer = inject(Renderer2);\n private readonly router = inject(Router);\n\n private menuOutsideClickListener: (() => void) | null = null;\n\n constructor() {\n this.layoutService.overlayOpen$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (!this.menuOutsideClickListener) {\n this.menuOutsideClickListener = this.renderer.listen(\n this.document,\n 'click',\n (event) => {\n if (this.isOutsideClicked(event)) {\n this.hideMenu();\n }\n }\n );\n }\n if (this.layoutService.layoutState().staticMenuMobileActive) {\n this.blockBodyScroll();\n }\n });\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => this.hideMenu());\n }\n\n isOutsideClicked(event: MouseEvent): boolean {\n const sidebarEl = this.document.querySelector('.layout-sidebar');\n const topbarEl = this.document.querySelector('.layout-menu-button');\n const topbarNavEl = this.document.querySelector('.layout-topbar-nav');\n const eventTarget = event.target as Node;\n\n return !(\n sidebarEl?.isSameNode(eventTarget) ||\n sidebarEl?.contains(eventTarget) ||\n topbarEl?.isSameNode(eventTarget) ||\n topbarEl?.contains(eventTarget) ||\n topbarNavEl?.isSameNode(eventTarget) ||\n topbarNavEl?.contains(eventTarget)\n );\n }\n\n hideMenu(): void {\n this.layoutService.updateLayoutState({\n overlayMenuActive: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n });\n if (this.menuOutsideClickListener) {\n this.menuOutsideClickListener();\n this.menuOutsideClickListener = null;\n }\n this.unblockBodyScroll();\n }\n\n blockBodyScroll(): void {\n this.document.body.classList.add('blocked-scroll');\n }\n\n unblockBodyScroll(): void {\n this.document.body.classList.remove('blocked-scroll');\n }\n\n readonly isOverlay = computed(() => this.layoutService.layoutConfig().menuMode === 'overlay');\n readonly isStatic = computed(() => this.layoutService.layoutConfig().menuMode === 'static');\n readonly isTopbarMode = computed(() => this.layoutService.layoutConfig().menuMode === 'topbar');\n readonly isStaticInactive = computed(() =>\n this.layoutService.layoutState().staticMenuDesktopInactive && this.isStatic(),\n );\n readonly isOverlayActive = computed(() => this.layoutService.layoutState().overlayMenuActive);\n readonly isMobileActive = computed(() => this.layoutService.layoutState().staticMenuMobileActive);\n readonly isTopbarNavHidden = computed(() =>\n !this.layoutService.layoutState().topbarMenuVisible && this.isTopbarMode(),\n );\n}\n","import { applyTheme, buildBootstrapPreset, ApplyThemeOptions } from '@flusys/ng-ui';\nimport { PresetName } from '@flusys/ng-ui';\n\nexport { buildBootstrapPreset };\nexport type { ApplyThemeOptions };\n\nexport function buildPreset(presetName: string, primary: string): ApplyThemeOptions {\n return { preset: presetName as PresetName, primary };\n}\n\nexport { applyTheme };\n","import { ApplyThemeOptions } from '@flusys/ng-ui';\n\nexport const NavyBlueTheme: ApplyThemeOptions = {\n preset: 'Aura',\n primary: 'indigo',\n};\n","import { ApplyThemeOptions } from '@flusys/ng-ui';\n\nexport const GreenTheme: ApplyThemeOptions = {\n preset: 'Aura',\n primary: 'green',\n};\n","export const LAYOUT_MESSAGES: Record<string, string> = {\n // components/top-bar/app.profile.ts\n 'layout.profile.title': 'Profile',\n 'layout.profile.profile.picture.alt': 'Profile picture',\n 'layout.profile.copy.sign.up.link': 'Copy SignUp Link',\n 'layout.profile.logout': 'Logout',\n 'layout.profile.guest': 'Guest',\n 'layout.profile.link.copied': 'Link Copied',\n 'layout.profile.sign.up.link.copied': 'Sign Up Link copied.',\n 'layout.profile.failed.copy.sign.up.link': 'Failed to copy signup link.',\n\n // components/top-bar/app.launcher.ts\n 'layout.launcher.apps': 'Apps',\n 'layout.launcher.applications': 'Applications',\n\n // components/top-bar/app.company-branch-selector.ts\n 'layout.company.branch.selector.title': 'Switch Company & Branch',\n 'layout.company.branch.selector.select.company': 'Select Company',\n 'layout.company.branch.selector.branch': 'Branch',\n 'layout.company.branch.selector.select.branch': 'Select Branch',\n 'layout.company.branch.selector.switch.button': 'Switch',\n 'layout.company.branch.selector.no.company': 'No Company',\n 'layout.company.branch.selector.branch.required': 'Branch Required',\n 'layout.company.branch.selector.please.select.branch':\n 'Please select a branch',\n\n // components/top-bar/app.searchbar.ts\n 'layout.topbar.search': 'Search',\n 'layout.topbar.search.placeholder': 'Search for content...',\n\n // components/app.topbar.ts\n 'layout.topbar.toggle.menu': 'Toggle menu',\n 'layout.topbar.toggle.dark.mode': 'Toggle dark mode',\n 'layout.topbar.open.theme.settings': 'Open theme settings',\n 'layout.topbar.more.options': 'More options',\n\n // components/app.configurator.ts\n 'layout.configurator.primary': 'Primary',\n 'layout.configurator.surface': 'Surface',\n 'layout.configurator.presets': 'Presets',\n 'layout.configurator.menu.mode': 'Menu Mode',\n 'layout.configurator.menu.mode.static': 'Static',\n 'layout.configurator.menu.mode.overlay': 'Overlay',\n 'layout.configurator.menu.mode.topbar': 'Topbar',\n\n // components/app.footer.ts\n 'layout.footer.by': 'by',\n\n // app-menu.config.ts (main app menu configuration)\n 'menu.dashboard': 'Dashboard',\n 'menu.administration': 'Administration',\n 'menu.iam': 'IAM',\n 'menu.storage': 'Storage',\n 'menu.forms': 'Forms',\n 'menu.email': 'Email',\n 'menu.event.manager': 'Event Manager',\n 'menu.task.manager': 'Task Manager',\n 'menu.notifications': 'Notifications',\n 'menu.localization': 'Localization',\n 'menu.components': 'Components',\n 'menu.components.display': 'Display',\n 'menu.components.menu': 'Menu',\n 'menu.components.form': 'Form',\n 'menu.components.overlay': 'Overlay',\n 'menu.components.data': 'Data',\n 'menu.components.panel': 'Panel',\n 'menu.components.media': 'Media',\n 'menu.components.misc': 'Directives',\n 'menu.projects': 'Projects',\n 'menu.projects.active': 'Active Projects',\n 'menu.projects.archived': 'Archived',\n 'menu.projects.reports': 'Reports',\n\n // Those are layout part from notification module, but we put them here to avoid circular dependency between layout and notification module\n\n // components/notification-bell/notification-bell.component.ts\n 'notification.title': 'Notifications',\n\n // components/notification-list/notification-list.component.ts\n 'notification.mark.all.read': 'Mark all read',\n 'notification.view.all': 'View all notifications',\n 'notification.empty': 'No notifications',\n\n // components/notification-item/notification-item.component.ts\n 'notification.time.just.now': 'Just now',\n 'notification.time.minutes.ago': '{{count}}m ago',\n 'notification.time.hours.ago': '{{count}}h ago',\n 'notification.time.days.ago': '{{count}}d ago',\n};\n","// Components\nexport * from './components/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Services\nexport * from './services/public-api';\n\n// Utils\nexport * from './utils/public-api';\n\n// Themes\nexport * from './theme/public-api';\n\n// Constants\nexport * from './constants/index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isRouteActive","DOCUMENT","i2","filter"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-layout.mjs","sources":["../../../projects/ng-layout/utils/apps-filter.util.ts","../../../projects/ng-layout/utils/menu-filter.util.ts","../../../projects/ng-layout/services/layout-persistence.service.ts","../../../projects/ng-layout/services/layout.service.ts","../../../projects/ng-layout/components/app.footer.ts","../../../projects/ng-layout/components/app.configurator.ts","../../../projects/ng-layout/interfaces/layout-auth.interface.ts","../../../projects/ng-layout/components/app.floatingconfigurator.ts","../../../projects/ng-layout/components/app.menuitem.ts","../../../projects/ng-layout/components/app.menu.ts","../../../projects/ng-layout/interfaces/view-transitions.ts","../../../projects/ng-layout/components/top-bar/app.company-branch-selector.ts","../../../projects/ng-layout/components/top-bar/app.launcher.ts","../../../projects/ng-layout/components/top-bar/app.profile.ts","../../../projects/ng-layout/components/top-bar/app.searchbar.ts","../../../projects/ng-layout/components/app.topbar.ts","../../../projects/ng-layout/components/app.sidebar.ts","../../../projects/ng-layout/components/app.layout.ts","../../../projects/ng-layout/utils/theme-preset.util.ts","../../../projects/ng-layout/theme/navy-blue-theme.ts","../../../projects/ng-layout/theme/green-theme.ts","../../../projects/ng-layout/constants/messages.ts","../../../projects/ng-layout/public-api.ts","../../../projects/ng-layout/flusys-ng-layout.ts"],"sourcesContent":["import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { ILauncherApp } from '../interfaces/layout-auth.interface';\n\n/** Filter launcher apps based on user permission codes */\nexport function filterAppsByPermissions(\n apps: ILauncherApp[],\n permissionCodes: string[],\n): ILauncherApp[] {\n return apps.filter(\n (app) =>\n !app.permissionLogic ||\n evaluateLogicNode(app.permissionLogic, permissionCodes),\n );\n}\n","import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { IMenuItem } from '../interfaces/layout-auth.interface';\n\n/**\n * Filter menu items based on permission and role checker\n *\n * @param items - Array of menu items to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role (optional, defaults to always false)\n * @returns Filtered menu items array\n *\n * @example\n * ```typescript\n * const filteredMenu = filterMenuByPermissions(\n * menuItems,\n * (actionCode) => permissionState.hasAction(actionCode)\n * );\n * ```\n */\nexport function filterMenuByPermissions(\n items: IMenuItem[],\n permissionCode: string[],\n): IMenuItem[] {\n return items\n .map((item) => filterMenuItem(item, permissionCode))\n .filter((item): item is IMenuItem => item !== null);\n}\n\n/**\n * Filter a single menu item and its children recursively\n *\n * @param item - Menu item to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role\n * @returns Filtered menu item or null if user doesn't have permission\n */\nfunction filterMenuItem(\n item: IMenuItem,\n permissionCode: string[],\n): IMenuItem | null {\n // Skip separators - they have no permission checks\n if (item.separator) {\n return item;\n }\n\n // Check permission logic tree\n if (item.permissionLogic) {\n const hasAccess = evaluateLogicNode(item.permissionLogic, permissionCode);\n if (!hasAccess) {\n return null; // User doesn't pass permission logic\n }\n }\n\n // Filter child items recursively\n if (item.children && item.children.length > 0) {\n const filteredChildren = filterMenuByPermissions(\n item.children,\n permissionCode,\n );\n\n // If parent has no visible children, hide parent too\n if (filteredChildren.length === 0) {\n return null;\n }\n\n return { ...item, children: filteredChildren };\n }\n\n return item;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { LayoutConfig } from '@flusys/ng-core';\n\nconst STORAGE_KEY = 'flusys.layout.config';\nconst STORAGE_VERSION = 1;\n\ninterface PersistedLayoutConfig extends LayoutConfig {\n _version?: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LayoutPersistenceService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private readonly validPresets = ['Aura', 'Lara', 'Nora'];\n private readonly validMenuModes = ['static', 'overlay', 'topbar'];\n\n load(): LayoutConfig | null {\n if (!this.isBrowser) return null;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return null;\n\n const parsed = JSON.parse(stored) as PersistedLayoutConfig;\n return this.validateConfig(parsed);\n } catch {\n this.clear();\n return null;\n }\n }\n\n save(config: LayoutConfig): void {\n if (!this.isBrowser) return;\n\n try {\n const toStore: PersistedLayoutConfig = {\n ...config,\n _version: STORAGE_VERSION,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(toStore));\n } catch {\n // Silent fail - localStorage may be full or disabled\n }\n }\n\n clear(): void {\n if (!this.isBrowser) return;\n localStorage.removeItem(STORAGE_KEY);\n }\n\n private validateConfig(config: PersistedLayoutConfig): LayoutConfig | null {\n if (config._version && config._version !== STORAGE_VERSION) {\n this.clear();\n return null;\n }\n\n if (config.preset && !this.validPresets.includes(config.preset)) {\n config.preset = 'Aura';\n }\n\n if (config.menuMode && !this.validMenuModes.includes(config.menuMode)) {\n config.menuMode = 'static';\n }\n\n if (typeof config.darkTheme !== 'boolean') {\n config.darkTheme = false;\n }\n\n const { _version, ...cleanConfig } = config;\n return cleanConfig as LayoutConfig;\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n DOCUMENT,\n effect,\n inject,\n Injectable,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n APP_CONFIG,\n DEFAULT_APP_NAME,\n DEFAULT_AUTHOR,\n isCompanyFeatureEnabled,\n LayoutConfig,\n} from '@flusys/ng-core';\nimport { PermissionValidatorService } from '@flusys/ng-shared';\nimport { fromEvent, Subject } from 'rxjs';\n\nconst DESKTOP_BREAKPOINT = 991;\nimport { ILauncherApp, IMenuItem } from '../interfaces/layout-auth.interface';\nimport { DocumentWithViewTransition } from '../interfaces/view-transitions';\nimport { filterAppsByPermissions } from '../utils/apps-filter.util';\nimport { filterMenuByPermissions } from '../utils/menu-filter.util';\nimport { LayoutPersistenceService } from './layout-persistence.service';\n\nexport interface LayoutState {\n staticMenuDesktopInactive?: boolean;\n overlayMenuActive?: boolean;\n configSidebarVisible?: boolean;\n staticMenuMobileActive?: boolean;\n menuHoverActive?: boolean;\n topbarMenuVisible?: boolean;\n}\n\nexport interface MenuChangeEvent {\n key: string;\n routeEvent?: boolean;\n}\n\nexport interface UserProfile {\n id: string;\n name: string;\n email: string;\n profilePictureUrl?: string | null;\n}\n\nexport interface CompanyProfile {\n id: string;\n name: string;\n slug: string;\n logoUrl?: string | null;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LayoutService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly persistence = inject(LayoutPersistenceService);\n private readonly appConfig = inject(APP_CONFIG, { optional: true });\n\n private readonly DEFAULT_CONFIG: LayoutConfig = this.appConfig?.layoutConfig ?? {\n preset: 'Aura',\n primary: 'violet',\n surface: null,\n darkTheme: false,\n menuMode: 'static',\n };\n\n private readonly DEFAULT_STATE: LayoutState = {\n staticMenuDesktopInactive: false,\n overlayMenuActive: false,\n configSidebarVisible: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n topbarMenuVisible: true,\n };\n\n private readonly memorable = this.DEFAULT_CONFIG.isMemorable !== false;\n\n private readonly _layoutConfig = signal<LayoutConfig>({\n ...this.DEFAULT_CONFIG,\n ...(this.memorable ? this.persistence.load() : null),\n });\n private readonly _layoutState = signal<LayoutState>(this.DEFAULT_STATE);\n private readonly _transitionComplete = signal<boolean>(false);\n\n readonly layoutConfig = this._layoutConfig.asReadonly();\n readonly layoutState = this._layoutState.asReadonly();\n readonly transitionComplete = this._transitionComplete.asReadonly();\n\n private readonly _userProfile = signal<UserProfile | null>(null);\n private readonly _companyProfile = signal<CompanyProfile | null>(null);\n private readonly _rawMenu = signal<IMenuItem[]>([]);\n private readonly _rawApps = signal<ILauncherApp[]>([]);\n private readonly permissionValidator = inject(PermissionValidatorService);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly _windowWidth = signal<number>(\n this.isBrowser ? window.innerWidth : DESKTOP_BREAKPOINT + 1,\n );\n\n readonly userProfile = this._userProfile.asReadonly();\n readonly companyProfile = this._companyProfile.asReadonly();\n\n readonly appName = this.appConfig?.appName ?? DEFAULT_APP_NAME;\n readonly appLogo = this.appConfig?.appLogo ?? '';\n readonly isAppLogoSvg = this.appLogo.toLowerCase().endsWith('.svg');\n readonly authorName = this.appConfig?.author?.name ?? DEFAULT_AUTHOR.name;\n readonly authorUrl = this.appConfig?.author?.url ?? DEFAULT_AUTHOR.url;\n\n readonly menu = computed(() =>\n filterMenuByPermissions(\n this._rawMenu(),\n this.permissionValidator.permissions(),\n ),\n );\n readonly apps = computed(() =>\n filterAppsByPermissions(\n this._rawApps(),\n this.permissionValidator.permissions(),\n ),\n );\n readonly hasApps = computed(() => this.apps().length > 0);\n\n readonly isSidebarActive = computed(\n () =>\n this._layoutState().overlayMenuActive ||\n this._layoutState().staticMenuMobileActive,\n );\n readonly isDesktop = computed(() => this._windowWidth() > DESKTOP_BREAKPOINT);\n readonly isMobile = computed(() => !this.isDesktop());\n readonly isDarkTheme = computed(() => this._layoutConfig().darkTheme);\n readonly isOverlay = computed(\n () => this._layoutConfig().menuMode === 'overlay',\n );\n readonly isTopbar = computed(\n () => this._layoutConfig().menuMode === 'topbar',\n );\n\n readonly userName = computed(() => this._userProfile()?.name ?? 'Guest');\n readonly userEmail = computed(() => this._userProfile()?.email ?? '');\n readonly userProfilePictureUrl = computed(\n () => this._userProfile()?.profilePictureUrl ?? null,\n );\n readonly companyLogoUrl = computed(\n () => this._companyProfile()?.logoUrl ?? null,\n );\n readonly isAuthenticated = computed(() => !!this._userProfile());\n readonly companyName = computed(() => {\n if (!this.appConfig || !isCompanyFeatureEnabled(this.appConfig))\n return this.appName;\n return this._companyProfile()?.name ?? this.appName;\n });\n readonly displayLogo = computed(() => this.companyLogoUrl() ?? this.appLogo);\n readonly isDisplayLogoSvg = computed(() =>\n this.displayLogo().toLowerCase().endsWith('.svg'),\n );\n\n private readonly overlayOpen = new Subject<void>();\n private readonly menuSource = new Subject<MenuChangeEvent>();\n private readonly resetSource = new Subject<boolean>();\n\n readonly menuSource$ = this.menuSource.asObservable();\n readonly resetSource$ = this.resetSource.asObservable();\n readonly overlayOpen$ = this.overlayOpen.asObservable();\n\n private initialized = false;\n\n constructor() {\n if (this.isBrowser) {\n this.toggleDarkMode();\n\n fromEvent(window, 'resize')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this._windowWidth.set(window.innerWidth);\n });\n }\n\n effect(() => {\n const config = this._layoutConfig();\n\n if (this.initialized) {\n this.handleDarkModeTransition(config);\n if (this.memorable) this.persistence.save(config);\n }\n this.initialized = true;\n });\n }\n\n toggleDarkMode(config?: LayoutConfig): void {\n const isDark = (config ?? this._layoutConfig()).darkTheme;\n this.document.documentElement.classList.toggle('app-dark', isDark);\n }\n\n private handleDarkModeTransition(config: LayoutConfig): void {\n const doc = this.document as DocumentWithViewTransition;\n if (\n 'startViewTransition' in doc &&\n typeof doc.startViewTransition === 'function'\n ) {\n doc\n .startViewTransition(() => this.toggleDarkMode(config))\n .ready.then(() => this.onTransitionEnd())\n .catch(() => {});\n } else {\n this.toggleDarkMode(config);\n this.onTransitionEnd();\n }\n }\n\n private onTransitionEnd(): void {\n this._transitionComplete.set(true);\n setTimeout(() => this._transitionComplete.set(false));\n }\n\n onMenuToggle(): void {\n const state = this._layoutState();\n\n // Desktop topbar mode: toggle topbar nav visibility\n if (this.isDesktop() && this.isTopbar()) {\n this._layoutState.update((prev) => ({\n ...prev,\n topbarMenuVisible: !prev.topbarMenuVisible,\n }));\n return;\n }\n\n // Mobile always uses staticMenuMobileActive regardless of menu mode\n if (!this.isDesktop()) {\n const newMobileActive = !state.staticMenuMobileActive;\n this._layoutState.update((prev) => ({\n ...prev,\n staticMenuMobileActive: newMobileActive,\n }));\n if (newMobileActive) this.overlayOpen.next();\n return;\n }\n\n // Desktop: use overlay or static mode\n if (this.isOverlay()) {\n const newOverlayActive = !state.overlayMenuActive;\n this._layoutState.update((prev) => ({\n ...prev,\n overlayMenuActive: newOverlayActive,\n }));\n if (newOverlayActive) this.overlayOpen.next();\n } else {\n this._layoutState.update((prev) => ({\n ...prev,\n staticMenuDesktopInactive: !state.staticMenuDesktopInactive,\n }));\n }\n }\n\n onMenuStateChange(event: MenuChangeEvent): void {\n this.menuSource.next(event);\n }\n\n reset(): void {\n this.resetSource.next(true);\n }\n\n updateLayoutConfig(config: Partial<LayoutConfig>): void {\n this._layoutConfig.update((prev) => ({ ...prev, ...config }));\n }\n\n updateLayoutState(state: Partial<LayoutState>): void {\n this._layoutState.update((prev) => ({ ...prev, ...state }));\n }\n\n setUserProfile(profile: UserProfile | null): void {\n this._userProfile.set(profile);\n }\n\n setCompanyProfile(profile: CompanyProfile | null): void {\n this._companyProfile.set(profile);\n }\n\n setMenu(items: IMenuItem[]): void {\n this._rawMenu.set(items);\n }\n\n clearMenu(): void {\n this._rawMenu.set([]);\n }\n\n setApps(apps: ILauncherApp[]): void {\n this._rawApps.set(apps);\n }\n\n clearApps(): void {\n this._rawApps.set([]);\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { InlineSvgComponent, TranslatePipe } from '@flusys/ng-shared';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-footer',\n imports: [TranslatePipe, InlineSvgComponent],\n template: `<div class=\"layout-footer\">\n @if (displayLogo) {\n @if (isLogoSvg) {\n <inline-svg [src]=\"displayLogo\" class=\"logo-image\" />\n } @else {\n <img [src]=\"displayLogo\" [alt]=\"appName\" class=\"logo-image\" />\n }\n }\n <span class=\"hidden sm:inline\">\n {{ appName }} {{ 'layout.footer.by' | translate }}\n <a\n [href]=\"authorUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-primary font-bold hover:underline\"\n >{{ authorName }}</a\n >\n </span>\n </div>`,\n})\nexport class AppFooter {\n private readonly layoutService = inject(LayoutService);\n\n readonly appName = this.layoutService.appName;\n readonly displayLogo = this.layoutService.appLogo;\n readonly isLogoSvg = this.layoutService.isAppLogoSvg;\n readonly authorName = this.layoutService.authorName;\n readonly authorUrl = this.layoutService.authorUrl;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { TranslatePipe, TranslateService } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport {\n applyPrimaryPalette,\n applySurfacePalette,\n applyTheme,\n PRIMARY_PALETTES,\n SURFACE_PALETTES,\n PRESET_NAMES,\n PresetName,\n} from '@flusys/ng-ui';\nimport { LayoutService } from '../services/public-api';\n\ndeclare type SurfacesType = {\n name?: string;\n palette?: {\n 0?: string;\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n 950?: string;\n };\n};\n\n@Component({\n selector: 'app-configurator',\n imports: [UiModule, FormsModule, TranslatePipe],\n template: `\n <div class=\"flex flex-col gap-4\">\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.primary' | translate\n }}</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (primaryColor of primaryColors(); track primaryColor.name) {\n <button\n type=\"button\"\n [title]=\"primaryColor.name\"\n (click)=\"updateColors($event, 'primary', primaryColor)\"\n [class.outline-primary]=\"primaryColor.name === selectedPrimaryColor()\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style.background-color]=\"\n primaryColor?.name === 'noir'\n ? 'var(--f-text-color)'\n : primaryColor?.palette?.['500']\n \"\n ></button>\n }\n </div>\n </div>\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.surface' | translate\n }}</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (surface of surfaces; track surface.name) {\n <button\n type=\"button\"\n [title]=\"surface.name\"\n (click)=\"updateColors($event, 'surface', surface)\"\n [class.outline-primary]=\"isSurfaceSelected(surface.name)\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style.background-color]=\"\n surface?.name === 'noir'\n ? 'var(--f-text-color)'\n : surface?.palette?.['500']\n \"\n ></button>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.presets' | translate\n }}</span>\n <f-selectbutton\n [options]=\"presets\"\n [ngModel]=\"selectedPreset()\"\n (ngModelChange)=\"onPresetChange($event)\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n @if (showMenuModeButton()) {\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.configurator.menu.mode' | translate\n }}</span>\n <f-selectbutton\n [ngModel]=\"menuMode()\"\n (ngModelChange)=\"onMenuModeChange($event)\"\n [options]=\"menuModeOptions()\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n }\n </div>\n `,\n host: {\n class:\n 'hidden absolute top-[3.25rem] w-[calc(100vw-2rem)] sm:w-72 max-w-72 p-4 border border-surface rounded-border origin-top shadow-xl',\n style: 'background-color: var(--surface-overlay); inset-inline-end: 0;',\n },\n})\nexport class AppConfigurator {\n private readonly router = inject(Router);\n private readonly translateAdapter = inject(TranslateService, { optional: true });\n private readonly platformId = inject(PLATFORM_ID);\n readonly layoutService = inject(LayoutService);\n\n readonly presets: PresetName[] = PRESET_NAMES;\n readonly showMenuModeButton = signal(!this.router.url.includes('auth'));\n\n readonly menuModeOptions = computed(() => {\n const options: Array<{ label: string; value: 'static' | 'overlay' | 'topbar' }> = [\n { label: this.translate('layout.configurator.menu.mode.static'), value: 'static' },\n { label: this.translate('layout.configurator.menu.mode.overlay'), value: 'overlay' },\n ];\n if (this.layoutService.isDesktop()) {\n options.push({ label: this.translate('layout.configurator.menu.mode.topbar'), value: 'topbar' });\n }\n return options;\n });\n\n constructor() {\n if (isPlatformBrowser(this.platformId)) {\n effect(() => {\n const config = this.layoutService.layoutConfig();\n applyTheme({\n preset: (config.preset ?? 'Aura') as PresetName,\n primary: config.primary ?? 'violet',\n surface: config.surface ?? null,\n darkTheme: config.darkTheme ?? false,\n });\n });\n }\n }\n\n readonly surfaces: SurfacesType[] = Object.entries(SURFACE_PALETTES).map(([name, pal]) => ({\n name,\n palette: pal as SurfacesType['palette'],\n }));\n\n readonly selectedPrimaryColor = computed(() => this.layoutService.layoutConfig().primary);\n readonly selectedSurfaceColor = computed(() => this.layoutService.layoutConfig().surface);\n\n isSurfaceSelected(surfaceName: string | undefined): boolean {\n const sel = this.selectedSurfaceColor();\n if (sel) return sel === surfaceName;\n const isDark = this.layoutService.layoutConfig().darkTheme;\n return isDark ? surfaceName === 'zinc' : surfaceName === 'slate';\n }\n\n readonly selectedPreset = computed(() => this.layoutService.layoutConfig().preset);\n readonly menuMode = computed(() => this.layoutService.layoutConfig().menuMode);\n\n readonly primaryColors = computed<SurfacesType[]>(() => {\n const palettes: SurfacesType[] = [{ name: 'noir', palette: {} }];\n for (const [name, pal] of Object.entries(PRIMARY_PALETTES)) {\n palettes.push({ name, palette: pal as SurfacesType['palette'] });\n }\n return palettes;\n });\n\n updateColors(event: MouseEvent, type: string, color: SurfacesType): void {\n if (type === 'primary') {\n this.layoutService.updateLayoutConfig({ primary: color.name });\n } else if (type === 'surface') {\n this.layoutService.updateLayoutConfig({ surface: color.name });\n }\n this._applyColorChange(type, color);\n event.stopPropagation();\n }\n\n private _applyColorChange(type: string, color: SurfacesType): void {\n const isDark = this.layoutService.layoutConfig().darkTheme ?? false;\n if (type === 'primary') {\n const primary = color.name ?? 'violet';\n const pal = primary === 'noir'\n ? Object.fromEntries(Object.entries(SURFACE_PALETTES['slate']).map(([k, v]) => [k, v])) as Record<string, string>\n : PRIMARY_PALETTES[primary] as unknown as Record<string, string>;\n if (pal) applyPrimaryPalette(pal as Parameters<typeof applyPrimaryPalette>[0], isDark);\n } else if (type === 'surface') {\n const surfacePal = SURFACE_PALETTES[color.name ?? 'slate'];\n if (surfacePal) applySurfacePalette(surfacePal);\n }\n }\n\n onPresetChange(event: string): void {\n this.layoutService.updateLayoutConfig({ preset: event });\n const isDark = this.layoutService.layoutConfig().darkTheme ?? false;\n const primary = this.layoutService.layoutConfig().primary ?? 'violet';\n const surface = this.layoutService.layoutConfig().surface ?? null;\n applyTheme({ preset: event as PresetName, primary, surface, darkTheme: isDark });\n }\n\n onMenuModeChange(event: 'static' | 'overlay' | 'topbar'): void {\n this.layoutService.updateLayoutConfig({ menuMode: event });\n }\n\n private translate(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\n}\n","import { InjectionToken, Signal, Type } from '@angular/core';\nimport type { IconTypeEnum, ILogicNode } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\n\nexport interface ILauncherApp {\n id: string;\n /** Display name (use nameKey for localization instead) */\n name?: string;\n /** Translation key for the name - preferred over name for localization */\n nameKey?: string;\n iconType?: IconTypeEnum;\n icon: string;\n url: string;\n /** Optional permission logic - if set, app only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ICompanyInfo {\n id: string;\n name: string;\n slug: string;\n imageId: string;\n}\n\nexport interface IBranchInfo {\n id: string;\n name: string;\n slug: string;\n imageId?: string;\n}\n\nexport interface IUserInfo {\n id: string;\n name: string;\n email: string;\n profilePicture?: { url: string } | null;\n}\n\nexport interface IMenuItem {\n id?: string;\n /** Display label (use labelKey for localization instead) */\n label?: string;\n /** Translation key for the label - preferred over label for localization */\n labelKey?: string;\n icon?: string;\n iconType?: number;\n routerLink?: string[];\n children?: IMenuItem[];\n parent?: { id: string } | null;\n separator?: boolean;\n /** Optional permission logic - if set, item only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ILayoutAuthState {\n currentCompanyInfo: Signal<ICompanyInfo | null>;\n currentBranchInfo: Signal<IBranchInfo | null>;\n loginUserData: Signal<IUserInfo | null>;\n}\n\nexport interface ILayoutAuthApi {\n logOut(): Observable<unknown>;\n navigateLogin(withUrl?: boolean): void;\n switchCompany(companyId: string, branchId: string): Observable<unknown>;\n getUserCompanies(): Observable<ICompanyInfo[]>;\n getCompanyBranches(companyId: string): Observable<IBranchInfo[]>;\n}\n\nexport const LAYOUT_AUTH_STATE = new InjectionToken<ILayoutAuthState>(\n 'LAYOUT_AUTH_STATE',\n);\n\nexport const LAYOUT_AUTH_API = new InjectionToken<ILayoutAuthApi>(\n 'LAYOUT_AUTH_API',\n);\n\nexport const LAYOUT_NOTIFICATION_BELL = new InjectionToken<Type<unknown>>(\n 'LAYOUT_NOTIFICATION_BELL',\n);\n\nexport const LAYOUT_LANGUAGE_SELECTOR = new InjectionToken<Type<unknown>>(\n 'LAYOUT_LANGUAGE_SELECTOR',\n);\n\nexport const LAYOUT_LANGUAGE_SELECTOR_PANEL = new InjectionToken<Type<unknown>>(\n 'LAYOUT_LANGUAGE_SELECTOR_PANEL',\n);\n\nexport const LAYOUT_SEARCHBAR = new InjectionToken<Type<unknown>>(\n 'LAYOUT_SEARCHBAR',\n);\n\nexport const LAYOUT_IS_RTL = new InjectionToken<Signal<boolean>>(\n 'LAYOUT_IS_RTL',\n);\n\nexport interface ISearchSuggestion {\n label: string;\n icon?: string;\n routerLink?: string[];\n data?: unknown;\n}\n\nexport interface ISearchAdapter {\n getSuggestions(query: string): Observable<ISearchSuggestion[]>;\n onSearch?(query: string): void;\n}\n\nexport const LAYOUT_SEARCH_ADAPTER = new InjectionToken<ISearchAdapter>(\n 'LAYOUT_SEARCH_ADAPTER',\n);\n","import { NgComponentOutlet } from '@angular/common';\nimport { UiModule } from '@flusys/ng-ui';\nimport { Component, computed, inject } from '@angular/core';\nimport { LAYOUT_LANGUAGE_SELECTOR_PANEL } from '../interfaces/layout-auth.interface';\nimport { LayoutService } from '../services/public-api';\nimport { AppConfigurator } from './app.configurator';\n\n@Component({\n selector: 'app-floating-configurator',\n imports: [NgComponentOutlet, UiModule, AppConfigurator],\n template: `\n <div\n class=\"floating-configurator fixed flex flex-col md:flex-row gap-2 md:gap-4 top-4 md:top-8 z-50\"\n >\n <button\n fButton\n type=\"button\"\n (click)=\"toggleDarkMode()\"\n [rounded]=\"true\"\n severity=\"secondary\"\n >\n <ui-icon pButtonIcon [name]=\"isDarkTheme() ? 'moon' : 'sun'\"></ui-icon>\n </button>\n @if (languageSelectorPanel) {\n <div class=\"relative\">\n <button\n fButton\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n type=\"button\"\n rounded\n >\n <ui-icon pButtonIcon name=\"globe\"></ui-icon>\n </button>\n <ng-container *ngComponentOutlet=\"languageSelectorPanel\" />\n </div>\n }\n <div class=\"relative\">\n <button\n fButton\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n type=\"button\"\n rounded\n >\n <ui-icon pButtonIcon name=\"palette\"></ui-icon>\n </button>\n <app-configurator />\n </div>\n </div>\n `,\n styles: `\n .floating-configurator {\n inset-inline-end: 0.5rem;\n }\n @media (min-width: 768px) {\n .floating-configurator {\n inset-inline-end: 2rem;\n }\n }\n `,\n})\nexport class AppFloatingConfigurator {\n private readonly layoutService = inject(LayoutService);\n readonly languageSelectorPanel = inject(LAYOUT_LANGUAGE_SELECTOR_PANEL, {\n optional: true,\n });\n\n readonly isDarkTheme = computed(\n () => this.layoutService.layoutConfig().darkTheme,\n );\n\n toggleDarkMode(): void {\n const currentDarkTheme = this.layoutService.layoutConfig().darkTheme;\n this.layoutService.updateLayoutConfig({ darkTheme: !currentDarkTheme });\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n isActive as isRouteActive,\n NavigationEnd,\n Router,\n RouterModule,\n} from '@angular/router';\nimport { IconComponent, TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { filter } from 'rxjs/operators';\nimport { IMenuItem } from '../interfaces/public-api';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: '[app-menuitem]',\n imports: [UiModule, IconComponent, RouterModule, TranslatePipe],\n template: `\n <ng-container>\n @if (item().children?.length) {\n <a\n (click)=\"itemClick()\"\n (mouseenter)=\"onMouseEnter()\"\n #parentLink\n tabindex=\"0\"\n >\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{\n item().labelKey ? (item().labelKey! | translate) : item().label\n }}</span>\n @if (item().children) {\n @if (layoutService.isTopbar()) {\n <ui-icon name=\"chevron-right\" class=\"layout-submenu-toggler\"></ui-icon>\n } @else {\n <ui-icon name=\"angle-down\" class=\"layout-submenu-toggler\"></ui-icon>\n }\n }\n </a>\n }\n @if (item().routerLink && !item().children?.length) {\n <a\n (click)=\"itemClick()\"\n [routerLink]=\"routerLink()\"\n routerLinkActive=\"active-route\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n tabindex=\"0\"\n >\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{\n item().labelKey ? (item().labelKey! | translate) : item().label\n }}</span>\n </a>\n }\n @if (item().children) {\n <ul\n (mouseenter)=\"onMouseEnter()\"\n [class.submenu-expanded]=\"active() && !layoutService.isTopbar()\"\n [class.submenu-collapsed]=\"!active() && !layoutService.isTopbar()\"\n >\n @for (\n child of item().children;\n track 'menu' + child.id + '' + i;\n let i = $index\n ) {\n <li\n app-menuitem\n [item]=\"child\"\n [index]=\"i\"\n [parentKey]=\"key()\"\n ></li>\n }\n </ul>\n }\n </ng-container>\n `,\n styles: `\n :host ul {\n overflow: hidden;\n transition: max-height 400ms cubic-bezier(0.86, 0, 0.07, 1);\n }\n :host ul.submenu-collapsed {\n max-height: 0;\n }\n :host ul.submenu-expanded {\n max-height: 1000px;\n }\n `,\n host: {\n '[class.active-menuitem]': 'active()',\n },\n})\nexport class AppMenuitem {\n // Signal inputs\n readonly item = input.required<IMenuItem>();\n readonly index = input.required<number>();\n readonly parentKey = input<string>('');\n\n // Injected services\n private readonly router = inject(Router);\n readonly layoutService = inject(LayoutService);\n private readonly destroyRef = inject(DestroyRef);\n\n // View references\n private readonly parentLink =\n viewChild<ElementRef<HTMLElement>>('parentLink');\n\n // State signals - private writable + public readonly pattern\n private readonly _active = signal(false);\n readonly active = this._active.asReadonly();\n\n // Computed signals\n readonly key = computed(() => {\n const parent = this.parentKey();\n return parent ? `${parent}-${this.index()}` : String(this.index());\n });\n\n readonly routerLink = computed(() => {\n const menuItem = this.item();\n return menuItem.routerLink ?? [];\n });\n\n // Computed options for routerLinkActive - use 'exact' for root, 'subset' for others\n readonly routerLinkActiveOptions = computed(() => {\n const link = this.routerLink();\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n return {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n } as const;\n });\n\n constructor() {\n // Subscribe to menu source changes\n this.layoutService.menuSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n Promise.resolve(null).then(() => {\n const currentKey = this.key();\n if (value.routeEvent) {\n this._active.set(\n value.key === currentKey ||\n value.key?.startsWith(currentKey + '-'),\n );\n } else if (\n value.key !== currentKey &&\n !value.key?.startsWith(currentKey + '-')\n ) {\n this._active.set(false);\n }\n });\n });\n\n // Subscribe to menu reset\n this.layoutService.resetSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this._active.set(false));\n\n // Subscribe to navigation events\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n if (this.item().routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n\n // Effect to update active state on init when item has routerLink\n effect(() => {\n const menuItem = this.item();\n if (menuItem.routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n\n // Effect to update submenu position when active in topbar mode\n effect(() => {\n if (this.active() && this.parentLink()) {\n Promise.resolve().then(() => this.updateSubmenuPosition());\n }\n });\n }\n\n onMouseEnter(): void {\n if (this.layoutService.isTopbar() && this.item().children) {\n this.updateSubmenuPosition();\n }\n }\n\n private updateSubmenuPosition(): void {\n const linkEl = this.parentLink()?.nativeElement;\n if (!linkEl || typeof linkEl.getBoundingClientRect !== 'function') return;\n\n const rect = linkEl.getBoundingClientRect();\n const hostEl = linkEl.closest('[app-menuitem]');\n if (!hostEl) return;\n\n // Position submenu to the left of the parent link and above it\n const left = rect.left;\n const top = rect.top + 30; // 8px gap above the menu item\n\n (hostEl as HTMLElement).style.setProperty('--submenu-left', `${left}px`);\n (hostEl as HTMLElement).style.setProperty('--submenu-top', `${top}px`);\n }\n\n private updateActiveStateFromRoute(): void {\n const link = this.routerLink();\n if (!link.length) return;\n\n // Use 'exact' for root path to avoid matching all routes\n // Use 'subset' for all other paths to match child routes\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n\n const active = isRouteActive(link[0], this.router, {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n })();\n\n if (active) {\n this.layoutService.onMenuStateChange({\n key: this.key(),\n routeEvent: true,\n });\n }\n }\n\n itemClick(): void {\n if (this.item().children && !this.layoutService.isTopbar()) {\n this._active.update((prev) => !prev);\n }\n this.layoutService.onMenuStateChange({ key: this.key() });\n }\n}\n","import { Component, inject } from '@angular/core';\n\nimport { RouterModule } from '@angular/router';\nimport { LayoutService } from '../services/layout.service';\nimport { AppMenuitem } from './app.menuitem';\n\n/**\n * Main menu component that displays filtered menu items.\n * Menu is automatically filtered based on user permissions using the permission checker (logicNode pattern).\n * The filtering happens internally in LayoutService via computed signal.\n */\n@Component({\n selector: 'app-menu',\n imports: [AppMenuitem, RouterModule],\n template: `<div class=\"layout-menu\">\n <ul>\n @for (\n item of menuItems();\n track 'menu' + item.id + '' + i;\n let i = $index\n ) {\n <li app-menuitem [item]=\"item\" [index]=\"i\"></li>\n }\n </ul>\n </div>`,\n})\nexport class AppMenu {\n private readonly layoutService = inject(LayoutService);\n\n /**\n * Filtered menu items from layout service.\n * This signal is computed in LayoutService and automatically updates when:\n * - Raw menu changes (setMenu called)\n * - Permission state changes (user permissions updated)\n */\n readonly menuItems = this.layoutService.menu;\n}\n","/**\n * View Transitions API type definitions\n * @see https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API\n */\n\nexport interface ViewTransition {\n /** Promise fulfilled when the transition animation is complete */\n finished: Promise<void>;\n /** Promise fulfilled when the pseudo-element tree is ready */\n ready: Promise<void>;\n /** Promise fulfilled when the callback finishes */\n updateCallbackDone: Promise<void>;\n /** Skip the transition animation */\n skipTransition(): void;\n}\n\n/**\n * Extended Document interface with View Transitions API support.\n * Uses the native Document type with startViewTransition which is now\n * part of the standard TypeScript DOM library.\n */\nexport type DocumentWithViewTransition = Document;\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MessageService } from '@flusys/ng-ui';\nimport { UiModule } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type { IBranchInfo, ICompanyInfo } from '../../interfaces/public-api';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\n\n/** Company/branch switcher displayed in top bar */\n@Component({\n selector: 'app-company-branch-selector',\n imports: [UiModule, AngularModule,\n TranslatePipe,],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"onPanelToggle()\"\n >\n <ui-icon name=\"building\"></ui-icon>\n <span>{{ currentCompanyName() }}</span>\n @if (currentBranchName()) {\n <span class=\"text-xs opacity-70 ml-1\">| {{ currentBranchName() }}</span>\n }\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-xl w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[300px] max-w-[360px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\"\n >\n <div class=\"flex flex-col gap-4\">\n <span class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.company.branch.selector.title' | translate\n }}</span>\n\n <!-- Company Selector -->\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">{{\n 'shared.company' | translate\n }}</label>\n <f-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"onCompanyChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'layout.company.branch.selector.select.company' | translate\n \"\n class=\"w-full\"\n [loading]=\"isLoadingCompanies()\"\n />\n </div>\n\n <!-- Branch Selector -->\n @if (selectedCompanyId() && branches().length > 0) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">{{\n 'layout.company.branch.selector.branch' | translate\n }}</label>\n <f-select\n [options]=\"branches()\"\n [ngModel]=\"selectedBranchId()\"\n (ngModelChange)=\"onBranchChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"\n 'layout.company.branch.selector.select.branch' | translate\n \"\n class=\"w-full\"\n [loading]=\"isLoadingBranches()\"\n />\n </div>\n }\n\n <!-- Actions -->\n <div class=\"flex gap-2 pt-2\">\n <button\n fButton\n class=\"flex-1\"\n [disabled]=\"!canSwitch() || isSwitching()\"\n (click)=\"onSwitch()\"\n >\n @if (isSwitching()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"sync\"></ui-icon>\n }\n <span pButtonLabel>{{ 'layout.company.branch.selector.switch.button' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n `,\n})\nexport class AppCompanyBranchSelector {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n readonly currentCompanyName = computed(\n () =>\n this.authState?.currentCompanyInfo()?.name ??\n this.translate('layout.company.branch.selector.no.company'),\n );\n readonly currentBranchName = computed(\n () => this.authState?.currentBranchInfo()?.name ?? null,\n );\n\n private readonly _companies = signal<ICompanyInfo[]>([]);\n readonly companies = this._companies.asReadonly();\n private readonly _branches = signal<IBranchInfo[]>([]);\n readonly branches = this._branches.asReadonly();\n private readonly _selectedCompanyId = signal<string | null>(null);\n readonly selectedCompanyId = this._selectedCompanyId.asReadonly();\n private readonly _selectedBranchId = signal<string | null>(null);\n readonly selectedBranchId = this._selectedBranchId.asReadonly();\n private readonly _isLoadingCompanies = signal(false);\n readonly isLoadingCompanies = this._isLoadingCompanies.asReadonly();\n private readonly _isLoadingBranches = signal(false);\n readonly isLoadingBranches = this._isLoadingBranches.asReadonly();\n private readonly _isSwitching = signal(false);\n readonly isSwitching = this._isSwitching.asReadonly();\n\n readonly canSwitch = computed(() => {\n const selectedCompany = this.selectedCompanyId();\n if (!selectedCompany) return false;\n\n const currentCompanyId = this.authState?.currentCompanyInfo()?.id;\n const currentBranchId = this.authState?.currentBranchInfo()?.id;\n const selectedBranch = this.selectedBranchId();\n\n return (\n selectedCompany !== currentCompanyId || selectedBranch !== currentBranchId\n );\n });\n\n onPanelToggle(): void {\n this._isActive.update((v) => !v);\n if (this.isActive() && this.companies().length === 0) {\n this.loadCompanies();\n }\n }\n\n private loadCompanies(): void {\n if (!this.authApi) return;\n\n this._isLoadingCompanies.set(true);\n this.authApi\n .getUserCompanies()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (companies) => {\n this._companies.set(companies);\n this._isLoadingCompanies.set(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n this._isLoadingCompanies.set(false);\n },\n });\n }\n\n onCompanyChange(companyId: string | null): void {\n this._selectedCompanyId.set(companyId);\n\n if (!companyId) {\n this._branches.set([]);\n this._selectedBranchId.set(null);\n return;\n }\n\n this.loadBranches(companyId);\n }\n\n onBranchChange(branchId: string | null): void {\n this._selectedBranchId.set(branchId);\n }\n\n private loadBranches(companyId: string): void {\n if (!this.authApi) return;\n\n this._isLoadingBranches.set(true);\n this._selectedBranchId.set(null);\n\n this.authApi\n .getCompanyBranches(companyId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (branches) => {\n this._branches.set(branches);\n this._isLoadingBranches.set(false);\n\n // Auto-select if only one branch available\n if (branches.length === 1) {\n this._selectedBranchId.set(branches[0].id);\n }\n },\n error: () => {\n // Error toast handled by global interceptor\n this._isLoadingBranches.set(false);\n },\n });\n }\n\n onSwitch(): void {\n const selectedCompany = this.selectedCompanyId();\n const selectedBranch = this.selectedBranchId();\n\n if (!this.authApi || !selectedCompany) return;\n\n if (this.branches().length > 0 && !selectedBranch) {\n this.messageService.add({\n severity: 'warn',\n summary: this.translate(\n 'layout.company.branch.selector.branch.required',\n ),\n detail: this.translate(\n 'layout.company.branch.selector.please.select.branch',\n ),\n });\n return;\n }\n\n this._isSwitching.set(true);\n\n this.authApi\n .switchCompany(selectedCompany, selectedBranch || '')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {},\n error: () => {\n // Error toast handled by global interceptor\n this._isSwitching.set(false);\n },\n });\n }\n\n private translate(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-launcher',\n imports: [UiModule, TranslatePipe],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"toggleActive()\"\n >\n <ui-icon name=\"th-large\"></ui-icon>\n <span>{{ 'layout.launcher.apps' | translate }}</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 border border-surface rounded-border origin-top surface-overlay\"\n style=\"inset-inline-end: 0; min-width: 16rem; max-width: 22rem; width: calc(100vw - 2rem); box-shadow: var(--f-shadow-xl);\"\n >\n <div class=\"px-4 py-3 border-b border-surface\">\n <span class=\"text-xs font-semibold tracking-wide text-muted-color\">{{\n 'layout.launcher.applications' | translate\n }}</span>\n </div>\n @if (layoutService.apps().length === 0) {\n <div class=\"px-4 py-6 text-center text-muted-color text-sm\">\n {{ 'layout.launcher.no.apps' | translate }}\n </div>\n } @else {\n <div class=\"p-3 grid grid-cols-3 gap-1\">\n @for (app of layoutService.apps(); track app.id) {\n <a\n class=\"group flex flex-col items-center gap-2 p-3 rounded-border cursor-pointer no-underline transition-colors duration-150 hover:bg-emphasis\"\n [href]=\"app.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <div\n class=\"flex items-center justify-center w-9 h-9 rounded-border bg-primary/10 group-hover:bg-primary transition-colors duration-150\"\n >\n <ui-icon\n [name]=\"app.icon\"\n class=\"text-base text-primary group-hover:text-primary-contrast transition-colors duration-150\"\n ></ui-icon>\n </div>\n <span\n class=\"text-xs text-center text-muted-color group-hover:text-color transition-colors duration-150 truncate w-full text-center leading-tight\"\n >\n {{ app.nameKey ? (app.nameKey | translate) : app.name }}\n </span>\n </a>\n }\n </div>\n }\n </div>\n `,\n})\nexport class AppLauncher {\n readonly layoutService = inject(LayoutService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n toggleActive(): void {\n this._isActive.update((v) => !v);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { APP_CONFIG, isSignUpEnabled } from '@flusys/ng-core';\nimport { MessageService } from '@flusys/ng-ui';\nimport { UiModule } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-profile',\n imports: [UiModule, AngularModule, TranslatePipe],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\"\n >\n <ui-icon name=\"user\"></ui-icon>\n <span>{{ 'layout.profile.title' | translate }}</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] z-50 p-4 border border-surface rounded-border origin-top shadow-xl w-[calc(100vw-2rem)] sm:w-auto sm:min-w-[280px] max-w-[320px]\"\n style=\"background-color: var(--surface-overlay); inset-inline-end: 0;\"\n >\n <div class=\"flex flex-col gap-3\">\n <!-- User Info -->\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline hover:bg-emphasis transition-all duration-200\"\n routerLink=\"/profile\"\n >\n @if (profilePicture()) {\n <img\n [src]=\"profilePicture()\"\n class=\"w-12 h-12 rounded-border object-cover\"\n [alt]=\"'layout.profile.profile.picture.alt' | translate\"\n />\n } @else {\n <div\n class=\"w-12 h-12 rounded-border bg-primary flex items-center justify-center\"\n >\n <ui-icon name=\"user\" class=\"text-xl text-primary-contrast\"></ui-icon>\n </div>\n }\n <div class=\"flex flex-col min-w-0 flex-1\">\n <span class=\"font-semibold text-color truncate\">{{\n userName()\n }}</span>\n <span class=\"text-sm text-muted-color truncate\">{{\n userEmail()\n }}</span>\n </div>\n </a>\n\n <!-- Divider -->\n <div class=\"border-t border-surface\"></div>\n\n <!-- Menu Items -->\n <div class=\"flex flex-col gap-1\">\n @if (signUpEnabled()) {\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"copySignUpLink()\"\n >\n <ui-icon name=\"link\" class=\"text-muted-color\"></ui-icon>\n <span>{{ 'layout.profile.copy.sign.up.link' | translate }}</span>\n </a>\n }\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"logout()\"\n >\n <ui-icon name=\"sign-out\" class=\"text-muted-color\"></ui-icon>\n <span>{{ 'layout.profile.logout' | translate }}</span>\n </a>\n </div>\n </div>\n </div>\n `,\n})\nexport class AppProfile {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly layoutService = inject(LayoutService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly appConfig = inject(APP_CONFIG, { optional: true });\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n private readonly _isActive = signal(false);\n readonly isActive = this._isActive.asReadonly();\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this._isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this._isActive.update((v) => !v);\n }\n\n readonly userName = computed(\n () =>\n this.authState?.loginUserData()?.name ??\n this.translate('layout.profile.guest'),\n );\n readonly userEmail = computed(\n () => this.authState?.loginUserData()?.email ?? '',\n );\n readonly profilePicture = computed(\n () => this.layoutService.userProfilePictureUrl() ?? '',\n );\n readonly signUpEnabled = computed(() =>\n this.appConfig ? isSignUpEnabled(this.appConfig) : false,\n );\n\n logout(): void {\n if (!this.authApi) return;\n\n this.authApi\n .logOut()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (result) => {\n const r = result as unknown as {\n messageKey?: string;\n messageVariables?: Record<string, string | number>;\n message?: string;\n };\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: r?.messageKey\n ? this.translate(r.messageKey, r.messageVariables)\n : (r?.message ?? ''),\n });\n this.authApi?.navigateLogin(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n },\n });\n }\n\n copySignUpLink(): void {\n const slug = this.authState?.currentCompanyInfo()?.slug ?? '';\n const signUpLink = `${window.location.origin}/auth/register?companySlug=${slug}`;\n navigator.clipboard\n .writeText(signUpLink)\n .then(() => {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('layout.profile.link.copied'),\n detail: this.translate('layout.profile.sign.up.link.copied'),\n });\n })\n .catch(() => {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.error'),\n detail: this.translate('layout.profile.failed.copy.sign.up.link'),\n });\n });\n }\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { AngularModule, TranslatePipe } from '@flusys/ng-shared';\nimport { fromEvent } from 'rxjs';\nimport {\n ISearchSuggestion,\n LAYOUT_SEARCH_ADAPTER,\n} from '../../interfaces/layout-auth.interface';\nimport { LayoutService } from '../../services/public-api';\nimport { UiModule } from '@flusys/ng-ui';\n\n@Component({\n selector: 'app-searchbar',\n imports: [UiModule, AngularModule, TranslatePipe],\n template: `\n <div\n class=\"search-container h-full\"\n #searchWrapper\n [class.topbar-mode]=\"layoutService.isTopbar() || isResponsive()\"\n >\n @if (layoutService.isTopbar() || isResponsive()) {\n <!-- Topbar/Mobile Icon Mode -->\n <button\n type=\"button\"\n class=\"search-toggle-btn layout-topbar-action\"\n (click)=\"toggleSearch()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n >\n <ui-icon name=\"search\"></ui-icon>\n </button>\n\n @if (isSearchExpanded()) {\n <div class=\"search-dropdown-panel\">\n <f-iconfield class=\"search-iconfield\">\n <f-inputicon class=\"search-icon\"><ui-icon name=\"search\" /></f-inputicon>\n <input\n type=\"text\"\n fInputText\n class=\"search-input w-full\"\n [placeholder]=\"'layout.topbar.search.placeholder' | translate\"\n [(ngModel)]=\"searchTerm\"\n (keyup.enter)=\"handleEnter()\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n #searchInput\n autocomplete=\"off\"\n />\n </f-iconfield>\n\n @if (suggestionsOpen() && suggestions().length > 0) {\n <div class=\"search-suggestions\">\n <ul class=\"suggestions-list\">\n @for (\n item of suggestions();\n track item.label;\n let idx = $index\n ) {\n <li\n class=\"suggestion-item\"\n [class.focused]=\"idx === focusedIndex()\"\n (click)=\"selectSuggestion(item)\"\n (mouseenter)=\"focusedIndex.set(idx)\"\n role=\"option\"\n [attr.aria-selected]=\"idx === focusedIndex()\"\n >\n @if (item.icon) {\n <ui-icon [name]=\"item.icon\" class=\"suggestion-icon\"></ui-icon>\n }\n <span class=\"suggestion-label\">{{ item.label }}</span>\n </li>\n }\n </ul>\n </div>\n }\n </div>\n }\n } @else {\n <!-- Desktop Full Input Mode -->\n <f-iconfield class=\"search-iconfield\">\n <f-inputicon class=\"search-icon cursor-pointer\" (click)=\"onSearch()\"><ui-icon name=\"search\" /></f-inputicon>\n <input\n type=\"text\"\n fInputText\n class=\"search-input w-full\"\n [placeholder]=\"'layout.topbar.search.placeholder' | translate\"\n [(ngModel)]=\"searchTerm\"\n (keyup.enter)=\"handleEnter()\"\n (keydown)=\"handleKeydown($event)\"\n (focus)=\"onFocus()\"\n [attr.aria-label]=\"'layout.topbar.search' | translate\"\n #searchInput\n />\n </f-iconfield>\n\n @if (suggestionsOpen() && suggestions().length > 0) {\n <div class=\"search-dropdown\">\n <ul class=\"suggestions-list\">\n @for (item of suggestions(); track item.label; let idx = $index) {\n <li\n class=\"suggestion-item\"\n [class.focused]=\"idx === focusedIndex()\"\n (click)=\"selectSuggestion(item)\"\n (mouseenter)=\"focusedIndex.set(idx)\"\n role=\"option\"\n [attr.aria-selected]=\"idx === focusedIndex()\"\n >\n @if (item.icon) {\n <ui-icon [name]=\"item.icon\" class=\"suggestion-icon\"></ui-icon>\n }\n <span class=\"suggestion-label\">{{ item.label }}</span>\n </li>\n }\n </ul>\n </div>\n }\n }\n </div>\n `,\n styles: [\n `\n .search-container {\n display: flex;\n align-items: center;\n position: relative;\n width: 100%;\n flex: 0 1 auto;\n }\n\n .search-container.topbar-mode {\n width: auto;\n }\n\n .search-dropdown-panel {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 0.5rem;\n background-color: var(--surface-card);\n border: 1px solid var(--surface-border);\n border-radius: var(--f-content-border-radius);\n box-shadow: var(--f-shadow-xl);\n z-index: 1100;\n padding: 1rem 0.75rem 0.75rem 0.75rem;\n min-width: 300px;\n max-width: 450px;\n animation: slideDown 0.2s ease-out;\n }\n\n .search-suggestions {\n margin-top: 0.5rem;\n border-top: 1px solid var(--surface-border);\n padding-top: 0.5rem;\n background-color: inherit;\n }\n\n .suggestions-list {\n list-style: none;\n margin: 0;\n padding: 0;\n max-height: 360px;\n overflow-y: auto;\n background-color: inherit;\n }\n\n .suggestion-item {\n padding: 0.75rem 1rem;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n color: var(--text-color);\n border-bottom: 1px solid var(--surface-border);\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n .suggestion-item:last-child {\n border-bottom: none;\n }\n\n .suggestion-item:hover,\n .suggestion-item.focused {\n background-color: var(--surface-50);\n color: var(--primary-color);\n }\n\n .suggestion-icon {\n color: var(--text-color-secondary);\n font-size: 1rem;\n flex-shrink: 0;\n transition: color 0.15s ease;\n }\n\n .suggestion-item:hover .suggestion-icon,\n .suggestion-item.focused .suggestion-icon {\n color: var(--primary-color);\n }\n\n .suggestion-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .search-dropdown {\n position: absolute;\n top: calc(100% + 0.5rem);\n left: 0;\n right: 0;\n background-color: var(--surface-card);\n border: 1px solid var(--surface-border);\n border-radius: var(--f-content-border-radius);\n box-shadow: var(--f-shadow-xl);\n z-index: 1000;\n overflow: hidden;\n }\n\n .search-dropdown .suggestions-list {\n background-color: inherit;\n }\n\n @keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Responsive styles */\n @media (max-width: 768px) {\n .search-dropdown-panel {\n min-width: 280px;\n max-width: 400px;\n }\n }\n\n @media (max-width: 576px) {\n .search-dropdown-panel {\n position: fixed;\n top: 4rem;\n left: 0;\n right: 0;\n bottom: auto;\n width: 100vw;\n min-width: 100vw;\n max-width: 100vw;\n margin-top: 0;\n padding: 1rem;\n border-radius: 0;\n border-bottom: 1px solid var(--surface-border);\n z-index: 1200;\n }\n\n .search-dropdown-panel .search-iconfield {\n margin-bottom: 1rem;\n }\n\n .search-dropdown {\n max-width: 100%;\n left: 0 !important;\n right: 0 !important;\n transform: none;\n position: static;\n border-radius: var(--f-content-border-radius);\n margin-top: 0;\n }\n\n .suggestion-item {\n padding: 0.75rem;\n }\n }\n `,\n ],\n})\nexport class AppSearchbar {\n readonly layoutService = inject(LayoutService);\n private readonly router = inject(Router);\n private readonly searchAdapter = inject(LAYOUT_SEARCH_ADAPTER, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n\n readonly searchTerm = signal<string>('');\n readonly suggestionsOpen = signal<boolean>(false);\n readonly suggestions = signal<ISearchSuggestion[]>([]);\n readonly focusedIndex = signal<number>(-1);\n readonly isSearchExpanded = signal<boolean>(false);\n readonly isResponsive = signal<boolean>(\n typeof window !== 'undefined' ? window.innerWidth < 768 : false,\n );\n\n private readonly searchWrapper = viewChild<ElementRef>('searchWrapper');\n private readonly searchInput = viewChild<ElementRef>('searchInput');\n private searchTimeout?: ReturnType<typeof setTimeout>;\n\n constructor() {\n // Track responsive breakpoint (mobile < 768px)\n if (typeof window !== 'undefined') {\n fromEvent(window, 'resize')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.isResponsive.set(window.innerWidth < 768);\n });\n }\n\n // Close dropdown/search on outside click\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n const wrapper = this.searchWrapper()?.nativeElement;\n const target = event.target as HTMLElement;\n\n if (wrapper && !wrapper.contains(target)) {\n if (this.suggestionsOpen()) {\n this.closeSuggestions();\n }\n if (\n this.isSearchExpanded() &&\n (this.layoutService.isTopbar() || this.isResponsive())\n ) {\n this.closeSearch();\n }\n }\n });\n\n // Debounced search for suggestions\n effect(() => {\n const query = this.searchTerm();\n clearTimeout(this.searchTimeout);\n\n if (!this.searchAdapter || !query.trim()) {\n this.suggestions.set([]);\n this.focusedIndex.set(-1);\n return;\n }\n\n this.searchTimeout = setTimeout(() => {\n this.searchAdapter!.getSuggestions(query)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((results) => {\n this.suggestions.set(results);\n this.focusedIndex.set(-1);\n this.suggestionsOpen.set(results.length > 0);\n });\n }, 300);\n });\n }\n\n onFocus(): void {\n if (this.suggestions().length > 0) {\n this.suggestionsOpen.set(true);\n }\n }\n\n handleKeydown(event: KeyboardEvent): void {\n const items = this.suggestions();\n const current = this.focusedIndex();\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.focusedIndex.set(current < items.length - 1 ? current + 1 : 0);\n this.suggestionsOpen.set(items.length > 0);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.focusedIndex.set(current > 0 ? current - 1 : items.length - 1);\n break;\n case 'Escape':\n event.preventDefault();\n this.closeSuggestions();\n break;\n }\n }\n\n handleEnter(): void {\n const current = this.focusedIndex();\n const items = this.suggestions();\n\n if (current >= 0 && current < items.length) {\n this.selectSuggestion(items[current]);\n } else if (items.length > 0) {\n this.selectSuggestion(items[0]);\n } else {\n this.onSearch();\n }\n }\n\n selectSuggestion(item: ISearchSuggestion): void {\n if (item.routerLink) {\n this.router.navigate(item.routerLink);\n }\n this.searchTerm.set('');\n this.closeSuggestions();\n if (this.layoutService.isTopbar() || this.isResponsive()) {\n this.closeSearch();\n }\n }\n\n private closeSuggestions(): void {\n this.suggestionsOpen.set(false);\n this.focusedIndex.set(-1);\n }\n\n toggleSearch(): void {\n this.isSearchExpanded.set(!this.isSearchExpanded());\n if (this.isSearchExpanded()) {\n setTimeout(() => {\n this.searchInput()?.nativeElement?.focus();\n }, 100);\n }\n }\n\n private closeSearch(): void {\n this.isSearchExpanded.set(false);\n this.closeSuggestions();\n }\n\n onSearch(): void {\n const query = this.searchTerm();\n if (this.searchAdapter?.onSearch && query.trim()) {\n this.searchAdapter.onSearch(query);\n }\n }\n}\n","import { DOCUMENT, NgComponentOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterModule } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { InlineSvgComponent, TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n LAYOUT_LANGUAGE_SELECTOR,\n LAYOUT_NOTIFICATION_BELL,\n LAYOUT_SEARCH_ADAPTER,\n} from '../interfaces/layout-auth.interface';\nimport { LayoutService } from '../services/public-api';\nimport { AppConfigurator } from './app.configurator';\nimport { AppMenu } from './app.menu';\nimport { AppCompanyBranchSelector } from './top-bar/app.company-branch-selector';\nimport { AppLauncher } from './top-bar/app.launcher';\nimport { AppProfile } from './top-bar/app.profile';\nimport { AppSearchbar } from './top-bar/app.searchbar';\n\ntype ActivePanel = 'config' | null;\n\n@Component({\n selector: 'app-topbar',\n imports: [UiModule, RouterModule,\n NgComponentOutlet,\n TranslatePipe,\n InlineSvgComponent,\n AppConfigurator,\n AppMenu,\n AppProfile,\n AppCompanyBranchSelector,\n AppLauncher,\n AppSearchbar,],\n template: `<div class=\"layout-topbar\">\n <div\n class=\"layout-topbar-logo-container\"\n [class.layout-topbar-logo-container-desktop]=\"layoutService.isDesktop()\"\n >\n @if (!layoutService.isTopbar() && layoutService.isMobile()) {\n <button\n class=\"layout-menu-button layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.toggle.menu' | translate\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <ui-icon name=\"bars\"></ui-icon>\n </button>\n }\n <a class=\"layout-topbar-logo\" routerLink=\"/\">\n @if (displayLogo()) {\n @if (layoutService.isDisplayLogoSvg()) {\n <inline-svg [src]=\"displayLogo()\" class=\"logo-image\" />\n } @else {\n <img\n [src]=\"displayLogo()\"\n [alt]=\"companyName()\"\n class=\"logo-image\"\n />\n }\n }\n <span class=\"hidden sm:inline\">{{ companyName() }}</span>\n </a>\n @if (!layoutService.isTopbar() && layoutService.isDesktop()) {\n <button\n class=\"layout-menu-button layout-topbar-action layout-topbar-action-right\"\n [attr.aria-label]=\"'layout.topbar.toggle.menu' | translate\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <ui-icon name=\"bars\"></ui-icon>\n </button>\n }\n </div>\n\n @if (layoutService.isTopbar() && layoutService.isDesktop()) {\n <div\n #navContainer\n class=\"layout-topbar-nav-horizontal\"\n [class.layout-topbar-nav-hidden]=\"\n !layoutService.layoutState().topbarMenuVisible\n \"\n >\n <app-menu />\n </div>\n }\n\n <div class=\"layout-topbar-actions\">\n @if (hasSearchAdapter()) {\n <app-searchbar />\n }\n <div class=\"layout-config-menu\">\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.toggle.dark.mode' | translate\"\n (click)=\"toggleDarkMode()\"\n >\n <ui-icon [name]=\"layoutService.isDarkTheme() ? 'moon' : 'sun'\"></ui-icon>\n </button>\n <div class=\"relative\" #configContainer>\n <button\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"activePanel() === 'config'\"\n [attr.aria-label]=\"'layout.topbar.open.theme.settings' | translate\"\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel('config')\"\n >\n <ui-icon name=\"palette\"></ui-icon>\n </button>\n <app-configurator />\n </div>\n </div>\n\n <button\n class=\"layout-topbar-menu-button layout-topbar-action\"\n [attr.aria-label]=\"'layout.topbar.more.options' | translate\"\n fStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n >\n <ui-icon name=\"ellipsis-v\"></ui-icon>\n </button>\n\n <div class=\"layout-topbar-menu hidden lg:block\">\n <div class=\"layout-topbar-menu-content\">\n @if (layoutService.hasApps()) {\n <app-launcher />\n }\n @if (languageSelectorComponent) {\n <ng-container *ngComponentOutlet=\"languageSelectorComponent\" />\n }\n @if (enableCompanyFeature) {\n <app-company-branch-selector />\n }\n @if (notificationBellComponent) {\n <ng-container *ngComponentOutlet=\"notificationBellComponent\" />\n }\n <app-profile />\n </div>\n </div>\n </div>\n </div>`,\n})\nexport class AppTopbar {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n readonly layoutService = inject(LayoutService);\n readonly notificationBellComponent = inject(LAYOUT_NOTIFICATION_BELL, {\n optional: true,\n });\n readonly languageSelectorComponent = inject(LAYOUT_LANGUAGE_SELECTOR, {\n optional: true,\n });\n private readonly searchAdapter = inject(LAYOUT_SEARCH_ADAPTER, {\n optional: true,\n });\n\n readonly hasSearchAdapter = computed(() => !!this.searchAdapter);\n\n private readonly configContainer =\n viewChild<ElementRef<HTMLElement>>('configContainer');\n private readonly navContainer =\n viewChild<ElementRef<HTMLElement>>('navContainer');\n\n readonly activePanel = signal<ActivePanel>(null);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.activePanel() !== null),\n )\n .subscribe((event) => {\n this.handleOutsideClick(event);\n });\n\n effect(() => {\n const nav = this.navContainer();\n if (nav && this.layoutService.isTopbar()) {\n fromEvent(nav.nativeElement, 'scroll')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.recalculateHoveredSubmenu(nav.nativeElement));\n }\n });\n }\n\n readonly companyName = this.layoutService.companyName;\n readonly displayLogo = this.layoutService.displayLogo;\n\n readonly enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);\n\n toggleDarkMode(): void {\n const currentDarkTheme = this.layoutService.layoutConfig().darkTheme;\n this.layoutService.updateLayoutConfig({ darkTheme: !currentDarkTheme });\n }\n\n togglePanel(panel: ActivePanel): void {\n this.activePanel.update((current) => (current === panel ? null : panel));\n }\n\n private handleOutsideClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n const configEl = this.configContainer()?.nativeElement;\n\n if (configEl && !configEl.contains(target)) {\n this.activePanel.set(null);\n }\n }\n\n private recalculateHoveredSubmenu(navEl: HTMLElement): void {\n const hoveredItems = navEl.querySelectorAll('li:hover');\n hoveredItems.forEach((li) => {\n const link = li.querySelector(':scope > a') as HTMLElement | null;\n if (!link) return;\n const rect = link.getBoundingClientRect();\n const top = rect.bottom + 12;\n const left = rect.left - 12;\n (li as HTMLElement).style.setProperty('--submenu-left', `${left}px`);\n (li as HTMLElement).style.setProperty('--submenu-top', `${top}px`);\n });\n }\n}\n","import { Component } from '@angular/core';\nimport { AppMenu } from './app.menu';\n\n@Component({\n selector: 'app-sidebar',\n imports: [AppMenu],\n template: `\n <div class=\"layout-sidebar\">\n <app-menu />\n </div>\n `,\n})\nexport class AppSidebar {}\n","import { Component, computed, DestroyRef, DOCUMENT, inject, Renderer2 } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AppTopbar } from './app.topbar';\nimport { AppSidebar } from './app.sidebar';\nimport { AppFooter } from './app.footer';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-layout',\n imports: [AppTopbar, AppSidebar, RouterModule, AppFooter],\n template: `\n <div\n class=\"layout-wrapper\"\n [class.layout-overlay]=\"isOverlay()\"\n [class.layout-static]=\"isStatic()\"\n [class.layout-topbar-mode]=\"isTopbarMode()\"\n [class.layout-static-inactive]=\"isStaticInactive()\"\n [class.layout-overlay-active]=\"isOverlayActive()\"\n [class.layout-mobile-active]=\"isMobileActive()\"\n [class.layout-topbar-nav-hidden]=\"isTopbarNavHidden()\"\n >\n <app-topbar></app-topbar>\n <app-sidebar></app-sidebar>\n <div class=\"layout-main-container\">\n <div class=\"layout-main\">\n <router-outlet></router-outlet>\n </div>\n <app-footer></app-footer>\n </div>\n <div class=\"layout-mask animate-fadein\"></div>\n </div>\n `,\n})\nexport class AppLayout {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n readonly layoutService = inject(LayoutService);\n private readonly renderer = inject(Renderer2);\n private readonly router = inject(Router);\n\n private menuOutsideClickListener: (() => void) | null = null;\n\n constructor() {\n this.layoutService.overlayOpen$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (!this.menuOutsideClickListener) {\n this.menuOutsideClickListener = this.renderer.listen(\n this.document,\n 'click',\n (event) => {\n if (this.isOutsideClicked(event)) {\n this.hideMenu();\n }\n }\n );\n }\n if (this.layoutService.layoutState().staticMenuMobileActive) {\n this.blockBodyScroll();\n }\n });\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => this.hideMenu());\n }\n\n isOutsideClicked(event: MouseEvent): boolean {\n const sidebarEl = this.document.querySelector('.layout-sidebar');\n const topbarEl = this.document.querySelector('.layout-menu-button');\n const topbarNavEl = this.document.querySelector('.layout-topbar-nav');\n const eventTarget = event.target as Node;\n\n return !(\n sidebarEl?.isSameNode(eventTarget) ||\n sidebarEl?.contains(eventTarget) ||\n topbarEl?.isSameNode(eventTarget) ||\n topbarEl?.contains(eventTarget) ||\n topbarNavEl?.isSameNode(eventTarget) ||\n topbarNavEl?.contains(eventTarget)\n );\n }\n\n hideMenu(): void {\n this.layoutService.updateLayoutState({\n overlayMenuActive: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n });\n if (this.menuOutsideClickListener) {\n this.menuOutsideClickListener();\n this.menuOutsideClickListener = null;\n }\n this.unblockBodyScroll();\n }\n\n blockBodyScroll(): void {\n this.document.body.classList.add('blocked-scroll');\n }\n\n unblockBodyScroll(): void {\n this.document.body.classList.remove('blocked-scroll');\n }\n\n readonly isOverlay = computed(() => this.layoutService.layoutConfig().menuMode === 'overlay');\n readonly isStatic = computed(() => this.layoutService.layoutConfig().menuMode === 'static');\n readonly isTopbarMode = computed(() => this.layoutService.layoutConfig().menuMode === 'topbar');\n readonly isStaticInactive = computed(() =>\n this.layoutService.layoutState().staticMenuDesktopInactive && this.isStatic(),\n );\n readonly isOverlayActive = computed(() => this.layoutService.layoutState().overlayMenuActive);\n readonly isMobileActive = computed(() => this.layoutService.layoutState().staticMenuMobileActive);\n readonly isTopbarNavHidden = computed(() =>\n !this.layoutService.layoutState().topbarMenuVisible && this.isTopbarMode(),\n );\n}\n","import { applyTheme, buildBootstrapPreset, ApplyThemeOptions } from '@flusys/ng-ui';\nimport { PresetName } from '@flusys/ng-ui';\n\nexport { buildBootstrapPreset };\nexport type { ApplyThemeOptions };\n\nexport function buildPreset(presetName: string, primary: string): ApplyThemeOptions {\n return { preset: presetName as PresetName, primary };\n}\n\nexport { applyTheme };\n","import { ApplyThemeOptions } from '@flusys/ng-ui';\n\nexport const NavyBlueTheme: ApplyThemeOptions = {\n preset: 'Aura',\n primary: 'indigo',\n};\n","import { ApplyThemeOptions } from '@flusys/ng-ui';\n\nexport const GreenTheme: ApplyThemeOptions = {\n preset: 'Aura',\n primary: 'green',\n};\n","export const LAYOUT_MESSAGES: Record<string, string> = {\n // components/top-bar/app.profile.ts\n 'layout.profile.title': 'Profile',\n 'layout.profile.profile.picture.alt': 'Profile picture',\n 'layout.profile.copy.sign.up.link': 'Copy SignUp Link',\n 'layout.profile.logout': 'Logout',\n 'layout.profile.guest': 'Guest',\n 'layout.profile.link.copied': 'Link Copied',\n 'layout.profile.sign.up.link.copied': 'Sign Up Link copied.',\n 'layout.profile.failed.copy.sign.up.link': 'Failed to copy signup link.',\n\n // components/top-bar/app.launcher.ts\n 'layout.launcher.apps': 'Apps',\n 'layout.launcher.applications': 'Applications',\n\n // components/top-bar/app.company-branch-selector.ts\n 'layout.company.branch.selector.title': 'Switch Company & Branch',\n 'layout.company.branch.selector.select.company': 'Select Company',\n 'layout.company.branch.selector.branch': 'Branch',\n 'layout.company.branch.selector.select.branch': 'Select Branch',\n 'layout.company.branch.selector.switch.button': 'Switch',\n 'layout.company.branch.selector.no.company': 'No Company',\n 'layout.company.branch.selector.branch.required': 'Branch Required',\n 'layout.company.branch.selector.please.select.branch':\n 'Please select a branch',\n\n // components/top-bar/app.searchbar.ts\n 'layout.topbar.search': 'Search',\n 'layout.topbar.search.placeholder': 'Search for content...',\n\n // components/app.topbar.ts\n 'layout.topbar.toggle.menu': 'Toggle menu',\n 'layout.topbar.toggle.dark.mode': 'Toggle dark mode',\n 'layout.topbar.open.theme.settings': 'Open theme settings',\n 'layout.topbar.more.options': 'More options',\n\n // components/app.configurator.ts\n 'layout.configurator.primary': 'Primary',\n 'layout.configurator.surface': 'Surface',\n 'layout.configurator.presets': 'Presets',\n 'layout.configurator.menu.mode': 'Menu Mode',\n 'layout.configurator.menu.mode.static': 'Static',\n 'layout.configurator.menu.mode.overlay': 'Overlay',\n 'layout.configurator.menu.mode.topbar': 'Topbar',\n\n // components/app.footer.ts\n 'layout.footer.by': 'by',\n\n // app-menu.config.ts (main app menu configuration)\n 'menu.dashboard': 'Dashboard',\n 'menu.administration': 'Administration',\n 'menu.iam': 'IAM',\n 'menu.storage': 'Storage',\n 'menu.forms': 'Forms',\n 'menu.email': 'Email',\n 'menu.event.manager': 'Event Manager',\n 'menu.task.manager': 'Task Manager',\n 'menu.notifications': 'Notifications',\n 'menu.localization': 'Localization',\n 'menu.components': 'Components',\n 'menu.components.display': 'Display',\n 'menu.components.menu': 'Menu',\n 'menu.components.form': 'Form',\n 'menu.components.overlay': 'Overlay',\n 'menu.components.data': 'Data',\n 'menu.components.panel': 'Panel',\n 'menu.components.media': 'Media',\n 'menu.components.misc': 'Directives',\n 'menu.projects': 'Projects',\n 'menu.projects.active': 'Active Projects',\n 'menu.projects.archived': 'Archived',\n 'menu.projects.reports': 'Reports',\n\n // Those are layout part from notification module, but we put them here to avoid circular dependency between layout and notification module\n\n // components/notification-bell/notification-bell.component.ts\n 'notification.title': 'Notifications',\n\n // components/notification-list/notification-list.component.ts\n 'notification.mark.all.read': 'Mark all read',\n 'notification.view.all': 'View all notifications',\n 'notification.empty': 'No notifications',\n\n // components/notification-item/notification-item.component.ts\n 'notification.time.just.now': 'Just now',\n 'notification.time.minutes.ago': '{{count}}m ago',\n 'notification.time.hours.ago': '{{count}}h ago',\n 'notification.time.days.ago': '{{count}}d ago',\n};\n","// Components\nexport * from './components/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Services\nexport * from './services/public-api';\n\n// Utils\nexport * from './utils/public-api';\n\n// Themes\nexport * from './theme/public-api';\n\n// Constants\nexport * from './constants/index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isRouteActive","DOCUMENT","i2","filter"],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@flusys/ng-layout",
3
- "version": "6.0.0-beta.1",
3
+ "version": "6.0.0-beta.2",
4
4
  "description": "Layout components for FLUSYS Angular applications",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
7
7
  "@angular/common": ">=22.0.0",
8
8
  "@angular/core": ">=22.0.0",
9
9
  "@angular/router": ">=22.0.0",
10
- "@flusys/ng-core": ">=6.0.0-beta.1",
11
- "@flusys/ng-shared": ">=6.0.0-beta.1",
12
- "@flusys/ng-ui": ">=6.0.0-beta.1",
10
+ "@flusys/ng-core": ">=6.0.0-beta.2",
11
+ "@flusys/ng-shared": ">=6.0.0-beta.2",
12
+ "@flusys/ng-ui": ">=6.0.0-beta.2",
13
13
  "tailwindcss": ">=4.0.0",
14
14
  "rxjs": "^7.8.0"
15
15
  },