ng-hub-ui-nav 22.7.0 → 22.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1575,7 +1575,7 @@ class HubNavItemListComponent {
1575
1575
  return document.querySelector(`hub-nav-item[data-item-id="${escapedId}"] .hub-nav-item__dropdown-toggle, hub-nav-item[data-item-id="${escapedId}"] .hub-nav-item__link`);
1576
1576
  }
1577
1577
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: HubNavItemListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1578
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: HubNavItemListComponent, isStandalone: true, selector: "hub-nav-item-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, depth: { classPropertyName: "depth", publicName: "depth", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, forceAccordionMode: { classPropertyName: "forceAccordionMode", publicName: "forceAccordionMode", isSignal: true, isRequired: false, transformFunction: null }, dropdownRenderMode: { classPropertyName: "dropdownRenderMode", publicName: "dropdownRenderMode", isSignal: true, isRequired: false, transformFunction: null }, overlayOwnerClass: { classPropertyName: "overlayOwnerClass", publicName: "overlayOwnerClass", isSignal: true, isRequired: false, transformFunction: null }, overlayOrientationClass: { classPropertyName: "overlayOrientationClass", publicName: "overlayOrientationClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", dropdownToggle: "dropdownToggle", panelOpen: "panelOpen" }, host: { listeners: { "keydown": "onKeyDown($event)" }, properties: { "class.hub-nav-item-list--force-accordion": "forceAccordionMode()", "attr.role": "depth() === 0 ? \"menubar\" : \"menu\"" }, classAttribute: "hub-nav-item-list" }, viewQueries: [{ propertyName: "itemWrappers", predicate: ["itemWrapper"], descendants: true, isSignal: true }, { propertyName: "overlayTemplates", predicate: ["overlayDropdownTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "@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\t#itemWrapper\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<ng-template #overlayDropdownTemplate>\n\t\t\t\t<div class=\"hub-nav-dropdown\" role=\"menu\">\n\t\t\t\t\t<hub-nav-item-list\n\t\t\t\t\t\t[items]=\"item.children ?? []\"\n\t\t\t\t\t\t[depth]=\"depth() + 1\"\n\t\t\t\t\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t\t\t\t\t[forceAccordionMode]=\"forceAccordionMode()\"\n\t\t\t\t\t\t[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\n\t\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t\t(dropdownToggle)=\"dropdownToggle.emit($event)\"\n\t\t\t\t\t\t(panelOpen)=\"panelOpen.emit($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</ng-template>\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' && !shouldRenderDropdownInOverlay(item)) {\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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", styles: [":host{display:flex;flex-direction:column;gap:var(--hub-nav-gap, .25rem);list-style:none;margin:0;padding:0}.hub-nav-item-wrapper{position:relative}.hub-nav-dropdown{position:absolute;z-index:var(--hub-nav-dropdown-zindex, 1000);min-width:var(--hub-nav-dropdown-min-width, 12rem);background-color:var(--hub-nav-dropdown-bg, #fff);color:var(--hub-nav-dropdown-color, #212529);border:var(--hub-nav-border-width, 1px) var(--hub-nav-border-style, solid) var(--hub-nav-dropdown-border-color, #dee2e6);border-radius:var(--hub-nav-dropdown-border-radius, .25rem);box-shadow:var(--hub-nav-dropdown-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));padding:var(--hub-nav-dropdown-padding-y, .5rem) 0}.hub-nav-accordion{overflow:hidden;animation:hubNavAccordionExpand var(--hub-nav-accordion-transition, .35s ease) forwards}@keyframes hubNavAccordionExpand{0%{max-height:0;opacity:0}to{max-height:100vh;opacity:1}}:host-context(.hub-nav--horizontal){flex-direction:row;align-items:center}:host-context(.hub-nav--horizontal)>.hub-nav-item-wrapper{flex:0 0 auto}:host-context(.hub-nav--horizontal) .hub-nav-item-wrapper>.hub-nav-dropdown{top:100%;left:0;margin-top:4px}:host-context(.hub-nav--horizontal) .hub-nav-dropdown .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-top:0;margin-left:4px}:host-context(.hub-nav--vertical) .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-left:4px}:host-context(.hub-nav--vertical) .hub-nav-dropdown .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-left:4px;margin-top:0}:host-context(.hub-nav-dropdown){flex-direction:column;align-items:stretch}:host-context(.hub-nav-accordion){flex-direction:column;align-items:stretch}:host(.hub-nav-item-list--force-accordion){width:100%;flex-direction:column;align-items:stretch;gap:var(--hub-nav-mobile-accordion-gap, .25rem)}:host(.hub-nav-item-list--force-accordion)>.hub-nav-item-wrapper{display:block;width:100%;flex:1 1 auto}:host(.hub-nav-item-list--force-accordion) .hub-nav-item-wrapper>.hub-nav-dropdown{position:static;top:auto;left:auto;margin:0;min-width:0;width:100%;box-shadow:none}:host(.hub-nav-item-list--force-accordion) .hub-nav-accordion{margin-block-start:var(--hub-nav-mobile-accordion-nested-spacing, .25rem)}@media(prefers-reduced-motion:reduce){.hub-nav-accordion{animation:none}}\n"], dependencies: [{ kind: "component", type: HubNavItemListComponent, selector: "hub-nav-item-list", inputs: ["items", "depth", "itemTemplate", "forceAccordionMode", "dropdownRenderMode", "overlayOwnerClass", "overlayOrientationClass"], outputs: ["itemClick", "dropdownToggle", "panelOpen"] }, { kind: "component", type: HubNavItemComponent, selector: "hub-nav-item", inputs: ["item", "depth", "isActive", "isExpanded", "itemTemplate", "forceAccordionMode"], outputs: ["clicked", "toggleDropdown"] }, { kind: "component", type: HubNavSeparatorComponent, selector: "hub-nav-separator" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1578
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: HubNavItemListComponent, isStandalone: true, selector: "hub-nav-item-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, depth: { classPropertyName: "depth", publicName: "depth", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, forceAccordionMode: { classPropertyName: "forceAccordionMode", publicName: "forceAccordionMode", isSignal: true, isRequired: false, transformFunction: null }, dropdownRenderMode: { classPropertyName: "dropdownRenderMode", publicName: "dropdownRenderMode", isSignal: true, isRequired: false, transformFunction: null }, overlayOwnerClass: { classPropertyName: "overlayOwnerClass", publicName: "overlayOwnerClass", isSignal: true, isRequired: false, transformFunction: null }, overlayOrientationClass: { classPropertyName: "overlayOrientationClass", publicName: "overlayOrientationClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", dropdownToggle: "dropdownToggle", panelOpen: "panelOpen" }, host: { listeners: { "keydown": "onKeyDown($event)" }, properties: { "class.hub-nav-item-list--force-accordion": "forceAccordionMode()", "attr.role": "depth() === 0 ? \"menubar\" : \"menu\"", "attr.aria-orientation": "depth() === 0 ? (state.orientation() === \"vertical\" ? \"vertical\" : \"horizontal\") : \"vertical\"" }, classAttribute: "hub-nav-item-list" }, viewQueries: [{ propertyName: "itemWrappers", predicate: ["itemWrapper"], descendants: true, isSignal: true }, { propertyName: "overlayTemplates", predicate: ["overlayDropdownTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "@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\t#itemWrapper\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<ng-template #overlayDropdownTemplate>\n\t\t\t\t<div class=\"hub-nav-dropdown\" role=\"menu\" aria-orientation=\"vertical\">\n\t\t\t\t\t<hub-nav-item-list\n\t\t\t\t\t\t[items]=\"item.children ?? []\"\n\t\t\t\t\t\t[depth]=\"depth() + 1\"\n\t\t\t\t\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t\t\t\t\t[forceAccordionMode]=\"forceAccordionMode()\"\n\t\t\t\t\t\t[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\n\t\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t\t(dropdownToggle)=\"dropdownToggle.emit($event)\"\n\t\t\t\t\t\t(panelOpen)=\"panelOpen.emit($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</ng-template>\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' && !shouldRenderDropdownInOverlay(item)) {\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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\" aria-orientation=\"vertical\">\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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", styles: [":host{display:flex;flex-direction:column;gap:var(--hub-nav-gap, .25rem);list-style:none;margin:0;padding:0}.hub-nav-item-wrapper{position:relative}.hub-nav-dropdown{position:absolute;z-index:var(--hub-nav-dropdown-zindex, 1000);min-width:var(--hub-nav-dropdown-min-width, 12rem);background-color:var(--hub-nav-dropdown-bg, #fff);color:var(--hub-nav-dropdown-color, #212529);border:var(--hub-nav-border-width, 1px) var(--hub-nav-border-style, solid) var(--hub-nav-dropdown-border-color, #dee2e6);border-radius:var(--hub-nav-dropdown-border-radius, .25rem);box-shadow:var(--hub-nav-dropdown-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));padding:var(--hub-nav-dropdown-padding-y, .5rem) 0}.hub-nav-accordion{overflow:hidden;animation:hubNavAccordionExpand var(--hub-nav-accordion-transition, .35s ease) forwards}@keyframes hubNavAccordionExpand{0%{max-height:0;opacity:0}to{max-height:100vh;opacity:1}}:host-context(.hub-nav--horizontal){flex-direction:row;align-items:center}:host-context(.hub-nav--horizontal)>.hub-nav-item-wrapper{flex:0 0 auto}:host-context(.hub-nav--horizontal) .hub-nav-item-wrapper>.hub-nav-dropdown{top:100%;left:0;margin-top:4px}:host-context(.hub-nav--horizontal) .hub-nav-dropdown .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-top:0;margin-left:4px}:host-context(.hub-nav--vertical) .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-left:4px}:host-context(.hub-nav--vertical) .hub-nav-dropdown .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-left:4px;margin-top:0}:host-context(.hub-nav-dropdown){flex-direction:column;align-items:stretch}:host-context(.hub-nav-accordion){flex-direction:column;align-items:stretch}:host(.hub-nav-item-list--force-accordion){width:100%;flex-direction:column;align-items:stretch;gap:var(--hub-nav-mobile-accordion-gap, .25rem)}:host(.hub-nav-item-list--force-accordion)>.hub-nav-item-wrapper{display:block;width:100%;flex:1 1 auto}:host(.hub-nav-item-list--force-accordion) .hub-nav-item-wrapper>.hub-nav-dropdown{position:static;top:auto;left:auto;margin:0;min-width:0;width:100%;box-shadow:none}:host(.hub-nav-item-list--force-accordion) .hub-nav-accordion{margin-block-start:var(--hub-nav-mobile-accordion-nested-spacing, .25rem)}@media(prefers-reduced-motion:reduce){.hub-nav-accordion{animation:none}}\n"], dependencies: [{ kind: "component", type: HubNavItemListComponent, selector: "hub-nav-item-list", inputs: ["items", "depth", "itemTemplate", "forceAccordionMode", "dropdownRenderMode", "overlayOwnerClass", "overlayOrientationClass"], outputs: ["itemClick", "dropdownToggle", "panelOpen"] }, { kind: "component", type: HubNavItemComponent, selector: "hub-nav-item", inputs: ["item", "depth", "isActive", "isExpanded", "itemTemplate", "forceAccordionMode"], outputs: ["clicked", "toggleDropdown"] }, { kind: "component", type: HubNavSeparatorComponent, selector: "hub-nav-separator" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1579
1579
  }
1580
1580
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: HubNavItemListComponent, decorators: [{
1581
1581
  type: Component,
@@ -1583,8 +1583,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
1583
1583
  class: 'hub-nav-item-list',
1584
1584
  '[class.hub-nav-item-list--force-accordion]': 'forceAccordionMode()',
1585
1585
  '[attr.role]': 'depth() === 0 ? "menubar" : "menu"',
1586
+ // menubar defaults to horizontal per WAI-ARIA; a vertical sidebar must say so.
1587
+ // Submenus (depth > 0) always stack vertically.
1588
+ '[attr.aria-orientation]': 'depth() === 0 ? (state.orientation() === "vertical" ? "vertical" : "horizontal") : "vertical"',
1586
1589
  '(keydown)': 'onKeyDown($event)'
1587
- }, template: "@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\t#itemWrapper\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<ng-template #overlayDropdownTemplate>\n\t\t\t\t<div class=\"hub-nav-dropdown\" role=\"menu\">\n\t\t\t\t\t<hub-nav-item-list\n\t\t\t\t\t\t[items]=\"item.children ?? []\"\n\t\t\t\t\t\t[depth]=\"depth() + 1\"\n\t\t\t\t\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t\t\t\t\t[forceAccordionMode]=\"forceAccordionMode()\"\n\t\t\t\t\t\t[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\n\t\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t\t(dropdownToggle)=\"dropdownToggle.emit($event)\"\n\t\t\t\t\t\t(panelOpen)=\"panelOpen.emit($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</ng-template>\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' && !shouldRenderDropdownInOverlay(item)) {\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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", styles: [":host{display:flex;flex-direction:column;gap:var(--hub-nav-gap, .25rem);list-style:none;margin:0;padding:0}.hub-nav-item-wrapper{position:relative}.hub-nav-dropdown{position:absolute;z-index:var(--hub-nav-dropdown-zindex, 1000);min-width:var(--hub-nav-dropdown-min-width, 12rem);background-color:var(--hub-nav-dropdown-bg, #fff);color:var(--hub-nav-dropdown-color, #212529);border:var(--hub-nav-border-width, 1px) var(--hub-nav-border-style, solid) var(--hub-nav-dropdown-border-color, #dee2e6);border-radius:var(--hub-nav-dropdown-border-radius, .25rem);box-shadow:var(--hub-nav-dropdown-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));padding:var(--hub-nav-dropdown-padding-y, .5rem) 0}.hub-nav-accordion{overflow:hidden;animation:hubNavAccordionExpand var(--hub-nav-accordion-transition, .35s ease) forwards}@keyframes hubNavAccordionExpand{0%{max-height:0;opacity:0}to{max-height:100vh;opacity:1}}:host-context(.hub-nav--horizontal){flex-direction:row;align-items:center}:host-context(.hub-nav--horizontal)>.hub-nav-item-wrapper{flex:0 0 auto}:host-context(.hub-nav--horizontal) .hub-nav-item-wrapper>.hub-nav-dropdown{top:100%;left:0;margin-top:4px}:host-context(.hub-nav--horizontal) .hub-nav-dropdown .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-top:0;margin-left:4px}:host-context(.hub-nav--vertical) .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-left:4px}:host-context(.hub-nav--vertical) .hub-nav-dropdown .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-left:4px;margin-top:0}:host-context(.hub-nav-dropdown){flex-direction:column;align-items:stretch}:host-context(.hub-nav-accordion){flex-direction:column;align-items:stretch}:host(.hub-nav-item-list--force-accordion){width:100%;flex-direction:column;align-items:stretch;gap:var(--hub-nav-mobile-accordion-gap, .25rem)}:host(.hub-nav-item-list--force-accordion)>.hub-nav-item-wrapper{display:block;width:100%;flex:1 1 auto}:host(.hub-nav-item-list--force-accordion) .hub-nav-item-wrapper>.hub-nav-dropdown{position:static;top:auto;left:auto;margin:0;min-width:0;width:100%;box-shadow:none}:host(.hub-nav-item-list--force-accordion) .hub-nav-accordion{margin-block-start:var(--hub-nav-mobile-accordion-nested-spacing, .25rem)}@media(prefers-reduced-motion:reduce){.hub-nav-accordion{animation:none}}\n"] }]
1590
+ }, template: "@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\t#itemWrapper\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<ng-template #overlayDropdownTemplate>\n\t\t\t\t<div class=\"hub-nav-dropdown\" role=\"menu\" aria-orientation=\"vertical\">\n\t\t\t\t\t<hub-nav-item-list\n\t\t\t\t\t\t[items]=\"item.children ?? []\"\n\t\t\t\t\t\t[depth]=\"depth() + 1\"\n\t\t\t\t\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t\t\t\t\t[forceAccordionMode]=\"forceAccordionMode()\"\n\t\t\t\t\t\t[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\n\t\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t\t(dropdownToggle)=\"dropdownToggle.emit($event)\"\n\t\t\t\t\t\t(panelOpen)=\"panelOpen.emit($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</ng-template>\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' && !shouldRenderDropdownInOverlay(item)) {\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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\" aria-orientation=\"vertical\">\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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", styles: [":host{display:flex;flex-direction:column;gap:var(--hub-nav-gap, .25rem);list-style:none;margin:0;padding:0}.hub-nav-item-wrapper{position:relative}.hub-nav-dropdown{position:absolute;z-index:var(--hub-nav-dropdown-zindex, 1000);min-width:var(--hub-nav-dropdown-min-width, 12rem);background-color:var(--hub-nav-dropdown-bg, #fff);color:var(--hub-nav-dropdown-color, #212529);border:var(--hub-nav-border-width, 1px) var(--hub-nav-border-style, solid) var(--hub-nav-dropdown-border-color, #dee2e6);border-radius:var(--hub-nav-dropdown-border-radius, .25rem);box-shadow:var(--hub-nav-dropdown-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));padding:var(--hub-nav-dropdown-padding-y, .5rem) 0}.hub-nav-accordion{overflow:hidden;animation:hubNavAccordionExpand var(--hub-nav-accordion-transition, .35s ease) forwards}@keyframes hubNavAccordionExpand{0%{max-height:0;opacity:0}to{max-height:100vh;opacity:1}}:host-context(.hub-nav--horizontal){flex-direction:row;align-items:center}:host-context(.hub-nav--horizontal)>.hub-nav-item-wrapper{flex:0 0 auto}:host-context(.hub-nav--horizontal) .hub-nav-item-wrapper>.hub-nav-dropdown{top:100%;left:0;margin-top:4px}:host-context(.hub-nav--horizontal) .hub-nav-dropdown .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-top:0;margin-left:4px}:host-context(.hub-nav--vertical) .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-left:4px}:host-context(.hub-nav--vertical) .hub-nav-dropdown .hub-nav-item-wrapper>.hub-nav-dropdown{top:0;left:100%;margin-left:4px;margin-top:0}:host-context(.hub-nav-dropdown){flex-direction:column;align-items:stretch}:host-context(.hub-nav-accordion){flex-direction:column;align-items:stretch}:host(.hub-nav-item-list--force-accordion){width:100%;flex-direction:column;align-items:stretch;gap:var(--hub-nav-mobile-accordion-gap, .25rem)}:host(.hub-nav-item-list--force-accordion)>.hub-nav-item-wrapper{display:block;width:100%;flex:1 1 auto}:host(.hub-nav-item-list--force-accordion) .hub-nav-item-wrapper>.hub-nav-dropdown{position:static;top:auto;left:auto;margin:0;min-width:0;width:100%;box-shadow:none}:host(.hub-nav-item-list--force-accordion) .hub-nav-accordion{margin-block-start:var(--hub-nav-mobile-accordion-nested-spacing, .25rem)}@media(prefers-reduced-motion:reduce){.hub-nav-accordion{animation:none}}\n"] }]
1588
1591
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], depth: [{ type: i0.Input, args: [{ isSignal: true, alias: "depth", required: false }] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }], forceAccordionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "forceAccordionMode", required: false }] }], dropdownRenderMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownRenderMode", required: false }] }], overlayOwnerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayOwnerClass", required: false }] }], overlayOrientationClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayOrientationClass", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], dropdownToggle: [{ type: i0.Output, args: ["dropdownToggle"] }], panelOpen: [{ type: i0.Output, args: ["panelOpen"] }], itemWrappers: [{ type: i0.ViewChildren, args: ['itemWrapper', { isSignal: true }] }], overlayTemplates: [{ type: i0.ViewChildren, args: ['overlayDropdownTemplate', { isSignal: true }] }] } });
1589
1592
 
1590
1593
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ng-hub-ui-nav.mjs","sources":["../../../projects/nav/src/services/nav-config.service.ts","../../../projects/nav/src/services/nav-state.service.ts","../../../projects/nav/src/directives/nav-end.directive.ts","../../../projects/nav/src/directives/nav-item-template.directive.ts","../../../projects/nav/src/directives/nav-scroll-spy-section.directive.ts","../../../projects/nav/src/directives/nav-scroll-spy.directive.ts","../../../projects/nav/src/directives/nav-start.directive.ts","../../../projects/nav/src/components/nav-item/nav-item.component.ts","../../../projects/nav/src/components/nav-item/nav-item.component.html","../../../projects/nav/src/components/nav-separator/nav-separator.component.ts","../../../projects/nav/src/components/nav-item-list/nav-item-list.component.ts","../../../projects/nav/src/components/nav-item-list/nav-item-list.component.html","../../../projects/nav/src/components/nav-panel/nav-panel.component.ts","../../../projects/nav/src/components/nav-panel/nav-panel.component.html","../../../projects/nav/src/components/nav-panel-container/nav-panel-container.component.ts","../../../projects/nav/src/components/nav-panel-container/nav-panel-container.component.html","../../../projects/nav/src/components/nav-toggler/nav-toggler.component.ts","../../../projects/nav/src/components/nav-mobile-panel/nav-mobile-panel.component.ts","../../../projects/nav/src/components/nav-mobile-panel/nav-mobile-panel.component.html","../../../projects/nav/src/components/nav/nav.component.ts","../../../projects/nav/src/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\tdropdownRenderMode: 'inline'\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\tdropdownRenderMode: 'inline'\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, parentLabel: panel.parentItem.label }\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: { ...p.parentItem, label: previous.parentLabel },\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 { 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 { 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 { isPlatformBrowser } from '@angular/common';\nimport {\n\tAfterViewInit,\n\tDirective,\n\tElementRef,\n\tNgZone,\n\tOnDestroy,\n\tPLATFORM_ID,\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\t/** Section tracking relies on browser-only APIs (rAF, IntersectionObserver); inert on the server. */\n\tprivate readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\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\tif (!this.isBrowser) {\n\t\t\treturn;\n\t\t}\n\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, 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 { Component, ChangeDetectionStrategy, input, output, inject, computed, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { HubOverflowTooltipDirective } from 'ng-hub-ui-utils';\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, HubOverflowTooltipDirective],\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\t// In panel mode there is no dedicated caret, so the label click must\n\t\t// also request the child panel opening while preserving the route click.\n\t\tif (this.hasChildren() && !this.showCaret()) {\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 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\" [hubOverflowTooltip]=\"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\" [hubOverflowTooltip]=\"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\" [hubOverflowTooltip]=\"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\" [hubOverflowTooltip]=\"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\tOnDestroy,\n\tOnInit,\n\tsignal,\n\tTemplateRef,\n\tViewContainerRef,\n\teffect,\n\tviewChildren\n} from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { Subscription, filter } from 'rxjs';\nimport { HubNavItem } from '../../models/nav-item.model';\nimport { HubNavDropdownRenderMode, 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';\nimport { OverlayRef, OverlayService } from 'ng-hub-ui-utils';\n\ntype HubNavOverlayPlacement = 'root-dropdown' | 'flyout';\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\t'(keydown)': 'onKeyDown($event)'\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/** Dropdown rendering mode used by non-panel submenus. */\n\treadonly dropdownRenderMode = input<HubNavDropdownRenderMode>('inline');\n\n\t/** Unique owner class used to mark overlay dropdowns for outside-click handling. */\n\treadonly overlayOwnerClass = input<string>('');\n\n\t/** Orientation class forwarded to overlay dropdowns so host-context styles still apply. */\n\treadonly overlayOrientationClass = input<'hub-nav--horizontal' | 'hub-nav--vertical'>('hub-nav--horizontal');\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/** Overlay service used to render flyout dropdowns outside clipping containers. */\n\tprivate readonly overlayService = inject(OverlayService);\n\n\t/** View container required to attach dropdown templates into overlays. */\n\tprivate readonly viewContainerRef = inject(ViewContainerRef);\n\n\t/** Wrapper elements that act as overlay origins for each rendered item. */\n\tprivate readonly itemWrappers = viewChildren<ElementRef<HTMLElement>>('itemWrapper');\n\n\t/** Dropdown templates available for overlay rendering. */\n\tprivate readonly overlayTemplates = viewChildren<TemplateRef<unknown>>('overlayDropdownTemplate');\n\n\t/** Active overlay instances keyed by nav item id. */\n\tprivate readonly overlayRefs = new Map<string, OverlayRef>();\n\n\t/** Keeps track of the latest overlay origin per item. */\n\tprivate readonly overlayOrigins = new Map<string, HTMLElement>();\n\n\t/** Keeps track of the latest overlay template per item. */\n\tprivate readonly overlayTemplateRefs = new Map<string, TemplateRef<unknown>>();\n\n\t/** Keeps track of the latest placement used per item. */\n\tprivate readonly overlayPlacements = new Map<string, HubNavOverlayPlacement>();\n\n\t/** Repositions every open overlay when the viewport changes. */\n\tprivate readonly overlayViewportListener = () => this.updateOverlayPositions();\n\n\t/** Whether global overlay viewport listeners are currently bound. */\n\tprivate overlayViewportListenersBound = false;\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/** Keeps overlay dropdowns synchronized with the nav open state and rendered item tree. */\n\tprivate readonly overlaySyncEffect = effect(() => {\n\t\tconst renderableItems = this.items().filter((item) => item.type !== 'separator');\n\t\tconst itemWrappers = this.itemWrappers();\n\t\tconst overlayTemplates = this.overlayTemplates();\n\t\tconst openOverlayIds = new Set<string>();\n\n\t\trenderableItems.forEach((item, index) => {\n\t\t\tif (!this.hasChildren(item) || !this.isExpanded(item) || !this.shouldRenderDropdownInOverlay(item)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst origin = itemWrappers[index]?.nativeElement;\n\t\t\tconst template = overlayTemplates[index];\n\t\t\tif (!origin || !template) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst placement = this.getOverlayPlacement();\n\t\t\topenOverlayIds.add(item.id);\n\t\t\tthis.attachOrUpdateOverlay(item.id, origin, template, placement);\n\t\t});\n\n\t\tthis.disposeInactiveOverlays(openOverlayIds);\n\t\tthis.syncOverlayViewportListeners();\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\tthis.disposeAllOverlays();\n\t\tthis.removeOverlayViewportListeners();\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 * Whether the item's non-panel submenu should render through the overlay system.\n\t *\n\t * Overlay rendering is intentionally limited to click-triggered menus because\n\t * hover-triggered overlays require pointer hand-off between separate DOM trees.\n\t *\n\t * @param item - The nav item being rendered.\n\t * @returns `true` when the submenu should render in an overlay container.\n\t */\n\tshouldRenderDropdownInOverlay(item: HubNavItem): boolean {\n\t\tif (this.forceAccordionMode()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.dropdownRenderMode() !== 'overlay') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.state.dropdownTrigger() !== 'click') {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst mode = this.getItemExpandMode(item);\n\t\treturn mode === 'flyout';\n\t}\n\n\t/**\n\t * Resolves the overlay placement to use for a submenu.\n\t *\n\t * @returns Placement variant for the overlay dropdown.\n\t */\n\tgetOverlayPlacement(): HubNavOverlayPlacement {\n\t\treturn this.state.orientation() === 'horizontal' && this.depth() === 0 ? 'root-dropdown' : 'flyout';\n\t}\n\n\t/**\n\t * Creates or updates the overlay used to render a dropdown submenu.\n\t *\n\t * @param itemId - Owner item id.\n\t * @param origin - Trigger element used for connected positioning.\n\t * @param template - Dropdown content template.\n\t * @param placement - Preferred overlay placement.\n\t */\n\tprivate attachOrUpdateOverlay(\n\t\titemId: string,\n\t\torigin: HTMLElement,\n\t\ttemplate: TemplateRef<unknown>,\n\t\tplacement: HubNavOverlayPlacement\n\t): void {\n\t\tconst existingOverlay = this.overlayRefs.get(itemId);\n\t\tconst existingOrigin = this.overlayOrigins.get(itemId);\n\t\tconst existingTemplate = this.overlayTemplateRefs.get(itemId);\n\t\tconst existingPlacement = this.overlayPlacements.get(itemId);\n\n\t\tif (\n\t\t\texistingOverlay &&\n\t\t\texistingOrigin === origin &&\n\t\t\texistingTemplate === template &&\n\t\t\texistingPlacement === placement\n\t\t) {\n\t\t\texistingOverlay.updatePosition();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.disposeOverlay(itemId);\n\n\t\tconst overlayRef = this.overlayService.create({\n\t\t\thasBackdrop: false,\n\t\t\tpanelClass: this.getOverlayClasses(),\n\t\t\tpositionStrategy: this.buildOverlayPositionStrategy(origin, placement)\n\t\t});\n\n\t\tconst overlayContent = overlayRef.attach(template, this.viewContainerRef);\n\t\toverlayContent.dataset['hubNavOverlayParentId'] = itemId;\n\n\t\tthis.overlayRefs.set(itemId, overlayRef);\n\t\tthis.overlayOrigins.set(itemId, origin);\n\t\tthis.overlayTemplateRefs.set(itemId, template);\n\t\tthis.overlayPlacements.set(itemId, placement);\n\t}\n\n\t/**\n\t * Rebuilds the position strategy for a connected dropdown overlay.\n\t *\n\t * @param origin - Trigger element used as anchor.\n\t * @param placement - Preferred overlay placement.\n\t * @returns Configured connected position strategy.\n\t */\n\tprivate buildOverlayPositionStrategy(origin: HTMLElement, placement: HubNavOverlayPlacement) {\n\t\tconst positionBuilder = this.overlayService.position().flexibleConnectedTo(origin);\n\n\t\tif (placement === 'root-dropdown') {\n\t\t\treturn positionBuilder.withPositions([\n\t\t\t\t{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n\t\t\t\t{ originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n\t\t\t\t{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 }\n\t\t\t]);\n\t\t}\n\n\t\treturn positionBuilder.withPositions([\n\t\t\t{ originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: 4 },\n\t\t\t{ originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -4 },\n\t\t\t{ originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: 4 }\n\t\t]);\n\t}\n\n\t/**\n\t * Resolves the CSS classes applied to overlay dropdown containers.\n\t *\n\t * @returns Panel class list for overlay containers.\n\t */\n\tprivate getOverlayClasses(): string[] {\n\t\treturn ['hub-nav-overlay-container', this.overlayOwnerClass(), this.overlayOrientationClass()];\n\t}\n\n\t/**\n\t * Disposes overlays that are no longer represented in the open dropdown state.\n\t *\n\t * @param activeOverlayIds - Set of overlay owner ids that should remain mounted.\n\t */\n\tprivate disposeInactiveOverlays(activeOverlayIds: Set<string>): void {\n\t\tfor (const itemId of this.overlayRefs.keys()) {\n\t\t\tif (!activeOverlayIds.has(itemId)) {\n\t\t\t\tthis.disposeOverlay(itemId);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Disposes a single overlay and clears its bookkeeping entries.\n\t *\n\t * @param itemId - Owner item id.\n\t */\n\tprivate disposeOverlay(itemId: string): void {\n\t\tthis.overlayRefs.get(itemId)?.dispose();\n\t\tthis.overlayRefs.delete(itemId);\n\t\tthis.overlayOrigins.delete(itemId);\n\t\tthis.overlayTemplateRefs.delete(itemId);\n\t\tthis.overlayPlacements.delete(itemId);\n\t}\n\n\t/**\n\t * Disposes every active overlay owned by this item list instance.\n\t */\n\tprivate disposeAllOverlays(): void {\n\t\tfor (const itemId of [...this.overlayRefs.keys()]) {\n\t\t\tthis.disposeOverlay(itemId);\n\t\t}\n\t}\n\n\t/**\n\t * Updates the connected position of all mounted overlays.\n\t */\n\tprivate updateOverlayPositions(): void {\n\t\tfor (const overlayRef of this.overlayRefs.values()) {\n\t\t\toverlayRef.updatePosition();\n\t\t}\n\t}\n\n\t/**\n\t * Binds or unbinds global viewport listeners depending on overlay activity.\n\t */\n\tprivate syncOverlayViewportListeners(): void {\n\t\tif (this.overlayRefs.size > 0) {\n\t\t\tthis.ensureOverlayViewportListeners();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.removeOverlayViewportListeners();\n\t}\n\n\t/**\n\t * Attaches viewport listeners used to keep overlays positioned.\n\t */\n\tprivate ensureOverlayViewportListeners(): void {\n\t\tif (this.overlayViewportListenersBound) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.addEventListener('resize', this.overlayViewportListener, { passive: true });\n\t\twindow.addEventListener('scroll', this.overlayViewportListener, true);\n\t\tthis.overlayViewportListenersBound = true;\n\t}\n\n\t/**\n\t * Removes viewport listeners attached for overlay positioning.\n\t */\n\tprivate removeOverlayViewportListeners(): void {\n\t\tif (!this.overlayViewportListenersBound) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.removeEventListener('resize', this.overlayViewportListener);\n\t\twindow.removeEventListener('scroll', this.overlayViewportListener, true);\n\t\tthis.overlayViewportListenersBound = false;\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\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 trigger = this.findParentTrigger();\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 = this.findSubmenuElement(itemId, wrapper);\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\t/**\n\t * Finds the rendered submenu element for the given item.\n\t *\n\t * Inline dropdowns live inside the current wrapper while overlay dropdowns\n\t * are rendered into `document.body` and must be found by owner item id.\n\t *\n\t * @param itemId - Parent item id that owns the submenu.\n\t * @param wrapper - Optional inline wrapper element that may contain the submenu.\n\t * @returns The submenu container when it exists.\n\t */\n\tprivate findSubmenuElement(itemId: string, wrapper: Element | null): HTMLElement | null {\n\t\tconst inlineSubmenu = wrapper?.querySelector('.hub-nav-dropdown, .hub-nav-accordion') as HTMLElement | null;\n\t\tif (inlineSubmenu) {\n\t\t\treturn inlineSubmenu;\n\t\t}\n\n\t\tconst escapedId = CSS.escape(itemId);\n\t\treturn document.querySelector(\n\t\t\t`.hub-nav-overlay-container [data-hub-nav-overlay-parent-id=\"${escapedId}\"]`\n\t\t) as HTMLElement | null;\n\t}\n\n\t/**\n\t * Resolves the trigger element that opened the current submenu.\n\t *\n\t * For inline submenus, the parent wrapper is still available through DOM\n\t * ancestry. Overlay-rendered submenus need to recover the owner item id from\n\t * the overlay content element instead.\n\t *\n\t * @returns The trigger element that should receive focus on Escape.\n\t */\n\tprivate findParentTrigger(): HTMLElement | null {\n\t\tconst host = this.el.nativeElement as HTMLElement;\n\t\tconst parentWrapper = host.closest('.hub-nav-item-wrapper');\n\t\tif (parentWrapper) {\n\t\t\treturn parentWrapper.querySelector(\n\t\t\t\t':scope > hub-nav-item .hub-nav-item__dropdown-toggle, :scope > hub-nav-item .hub-nav-item__link'\n\t\t\t) as HTMLElement | null;\n\t\t}\n\n\t\tconst overlayDropdown = host.closest('[data-hub-nav-overlay-parent-id]') as HTMLElement | null;\n\t\tconst parentItemId = overlayDropdown?.dataset['hubNavOverlayParentId'];\n\t\tif (!parentItemId) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst escapedId = CSS.escape(parentItemId);\n\t\treturn document.querySelector(\n\t\t\t`hub-nav-item[data-item-id=\"${escapedId}\"] .hub-nav-item__dropdown-toggle, hub-nav-item[data-item-id=\"${escapedId}\"] .hub-nav-item__link`\n\t\t) as HTMLElement | null;\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\t#itemWrapper\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<ng-template #overlayDropdownTemplate>\n\t\t\t\t<div class=\"hub-nav-dropdown\" role=\"menu\">\n\t\t\t\t\t<hub-nav-item-list\n\t\t\t\t\t\t[items]=\"item.children ?? []\"\n\t\t\t\t\t\t[depth]=\"depth() + 1\"\n\t\t\t\t\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t\t\t\t\t[forceAccordionMode]=\"forceAccordionMode()\"\n\t\t\t\t\t\t[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\n\t\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t\t(dropdownToggle)=\"dropdownToggle.emit($event)\"\n\t\t\t\t\t\t(panelOpen)=\"panelOpen.emit($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</ng-template>\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' && !shouldRenderDropdownInOverlay(item)) {\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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, computed, TemplateRef, ElementRef, inject } from '@angular/core';\nimport { HubNavDropdownRenderMode } from '../../models/nav-config.model';\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\t'(keydown)': 'onKeyDown($event)'\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/** Dropdown rendering mode forwarded to the panel item list. */\n\treadonly dropdownRenderMode = input<HubNavDropdownRenderMode>('inline');\n\n\t/** Unique owner class used to scope overlay dropdowns. */\n\treadonly overlayOwnerClass = input<string>('');\n\n\t/** Orientation class forwarded to overlay dropdowns rendered inside the panel. */\n\treadonly overlayOrientationClass = input<'hub-nav--horizontal' | 'hub-nav--vertical'>('hub-nav--vertical');\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\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\">&#8592;</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\">&times;</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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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 { HubNavDropdownRenderMode, 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/** Dropdown rendering mode forwarded to panel item lists. */\n\treadonly dropdownRenderMode = input<HubNavDropdownRenderMode>('inline');\n\n\t/** Unique owner class used to scope overlay dropdowns. */\n\treadonly overlayOwnerClass = input<string>('');\n\n\t/** Orientation class forwarded to overlay dropdowns inside panels. */\n\treadonly overlayOrientationClass = input<'hub-nav--horizontal' | 'hub-nav--vertical'>('hub-nav--vertical');\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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 { 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 { NgTemplateOutlet } from '@angular/common';\nimport { Component, ChangeDetectionStrategy, input, output, TemplateRef } 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: [NgTemplateOutlet, 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/**\n\t * Optional custom template for rendering item content, forwarded from the\n\t * host `HubNavComponent` so the mobile panel renders items identically to\n\t * the desktop nav (icons, badges, custom markup via `hubNavItemTemplate`).\n\t */\n\treadonly itemTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * Optional start-slot template (`hubNavStart`), forwarded from the host so\n\t * the drawer shows the same brand/header block as the desktop nav.\n\t */\n\treadonly startTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * Optional end-slot template (`hubNavEnd`), forwarded from the host so the\n\t * drawer shows the same footer block as the desktop nav.\n\t */\n\treadonly endTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * Slot context for the start/end templates rendered inside the drawer. The\n\t * drawer is always the collapsed presentation, but `inDrawer` lets consumers\n\t * tell the offcanvas drawer apart from the slim collapsed top bar (which also\n\t * receives `collapsed: true`) — e.g. to show a full header/footer in the\n\t * drawer while the top bar keeps just a brand + toggler.\n\t */\n\treadonly slotContext = { collapsed: true, inDrawer: true } as const;\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\">&times;</span>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<!-- Start slot (brand / header) — mirrors the desktop nav -->\n\t\t@if (startTemplate()) {\n\t\t\t<div class=\"hub-nav-slot hub-nav-slot--start hub-nav-mobile-panel__start\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"startTemplate()!\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"slotContext\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t}\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[itemTemplate]=\"itemTemplate()\"\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\n\t\t<!-- End slot (footer) — anchored to the bottom, mirrors the desktop nav -->\n\t\t@if (endTemplate()) {\n\t\t\t<div class=\"hub-nav-slot hub-nav-slot--end hub-nav-mobile-panel__end\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"endTemplate()!\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"slotContext\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t}\n\t</div>\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinput,\n\toutput,\n\tinject,\n\tcomputed,\n\tcontentChild,\n\teffect,\n\tsignal,\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 { resolveHubAccent } from 'ng-hub-ui-utils';\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\nlet hubNavOverlayOwnerCounter = 0;\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'[class.hub-nav--has-panels]': 'hasPanels()',\n\t\t'[attr.data-variant]': 'color() ?? null',\n\t\t'[style.--hub-nav-accent]': 'groupAccent()',\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/**\n\t * Semantic accent applied to the hover/active affordances of the nav items.\n\t * Named `color` for consistency with the rest of the hub-ui family\n\t * (`<hub-button>`, `<hub-badge>`, `<hub-metrics>`, `<hub-milestone>`). Accepts\n\t * ANY colour: a semantic/built-in name (`primary` / `success` / `danger` /\n\t * `warning` / `info`), a custom registered accent name, a CSS named colour,\n\t * or a literal `#hex` / `rgb()` / `oklch()` / `var()`. Bareword names resolve\n\t * to the design-system `--hub-sys-color-<name>` token (falling back to the\n\t * word itself as a raw colour); literals are passed through unchanged.\n\t * Defaults to `primary` when omitted.\n\t */\n\treadonly color = input<'primary' | 'success' | 'danger' | 'warning' | 'info' | (string & {}) | undefined>(undefined);\n\n\t/**\n\t * Inline accent fed to the nav styles. A bareword (semantic name / registered\n\t * accent / CSS named colour) resolves to `var(--hub-sys-color-<name>, <name>)`\n\t * — the ds token with the word itself as a raw fallback — while a literal\n\t * `#hex` / `rgb()` / `oklch()` / `var()` is passed through untouched. Returns\n\t * `null` when no colour is set, keeping the `primary` default.\n\t */\n\treadonly groupAccent = computed(() => resolveHubAccent(this.color()));\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/** Reactive router URL used to synchronize route-driven nav state. */\n\tprivate readonly currentUrl = signal(this.router.url);\n\n\t/** Marks when route-driven synchronization can start reacting to inputs. */\n\tprivate readonly routeSyncReady = signal(false);\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/** Unique owner class applied to this nav instance's overlay dropdowns. */\n\treadonly overlayOwnerClass = `hub-nav-overlay-owner-${++hubNavOverlayOwnerCounter}`;\n\n\t/** Orientation class forwarded to overlay-rendered dropdowns. */\n\treadonly overlayOrientationClass = computed<'hub-nav--horizontal' | 'hub-nav--vertical'>(() =>\n\t\tthis.resolvedOrientation() === 'horizontal' ? 'hub-nav--horizontal' : 'hub-nav--vertical'\n\t);\n\n\t/** Dropdown render mode forwarded to item lists. */\n\treadonly dropdownRenderMode = computed(() => this.resolvedConfig().dropdownRenderMode);\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/** Keeps dropdowns and drill-down panels synchronized with the current URL and item tree. */\n\tprivate routeSyncEffect = effect(() => {\n\t\tif (!this.routeSyncReady() || !this.autoOpenFromRoute()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = this.items();\n\t\tconst currentUrl = this.currentUrl();\n\t\tconst currentPath = this.extractPath(currentUrl);\n\n\t\tif (items.length === 0) {\n\t\t\tthis.state.closeAllDropdowns();\n\t\t\tthis.state.closeAllPanels();\n\t\t\tthis._lastSyncedPath = '';\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isCollapsed()) {\n\t\t\tthis.state.syncDropdownsWithRoute(items, currentUrl);\n\t\t\tthis._lastSyncedPath = currentPath;\n\t\t\treturn;\n\t\t}\n\n\t\tif (currentPath === this._lastSyncedPath && this.state.panelCount() > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.openPanelsFromRoute(currentUrl);\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\t\tthis.routeSyncReady.set(true);\n\t\tthis.routerSub = this.router.events\n\t\t\t.pipe(filter((e) => e instanceof NavigationEnd))\n\t\t\t.subscribe((e) => {\n\t\t\t\tthis.currentUrl.set((e as NavigationEnd).urlAfterRedirects);\n\t\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\tconst clickInsideHost = this.elementRef.nativeElement.contains(target);\n\t\t\tconst clickInsideOverlay = !!target.closest(`.${this.overlayOwnerClass}`);\n\t\t\tif (!clickInsideHost && !clickInsideOverlay) {\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.\n\t * 2. Find the root item whose own route or descendants match the active URL.\n\t * 3. Open a panel for that root item (closes any existing panels first).\n\t * 4. If a child section with nested items also matches the active URL\n\t * (e.g. the \"Examples\" dropdown), open a second panel for it.\n\t *\n\t * This matching strategy is resilient to localized prefixes such as\n\t * `/en/modal/overview` and `/es/modal/examples#modal-basic`.\n\t *\n\t * @param url - The full URL including optional fragment.\n\t */\n\tprivate openPanelsFromRoute(url: string): void {\n\t\tconst path = this.extractPath(url);\n\n\t\tconst rootItems = this.items();\n\t\tif (rootItems.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst rootItem = rootItems.find((item) => this.state.isItemOrDescendantActive(item, url));\n\t\tif (!rootItem?.children?.length) {\n\t\t\tthis.state.closeAllPanels();\n\t\t\tthis._lastSyncedPath = path;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._lastSyncedPath = path;\n\n\t\t// Always rebuild route-driven panel state from scratch to avoid stale\n\t\t// panel stacks when visibility limits or orientation changed.\n\t\tthis.state.closeAllPanels();\n\t\tthis.state.openPanel(rootItem, rootItems);\n\n\t\tconst sectionItem = rootItem.children.find(\n\t\t\t(child) => child.children?.length && this.state.isItemOrDescendantActive(child, url)\n\t\t);\n\t\tif (sectionItem) {\n\t\t\t// Keep root-level replacement logic scoped to true root items.\n\t\t\t// Passing rootItems here preserves drill-down behavior when\n\t\t\t// `panelMaxVisible` forces nested levels to replace the last panel.\n\t\t\tthis.state.openPanel(sectionItem, rootItems);\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass\"\n\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass\"\n\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass\"\n\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass\"\n\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[itemTemplate]=\"resolvedItemTemplate()\"\n\t\t\t[startTemplate]=\"startTemplate()\"\n\t\t\t[endTemplate]=\"endTemplate()\"\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 './models/nav-config.model';\nexport * from './models/nav-events.model';\nexport * from './models/nav-item.model';\nexport * from './models/nav-panel-state.model';\nexport * from './models/nav-template-context.model';\n\n// Services\nexport * from './services/nav-config.service';\nexport * from './services/nav-state.service';\n\n// Directives\nexport * from './directives/nav-end.directive';\nexport * from './directives/nav-item-template.directive';\nexport * from './directives/nav-scroll-spy-section.directive';\nexport * from './directives/nav-scroll-spy.directive';\nexport * from './directives/nav-start.directive';\n\n// Components\nexport * from './components/nav-item-list/nav-item-list.component';\nexport * from './components/nav-item/nav-item.component';\nexport * from './components/nav-panel-container/nav-panel-container.component';\nexport * from './components/nav-panel/nav-panel.component';\nexport * from './components/nav-separator/nav-separator.component';\nexport * from './components/nav/nav.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-hub-ui-nav.mjs","sources":["../../../projects/nav/src/services/nav-config.service.ts","../../../projects/nav/src/services/nav-state.service.ts","../../../projects/nav/src/directives/nav-end.directive.ts","../../../projects/nav/src/directives/nav-item-template.directive.ts","../../../projects/nav/src/directives/nav-scroll-spy-section.directive.ts","../../../projects/nav/src/directives/nav-scroll-spy.directive.ts","../../../projects/nav/src/directives/nav-start.directive.ts","../../../projects/nav/src/components/nav-item/nav-item.component.ts","../../../projects/nav/src/components/nav-item/nav-item.component.html","../../../projects/nav/src/components/nav-separator/nav-separator.component.ts","../../../projects/nav/src/components/nav-item-list/nav-item-list.component.ts","../../../projects/nav/src/components/nav-item-list/nav-item-list.component.html","../../../projects/nav/src/components/nav-panel/nav-panel.component.ts","../../../projects/nav/src/components/nav-panel/nav-panel.component.html","../../../projects/nav/src/components/nav-panel-container/nav-panel-container.component.ts","../../../projects/nav/src/components/nav-panel-container/nav-panel-container.component.html","../../../projects/nav/src/components/nav-toggler/nav-toggler.component.ts","../../../projects/nav/src/components/nav-mobile-panel/nav-mobile-panel.component.ts","../../../projects/nav/src/components/nav-mobile-panel/nav-mobile-panel.component.html","../../../projects/nav/src/components/nav/nav.component.ts","../../../projects/nav/src/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\tdropdownRenderMode: 'inline'\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\tdropdownRenderMode: 'inline'\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, parentLabel: panel.parentItem.label }\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: { ...p.parentItem, label: previous.parentLabel },\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 { 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 { 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 { isPlatformBrowser } from '@angular/common';\nimport {\n\tAfterViewInit,\n\tDirective,\n\tElementRef,\n\tNgZone,\n\tOnDestroy,\n\tPLATFORM_ID,\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\t/** Section tracking relies on browser-only APIs (rAF, IntersectionObserver); inert on the server. */\n\tprivate readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\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\tif (!this.isBrowser) {\n\t\t\treturn;\n\t\t}\n\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, 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 { Component, ChangeDetectionStrategy, input, output, inject, computed, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { HubOverflowTooltipDirective } from 'ng-hub-ui-utils';\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, HubOverflowTooltipDirective],\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\t// In panel mode there is no dedicated caret, so the label click must\n\t\t// also request the child panel opening while preserving the route click.\n\t\tif (this.hasChildren() && !this.showCaret()) {\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 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\" [hubOverflowTooltip]=\"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\" [hubOverflowTooltip]=\"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\" [hubOverflowTooltip]=\"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\" [hubOverflowTooltip]=\"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\tOnDestroy,\n\tOnInit,\n\tsignal,\n\tTemplateRef,\n\tViewContainerRef,\n\teffect,\n\tviewChildren\n} from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { Subscription, filter } from 'rxjs';\nimport { HubNavItem } from '../../models/nav-item.model';\nimport { HubNavDropdownRenderMode, 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';\nimport { OverlayRef, OverlayService } from 'ng-hub-ui-utils';\n\ntype HubNavOverlayPlacement = 'root-dropdown' | 'flyout';\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\t// menubar defaults to horizontal per WAI-ARIA; a vertical sidebar must say so.\n\t\t// Submenus (depth > 0) always stack vertically.\n\t\t'[attr.aria-orientation]':\n\t\t\t'depth() === 0 ? (state.orientation() === \"vertical\" ? \"vertical\" : \"horizontal\") : \"vertical\"',\n\t\t'(keydown)': 'onKeyDown($event)'\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/** Dropdown rendering mode used by non-panel submenus. */\n\treadonly dropdownRenderMode = input<HubNavDropdownRenderMode>('inline');\n\n\t/** Unique owner class used to mark overlay dropdowns for outside-click handling. */\n\treadonly overlayOwnerClass = input<string>('');\n\n\t/** Orientation class forwarded to overlay dropdowns so host-context styles still apply. */\n\treadonly overlayOrientationClass = input<'hub-nav--horizontal' | 'hub-nav--vertical'>('hub-nav--horizontal');\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/** Overlay service used to render flyout dropdowns outside clipping containers. */\n\tprivate readonly overlayService = inject(OverlayService);\n\n\t/** View container required to attach dropdown templates into overlays. */\n\tprivate readonly viewContainerRef = inject(ViewContainerRef);\n\n\t/** Wrapper elements that act as overlay origins for each rendered item. */\n\tprivate readonly itemWrappers = viewChildren<ElementRef<HTMLElement>>('itemWrapper');\n\n\t/** Dropdown templates available for overlay rendering. */\n\tprivate readonly overlayTemplates = viewChildren<TemplateRef<unknown>>('overlayDropdownTemplate');\n\n\t/** Active overlay instances keyed by nav item id. */\n\tprivate readonly overlayRefs = new Map<string, OverlayRef>();\n\n\t/** Keeps track of the latest overlay origin per item. */\n\tprivate readonly overlayOrigins = new Map<string, HTMLElement>();\n\n\t/** Keeps track of the latest overlay template per item. */\n\tprivate readonly overlayTemplateRefs = new Map<string, TemplateRef<unknown>>();\n\n\t/** Keeps track of the latest placement used per item. */\n\tprivate readonly overlayPlacements = new Map<string, HubNavOverlayPlacement>();\n\n\t/** Repositions every open overlay when the viewport changes. */\n\tprivate readonly overlayViewportListener = () => this.updateOverlayPositions();\n\n\t/** Whether global overlay viewport listeners are currently bound. */\n\tprivate overlayViewportListenersBound = false;\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/** Keeps overlay dropdowns synchronized with the nav open state and rendered item tree. */\n\tprivate readonly overlaySyncEffect = effect(() => {\n\t\tconst renderableItems = this.items().filter((item) => item.type !== 'separator');\n\t\tconst itemWrappers = this.itemWrappers();\n\t\tconst overlayTemplates = this.overlayTemplates();\n\t\tconst openOverlayIds = new Set<string>();\n\n\t\trenderableItems.forEach((item, index) => {\n\t\t\tif (!this.hasChildren(item) || !this.isExpanded(item) || !this.shouldRenderDropdownInOverlay(item)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst origin = itemWrappers[index]?.nativeElement;\n\t\t\tconst template = overlayTemplates[index];\n\t\t\tif (!origin || !template) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst placement = this.getOverlayPlacement();\n\t\t\topenOverlayIds.add(item.id);\n\t\t\tthis.attachOrUpdateOverlay(item.id, origin, template, placement);\n\t\t});\n\n\t\tthis.disposeInactiveOverlays(openOverlayIds);\n\t\tthis.syncOverlayViewportListeners();\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\tthis.disposeAllOverlays();\n\t\tthis.removeOverlayViewportListeners();\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 * Whether the item's non-panel submenu should render through the overlay system.\n\t *\n\t * Overlay rendering is intentionally limited to click-triggered menus because\n\t * hover-triggered overlays require pointer hand-off between separate DOM trees.\n\t *\n\t * @param item - The nav item being rendered.\n\t * @returns `true` when the submenu should render in an overlay container.\n\t */\n\tshouldRenderDropdownInOverlay(item: HubNavItem): boolean {\n\t\tif (this.forceAccordionMode()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.dropdownRenderMode() !== 'overlay') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.state.dropdownTrigger() !== 'click') {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst mode = this.getItemExpandMode(item);\n\t\treturn mode === 'flyout';\n\t}\n\n\t/**\n\t * Resolves the overlay placement to use for a submenu.\n\t *\n\t * @returns Placement variant for the overlay dropdown.\n\t */\n\tgetOverlayPlacement(): HubNavOverlayPlacement {\n\t\treturn this.state.orientation() === 'horizontal' && this.depth() === 0 ? 'root-dropdown' : 'flyout';\n\t}\n\n\t/**\n\t * Creates or updates the overlay used to render a dropdown submenu.\n\t *\n\t * @param itemId - Owner item id.\n\t * @param origin - Trigger element used for connected positioning.\n\t * @param template - Dropdown content template.\n\t * @param placement - Preferred overlay placement.\n\t */\n\tprivate attachOrUpdateOverlay(\n\t\titemId: string,\n\t\torigin: HTMLElement,\n\t\ttemplate: TemplateRef<unknown>,\n\t\tplacement: HubNavOverlayPlacement\n\t): void {\n\t\tconst existingOverlay = this.overlayRefs.get(itemId);\n\t\tconst existingOrigin = this.overlayOrigins.get(itemId);\n\t\tconst existingTemplate = this.overlayTemplateRefs.get(itemId);\n\t\tconst existingPlacement = this.overlayPlacements.get(itemId);\n\n\t\tif (\n\t\t\texistingOverlay &&\n\t\t\texistingOrigin === origin &&\n\t\t\texistingTemplate === template &&\n\t\t\texistingPlacement === placement\n\t\t) {\n\t\t\texistingOverlay.updatePosition();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.disposeOverlay(itemId);\n\n\t\tconst overlayRef = this.overlayService.create({\n\t\t\thasBackdrop: false,\n\t\t\tpanelClass: this.getOverlayClasses(),\n\t\t\tpositionStrategy: this.buildOverlayPositionStrategy(origin, placement)\n\t\t});\n\n\t\tconst overlayContent = overlayRef.attach(template, this.viewContainerRef);\n\t\toverlayContent.dataset['hubNavOverlayParentId'] = itemId;\n\n\t\tthis.overlayRefs.set(itemId, overlayRef);\n\t\tthis.overlayOrigins.set(itemId, origin);\n\t\tthis.overlayTemplateRefs.set(itemId, template);\n\t\tthis.overlayPlacements.set(itemId, placement);\n\t}\n\n\t/**\n\t * Rebuilds the position strategy for a connected dropdown overlay.\n\t *\n\t * @param origin - Trigger element used as anchor.\n\t * @param placement - Preferred overlay placement.\n\t * @returns Configured connected position strategy.\n\t */\n\tprivate buildOverlayPositionStrategy(origin: HTMLElement, placement: HubNavOverlayPlacement) {\n\t\tconst positionBuilder = this.overlayService.position().flexibleConnectedTo(origin);\n\n\t\tif (placement === 'root-dropdown') {\n\t\t\treturn positionBuilder.withPositions([\n\t\t\t\t{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n\t\t\t\t{ originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n\t\t\t\t{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 }\n\t\t\t]);\n\t\t}\n\n\t\treturn positionBuilder.withPositions([\n\t\t\t{ originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: 4 },\n\t\t\t{ originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -4 },\n\t\t\t{ originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: 4 }\n\t\t]);\n\t}\n\n\t/**\n\t * Resolves the CSS classes applied to overlay dropdown containers.\n\t *\n\t * @returns Panel class list for overlay containers.\n\t */\n\tprivate getOverlayClasses(): string[] {\n\t\treturn ['hub-nav-overlay-container', this.overlayOwnerClass(), this.overlayOrientationClass()];\n\t}\n\n\t/**\n\t * Disposes overlays that are no longer represented in the open dropdown state.\n\t *\n\t * @param activeOverlayIds - Set of overlay owner ids that should remain mounted.\n\t */\n\tprivate disposeInactiveOverlays(activeOverlayIds: Set<string>): void {\n\t\tfor (const itemId of this.overlayRefs.keys()) {\n\t\t\tif (!activeOverlayIds.has(itemId)) {\n\t\t\t\tthis.disposeOverlay(itemId);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Disposes a single overlay and clears its bookkeeping entries.\n\t *\n\t * @param itemId - Owner item id.\n\t */\n\tprivate disposeOverlay(itemId: string): void {\n\t\tthis.overlayRefs.get(itemId)?.dispose();\n\t\tthis.overlayRefs.delete(itemId);\n\t\tthis.overlayOrigins.delete(itemId);\n\t\tthis.overlayTemplateRefs.delete(itemId);\n\t\tthis.overlayPlacements.delete(itemId);\n\t}\n\n\t/**\n\t * Disposes every active overlay owned by this item list instance.\n\t */\n\tprivate disposeAllOverlays(): void {\n\t\tfor (const itemId of [...this.overlayRefs.keys()]) {\n\t\t\tthis.disposeOverlay(itemId);\n\t\t}\n\t}\n\n\t/**\n\t * Updates the connected position of all mounted overlays.\n\t */\n\tprivate updateOverlayPositions(): void {\n\t\tfor (const overlayRef of this.overlayRefs.values()) {\n\t\t\toverlayRef.updatePosition();\n\t\t}\n\t}\n\n\t/**\n\t * Binds or unbinds global viewport listeners depending on overlay activity.\n\t */\n\tprivate syncOverlayViewportListeners(): void {\n\t\tif (this.overlayRefs.size > 0) {\n\t\t\tthis.ensureOverlayViewportListeners();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.removeOverlayViewportListeners();\n\t}\n\n\t/**\n\t * Attaches viewport listeners used to keep overlays positioned.\n\t */\n\tprivate ensureOverlayViewportListeners(): void {\n\t\tif (this.overlayViewportListenersBound) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.addEventListener('resize', this.overlayViewportListener, { passive: true });\n\t\twindow.addEventListener('scroll', this.overlayViewportListener, true);\n\t\tthis.overlayViewportListenersBound = true;\n\t}\n\n\t/**\n\t * Removes viewport listeners attached for overlay positioning.\n\t */\n\tprivate removeOverlayViewportListeners(): void {\n\t\tif (!this.overlayViewportListenersBound) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.removeEventListener('resize', this.overlayViewportListener);\n\t\twindow.removeEventListener('scroll', this.overlayViewportListener, true);\n\t\tthis.overlayViewportListenersBound = false;\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\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 trigger = this.findParentTrigger();\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 = this.findSubmenuElement(itemId, wrapper);\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\t/**\n\t * Finds the rendered submenu element for the given item.\n\t *\n\t * Inline dropdowns live inside the current wrapper while overlay dropdowns\n\t * are rendered into `document.body` and must be found by owner item id.\n\t *\n\t * @param itemId - Parent item id that owns the submenu.\n\t * @param wrapper - Optional inline wrapper element that may contain the submenu.\n\t * @returns The submenu container when it exists.\n\t */\n\tprivate findSubmenuElement(itemId: string, wrapper: Element | null): HTMLElement | null {\n\t\tconst inlineSubmenu = wrapper?.querySelector('.hub-nav-dropdown, .hub-nav-accordion') as HTMLElement | null;\n\t\tif (inlineSubmenu) {\n\t\t\treturn inlineSubmenu;\n\t\t}\n\n\t\tconst escapedId = CSS.escape(itemId);\n\t\treturn document.querySelector(\n\t\t\t`.hub-nav-overlay-container [data-hub-nav-overlay-parent-id=\"${escapedId}\"]`\n\t\t) as HTMLElement | null;\n\t}\n\n\t/**\n\t * Resolves the trigger element that opened the current submenu.\n\t *\n\t * For inline submenus, the parent wrapper is still available through DOM\n\t * ancestry. Overlay-rendered submenus need to recover the owner item id from\n\t * the overlay content element instead.\n\t *\n\t * @returns The trigger element that should receive focus on Escape.\n\t */\n\tprivate findParentTrigger(): HTMLElement | null {\n\t\tconst host = this.el.nativeElement as HTMLElement;\n\t\tconst parentWrapper = host.closest('.hub-nav-item-wrapper');\n\t\tif (parentWrapper) {\n\t\t\treturn parentWrapper.querySelector(\n\t\t\t\t':scope > hub-nav-item .hub-nav-item__dropdown-toggle, :scope > hub-nav-item .hub-nav-item__link'\n\t\t\t) as HTMLElement | null;\n\t\t}\n\n\t\tconst overlayDropdown = host.closest('[data-hub-nav-overlay-parent-id]') as HTMLElement | null;\n\t\tconst parentItemId = overlayDropdown?.dataset['hubNavOverlayParentId'];\n\t\tif (!parentItemId) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst escapedId = CSS.escape(parentItemId);\n\t\treturn document.querySelector(\n\t\t\t`hub-nav-item[data-item-id=\"${escapedId}\"] .hub-nav-item__dropdown-toggle, hub-nav-item[data-item-id=\"${escapedId}\"] .hub-nav-item__link`\n\t\t) as HTMLElement | null;\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\t#itemWrapper\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<ng-template #overlayDropdownTemplate>\n\t\t\t\t<div class=\"hub-nav-dropdown\" role=\"menu\" aria-orientation=\"vertical\">\n\t\t\t\t\t<hub-nav-item-list\n\t\t\t\t\t\t[items]=\"item.children ?? []\"\n\t\t\t\t\t\t[depth]=\"depth() + 1\"\n\t\t\t\t\t\t[itemTemplate]=\"itemTemplate()\"\n\t\t\t\t\t\t[forceAccordionMode]=\"forceAccordionMode()\"\n\t\t\t\t\t\t[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\n\t\t\t\t\t\t(itemClick)=\"onItemClick($event)\"\n\t\t\t\t\t\t(dropdownToggle)=\"dropdownToggle.emit($event)\"\n\t\t\t\t\t\t(panelOpen)=\"panelOpen.emit($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</ng-template>\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' && !shouldRenderDropdownInOverlay(item)) {\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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\" aria-orientation=\"vertical\">\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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, computed, TemplateRef, ElementRef, inject } from '@angular/core';\nimport { HubNavDropdownRenderMode } from '../../models/nav-config.model';\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\t'(keydown)': 'onKeyDown($event)'\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/** Dropdown rendering mode forwarded to the panel item list. */\n\treadonly dropdownRenderMode = input<HubNavDropdownRenderMode>('inline');\n\n\t/** Unique owner class used to scope overlay dropdowns. */\n\treadonly overlayOwnerClass = input<string>('');\n\n\t/** Orientation class forwarded to overlay dropdowns rendered inside the panel. */\n\treadonly overlayOrientationClass = input<'hub-nav--horizontal' | 'hub-nav--vertical'>('hub-nav--vertical');\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\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\">&#8592;</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\">&times;</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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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 { HubNavDropdownRenderMode, 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/** Dropdown rendering mode forwarded to panel item lists. */\n\treadonly dropdownRenderMode = input<HubNavDropdownRenderMode>('inline');\n\n\t/** Unique owner class used to scope overlay dropdowns. */\n\treadonly overlayOwnerClass = input<string>('');\n\n\t/** Orientation class forwarded to overlay dropdowns inside panels. */\n\treadonly overlayOrientationClass = input<'hub-nav--horizontal' | 'hub-nav--vertical'>('hub-nav--vertical');\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t[overlayOwnerClass]=\"overlayOwnerClass()\"\n\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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 { 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 { NgTemplateOutlet } from '@angular/common';\nimport { Component, ChangeDetectionStrategy, input, output, TemplateRef } 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: [NgTemplateOutlet, 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/**\n\t * Optional custom template for rendering item content, forwarded from the\n\t * host `HubNavComponent` so the mobile panel renders items identically to\n\t * the desktop nav (icons, badges, custom markup via `hubNavItemTemplate`).\n\t */\n\treadonly itemTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * Optional start-slot template (`hubNavStart`), forwarded from the host so\n\t * the drawer shows the same brand/header block as the desktop nav.\n\t */\n\treadonly startTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * Optional end-slot template (`hubNavEnd`), forwarded from the host so the\n\t * drawer shows the same footer block as the desktop nav.\n\t */\n\treadonly endTemplate = input<TemplateRef<unknown> | null>(null);\n\n\t/**\n\t * Slot context for the start/end templates rendered inside the drawer. The\n\t * drawer is always the collapsed presentation, but `inDrawer` lets consumers\n\t * tell the offcanvas drawer apart from the slim collapsed top bar (which also\n\t * receives `collapsed: true`) — e.g. to show a full header/footer in the\n\t * drawer while the top bar keeps just a brand + toggler.\n\t */\n\treadonly slotContext = { collapsed: true, inDrawer: true } as const;\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\">&times;</span>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<!-- Start slot (brand / header) — mirrors the desktop nav -->\n\t\t@if (startTemplate()) {\n\t\t\t<div class=\"hub-nav-slot hub-nav-slot--start hub-nav-mobile-panel__start\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"startTemplate()!\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"slotContext\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t}\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[itemTemplate]=\"itemTemplate()\"\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\n\t\t<!-- End slot (footer) — anchored to the bottom, mirrors the desktop nav -->\n\t\t@if (endTemplate()) {\n\t\t\t<div class=\"hub-nav-slot hub-nav-slot--end hub-nav-mobile-panel__end\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"endTemplate()!\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"slotContext\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t}\n\t</div>\n}\n","import {\n\tComponent,\n\tChangeDetectionStrategy,\n\tinput,\n\toutput,\n\tinject,\n\tcomputed,\n\tcontentChild,\n\teffect,\n\tsignal,\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 { resolveHubAccent } from 'ng-hub-ui-utils';\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\nlet hubNavOverlayOwnerCounter = 0;\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'[class.hub-nav--has-panels]': 'hasPanels()',\n\t\t'[attr.data-variant]': 'color() ?? null',\n\t\t'[style.--hub-nav-accent]': 'groupAccent()',\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/**\n\t * Semantic accent applied to the hover/active affordances of the nav items.\n\t * Named `color` for consistency with the rest of the hub-ui family\n\t * (`<hub-button>`, `<hub-badge>`, `<hub-metrics>`, `<hub-milestone>`). Accepts\n\t * ANY colour: a semantic/built-in name (`primary` / `success` / `danger` /\n\t * `warning` / `info`), a custom registered accent name, a CSS named colour,\n\t * or a literal `#hex` / `rgb()` / `oklch()` / `var()`. Bareword names resolve\n\t * to the design-system `--hub-sys-color-<name>` token (falling back to the\n\t * word itself as a raw colour); literals are passed through unchanged.\n\t * Defaults to `primary` when omitted.\n\t */\n\treadonly color = input<'primary' | 'success' | 'danger' | 'warning' | 'info' | (string & {}) | undefined>(undefined);\n\n\t/**\n\t * Inline accent fed to the nav styles. A bareword (semantic name / registered\n\t * accent / CSS named colour) resolves to `var(--hub-sys-color-<name>, <name>)`\n\t * — the ds token with the word itself as a raw fallback — while a literal\n\t * `#hex` / `rgb()` / `oklch()` / `var()` is passed through untouched. Returns\n\t * `null` when no colour is set, keeping the `primary` default.\n\t */\n\treadonly groupAccent = computed(() => resolveHubAccent(this.color()));\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/** Reactive router URL used to synchronize route-driven nav state. */\n\tprivate readonly currentUrl = signal(this.router.url);\n\n\t/** Marks when route-driven synchronization can start reacting to inputs. */\n\tprivate readonly routeSyncReady = signal(false);\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/** Unique owner class applied to this nav instance's overlay dropdowns. */\n\treadonly overlayOwnerClass = `hub-nav-overlay-owner-${++hubNavOverlayOwnerCounter}`;\n\n\t/** Orientation class forwarded to overlay-rendered dropdowns. */\n\treadonly overlayOrientationClass = computed<'hub-nav--horizontal' | 'hub-nav--vertical'>(() =>\n\t\tthis.resolvedOrientation() === 'horizontal' ? 'hub-nav--horizontal' : 'hub-nav--vertical'\n\t);\n\n\t/** Dropdown render mode forwarded to item lists. */\n\treadonly dropdownRenderMode = computed(() => this.resolvedConfig().dropdownRenderMode);\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/** Keeps dropdowns and drill-down panels synchronized with the current URL and item tree. */\n\tprivate routeSyncEffect = effect(() => {\n\t\tif (!this.routeSyncReady() || !this.autoOpenFromRoute()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = this.items();\n\t\tconst currentUrl = this.currentUrl();\n\t\tconst currentPath = this.extractPath(currentUrl);\n\n\t\tif (items.length === 0) {\n\t\t\tthis.state.closeAllDropdowns();\n\t\t\tthis.state.closeAllPanels();\n\t\t\tthis._lastSyncedPath = '';\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isCollapsed()) {\n\t\t\tthis.state.syncDropdownsWithRoute(items, currentUrl);\n\t\t\tthis._lastSyncedPath = currentPath;\n\t\t\treturn;\n\t\t}\n\n\t\tif (currentPath === this._lastSyncedPath && this.state.panelCount() > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.openPanelsFromRoute(currentUrl);\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\t\tthis.routeSyncReady.set(true);\n\t\tthis.routerSub = this.router.events\n\t\t\t.pipe(filter((e) => e instanceof NavigationEnd))\n\t\t\t.subscribe((e) => {\n\t\t\t\tthis.currentUrl.set((e as NavigationEnd).urlAfterRedirects);\n\t\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\tconst clickInsideHost = this.elementRef.nativeElement.contains(target);\n\t\t\tconst clickInsideOverlay = !!target.closest(`.${this.overlayOwnerClass}`);\n\t\t\tif (!clickInsideHost && !clickInsideOverlay) {\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.\n\t * 2. Find the root item whose own route or descendants match the active URL.\n\t * 3. Open a panel for that root item (closes any existing panels first).\n\t * 4. If a child section with nested items also matches the active URL\n\t * (e.g. the \"Examples\" dropdown), open a second panel for it.\n\t *\n\t * This matching strategy is resilient to localized prefixes such as\n\t * `/en/modal/overview` and `/es/modal/examples#modal-basic`.\n\t *\n\t * @param url - The full URL including optional fragment.\n\t */\n\tprivate openPanelsFromRoute(url: string): void {\n\t\tconst path = this.extractPath(url);\n\n\t\tconst rootItems = this.items();\n\t\tif (rootItems.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst rootItem = rootItems.find((item) => this.state.isItemOrDescendantActive(item, url));\n\t\tif (!rootItem?.children?.length) {\n\t\t\tthis.state.closeAllPanels();\n\t\t\tthis._lastSyncedPath = path;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._lastSyncedPath = path;\n\n\t\t// Always rebuild route-driven panel state from scratch to avoid stale\n\t\t// panel stacks when visibility limits or orientation changed.\n\t\tthis.state.closeAllPanels();\n\t\tthis.state.openPanel(rootItem, rootItems);\n\n\t\tconst sectionItem = rootItem.children.find(\n\t\t\t(child) => child.children?.length && this.state.isItemOrDescendantActive(child, url)\n\t\t);\n\t\tif (sectionItem) {\n\t\t\t// Keep root-level replacement logic scoped to true root items.\n\t\t\t// Passing rootItems here preserves drill-down behavior when\n\t\t\t// `panelMaxVisible` forces nested levels to replace the last panel.\n\t\t\tthis.state.openPanel(sectionItem, rootItems);\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass\"\n\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass\"\n\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass\"\n\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[dropdownRenderMode]=\"dropdownRenderMode()\"\n\t\t\t\t\t[overlayOwnerClass]=\"overlayOwnerClass\"\n\t\t\t\t\t[overlayOrientationClass]=\"overlayOrientationClass()\"\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[itemTemplate]=\"resolvedItemTemplate()\"\n\t\t\t[startTemplate]=\"startTemplate()\"\n\t\t\t[endTemplate]=\"endTemplate()\"\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 './models/nav-config.model';\nexport * from './models/nav-events.model';\nexport * from './models/nav-item.model';\nexport * from './models/nav-panel-state.model';\nexport * from './models/nav-template-context.model';\n\n// Services\nexport * from './services/nav-config.service';\nexport * from './services/nav-state.service';\n\n// Directives\nexport * from './directives/nav-end.directive';\nexport * from './directives/nav-item-template.directive';\nexport * from './directives/nav-scroll-spy-section.directive';\nexport * from './directives/nav-scroll-spy.directive';\nexport * from './directives/nav-start.directive';\n\n// Components\nexport * from './components/nav-item-list/nav-item-list.component';\nexport * from './components/nav-item/nav-item.component';\nexport * from './components/nav-panel-container/nav-panel-container.component';\nexport * from './components/nav-panel/nav-panel.component';\nexport * from './components/nav-separator/nav-separator.component';\nexport * from './components/nav/nav.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-hub-ui-nav",
3
- "version": "22.7.0",
3
+ "version": "22.7.2",
4
4
  "license": "MIT",
5
5
  "description": "A flexible, accessible, and customizable navigation component for Angular 21, part of the ng-hub-ui family.",
6
6
  "author": "Carlos Morcillo <carlos.morcillo@me.com> (https://www.carlosmorcillo.com)",
@@ -30,7 +30,7 @@
30
30
  "@angular/common": ">=21.0.0",
31
31
  "@angular/core": ">=21.0.0",
32
32
  "@angular/router": ">=21.0.0",
33
- "ng-hub-ui-utils": ">=1.0.0"
33
+ "ng-hub-ui-utils": ">=22.7.0"
34
34
  },
35
35
  "dependencies": {
36
36
  "tslib": "^2.3.0"
Binary file