ng-hub-ui-panels 22.8.2 → 22.8.3

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.
@@ -791,7 +791,7 @@ class PanelsComponent {
791
791
  useExisting: forwardRef(() => PanelsComponent),
792
792
  multi: true
793
793
  }
794
- ], viewQueries: [{ propertyName: "navScroller", first: true, predicate: ["navScroller"], descendants: true, isSignal: true }, { propertyName: "prevBtn", first: true, predicate: ["prevBtn"], descendants: true, isSignal: true }, { propertyName: "nextBtn", first: true, predicate: ["nextBtn"], descendants: true, isSignal: true }, { propertyName: "contentRoot", first: true, predicate: ["contentRoot"], descendants: true, isSignal: true }, { propertyName: "multiplePaneHosts", predicate: ["multiplePaneHost"], descendants: true, isSignal: true }, { propertyName: "multipleBlocks", predicate: ["multipleBlock"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (!isAccordionView() && !isCardView()) {\n\t@if (multiple()) {\n\t\t<div class=\"hub-panels__multiple-layout\">\n\t\t\t@for (group of multipleHeaderGroups(); track group.activePanel ?? group.headers[0]) {\n\t\t\t\t<div\n\t\t\t\t\t#multipleBlock\n\t\t\t\t\tclass=\"hub-panels hub-panels__multiple-block\"\n\t\t\t\t\t[class.hub-panels--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels--vertical]=\"vertical()\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"hub-panels__header\">\n\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (panel of group.headers; track panel) {\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && panelIndex(panel) === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, panelIndex(panel))\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t@if (!justified() && type() !== 'pills' && !vertical()) {\n\t\t\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t@if (group.activePanel) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"hub-panels__content\"\n\t\t\t\t\t\t\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t#multiplePaneHost\n\t\t\t\t\t\t\t\tclass=\"hub-panels__multiple-pane-host\"\n\t\t\t\t\t\t\t\t[attr.data-panel-id]=\"group.activePanel.id()\"\n\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t} @else {\n\t\t<div class=\"hub-panels__header\">\n\t\t\t@if (scrollable() && !backwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#prevBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--backward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollBackwardAriaLabel\"\n\t\t\t\t\t(click)=\"navBackward()\"\n\t\t\t\t></button>\n\t\t\t}\n\n\t\t\t<div #navScroller class=\"hub-panels__nav-scroller\" (scroll)=\"onScroll()\">\n\t\t\t\t<ul\n\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t>\n\t\t\t\t\t@for (panel of panels(); track panel; let index = $index) {\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && index === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, index)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t}\n\t\t\t\t</ul>\n\t\t\t\t@if (!justified() && type() !== 'pills') {\n\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t@if (scrollable() && !forwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#nextBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--forward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollForwardAriaLabel\"\n\t\t\t\t\t(click)=\"navForward()\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t</div>\n\t}\n}\n\n<div\n\t#contentRoot\n\tclass=\"hub-panels__content\"\n\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t[class.hub-panels__content--accordion]=\"isAccordionView()\"\n\t[class.hub-panels__content--multiple-parking]=\"!isAccordionView() && multiple()\"\n>\n\t@if (activePanelHasRouter()) {\n\t\t<router-outlet />\n\t} @else {\n\t\t<ng-content />\n\t}\n</div>\n", styles: [":where(.hub-panels){--hub-panels-accent: var(--hub-sys-color-primary, #0d6efd);--hub-panels-accent-emphasis: color-mix(in oklch, var(--hub-panels-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-panels-accent-subtle: color-mix(in oklch, var(--hub-panels-accent) 12%, var(--hub-sys-surface-page, #ffffff));--hub-panels-accent-on: oklch(from var(--hub-panels-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-panels-flex-direction: row;--hub-panels-border-width: var(--hub-container-border-width, var(--hub-ref-border-width, 1px));--hub-panels-border-color: var(--hub-container-border-color, var(--hub-sys-border-color-default, #dee2e6));--hub-panels-border-radius: var(--hub-container-border-radius, var(--hub-ref-radius-md, .375rem));--hub-panels-content-bg: var(--hub-container-bg, var(--hub-sys-surface-page, #fff));--hub-panels-header-bg: var(--hub-panels-content-bg);--hub-panels-content-box-shadow: none;--hub-panels-content-padding-x: var(--hub-container-padding-x, var(--hub-ref-space-3, 1rem));--hub-panels-content-padding-y: var(--hub-container-padding-y, var(--hub-ref-space-3, 1rem));--hub-panels-nav-btn-width: 1.5rem;--hub-panels-nav-btn-height: 1.5rem;--hub-panels-backward-btn-bg: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23212529' d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3E%3C/svg%3E\");--hub-panels-forward-btn-bg: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23212529' d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E\");--hub-panels-nav-link-padding-x: var(--hub-ref-space-3, 1rem);--hub-panels-nav-link-padding-y: var(--hub-ref-space-2, .5rem);--hub-panels-nav-link-color: var(--hub-sys-text-primary, #212529);--hub-panels-nav-link-hover-color: var(--hub-panels-accent-emphasis);--hub-panels-nav-link-active-color: var(--hub-panels-accent);--hub-panels-nav-link-active-bg: var(--hub-panels-content-bg);--hub-panels-nav-link-disabled-color: var(--hub-sys-text-muted, #6c757d);--hub-panels-tab-font-family: var(--hub-container-font-family, var(--hub-ref-font-family-base));--hub-panels-tab-font-size: var(--hub-container-font-size, var(--hub-ref-font-size-base, 1rem));--hub-panels-tab-font-weight: var(--hub-ref-font-weight-medium, 500);--hub-panels-tab-line-height: var(--hub-ref-line-height-base, 1.5);--hub-panels-tab-padding-x: var(--hub-panels-nav-link-padding-x);--hub-panels-tab-padding-y: var(--hub-panels-nav-link-padding-y);--hub-panels-tab-gap: var(--hub-ref-space-2, .5rem);--hub-panels-tab-bg: transparent;--hub-panels-tab-color: var(--hub-panels-nav-link-color);--hub-panels-tab-border-width: var(--hub-panels-border-width);--hub-panels-tab-border-style: solid;--hub-panels-tab-border-color: transparent;--hub-panels-tab-border-radius: var(--hub-panels-border-radius);--hub-panels-tab-border-end-radius: 0;--hub-panels-tab-bg-hover: var(--hub-ref-surface-2, #f8f9fa);--hub-panels-tab-color-hover: var(--hub-panels-nav-link-hover-color);--hub-panels-tab-bg-active: var(--hub-panels-nav-link-active-bg);--hub-panels-tab-color-active: var(--hub-panels-nav-link-active-color);--hub-panels-tab-border-color-active: var(--hub-panels-accent);--hub-panels-tab-bg-disabled: transparent;--hub-panels-tab-color-disabled: var(--hub-panels-nav-link-disabled-color);--hub-panels-tab-focus-ring-width: var(--hub-sys-focus-ring-width, .25rem);--hub-panels-tab-focus-ring-color: var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25));--hub-panels-tab-transition: var(--hub-sys-transition-base, all .2s ease-in-out);--hub-panels-tab-active-shadow: 0 -.25rem .5rem rgba(0, 0, 0, .06);--hub-panels-tab-active-shadow-vertical: -.25rem 0 .5rem rgba(0, 0, 0, .06);--hub-panels-strip-margin-top: var(--hub-ref-space-2, .5rem);--hub-panels-nav-gap: 0;--hub-panels-pill-border-radius: var(--hub-ref-radius-pill, 50rem);--hub-panels-pill-bg-active: var(--hub-panels-accent);--hub-panels-pill-color-active: var(--hub-panels-accent-on);--hub-panels-pill-gap: var(--hub-ref-space-2, .5rem);--hub-panels-pill-content-border-width: 0;--hub-panels-remove-btn-opacity: .6;--hub-panels-remove-btn-opacity-hover: 1;--hub-panels-nav-content-gap: var(--hub-ref-space-2, .5rem);--hub-panels-pane-min-width: 16rem;--hub-panels-pane-min-height: 8rem;--hub-panels-pane-gap: 0;--hub-panels-card-gap: var(--hub-ref-space-3, 1rem);--hub-panels-accordion-color: var(--hub-accordion-color, var(--hub-sys-text-primary, #212529));--hub-panels-accordion-bg: var(--hub-accordion-bg, var(--hub-sys-surface-page, #fff));--hub-panels-accordion-border-width: var(--hub-accordion-border-width, var(--hub-ref-border-width, 1px));--hub-panels-accordion-border-color: var(--hub-accordion-border-color, var(--hub-sys-border-color-default, #dee2e6));--hub-panels-accordion-border-radius: var(--hub-accordion-border-radius, var(--hub-ref-radius-sm, .25rem));--hub-panels-accordion-inner-border-radius: var( --hub-accordion-inner-border-radius, calc(var(--hub-panels-accordion-border-radius) - var(--hub-panels-accordion-border-width)) );--hub-panels-accordion-btn-padding-x: var(--hub-accordion-btn-padding-x, 1.25rem);--hub-panels-accordion-btn-padding-y: var(--hub-accordion-btn-padding-y, var(--hub-ref-space-3, 1rem));--hub-panels-accordion-btn-color: var(--hub-accordion-btn-color, var(--hub-sys-text-primary, #212529));--hub-panels-accordion-btn-bg: var(--hub-accordion-btn-bg, var(--hub-sys-surface-page, #fff));--hub-panels-accordion-active-color: var(--hub-accordion-active-color, var(--hub-panels-accent-emphasis));--hub-panels-accordion-active-bg: var(--hub-accordion-active-bg, var(--hub-panels-accent-subtle));--hub-panels-accordion-icon-color: var(--hub-accordion-icon-color, var(--hub-panels-accordion-btn-color));--hub-panels-accordion-icon-active-color: var(--hub-accordion-icon-active-color, var(--hub-panels-accordion-active-color));--hub-panels-accordion-btn-icon-mask: var(--hub-accordion-btn-icon-mask, url(\"data:image/svg+xml;charset=UTF-8,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E\"));--hub-panels-accordion-btn-icon-width: var(--hub-accordion-btn-icon-width, 1.25rem);--hub-panels-accordion-btn-icon-transform: var(--hub-accordion-btn-icon-transform, rotate(-180deg));--hub-panels-accordion-btn-icon-transition: var(--hub-accordion-btn-icon-transition, transform .2s ease-in-out);--hub-panels-accordion-btn-focus-box-shadow: var( --hub-accordion-btn-focus-box-shadow, 0 0 0 var(--hub-sys-focus-ring-width, .25rem) var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25)) );--hub-panels-accordion-transition: var( --hub-accordion-transition, color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease );--hub-panels-accordion-collapse-transition-duration: var(--hub-accordion-collapse-transition-duration, .25s);--hub-panels-accordion-collapse-transition-easing: var( --hub-accordion-collapse-transition-easing, cubic-bezier(.4, 0, .2, 1) );--hub-panels-accordion-body-padding-x: var(--hub-accordion-body-padding-x, 1.25rem);--hub-panels-accordion-body-padding-y: var(--hub-accordion-body-padding-y, var(--hub-ref-space-3, 1rem))}:where(.hub-panels[data-variant=primary]){--hub-panels-accent: var(--hub-sys-color-primary)}:where(.hub-panels[data-variant=secondary]){--hub-panels-accent: var(--hub-sys-color-secondary)}:where(.hub-panels[data-variant=success]){--hub-panels-accent: var(--hub-sys-color-success)}:where(.hub-panels[data-variant=danger]){--hub-panels-accent: var(--hub-sys-color-danger)}:where(.hub-panels[data-variant=warning]){--hub-panels-accent: var(--hub-sys-color-warning)}:where(.hub-panels[data-variant=info]){--hub-panels-accent: var(--hub-sys-color-info)}:where(.hub-panels[data-variant=neutral]){--hub-panels-accent: var(--hub-sys-color-neutral)}:where(.hub-panels[data-variant=light]){--hub-panels-accent: var(--hub-sys-color-light)}:where(.hub-panels[data-variant=dark]){--hub-panels-accent: var(--hub-sys-color-dark)}\n", ".hub-panels{display:block;width:100%;box-sizing:border-box}.hub-panels,.hub-panels *,.hub-panels *:before,.hub-panels *:after{box-sizing:border-box}.hub-panels__header{display:flex;flex-direction:var(--hub-panels-flex-direction);align-items:stretch;background:var(--hub-panels-header-bg)}.hub-panels__scroll-btn{flex:0 0 auto;align-self:center;width:var(--hub-panels-nav-btn-width);height:var(--hub-panels-nav-btn-height);padding:0;border:0;cursor:pointer;background-color:transparent;background-position:center;background-repeat:no-repeat;background-size:1rem 1rem}.hub-panels__scroll-btn--backward{background-image:var(--hub-panels-backward-btn-bg)}.hub-panels__scroll-btn--forward{background-image:var(--hub-panels-forward-btn-bg)}.hub-panels__nav-scroller{display:flex;flex:1 1 auto;overflow-x:auto;background:var(--hub-panels-header-bg);scroll-behavior:smooth;scrollbar-width:none}.hub-panels__nav-scroller::-webkit-scrollbar{display:none}.hub-panels__nav{display:flex;flex:0 0 auto;flex-wrap:nowrap;gap:var(--hub-panels-nav-gap);margin:0;padding:0;list-style:none}.hub-panels__nav--tabs{border-bottom:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__nav--tabs .hub-panels__nav-link{margin-bottom:calc(-1 * var(--hub-panels-border-width))}.hub-panels__nav--pills{gap:var(--hub-panels-pill-gap)}.hub-panels__nav--pills .hub-panels__nav-link{border-radius:var(--hub-panels-pill-border-radius)}.hub-panels__nav--pills .hub-panels__nav-link--active{color:var(--hub-panels-pill-color-active);background:var(--hub-panels-pill-bg-active);border-color:transparent}.hub-panels__nav--justified{flex:1 1 auto}.hub-panels__nav--justified .hub-panels__nav-item{flex:1 1 0}.hub-panels__nav--justified .hub-panels__nav-link{width:100%;justify-content:center}.hub-panels__nav--vertical{flex-direction:column}.hub-panels__nav--vertical.hub-panels__nav--tabs{border-bottom:0;border-inline-end:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__nav--vertical.hub-panels__nav--tabs .hub-panels__nav-link{margin-bottom:0;margin-inline-end:calc(-1 * var(--hub-panels-border-width))}.hub-panels__nav-item{display:flex;flex:0 0 auto}.hub-panels__nav-link{position:relative;display:inline-flex;align-items:center;gap:var(--hub-panels-tab-gap);padding:var(--hub-panels-tab-padding-y) var(--hub-panels-tab-padding-x);font-family:var(--hub-panels-tab-font-family);font-size:var(--hub-panels-tab-font-size);font-weight:var(--hub-panels-tab-font-weight);line-height:var(--hub-panels-tab-line-height);white-space:nowrap;color:var(--hub-panels-tab-color);background:var(--hub-panels-tab-bg);border-style:var(--hub-panels-tab-border-style);border-width:var(--hub-panels-tab-border-width);border-color:var(--hub-panels-tab-border-color);border-start-start-radius:var(--hub-panels-tab-border-radius);border-start-end-radius:var(--hub-panels-tab-border-radius);cursor:pointer;transition:var(--hub-panels-tab-transition)}.hub-panels__nav-link:hover:not(:disabled):not(.hub-panels__nav-link--active){color:var(--hub-panels-tab-color-hover);background:var(--hub-panels-tab-bg-hover)}.hub-panels__nav-link:focus-visible{z-index:1;outline:0;box-shadow:0 0 0 var(--hub-panels-tab-focus-ring-width) var(--hub-panels-tab-focus-ring-color)}.hub-panels__nav-link--active{color:var(--hub-panels-tab-color-active);background:var(--hub-panels-tab-bg-active);border-color:var(--hub-panels-tab-border-color-active)}.hub-panels__nav-link:disabled{color:var(--hub-panels-tab-color-disabled);background:var(--hub-panels-tab-bg-disabled);cursor:not-allowed}.hub-panels__remove-btn{display:inline-flex;align-items:center;line-height:1;opacity:var(--hub-panels-remove-btn-opacity)}.hub-panels__remove-btn:hover{opacity:var(--hub-panels-remove-btn-opacity-hover)}.hub-panels__spacer{flex:1 1 auto;background:var(--hub-panels-header-bg);border-bottom:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__content{padding:var(--hub-panels-content-padding-y) var(--hub-panels-content-padding-x);background:var(--hub-panels-content-bg);box-shadow:var(--hub-panels-content-box-shadow)}.hub-panels__content--accordion{padding:0;background:transparent;box-shadow:none}.hub-panels__content--multiple-parking{display:none}.hub-panels__multiple-layout{display:flex;align-items:stretch;gap:var(--hub-panels-pane-gap);overflow-x:auto;overflow-y:hidden;scroll-behavior:smooth}.hub-panels__multiple-block{display:flex;flex-direction:column;flex:1 0 var(--hub-panels-pane-min-width);align-self:stretch;min-width:var(--hub-panels-pane-min-width);min-height:100%}.hub-panels__multiple-block.hub-panels--vertical{flex-direction:row;flex:1 1 auto;width:100%;min-width:100%;min-height:var(--hub-panels-pane-min-height)}.hub-panels__multiple-block>.hub-panels__content{display:flex;flex:1 1 auto;min-height:0}.hub-panels__multiple-block.hub-panels--vertical>.hub-panels__content{flex:1 1 auto;width:auto;min-width:max(var(--hub-panels-pane-min-width),var(--hub-panels-multiple-vertical-panel-min-width, 0px))}.hub-panels__multiple-pane-host{display:flex;flex:1 1 auto;width:100%;min-height:0}.hub-panels__multiple-pane-host>.hub-panels__panel{flex:1 1 auto;width:100%;height:100%}.hub-panels__multiple-pane-host>.hub-panels__panel.hub-panels__panel--active{display:flex;flex-direction:column}.hub-panels__multiple-pane-host>.hub-panels__panel.hub-panels__panel--active>div{flex:1 1 auto;min-height:0}.hub-panels--vertical.hub-panels--multiple>.hub-panels__multiple-layout{flex-direction:column;align-items:stretch;width:100%}.hub-panels--pills.hub-panels--multiple.hub-panels--vertical>.hub-panels__multiple-layout>.hub-panels__multiple-block+.hub-panels__multiple-block{padding-top:var(--hub-panels-nav-content-gap);border-top:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__panel{display:none}.hub-panels__panel--active{display:block}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple)>.hub-panels__header{margin-top:var(--hub-panels-strip-margin-top)}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple)>.hub-panels__content{border:var(--hub-panels-border-width) solid var(--hub-panels-border-color);border-top:0;border-end-start-radius:var(--hub-panels-border-radius);border-end-end-radius:var(--hub-panels-border-radius)}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple) .hub-panels__nav--tabs .hub-panels__nav-link--active{border-color:var(--hub-panels-border-color);border-bottom-color:var(--hub-panels-tab-bg-active);box-shadow:var(--hub-panels-tab-active-shadow)}.hub-panels--pills>.hub-panels__header{margin-bottom:var(--hub-panels-nav-content-gap)}.hub-panels--pills>.hub-panels__content{border:var(--hub-panels-pill-content-border-width) solid var(--hub-panels-border-color);border-radius:var(--hub-panels-border-radius)}.hub-panels--vertical{display:flex;align-items:stretch}.hub-panels--vertical .hub-panels__header{flex-direction:column}.hub-panels--vertical .hub-panels__nav-scroller{overflow:visible}.hub-panels--vertical .hub-panels__content{flex:1 1 auto;min-width:0}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple)>.hub-panels__header{margin-inline-start:var(--hub-panels-strip-margin-top);align-self:stretch;min-height:0}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__spacer{display:none}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav-scroller{flex:1 1 auto;align-self:stretch;min-height:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical{flex:1 1 auto;align-self:stretch;min-height:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical .hub-panels__nav-item{width:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical .hub-panels__nav-link{width:calc(100% + var(--hub-panels-border-width));justify-content:flex-start;margin-bottom:0;border-start-start-radius:var(--hub-panels-tab-border-radius);border-start-end-radius:var(--hub-panels-tab-border-end-radius, 0);border-end-start-radius:var(--hub-panels-tab-border-radius);border-end-end-radius:var(--hub-panels-tab-border-end-radius, 0);margin-inline-end:calc(-1 * var(--hub-panels-border-width))}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple)>.hub-panels__content{border:var(--hub-panels-border-width) solid var(--hub-panels-border-color);border-inline-start:0;border-start-end-radius:var(--hub-panels-border-radius);border-end-end-radius:var(--hub-panels-border-radius)}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--tabs .hub-panels__nav-link--active{z-index:1;border-color:var(--hub-panels-border-color);border-inline-end-color:var(--hub-panels-tab-bg-active);box-shadow:var(--hub-panels-tab-active-shadow-vertical)}.hub-panels--pills.hub-panels--vertical>.hub-panels__header{margin-bottom:0;margin-inline-end:var(--hub-panels-nav-content-gap)}.hub-panels--card{display:flex}.hub-panels--card>.hub-panels__content{display:flex;flex-direction:column;gap:var(--hub-panels-card-gap, var(--hub-ref-space-3, 1rem));width:100%;padding:0;background:transparent;box-shadow:none}\n", ".hub-panels__panel--accordion{display:block;color:var(--hub-panels-accordion-color);background-color:var(--hub-panels-accordion-bg);border:var(--hub-panels-accordion-border-width) solid var(--hub-panels-accordion-border-color)}.hub-panels__panel--accordion:not(:first-of-type){border-top:0}.hub-panels__panel--accordion:first-of-type{border-start-start-radius:var(--hub-panels-accordion-border-radius);border-start-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__panel--accordion:first-of-type>.hub-panels__accordion-header,.hub-panels__panel--accordion:first-of-type>.hub-panels__accordion-header .hub-panels__accordion-btn{border-start-start-radius:var(--hub-panels-accordion-inner-border-radius);border-start-end-radius:var(--hub-panels-accordion-inner-border-radius)}.hub-panels__panel--accordion:last-of-type{border-end-start-radius:var(--hub-panels-accordion-border-radius);border-end-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-header:not(.hub-panels__accordion-header--expanded),.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-header .hub-panels__accordion-btn--collapsed{border-end-start-radius:var(--hub-panels-accordion-inner-border-radius);border-end-end-radius:var(--hub-panels-accordion-inner-border-radius)}.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-collapse{border-end-start-radius:var(--hub-panels-accordion-border-radius);border-end-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__accordion-header{position:relative;display:flex;align-items:stretch;margin:0;background-color:var(--hub-panels-accordion-btn-bg);transition:var(--hub-panels-accordion-transition);--hub-panels-accordion-toggle-gutter: calc( var(--hub-panels-accordion-btn-icon-width) + var(--hub-panels-tab-gap) )}.hub-panels__accordion-header--expanded{background-color:var(--hub-panels-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--hub-panels-accordion-border-width)) 0 var(--hub-panels-accordion-border-color)}.hub-panels__accordion-actions{display:flex;flex-shrink:0;align-items:center;gap:var(--hub-panels-tab-gap);padding-inline-end:calc(var(--hub-panels-accordion-btn-padding-x) + var(--hub-panels-accordion-toggle-gutter))}.hub-panels__accordion-header:not(:has(>.hub-panels__accordion-actions))>.hub-panels__accordion-btn{padding-inline-end:calc(var(--hub-panels-accordion-btn-padding-x) + var(--hub-panels-accordion-toggle-gutter))}.hub-panels__accordion-btn{display:flex;flex:1 1 auto;align-items:center;min-width:0;gap:var(--hub-panels-tab-gap);padding:var(--hub-panels-accordion-btn-padding-y) var(--hub-panels-accordion-btn-padding-x);font-family:var(--hub-panels-tab-font-family);font-size:var(--hub-panels-tab-font-size);line-height:var(--hub-panels-tab-line-height);text-align:start;color:var(--hub-panels-accordion-btn-color);background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:var(--hub-panels-accordion-transition);cursor:pointer}.hub-panels__accordion-btn:after{position:absolute;z-index:1;inset-block:0;inset-inline-end:var(--hub-panels-accordion-btn-padding-x);flex-shrink:0;width:var(--hub-panels-accordion-btn-icon-width);height:var(--hub-panels-accordion-btn-icon-width);margin-block:auto;content:\"\";background-color:var(--hub-panels-accordion-icon-active-color);-webkit-mask-image:var(--hub-panels-accordion-btn-icon-mask);mask-image:var(--hub-panels-accordion-btn-icon-mask);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center;mask-position:center;transform:var(--hub-panels-accordion-btn-icon-transform);transition:var(--hub-panels-accordion-btn-icon-transition)}.hub-panels__accordion-btn:not(.hub-panels__accordion-btn--collapsed){color:var(--hub-panels-accordion-active-color)}.hub-panels__accordion-btn--collapsed:after{background-color:var(--hub-panels-accordion-icon-color);transform:none}.hub-panels__accordion-btn:hover:not(:disabled){z-index:2}.hub-panels__accordion-btn:focus-visible{z-index:3;outline:0;box-shadow:var(--hub-panels-accordion-btn-focus-box-shadow)}.hub-panels__accordion-btn:disabled{color:var(--hub-panels-tab-color-disabled);cursor:not-allowed}.hub-panels__accordion-collapse{display:grid;grid-template-rows:1fr;transition:grid-template-rows var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing)}.hub-panels__accordion-collapse--collapsed{grid-template-rows:0fr}.hub-panels__accordion-collapse>.hub-panels__accordion-body{min-height:0;overflow:hidden;opacity:1;padding:var(--hub-panels-accordion-body-padding-y) var(--hub-panels-accordion-body-padding-x);transition:opacity var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing),padding var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing)}.hub-panels__accordion-collapse--collapsed>.hub-panels__accordion-body{opacity:0;padding-top:0;padding-bottom:0}.hub-panels__panel--toggle-start>.hub-panels__accordion-header{--hub-panels-accordion-toggle-gutter: 0px}.hub-panels__panel--toggle-start>.hub-panels__accordion-header>.hub-panels__accordion-btn:after{position:static;z-index:auto;order:-1;margin-block:0;margin-inline-start:0;margin-inline-end:var(--hub-panels-tab-gap)}.hub-panels--flush .hub-panels__panel--accordion{border-right:0;border-left:0;border-radius:0}.hub-panels--flush .hub-panels__panel--accordion:first-of-type{border-top:0}.hub-panels--flush .hub-panels__panel--accordion:last-of-type{border-bottom:0}.hub-panels--flush .hub-panels__panel--accordion>.hub-panels__accordion-collapse,.hub-panels--flush .hub-panels__panel--accordion>.hub-panels__accordion-header .hub-panels__accordion-btn{border-radius:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
794
+ ], viewQueries: [{ propertyName: "navScroller", first: true, predicate: ["navScroller"], descendants: true, isSignal: true }, { propertyName: "prevBtn", first: true, predicate: ["prevBtn"], descendants: true, isSignal: true }, { propertyName: "nextBtn", first: true, predicate: ["nextBtn"], descendants: true, isSignal: true }, { propertyName: "contentRoot", first: true, predicate: ["contentRoot"], descendants: true, isSignal: true }, { propertyName: "multiplePaneHosts", predicate: ["multiplePaneHost"], descendants: true, isSignal: true }, { propertyName: "multipleBlocks", predicate: ["multipleBlock"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (!isAccordionView() && !isCardView()) {\n\t@if (multiple()) {\n\t\t<div class=\"hub-panels__multiple-layout\">\n\t\t\t@for (group of multipleHeaderGroups(); track group.activePanel ?? group.headers[0]) {\n\t\t\t\t<div\n\t\t\t\t\t#multipleBlock\n\t\t\t\t\tclass=\"hub-panels hub-panels__multiple-block\"\n\t\t\t\t\t[class.hub-panels--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels--vertical]=\"vertical()\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"hub-panels__header\">\n\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (panel of group.headers; track panel) {\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && panelIndex(panel) === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, panelIndex(panel))\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t@if (!justified() && type() !== 'pills' && !vertical()) {\n\t\t\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t@if (group.activePanel) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"hub-panels__content\"\n\t\t\t\t\t\t\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t#multiplePaneHost\n\t\t\t\t\t\t\t\tclass=\"hub-panels__multiple-pane-host\"\n\t\t\t\t\t\t\t\t[attr.data-panel-id]=\"group.activePanel.id()\"\n\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t} @else {\n\t\t<div class=\"hub-panels__header\">\n\t\t\t@if (scrollable() && !backwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#prevBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--backward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollBackwardAriaLabel\"\n\t\t\t\t\t(click)=\"navBackward()\"\n\t\t\t\t></button>\n\t\t\t}\n\n\t\t\t<div #navScroller class=\"hub-panels__nav-scroller\" (scroll)=\"onScroll()\">\n\t\t\t\t<ul\n\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t>\n\t\t\t\t\t@for (panel of panels(); track panel; let index = $index) {\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && index === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, index)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t}\n\t\t\t\t</ul>\n\t\t\t\t@if (!justified() && type() !== 'pills') {\n\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t@if (scrollable() && !forwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#nextBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--forward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollForwardAriaLabel\"\n\t\t\t\t\t(click)=\"navForward()\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t</div>\n\t}\n}\n\n<div\n\t#contentRoot\n\tclass=\"hub-panels__content\"\n\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t[class.hub-panels__content--accordion]=\"isAccordionView()\"\n\t[class.hub-panels__content--multiple-parking]=\"!isAccordionView() && multiple()\"\n>\n\t@if (activePanelHasRouter()) {\n\t\t<router-outlet />\n\t} @else {\n\t\t<ng-content />\n\t}\n</div>\n", styles: [":where(.hub-panels){--hub-panels-accent: var(--hub-sys-color-primary, #0d6efd);--hub-panels-accent-emphasis: color-mix(in oklch, var(--hub-panels-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-panels-accent-subtle: color-mix(in oklch, var(--hub-panels-accent) 12%, var(--hub-sys-surface-page, #ffffff));--hub-panels-accent-on: oklch(from var(--hub-panels-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-panels-flex-direction: row;--hub-panels-border-width: var(--hub-container-border-width, var(--hub-ref-border-width, 1px));--hub-panels-border-color: var(--hub-container-border-color, var(--hub-sys-border-color-default, #dee2e6));--hub-panels-border-radius: var(--hub-container-border-radius, var(--hub-ref-radius-md, .375rem));--hub-panels-content-bg: var(--hub-container-bg, var(--hub-sys-surface-page, #fff));--hub-panels-header-bg: var(--hub-panels-content-bg);--hub-panels-content-box-shadow: none;--hub-panels-content-padding-x: var(--hub-container-padding-x, var(--hub-ref-space-3, 1rem));--hub-panels-content-padding-y: var(--hub-container-padding-y, var(--hub-ref-space-3, 1rem));--hub-panels-nav-btn-width: 1.5rem;--hub-panels-nav-btn-height: 1.5rem;--hub-panels-backward-btn-bg: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23212529' d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3E%3C/svg%3E\");--hub-panels-forward-btn-bg: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23212529' d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E\");--hub-panels-nav-link-padding-x: var(--hub-ref-space-3, 1rem);--hub-panels-nav-link-padding-y: var(--hub-ref-space-2, .5rem);--hub-panels-nav-link-color: var(--hub-sys-text-primary, #212529);--hub-panels-nav-link-hover-color: var(--hub-panels-accent-emphasis);--hub-panels-nav-link-active-color: var(--hub-panels-accent);--hub-panels-nav-link-active-bg: var(--hub-panels-content-bg);--hub-panels-nav-link-disabled-color: var(--hub-sys-text-muted, #6c757d);--hub-panels-tab-font-family: var(--hub-container-font-family, var(--hub-ref-font-family-base));--hub-panels-tab-font-size: var(--hub-container-font-size, var(--hub-ref-font-size-base, 1rem));--hub-panels-tab-font-weight: var(--hub-ref-font-weight-medium, 500);--hub-panels-tab-line-height: var(--hub-ref-line-height-base, 1.5);--hub-panels-tab-padding-x: var(--hub-panels-nav-link-padding-x);--hub-panels-tab-padding-y: var(--hub-panels-nav-link-padding-y);--hub-panels-tab-gap: var(--hub-ref-space-2, .5rem);--hub-panels-tab-bg: transparent;--hub-panels-tab-color: var(--hub-panels-nav-link-color);--hub-panels-tab-border-width: var(--hub-panels-border-width);--hub-panels-tab-border-style: solid;--hub-panels-tab-border-color: transparent;--hub-panels-tab-border-radius: var(--hub-panels-border-radius);--hub-panels-tab-border-end-radius: 0;--hub-panels-tab-bg-hover: var(--hub-ref-surface-2, #f8f9fa);--hub-panels-tab-color-hover: var(--hub-panels-nav-link-hover-color);--hub-panels-tab-bg-active: var(--hub-panels-nav-link-active-bg);--hub-panels-tab-color-active: var(--hub-panels-nav-link-active-color);--hub-panels-tab-border-color-active: var(--hub-panels-accent);--hub-panels-tab-bg-disabled: transparent;--hub-panels-tab-color-disabled: var(--hub-panels-nav-link-disabled-color);--hub-panels-tab-focus-ring-width: var(--hub-sys-focus-ring-width, .25rem);--hub-panels-tab-focus-ring-color: var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25));--hub-panels-tab-transition: var(--hub-sys-transition-base, all .2s ease-in-out);--hub-panels-tab-active-shadow: 0 -.25rem .5rem rgba(0, 0, 0, .06);--hub-panels-tab-active-shadow-vertical: -.25rem 0 .5rem rgba(0, 0, 0, .06);--hub-panels-strip-margin-top: var(--hub-ref-space-2, .5rem);--hub-panels-nav-gap: 0;--hub-panels-pill-border-radius: var(--hub-ref-radius-pill, 50rem);--hub-panels-pill-bg-active: var(--hub-panels-accent);--hub-panels-pill-color-active: var(--hub-panels-accent-on);--hub-panels-pill-gap: var(--hub-ref-space-2, .5rem);--hub-panels-pill-content-border-width: 0;--hub-panels-remove-btn-opacity: .6;--hub-panels-remove-btn-opacity-hover: 1;--hub-panels-nav-content-gap: var(--hub-ref-space-2, .5rem);--hub-panels-pane-min-width: 16rem;--hub-panels-pane-min-height: 8rem;--hub-panels-pane-gap: 0;--hub-panels-card-gap: var(--hub-ref-space-3, 1rem);--hub-panels-accordion-color: var(--hub-accordion-color, var(--hub-sys-text-primary, #212529));--hub-panels-accordion-bg: var(--hub-accordion-bg, var(--hub-sys-surface-page, #fff));--hub-panels-accordion-border-width: var(--hub-accordion-border-width, var(--hub-ref-border-width, 1px));--hub-panels-accordion-border-color: var(--hub-accordion-border-color, var(--hub-sys-border-color-default, #dee2e6));--hub-panels-accordion-border-radius: var(--hub-accordion-border-radius, var(--hub-ref-radius-sm, .25rem));--hub-panels-accordion-inner-border-radius: var( --hub-accordion-inner-border-radius, calc(var(--hub-panels-accordion-border-radius) - var(--hub-panels-accordion-border-width)) );--hub-panels-accordion-btn-padding-x: var(--hub-accordion-btn-padding-x, 1.25rem);--hub-panels-accordion-btn-padding-y: var(--hub-accordion-btn-padding-y, var(--hub-ref-space-3, 1rem));--hub-panels-accordion-btn-color: var(--hub-accordion-btn-color, var(--hub-sys-text-primary, #212529));--hub-panels-accordion-btn-bg: var(--hub-accordion-btn-bg, var(--hub-sys-surface-page, #fff));--hub-panels-accordion-active-color: var(--hub-accordion-active-color, var(--hub-panels-accent-emphasis));--hub-panels-accordion-active-bg: var(--hub-accordion-active-bg, var(--hub-panels-accent-subtle));--hub-panels-accordion-icon-color: var(--hub-accordion-icon-color, var(--hub-panels-accordion-btn-color));--hub-panels-accordion-icon-active-color: var(--hub-accordion-icon-active-color, var(--hub-panels-accordion-active-color));--hub-panels-accordion-btn-icon-mask: var(--hub-accordion-btn-icon-mask, url(\"data:image/svg+xml;charset=UTF-8,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E\"));--hub-panels-accordion-btn-icon-width: var(--hub-accordion-btn-icon-width, 1.25rem);--hub-panels-accordion-btn-icon-transform: var(--hub-accordion-btn-icon-transform, rotate(-180deg));--hub-panels-accordion-btn-icon-transition: var(--hub-accordion-btn-icon-transition, transform .2s ease-in-out);--hub-panels-accordion-btn-focus-box-shadow: var( --hub-accordion-btn-focus-box-shadow, 0 0 0 var(--hub-sys-focus-ring-width, .25rem) var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25)) );--hub-panels-accordion-transition: var( --hub-accordion-transition, color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease );--hub-panels-accordion-collapse-transition-duration: var(--hub-accordion-collapse-transition-duration, .25s);--hub-panels-accordion-collapse-transition-easing: var( --hub-accordion-collapse-transition-easing, cubic-bezier(.4, 0, .2, 1) );--hub-panels-accordion-body-padding-x: var(--hub-accordion-body-padding-x, 1.25rem);--hub-panels-accordion-body-padding-y: var(--hub-accordion-body-padding-y, var(--hub-ref-space-3, 1rem))}:where(.hub-panels[data-variant=primary]){--hub-panels-accent: var(--hub-sys-color-primary)}:where(.hub-panels[data-variant=secondary]){--hub-panels-accent: var(--hub-sys-color-secondary)}:where(.hub-panels[data-variant=success]){--hub-panels-accent: var(--hub-sys-color-success)}:where(.hub-panels[data-variant=danger]){--hub-panels-accent: var(--hub-sys-color-danger)}:where(.hub-panels[data-variant=warning]){--hub-panels-accent: var(--hub-sys-color-warning)}:where(.hub-panels[data-variant=info]){--hub-panels-accent: var(--hub-sys-color-info)}:where(.hub-panels[data-variant=neutral]){--hub-panels-accent: var(--hub-sys-color-neutral)}:where(.hub-panels[data-variant=light]){--hub-panels-accent: var(--hub-sys-color-light)}:where(.hub-panels[data-variant=dark]){--hub-panels-accent: var(--hub-sys-color-dark)}\n", ".hub-panels{display:block;width:100%;box-sizing:border-box}.hub-panels,.hub-panels *,.hub-panels *:before,.hub-panels *:after{box-sizing:border-box}.hub-panels__header{display:flex;flex-direction:var(--hub-panels-flex-direction);align-items:stretch;background:var(--hub-panels-header-bg)}.hub-panels__scroll-btn{flex:0 0 auto;align-self:center;width:var(--hub-panels-nav-btn-width);height:var(--hub-panels-nav-btn-height);padding:0;border:0;cursor:pointer;background-color:transparent;background-position:center;background-repeat:no-repeat;background-size:1rem 1rem}.hub-panels__scroll-btn--backward{background-image:var(--hub-panels-backward-btn-bg)}.hub-panels__scroll-btn--forward{background-image:var(--hub-panels-forward-btn-bg)}.hub-panels__nav-scroller{display:flex;flex:1 1 auto;overflow-x:auto;background:var(--hub-panels-header-bg);scroll-behavior:smooth;scrollbar-width:none}.hub-panels__nav-scroller::-webkit-scrollbar{display:none}.hub-panels__nav{display:flex;flex:0 0 auto;flex-wrap:nowrap;gap:var(--hub-panels-nav-gap);margin:0;padding:0;list-style:none}.hub-panels__nav--tabs{border-bottom:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__nav--tabs .hub-panels__nav-link{margin-bottom:calc(-1 * var(--hub-panels-border-width))}.hub-panels__nav--pills{gap:var(--hub-panels-pill-gap)}.hub-panels__nav--pills .hub-panels__nav-link{border-radius:var(--hub-panels-pill-border-radius)}.hub-panels__nav--pills .hub-panels__nav-link--active{color:var(--hub-panels-pill-color-active);background:var(--hub-panels-pill-bg-active);border-color:transparent}.hub-panels__nav--justified{flex:1 1 auto}.hub-panels__nav--justified .hub-panels__nav-item{flex:1 1 0}.hub-panels__nav--justified .hub-panels__nav-link{width:100%;justify-content:center}.hub-panels__nav--vertical{flex-direction:column}.hub-panels__nav--vertical.hub-panels__nav--tabs{border-bottom:0;border-inline-end:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__nav--vertical.hub-panels__nav--tabs .hub-panels__nav-link{margin-bottom:0;margin-inline-end:calc(-1 * var(--hub-panels-border-width))}.hub-panels__nav-item{display:flex;flex:0 0 auto}.hub-panels__nav-link{position:relative;display:inline-flex;align-items:center;gap:var(--hub-panels-tab-gap);padding:var(--hub-panels-tab-padding-y) var(--hub-panels-tab-padding-x);font-family:var(--hub-panels-tab-font-family);font-size:var(--hub-panels-tab-font-size);font-weight:var(--hub-panels-tab-font-weight);line-height:var(--hub-panels-tab-line-height);white-space:nowrap;color:var(--hub-panels-tab-color);background:var(--hub-panels-tab-bg);border-style:var(--hub-panels-tab-border-style);border-width:var(--hub-panels-tab-border-width);border-color:var(--hub-panels-tab-border-color);border-start-start-radius:var(--hub-panels-tab-border-radius);border-start-end-radius:var(--hub-panels-tab-border-radius);cursor:pointer;transition:var(--hub-panels-tab-transition)}.hub-panels__nav-link:hover:not(:disabled):not(.hub-panels__nav-link--active){color:var(--hub-panels-tab-color-hover);background:var(--hub-panels-tab-bg-hover)}.hub-panels__nav-link:focus-visible{z-index:1;outline:0;box-shadow:0 0 0 var(--hub-panels-tab-focus-ring-width) var(--hub-panels-tab-focus-ring-color)}.hub-panels__nav-link--active{color:var(--hub-panels-tab-color-active);background:var(--hub-panels-tab-bg-active);border-color:var(--hub-panels-tab-border-color-active)}.hub-panels__nav-link:disabled{color:var(--hub-panels-tab-color-disabled);background:var(--hub-panels-tab-bg-disabled);cursor:not-allowed}.hub-panels__remove-btn{display:inline-flex;align-items:center;line-height:1;opacity:var(--hub-panels-remove-btn-opacity)}.hub-panels__remove-btn:hover{opacity:var(--hub-panels-remove-btn-opacity-hover)}.hub-panels__spacer{flex:1 1 auto;background:var(--hub-panels-header-bg);border-bottom:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__content{padding:var(--hub-panels-content-padding-y) var(--hub-panels-content-padding-x);background:var(--hub-panels-content-bg);box-shadow:var(--hub-panels-content-box-shadow)}.hub-panels__content--accordion{padding:0;background:transparent;box-shadow:none}.hub-panels__content--multiple-parking{display:none}.hub-panels__multiple-layout{display:flex;align-items:stretch;gap:var(--hub-panels-pane-gap);overflow-x:auto;overflow-y:hidden;scroll-behavior:smooth}.hub-panels__multiple-block{display:flex;flex-direction:column;flex:1 0 var(--hub-panels-pane-min-width);align-self:stretch;min-width:var(--hub-panels-pane-min-width);min-height:100%}.hub-panels__multiple-block.hub-panels--vertical{flex-direction:row;flex:1 1 auto;width:100%;min-width:100%;min-height:var(--hub-panels-pane-min-height)}.hub-panels__multiple-block>.hub-panels__content{display:flex;flex:1 1 auto;min-height:0}.hub-panels__multiple-block.hub-panels--vertical>.hub-panels__content{flex:1 1 auto;width:auto;min-width:max(var(--hub-panels-pane-min-width),var(--hub-panels-multiple-vertical-panel-min-width, 0px))}.hub-panels__multiple-pane-host{display:flex;flex:1 1 auto;width:100%;min-height:0}.hub-panels__multiple-pane-host>.hub-panels__panel{flex:1 1 auto;width:100%;height:100%}.hub-panels__multiple-pane-host>.hub-panels__panel.hub-panels__panel--active{display:flex;flex-direction:column}.hub-panels__multiple-pane-host>.hub-panels__panel.hub-panels__panel--active>div{flex:1 1 auto;min-height:0}.hub-panels--vertical.hub-panels--multiple>.hub-panels__multiple-layout{flex-direction:column;align-items:stretch;width:100%}.hub-panels--pills.hub-panels--multiple.hub-panels--vertical>.hub-panels__multiple-layout>.hub-panels__multiple-block+.hub-panels__multiple-block{padding-top:var(--hub-panels-nav-content-gap);border-top:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__panel{display:none}.hub-panels__panel--active{display:block}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple)>.hub-panels__header{margin-top:var(--hub-panels-strip-margin-top)}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple)>.hub-panels__content{border:var(--hub-panels-border-width) solid var(--hub-panels-border-color);border-top:0;border-end-start-radius:var(--hub-panels-border-radius);border-end-end-radius:var(--hub-panels-border-radius)}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple) .hub-panels__nav--tabs .hub-panels__nav-link--active{border-color:var(--hub-panels-border-color);border-bottom-color:var(--hub-panels-tab-bg-active);box-shadow:var(--hub-panels-tab-active-shadow)}.hub-panels--pills>.hub-panels__header{margin-bottom:var(--hub-panels-nav-content-gap)}.hub-panels--pills>.hub-panels__content{border:var(--hub-panels-pill-content-border-width) solid var(--hub-panels-border-color);border-radius:var(--hub-panels-border-radius)}.hub-panels--vertical{display:flex;align-items:stretch}.hub-panels--vertical .hub-panels__header{flex-direction:column}.hub-panels--vertical .hub-panels__nav-scroller{overflow:visible}.hub-panels--vertical .hub-panels__content{flex:1 1 auto;min-width:0}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple)>.hub-panels__header{margin-inline-start:var(--hub-panels-strip-margin-top);align-self:stretch;min-height:0}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__spacer{display:none}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav-scroller{flex:1 1 auto;align-self:stretch;min-height:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical{flex:1 1 auto;align-self:stretch;min-height:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical .hub-panels__nav-item{width:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical .hub-panels__nav-link{width:calc(100% + var(--hub-panels-border-width));justify-content:flex-start;margin-bottom:0;border-start-start-radius:var(--hub-panels-tab-border-radius);border-start-end-radius:var(--hub-panels-tab-border-end-radius, 0);border-end-start-radius:var(--hub-panels-tab-border-radius);border-end-end-radius:var(--hub-panels-tab-border-end-radius, 0);margin-inline-end:calc(-1 * var(--hub-panels-border-width))}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple)>.hub-panels__content{border:var(--hub-panels-border-width) solid var(--hub-panels-border-color);border-inline-start:0;border-start-end-radius:var(--hub-panels-border-radius);border-end-end-radius:var(--hub-panels-border-radius)}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--tabs .hub-panels__nav-link--active{z-index:1;border-color:var(--hub-panels-border-color);border-inline-end-color:var(--hub-panels-tab-bg-active);box-shadow:var(--hub-panels-tab-active-shadow-vertical)}.hub-panels--pills.hub-panels--vertical>.hub-panels__header{margin-bottom:0;margin-inline-end:var(--hub-panels-nav-content-gap)}.hub-panels--card{display:flex}.hub-panels--card>.hub-panels__content{display:flex;flex-direction:column;gap:var(--hub-panels-card-gap, var(--hub-ref-space-3, 1rem));width:100%;padding:0;background:transparent;box-shadow:none}\n", ".hub-panels__panel--accordion{display:block;color:var(--hub-panels-accordion-color);background-color:var(--hub-panels-accordion-bg);border:var(--hub-panels-accordion-border-width) solid var(--hub-panels-accordion-border-color)}.hub-panels__panel--accordion:not(:first-of-type){border-top:0}.hub-panels__panel--accordion:first-of-type{border-start-start-radius:var(--hub-panels-accordion-border-radius);border-start-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__panel--accordion:first-of-type>.hub-panels__accordion-header,.hub-panels__panel--accordion:first-of-type>.hub-panels__accordion-header .hub-panels__accordion-btn{border-start-start-radius:var(--hub-panels-accordion-inner-border-radius);border-start-end-radius:var(--hub-panels-accordion-inner-border-radius)}.hub-panels__panel--accordion:last-of-type{border-end-start-radius:var(--hub-panels-accordion-border-radius);border-end-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-header:not(.hub-panels__accordion-header--expanded),.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-header .hub-panels__accordion-btn--collapsed{border-end-start-radius:var(--hub-panels-accordion-inner-border-radius);border-end-end-radius:var(--hub-panels-accordion-inner-border-radius)}.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-collapse{border-end-start-radius:var(--hub-panels-accordion-border-radius);border-end-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__accordion-header{position:relative;display:flex;align-items:stretch;margin:0;background-color:var(--hub-panels-accordion-btn-bg);transition:var(--hub-panels-accordion-transition);--hub-panels-accordion-toggle-gutter: calc(var(--hub-panels-accordion-btn-icon-width) + var(--hub-panels-tab-gap))}.hub-panels__accordion-header--expanded{background-color:var(--hub-panels-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--hub-panels-accordion-border-width)) 0 var(--hub-panels-accordion-border-color)}.hub-panels__accordion-actions{display:flex;flex-shrink:0;align-items:center;gap:var(--hub-panels-tab-gap);padding-inline-end:calc(var(--hub-panels-accordion-btn-padding-x) + var(--hub-panels-accordion-toggle-gutter))}.hub-panels__accordion-header:not(:has(>.hub-panels__accordion-actions))>.hub-panels__accordion-btn{padding-inline-end:calc(var(--hub-panels-accordion-btn-padding-x) + var(--hub-panels-accordion-toggle-gutter))}.hub-panels__accordion-btn{display:flex;flex:1 1 auto;align-items:center;min-width:0;gap:var(--hub-panels-tab-gap);padding:var(--hub-panels-accordion-btn-padding-y) var(--hub-panels-accordion-btn-padding-x);font-family:var(--hub-panels-tab-font-family);font-size:var(--hub-panels-tab-font-size);line-height:var(--hub-panels-tab-line-height);text-align:start;color:var(--hub-panels-accordion-btn-color);background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:var(--hub-panels-accordion-transition);cursor:pointer}.hub-panels__accordion-btn:after{position:absolute;z-index:1;inset-block:0;inset-inline-end:var(--hub-panels-accordion-btn-padding-x);flex-shrink:0;width:var(--hub-panels-accordion-btn-icon-width);height:var(--hub-panels-accordion-btn-icon-width);margin-block:auto;content:\"\";background-color:var(--hub-panels-accordion-icon-active-color);-webkit-mask-image:var(--hub-panels-accordion-btn-icon-mask);mask-image:var(--hub-panels-accordion-btn-icon-mask);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center;mask-position:center;transform:var(--hub-panels-accordion-btn-icon-transform);transition:var(--hub-panels-accordion-btn-icon-transition)}.hub-panels__accordion-btn:not(.hub-panels__accordion-btn--collapsed){color:var(--hub-panels-accordion-active-color)}.hub-panels__accordion-btn--collapsed:after{background-color:var(--hub-panels-accordion-icon-color);transform:none}.hub-panels__accordion-btn:hover:not(:disabled){z-index:2}.hub-panels__accordion-btn:focus-visible{z-index:3;outline:0;box-shadow:var(--hub-panels-accordion-btn-focus-box-shadow)}.hub-panels__accordion-btn:disabled{color:var(--hub-panels-tab-color-disabled);cursor:not-allowed}.hub-panels__accordion-collapse{display:grid;grid-template-rows:1fr;transition:grid-template-rows var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing)}.hub-panels__accordion-collapse--collapsed{grid-template-rows:0fr}.hub-panels__accordion-collapse>.hub-panels__accordion-body{min-height:0;overflow:hidden;opacity:1;padding:var(--hub-panels-accordion-body-padding-y) var(--hub-panels-accordion-body-padding-x);transition:opacity var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing),padding var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing)}.hub-panels__accordion-collapse--collapsed>.hub-panels__accordion-body{opacity:0;padding-top:0;padding-bottom:0}.hub-panels__panel--toggle-start>.hub-panels__accordion-header{--hub-panels-accordion-toggle-gutter: 0px}.hub-panels__panel--toggle-start>.hub-panels__accordion-header>.hub-panels__accordion-btn:after{position:static;z-index:auto;order:-1;margin-block:0;margin-inline-start:0;margin-inline-end:var(--hub-panels-tab-gap)}.hub-panels--flush .hub-panels__panel--accordion{border-right:0;border-left:0;border-radius:0}.hub-panels--flush .hub-panels__panel--accordion:first-of-type{border-top:0}.hub-panels--flush .hub-panels__panel--accordion:last-of-type{border-bottom:0}.hub-panels--flush .hub-panels__panel--accordion>.hub-panels__accordion-collapse,.hub-panels--flush .hub-panels__panel--accordion>.hub-panels__accordion-header .hub-panels__accordion-btn{border-radius:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
795
795
  }
796
796
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: PanelsComponent, decorators: [{
797
797
  type: Component,
@@ -814,7 +814,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
814
814
  '[attr.data-variant]': 'variant() ?? null',
815
815
  '[style.--hub-panels-accent]': 'groupAccent()',
816
816
  '(window:resize)': 'onWindowResize()'
817
- }, template: "@if (!isAccordionView() && !isCardView()) {\n\t@if (multiple()) {\n\t\t<div class=\"hub-panels__multiple-layout\">\n\t\t\t@for (group of multipleHeaderGroups(); track group.activePanel ?? group.headers[0]) {\n\t\t\t\t<div\n\t\t\t\t\t#multipleBlock\n\t\t\t\t\tclass=\"hub-panels hub-panels__multiple-block\"\n\t\t\t\t\t[class.hub-panels--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels--vertical]=\"vertical()\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"hub-panels__header\">\n\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (panel of group.headers; track panel) {\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && panelIndex(panel) === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, panelIndex(panel))\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t@if (!justified() && type() !== 'pills' && !vertical()) {\n\t\t\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t@if (group.activePanel) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"hub-panels__content\"\n\t\t\t\t\t\t\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t#multiplePaneHost\n\t\t\t\t\t\t\t\tclass=\"hub-panels__multiple-pane-host\"\n\t\t\t\t\t\t\t\t[attr.data-panel-id]=\"group.activePanel.id()\"\n\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t} @else {\n\t\t<div class=\"hub-panels__header\">\n\t\t\t@if (scrollable() && !backwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#prevBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--backward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollBackwardAriaLabel\"\n\t\t\t\t\t(click)=\"navBackward()\"\n\t\t\t\t></button>\n\t\t\t}\n\n\t\t\t<div #navScroller class=\"hub-panels__nav-scroller\" (scroll)=\"onScroll()\">\n\t\t\t\t<ul\n\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t>\n\t\t\t\t\t@for (panel of panels(); track panel; let index = $index) {\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && index === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, index)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t}\n\t\t\t\t</ul>\n\t\t\t\t@if (!justified() && type() !== 'pills') {\n\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t@if (scrollable() && !forwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#nextBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--forward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollForwardAriaLabel\"\n\t\t\t\t\t(click)=\"navForward()\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t</div>\n\t}\n}\n\n<div\n\t#contentRoot\n\tclass=\"hub-panels__content\"\n\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t[class.hub-panels__content--accordion]=\"isAccordionView()\"\n\t[class.hub-panels__content--multiple-parking]=\"!isAccordionView() && multiple()\"\n>\n\t@if (activePanelHasRouter()) {\n\t\t<router-outlet />\n\t} @else {\n\t\t<ng-content />\n\t}\n</div>\n", styles: [":where(.hub-panels){--hub-panels-accent: var(--hub-sys-color-primary, #0d6efd);--hub-panels-accent-emphasis: color-mix(in oklch, var(--hub-panels-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-panels-accent-subtle: color-mix(in oklch, var(--hub-panels-accent) 12%, var(--hub-sys-surface-page, #ffffff));--hub-panels-accent-on: oklch(from var(--hub-panels-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-panels-flex-direction: row;--hub-panels-border-width: var(--hub-container-border-width, var(--hub-ref-border-width, 1px));--hub-panels-border-color: var(--hub-container-border-color, var(--hub-sys-border-color-default, #dee2e6));--hub-panels-border-radius: var(--hub-container-border-radius, var(--hub-ref-radius-md, .375rem));--hub-panels-content-bg: var(--hub-container-bg, var(--hub-sys-surface-page, #fff));--hub-panels-header-bg: var(--hub-panels-content-bg);--hub-panels-content-box-shadow: none;--hub-panels-content-padding-x: var(--hub-container-padding-x, var(--hub-ref-space-3, 1rem));--hub-panels-content-padding-y: var(--hub-container-padding-y, var(--hub-ref-space-3, 1rem));--hub-panels-nav-btn-width: 1.5rem;--hub-panels-nav-btn-height: 1.5rem;--hub-panels-backward-btn-bg: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23212529' d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3E%3C/svg%3E\");--hub-panels-forward-btn-bg: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23212529' d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E\");--hub-panels-nav-link-padding-x: var(--hub-ref-space-3, 1rem);--hub-panels-nav-link-padding-y: var(--hub-ref-space-2, .5rem);--hub-panels-nav-link-color: var(--hub-sys-text-primary, #212529);--hub-panels-nav-link-hover-color: var(--hub-panels-accent-emphasis);--hub-panels-nav-link-active-color: var(--hub-panels-accent);--hub-panels-nav-link-active-bg: var(--hub-panels-content-bg);--hub-panels-nav-link-disabled-color: var(--hub-sys-text-muted, #6c757d);--hub-panels-tab-font-family: var(--hub-container-font-family, var(--hub-ref-font-family-base));--hub-panels-tab-font-size: var(--hub-container-font-size, var(--hub-ref-font-size-base, 1rem));--hub-panels-tab-font-weight: var(--hub-ref-font-weight-medium, 500);--hub-panels-tab-line-height: var(--hub-ref-line-height-base, 1.5);--hub-panels-tab-padding-x: var(--hub-panels-nav-link-padding-x);--hub-panels-tab-padding-y: var(--hub-panels-nav-link-padding-y);--hub-panels-tab-gap: var(--hub-ref-space-2, .5rem);--hub-panels-tab-bg: transparent;--hub-panels-tab-color: var(--hub-panels-nav-link-color);--hub-panels-tab-border-width: var(--hub-panels-border-width);--hub-panels-tab-border-style: solid;--hub-panels-tab-border-color: transparent;--hub-panels-tab-border-radius: var(--hub-panels-border-radius);--hub-panels-tab-border-end-radius: 0;--hub-panels-tab-bg-hover: var(--hub-ref-surface-2, #f8f9fa);--hub-panels-tab-color-hover: var(--hub-panels-nav-link-hover-color);--hub-panels-tab-bg-active: var(--hub-panels-nav-link-active-bg);--hub-panels-tab-color-active: var(--hub-panels-nav-link-active-color);--hub-panels-tab-border-color-active: var(--hub-panels-accent);--hub-panels-tab-bg-disabled: transparent;--hub-panels-tab-color-disabled: var(--hub-panels-nav-link-disabled-color);--hub-panels-tab-focus-ring-width: var(--hub-sys-focus-ring-width, .25rem);--hub-panels-tab-focus-ring-color: var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25));--hub-panels-tab-transition: var(--hub-sys-transition-base, all .2s ease-in-out);--hub-panels-tab-active-shadow: 0 -.25rem .5rem rgba(0, 0, 0, .06);--hub-panels-tab-active-shadow-vertical: -.25rem 0 .5rem rgba(0, 0, 0, .06);--hub-panels-strip-margin-top: var(--hub-ref-space-2, .5rem);--hub-panels-nav-gap: 0;--hub-panels-pill-border-radius: var(--hub-ref-radius-pill, 50rem);--hub-panels-pill-bg-active: var(--hub-panels-accent);--hub-panels-pill-color-active: var(--hub-panels-accent-on);--hub-panels-pill-gap: var(--hub-ref-space-2, .5rem);--hub-panels-pill-content-border-width: 0;--hub-panels-remove-btn-opacity: .6;--hub-panels-remove-btn-opacity-hover: 1;--hub-panels-nav-content-gap: var(--hub-ref-space-2, .5rem);--hub-panels-pane-min-width: 16rem;--hub-panels-pane-min-height: 8rem;--hub-panels-pane-gap: 0;--hub-panels-card-gap: var(--hub-ref-space-3, 1rem);--hub-panels-accordion-color: var(--hub-accordion-color, var(--hub-sys-text-primary, #212529));--hub-panels-accordion-bg: var(--hub-accordion-bg, var(--hub-sys-surface-page, #fff));--hub-panels-accordion-border-width: var(--hub-accordion-border-width, var(--hub-ref-border-width, 1px));--hub-panels-accordion-border-color: var(--hub-accordion-border-color, var(--hub-sys-border-color-default, #dee2e6));--hub-panels-accordion-border-radius: var(--hub-accordion-border-radius, var(--hub-ref-radius-sm, .25rem));--hub-panels-accordion-inner-border-radius: var( --hub-accordion-inner-border-radius, calc(var(--hub-panels-accordion-border-radius) - var(--hub-panels-accordion-border-width)) );--hub-panels-accordion-btn-padding-x: var(--hub-accordion-btn-padding-x, 1.25rem);--hub-panels-accordion-btn-padding-y: var(--hub-accordion-btn-padding-y, var(--hub-ref-space-3, 1rem));--hub-panels-accordion-btn-color: var(--hub-accordion-btn-color, var(--hub-sys-text-primary, #212529));--hub-panels-accordion-btn-bg: var(--hub-accordion-btn-bg, var(--hub-sys-surface-page, #fff));--hub-panels-accordion-active-color: var(--hub-accordion-active-color, var(--hub-panels-accent-emphasis));--hub-panels-accordion-active-bg: var(--hub-accordion-active-bg, var(--hub-panels-accent-subtle));--hub-panels-accordion-icon-color: var(--hub-accordion-icon-color, var(--hub-panels-accordion-btn-color));--hub-panels-accordion-icon-active-color: var(--hub-accordion-icon-active-color, var(--hub-panels-accordion-active-color));--hub-panels-accordion-btn-icon-mask: var(--hub-accordion-btn-icon-mask, url(\"data:image/svg+xml;charset=UTF-8,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E\"));--hub-panels-accordion-btn-icon-width: var(--hub-accordion-btn-icon-width, 1.25rem);--hub-panels-accordion-btn-icon-transform: var(--hub-accordion-btn-icon-transform, rotate(-180deg));--hub-panels-accordion-btn-icon-transition: var(--hub-accordion-btn-icon-transition, transform .2s ease-in-out);--hub-panels-accordion-btn-focus-box-shadow: var( --hub-accordion-btn-focus-box-shadow, 0 0 0 var(--hub-sys-focus-ring-width, .25rem) var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25)) );--hub-panels-accordion-transition: var( --hub-accordion-transition, color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease );--hub-panels-accordion-collapse-transition-duration: var(--hub-accordion-collapse-transition-duration, .25s);--hub-panels-accordion-collapse-transition-easing: var( --hub-accordion-collapse-transition-easing, cubic-bezier(.4, 0, .2, 1) );--hub-panels-accordion-body-padding-x: var(--hub-accordion-body-padding-x, 1.25rem);--hub-panels-accordion-body-padding-y: var(--hub-accordion-body-padding-y, var(--hub-ref-space-3, 1rem))}:where(.hub-panels[data-variant=primary]){--hub-panels-accent: var(--hub-sys-color-primary)}:where(.hub-panels[data-variant=secondary]){--hub-panels-accent: var(--hub-sys-color-secondary)}:where(.hub-panels[data-variant=success]){--hub-panels-accent: var(--hub-sys-color-success)}:where(.hub-panels[data-variant=danger]){--hub-panels-accent: var(--hub-sys-color-danger)}:where(.hub-panels[data-variant=warning]){--hub-panels-accent: var(--hub-sys-color-warning)}:where(.hub-panels[data-variant=info]){--hub-panels-accent: var(--hub-sys-color-info)}:where(.hub-panels[data-variant=neutral]){--hub-panels-accent: var(--hub-sys-color-neutral)}:where(.hub-panels[data-variant=light]){--hub-panels-accent: var(--hub-sys-color-light)}:where(.hub-panels[data-variant=dark]){--hub-panels-accent: var(--hub-sys-color-dark)}\n", ".hub-panels{display:block;width:100%;box-sizing:border-box}.hub-panels,.hub-panels *,.hub-panels *:before,.hub-panels *:after{box-sizing:border-box}.hub-panels__header{display:flex;flex-direction:var(--hub-panels-flex-direction);align-items:stretch;background:var(--hub-panels-header-bg)}.hub-panels__scroll-btn{flex:0 0 auto;align-self:center;width:var(--hub-panels-nav-btn-width);height:var(--hub-panels-nav-btn-height);padding:0;border:0;cursor:pointer;background-color:transparent;background-position:center;background-repeat:no-repeat;background-size:1rem 1rem}.hub-panels__scroll-btn--backward{background-image:var(--hub-panels-backward-btn-bg)}.hub-panels__scroll-btn--forward{background-image:var(--hub-panels-forward-btn-bg)}.hub-panels__nav-scroller{display:flex;flex:1 1 auto;overflow-x:auto;background:var(--hub-panels-header-bg);scroll-behavior:smooth;scrollbar-width:none}.hub-panels__nav-scroller::-webkit-scrollbar{display:none}.hub-panels__nav{display:flex;flex:0 0 auto;flex-wrap:nowrap;gap:var(--hub-panels-nav-gap);margin:0;padding:0;list-style:none}.hub-panels__nav--tabs{border-bottom:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__nav--tabs .hub-panels__nav-link{margin-bottom:calc(-1 * var(--hub-panels-border-width))}.hub-panels__nav--pills{gap:var(--hub-panels-pill-gap)}.hub-panels__nav--pills .hub-panels__nav-link{border-radius:var(--hub-panels-pill-border-radius)}.hub-panels__nav--pills .hub-panels__nav-link--active{color:var(--hub-panels-pill-color-active);background:var(--hub-panels-pill-bg-active);border-color:transparent}.hub-panels__nav--justified{flex:1 1 auto}.hub-panels__nav--justified .hub-panels__nav-item{flex:1 1 0}.hub-panels__nav--justified .hub-panels__nav-link{width:100%;justify-content:center}.hub-panels__nav--vertical{flex-direction:column}.hub-panels__nav--vertical.hub-panels__nav--tabs{border-bottom:0;border-inline-end:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__nav--vertical.hub-panels__nav--tabs .hub-panels__nav-link{margin-bottom:0;margin-inline-end:calc(-1 * var(--hub-panels-border-width))}.hub-panels__nav-item{display:flex;flex:0 0 auto}.hub-panels__nav-link{position:relative;display:inline-flex;align-items:center;gap:var(--hub-panels-tab-gap);padding:var(--hub-panels-tab-padding-y) var(--hub-panels-tab-padding-x);font-family:var(--hub-panels-tab-font-family);font-size:var(--hub-panels-tab-font-size);font-weight:var(--hub-panels-tab-font-weight);line-height:var(--hub-panels-tab-line-height);white-space:nowrap;color:var(--hub-panels-tab-color);background:var(--hub-panels-tab-bg);border-style:var(--hub-panels-tab-border-style);border-width:var(--hub-panels-tab-border-width);border-color:var(--hub-panels-tab-border-color);border-start-start-radius:var(--hub-panels-tab-border-radius);border-start-end-radius:var(--hub-panels-tab-border-radius);cursor:pointer;transition:var(--hub-panels-tab-transition)}.hub-panels__nav-link:hover:not(:disabled):not(.hub-panels__nav-link--active){color:var(--hub-panels-tab-color-hover);background:var(--hub-panels-tab-bg-hover)}.hub-panels__nav-link:focus-visible{z-index:1;outline:0;box-shadow:0 0 0 var(--hub-panels-tab-focus-ring-width) var(--hub-panels-tab-focus-ring-color)}.hub-panels__nav-link--active{color:var(--hub-panels-tab-color-active);background:var(--hub-panels-tab-bg-active);border-color:var(--hub-panels-tab-border-color-active)}.hub-panels__nav-link:disabled{color:var(--hub-panels-tab-color-disabled);background:var(--hub-panels-tab-bg-disabled);cursor:not-allowed}.hub-panels__remove-btn{display:inline-flex;align-items:center;line-height:1;opacity:var(--hub-panels-remove-btn-opacity)}.hub-panels__remove-btn:hover{opacity:var(--hub-panels-remove-btn-opacity-hover)}.hub-panels__spacer{flex:1 1 auto;background:var(--hub-panels-header-bg);border-bottom:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__content{padding:var(--hub-panels-content-padding-y) var(--hub-panels-content-padding-x);background:var(--hub-panels-content-bg);box-shadow:var(--hub-panels-content-box-shadow)}.hub-panels__content--accordion{padding:0;background:transparent;box-shadow:none}.hub-panels__content--multiple-parking{display:none}.hub-panels__multiple-layout{display:flex;align-items:stretch;gap:var(--hub-panels-pane-gap);overflow-x:auto;overflow-y:hidden;scroll-behavior:smooth}.hub-panels__multiple-block{display:flex;flex-direction:column;flex:1 0 var(--hub-panels-pane-min-width);align-self:stretch;min-width:var(--hub-panels-pane-min-width);min-height:100%}.hub-panels__multiple-block.hub-panels--vertical{flex-direction:row;flex:1 1 auto;width:100%;min-width:100%;min-height:var(--hub-panels-pane-min-height)}.hub-panels__multiple-block>.hub-panels__content{display:flex;flex:1 1 auto;min-height:0}.hub-panels__multiple-block.hub-panels--vertical>.hub-panels__content{flex:1 1 auto;width:auto;min-width:max(var(--hub-panels-pane-min-width),var(--hub-panels-multiple-vertical-panel-min-width, 0px))}.hub-panels__multiple-pane-host{display:flex;flex:1 1 auto;width:100%;min-height:0}.hub-panels__multiple-pane-host>.hub-panels__panel{flex:1 1 auto;width:100%;height:100%}.hub-panels__multiple-pane-host>.hub-panels__panel.hub-panels__panel--active{display:flex;flex-direction:column}.hub-panels__multiple-pane-host>.hub-panels__panel.hub-panels__panel--active>div{flex:1 1 auto;min-height:0}.hub-panels--vertical.hub-panels--multiple>.hub-panels__multiple-layout{flex-direction:column;align-items:stretch;width:100%}.hub-panels--pills.hub-panels--multiple.hub-panels--vertical>.hub-panels__multiple-layout>.hub-panels__multiple-block+.hub-panels__multiple-block{padding-top:var(--hub-panels-nav-content-gap);border-top:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__panel{display:none}.hub-panels__panel--active{display:block}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple)>.hub-panels__header{margin-top:var(--hub-panels-strip-margin-top)}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple)>.hub-panels__content{border:var(--hub-panels-border-width) solid var(--hub-panels-border-color);border-top:0;border-end-start-radius:var(--hub-panels-border-radius);border-end-end-radius:var(--hub-panels-border-radius)}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple) .hub-panels__nav--tabs .hub-panels__nav-link--active{border-color:var(--hub-panels-border-color);border-bottom-color:var(--hub-panels-tab-bg-active);box-shadow:var(--hub-panels-tab-active-shadow)}.hub-panels--pills>.hub-panels__header{margin-bottom:var(--hub-panels-nav-content-gap)}.hub-panels--pills>.hub-panels__content{border:var(--hub-panels-pill-content-border-width) solid var(--hub-panels-border-color);border-radius:var(--hub-panels-border-radius)}.hub-panels--vertical{display:flex;align-items:stretch}.hub-panels--vertical .hub-panels__header{flex-direction:column}.hub-panels--vertical .hub-panels__nav-scroller{overflow:visible}.hub-panels--vertical .hub-panels__content{flex:1 1 auto;min-width:0}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple)>.hub-panels__header{margin-inline-start:var(--hub-panels-strip-margin-top);align-self:stretch;min-height:0}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__spacer{display:none}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav-scroller{flex:1 1 auto;align-self:stretch;min-height:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical{flex:1 1 auto;align-self:stretch;min-height:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical .hub-panels__nav-item{width:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical .hub-panels__nav-link{width:calc(100% + var(--hub-panels-border-width));justify-content:flex-start;margin-bottom:0;border-start-start-radius:var(--hub-panels-tab-border-radius);border-start-end-radius:var(--hub-panels-tab-border-end-radius, 0);border-end-start-radius:var(--hub-panels-tab-border-radius);border-end-end-radius:var(--hub-panels-tab-border-end-radius, 0);margin-inline-end:calc(-1 * var(--hub-panels-border-width))}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple)>.hub-panels__content{border:var(--hub-panels-border-width) solid var(--hub-panels-border-color);border-inline-start:0;border-start-end-radius:var(--hub-panels-border-radius);border-end-end-radius:var(--hub-panels-border-radius)}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--tabs .hub-panels__nav-link--active{z-index:1;border-color:var(--hub-panels-border-color);border-inline-end-color:var(--hub-panels-tab-bg-active);box-shadow:var(--hub-panels-tab-active-shadow-vertical)}.hub-panels--pills.hub-panels--vertical>.hub-panels__header{margin-bottom:0;margin-inline-end:var(--hub-panels-nav-content-gap)}.hub-panels--card{display:flex}.hub-panels--card>.hub-panels__content{display:flex;flex-direction:column;gap:var(--hub-panels-card-gap, var(--hub-ref-space-3, 1rem));width:100%;padding:0;background:transparent;box-shadow:none}\n", ".hub-panels__panel--accordion{display:block;color:var(--hub-panels-accordion-color);background-color:var(--hub-panels-accordion-bg);border:var(--hub-panels-accordion-border-width) solid var(--hub-panels-accordion-border-color)}.hub-panels__panel--accordion:not(:first-of-type){border-top:0}.hub-panels__panel--accordion:first-of-type{border-start-start-radius:var(--hub-panels-accordion-border-radius);border-start-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__panel--accordion:first-of-type>.hub-panels__accordion-header,.hub-panels__panel--accordion:first-of-type>.hub-panels__accordion-header .hub-panels__accordion-btn{border-start-start-radius:var(--hub-panels-accordion-inner-border-radius);border-start-end-radius:var(--hub-panels-accordion-inner-border-radius)}.hub-panels__panel--accordion:last-of-type{border-end-start-radius:var(--hub-panels-accordion-border-radius);border-end-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-header:not(.hub-panels__accordion-header--expanded),.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-header .hub-panels__accordion-btn--collapsed{border-end-start-radius:var(--hub-panels-accordion-inner-border-radius);border-end-end-radius:var(--hub-panels-accordion-inner-border-radius)}.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-collapse{border-end-start-radius:var(--hub-panels-accordion-border-radius);border-end-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__accordion-header{position:relative;display:flex;align-items:stretch;margin:0;background-color:var(--hub-panels-accordion-btn-bg);transition:var(--hub-panels-accordion-transition);--hub-panels-accordion-toggle-gutter: calc( var(--hub-panels-accordion-btn-icon-width) + var(--hub-panels-tab-gap) )}.hub-panels__accordion-header--expanded{background-color:var(--hub-panels-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--hub-panels-accordion-border-width)) 0 var(--hub-panels-accordion-border-color)}.hub-panels__accordion-actions{display:flex;flex-shrink:0;align-items:center;gap:var(--hub-panels-tab-gap);padding-inline-end:calc(var(--hub-panels-accordion-btn-padding-x) + var(--hub-panels-accordion-toggle-gutter))}.hub-panels__accordion-header:not(:has(>.hub-panels__accordion-actions))>.hub-panels__accordion-btn{padding-inline-end:calc(var(--hub-panels-accordion-btn-padding-x) + var(--hub-panels-accordion-toggle-gutter))}.hub-panels__accordion-btn{display:flex;flex:1 1 auto;align-items:center;min-width:0;gap:var(--hub-panels-tab-gap);padding:var(--hub-panels-accordion-btn-padding-y) var(--hub-panels-accordion-btn-padding-x);font-family:var(--hub-panels-tab-font-family);font-size:var(--hub-panels-tab-font-size);line-height:var(--hub-panels-tab-line-height);text-align:start;color:var(--hub-panels-accordion-btn-color);background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:var(--hub-panels-accordion-transition);cursor:pointer}.hub-panels__accordion-btn:after{position:absolute;z-index:1;inset-block:0;inset-inline-end:var(--hub-panels-accordion-btn-padding-x);flex-shrink:0;width:var(--hub-panels-accordion-btn-icon-width);height:var(--hub-panels-accordion-btn-icon-width);margin-block:auto;content:\"\";background-color:var(--hub-panels-accordion-icon-active-color);-webkit-mask-image:var(--hub-panels-accordion-btn-icon-mask);mask-image:var(--hub-panels-accordion-btn-icon-mask);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center;mask-position:center;transform:var(--hub-panels-accordion-btn-icon-transform);transition:var(--hub-panels-accordion-btn-icon-transition)}.hub-panels__accordion-btn:not(.hub-panels__accordion-btn--collapsed){color:var(--hub-panels-accordion-active-color)}.hub-panels__accordion-btn--collapsed:after{background-color:var(--hub-panels-accordion-icon-color);transform:none}.hub-panels__accordion-btn:hover:not(:disabled){z-index:2}.hub-panels__accordion-btn:focus-visible{z-index:3;outline:0;box-shadow:var(--hub-panels-accordion-btn-focus-box-shadow)}.hub-panels__accordion-btn:disabled{color:var(--hub-panels-tab-color-disabled);cursor:not-allowed}.hub-panels__accordion-collapse{display:grid;grid-template-rows:1fr;transition:grid-template-rows var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing)}.hub-panels__accordion-collapse--collapsed{grid-template-rows:0fr}.hub-panels__accordion-collapse>.hub-panels__accordion-body{min-height:0;overflow:hidden;opacity:1;padding:var(--hub-panels-accordion-body-padding-y) var(--hub-panels-accordion-body-padding-x);transition:opacity var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing),padding var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing)}.hub-panels__accordion-collapse--collapsed>.hub-panels__accordion-body{opacity:0;padding-top:0;padding-bottom:0}.hub-panels__panel--toggle-start>.hub-panels__accordion-header{--hub-panels-accordion-toggle-gutter: 0px}.hub-panels__panel--toggle-start>.hub-panels__accordion-header>.hub-panels__accordion-btn:after{position:static;z-index:auto;order:-1;margin-block:0;margin-inline-start:0;margin-inline-end:var(--hub-panels-tab-gap)}.hub-panels--flush .hub-panels__panel--accordion{border-right:0;border-left:0;border-radius:0}.hub-panels--flush .hub-panels__panel--accordion:first-of-type{border-top:0}.hub-panels--flush .hub-panels__panel--accordion:last-of-type{border-bottom:0}.hub-panels--flush .hub-panels__panel--accordion>.hub-panels__accordion-collapse,.hub-panels--flush .hub-panels__panel--accordion>.hub-panels__accordion-header .hub-panels__accordion-btn{border-radius:0}\n"] }]
817
+ }, template: "@if (!isAccordionView() && !isCardView()) {\n\t@if (multiple()) {\n\t\t<div class=\"hub-panels__multiple-layout\">\n\t\t\t@for (group of multipleHeaderGroups(); track group.activePanel ?? group.headers[0]) {\n\t\t\t\t<div\n\t\t\t\t\t#multipleBlock\n\t\t\t\t\tclass=\"hub-panels hub-panels__multiple-block\"\n\t\t\t\t\t[class.hub-panels--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels--vertical]=\"vertical()\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"hub-panels__header\">\n\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (panel of group.headers; track panel) {\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && panelIndex(panel) === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, panelIndex(panel))\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t@if (!justified() && type() !== 'pills' && !vertical()) {\n\t\t\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t@if (group.activePanel) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"hub-panels__content\"\n\t\t\t\t\t\t\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t#multiplePaneHost\n\t\t\t\t\t\t\t\tclass=\"hub-panels__multiple-pane-host\"\n\t\t\t\t\t\t\t\t[attr.data-panel-id]=\"group.activePanel.id()\"\n\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t} @else {\n\t\t<div class=\"hub-panels__header\">\n\t\t\t@if (scrollable() && !backwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#prevBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--backward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollBackwardAriaLabel\"\n\t\t\t\t\t(click)=\"navBackward()\"\n\t\t\t\t></button>\n\t\t\t}\n\n\t\t\t<div #navScroller class=\"hub-panels__nav-scroller\" (scroll)=\"onScroll()\">\n\t\t\t\t<ul\n\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t>\n\t\t\t\t\t@for (panel of panels(); track panel; let index = $index) {\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && index === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, index)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t}\n\t\t\t\t</ul>\n\t\t\t\t@if (!justified() && type() !== 'pills') {\n\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t@if (scrollable() && !forwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#nextBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--forward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollForwardAriaLabel\"\n\t\t\t\t\t(click)=\"navForward()\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t</div>\n\t}\n}\n\n<div\n\t#contentRoot\n\tclass=\"hub-panels__content\"\n\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t[class.hub-panels__content--accordion]=\"isAccordionView()\"\n\t[class.hub-panels__content--multiple-parking]=\"!isAccordionView() && multiple()\"\n>\n\t@if (activePanelHasRouter()) {\n\t\t<router-outlet />\n\t} @else {\n\t\t<ng-content />\n\t}\n</div>\n", styles: [":where(.hub-panels){--hub-panels-accent: var(--hub-sys-color-primary, #0d6efd);--hub-panels-accent-emphasis: color-mix(in oklch, var(--hub-panels-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-panels-accent-subtle: color-mix(in oklch, var(--hub-panels-accent) 12%, var(--hub-sys-surface-page, #ffffff));--hub-panels-accent-on: oklch(from var(--hub-panels-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-panels-flex-direction: row;--hub-panels-border-width: var(--hub-container-border-width, var(--hub-ref-border-width, 1px));--hub-panels-border-color: var(--hub-container-border-color, var(--hub-sys-border-color-default, #dee2e6));--hub-panels-border-radius: var(--hub-container-border-radius, var(--hub-ref-radius-md, .375rem));--hub-panels-content-bg: var(--hub-container-bg, var(--hub-sys-surface-page, #fff));--hub-panels-header-bg: var(--hub-panels-content-bg);--hub-panels-content-box-shadow: none;--hub-panels-content-padding-x: var(--hub-container-padding-x, var(--hub-ref-space-3, 1rem));--hub-panels-content-padding-y: var(--hub-container-padding-y, var(--hub-ref-space-3, 1rem));--hub-panels-nav-btn-width: 1.5rem;--hub-panels-nav-btn-height: 1.5rem;--hub-panels-backward-btn-bg: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23212529' d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3E%3C/svg%3E\");--hub-panels-forward-btn-bg: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23212529' d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E\");--hub-panels-nav-link-padding-x: var(--hub-ref-space-3, 1rem);--hub-panels-nav-link-padding-y: var(--hub-ref-space-2, .5rem);--hub-panels-nav-link-color: var(--hub-sys-text-primary, #212529);--hub-panels-nav-link-hover-color: var(--hub-panels-accent-emphasis);--hub-panels-nav-link-active-color: var(--hub-panels-accent);--hub-panels-nav-link-active-bg: var(--hub-panels-content-bg);--hub-panels-nav-link-disabled-color: var(--hub-sys-text-muted, #6c757d);--hub-panels-tab-font-family: var(--hub-container-font-family, var(--hub-ref-font-family-base));--hub-panels-tab-font-size: var(--hub-container-font-size, var(--hub-ref-font-size-base, 1rem));--hub-panels-tab-font-weight: var(--hub-ref-font-weight-medium, 500);--hub-panels-tab-line-height: var(--hub-ref-line-height-base, 1.5);--hub-panels-tab-padding-x: var(--hub-panels-nav-link-padding-x);--hub-panels-tab-padding-y: var(--hub-panels-nav-link-padding-y);--hub-panels-tab-gap: var(--hub-ref-space-2, .5rem);--hub-panels-tab-bg: transparent;--hub-panels-tab-color: var(--hub-panels-nav-link-color);--hub-panels-tab-border-width: var(--hub-panels-border-width);--hub-panels-tab-border-style: solid;--hub-panels-tab-border-color: transparent;--hub-panels-tab-border-radius: var(--hub-panels-border-radius);--hub-panels-tab-border-end-radius: 0;--hub-panels-tab-bg-hover: var(--hub-ref-surface-2, #f8f9fa);--hub-panels-tab-color-hover: var(--hub-panels-nav-link-hover-color);--hub-panels-tab-bg-active: var(--hub-panels-nav-link-active-bg);--hub-panels-tab-color-active: var(--hub-panels-nav-link-active-color);--hub-panels-tab-border-color-active: var(--hub-panels-accent);--hub-panels-tab-bg-disabled: transparent;--hub-panels-tab-color-disabled: var(--hub-panels-nav-link-disabled-color);--hub-panels-tab-focus-ring-width: var(--hub-sys-focus-ring-width, .25rem);--hub-panels-tab-focus-ring-color: var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25));--hub-panels-tab-transition: var(--hub-sys-transition-base, all .2s ease-in-out);--hub-panels-tab-active-shadow: 0 -.25rem .5rem rgba(0, 0, 0, .06);--hub-panels-tab-active-shadow-vertical: -.25rem 0 .5rem rgba(0, 0, 0, .06);--hub-panels-strip-margin-top: var(--hub-ref-space-2, .5rem);--hub-panels-nav-gap: 0;--hub-panels-pill-border-radius: var(--hub-ref-radius-pill, 50rem);--hub-panels-pill-bg-active: var(--hub-panels-accent);--hub-panels-pill-color-active: var(--hub-panels-accent-on);--hub-panels-pill-gap: var(--hub-ref-space-2, .5rem);--hub-panels-pill-content-border-width: 0;--hub-panels-remove-btn-opacity: .6;--hub-panels-remove-btn-opacity-hover: 1;--hub-panels-nav-content-gap: var(--hub-ref-space-2, .5rem);--hub-panels-pane-min-width: 16rem;--hub-panels-pane-min-height: 8rem;--hub-panels-pane-gap: 0;--hub-panels-card-gap: var(--hub-ref-space-3, 1rem);--hub-panels-accordion-color: var(--hub-accordion-color, var(--hub-sys-text-primary, #212529));--hub-panels-accordion-bg: var(--hub-accordion-bg, var(--hub-sys-surface-page, #fff));--hub-panels-accordion-border-width: var(--hub-accordion-border-width, var(--hub-ref-border-width, 1px));--hub-panels-accordion-border-color: var(--hub-accordion-border-color, var(--hub-sys-border-color-default, #dee2e6));--hub-panels-accordion-border-radius: var(--hub-accordion-border-radius, var(--hub-ref-radius-sm, .25rem));--hub-panels-accordion-inner-border-radius: var( --hub-accordion-inner-border-radius, calc(var(--hub-panels-accordion-border-radius) - var(--hub-panels-accordion-border-width)) );--hub-panels-accordion-btn-padding-x: var(--hub-accordion-btn-padding-x, 1.25rem);--hub-panels-accordion-btn-padding-y: var(--hub-accordion-btn-padding-y, var(--hub-ref-space-3, 1rem));--hub-panels-accordion-btn-color: var(--hub-accordion-btn-color, var(--hub-sys-text-primary, #212529));--hub-panels-accordion-btn-bg: var(--hub-accordion-btn-bg, var(--hub-sys-surface-page, #fff));--hub-panels-accordion-active-color: var(--hub-accordion-active-color, var(--hub-panels-accent-emphasis));--hub-panels-accordion-active-bg: var(--hub-accordion-active-bg, var(--hub-panels-accent-subtle));--hub-panels-accordion-icon-color: var(--hub-accordion-icon-color, var(--hub-panels-accordion-btn-color));--hub-panels-accordion-icon-active-color: var(--hub-accordion-icon-active-color, var(--hub-panels-accordion-active-color));--hub-panels-accordion-btn-icon-mask: var(--hub-accordion-btn-icon-mask, url(\"data:image/svg+xml;charset=UTF-8,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E\"));--hub-panels-accordion-btn-icon-width: var(--hub-accordion-btn-icon-width, 1.25rem);--hub-panels-accordion-btn-icon-transform: var(--hub-accordion-btn-icon-transform, rotate(-180deg));--hub-panels-accordion-btn-icon-transition: var(--hub-accordion-btn-icon-transition, transform .2s ease-in-out);--hub-panels-accordion-btn-focus-box-shadow: var( --hub-accordion-btn-focus-box-shadow, 0 0 0 var(--hub-sys-focus-ring-width, .25rem) var(--hub-sys-focus-ring-color, rgba(13, 110, 253, .25)) );--hub-panels-accordion-transition: var( --hub-accordion-transition, color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease );--hub-panels-accordion-collapse-transition-duration: var(--hub-accordion-collapse-transition-duration, .25s);--hub-panels-accordion-collapse-transition-easing: var( --hub-accordion-collapse-transition-easing, cubic-bezier(.4, 0, .2, 1) );--hub-panels-accordion-body-padding-x: var(--hub-accordion-body-padding-x, 1.25rem);--hub-panels-accordion-body-padding-y: var(--hub-accordion-body-padding-y, var(--hub-ref-space-3, 1rem))}:where(.hub-panels[data-variant=primary]){--hub-panels-accent: var(--hub-sys-color-primary)}:where(.hub-panels[data-variant=secondary]){--hub-panels-accent: var(--hub-sys-color-secondary)}:where(.hub-panels[data-variant=success]){--hub-panels-accent: var(--hub-sys-color-success)}:where(.hub-panels[data-variant=danger]){--hub-panels-accent: var(--hub-sys-color-danger)}:where(.hub-panels[data-variant=warning]){--hub-panels-accent: var(--hub-sys-color-warning)}:where(.hub-panels[data-variant=info]){--hub-panels-accent: var(--hub-sys-color-info)}:where(.hub-panels[data-variant=neutral]){--hub-panels-accent: var(--hub-sys-color-neutral)}:where(.hub-panels[data-variant=light]){--hub-panels-accent: var(--hub-sys-color-light)}:where(.hub-panels[data-variant=dark]){--hub-panels-accent: var(--hub-sys-color-dark)}\n", ".hub-panels{display:block;width:100%;box-sizing:border-box}.hub-panels,.hub-panels *,.hub-panels *:before,.hub-panels *:after{box-sizing:border-box}.hub-panels__header{display:flex;flex-direction:var(--hub-panels-flex-direction);align-items:stretch;background:var(--hub-panels-header-bg)}.hub-panels__scroll-btn{flex:0 0 auto;align-self:center;width:var(--hub-panels-nav-btn-width);height:var(--hub-panels-nav-btn-height);padding:0;border:0;cursor:pointer;background-color:transparent;background-position:center;background-repeat:no-repeat;background-size:1rem 1rem}.hub-panels__scroll-btn--backward{background-image:var(--hub-panels-backward-btn-bg)}.hub-panels__scroll-btn--forward{background-image:var(--hub-panels-forward-btn-bg)}.hub-panels__nav-scroller{display:flex;flex:1 1 auto;overflow-x:auto;background:var(--hub-panels-header-bg);scroll-behavior:smooth;scrollbar-width:none}.hub-panels__nav-scroller::-webkit-scrollbar{display:none}.hub-panels__nav{display:flex;flex:0 0 auto;flex-wrap:nowrap;gap:var(--hub-panels-nav-gap);margin:0;padding:0;list-style:none}.hub-panels__nav--tabs{border-bottom:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__nav--tabs .hub-panels__nav-link{margin-bottom:calc(-1 * var(--hub-panels-border-width))}.hub-panels__nav--pills{gap:var(--hub-panels-pill-gap)}.hub-panels__nav--pills .hub-panels__nav-link{border-radius:var(--hub-panels-pill-border-radius)}.hub-panels__nav--pills .hub-panels__nav-link--active{color:var(--hub-panels-pill-color-active);background:var(--hub-panels-pill-bg-active);border-color:transparent}.hub-panels__nav--justified{flex:1 1 auto}.hub-panels__nav--justified .hub-panels__nav-item{flex:1 1 0}.hub-panels__nav--justified .hub-panels__nav-link{width:100%;justify-content:center}.hub-panels__nav--vertical{flex-direction:column}.hub-panels__nav--vertical.hub-panels__nav--tabs{border-bottom:0;border-inline-end:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__nav--vertical.hub-panels__nav--tabs .hub-panels__nav-link{margin-bottom:0;margin-inline-end:calc(-1 * var(--hub-panels-border-width))}.hub-panels__nav-item{display:flex;flex:0 0 auto}.hub-panels__nav-link{position:relative;display:inline-flex;align-items:center;gap:var(--hub-panels-tab-gap);padding:var(--hub-panels-tab-padding-y) var(--hub-panels-tab-padding-x);font-family:var(--hub-panels-tab-font-family);font-size:var(--hub-panels-tab-font-size);font-weight:var(--hub-panels-tab-font-weight);line-height:var(--hub-panels-tab-line-height);white-space:nowrap;color:var(--hub-panels-tab-color);background:var(--hub-panels-tab-bg);border-style:var(--hub-panels-tab-border-style);border-width:var(--hub-panels-tab-border-width);border-color:var(--hub-panels-tab-border-color);border-start-start-radius:var(--hub-panels-tab-border-radius);border-start-end-radius:var(--hub-panels-tab-border-radius);cursor:pointer;transition:var(--hub-panels-tab-transition)}.hub-panels__nav-link:hover:not(:disabled):not(.hub-panels__nav-link--active){color:var(--hub-panels-tab-color-hover);background:var(--hub-panels-tab-bg-hover)}.hub-panels__nav-link:focus-visible{z-index:1;outline:0;box-shadow:0 0 0 var(--hub-panels-tab-focus-ring-width) var(--hub-panels-tab-focus-ring-color)}.hub-panels__nav-link--active{color:var(--hub-panels-tab-color-active);background:var(--hub-panels-tab-bg-active);border-color:var(--hub-panels-tab-border-color-active)}.hub-panels__nav-link:disabled{color:var(--hub-panels-tab-color-disabled);background:var(--hub-panels-tab-bg-disabled);cursor:not-allowed}.hub-panels__remove-btn{display:inline-flex;align-items:center;line-height:1;opacity:var(--hub-panels-remove-btn-opacity)}.hub-panels__remove-btn:hover{opacity:var(--hub-panels-remove-btn-opacity-hover)}.hub-panels__spacer{flex:1 1 auto;background:var(--hub-panels-header-bg);border-bottom:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__content{padding:var(--hub-panels-content-padding-y) var(--hub-panels-content-padding-x);background:var(--hub-panels-content-bg);box-shadow:var(--hub-panels-content-box-shadow)}.hub-panels__content--accordion{padding:0;background:transparent;box-shadow:none}.hub-panels__content--multiple-parking{display:none}.hub-panels__multiple-layout{display:flex;align-items:stretch;gap:var(--hub-panels-pane-gap);overflow-x:auto;overflow-y:hidden;scroll-behavior:smooth}.hub-panels__multiple-block{display:flex;flex-direction:column;flex:1 0 var(--hub-panels-pane-min-width);align-self:stretch;min-width:var(--hub-panels-pane-min-width);min-height:100%}.hub-panels__multiple-block.hub-panels--vertical{flex-direction:row;flex:1 1 auto;width:100%;min-width:100%;min-height:var(--hub-panels-pane-min-height)}.hub-panels__multiple-block>.hub-panels__content{display:flex;flex:1 1 auto;min-height:0}.hub-panels__multiple-block.hub-panels--vertical>.hub-panels__content{flex:1 1 auto;width:auto;min-width:max(var(--hub-panels-pane-min-width),var(--hub-panels-multiple-vertical-panel-min-width, 0px))}.hub-panels__multiple-pane-host{display:flex;flex:1 1 auto;width:100%;min-height:0}.hub-panels__multiple-pane-host>.hub-panels__panel{flex:1 1 auto;width:100%;height:100%}.hub-panels__multiple-pane-host>.hub-panels__panel.hub-panels__panel--active{display:flex;flex-direction:column}.hub-panels__multiple-pane-host>.hub-panels__panel.hub-panels__panel--active>div{flex:1 1 auto;min-height:0}.hub-panels--vertical.hub-panels--multiple>.hub-panels__multiple-layout{flex-direction:column;align-items:stretch;width:100%}.hub-panels--pills.hub-panels--multiple.hub-panels--vertical>.hub-panels__multiple-layout>.hub-panels__multiple-block+.hub-panels__multiple-block{padding-top:var(--hub-panels-nav-content-gap);border-top:var(--hub-panels-border-width) solid var(--hub-panels-border-color)}.hub-panels__panel{display:none}.hub-panels__panel--active{display:block}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple)>.hub-panels__header{margin-top:var(--hub-panels-strip-margin-top)}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple)>.hub-panels__content{border:var(--hub-panels-border-width) solid var(--hub-panels-border-color);border-top:0;border-end-start-radius:var(--hub-panels-border-radius);border-end-end-radius:var(--hub-panels-border-radius)}.hub-panels--tabs:not(.hub-panels--vertical):not(.hub-panels--multiple) .hub-panels__nav--tabs .hub-panels__nav-link--active{border-color:var(--hub-panels-border-color);border-bottom-color:var(--hub-panels-tab-bg-active);box-shadow:var(--hub-panels-tab-active-shadow)}.hub-panels--pills>.hub-panels__header{margin-bottom:var(--hub-panels-nav-content-gap)}.hub-panels--pills>.hub-panels__content{border:var(--hub-panels-pill-content-border-width) solid var(--hub-panels-border-color);border-radius:var(--hub-panels-border-radius)}.hub-panels--vertical{display:flex;align-items:stretch}.hub-panels--vertical .hub-panels__header{flex-direction:column}.hub-panels--vertical .hub-panels__nav-scroller{overflow:visible}.hub-panels--vertical .hub-panels__content{flex:1 1 auto;min-width:0}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple)>.hub-panels__header{margin-inline-start:var(--hub-panels-strip-margin-top);align-self:stretch;min-height:0}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__spacer{display:none}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav-scroller{flex:1 1 auto;align-self:stretch;min-height:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical{flex:1 1 auto;align-self:stretch;min-height:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical .hub-panels__nav-item{width:100%}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--vertical .hub-panels__nav-link{width:calc(100% + var(--hub-panels-border-width));justify-content:flex-start;margin-bottom:0;border-start-start-radius:var(--hub-panels-tab-border-radius);border-start-end-radius:var(--hub-panels-tab-border-end-radius, 0);border-end-start-radius:var(--hub-panels-tab-border-radius);border-end-end-radius:var(--hub-panels-tab-border-end-radius, 0);margin-inline-end:calc(-1 * var(--hub-panels-border-width))}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple)>.hub-panels__content{border:var(--hub-panels-border-width) solid var(--hub-panels-border-color);border-inline-start:0;border-start-end-radius:var(--hub-panels-border-radius);border-end-end-radius:var(--hub-panels-border-radius)}.hub-panels--tabs.hub-panels--vertical:not(.hub-panels--multiple) .hub-panels__nav--tabs .hub-panels__nav-link--active{z-index:1;border-color:var(--hub-panels-border-color);border-inline-end-color:var(--hub-panels-tab-bg-active);box-shadow:var(--hub-panels-tab-active-shadow-vertical)}.hub-panels--pills.hub-panels--vertical>.hub-panels__header{margin-bottom:0;margin-inline-end:var(--hub-panels-nav-content-gap)}.hub-panels--card{display:flex}.hub-panels--card>.hub-panels__content{display:flex;flex-direction:column;gap:var(--hub-panels-card-gap, var(--hub-ref-space-3, 1rem));width:100%;padding:0;background:transparent;box-shadow:none}\n", ".hub-panels__panel--accordion{display:block;color:var(--hub-panels-accordion-color);background-color:var(--hub-panels-accordion-bg);border:var(--hub-panels-accordion-border-width) solid var(--hub-panels-accordion-border-color)}.hub-panels__panel--accordion:not(:first-of-type){border-top:0}.hub-panels__panel--accordion:first-of-type{border-start-start-radius:var(--hub-panels-accordion-border-radius);border-start-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__panel--accordion:first-of-type>.hub-panels__accordion-header,.hub-panels__panel--accordion:first-of-type>.hub-panels__accordion-header .hub-panels__accordion-btn{border-start-start-radius:var(--hub-panels-accordion-inner-border-radius);border-start-end-radius:var(--hub-panels-accordion-inner-border-radius)}.hub-panels__panel--accordion:last-of-type{border-end-start-radius:var(--hub-panels-accordion-border-radius);border-end-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-header:not(.hub-panels__accordion-header--expanded),.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-header .hub-panels__accordion-btn--collapsed{border-end-start-radius:var(--hub-panels-accordion-inner-border-radius);border-end-end-radius:var(--hub-panels-accordion-inner-border-radius)}.hub-panels__panel--accordion:last-of-type>.hub-panels__accordion-collapse{border-end-start-radius:var(--hub-panels-accordion-border-radius);border-end-end-radius:var(--hub-panels-accordion-border-radius)}.hub-panels__accordion-header{position:relative;display:flex;align-items:stretch;margin:0;background-color:var(--hub-panels-accordion-btn-bg);transition:var(--hub-panels-accordion-transition);--hub-panels-accordion-toggle-gutter: calc(var(--hub-panels-accordion-btn-icon-width) + var(--hub-panels-tab-gap))}.hub-panels__accordion-header--expanded{background-color:var(--hub-panels-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--hub-panels-accordion-border-width)) 0 var(--hub-panels-accordion-border-color)}.hub-panels__accordion-actions{display:flex;flex-shrink:0;align-items:center;gap:var(--hub-panels-tab-gap);padding-inline-end:calc(var(--hub-panels-accordion-btn-padding-x) + var(--hub-panels-accordion-toggle-gutter))}.hub-panels__accordion-header:not(:has(>.hub-panels__accordion-actions))>.hub-panels__accordion-btn{padding-inline-end:calc(var(--hub-panels-accordion-btn-padding-x) + var(--hub-panels-accordion-toggle-gutter))}.hub-panels__accordion-btn{display:flex;flex:1 1 auto;align-items:center;min-width:0;gap:var(--hub-panels-tab-gap);padding:var(--hub-panels-accordion-btn-padding-y) var(--hub-panels-accordion-btn-padding-x);font-family:var(--hub-panels-tab-font-family);font-size:var(--hub-panels-tab-font-size);line-height:var(--hub-panels-tab-line-height);text-align:start;color:var(--hub-panels-accordion-btn-color);background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:var(--hub-panels-accordion-transition);cursor:pointer}.hub-panels__accordion-btn:after{position:absolute;z-index:1;inset-block:0;inset-inline-end:var(--hub-panels-accordion-btn-padding-x);flex-shrink:0;width:var(--hub-panels-accordion-btn-icon-width);height:var(--hub-panels-accordion-btn-icon-width);margin-block:auto;content:\"\";background-color:var(--hub-panels-accordion-icon-active-color);-webkit-mask-image:var(--hub-panels-accordion-btn-icon-mask);mask-image:var(--hub-panels-accordion-btn-icon-mask);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center;mask-position:center;transform:var(--hub-panels-accordion-btn-icon-transform);transition:var(--hub-panels-accordion-btn-icon-transition)}.hub-panels__accordion-btn:not(.hub-panels__accordion-btn--collapsed){color:var(--hub-panels-accordion-active-color)}.hub-panels__accordion-btn--collapsed:after{background-color:var(--hub-panels-accordion-icon-color);transform:none}.hub-panels__accordion-btn:hover:not(:disabled){z-index:2}.hub-panels__accordion-btn:focus-visible{z-index:3;outline:0;box-shadow:var(--hub-panels-accordion-btn-focus-box-shadow)}.hub-panels__accordion-btn:disabled{color:var(--hub-panels-tab-color-disabled);cursor:not-allowed}.hub-panels__accordion-collapse{display:grid;grid-template-rows:1fr;transition:grid-template-rows var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing)}.hub-panels__accordion-collapse--collapsed{grid-template-rows:0fr}.hub-panels__accordion-collapse>.hub-panels__accordion-body{min-height:0;overflow:hidden;opacity:1;padding:var(--hub-panels-accordion-body-padding-y) var(--hub-panels-accordion-body-padding-x);transition:opacity var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing),padding var(--hub-panels-accordion-collapse-transition-duration) var(--hub-panels-accordion-collapse-transition-easing)}.hub-panels__accordion-collapse--collapsed>.hub-panels__accordion-body{opacity:0;padding-top:0;padding-bottom:0}.hub-panels__panel--toggle-start>.hub-panels__accordion-header{--hub-panels-accordion-toggle-gutter: 0px}.hub-panels__panel--toggle-start>.hub-panels__accordion-header>.hub-panels__accordion-btn:after{position:static;z-index:auto;order:-1;margin-block:0;margin-inline-start:0;margin-inline-end:var(--hub-panels-tab-gap)}.hub-panels--flush .hub-panels__panel--accordion{border-right:0;border-left:0;border-radius:0}.hub-panels--flush .hub-panels__panel--accordion:first-of-type{border-top:0}.hub-panels--flush .hub-panels__panel--accordion:last-of-type{border-bottom:0}.hub-panels--flush .hub-panels__panel--accordion>.hub-panels__accordion-collapse,.hub-panels--flush .hub-panels__panel--accordion>.hub-panels__accordion-header .hub-panels__accordion-btn{border-radius:0}\n"] }]
818
818
  }], ctorParameters: () => [], propDecorators: { navScroller: [{ type: i0.ViewChild, args: ['navScroller', { isSignal: true }] }], prevBtn: [{ type: i0.ViewChild, args: ['prevBtn', { isSignal: true }] }], nextBtn: [{ type: i0.ViewChild, args: ['nextBtn', { isSignal: true }] }], contentRoot: [{ type: i0.ViewChild, args: ['contentRoot', { isSignal: true }] }], multiplePaneHosts: [{ type: i0.ViewChildren, args: ['multiplePaneHost', { isSignal: true }] }], multipleBlocks: [{ type: i0.ViewChildren, args: ['multipleBlock', { isSignal: true }] }], panelChange: [{ type: i0.Output, args: ["panelChange"] }], vertical: [{ type: i0.Input, args: [{ isSignal: true, alias: "vertical", required: false }] }], justified: [{ type: i0.Input, args: [{ isSignal: true, alias: "justified", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], isKeysAllowed: [{ type: i0.Input, args: [{ isSignal: true, alias: "isKeysAllowed", required: false }] }], scrollable: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollable", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], flush: [{ type: i0.Input, args: [{ isSignal: true, alias: "flush", required: false }] }], togglePosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "togglePosition", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], bindValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "bindValue", required: false }] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }] } });
819
819
 
820
820
  /** Monotonic counter backing the auto-generated accessibility ids. */
@@ -1 +1 @@
1
- {"version":3,"file":"ng-hub-ui-panels.mjs","sources":["../../../projects/panels/src/lib/utils/resolve-hub-accent.ts","../../../projects/panels/src/lib/services/panels-config.service.ts","../../../projects/panels/src/lib/utils/content-box-width.ts","../../../projects/panels/src/lib/utils/read-by-path.ts","../../../projects/panels/src/lib/components/panels/panels.component.ts","../../../projects/panels/src/lib/components/panels/panels.component.html","../../../projects/panels/src/lib/components/panel/panel.component.ts","../../../projects/panels/src/lib/components/panel/panel.component.html","../../../projects/panels/src/lib/directives/panel-heading.directive.ts","../../../projects/panels/src/lib/directives/panel-heading-actions.directive.ts","../../../projects/panels/src/lib/directives/panel-header.directive.ts","../../../projects/panels/src/lib/directives/panel-footer.directive.ts","../../../projects/panels/src/lib/components/tab-nav/tab-nav.component.ts","../../../projects/panels/src/lib/components/tab-nav/tab-nav.component.html","../../../projects/panels/src/public-api.ts","../../../projects/panels/src/ng-hub-ui-panels.ts"],"sourcesContent":["/**\n * Resolves an accent value to an inline CSS colour for a `--hub-*-accent` slot.\n *\n * A bareword (a semantic name, a registered accent or a CSS named colour)\n * resolves to `var(--hub-sys-color-<value>, <value>)` — the design-system token\n * with the word itself as the raw fallback — so a custom accent palette\n * interconnects with no colour values living in this library. A literal\n * (`#hex` / `rgb()` / `oklch()` / `var()`) is passed through unchanged. Returns\n * `null` for an empty/whitespace value, keeping the accent slot unset.\n *\n * @param value Raw accent value from the component input.\n * @returns The resolved inline colour, or `null` when no accent applies.\n */\nexport function resolveHubAccent(value: string | null | undefined): string | null {\n\tconst color = value?.trim();\n\tif (!color) {\n\t\treturn null;\n\t}\n\treturn /^[a-zA-Z][\\w-]*$/.test(color) ? `var(--hub-sys-color-${color}, ${color})` : color;\n}\n","import { Injectable } from '@angular/core';\n\nimport type { HubPanelsTogglePosition, PanelsType } from '../models/panels.types';\n\n/**\n * Injectable defaults for every `<hub-panels>` in the application.\n *\n * Override at any injector level to change the defaults globally or for a\n * feature subtree:\n *\n * ```ts\n * providers: [{ provide: PanelsConfig, useValue: { ...new PanelsConfig(), type: 'pills' } }]\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class PanelsConfig {\n\t/** Default navigation style — `'tabs'`, `'pills'` or `'accordion'`. */\n\ttype: PanelsType = 'tabs';\n\n\t/** Whether keyboard navigation (arrows / Home / End / Delete) is enabled. */\n\tisKeysAllowed = true;\n\n\t/** Accordion view: default side of the header row for the disclosure chevron. */\n\ttogglePosition: HubPanelsTogglePosition = 'end';\n\n\t/** Accessible label announced for the panel list. */\n\tariaLabel = 'Tabs';\n\n\t/** Accessible label for the backward scroll button (scrollable mode). */\n\tscrollBackwardAriaLabel = 'Scroll tabs backward';\n\n\t/** Accessible label for the forward scroll button (scrollable mode). */\n\tscrollForwardAriaLabel = 'Scroll tabs forward';\n}\n","/**\n * Usable inner width of an element: `offsetWidth` minus horizontal paddings\n * and borders. Used by the scrollable strip to size its scroll steps.\n */\nexport function contentBoxWidth(element: HTMLElement): number {\n\tconst style = getComputedStyle(element);\n\treturn (\n\t\telement.offsetWidth -\n\t\tparseFloat(style.paddingLeft) -\n\t\tparseFloat(style.paddingRight) -\n\t\tparseFloat(style.borderLeftWidth) -\n\t\tparseFloat(style.borderRightWidth)\n\t);\n}\n","/**\n * Reads a nested value from an object using dot-notation path syntax\n * (e.g. `id`, `meta.key`). Returns `undefined` when the path cannot be\n * resolved. Used by the panels' `bindValue` form-value mapping.\n */\nexport function readByPath(source: unknown, path: string): unknown {\n\tif (source == null || !path) {\n\t\treturn undefined;\n\t}\n\treturn path.split('.').reduce((currentValue: unknown, segment) => {\n\t\tif (currentValue == null) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn (currentValue as Record<string, unknown>)[segment];\n\t}, source);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n\tafterNextRender,\n\tbooleanAttribute,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\tElementRef,\n\tforwardRef,\n\tinject,\n\tinput,\n\toutput,\n\tRenderer2,\n\tRendererStyleFlags2,\n\tsignal,\n\tviewChild,\n\tviewChildren,\n\tViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NavigationEnd, Router, RouterOutlet } from '@angular/router';\nimport { filter } from 'rxjs';\n\nimport type {\n\tHubPanelsTogglePosition,\n\tHubPanelVariant,\n\tPanelChangeEvent,\n\tPanelsType\n} from '../../models/panels.types';\nimport { PanelsConfig } from '../../services/panels-config.service';\nimport { contentBoxWidth } from '../../utils/content-box-width';\nimport { readByPath } from '../../utils/read-by-path';\nimport { resolveHubAccent } from '../../utils/resolve-hub-accent';\nimport type { PanelComponent } from '../panel/panel.component';\n\ninterface MultipleHeaderGroup {\n\tactivePanel?: PanelComponent;\n\theaders: PanelComponent[];\n}\n\n/**\n * Content-panels container — the hub `panels` primitive.\n *\n * Projects `<hub-panel>` panes and renders them in one of three views:\n *\n * - **`tabs` / `pills`** — an accessible `tablist` of clickable headers\n * (roving tabindex, arrow/Home/End/Delete keys) above the active pane.\n * Panels with a `routerLink` switch the content area to a `<router-outlet>`\n * and the active panel follows the URL. With `scrollable`, overflowing\n * headers get backward/forward scroll buttons.\n * - **`accordion`** — each panel renders as a stacked disclosure panel with an\n * animated collapse: clicking an open header closes it, `multiple` allows\n * several panels open at once and `flush` removes the outer chrome. All\n * panels start collapsed unless a panel is marked `[active]` or a form value\n * is bound. Routed panels are not supported in this view.\n *\n * The container implements `ControlValueAccessor`, so the active panel(s) can\n * be bound as a form value (`ngModel` / `formControl`): each panel contributes\n * its `value` (or its `id` by default), optionally narrowed with `bindValue`\n * and compared with `compareWith`. With `multiple` the form value is an array.\n *\n * Theming is driven entirely by the `--hub-panels-*` CSS custom properties\n * (see `panels.variables.scss`); the accordion view also honours the\n * `--hub-accordion-*` ng-hub-ui contract as a compatibility fallback.\n *\n * @example\n * ```html\n * <hub-panels type=\"accordion\" multiple [formControl]=\"openPanels\">\n * <hub-panel heading=\"Fields\" value=\"fields\">…</hub-panel>\n * <hub-panel heading=\"Validations\" value=\"validations\">…</hub-panel>\n * </hub-panels>\n * ```\n */\n@Component({\n\tselector: 'hub-panels',\n\timports: [NgTemplateOutlet, RouterOutlet],\n\ttemplateUrl: './panels.component.html',\n\t// Split by concern (token contract / strip views / accordion view) so each\n\t// sheet stays inside the `anyComponentStyle` budget.\n\tstyleUrls: ['./panels.variables.scss', './panels.component.scss', './panels.accordion.scss'],\n\t// Library-style global stylesheet: rules are namespaced under `.hub-panels*`\n\t// and must reach the projected `hub-panel` panes (host-bound classes).\n\tencapsulation: ViewEncapsulation.None,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALUE_ACCESSOR,\n\t\t\tuseExisting: forwardRef(() => PanelsComponent),\n\t\t\tmulti: true\n\t\t}\n\t],\n\thost: {\n\t\tclass: 'hub-panels',\n\t\t'[class.hub-panels--tabs]': \"type() === 'tabs'\",\n\t\t'[class.hub-panels--pills]': \"type() === 'pills'\",\n\t\t'[class.hub-panels--card]': 'isCardView()',\n\t\t'[class.hub-panels--vertical]': 'vertical() && !isAccordionView() && !isCardView()',\n\t\t'[class.hub-panels--accordion]': 'isAccordionView()',\n\t\t'[class.hub-panels--toggle-start]': \"isAccordionView() && togglePosition() === 'start'\",\n\t\t'[class.hub-panels--flush]': 'isAccordionView() && flush()',\n\t\t'[class.hub-panels--multiple]': 'multiple()',\n\t\t'[attr.data-variant]': 'variant() ?? null',\n\t\t'[style.--hub-panels-accent]': 'groupAccent()',\n\t\t'(window:resize)': 'onWindowResize()'\n\t}\n})\nexport class PanelsComponent implements ControlValueAccessor {\n\treadonly #router = inject(Router);\n\treadonly #renderer = inject(Renderer2);\n\treadonly #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\treadonly #destroyRef = inject(DestroyRef);\n\n\t/** Container-wide defaults (aria labels, default type, keyboard toggle). */\n\tprotected readonly config = inject(PanelsConfig);\n\n\t/** Scrollable container hosting the panel headers (`tabs` / `pills` views). */\n\treadonly navScroller = viewChild<ElementRef<HTMLElement>>('navScroller');\n\n\t/** Backward scroll button (only rendered while it can scroll back). */\n\treadonly prevBtn = viewChild<ElementRef<HTMLElement>>('prevBtn');\n\n\t/** Forward scroll button (only rendered while it can scroll forward). */\n\treadonly nextBtn = viewChild<ElementRef<HTMLElement>>('nextBtn');\n\n\t/** Parking lot that owns the projected panel hosts before they are placed. */\n\treadonly contentRoot = viewChild<ElementRef<HTMLElement>>('contentRoot');\n\n\t/** Visible block hosts used by `multiple` tabs / pills. */\n\treadonly multiplePaneHosts = viewChildren<ElementRef<HTMLElement>>('multiplePaneHost');\n\n\t/** Visible grouped blocks used by `multiple` tabs / pills. */\n\treadonly multipleBlocks = viewChildren<ElementRef<HTMLElement>>('multipleBlock');\n\n\t/** Emitted when the user activates (opens) a different panel. */\n\treadonly panelChange = output<PanelChangeEvent>();\n\n\t/** Whether the panel list is stacked beside the content (`tabs` / `pills`). */\n\treadonly vertical = input(false, { transform: booleanAttribute });\n\n\t/** Whether panel headers stretch to share the available width equally. */\n\treadonly justified = input(false, { transform: booleanAttribute });\n\n\t/** Visualization — `'tabs'` (default), `'pills'` or `'accordion'`. */\n\treadonly type = input<PanelsType>(this.config.type);\n\n\t/** Whether keyboard navigation is enabled. */\n\treadonly isKeysAllowed = input(this.config.isKeysAllowed, {\n\t\ttransform: booleanAttribute\n\t});\n\n\t/** Whether overflowing headers get backward/forward scroll buttons. */\n\treadonly scrollable = input(false, { transform: booleanAttribute });\n\n\t/** Accordion view: whether several panels may be expanded at once. */\n\treadonly multiple = input(false, { transform: booleanAttribute });\n\n\t/** Accordion view: edge-to-edge panels without outer borders or radius. */\n\treadonly flush = input(false, { transform: booleanAttribute });\n\n\t/**\n\t * Accordion view: which side of the header row the disclosure chevron sits\n\t * on — `'end'` (default) trails the heading, `'start'` leads it. Purely\n\t * visual: the DOM order never changes, and the placement is expressed with\n\t * logical properties, so it mirrors automatically under `dir=\"rtl\"`.\n\t */\n\treadonly togglePosition = input<HubPanelsTogglePosition>(this.config.togglePosition);\n\n\t/**\n\t * Semantic accent applied to the navigation strip — the active/hover tab, the\n\t * active pill and the active accordion header all follow it. The built-in\n\t * values (`primary` / `success` / `danger` / `warning` / `info`) render with\n\t * the design-system tints; any other string is also accepted, since the strip\n\t * reads `--hub-sys-color-<variant>` from the host application, so a custom\n\t * accent palette interconnects with no changes to this library. Defaults to\n\t * `primary` when omitted.\n\t */\n\treadonly variant = input<HubPanelVariant | (string & {}) | undefined>(undefined);\n\n\t/**\n\t * Dot-notation path applied to each panel's `value` to obtain the emitted\n\t * form value (e.g. `'meta.key'`). Empty by default — the raw value is used.\n\t */\n\treadonly bindValue = input<string | undefined>(undefined);\n\n\t/** Equality used to match form values against panel values. `===` by default. */\n\treadonly compareWith = input<(a: unknown, b: unknown) => boolean>((a, b) => a === b);\n\n\t/** Registered panels, in projection order. */\n\treadonly panels = signal<PanelComponent[]>([]);\n\n\t/** Currently active panel, if any (the first one, under `multiple`). */\n\treadonly activePanel = computed(() => this.panels().find((panel) => panel.active()));\n\n\t/** Panel index lookup used by the strip templates and keyboard navigation. */\n\treadonly panelIndexMap = computed(() => new Map(this.panels().map((panel, index) => [panel, index])));\n\n\t/** Whether the container renders the accordion visualization. */\n\treadonly isAccordionView = computed(() => this.type() === 'accordion');\n\n\t/**\n\t * Whether the container renders the chromeless `card` visualization: no\n\t * navigation strip and every panel always visible, each styled as a card.\n\t */\n\treadonly isCardView = computed(() => this.type() === 'card');\n\n\t/**\n\t * Inline accent fed to the strip styles, resolved from the `variant` input so\n\t * ANY colour works. A bareword (a semantic name, a registered accent or a CSS\n\t * named colour) resolves to `var(--hub-sys-color-<variant>, <variant>)` — the\n\t * design-system token with the word itself as the raw fallback; a literal\n\t * (`#hex` / `rgb()` / `oklch()` / `var()`) is passed through unchanged. Returns\n\t * `null` to keep the `primary` default. The built-in semantic variants\n\t * additionally pick up their exact ds tints through the SCSS `@each`.\n\t */\n\tprotected readonly groupAccent = computed(() => resolveHubAccent(this.variant()));\n\n\t/**\n\t * Whether more than one panel may be active at once. Driven by `multiple`\n\t * for every view, and always enabled in the `card` view, where all panels\n\t * stay visible at once and must not deactivate one another.\n\t */\n\treadonly allowsMultipleActive = computed(() => this.multiple() || this.isCardView());\n\n\t/** Whether the bound form control disabled the whole container. */\n\treadonly formDisabled = signal(false);\n\n\t/**\n\t * Whether the active panel routes its content through a `<router-outlet>`.\n\t * Never true in the accordion view, where routed panels are not supported.\n\t */\n\tprotected readonly activePanelHasRouter = computed(\n\t\t() => !this.isAccordionView() && !this.allowsMultipleActive() && !!this.activePanel()?.routerUrl()\n\t);\n\n\t/**\n\t * In `multiple` tabs/pills, headers are partitioned into blocks. Every\n\t * active panel starts a block; following inactive headers stay visible in\n\t * that same block until the next active panel starts a new one.\n\t */\n\tprotected readonly multipleHeaderGroups = computed<MultipleHeaderGroup[]>(() => {\n\t\tif (!this.allowsMultipleActive() || this.isAccordionView()) {\n\t\t\treturn [];\n\t\t}\n\t\tconst panels = this.panels();\n\t\tif (!panels.length) {\n\t\t\treturn [];\n\t\t}\n\t\tconst activeIndices = panels\n\t\t\t.map((panel, index) => (panel.active() ? index : -1))\n\t\t\t.filter((index) => index !== -1);\n\t\tif (!activeIndices.length) {\n\t\t\treturn [{ headers: panels }];\n\t\t}\n\t\treturn activeIndices.map((activeIndex, groupIndex) => {\n\t\t\tconst startIndex = groupIndex === 0 ? 0 : activeIndex;\n\t\t\tconst endIndex = activeIndices[groupIndex + 1] ?? panels.length;\n\t\t\treturn {\n\t\t\t\tactivePanel: panels[activeIndex],\n\t\t\t\theaders: panels.slice(startIndex, endIndex)\n\t\t\t};\n\t\t});\n\t});\n\n\t/** Whether the strip cannot scroll further backward. */\n\treadonly backwardIsDisabled = signal(true);\n\n\t/** Whether the strip cannot scroll further forward. */\n\treadonly forwardIsDisabled = signal(false);\n\n\t#isDestroyed = false;\n\t#syncScheduled = false;\n\t#viewInitialised = false;\n\t#placementScheduled = false;\n\t#multipleBlockSizingScheduled = false;\n\n\t/** Last value written by the bound form control; `null` when no form. */\n\t#formValue: unknown[] | null = null;\n\n\t#onChange: (value: unknown) => void = () => undefined;\n\t#onTouched: () => void = () => undefined;\n\n\tconstructor() {\n\t\tthis.#destroyRef.onDestroy(() => {\n\t\t\tthis.#isDestroyed = true;\n\t\t});\n\n\t\tafterNextRender(() => {\n\t\t\tthis.#viewInitialised = true;\n\t\t\tthis.updateScrollButtons();\n\t\t\tthis.setActivePanel();\n\t\t\t// Re-apply any form value written before the panels' inputs were bound.\n\t\t\tthis.#applyFormValue();\n\t\t\tthis.#ensureActivePanel();\n\t\t\tthis.#schedulePanelPlacement();\n\t\t\tthis.#scheduleMultipleBlockSizing();\n\t\t\tthis.#router.events\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter((event) => event instanceof NavigationEnd),\n\t\t\t\t\ttakeUntilDestroyed(this.#destroyRef)\n\t\t\t\t)\n\t\t\t\t.subscribe(() => this.setActivePanel());\n\t\t});\n\t}\n\n\t/**\n\t * Registers a panel in the container. Called by `PanelComponent` on\n\t * construction — not meant for manual use.\n\t */\n\tregisterPanel(panel: PanelComponent): void {\n\t\tthis.panels.update((panels) => [...panels, panel]);\n\t\tthis.#scheduleSync();\n\t}\n\n\t/**\n\t * Removes a panel from the container. `reselect` activates the closest\n\t * enabled neighbour when the removed panel was active; `emit` fires the\n\t * panel's `removed` output.\n\t */\n\tremovePanel(panel: PanelComponent, options: { reselect?: boolean; emit?: boolean } = {}): void {\n\t\tconst { reselect = true, emit = true } = options;\n\t\tconst panels = this.panels();\n\t\tconst index = panels.indexOf(panel);\n\t\tif (index === -1 || this.#isDestroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (reselect && panel.active() && !this.isAccordionView()) {\n\t\t\tconst closestIndex = this.#closestEnabledIndex(index);\n\t\t\tif (closestIndex !== -1) {\n\t\t\t\tpanels[closestIndex].active.set(true);\n\t\t\t}\n\t\t}\n\t\tif (emit) {\n\t\t\tpanel.removed.emit(panel);\n\t\t}\n\n\t\tthis.panels.update((currentPanels) => currentPanels.filter((candidate) => candidate !== panel));\n\n\t\t// Detach the projected pane: the consumer template still owns the node,\n\t\t// so removing the header alone would leave the pane content behind.\n\t\tconst paneElement = panel.elementRef.nativeElement;\n\t\tif (paneElement.parentNode) {\n\t\t\tthis.#renderer.removeChild(paneElement.parentNode, paneElement);\n\t\t}\n\t\tif (panel.active()) {\n\t\t\tpanel.active.set(false);\n\t\t\tthis.#emitFormValue();\n\t\t}\n\t\tthis.#scheduleSync();\n\t}\n\n\t/**\n\t * Activates a panel on behalf of the user (`tabs` / `pills` views): marks it\n\t * active, navigates when routed, and emits `panelChange`. In `multiple` mode\n\t * clicking an active panel toggles it off (the panes render side by side);\n\t * otherwise an already-active panel no-ops. Disabled panels always no-op.\n\t */\n\tselectPanel(panel: PanelComponent): void {\n\t\tif (panel.disabled() || this.formDisabled()) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.allowsMultipleActive()) {\n\t\t\tif (panel.active()) {\n\t\t\t\tpanel.active.set(false);\n\t\t\t} else {\n\t\t\t\tpanel.active.set(true);\n\t\t\t\tpanel.navigate();\n\t\t\t\tthis.panelChange.emit({ prev: undefined, current: panel });\n\t\t\t}\n\t\t\tthis.#emitFormValue();\n\t\t\tthis.#onTouched();\n\t\t\tthis.#schedulePanelPlacement();\n\t\t\treturn;\n\t\t}\n\t\tif (panel.active()) {\n\t\t\treturn;\n\t\t}\n\t\tconst previousPanel = this.activePanel();\n\t\t// Deactivate the previously active panel up front so the emitted form\n\t\t// value reflects only the newly selected panel. The per-panel effect that\n\t\t// enforces single-active runs asynchronously, so relying on it here would\n\t\t// emit a stale value that still includes the previous panel.\n\t\tif (previousPanel && previousPanel !== panel) {\n\t\t\tpreviousPanel.active.set(false);\n\t\t}\n\t\tpanel.active.set(true);\n\t\tpanel.navigate();\n\t\tthis.panelChange.emit({ prev: previousPanel, current: panel });\n\t\tthis.#emitFormValue();\n\t\tthis.#onTouched();\n\t\tthis.#schedulePanelPlacement();\n\t}\n\n\t/**\n\t * Toggles a panel on behalf of the user (accordion view): an open panel\n\t * closes, a closed one opens — closing the others unless `multiple`.\n\t * Emits `panelChange` when a panel opens.\n\t */\n\ttogglePanel(panel: PanelComponent): void {\n\t\tif (panel.disabled() || this.formDisabled()) {\n\t\t\treturn;\n\t\t}\n\t\tif (panel.active()) {\n\t\t\tpanel.active.set(false);\n\t\t} else {\n\t\t\tconst previousPanel = this.allowsMultipleActive() ? undefined : this.activePanel();\n\t\t\tpanel.active.set(true);\n\t\t\tthis.panelChange.emit({ prev: previousPanel, current: panel });\n\t\t}\n\t\tthis.#emitFormValue();\n\t\tthis.#onTouched();\n\t\tthis.#schedulePanelPlacement();\n\t}\n\n\t/**\n\t * Marks the routed panel matching the current URL as active. Does not\n\t * navigate — activation through this path is URL-driven. No-op in the\n\t * accordion view, where routed panels are not supported.\n\t */\n\tsetActivePanel(): void {\n\t\tif (this.isAccordionView()) {\n\t\t\treturn;\n\t\t}\n\t\tconst [route, queryString] = this.#router.url.split('?');\n\t\tfor (const panel of this.panels()) {\n\t\t\tif (!panel.routerUrl()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet matches: boolean;\n\t\t\tif (panel.pathMatch() === 'full') {\n\t\t\t\tconst currentUrl = queryString?.trim() ? `${route}?${queryString.trim()}` : route;\n\t\t\t\tmatches = currentUrl === panel.getFullRoute();\n\t\t\t} else {\n\t\t\t\tmatches = route === panel.getRoute();\n\t\t\t}\n\t\t\tif (matches) {\n\t\t\t\tif (!panel.active()) {\n\t\t\t\t\tpanel.active.set(true);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// ── ControlValueAccessor ────────────────────────────────────────────────\n\n\t/**\n\t * Writes the form value into the container: panels whose (`bindValue`-mapped)\n\t * value matches are activated, the rest are deactivated. With `multiple` an\n\t * array is expected; otherwise a single value.\n\t */\n\twriteValue(value: unknown): void {\n\t\tif (value == null) {\n\t\t\tthis.#formValue = [];\n\t\t} else if (this.multiple()) {\n\t\t\tthis.#formValue = Array.isArray(value) ? [...value] : [value];\n\t\t} else {\n\t\t\tthis.#formValue = Array.isArray(value) ? value.slice(0, 1) : [value];\n\t\t}\n\t\tthis.#applyFormValue();\n\t}\n\n\t/** Registers the form-control change callback. */\n\tregisterOnChange(onChange: (value: unknown) => void): void {\n\t\tthis.#onChange = onChange;\n\t}\n\n\t/** Registers the form-control touched callback. */\n\tregisterOnTouched(onTouched: () => void): void {\n\t\tthis.#onTouched = onTouched;\n\t}\n\n\t/** Enables/disables every panel header on behalf of the form control. */\n\tsetDisabledState(isDisabled: boolean): void {\n\t\tthis.formDisabled.set(isDisabled);\n\t}\n\n\t/** Keyboard navigation for the panel strip (arrows / Home / End / Delete). */\n\tprotected onPanelKeydown(event: KeyboardEvent, index: number): void {\n\t\tif (!this.isKeysAllowed()) {\n\t\t\treturn;\n\t\t}\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowDown':\n\t\t\t\tif (event.key === 'ArrowDown' && !this.vertical()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.#stepEnabledIndex(index, 1));\n\t\t\t\treturn;\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowUp':\n\t\t\t\tif (event.key === 'ArrowUp' && !this.vertical()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.#stepEnabledIndex(index, -1));\n\t\t\t\treturn;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.panels().findIndex((panel) => !panel.disabled()));\n\t\t\t\treturn;\n\t\t\tcase 'End': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst panels = this.panels();\n\t\t\t\tthis.#focusPanelAt(panels.length - 1 - [...panels].reverse().findIndex((panel) => !panel.disabled()));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'Delete': {\n\t\t\t\tconst panel = this.panels()[index];\n\t\t\t\tif (panel?.removable()) {\n\t\t\t\t\tthis.removePanel(panel);\n\t\t\t\t\tqueueMicrotask(() => this.#focusPanelAt(Math.min(index, this.panels().length - 1)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Keyboard navigation between accordion headers (arrows / Home / End /\n\t * Delete). Enter and Space toggle natively through the button click.\n\t */\n\tonAccordionKeydown(event: KeyboardEvent, panel: PanelComponent): void {\n\t\tif (!this.isKeysAllowed()) {\n\t\t\treturn;\n\t\t}\n\t\tconst index = this.panels().indexOf(panel);\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.#stepEnabledIndex(index, 1));\n\t\t\t\treturn;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.#stepEnabledIndex(index, -1));\n\t\t\t\treturn;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.panels().findIndex((candidate) => !candidate.disabled()));\n\t\t\t\treturn;\n\t\t\tcase 'End': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst panels = this.panels();\n\t\t\t\tthis.#focusPanelAt(panels.length - 1 - [...panels].reverse().findIndex((candidate) => !candidate.disabled()));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'Delete': {\n\t\t\t\tif (panel.removable()) {\n\t\t\t\t\tthis.removePanel(panel);\n\t\t\t\t\tqueueMicrotask(() => this.#focusPanelAt(Math.min(index, this.panels().length - 1)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Recomputes the enabled/disabled state of the scroll buttons. */\n\tprotected updateScrollButtons(): void {\n\t\tif (!this.scrollable() || this.isAccordionView()) {\n\t\t\treturn;\n\t\t}\n\t\tconst scroller = this.navScroller()?.nativeElement;\n\t\tif (!scroller) {\n\t\t\treturn;\n\t\t}\n\t\tconst { scrollLeft, scrollWidth } = scroller;\n\t\tthis.backwardIsDisabled.set(scrollLeft <= 0);\n\t\tthis.forwardIsDisabled.set(scrollLeft + contentBoxWidth(scroller) + 1 >= scrollWidth);\n\t}\n\n\t/** Re-syncs scroll controls and multiple-block sizing on window resize. */\n\tprotected onWindowResize(): void {\n\t\tthis.updateScrollButtons();\n\t\tthis.#scheduleMultipleBlockSizing();\n\t}\n\n\t/** Updates the scroll buttons as the strip scrolls. */\n\tprotected onScroll(): void {\n\t\tthis.updateScrollButtons();\n\t}\n\n\t/** Global index of a panel within the projected strip order. */\n\tprotected panelIndex(panel: PanelComponent): number {\n\t\treturn this.panelIndexMap().get(panel) ?? -1;\n\t}\n\n\t/** Scrolls the panel headers one viewport backward. */\n\tprotected navBackward(): void {\n\t\tconst scroller = this.navScroller()?.nativeElement;\n\t\tif (!scroller) {\n\t\t\treturn;\n\t\t}\n\t\tconst step = contentBoxWidth(scroller) - this.#visibleScrollButtonsWidth();\n\t\tscroller.scrollLeft = Math.max(scroller.scrollLeft - step, 0);\n\t}\n\n\t/** Scrolls the panel headers one viewport forward. */\n\tprotected navForward(): void {\n\t\tconst scroller = this.navScroller()?.nativeElement;\n\t\tif (!scroller) {\n\t\t\treturn;\n\t\t}\n\t\tconst step = contentBoxWidth(scroller) - this.#visibleScrollButtonsWidth();\n\t\tconst lastPosition = scroller.scrollWidth - step;\n\t\tscroller.scrollLeft = Math.min(scroller.scrollLeft + step, lastPosition);\n\t}\n\n\t/** Width currently taken by the visible scroll buttons. */\n\t#visibleScrollButtonsWidth(): number {\n\t\treturn [this.prevBtn()?.nativeElement, this.nextBtn()?.nativeElement].reduce(\n\t\t\t(total, button) => (button ? total + contentBoxWidth(button) : total),\n\t\t\t0\n\t\t);\n\t}\n\n\t/** Index of the enabled panel closest to `index`, or `-1` when none exists. */\n\t#closestEnabledIndex(index: number): number {\n\t\tconst panels = this.panels();\n\t\tfor (let step = 1; step <= panels.length; step += 1) {\n\t\t\tconst previous = panels[index - step];\n\t\t\tif (previous && !previous.disabled()) {\n\t\t\t\treturn index - step;\n\t\t\t}\n\t\t\tconst next = panels[index + step];\n\t\t\tif (next && !next.disabled()) {\n\t\t\t\treturn index + step;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/** Next enabled panel index from `index` in `direction`, wrapping around. */\n\t#stepEnabledIndex(index: number, direction: 1 | -1): number {\n\t\tconst panels = this.panels();\n\t\tfor (let step = 1; step <= panels.length; step += 1) {\n\t\t\tconst candidate = (index + direction * step + panels.length * step) % panels.length;\n\t\t\tif (!panels[candidate].disabled()) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t\treturn index;\n\t}\n\n\t/** Moves DOM focus to the panel header at `index` (strip link or accordion button). */\n\t#focusPanelAt(index: number): void {\n\t\tif (index < 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst selector = this.isAccordionView() ? '.hub-panels__accordion-btn' : '.hub-panels__nav-link';\n\t\tconst headers = this.#elementRef.nativeElement.querySelectorAll<HTMLElement>(selector);\n\t\theaders[index]?.focus();\n\t}\n\n\t/**\n\t * Coalesces post-registration/removal housekeeping into one microtask:\n\t * re-applies the bound form value to the current panels, guarantees an\n\t * active panel (non-routed `tabs` / `pills` containers without a bound\n\t * form) and refreshes the scroll buttons after the strip changed size.\n\t * Skipped until the first render — before it the projected panels' inputs\n\t * are not bound yet, and the constructor's `afterNextRender` performs the\n\t * initial pass instead.\n\t */\n\t#scheduleSync(): void {\n\t\tif (this.#syncScheduled || this.#isDestroyed) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#syncScheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tthis.#syncScheduled = false;\n\t\t\tif (this.#isDestroyed || !this.#viewInitialised) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#applyFormValue();\n\t\t\tthis.#ensureActivePanel();\n\t\t\tthis.#schedulePanelPlacement();\n\t\t\tthis.updateScrollButtons();\n\t\t});\n\t}\n\n\t/** Coalesces DOM moves for the projected `hub-panel` hosts. */\n\t#schedulePanelPlacement(): void {\n\t\tif (this.#placementScheduled || this.#isDestroyed) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#placementScheduled = true;\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.#placementScheduled = false;\n\t\t\tif (this.#isDestroyed || !this.#viewInitialised) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#runPanelPlacementPass();\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (this.#isDestroyed || !this.#viewInitialised) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.#runPanelPlacementPass();\n\t\t\t});\n\t\t});\n\t}\n\n\t/** Performs one projected-panel placement pass plus dependent sizing. */\n\t#runPanelPlacementPass(): void {\n\t\tthis.#placeProjectedPanels();\n\t\tthis.#scheduleMultipleBlockSizing();\n\t}\n\n\t/** Coalesces the DOM measurements needed by `multiple + vertical`. */\n\t#scheduleMultipleBlockSizing(): void {\n\t\tif (this.#multipleBlockSizingScheduled || this.#isDestroyed) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#multipleBlockSizingScheduled = true;\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.#multipleBlockSizingScheduled = false;\n\t\t\tif (this.#isDestroyed || !this.#viewInitialised) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#syncMultipleBlockSizing();\n\t\t});\n\t}\n\n\t/** Moves projected panel hosts into their visible multiple-block container. */\n\t#placeProjectedPanels(): void {\n\t\tconst contentRoot = this.contentRoot()?.nativeElement;\n\t\tif (!contentRoot) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this.allowsMultipleActive() || this.isAccordionView()) {\n\t\t\tfor (const panel of this.panels()) {\n\t\t\t\tconst panelElement = panel.elementRef.nativeElement;\n\t\t\t\tif (panelElement.parentElement !== contentRoot) {\n\t\t\t\t\tthis.#renderer.appendChild(contentRoot, panelElement);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst hostMap = new Map(\n\t\t\tArray.from(\n\t\t\t\tthis.#elementRef.nativeElement.querySelectorAll<HTMLElement>(\n\t\t\t\t\t'.hub-panels__multiple-layout .hub-panels__multiple-pane-host'\n\t\t\t\t)\n\t\t\t)\n\t\t\t\t.map((host) => [host.dataset['panelId'] ?? '', host] as const)\n\t\t);\n\t\tfor (const panel of this.panels()) {\n\t\t\tconst panelElement = panel.elementRef.nativeElement;\n\t\t\tconst targetHost = hostMap.get(panel.id()) ?? contentRoot;\n\t\t\tif (panelElement.parentElement !== targetHost) {\n\t\t\t\tthis.#renderer.appendChild(targetHost, panelElement);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Updates the minimum content width for each `multiple + vertical` block. */\n\t#syncMultipleBlockSizing(): void {\n\t\tfor (const blockRef of this.multipleBlocks()) {\n\t\t\tconst block = blockRef.nativeElement;\n\t\t\tthis.#renderer.removeStyle(\n\t\t\t\tblock,\n\t\t\t\t'--hub-panels-multiple-vertical-panel-min-width',\n\t\t\t\tRendererStyleFlags2.DashCase\n\t\t\t);\n\t\t\tif (!this.vertical() || !this.allowsMultipleActive() || this.isAccordionView()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst header = block.querySelector(':scope > .hub-panels__header');\n\t\t\tif (!(header instanceof HTMLElement)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst headerStackHeight = Math.ceil(header.getBoundingClientRect().height);\n\t\t\tthis.#renderer.setStyle(\n\t\t\t\tblock,\n\t\t\t\t'--hub-panels-multiple-vertical-panel-min-width',\n\t\t\t\t`${headerStackHeight}px`,\n\t\t\t\tRendererStyleFlags2.DashCase\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Activates the first enabled panel when none is active. Skipped for the\n\t * accordion view (panels start collapsed), for routed containers (the URL\n\t * is the single source of truth) and when a form value is bound (the form\n\t * is).\n\t */\n\t#ensureActivePanel(): void {\n\t\tif (this.isAccordionView() || this.#formValue !== null) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.allowsMultipleActive()) {\n\t\t\treturn;\n\t\t}\n\t\tconst panels = this.panels();\n\t\tif (!panels.length || panels.some((panel) => panel.active())) {\n\t\t\treturn;\n\t\t}\n\t\tif (panels.some((panel) => !!panel.routerUrl())) {\n\t\t\treturn;\n\t\t}\n\t\tpanels.find((panel) => !panel.disabled())?.active.set(true);\n\t}\n\n\t/** Activates/deactivates panels so they mirror the bound form value. */\n\t#applyFormValue(): void {\n\t\tif (this.#formValue === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst compare = this.compareWith();\n\t\tfor (const panel of this.panels()) {\n\t\t\tconst panelValue = this.#comparableValue(panel);\n\t\t\tconst matches = this.#formValue.some((selectedValue) => compare(selectedValue, panelValue));\n\t\t\tif (panel.active() !== matches) {\n\t\t\t\tpanel.active.set(matches);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Emits the current selection through the form-control callback. */\n\t#emitFormValue(): void {\n\t\tconst compare = this.compareWith();\n\t\tconst activeValues = this.panels()\n\t\t\t.filter((panel) => panel.active())\n\t\t\t.map((panel) => this.#comparableValue(panel));\n\t\tif (this.#formValue !== null) {\n\t\t\tthis.#formValue = [...activeValues];\n\t\t}\n\t\t// Deduplicate defensively when several panels share the same value.\n\t\tconst uniqueValues = activeValues.filter(\n\t\t\t(value, index) => activeValues.findIndex((candidate) => compare(candidate, value)) === index\n\t\t);\n\t\tthis.#onChange(this.multiple() ? uniqueValues : (uniqueValues[0] ?? null));\n\t}\n\n\t/** Form value of a panel with the `bindValue` path applied. */\n\t#comparableValue(panel: PanelComponent): unknown {\n\t\tconst rawValue = panel.formValue();\n\t\tconst bindPath = this.bindValue();\n\t\treturn bindPath ? readByPath(rawValue, bindPath) : rawValue;\n\t}\n}\n","@if (!isAccordionView() && !isCardView()) {\n\t@if (multiple()) {\n\t\t<div class=\"hub-panels__multiple-layout\">\n\t\t\t@for (group of multipleHeaderGroups(); track group.activePanel ?? group.headers[0]) {\n\t\t\t\t<div\n\t\t\t\t\t#multipleBlock\n\t\t\t\t\tclass=\"hub-panels hub-panels__multiple-block\"\n\t\t\t\t\t[class.hub-panels--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels--vertical]=\"vertical()\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"hub-panels__header\">\n\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (panel of group.headers; track panel) {\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && panelIndex(panel) === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, panelIndex(panel))\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t@if (!justified() && type() !== 'pills' && !vertical()) {\n\t\t\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t@if (group.activePanel) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"hub-panels__content\"\n\t\t\t\t\t\t\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t#multiplePaneHost\n\t\t\t\t\t\t\t\tclass=\"hub-panels__multiple-pane-host\"\n\t\t\t\t\t\t\t\t[attr.data-panel-id]=\"group.activePanel.id()\"\n\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t} @else {\n\t\t<div class=\"hub-panels__header\">\n\t\t\t@if (scrollable() && !backwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#prevBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--backward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollBackwardAriaLabel\"\n\t\t\t\t\t(click)=\"navBackward()\"\n\t\t\t\t></button>\n\t\t\t}\n\n\t\t\t<div #navScroller class=\"hub-panels__nav-scroller\" (scroll)=\"onScroll()\">\n\t\t\t\t<ul\n\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t>\n\t\t\t\t\t@for (panel of panels(); track panel; let index = $index) {\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && index === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, index)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t}\n\t\t\t\t</ul>\n\t\t\t\t@if (!justified() && type() !== 'pills') {\n\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t@if (scrollable() && !forwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#nextBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--forward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollForwardAriaLabel\"\n\t\t\t\t\t(click)=\"navForward()\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t</div>\n\t}\n}\n\n<div\n\t#contentRoot\n\tclass=\"hub-panels__content\"\n\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t[class.hub-panels__content--accordion]=\"isAccordionView()\"\n\t[class.hub-panels__content--multiple-parking]=\"!isAccordionView() && multiple()\"\n>\n\t@if (activePanelHasRouter()) {\n\t\t<router-outlet />\n\t} @else {\n\t\t<ng-content />\n\t}\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n\tbooleanAttribute,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tmodel,\n\tOnDestroy,\n\toutput,\n\tRenderer2,\n\tsignal,\n\tTemplateRef,\n\tViewEncapsulation\n} from '@angular/core';\nimport { Params, Router } from '@angular/router';\n\nimport { HubPanelAppearance, HubPanelVariant } from '../../models/panels.types';\nimport { resolveHubAccent } from '../../utils/resolve-hub-accent';\nimport { PanelsComponent } from '../panels/panels.component';\n\n/** Monotonic counter backing the auto-generated accessibility ids. */\nlet nextPanelId = 0;\n\n/**\n * One content panel inside a `<hub-panels>` container.\n *\n * In the `tabs` / `pills` views the host element is the tab *panel*\n * (`role=\"tabpanel\"`) and the clickable header is rendered by\n * {@link PanelsComponent} in the strip. In the `accordion` view this component\n * renders its own disclosure header plus an animated collapse wrapper around\n * the projected content. In every view the header comes from `heading` or from\n * a `<ng-template hubPanelHeading>` projected inside this element.\n *\n * Panels can be plain content panes or routed: when `routerLink` is set, the\n * container renders a `<router-outlet>` instead of the projected panels and\n * the active panel follows the current URL (`tabs` / `pills` views only).\n *\n * @example\n * ```html\n * <hub-panels>\n * <hub-panel heading=\"Fields\">…</hub-panel>\n * <hub-panel>\n * <ng-template hubPanelHeading>Validations <span class=\"badge\">3</span></ng-template>\n * …\n * </hub-panel>\n * </hub-panels>\n * ```\n */\n@Component({\n\tselector: 'hub-panel, [hub-panel]',\n\texportAs: 'hubPanel',\n\timports: [NgTemplateOutlet],\n\ttemplateUrl: './panel.component.html',\n\t// The `card` view styles (and the projected header/footer bands) live here so\n\t// a standalone `<hub-panel>` — used outside any `<hub-panels>` container, which\n\t// would otherwise be the only source of the global styles — is styled too.\n\t// `ViewEncapsulation.None` is required so the rules reach the projected,\n\t// consumer-owned `[hubPanelHeader]` / `[hubPanelFooter]` elements.\n\tstyleUrl: './panel.component.scss',\n\tencapsulation: ViewEncapsulation.None,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-panels__panel',\n\t\t'[attr.id]': 'accordionView() || cardView() ? null : id()',\n\t\t'[attr.role]': \"alertView() ? 'alert' : (accordionView() || cardView() ? null : 'tabpanel')\",\n\t\t'[attr.aria-labelledby]': \"accordionView() || cardView() ? null : id() + '-link'\",\n\t\t'[attr.data-variant]': 'cardView() ? (variant() ?? null) : null',\n\t\t'[style.--hub-panels-alert-accent]': 'alertAccent()',\n\t\t'[style.--hub-panels-card-accent]': 'cardAccent()',\n\t\t'[class.hub-panels__panel--active]': 'active()',\n\t\t'[class.hub-panels__panel--accordion]': 'accordionView()',\n\t\t'[class.hub-panels__panel--toggle-start]': 'toggleAtStart()',\n\t\t'[class.hub-panels__panel--card]': 'cardView() && !alertView()',\n\t\t'[class.hub-panels__panel--alert]': 'alertView()',\n\t\t'[class.hub-panels__panel--fill]': 'fill()',\n\t\t'[class.hub-panels__panel--flush]': 'flush()'\n\t}\n})\nexport class PanelComponent implements OnDestroy {\n\t/** Host element reference — exposed so the container can detach removed panes. */\n\treadonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n\treadonly #renderer = inject(Renderer2);\n\treadonly #router = inject(Router);\n\n\t/**\n\t * Owning panels container, or `null` when the panel is used standalone\n\t * (outside any `<hub-panels>`), in which case it renders as a card.\n\t * Exposed to the template for the accordion header.\n\t *\n\t * Resolved with `host: true`, so a panel only binds to a group declared in\n\t * the SAME template (its direct container). Without the host boundary the\n\t * lookup walks the whole ancestor injector tree, and a standalone panel\n\t * inside a component projected into a tab pane would register itself as a\n\t * hidden tab of the outer group instead of rendering as a card.\n\t */\n\tprotected readonly tabset = inject(PanelsComponent, { optional: true, host: true });\n\n\t/**\n\t * Opts a standalone `<hub-panel>` OUT of an ancestor `<hub-panels>` group so it\n\t * renders as a plain card even when nested inside a tabs / pills / accordion\n\t * container (otherwise hierarchical DI would capture it as a hidden 0×0 tab).\n\t *\n\t * Must be a STATIC attribute (`<hub-panel standalone>`): the opt-out is decided\n\t * when the panel is created — before dynamic inputs are applied — so it is read\n\t * from the host attribute rather than a reactive input.\n\t */\n\treadonly standalone = this.elementRef.nativeElement.hasAttribute('standalone');\n\n\t/** Plain-text panel header. Ignored when a `hubPanelHeading` template exists. */\n\treadonly heading = input<string | undefined>(undefined);\n\n\t/**\n\t * Visual appearance of a standalone panel: a plain `card` (default) or a\n\t * semantic `alert` callout. Only meaningful when the panel renders as a\n\t * card (used standalone or inside a `card` container); ignored in the\n\t * tabs / pills / accordion strip views.\n\t */\n\treadonly appearance = input<HubPanelAppearance>('card');\n\n\t/**\n\t * Semantic colour applied when `appearance` is `alert`. The built-in values\n\t * (`primary` / `success` / `danger` / `warning` / `info`) render with the\n\t * design-system tints. Any other string is also accepted: the alert reads\n\t * `--hub-sys-color-<variant>` from the host application, so a custom accent\n\t * palette interconnects with no changes to this library. Omit for a neutral\n\t * alert.\n\t */\n\treadonly variant = input<HubPanelVariant | (string & {}) | undefined>(undefined);\n\n\t/**\n\t * Makes a card panel fill its parent's height and lets an inner scroll region\n\t * work: the host, both content wrappers and the body become a flex column\n\t * (`flex: 1; min-height: 0`) and the body scrolls. Opt-in; off by default so\n\t * existing layouts are byte-identical. Card view only.\n\t */\n\treadonly fill = input(false, { transform: booleanAttribute });\n\n\t/**\n\t * Removes the card body padding (`--hub-panels-card-padding-x/-y` → 0) so a card\n\t * can host a flush element (a table, a list, a media block) edge-to-edge. Opt-in;\n\t * card view only.\n\t */\n\treadonly flush = input(false, { transform: booleanAttribute });\n\n\t/**\n\t * Unique id used for the `tab` / `tabpanel` (or accordion header / region)\n\t * ARIA pairing. Auto-generated (`hub-panel-<n>`) when not provided.\n\t */\n\treadonly id = input<string>(`hub-panel-${nextPanelId++}`);\n\n\t/** Whether the panel cannot be activated. */\n\treadonly disabled = input(false, { transform: booleanAttribute });\n\n\t/** Whether the panel shows a remove affordance (✕ and the Delete key). */\n\treadonly removable = input(false, { transform: booleanAttribute });\n\n\t/**\n\t * URL comparison used to mark routed panels active: `'route'` compares the\n\t * path only, `'full'` also compares query params.\n\t */\n\treadonly pathMatch = input<'route' | 'full'>('route');\n\n\t/** Navigation target that turns this panel into a routed panel. */\n\treadonly routerLink = input<string | string[] | null | undefined>(undefined);\n\n\t/** Query params appended when navigating to `routerLink`. */\n\treadonly queryParams = input<Params | null | undefined>(undefined);\n\n\t/** Extra CSS classes applied to both the nav item and this pane. */\n\treadonly customClass = input<string | undefined>(undefined);\n\n\t/**\n\t * Value this panel contributes when the container is used as a form control\n\t * (see {@link PanelsComponent} `ControlValueAccessor`). Defaults to `id`.\n\t */\n\treadonly value = input<unknown>(undefined);\n\n\t/** Whether the panel is currently active (expanded, in the accordion view). */\n\treadonly active = model(false);\n\n\t/** Emitted when the panel becomes active. */\n\treadonly selectPanel = output<PanelComponent>();\n\n\t/** Emitted when the panel stops being active. */\n\treadonly deselectPanel = output<PanelComponent>();\n\n\t/** Emitted when the panel is removed through the ✕ button or the Delete key. */\n\treadonly removed = output<PanelComponent>();\n\n\t/** Custom header template registered by `PanelHeadingDirective`. */\n\treadonly headingRef = signal<TemplateRef<unknown> | undefined>(undefined);\n\n\t/**\n\t * Header actions template registered by `PanelHeadingActionsDirective`.\n\t * Rendered beside the accordion disclosure button — never inside it — so\n\t * real `<button>`s stay valid and reachable while the row is collapsed.\n\t */\n\treadonly headingActionsRef = signal<TemplateRef<unknown> | undefined>(undefined);\n\n\t/** Whether the owning container renders the accordion visualization. */\n\tprotected readonly accordionView = computed(() => !this.standalone && (this.tabset?.isAccordionView() ?? false));\n\n\t/**\n\t * Whether this panel's disclosure chevron leads the header row.\n\t *\n\t * Resolved on the PANEL, not on the container: a nested accordion is a DOM descendant of\n\t * the outer one, so a descendant selector on the container would leak the outer chevron\n\t * placement into every accordion inside its panels.\n\t */\n\tprotected readonly toggleAtStart = computed(\n\t\t() => this.accordionView() && this.tabset?.togglePosition() === 'start'\n\t);\n\n\t/**\n\t * Whether this panel renders as a card: either inside a `<hub-panels\n\t * type=\"card\">` container or standalone (no owning container at all).\n\t */\n\tprotected readonly cardView = computed(() => this.standalone || !this.tabset || this.tabset.isCardView());\n\n\t/**\n\t * Whether this panel renders as a semantic alert: `appearance=\"alert\"` while\n\t * in a card-capable context (standalone or inside a `card` container). In the\n\t * strip / accordion views the alert appearance is ignored.\n\t */\n\tprotected readonly alertView = computed(() => this.appearance() === 'alert' && this.cardView());\n\n\t/**\n\t * Inline accent fed to the alert styles, resolved from the `variant` input so\n\t * ANY colour works. A bareword (a semantic name, a registered accent or a CSS\n\t * named colour) resolves to `var(--hub-sys-color-<variant>, <variant>)` — the\n\t * design-system token with the word itself as the raw fallback; a literal\n\t * (`#hex` / `rgb()` / `oklch()` / `var()`) is passed through unchanged. Returns\n\t * `null` for a neutral alert / non-alert view. The built-in semantic variants\n\t * additionally pick up their exact ds tints through the SCSS `@each`.\n\t */\n\tprotected readonly alertAccent = computed(() => {\n\t\tif (!this.alertView()) {\n\t\t\treturn null;\n\t\t}\n\t\treturn resolveHubAccent(this.variant());\n\t});\n\n\t/**\n\t * Inline accent fed to the card variant tint, resolved from the `variant` input\n\t * exactly like {@link alertAccent}: a bareword becomes\n\t * `var(--hub-sys-color-<variant>, <variant>)` and a literal colour is passed\n\t * through unchanged. Returns `null` for an alert or non-card view, keeping the\n\t * card variant set open with no colour values living in this library.\n\t */\n\tprotected readonly cardAccent = computed(() => {\n\t\tif (!this.cardView() || this.alertView()) {\n\t\t\treturn null;\n\t\t}\n\t\treturn resolveHubAccent(this.variant());\n\t});\n\n\t/** Form value resolved for this panel: the explicit `value` or the panel id. */\n\treadonly formValue = computed(() => (this.value() !== undefined ? this.value() : this.id()));\n\n\t/** `routerLink` normalised to a segments array, or `null` when not routed. */\n\treadonly routerUrl = computed<string[] | null>(() => {\n\t\tconst link = this.routerLink();\n\t\tif (!link) {\n\t\t\treturn null;\n\t\t}\n\t\treturn Array.isArray(link) ? link : [link];\n\t});\n\n\t/** Last activation state seen by the effect — avoids emitting on init. */\n\t#wasActive = false;\n\n\tconstructor() {\n\t\t// A standalone panel (no container, or explicitly `standalone` inside one)\n\t\t// renders as a card and skips registration so it never becomes a hidden tab.\n\t\tif (!this.standalone) {\n\t\t\tthis.tabset?.registerPanel(this);\n\t\t}\n\n\t\t// Mirror `customClass` onto the pane host element.\n\t\teffect((onCleanup) => {\n\t\t\tconst classes = (this.customClass() ?? '')\n\t\t\t\t.split(' ')\n\t\t\t\t.map((cssClass) => cssClass.trim())\n\t\t\t\t.filter((cssClass) => cssClass.length > 0);\n\t\t\tfor (const cssClass of classes) {\n\t\t\t\tthis.#renderer.addClass(this.elementRef.nativeElement, cssClass);\n\t\t\t}\n\t\t\tonCleanup(() => {\n\t\t\t\tfor (const cssClass of classes) {\n\t\t\t\t\tthis.#renderer.removeClass(this.elementRef.nativeElement, cssClass);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// Activation side effects: emit outputs and enforce single-active-panel\n\t\t// (unless the container allows multiple expanded panels — accordion mode).\n\t\teffect(() => {\n\t\t\tconst isActive = this.active();\n\t\t\tif (isActive && this.disabled()) {\n\t\t\t\tthis.active.set(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (isActive === this.#wasActive) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#wasActive = isActive;\n\t\t\tif (isActive) {\n\t\t\t\tthis.selectPanel.emit(this);\n\t\t\t\tif (this.tabset && !this.tabset.allowsMultipleActive()) {\n\t\t\t\t\tfor (const panel of this.tabset.panels()) {\n\t\t\t\t\t\tif (panel !== this) {\n\t\t\t\t\t\t\tpanel.active.set(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.deselectPanel.emit(this);\n\t\t\t}\n\t\t});\n\t}\n\n\tngOnDestroy(): void {\n\t\tif (!this.standalone) {\n\t\t\tthis.tabset?.removePanel(this, { reselect: false, emit: false });\n\t\t}\n\t}\n\n\t/** Route path plus query string, or `null` when the panel is not routed. */\n\tgetFullRoute(): string | null {\n\t\tconst route = this.getRoute();\n\t\tif (!route) {\n\t\t\treturn null;\n\t\t}\n\t\tconst queryString = this.getQueryParamsString();\n\t\treturn queryString ? `${route}?${queryString}` : route;\n\t}\n\n\t/** Normalised absolute route path, or `null` when the panel is not routed. */\n\tgetRoute(): string | null {\n\t\tconst routerUrl = this.routerUrl();\n\t\tif (!routerUrl) {\n\t\t\treturn null;\n\t\t}\n\t\tlet route = routerUrl.join('/').replace(/\\/\\/+/g, '/');\n\t\tif (route.charAt(0) === '.') {\n\t\t\troute = route.substring(1);\n\t\t}\n\t\tif (route.charAt(0) !== '/') {\n\t\t\troute = `/${route}`;\n\t\t}\n\t\treturn route;\n\t}\n\n\t/** `queryParams` serialised as `key=value&…`, or `null` when empty. */\n\tgetQueryParamsString(): string | null {\n\t\tconst params = this.queryParams();\n\t\tif (!params || !Object.keys(params).length) {\n\t\t\treturn null;\n\t\t}\n\t\treturn Object.entries(params)\n\t\t\t.map(([key, value]) => `${key}=${value}`)\n\t\t\t.join('&');\n\t}\n\n\t/** Navigates to the panel's route. No-op for non-routed panels. */\n\tnavigate(): void {\n\t\tconst routerUrl = this.routerUrl();\n\t\tif (routerUrl) {\n\t\t\tthis.#router.navigate(routerUrl, { queryParams: this.queryParams() ?? {} });\n\t\t}\n\t}\n\n\t/** Accordion header click — toggles this panel through the container. */\n\tprotected onAccordionHeaderClick(): void {\n\t\tthis.tabset?.togglePanel(this);\n\t}\n\n\t/** Accordion header keyboard navigation, delegated to the container. */\n\tprotected onAccordionHeaderKeydown(event: KeyboardEvent): void {\n\t\tthis.tabset?.onAccordionKeydown(event, this);\n\t}\n\n\t/** Removes this panel through the accordion header's ✕ affordance. */\n\tprotected removeSelf(): void {\n\t\tthis.tabset?.removePanel(this);\n\t}\n}\n","@if (accordionView()) {\n\t<h2 class=\"hub-panels__accordion-header\" [class.hub-panels__accordion-header--expanded]=\"active()\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"hub-panels__accordion-btn\"\n\t\t\t[class.hub-panels__accordion-btn--collapsed]=\"!active()\"\n\t\t\t[id]=\"id() + '-link'\"\n\t\t\t[disabled]=\"disabled() || tabset?.formDisabled()\"\n\t\t\t[attr.aria-expanded]=\"active()\"\n\t\t\t[attr.aria-controls]=\"id()\"\n\t\t\t(click)=\"onAccordionHeaderClick()\"\n\t\t\t(keydown)=\"onAccordionHeaderKeydown($event)\"\n\t\t>\n\t\t\t@if (headingRef(); as headingTemplate) {\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingTemplate\" />\n\t\t\t} @else {\n\t\t\t\t{{ heading() }}\n\t\t\t}\n\t\t\t@if (removable()) {\n\t\t\t\t<span class=\"hub-panels__remove-btn\" aria-hidden=\"true\" (click)=\"$event.stopPropagation(); removeSelf()\">&times;</span>\n\t\t\t}\n\t\t</button>\n\n\t\t<!-- Row affordances live OUTSIDE the disclosure button: a control nested\n\t\t\t in another control is invalid and unreachable by keyboard. They stay\n\t\t\t visible while the row is collapsed, unlike `hubPanelHeader`. -->\n\t\t@if (headingActionsRef(); as actionsTemplate) {\n\t\t\t<span class=\"hub-panels__accordion-actions\">\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"actionsTemplate\" />\n\t\t\t</span>\n\t\t}\n\t</h2>\n}\n\n<!-- Projection slots for every view. In the strip views the wrappers are plain\n\t pass-throughs; in the accordion view they become the animated collapse\n\t region. The header/footer `select` slots and the default `<ng-content>` are\n\t all UNCONDITIONAL — never wrapped in `@if` — to avoid the lost-projection\n\t bug that conditional slots cause. Header/footer render in every view; the\n\t `card` view styles them as the card's header and footer bands. -->\n<div\n\tclass=\"hub-panels__panel-collapse\"\n\t[class.hub-panels__accordion-collapse]=\"accordionView()\"\n\t[class.hub-panels__accordion-collapse--collapsed]=\"accordionView() && !active()\"\n\t[attr.role]=\"accordionView() ? 'region' : null\"\n\t[attr.id]=\"accordionView() ? id() : null\"\n\t[attr.aria-labelledby]=\"accordionView() ? id() + '-link' : null\"\n\t[attr.aria-hidden]=\"accordionView() ? !active() : null\"\n\t[attr.inert]=\"accordionView() && !active() ? '' : null\"\n>\n\t<div class=\"hub-panels__panel-region\" [class.hub-panels__accordion-body]=\"accordionView()\">\n\t\t<ng-content select=\"[hubPanelHeader]\" />\n\t\t<div class=\"hub-panels__panel-body\">\n\t\t\t<ng-content />\n\t\t</div>\n\t\t<ng-content select=\"[hubPanelFooter]\" />\n\t</div>\n</div>\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { PanelComponent } from '../components/panel/panel.component';\n\n/**\n * Marks an `<ng-template>` inside a `hub-panel` as that panel's custom header\n * (strip link in `tabs`/`pills` view, disclosure button in `accordion` view),\n * replacing the plain-text `heading` input.\n *\n * @example\n * ```html\n * <hub-panel>\n * <ng-template hubPanelHeading><em>Rich</em> heading</ng-template>\n * Panel content\n * </hub-panel>\n * ```\n */\n@Directive({ selector: '[hubPanelHeading]' })\nexport class PanelHeadingDirective {\n\tconstructor() {\n\t\tinject(PanelComponent).headingRef.set(inject(TemplateRef));\n\t}\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { PanelComponent } from '../components/panel/panel.component';\n\n/**\n * Marks an `<ng-template>` inside a `hub-panel` as that panel's header\n * **actions** slot, rendered in the `accordion` view as a sibling of the\n * disclosure button — inside the header row, outside the button.\n *\n * This is the slot for row affordances that must stay reachable while the\n * panel is collapsed (edit, delete, a menu). They cannot live in\n * `hubPanelHeading`, which projects *inside* the disclosure `<button>`: a\n * `<button>` nested in another button is invalid HTML and is not reachable\n * with the keyboard. Nor can they live in `hubPanelHeader`, which projects\n * inside the collapse region and therefore disappears when the row closes.\n *\n * Clicks on the actions never toggle the panel — the slot sits outside the\n * button, so no `stopPropagation` is needed. In the `tabs` / `pills` / `card`\n * views the slot renders nothing (those views have no header row of their own).\n *\n * @example\n * ```html\n * <hub-panels type=\"accordion\" multiple>\n * <hub-panel>\n * <ng-template hubPanelHeading>Shipping address</ng-template>\n * <ng-template hubPanelHeadingActions>\n * <button type=\"button\" (click)=\"edit()\">Edit</button>\n * <button type=\"button\" (click)=\"remove()\">Delete</button>\n * </ng-template>\n * Panel content\n * </hub-panel>\n * </hub-panels>\n * ```\n */\n@Directive({ selector: '[hubPanelHeadingActions]' })\nexport class PanelHeadingActionsDirective {\n\tconstructor() {\n\t\tinject(PanelComponent).headingActionsRef.set(inject(TemplateRef));\n\t}\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks an element inside a `hub-panel` as the panel's content **header** band,\n * projected at the top of the panel body (above `<ng-content>`).\n *\n * Unlike `hubPanelHeading` — which renders the navigational label in the\n * `tabs`/`pills` strip or the `accordion` disclosure button — this header lives\n * inside the panel body and renders in **every** view (`tabs`, `pills`,\n * `accordion`, `card`). It is the natural title slot for the `card` format.\n *\n * @example\n * ```html\n * <hub-panel>\n * <div hubPanelHeader>Card title</div>\n * Card content\n * <div hubPanelFooter>Actions</div>\n * </hub-panel>\n * ```\n */\n@Directive({\n\tselector: '[hubPanelHeader]',\n\thost: { class: 'hub-panels__panel-header' }\n})\nexport class PanelHeaderDirective {}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks an element inside a `hub-panel` as the panel's content **footer** band,\n * projected at the bottom of the panel body (below `<ng-content>`).\n *\n * Renders in **every** view (`tabs`, `pills`, `accordion`, `card`); it is the\n * natural actions/footer slot for the `card` format.\n *\n * @example\n * ```html\n * <hub-panel>\n * <div hubPanelHeader>Card title</div>\n * Card content\n * <div hubPanelFooter>Actions</div>\n * </hub-panel>\n * ```\n */\n@Directive({\n\tselector: '[hubPanelFooter]',\n\thost: { class: 'hub-panels__panel-footer' }\n})\nexport class PanelFooterDirective {}\n","import {\n\tbooleanAttribute,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tElementRef,\n\tinject,\n\tinput,\n\tmodel,\n\tViewEncapsulation\n} from '@angular/core';\n\nimport type { HubTabNavAppearance, HubTabNavItem } from './tab-nav.types';\n\n/**\n * Lightweight, value-bound tab strip — the hub `tab-nav` primitive.\n *\n * Where `<hub-panels type=\"tabs\">` couples the strip to projected\n * `<hub-panel>` content (lazy render, accordion / card modes, routing, forms),\n * `<hub-tab-nav>` is a **content-less** controlled strip: it renders an\n * accessible `role=\"tablist\"` of `role=\"tab\"` buttons from a plain `items`\n * array and emits the selected `value` through the two-way `active` model. The\n * consumer owns the view and renders it themselves based on `active()` /\n * `(activeChange)` — a segmented control, a filter switch or a manual\n * tabs-with-external-content layout.\n *\n * It reuses the `<hub-panels>` strip look through the same\n * `--hub-panels-*` theming tokens (picked up automatically when nested in a\n * themed panels subtree, literal fallbacks otherwise) and exposes two\n * strip-local tokens: `--hub-tabs-indicator-color` (the active underline / pill\n * fill) and `--hub-tabs-gap` (the inter-tab gap).\n *\n * Keyboard: arrow keys move focus and activate the neighbour (roving\n * `tabindex`), `Home` / `End` jump to the first / last enabled tab. Disabled\n * tabs are skipped by pointer and keyboard.\n *\n * @example\n * ```html\n * <hub-tab-nav\n * \t[items]=\"[{ value: 'all', label: 'All' }, { value: 'open', label: 'Open' }]\"\n * \t[(active)]=\"filter\"\n * \tappearance=\"pills\"\n * />\n * <!-- consumer renders its own view based on `filter` -->\n * ```\n */\n@Component({\n\tselector: 'hub-tab-nav',\n\texportAs: 'hubTabNav',\n\ttemplateUrl: './tab-nav.component.html',\n\tstyleUrl: './tab-nav.component.scss',\n\t// Library-style global stylesheet: rules stay namespaced under\n\t// `.hub-tab-nav*` and reach the projected `<button>` headers.\n\tencapsulation: ViewEncapsulation.None,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-tab-nav',\n\t\t'[class.hub-tab-nav--vertical]': 'vertical()'\n\t}\n})\nexport class HubTabNavComponent {\n\treadonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n\t/** The selectable tabs, in render order. */\n\treadonly items = input<HubTabNavItem[]>([]);\n\n\t/** Two-way selected value; `activeChange` fires whenever it changes. */\n\treadonly active = model<unknown>();\n\n\t/** Visual appearance — underlined `'tabs'` (default) or rounded `'pills'`. */\n\treadonly appearance = input<HubTabNavAppearance>('tabs');\n\n\t/** Whether the tabs stretch to share the available width equally. */\n\treadonly justified = input(false, { transform: booleanAttribute });\n\n\t/** Whether the strip stacks vertically instead of in a row. */\n\treadonly vertical = input(false, { transform: booleanAttribute });\n\n\t/** Index of the item whose value matches `active`, or `-1` when none does. */\n\treadonly activeIndex = computed(() => {\n\t\tconst active = this.active();\n\t\treturn this.items().findIndex((item) => item.value === active);\n\t});\n\n\t/** Whether the given item is the active one. */\n\tprotected isActive(item: HubTabNavItem): boolean {\n\t\treturn item.value === this.active();\n\t}\n\n\t/** ARIA id of a tab button — the item's own `id` or a deterministic fallback. */\n\tprotected itemId(item: HubTabNavItem, index: number): string {\n\t\treturn item.id ?? `hub-tab-nav-${index}`;\n\t}\n\n\t/**\n\t * Roving `tabindex` for the tab at `index`: `0` for the active tab (or the\n\t * first enabled tab when none is active), `-1` for the rest — so the strip\n\t * is a single tab stop and arrow keys move within it.\n\t */\n\tprotected tabIndexFor(index: number): number {\n\t\tconst activeIndex = this.activeIndex();\n\t\tif (activeIndex >= 0) {\n\t\t\treturn index === activeIndex ? 0 : -1;\n\t\t}\n\t\treturn index === this.items().findIndex((item) => !item.disabled) ? 0 : -1;\n\t}\n\n\t/**\n\t * Activates a tab on behalf of the user: sets `active` to its value (which\n\t * emits `activeChange`). Disabled tabs and re-selecting the active tab\n\t * no-op.\n\t */\n\tselect(item: HubTabNavItem): void {\n\t\tif (item.disabled || this.isActive(item)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.active.set(item.value);\n\t}\n\n\t/** Keyboard navigation for the strip (arrows / Home / End). */\n\tprotected onKeydown(event: KeyboardEvent, index: number): void {\n\t\tlet target: number;\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowDown':\n\t\t\t\ttarget = this.#stepEnabledIndex(index, 1);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowUp':\n\t\t\t\ttarget = this.#stepEnabledIndex(index, -1);\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\ttarget = this.items().findIndex((item) => !item.disabled);\n\t\t\t\tbreak;\n\t\t\tcase 'End': {\n\t\t\t\tconst items = this.items();\n\t\t\t\ttarget = items.length - 1 - [...items].reverse().findIndex((item) => !item.disabled);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t\tif (target < 0) {\n\t\t\treturn;\n\t\t}\n\t\tevent.preventDefault();\n\t\tconst item = this.items()[target];\n\t\tif (item && !item.disabled) {\n\t\t\tthis.active.set(item.value);\n\t\t\tthis.#focusAt(target);\n\t\t}\n\t}\n\n\t/** Next enabled tab index from `index` in `direction`, wrapping around. */\n\t#stepEnabledIndex(index: number, direction: 1 | -1): number {\n\t\tconst items = this.items();\n\t\tconst count = items.length;\n\t\tif (!count) {\n\t\t\treturn -1;\n\t\t}\n\t\tfor (let step = 1; step <= count; step += 1) {\n\t\t\tconst candidate = ((index + direction * step) % count + count) % count;\n\t\t\tif (!items[candidate].disabled) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t\treturn index;\n\t}\n\n\t/** Moves DOM focus to the tab button at `index`. */\n\t#focusAt(index: number): void {\n\t\tconst buttons = this.#host.nativeElement.querySelectorAll<HTMLElement>('.hub-tab-nav__nav-link');\n\t\tbuttons[index]?.focus();\n\t}\n}\n","<ul\n\tclass=\"hub-tab-nav__nav\"\n\trole=\"tablist\"\n\t[attr.aria-orientation]=\"vertical() ? 'vertical' : 'horizontal'\"\n\t[class.hub-tab-nav__nav--tabs]=\"appearance() === 'tabs'\"\n\t[class.hub-tab-nav__nav--pills]=\"appearance() === 'pills'\"\n\t[class.hub-tab-nav__nav--vertical]=\"vertical()\"\n\t[class.hub-tab-nav__nav--justified]=\"justified()\"\n>\n\t@for (item of items(); track item.value; let i = $index) {\n\t\t<li\n\t\t\tclass=\"hub-tab-nav__nav-item\"\n\t\t\t[class.hub-tab-nav__nav-item--active]=\"isActive(item)\"\n\t\t\t[class.hub-tab-nav__nav-item--disabled]=\"!!item.disabled\"\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"hub-tab-nav__nav-link\"\n\t\t\t\trole=\"tab\"\n\t\t\t\t[id]=\"itemId(item, i)\"\n\t\t\t\t[class.hub-tab-nav__nav-link--active]=\"isActive(item)\"\n\t\t\t\t[class.hub-tab-nav__nav-link--disabled]=\"!!item.disabled\"\n\t\t\t\t[disabled]=\"!!item.disabled\"\n\t\t\t\t[attr.aria-selected]=\"isActive(item)\"\n\t\t\t\t[attr.tabindex]=\"tabIndexFor(i)\"\n\t\t\t\t(click)=\"select(item)\"\n\t\t\t\t(keydown)=\"onKeydown($event, i)\"\n\t\t\t>\n\t\t\t\t{{ item.label }}\n\t\t\t</button>\n\t\t</li>\n\t}\n</ul>\n","/*\n * Public API Surface of ng-hub-ui-panels\n */\n\nexport { PanelHeadingDirective } from './lib/directives/panel-heading.directive';\nexport { PanelHeadingActionsDirective } from './lib/directives/panel-heading-actions.directive';\nexport { PanelHeaderDirective } from './lib/directives/panel-header.directive';\nexport { PanelFooterDirective } from './lib/directives/panel-footer.directive';\nexport { PanelComponent } from './lib/components/panel/panel.component';\nexport { PanelsComponent } from './lib/components/panels/panels.component';\nexport { HubTabNavComponent } from './lib/components/tab-nav/tab-nav.component';\nexport { PanelsConfig } from './lib/services/panels-config.service';\nexport type { HubPanelsTogglePosition, PanelChangeEvent, PanelsType } from './lib/models/panels.types';\nexport type { HubTabNavAppearance, HubTabNavItem } from './lib/components/tab-nav/tab-nav.types';\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-panels.mjs","sources":["../../../projects/panels/src/lib/utils/resolve-hub-accent.ts","../../../projects/panels/src/lib/services/panels-config.service.ts","../../../projects/panels/src/lib/utils/content-box-width.ts","../../../projects/panels/src/lib/utils/read-by-path.ts","../../../projects/panels/src/lib/components/panels/panels.component.ts","../../../projects/panels/src/lib/components/panels/panels.component.html","../../../projects/panels/src/lib/components/panel/panel.component.ts","../../../projects/panels/src/lib/components/panel/panel.component.html","../../../projects/panels/src/lib/directives/panel-heading.directive.ts","../../../projects/panels/src/lib/directives/panel-heading-actions.directive.ts","../../../projects/panels/src/lib/directives/panel-header.directive.ts","../../../projects/panels/src/lib/directives/panel-footer.directive.ts","../../../projects/panels/src/lib/components/tab-nav/tab-nav.component.ts","../../../projects/panels/src/lib/components/tab-nav/tab-nav.component.html","../../../projects/panels/src/public-api.ts","../../../projects/panels/src/ng-hub-ui-panels.ts"],"sourcesContent":["/**\n * Resolves an accent value to an inline CSS colour for a `--hub-*-accent` slot.\n *\n * A bareword (a semantic name, a registered accent or a CSS named colour)\n * resolves to `var(--hub-sys-color-<value>, <value>)` — the design-system token\n * with the word itself as the raw fallback — so a custom accent palette\n * interconnects with no colour values living in this library. A literal\n * (`#hex` / `rgb()` / `oklch()` / `var()`) is passed through unchanged. Returns\n * `null` for an empty/whitespace value, keeping the accent slot unset.\n *\n * @param value Raw accent value from the component input.\n * @returns The resolved inline colour, or `null` when no accent applies.\n */\nexport function resolveHubAccent(value: string | null | undefined): string | null {\n\tconst color = value?.trim();\n\tif (!color) {\n\t\treturn null;\n\t}\n\treturn /^[a-zA-Z][\\w-]*$/.test(color) ? `var(--hub-sys-color-${color}, ${color})` : color;\n}\n","import { Injectable } from '@angular/core';\n\nimport type { HubPanelsTogglePosition, PanelsType } from '../models/panels.types';\n\n/**\n * Injectable defaults for every `<hub-panels>` in the application.\n *\n * Override at any injector level to change the defaults globally or for a\n * feature subtree:\n *\n * ```ts\n * providers: [{ provide: PanelsConfig, useValue: { ...new PanelsConfig(), type: 'pills' } }]\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class PanelsConfig {\n\t/** Default navigation style — `'tabs'`, `'pills'` or `'accordion'`. */\n\ttype: PanelsType = 'tabs';\n\n\t/** Whether keyboard navigation (arrows / Home / End / Delete) is enabled. */\n\tisKeysAllowed = true;\n\n\t/** Accordion view: default side of the header row for the disclosure chevron. */\n\ttogglePosition: HubPanelsTogglePosition = 'end';\n\n\t/** Accessible label announced for the panel list. */\n\tariaLabel = 'Tabs';\n\n\t/** Accessible label for the backward scroll button (scrollable mode). */\n\tscrollBackwardAriaLabel = 'Scroll tabs backward';\n\n\t/** Accessible label for the forward scroll button (scrollable mode). */\n\tscrollForwardAriaLabel = 'Scroll tabs forward';\n}\n","/**\n * Usable inner width of an element: `offsetWidth` minus horizontal paddings\n * and borders. Used by the scrollable strip to size its scroll steps.\n */\nexport function contentBoxWidth(element: HTMLElement): number {\n\tconst style = getComputedStyle(element);\n\treturn (\n\t\telement.offsetWidth -\n\t\tparseFloat(style.paddingLeft) -\n\t\tparseFloat(style.paddingRight) -\n\t\tparseFloat(style.borderLeftWidth) -\n\t\tparseFloat(style.borderRightWidth)\n\t);\n}\n","/**\n * Reads a nested value from an object using dot-notation path syntax\n * (e.g. `id`, `meta.key`). Returns `undefined` when the path cannot be\n * resolved. Used by the panels' `bindValue` form-value mapping.\n */\nexport function readByPath(source: unknown, path: string): unknown {\n\tif (source == null || !path) {\n\t\treturn undefined;\n\t}\n\treturn path.split('.').reduce((currentValue: unknown, segment) => {\n\t\tif (currentValue == null) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn (currentValue as Record<string, unknown>)[segment];\n\t}, source);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n\tafterNextRender,\n\tbooleanAttribute,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\tElementRef,\n\tforwardRef,\n\tinject,\n\tinput,\n\toutput,\n\tRenderer2,\n\tRendererStyleFlags2,\n\tsignal,\n\tviewChild,\n\tviewChildren,\n\tViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NavigationEnd, Router, RouterOutlet } from '@angular/router';\nimport { filter } from 'rxjs';\n\nimport type {\n\tHubPanelsTogglePosition,\n\tHubPanelVariant,\n\tPanelChangeEvent,\n\tPanelsType\n} from '../../models/panels.types';\nimport { PanelsConfig } from '../../services/panels-config.service';\nimport { contentBoxWidth } from '../../utils/content-box-width';\nimport { readByPath } from '../../utils/read-by-path';\nimport { resolveHubAccent } from '../../utils/resolve-hub-accent';\nimport type { PanelComponent } from '../panel/panel.component';\n\ninterface MultipleHeaderGroup {\n\tactivePanel?: PanelComponent;\n\theaders: PanelComponent[];\n}\n\n/**\n * Content-panels container — the hub `panels` primitive.\n *\n * Projects `<hub-panel>` panes and renders them in one of three views:\n *\n * - **`tabs` / `pills`** — an accessible `tablist` of clickable headers\n * (roving tabindex, arrow/Home/End/Delete keys) above the active pane.\n * Panels with a `routerLink` switch the content area to a `<router-outlet>`\n * and the active panel follows the URL. With `scrollable`, overflowing\n * headers get backward/forward scroll buttons.\n * - **`accordion`** — each panel renders as a stacked disclosure panel with an\n * animated collapse: clicking an open header closes it, `multiple` allows\n * several panels open at once and `flush` removes the outer chrome. All\n * panels start collapsed unless a panel is marked `[active]` or a form value\n * is bound. Routed panels are not supported in this view.\n *\n * The container implements `ControlValueAccessor`, so the active panel(s) can\n * be bound as a form value (`ngModel` / `formControl`): each panel contributes\n * its `value` (or its `id` by default), optionally narrowed with `bindValue`\n * and compared with `compareWith`. With `multiple` the form value is an array.\n *\n * Theming is driven entirely by the `--hub-panels-*` CSS custom properties\n * (see `panels.variables.scss`); the accordion view also honours the\n * `--hub-accordion-*` ng-hub-ui contract as a compatibility fallback.\n *\n * @example\n * ```html\n * <hub-panels type=\"accordion\" multiple [formControl]=\"openPanels\">\n * <hub-panel heading=\"Fields\" value=\"fields\">…</hub-panel>\n * <hub-panel heading=\"Validations\" value=\"validations\">…</hub-panel>\n * </hub-panels>\n * ```\n */\n@Component({\n\tselector: 'hub-panels',\n\timports: [NgTemplateOutlet, RouterOutlet],\n\ttemplateUrl: './panels.component.html',\n\t// Split by concern (token contract / strip views / accordion view) so each\n\t// sheet stays inside the `anyComponentStyle` budget.\n\tstyleUrls: ['./panels.variables.scss', './panels.component.scss', './panels.accordion.scss'],\n\t// Library-style global stylesheet: rules are namespaced under `.hub-panels*`\n\t// and must reach the projected `hub-panel` panes (host-bound classes).\n\tencapsulation: ViewEncapsulation.None,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALUE_ACCESSOR,\n\t\t\tuseExisting: forwardRef(() => PanelsComponent),\n\t\t\tmulti: true\n\t\t}\n\t],\n\thost: {\n\t\tclass: 'hub-panels',\n\t\t'[class.hub-panels--tabs]': \"type() === 'tabs'\",\n\t\t'[class.hub-panels--pills]': \"type() === 'pills'\",\n\t\t'[class.hub-panels--card]': 'isCardView()',\n\t\t'[class.hub-panels--vertical]': 'vertical() && !isAccordionView() && !isCardView()',\n\t\t'[class.hub-panels--accordion]': 'isAccordionView()',\n\t\t'[class.hub-panels--toggle-start]': \"isAccordionView() && togglePosition() === 'start'\",\n\t\t'[class.hub-panels--flush]': 'isAccordionView() && flush()',\n\t\t'[class.hub-panels--multiple]': 'multiple()',\n\t\t'[attr.data-variant]': 'variant() ?? null',\n\t\t'[style.--hub-panels-accent]': 'groupAccent()',\n\t\t'(window:resize)': 'onWindowResize()'\n\t}\n})\nexport class PanelsComponent implements ControlValueAccessor {\n\treadonly #router = inject(Router);\n\treadonly #renderer = inject(Renderer2);\n\treadonly #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\treadonly #destroyRef = inject(DestroyRef);\n\n\t/** Container-wide defaults (aria labels, default type, keyboard toggle). */\n\tprotected readonly config = inject(PanelsConfig);\n\n\t/** Scrollable container hosting the panel headers (`tabs` / `pills` views). */\n\treadonly navScroller = viewChild<ElementRef<HTMLElement>>('navScroller');\n\n\t/** Backward scroll button (only rendered while it can scroll back). */\n\treadonly prevBtn = viewChild<ElementRef<HTMLElement>>('prevBtn');\n\n\t/** Forward scroll button (only rendered while it can scroll forward). */\n\treadonly nextBtn = viewChild<ElementRef<HTMLElement>>('nextBtn');\n\n\t/** Parking lot that owns the projected panel hosts before they are placed. */\n\treadonly contentRoot = viewChild<ElementRef<HTMLElement>>('contentRoot');\n\n\t/** Visible block hosts used by `multiple` tabs / pills. */\n\treadonly multiplePaneHosts = viewChildren<ElementRef<HTMLElement>>('multiplePaneHost');\n\n\t/** Visible grouped blocks used by `multiple` tabs / pills. */\n\treadonly multipleBlocks = viewChildren<ElementRef<HTMLElement>>('multipleBlock');\n\n\t/** Emitted when the user activates (opens) a different panel. */\n\treadonly panelChange = output<PanelChangeEvent>();\n\n\t/** Whether the panel list is stacked beside the content (`tabs` / `pills`). */\n\treadonly vertical = input(false, { transform: booleanAttribute });\n\n\t/** Whether panel headers stretch to share the available width equally. */\n\treadonly justified = input(false, { transform: booleanAttribute });\n\n\t/** Visualization — `'tabs'` (default), `'pills'` or `'accordion'`. */\n\treadonly type = input<PanelsType>(this.config.type);\n\n\t/** Whether keyboard navigation is enabled. */\n\treadonly isKeysAllowed = input(this.config.isKeysAllowed, {\n\t\ttransform: booleanAttribute\n\t});\n\n\t/** Whether overflowing headers get backward/forward scroll buttons. */\n\treadonly scrollable = input(false, { transform: booleanAttribute });\n\n\t/** Accordion view: whether several panels may be expanded at once. */\n\treadonly multiple = input(false, { transform: booleanAttribute });\n\n\t/** Accordion view: edge-to-edge panels without outer borders or radius. */\n\treadonly flush = input(false, { transform: booleanAttribute });\n\n\t/**\n\t * Accordion view: which side of the header row the disclosure chevron sits\n\t * on — `'end'` (default) trails the heading, `'start'` leads it. Purely\n\t * visual: the DOM order never changes, and the placement is expressed with\n\t * logical properties, so it mirrors automatically under `dir=\"rtl\"`.\n\t */\n\treadonly togglePosition = input<HubPanelsTogglePosition>(this.config.togglePosition);\n\n\t/**\n\t * Semantic accent applied to the navigation strip — the active/hover tab, the\n\t * active pill and the active accordion header all follow it. The built-in\n\t * values (`primary` / `success` / `danger` / `warning` / `info`) render with\n\t * the design-system tints; any other string is also accepted, since the strip\n\t * reads `--hub-sys-color-<variant>` from the host application, so a custom\n\t * accent palette interconnects with no changes to this library. Defaults to\n\t * `primary` when omitted.\n\t */\n\treadonly variant = input<HubPanelVariant | (string & {}) | undefined>(undefined);\n\n\t/**\n\t * Dot-notation path applied to each panel's `value` to obtain the emitted\n\t * form value (e.g. `'meta.key'`). Empty by default — the raw value is used.\n\t */\n\treadonly bindValue = input<string | undefined>(undefined);\n\n\t/** Equality used to match form values against panel values. `===` by default. */\n\treadonly compareWith = input<(a: unknown, b: unknown) => boolean>((a, b) => a === b);\n\n\t/** Registered panels, in projection order. */\n\treadonly panels = signal<PanelComponent[]>([]);\n\n\t/** Currently active panel, if any (the first one, under `multiple`). */\n\treadonly activePanel = computed(() => this.panels().find((panel) => panel.active()));\n\n\t/** Panel index lookup used by the strip templates and keyboard navigation. */\n\treadonly panelIndexMap = computed(() => new Map(this.panels().map((panel, index) => [panel, index])));\n\n\t/** Whether the container renders the accordion visualization. */\n\treadonly isAccordionView = computed(() => this.type() === 'accordion');\n\n\t/**\n\t * Whether the container renders the chromeless `card` visualization: no\n\t * navigation strip and every panel always visible, each styled as a card.\n\t */\n\treadonly isCardView = computed(() => this.type() === 'card');\n\n\t/**\n\t * Inline accent fed to the strip styles, resolved from the `variant` input so\n\t * ANY colour works. A bareword (a semantic name, a registered accent or a CSS\n\t * named colour) resolves to `var(--hub-sys-color-<variant>, <variant>)` — the\n\t * design-system token with the word itself as the raw fallback; a literal\n\t * (`#hex` / `rgb()` / `oklch()` / `var()`) is passed through unchanged. Returns\n\t * `null` to keep the `primary` default. The built-in semantic variants\n\t * additionally pick up their exact ds tints through the SCSS `@each`.\n\t */\n\tprotected readonly groupAccent = computed(() => resolveHubAccent(this.variant()));\n\n\t/**\n\t * Whether more than one panel may be active at once. Driven by `multiple`\n\t * for every view, and always enabled in the `card` view, where all panels\n\t * stay visible at once and must not deactivate one another.\n\t */\n\treadonly allowsMultipleActive = computed(() => this.multiple() || this.isCardView());\n\n\t/** Whether the bound form control disabled the whole container. */\n\treadonly formDisabled = signal(false);\n\n\t/**\n\t * Whether the active panel routes its content through a `<router-outlet>`.\n\t * Never true in the accordion view, where routed panels are not supported.\n\t */\n\tprotected readonly activePanelHasRouter = computed(\n\t\t() => !this.isAccordionView() && !this.allowsMultipleActive() && !!this.activePanel()?.routerUrl()\n\t);\n\n\t/**\n\t * In `multiple` tabs/pills, headers are partitioned into blocks. Every\n\t * active panel starts a block; following inactive headers stay visible in\n\t * that same block until the next active panel starts a new one.\n\t */\n\tprotected readonly multipleHeaderGroups = computed<MultipleHeaderGroup[]>(() => {\n\t\tif (!this.allowsMultipleActive() || this.isAccordionView()) {\n\t\t\treturn [];\n\t\t}\n\t\tconst panels = this.panels();\n\t\tif (!panels.length) {\n\t\t\treturn [];\n\t\t}\n\t\tconst activeIndices = panels\n\t\t\t.map((panel, index) => (panel.active() ? index : -1))\n\t\t\t.filter((index) => index !== -1);\n\t\tif (!activeIndices.length) {\n\t\t\treturn [{ headers: panels }];\n\t\t}\n\t\treturn activeIndices.map((activeIndex, groupIndex) => {\n\t\t\tconst startIndex = groupIndex === 0 ? 0 : activeIndex;\n\t\t\tconst endIndex = activeIndices[groupIndex + 1] ?? panels.length;\n\t\t\treturn {\n\t\t\t\tactivePanel: panels[activeIndex],\n\t\t\t\theaders: panels.slice(startIndex, endIndex)\n\t\t\t};\n\t\t});\n\t});\n\n\t/** Whether the strip cannot scroll further backward. */\n\treadonly backwardIsDisabled = signal(true);\n\n\t/** Whether the strip cannot scroll further forward. */\n\treadonly forwardIsDisabled = signal(false);\n\n\t#isDestroyed = false;\n\t#syncScheduled = false;\n\t#viewInitialised = false;\n\t#placementScheduled = false;\n\t#multipleBlockSizingScheduled = false;\n\n\t/** Last value written by the bound form control; `null` when no form. */\n\t#formValue: unknown[] | null = null;\n\n\t#onChange: (value: unknown) => void = () => undefined;\n\t#onTouched: () => void = () => undefined;\n\n\tconstructor() {\n\t\tthis.#destroyRef.onDestroy(() => {\n\t\t\tthis.#isDestroyed = true;\n\t\t});\n\n\t\tafterNextRender(() => {\n\t\t\tthis.#viewInitialised = true;\n\t\t\tthis.updateScrollButtons();\n\t\t\tthis.setActivePanel();\n\t\t\t// Re-apply any form value written before the panels' inputs were bound.\n\t\t\tthis.#applyFormValue();\n\t\t\tthis.#ensureActivePanel();\n\t\t\tthis.#schedulePanelPlacement();\n\t\t\tthis.#scheduleMultipleBlockSizing();\n\t\t\tthis.#router.events\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter((event) => event instanceof NavigationEnd),\n\t\t\t\t\ttakeUntilDestroyed(this.#destroyRef)\n\t\t\t\t)\n\t\t\t\t.subscribe(() => this.setActivePanel());\n\t\t});\n\t}\n\n\t/**\n\t * Registers a panel in the container. Called by `PanelComponent` on\n\t * construction — not meant for manual use.\n\t */\n\tregisterPanel(panel: PanelComponent): void {\n\t\tthis.panels.update((panels) => [...panels, panel]);\n\t\tthis.#scheduleSync();\n\t}\n\n\t/**\n\t * Removes a panel from the container. `reselect` activates the closest\n\t * enabled neighbour when the removed panel was active; `emit` fires the\n\t * panel's `removed` output.\n\t */\n\tremovePanel(panel: PanelComponent, options: { reselect?: boolean; emit?: boolean } = {}): void {\n\t\tconst { reselect = true, emit = true } = options;\n\t\tconst panels = this.panels();\n\t\tconst index = panels.indexOf(panel);\n\t\tif (index === -1 || this.#isDestroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (reselect && panel.active() && !this.isAccordionView()) {\n\t\t\tconst closestIndex = this.#closestEnabledIndex(index);\n\t\t\tif (closestIndex !== -1) {\n\t\t\t\tpanels[closestIndex].active.set(true);\n\t\t\t}\n\t\t}\n\t\tif (emit) {\n\t\t\tpanel.removed.emit(panel);\n\t\t}\n\n\t\tthis.panels.update((currentPanels) => currentPanels.filter((candidate) => candidate !== panel));\n\n\t\t// Detach the projected pane: the consumer template still owns the node,\n\t\t// so removing the header alone would leave the pane content behind.\n\t\tconst paneElement = panel.elementRef.nativeElement;\n\t\tif (paneElement.parentNode) {\n\t\t\tthis.#renderer.removeChild(paneElement.parentNode, paneElement);\n\t\t}\n\t\tif (panel.active()) {\n\t\t\tpanel.active.set(false);\n\t\t\tthis.#emitFormValue();\n\t\t}\n\t\tthis.#scheduleSync();\n\t}\n\n\t/**\n\t * Activates a panel on behalf of the user (`tabs` / `pills` views): marks it\n\t * active, navigates when routed, and emits `panelChange`. In `multiple` mode\n\t * clicking an active panel toggles it off (the panes render side by side);\n\t * otherwise an already-active panel no-ops. Disabled panels always no-op.\n\t */\n\tselectPanel(panel: PanelComponent): void {\n\t\tif (panel.disabled() || this.formDisabled()) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.allowsMultipleActive()) {\n\t\t\tif (panel.active()) {\n\t\t\t\tpanel.active.set(false);\n\t\t\t} else {\n\t\t\t\tpanel.active.set(true);\n\t\t\t\tpanel.navigate();\n\t\t\t\tthis.panelChange.emit({ prev: undefined, current: panel });\n\t\t\t}\n\t\t\tthis.#emitFormValue();\n\t\t\tthis.#onTouched();\n\t\t\tthis.#schedulePanelPlacement();\n\t\t\treturn;\n\t\t}\n\t\tif (panel.active()) {\n\t\t\treturn;\n\t\t}\n\t\tconst previousPanel = this.activePanel();\n\t\t// Deactivate the previously active panel up front so the emitted form\n\t\t// value reflects only the newly selected panel. The per-panel effect that\n\t\t// enforces single-active runs asynchronously, so relying on it here would\n\t\t// emit a stale value that still includes the previous panel.\n\t\tif (previousPanel && previousPanel !== panel) {\n\t\t\tpreviousPanel.active.set(false);\n\t\t}\n\t\tpanel.active.set(true);\n\t\tpanel.navigate();\n\t\tthis.panelChange.emit({ prev: previousPanel, current: panel });\n\t\tthis.#emitFormValue();\n\t\tthis.#onTouched();\n\t\tthis.#schedulePanelPlacement();\n\t}\n\n\t/**\n\t * Toggles a panel on behalf of the user (accordion view): an open panel\n\t * closes, a closed one opens — closing the others unless `multiple`.\n\t * Emits `panelChange` when a panel opens.\n\t */\n\ttogglePanel(panel: PanelComponent): void {\n\t\tif (panel.disabled() || this.formDisabled()) {\n\t\t\treturn;\n\t\t}\n\t\tif (panel.active()) {\n\t\t\tpanel.active.set(false);\n\t\t} else {\n\t\t\tconst previousPanel = this.allowsMultipleActive() ? undefined : this.activePanel();\n\t\t\tpanel.active.set(true);\n\t\t\tthis.panelChange.emit({ prev: previousPanel, current: panel });\n\t\t}\n\t\tthis.#emitFormValue();\n\t\tthis.#onTouched();\n\t\tthis.#schedulePanelPlacement();\n\t}\n\n\t/**\n\t * Marks the routed panel matching the current URL as active. Does not\n\t * navigate — activation through this path is URL-driven. No-op in the\n\t * accordion view, where routed panels are not supported.\n\t */\n\tsetActivePanel(): void {\n\t\tif (this.isAccordionView()) {\n\t\t\treturn;\n\t\t}\n\t\tconst [route, queryString] = this.#router.url.split('?');\n\t\tfor (const panel of this.panels()) {\n\t\t\tif (!panel.routerUrl()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet matches: boolean;\n\t\t\tif (panel.pathMatch() === 'full') {\n\t\t\t\tconst currentUrl = queryString?.trim() ? `${route}?${queryString.trim()}` : route;\n\t\t\t\tmatches = currentUrl === panel.getFullRoute();\n\t\t\t} else {\n\t\t\t\tmatches = route === panel.getRoute();\n\t\t\t}\n\t\t\tif (matches) {\n\t\t\t\tif (!panel.active()) {\n\t\t\t\t\tpanel.active.set(true);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// ── ControlValueAccessor ────────────────────────────────────────────────\n\n\t/**\n\t * Writes the form value into the container: panels whose (`bindValue`-mapped)\n\t * value matches are activated, the rest are deactivated. With `multiple` an\n\t * array is expected; otherwise a single value.\n\t */\n\twriteValue(value: unknown): void {\n\t\tif (value == null) {\n\t\t\tthis.#formValue = [];\n\t\t} else if (this.multiple()) {\n\t\t\tthis.#formValue = Array.isArray(value) ? [...value] : [value];\n\t\t} else {\n\t\t\tthis.#formValue = Array.isArray(value) ? value.slice(0, 1) : [value];\n\t\t}\n\t\tthis.#applyFormValue();\n\t}\n\n\t/** Registers the form-control change callback. */\n\tregisterOnChange(onChange: (value: unknown) => void): void {\n\t\tthis.#onChange = onChange;\n\t}\n\n\t/** Registers the form-control touched callback. */\n\tregisterOnTouched(onTouched: () => void): void {\n\t\tthis.#onTouched = onTouched;\n\t}\n\n\t/** Enables/disables every panel header on behalf of the form control. */\n\tsetDisabledState(isDisabled: boolean): void {\n\t\tthis.formDisabled.set(isDisabled);\n\t}\n\n\t/** Keyboard navigation for the panel strip (arrows / Home / End / Delete). */\n\tprotected onPanelKeydown(event: KeyboardEvent, index: number): void {\n\t\tif (!this.isKeysAllowed()) {\n\t\t\treturn;\n\t\t}\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowDown':\n\t\t\t\tif (event.key === 'ArrowDown' && !this.vertical()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.#stepEnabledIndex(index, 1));\n\t\t\t\treturn;\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowUp':\n\t\t\t\tif (event.key === 'ArrowUp' && !this.vertical()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.#stepEnabledIndex(index, -1));\n\t\t\t\treturn;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.panels().findIndex((panel) => !panel.disabled()));\n\t\t\t\treturn;\n\t\t\tcase 'End': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst panels = this.panels();\n\t\t\t\tthis.#focusPanelAt(panels.length - 1 - [...panels].reverse().findIndex((panel) => !panel.disabled()));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'Delete': {\n\t\t\t\tconst panel = this.panels()[index];\n\t\t\t\tif (panel?.removable()) {\n\t\t\t\t\tthis.removePanel(panel);\n\t\t\t\t\tqueueMicrotask(() => this.#focusPanelAt(Math.min(index, this.panels().length - 1)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Keyboard navigation between accordion headers (arrows / Home / End /\n\t * Delete). Enter and Space toggle natively through the button click.\n\t */\n\tonAccordionKeydown(event: KeyboardEvent, panel: PanelComponent): void {\n\t\tif (!this.isKeysAllowed()) {\n\t\t\treturn;\n\t\t}\n\t\tconst index = this.panels().indexOf(panel);\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.#stepEnabledIndex(index, 1));\n\t\t\t\treturn;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.#stepEnabledIndex(index, -1));\n\t\t\t\treturn;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.#focusPanelAt(this.panels().findIndex((candidate) => !candidate.disabled()));\n\t\t\t\treturn;\n\t\t\tcase 'End': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst panels = this.panels();\n\t\t\t\tthis.#focusPanelAt(panels.length - 1 - [...panels].reverse().findIndex((candidate) => !candidate.disabled()));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'Delete': {\n\t\t\t\tif (panel.removable()) {\n\t\t\t\t\tthis.removePanel(panel);\n\t\t\t\t\tqueueMicrotask(() => this.#focusPanelAt(Math.min(index, this.panels().length - 1)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Recomputes the enabled/disabled state of the scroll buttons. */\n\tprotected updateScrollButtons(): void {\n\t\tif (!this.scrollable() || this.isAccordionView()) {\n\t\t\treturn;\n\t\t}\n\t\tconst scroller = this.navScroller()?.nativeElement;\n\t\tif (!scroller) {\n\t\t\treturn;\n\t\t}\n\t\tconst { scrollLeft, scrollWidth } = scroller;\n\t\tthis.backwardIsDisabled.set(scrollLeft <= 0);\n\t\tthis.forwardIsDisabled.set(scrollLeft + contentBoxWidth(scroller) + 1 >= scrollWidth);\n\t}\n\n\t/** Re-syncs scroll controls and multiple-block sizing on window resize. */\n\tprotected onWindowResize(): void {\n\t\tthis.updateScrollButtons();\n\t\tthis.#scheduleMultipleBlockSizing();\n\t}\n\n\t/** Updates the scroll buttons as the strip scrolls. */\n\tprotected onScroll(): void {\n\t\tthis.updateScrollButtons();\n\t}\n\n\t/** Global index of a panel within the projected strip order. */\n\tprotected panelIndex(panel: PanelComponent): number {\n\t\treturn this.panelIndexMap().get(panel) ?? -1;\n\t}\n\n\t/** Scrolls the panel headers one viewport backward. */\n\tprotected navBackward(): void {\n\t\tconst scroller = this.navScroller()?.nativeElement;\n\t\tif (!scroller) {\n\t\t\treturn;\n\t\t}\n\t\tconst step = contentBoxWidth(scroller) - this.#visibleScrollButtonsWidth();\n\t\tscroller.scrollLeft = Math.max(scroller.scrollLeft - step, 0);\n\t}\n\n\t/** Scrolls the panel headers one viewport forward. */\n\tprotected navForward(): void {\n\t\tconst scroller = this.navScroller()?.nativeElement;\n\t\tif (!scroller) {\n\t\t\treturn;\n\t\t}\n\t\tconst step = contentBoxWidth(scroller) - this.#visibleScrollButtonsWidth();\n\t\tconst lastPosition = scroller.scrollWidth - step;\n\t\tscroller.scrollLeft = Math.min(scroller.scrollLeft + step, lastPosition);\n\t}\n\n\t/** Width currently taken by the visible scroll buttons. */\n\t#visibleScrollButtonsWidth(): number {\n\t\treturn [this.prevBtn()?.nativeElement, this.nextBtn()?.nativeElement].reduce(\n\t\t\t(total, button) => (button ? total + contentBoxWidth(button) : total),\n\t\t\t0\n\t\t);\n\t}\n\n\t/** Index of the enabled panel closest to `index`, or `-1` when none exists. */\n\t#closestEnabledIndex(index: number): number {\n\t\tconst panels = this.panels();\n\t\tfor (let step = 1; step <= panels.length; step += 1) {\n\t\t\tconst previous = panels[index - step];\n\t\t\tif (previous && !previous.disabled()) {\n\t\t\t\treturn index - step;\n\t\t\t}\n\t\t\tconst next = panels[index + step];\n\t\t\tif (next && !next.disabled()) {\n\t\t\t\treturn index + step;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/** Next enabled panel index from `index` in `direction`, wrapping around. */\n\t#stepEnabledIndex(index: number, direction: 1 | -1): number {\n\t\tconst panels = this.panels();\n\t\tfor (let step = 1; step <= panels.length; step += 1) {\n\t\t\tconst candidate = (index + direction * step + panels.length * step) % panels.length;\n\t\t\tif (!panels[candidate].disabled()) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t\treturn index;\n\t}\n\n\t/** Moves DOM focus to the panel header at `index` (strip link or accordion button). */\n\t#focusPanelAt(index: number): void {\n\t\tif (index < 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst selector = this.isAccordionView() ? '.hub-panels__accordion-btn' : '.hub-panels__nav-link';\n\t\tconst headers = this.#elementRef.nativeElement.querySelectorAll<HTMLElement>(selector);\n\t\theaders[index]?.focus();\n\t}\n\n\t/**\n\t * Coalesces post-registration/removal housekeeping into one microtask:\n\t * re-applies the bound form value to the current panels, guarantees an\n\t * active panel (non-routed `tabs` / `pills` containers without a bound\n\t * form) and refreshes the scroll buttons after the strip changed size.\n\t * Skipped until the first render — before it the projected panels' inputs\n\t * are not bound yet, and the constructor's `afterNextRender` performs the\n\t * initial pass instead.\n\t */\n\t#scheduleSync(): void {\n\t\tif (this.#syncScheduled || this.#isDestroyed) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#syncScheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tthis.#syncScheduled = false;\n\t\t\tif (this.#isDestroyed || !this.#viewInitialised) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#applyFormValue();\n\t\t\tthis.#ensureActivePanel();\n\t\t\tthis.#schedulePanelPlacement();\n\t\t\tthis.updateScrollButtons();\n\t\t});\n\t}\n\n\t/** Coalesces DOM moves for the projected `hub-panel` hosts. */\n\t#schedulePanelPlacement(): void {\n\t\tif (this.#placementScheduled || this.#isDestroyed) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#placementScheduled = true;\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.#placementScheduled = false;\n\t\t\tif (this.#isDestroyed || !this.#viewInitialised) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#runPanelPlacementPass();\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (this.#isDestroyed || !this.#viewInitialised) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.#runPanelPlacementPass();\n\t\t\t});\n\t\t});\n\t}\n\n\t/** Performs one projected-panel placement pass plus dependent sizing. */\n\t#runPanelPlacementPass(): void {\n\t\tthis.#placeProjectedPanels();\n\t\tthis.#scheduleMultipleBlockSizing();\n\t}\n\n\t/** Coalesces the DOM measurements needed by `multiple + vertical`. */\n\t#scheduleMultipleBlockSizing(): void {\n\t\tif (this.#multipleBlockSizingScheduled || this.#isDestroyed) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#multipleBlockSizingScheduled = true;\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.#multipleBlockSizingScheduled = false;\n\t\t\tif (this.#isDestroyed || !this.#viewInitialised) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#syncMultipleBlockSizing();\n\t\t});\n\t}\n\n\t/** Moves projected panel hosts into their visible multiple-block container. */\n\t#placeProjectedPanels(): void {\n\t\tconst contentRoot = this.contentRoot()?.nativeElement;\n\t\tif (!contentRoot) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this.allowsMultipleActive() || this.isAccordionView()) {\n\t\t\tfor (const panel of this.panels()) {\n\t\t\t\tconst panelElement = panel.elementRef.nativeElement;\n\t\t\t\tif (panelElement.parentElement !== contentRoot) {\n\t\t\t\t\tthis.#renderer.appendChild(contentRoot, panelElement);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst hostMap = new Map(\n\t\t\tArray.from(\n\t\t\t\tthis.#elementRef.nativeElement.querySelectorAll<HTMLElement>(\n\t\t\t\t\t'.hub-panels__multiple-layout .hub-panels__multiple-pane-host'\n\t\t\t\t)\n\t\t\t)\n\t\t\t\t.map((host) => [host.dataset['panelId'] ?? '', host] as const)\n\t\t);\n\t\tfor (const panel of this.panels()) {\n\t\t\tconst panelElement = panel.elementRef.nativeElement;\n\t\t\tconst targetHost = hostMap.get(panel.id()) ?? contentRoot;\n\t\t\tif (panelElement.parentElement !== targetHost) {\n\t\t\t\tthis.#renderer.appendChild(targetHost, panelElement);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Updates the minimum content width for each `multiple + vertical` block. */\n\t#syncMultipleBlockSizing(): void {\n\t\tfor (const blockRef of this.multipleBlocks()) {\n\t\t\tconst block = blockRef.nativeElement;\n\t\t\tthis.#renderer.removeStyle(\n\t\t\t\tblock,\n\t\t\t\t'--hub-panels-multiple-vertical-panel-min-width',\n\t\t\t\tRendererStyleFlags2.DashCase\n\t\t\t);\n\t\t\tif (!this.vertical() || !this.allowsMultipleActive() || this.isAccordionView()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst header = block.querySelector(':scope > .hub-panels__header');\n\t\t\tif (!(header instanceof HTMLElement)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst headerStackHeight = Math.ceil(header.getBoundingClientRect().height);\n\t\t\tthis.#renderer.setStyle(\n\t\t\t\tblock,\n\t\t\t\t'--hub-panels-multiple-vertical-panel-min-width',\n\t\t\t\t`${headerStackHeight}px`,\n\t\t\t\tRendererStyleFlags2.DashCase\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Activates the first enabled panel when none is active. Skipped for the\n\t * accordion view (panels start collapsed), for routed containers (the URL\n\t * is the single source of truth) and when a form value is bound (the form\n\t * is).\n\t */\n\t#ensureActivePanel(): void {\n\t\tif (this.isAccordionView() || this.#formValue !== null) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.allowsMultipleActive()) {\n\t\t\treturn;\n\t\t}\n\t\tconst panels = this.panels();\n\t\tif (!panels.length || panels.some((panel) => panel.active())) {\n\t\t\treturn;\n\t\t}\n\t\tif (panels.some((panel) => !!panel.routerUrl())) {\n\t\t\treturn;\n\t\t}\n\t\tpanels.find((panel) => !panel.disabled())?.active.set(true);\n\t}\n\n\t/** Activates/deactivates panels so they mirror the bound form value. */\n\t#applyFormValue(): void {\n\t\tif (this.#formValue === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst compare = this.compareWith();\n\t\tfor (const panel of this.panels()) {\n\t\t\tconst panelValue = this.#comparableValue(panel);\n\t\t\tconst matches = this.#formValue.some((selectedValue) => compare(selectedValue, panelValue));\n\t\t\tif (panel.active() !== matches) {\n\t\t\t\tpanel.active.set(matches);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Emits the current selection through the form-control callback. */\n\t#emitFormValue(): void {\n\t\tconst compare = this.compareWith();\n\t\tconst activeValues = this.panels()\n\t\t\t.filter((panel) => panel.active())\n\t\t\t.map((panel) => this.#comparableValue(panel));\n\t\tif (this.#formValue !== null) {\n\t\t\tthis.#formValue = [...activeValues];\n\t\t}\n\t\t// Deduplicate defensively when several panels share the same value.\n\t\tconst uniqueValues = activeValues.filter(\n\t\t\t(value, index) => activeValues.findIndex((candidate) => compare(candidate, value)) === index\n\t\t);\n\t\tthis.#onChange(this.multiple() ? uniqueValues : (uniqueValues[0] ?? null));\n\t}\n\n\t/** Form value of a panel with the `bindValue` path applied. */\n\t#comparableValue(panel: PanelComponent): unknown {\n\t\tconst rawValue = panel.formValue();\n\t\tconst bindPath = this.bindValue();\n\t\treturn bindPath ? readByPath(rawValue, bindPath) : rawValue;\n\t}\n}\n","@if (!isAccordionView() && !isCardView()) {\n\t@if (multiple()) {\n\t\t<div class=\"hub-panels__multiple-layout\">\n\t\t\t@for (group of multipleHeaderGroups(); track group.activePanel ?? group.headers[0]) {\n\t\t\t\t<div\n\t\t\t\t\t#multipleBlock\n\t\t\t\t\tclass=\"hub-panels hub-panels__multiple-block\"\n\t\t\t\t\t[class.hub-panels--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels--vertical]=\"vertical()\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"hub-panels__header\">\n\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (panel of group.headers; track panel) {\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && panelIndex(panel) === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, panelIndex(panel))\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t@if (!justified() && type() !== 'pills' && !vertical()) {\n\t\t\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t@if (group.activePanel) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"hub-panels__content\"\n\t\t\t\t\t\t\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t#multiplePaneHost\n\t\t\t\t\t\t\t\tclass=\"hub-panels__multiple-pane-host\"\n\t\t\t\t\t\t\t\t[attr.data-panel-id]=\"group.activePanel.id()\"\n\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t} @else {\n\t\t<div class=\"hub-panels__header\">\n\t\t\t@if (scrollable() && !backwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#prevBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--backward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollBackwardAriaLabel\"\n\t\t\t\t\t(click)=\"navBackward()\"\n\t\t\t\t></button>\n\t\t\t}\n\n\t\t\t<div #navScroller class=\"hub-panels__nav-scroller\" (scroll)=\"onScroll()\">\n\t\t\t\t<ul\n\t\t\t\t\tclass=\"hub-panels__nav\"\n\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t[attr.aria-label]=\"config.ariaLabel\"\n\t\t\t\t\t[attr.aria-orientation]=\"vertical() ? 'vertical' : null\"\n\t\t\t\t\t[class.hub-panels__nav--tabs]=\"type() === 'tabs'\"\n\t\t\t\t\t[class.hub-panels__nav--pills]=\"type() === 'pills'\"\n\t\t\t\t\t[class.hub-panels__nav--vertical]=\"vertical()\"\n\t\t\t\t\t[class.hub-panels__nav--justified]=\"justified()\"\n\t\t\t\t>\n\t\t\t\t\t@for (panel of panels(); track panel; let index = $index) {\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tclass=\"hub-panels__nav-item\"\n\t\t\t\t\t\t\t[class]=\"panel.customClass()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--active]=\"panel.active()\"\n\t\t\t\t\t\t\t[class.hub-panels__nav-item--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"hub-panels__nav-link\"\n\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t[id]=\"panel.id() + '-link'\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--active]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[class.hub-panels__nav-link--disabled]=\"panel.disabled()\"\n\t\t\t\t\t\t\t\t[disabled]=\"panel.disabled() || formDisabled()\"\n\t\t\t\t\t\t\t\t[attr.aria-controls]=\"panel.id()\"\n\t\t\t\t\t\t\t\t[attr.aria-selected]=\"panel.active()\"\n\t\t\t\t\t\t\t\t[attr.tabindex]=\"panel.active() || (!activePanel() && index === 0) ? null : -1\"\n\t\t\t\t\t\t\t\t(click)=\"selectPanel(panel)\"\n\t\t\t\t\t\t\t\t(keydown)=\"onPanelKeydown($event, index)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@if (panel.headingRef(); as headingRef) {\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingRef\" />\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t{{ panel.heading() }}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@if (panel.removable()) {\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"hub-panels__remove-btn\"\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation(); removePanel(panel)\"\n\t\t\t\t\t\t\t\t\t\t>&times;</span\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t}\n\t\t\t\t</ul>\n\t\t\t\t@if (!justified() && type() !== 'pills') {\n\t\t\t\t\t<div class=\"hub-panels__spacer\"></div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t@if (scrollable() && !forwardIsDisabled()) {\n\t\t\t\t<button\n\t\t\t\t\t#nextBtn\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"hub-panels__scroll-btn hub-panels__scroll-btn--forward\"\n\t\t\t\t\t[attr.aria-label]=\"config.scrollForwardAriaLabel\"\n\t\t\t\t\t(click)=\"navForward()\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t</div>\n\t}\n}\n\n<div\n\t#contentRoot\n\tclass=\"hub-panels__content\"\n\t[class.hub-panels__content--pills]=\"type() === 'pills'\"\n\t[class.hub-panels__content--accordion]=\"isAccordionView()\"\n\t[class.hub-panels__content--multiple-parking]=\"!isAccordionView() && multiple()\"\n>\n\t@if (activePanelHasRouter()) {\n\t\t<router-outlet />\n\t} @else {\n\t\t<ng-content />\n\t}\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n\tbooleanAttribute,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tmodel,\n\tOnDestroy,\n\toutput,\n\tRenderer2,\n\tsignal,\n\tTemplateRef,\n\tViewEncapsulation\n} from '@angular/core';\nimport { Params, Router } from '@angular/router';\n\nimport { HubPanelAppearance, HubPanelVariant } from '../../models/panels.types';\nimport { resolveHubAccent } from '../../utils/resolve-hub-accent';\nimport { PanelsComponent } from '../panels/panels.component';\n\n/** Monotonic counter backing the auto-generated accessibility ids. */\nlet nextPanelId = 0;\n\n/**\n * One content panel inside a `<hub-panels>` container.\n *\n * In the `tabs` / `pills` views the host element is the tab *panel*\n * (`role=\"tabpanel\"`) and the clickable header is rendered by\n * {@link PanelsComponent} in the strip. In the `accordion` view this component\n * renders its own disclosure header plus an animated collapse wrapper around\n * the projected content. In every view the header comes from `heading` or from\n * a `<ng-template hubPanelHeading>` projected inside this element.\n *\n * Panels can be plain content panes or routed: when `routerLink` is set, the\n * container renders a `<router-outlet>` instead of the projected panels and\n * the active panel follows the current URL (`tabs` / `pills` views only).\n *\n * @example\n * ```html\n * <hub-panels>\n * <hub-panel heading=\"Fields\">…</hub-panel>\n * <hub-panel>\n * <ng-template hubPanelHeading>Validations <span class=\"badge\">3</span></ng-template>\n * …\n * </hub-panel>\n * </hub-panels>\n * ```\n */\n@Component({\n\tselector: 'hub-panel, [hub-panel]',\n\texportAs: 'hubPanel',\n\timports: [NgTemplateOutlet],\n\ttemplateUrl: './panel.component.html',\n\t// The `card` view styles (and the projected header/footer bands) live here so\n\t// a standalone `<hub-panel>` — used outside any `<hub-panels>` container, which\n\t// would otherwise be the only source of the global styles — is styled too.\n\t// `ViewEncapsulation.None` is required so the rules reach the projected,\n\t// consumer-owned `[hubPanelHeader]` / `[hubPanelFooter]` elements.\n\tstyleUrl: './panel.component.scss',\n\tencapsulation: ViewEncapsulation.None,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-panels__panel',\n\t\t'[attr.id]': 'accordionView() || cardView() ? null : id()',\n\t\t'[attr.role]': \"alertView() ? 'alert' : (accordionView() || cardView() ? null : 'tabpanel')\",\n\t\t'[attr.aria-labelledby]': \"accordionView() || cardView() ? null : id() + '-link'\",\n\t\t'[attr.data-variant]': 'cardView() ? (variant() ?? null) : null',\n\t\t'[style.--hub-panels-alert-accent]': 'alertAccent()',\n\t\t'[style.--hub-panels-card-accent]': 'cardAccent()',\n\t\t'[class.hub-panels__panel--active]': 'active()',\n\t\t'[class.hub-panels__panel--accordion]': 'accordionView()',\n\t\t'[class.hub-panels__panel--toggle-start]': 'toggleAtStart()',\n\t\t'[class.hub-panels__panel--card]': 'cardView() && !alertView()',\n\t\t'[class.hub-panels__panel--alert]': 'alertView()',\n\t\t'[class.hub-panels__panel--fill]': 'fill()',\n\t\t'[class.hub-panels__panel--flush]': 'flush()'\n\t}\n})\nexport class PanelComponent implements OnDestroy {\n\t/** Host element reference — exposed so the container can detach removed panes. */\n\treadonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n\treadonly #renderer = inject(Renderer2);\n\treadonly #router = inject(Router);\n\n\t/**\n\t * Owning panels container, or `null` when the panel is used standalone\n\t * (outside any `<hub-panels>`), in which case it renders as a card.\n\t * Exposed to the template for the accordion header.\n\t *\n\t * Resolved with `host: true`, so a panel only binds to a group declared in\n\t * the SAME template (its direct container). Without the host boundary the\n\t * lookup walks the whole ancestor injector tree, and a standalone panel\n\t * inside a component projected into a tab pane would register itself as a\n\t * hidden tab of the outer group instead of rendering as a card.\n\t */\n\tprotected readonly tabset = inject(PanelsComponent, { optional: true, host: true });\n\n\t/**\n\t * Opts a standalone `<hub-panel>` OUT of an ancestor `<hub-panels>` group so it\n\t * renders as a plain card even when nested inside a tabs / pills / accordion\n\t * container (otherwise hierarchical DI would capture it as a hidden 0×0 tab).\n\t *\n\t * Must be a STATIC attribute (`<hub-panel standalone>`): the opt-out is decided\n\t * when the panel is created — before dynamic inputs are applied — so it is read\n\t * from the host attribute rather than a reactive input.\n\t */\n\treadonly standalone = this.elementRef.nativeElement.hasAttribute('standalone');\n\n\t/** Plain-text panel header. Ignored when a `hubPanelHeading` template exists. */\n\treadonly heading = input<string | undefined>(undefined);\n\n\t/**\n\t * Visual appearance of a standalone panel: a plain `card` (default) or a\n\t * semantic `alert` callout. Only meaningful when the panel renders as a\n\t * card (used standalone or inside a `card` container); ignored in the\n\t * tabs / pills / accordion strip views.\n\t */\n\treadonly appearance = input<HubPanelAppearance>('card');\n\n\t/**\n\t * Semantic colour applied when `appearance` is `alert`. The built-in values\n\t * (`primary` / `success` / `danger` / `warning` / `info`) render with the\n\t * design-system tints. Any other string is also accepted: the alert reads\n\t * `--hub-sys-color-<variant>` from the host application, so a custom accent\n\t * palette interconnects with no changes to this library. Omit for a neutral\n\t * alert.\n\t */\n\treadonly variant = input<HubPanelVariant | (string & {}) | undefined>(undefined);\n\n\t/**\n\t * Makes a card panel fill its parent's height and lets an inner scroll region\n\t * work: the host, both content wrappers and the body become a flex column\n\t * (`flex: 1; min-height: 0`) and the body scrolls. Opt-in; off by default so\n\t * existing layouts are byte-identical. Card view only.\n\t */\n\treadonly fill = input(false, { transform: booleanAttribute });\n\n\t/**\n\t * Removes the card body padding (`--hub-panels-card-padding-x/-y` → 0) so a card\n\t * can host a flush element (a table, a list, a media block) edge-to-edge. Opt-in;\n\t * card view only.\n\t */\n\treadonly flush = input(false, { transform: booleanAttribute });\n\n\t/**\n\t * Unique id used for the `tab` / `tabpanel` (or accordion header / region)\n\t * ARIA pairing. Auto-generated (`hub-panel-<n>`) when not provided.\n\t */\n\treadonly id = input<string>(`hub-panel-${nextPanelId++}`);\n\n\t/** Whether the panel cannot be activated. */\n\treadonly disabled = input(false, { transform: booleanAttribute });\n\n\t/** Whether the panel shows a remove affordance (✕ and the Delete key). */\n\treadonly removable = input(false, { transform: booleanAttribute });\n\n\t/**\n\t * URL comparison used to mark routed panels active: `'route'` compares the\n\t * path only, `'full'` also compares query params.\n\t */\n\treadonly pathMatch = input<'route' | 'full'>('route');\n\n\t/** Navigation target that turns this panel into a routed panel. */\n\treadonly routerLink = input<string | string[] | null | undefined>(undefined);\n\n\t/** Query params appended when navigating to `routerLink`. */\n\treadonly queryParams = input<Params | null | undefined>(undefined);\n\n\t/** Extra CSS classes applied to both the nav item and this pane. */\n\treadonly customClass = input<string | undefined>(undefined);\n\n\t/**\n\t * Value this panel contributes when the container is used as a form control\n\t * (see {@link PanelsComponent} `ControlValueAccessor`). Defaults to `id`.\n\t */\n\treadonly value = input<unknown>(undefined);\n\n\t/** Whether the panel is currently active (expanded, in the accordion view). */\n\treadonly active = model(false);\n\n\t/** Emitted when the panel becomes active. */\n\treadonly selectPanel = output<PanelComponent>();\n\n\t/** Emitted when the panel stops being active. */\n\treadonly deselectPanel = output<PanelComponent>();\n\n\t/** Emitted when the panel is removed through the ✕ button or the Delete key. */\n\treadonly removed = output<PanelComponent>();\n\n\t/** Custom header template registered by `PanelHeadingDirective`. */\n\treadonly headingRef = signal<TemplateRef<unknown> | undefined>(undefined);\n\n\t/**\n\t * Header actions template registered by `PanelHeadingActionsDirective`.\n\t * Rendered beside the accordion disclosure button — never inside it — so\n\t * real `<button>`s stay valid and reachable while the row is collapsed.\n\t */\n\treadonly headingActionsRef = signal<TemplateRef<unknown> | undefined>(undefined);\n\n\t/** Whether the owning container renders the accordion visualization. */\n\tprotected readonly accordionView = computed(() => !this.standalone && (this.tabset?.isAccordionView() ?? false));\n\n\t/**\n\t * Whether this panel's disclosure chevron leads the header row.\n\t *\n\t * Resolved on the PANEL, not on the container: a nested accordion is a DOM descendant of\n\t * the outer one, so a descendant selector on the container would leak the outer chevron\n\t * placement into every accordion inside its panels.\n\t */\n\tprotected readonly toggleAtStart = computed(\n\t\t() => this.accordionView() && this.tabset?.togglePosition() === 'start'\n\t);\n\n\t/**\n\t * Whether this panel renders as a card: either inside a `<hub-panels\n\t * type=\"card\">` container or standalone (no owning container at all).\n\t */\n\tprotected readonly cardView = computed(() => this.standalone || !this.tabset || this.tabset.isCardView());\n\n\t/**\n\t * Whether this panel renders as a semantic alert: `appearance=\"alert\"` while\n\t * in a card-capable context (standalone or inside a `card` container). In the\n\t * strip / accordion views the alert appearance is ignored.\n\t */\n\tprotected readonly alertView = computed(() => this.appearance() === 'alert' && this.cardView());\n\n\t/**\n\t * Inline accent fed to the alert styles, resolved from the `variant` input so\n\t * ANY colour works. A bareword (a semantic name, a registered accent or a CSS\n\t * named colour) resolves to `var(--hub-sys-color-<variant>, <variant>)` — the\n\t * design-system token with the word itself as the raw fallback; a literal\n\t * (`#hex` / `rgb()` / `oklch()` / `var()`) is passed through unchanged. Returns\n\t * `null` for a neutral alert / non-alert view. The built-in semantic variants\n\t * additionally pick up their exact ds tints through the SCSS `@each`.\n\t */\n\tprotected readonly alertAccent = computed(() => {\n\t\tif (!this.alertView()) {\n\t\t\treturn null;\n\t\t}\n\t\treturn resolveHubAccent(this.variant());\n\t});\n\n\t/**\n\t * Inline accent fed to the card variant tint, resolved from the `variant` input\n\t * exactly like {@link alertAccent}: a bareword becomes\n\t * `var(--hub-sys-color-<variant>, <variant>)` and a literal colour is passed\n\t * through unchanged. Returns `null` for an alert or non-card view, keeping the\n\t * card variant set open with no colour values living in this library.\n\t */\n\tprotected readonly cardAccent = computed(() => {\n\t\tif (!this.cardView() || this.alertView()) {\n\t\t\treturn null;\n\t\t}\n\t\treturn resolveHubAccent(this.variant());\n\t});\n\n\t/** Form value resolved for this panel: the explicit `value` or the panel id. */\n\treadonly formValue = computed(() => (this.value() !== undefined ? this.value() : this.id()));\n\n\t/** `routerLink` normalised to a segments array, or `null` when not routed. */\n\treadonly routerUrl = computed<string[] | null>(() => {\n\t\tconst link = this.routerLink();\n\t\tif (!link) {\n\t\t\treturn null;\n\t\t}\n\t\treturn Array.isArray(link) ? link : [link];\n\t});\n\n\t/** Last activation state seen by the effect — avoids emitting on init. */\n\t#wasActive = false;\n\n\tconstructor() {\n\t\t// A standalone panel (no container, or explicitly `standalone` inside one)\n\t\t// renders as a card and skips registration so it never becomes a hidden tab.\n\t\tif (!this.standalone) {\n\t\t\tthis.tabset?.registerPanel(this);\n\t\t}\n\n\t\t// Mirror `customClass` onto the pane host element.\n\t\teffect((onCleanup) => {\n\t\t\tconst classes = (this.customClass() ?? '')\n\t\t\t\t.split(' ')\n\t\t\t\t.map((cssClass) => cssClass.trim())\n\t\t\t\t.filter((cssClass) => cssClass.length > 0);\n\t\t\tfor (const cssClass of classes) {\n\t\t\t\tthis.#renderer.addClass(this.elementRef.nativeElement, cssClass);\n\t\t\t}\n\t\t\tonCleanup(() => {\n\t\t\t\tfor (const cssClass of classes) {\n\t\t\t\t\tthis.#renderer.removeClass(this.elementRef.nativeElement, cssClass);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// Activation side effects: emit outputs and enforce single-active-panel\n\t\t// (unless the container allows multiple expanded panels — accordion mode).\n\t\teffect(() => {\n\t\t\tconst isActive = this.active();\n\t\t\tif (isActive && this.disabled()) {\n\t\t\t\tthis.active.set(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (isActive === this.#wasActive) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#wasActive = isActive;\n\t\t\tif (isActive) {\n\t\t\t\tthis.selectPanel.emit(this);\n\t\t\t\tif (this.tabset && !this.tabset.allowsMultipleActive()) {\n\t\t\t\t\tfor (const panel of this.tabset.panels()) {\n\t\t\t\t\t\tif (panel !== this) {\n\t\t\t\t\t\t\tpanel.active.set(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.deselectPanel.emit(this);\n\t\t\t}\n\t\t});\n\t}\n\n\tngOnDestroy(): void {\n\t\tif (!this.standalone) {\n\t\t\tthis.tabset?.removePanel(this, { reselect: false, emit: false });\n\t\t}\n\t}\n\n\t/** Route path plus query string, or `null` when the panel is not routed. */\n\tgetFullRoute(): string | null {\n\t\tconst route = this.getRoute();\n\t\tif (!route) {\n\t\t\treturn null;\n\t\t}\n\t\tconst queryString = this.getQueryParamsString();\n\t\treturn queryString ? `${route}?${queryString}` : route;\n\t}\n\n\t/** Normalised absolute route path, or `null` when the panel is not routed. */\n\tgetRoute(): string | null {\n\t\tconst routerUrl = this.routerUrl();\n\t\tif (!routerUrl) {\n\t\t\treturn null;\n\t\t}\n\t\tlet route = routerUrl.join('/').replace(/\\/\\/+/g, '/');\n\t\tif (route.charAt(0) === '.') {\n\t\t\troute = route.substring(1);\n\t\t}\n\t\tif (route.charAt(0) !== '/') {\n\t\t\troute = `/${route}`;\n\t\t}\n\t\treturn route;\n\t}\n\n\t/** `queryParams` serialised as `key=value&…`, or `null` when empty. */\n\tgetQueryParamsString(): string | null {\n\t\tconst params = this.queryParams();\n\t\tif (!params || !Object.keys(params).length) {\n\t\t\treturn null;\n\t\t}\n\t\treturn Object.entries(params)\n\t\t\t.map(([key, value]) => `${key}=${value}`)\n\t\t\t.join('&');\n\t}\n\n\t/** Navigates to the panel's route. No-op for non-routed panels. */\n\tnavigate(): void {\n\t\tconst routerUrl = this.routerUrl();\n\t\tif (routerUrl) {\n\t\t\tthis.#router.navigate(routerUrl, { queryParams: this.queryParams() ?? {} });\n\t\t}\n\t}\n\n\t/** Accordion header click — toggles this panel through the container. */\n\tprotected onAccordionHeaderClick(): void {\n\t\tthis.tabset?.togglePanel(this);\n\t}\n\n\t/** Accordion header keyboard navigation, delegated to the container. */\n\tprotected onAccordionHeaderKeydown(event: KeyboardEvent): void {\n\t\tthis.tabset?.onAccordionKeydown(event, this);\n\t}\n\n\t/** Removes this panel through the accordion header's ✕ affordance. */\n\tprotected removeSelf(): void {\n\t\tthis.tabset?.removePanel(this);\n\t}\n}\n","@if (accordionView()) {\n\t<h2 class=\"hub-panels__accordion-header\" [class.hub-panels__accordion-header--expanded]=\"active()\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"hub-panels__accordion-btn\"\n\t\t\t[class.hub-panels__accordion-btn--collapsed]=\"!active()\"\n\t\t\t[id]=\"id() + '-link'\"\n\t\t\t[disabled]=\"disabled() || tabset?.formDisabled()\"\n\t\t\t[attr.aria-expanded]=\"active()\"\n\t\t\t[attr.aria-controls]=\"id()\"\n\t\t\t(click)=\"onAccordionHeaderClick()\"\n\t\t\t(keydown)=\"onAccordionHeaderKeydown($event)\"\n\t\t>\n\t\t\t@if (headingRef(); as headingTemplate) {\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"headingTemplate\" />\n\t\t\t} @else {\n\t\t\t\t{{ heading() }}\n\t\t\t}\n\t\t\t@if (removable()) {\n\t\t\t\t<span class=\"hub-panels__remove-btn\" aria-hidden=\"true\" (click)=\"$event.stopPropagation(); removeSelf()\">&times;</span>\n\t\t\t}\n\t\t</button>\n\n\t\t<!-- Row affordances live OUTSIDE the disclosure button: a control nested\n\t\t\t in another control is invalid and unreachable by keyboard. They stay\n\t\t\t visible while the row is collapsed, unlike `hubPanelHeader`. -->\n\t\t@if (headingActionsRef(); as actionsTemplate) {\n\t\t\t<span class=\"hub-panels__accordion-actions\">\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"actionsTemplate\" />\n\t\t\t</span>\n\t\t}\n\t</h2>\n}\n\n<!-- Projection slots for every view. In the strip views the wrappers are plain\n\t pass-throughs; in the accordion view they become the animated collapse\n\t region. The header/footer `select` slots and the default `<ng-content>` are\n\t all UNCONDITIONAL — never wrapped in `@if` — to avoid the lost-projection\n\t bug that conditional slots cause. Header/footer render in every view; the\n\t `card` view styles them as the card's header and footer bands. -->\n<div\n\tclass=\"hub-panels__panel-collapse\"\n\t[class.hub-panels__accordion-collapse]=\"accordionView()\"\n\t[class.hub-panels__accordion-collapse--collapsed]=\"accordionView() && !active()\"\n\t[attr.role]=\"accordionView() ? 'region' : null\"\n\t[attr.id]=\"accordionView() ? id() : null\"\n\t[attr.aria-labelledby]=\"accordionView() ? id() + '-link' : null\"\n\t[attr.aria-hidden]=\"accordionView() ? !active() : null\"\n\t[attr.inert]=\"accordionView() && !active() ? '' : null\"\n>\n\t<div class=\"hub-panels__panel-region\" [class.hub-panels__accordion-body]=\"accordionView()\">\n\t\t<ng-content select=\"[hubPanelHeader]\" />\n\t\t<div class=\"hub-panels__panel-body\">\n\t\t\t<ng-content />\n\t\t</div>\n\t\t<ng-content select=\"[hubPanelFooter]\" />\n\t</div>\n</div>\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { PanelComponent } from '../components/panel/panel.component';\n\n/**\n * Marks an `<ng-template>` inside a `hub-panel` as that panel's custom header\n * (strip link in `tabs`/`pills` view, disclosure button in `accordion` view),\n * replacing the plain-text `heading` input.\n *\n * @example\n * ```html\n * <hub-panel>\n * <ng-template hubPanelHeading><em>Rich</em> heading</ng-template>\n * Panel content\n * </hub-panel>\n * ```\n */\n@Directive({ selector: '[hubPanelHeading]' })\nexport class PanelHeadingDirective {\n\tconstructor() {\n\t\tinject(PanelComponent).headingRef.set(inject(TemplateRef));\n\t}\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { PanelComponent } from '../components/panel/panel.component';\n\n/**\n * Marks an `<ng-template>` inside a `hub-panel` as that panel's header\n * **actions** slot, rendered in the `accordion` view as a sibling of the\n * disclosure button — inside the header row, outside the button.\n *\n * This is the slot for row affordances that must stay reachable while the\n * panel is collapsed (edit, delete, a menu). They cannot live in\n * `hubPanelHeading`, which projects *inside* the disclosure `<button>`: a\n * `<button>` nested in another button is invalid HTML and is not reachable\n * with the keyboard. Nor can they live in `hubPanelHeader`, which projects\n * inside the collapse region and therefore disappears when the row closes.\n *\n * Clicks on the actions never toggle the panel — the slot sits outside the\n * button, so no `stopPropagation` is needed. In the `tabs` / `pills` / `card`\n * views the slot renders nothing (those views have no header row of their own).\n *\n * @example\n * ```html\n * <hub-panels type=\"accordion\" multiple>\n * <hub-panel>\n * <ng-template hubPanelHeading>Shipping address</ng-template>\n * <ng-template hubPanelHeadingActions>\n * <button type=\"button\" (click)=\"edit()\">Edit</button>\n * <button type=\"button\" (click)=\"remove()\">Delete</button>\n * </ng-template>\n * Panel content\n * </hub-panel>\n * </hub-panels>\n * ```\n */\n@Directive({ selector: '[hubPanelHeadingActions]' })\nexport class PanelHeadingActionsDirective {\n\tconstructor() {\n\t\tinject(PanelComponent).headingActionsRef.set(inject(TemplateRef));\n\t}\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks an element inside a `hub-panel` as the panel's content **header** band,\n * projected at the top of the panel body (above `<ng-content>`).\n *\n * Unlike `hubPanelHeading` — which renders the navigational label in the\n * `tabs`/`pills` strip or the `accordion` disclosure button — this header lives\n * inside the panel body and renders in **every** view (`tabs`, `pills`,\n * `accordion`, `card`). It is the natural title slot for the `card` format.\n *\n * @example\n * ```html\n * <hub-panel>\n * <div hubPanelHeader>Card title</div>\n * Card content\n * <div hubPanelFooter>Actions</div>\n * </hub-panel>\n * ```\n */\n@Directive({\n\tselector: '[hubPanelHeader]',\n\thost: { class: 'hub-panels__panel-header' }\n})\nexport class PanelHeaderDirective {}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks an element inside a `hub-panel` as the panel's content **footer** band,\n * projected at the bottom of the panel body (below `<ng-content>`).\n *\n * Renders in **every** view (`tabs`, `pills`, `accordion`, `card`); it is the\n * natural actions/footer slot for the `card` format.\n *\n * @example\n * ```html\n * <hub-panel>\n * <div hubPanelHeader>Card title</div>\n * Card content\n * <div hubPanelFooter>Actions</div>\n * </hub-panel>\n * ```\n */\n@Directive({\n\tselector: '[hubPanelFooter]',\n\thost: { class: 'hub-panels__panel-footer' }\n})\nexport class PanelFooterDirective {}\n","import {\n\tbooleanAttribute,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tElementRef,\n\tinject,\n\tinput,\n\tmodel,\n\tViewEncapsulation\n} from '@angular/core';\n\nimport type { HubTabNavAppearance, HubTabNavItem } from './tab-nav.types';\n\n/**\n * Lightweight, value-bound tab strip — the hub `tab-nav` primitive.\n *\n * Where `<hub-panels type=\"tabs\">` couples the strip to projected\n * `<hub-panel>` content (lazy render, accordion / card modes, routing, forms),\n * `<hub-tab-nav>` is a **content-less** controlled strip: it renders an\n * accessible `role=\"tablist\"` of `role=\"tab\"` buttons from a plain `items`\n * array and emits the selected `value` through the two-way `active` model. The\n * consumer owns the view and renders it themselves based on `active()` /\n * `(activeChange)` — a segmented control, a filter switch or a manual\n * tabs-with-external-content layout.\n *\n * It reuses the `<hub-panels>` strip look through the same\n * `--hub-panels-*` theming tokens (picked up automatically when nested in a\n * themed panels subtree, literal fallbacks otherwise) and exposes two\n * strip-local tokens: `--hub-tabs-indicator-color` (the active underline / pill\n * fill) and `--hub-tabs-gap` (the inter-tab gap).\n *\n * Keyboard: arrow keys move focus and activate the neighbour (roving\n * `tabindex`), `Home` / `End` jump to the first / last enabled tab. Disabled\n * tabs are skipped by pointer and keyboard.\n *\n * @example\n * ```html\n * <hub-tab-nav\n * \t[items]=\"[{ value: 'all', label: 'All' }, { value: 'open', label: 'Open' }]\"\n * \t[(active)]=\"filter\"\n * \tappearance=\"pills\"\n * />\n * <!-- consumer renders its own view based on `filter` -->\n * ```\n */\n@Component({\n\tselector: 'hub-tab-nav',\n\texportAs: 'hubTabNav',\n\ttemplateUrl: './tab-nav.component.html',\n\tstyleUrl: './tab-nav.component.scss',\n\t// Library-style global stylesheet: rules stay namespaced under\n\t// `.hub-tab-nav*` and reach the projected `<button>` headers.\n\tencapsulation: ViewEncapsulation.None,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\thost: {\n\t\tclass: 'hub-tab-nav',\n\t\t'[class.hub-tab-nav--vertical]': 'vertical()'\n\t}\n})\nexport class HubTabNavComponent {\n\treadonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n\t/** The selectable tabs, in render order. */\n\treadonly items = input<HubTabNavItem[]>([]);\n\n\t/** Two-way selected value; `activeChange` fires whenever it changes. */\n\treadonly active = model<unknown>();\n\n\t/** Visual appearance — underlined `'tabs'` (default) or rounded `'pills'`. */\n\treadonly appearance = input<HubTabNavAppearance>('tabs');\n\n\t/** Whether the tabs stretch to share the available width equally. */\n\treadonly justified = input(false, { transform: booleanAttribute });\n\n\t/** Whether the strip stacks vertically instead of in a row. */\n\treadonly vertical = input(false, { transform: booleanAttribute });\n\n\t/** Index of the item whose value matches `active`, or `-1` when none does. */\n\treadonly activeIndex = computed(() => {\n\t\tconst active = this.active();\n\t\treturn this.items().findIndex((item) => item.value === active);\n\t});\n\n\t/** Whether the given item is the active one. */\n\tprotected isActive(item: HubTabNavItem): boolean {\n\t\treturn item.value === this.active();\n\t}\n\n\t/** ARIA id of a tab button — the item's own `id` or a deterministic fallback. */\n\tprotected itemId(item: HubTabNavItem, index: number): string {\n\t\treturn item.id ?? `hub-tab-nav-${index}`;\n\t}\n\n\t/**\n\t * Roving `tabindex` for the tab at `index`: `0` for the active tab (or the\n\t * first enabled tab when none is active), `-1` for the rest — so the strip\n\t * is a single tab stop and arrow keys move within it.\n\t */\n\tprotected tabIndexFor(index: number): number {\n\t\tconst activeIndex = this.activeIndex();\n\t\tif (activeIndex >= 0) {\n\t\t\treturn index === activeIndex ? 0 : -1;\n\t\t}\n\t\treturn index === this.items().findIndex((item) => !item.disabled) ? 0 : -1;\n\t}\n\n\t/**\n\t * Activates a tab on behalf of the user: sets `active` to its value (which\n\t * emits `activeChange`). Disabled tabs and re-selecting the active tab\n\t * no-op.\n\t */\n\tselect(item: HubTabNavItem): void {\n\t\tif (item.disabled || this.isActive(item)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.active.set(item.value);\n\t}\n\n\t/** Keyboard navigation for the strip (arrows / Home / End). */\n\tprotected onKeydown(event: KeyboardEvent, index: number): void {\n\t\tlet target: number;\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowDown':\n\t\t\t\ttarget = this.#stepEnabledIndex(index, 1);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowUp':\n\t\t\t\ttarget = this.#stepEnabledIndex(index, -1);\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\ttarget = this.items().findIndex((item) => !item.disabled);\n\t\t\t\tbreak;\n\t\t\tcase 'End': {\n\t\t\t\tconst items = this.items();\n\t\t\t\ttarget = items.length - 1 - [...items].reverse().findIndex((item) => !item.disabled);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t\tif (target < 0) {\n\t\t\treturn;\n\t\t}\n\t\tevent.preventDefault();\n\t\tconst item = this.items()[target];\n\t\tif (item && !item.disabled) {\n\t\t\tthis.active.set(item.value);\n\t\t\tthis.#focusAt(target);\n\t\t}\n\t}\n\n\t/** Next enabled tab index from `index` in `direction`, wrapping around. */\n\t#stepEnabledIndex(index: number, direction: 1 | -1): number {\n\t\tconst items = this.items();\n\t\tconst count = items.length;\n\t\tif (!count) {\n\t\t\treturn -1;\n\t\t}\n\t\tfor (let step = 1; step <= count; step += 1) {\n\t\t\tconst candidate = ((index + direction * step) % count + count) % count;\n\t\t\tif (!items[candidate].disabled) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t\treturn index;\n\t}\n\n\t/** Moves DOM focus to the tab button at `index`. */\n\t#focusAt(index: number): void {\n\t\tconst buttons = this.#host.nativeElement.querySelectorAll<HTMLElement>('.hub-tab-nav__nav-link');\n\t\tbuttons[index]?.focus();\n\t}\n}\n","<ul\n\tclass=\"hub-tab-nav__nav\"\n\trole=\"tablist\"\n\t[attr.aria-orientation]=\"vertical() ? 'vertical' : 'horizontal'\"\n\t[class.hub-tab-nav__nav--tabs]=\"appearance() === 'tabs'\"\n\t[class.hub-tab-nav__nav--pills]=\"appearance() === 'pills'\"\n\t[class.hub-tab-nav__nav--vertical]=\"vertical()\"\n\t[class.hub-tab-nav__nav--justified]=\"justified()\"\n>\n\t@for (item of items(); track item.value; let i = $index) {\n\t\t<li\n\t\t\tclass=\"hub-tab-nav__nav-item\"\n\t\t\t[class.hub-tab-nav__nav-item--active]=\"isActive(item)\"\n\t\t\t[class.hub-tab-nav__nav-item--disabled]=\"!!item.disabled\"\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"hub-tab-nav__nav-link\"\n\t\t\t\trole=\"tab\"\n\t\t\t\t[id]=\"itemId(item, i)\"\n\t\t\t\t[class.hub-tab-nav__nav-link--active]=\"isActive(item)\"\n\t\t\t\t[class.hub-tab-nav__nav-link--disabled]=\"!!item.disabled\"\n\t\t\t\t[disabled]=\"!!item.disabled\"\n\t\t\t\t[attr.aria-selected]=\"isActive(item)\"\n\t\t\t\t[attr.tabindex]=\"tabIndexFor(i)\"\n\t\t\t\t(click)=\"select(item)\"\n\t\t\t\t(keydown)=\"onKeydown($event, i)\"\n\t\t\t>\n\t\t\t\t{{ item.label }}\n\t\t\t</button>\n\t\t</li>\n\t}\n</ul>\n","/*\n * Public API Surface of ng-hub-ui-panels\n */\n\nexport { PanelHeadingDirective } from './lib/directives/panel-heading.directive';\nexport { PanelHeadingActionsDirective } from './lib/directives/panel-heading-actions.directive';\nexport { PanelHeaderDirective } from './lib/directives/panel-header.directive';\nexport { PanelFooterDirective } from './lib/directives/panel-footer.directive';\nexport { PanelComponent } from './lib/components/panel/panel.component';\nexport { PanelsComponent } from './lib/components/panels/panels.component';\nexport { HubTabNavComponent } from './lib/components/tab-nav/tab-nav.component';\nexport { PanelsConfig } from './lib/services/panels-config.service';\nexport type { HubPanelsTogglePosition, PanelChangeEvent, PanelsType } from './lib/models/panels.types';\nexport type { HubTabNavAppearance, HubTabNavItem } from './lib/components/tab-nav/tab-nav.types';\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-panels",
3
- "version": "22.8.2",
3
+ "version": "22.8.3",
4
4
  "description": "A versatile, accessible content-panels container for Angular with four visualizations (tabs, pills, accordion, card), standalone cards, content header/footer slots, routing, reactive forms and keyboard navigation. Part of the ng-hub-ui family.",
5
5
  "author": "Carlos Morcillo <carlos.morcillo@me.com> (https://www.carlosmorcillo.com)",
6
6
  "repository": {
@@ -28,7 +28,7 @@
28
28
  "@angular/core": ">=21.0.0",
29
29
  "@angular/forms": ">=21.0.0",
30
30
  "@angular/router": ">=21.0.0",
31
- "ng-hub-ui-ds": ">=1.0.0"
31
+ "ng-hub-ui-ds": ">=22.0.0"
32
32
  },
33
33
  "peerDependenciesMeta": {
34
34
  "ng-hub-ui-ds": {
Binary file