ng-hub-ui-nav 21.1.0
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/LICENSE +21 -0
- package/README.md +258 -0
- package/fesm2022/ng-hub-ui-nav.mjs +2214 -0
- package/fesm2022/ng-hub-ui-nav.mjs.map +1 -0
- package/ng-hub-ui-nav-21.1.0.tgz +0 -0
- package/package.json +53 -0
- package/src/lib/styles/nav-tokens.scss +149 -0
- package/types/ng-hub-ui-nav.d.ts +1280 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ng-hub-ui-nav.mjs","sources":["../../../projects/nav/src/lib/services/nav-config.service.ts","../../../projects/nav/src/lib/services/nav-state.service.ts","../../../projects/nav/src/lib/directives/nav-start.directive.ts","../../../projects/nav/src/lib/directives/nav-end.directive.ts","../../../projects/nav/src/lib/directives/nav-item-template.directive.ts","../../../projects/nav/src/lib/directives/nav-scroll-spy.directive.ts","../../../projects/nav/src/lib/directives/nav-scroll-spy-section.directive.ts","../../../projects/nav/src/lib/components/nav-item/nav-item.component.ts","../../../projects/nav/src/lib/components/nav-item/nav-item.component.html","../../../projects/nav/src/lib/components/nav-separator/nav-separator.component.ts","../../../projects/nav/src/lib/components/nav-item-list/nav-item-list.component.ts","../../../projects/nav/src/lib/components/nav-item-list/nav-item-list.component.html","../../../projects/nav/src/lib/components/nav-toggler/nav-toggler.component.ts","../../../projects/nav/src/lib/components/nav-mobile-panel/nav-mobile-panel.component.ts","../../../projects/nav/src/lib/components/nav-mobile-panel/nav-mobile-panel.component.html","../../../projects/nav/src/lib/components/nav-panel/nav-panel.component.ts","../../../projects/nav/src/lib/components/nav-panel/nav-panel.component.html","../../../projects/nav/src/lib/components/nav-panel-container/nav-panel-container.component.ts","../../../projects/nav/src/lib/components/nav-panel-container/nav-panel-container.component.html","../../../projects/nav/src/lib/components/nav/nav.component.ts","../../../projects/nav/src/lib/components/nav/nav.component.html","../../../projects/nav/src/public-api.ts","../../../projects/nav/src/ng-hub-ui-nav.ts"],"sourcesContent":["import { Injectable, InjectionToken, signal } from '@angular/core';\nimport { HubNavConfig } from '../models/nav-config.model';\n\n/**\n * Default configuration values for the `hub-nav` component.\n */\nconst DEFAULT_NAV_CONFIG: HubNavConfig = {\n\torientation: 'horizontal',\n\tverticalExpandMode: 'accordion',\n\tdropdownTrigger: 'click',\n\tposition: 'static',\n\tstickyTop: '0px',\n\tcollapseMode: 'offcanvas',\n\tcollapseBreakpoint: 992,\n\toffcanvasPosition: 'start',\n\tariaLabel: 'Navigation',\n\tpanelMaxVisible: 3,\n\tsidebarSide: 'left',\n\tpanelWidth: '16rem'\n};\n\n/**\n * Injection token for providing global nav configuration at application startup.\n *\n * @example\n * ```typescript\n * import { HUB_NAV_CONFIG } from 'ng-hub-ui-nav';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * {\n * provide: HUB_NAV_CONFIG,\n * useValue: {\n * orientation: 'vertical',\n * dropdownTrigger: 'hover',\n * collapseBreakpoint: 768\n * }\n * }\n * ]\n * };\n * ```\n */\nexport const HUB_NAV_CONFIG = new InjectionToken<Partial<HubNavConfig>>('HUB_NAV_CONFIG');\n\n/**\n * Global configuration service for `hub-nav` components.\n * Provides centralized configuration management with signal-based reactivity.\n *\n * @example\n * ```typescript\n * const configService = inject(HubNavConfigService);\n * configService.updateConfig({ orientation: 'vertical' });\n * const config = configService.getConfig();\n * ```\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class HubNavConfigService {\n\t/** Signal containing the current global configuration. */\n\tprivate config = signal<HubNavConfig>({ ...DEFAULT_NAV_CONFIG });\n\n\t/**\n\t * Returns the current configuration as a readonly signal.\n\t *\n\t * @returns Readonly signal with the current `HubNavConfig`.\n\t */\n\tgetConfig() {\n\t\treturn this.config.asReadonly();\n\t}\n\n\t/**\n\t * Returns the default configuration values.\n\t *\n\t * @returns A copy of the default `HubNavConfig`.\n\t */\n\tgetDefaults(): HubNavConfig {\n\t\treturn { ...DEFAULT_NAV_CONFIG };\n\t}\n\n\t/**\n\t * Merges the given partial configuration into the current config.\n\t *\n\t * @param partial - Partial configuration to merge.\n\t */\n\tupdateConfig(partial: Partial<HubNavConfig>): void {\n\t\tthis.config.update((current) => ({\n\t\t\t...current,\n\t\t\t...partial\n\t\t}));\n\t}\n\n\t/**\n\t * Resets the configuration to factory defaults.\n\t */\n\tresetToDefaults(): void {\n\t\tthis.config.set({ ...DEFAULT_NAV_CONFIG });\n\t}\n\n\t/**\n\t * Resolves a complete config by merging defaults with the given partial overrides.\n\t * Used internally by `hub-nav` to merge component-level inputs with global defaults.\n\t *\n\t * @param overrides - Partial configuration from the component input.\n\t * @returns A complete `HubNavConfig`.\n\t */\n\tresolve(overrides: Partial<HubNavConfig>): HubNavConfig {\n\t\treturn {\n\t\t\t...this.config(),\n\t\t\t...overrides\n\t\t};\n\t}\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport { HubNavItem } from '../models/nav-item.model';\nimport { HubNavConfig, HubNavVerticalExpandMode } from '../models/nav-config.model';\nimport { HubNavPanelState } from '../models/nav-panel-state.model';\n\n/**\n * Internal state management service for a single `hub-nav` instance.\n * Scoped per component — provided at the component level, not root.\n *\n * Manages:\n * - Resolved configuration.\n * - Open dropdown tracking.\n * - Mobile menu state.\n * - Active route propagation.\n * - Panel stack for drill-down navigation.\n */\n@Injectable()\nexport class HubNavStateService {\n\t/** Currently resolved configuration. */\n\tprivate _config = signal<HubNavConfig>({\n\t\torientation: 'horizontal',\n\t\tverticalExpandMode: 'accordion',\n\t\tdropdownTrigger: 'click',\n\t\tposition: 'static',\n\t\tstickyTop: '0px',\n\t\tcollapseMode: 'offcanvas',\n\t\tcollapseBreakpoint: 992,\n\t\toffcanvasPosition: 'start',\n\t\tariaLabel: 'Navigation',\n\t\tpanelMaxVisible: 3,\n\t\tsidebarSide: 'left',\n\t\tpanelWidth: '16rem'\n\t});\n\n\t/** Set of dropdown item IDs that are currently open. */\n\tprivate _openDropdowns = signal<Set<string>>(new Set());\n\n\t/** Whether the mobile panel is open. */\n\tprivate _mobileOpen = signal(false);\n\n\t/** Whether the viewport is below the collapse breakpoint. */\n\tprivate _collapsed = signal(false);\n\n\t/** Stack of open panels for panel expand mode. */\n\tprivate _panelStack = signal<HubNavPanelState[]>([]);\n\n\t/** Auto-incrementing counter for unique panel IDs. */\n\tprivate _panelIdCounter = 0;\n\n\t/** Readonly config signal. */\n\treadonly config = this._config.asReadonly();\n\n\t/** Readonly mobile-open signal. */\n\treadonly mobileOpen = this._mobileOpen.asReadonly();\n\n\t/** Readonly collapsed signal. */\n\treadonly collapsed = this._collapsed.asReadonly();\n\n\t/** Readonly panel stack signal. */\n\treadonly panelStack = this._panelStack.asReadonly();\n\n\t/** Number of currently open panels. */\n\treadonly panelCount = computed(() => this._panelStack().length);\n\n\t/** Computed orientation shortcut. */\n\treadonly orientation = computed(() => this._config().orientation);\n\n\t/** Computed vertical expand mode shortcut. */\n\treadonly verticalExpandMode = computed(() => this._config().verticalExpandMode);\n\n\t/** Computed dropdown trigger shortcut. */\n\treadonly dropdownTrigger = computed(() => this._config().dropdownTrigger);\n\n\t/**\n\t * Updates the resolved configuration.\n\t *\n\t * @param config - Full resolved configuration.\n\t */\n\tsetConfig(config: HubNavConfig): void {\n\t\tthis._config.set(config);\n\t\tthis.reconcilePanelStackWithConfig(config);\n\t}\n\n\t/**\n\t * Normalizes the panel stack after config changes.\n\t *\n\t * This is required when `panelMaxVisible` changes after panels were already\n\t * opened (for example during initial input binding in the host app shell).\n\t * Without this reconciliation, the UI can temporarily render more panels\n\t * than allowed or keep a last panel without header while its parent panel\n\t * is no longer visible.\n\t *\n\t * @param config - The latest resolved configuration.\n\t */\n\tprivate reconcilePanelStackWithConfig(config: HubNavConfig): void {\n\t\tconst effectiveMaxVisible = Math.max(1, config.panelMaxVisible - 1);\n\t\tconst current = this._panelStack();\n\n\t\tif (current.length <= effectiveMaxVisible) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst hiddenPanelsCount = current.length - effectiveMaxVisible;\n\t\tconst trimmed = current.slice(-effectiveMaxVisible).map((panel, index) => {\n\t\t\t// If some parent panels were trimmed, the first visible panel must\n\t\t\t// render a header because its parent context is now hidden.\n\t\t\tif (hiddenPanelsCount > 0 && index === 0 && !panel.isDrillDown) {\n\t\t\t\treturn {\n\t\t\t\t\t...panel,\n\t\t\t\t\tisDrillDown: true\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn panel;\n\t\t});\n\n\t\tthis._panelStack.set(trimmed);\n\t}\n\n\t// ──────────────────────────────────────────────\n\t// Dropdown management\n\t// ──────────────────────────────────────────────\n\n\t/**\n\t * Checks whether a dropdown with the given item ID is open.\n\t *\n\t * @param id - Item ID to check.\n\t * @returns `true` if the dropdown is open.\n\t */\n\tisDropdownOpen(id: string): boolean {\n\t\treturn this._openDropdowns().has(id);\n\t}\n\n\t/**\n\t * Opens a dropdown by item ID.\n\t * In accordion mode, closes sibling dropdowns at the same level.\n\t *\n\t * @param id - Item ID to open.\n\t * @param siblings - Optional array of sibling item IDs to close when opening this one.\n\t */\n\topenDropdown(id: string, siblings?: string[]): void {\n\t\tthis._openDropdowns.update((set) => {\n\t\t\tconst next = new Set(set);\n\n\t\t\t// In accordion mode, close sibling dropdowns\n\t\t\tif (siblings && this._config().verticalExpandMode === 'accordion') {\n\t\t\t\tsiblings.forEach((siblingId) => {\n\t\t\t\t\tif (siblingId !== id) {\n\t\t\t\t\t\tnext.delete(siblingId);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tnext.add(id);\n\t\t\treturn next;\n\t\t});\n\t}\n\n\t/**\n\t * Closes a dropdown by item ID.\n\t *\n\t * @param id - Item ID to close.\n\t */\n\tcloseDropdown(id: string): void {\n\t\tthis._openDropdowns.update((set) => {\n\t\t\tconst next = new Set(set);\n\t\t\tnext.delete(id);\n\t\t\treturn next;\n\t\t});\n\t}\n\n\t/**\n\t * Toggles a dropdown open/closed by item ID.\n\t *\n\t * @param id - Item ID to toggle.\n\t * @returns `true` if the dropdown is now open.\n\t */\n\ttoggleDropdown(id: string): boolean {\n\t\tif (this.isDropdownOpen(id)) {\n\t\t\tthis.closeDropdown(id);\n\t\t\treturn false;\n\t\t}\n\t\tthis.openDropdown(id);\n\t\treturn true;\n\t}\n\n\t/** Closes all open dropdowns. */\n\tcloseAllDropdowns(): void {\n\t\tthis._openDropdowns.set(new Set());\n\t}\n\n\t/**\n\t * Synchronizes the open dropdown set with the current active route.\n\t * Only ancestor items in the active trail remain open.\n\t *\n\t * @param items - Root navigation items to inspect.\n\t * @param activeRoute - Current router URL including optional fragment.\n\t */\n\tsyncDropdownsWithRoute(items: HubNavItem[], activeRoute: string): void {\n\t\tconst nextOpenIds = new Set(this.findActiveDropdownTrail(items, activeRoute));\n\t\tthis._openDropdowns.set(nextOpenIds);\n\t}\n\n\t// ──────────────────────────────────────────────\n\t// Mobile state\n\t// ──────────────────────────────────────────────\n\n\t/**\n\t * Sets the mobile panel open state.\n\t *\n\t * @param open - Whether the mobile panel should be open.\n\t */\n\tsetMobileOpen(open: boolean): void {\n\t\tthis._mobileOpen.set(open);\n\t}\n\n\t/** Toggles the mobile panel. */\n\ttoggleMobile(): void {\n\t\tthis._mobileOpen.update((v) => !v);\n\t}\n\n\t/**\n\t * Sets the collapsed state (below breakpoint).\n\t *\n\t * @param collapsed - Whether the viewport is below the collapse breakpoint.\n\t */\n\tsetCollapsed(collapsed: boolean): void {\n\t\tif (this._collapsed() === collapsed) {\n\t\t\treturn;\n\t\t}\n\t\tthis._collapsed.set(collapsed);\n\t\tif (!collapsed) {\n\t\t\tthis._mobileOpen.set(false);\n\t\t}\n\t}\n\n\t// ──────────────────────────────────────────────\n\t// Panel stack management\n\t// ──────────────────────────────────────────────\n\n\t/**\n\t * Opens a new panel for the given parent item's children.\n\t * If the panel count has reached `panelMaxVisible`, drills down within the last panel instead.\n\t *\n\t * @param parentItem - The item whose children should be displayed in the panel.\n\t * @param rootItems - The root-level navigation items (to determine if parentItem is at root level).\n\t */\n\topenPanel(parentItem: HubNavItem, rootItems?: HubNavItem[]): void {\n\t\tif (!parentItem.children || parentItem.children.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst maxVisible = this._config().panelMaxVisible;\n\t\tconst currentStack = this._panelStack();\n\n\t\t// Check if this exact item already has a panel open\n\t\tconst existingIndex = currentStack.findIndex((p) => p.parentItem.id === parentItem.id);\n\t\tif (existingIndex >= 0) {\n\t\t\t// Panel for this item already exists — close it and all after it\n\t\t\tthis.closePanelsFromIndex(existingIndex);\n\t\t\treturn;\n\t\t}\n\n\t\t// If parentItem is a root-level item and there are already panels open,\n\t\t// close all existing panels before opening the new one (same-level replacement)\n\t\tconst isRootLevel = rootItems?.some((item) => item.id === parentItem.id);\n\t\tif (isRootLevel && currentStack.length > 0) {\n\t\t\tthis.closeAllPanels();\n\t\t}\n\n\t\t// Determine the depth of the new panel\n\t\tconst newPanelDepth = this.findPanelDepth(parentItem, currentStack);\n\n\t\t// Close panels at the same depth or deeper (sibling replacement)\n\t\tif (newPanelDepth >= 0) {\n\t\t\t// Close all panels from this depth onward\n\t\t\tthis.closePanelsFromIndex(newPanelDepth);\n\t\t}\n\n\t\tconst updatedStack = this._panelStack();\n\n\t\t// `panelMaxVisible` represents the total visible columns in panel mode,\n\t\t// including the root column. The panel stack stores only subpanels, so\n\t\t// subtract one to get the visible subpanel limit.\n\t\tconst effectiveMaxVisible = Math.max(1, maxVisible - 1);\n\n\t\tif (updatedStack.length >= effectiveMaxVisible) {\n\t\t\t// Max panels reached — drill-down within the last panel\n\t\t\tconst lastPanel = updatedStack[updatedStack.length - 1];\n\t\t\tthis.drillDownInPanel(lastPanel.id, parentItem, parentItem.children);\n\t\t} else {\n\t\t\t// Add a new panel\n\t\t\tconst panel: HubNavPanelState = {\n\t\t\t\tid: `panel-${++this._panelIdCounter}`,\n\t\t\t\tparentItem,\n\t\t\t\titems: parentItem.children,\n\t\t\t\thistory: [],\n\t\t\t\tisDrillDown: false\n\t\t\t};\n\t\t\tthis._panelStack.update((stack) => [...stack, panel]);\n\t\t}\n\t}\n\n\t/**\n\t * Finds the depth (index) where a panel for the given item should be placed.\n\t * Returns the index of the first panel whose items contain parentItem,\n\t * or -1 if parentItem is not found in any panel.\n\t *\n\t * @param parentItem - The item to search for.\n\t * @param stack - The current panel stack.\n\t * @returns The panel index, or -1 if not found.\n\t */\n\tprivate findPanelDepth(parentItem: HubNavItem, stack: HubNavPanelState[]): number {\n\t\tfor (let i = 0; i < stack.length; i++) {\n\t\t\tconst panel = stack[i];\n\t\t\tif (panel.items.some((item) => item.id === parentItem.id)) {\n\t\t\t\treturn i + 1; // New panel should go after this one\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Finds the ordered list of dropdown ancestor IDs for the active route.\n\t *\n\t * @param items - Items to search recursively.\n\t * @param activeRoute - Current router URL.\n\t * @param trail - Accumulated ancestor trail.\n\t * @returns Ancestor IDs that must remain expanded.\n\t */\n\tprivate findActiveDropdownTrail(items: HubNavItem[], activeRoute: string, trail: string[] = []): string[] {\n\t\tfor (const item of items) {\n\t\t\tif (!this.isItemOrDescendantActive(item, activeRoute)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst nextTrail = item.children?.length ? [...trail, item.id] : trail;\n\t\t\tif (!item.children?.length) {\n\t\t\t\treturn nextTrail;\n\t\t\t}\n\n\t\t\tconst childTrail = this.findActiveDropdownTrail(item.children, activeRoute, nextTrail);\n\t\t\treturn childTrail.length > 0 ? childTrail : nextTrail;\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Closes a panel by its ID and all panels opened after it.\n\t *\n\t * @param panelId - ID of the panel to close.\n\t */\n\tclosePanel(panelId: string): void {\n\t\tconst index = this._panelStack().findIndex((p) => p.id === panelId);\n\t\tif (index >= 0) {\n\t\t\tthis.closePanelsFromIndex(index);\n\t\t}\n\t}\n\n\t/**\n\t * Closes all panels from the given index onward.\n\t *\n\t * @param index - Zero-based index from which to start closing.\n\t */\n\tclosePanelsFromIndex(index: number): void {\n\t\tthis._panelStack.update((stack) => stack.slice(0, index));\n\t}\n\n\t/** Closes all open panels. */\n\tcloseAllPanels(): void {\n\t\tthis._panelStack.set([]);\n\t}\n\n\t/**\n\t * Performs a drill-down within an existing panel: pushes current items to history\n\t * and replaces them with the new item's children.\n\t *\n\t * @param panelId - ID of the panel to drill down in.\n\t * @param parentItem - The item whose children will replace the panel content.\n\t * @param items - The new items to display.\n\t */\n\tdrillDownInPanel(panelId: string, parentItem: HubNavItem, items: HubNavItem[]): void {\n\t\tthis._panelStack.update((stack) =>\n\t\t\tstack.map((panel) => {\n\t\t\t\tif (panel.id !== panelId) {\n\t\t\t\t\treturn panel;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...panel,\n\t\t\t\t\thistory: [\n\t\t\t\t\t\t...panel.history,\n\t\t\t\t\t\t{ items: panel.items, parentItem: panel.parentItem }\n\t\t\t\t\t],\n\t\t\t\t\tparentItem,\n\t\t\t\t\titems,\n\t\t\t\t\tisDrillDown: true\n\t\t\t\t};\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Navigates back one level in a panel's drill-down history.\n\t * If there is no history, the panel is closed.\n\t *\n\t * @param panelId - ID of the panel to navigate back in.\n\t */\n\tnavigateBackInPanel(panelId: string): void {\n\t\tconst panel = this._panelStack().find((p) => p.id === panelId);\n\t\tif (!panel) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (panel.history.length === 0) {\n\t\t\tthis.closePanel(panelId);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._panelStack.update((stack) =>\n\t\t\tstack.map((p) => {\n\t\t\t\tif (p.id !== panelId) {\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\t\t\t\tconst newHistory = [...p.history];\n\t\t\t\tconst previous = newHistory.pop()!;\n\t\t\t\treturn {\n\t\t\t\t\t...p,\n\t\t\t\t\titems: previous.items,\n\t\t\t\t\tparentItem: previous.parentItem,\n\t\t\t\t\thistory: newHistory,\n\t\t\t\t\tisDrillDown: newHistory.length > 0\n\t\t\t\t};\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Retrieves a panel by its ID.\n\t *\n\t * @param panelId - ID of the panel to find.\n\t * @returns The panel state, or `undefined` if not found.\n\t */\n\tgetPanelById(panelId: string): HubNavPanelState | undefined {\n\t\treturn this._panelStack().find((p) => p.id === panelId);\n\t}\n\n\t/**\n\t * Checks whether there is an open panel whose parent item matches the given ID.\n\t *\n\t * @param itemId - Parent item ID to match against the panel stack.\n\t * @returns `true` when a panel for the given item is currently open.\n\t */\n\tisPanelOpenForItem(itemId: string): boolean {\n\t\treturn this._panelStack().some((panel) => panel.parentItem.id === itemId);\n\t}\n\n\t/**\n\t * Resolves the effective expand mode for an item, considering:\n\t * 1. Per-item `expandMode` override.\n\t * 2. Global `verticalExpandMode` from config.\n\t * 3. Fallback to `'accordion'` when collapsed (mobile).\n\t *\n\t * @param item - The item to resolve the expand mode for.\n\t * @returns The effective expand mode.\n\t */\n\tgetEffectiveExpandMode(item: HubNavItem): HubNavVerticalExpandMode {\n\t\t// In horizontal mode, allow panel mode when explicitly configured.\n\t\t// Otherwise, keep flyout/dropdown behavior.\n\t\tif (this._config().orientation === 'horizontal') {\n\t\t\treturn this._config().verticalExpandMode === 'panel' ? 'panel' : 'flyout';\n\t\t}\n\t\tconst mode = item.expandMode ?? this._config().verticalExpandMode;\n\t\t// On mobile (collapsed), panel mode falls back to accordion\n\t\tif (mode === 'panel' && this._collapsed()) {\n\t\t\treturn 'accordion';\n\t\t}\n\t\treturn mode;\n\t}\n\n\t// ──────────────────────────────────────────────\n\t// Active route detection\n\t// ──────────────────────────────────────────────\n\n\t/**\n\t * Recursively checks whether the given item or any of its descendants\n\t * match the provided active route.\n\t *\n\t * @param item - Item to check.\n\t * @param activeRoute - Currently active route path.\n\t * @returns `true` if the item or a descendant is active.\n\t */\n\tisItemOrDescendantActive(item: HubNavItem, activeRoute: string): boolean {\n\t\tif (item.route) {\n\t\t\tconst route = Array.isArray(item.route) ? item.route.join('/') : item.route;\n\t\t\tconst [activePath, activeFragment] = activeRoute.split('#');\n\t\t\tif (route === activePath) {\n\t\t\t\t// When an item defines a fragment, require exact fragment match.\n\t\t\t\tif (item.fragment) {\n\t\t\t\t\tif (item.fragment === activeFragment) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Also handle activeRoute values without fragment split side effects.\n\t\t\tif (!item.fragment && route === activeRoute) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tif (item.children) {\n\t\t\treturn item.children.some((child) => this.isItemOrDescendantActive(child, activeRoute));\n\t\t}\n\t\treturn false;\n\t}\n\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport { HubNavStartTemplateContext } from '../models/nav-template-context.model';\n\n/**\n * Structural directive that projects content into the navigation start slot.\n *\n * Slot behavior:\n * - Horizontal nav: appears at the visual start (left in LTR, right in RTL).\n * - Vertical nav: appears at the top of the primary column.\n *\n * The template receives a {@link HubNavStartTemplateContext}.\n */\n@Directive({\n\tselector: '[hubNavStart]',\n\tstandalone: true\n})\nexport class HubNavStartDirective {\n\t/** Reference to the projected template. */\n\treadonly template = inject(TemplateRef<HubNavStartTemplateContext>);\n}\n\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport { HubNavEndTemplateContext } from '../models/nav-template-context.model';\n\n/**\n * Structural directive that projects content into the navigation end slot.\n *\n * Slot behavior:\n * - Horizontal nav: appears at the visual end (right in LTR, left in RTL).\n * - Vertical nav: appears at the bottom of the primary column.\n *\n * The template receives a {@link HubNavEndTemplateContext}.\n */\n@Directive({\n\tselector: '[hubNavEnd]',\n\tstandalone: true\n})\nexport class HubNavEndDirective {\n\t/** Reference to the projected template. */\n\treadonly template = inject(TemplateRef<HubNavEndTemplateContext>);\n}\n\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport { HubNavItemTemplateContext } from '../models/nav-template-context.model';\n\n/**\n * Structural directive that provides a custom template for rendering individual nav items.\n * When present, each nav item is rendered using this template instead of the default markup.\n *\n * The template receives a {@link HubNavItemTemplateContext} with `$implicit` (the item),\n * `active`, `expanded`, and `depth`.\n *\n * @example\n * ```html\n * <hub-nav [items]=\"menuItems\">\n * <ng-template hubNavItemTemplate let-item let-active=\"active\" let-depth=\"depth\">\n * <div class=\"custom-item\" [class.active]=\"active\">\n * <i [class]=\"item.icon\"></i>\n * {{ item.label }}\n * </div>\n * </ng-template>\n * </hub-nav>\n * ```\n */\n@Directive({\n\tselector: '[hubNavItemTemplate]',\n\tstandalone: true\n})\nexport class HubNavItemTemplateDirective {\n\t/** Reference to the template provided by the consumer. */\n\treadonly template = inject(TemplateRef<HubNavItemTemplateContext>);\n}\n","import {\n\tAfterViewInit,\n\tDirective,\n\tElementRef,\n\tNgZone,\n\tOnDestroy,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\toutput,\n\tsignal\n} from '@angular/core';\n\n/**\n * Scroll spy container directive that tracks the currently visible section and\n * emits section changes using `IntersectionObserver`.\n */\n@Directive({\n\tselector: '[hubNavScrollSpy]',\n\tstandalone: true,\n\texportAs: 'hubNavScrollSpy'\n})\nexport class HubNavScrollSpyDirective implements AfterViewInit, OnDestroy {\n\t/** Enables or disables section tracking. */\n\treadonly enabled = input<boolean>(true, { alias: 'hubNavScrollSpy' });\n\n\t/** Top offset in pixels to compensate sticky headers. */\n\treadonly offset = input<number>(120);\n\n\t/** CSS selector used to locate section elements inside the host container. */\n\treadonly sectionSelector = input<string>('[data-hub-nav-scroll-spy-section]');\n\n\t/** Emits the active section id whenever it changes. */\n\treadonly activeSectionChange = output<string>();\n\n\tprivate readonly el = inject(ElementRef<HTMLElement>);\n\tprivate readonly zone = inject(NgZone);\n\n\tprivate observer: IntersectionObserver | null = null;\n\tprivate activeId = signal<string | null>(null);\n\tprivate initialized = signal<boolean>(false);\n\n\t/** Current active section id (readonly signal). */\n\treadonly activeSectionId = computed(() => this.activeId());\n\n\tprivate readonly configEffect = effect(() => {\n\t\tif (!this.initialized()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isEnabled = this.enabled();\n\t\tconst topOffset = this.offset();\n\t\tconst selector = this.sectionSelector();\n\t\tvoid topOffset;\n\t\tvoid selector;\n\n\t\tif (!isEnabled) {\n\t\t\tthis.destroyObserver();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.scheduleInit();\n\t});\n\n\t/** @inheritDoc */\n\tngAfterViewInit(): void {\n\t\tthis.initialized.set(true);\n\t\tif (this.enabled()) {\n\t\t\tthis.scheduleInit();\n\t\t}\n\t}\n\n\t/** @inheritDoc */\n\tngOnDestroy(): void {\n\t\tthis.destroyObserver();\n\t}\n\n\t/**\n\t * Scrolls to a tracked section by id.\n\t *\n\t * @param sectionId - Target section id.\n\t * @param behavior - Native scroll behavior.\n\t * @returns `true` when the target exists and scroll was requested.\n\t */\n\tscrollTo(sectionId: string, behavior: ScrollBehavior = 'smooth'): boolean {\n\t\tconst target = this.getSectionElements().find((element) => this.getSectionId(element) === sectionId);\n\t\tif (!target) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttarget.scrollIntoView({\n\t\t\tbehavior,\n\t\t\tblock: 'start',\n\t\t\tinline: 'nearest'\n\t\t});\n\t\treturn true;\n\t}\n\n\tprivate scheduleInit(): void {\n\t\tthis.zone.runOutsideAngular(() => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.zone.run(() => this.initializeObserver());\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate initializeObserver(): void {\n\t\tthis.destroyObserver();\n\n\t\tconst sections = this.getSectionElements();\n\t\tif (sections.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst topOffset = this.offset();\n\t\tthis.observer = new IntersectionObserver(\n\t\t\t(entries) => this.handleObserverEntries(entries),\n\t\t\t{\n\t\t\t\troot: null,\n\t\t\t\trootMargin: `-${topOffset}px 0px -55% 0px`,\n\t\t\t\tthreshold: [0.05, 0.2, 0.4, 0.6, 0.8]\n\t\t\t}\n\t\t);\n\n\t\tsections.forEach((section) => this.observer?.observe(section));\n\t}\n\n\tprivate destroyObserver(): void {\n\t\tthis.observer?.disconnect();\n\t\tthis.observer = null;\n\t}\n\n\tprivate getSectionElements(): HTMLElement[] {\n\t\treturn Array.from(\n\t\t\tthis.el.nativeElement.querySelectorAll(this.sectionSelector())\n\t\t).filter((node): node is HTMLElement => node instanceof HTMLElement);\n\t}\n\n\tprivate getSectionId(element: HTMLElement): string | null {\n\t\treturn element.getAttribute('data-hub-nav-scroll-spy-section') ?? element.id ?? null;\n\t}\n\n\tprivate handleObserverEntries(entries: IntersectionObserverEntry[]): void {\n\t\tconst visible = entries\n\t\t\t.filter((entry) => entry.isIntersecting)\n\t\t\t.sort((a, b) => b.intersectionRatio - a.intersectionRatio);\n\n\t\tif (visible.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst top = visible[0];\n\t\tconst id = this.getSectionId(top.target as HTMLElement);\n\t\tif (!id || id === this.activeId()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.activeId.set(id);\n\t\tthis.activeSectionChange.emit(id);\n\t}\n}\n\n","import { Directive, ElementRef, computed, inject, input } from '@angular/core';\n\n/**\n * Marks an element as a trackable section for `HubNavScrollSpyDirective`.\n *\n * If no explicit section id is provided, the directive falls back to the host\n * element `id` attribute.\n */\n@Directive({\n\tselector: '[hubNavScrollSpySection]',\n\tstandalone: true,\n\thost: {\n\t\t'[attr.data-hub-nav-scroll-spy-section]': 'resolvedSectionId() || null'\n\t}\n})\nexport class HubNavScrollSpySectionDirective {\n\t/** Optional section id. When omitted, host `id` is used. */\n\treadonly sectionId = input<string | null>(null, { alias: 'hubNavScrollSpySection' });\n\n\tprivate readonly el = inject(ElementRef<HTMLElement>);\n\n\t/** Effective section id exposed to the container directive. */\n\treadonly resolvedSectionId = computed(() => this.sectionId() ?? this.el.nativeElement.id ?? null);\n}\n\n","import { Component, ChangeDetectionStrategy, input, output, inject, computed, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { HubNavItem } from '../../models/nav-item.model';\nimport { HubNavStateService } from '../../services/nav-state.service';\n\n/**\n * Renders a single navigation item (link, dropdown trigger, header, or custom content).\n * Handles routing integration, active state, badges, icons, and disabled state.\n *\n * @internal Used internally by `HubNavItemListComponent`.\n */\n@Component({\n\tselector: 'hub-nav-item',\n\tstandalone: true,\n\timports: [NgTemplateOutlet, RouterLink],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-nav-item',\n\t\t'[class.hub-nav-item--active]': 'isActive()',\n\t\t'[class.hub-nav-item--disabled]': 'item().disabled',\n\t\t'[class.hub-nav-item--has-children]': 'hasChildren()',\n\t\t'[class.hub-nav-item--expanded]': 'isExpanded()',\n\t\t'[class.hub-nav-item--header]': 'isHeader()',\n\t\t'[attr.data-item-id]': 'item().id',\n\t\trole: 'none'\n\t},\n\ttemplateUrl: './nav-item.component.html',\n\tstyleUrl: './nav-item.component.scss'\n})\nexport class HubNavItemComponent {\n\t/** The navigation item data to render. */\n\treadonly item = input.required<HubNavItem>();\n\n\t/** Nesting depth (0 = root). */\n\treadonly depth = input<number>(0);\n\n\t/** Whether this item is currently active (set by parent list). */\n\treadonly isActive = input<boolean>(false);\n\n\t/** Whether the dropdown is currently expanded (only for dropdown items). */\n\treadonly isExpanded = input<boolean>(false);\n\n\t/** Optional custom template for rendering the item content. */\n\treadonly itemTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * Forces the item to behave as part of a mobile accordion list.\n\t * This keeps indicators and layout aligned with the collapsed nav panel.\n\t */\n\treadonly forceAccordionMode = input<boolean>(false);\n\n\t/** Emitted when the item is clicked. */\n\treadonly clicked = output<{ item: HubNavItem; event: Event }>();\n\n\t/** Emitted when the dropdown toggle is activated. */\n\treadonly toggleDropdown = output<HubNavItem>();\n\n\t/** Reference to the nav state service. */\n\tprivate readonly state = inject(HubNavStateService);\n\n\t/** Whether this item has child items. */\n\treadonly hasChildren = computed(() => {\n\t\tconst children = this.item().children;\n\t\treturn !!children && children.length > 0;\n\t});\n\n\t/** Whether this item is a header type. */\n\treadonly isHeader = computed(() => this.item().type === 'header');\n\n\t/** Whether this item is a link type. */\n\treadonly isLink = computed(() => this.item().type === 'link');\n\n\t/** Whether this item is a dropdown type. */\n\treadonly isDropdown = computed(() => this.item().type === 'dropdown');\n\n\t/** Whether this item is a custom type. */\n\treadonly isCustom = computed(() => this.item().type === 'custom');\n\n\t/** Resolved route for routerLink binding. */\n\treadonly resolvedRoute = computed(() => {\n\t\tconst item = this.item();\n\t\tif (!item.route) {\n\t\t\treturn null;\n\t\t}\n\t\treturn Array.isArray(item.route) ? item.route : [item.route];\n\t});\n\n\t/** Template context for custom item templates. */\n\treadonly templateContext = computed(() => ({\n\t\t$implicit: this.item(),\n\t\tactive: this.isActive(),\n\t\texpanded: this.isExpanded(),\n\t\tdepth: this.depth()\n\t}));\n\n\t/**\n\t * Whether the dropdown caret should be visible for this item.\n\t * In panel mode, caret is hidden because expansion happens in side panels.\n\t */\n\treadonly showCaret = computed(() => {\n\t\tif (!(this.isDropdown() || this.hasChildren())) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.forceAccordionMode()) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn this.state.getEffectiveExpandMode(this.item()) !== 'panel';\n\t});\n\n\t/**\n\t * Handles click events on the item.\n\t * Delegates to dropdown toggle or emits a click event depending on item type.\n\t *\n\t * @param event - The original DOM event.\n\t */\n\tonItemClick(event: Event): void {\n\t\tconst item = this.item();\n\n\t\tif (item.disabled) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (item.type === 'header' || item.type === 'separator') {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.hasChildren()) {\n\t\t\tthis.toggleDropdown.emit(item);\n\t\t}\n\n\t\tthis.clicked.emit({ item, event });\n\t}\n\n\t/**\n\t * Handles clicks on the label/link area of a routable dropdown item.\n\t * In this case the click only performs navigation and does not toggle\n\t * the submenu; submenu expansion is delegated to the dedicated caret.\n\t *\n\t * @param event - The original DOM event.\n\t */\n\tonRouteItemClick(event: Event): void {\n\t\tconst item = this.item();\n\n\t\tif (item.disabled) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clicked.emit({ item, event });\n\t}\n\n\t/**\n\t * Handles clicks on the dedicated caret button for routable dropdown items.\n\t * The caret only toggles submenu visibility and must never trigger routing.\n\t *\n\t * @param event - The original DOM event.\n\t */\n\tonCaretClick(event: Event): void {\n\t\tconst item = this.item();\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif (item.disabled || !this.hasChildren()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.toggleDropdown.emit(item);\n\t}\n}\n","@if (itemTemplate()) {\n\t<!-- Custom template rendering -->\n\t<ng-container [ngTemplateOutlet]=\"itemTemplate()!\" [ngTemplateOutletContext]=\"templateContext()\" />\n} @else if (isHeader()) {\n\t<!-- Header item: non-interactive section label -->\n\t<span class=\"hub-nav-item__header\" role=\"presentation\">{{ item().label }}</span>\n} @else if (isLink() && resolvedRoute()) {\n\t<!-- Link item: routable anchor -->\n\t<a\n\t\tclass=\"hub-nav-item__link\"\n\t\t[class.hub-nav-item__link--active]=\"isActive()\"\n\t\trole=\"menuitem\"\n\t\t[routerLink]=\"resolvedRoute()\"\n\t\t[queryParams]=\"item().queryParams\"\n\t\t[fragment]=\"item().fragment\"\n\t\t[class.hub-nav-item__link--disabled]=\"item().disabled\"\n\t\t[attr.tabindex]=\"item().disabled ? -1 : 0\"\n\t\t[attr.aria-disabled]=\"item().disabled || null\"\n\t\t[attr.aria-current]=\"isActive() ? 'page' : null\"\n\t\t(click)=\"onItemClick($event)\"\n\t>\n\t\t@if (item().icon) {\n\t\t\t<span class=\"hub-nav-item__icon\" [class]=\"item().icon\" aria-hidden=\"true\"></span>\n\t\t}\n\t\t<span class=\"hub-nav-item__label\">{{ item().label }}</span>\n\t\t@if (item().badge) {\n\t\t\t<span class=\"hub-nav-item__badge\" [class]=\"item().badgeClass\">{{ item().badge }}</span>\n\t\t}\n\t</a>\n} @else if ((isDropdown() || hasChildren()) && resolvedRoute()) {\n\t<!-- Routable dropdown: link area navigates, caret area toggles submenu -->\n\t<div class=\"hub-nav-item__compound\">\n\t\t<a\n\t\t\tclass=\"hub-nav-item__link\"\n\t\t\t[class.hub-nav-item__link--split]=\"showCaret()\"\n\t\t\trole=\"menuitem\"\n\t\t\t[class.hub-nav-item__link--active]=\"isActive()\"\n\t\t\t[routerLink]=\"resolvedRoute()\"\n\t\t\t[queryParams]=\"item().queryParams\"\n\t\t\t[fragment]=\"item().fragment\"\n\t\t\t[class.hub-nav-item__link--disabled]=\"item().disabled\"\n\t\t\t[attr.tabindex]=\"item().disabled ? -1 : 0\"\n\t\t\t[attr.aria-disabled]=\"item().disabled || null\"\n\t\t\t[attr.aria-current]=\"isActive() ? 'page' : null\"\n\t\t\t(click)=\"onRouteItemClick($event)\"\n\t\t>\n\t\t\t@if (item().icon) {\n\t\t\t\t<span class=\"hub-nav-item__icon\" [class]=\"item().icon\" aria-hidden=\"true\"></span>\n\t\t\t}\n\t\t\t<span class=\"hub-nav-item__label\">{{ item().label }}</span>\n\t\t\t@if (item().badge) {\n\t\t\t\t<span class=\"hub-nav-item__badge\" [class]=\"item().badgeClass\">{{ item().badge }}</span>\n\t\t\t}\n\t\t</a>\n\n\t\t@if (showCaret()) {\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"hub-nav-item__caret-button\"\n\t\t\t\t[class.hub-nav-item__caret-button--active]=\"isActive()\"\n\t\t\t\t[class.hub-nav-item__caret-button--expanded]=\"isExpanded()\"\n\t\t\t\t[class.hub-nav-item__caret-button--disabled]=\"item().disabled\"\n\t\t\t\t[attr.tabindex]=\"item().disabled ? -1 : 0\"\n\t\t\t\t[attr.aria-label]=\"'Toggle ' + item().label\"\n\t\t\t\t[attr.aria-expanded]=\"isExpanded()\"\n\t\t\t\t[attr.aria-haspopup]=\"true\"\n\t\t\t\t[attr.aria-disabled]=\"item().disabled || null\"\n\t\t\t\t(click)=\"onCaretClick($event)\"\n\t\t\t>\n\t\t\t\t<span class=\"hub-nav-item__caret\" aria-hidden=\"true\"></span>\n\t\t\t</button>\n\t\t}\n\t</div>\n} @else if (isDropdown() || hasChildren()) {\n\t<!-- Dropdown trigger: button that toggles a submenu -->\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"hub-nav-item__link hub-nav-item__dropdown-toggle\"\n\t\trole=\"menuitem\"\n\t\t[class.hub-nav-item__link--active]=\"isActive()\"\n\t\t[class.hub-nav-item__link--disabled]=\"item().disabled\"\n\t\t[attr.aria-expanded]=\"isExpanded()\"\n\t\t[attr.aria-haspopup]=\"true\"\n\t\t[attr.tabindex]=\"item().disabled ? -1 : 0\"\n\t\t[attr.aria-disabled]=\"item().disabled || null\"\n\t\t(click)=\"onItemClick($event)\"\n\t>\n\t\t@if (item().icon) {\n\t\t\t<span class=\"hub-nav-item__icon\" [class]=\"item().icon\" aria-hidden=\"true\"></span>\n\t\t}\n\t\t<span class=\"hub-nav-item__label\">{{ item().label }}</span>\n\t\t@if (item().badge) {\n\t\t\t<span class=\"hub-nav-item__badge\" [class]=\"item().badgeClass\">{{ item().badge }}</span>\n\t\t}\n\t\t@if (showCaret()) {\n\t\t\t<span class=\"hub-nav-item__caret\" aria-hidden=\"true\"></span>\n\t\t}\n\t</button>\n} @else {\n\t<!-- Fallback: non-routable item (custom or link without route) -->\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"hub-nav-item__link\"\n\t\trole=\"menuitem\"\n\t\t[class.hub-nav-item__link--disabled]=\"item().disabled\"\n\t\t[attr.tabindex]=\"item().disabled ? -1 : 0\"\n\t\t[attr.aria-disabled]=\"item().disabled || null\"\n\t\t(click)=\"onItemClick($event)\"\n\t>\n\t\t@if (item().icon) {\n\t\t\t<span class=\"hub-nav-item__icon\" [class]=\"item().icon\" aria-hidden=\"true\"></span>\n\t\t}\n\t\t<span class=\"hub-nav-item__label\">{{ item().label }}</span>\n\t\t@if (item().badge) {\n\t\t\t<span class=\"hub-nav-item__badge\" [class]=\"item().badgeClass\">{{ item().badge }}</span>\n\t\t}\n\t</button>\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n/**\n * Visual separator between navigation item groups.\n * Renders as a horizontal rule in vertical list contexts.\n * Root horizontal nav bars hide separators because structural grouping\n * should not consume inline menu space there.\n *\n * @internal This component is used internally by `HubNavItemListComponent`.\n */\n@Component({\n\tselector: 'hub-nav-separator',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-nav-separator',\n\t\trole: 'separator'\n\t},\n\ttemplate: '',\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tborder: 0;\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\t:host-context(.hub-nav--horizontal) {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\t:host-context(.hub-nav--vertical) {\n\t\t\t\theight: 0;\n\t\t\t\tborder-top: var(--hub-nav-border-width, 1px) var(--hub-nav-border-style, solid)\n\t\t\t\t\tvar(--hub-nav-separator-color, var(--hub-sys-border-color-default, #dee2e6));\n\t\t\t\tmargin: var(--hub-nav-separator-margin-y, 0.5rem) 0;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Menus rendered inside dropdown/accordion/panel are always vertical lists,\n\t\t\t * even when the root nav orientation is horizontal. In these contexts,\n\t\t\t * separators must be horizontal full-width rules.\n\t\t\t */\n\t\t\t:host-context(.hub-nav-dropdown),\n\t\t\t:host-context(.hub-nav-accordion),\n\t\t\t:host-context(.hub-nav-panel__body),\n\t\t\t:host-context(.hub-nav-mobile-panel__body) {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 0;\n\t\t\t\talign-self: stretch;\n\t\t\t\tborder-left: 0;\n\t\t\t\tborder-top: var(--hub-nav-border-width, 1px) var(--hub-nav-border-style, solid)\n\t\t\t\t\tvar(--hub-nav-separator-color, var(--hub-sys-border-color-default, #dee2e6));\n\t\t\t\tmargin: var(--hub-nav-separator-margin-y, 0.5rem) 0;\n\t\t\t}\n\t\t`\n\t]\n})\nexport class HubNavSeparatorComponent {}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinput,\n\toutput,\n\tinject,\n\tcomputed,\n\tElementRef,\n\tHostListener,\n\tOnDestroy,\n\tOnInit,\n\tsignal,\n\tTemplateRef\n} from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { Subscription, filter } from 'rxjs';\nimport { HubNavItem } from '../../models/nav-item.model';\nimport { HubNavVerticalExpandMode } from '../../models/nav-config.model';\nimport { HubNavItemComponent } from '../nav-item/nav-item.component';\nimport { HubNavSeparatorComponent } from '../nav-separator/nav-separator.component';\nimport { HubNavStateService } from '../../services/nav-state.service';\n\n/**\n * Renders a list of navigation items at a given depth level.\n * Self-recursive: when an item has children and its dropdown is open,\n * this component renders another `hub-nav-item-list` for the children.\n *\n * Includes keyboard navigation following WAI-ARIA menubar/menu patterns.\n *\n * @internal Used internally by `HubNavComponent`.\n */\n@Component({\n\tselector: 'hub-nav-item-list',\n\tstandalone: true,\n\timports: [HubNavItemComponent, HubNavSeparatorComponent],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-nav-item-list',\n\t\t'[class.hub-nav-item-list--force-accordion]': 'forceAccordionMode()',\n\t\t'[attr.role]': 'depth() === 0 ? \"menubar\" : \"menu\"'\n\t},\n\ttemplateUrl: './nav-item-list.component.html',\n\tstyleUrl: './nav-item-list.component.scss'\n})\nexport class HubNavItemListComponent implements OnInit, OnDestroy {\n\t/** The list of items to render. */\n\treadonly items = input.required<HubNavItem[]>();\n\n\t/** Nesting depth (0 = root level). */\n\treadonly depth = input<number>(0);\n\n\t/** Optional custom template for rendering item content. */\n\treadonly itemTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * Forces all nested items in this list to use accordion expansion.\n\t * Primarily used by the collapsed/mobile panel to avoid flyout/panel\n\t * behaviors that are not suitable for small viewports.\n\t */\n\treadonly forceAccordionMode = input<boolean>(false);\n\n\t/** Emitted when any item in the list is clicked. */\n\treadonly itemClick = output<{ item: HubNavItem; event: Event }>();\n\n\t/** Emitted when a dropdown toggle is requested. */\n\treadonly dropdownToggle = output<HubNavItem>();\n\n\t/** Emitted when an item with panel expand mode is clicked and needs a new panel. */\n\treadonly panelOpen = output<HubNavItem>();\n\n\t/** Reference to the nav state service. */\n\treadonly state = inject(HubNavStateService);\n\n\t/** Reference to the Angular router for active state detection. */\n\tprivate readonly router = inject(Router);\n\n\t/** Reactive URL value used to recompute active states on navigation changes. */\n\tprivate readonly currentUrl = signal<string>(this.router.url);\n\n\t/** Router events subscription lifecycle handle. */\n\tprivate routerSub?: Subscription;\n\n\t/** Host element reference. */\n\tprivate readonly el = inject(ElementRef<HTMLElement>);\n\n\t/**\n\t * Whether children should render in accordion mode (inline with indentation).\n\t * True when orientation is vertical and expand mode is 'accordion'.\n\t */\n\treadonly isAccordionMode = computed(\n\t\t() =>\n\t\t\tthis.forceAccordionMode() ||\n\t\t\t(this.state.orientation() === 'vertical' && this.state.verticalExpandMode() === 'accordion')\n\t);\n\n\t/** Whether this is a horizontal root-level nav (affects arrow key mapping). */\n\tprivate get isHorizontalRoot(): boolean {\n\t\tif (this.forceAccordionMode()) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.state.orientation() === 'horizontal' && this.depth() === 0;\n\t}\n\n\t// ──────────────────────────────────────────────\n\t// Data methods\n\t// ──────────────────────────────────────────────\n\n\t/**\n\t * Checks if the given item or any of its descendants is currently active.\n\t *\n\t * @param item - The item to check.\n\t * @returns `true` if the item or a descendant matches the current route.\n\t */\n\tisItemActive(item: HubNavItem): boolean {\n\t\treturn this.state.isItemOrDescendantActive(item, this.currentUrl());\n\t}\n\n\t/** @inheritDoc */\n\tngOnInit(): void {\n\t\tthis.routerSub = this.router.events\n\t\t\t.pipe(filter((event) => event instanceof NavigationEnd))\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.currentUrl.set(this.router.url);\n\t\t\t});\n\t}\n\n\t/** @inheritDoc */\n\tngOnDestroy(): void {\n\t\tthis.routerSub?.unsubscribe();\n\t}\n\n\t/**\n\t * Checks if a dropdown is currently expanded.\n\t *\n\t * @param item - The dropdown item to check.\n\t * @returns `true` if the dropdown is open.\n\t */\n\tisExpanded(item: HubNavItem): boolean {\n\t\t// In panel mode, \"expanded\" means \"there is an open panel for this item\".\n\t\tif (this.getItemExpandMode(item) === 'panel') {\n\t\t\treturn this.state.isPanelOpenForItem(item.id);\n\t\t}\n\n\t\treturn this.state.isDropdownOpen(item.id);\n\t}\n\n\t/**\n\t * Whether the given item has child items.\n\t *\n\t * @param item - The item to check.\n\t * @returns `true` if the item has children.\n\t */\n\thasChildren(item: HubNavItem): boolean {\n\t\treturn !!item.children && item.children.length > 0;\n\t}\n\n\t/**\n\t * Resolves the effective expand mode for an item.\n\t * Considers per-item override, global config, and mobile fallback.\n\t *\n\t * @param item - The item to resolve the expand mode for.\n\t * @returns The effective expand mode.\n\t */\n\tgetItemExpandMode(item: HubNavItem): HubNavVerticalExpandMode {\n\t\tif (this.forceAccordionMode()) {\n\t\t\treturn 'accordion';\n\t\t}\n\n\t\treturn this.state.getEffectiveExpandMode(item);\n\t}\n\n\t// ──────────────────────────────────────────────\n\t// Event handlers\n\t// ──────────────────────────────────────────────\n\n\t/**\n\t * Handles click events from a child item component.\n\t *\n\t * @param payload - The item and original event.\n\t */\n\tonItemClick(payload: { item: HubNavItem; event: Event }): void {\n\t\tthis.itemClick.emit(payload);\n\t}\n\n\t/**\n\t * Handles dropdown toggle events from a child item component.\n\t * In panel mode, emits `panelOpen` instead of toggling the dropdown.\n\t *\n\t * @param item - The dropdown item to toggle.\n\t */\n\tonDropdownToggle(item: HubNavItem): void {\n\t\tconst mode = this.getItemExpandMode(item);\n\t\tif (mode === 'panel') {\n\t\t\tthis.panelOpen.emit(item);\n\t\t\treturn;\n\t\t}\n\n\t\t// Get sibling IDs for accordion auto-close behavior\n\t\tconst siblingIds = this.items()\n\t\t\t.filter((i) => i.type === 'dropdown' || this.hasChildren(i))\n\t\t\t.map((i) => i.id);\n\n\t\tif (this.state.isDropdownOpen(item.id)) {\n\t\t\tthis.state.closeDropdown(item.id);\n\t\t} else {\n\t\t\tthis.state.openDropdown(item.id, siblingIds);\n\t\t}\n\n\t\tthis.dropdownToggle.emit(item);\n\t}\n\n\t/**\n\t * Handles hover enter events on items with children.\n\t * Opens the dropdown if the trigger mode includes hover.\n\t *\n\t * @param item - The hovered item.\n\t */\n\tonItemMouseEnter(item: HubNavItem): void {\n\t\tif (this.forceAccordionMode()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst trigger = this.state.dropdownTrigger();\n\t\tif ((trigger === 'hover' || trigger === 'both') && this.hasChildren(item)) {\n\t\t\t// Get sibling IDs for accordion auto-close behavior\n\t\t\tconst siblingIds = this.items()\n\t\t\t\t.filter((i) => i.type === 'dropdown' || this.hasChildren(i))\n\t\t\t\t.map((i) => i.id);\n\t\t\tthis.state.openDropdown(item.id, siblingIds);\n\t\t}\n\t}\n\n\t/**\n\t * Handles hover leave events on items with children.\n\t * Closes the dropdown if the trigger mode includes hover.\n\t *\n\t * @param item - The item that lost hover.\n\t */\n\tonItemMouseLeave(item: HubNavItem): void {\n\t\tif (this.forceAccordionMode()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst trigger = this.state.dropdownTrigger();\n\t\tif ((trigger === 'hover' || trigger === 'both') && this.hasChildren(item)) {\n\t\t\tthis.state.closeDropdown(item.id);\n\t\t}\n\t}\n\n\t// ──────────────────────────────────────────────\n\t// Keyboard navigation (WAI-ARIA menubar/menu)\n\t// ──────────────────────────────────────────────\n\n\t/**\n\t * Handles keyboard events for accessible navigation.\n\t *\n\t * @param event - The keyboard event.\n\t */\n\t@HostListener('keydown', ['$event'])\n\tonKeyDown(event: KeyboardEvent): void {\n\t\tconst items = this.getFocusableItems();\n\t\tconst currentIndex = this.getCurrentFocusIndex(items);\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tif (this.isHorizontalRoot) {\n\t\t\t\t\tthis.focusItem(items, currentIndex + 1);\n\t\t\t\t} else {\n\t\t\t\t\tthis.openFocusedDropdown(items, currentIndex);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowLeft':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tif (this.isHorizontalRoot) {\n\t\t\t\t\tthis.focusItem(items, currentIndex - 1);\n\t\t\t\t} else {\n\t\t\t\t\tthis.closeFocusedDropdown(items, currentIndex);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tif (this.isHorizontalRoot) {\n\t\t\t\t\tthis.openFocusedDropdown(items, currentIndex);\n\t\t\t\t} else {\n\t\t\t\t\tthis.focusItem(items, currentIndex + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tif (this.isHorizontalRoot) {\n\t\t\t\t\tthis.closeFocusedDropdown(items, currentIndex);\n\t\t\t\t} else {\n\t\t\t\t\tthis.focusItem(items, currentIndex - 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tthis.focusItem(items, 0);\n\t\t\t\tbreak;\n\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tthis.focusItem(items, items.length - 1);\n\t\t\t\tbreak;\n\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tthis.state.closeAllDropdowns();\n\t\t\t\t// Return focus to parent trigger if in a submenu\n\t\t\t\tif (this.depth() > 0) {\n\t\t\t\t\tconst parentWrapper = (this.el.nativeElement as HTMLElement).closest('.hub-nav-item-wrapper');\n\t\t\t\t\tconst trigger = parentWrapper?.querySelector(\n\t\t\t\t\t\t':scope > hub-nav-item .hub-nav-item__dropdown-toggle'\n\t\t\t\t\t) as HTMLElement | null;\n\t\t\t\t\ttrigger?.focus();\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\t/** Returns all focusable item elements (direct children only). */\n\tprivate getFocusableItems(): HTMLElement[] {\n\t\tconst host = this.el.nativeElement as HTMLElement;\n\t\tconst selectors =\n\t\t\t':scope > .hub-nav-item-wrapper > hub-nav-item .hub-nav-item__link,' +\n\t\t\t':scope > .hub-nav-item-wrapper > hub-nav-item .hub-nav-item__dropdown-toggle';\n\t\tconst elements = host.querySelectorAll(selectors);\n\t\treturn (Array.from(elements) as HTMLElement[]).filter(\n\t\t\t(el) => el.getAttribute('aria-disabled') !== 'true' && el.tabIndex !== -1\n\t\t);\n\t}\n\n\t/** Returns the index of the currently focused item. */\n\tprivate getCurrentFocusIndex(items: HTMLElement[]): number {\n\t\treturn items.indexOf(document.activeElement as HTMLElement);\n\t}\n\n\t/** Moves focus to the item at the given index (wraps around). */\n\tprivate focusItem(items: HTMLElement[], index: number): void {\n\t\tif (items.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst wrapped = ((index % items.length) + items.length) % items.length;\n\t\titems[wrapped]?.focus();\n\t}\n\n\t/** Opens the dropdown of the focused item and focuses its first child. */\n\tprivate openFocusedDropdown(items: HTMLElement[], currentIndex: number): void {\n\t\tif (currentIndex < 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst wrapper = items[currentIndex].closest('.hub-nav-item-wrapper');\n\t\tconst itemId = wrapper?.querySelector('hub-nav-item')?.getAttribute('data-item-id');\n\t\tif (itemId) {\n\t\t\t// Get sibling IDs for accordion auto-close behavior\n\t\t\tconst siblingIds = this.items()\n\t\t\t\t.filter((i) => i.type === 'dropdown' || this.hasChildren(i))\n\t\t\t\t.map((i) => i.id);\n\t\t\tthis.state.openDropdown(itemId, siblingIds);\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst submenu = wrapper?.querySelector('.hub-nav-dropdown, .hub-nav-accordion');\n\t\t\t\tconst firstChild = submenu?.querySelector(\n\t\t\t\t\t'.hub-nav-item__link, .hub-nav-item__dropdown-toggle'\n\t\t\t\t) as HTMLElement | null;\n\t\t\t\tfirstChild?.focus();\n\t\t\t});\n\t\t}\n\t}\n\n\t/** Closes the dropdown of the focused item. */\n\tprivate closeFocusedDropdown(items: HTMLElement[], currentIndex: number): void {\n\t\tif (currentIndex < 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst wrapper = items[currentIndex].closest('.hub-nav-item-wrapper');\n\t\tconst itemId = wrapper?.querySelector('hub-nav-item')?.getAttribute('data-item-id');\n\t\tif (itemId && this.state.isDropdownOpen(itemId)) {\n\t\t\tthis.state.closeDropdown(itemId);\n\t\t}\n\t}\n}\n","@for (item of items(); track item.id) {\n\t@if (item.type === 'separator') {\n\t\t<hub-nav-separator />\n\t} @else {\n\t\t<div\n\t\t\tclass=\"hub-nav-item-wrapper\"\n\t\t\t[class.hub-nav-item-wrapper--has-dropdown]=\"hasChildren(item)\"\n\t\t\t(mouseenter)=\"onItemMouseEnter(item)\"\n\t\t\t(mouseleave)=\"onItemMouseLeave(item)\"\n\t\t>\n\t\t\t<hub-nav-item\n\t\t\t\t[item]=\"item\"\n\t\t\t\t[depth]=\"depth()\"\n\t\t\t\t[isActive]=\"isItemActive(item)\"\n\t\t\t\t[isExpanded]=\"isExpanded(item)\"\n\t\t\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t\t\t[forceAccordionMode]=\"forceAccordionMode()\"\n\t\t\t\t(clicked)=\"onItemClick($event)\"\n\t\t\t\t(toggleDropdown)=\"onDropdownToggle($event)\"\n\t\t\t/>\n\n\t\t\t<!-- Children: accordion (inline), flyout/dropdown (positioned), or panel (external) -->\n\t\t\t@if (hasChildren(item) && isExpanded(item) && getItemExpandMode(item) !== 'panel') {\n\t\t\t\t@if (getItemExpandMode(item) === 'accordion') {\n\t\t\t\t\t<!-- Accordion: children expand inline with indentation -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"hub-nav-accordion\"\n\t\t\t\t\t\trole=\"group\"\n\t\t\t\t\t\t[style.padding-left]=\"'var(--hub-nav-accordion-indent, 1rem)'\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<hub-nav-item-list\n\t\t\t\t\t\t\t[items]=\"item.children!\"\n\t\t\t\t\t\t\t[depth]=\"depth() + 1\"\n\t\t\t\t\t\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t\t\t\t\t\t[forceAccordionMode]=\"forceAccordionMode()\"\n\t\t\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t\t\t(dropdownToggle)=\"dropdownToggle.emit($event)\"\n\t\t\t\t\t\t\t(panelOpen)=\"panelOpen.emit($event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t} @else {\n\t\t\t\t\t<!-- Flyout / Dropdown: positioned panel -->\n\t\t\t\t\t<div class=\"hub-nav-dropdown\" role=\"menu\">\n\t\t\t\t\t\t<hub-nav-item-list\n\t\t\t\t\t\t\t[items]=\"item.children!\"\n\t\t\t\t\t\t\t[depth]=\"depth() + 1\"\n\t\t\t\t\t\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t\t\t\t\t\t[forceAccordionMode]=\"forceAccordionMode()\"\n\t\t\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t\t\t(dropdownToggle)=\"dropdownToggle.emit($event)\"\n\t\t\t\t\t\t\t(panelOpen)=\"panelOpen.emit($event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t}\n\t\t</div>\n\t}\n}\n","import { Component, ChangeDetectionStrategy, input, output } from '@angular/core';\n\n/**\n * Hamburger toggle button that shows/hides the mobile navigation panel.\n * Renders an animated three-line icon that transforms into an X when open.\n *\n * @internal Used internally by `HubNavComponent` when the viewport is below the collapse breakpoint.\n */\n@Component({\n\tselector: 'hub-nav-toggler',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-nav-toggler'\n\t},\n\ttemplate: `\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"hub-nav-toggler__button\"\n\t\t\t[class.hub-nav-toggler__button--open]=\"isOpen()\"\n\t\t\t[attr.aria-expanded]=\"isOpen()\"\n\t\t\taria-label=\"Toggle navigation\"\n\t\t\t(click)=\"toggle.emit()\"\n\t\t>\n\t\t\t<span class=\"hub-nav-toggler__icon\">\n\t\t\t\t<span class=\"hub-nav-toggler__bar\"></span>\n\t\t\t\t<span class=\"hub-nav-toggler__bar\"></span>\n\t\t\t\t<span class=\"hub-nav-toggler__bar\"></span>\n\t\t\t</span>\n\t\t</button>\n\t`,\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.hub-nav-toggler__button {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tpadding: var(--hub-nav-toggler-padding-y, 0.25rem) var(--hub-nav-toggler-padding-x, 0.5rem);\n\t\t\t\tfont-size: var(--hub-nav-toggler-font-size, 1.25rem);\n\t\t\t\tcolor: var(--hub-nav-toggler-color, #212529);\n\t\t\t\tbackground: none;\n\t\t\t\tborder: 1px solid var(--hub-nav-toggler-border-color, #dee2e6);\n\t\t\t\tborder-radius: var(--hub-nav-toggler-border-radius, 0.25rem);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: background-color var(--hub-nav-item-transition, 150ms ease);\n\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground-color: var(--hub-nav-item-hover-bg, rgba(0, 0, 0, 0.04));\n\t\t\t\t}\n\n\t\t\t\t&:focus-visible {\n\t\t\t\t\toutline: 2px solid var(--hub-sys-focus-ring-color, rgba(13, 110, 253, 0.25));\n\t\t\t\t\toutline-offset: -2px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.hub-nav-toggler__icon {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 4px;\n\t\t\t\twidth: 1.5em;\n\t\t\t\theight: 1.5em;\n\t\t\t\tjustify-content: center;\n\t\t\t}\n\n\t\t\t.hub-nav-toggler__bar {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 2px;\n\t\t\t\tbackground-color: currentColor;\n\t\t\t\tborder-radius: 1px;\n\t\t\t\ttransition: transform 0.3s ease, opacity 0.3s ease;\n\t\t\t\ttransform-origin: center;\n\t\t\t}\n\n\t\t\t/* Animated X state */\n\t\t\t.hub-nav-toggler__button--open {\n\t\t\t\t.hub-nav-toggler__bar:nth-child(1) {\n\t\t\t\t\ttransform: translateY(6px) rotate(45deg);\n\t\t\t\t}\n\t\t\t\t.hub-nav-toggler__bar:nth-child(2) {\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t\t.hub-nav-toggler__bar:nth-child(3) {\n\t\t\t\t\ttransform: translateY(-6px) rotate(-45deg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@media (prefers-reduced-motion: reduce) {\n\t\t\t\t.hub-nav-toggler__bar {\n\t\t\t\t\ttransition: none;\n\t\t\t\t}\n\t\t\t}\n\t\t`\n\t]\n})\nexport class HubNavTogglerComponent {\n\t/** Whether the mobile panel is currently open. */\n\treadonly isOpen = input<boolean>(false);\n\n\t/** Emitted when the toggler is clicked. */\n\treadonly toggle = output<void>();\n}\n","import { Component, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { HubNavItem } from '../../models/nav-item.model';\nimport { HubNavCollapseMode, HubNavOffcanvasPosition } from '../../models/nav-config.model';\nimport { HubNavItemListComponent } from '../nav-item-list/nav-item-list.component';\n\n/**\n * Mobile navigation panel that renders when the viewport is below the collapse breakpoint.\n * Supports three display modes: offcanvas (slide-in drawer), dropdown (panel below toggler),\n * and fullscreen (overlay).\n *\n * @internal Used internally by `HubNavComponent`.\n */\n@Component({\n\tselector: 'hub-nav-mobile-panel',\n\tstandalone: true,\n\timports: [HubNavItemListComponent],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-nav-mobile-panel',\n\t\t'[class.hub-nav-mobile-panel--open]': 'isOpen()',\n\t\t'[class.hub-nav-mobile-panel--offcanvas]': 'mode() === \"offcanvas\"',\n\t\t'[class.hub-nav-mobile-panel--dropdown]': 'mode() === \"dropdown\"',\n\t\t'[class.hub-nav-mobile-panel--fullscreen]': 'mode() === \"fullscreen\"',\n\t\t'[class.hub-nav-mobile-panel--start]': 'offcanvasPosition() === \"start\"',\n\t\t'[class.hub-nav-mobile-panel--end]': 'offcanvasPosition() === \"end\"',\n\t\t'[class.hub-nav-mobile-panel--top]': 'offcanvasPosition() === \"top\"',\n\t\t'[class.hub-nav-mobile-panel--bottom]': 'offcanvasPosition() === \"bottom\"'\n\t},\n\ttemplateUrl: './nav-mobile-panel.component.html',\n\tstyleUrl: './nav-mobile-panel.component.scss'\n})\nexport class HubNavMobilePanelComponent {\n\t/** Navigation items to render in the panel. */\n\treadonly items = input.required<HubNavItem[]>();\n\n\t/** Whether the panel is currently open. */\n\treadonly isOpen = input<boolean>(false);\n\n\t/** Collapse display mode. */\n\treadonly mode = input<HubNavCollapseMode>('offcanvas');\n\n\t/** Offcanvas slide-in direction. */\n\treadonly offcanvasPosition = input<HubNavOffcanvasPosition>('start');\n\n\t/** Emitted when the close button or backdrop is clicked. */\n\treadonly closePanel = output<void>();\n\n\t/** Emitted when an item is clicked. */\n\treadonly itemClick = output<{ item: HubNavItem; event: Event }>();\n\n\t/** Emitted when a dropdown toggle is requested. */\n\treadonly dropdownToggle = output<HubNavItem>();\n\n\t/**\n\t * Handles backdrop click to close the panel.\n\t */\n\tonBackdropClick(): void {\n\t\tthis.closePanel.emit();\n\t}\n\n\t/**\n\t * Handles close button click.\n\t */\n\tonCloseClick(): void {\n\t\tthis.closePanel.emit();\n\t}\n\n\t/**\n\t * Handles item click events from the inner list.\n\t *\n\t * @param payload - The clicked item and original event.\n\t */\n\tonItemClick(payload: { item: HubNavItem; event: Event }): void {\n\t\tthis.itemClick.emit(payload);\n\t\t// Close panel whenever the click performed a route navigation.\n\t\t// Dropdown caret toggles do not reach this handler.\n\t\tif (payload.item.route) {\n\t\t\tthis.closePanel.emit();\n\t\t}\n\t}\n\n\t/**\n\t * Handles dropdown toggle events from the inner list.\n\t *\n\t * @param item - The dropdown item.\n\t */\n\tonDropdownToggle(item: HubNavItem): void {\n\t\tthis.dropdownToggle.emit(item);\n\t}\n}\n","@if (isOpen()) {\n\t<!-- Backdrop (offcanvas and fullscreen modes) -->\n\t@if (mode() !== 'dropdown') {\n\t\t<div class=\"hub-nav-mobile-panel__backdrop\" (click)=\"onBackdropClick()\"></div>\n\t}\n\n\t<!-- Panel content -->\n\t<div class=\"hub-nav-mobile-panel__content\">\n\t\t<!-- Close button -->\n\t\t<div class=\"hub-nav-mobile-panel__header\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"hub-nav-mobile-panel__close\"\n\t\t\t\taria-label=\"Close navigation\"\n\t\t\t\t(click)=\"onCloseClick()\"\n\t\t\t>\n\t\t\t\t<span aria-hidden=\"true\">×</span>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<!-- Navigation items in vertical accordion mode -->\n\t\t<div class=\"hub-nav-mobile-panel__body\">\n\t\t\t<hub-nav-item-list\n\t\t\t\t[items]=\"items()\"\n\t\t\t\t[depth]=\"0\"\n\t\t\t\t[forceAccordionMode]=\"true\"\n\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t(dropdownToggle)=\"onDropdownToggle($event)\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n}\n","import { Component, ChangeDetectionStrategy, input, output, computed, TemplateRef, HostListener, ElementRef, inject } from '@angular/core';\nimport { HubNavItem } from '../../models/nav-item.model';\nimport { HubNavPanelState } from '../../models/nav-panel-state.model';\nimport { HubNavItemListComponent } from '../nav-item-list/nav-item-list.component';\n\n/**\n * Renders a single side panel in the stacked panel navigation.\n * Contains a header with the parent item's label (plus back/close buttons)\n * and a body with a `hub-nav-item-list` for the panel's items.\n *\n * Includes keyboard navigation:\n * - **Escape**: closes the panel and returns focus to the parent trigger.\n * - **ArrowLeft**: navigates back (if drill-down) or closes the panel.\n *\n * @internal Used internally by `HubNavPanelContainerComponent`.\n */\n@Component({\n\tselector: 'hub-nav-panel',\n\tstandalone: true,\n\timports: [HubNavItemListComponent],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-nav-panel',\n\t\t'[class.hub-nav-panel--drill-down]': 'panel().isDrillDown',\n\t\t'[style.width]': 'panelWidth()',\n\t\trole: 'navigation',\n\t\t'[attr.aria-label]': 'ariaLabel()',\n\t\ttabindex: '-1'\n\t},\n\ttemplateUrl: './nav-panel.component.html',\n\tstyleUrl: './nav-panel.component.scss'\n})\nexport class HubNavPanelComponent {\n\t/** The panel state to render. */\n\treadonly panel = input.required<HubNavPanelState>();\n\n\t/** Width of this panel (CSS value). */\n\treadonly panelWidth = input<string>('16rem');\n\n\t/** Optional custom template for rendering item content. */\n\treadonly itemTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * Controls whether the panel header is rendered.\n\t * Used by horizontal layouts to avoid duplicating the selected root item\n\t * title when that item is already visible in the top row.\n\t */\n\treadonly showHeader = input<boolean>(true);\n\n\t/** Emitted when the panel close button is clicked. Carries the panel ID. */\n\treadonly closePanel = output<string>();\n\n\t/** Emitted when the back button is clicked. Carries the panel ID. */\n\treadonly backClick = output<string>();\n\n\t/** Emitted when an item in the panel is clicked. */\n\treadonly itemClick = output<{ item: HubNavItem; event: Event }>();\n\n\t/** Emitted when a dropdown toggle is requested within the panel. */\n\treadonly dropdownToggle = output<HubNavItem>();\n\n\t/** Emitted when an item with panel expand mode is clicked (needs a new panel). */\n\treadonly panelOpen = output<HubNavItem>();\n\n\t/** Host element reference. */\n\tprivate readonly el = inject(ElementRef<HTMLElement>);\n\n\t/** The label displayed in the panel header. */\n\treadonly currentLabel = computed(() => this.panel().parentItem.label);\n\n\t/** Accessible label for the panel navigation landmark. */\n\treadonly ariaLabel = computed(() => `${this.panel().parentItem.label} navigation`);\n\n\t/**\n\t * Handles keyboard events for panel navigation.\n\t *\n\t * @param event - The keyboard event.\n\t */\n\t@HostListener('keydown', ['$event'])\n\tonKeyDown(event: KeyboardEvent): void {\n\t\tswitch (event.key) {\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tthis.closePanel.emit(this.panel().id);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowLeft':\n\t\t\t\t// Only handle ArrowLeft at the panel level (not inside item-list submenus)\n\t\t\t\tif (this.isDirectPanelFocus(event.target as HTMLElement)) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\tif (this.panel().isDrillDown) {\n\t\t\t\t\t\tthis.backClick.emit(this.panel().id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.closePanel.emit(this.panel().id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t * Handles close button click.\n\t */\n\tonCloseClick(): void {\n\t\tthis.closePanel.emit(this.panel().id);\n\t}\n\n\t/**\n\t * Handles back button click for drill-down navigation.\n\t */\n\tonBackClick(): void {\n\t\tthis.backClick.emit(this.panel().id);\n\t}\n\n\t/**\n\t * Forwards item click events from the inner item list.\n\t *\n\t * @param payload - The clicked item and DOM event.\n\t */\n\tonItemClick(payload: { item: HubNavItem; event: Event }): void {\n\t\tthis.itemClick.emit(payload);\n\t}\n\n\t/**\n\t * Forwards dropdown toggle events from the inner item list.\n\t *\n\t * @param item - The dropdown item that was toggled.\n\t */\n\tonDropdownToggle(item: HubNavItem): void {\n\t\tthis.dropdownToggle.emit(item);\n\t}\n\n\t/**\n\t * Forwards panel open events from the inner item list.\n\t *\n\t * @param item - The item requesting a new panel.\n\t */\n\tonPanelOpen(item: HubNavItem): void {\n\t\tthis.panelOpen.emit(item);\n\t}\n\n\t/**\n\t * Focuses the first focusable item inside this panel.\n\t */\n\tfocusFirstItem(): void {\n\t\trequestAnimationFrame(() => {\n\t\t\tconst firstItem = this.el.nativeElement.querySelector(\n\t\t\t\t'.hub-nav-item__link, .hub-nav-item__caret-button, .hub-nav-item__dropdown-toggle'\n\t\t\t) as HTMLElement | null;\n\t\t\tfirstItem?.focus();\n\t\t});\n\t}\n\n\t/**\n\t * Checks whether the event target is a direct child of this panel's item-list\n\t * (not inside a nested flyout/accordion submenu rendered by descendants).\n\t *\n\t * @param target - The DOM element that received the event.\n\t * @returns `true` if the target belongs directly to this panel's navigation items.\n\t */\n\tprivate isDirectPanelFocus(target: HTMLElement): boolean {\n\t\tconst owningList = target.closest('hub-nav-item-list');\n\t\tconst directList = this.el.nativeElement.querySelector(\n\t\t\t':scope > .hub-nav-panel__body > hub-nav-item-list'\n\t\t);\n\n\t\treturn !!owningList && owningList === directList;\n\t}\n}\n","@if (showHeader()) {\n\t<div class=\"hub-nav-panel__header\">\n\t\t@if (panel().isDrillDown) {\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"hub-nav-panel__back\"\n\t\t\t\taria-label=\"Go back\"\n\t\t\t\t(click)=\"onBackClick()\"\n\t\t\t>\n\t\t\t\t<span aria-hidden=\"true\">←</span>\n\t\t\t</button>\n\t\t}\n\t\t<span class=\"hub-nav-panel__title\">{{ currentLabel() }}</span>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"hub-nav-panel__close\"\n\t\t\taria-label=\"Close panel\"\n\t\t\t(click)=\"onCloseClick()\"\n\t\t>\n\t\t\t<span aria-hidden=\"true\">×</span>\n\t\t</button>\n\t</div>\n}\n\n<div class=\"hub-nav-panel__body\">\n\t<hub-nav-item-list\n\t\t[items]=\"panel().items\"\n\t\t[depth]=\"0\"\n\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t(itemClick)=\"onItemClick($event)\"\n\t\t(dropdownToggle)=\"onDropdownToggle($event)\"\n\t\t(panelOpen)=\"onPanelOpen($event)\"\n\t/>\n</div>\n","import { Component, ChangeDetectionStrategy, input, output, TemplateRef } from '@angular/core';\nimport { HubNavItem } from '../../models/nav-item.model';\nimport { HubNavSidebarSide } from '../../models/nav-config.model';\nimport { HubNavPanelState } from '../../models/nav-panel-state.model';\nimport { HubNavPanelComponent } from '../nav-panel/nav-panel.component';\n\n/**\n * Container that renders the stack of side panels in a horizontal flex layout.\n * Panels are stacked left-to-right or right-to-left depending on `sidebarSide`.\n *\n * @internal Used internally by `HubNavComponent`.\n */\n@Component({\n\tselector: 'hub-nav-panel-container',\n\tstandalone: true,\n\timports: [HubNavPanelComponent],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-nav-panel-container',\n\t\t'[class.hub-nav-panel-container--left]': 'sidebarSide() === \"left\"',\n\t\t'[class.hub-nav-panel-container--right]': 'sidebarSide() === \"right\"'\n\t},\n\ttemplateUrl: './nav-panel-container.component.html',\n\tstyleUrl: './nav-panel-container.component.scss'\n})\nexport class HubNavPanelContainerComponent {\n\t/** Array of panel states to render. */\n\treadonly panels = input.required<HubNavPanelState[]>();\n\n\t/** Physical side where the sidebar is placed. */\n\treadonly sidebarSide = input<HubNavSidebarSide>('left');\n\n\t/** Width for each panel. */\n\treadonly panelWidth = input<string>('16rem');\n\n\t/** Optional custom template for rendering item content. */\n\treadonly itemTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * When true, the first panel hides its header while it is not in drill-down\n\t * mode. This is primarily used by horizontal nav where the selected root\n\t * item is already visible in the top row.\n\t */\n\treadonly hideFirstPanelHeader = input<boolean>(false);\n\n\t/** Emitted when a panel close button is clicked. Carries the panel ID. */\n\treadonly panelClose = output<string>();\n\n\t/** Emitted when a panel back button is clicked. Carries the panel ID. */\n\treadonly panelBack = output<string>();\n\n\t/** Emitted when an item inside a panel is clicked. */\n\treadonly itemClick = output<{ item: HubNavItem; event: Event }>();\n\n\t/** Emitted when a dropdown toggle is requested inside a panel. */\n\treadonly dropdownToggle = output<HubNavItem>();\n\n\t/** Emitted when an item inside a panel requests a new panel. */\n\treadonly panelOpen = output<HubNavItem>();\n\n\t/**\n\t * Resolves whether a panel header should be rendered for a given index.\n\t *\n\t * When `hideFirstPanelHeader` is true (used in layouts where parent context\n\t * is always visible as a sibling column), headers are suppressed on all panels\n\t * that are not in drill-down mode. A header is only shown when the panel is in\n\t * drill-down mode — meaning its parent level has been replaced and is no longer\n\t * visible.\n\t *\n\t * @param index - Zero-based panel index in the rendered stack.\n\t * @param panel - Panel state at the given index.\n\t * @returns `true` when the header should be visible.\n\t */\n\tshouldShowHeader(index: number, panel: HubNavPanelState): boolean {\n\t\tif (!this.hideFirstPanelHeader()) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Only show header when the parent context is no longer visible as a\n\t\t// sibling column (drill-down replaced it). When all parent levels are\n\t\t// visible, no header is needed — the panel is closed by re-clicking\n\t\t// the parent item in the sidebar.\n\t\treturn panel.isDrillDown;\n\t}\n}\n","@for (panel of panels(); track panel.id; let index = $index) {\n\t<hub-nav-panel\n\t\t[panel]=\"panel\"\n\t\t[panelWidth]=\"panelWidth()\"\n\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t[showHeader]=\"shouldShowHeader(index, panel)\"\n\t\t(closePanel)=\"panelClose.emit($event)\"\n\t\t(backClick)=\"panelBack.emit($event)\"\n\t\t(itemClick)=\"itemClick.emit($event)\"\n\t\t(dropdownToggle)=\"dropdownToggle.emit($event)\"\n\t\t(panelOpen)=\"panelOpen.emit($event)\"\n\t/>\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinput,\n\toutput,\n\tinject,\n\tcomputed,\n\tcontentChild,\n\teffect,\n\tOnInit,\n\tOnDestroy,\n\tElementRef,\n\tNgZone,\n\tTemplateRef,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { Subscription, filter } from 'rxjs';\nimport { HubNavItem } from '../../models/nav-item.model';\nimport { HubNavConfig } from '../../models/nav-config.model';\nimport { HubNavPanelEvent } from '../../models/nav-events.model';\nimport { HubNavItemListComponent } from '../nav-item-list/nav-item-list.component';\nimport { HubNavConfigService } from '../../services/nav-config.service';\nimport { HubNavStateService } from '../../services/nav-state.service';\nimport { HubNavStartDirective } from '../../directives/nav-start.directive';\nimport { HubNavEndDirective } from '../../directives/nav-end.directive';\nimport { HubNavItemTemplateDirective } from '../../directives/nav-item-template.directive';\nimport { HubNavTogglerComponent } from '../nav-toggler/nav-toggler.component';\nimport { HubNavMobilePanelComponent } from '../nav-mobile-panel/nav-mobile-panel.component';\nimport { HubNavPanelContainerComponent } from '../nav-panel-container/nav-panel-container.component';\n\n/**\n * Root navigation component. Renders a horizontal or vertical navigation bar\n * with support for nested dropdowns, responsive collapsing, brand slot, panel\n * drill-down navigation, and custom item templates.\n *\n * @example\n * ```html\n * <hub-nav [items]=\"menuItems\" [config]=\"{ orientation: 'horizontal' }\" />\n * ```\n */\n@Component({\n\tselector: 'hub-nav',\n\tstandalone: true,\n\timports: [\n\t\tNgTemplateOutlet,\n\t\tHubNavItemListComponent,\n\t\tHubNavTogglerComponent,\n\t\tHubNavMobilePanelComponent,\n\t\tHubNavPanelContainerComponent\n\t],\n\tproviders: [HubNavStateService],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-nav',\n\t\t'[class.hub-nav--horizontal]': 'resolvedOrientation() === \"horizontal\"',\n\t\t'[class.hub-nav--vertical]': 'resolvedOrientation() === \"vertical\"',\n\t\t'[class.hub-nav--collapsed]': 'isCollapsed()',\n\t\t'[class.hub-nav--sticky]': 'isStickyActive()',\n\t\t'[class.hub-nav--fixed]': 'resolvedConfig().position === \"fixed\"',\n\t\t'[class.hub-nav--sidebar-left]': 'resolvedConfig().sidebarSide === \"left\"',\n\t\t'[class.hub-nav--sidebar-right]': 'resolvedConfig().sidebarSide === \"right\"',\n\t\t'[style.width]': 'resolvedOrientation() === \"vertical\" ? \"100%\" : null',\n\t\t'[style.align-self]': 'resolvedOrientation() === \"vertical\" ? \"stretch\" : null',\n\t\t'[style.--hub-nav-sticky-top]': 'resolvedConfig().stickyTop',\n\t\t'[style.display]': 'resolvedOrientation() === \"vertical\" ? \"flex\" : null',\n\t\t'[style.flex-direction]': 'resolvedOrientation() === \"vertical\" ? \"column\" : null'\n\t},\n\ttemplateUrl: './nav.component.html',\n\tstyleUrl: './nav.component.scss'\n})\nexport class HubNavComponent implements OnInit, OnDestroy {\n\t/**\n\t * Last route path (without query/fragment) used to synchronize panel state.\n\t * Prevents unnecessary panel rebuilds on fragment-only navigations, e.g.\n\t * scroll-spy updates in documentation pages.\n\t */\n\tprivate _lastSyncedPath = '';\n\n\t/** Navigation items to render. */\n\treadonly items = input.required<HubNavItem[]>();\n\n\t/** Partial configuration overrides (merged with global defaults). */\n\treadonly config = input<Partial<HubNavConfig>>({});\n\n\t/** Additional CSS class for the nav container. */\n\treadonly navClass = input<string>('');\n\n\t/** Optional custom template for rendering nav items (via input binding). */\n\treadonly itemTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * When `true`, the component automatically opens the panels matching the\n\t * active router URL on initialization and on every subsequent navigation.\n\t * Useful for sidebar navigations where the URL should drive the open state.\n\t */\n\treadonly autoOpenFromRoute = input<boolean>(false);\n\n\t/** Start slot template projected via `hubNavStart` directive. */\n\tprivate readonly startDirective = contentChild(HubNavStartDirective);\n\n\t/** End slot template projected via `hubNavEnd` directive. */\n\tprivate readonly endDirective = contentChild(HubNavEndDirective);\n\n\t/** Item template projected via `hubNavItemTemplate` directive. */\n\tprivate readonly itemTemplateDirective = contentChild(HubNavItemTemplateDirective);\n\n\t/** Resolved start slot template (from directive content projection). */\n\treadonly startTemplate = computed(() => this.startDirective()?.template ?? null);\n\n\t/** Resolved end slot template (from directive content projection). */\n\treadonly endTemplate = computed(() => this.endDirective()?.template ?? null);\n\n\t/** Resolved item template: directive takes priority over input. */\n\treadonly resolvedItemTemplate = computed(() => this.itemTemplateDirective()?.template ?? this.itemTemplate());\n\n\t/** Start slot context. */\n\treadonly startContext = computed(() => ({\n\t\tcollapsed: this.state.collapsed()\n\t}));\n\n\t/** End slot context. */\n\treadonly endContext = computed(() => ({\n\t\tcollapsed: this.state.collapsed()\n\t}));\n\n\t/** Emitted when a link item is clicked. */\n\treadonly itemClick = output<HubNavItem>();\n\n\t/** Emitted when a dropdown opens. */\n\treadonly dropdownOpen = output<HubNavItem>();\n\n\t/** Emitted when a dropdown closes. */\n\treadonly dropdownClose = output<HubNavItem>();\n\n\t/** Emitted when the mobile panel toggles. */\n\treadonly mobileToggle = output<boolean>();\n\n\t/** Emitted when a panel is opened, drilled-down, or navigated back. */\n\treadonly panelChange = output<HubNavPanelEvent>();\n\n\t/** Global config service. */\n\tprivate readonly configService = inject(HubNavConfigService);\n\n\t/** Scoped state service (provided per component). */\n\treadonly state = inject(HubNavStateService);\n\n\t/** Host element reference for click-outside detection. */\n\tprivate readonly elementRef = inject(ElementRef);\n\n\t/** NgZone for running outside-click handler inside Angular. */\n\tprivate readonly zone = inject(NgZone);\n\n\t/** Angular router for URL-based panel initialization. */\n\tprivate readonly router = inject(Router);\n\n\t/** Whether component lifecycle initialization has completed. */\n\tprivate initialized = false;\n\n\t/** Last applied config signature used to prevent reactive no-op loops. */\n\tprivate lastAppliedConfigSignature = '';\n\n\t/** Last breakpoint-related signature used to avoid redundant listener rebinds. */\n\tprivate lastBreakpointSignature = '';\n\n\t/** Subscription for router NavigationEnd events. */\n\tprivate routerSub?: Subscription;\n\n\t/** Media query list for responsive breakpoint detection. */\n\tprivate mediaQuery: MediaQueryList | null = null;\n\n\t/** Bound handler for media query changes. */\n\tprivate mediaQueryHandler = () => this.refreshCollapsedState();\n\n\t/** Bound handler for window resize fallback. */\n\tprivate resizeHandler = () => this.refreshCollapsedState();\n\n\t/** Bound handler for document click events (click-outside). */\n\tprivate documentClickHandler: ((event: MouseEvent) => void) | null = null;\n\n\t/** Resolved config = global defaults + component overrides. */\n\treadonly resolvedConfig = computed(() => this.configService.resolve(this.config()));\n\n\t/** Shortcut to resolved orientation. */\n\treadonly resolvedOrientation = computed(() => this.resolvedConfig().orientation);\n\n\t/** Whether panels are currently active (panel stack is non-empty). */\n\treadonly hasPanels = computed(() => this.state.panelCount() > 0);\n\n\t/** The sidebar side from resolved config. */\n\treadonly sidebarSide = computed(() => this.resolvedConfig().sidebarSide);\n\n\t/** The panel width from resolved config. */\n\treadonly panelWidth = computed(() => this.resolvedConfig().panelWidth);\n\n\t/** Sync config to state service whenever it changes. */\n\tprivate configEffect = effect(() => {\n\t\tconst resolvedConfig = this.resolvedConfig();\n\t\tconst nextConfigSignature = this.buildConfigSignature(resolvedConfig);\n\t\tconst nextBreakpointSignature = this.buildBreakpointSignature(resolvedConfig);\n\n\t\tif (nextConfigSignature !== this.lastAppliedConfigSignature) {\n\t\t\tthis.lastAppliedConfigSignature = nextConfigSignature;\n\t\t\tthis.state.setConfig(resolvedConfig);\n\t\t}\n\n\t\tif (this.initialized && nextBreakpointSignature !== this.lastBreakpointSignature) {\n\t\t\tthis.lastBreakpointSignature = nextBreakpointSignature;\n\t\t\tthis.teardownBreakpointListener();\n\t\t\tthis.setupBreakpointListener();\n\t\t}\n\t});\n\n\t/** ARIA label for the nav element. */\n\treadonly ariaLabel = computed(() => this.resolvedConfig().ariaLabel);\n\n\t/** Whether the viewport is below the collapse breakpoint. */\n\treadonly isCollapsed = computed(() => this.state.collapsed());\n\n\t/** Whether the mobile panel is open. */\n\treadonly isMobileOpen = computed(() => this.state.mobileOpen());\n\n\t/** Collapse mode from resolved config. */\n\treadonly collapseMode = computed(() => this.resolvedConfig().collapseMode);\n\n\t/** Offcanvas position from resolved config. */\n\treadonly offcanvasPosition = computed(() => this.resolvedConfig().offcanvasPosition);\n\n\t/**\n\t * Whether sticky positioning should be activated for the current layout.\n\t * Sticky mode is restricted to vertical navigation and also applies while\n\t * the nav is collapsed on mobile so the toggler row stays pinned.\n\t */\n\treadonly isStickyActive = computed(\n\t\t() => this.resolvedConfig().position === 'sticky' && this.resolvedOrientation() === 'vertical'\n\t);\n\n\t/** @inheritDoc */\n\tngOnInit(): void {\n\t\tthis.initialized = true;\n\n\t\t// Ensure state receives the final resolved input config before any\n\t\t// route-driven panel preloading runs.\n\t\tconst resolvedConfig = this.resolvedConfig();\n\t\tthis.lastAppliedConfigSignature = this.buildConfigSignature(resolvedConfig);\n\t\tthis.lastBreakpointSignature = this.buildBreakpointSignature(resolvedConfig);\n\t\tthis.state.setConfig(resolvedConfig);\n\n\t\tthis.setupBreakpointListener();\n\t\tthis.setupClickOutsideListener();\n\n\t\tif (this.autoOpenFromRoute()) {\n\t\t\tif (this.isCollapsed()) {\n\t\t\t\tthis.state.syncDropdownsWithRoute(this.items(), this.router.url);\n\t\t\t} else {\n\t\t\t\tthis.openPanelsFromRoute(this.router.url);\n\t\t\t}\n\n\t\t\tthis.routerSub = this.router.events\n\t\t\t\t.pipe(filter((e) => e instanceof NavigationEnd))\n\t\t\t\t.subscribe((e) => {\n\t\t\t\t\tconst nextUrl = (e as NavigationEnd).urlAfterRedirects;\n\t\t\t\t\tconst nextPath = this.extractPath(nextUrl);\n\n\t\t\t\t\tif (this.isCollapsed()) {\n\t\t\t\t\t\tthis.state.syncDropdownsWithRoute(this.items(), nextUrl);\n\t\t\t\t\t\tthis._lastSyncedPath = nextPath;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fragment-only transitions should not rebuild panel stacks.\n\t\t\t\t\tif (nextPath === this._lastSyncedPath) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.openPanelsFromRoute(nextUrl);\n\t\t\t\t});\n\t\t}\n\t}\n\n\t/** @inheritDoc */\n\tngOnDestroy(): void {\n\t\tthis.initialized = false;\n\t\tthis.teardownBreakpointListener();\n\t\tthis.teardownClickOutsideListener();\n\t\tthis.routerSub?.unsubscribe();\n\t}\n\n\t/**\n\t * Handles item click events bubbled up from the item list.\n\t *\n\t * @param payload - The clicked item and original DOM event.\n\t */\n\tonItemClick(payload: { item: HubNavItem; event: Event }): void {\n\t\tif (payload.item.route) {\n\t\t\tthis.itemClick.emit(payload.item);\n\t\t\t// Keep parent sections open when the clicked item also owns children.\n\t\t\t// This is required for responsive/mobile accordion behavior and for\n\t\t\t// route-aware items that intentionally perform both actions.\n\t\t\tif (!payload.item.children?.length) {\n\t\t\t\tthis.state.closeAllDropdowns();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Toggles the mobile panel and emits the state change.\n\t */\n\tonMobileToggle(): void {\n\t\tthis.state.toggleMobile();\n\t\tif (this.state.mobileOpen() && this.autoOpenFromRoute()) {\n\t\t\tthis.state.syncDropdownsWithRoute(this.items(), this.router.url);\n\t\t}\n\t\tthis.mobileToggle.emit(this.state.mobileOpen());\n\t}\n\n\t/**\n\t * Closes the mobile panel.\n\t */\n\tonMobilePanelClose(): void {\n\t\tthis.state.setMobileOpen(false);\n\t\tthis.mobileToggle.emit(false);\n\t}\n\n\t/**\n\t * Handles dropdown toggle events bubbled up from the item list.\n\t * The toggle has already been performed in the item-list; this just\n\t * emits the appropriate output event.\n\t *\n\t * @param item - The dropdown item that was toggled.\n\t */\n\tonDropdownToggle(item: HubNavItem): void {\n\t\tif (this.state.isDropdownOpen(item.id)) {\n\t\t\tthis.dropdownOpen.emit(item);\n\t\t} else {\n\t\t\tthis.dropdownClose.emit(item);\n\t\t}\n\t}\n\n\t// ──────────────────────────────────────────────\n\t// Panel event handlers\n\t// ──────────────────────────────────────────────\n\n\t/**\n\t * Opens a new panel for the given item's children, or drills down if max panels reached.\n\t * Focuses the first item in the newly opened/drilled panel.\n\t *\n\t * @param item - The item whose children should be displayed in a panel.\n\t */\n\tonPanelOpen(item: HubNavItem): void {\n\t\tconst stackBefore = this.state.panelStack().length;\n\t\tthis.state.openPanel(item, this.items());\n\t\tconst stackAfter = this.state.panelStack().length;\n\n\t\tconst panelIndex = stackAfter - 1;\n\t\tconst action = stackAfter > stackBefore ? 'open' : 'drill-down';\n\t\tthis.panelChange.emit({ item, panelIndex, action });\n\n\t\t// Focus the first item in the new/updated panel\n\t\tthis.focusPanelFirstItem(panelIndex);\n\t}\n\n\t/**\n\t * Closes a panel and all panels opened after it.\n\t * Returns focus to the previous panel or the main nav trigger.\n\t *\n\t * @param panelId - ID of the panel to close.\n\t */\n\tonPanelClose(panelId: string): void {\n\t\tconst panel = this.state.getPanelById(panelId);\n\t\tif (panel) {\n\t\t\tconst panelIndex = this.state.panelStack().indexOf(panel);\n\t\t\tthis.state.closePanel(panelId);\n\t\t\tthis.panelChange.emit({ item: panel.parentItem, panelIndex, action: 'close' });\n\n\t\t\t// Return focus to previous panel or the main nav\n\t\t\tthis.returnFocusAfterPanelClose(panelIndex, panel.parentItem.id);\n\t\t}\n\t}\n\n\t/**\n\t * Navigates back within a panel's drill-down history.\n\t * Focuses the first item after navigating back.\n\t *\n\t * @param panelId - ID of the panel to navigate back in.\n\t */\n\tonPanelBack(panelId: string): void {\n\t\tconst panel = this.state.getPanelById(panelId);\n\t\tif (panel) {\n\t\t\tconst panelIndex = this.state.panelStack().indexOf(panel);\n\t\t\tthis.state.navigateBackInPanel(panelId);\n\t\t\tthis.panelChange.emit({ item: panel.parentItem, panelIndex, action: 'drill-back' });\n\n\t\t\t// Focus the first item in the panel after navigating back\n\t\t\tthis.focusPanelFirstItem(panelIndex);\n\t\t}\n\t}\n\n\t/**\n\t * Focuses the first focusable item inside a panel at the given index.\n\t *\n\t * @param panelIndex - Zero-based index of the panel in the DOM.\n\t */\n\tprivate focusPanelFirstItem(panelIndex: number): void {\n\t\trequestAnimationFrame(() => {\n\t\t\tconst panels = this.elementRef.nativeElement.querySelectorAll('hub-nav-panel');\n\t\t\tconst targetPanel = panels[panelIndex] as HTMLElement | undefined;\n\t\t\tif (targetPanel) {\n\t\t\t\tconst firstItem = targetPanel.querySelector(\n\t\t\t\t\t'.hub-nav-item__link, .hub-nav-item__dropdown-toggle'\n\t\t\t\t) as HTMLElement | null;\n\t\t\t\tfirstItem?.focus();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Returns focus to the appropriate element after a panel is closed.\n\t * If a previous panel exists, focuses its trigger for the closed item.\n\t * Otherwise, returns focus to the main nav item-list.\n\t *\n\t * @param closedIndex - The index of the panel that was closed.\n\t * @param parentItemId - The ID of the parent item that triggered the closed panel.\n\t */\n\tprivate returnFocusAfterPanelClose(closedIndex: number, parentItemId: string): void {\n\t\trequestAnimationFrame(() => {\n\t\t\tif (closedIndex > 0) {\n\t\t\t\t// Focus the trigger in the previous panel\n\t\t\t\tconst panels = this.elementRef.nativeElement.querySelectorAll('hub-nav-panel');\n\t\t\t\tconst prevPanel = panels[closedIndex - 1] as HTMLElement | undefined;\n\t\t\t\tif (prevPanel) {\n\t\t\t\t\tconst trigger = prevPanel.querySelector(\n\t\t\t\t\t\t`hub-nav-item[data-item-id=\"${parentItemId}\"] .hub-nav-item__link,` +\n\t\t\t\t\t\t`hub-nav-item[data-item-id=\"${parentItemId}\"] .hub-nav-item__dropdown-toggle`\n\t\t\t\t\t) as HTMLElement | null;\n\t\t\t\t\ttrigger?.focus();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Fallback: focus the trigger in the main nav\n\t\t\tconst mainTrigger = this.elementRef.nativeElement.querySelector(\n\t\t\t\t`hub-nav-item[data-item-id=\"${parentItemId}\"] .hub-nav-item__link,` +\n\t\t\t\t`hub-nav-item[data-item-id=\"${parentItemId}\"] .hub-nav-item__dropdown-toggle`\n\t\t\t) as HTMLElement | null;\n\t\t\tmainTrigger?.focus();\n\t\t});\n\t}\n\n\t/**\n\t * Sets up a `matchMedia` listener for the configured collapse breakpoint.\n\t */\n\tprivate setupBreakpointListener(): void {\n\t\tconst bp = this.resolvedConfig().collapseBreakpoint;\n\t\tif (bp <= 0 || typeof window === 'undefined') {\n\t\t\tthis.state.setCollapsed(false);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.mediaQuery = window.matchMedia(`(max-width: ${bp - 1}px)`);\n\t\tthis.refreshCollapsedState();\n\t\tthis.mediaQuery.addEventListener('change', this.mediaQueryHandler);\n\t\twindow.addEventListener('resize', this.resizeHandler, { passive: true });\n\t}\n\n\t/** Tears down the `matchMedia` listener. */\n\tprivate teardownBreakpointListener(): void {\n\t\tif (this.mediaQuery) {\n\t\t\tthis.mediaQuery.removeEventListener('change', this.mediaQueryHandler);\n\t\t\tthis.mediaQuery = null;\n\t\t}\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.removeEventListener('resize', this.resizeHandler);\n\t\t}\n\t}\n\n\t/**\n\t * Registers a document click listener that closes dropdowns on outside clicks.\n\t * Panel drill-down mode panels are NOT closed by outside clicks.\n\t */\n\tprivate setupClickOutsideListener(): void {\n\t\tif (typeof document === 'undefined') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.documentClickHandler = (event: MouseEvent) => {\n\t\t\tconst target = event.target as HTMLElement;\n\t\t\tif (!this.elementRef.nativeElement.contains(target)) {\n\t\t\t\tthis.zone.run(() => {\n\t\t\t\t\t// Close dropdowns/flyouts on outside click\n\t\t\t\t\tthis.state.closeAllDropdowns();\n\t\t\t\t\t// DO NOT close panels — they should only close via explicit user action (back/close buttons)\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('click', this.documentClickHandler);\n\t}\n\n\t/** Removes the document click listener. */\n\tprivate teardownClickOutsideListener(): void {\n\t\tif (this.documentClickHandler) {\n\t\t\tdocument.removeEventListener('click', this.documentClickHandler);\n\t\t\tthis.documentClickHandler = null;\n\t\t}\n\t}\n\n\t/**\n\t * Callback invoked when the viewport crosses the collapse breakpoint.\n\t *\n\t * @param belowBreakpoint - `true` if the viewport is now below the breakpoint.\n\t */\n\tprivate onBreakpointChange(belowBreakpoint: boolean): void {\n\t\tif (belowBreakpoint === this.isCollapsed()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.state.setCollapsed(belowBreakpoint);\n\t\tif (!belowBreakpoint) {\n\t\t\tthis.state.closeAllDropdowns();\n\t\t\tthis.state.closeAllPanels();\n\t\t\tthis.mobileToggle.emit(false);\n\t\t}\n\t}\n\n\t/**\n\t * Recomputes the collapsed state from the current viewport width.\n\t * This complements `matchMedia` events, which can become unreliable in\n\t * some browser/devtools combinations when the viewport is resized or\n\t * docked without emitting the expected media-query change sequence.\n\t */\n\tprivate refreshCollapsedState(): void {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst bp = this.resolvedConfig().collapseBreakpoint;\n\t\tif (bp <= 0) {\n\t\t\tthis.onBreakpointChange(false);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.onBreakpointChange(window.innerWidth < bp);\n\t}\n\n\t/**\n\t * Parses the given URL and opens the panels that correspond to the active route.\n\t *\n\t * The algorithm:\n\t * 1. Extract the path without fragment/query: `/calendar/examples` → `['calendar', 'examples']`\n\t * 2. Find the root item whose id matches the first segment.\n\t * 3. Open a panel for that root item (closes any existing panels first).\n\t * 4. If a second segment exists and matches a child item that has its own\n\t * children (e.g. the \"Examples\" dropdown), open a second panel for it.\n\t *\n\t * @param url - The full URL including optional fragment, e.g. `/calendar/examples#cal-basic`.\n\t */\n\tprivate openPanelsFromRoute(url: string): void {\n\t\t// Strip query string and fragment\n\t\tconst path = url.split('?')[0].split('#')[0];\n\t\tthis._lastSyncedPath = path;\n\t\tconst segments = path.split('/').filter(Boolean);\n\n\t\tif (segments.length === 0) {\n\t\t\tthis.state.closeAllPanels();\n\t\t\treturn;\n\t\t}\n\n\t\tconst rootItems = this.items();\n\t\tconst libraryId = segments[0];\n\n\t\t// Find the matching root nav item\n\t\tconst rootItem = rootItems.find((item) => item.id === libraryId);\n\t\tif (!rootItem?.children?.length) {\n\t\t\tthis.state.closeAllPanels();\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentStack = this.state.panelStack();\n\t\tconst hasMatchingRootPanel = this.isRootContextVisible(rootItem, currentStack);\n\n\t\t// Keep the existing root panel when it already matches the route context.\n\t\t// This avoids unnecessary teardown/recreate flicker when switching between\n\t\t// second-level links (Overview, API, Styles, etc.) in the same library.\n\t\tif (!hasMatchingRootPanel) {\n\t\t\tthis.state.closeAllPanels();\n\t\t\tthis.state.openPanel(rootItem, rootItems);\n\t\t} else {\n\t\t\tthis.ensureRootPanelContext(rootItem);\n\t\t}\n\n\t\t// If a second path segment exists, find and open the matching child panel\n\t\tif (segments.length > 1) {\n\t\t\tconst sectionSegment = segments[1];\n\t\t\tconst sectionItem = rootItem.children.find(\n\t\t\t\t(child) => child.children?.length && child.route?.toString().split('/').pop() === sectionSegment\n\t\t\t);\n\t\t\tif (sectionItem) {\n\t\t\t\t// Keep root-level replacement logic scoped to true root items.\n\t\t\t\t// Passing rootItems here preserves drill-down behavior when\n\t\t\t\t// `panelMaxVisible` forces nested levels to replace the last panel.\n\t\t\t\tif (!this.state.isPanelOpenForItem(sectionItem.id)) {\n\t\t\t\t\tthis.state.openPanel(sectionItem, rootItems);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// No nested section panel should be visible for plain second-level links.\n\t\tif (this.state.panelStack().length > 1) {\n\t\t\tthis.state.closePanelsFromIndex(1);\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether the first panel in the current stack belongs to the same\n\t * root route context.\n\t *\n\t * This remains true even when panel mode drill-down has replaced the first\n\t * panel content (the original root items are still present in panel history).\n\t *\n\t * @param rootItem - Root nav item resolved from the current route.\n\t * @param stack - Current panel stack snapshot.\n\t * @returns `true` when the stack already belongs to the same root context.\n\t */\n\tprivate isRootContextVisible(rootItem: HubNavItem, stack: ReturnType<HubNavStateService['panelStack']>): boolean {\n\t\tconst firstPanel = stack[0];\n\t\tif (!firstPanel) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (firstPanel.parentItem.id === rootItem.id) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Compare by item identity instead of array reference because host apps\n\t\t// often rebuild nav item arrays reactively (new references, same content).\n\t\treturn firstPanel.history.some((entry) => this.isSameItemCollection(entry.items, rootItem.children ?? []));\n\t}\n\n\t/**\n\t * Compares two item collections by stable item IDs.\n\t *\n\t * @param source - First collection.\n\t * @param target - Second collection.\n\t * @returns `true` when both collections contain the same IDs in the same order.\n\t */\n\tprivate isSameItemCollection(source: HubNavItem[], target: HubNavItem[]): boolean {\n\t\tif (source.length !== target.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (let index = 0; index < source.length; index++) {\n\t\t\tif (source[index].id !== target[index].id) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Restores the first panel to the root context when it is currently showing\n\t * drill-down content for a child section (e.g. the \"Examples\" third level).\n\t *\n\t * @param rootItem - Root nav item resolved from the current route.\n\t */\n\tprivate ensureRootPanelContext(rootItem: HubNavItem): void {\n\t\tconst firstPanel = this.state.panelStack()[0];\n\t\tif (!firstPanel || firstPanel.parentItem.id === rootItem.id) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Walk back through drill-down history until the root section is visible.\n\t\twhile (true) {\n\t\t\tconst panel = this.state.getPanelById(firstPanel.id);\n\t\t\tif (!panel || panel.parentItem.id === rootItem.id || panel.history.length === 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.state.navigateBackInPanel(firstPanel.id);\n\t\t}\n\t}\n\n\t/**\n\t * Extracts the path part from a URL-like string, removing query and fragment.\n\t *\n\t * @param url - Router URL.\n\t * @returns Normalized path for route-state comparisons.\n\t */\n\tprivate extractPath(url: string): string {\n\t\treturn url.split('?')[0].split('#')[0];\n\t}\n\n\t/**\n\t * Builds a stable signature for the effective nav config so repeated\n\t * reactivity passes with identical values do not trigger work.\n\t *\n\t * @param config - Effective nav config.\n\t * @returns Stable string signature.\n\t */\n\tprivate buildConfigSignature(config: HubNavConfig): string {\n\t\treturn JSON.stringify({\n\t\t\torientation: config.orientation,\n\t\t\tverticalExpandMode: config.verticalExpandMode,\n\t\t\tdropdownTrigger: config.dropdownTrigger,\n\t\t\tposition: config.position,\n\t\t\tstickyTop: config.stickyTop,\n\t\t\tcollapseMode: config.collapseMode,\n\t\t\tcollapseBreakpoint: config.collapseBreakpoint,\n\t\t\toffcanvasPosition: config.offcanvasPosition,\n\t\t\tariaLabel: config.ariaLabel,\n\t\t\tpanelMaxVisible: config.panelMaxVisible,\n\t\t\tsidebarSide: config.sidebarSide,\n\t\t\tpanelWidth: config.panelWidth\n\t\t});\n\t}\n\n\t/**\n\t * Builds a stable signature for breakpoint listener inputs.\n\t *\n\t * @param config - Effective nav config.\n\t * @returns Stable breakpoint signature.\n\t */\n\tprivate buildBreakpointSignature(config: HubNavConfig): string {\n\t\treturn JSON.stringify({\n\t\t\tcollapseBreakpoint: config.collapseBreakpoint,\n\t\t\torientation: config.orientation\n\t\t});\n\t}\n}\n","<nav [attr.aria-label]=\"ariaLabel()\" [class]=\"navClass()\">\n\t<!-- Toggler: visible when collapsed (below breakpoint) -->\n\t@if (isCollapsed()) {\n\t\t@if (startTemplate()) {\n\t\t\t<div class=\"hub-nav-slot hub-nav-slot--start\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"startTemplate()!\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"startContext()\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t}\n\n\t\t@if (endTemplate()) {\n\t\t\t<div class=\"hub-nav-slot hub-nav-slot--end\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"endTemplate()!\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"endContext()\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t}\n\n\t\t<hub-nav-toggler\n\t\t\t[isOpen]=\"isMobileOpen()\"\n\t\t\t(toggle)=\"onMobileToggle()\"\n\t\t/>\n\t}\n\n\t<!-- Desktop horizontal navigation: split into two explicit rows -->\n\t@if (!isCollapsed() && resolvedOrientation() === 'horizontal') {\n\t\t<div class=\"hub-nav__horizontal-top-row\">\n\t\t\t@if (startTemplate()) {\n\t\t\t\t<div class=\"hub-nav-slot hub-nav-slot--start\">\n\t\t\t\t\t<ng-container\n\t\t\t\t\t\t[ngTemplateOutlet]=\"startTemplate()!\"\n\t\t\t\t\t\t[ngTemplateOutletContext]=\"startContext()\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t}\n\n\t\t\t<div class=\"hub-nav__horizontal-root-scroll\">\n\t\t\t\t<hub-nav-item-list\n\t\t\t\t\tclass=\"hub-nav__horizontal-root-list\"\n\t\t\t\t\t[items]=\"items()\"\n\t\t\t\t\t[depth]=\"0\"\n\t\t\t\t\t[itemTemplate]=\"resolvedItemTemplate()\"\n\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t(dropdownToggle)=\"onDropdownToggle($event)\"\n\t\t\t\t\t(panelOpen)=\"onPanelOpen($event)\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t@if (endTemplate()) {\n\t\t\t\t<div class=\"hub-nav-slot hub-nav-slot--end\">\n\t\t\t\t\t<ng-container\n\t\t\t\t\t\t[ngTemplateOutlet]=\"endTemplate()!\"\n\t\t\t\t\t\t[ngTemplateOutletContext]=\"endContext()\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\n\t\t@if (hasPanels()) {\n\t\t\t<div class=\"hub-nav__horizontal-panel-row\">\n\t\t\t\t<hub-nav-panel-container\n\t\t\t\t\t[panels]=\"state.panelStack()\"\n\t\t\t\t\t[sidebarSide]=\"sidebarSide()\"\n\t\t\t\t\t[panelWidth]=\"panelWidth()\"\n\t\t\t\t\t[hideFirstPanelHeader]=\"true\"\n\t\t\t\t\t[itemTemplate]=\"resolvedItemTemplate()\"\n\t\t\t\t\t(panelClose)=\"onPanelClose($event)\"\n\t\t\t\t\t(panelBack)=\"onPanelBack($event)\"\n\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t(dropdownToggle)=\"onDropdownToggle($event)\"\n\t\t\t\t\t(panelOpen)=\"onPanelOpen($event)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t}\n\t}\n\n\t<!-- Desktop vertical navigation -->\n\t@if (!isCollapsed() && resolvedOrientation() === 'vertical') {\n\t\t<div class=\"hub-nav__main-and-panels\">\n\t\t\t<div class=\"hub-nav__primary-column\">\n\t\t\t\t<!-- Start slot in vertical desktop mode: constrained to the primary column only -->\n\t\t\t\t@if (startTemplate()) {\n\t\t\t\t\t<div class=\"hub-nav-slot hub-nav-slot--start\">\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t[ngTemplateOutlet]=\"startTemplate()!\"\n\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"startContext()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<hub-nav-item-list\n\t\t\t\t\t[items]=\"items()\"\n\t\t\t\t\t[depth]=\"0\"\n\t\t\t\t\t[itemTemplate]=\"resolvedItemTemplate()\"\n\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t(dropdownToggle)=\"onDropdownToggle($event)\"\n\t\t\t\t\t(panelOpen)=\"onPanelOpen($event)\"\n\t\t\t\t/>\n\n\t\t\t\t<!-- End slot in vertical desktop mode: anchored to the bottom of the primary column -->\n\t\t\t\t@if (endTemplate()) {\n\t\t\t\t\t<div class=\"hub-nav-slot hub-nav-slot--end\">\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t[ngTemplateOutlet]=\"endTemplate()!\"\n\t\t\t\t\t\t\t[ngTemplateOutletContext]=\"endContext()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t@if (hasPanels()) {\n\t\t\t\t<hub-nav-panel-container\n\t\t\t\t\t[panels]=\"state.panelStack()\"\n\t\t\t\t\t[sidebarSide]=\"sidebarSide()\"\n\t\t\t\t\t[panelWidth]=\"panelWidth()\"\n\t\t\t\t\t[hideFirstPanelHeader]=\"true\"\n\t\t\t\t\t[itemTemplate]=\"resolvedItemTemplate()\"\n\t\t\t\t\t(panelClose)=\"onPanelClose($event)\"\n\t\t\t\t\t(panelBack)=\"onPanelBack($event)\"\n\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t(dropdownToggle)=\"onDropdownToggle($event)\"\n\t\t\t\t\t(panelOpen)=\"onPanelOpen($event)\"\n\t\t\t\t/>\n\t\t\t}\n\t\t</div>\n\t}\n\n\t<!-- Mobile panel: shown when collapsed and open -->\n\t@if (isCollapsed()) {\n\t\t<hub-nav-mobile-panel\n\t\t\t[items]=\"items()\"\n\t\t\t[isOpen]=\"isMobileOpen()\"\n\t\t\t[mode]=\"collapseMode()\"\n\t\t\t[offcanvasPosition]=\"offcanvasPosition()\"\n\t\t\t(closePanel)=\"onMobilePanelClose()\"\n\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t(dropdownToggle)=\"onDropdownToggle($event)\"\n\t\t/>\n\t}\n</nav>\n","/*\n * Public API Surface of nav\n */\n\n// Models\nexport * from './lib/models/nav-item.model';\nexport * from './lib/models/nav-config.model';\nexport * from './lib/models/nav-template-context.model';\nexport * from './lib/models/nav-events.model';\nexport * from './lib/models/nav-panel-state.model';\n\n// Services\nexport * from './lib/services/nav-config.service';\nexport * from './lib/services/nav-state.service';\n\n// Directives\nexport * from './lib/directives/nav-start.directive';\nexport * from './lib/directives/nav-end.directive';\nexport * from './lib/directives/nav-item-template.directive';\nexport * from './lib/directives/nav-scroll-spy.directive';\nexport * from './lib/directives/nav-scroll-spy-section.directive';\n\n// Components\nexport * from './lib/components/nav/nav.component';\nexport * from './lib/components/nav-item/nav-item.component';\nexport * from './lib/components/nav-item-list/nav-item-list.component';\nexport * from './lib/components/nav-separator/nav-separator.component';\nexport * from './lib/components/nav-panel/nav-panel.component';\nexport * from './lib/components/nav-panel-container/nav-panel-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAGA;;AAEG;AACH,MAAM,kBAAkB,GAAiB;AACxC,IAAA,WAAW,EAAE,YAAY;AACzB,IAAA,kBAAkB,EAAE,WAAW;AAC/B,IAAA,eAAe,EAAE,OAAO;AACxB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,YAAY,EAAE,WAAW;AACzB,IAAA,kBAAkB,EAAE,GAAG;AACvB,IAAA,iBAAiB,EAAE,OAAO;AAC1B,IAAA,SAAS,EAAE,YAAY;AACvB,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,WAAW,EAAE,MAAM;AACnB,IAAA,UAAU,EAAE;CACZ;AAED;;;;;;;;;;;;;;;;;;;;AAoBG;MACU,cAAc,GAAG,IAAI,cAAc,CAAwB,gBAAgB;AAExF;;;;;;;;;;AAUG;MAIU,mBAAmB,CAAA;;IAEvB,MAAM,GAAG,MAAM,CAAe,EAAE,GAAG,kBAAkB,EAAE,kDAAC;AAEhE;;;;AAIG;IACH,SAAS,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;IAChC;AAEA;;;;AAIG;IACH,WAAW,GAAA;AACV,QAAA,OAAO,EAAE,GAAG,kBAAkB,EAAE;IACjC;AAEA;;;;AAIG;AACH,IAAA,YAAY,CAAC,OAA8B,EAAA;QAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AAChC,YAAA,GAAG,OAAO;AACV,YAAA,GAAG;AACH,SAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACH,eAAe,GAAA;QACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAC3C;AAEA;;;;;;AAMG;AACH,IAAA,OAAO,CAAC,SAAgC,EAAA;QACvC,OAAO;YACN,GAAG,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,GAAG;SACH;IACF;uGArDY,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFnB,MAAM,EAAA,CAAA;;2FAEN,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACX,oBAAA,UAAU,EAAE;AACZ,iBAAA;;;ACpDD;;;;;;;;;;AAUG;MAEU,kBAAkB,CAAA;;IAEtB,OAAO,GAAG,MAAM,CAAe;AACtC,QAAA,WAAW,EAAE,YAAY;AACzB,QAAA,kBAAkB,EAAE,WAAW;AAC/B,QAAA,eAAe,EAAE,OAAO;AACxB,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,SAAS,EAAE,KAAK;AAChB,QAAA,YAAY,EAAE,WAAW;AACzB,QAAA,kBAAkB,EAAE,GAAG;AACvB,QAAA,iBAAiB,EAAE,OAAO;AAC1B,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,eAAe,EAAE,CAAC;AAClB,QAAA,WAAW,EAAE,MAAM;AACnB,QAAA,UAAU,EAAE;AACZ,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAGM,IAAA,cAAc,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,0DAAC;;AAG/C,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;;AAG3B,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;;AAG1B,IAAA,WAAW,GAAG,MAAM,CAAqB,EAAE,uDAAC;;IAG5C,eAAe,GAAG,CAAC;;AAGlB,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;;AAGlC,IAAA,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;;AAG1C,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;;AAGxC,IAAA,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;;AAG1C,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,sDAAC;;AAGtD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,uDAAC;;AAGxD,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,kBAAkB,8DAAC;;AAGtE,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,eAAe,2DAAC;AAEzE;;;;AAIG;AACH,IAAA,SAAS,CAAC,MAAoB,EAAA;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACxB,QAAA,IAAI,CAAC,6BAA6B,CAAC,MAAM,CAAC;IAC3C;AAEA;;;;;;;;;;AAUG;AACK,IAAA,6BAA6B,CAAC,MAAoB,EAAA;AACzD,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC;AACnE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAElC,QAAA,IAAI,OAAO,CAAC,MAAM,IAAI,mBAAmB,EAAE;YAC1C;QACD;AAEA,QAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,mBAAmB;AAC9D,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;;;AAGxE,YAAA,IAAI,iBAAiB,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAC/D,OAAO;AACN,oBAAA,GAAG,KAAK;AACR,oBAAA,WAAW,EAAE;iBACb;YACF;AACA,YAAA,OAAO,KAAK;AACb,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;IAC9B;;;;AAMA;;;;;AAKG;AACH,IAAA,cAAc,CAAC,EAAU,EAAA;QACxB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACrC;AAEA;;;;;;AAMG;IACH,YAAY,CAAC,EAAU,EAAE,QAAmB,EAAA;QAC3C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;;YAGzB,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,kBAAkB,KAAK,WAAW,EAAE;AAClE,gBAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,KAAI;AAC9B,oBAAA,IAAI,SAAS,KAAK,EAAE,EAAE;AACrB,wBAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;oBACvB;AACD,gBAAA,CAAC,CAAC;YACH;AAEA,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACZ,YAAA,OAAO,IAAI;AACZ,QAAA,CAAC,CAAC;IACH;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,EAAU,EAAA;QACvB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACf,YAAA,OAAO,IAAI;AACZ,QAAA,CAAC,CAAC;IACH;AAEA;;;;;AAKG;AACH,IAAA,cAAc,CAAC,EAAU,EAAA;AACxB,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE;AAC5B,YAAA,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;AACtB,YAAA,OAAO,KAAK;QACb;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;AACrB,QAAA,OAAO,IAAI;IACZ;;IAGA,iBAAiB,GAAA;QAChB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACnC;AAEA;;;;;;AAMG;IACH,sBAAsB,CAAC,KAAmB,EAAE,WAAmB,EAAA;AAC9D,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAC7E,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC;IACrC;;;;AAMA;;;;AAIG;AACH,IAAA,aAAa,CAAC,IAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;;IAGA,YAAY,GAAA;AACX,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC;AAEA;;;;AAIG;AACH,IAAA,YAAY,CAAC,SAAkB,EAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS,EAAE;YACpC;QACD;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;QAC9B,IAAI,CAAC,SAAS,EAAE;AACf,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B;IACD;;;;AAMA;;;;;;AAMG;IACH,SAAS,CAAC,UAAsB,EAAE,SAAwB,EAAA;AACzD,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7D;QACD;QAEA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,eAAe;AACjD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE;;QAGvC,MAAM,aAAa,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC;AACtF,QAAA,IAAI,aAAa,IAAI,CAAC,EAAE;;AAEvB,YAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC;YACxC;QACD;;;AAIA,QAAA,MAAM,WAAW,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC;QACxE,IAAI,WAAW,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3C,IAAI,CAAC,cAAc,EAAE;QACtB;;QAGA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC;;AAGnE,QAAA,IAAI,aAAa,IAAI,CAAC,EAAE;;AAEvB,YAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC;QACzC;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE;;;;AAKvC,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;AAEvD,QAAA,IAAI,YAAY,CAAC,MAAM,IAAI,mBAAmB,EAAE;;YAE/C,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,YAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC;QACrE;aAAO;;AAEN,YAAA,MAAM,KAAK,GAAqB;AAC/B,gBAAA,EAAE,EAAE,CAAA,MAAA,EAAS,EAAE,IAAI,CAAC,eAAe,CAAA,CAAE;gBACrC,UAAU;gBACV,KAAK,EAAE,UAAU,CAAC,QAAQ;AAC1B,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,WAAW,EAAE;aACb;AACD,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;QACtD;IACD;AAEA;;;;;;;;AAQG;IACK,cAAc,CAAC,UAAsB,EAAE,KAAyB,EAAA;AACvE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;YACtB,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,EAAE;AAC1D,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAC;YACd;QACD;QACA,OAAO,CAAC,CAAC;IACV;AAEA;;;;;;;AAOG;AACK,IAAA,uBAAuB,CAAC,KAAmB,EAAE,WAAmB,EAAE,QAAkB,EAAE,EAAA;AAC7F,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE;gBACtD;YACD;YAEA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK;AACrE,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC3B,gBAAA,OAAO,SAAS;YACjB;AAEA,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC;AACtF,YAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,GAAG,SAAS;QACtD;AAEA,QAAA,OAAO,EAAE;IACV;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,OAAe,EAAA;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;AACnE,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;AACf,YAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QACjC;IACD;AAEA;;;;AAIG;AACH,IAAA,oBAAoB,CAAC,KAAa,EAAA;AACjC,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D;;IAGA,cAAc,GAAA;AACb,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IACzB;AAEA;;;;;;;AAOG;AACH,IAAA,gBAAgB,CAAC,OAAe,EAAE,UAAsB,EAAE,KAAmB,EAAA;AAC5E,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,KAC7B,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE;AACzB,gBAAA,OAAO,KAAK;YACb;YACA,OAAO;AACN,gBAAA,GAAG,KAAK;AACR,gBAAA,OAAO,EAAE;oBACR,GAAG,KAAK,CAAC,OAAO;oBAChB,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU;AAClD,iBAAA;gBACD,UAAU;gBACV,KAAK;AACL,gBAAA,WAAW,EAAE;aACb;QACF,CAAC,CAAC,CACF;IACF;AAEA;;;;;AAKG;AACH,IAAA,mBAAmB,CAAC,OAAe,EAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,EAAE;YACX;QACD;QAEA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACxB;QACD;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,KAC7B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACf,YAAA,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,EAAE;AACrB,gBAAA,OAAO,CAAC;YACT;YACA,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;AACjC,YAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAG;YAClC,OAAO;AACN,gBAAA,GAAG,CAAC;gBACJ,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;AAC/B,gBAAA,OAAO,EAAE,UAAU;AACnB,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,GAAG;aACjC;QACF,CAAC,CAAC,CACF;IACF;AAEA;;;;;AAKG;AACH,IAAA,YAAY,CAAC,OAAe,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;IACxD;AAEA;;;;;AAKG;AACH,IAAA,kBAAkB,CAAC,MAAc,EAAA;QAChC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,MAAM,CAAC;IAC1E;AAEA;;;;;;;;AAQG;AACH,IAAA,sBAAsB,CAAC,IAAgB,EAAA;;;QAGtC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,KAAK,YAAY,EAAE;AAChD,YAAA,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,kBAAkB,KAAK,OAAO,GAAG,OAAO,GAAG,QAAQ;QAC1E;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,kBAAkB;;QAEjE,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AAC1C,YAAA,OAAO,WAAW;QACnB;AACA,QAAA,OAAO,IAAI;IACZ;;;;AAMA;;;;;;;AAOG;IACH,wBAAwB,CAAC,IAAgB,EAAE,WAAmB,EAAA;AAC7D,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACf,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK;AAC3E,YAAA,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC;AAC3D,YAAA,IAAI,KAAK,KAAK,UAAU,EAAE;;AAEzB,gBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AAClB,oBAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,cAAc,EAAE;AACrC,wBAAA,OAAO,IAAI;oBACZ;gBACD;qBAAO;AACN,oBAAA,OAAO,IAAI;gBACZ;YACD;;YAGA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,WAAW,EAAE;AAC5C,gBAAA,OAAO,IAAI;YACZ;QACD;AACA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACxF;AACA,QAAA,OAAO,KAAK;IACb;uGAlfY,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAlB,kBAAkB,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;ACbD;;;;;;;;AAQG;MAKU,oBAAoB,CAAA;;AAEvB,IAAA,QAAQ,GAAG,MAAM,EAAC,WAAuC,EAAC;uGAFvD,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE;AACZ,iBAAA;;;ACZD;;;;;;;;AAQG;MAKU,kBAAkB,CAAA;;AAErB,IAAA,QAAQ,GAAG,MAAM,EAAC,WAAqC,EAAC;uGAFrD,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE;AACZ,iBAAA;;;ACZD;;;;;;;;;;;;;;;;;;AAkBG;MAKU,2BAA2B,CAAA;;AAE9B,IAAA,QAAQ,GAAG,MAAM,EAAC,WAAsC,EAAC;uGAFtD,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAJvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,UAAU,EAAE;AACZ,iBAAA;;;ACXD;;;AAGG;MAMU,wBAAwB,CAAA;;IAE3B,OAAO,GAAG,KAAK,CAAU,IAAI,oDAAI,KAAK,EAAE,iBAAiB,EAAA,CAAG;;AAG5D,IAAA,MAAM,GAAG,KAAK,CAAS,GAAG,kDAAC;;AAG3B,IAAA,eAAe,GAAG,KAAK,CAAS,mCAAmC,2DAAC;;IAGpE,mBAAmB,GAAG,MAAM,EAAU;AAE9B,IAAA,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC;AACpC,IAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IAE9B,QAAQ,GAAgC,IAAI;AAC5C,IAAA,QAAQ,GAAG,MAAM,CAAgB,IAAI,oDAAC;AACtC,IAAA,WAAW,GAAG,MAAM,CAAU,KAAK,uDAAC;;IAGnC,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEzC,IAAA,YAAY,GAAG,MAAM,CAAC,MAAK;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;YACxB;QACD;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE;AAChC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE;AAC/B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AACvC,QAAA,KAAK,SAAS;AACd,QAAA,KAAK,QAAQ;QAEb,IAAI,CAAC,SAAS,EAAE;YACf,IAAI,CAAC,eAAe,EAAE;YACtB;QACD;QAEA,IAAI,CAAC,YAAY,EAAE;AACpB,IAAA,CAAC,wDAAC;;IAGF,eAAe,GAAA;AACd,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YACnB,IAAI,CAAC,YAAY,EAAE;QACpB;IACD;;IAGA,WAAW,GAAA;QACV,IAAI,CAAC,eAAe,EAAE;IACvB;AAEA;;;;;;AAMG;AACH,IAAA,QAAQ,CAAC,SAAiB,EAAE,QAAA,GAA2B,QAAQ,EAAA;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;QACpG,IAAI,CAAC,MAAM,EAAE;AACZ,YAAA,OAAO,KAAK;QACb;QAEA,MAAM,CAAC,cAAc,CAAC;YACrB,QAAQ;AACR,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,MAAM,EAAE;AACR,SAAA,CAAC;AACF,QAAA,OAAO,IAAI;IACZ;IAEQ,YAAY,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;YAChC,qBAAqB,CAAC,MAAK;gBAC1B,qBAAqB,CAAC,MAAK;AAC1B,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC/C,gBAAA,CAAC,CAAC;AACH,YAAA,CAAC,CAAC;AACH,QAAA,CAAC,CAAC;IACH;IAEQ,kBAAkB,GAAA;QACzB,IAAI,CAAC,eAAe,EAAE;AAEtB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAC1C,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B;QACD;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE;AAC/B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CACvC,CAAC,OAAO,KAAK,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAChD;AACC,YAAA,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAA,CAAA,EAAI,SAAS,CAAA,eAAA,CAAiB;YAC1C,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;AACpC,SAAA,CACD;AAED,QAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D;IAEQ,eAAe,GAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACrB;IAEQ,kBAAkB,GAAA;AACzB,QAAA,OAAO,KAAK,CAAC,IAAI,CAChB,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAC9D,CAAC,MAAM,CAAC,CAAC,IAAI,KAA0B,IAAI,YAAY,WAAW,CAAC;IACrE;AAEQ,IAAA,YAAY,CAAC,OAAoB,EAAA;AACxC,QAAA,OAAO,OAAO,CAAC,YAAY,CAAC,iCAAiC,CAAC,IAAI,OAAO,CAAC,EAAE,IAAI,IAAI;IACrF;AAEQ,IAAA,qBAAqB,CAAC,OAAoC,EAAA;QACjE,MAAM,OAAO,GAAG;aACd,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,cAAc;AACtC,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,iBAAiB,CAAC;AAE3D,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB;QACD;AAEA,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAqB,CAAC;QACvD,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE;YAClC;QACD;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC;uGA3IY,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBALpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE;AACV,iBAAA;;;ACpBD;;;;;AAKG;MAQU,+BAA+B,CAAA;;IAElC,SAAS,GAAG,KAAK,CAAgB,IAAI,sDAAI,KAAK,EAAE,wBAAwB,EAAA,CAAG;AAEnE,IAAA,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC;;IAG5C,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;uGAPrF,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,sCAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAP3C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,0BAA0B;AACpC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACL,wBAAA,wCAAwC,EAAE;AAC1C;AACD,iBAAA;;;ACRD;;;;;AAKG;MAmBU,mBAAmB,CAAA;;AAEtB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAc;;AAGnC,IAAA,KAAK,GAAG,KAAK,CAAS,CAAC,iDAAC;;AAGxB,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;;AAGhC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,sDAAC;;AAGlC,IAAA,YAAY,GAAG,KAAK,CAA8B,IAAI,wDAAC;AAEhE;;;AAGG;AACM,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,8DAAC;;IAG1C,OAAO,GAAG,MAAM,EAAsC;;IAGtD,cAAc,GAAG,MAAM,EAAc;;AAG7B,IAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;;AAG1C,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ;QACrC,OAAO,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;AACzC,IAAA,CAAC,uDAAC;;AAGO,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,oDAAC;;AAGxD,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,kDAAC;;AAGpD,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,sDAAC;;AAG5D,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,oDAAC;;AAGxD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AAChB,YAAA,OAAO,IAAI;QACZ;QACA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7D,IAAA,CAAC,yDAAC;;AAGO,IAAA,eAAe,GAAG,QAAQ,CAAC,OAAO;AAC1C,QAAA,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE;AACtB,QAAA,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE;AACvB,QAAA,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE;AAC3B,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,KAAA,CAAC,2DAAC;AAEH;;;AAGG;AACM,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE;AAC/C,YAAA,OAAO,KAAK;QACb;AAEA,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC9B,YAAA,OAAO,IAAI;QACZ;AAEA,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO;AAClE,IAAA,CAAC,qDAAC;AAEF;;;;;AAKG;AACH,IAAA,WAAW,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAExB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YAClB,KAAK,CAAC,cAAc,EAAE;YACtB;QACD;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE;YACxD,KAAK,CAAC,cAAc,EAAE;YACtB;QACD;AAEA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B;QAEA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnC;AAEA;;;;;;AAMG;AACH,IAAA,gBAAgB,CAAC,KAAY,EAAA;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAExB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YAClB,KAAK,CAAC,cAAc,EAAE;YACtB;QACD;QAEA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnC;AAEA;;;;;AAKG;AACH,IAAA,YAAY,CAAC,KAAY,EAAA;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QAExB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QAEvB,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;YACzC;QACD;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;uGA/IY,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,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,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,4BAAA,EAAA,YAAA,EAAA,8BAAA,EAAA,iBAAA,EAAA,kCAAA,EAAA,eAAA,EAAA,8BAAA,EAAA,cAAA,EAAA,4BAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,EAAA,cAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BhC,gvJAsHA,EAAA,MAAA,EAAA,CAAA,0zLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDvGW,gBAAgB,oJAAE,UAAU,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,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAe1B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAlB/B,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,OAAA,EACP,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAAA,eAAA,EACtB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,cAAc;AACrB,wBAAA,8BAA8B,EAAE,YAAY;AAC5C,wBAAA,gCAAgC,EAAE,iBAAiB;AACnD,wBAAA,oCAAoC,EAAE,eAAe;AACrD,wBAAA,gCAAgC,EAAE,cAAc;AAChD,wBAAA,8BAA8B,EAAE,YAAY;AAC5C,wBAAA,qBAAqB,EAAE,WAAW;AAClC,wBAAA,IAAI,EAAE;AACN,qBAAA,EAAA,QAAA,EAAA,gvJAAA,EAAA,MAAA,EAAA,CAAA,0zLAAA,CAAA,EAAA;;;AExBF;;;;;;;AAOG;MAkDU,wBAAwB,CAAA;uGAAxB,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,iKAzC1B,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wvBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAyCA,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAjDpC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,mBAAmB;AAC1B,wBAAA,IAAI,EAAE;AACN,qBAAA,EAAA,QAAA,EACS,EAAE,EAAA,MAAA,EAAA,CAAA,wvBAAA,CAAA,EAAA;;;ACIb;;;;;;;;AAQG;MAcU,uBAAuB,CAAA;;AAE1B,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAgB;;AAGtC,IAAA,KAAK,GAAG,KAAK,CAAS,CAAC,iDAAC;;AAGxB,IAAA,YAAY,GAAG,KAAK,CAA8B,IAAI,wDAAC;AAEhE;;;;AAIG;AACM,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,8DAAC;;IAG1C,SAAS,GAAG,MAAM,EAAsC;;IAGxD,cAAc,GAAG,MAAM,EAAc;;IAGrC,SAAS,GAAG,MAAM,EAAc;;AAGhC,IAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;;AAG1B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;IAGvB,UAAU,GAAG,MAAM,CAAS,IAAI,CAAC,MAAM,CAAC,GAAG,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAGrD,IAAA,SAAS;;AAGA,IAAA,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC;AAErD;;;AAGG;IACM,eAAe,GAAG,QAAQ,CAClC,MACC,IAAI,CAAC,kBAAkB,EAAE;AACzB,SAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,WAAW,CAAC,2DAC7F;;AAGD,IAAA,IAAY,gBAAgB,GAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC9B,YAAA,OAAO,KAAK;QACb;AAEA,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;IACvE;;;;AAMA;;;;;AAKG;AACH,IAAA,YAAY,CAAC,IAAgB,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACpE;;IAGA,QAAQ,GAAA;AACP,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,aAAA,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC;aACtD,SAAS,CAAC,MAAK;YACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACrC,QAAA,CAAC,CAAC;IACJ;;IAGA,WAAW,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE;IAC9B;AAEA;;;;;AAKG;AACH,IAAA,UAAU,CAAC,IAAgB,EAAA;;QAE1B,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE;YAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C;QAEA,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C;AAEA;;;;;AAKG;AACH,IAAA,WAAW,CAAC,IAAgB,EAAA;AAC3B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;IACnD;AAEA;;;;;;AAMG;AACH,IAAA,iBAAiB,CAAC,IAAgB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC9B,YAAA,OAAO,WAAW;QACnB;QAEA,OAAO,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC;IAC/C;;;;AAMA;;;;AAIG;AACH,IAAA,WAAW,CAAC,OAA2C,EAAA;AACtD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAC7B;AAEA;;;;;AAKG;AACH,IAAA,gBAAgB,CAAC,IAAgB,EAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AACzC,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AACrB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB;QACD;;AAGA,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK;AAC3B,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;aAC1D,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAElB,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YACvC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC;aAAO;YACN,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC;QAC7C;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;AAEA;;;;;AAKG;AACH,IAAA,gBAAgB,CAAC,IAAgB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC9B;QACD;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;AAC5C,QAAA,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,MAAM,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;;AAE1E,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK;AAC3B,iBAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;iBAC1D,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC;QAC7C;IACD;AAEA;;;;;AAKG;AACH,IAAA,gBAAgB,CAAC,IAAgB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC9B;QACD;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;AAC5C,QAAA,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,MAAM,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YAC1E,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC;IACD;;;;AAMA;;;;AAIG;AAEH,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;AAErD,QAAA,QAAQ,KAAK,CAAC,GAAG;AAChB,YAAA,KAAK,YAAY;gBAChB,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;AACvB,gBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBAC1B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,CAAC;gBACxC;qBAAO;AACN,oBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,YAAY,CAAC;gBAC9C;gBACA;AAED,YAAA,KAAK,WAAW;gBACf,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;AACvB,gBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBAC1B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,CAAC;gBACxC;qBAAO;AACN,oBAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,YAAY,CAAC;gBAC/C;gBACA;AAED,YAAA,KAAK,WAAW;gBACf,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;AACvB,gBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC1B,oBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,YAAY,CAAC;gBAC9C;qBAAO;oBACN,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,CAAC;gBACxC;gBACA;AAED,YAAA,KAAK,SAAS;gBACb,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;AACvB,gBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC1B,oBAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,YAAY,CAAC;gBAC/C;qBAAO;oBACN,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,CAAC;gBACxC;gBACA;AAED,YAAA,KAAK,MAAM;gBACV,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;AACvB,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;gBACxB;AAED,YAAA,KAAK,KAAK;gBACT,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;gBACvB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACvC;AAED,YAAA,KAAK,QAAQ;gBACZ,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;AACvB,gBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;;AAE9B,gBAAA,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;AACrB,oBAAA,MAAM,aAAa,GAAI,IAAI,CAAC,EAAE,CAAC,aAA6B,CAAC,OAAO,CAAC,uBAAuB,CAAC;oBAC7F,MAAM,OAAO,GAAG,aAAa,EAAE,aAAa,CAC3C,sDAAsD,CAChC;oBACvB,OAAO,EAAE,KAAK,EAAE;gBACjB;gBACA;AAED,YAAA;gBACC;;IAEH;;IAGQ,iBAAiB,GAAA;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,aAA4B;QACjD,MAAM,SAAS,GACd,oEAAoE;AACpE,YAAA,8EAA8E;QAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;AACjD,QAAA,OAAQ,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAmB,CAAC,MAAM,CACpD,CAAC,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM,IAAI,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC,CACzE;IACF;;AAGQ,IAAA,oBAAoB,CAAC,KAAoB,EAAA;QAChD,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAA4B,CAAC;IAC5D;;IAGQ,SAAS,CAAC,KAAoB,EAAE,KAAa,EAAA;AACpD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB;QACD;AACA,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;AACtE,QAAA,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE;IACxB;;IAGQ,mBAAmB,CAAC,KAAoB,EAAE,YAAoB,EAAA;AACrE,QAAA,IAAI,YAAY,GAAG,CAAC,EAAE;YACrB;QACD;QACA,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;AACpE,QAAA,MAAM,MAAM,GAAG,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC;QACnF,IAAI,MAAM,EAAE;;AAEX,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK;AAC3B,iBAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;iBAC1D,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC;YAC3C,qBAAqB,CAAC,MAAK;gBAC1B,MAAM,OAAO,GAAG,OAAO,EAAE,aAAa,CAAC,uCAAuC,CAAC;gBAC/E,MAAM,UAAU,GAAG,OAAO,EAAE,aAAa,CACxC,qDAAqD,CAC/B;gBACvB,UAAU,EAAE,KAAK,EAAE;AACpB,YAAA,CAAC,CAAC;QACH;IACD;;IAGQ,oBAAoB,CAAC,KAAoB,EAAE,YAAoB,EAAA;AACtE,QAAA,IAAI,YAAY,GAAG,CAAC,EAAE;YACrB;QACD;QACA,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;AACpE,QAAA,MAAM,MAAM,GAAG,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC;QACnF,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;AAChD,YAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;QACjC;IACD;uGA/VY,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,47BC5CpC,mrEA0DA,EAAA,MAAA,EAAA,CAAA,qwEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDda,uBAAuB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,cAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAVzB,mBAAmB,4LAAE,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAU3C,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAbnC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,EAAA,eAAA,EACvC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,mBAAmB;AAC1B,wBAAA,4CAA4C,EAAE,sBAAsB;AACpE,wBAAA,aAAa,EAAE;AACf,qBAAA,EAAA,QAAA,EAAA,mrEAAA,EAAA,MAAA,EAAA,CAAA,qwEAAA,CAAA,EAAA;;sBA2NA,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;;AEjQpC;;;;;AAKG;MA8FU,sBAAsB,CAAA;;AAEzB,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,kDAAC;;IAG9B,MAAM,GAAG,MAAM,EAAQ;uGALpB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtFxB;;;;;;;;;;;;;;;AAeT,CAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,m5CAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAuEW,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA7FlC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE;qBACP,EAAA,QAAA,EACS;;;;;;;;;;;;;;;AAeT,CAAA,CAAA,EAAA,MAAA,EAAA,CAAA,m5CAAA,CAAA,EAAA;;;ACzBF;;;;;;AAMG;MAoBU,0BAA0B,CAAA;;AAE7B,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAgB;;AAGtC,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,kDAAC;;AAG9B,IAAA,IAAI,GAAG,KAAK,CAAqB,WAAW,gDAAC;;AAG7C,IAAA,iBAAiB,GAAG,KAAK,CAA0B,OAAO,6DAAC;;IAG3D,UAAU,GAAG,MAAM,EAAQ;;IAG3B,SAAS,GAAG,MAAM,EAAsC;;IAGxD,cAAc,GAAG,MAAM,EAAc;AAE9C;;AAEG;IACH,eAAe,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACvB;AAEA;;AAEG;IACH,YAAY,GAAA;AACX,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACvB;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,OAA2C,EAAA;AACtD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;;;AAG5B,QAAA,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;AACvB,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QACvB;IACD;AAEA;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,IAAgB,EAAA;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;uGAzDY,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kCAAA,EAAA,UAAA,EAAA,uCAAA,EAAA,0BAAA,EAAA,sCAAA,EAAA,yBAAA,EAAA,wCAAA,EAAA,2BAAA,EAAA,mCAAA,EAAA,mCAAA,EAAA,iCAAA,EAAA,iCAAA,EAAA,iCAAA,EAAA,iCAAA,EAAA,oCAAA,EAAA,oCAAA,EAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BvC,u8BAgCA,EAAA,MAAA,EAAA,CAAA,kuGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjBW,uBAAuB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,cAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAgBrB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAnBtC,SAAS;+BACC,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP,CAAC,uBAAuB,CAAC,EAAA,eAAA,EACjB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,sBAAsB;AAC7B,wBAAA,oCAAoC,EAAE,UAAU;AAChD,wBAAA,yCAAyC,EAAE,wBAAwB;AACnE,wBAAA,wCAAwC,EAAE,uBAAuB;AACjE,wBAAA,0CAA0C,EAAE,yBAAyB;AACrE,wBAAA,qCAAqC,EAAE,iCAAiC;AACxE,wBAAA,mCAAmC,EAAE,+BAA+B;AACpE,wBAAA,mCAAmC,EAAE,+BAA+B;AACpE,wBAAA,sCAAsC,EAAE;AACxC,qBAAA,EAAA,QAAA,EAAA,u8BAAA,EAAA,MAAA,EAAA,CAAA,kuGAAA,CAAA,EAAA;;;AEtBF;;;;;;;;;;AAUG;MAiBU,oBAAoB,CAAA;;AAEvB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAoB;;AAG1C,IAAA,UAAU,GAAG,KAAK,CAAS,OAAO,sDAAC;;AAGnC,IAAA,YAAY,GAAG,KAAK,CAA8B,IAAI,wDAAC;AAEhE;;;;AAIG;AACM,IAAA,UAAU,GAAG,KAAK,CAAU,IAAI,sDAAC;;IAGjC,UAAU,GAAG,MAAM,EAAU;;IAG7B,SAAS,GAAG,MAAM,EAAU;;IAG5B,SAAS,GAAG,MAAM,EAAsC;;IAGxD,cAAc,GAAG,MAAM,EAAc;;IAGrC,SAAS,GAAG,MAAM,EAAc;;AAGxB,IAAA,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC;;AAG5C,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,KAAK,wDAAC;;AAG5D,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,KAAK,CAAA,WAAA,CAAa,qDAAC;AAElF;;;;AAIG;AAEH,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC7B,QAAA,QAAQ,KAAK,CAAC,GAAG;AAChB,YAAA,KAAK,QAAQ;gBACZ,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;AACvB,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;gBACrC;AAED,YAAA,KAAK,WAAW;;gBAEf,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAqB,CAAC,EAAE;oBACzD,KAAK,CAAC,cAAc,EAAE;oBACtB,KAAK,CAAC,eAAe,EAAE;AACvB,oBAAA,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE;AAC7B,wBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;oBACrC;yBAAO;AACN,wBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;oBACtC;gBACD;gBACA;AAED,YAAA;gBACC;;IAEH;AAEA;;AAEG;IACH,YAAY,GAAA;AACX,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IACtC;AAEA;;AAEG;IACH,WAAW,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IACrC;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,OAA2C,EAAA;AACtD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAC7B;AAEA;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,IAAgB,EAAA;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,IAAgB,EAAA;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1B;AAEA;;AAEG;IACH,cAAc,GAAA;QACb,qBAAqB,CAAC,MAAK;AAC1B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CACpD,kFAAkF,CAC5D;YACvB,SAAS,EAAE,KAAK,EAAE;AACnB,QAAA,CAAC,CAAC;IACH;AAEA;;;;;;AAMG;AACK,IAAA,kBAAkB,CAAC,MAAmB,EAAA;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC;AACtD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CACrD,mDAAmD,CACnD;AAED,QAAA,OAAO,CAAC,CAAC,UAAU,IAAI,UAAU,KAAK,UAAU;IACjD;uGA5IY,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iCAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,EAAA,cAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChCjC,y5BAkCA,EAAA,MAAA,EAAA,CAAA,kyIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDfW,uBAAuB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,cAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAarB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAhBhC,SAAS;+BACC,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,OAAA,EACP,CAAC,uBAAuB,CAAC,EAAA,eAAA,EACjB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,eAAe;AACtB,wBAAA,mCAAmC,EAAE,qBAAqB;AAC1D,wBAAA,eAAe,EAAE,cAAc;AAC/B,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,mBAAmB,EAAE,aAAa;AAClC,wBAAA,QAAQ,EAAE;AACV,qBAAA,EAAA,QAAA,EAAA,y5BAAA,EAAA,MAAA,EAAA,CAAA,kyIAAA,CAAA,EAAA;;sBAkDA,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;;AExEpC;;;;;AAKG;MAcU,6BAA6B,CAAA;;AAEhC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,iDAAsB;;AAG7C,IAAA,WAAW,GAAG,KAAK,CAAoB,MAAM,uDAAC;;AAG9C,IAAA,UAAU,GAAG,KAAK,CAAS,OAAO,sDAAC;;AAGnC,IAAA,YAAY,GAAG,KAAK,CAA8B,IAAI,wDAAC;AAEhE;;;;AAIG;AACM,IAAA,oBAAoB,GAAG,KAAK,CAAU,KAAK,gEAAC;;IAG5C,UAAU,GAAG,MAAM,EAAU;;IAG7B,SAAS,GAAG,MAAM,EAAU;;IAG5B,SAAS,GAAG,MAAM,EAAsC;;IAGxD,cAAc,GAAG,MAAM,EAAc;;IAGrC,SAAS,GAAG,MAAM,EAAc;AAEzC;;;;;;;;;;;;AAYG;IACH,gBAAgB,CAAC,KAAa,EAAE,KAAuB,EAAA;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;AACjC,YAAA,OAAO,IAAI;QACZ;;;;;QAMA,OAAO,KAAK,CAAC,WAAW;IACzB;uGA1DY,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,qCAAA,EAAA,4BAAA,EAAA,sCAAA,EAAA,6BAAA,EAAA,EAAA,cAAA,EAAA,yBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzB1C,2dAaA,EAAA,MAAA,EAAA,CAAA,iXAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDEW,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAUlB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAbzC,SAAS;+BACC,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP,CAAC,oBAAoB,CAAC,EAAA,eAAA,EACd,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,yBAAyB;AAChC,wBAAA,uCAAuC,EAAE,0BAA0B;AACnE,wBAAA,wCAAwC,EAAE;AAC1C,qBAAA,EAAA,QAAA,EAAA,2dAAA,EAAA,MAAA,EAAA,CAAA,iXAAA,CAAA,EAAA;;;AEUF;;;;;;;;;AASG;MA+BU,eAAe,CAAA;AAC3B;;;;AAIG;IACK,eAAe,GAAG,EAAE;;AAGnB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAgB;;AAGtC,IAAA,MAAM,GAAG,KAAK,CAAwB,EAAE,kDAAC;;AAGzC,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,oDAAC;;AAG5B,IAAA,YAAY,GAAG,KAAK,CAA8B,IAAI,wDAAC;AAEhE;;;;AAIG;AACM,IAAA,iBAAiB,GAAG,KAAK,CAAU,KAAK,6DAAC;;AAGjC,IAAA,cAAc,GAAG,YAAY,CAAC,oBAAoB,0DAAC;;AAGnD,IAAA,YAAY,GAAG,YAAY,CAAC,kBAAkB,wDAAC;;AAG/C,IAAA,qBAAqB,GAAG,YAAY,CAAC,2BAA2B,iEAAC;;AAGzE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,IAAI,IAAI,yDAAC;;AAGvE,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,IAAI,IAAI,uDAAC;;AAGnE,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,EAAE,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,gEAAC;;AAGpG,IAAA,YAAY,GAAG,QAAQ,CAAC,OAAO;AACvC,QAAA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAC/B,KAAA,CAAC,wDAAC;;AAGM,IAAA,UAAU,GAAG,QAAQ,CAAC,OAAO;AACrC,QAAA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAC/B,KAAA,CAAC,sDAAC;;IAGM,SAAS,GAAG,MAAM,EAAc;;IAGhC,YAAY,GAAG,MAAM,EAAc;;IAGnC,aAAa,GAAG,MAAM,EAAc;;IAGpC,YAAY,GAAG,MAAM,EAAW;;IAGhC,WAAW,GAAG,MAAM,EAAoB;;AAGhC,IAAA,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC;;AAGnD,IAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;;AAG1B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAG/B,IAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;;AAGrB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;IAGhC,WAAW,GAAG,KAAK;;IAGnB,0BAA0B,GAAG,EAAE;;IAG/B,uBAAuB,GAAG,EAAE;;AAG5B,IAAA,SAAS;;IAGT,UAAU,GAA0B,IAAI;;IAGxC,iBAAiB,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE;;IAGtD,aAAa,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE;;IAGlD,oBAAoB,GAAyC,IAAI;;AAGhE,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,0DAAC;;AAG1E,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,WAAW,+DAAC;;AAGvE,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,qDAAC;;AAGvD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,WAAW,uDAAC;;AAG/D,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,UAAU,sDAAC;;AAG9D,IAAA,YAAY,GAAG,MAAM,CAAC,MAAK;AAClC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;QAC5C,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;QACrE,MAAM,uBAAuB,GAAG,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC;AAE7E,QAAA,IAAI,mBAAmB,KAAK,IAAI,CAAC,0BAA0B,EAAE;AAC5D,YAAA,IAAI,CAAC,0BAA0B,GAAG,mBAAmB;AACrD,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC;QACrC;QAEA,IAAI,IAAI,CAAC,WAAW,IAAI,uBAAuB,KAAK,IAAI,CAAC,uBAAuB,EAAE;AACjF,YAAA,IAAI,CAAC,uBAAuB,GAAG,uBAAuB;YACtD,IAAI,CAAC,0BAA0B,EAAE;YACjC,IAAI,CAAC,uBAAuB,EAAE;QAC/B;AACD,IAAA,CAAC,wDAAC;;AAGO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,qDAAC;;AAG3D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,uDAAC;;AAGpD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,wDAAC;;AAGtD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,YAAY,wDAAC;;AAGjE,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,iBAAiB,6DAAC;AAEpF;;;;AAIG;IACM,cAAc,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,mBAAmB,EAAE,KAAK,UAAU,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC9F;;IAGD,QAAQ,GAAA;AACP,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;;;AAIvB,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;QAC5C,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;QAC3E,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC;AAC5E,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC;QAEpC,IAAI,CAAC,uBAAuB,EAAE;QAC9B,IAAI,CAAC,yBAAyB,EAAE;AAEhC,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;AAC7B,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,gBAAA,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YACjE;iBAAO;gBACN,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAC1C;AAEA,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,iBAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,aAAa,CAAC;AAC9C,iBAAA,SAAS,CAAC,CAAC,CAAC,KAAI;AAChB,gBAAA,MAAM,OAAO,GAAI,CAAmB,CAAC,iBAAiB;gBACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AAE1C,gBAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,oBAAA,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC;AACxD,oBAAA,IAAI,CAAC,eAAe,GAAG,QAAQ;oBAC/B;gBACD;;AAGA,gBAAA,IAAI,QAAQ,KAAK,IAAI,CAAC,eAAe,EAAE;oBACtC;gBACD;AAEA,gBAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAClC,YAAA,CAAC,CAAC;QACJ;IACD;;IAGA,WAAW,GAAA;AACV,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QACxB,IAAI,CAAC,0BAA0B,EAAE;QACjC,IAAI,CAAC,4BAA4B,EAAE;AACnC,QAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE;IAC9B;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,OAA2C,EAAA;AACtD,QAAA,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;YACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;;;;YAIjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AACnC,gBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;YAC/B;QACD;IACD;AAEA;;AAEG;IACH,cAAc,GAAA;AACb,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACzB,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;AACxD,YAAA,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QACjE;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAChD;AAEA;;AAEG;IACH,kBAAkB,GAAA;AACjB,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;AAEA;;;;;;AAMG;AACH,IAAA,gBAAgB,CAAC,IAAgB,EAAA;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AACvC,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7B;aAAO;AACN,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B;IACD;;;;AAMA;;;;;AAKG;AACH,IAAA,WAAW,CAAC,IAAgB,EAAA;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM;AAClD,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM;AAEjD,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,CAAC;AACjC,QAAA,MAAM,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY;AAC/D,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;;AAGnD,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;IACrC;AAEA;;;;;AAKG;AACH,IAAA,YAAY,CAAC,OAAe,EAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC;QAC9C,IAAI,KAAK,EAAE;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AACzD,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;AAC9B,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;;YAG9E,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACjE;IACD;AAEA;;;;;AAKG;AACH,IAAA,WAAW,CAAC,OAAe,EAAA;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC;QAC9C,IAAI,KAAK,EAAE;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AACzD,YAAA,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC;AACvC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;;AAGnF,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;QACrC;IACD;AAEA;;;;AAIG;AACK,IAAA,mBAAmB,CAAC,UAAkB,EAAA;QAC7C,qBAAqB,CAAC,MAAK;AAC1B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAgB,CAAC,eAAe,CAAC;AAC9E,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAA4B;YACjE,IAAI,WAAW,EAAE;gBAChB,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,CAC1C,qDAAqD,CAC/B;gBACvB,SAAS,EAAE,KAAK,EAAE;YACnB;AACD,QAAA,CAAC,CAAC;IACH;AAEA;;;;;;;AAOG;IACK,0BAA0B,CAAC,WAAmB,EAAE,YAAoB,EAAA;QAC3E,qBAAqB,CAAC,MAAK;AAC1B,YAAA,IAAI,WAAW,GAAG,CAAC,EAAE;;AAEpB,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAgB,CAAC,eAAe,CAAC;gBAC9E,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC,CAA4B;gBACpE,IAAI,SAAS,EAAE;oBACd,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CACtC,CAAA,2BAAA,EAA8B,YAAY,CAAA,uBAAA,CAAyB;wBACnE,CAAA,2BAAA,EAA8B,YAAY,CAAA,iCAAA,CAAmC,CACvD;oBACvB,OAAO,EAAE,KAAK,EAAE;oBAChB;gBACD;YACD;;AAEA,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAC9D,CAAA,2BAAA,EAA8B,YAAY,CAAA,uBAAA,CAAyB;gBACnE,CAAA,2BAAA,EAA8B,YAAY,CAAA,iCAAA,CAAmC,CACvD;YACvB,WAAW,EAAE,KAAK,EAAE;AACrB,QAAA,CAAC,CAAC;IACH;AAEA;;AAEG;IACK,uBAAuB,GAAA;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,kBAAkB;QACnD,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAC7C,YAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC;YAC9B;QACD;AAEA,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA,YAAA,EAAe,EAAE,GAAG,CAAC,CAAA,GAAA,CAAK,CAAC;QAC/D,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC;AAClE,QAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzE;;IAGQ,0BAA0B,GAAA;AACjC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC;AACrE,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACvB;AAEA,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;YAClC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC;QACzD;IACD;AAEA;;;AAGG;IACK,yBAAyB,GAAA;AAChC,QAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;YACpC;QACD;AAEA,QAAA,IAAI,CAAC,oBAAoB,GAAG,CAAC,KAAiB,KAAI;AACjD,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACpD,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;;AAElB,oBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;;AAE/B,gBAAA,CAAC,CAAC;YACH;AACD,QAAA,CAAC;QAED,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC;IAC9D;;IAGQ,4BAA4B,GAAA;AACnC,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC9B,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC;AAChE,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;QACjC;IACD;AAEA;;;;AAIG;AACK,IAAA,kBAAkB,CAAC,eAAwB,EAAA;AAClD,QAAA,IAAI,eAAe,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE;YAC3C;QACD;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC;QACxC,IAAI,CAAC,eAAe,EAAE;AACrB,YAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;AAC9B,YAAA,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AAC3B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B;IACD;AAEA;;;;;AAKG;IACK,qBAAqB,GAAA;AAC5B,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;YAClC;QACD;QAEA,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,kBAAkB;AACnD,QAAA,IAAI,EAAE,IAAI,CAAC,EAAE;AACZ,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAC9B;QACD;QAEA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IAChD;AAEA;;;;;;;;;;;AAWG;AACK,IAAA,mBAAmB,CAAC,GAAW,EAAA;;AAEtC,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAEhD,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;YAC3B;QACD;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE;AAC9B,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;;AAG7B,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC;AAChE,QAAA,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE;AAChC,YAAA,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;YAC3B;QACD;QAEA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QAC5C,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC;;;;QAK9E,IAAI,CAAC,oBAAoB,EAAE;AAC1B,YAAA,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;YAC3B,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC;QAC1C;aAAO;AACN,YAAA,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;QACtC;;AAGA,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,YAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC;AAClC,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CACzC,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,cAAc,CAChG;YACD,IAAI,WAAW,EAAE;;;;AAIhB,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE;oBACnD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC;gBAC7C;gBACA;YACD;QACD;;QAGA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACvC,YAAA,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACnC;IACD;AAEA;;;;;;;;;;AAUG;IACK,oBAAoB,CAAC,QAAoB,EAAE,KAAmD,EAAA;AACrG,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,UAAU,EAAE;AAChB,YAAA,OAAO,KAAK;QACb;QAEA,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE;AAC7C,YAAA,OAAO,IAAI;QACZ;;;QAIA,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC3G;AAEA;;;;;;AAMG;IACK,oBAAoB,CAAC,MAAoB,EAAE,MAAoB,EAAA;QACtE,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE;AACpC,YAAA,OAAO,KAAK;QACb;AAEA,QAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACnD,YAAA,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE;AAC1C,gBAAA,OAAO,KAAK;YACb;QACD;AAEA,QAAA,OAAO,IAAI;IACZ;AAEA;;;;;AAKG;AACK,IAAA,sBAAsB,CAAC,QAAoB,EAAA;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE;YAC5D;QACD;;QAGA,OAAO,IAAI,EAAE;AACZ,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBAChF;YACD;YACA,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C;IACD;AAEA;;;;;AAKG;AACK,IAAA,WAAW,CAAC,GAAW,EAAA;AAC9B,QAAA,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvC;AAEA;;;;;;AAMG;AACK,IAAA,oBAAoB,CAAC,MAAoB,EAAA;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC;AACnB,SAAA,CAAC;IACH;AAEA;;;;;AAKG;AACK,IAAA,wBAAwB,CAAC,MAAoB,EAAA;QACpD,OAAO,IAAI,CAAC,SAAS,CAAC;YACrB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,WAAW,EAAE,MAAM,CAAC;AACpB,SAAA,CAAC;IACH;uGAhpBY,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,2BAAA,EAAA,0CAAA,EAAA,yBAAA,EAAA,wCAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,yCAAA,EAAA,6BAAA,EAAA,2CAAA,EAAA,8BAAA,EAAA,4CAAA,EAAA,aAAA,EAAA,0DAAA,EAAA,kBAAA,EAAA,6DAAA,EAAA,4BAAA,EAAA,4BAAA,EAAA,eAAA,EAAA,0DAAA,EAAA,sBAAA,EAAA,4DAAA,EAAA,EAAA,cAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EApBhB,CAAC,kBAAkB,CAAC,sEAgDgB,oBAAoB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAGtB,kBAAkB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAGT,2BAA2B,gECzGlF,oqJA8IA,EAAA,MAAA,EAAA,CAAA,4rYAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjGE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,uBAAuB,uLACvB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,0BAA0B,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,6BAA6B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAsBlB,eAAe,EAAA,UAAA,EAAA,CAAA;kBA9B3B,SAAS;+BACC,SAAS,EAAA,UAAA,EACP,IAAI,EAAA,OAAA,EACP;wBACR,gBAAgB;wBAChB,uBAAuB;wBACvB,sBAAsB;wBACtB,0BAA0B;wBAC1B;AACA,qBAAA,EAAA,SAAA,EACU,CAAC,kBAAkB,CAAC,mBACd,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACL,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,6BAA6B,EAAE,wCAAwC;AACvE,wBAAA,2BAA2B,EAAE,sCAAsC;AACnE,wBAAA,4BAA4B,EAAE,eAAe;AAC7C,wBAAA,yBAAyB,EAAE,kBAAkB;AAC7C,wBAAA,wBAAwB,EAAE,uCAAuC;AACjE,wBAAA,+BAA+B,EAAE,yCAAyC;AAC1E,wBAAA,gCAAgC,EAAE,0CAA0C;AAC5E,wBAAA,eAAe,EAAE,sDAAsD;AACvE,wBAAA,oBAAoB,EAAE,yDAAyD;AAC/E,wBAAA,8BAA8B,EAAE,4BAA4B;AAC5D,wBAAA,iBAAiB,EAAE,sDAAsD;AACzE,wBAAA,wBAAwB,EAAE;AAC1B,qBAAA,EAAA,QAAA,EAAA,oqJAAA,EAAA,MAAA,EAAA,CAAA,4rYAAA,CAAA,EAAA;klBAgC8C,oBAAoB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAGtB,kBAAkB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAGT,2BAA2B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEzGlF;;AAEG;AAEH;;ACJA;;AAEG;;;;"}
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ng-hub-ui-nav",
|
|
3
|
+
"version": "21.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"description": "A flexible, accessible, and customizable navigation component for Angular 21, part of the ng-hub-ui family.",
|
|
6
|
+
"author": "Carlos Morcillo Fernández <carlos.morcillo@me.com>",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/carlos-morcillo/ng-hub-ui-nav.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/carlos-morcillo/ng-hub-ui-nav/issues"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/carlos-morcillo/ng-hub-ui-nav#readme",
|
|
15
|
+
"keywords": [
|
|
16
|
+
"angular",
|
|
17
|
+
"navigation",
|
|
18
|
+
"navbar",
|
|
19
|
+
"sidebar",
|
|
20
|
+
"menu",
|
|
21
|
+
"dropdown",
|
|
22
|
+
"ui-component",
|
|
23
|
+
"angular-library",
|
|
24
|
+
"ng-hub-ui",
|
|
25
|
+
"typescript",
|
|
26
|
+
"signals",
|
|
27
|
+
"angular21"
|
|
28
|
+
],
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"@angular/common": ">=21.0.0",
|
|
31
|
+
"@angular/core": ">=21.0.0",
|
|
32
|
+
"@angular/router": ">=21.0.0",
|
|
33
|
+
"ng-hub-ui-utils": ">=1.0.0"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"tslib": "^2.3.0"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"sideEffects": false,
|
|
42
|
+
"module": "fesm2022/ng-hub-ui-nav.mjs",
|
|
43
|
+
"typings": "types/ng-hub-ui-nav.d.ts",
|
|
44
|
+
"exports": {
|
|
45
|
+
"./package.json": {
|
|
46
|
+
"default": "./package.json"
|
|
47
|
+
},
|
|
48
|
+
".": {
|
|
49
|
+
"types": "./types/ng-hub-ui-nav.d.ts",
|
|
50
|
+
"default": "./fesm2022/ng-hub-ui-nav.mjs"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// ──────────────────────────────────────────────────────
|
|
2
|
+
// hub-nav — Design Tokens
|
|
3
|
+
// References hub-sys / hub-ref tokens from the design system.
|
|
4
|
+
// ──────────────────────────────────────────────────────
|
|
5
|
+
|
|
6
|
+
:root,
|
|
7
|
+
:host {
|
|
8
|
+
// ── Layout ──
|
|
9
|
+
--hub-nav-height: 3.5rem;
|
|
10
|
+
--hub-nav-padding-x: var(--hub-ref-space-3, 1rem);
|
|
11
|
+
--hub-nav-padding-y: var(--hub-ref-space-2, 0.5rem);
|
|
12
|
+
--hub-nav-gap: var(--hub-ref-space-1, 0.25rem);
|
|
13
|
+
--hub-nav-horizontal-padding-y: 0;
|
|
14
|
+
--hub-nav-horizontal-padding-x: 0;
|
|
15
|
+
--hub-nav-horizontal-row-gap: 0;
|
|
16
|
+
--hub-nav-horizontal-items-justify: center;
|
|
17
|
+
--hub-nav-horizontal-items-overflow-x: auto;
|
|
18
|
+
--hub-nav-horizontal-items-overflow-y: hidden;
|
|
19
|
+
--hub-nav-vertical-items-overflow-y: auto;
|
|
20
|
+
--hub-nav-vertical-items-overflow-x: hidden;
|
|
21
|
+
--hub-nav-vertical-panel-padding-inline: var(--hub-ref-space-2, 0.5rem);
|
|
22
|
+
--hub-nav-vertical-panel-padding-block: 0;
|
|
23
|
+
--hub-nav-horizontal-panel-padding-y: var(--hub-ref-space-2, 0.5rem);
|
|
24
|
+
--hub-nav-horizontal-panel-padding-x: 0;
|
|
25
|
+
--hub-nav-scrollbar-width: none;
|
|
26
|
+
--hub-nav-scrollbar-color: transparent transparent;
|
|
27
|
+
--hub-nav-scrollbar-webkit-size: 0;
|
|
28
|
+
--hub-nav-scrollbar-thumb-color: transparent;
|
|
29
|
+
--hub-nav-scrollbar-track-color: transparent;
|
|
30
|
+
--hub-nav-scrollbar-thumb-radius: var(--hub-ref-radius-pill, 999px);
|
|
31
|
+
|
|
32
|
+
// ── Colours ──
|
|
33
|
+
--hub-nav-bg: var(--hub-sys-surface-page, #fff);
|
|
34
|
+
--hub-nav-color: var(--hub-sys-text-primary, #212529);
|
|
35
|
+
--hub-nav-border-color: var(--hub-sys-border-color-default, #dee2e6);
|
|
36
|
+
--hub-nav-border-width: 1px;
|
|
37
|
+
--hub-nav-border-style: solid;
|
|
38
|
+
|
|
39
|
+
// ── Brand ──
|
|
40
|
+
--hub-nav-brand-font-size: var(--hub-ref-font-size-lg, 1.25rem);
|
|
41
|
+
--hub-nav-brand-font-weight: var(--hub-ref-font-weight-semibold, 600);
|
|
42
|
+
--hub-nav-brand-color: var(--hub-sys-text-primary, #212529);
|
|
43
|
+
--hub-nav-brand-padding-x: var(--hub-ref-space-2, 0.5rem);
|
|
44
|
+
|
|
45
|
+
// ── Items ──
|
|
46
|
+
--hub-nav-item-padding-x: var(--hub-ref-space-3, 1rem);
|
|
47
|
+
--hub-nav-item-padding-y: var(--hub-ref-space-2, 0.5rem);
|
|
48
|
+
--hub-nav-item-color: var(--hub-sys-text-primary, #212529);
|
|
49
|
+
--hub-nav-item-font-size: var(--hub-ref-font-size-base, 1rem);
|
|
50
|
+
--hub-nav-item-font-weight: var(--hub-ref-font-weight-normal, 400);
|
|
51
|
+
--hub-nav-item-border-radius: var(--hub-ref-border-radius-sm, 0.25rem);
|
|
52
|
+
--hub-nav-item-transition: var(--hub-sys-transition-fast, 150ms ease);
|
|
53
|
+
|
|
54
|
+
// ── Item Hover ──
|
|
55
|
+
--hub-nav-item-hover-bg: var(--hub-sys-state-hover-overlay, rgba(0, 0, 0, 0.04));
|
|
56
|
+
--hub-nav-item-hover-color: var(--hub-sys-color-primary, #0d6efd);
|
|
57
|
+
|
|
58
|
+
// ── Item Active ──
|
|
59
|
+
--hub-nav-item-active-bg: var(--hub-sys-color-primary, #0d6efd);
|
|
60
|
+
--hub-nav-item-active-color: #fff;
|
|
61
|
+
--hub-nav-item-active-font-weight: var(--hub-ref-font-weight-semibold, 600);
|
|
62
|
+
|
|
63
|
+
// ── Item Disabled ──
|
|
64
|
+
--hub-nav-item-disabled-color: var(--hub-sys-text-muted, #6c757d);
|
|
65
|
+
--hub-nav-item-disabled-opacity: var(--hub-sys-opacity-disabled, 0.65);
|
|
66
|
+
|
|
67
|
+
// ── Dropdown ──
|
|
68
|
+
--hub-nav-dropdown-bg: var(--hub-sys-surface-elevated, #fff);
|
|
69
|
+
--hub-nav-dropdown-color: var(--hub-sys-text-primary, #212529);
|
|
70
|
+
--hub-nav-dropdown-border-color: var(--hub-sys-border-color-default, #dee2e6);
|
|
71
|
+
--hub-nav-dropdown-border-radius: var(--hub-nav-item-border-radius, var(--hub-ref-border-radius-sm, 0.25rem));
|
|
72
|
+
--hub-nav-dropdown-shadow: var(--hub-sys-shadow-md, 0 0.5rem 1rem rgba(0, 0, 0, 0.15));
|
|
73
|
+
--hub-nav-dropdown-padding-y: var(--hub-ref-space-2, 0.5rem);
|
|
74
|
+
--hub-nav-dropdown-min-width: 12rem;
|
|
75
|
+
--hub-nav-dropdown-z-index: var(--hub-sys-z-index-dropdown, 1000);
|
|
76
|
+
|
|
77
|
+
// ── Caret ──
|
|
78
|
+
--hub-nav-caret-size: 0.3rem;
|
|
79
|
+
--hub-nav-caret-color: currentColor;
|
|
80
|
+
|
|
81
|
+
// ── Header (item type) ──
|
|
82
|
+
--hub-nav-header-font-size: var(--hub-ref-font-size-sm, 0.875rem);
|
|
83
|
+
--hub-nav-header-font-weight: var(--hub-ref-font-weight-semibold, 600);
|
|
84
|
+
--hub-nav-header-color: var(--hub-sys-text-muted, #6c757d);
|
|
85
|
+
--hub-nav-header-padding-x: var(--hub-ref-space-3, 1rem);
|
|
86
|
+
--hub-nav-header-padding-y: var(--hub-ref-space-1, 0.25rem);
|
|
87
|
+
--hub-nav-header-margin-top: var(--hub-ref-space-3, 0.75rem);
|
|
88
|
+
--hub-nav-header-margin-inline-start: var(--hub-ref-space-3, 0.75rem);
|
|
89
|
+
--hub-nav-header-horizontal-padding-inline-start: 2rem;
|
|
90
|
+
|
|
91
|
+
// ── Separator ──
|
|
92
|
+
--hub-nav-separator-color: var(--hub-sys-border-color-default, #dee2e6);
|
|
93
|
+
--hub-nav-separator-margin-y: var(--hub-ref-space-2, 0.5rem);
|
|
94
|
+
|
|
95
|
+
// ── Badge ──
|
|
96
|
+
--hub-nav-badge-font-size: var(--hub-ref-font-size-xs, 0.75rem);
|
|
97
|
+
--hub-nav-badge-padding-x: 0.5em;
|
|
98
|
+
--hub-nav-badge-padding-y: 0.25em;
|
|
99
|
+
--hub-nav-badge-bg: var(--hub-sys-color-danger, #dc3545);
|
|
100
|
+
--hub-nav-badge-color: #fff;
|
|
101
|
+
--hub-nav-badge-border-radius: var(--hub-ref-border-radius-pill, 50rem);
|
|
102
|
+
|
|
103
|
+
// ── Toggler (hamburger) ──
|
|
104
|
+
--hub-nav-toggler-padding-x: var(--hub-ref-space-2, 0.5rem);
|
|
105
|
+
--hub-nav-toggler-padding-y: var(--hub-ref-space-1, 0.25rem);
|
|
106
|
+
--hub-nav-toggler-font-size: var(--hub-ref-font-size-lg, 1.25rem);
|
|
107
|
+
--hub-nav-toggler-color: var(--hub-sys-text-primary, #212529);
|
|
108
|
+
--hub-nav-toggler-border-color: var(--hub-sys-border-color-default, #dee2e6);
|
|
109
|
+
--hub-nav-toggler-border-radius: var(--hub-ref-border-radius-sm, 0.25rem);
|
|
110
|
+
|
|
111
|
+
// ── Mobile Panel ──
|
|
112
|
+
--hub-nav-mobile-bg: var(--hub-sys-surface-page, #fff);
|
|
113
|
+
--hub-nav-mobile-color: var(--hub-sys-text-primary, #212529);
|
|
114
|
+
--hub-nav-mobile-width: 18rem;
|
|
115
|
+
--hub-nav-mobile-z-index: var(--hub-sys-z-index-fixed, 1030);
|
|
116
|
+
--hub-nav-mobile-backdrop-bg: rgba(0, 0, 0, 0.5);
|
|
117
|
+
--hub-nav-mobile-transition: var(--hub-sys-transition-base, 300ms ease);
|
|
118
|
+
|
|
119
|
+
// ── Accordion mode (vertical expand) ──
|
|
120
|
+
--hub-nav-accordion-indent: var(--hub-ref-space-3, 1rem);
|
|
121
|
+
--hub-nav-accordion-transition: var(--hub-sys-transition-collapse, 350ms ease);
|
|
122
|
+
|
|
123
|
+
// ── Icon ──
|
|
124
|
+
--hub-nav-icon-size: var(--hub-ref-icon-size, 1.25rem);
|
|
125
|
+
--hub-nav-icon-gap: var(--hub-ref-space-2, 0.5rem);
|
|
126
|
+
|
|
127
|
+
// ── Panel mode (stacked side panels) ──
|
|
128
|
+
--hub-nav-panel-width: 16rem;
|
|
129
|
+
--hub-nav-panel-bg: var(--hub-sys-surface-elevated, #fff);
|
|
130
|
+
--hub-nav-panel-color: var(--hub-sys-text-primary, #212529);
|
|
131
|
+
--hub-nav-panel-border-color: var(--hub-sys-border-color-default, #dee2e6);
|
|
132
|
+
--hub-nav-panel-border-width: 1px;
|
|
133
|
+
--hub-nav-panel-shadow: var(--hub-sys-shadow-sm, 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075));
|
|
134
|
+
--hub-nav-panel-z-index: var(--hub-sys-z-index-dropdown, 1000);
|
|
135
|
+
--hub-nav-panel-transition: transform var(--hub-sys-transition-base, 300ms ease);
|
|
136
|
+
|
|
137
|
+
// ── Panel header ──
|
|
138
|
+
--hub-nav-panel-header-height: 3rem;
|
|
139
|
+
--hub-nav-panel-header-bg: var(--hub-sys-surface-page, #fff);
|
|
140
|
+
--hub-nav-panel-header-border-color: var(--hub-sys-border-color-default, #dee2e6);
|
|
141
|
+
--hub-nav-panel-header-font-size: var(--hub-ref-font-size-sm, 0.875rem);
|
|
142
|
+
--hub-nav-panel-header-font-weight: var(--hub-ref-font-weight-semibold, 600);
|
|
143
|
+
--hub-nav-panel-header-padding-x: var(--hub-ref-space-3, 1rem);
|
|
144
|
+
|
|
145
|
+
// ── Panel back button ──
|
|
146
|
+
--hub-nav-panel-back-color: var(--hub-sys-text-primary, #212529);
|
|
147
|
+
--hub-nav-panel-back-hover-bg: var(--hub-sys-state-hover-overlay, rgba(0, 0, 0, 0.04));
|
|
148
|
+
--hub-nav-panel-back-size: 2rem;
|
|
149
|
+
}
|