@flusys/ng-layout 6.4.0 → 6.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -96,9 +96,11 @@ readonly isModern = this.layout.isModernLayout; // Signal<boolean>
96
96
  ```
97
97
 
98
98
  `menuMode: 'topbar'` renders a horizontal nav, which only the classic skin provides — the modern
99
- skin falls back to its static sidebar.
99
+ skin falls back to its static sidebar. The nav scrolls when it outgrows the bar, with its native
100
+ scrollbar hidden and replaced by an overlay thumb that fades in on hover — out of the flow, so it
101
+ cannot take height from the row and knock the menu items off centre.
100
102
 
101
- Every skin renders exactly one menu toggle, and `LayoutService.onMenuToggle()` decides what it
103
+ The menu toggle belongs to the sidebar modes, and `LayoutService.onMenuToggle()` decides what it
102
104
  acts on from the current mode and viewport:
103
105
 
104
106
  | Mode | What the toggle does |
@@ -106,7 +108,7 @@ acts on from the current mode and viewport:
106
108
  | any mode, mobile | Opens/closes the sidebar drawer over a mask |
107
109
  | `static`, desktop | Collapses/restores the sidebar in place |
108
110
  | `overlay`, desktop | Slides the sidebar in/out over the content |
109
- | `topbar`, desktop | Shows/hides the horizontal nav row (`topbarMenuVisible`) |
111
+ | `topbar`, desktop | No toggle — there is no sidebar to collapse, so it is hidden |
110
112
 
111
113
  ### Source layout
112
114
 
@@ -56,12 +56,6 @@ $sidebar-drawer-shadow:
56
56
  .layout-sidebar {
57
57
  display: none;
58
58
  }
59
-
60
- // The horizontal nav adds a second row under the topbar; when it is toggled
61
- // off the content moves back up under the bar alone.
62
- &.layout-topbar-nav-hidden .layout-main-container {
63
- padding-top: var(--layout-topbar-height);
64
- }
65
59
  }
66
60
 
67
61
  .layout-mask {
@@ -29,6 +29,13 @@
29
29
  }
30
30
  }
31
31
 
32
+ // Topbar mode has no sidebar for the brand to line up with — and no menu toggle
33
+ // beside it either — so the brand claims only the room it needs and the
34
+ // horizontal nav gets the rest of the bar.
35
+ .layout-topbar-mode & .layout-topbar-logo-container {
36
+ width: auto;
37
+ }
38
+
32
39
  .layout-topbar-action-right {
33
40
  margin-inline-start: auto !important;
34
41
  margin-inline-end: -0.9rem !important;
@@ -210,11 +210,40 @@ $submenu-icon-margin: 0.5rem;
210
210
  }
211
211
  }
212
212
 
213
+ // Wrapper exists purely to hold the overlay scroll thumb: an absolute child of the
214
+ // scroller itself would scroll away with the menu.
215
+ .layout-topbar-nav {
216
+ position: relative;
217
+ display: flex;
218
+ flex: 1 1 auto;
219
+ min-width: 0;
220
+ align-self: stretch;
221
+ }
222
+
223
+ // Sits outside the flow, so it never takes height from the row — that height loss is
224
+ // what pushed the menu items off centre — and it only fades in while the strip is hovered.
225
+ .layout-topbar-nav-scroll-thumb {
226
+ position: absolute;
227
+ bottom: 0.125rem;
228
+ inset-inline-start: 0;
229
+ height: 0.125rem;
230
+ border-radius: 999px;
231
+ background-color: color-mix(in srgb, var(--text-color) 35%, transparent);
232
+ opacity: 0;
233
+ pointer-events: none;
234
+ transition: opacity var(--element-transition-duration);
235
+ }
236
+
237
+ .layout-topbar-nav:hover .layout-topbar-nav-scroll-thumb {
238
+ opacity: 1;
239
+ }
240
+
213
241
  .layout-topbar-nav-horizontal {
214
242
  display: flex;
215
243
  flex-direction: row;
216
244
  align-items: center;
217
245
  flex: 1 1 auto;
246
+ min-width: 0;
218
247
 
219
248
  align-self: stretch;
220
249
  padding: 0 1rem;
@@ -222,28 +251,11 @@ $submenu-icon-margin: 0.5rem;
222
251
  overflow-y: hidden;
223
252
  overscroll-behavior-x: contain;
224
253
  -webkit-overflow-scrolling: touch;
225
- scrollbar-width: thin;
226
- scrollbar-color: color-mix(in srgb, var(--text-color) 35%, transparent)
227
- transparent;
228
254
 
229
- &::-webkit-scrollbar {
230
- height: 0.25rem;
231
- }
255
+ // Native scrollbar hidden in favour of the overlay thumb above.
256
+ scrollbar-width: none;
232
257
 
233
- &::-webkit-scrollbar-track {
234
- background: transparent;
235
- }
236
-
237
- &::-webkit-scrollbar-thumb {
238
- background-color: color-mix(in srgb, var(--text-color) 35%, transparent);
239
- border-radius: 999px;
240
- }
241
-
242
- &::-webkit-scrollbar-thumb:hover {
243
- background-color: color-mix(in srgb, var(--text-color) 55%, transparent);
244
- }
245
-
246
- &.layout-topbar-nav-hidden {
258
+ &::-webkit-scrollbar {
247
259
  display: none;
248
260
  }
249
261
 
@@ -173,7 +173,6 @@ class LayoutService {
173
173
  configSidebarVisible: false,
174
174
  staticMenuMobileActive: false,
175
175
  menuHoverActive: false,
176
- topbarMenuVisible: true,
177
176
  };
178
177
  memorable = this.DEFAULT_CONFIG.isMemorable !== false;
179
178
  _layoutConfig = signal({
@@ -313,14 +312,6 @@ class LayoutService {
313
312
  }
314
313
  onMenuToggle() {
315
314
  const state = this._layoutState();
316
- // Desktop topbar mode: toggle topbar nav visibility
317
- if (this.isDesktop() && this.isTopbar()) {
318
- this._layoutState.update((prev) => ({
319
- ...prev,
320
- topbarMenuVisible: !prev.topbarMenuVisible,
321
- }));
322
- return;
323
- }
324
315
  // Mobile always uses staticMenuMobileActive regardless of menu mode
325
316
  if (!this.isDesktop()) {
326
317
  const newMobileActive = !state.staticMenuMobileActive;
@@ -2501,13 +2492,43 @@ class AppTopbar {
2501
2492
  layoutService = inject(LayoutService);
2502
2493
  navContainer = viewChild('navContainer', /* @ts-ignore */
2503
2494
  ...(ngDevMode ? [{ debugName: "navContainer" }] : /* istanbul ignore next */ []));
2495
+ _scrollThumb = signal({ width: 0, offset: 0 }, /* @ts-ignore */
2496
+ ...(ngDevMode ? [{ debugName: "_scrollThumb" }] : /* istanbul ignore next */ []));
2497
+ scrollThumb = this._scrollThumb.asReadonly();
2504
2498
  constructor() {
2505
2499
  effect((onCleanup) => {
2506
2500
  const nav = this.navContainer();
2507
- if (!nav)
2501
+ if (!nav) {
2502
+ this._scrollThumb.set({ width: 0, offset: 0 });
2508
2503
  return;
2509
- const subscription = fromEvent(nav.nativeElement, 'scroll').subscribe(() => this.recalculateHoveredSubmenu(nav.nativeElement));
2510
- onCleanup(() => subscription.unsubscribe());
2504
+ }
2505
+ const subscription = fromEvent(nav.nativeElement, 'scroll').subscribe(() => {
2506
+ this.recalculateHoveredSubmenu(nav.nativeElement);
2507
+ this.syncScrollThumb();
2508
+ });
2509
+ const resizeObserver = typeof ResizeObserver === 'undefined'
2510
+ ? null
2511
+ : new ResizeObserver(() => this.syncScrollThumb());
2512
+ resizeObserver?.observe(nav.nativeElement);
2513
+ onCleanup(() => {
2514
+ subscription.unsubscribe();
2515
+ resizeObserver?.disconnect();
2516
+ });
2517
+ });
2518
+ }
2519
+ syncScrollThumb() {
2520
+ const nav = this.navContainer()?.nativeElement;
2521
+ if (!nav)
2522
+ return;
2523
+ const { clientWidth, scrollWidth, scrollLeft } = nav;
2524
+ if (scrollWidth <= clientWidth + 1) {
2525
+ this._scrollThumb.set({ width: 0, offset: 0 });
2526
+ return;
2527
+ }
2528
+ const ratio = clientWidth / scrollWidth;
2529
+ this._scrollThumb.set({
2530
+ width: Math.round(clientWidth * ratio),
2531
+ offset: Math.round(Math.abs(scrollLeft) * ratio),
2511
2532
  });
2512
2533
  }
2513
2534
  /**
@@ -2541,7 +2562,7 @@ class AppTopbar {
2541
2562
  </button>
2542
2563
  }
2543
2564
  <app-brand-logo />
2544
- @if (layoutService.isDesktop()) {
2565
+ @if (layoutService.isDesktop() && !layoutService.isTopbar()) {
2545
2566
  <button
2546
2567
  type="button"
2547
2568
  class="layout-menu-button layout-topbar-action layout-topbar-action-right"
@@ -2554,14 +2575,18 @@ class AppTopbar {
2554
2575
  </div>
2555
2576
 
2556
2577
  @if (layoutService.isTopbar() && layoutService.isDesktop()) {
2557
- <div
2558
- #navContainer
2559
- class="layout-topbar-nav-horizontal"
2560
- [class.layout-topbar-nav-hidden]="
2561
- !layoutService.layoutState().topbarMenuVisible
2562
- "
2563
- >
2564
- <app-menu />
2578
+ <div class="layout-topbar-nav" (pointerenter)="syncScrollThumb()">
2579
+ <div #navContainer class="layout-topbar-nav-horizontal">
2580
+ <app-menu />
2581
+ </div>
2582
+ @if (scrollThumb().width > 0) {
2583
+ <span
2584
+ aria-hidden="true"
2585
+ class="layout-topbar-nav-scroll-thumb"
2586
+ [style.width.px]="scrollThumb().width"
2587
+ [style.marginInlineStart.px]="scrollThumb().offset"
2588
+ ></span>
2589
+ }
2565
2590
  </div>
2566
2591
  }
2567
2592
 
@@ -2589,7 +2614,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
2589
2614
  </button>
2590
2615
  }
2591
2616
  <app-brand-logo />
2592
- @if (layoutService.isDesktop()) {
2617
+ @if (layoutService.isDesktop() && !layoutService.isTopbar()) {
2593
2618
  <button
2594
2619
  type="button"
2595
2620
  class="layout-menu-button layout-topbar-action layout-topbar-action-right"
@@ -2602,14 +2627,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
2602
2627
  </div>
2603
2628
 
2604
2629
  @if (layoutService.isTopbar() && layoutService.isDesktop()) {
2605
- <div
2606
- #navContainer
2607
- class="layout-topbar-nav-horizontal"
2608
- [class.layout-topbar-nav-hidden]="
2609
- !layoutService.layoutState().topbarMenuVisible
2610
- "
2611
- >
2612
- <app-menu />
2630
+ <div class="layout-topbar-nav" (pointerenter)="syncScrollThumb()">
2631
+ <div #navContainer class="layout-topbar-nav-horizontal">
2632
+ <app-menu />
2633
+ </div>
2634
+ @if (scrollThumb().width > 0) {
2635
+ <span
2636
+ aria-hidden="true"
2637
+ class="layout-topbar-nav-scroll-thumb"
2638
+ [style.width.px]="scrollThumb().width"
2639
+ [style.marginInlineStart.px]="scrollThumb().offset"
2640
+ ></span>
2641
+ }
2613
2642
  </div>
2614
2643
  }
2615
2644
 
@@ -2621,10 +2650,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
2621
2650
  class AppClassicLayout extends LayoutShellBase {
2622
2651
  isStatic = computed(() => this.layoutService.layoutConfig().menuMode === 'static', /* @ts-ignore */
2623
2652
  ...(ngDevMode ? [{ debugName: "isStatic" }] : /* istanbul ignore next */ []));
2624
- /** Topbar mode without its nav row leaves the content sitting under the bar alone. */
2625
- isTopbarNavHidden = computed(() => this.isTopbarMode() &&
2626
- !this.layoutService.layoutState().topbarMenuVisible, /* @ts-ignore */
2627
- ...(ngDevMode ? [{ debugName: "isTopbarNavHidden" }] : /* istanbul ignore next */ []));
2628
2653
  outsideClickSelectors() {
2629
2654
  return ['.layout-sidebar', '.layout-menu-button', '.layout-topbar-nav'];
2630
2655
  }
@@ -2638,7 +2663,6 @@ class AppClassicLayout extends LayoutShellBase {
2638
2663
  [class.layout-static-inactive]="isDesktopCollapsed()"
2639
2664
  [class.layout-overlay-active]="isOverlayActive()"
2640
2665
  [class.layout-mobile-active]="isMobileActive()"
2641
- [class.layout-topbar-nav-hidden]="isTopbarNavHidden()"
2642
2666
  >
2643
2667
  <app-topbar></app-topbar>
2644
2668
  <app-sidebar></app-sidebar>
@@ -2666,7 +2690,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
2666
2690
  [class.layout-static-inactive]="isDesktopCollapsed()"
2667
2691
  [class.layout-overlay-active]="isOverlayActive()"
2668
2692
  [class.layout-mobile-active]="isMobileActive()"
2669
- [class.layout-topbar-nav-hidden]="isTopbarNavHidden()"
2670
2693
  >
2671
2694
  <app-topbar></app-topbar>
2672
2695
  <app-sidebar></app-sidebar>
@@ -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/shared/layout-shell.base.ts","../../../projects/ng-layout/components/shared/app.footer.ts","../../../projects/ng-layout/components/shared/app.menuitem.ts","../../../projects/ng-layout/components/shared/app.menu.ts","../../../projects/ng-layout/components/layouts/classic/app.sidebar.ts","../../../projects/ng-layout/components/shared/app.brand-logo.ts","../../../projects/ng-layout/interfaces/layout-auth.interface.ts","../../../projects/ng-layout/components/shared/app.configurator.ts","../../../projects/ng-layout/interfaces/view-transitions.ts","../../../projects/ng-layout/components/shared/top-bar/app.company-branch-selector.ts","../../../projects/ng-layout/components/shared/top-bar/app.launcher.ts","../../../projects/ng-layout/components/shared/top-bar/app.profile.ts","../../../projects/ng-layout/components/shared/top-bar/app.searchbar.ts","../../../projects/ng-layout/components/shared/top-bar/app.topbar-actions.ts","../../../projects/ng-layout/components/layouts/classic/app.topbar.ts","../../../projects/ng-layout/components/layouts/classic/app.classic-layout.ts","../../../projects/ng-layout/components/layouts/modern/app.modern-sidebar.ts","../../../projects/ng-layout/components/layouts/modern/app.modern-topbar.ts","../../../projects/ng-layout/components/layouts/modern/app.modern-layout.ts","../../../projects/ng-layout/components/app.layout.ts","../../../projects/ng-layout/components/shared/app.floatingconfigurator.ts","../../../projects/ng-layout/components/public-api.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, LayoutTheme } from '@flusys/ng-core';\nimport { PRESET_NAMES } from '@flusys/ng-ui';\n\nconst STORAGE_KEY = 'flusys.layout.config';\nconst STORAGE_VERSION = 1;\n\n// Sourced from the theme package so a new preset never silently fails validation.\nconst VALID_PRESETS: readonly string[] = PRESET_NAMES;\nconst VALID_MENU_MODES: readonly string[] = ['static', 'overlay', 'topbar'];\nconst VALID_LAYOUT_THEMES: readonly LayoutTheme[] = ['classic', 'modern'];\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 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 return this.validateConfig(JSON.parse(stored) as PersistedLayoutConfig);\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 // localStorage may be full or disabled — the config simply stays unsaved.\n }\n }\n\n clear(): void {\n if (!this.isBrowser) return;\n localStorage.removeItem(STORAGE_KEY);\n }\n\n /**\n * Coerces a stored value only when it is present and unrecognised. A field the\n * user never changed stays absent so the app's own default still wins when this\n * result is merged over it.\n */\n private validateConfig(stored: PersistedLayoutConfig): LayoutConfig | null {\n if (stored._version && stored._version !== STORAGE_VERSION) {\n this.clear();\n return null;\n }\n\n const { _version, ...config } = stored;\n\n if (config.preset !== undefined && !VALID_PRESETS.includes(config.preset)) {\n config.preset = 'Aura';\n }\n\n if (\n config.menuMode !== undefined &&\n !VALID_MENU_MODES.includes(config.menuMode)\n ) {\n config.menuMode = 'static';\n }\n\n if (\n config.layoutTheme !== undefined &&\n !VALID_LAYOUT_THEMES.includes(config.layoutTheme)\n ) {\n config.layoutTheme = 'classic';\n }\n\n if (config.darkTheme !== undefined && typeof config.darkTheme !== 'boolean') {\n config.darkTheme = false;\n }\n\n return config;\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 LayoutTheme,\n} from '@flusys/ng-core';\nimport { PermissionValidatorService } from '@flusys/ng-shared';\nimport { fromEvent, Subject } from 'rxjs';\n\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\n/** Matches the 991px shell breakpoint both skins use in SCSS. */\nconst DESKTOP_BREAKPOINT = 991;\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 layoutTheme: 'classic',\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 layoutTheme = computed<LayoutTheme>(\n () => this._layoutConfig().layoutTheme ?? 'classic',\n );\n readonly isModernLayout = computed(() => this.layoutTheme() === 'modern');\n readonly isClassicLayout = computed(() => this.layoutTheme() === 'classic');\n /** The modern skin has no horizontal nav, so topbar mode only applies to the classic skin. */\n readonly isTopbar = computed(\n () => this._layoutConfig().menuMode === 'topbar' && !this.isModernLayout(),\n );\n\n readonly userName = computed(() => this._userProfile()?.name ?? 'Guest');\n readonly userEmail = computed(() => this._userProfile()?.email ?? '');\n // `||`, not `??`, throughout the block below: the backend returns \"no picture\" and\n // \"no logo\" as an empty string as often as it does null, and an empty string would\n // slip past `??` and render as a broken image.\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 private appliedDarkTheme = this._layoutConfig().darkTheme;\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 // Only the dark-mode flip is worth a view transition. Every other field —\n // preset, primary, menu mode, layout skin — used to start one too, which\n // cross-faded the whole page for a change that never touched it.\n if (config.darkTheme !== this.appliedDarkTheme) {\n this.appliedDarkTheme = config.darkTheme;\n this.handleDarkModeTransition(config);\n }\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 { computed, DestroyRef, DOCUMENT, inject, Renderer2 } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { LayoutService } from '../../services/public-api';\n\n/**\n * Shared shell behaviour for every layout skin.\n * Holds the menu open/close lifecycle so a skin only owns markup and styling.\n */\nexport abstract class LayoutShellBase {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n private readonly renderer = inject(Renderer2);\n private readonly router = inject(Router);\n readonly layoutService = inject(LayoutService);\n\n private menuOutsideClickListener: (() => void) | null = null;\n\n /** Elements that must not close the menu when clicked. */\n protected abstract outsideClickSelectors(): string[];\n\n /** Extra work a skin needs on every completed navigation. */\n protected onNavigated(): void {}\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: MouseEvent) => {\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(() => {\n this.hideMenu();\n this.onNavigated();\n });\n }\n\n isOutsideClicked(event: MouseEvent): boolean {\n const eventTarget = event.target as Node;\n\n // querySelectorAll, not querySelector: a skin may render the same control more\n // than once (the modern shell has a menu button in both the sidebar and the\n // topbar) and matching only the first one reads a real click as an outside one.\n return !this.outsideClickSelectors().some((selector) =>\n Array.from(this.document.querySelectorAll(selector)).some(\n (element) =>\n element.isSameNode(eventTarget) || element.contains(eventTarget),\n ),\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 = this.layoutService.isOverlay;\n /** Delegated so a skin that has no horizontal nav is never treated as being in it. */\n readonly isTopbarMode = this.layoutService.isTopbar;\n readonly isOverlayActive = computed(\n () => this.layoutService.layoutState().overlayMenuActive,\n );\n readonly isMobileActive = computed(\n () => this.layoutService.layoutState().staticMenuMobileActive,\n );\n /**\n * The desktop sidebar is collapsed in place. Only meaningful for the modes that\n * keep the sidebar in the layout flow — an overlay drawer and the horizontal nav\n * have nothing to collapse.\n */\n readonly isDesktopCollapsed = computed(\n () =>\n !!this.layoutService.layoutState().staticMenuDesktopInactive &&\n !this.isOverlay() &&\n !this.isTopbarMode(),\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 {\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/public-api';\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","import { Component } from '@angular/core';\nimport { AppMenu } from '../../shared/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, inject } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { InlineSvgComponent } from '@flusys/ng-shared';\nimport { LayoutService } from '../../services/public-api';\n\n/**\n * Home link showing the active company logo and name.\n * Every skin renders this same markup; sizing and colour come from the bar it sits in.\n */\n@Component({\n selector: 'app-brand-logo',\n imports: [RouterModule, InlineSvgComponent],\n host: { style: 'display: contents' },\n template: `\n <a class=\"layout-brand-logo\" routerLink=\"/\">\n @if (displayLogo()) {\n @if (layoutService.isDisplayLogoSvg()) {\n <inline-svg [src]=\"displayLogo()\" class=\"logo-image\" />\n } @else {\n <img [src]=\"displayLogo()\" [alt]=\"companyName()\" class=\"logo-image\" />\n }\n }\n <span>{{ companyName() }}</span>\n </a>\n `,\n})\nexport class AppBrandLogo {\n readonly layoutService = inject(LayoutService);\n\n readonly companyName = this.layoutService.companyName;\n readonly displayLogo = this.layoutService.displayLogo;\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 getMyCompanies(): Observable<ICompanyInfo[]>;\n getMyCompanyBranches(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 { 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 type { LayoutTheme } from '@flusys/ng-core';\nimport { TranslatePipe, TranslateService } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport {\n applyPrimaryPalette,\n applySurfacePalette,\n applyTheme,\n NOIR_PRIMARY,\n PRIMARY_PALETTES,\n SURFACE_PALETTES,\n PRESET_NAMES,\n PRESETS,\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.layout.theme' | translate\n }}</span>\n <f-selectbutton\n [ngModel]=\"layoutTheme()\"\n (ngModelChange)=\"onLayoutThemeChange($event)\"\n [options]=\"layoutThemeOptions()\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\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 // Topbar mode renders a horizontal nav, which only the classic skin provides.\n if (this.layoutService.isDesktop() && !this.layoutService.isModernLayout()) {\n options.push({ label: this.translate('layout.configurator.menu.mode.topbar'), value: 'topbar' });\n }\n return options;\n });\n\n readonly layoutThemeOptions = computed<Array<{ label: string; value: LayoutTheme }>>(() => [\n { label: this.translate('layout.configurator.layout.theme.classic'), value: 'classic' },\n { label: this.translate('layout.configurator.layout.theme.modern'), value: 'modern' },\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 readonly layoutTheme = this.layoutService.layoutTheme;\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 // NOIR_PRIMARY, not a copy of a surface palette: its shades are references to\n // the active surface ramp, which is what lets applyPrimaryPalette recognise the\n // neutral and derive the same tokens a preset switch to Nora would.\n const pal = primary === 'noir' ? NOIR_PRIMARY : PRIMARY_PALETTES[primary];\n if (pal) applyPrimaryPalette(pal, 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 const primary = PRESETS[event as PresetName]?.signaturePrimary ?? 'violet';\n this.layoutService.updateLayoutConfig({ preset: event, primary });\n const isDark = this.layoutService.layoutConfig().darkTheme ?? false;\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 onLayoutThemeChange(event: LayoutTheme): void {\n const menuMode = this.layoutService.layoutConfig().menuMode;\n this.layoutService.updateLayoutConfig({\n layoutTheme: event,\n // Modern skin has no horizontal nav — fall back to the static sidebar.\n menuMode: event === 'modern' && menuMode === 'topbar' ? 'static' : menuMode,\n });\n }\n\n private translate(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\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 .getMyCompanies()\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 .getMyCompanyBranches(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: var(--layout-shell-topbar-bottom, 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 ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { 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 { AppCompanyBranchSelector } from './app.company-branch-selector';\nimport { AppLauncher } from './app.launcher';\nimport { AppProfile } from './app.profile';\nimport { AppSearchbar } from './app.searchbar';\n\n/**\n * Trailing action rail of the topbar — search, theme controls and the widget menu.\n * Skins own the bar around it; the rail itself is identical in every skin, and\n * `display: contents` on the host keeps it a direct flex child of the bar.\n */\n@Component({\n selector: 'app-topbar-actions',\n imports: [\n UiModule,\n NgComponentOutlet,\n TranslatePipe,\n AppConfigurator,\n AppProfile,\n AppCompanyBranchSelector,\n AppLauncher,\n AppSearchbar,\n ],\n host: { style: 'display: contents' },\n template: `\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\n [name]=\"layoutService.isDarkTheme() ? 'moon' : 'sun'\"\n ></ui-icon>\n </button>\n <div class=\"relative\" #configContainer>\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"configPanelOpen()\"\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)=\"toggleConfigPanel()\"\n >\n <ui-icon name=\"palette\"></ui-icon>\n </button>\n <app-configurator />\n </div>\n </div>\n\n <button\n type=\"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 `,\n})\nexport class AppTopbarActions {\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 private readonly configContainer =\n viewChild<ElementRef<HTMLElement>>('configContainer');\n\n private readonly _configPanelOpen = signal(false);\n\n readonly configPanelOpen = this._configPanelOpen.asReadonly();\n readonly hasSearchAdapter = computed(() => !!this.searchAdapter);\n readonly enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this._configPanelOpen()),\n )\n .subscribe((event) => {\n const configEl = this.configContainer()?.nativeElement;\n if (configEl && !configEl.contains(event.target as HTMLElement)) {\n this._configPanelOpen.set(false);\n }\n });\n }\n\n toggleDarkMode(): void {\n this.layoutService.updateLayoutConfig({\n darkTheme: !this.layoutService.layoutConfig().darkTheme,\n });\n }\n\n toggleConfigPanel(): void {\n this._configPanelOpen.update((open) => !open);\n }\n}\n","import {\n Component,\n effect,\n ElementRef,\n inject,\n viewChild,\n} from '@angular/core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { fromEvent } from 'rxjs';\nimport { LayoutService } from '../../../services/public-api';\nimport { AppBrandLogo } from '../../shared/app.brand-logo';\nimport { AppMenu } from '../../shared/app.menu';\nimport { AppTopbarActions } from '../../shared/top-bar/app.topbar-actions';\n\n@Component({\n selector: 'app-topbar',\n imports: [UiModule, TranslatePipe, AppBrandLogo, AppMenu, AppTopbarActions],\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.isMobile()) {\n <button\n type=\"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 <app-brand-logo />\n @if (layoutService.isDesktop()) {\n <button\n type=\"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 <app-topbar-actions />\n </div>`,\n})\nexport class AppTopbar {\n readonly layoutService = inject(LayoutService);\n\n private readonly navContainer =\n viewChild<ElementRef<HTMLElement>>('navContainer');\n\n constructor() {\n effect((onCleanup) => {\n const nav = this.navContainer();\n if (!nav) return;\n\n const subscription = fromEvent(nav.nativeElement, 'scroll').subscribe(\n () => this.recalculateHoveredSubmenu(nav.nativeElement),\n );\n onCleanup(() => subscription.unsubscribe());\n });\n }\n\n /**\n * Horizontal-nav submenus are `position: fixed`, so scrolling the nav strip leaves\n * an open submenu behind — re-anchor it to the item it belongs to.\n */\n private recalculateHoveredSubmenu(navEl: HTMLElement): void {\n navEl.querySelectorAll('li:hover').forEach((li) => {\n const link = li.querySelector(':scope > a');\n if (!link) return;\n\n const rect = link.getBoundingClientRect();\n (li as HTMLElement).style.setProperty(\n '--submenu-left',\n `${rect.left - 12}px`,\n );\n (li as HTMLElement).style.setProperty(\n '--submenu-top',\n `${rect.bottom + 12}px`,\n );\n });\n }\n}\n","import { Component, computed } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { LayoutShellBase } from '../../shared/layout-shell.base';\nimport { AppFooter } from '../../shared/app.footer';\nimport { AppSidebar } from './app.sidebar';\nimport { AppTopbar } from './app.topbar';\n\n@Component({\n selector: 'app-classic-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]=\"isDesktopCollapsed()\"\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 AppClassicLayout extends LayoutShellBase {\n readonly isStatic = computed(\n () => this.layoutService.layoutConfig().menuMode === 'static',\n );\n /** Topbar mode without its nav row leaves the content sitting under the bar alone. */\n readonly isTopbarNavHidden = computed(\n () =>\n this.isTopbarMode() &&\n !this.layoutService.layoutState().topbarMenuVisible,\n );\n\n protected outsideClickSelectors(): string[] {\n return ['.layout-sidebar', '.layout-menu-button', '.layout-topbar-nav'];\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { LayoutService } from '../../../services/public-api';\nimport { AppBrandLogo } from '../../shared/app.brand-logo';\nimport { AppFooter } from '../../shared/app.footer';\nimport { AppMenu } from '../../shared/app.menu';\n\n@Component({\n selector: 'app-modern-sidebar',\n imports: [UiModule, TranslatePipe, AppBrandLogo, AppMenu, AppFooter],\n template: `\n <aside class=\"layout-modern-sidebar\">\n <div class=\"layout-modern-brand\">\n <app-brand-logo />\n @if (showMenuButton()) {\n <button\n type=\"button\"\n class=\"layout-modern-menu-button\"\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 <app-menu />\n\n <div class=\"layout-modern-sidebar-footer\">\n <app-footer />\n </div>\n </aside>\n `,\n})\nexport class AppModernSidebar {\n readonly layoutService = inject(LayoutService);\n\n /**\n * Only the in-flow column can be collapsed from here. As an overlay or mobile\n * drawer the sidebar is opened by the topbar button and dismissed by the mask,\n * so a second toggle inside it would be dead weight next to the brand.\n */\n readonly showMenuButton = computed(\n () => !this.layoutService.isMobile() && !this.layoutService.isOverlay(),\n );\n}\n","import {\n Component,\n computed,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { filter } from 'rxjs/operators';\nimport { LayoutService } from '../../../services/public-api';\nimport { AppBrandLogo } from '../../shared/app.brand-logo';\nimport { AppTopbarActions } from '../../shared/top-bar/app.topbar-actions';\n\n@Component({\n selector: 'app-modern-topbar',\n imports: [UiModule, TranslatePipe, AppBrandLogo, AppTopbarActions],\n template: `\n <header class=\"layout-modern-topbar\">\n @if (showBrand()) {\n <button\n type=\"button\"\n class=\"layout-modern-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 <app-brand-logo />\n }\n\n <span class=\"layout-modern-page-title\">{{ pageTitle() }}</span>\n\n <app-topbar-actions />\n </header>\n `,\n})\nexport class AppModernTopbar {\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n readonly layoutService = inject(LayoutService);\n\n private readonly _pageTitle = signal('');\n\n readonly pageTitle = this._pageTitle.asReadonly();\n\n /** The sidebar is a drawer (not a column) in these modes, so the topbar owns the brand. */\n readonly showBrand = computed(\n () =>\n this.layoutService.isMobile() ||\n this.layoutService.isOverlay() ||\n !!this.layoutService.layoutState().staticMenuDesktopInactive,\n );\n\n constructor() {\n this.resolvePageTitle();\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => this.resolvePageTitle());\n }\n\n private resolvePageTitle(): void {\n let route: ActivatedRouteSnapshot = this.router.routerState.snapshot.root;\n while (route.firstChild) {\n route = route.firstChild;\n }\n this._pageTitle.set(route.title ?? '');\n }\n}\n","import { Component, ElementRef, viewChild } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { LayoutShellBase } from '../../shared/layout-shell.base';\nimport { AppModernSidebar } from './app.modern-sidebar';\nimport { AppModernTopbar } from './app.modern-topbar';\n\n@Component({\n selector: 'app-modern-layout',\n imports: [AppModernTopbar, AppModernSidebar, RouterModule],\n template: `\n <div\n class=\"layout-modern\"\n [class.layout-modern-overlay]=\"isOverlay()\"\n [class.layout-modern-static-inactive]=\"isDesktopCollapsed()\"\n [class.layout-modern-overlay-active]=\"isOverlayActive()\"\n [class.layout-modern-mobile-active]=\"isMobileActive()\"\n >\n <app-modern-sidebar />\n <div class=\"layout-modern-main\">\n <app-modern-topbar />\n <div class=\"layout-modern-content\" #content>\n <router-outlet></router-outlet>\n </div>\n </div>\n <div class=\"layout-modern-mask animate-fadein\"></div>\n </div>\n `,\n})\nexport class AppModernLayout extends LayoutShellBase {\n private readonly content = viewChild<ElementRef<HTMLElement>>('content');\n\n protected outsideClickSelectors(): string[] {\n return ['.layout-modern-sidebar', '.layout-modern-menu-button'];\n }\n\n /**\n * The page scrolls inside the content card rather than the window, so the router's\n * scroll restoration never reaches it — reset it here instead.\n */\n protected override onNavigated(): void {\n this.content()?.nativeElement.scrollTo({ top: 0 });\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { LayoutService } from '../services/public-api';\nimport { AppClassicLayout } from './layouts/classic/app.classic-layout';\nimport { AppModernLayout } from './layouts/modern/app.modern-layout';\n\n/**\n * Layout shell entry point.\n * Renders the skin selected by `LayoutConfig.layoutTheme` — every skin shares\n * the same services, menu and topbar components, only the markup and styling differ.\n */\n@Component({\n selector: 'app-layout',\n imports: [AppClassicLayout, AppModernLayout],\n template: `\n @if (layoutService.isModernLayout()) {\n <app-modern-layout />\n } @else {\n <app-classic-layout />\n }\n `,\n})\nexport class AppLayout {\n readonly layoutService = inject(LayoutService);\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","// Shell entry point (renders the configured layout skin)\nexport * from './app.layout';\n\n// Shared across every layout skin\nexport * from './shared/app.brand-logo';\nexport * from './shared/app.configurator';\nexport * from './shared/app.floatingconfigurator';\nexport * from './shared/app.footer';\nexport * from './shared/app.menu';\nexport * from './shared/app.menuitem';\nexport * from './shared/layout-shell.base';\nexport * from './shared/top-bar/app.company-branch-selector';\nexport * from './shared/top-bar/app.launcher';\nexport * from './shared/top-bar/app.profile';\nexport * from './shared/top-bar/app.searchbar';\nexport * from './shared/top-bar/app.topbar-actions';\n\n// Classic skin\nexport * from './layouts/classic/app.classic-layout';\nexport * from './layouts/classic/app.sidebar';\nexport * from './layouts/classic/app.topbar';\n\n// Modern skin\nexport * from './layouts/modern/app.modern-layout';\nexport * from './layouts/modern/app.modern-sidebar';\nexport * from './layouts/modern/app.modern-topbar';\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/shared/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/shared/top-bar/app.launcher.ts\n 'layout.launcher.apps': 'Apps',\n 'layout.launcher.applications': 'Applications',\n 'layout.launcher.no.apps': 'No apps available',\n\n // components/shared/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/shared/top-bar/app.searchbar.ts\n 'layout.topbar.search': 'Search',\n 'layout.topbar.search.placeholder': 'Search for content...',\n\n // components/layouts/classic/app.topbar.ts + components/layouts/modern/app.modern-topbar.ts\n // + components/layouts/modern/app.modern-sidebar.ts\n 'layout.topbar.toggle.menu': 'Toggle menu',\n\n // components/shared/top-bar/app.topbar-actions.ts\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/shared/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 'layout.configurator.layout.theme': 'Layout',\n 'layout.configurator.layout.theme.classic': 'Classic',\n 'layout.configurator.layout.theme.modern': 'Modern',\n\n // components/shared/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.ai.assistant': 'AI Assistant',\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\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 // ng-ai-assistant/components/chat-widget-host/chat-widget-host.component.ts\n 'ai-assistant.widget.title': 'Assistant',\n 'ai-assistant.widget.placeholder': 'Ask me anything…',\n 'ai-assistant.widget.empty': 'Ask me anything to get started',\n 'ai-assistant.widget.pin': 'Pin',\n 'ai-assistant.widget.pinned': 'Pinned',\n 'ai-assistant.widget.error': 'Error: {{error}}',\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":["filter","isRouteActive","i2","DOCUMENT","i1"],"mappings":";;;;;;;;;;;;;;;;;AAGA;AACM,SAAU,uBAAuB,CACrC,IAAoB,EACpB,eAAyB,EAAA;AAEzB,IAAA,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,GAAG,KACF,CAAC,GAAG,CAAC,eAAe;QACpB,iBAAiB,CAAC,GAAG,CAAC,eAAe,EAAE,eAAe,CAAC,CAC1D;AACH;;ACVA;;;;;;;;;;;;;;;AAeG;AACG,SAAU,uBAAuB,CACrC,KAAkB,EAClB,cAAwB,EAAA;AAExB,IAAA,OAAO;AACJ,SAAA,GAAG,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC;SAClD,MAAM,CAAC,CAAC,IAAI,KAAwB,IAAI,KAAK,IAAI,CAAC;AACvD;AAEA;;;;;;;AAOG;AACH,SAAS,cAAc,CACrB,IAAe,EACf,cAAwB,EAAA;;AAGxB,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,IAAI,IAAI,CAAC,eAAe,EAAE;QACxB,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC;QACzE,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,IAAI,CAAC;QACd;IACF;;AAGA,IAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QAC7C,MAAM,gBAAgB,GAAG,uBAAuB,CAC9C,IAAI,CAAC,QAAQ,EACb,cAAc,CACf;;AAGD,QAAA,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;AACjC,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE;IAChD;AAEA,IAAA,OAAO,IAAI;AACb;;AChEA,MAAM,WAAW,GAAG,sBAAsB;AAC1C,MAAM,eAAe,GAAG,CAAC;AAEzB;AACA,MAAM,aAAa,GAAsB,YAAY;AACrD,MAAM,gBAAgB,GAAsB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;AAC3E,MAAM,mBAAmB,GAA2B,CAAC,SAAS,EAAE,QAAQ,CAAC;MAO5D,wBAAwB,CAAA;AAClB,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;IAE/D,IAAI,GAAA;QACF,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;AAEhC,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;AAChD,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI;YAExB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAA0B,CAAC;QACzE;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;IACF;AAEA,IAAA,IAAI,CAAC,MAAoB,EAAA;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,IAAI;AACF,YAAA,MAAM,OAAO,GAA0B;AACrC,gBAAA,GAAG,MAAM;AACT,gBAAA,QAAQ,EAAE,eAAe;aAC1B;AACD,YAAA,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5D;AAAE,QAAA,MAAM;;QAER;IACF;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AACrB,QAAA,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC;IACtC;AAEA;;;;AAIG;AACK,IAAA,cAAc,CAAC,MAA6B,EAAA;QAClD,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,eAAe,EAAE;YAC1D,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM;AAEtC,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;AACzE,YAAA,MAAM,CAAC,MAAM,GAAG,MAAM;QACxB;AAEA,QAAA,IACE,MAAM,CAAC,QAAQ,KAAK,SAAS;YAC7B,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC3C;AACA,YAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ;QAC5B;AAEA,QAAA,IACE,MAAM,CAAC,WAAW,KAAK,SAAS;YAChC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EACjD;AACA,YAAA,MAAM,CAAC,WAAW,GAAG,SAAS;QAChC;AAEA,QAAA,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;AAC3E,YAAA,MAAM,CAAC,SAAS,GAAG,KAAK;QAC1B;AAEA,QAAA,OAAO,MAAM;IACf;uGAzEW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;2FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACYlC;AACA,MAAM,kBAAkB,GAAG,GAAG;MA+BjB,aAAa,CAAA;AACP,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AAC9C,IAAA,WAAW,GAAG,MAAM,CAAC,wBAAwB,CAAC;IAC9C,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAElD,IAAA,cAAc,GAAiB,IAAI,CAAC,SAAS,EAAE,YAAY,IAAI;AAC9E,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,OAAO,EAAE,QAAQ;AACjB,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,SAAS,EAAE,KAAK;AAChB,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,WAAW,EAAE,SAAS;KACvB;AAEgB,IAAA,aAAa,GAAgB;AAC5C,QAAA,yBAAyB,EAAE,KAAK;AAChC,QAAA,iBAAiB,EAAE,KAAK;AACxB,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,sBAAsB,EAAE,KAAK;AAC7B,QAAA,eAAe,EAAE,KAAK;AACtB,QAAA,iBAAiB,EAAE,IAAI;KACxB;IAEgB,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,KAAK,KAAK;IAErD,aAAa,GAAG,MAAM,CAAe;QACpD,GAAG,IAAI,CAAC,cAAc;AACtB,QAAA,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;AACrD,KAAA;sFAAC;AACe,IAAA,YAAY,GAAG,MAAM,CAAc,IAAI,CAAC,aAAa;qFAAC;IACtD,mBAAmB,GAAG,MAAM,CAAU,KAAK;4FAAC;AAEpD,IAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;AAC9C,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAC5C,IAAA,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;IAElD,YAAY,GAAG,MAAM,CAAqB,IAAI;qFAAC;IAC/C,eAAe,GAAG,MAAM,CAAwB,IAAI;wFAAC;IACrD,QAAQ,GAAG,MAAM,CAAc,EAAE;iFAAC;IAClC,QAAQ,GAAG,MAAM,CAAiB,EAAE;iFAAC;AACrC,IAAA,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,CAAC;AACxD,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAE/B,IAAA,YAAY,GAAG,MAAM,CACpC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,GAAG,kBAAkB,GAAG,CAAC;qFAC5D;AAEQ,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAC5C,IAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;IAElD,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,gBAAgB;IACrD,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,EAAE;AACvC,IAAA,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1D,IAAA,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,IAAI,cAAc,CAAC,IAAI;AAChE,IAAA,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,GAAG;AAE7D,IAAA,IAAI,GAAG,QAAQ,CAAC,MACvB,uBAAuB,CACrB,IAAI,CAAC,QAAQ,EAAE,EACf,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CACvC;6EACF;AACQ,IAAA,IAAI,GAAG,QAAQ,CAAC,MACvB,uBAAuB,CACrB,IAAI,CAAC,QAAQ,EAAE,EACf,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CACvC;6EACF;AACQ,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gFAAC;IAEhD,eAAe,GAAG,QAAQ,CACjC,MACE,IAAI,CAAC,YAAY,EAAE,CAAC,iBAAiB;AACrC,QAAA,IAAI,CAAC,YAAY,EAAE,CAAC,sBAAsB;wFAC7C;IACQ,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,GAAG,kBAAkB;kFAAC;IACpE,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE;iFAAC;IAC5C,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,SAAS;oFAAC;AAC5D,IAAA,SAAS,GAAG,QAAQ,CAC3B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,KAAK,SAAS;kFAClD;AACQ,IAAA,WAAW,GAAG,QAAQ,CAC7B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,WAAW,IAAI,SAAS;oFACpD;IACQ,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ;uFAAC;IAChE,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS;wFAAC;;AAElE,IAAA,QAAQ,GAAG,QAAQ,CAC1B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;iFAC3E;AAEQ,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,IAAI,OAAO;iFAAC;AAC/D,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI,EAAE;kFAAC;;;;AAI5D,IAAA,qBAAqB,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,iBAAiB,IAAI,IAAI;8FACrD;AACQ,IAAA,cAAc,GAAG,QAAQ,CAChC,MAAM,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,IAAI,IAAI;uFAC9C;IACQ,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE;wFAAC;AACvD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC;YAC7D,OAAO,IAAI,CAAC,OAAO;QACrB,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,OAAO;IACrD,CAAC;oFAAC;AACO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,OAAO;oFAAC;AACnE,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MACnC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;yFAClD;AAEgB,IAAA,WAAW,GAAG,IAAI,OAAO,EAAQ;AACjC,IAAA,UAAU,GAAG,IAAI,OAAO,EAAmB;AAC3C,IAAA,WAAW,GAAG,IAAI,OAAO,EAAW;AAE5C,IAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;AAC5C,IAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;AAC9C,IAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;IAE/C,WAAW,GAAG,KAAK;AACnB,IAAA,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,SAAS;AAEzD,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,cAAc,EAAE;AAErB,YAAA,SAAS,CAAC,MAAM,EAAE,QAAQ;AACvB,iBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;iBACxC,SAAS,CAAC,MAAK;gBACd,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;AAC1C,YAAA,CAAC,CAAC;QACN;QAEA,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AAEnC,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE;;;;gBAIpB,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,gBAAgB,EAAE;AAC9C,oBAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,SAAS;AACxC,oBAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;gBACvC;gBACA,IAAI,IAAI,CAAC,SAAS;AAAE,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;YACnD;AACA,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACzB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,cAAc,CAAC,MAAqB,EAAA;AAClC,QAAA,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS;AACzD,QAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IACpE;AAEQ,IAAA,wBAAwB,CAAC,MAAoB,EAAA;AACnD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAsC;QACvD,IACE,qBAAqB,IAAI,GAAG;AAC5B,YAAA,OAAO,GAAG,CAAC,mBAAmB,KAAK,UAAU,EAC7C;YACA;iBACG,mBAAmB,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;iBACrD,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE;AACvC,iBAAA,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;QACpB;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;YAC3B,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvD;IAEA,YAAY,GAAA;AACV,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;;QAGjC,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACvC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM;AAClC,gBAAA,GAAG,IAAI;AACP,gBAAA,iBAAiB,EAAE,CAAC,IAAI,CAAC,iBAAiB;AAC3C,aAAA,CAAC,CAAC;YACH;QACF;;AAGA,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AACrB,YAAA,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,sBAAsB;YACrD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM;AAClC,gBAAA,GAAG,IAAI;AACP,gBAAA,sBAAsB,EAAE,eAAe;AACxC,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,eAAe;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;YAC5C;QACF;;AAGA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC,iBAAiB;YACjD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM;AAClC,gBAAA,GAAG,IAAI;AACP,gBAAA,iBAAiB,EAAE,gBAAgB;AACpC,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,gBAAgB;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;QAC/C;aAAO;YACL,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM;AAClC,gBAAA,GAAG,IAAI;AACP,gBAAA,yBAAyB,EAAE,CAAC,KAAK,CAAC,yBAAyB;AAC5D,aAAA,CAAC,CAAC;QACL;IACF;AAEA,IAAA,iBAAiB,CAAC,KAAsB,EAAA;AACtC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,kBAAkB,CAAC,MAA6B,EAAA;QAC9C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC/D;AAEA,IAAA,iBAAiB,CAAC,KAA2B,EAAA;QAC3C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC7D;AAEA,IAAA,cAAc,CAAC,OAA2B,EAAA;AACxC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;IAChC;AAEA,IAAA,iBAAiB,CAAC,OAA8B,EAAA;AAC9C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;IACnC;AAEA,IAAA,OAAO,CAAC,KAAkB,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IACvB;AAEA,IAAA,OAAO,CAAC,IAAoB,EAAA;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IACvB;uGAjQW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;2FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACtDlC;;;AAGG;MACmB,eAAe,CAAA;AAClB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC/B,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAEtC,wBAAwB,GAAwB,IAAI;;AAMlD,IAAA,WAAW,KAAU;AAE/B,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,aAAa,CAAC;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAClC,gBAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClD,IAAI,CAAC,QAAQ,EACb,OAAO,EACP,CAAC,KAAiB,KAAI;AACpB,oBAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE;wBAChC,IAAI,CAAC,QAAQ,EAAE;oBACjB;AACF,gBAAA,CAAC,CACF;YACH;YACA,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,sBAAsB,EAAE;gBAC3D,IAAI,CAAC,eAAe,EAAE;YACxB;AACF,QAAA,CAAC,CAAC;QAEJ,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC,EACjD,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAEpC,SAAS,CAAC,MAAK;YACd,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,WAAW,EAAE;AACpB,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,gBAAgB,CAAC,KAAiB,EAAA;AAChC,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAc;;;;QAKxC,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,KACjD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CACvD,CAAC,OAAO,KACN,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CACnE,CACF;IACH;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC;AACnC,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,sBAAsB,EAAE,KAAK;AAC7B,YAAA,eAAe,EAAE,KAAK;AACvB,SAAA,CAAC;AACF,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACjC,IAAI,CAAC,wBAAwB,EAAE;AAC/B,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;QACtC;QACA,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACpD;IAEA,iBAAiB,GAAA;QACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;IACvD;AAES,IAAA,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS;;AAExC,IAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ;AAC1C,IAAA,eAAe,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,iBAAiB;wFACzD;AACQ,IAAA,cAAc,GAAG,QAAQ,CAChC,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,sBAAsB;uFAC9D;AACD;;;;AAIG;AACM,IAAA,kBAAkB,GAAG,QAAQ,CACpC,MACE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,yBAAyB;QAC5D,CAAC,IAAI,CAAC,SAAS,EAAE;QACjB,CAAC,IAAI,CAAC,YAAY,EAAE;2FACvB;AACF;;MCpFY,SAAS,CAAA;AACH,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAE7C,IAAA,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO;AACpC,IAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO;AACxC,IAAA,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY;AAC3C,IAAA,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU;AAC1C,IAAA,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS;uGAPtC,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApBV,CAAA;;;;;;;;;;;;;;;;;;SAkBH,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAnBkB,kBAAkB,mEAAjC,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAqBZ,SAAS,EAAA,UAAA,EAAA,CAAA;kBAvBrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,kBAAkB,CAAC;AAC5C,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;AAkBH,QAAA,CAAA;AACR,iBAAA;;;MCuFY,WAAW,CAAA;;IAEb,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAa;IAClC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAU;IAChC,SAAS,GAAG,KAAK,CAAS,EAAE;kFAAC;;AAGrB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC/B,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;IAG/B,UAAU,GACzB,SAAS,CAA0B,YAAY;mFAAC;;IAGjC,OAAO,GAAG,MAAM,CAAC,KAAK;gFAAC;AAC/B,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;;AAGlC,IAAA,GAAG,GAAG,QAAQ,CAAC,MAAK;AAC3B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;QAC/B,OAAO,MAAM,GAAG,GAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpE,CAAC;4EAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5B,QAAA,OAAO,QAAQ,CAAC,UAAU,IAAI,EAAE;IAClC,CAAC;mFAAC;;AAGO,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,OAAO,GAAG,QAAQ;QACvD,OAAO;AACL,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,QAAQ,EAAE,SAAS;SACX;IACZ,CAAC;gGAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,IAAI,CAAC,aAAa,CAAC;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAK;AAC9B,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;AAC7B,gBAAA,IAAI,KAAK,CAAC,UAAU,EAAE;oBACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CACd,KAAK,CAAC,GAAG,KAAK,UAAU;wBACtB,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC,CAC1C;gBACH;AAAO,qBAAA,IACL,KAAK,CAAC,GAAG,KAAK,UAAU;oBACxB,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC,EACxC;AACA,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACzB;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;;QAGJ,IAAI,CAAC,aAAa,CAAC;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;QAG3C,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CACHA,QAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC,EACjD,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAEpC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE;gBAC1B,IAAI,CAAC,0BAA0B,EAAE;YACnC;AACF,QAAA,CAAC,CAAC;;QAGJ,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5B,YAAA,IAAI,QAAQ,CAAC,UAAU,EAAE;gBACvB,IAAI,CAAC,0BAA0B,EAAE;YACnC;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACtC,gBAAA,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC5D;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;YACzD,IAAI,CAAC,qBAAqB,EAAE;QAC9B;IACF;IAEQ,qBAAqB,GAAA;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa;QAC/C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,qBAAqB,KAAK,UAAU;YAAE;AAEnE,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAC/C,QAAA,IAAI,CAAC,MAAM;YAAE;;AAGb,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QAEzB,MAAsB,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAA,EAAG,IAAI,CAAA,EAAA,CAAI,CAAC;QACvE,MAAsB,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAA,EAAG,GAAG,CAAA,EAAA,CAAI,CAAC;IACxE;IAEQ,0BAA0B,GAAA;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;;;AAIlB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,OAAO,GAAG,QAAQ;AAEvD,QAAA,MAAM,MAAM,GAAGC,QAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE;AACjD,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,QAAQ,EAAE,SAAS;AACpB,SAAA,CAAC,EAAE;QAEJ,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC;AACnC,gBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;AACf,gBAAA,UAAU,EAAE,IAAI;AACjB,aAAA,CAAC;QACJ;IACF;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE;AAC1D,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;QACtC;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC3D;uGAlJW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtFZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqET,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAiBU,WAAW,kGAvFZ,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,0fAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAuFnD,WAAW,EAAA,UAAA,EAAA,CAAA;kBAzFvB,SAAS;+BACE,gBAAgB,EAAA,OAAA,EACjB,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,CAAC,EAAA,QAAA,EACrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqET,EAAA,IAAA,EAaK;AACJ,wBAAA,yBAAyB,EAAE,UAAU;AACtC,qBAAA,EAAA,MAAA,EAAA,CAAA,qKAAA,CAAA,EAAA;oXAeoC,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACxHnD;;;;AAIG;MAgBU,OAAO,CAAA;AACD,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAEtD;;;;;AAKG;AACM,IAAA,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI;uGATjC,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAZR,CAAA;;;;;;;;;;SAUH,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAXG,WAAW,kGAAE,YAAY,EAAA,CAAA,EAAA,CAAA;;2FAaxB,OAAO,EAAA,UAAA,EAAA,CAAA;kBAfnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,OAAO,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;AACpC,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;AAUH,QAAA,CAAA;AACR,iBAAA;;;MCbY,UAAU,CAAA;uGAAV,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EANX;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EALS,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA;;2FAON,UAAU,EAAA,UAAA,EAAA,CAAA;kBATtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;oBACvB,OAAO,EAAE,CAAC,OAAO,CAAC;AAClB,oBAAA,QAAQ,EAAE;;;;AAIT,EAAA,CAAA;AACF,iBAAA;;;ACND;;;AAGG;MAkBU,YAAY,CAAA;AACd,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAErC,IAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW;AAC5C,IAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW;uGAJ1C,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAbb;;;;;;;;;;;GAWT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAbS,YAAY,8RAAE,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAe/B,YAAY,EAAA,UAAA,EAAA,CAAA;kBAjBxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,kBAAkB,CAAC;AAC3C,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE;AACpC,oBAAA,QAAQ,EAAE;;;;;;;;;;;AAWT,EAAA,CAAA;AACF,iBAAA;;;MC6CY,iBAAiB,GAAG,IAAI,cAAc,CACjD,mBAAmB;MAGR,eAAe,GAAG,IAAI,cAAc,CAC/C,iBAAiB;MAGN,wBAAwB,GAAG,IAAI,cAAc,CACxD,0BAA0B;MAGf,wBAAwB,GAAG,IAAI,cAAc,CACxD,0BAA0B;MAGf,8BAA8B,GAAG,IAAI,cAAc,CAC9D,gCAAgC;MAGrB,gBAAgB,GAAG,IAAI,cAAc,CAChD,kBAAkB;MAGP,aAAa,GAAG,IAAI,cAAc,CAC7C,eAAe;MAeJ,qBAAqB,GAAG,IAAI,cAAc,CACrD,uBAAuB;;MC2BZ,eAAe,CAAA;AACT,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACvB,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/D,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AACxC,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAErC,OAAO,GAAiB,YAAY;AACpC,IAAA,kBAAkB,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;2FAAC;AAE9D,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACvC,QAAA,MAAM,OAAO,GAAqE;AAChF,YAAA,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,sCAAsC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;AAClF,YAAA,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,uCAAuC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;SACrF;;AAED,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE;AAC1E,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,sCAAsC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAClG;AACA,QAAA,OAAO,OAAO;IAChB,CAAC;wFAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAA+C,MAAM;AACzF,QAAA,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,0CAA0C,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;AACvF,QAAA,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,yCAAyC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;AACtF,KAAA;2FAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACtC,MAAM,CAAC,MAAK;gBACV,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;AAChD,gBAAA,UAAU,CAAC;AACT,oBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAe;AAC/C,oBAAA,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ;AACnC,oBAAA,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;AAC/B,oBAAA,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;AACrC,iBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;IACF;AAES,IAAA,QAAQ,GAAmB,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM;QACzF,IAAI;AACJ,QAAA,OAAO,EAAE,GAA8B;AACxC,KAAA,CAAC,CAAC;AAEM,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,OAAO;6FAAC;AAChF,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,OAAO;6FAAC;AAEzF,IAAA,iBAAiB,CAAC,WAA+B,EAAA;AAC/C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACvC,QAAA,IAAI,GAAG;YAAE,OAAO,GAAG,KAAK,WAAW;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS;AAC1D,QAAA,OAAO,MAAM,GAAG,WAAW,KAAK,MAAM,GAAG,WAAW,KAAK,OAAO;IAClE;AAES,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,MAAM;uFAAC;AACzE,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,QAAQ;iFAAC;AACrE,IAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW;AAE5C,IAAA,aAAa,GAAG,QAAQ,CAAiB,MAAK;AACrD,QAAA,MAAM,QAAQ,GAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAChE,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;YAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAA8B,EAAE,CAAC;QAClE;AACA,QAAA,OAAO,QAAQ;IACjB,CAAC;sFAAC;AAEF,IAAA,YAAY,CAAC,KAAiB,EAAE,IAAY,EAAE,KAAmB,EAAA;AAC/D,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAChE;AAAO,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAChE;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC;QACnC,KAAK,CAAC,eAAe,EAAE;IACzB;IAEQ,iBAAiB,CAAC,IAAY,EAAE,KAAmB,EAAA;AACzD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS,IAAI,KAAK;AACnE,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,QAAQ;;;;AAItC,YAAA,MAAM,GAAG,GAAG,OAAO,KAAK,MAAM,GAAG,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC;AACzE,YAAA,IAAI,GAAG;AAAE,gBAAA,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC;QAC3C;AAAO,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YAC7B,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;AAC1D,YAAA,IAAI,UAAU;gBAAE,mBAAmB,CAAC,UAAU,CAAC;QACjD;IACF;AAEA,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAmB,CAAC,EAAE,gBAAgB,IAAI,QAAQ;AAC1E,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACjE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS,IAAI,KAAK;AACnE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,OAAO,IAAI,IAAI;AACjE,QAAA,UAAU,CAAC,EAAE,MAAM,EAAE,KAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAClF;AAEA,IAAA,gBAAgB,CAAC,KAAsC,EAAA;QACrD,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC5D;AAEA,IAAA,mBAAmB,CAAC,KAAkB,EAAA;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,QAAQ;AAC3D,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC;AACpC,YAAA,WAAW,EAAE,KAAK;;AAElB,YAAA,QAAQ,EAAE,KAAK,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ;AAC5E,SAAA,CAAC;IACJ;AAEQ,IAAA,SAAS,CAAC,GAAW,EAAA;QAC3B,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG;IACrD;uGAnHW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,gEAAA,EAAA,cAAA,EAAA,mIAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1FhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApFS,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,YAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA2FnC,eAAe,EAAA,UAAA,EAAA,CAAA;kBA7F3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,CAAC;AAC/C,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFT,EAAA,CAAA;AACD,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EACH,mIAAmI;AACrI,wBAAA,KAAK,EAAE,gEAAgE;AACxE,qBAAA;AACF,iBAAA;;;ACzID;;;AAGG;;ACsBH;MA8Fa,wBAAwB,CAAA;AAClB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/B,SAAS,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzD,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACrD,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,EAAE;AAC3D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACe,IAAA,QAAQ,GAAG,MAAM,CAACC,UAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAE/B,SAAS,GAAG,MAAM,CAAC,KAAK;kFAAC;AACjC,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAE/C,IAAA,WAAA,GAAA;AACE,QAAA,SAAS,CAAa,IAAI,CAAC,QAAQ,EAAE,OAAO;AACzC,aAAA,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnCH,QAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAE9B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACnD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;IACN;AAES,IAAA,kBAAkB,GAAG,QAAQ,CACpC,MACE,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,EAAE,IAAI;AAC1C,QAAA,IAAI,CAAC,SAAS,CAAC,2CAA2C,CAAC;2FAC9D;AACQ,IAAA,iBAAiB,GAAG,QAAQ,CACnC,MAAM,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,IAAI,IAAI,IAAI;0FACxD;IAEgB,UAAU,GAAG,MAAM,CAAiB,EAAE;mFAAC;AAC/C,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;IAChC,SAAS,GAAG,MAAM,CAAgB,EAAE;kFAAC;AAC7C,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;IAC9B,kBAAkB,GAAG,MAAM,CAAgB,IAAI;2FAAC;AACxD,IAAA,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE;IAChD,iBAAiB,GAAG,MAAM,CAAgB,IAAI;0FAAC;AACvD,IAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE;IAC9C,mBAAmB,GAAG,MAAM,CAAC,KAAK;4FAAC;AAC3C,IAAA,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;IAClD,kBAAkB,GAAG,MAAM,CAAC,KAAK;2FAAC;AAC1C,IAAA,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE;IAChD,YAAY,GAAG,MAAM,CAAC,KAAK;qFAAC;AACpC,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAE5C,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAChD,QAAA,IAAI,CAAC,eAAe;AAAE,YAAA,OAAO,KAAK;QAElC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,EAAE,EAAE;QACjE,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE;AAC/D,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAE9C,QACE,eAAe,KAAK,gBAAgB,IAAI,cAAc,KAAK,eAAe;IAE9E,CAAC;kFAAC;IAEF,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAChC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;YACpD,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;IAEQ,aAAa,GAAA;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAEnB,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC;AACF,aAAA,cAAc;AACd,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,SAAS,KAAI;AAClB,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC,CAAC;YACD,KAAK,EAAE,MAAK;;AAEV,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC,CAAC;AACF,SAAA,CAAC;IACN;AAEA,IAAA,eAAe,CAAC,SAAwB,EAAA;AACtC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;QAEtC,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAChC;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;IAC9B;AAEA,IAAA,cAAc,CAAC,QAAuB,EAAA;AACpC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtC;AAEQ,IAAA,YAAY,CAAC,SAAiB,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAEnB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAEhC,QAAA,IAAI,CAAC;aACF,oBAAoB,CAAC,SAAS;AAC9B,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGlC,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,oBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C;YACF,CAAC;YACD,KAAK,EAAE,MAAK;;AAEV,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,CAAC;AACF,SAAA,CAAC;IACN;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAChD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAE9C,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,eAAe;YAAE;AAEvC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE;AACjD,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,MAAM;AAChB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CACrB,gDAAgD,CACjD;AACD,gBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CACpB,qDAAqD,CACtD;AACF,aAAA,CAAC;YACF;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAE3B,QAAA,IAAI,CAAC;AACF,aAAA,aAAa,CAAC,eAAe,EAAE,cAAc,IAAI,EAAE;AACnD,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,MAAK,EAAE,CAAC;YACd,KAAK,EAAE,MAAK;;AAEV,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC9B,CAAC;AACF,SAAA,CAAC;IACN;AAEQ,IAAA,SAAS,CAAC,GAAW,EAAA;QAC3B,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG;IACrD;uGAxKW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxFzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzFS,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,aAAA,EAAA,cAAA,EAAA,WAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAC/B,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA0FJ,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA7FpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,6BAA6B;AACvC,oBAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa;AAC/B,wBAAA,aAAa,EAAE;AACjB,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;AAC3B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFT,EAAA,CAAA;AACF,iBAAA;;;MCzCY,WAAW,CAAA;AACb,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAACC,UAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAE/B,SAAS,GAAG,MAAM,CAAC,KAAK;kFAAC;AACjC,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAE/C,IAAA,WAAA,GAAA;AACE,QAAA,SAAS,CAAa,IAAI,CAAC,QAAQ,EAAE,OAAO;AACzC,aAAA,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnCH,QAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAE9B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACnD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;IACN;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC;uGAzBW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1DZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA1DS,QAAQ,gZAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA4DtB,WAAW,EAAA,UAAA,EAAA,CAAA;kBA9DvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;AAClC,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;AAC3B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDT,EAAA,CAAA;AACF,iBAAA;;;MC6BY,UAAU,CAAA;AACJ,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/B,SAAS,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzD,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACrD,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,EAAE;AAC3D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;IACe,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClD,IAAA,QAAQ,GAAG,MAAM,CAACG,UAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAE/B,SAAS,GAAG,MAAM,CAAC,KAAK;kFAAC;AACjC,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAE/C,IAAA,WAAA,GAAA;AACE,QAAA,SAAS,CAAa,IAAI,CAAC,QAAQ,EAAE,OAAO;AACzC,aAAA,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnCH,QAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAE9B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACnD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;IACN;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC;AAES,IAAA,QAAQ,GAAG,QAAQ,CAC1B,MACE,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,IAAI;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC;iFACzC;AACQ,IAAA,SAAS,GAAG,QAAQ,CAC3B,MAAM,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,KAAK,IAAI,EAAE;kFACnD;AACQ,IAAA,cAAc,GAAG,QAAQ,CAChC,MAAM,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,IAAI,EAAE;uFACvD;IACQ,aAAa,GAAG,QAAQ,CAAC,MAChC,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK;sFACzD;IAED,MAAM,GAAA;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAEnB,QAAA,IAAI,CAAC;AACF,aAAA,MAAM;AACN,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,MAAM,KAAI;gBACf,MAAM,CAAC,GAAG,MAIT;AACD,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;oBACzC,MAAM,EAAE,CAAC,EAAE;AACT,0BAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,gBAAgB;AACjD,2BAAG,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;AACvB,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC;YACpC,CAAC;YACD,KAAK,EAAE,MAAK;;YAEZ,CAAC;AACF,SAAA,CAAC;IACN;IAEA,cAAc,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,EAAE,IAAI,IAAI,EAAE;QAC7D,MAAM,UAAU,GAAG,CAAA,EAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAE;AAChF,QAAA,SAAS,CAAC;aACP,SAAS,CAAC,UAAU;aACpB,IAAI,CAAC,MAAK;AACT,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,4BAA4B,CAAC;AACrD,gBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,oCAAoC,CAAC;AAC7D,aAAA,CAAC;AACJ,QAAA,CAAC;aACA,KAAK,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;AACvC,gBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,yCAAyC,CAAC;AAClE,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACN;IAEQ,SAAS,CACf,GAAW,EACX,IAAsC,EAAA;AAEtC,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG;IAC3D;uGAvGW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3EX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA3ES,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA6ErC,UAAU,EAAA,UAAA,EAAA,CAAA;kBA/EtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC;AACjD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;AAC3B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyET,EAAA,CAAA;AACF,iBAAA;;;MC2LY,YAAY,CAAA;AACd,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,aAAa,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAC7D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACe,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAACG,UAAQ,CAAC;IAEnC,UAAU,GAAG,MAAM,CAAS,EAAE;mFAAC;IAC/B,eAAe,GAAG,MAAM,CAAU,KAAK;wFAAC;IACxC,WAAW,GAAG,MAAM,CAAsB,EAAE;oFAAC;AAC7C,IAAA,YAAY,GAAG,MAAM,CAAS,CAAC,CAAC;qFAAC;IACjC,gBAAgB,GAAG,MAAM,CAAU,KAAK;yFAAC;AACzC,IAAA,YAAY,GAAG,MAAM,CAC5B,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,CAAC,UAAU,GAAG,GAAG,GAAG,KAAK;qFAChE;IAEgB,aAAa,GAAG,SAAS,CAAa,eAAe;sFAAC;IACtD,WAAW,GAAG,SAAS,CAAa,aAAa;oFAAC;AAC3D,IAAA,aAAa;AAErB,IAAA,WAAA,GAAA;;AAEE,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AACjC,YAAA,SAAS,CAAC,MAAM,EAAE,QAAQ;AACvB,iBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;iBACxC,SAAS,CAAC,MAAK;gBACd,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;AAChD,YAAA,CAAC,CAAC;QACN;;AAGA,QAAA,SAAS,CAAa,IAAI,CAAC,QAAQ,EAAE,OAAO;AACzC,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa;AACnD,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;YAE1C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACxC,gBAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;oBAC1B,IAAI,CAAC,gBAAgB,EAAE;gBACzB;gBACA,IACE,IAAI,CAAC,gBAAgB,EAAE;AACvB,qBAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,EACtD;oBACA,IAAI,CAAC,WAAW,EAAE;gBACpB;YACF;AACF,QAAA,CAAC,CAAC;;QAGJ,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;YAEhC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;AACxC,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzB;YACF;AAEA,YAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAK;AACnC,gBAAA,IAAI,CAAC,aAAc,CAAC,cAAc,CAAC,KAAK;AACrC,qBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,qBAAA,SAAS,CAAC,CAAC,OAAO,KAAI;AACrB,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;oBAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACzB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9C,gBAAA,CAAC,CAAC;YACN,CAAC,EAAE,GAAG,CAAC;AACT,QAAA,CAAC,CAAC;IACJ;IAEA,OAAO,GAAA;QACL,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC;IACF;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AAEnC,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC1C;AACF,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnE;AACF,YAAA,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,gBAAgB,EAAE;gBACvB;;IAEN;IAEA,WAAW,GAAA;AACT,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;QAEhC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE;YAC1C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC;AAAO,aAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC;aAAO;YACL,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;AAEA,IAAA,gBAAgB,CAAC,IAAuB,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QACvC;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACxD,IAAI,CAAC,WAAW,EAAE;QACpB;IACF;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACnD,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;YAC3B,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;YAC5C,CAAC,EAAE,GAAG,CAAC;QACT;IACF;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;QAC/B,IAAI,IAAI,CAAC,aAAa,EAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;AAChD,YAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpC;IACF;uGAtJW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3Qb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwGT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,61EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzGS,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,wSAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA4QrC,YAAY,EAAA,UAAA,EAAA,CAAA;kBA9QxB,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,EAAA,QAAA,EACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwGT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,61EAAA,CAAA,EAAA;AAqLsD,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,eAAe,qEACjB,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC1RpE;;;;AAIG;MAoFU,gBAAgB,CAAA;AACV,IAAA,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;AAC9B,IAAA,QAAQ,GAAG,MAAM,CAACC,UAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACvC,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,yBAAyB,GAAG,MAAM,CAAC,wBAAwB,EAAE;AACpE,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACO,IAAA,yBAAyB,GAAG,MAAM,CAAC,wBAAwB,EAAE;AACpE,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACe,IAAA,aAAa,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAC7D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;IAEe,eAAe,GAC9B,SAAS,CAA0B,iBAAiB;wFAAC;IAEtC,gBAAgB,GAAG,MAAM,CAAC,KAAK;yFAAC;AAExC,IAAA,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;IACpD,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa;yFAAC;AACvD,IAAA,oBAAoB,GAAG,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC;AAEvE,IAAA,WAAA,GAAA;AACE,QAAA,SAAS,CAAa,IAAI,CAAC,QAAQ,EAAE,OAAO;AACzC,aAAA,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnCH,QAAM,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAEtC,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa;AACtD,YAAA,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAqB,CAAC,EAAE;AAC/D,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;YAClC;AACF,QAAA,CAAC,CAAC;IACN;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC;YACpC,SAAS,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS;AACxD,SAAA,CAAC;IACJ;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;IAC/C;uGA9CW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtEjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA9EC,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEjB,eAAe,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,wBAAwB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,WAAW,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,YAAY,qDALZ,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA8EJ,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAnF5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,OAAO,EAAE;wBACP,QAAQ;wBACR,iBAAiB;wBACjB,aAAa;wBACb,eAAe;wBACf,UAAU;wBACV,wBAAwB;wBACxB,WAAW;wBACX,YAAY;AACb,qBAAA;AACD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE;AACpC,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoET,EAAA,CAAA;AACF,iBAAA;uGAiBsC,iBAAiB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MCvE3C,SAAS,CAAA;AACX,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAE7B,YAAY,GAC3B,SAAS,CAA0B,cAAc;qFAAC;AAEpD,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;AACnB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAA,IAAI,CAAC,GAAG;gBAAE;YAEV,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,SAAS,CACnE,MAAM,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,aAAa,CAAC,CACxD;YACD,SAAS,CAAC,MAAM,YAAY,CAAC,WAAW,EAAE,CAAC;AAC7C,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;AACK,IAAA,yBAAyB,CAAC,KAAkB,EAAA;QAClD,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;YAChD,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC;AAC3C,YAAA,IAAI,CAAC,IAAI;gBAAE;AAEX,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACxC,YAAA,EAAkB,CAAC,KAAK,CAAC,WAAW,CACnC,gBAAgB,EAChB,CAAA,EAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAA,EAAA,CAAI,CACtB;AACA,YAAA,EAAkB,CAAC,KAAK,CAAC,WAAW,CACnC,eAAe,EACf,CAAA,EAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA,EAAA,CAAI,CACxB;AACH,QAAA,CAAC,CAAC;IACJ;uGArCW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3CV,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAyCH,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA1CG,QAAQ,2JAAiB,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,0DAAtD,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA4CtB,SAAS,EAAA,UAAA,EAAA,CAAA;kBA9CrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;oBACtB,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,CAAC;AAC3E,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCH,QAAA,CAAA;AACR,iBAAA;oGAKsC,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AChC/C,MAAO,gBAAiB,SAAQ,eAAe,CAAA;AAC1C,IAAA,QAAQ,GAAG,QAAQ,CAC1B,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,QAAQ,KAAK,QAAQ;iFAC9D;;IAEQ,iBAAiB,GAAG,QAAQ,CACnC,MACE,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,iBAAiB;0FACtD;IAES,qBAAqB,GAAA;AAC7B,QAAA,OAAO,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC;IACzE;uGAbW,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvBjB;;;;;;;;;;;;;;;;;;;;;AAqBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAtBS,SAAS,EAAA,QAAA,EAAA,YAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,6NAAE,SAAS,EAAA,QAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA;;2FAwB7C,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBA1B5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;oBAC9B,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,CAAC;AACzD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;AAqBT,EAAA,CAAA;AACF,iBAAA;;;MCGY,gBAAgB,CAAA;AAClB,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAE9C;;;;AAIG;IACM,cAAc,GAAG,QAAQ,CAChC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;uFACxE;uGAVU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxBjB;;;;;;;;;;;;;;;;;;;;;;GAsBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAvBS,QAAQ,2JAAiB,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,SAAS,kDAA/C,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAyBtB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBA3B5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;oBAC9B,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC;AACpE,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA;AACF,iBAAA;;;MCMY,eAAe,CAAA;AACT,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC/B,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAE7B,UAAU,GAAG,MAAM,CAAC,EAAE;mFAAC;AAE/B,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;;IAGxC,SAAS,GAAG,QAAQ,CAC3B,MACE,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;QAC9B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,yBAAyB;kFAC/D;AAED,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,gBAAgB,EAAE;QAEvB,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CACHA,QAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC,EACjD,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAEpC,SAAS,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC7C;IAEQ,gBAAgB,GAAA;QACtB,IAAI,KAAK,GAA2B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI;AACzE,QAAA,OAAO,KAAK,CAAC,UAAU,EAAE;AACvB,YAAA,KAAK,GAAG,KAAK,CAAC,UAAU;QAC1B;QACA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IACxC;uGAlCW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArBhB;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApBS,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAiB,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,0DAA7C,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAsBtB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAxB3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;oBAC7B,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,CAAC;AAClE,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA;AACF,iBAAA;;;ACXK,MAAO,eAAgB,SAAQ,eAAe,CAAA;IACjC,OAAO,GAAG,SAAS,CAA0B,SAAS;gFAAC;IAE9D,qBAAqB,GAAA;AAC7B,QAAA,OAAO,CAAC,wBAAwB,EAAE,4BAA4B,CAAC;IACjE;AAEA;;;AAGG;IACgB,WAAW,GAAA;AAC5B,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACpD;uGAbW,eAAe,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnBhB;;;;;;;;;;;;;;;;;AAiBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAlBS,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAoB9C,eAAe,EAAA,UAAA,EAAA,CAAA;kBAtB3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,OAAO,EAAE,CAAC,eAAe,EAAE,gBAAgB,EAAE,YAAY,CAAC;AAC1D,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;AAiBT,EAAA,CAAA;AACF,iBAAA;qEAE+D,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACxBzE;;;;AAIG;MAYU,SAAS,CAAA;AACX,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;uGADnC,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EARV;;;;;;GAMT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAPS,gBAAgB,+DAAE,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,CAAA;;2FAShC,SAAS,EAAA,UAAA,EAAA,CAAA;kBAXrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,OAAO,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC;AAC5C,oBAAA,QAAQ,EAAE;;;;;;AAMT,EAAA,CAAA;AACF,iBAAA;;;MCkDY,uBAAuB,CAAA;AACjB,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAC7C,IAAA,qBAAqB,GAAG,MAAM,CAAC,8BAA8B,EAAE;AACtE,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAC7B,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS;oFAClD;IAED,cAAc,GAAA;QACZ,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS;AACpE,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACzE;uGAbW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5DxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAjDS,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,CAAA;;2FA6D3C,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA/DnC,SAAS;+BACE,2BAA2B,EAAA,OAAA,EAC5B,CAAC,iBAAiB,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAA,QAAA,EAC7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wHAAA,CAAA,EAAA;;;AC1DH;;ACMM,SAAU,WAAW,CAAC,UAAkB,EAAE,OAAe,EAAA;AAC7D,IAAA,OAAO,EAAE,MAAM,EAAE,UAAwB,EAAE,OAAO,EAAE;AACtD;;ACNO,MAAM,aAAa,GAAsB;AAC9C,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,OAAO,EAAE,QAAQ;;;ACFZ,MAAM,UAAU,GAAsB;AAC3C,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,OAAO,EAAE,OAAO;;;ACJX,MAAM,eAAe,GAA2B;;AAErD,IAAA,sBAAsB,EAAE,SAAS;AACjC,IAAA,oCAAoC,EAAE,iBAAiB;AACvD,IAAA,kCAAkC,EAAE,kBAAkB;AACtD,IAAA,uBAAuB,EAAE,QAAQ;AACjC,IAAA,sBAAsB,EAAE,OAAO;AAC/B,IAAA,4BAA4B,EAAE,aAAa;AAC3C,IAAA,oCAAoC,EAAE,sBAAsB;AAC5D,IAAA,yCAAyC,EAAE,6BAA6B;;AAGxE,IAAA,sBAAsB,EAAE,MAAM;AAC9B,IAAA,8BAA8B,EAAE,cAAc;AAC9C,IAAA,yBAAyB,EAAE,mBAAmB;;AAG9C,IAAA,sCAAsC,EAAE,yBAAyB;AACjE,IAAA,+CAA+C,EAAE,gBAAgB;AACjE,IAAA,uCAAuC,EAAE,QAAQ;AACjD,IAAA,8CAA8C,EAAE,eAAe;AAC/D,IAAA,8CAA8C,EAAE,QAAQ;AACxD,IAAA,2CAA2C,EAAE,YAAY;AACzD,IAAA,gDAAgD,EAAE,iBAAiB;AACnE,IAAA,qDAAqD,EACnD,wBAAwB;;AAG1B,IAAA,sBAAsB,EAAE,QAAQ;AAChC,IAAA,kCAAkC,EAAE,uBAAuB;;;AAI3D,IAAA,2BAA2B,EAAE,aAAa;;AAG1C,IAAA,gCAAgC,EAAE,kBAAkB;AACpD,IAAA,mCAAmC,EAAE,qBAAqB;AAC1D,IAAA,4BAA4B,EAAE,cAAc;;AAG5C,IAAA,6BAA6B,EAAE,SAAS;AACxC,IAAA,6BAA6B,EAAE,SAAS;AACxC,IAAA,6BAA6B,EAAE,SAAS;AACxC,IAAA,+BAA+B,EAAE,WAAW;AAC5C,IAAA,sCAAsC,EAAE,QAAQ;AAChD,IAAA,uCAAuC,EAAE,SAAS;AAClD,IAAA,sCAAsC,EAAE,QAAQ;AAChD,IAAA,kCAAkC,EAAE,QAAQ;AAC5C,IAAA,0CAA0C,EAAE,SAAS;AACrD,IAAA,yCAAyC,EAAE,QAAQ;;AAGnD,IAAA,kBAAkB,EAAE,IAAI;;AAGxB,IAAA,gBAAgB,EAAE,WAAW;AAC7B,IAAA,qBAAqB,EAAE,gBAAgB;AACvC,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,oBAAoB,EAAE,eAAe;AACrC,IAAA,mBAAmB,EAAE,cAAc;AACnC,IAAA,mBAAmB,EAAE,cAAc;AACnC,IAAA,oBAAoB,EAAE,eAAe;AACrC,IAAA,mBAAmB,EAAE,cAAc;AACnC,IAAA,iBAAiB,EAAE,YAAY;AAC/B,IAAA,yBAAyB,EAAE,SAAS;AACpC,IAAA,sBAAsB,EAAE,MAAM;AAC9B,IAAA,sBAAsB,EAAE,MAAM;AAC9B,IAAA,yBAAyB,EAAE,SAAS;AACpC,IAAA,sBAAsB,EAAE,MAAM;AAC9B,IAAA,uBAAuB,EAAE,OAAO;AAChC,IAAA,uBAAuB,EAAE,OAAO;AAChC,IAAA,sBAAsB,EAAE,YAAY;;;AAKpC,IAAA,oBAAoB,EAAE,eAAe;;AAGrC,IAAA,4BAA4B,EAAE,eAAe;AAC7C,IAAA,uBAAuB,EAAE,wBAAwB;AACjD,IAAA,oBAAoB,EAAE,kBAAkB;;AAGxC,IAAA,4BAA4B,EAAE,UAAU;AACxC,IAAA,+BAA+B,EAAE,gBAAgB;AACjD,IAAA,6BAA6B,EAAE,gBAAgB;AAC/C,IAAA,4BAA4B,EAAE,gBAAgB;;AAG9C,IAAA,2BAA2B,EAAE,WAAW;AACxC,IAAA,iCAAiC,EAAE,kBAAkB;AACrD,IAAA,2BAA2B,EAAE,gCAAgC;AAC7D,IAAA,yBAAyB,EAAE,KAAK;AAChC,IAAA,4BAA4B,EAAE,QAAQ;AACtC,IAAA,2BAA2B,EAAE,kBAAkB;;;ACnGjD;;ACAA;;AAEG;;;;"}
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/shared/layout-shell.base.ts","../../../projects/ng-layout/components/shared/app.footer.ts","../../../projects/ng-layout/components/shared/app.menuitem.ts","../../../projects/ng-layout/components/shared/app.menu.ts","../../../projects/ng-layout/components/layouts/classic/app.sidebar.ts","../../../projects/ng-layout/components/shared/app.brand-logo.ts","../../../projects/ng-layout/interfaces/layout-auth.interface.ts","../../../projects/ng-layout/components/shared/app.configurator.ts","../../../projects/ng-layout/interfaces/view-transitions.ts","../../../projects/ng-layout/components/shared/top-bar/app.company-branch-selector.ts","../../../projects/ng-layout/components/shared/top-bar/app.launcher.ts","../../../projects/ng-layout/components/shared/top-bar/app.profile.ts","../../../projects/ng-layout/components/shared/top-bar/app.searchbar.ts","../../../projects/ng-layout/components/shared/top-bar/app.topbar-actions.ts","../../../projects/ng-layout/components/layouts/classic/app.topbar.ts","../../../projects/ng-layout/components/layouts/classic/app.classic-layout.ts","../../../projects/ng-layout/components/layouts/modern/app.modern-sidebar.ts","../../../projects/ng-layout/components/layouts/modern/app.modern-topbar.ts","../../../projects/ng-layout/components/layouts/modern/app.modern-layout.ts","../../../projects/ng-layout/components/app.layout.ts","../../../projects/ng-layout/components/shared/app.floatingconfigurator.ts","../../../projects/ng-layout/components/public-api.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, LayoutTheme } from '@flusys/ng-core';\nimport { PRESET_NAMES } from '@flusys/ng-ui';\n\nconst STORAGE_KEY = 'flusys.layout.config';\nconst STORAGE_VERSION = 1;\n\n// Sourced from the theme package so a new preset never silently fails validation.\nconst VALID_PRESETS: readonly string[] = PRESET_NAMES;\nconst VALID_MENU_MODES: readonly string[] = ['static', 'overlay', 'topbar'];\nconst VALID_LAYOUT_THEMES: readonly LayoutTheme[] = ['classic', 'modern'];\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 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 return this.validateConfig(JSON.parse(stored) as PersistedLayoutConfig);\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 // localStorage may be full or disabled — the config simply stays unsaved.\n }\n }\n\n clear(): void {\n if (!this.isBrowser) return;\n localStorage.removeItem(STORAGE_KEY);\n }\n\n /**\n * Coerces a stored value only when it is present and unrecognised. A field the\n * user never changed stays absent so the app's own default still wins when this\n * result is merged over it.\n */\n private validateConfig(stored: PersistedLayoutConfig): LayoutConfig | null {\n if (stored._version && stored._version !== STORAGE_VERSION) {\n this.clear();\n return null;\n }\n\n const { _version, ...config } = stored;\n\n if (config.preset !== undefined && !VALID_PRESETS.includes(config.preset)) {\n config.preset = 'Aura';\n }\n\n if (\n config.menuMode !== undefined &&\n !VALID_MENU_MODES.includes(config.menuMode)\n ) {\n config.menuMode = 'static';\n }\n\n if (\n config.layoutTheme !== undefined &&\n !VALID_LAYOUT_THEMES.includes(config.layoutTheme)\n ) {\n config.layoutTheme = 'classic';\n }\n\n if (config.darkTheme !== undefined && typeof config.darkTheme !== 'boolean') {\n config.darkTheme = false;\n }\n\n return config;\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 LayoutTheme,\n} from '@flusys/ng-core';\nimport { PermissionValidatorService } from '@flusys/ng-shared';\nimport { fromEvent, Subject } from 'rxjs';\n\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\n/** Matches the 991px shell breakpoint both skins use in SCSS. */\nconst DESKTOP_BREAKPOINT = 991;\n\nexport interface LayoutState {\n staticMenuDesktopInactive?: boolean;\n overlayMenuActive?: boolean;\n configSidebarVisible?: boolean;\n staticMenuMobileActive?: boolean;\n menuHoverActive?: 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 layoutTheme: 'classic',\n };\n\n private readonly DEFAULT_STATE: LayoutState = {\n staticMenuDesktopInactive: false,\n overlayMenuActive: false,\n configSidebarVisible: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\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 layoutTheme = computed<LayoutTheme>(\n () => this._layoutConfig().layoutTheme ?? 'classic',\n );\n readonly isModernLayout = computed(() => this.layoutTheme() === 'modern');\n readonly isClassicLayout = computed(() => this.layoutTheme() === 'classic');\n /** The modern skin has no horizontal nav, so topbar mode only applies to the classic skin. */\n readonly isTopbar = computed(\n () => this._layoutConfig().menuMode === 'topbar' && !this.isModernLayout(),\n );\n\n readonly userName = computed(() => this._userProfile()?.name ?? 'Guest');\n readonly userEmail = computed(() => this._userProfile()?.email ?? '');\n // `||`, not `??`, throughout the block below: the backend returns \"no picture\" and\n // \"no logo\" as an empty string as often as it does null, and an empty string would\n // slip past `??` and render as a broken image.\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 private appliedDarkTheme = this._layoutConfig().darkTheme;\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 // Only the dark-mode flip is worth a view transition. Every other field —\n // preset, primary, menu mode, layout skin — used to start one too, which\n // cross-faded the whole page for a change that never touched it.\n if (config.darkTheme !== this.appliedDarkTheme) {\n this.appliedDarkTheme = config.darkTheme;\n this.handleDarkModeTransition(config);\n }\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 // 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 { computed, DestroyRef, DOCUMENT, inject, Renderer2 } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { LayoutService } from '../../services/public-api';\n\n/**\n * Shared shell behaviour for every layout skin.\n * Holds the menu open/close lifecycle so a skin only owns markup and styling.\n */\nexport abstract class LayoutShellBase {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n private readonly renderer = inject(Renderer2);\n private readonly router = inject(Router);\n readonly layoutService = inject(LayoutService);\n\n private menuOutsideClickListener: (() => void) | null = null;\n\n /** Elements that must not close the menu when clicked. */\n protected abstract outsideClickSelectors(): string[];\n\n /** Extra work a skin needs on every completed navigation. */\n protected onNavigated(): void {}\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: MouseEvent) => {\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(() => {\n this.hideMenu();\n this.onNavigated();\n });\n }\n\n isOutsideClicked(event: MouseEvent): boolean {\n const eventTarget = event.target as Node;\n\n // querySelectorAll, not querySelector: a skin may render the same control more\n // than once (the modern shell has a menu button in both the sidebar and the\n // topbar) and matching only the first one reads a real click as an outside one.\n return !this.outsideClickSelectors().some((selector) =>\n Array.from(this.document.querySelectorAll(selector)).some(\n (element) =>\n element.isSameNode(eventTarget) || element.contains(eventTarget),\n ),\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 = this.layoutService.isOverlay;\n /** Delegated so a skin that has no horizontal nav is never treated as being in it. */\n readonly isTopbarMode = this.layoutService.isTopbar;\n readonly isOverlayActive = computed(\n () => this.layoutService.layoutState().overlayMenuActive,\n );\n readonly isMobileActive = computed(\n () => this.layoutService.layoutState().staticMenuMobileActive,\n );\n /**\n * The desktop sidebar is collapsed in place. Only meaningful for the modes that\n * keep the sidebar in the layout flow — an overlay drawer and the horizontal nav\n * have nothing to collapse.\n */\n readonly isDesktopCollapsed = computed(\n () =>\n !!this.layoutService.layoutState().staticMenuDesktopInactive &&\n !this.isOverlay() &&\n !this.isTopbarMode(),\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 {\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/public-api';\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","import { Component } from '@angular/core';\nimport { AppMenu } from '../../shared/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, inject } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { InlineSvgComponent } from '@flusys/ng-shared';\nimport { LayoutService } from '../../services/public-api';\n\n/**\n * Home link showing the active company logo and name.\n * Every skin renders this same markup; sizing and colour come from the bar it sits in.\n */\n@Component({\n selector: 'app-brand-logo',\n imports: [RouterModule, InlineSvgComponent],\n host: { style: 'display: contents' },\n template: `\n <a class=\"layout-brand-logo\" routerLink=\"/\">\n @if (displayLogo()) {\n @if (layoutService.isDisplayLogoSvg()) {\n <inline-svg [src]=\"displayLogo()\" class=\"logo-image\" />\n } @else {\n <img [src]=\"displayLogo()\" [alt]=\"companyName()\" class=\"logo-image\" />\n }\n }\n <span>{{ companyName() }}</span>\n </a>\n `,\n})\nexport class AppBrandLogo {\n readonly layoutService = inject(LayoutService);\n\n readonly companyName = this.layoutService.companyName;\n readonly displayLogo = this.layoutService.displayLogo;\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 getMyCompanies(): Observable<ICompanyInfo[]>;\n getMyCompanyBranches(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 { 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 type { LayoutTheme } from '@flusys/ng-core';\nimport { TranslatePipe, TranslateService } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport {\n applyPrimaryPalette,\n applySurfacePalette,\n applyTheme,\n NOIR_PRIMARY,\n PRIMARY_PALETTES,\n SURFACE_PALETTES,\n PRESET_NAMES,\n PRESETS,\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.layout.theme' | translate\n }}</span>\n <f-selectbutton\n [ngModel]=\"layoutTheme()\"\n (ngModelChange)=\"onLayoutThemeChange($event)\"\n [options]=\"layoutThemeOptions()\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\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 // Topbar mode renders a horizontal nav, which only the classic skin provides.\n if (this.layoutService.isDesktop() && !this.layoutService.isModernLayout()) {\n options.push({ label: this.translate('layout.configurator.menu.mode.topbar'), value: 'topbar' });\n }\n return options;\n });\n\n readonly layoutThemeOptions = computed<Array<{ label: string; value: LayoutTheme }>>(() => [\n { label: this.translate('layout.configurator.layout.theme.classic'), value: 'classic' },\n { label: this.translate('layout.configurator.layout.theme.modern'), value: 'modern' },\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 readonly layoutTheme = this.layoutService.layoutTheme;\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 // NOIR_PRIMARY, not a copy of a surface palette: its shades are references to\n // the active surface ramp, which is what lets applyPrimaryPalette recognise the\n // neutral and derive the same tokens a preset switch to Nora would.\n const pal = primary === 'noir' ? NOIR_PRIMARY : PRIMARY_PALETTES[primary];\n if (pal) applyPrimaryPalette(pal, 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 const primary = PRESETS[event as PresetName]?.signaturePrimary ?? 'violet';\n this.layoutService.updateLayoutConfig({ preset: event, primary });\n const isDark = this.layoutService.layoutConfig().darkTheme ?? false;\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 onLayoutThemeChange(event: LayoutTheme): void {\n const menuMode = this.layoutService.layoutConfig().menuMode;\n this.layoutService.updateLayoutConfig({\n layoutTheme: event,\n // Modern skin has no horizontal nav — fall back to the static sidebar.\n menuMode: event === 'modern' && menuMode === 'topbar' ? 'static' : menuMode,\n });\n }\n\n private translate(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\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 .getMyCompanies()\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 .getMyCompanyBranches(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: var(--layout-shell-topbar-bottom, 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 ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { 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 { AppCompanyBranchSelector } from './app.company-branch-selector';\nimport { AppLauncher } from './app.launcher';\nimport { AppProfile } from './app.profile';\nimport { AppSearchbar } from './app.searchbar';\n\n/**\n * Trailing action rail of the topbar — search, theme controls and the widget menu.\n * Skins own the bar around it; the rail itself is identical in every skin, and\n * `display: contents` on the host keeps it a direct flex child of the bar.\n */\n@Component({\n selector: 'app-topbar-actions',\n imports: [\n UiModule,\n NgComponentOutlet,\n TranslatePipe,\n AppConfigurator,\n AppProfile,\n AppCompanyBranchSelector,\n AppLauncher,\n AppSearchbar,\n ],\n host: { style: 'display: contents' },\n template: `\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\n [name]=\"layoutService.isDarkTheme() ? 'moon' : 'sun'\"\n ></ui-icon>\n </button>\n <div class=\"relative\" #configContainer>\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"configPanelOpen()\"\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)=\"toggleConfigPanel()\"\n >\n <ui-icon name=\"palette\"></ui-icon>\n </button>\n <app-configurator />\n </div>\n </div>\n\n <button\n type=\"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 `,\n})\nexport class AppTopbarActions {\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 private readonly configContainer =\n viewChild<ElementRef<HTMLElement>>('configContainer');\n\n private readonly _configPanelOpen = signal(false);\n\n readonly configPanelOpen = this._configPanelOpen.asReadonly();\n readonly hasSearchAdapter = computed(() => !!this.searchAdapter);\n readonly enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this._configPanelOpen()),\n )\n .subscribe((event) => {\n const configEl = this.configContainer()?.nativeElement;\n if (configEl && !configEl.contains(event.target as HTMLElement)) {\n this._configPanelOpen.set(false);\n }\n });\n }\n\n toggleDarkMode(): void {\n this.layoutService.updateLayoutConfig({\n darkTheme: !this.layoutService.layoutConfig().darkTheme,\n });\n }\n\n toggleConfigPanel(): void {\n this._configPanelOpen.update((open) => !open);\n }\n}\n","import {\n Component,\n effect,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { fromEvent } from 'rxjs';\nimport { LayoutService } from '../../../services/public-api';\nimport { AppBrandLogo } from '../../shared/app.brand-logo';\nimport { AppMenu } from '../../shared/app.menu';\nimport { AppTopbarActions } from '../../shared/top-bar/app.topbar-actions';\n\n@Component({\n selector: 'app-topbar',\n imports: [UiModule, TranslatePipe, AppBrandLogo, AppMenu, AppTopbarActions],\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.isMobile()) {\n <button\n type=\"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 <app-brand-logo />\n @if (layoutService.isDesktop() && !layoutService.isTopbar()) {\n <button\n type=\"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 class=\"layout-topbar-nav\" (pointerenter)=\"syncScrollThumb()\">\n <div #navContainer class=\"layout-topbar-nav-horizontal\">\n <app-menu />\n </div>\n @if (scrollThumb().width > 0) {\n <span\n aria-hidden=\"true\"\n class=\"layout-topbar-nav-scroll-thumb\"\n [style.width.px]=\"scrollThumb().width\"\n [style.marginInlineStart.px]=\"scrollThumb().offset\"\n ></span>\n }\n </div>\n }\n\n <app-topbar-actions />\n </div>`,\n})\nexport class AppTopbar {\n readonly layoutService = inject(LayoutService);\n\n private readonly navContainer =\n viewChild<ElementRef<HTMLElement>>('navContainer');\n\n private readonly _scrollThumb = signal({ width: 0, offset: 0 });\n\n readonly scrollThumb = this._scrollThumb.asReadonly();\n\n constructor() {\n effect((onCleanup) => {\n const nav = this.navContainer();\n if (!nav) {\n this._scrollThumb.set({ width: 0, offset: 0 });\n return;\n }\n\n const subscription = fromEvent(nav.nativeElement, 'scroll').subscribe(\n () => {\n this.recalculateHoveredSubmenu(nav.nativeElement);\n this.syncScrollThumb();\n },\n );\n const resizeObserver =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(() => this.syncScrollThumb());\n resizeObserver?.observe(nav.nativeElement);\n\n onCleanup(() => {\n subscription.unsubscribe();\n resizeObserver?.disconnect();\n });\n });\n }\n\n syncScrollThumb(): void {\n const nav = this.navContainer()?.nativeElement;\n if (!nav) return;\n\n const { clientWidth, scrollWidth, scrollLeft } = nav;\n if (scrollWidth <= clientWidth + 1) {\n this._scrollThumb.set({ width: 0, offset: 0 });\n return;\n }\n\n const ratio = clientWidth / scrollWidth;\n this._scrollThumb.set({\n width: Math.round(clientWidth * ratio),\n offset: Math.round(Math.abs(scrollLeft) * ratio),\n });\n }\n\n /**\n * Horizontal-nav submenus are `position: fixed`, so scrolling the nav strip leaves\n * an open submenu behind — re-anchor it to the item it belongs to.\n */\n private recalculateHoveredSubmenu(navEl: HTMLElement): void {\n navEl.querySelectorAll('li:hover').forEach((li) => {\n const link = li.querySelector(':scope > a');\n if (!link) return;\n\n const rect = link.getBoundingClientRect();\n (li as HTMLElement).style.setProperty(\n '--submenu-left',\n `${rect.left - 12}px`,\n );\n (li as HTMLElement).style.setProperty(\n '--submenu-top',\n `${rect.bottom + 12}px`,\n );\n });\n }\n}\n","import { Component, computed } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { LayoutShellBase } from '../../shared/layout-shell.base';\nimport { AppFooter } from '../../shared/app.footer';\nimport { AppSidebar } from './app.sidebar';\nimport { AppTopbar } from './app.topbar';\n\n@Component({\n selector: 'app-classic-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]=\"isDesktopCollapsed()\"\n [class.layout-overlay-active]=\"isOverlayActive()\"\n [class.layout-mobile-active]=\"isMobileActive()\"\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 AppClassicLayout extends LayoutShellBase {\n readonly isStatic = computed(\n () => this.layoutService.layoutConfig().menuMode === 'static',\n );\n\n protected outsideClickSelectors(): string[] {\n return ['.layout-sidebar', '.layout-menu-button', '.layout-topbar-nav'];\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { LayoutService } from '../../../services/public-api';\nimport { AppBrandLogo } from '../../shared/app.brand-logo';\nimport { AppFooter } from '../../shared/app.footer';\nimport { AppMenu } from '../../shared/app.menu';\n\n@Component({\n selector: 'app-modern-sidebar',\n imports: [UiModule, TranslatePipe, AppBrandLogo, AppMenu, AppFooter],\n template: `\n <aside class=\"layout-modern-sidebar\">\n <div class=\"layout-modern-brand\">\n <app-brand-logo />\n @if (showMenuButton()) {\n <button\n type=\"button\"\n class=\"layout-modern-menu-button\"\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 <app-menu />\n\n <div class=\"layout-modern-sidebar-footer\">\n <app-footer />\n </div>\n </aside>\n `,\n})\nexport class AppModernSidebar {\n readonly layoutService = inject(LayoutService);\n\n /**\n * Only the in-flow column can be collapsed from here. As an overlay or mobile\n * drawer the sidebar is opened by the topbar button and dismissed by the mask,\n * so a second toggle inside it would be dead weight next to the brand.\n */\n readonly showMenuButton = computed(\n () => !this.layoutService.isMobile() && !this.layoutService.isOverlay(),\n );\n}\n","import {\n Component,\n computed,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { filter } from 'rxjs/operators';\nimport { LayoutService } from '../../../services/public-api';\nimport { AppBrandLogo } from '../../shared/app.brand-logo';\nimport { AppTopbarActions } from '../../shared/top-bar/app.topbar-actions';\n\n@Component({\n selector: 'app-modern-topbar',\n imports: [UiModule, TranslatePipe, AppBrandLogo, AppTopbarActions],\n template: `\n <header class=\"layout-modern-topbar\">\n @if (showBrand()) {\n <button\n type=\"button\"\n class=\"layout-modern-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 <app-brand-logo />\n }\n\n <span class=\"layout-modern-page-title\">{{ pageTitle() }}</span>\n\n <app-topbar-actions />\n </header>\n `,\n})\nexport class AppModernTopbar {\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n readonly layoutService = inject(LayoutService);\n\n private readonly _pageTitle = signal('');\n\n readonly pageTitle = this._pageTitle.asReadonly();\n\n /** The sidebar is a drawer (not a column) in these modes, so the topbar owns the brand. */\n readonly showBrand = computed(\n () =>\n this.layoutService.isMobile() ||\n this.layoutService.isOverlay() ||\n !!this.layoutService.layoutState().staticMenuDesktopInactive,\n );\n\n constructor() {\n this.resolvePageTitle();\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => this.resolvePageTitle());\n }\n\n private resolvePageTitle(): void {\n let route: ActivatedRouteSnapshot = this.router.routerState.snapshot.root;\n while (route.firstChild) {\n route = route.firstChild;\n }\n this._pageTitle.set(route.title ?? '');\n }\n}\n","import { Component, ElementRef, viewChild } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { LayoutShellBase } from '../../shared/layout-shell.base';\nimport { AppModernSidebar } from './app.modern-sidebar';\nimport { AppModernTopbar } from './app.modern-topbar';\n\n@Component({\n selector: 'app-modern-layout',\n imports: [AppModernTopbar, AppModernSidebar, RouterModule],\n template: `\n <div\n class=\"layout-modern\"\n [class.layout-modern-overlay]=\"isOverlay()\"\n [class.layout-modern-static-inactive]=\"isDesktopCollapsed()\"\n [class.layout-modern-overlay-active]=\"isOverlayActive()\"\n [class.layout-modern-mobile-active]=\"isMobileActive()\"\n >\n <app-modern-sidebar />\n <div class=\"layout-modern-main\">\n <app-modern-topbar />\n <div class=\"layout-modern-content\" #content>\n <router-outlet></router-outlet>\n </div>\n </div>\n <div class=\"layout-modern-mask animate-fadein\"></div>\n </div>\n `,\n})\nexport class AppModernLayout extends LayoutShellBase {\n private readonly content = viewChild<ElementRef<HTMLElement>>('content');\n\n protected outsideClickSelectors(): string[] {\n return ['.layout-modern-sidebar', '.layout-modern-menu-button'];\n }\n\n /**\n * The page scrolls inside the content card rather than the window, so the router's\n * scroll restoration never reaches it — reset it here instead.\n */\n protected override onNavigated(): void {\n this.content()?.nativeElement.scrollTo({ top: 0 });\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { LayoutService } from '../services/public-api';\nimport { AppClassicLayout } from './layouts/classic/app.classic-layout';\nimport { AppModernLayout } from './layouts/modern/app.modern-layout';\n\n/**\n * Layout shell entry point.\n * Renders the skin selected by `LayoutConfig.layoutTheme` — every skin shares\n * the same services, menu and topbar components, only the markup and styling differ.\n */\n@Component({\n selector: 'app-layout',\n imports: [AppClassicLayout, AppModernLayout],\n template: `\n @if (layoutService.isModernLayout()) {\n <app-modern-layout />\n } @else {\n <app-classic-layout />\n }\n `,\n})\nexport class AppLayout {\n readonly layoutService = inject(LayoutService);\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","// Shell entry point (renders the configured layout skin)\nexport * from './app.layout';\n\n// Shared across every layout skin\nexport * from './shared/app.brand-logo';\nexport * from './shared/app.configurator';\nexport * from './shared/app.floatingconfigurator';\nexport * from './shared/app.footer';\nexport * from './shared/app.menu';\nexport * from './shared/app.menuitem';\nexport * from './shared/layout-shell.base';\nexport * from './shared/top-bar/app.company-branch-selector';\nexport * from './shared/top-bar/app.launcher';\nexport * from './shared/top-bar/app.profile';\nexport * from './shared/top-bar/app.searchbar';\nexport * from './shared/top-bar/app.topbar-actions';\n\n// Classic skin\nexport * from './layouts/classic/app.classic-layout';\nexport * from './layouts/classic/app.sidebar';\nexport * from './layouts/classic/app.topbar';\n\n// Modern skin\nexport * from './layouts/modern/app.modern-layout';\nexport * from './layouts/modern/app.modern-sidebar';\nexport * from './layouts/modern/app.modern-topbar';\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/shared/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/shared/top-bar/app.launcher.ts\n 'layout.launcher.apps': 'Apps',\n 'layout.launcher.applications': 'Applications',\n 'layout.launcher.no.apps': 'No apps available',\n\n // components/shared/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/shared/top-bar/app.searchbar.ts\n 'layout.topbar.search': 'Search',\n 'layout.topbar.search.placeholder': 'Search for content...',\n\n // components/layouts/classic/app.topbar.ts + components/layouts/modern/app.modern-topbar.ts\n // + components/layouts/modern/app.modern-sidebar.ts\n 'layout.topbar.toggle.menu': 'Toggle menu',\n\n // components/shared/top-bar/app.topbar-actions.ts\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/shared/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 'layout.configurator.layout.theme': 'Layout',\n 'layout.configurator.layout.theme.classic': 'Classic',\n 'layout.configurator.layout.theme.modern': 'Modern',\n\n // components/shared/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.ai.assistant': 'AI Assistant',\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\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 // ng-ai-assistant/components/chat-widget-host/chat-widget-host.component.ts\n 'ai-assistant.widget.title': 'Assistant',\n 'ai-assistant.widget.placeholder': 'Ask me anything…',\n 'ai-assistant.widget.empty': 'Ask me anything to get started',\n 'ai-assistant.widget.pin': 'Pin',\n 'ai-assistant.widget.pinned': 'Pinned',\n 'ai-assistant.widget.error': 'Error: {{error}}',\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":["filter","isRouteActive","i2","DOCUMENT","i1"],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@flusys/ng-layout",
3
- "version": "6.4.0",
3
+ "version": "6.4.1",
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.4.0",
11
- "@flusys/ng-shared": ">=6.4.0",
12
- "@flusys/ng-ui": ">=6.4.0",
10
+ "@flusys/ng-core": ">=6.4.1",
11
+ "@flusys/ng-shared": ">=6.4.1",
12
+ "@flusys/ng-ui": ">=6.4.1",
13
13
  "tailwindcss": ">=4.0.0",
14
14
  "rxjs": "^7.8.0"
15
15
  },
@@ -96,7 +96,6 @@ interface LayoutState {
96
96
  configSidebarVisible?: boolean;
97
97
  staticMenuMobileActive?: boolean;
98
98
  menuHoverActive?: boolean;
99
- topbarMenuVisible?: boolean;
100
99
  }
101
100
  interface MenuChangeEvent {
102
101
  key: string;
@@ -533,8 +532,6 @@ declare class AppTopbarActions {
533
532
 
534
533
  declare class AppClassicLayout extends LayoutShellBase {
535
534
  readonly isStatic: _angular_core.Signal<boolean>;
536
- /** Topbar mode without its nav row leaves the content sitting under the bar alone. */
537
- readonly isTopbarNavHidden: _angular_core.Signal<boolean>;
538
535
  protected outsideClickSelectors(): string[];
539
536
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppClassicLayout, never>;
540
537
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppClassicLayout, "app-classic-layout", never, {}, {}, never, never, true, never>;
@@ -548,7 +545,13 @@ declare class AppSidebar {
548
545
  declare class AppTopbar {
549
546
  readonly layoutService: LayoutService;
550
547
  private readonly navContainer;
548
+ private readonly _scrollThumb;
549
+ readonly scrollThumb: _angular_core.Signal<{
550
+ width: number;
551
+ offset: number;
552
+ }>;
551
553
  constructor();
554
+ syncScrollThumb(): void;
552
555
  /**
553
556
  * Horizontal-nav submenus are `position: fixed`, so scrolling the nav strip leaves
554
557
  * an open submenu behind — re-anchor it to the item it belongs to.