@koobiq/components 21.0.1 → 21.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/badge/_badge-theme.scss +31 -0
  2. package/breadcrumbs/breadcrumbs.scss +5 -1
  3. package/checkbox/_checkbox-theme.scss +0 -17
  4. package/checkbox/checkbox-tokens.scss +0 -4
  5. package/code-block/_code-block-theme.scss +7 -6
  6. package/code-block/code-block-tokens.scss +8 -4
  7. package/code-block/code-block.scss +54 -32
  8. package/content-panel/content-panel-header.scss +2 -3
  9. package/content-panel/content-panel.scss +3 -0
  10. package/core/selection/pseudo-checkbox/pseudo-checkbox-tokens.scss +0 -2
  11. package/fesm2022/koobiq-components-accordion.mjs +4 -4
  12. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  13. package/fesm2022/koobiq-components-actions-panel.mjs +10 -2
  14. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  15. package/fesm2022/koobiq-components-app-switcher.mjs +1 -1
  16. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  17. package/fesm2022/koobiq-components-badge.mjs +2 -2
  18. package/fesm2022/koobiq-components-badge.mjs.map +1 -1
  19. package/fesm2022/koobiq-components-breadcrumbs.mjs +2 -2
  20. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  21. package/fesm2022/koobiq-components-button-toggle.mjs +1 -1
  22. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  23. package/fesm2022/koobiq-components-checkbox.mjs +18 -8
  24. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  25. package/fesm2022/koobiq-components-clamped-text.mjs +78 -10
  26. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  27. package/fesm2022/koobiq-components-code-block.mjs +63 -379
  28. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  29. package/fesm2022/koobiq-components-content-panel.mjs +4 -4
  30. package/fesm2022/koobiq-components-content-panel.mjs.map +1 -1
  31. package/fesm2022/koobiq-components-core.mjs +300 -37
  32. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  33. package/fesm2022/koobiq-components-datepicker.mjs +151 -60
  34. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  35. package/fesm2022/koobiq-components-divider.mjs +3 -3
  36. package/fesm2022/koobiq-components-divider.mjs.map +1 -1
  37. package/fesm2022/koobiq-components-dropdown.mjs +3 -3
  38. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  39. package/fesm2022/koobiq-components-file-upload.mjs +17 -8
  40. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  41. package/fesm2022/koobiq-components-filter-bar.mjs +115 -36
  42. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  43. package/fesm2022/koobiq-components-flag.mjs +3 -3
  44. package/fesm2022/koobiq-components-flag.mjs.map +1 -1
  45. package/fesm2022/koobiq-components-form-field.mjs +90 -27
  46. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  47. package/fesm2022/koobiq-components-icon.mjs +2 -2
  48. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  49. package/fesm2022/koobiq-components-inline-edit.mjs +19 -2
  50. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  51. package/fesm2022/koobiq-components-input.mjs +76 -17
  52. package/fesm2022/koobiq-components-input.mjs.map +1 -1
  53. package/fesm2022/koobiq-components-list.mjs +1 -1
  54. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  55. package/fesm2022/koobiq-components-modal.mjs +3 -3
  56. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  57. package/fesm2022/koobiq-components-navbar.mjs +86 -25
  58. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  59. package/fesm2022/koobiq-components-notification-center.mjs +4 -4
  60. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  61. package/fesm2022/koobiq-components-overflow-items.mjs +116 -38
  62. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  63. package/fesm2022/koobiq-components-popover.mjs +86 -7
  64. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  65. package/fesm2022/koobiq-components-radio.mjs +41 -19
  66. package/fesm2022/koobiq-components-radio.mjs.map +1 -1
  67. package/fesm2022/koobiq-components-search-expandable.mjs +29 -17
  68. package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
  69. package/fesm2022/koobiq-components-select.mjs +49 -12
  70. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  71. package/fesm2022/koobiq-components-sidepanel.mjs +198 -186
  72. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  73. package/fesm2022/koobiq-components-splitter.mjs +49 -25
  74. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  75. package/fesm2022/koobiq-components-tabs.mjs +30 -11
  76. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  77. package/fesm2022/koobiq-components-tags.mjs +1 -1
  78. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  79. package/fesm2022/koobiq-components-textarea.mjs +28 -11
  80. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  81. package/fesm2022/koobiq-components-time-range.mjs +2 -2
  82. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  83. package/fesm2022/koobiq-components-timepicker.mjs +71 -16
  84. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  85. package/fesm2022/koobiq-components-timezone.mjs +2 -2
  86. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  87. package/fesm2022/koobiq-components-toast.mjs +2 -2
  88. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  89. package/fesm2022/koobiq-components-toggle.mjs +25 -9
  90. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  91. package/fesm2022/koobiq-components-tooltip.mjs +90 -17
  92. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  93. package/fesm2022/koobiq-components-top-bar.mjs +27 -7
  94. package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
  95. package/fesm2022/koobiq-components-tree-select.mjs +4 -4
  96. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  97. package/fesm2022/koobiq-components-tree.mjs +71 -27
  98. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  99. package/file-upload/_file-upload-theme.scss +0 -12
  100. package/file-upload/file-upload-tokens.scss +0 -1
  101. package/file-upload/file-upload.scss +0 -1
  102. package/filter-bar/_filter-bar-theme.scss +7 -8
  103. package/filter-bar/filter-bar.scss +0 -1
  104. package/filter-bar/pipes/base-pipe.scss +36 -2
  105. package/filter-bar/pipes/pipe-multi-tree-select.scss +27 -0
  106. package/form-field/_fieldset-theme.scss +2 -7
  107. package/form-field/_form-field-theme.scss +9 -22
  108. package/form-field/_hint-theme.scss +20 -0
  109. package/form-field/fieldset-tokens.scss +0 -1
  110. package/form-field/fieldset.scss +0 -3
  111. package/form-field/form-field-tokens.scss +1 -1
  112. package/form-field/form-field.scss +9 -0
  113. package/form-field/hint-tokens.scss +3 -0
  114. package/modal/modal.scss +2 -0
  115. package/navbar/_navbar-item_vertical.scss +48 -2
  116. package/navbar/_navbar-theme.scss +11 -3
  117. package/navbar/navbar-item.scss +17 -0
  118. package/navbar/navbar-tokens.scss +3 -0
  119. package/package.json +4 -4
  120. package/popover/popover.scss +1 -1
  121. package/radio/_radio-theme.scss +0 -30
  122. package/radio/radio-tokens.scss +0 -2
  123. package/schematics/migrations/deprecated-icons/README.md +21 -5
  124. package/schematics/migrations/deprecated-icons/index.cjs +8 -22
  125. package/schematics/migrations/deprecated-icons/schema.json +1 -1
  126. package/schematics/migrations/icons-replacement/README.md +16 -2
  127. package/schematics/migrations/icons-replacement/index.cjs +18 -16
  128. package/schematics/migrations/icons-replacement/schema.json +12 -3
  129. package/schematics/migrations/new-icons-pack/README.md +37 -25
  130. package/schematics/migrations/new-icons-pack/index.cjs +22 -32
  131. package/schematics/migrations/new-icons-pack/replacement.json +2 -14
  132. package/schematics/migrations/new-icons-pack/schema.json +3 -3
  133. package/schematics/ng-add/index.cjs +4 -4
  134. package/schematics/utils/custom-data.cjs +64 -0
  135. package/schematics/utils/icon-migration.cjs +9 -3
  136. package/schematics/utils/messages.cjs +4 -0
  137. package/schematics/utils/package-config.cjs +19 -0
  138. package/select/select.scss +7 -0
  139. package/tabs/_tabs-common.scss +23 -0
  140. package/textarea/textarea-tokens.scss +4 -1
  141. package/toast/toast.component.scss +1 -0
  142. package/toggle/_toggle-theme.scss +0 -17
  143. package/tooltip/tooltip.scss +1 -1
  144. package/top-bar/top-bar-tokens.scss +1 -0
  145. package/top-bar/top-bar.scss +10 -0
  146. package/types/koobiq-components-accordion.d.ts +25 -0
  147. package/types/koobiq-components-button-toggle.d.ts +6 -0
  148. package/types/koobiq-components-checkbox.d.ts +30 -0
  149. package/types/koobiq-components-clamped-text.d.ts +16 -3
  150. package/types/koobiq-components-code-block.d.ts +17 -3
  151. package/types/koobiq-components-core.d.ts +226 -13
  152. package/types/koobiq-components-datepicker.d.ts +28 -1
  153. package/types/koobiq-components-divider.d.ts +28 -10
  154. package/types/koobiq-components-dropdown.d.ts +19 -0
  155. package/types/koobiq-components-filter-bar.d.ts +77 -4
  156. package/types/koobiq-components-flag.d.ts +18 -0
  157. package/types/koobiq-components-form-field.d.ts +87 -6
  158. package/types/koobiq-components-icon.d.ts +15 -0
  159. package/types/koobiq-components-inline-edit.d.ts +8 -1
  160. package/types/koobiq-components-input.d.ts +22 -3
  161. package/types/koobiq-components-list.d.ts +6 -0
  162. package/types/koobiq-components-modal.d.ts +7 -0
  163. package/types/koobiq-components-navbar.d.ts +71 -7
  164. package/types/koobiq-components-notification-center.d.ts +13 -0
  165. package/types/koobiq-components-overflow-items.d.ts +26 -2
  166. package/types/koobiq-components-popover.d.ts +38 -3
  167. package/types/koobiq-components-radio.d.ts +30 -0
  168. package/types/koobiq-components-search-expandable.d.ts +10 -0
  169. package/types/koobiq-components-select.d.ts +36 -4
  170. package/types/koobiq-components-sidepanel.d.ts +52 -1
  171. package/types/koobiq-components-splitter.d.ts +13 -4
  172. package/types/koobiq-components-tabs.d.ts +4 -0
  173. package/types/koobiq-components-tags.d.ts +6 -0
  174. package/types/koobiq-components-textarea.d.ts +9 -2
  175. package/types/koobiq-components-timepicker.d.ts +15 -0
  176. package/types/koobiq-components-toggle.d.ts +30 -0
  177. package/types/koobiq-components-tooltip.d.ts +55 -10
  178. package/types/koobiq-components-top-bar.d.ts +11 -3
  179. package/types/koobiq-components-tree-select.d.ts +12 -0
  180. package/types/koobiq-components-tree.d.ts +37 -2
@@ -1 +1 @@
1
- {"version":3,"file":"koobiq-components-tabs.mjs","sources":["../../../packages/components/tabs/paginated-tab-header.ts","../../../packages/components/tabs/tab-body.component.ts","../../../packages/components/tabs/tab-body.html","../../../packages/components/tabs/tab-content.directive.ts","../../../packages/components/tabs/tab-label-wrapper.directive.ts","../../../packages/components/tabs/tab-header.component.ts","../../../packages/components/tabs/tab-header.html","../../../packages/components/tabs/tab-label.directive.ts","../../../packages/components/tabs/tab.component.ts","../../../packages/components/tabs/tab-group.component.ts","../../../packages/components/tabs/tab-group.html","../../../packages/components/tabs/tab-nav-bar.ts","../../../packages/components/tabs/tab-nav-bar.html","../../../packages/components/tabs/tabs.module.ts","../../../packages/components/tabs/koobiq-components-tabs.ts"],"sourcesContent":["import { FocusableOption, FocusKeyManager } from '@angular/cdk/a11y';\nimport { Direction, Directionality } from '@angular/cdk/bidi';\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { ENTER, hasModifierKey, SPACE } from '@angular/cdk/keycodes';\nimport { SharedResizeObserver } from '@angular/cdk/observers/private';\nimport { normalizePassiveListenerOptions, Platform } from '@angular/cdk/platform';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AfterContentChecked,\n AfterContentInit,\n afterNextRender,\n AfterViewInit,\n booleanAttribute,\n ChangeDetectorRef,\n DestroyRef,\n Directive,\n ElementRef,\n EventEmitter,\n inject,\n Injector,\n input,\n NgZone,\n OnChanges,\n OnDestroy,\n QueryList,\n signal,\n SimpleChanges,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n DOWN_ARROW,\n END,\n HOME,\n KBQ_WINDOW,\n kbqAnimationsDisabled,\n kbqGetScrollOverflowTolerance,\n kbqHasScrollOverflow,\n kbqOptionalNumberAttribute,\n LEFT_ARROW,\n RIGHT_ARROW,\n UP_ARROW\n} from '@koobiq/components/core';\nimport { KBQ_SCROLLBAR_OPTIONS, type KbqScrollbarMode, type KbqScrollbarViewport } from '@koobiq/components/scrollbar';\nimport { fromEvent, merge, of as observableOf, ReplaySubject, Subject, timer } from 'rxjs';\nimport { auditTime, debounceTime, takeUntil } from 'rxjs/operators';\n\n/** Config used to bind passive event listeners */\nconst passiveEventListenerOptions = normalizePassiveListenerOptions({ passive: true }) as EventListenerOptions;\n\n/**\n * The directions that scrolling can go in when the header's tabs exceed the header width. 'After'\n * will scroll the header towards the end of the tabs list and 'before' will scroll towards the\n * beginning of the list.\n */\nexport type ScrollDirection = 'after' | 'before';\n\n/**\n * Amount of milliseconds to wait before starting to scroll the header automatically.\n * Set a little conservatively in order to handle fake events dispatched on touch devices.\n */\nconst HEADER_SCROLL_DELAY = 650;\n\n/**\n * Interval in milliseconds at which to scroll the header\n * while the user is holding their pointer.\n */\nconst HEADER_SCROLL_INTERVAL = 100;\n\n/** Fraction of the viewport width scrolled per arrow click/press tick. */\nconst SCROLL_DISTANCE = 0.8;\n\n/** Minimum horizontal pointer movement (px) before a pointerdown is treated as a drag rather than a click. */\nconst DRAG_THRESHOLD = 4;\n\n/** Below this speed (px/ms) an inertia coast stops. */\nconst MIN_INERTIA_VELOCITY = 0.02;\n\n/** Clamp applied to the smoothed drag velocity so a jittery fast flick can't launch a huge coast. */\nconst MAX_INERTIA_VELOCITY = 3;\n\n/** Clamp on a single inertia animation frame's elapsed time, guarding against dropped frames/backgrounded tabs. */\nconst MAX_FRAME_DURATION = 32;\n\n/** Per-millisecond exponential decay rate applied to the inertia velocity. */\nconst FRICTION_PER_MILLISECOND = 0.003;\n\n/** Audit interval (ms) for the scroll-box `ResizeObserver` — see the `auditTime` usage below. */\nconst RESIZE_AUDIT_TIME = 100;\n\n/** Debounce (ms) for scroll-correction requests, so a burst of focus/selection changes settles before scrolling. */\nconst SCROLL_CORRECTION_DEBOUNCE = 100;\n\n/** How often (ms) scroll/drag updates are allowed to trigger Angular change detection (arrow visibility, mask). */\nconst SCROLL_CD_THROTTLE = 48;\n\n/** Applied to the scroll container while a drag gesture is in progress. */\nconst DRAGGING_CLASS = 'kbq-tab-header__scroll-container_dragging';\n\n/**\n * Matches nested interactive controls (e.g. a tab's remove button) that have their own click\n * behavior and are too small to reliably press without a few stray pixels of movement — a drag\n * should never start on them, since crossing `DRAG_THRESHOLD` by accident would swallow their click.\n */\nconst NON_DRAGGABLE_TARGET_SELECTOR = 'button, [kbq-icon-button], input, select, textarea';\n\n/** Tracks an in-progress mouse/pen drag gesture on the tab list. */\ninterface DragState {\n pointerId: number;\n didDrag: boolean;\n startX: number;\n lastX: number;\n lastTimestamp: number;\n /** Smoothed pointer velocity in px/ms, positive meaning the pointer moved right. Exponential moving average. */\n velocity: number;\n}\n\n/** Item inside a paginated tab header. */\nexport type KbqPaginatedTabHeaderItem = FocusableOption & { elementRef: ElementRef };\n\n/**\n * Base class for a tab header that supported pagination.\n *\n * @docs-private\n */\n@Directive()\nexport abstract class KbqPaginatedTabHeader\n implements OnChanges, AfterContentChecked, AfterContentInit, AfterViewInit, OnDestroy\n{\n /** @docs-private */\n readonly selectedIndexInput = input<number | undefined, number | string | null | undefined>(undefined, {\n alias: 'selectedIndex',\n transform: kbqOptionalNumberAttribute\n });\n\n /** @docs-private */\n readonly disablePaginationInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'disablePagination',\n transform: booleanAttribute\n });\n\n /** @docs-private */\n readonly verticalInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'vertical',\n transform: booleanAttribute\n });\n\n /** The index of the active tab. */\n get selectedIndex(): number {\n return this.selectedIndexState();\n }\n\n set selectedIndex(value: number) {\n const coercedValue = coerceNumberProperty(value);\n\n this.selectedIndexChanged = untracked(this.selectedIndexState) !== coercedValue;\n this.selectedIndexState.set(coercedValue);\n\n this.keyManager?.updateActiveItem(coercedValue);\n }\n\n private readonly selectedIndexState = signal(0);\n\n /** Tracks which element has focus; used for keyboard navigation */\n get focusIndex(): number {\n // Before `ngAfterContentInit` builds the key manager the selection is where focus would land —\n // `updateActiveItem(this.selectedIndex)` is the first thing that runs once it exists. Falling\n // back to `0` instead would hand the roving `tabindex=\"0\"` to the first tab on the very first\n // render of any group that does not open on it.\n return this.keyManager ? this.keyManager.activeItemIndex! : this.selectedIndex;\n }\n\n /** When the focus index is set, we must manually send focus to the correct label */\n set focusIndex(value: number) {\n if (!this.isValidIndex(value) || this.focusIndex === value || !this.keyManager) {\n return;\n }\n\n this.keyManager.setActiveItem(value);\n }\n\n abstract get items(): QueryList<KbqPaginatedTabHeaderItem>;\n abstract get tabListContainer(): ElementRef<HTMLElement>;\n /** The strip's scroll viewport — the same element as {@link tabListContainer}. */\n protected abstract get scrollbarViewport(): KbqScrollbarViewport;\n abstract get tabList(): ElementRef<HTMLElement>;\n abstract get nextPaginator(): ElementRef<HTMLElement>;\n abstract get previousPaginator(): ElementRef<HTMLElement>;\n\n /** Event emitted when the option is selected. */\n readonly selectFocusedIndex: EventEmitter<number> = new EventEmitter<number>();\n\n /** Event emitted when a label is focused. */\n readonly indexFocused: EventEmitter<number> = new EventEmitter<number>();\n\n /** Whether the controls for pagination should be displayed */\n showPaginationControls = false;\n\n /** Whether the tab list can be scrolled more towards the end of the tab label list. */\n disableScrollAfter = true;\n\n /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */\n disableScrollBefore = true;\n\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n *\n * A vertical header never paginates, so `vertical` forces this on without overwriting the value\n * the consumer set — turning `vertical` back off restores it.\n */\n get disablePagination(): boolean {\n return this._disablePagination || this._vertical;\n }\n\n set disablePagination(value: boolean) {\n this._disablePagination = value;\n }\n\n private _disablePagination = false;\n\n /** Whether the tabs should be displayed vertically. */\n set vertical(value: boolean) {\n this._vertical = value;\n }\n\n get vertical(): boolean {\n return this._vertical;\n }\n\n private _vertical = false;\n\n /** `disablePagination` as of the last content check — see `ngAfterContentChecked`. */\n private previousDisablePagination = false;\n\n /**\n * The number of tab labels that are displayed on the header. When this changes, the header\n * should re-evaluate the scroll position.\n */\n private tabLabelCount: number;\n\n /** Used to manage focus between the tabs. */\n private keyManager: FocusKeyManager<KbqPaginatedTabHeaderItem>;\n\n /** Cached text content of the header. */\n private currentTextContent: string;\n\n /** Stream that will stop the automated scrolling. */\n private stopScrolling = new Subject<void>();\n\n /** Whether the header should scroll to the selected index after the view has been checked. */\n private selectedIndexChanged = false;\n\n /** Whether DOM focus currently sits on one of the items. */\n private focusWasInside = false;\n\n /**\n * Index of the item that last took DOM focus, or `-1`. Recorded from the `focusin` target rather\n * than read back from `keyManager.activeItemIndex`, because the `selectedIndex` setter writes that\n * field too — and on an `items.changes` tick a subscriber registered earlier (`KbqTabNavBar`'s\n * `updateActiveLink`) repoints it at the *active* item before focus restoration gets to run.\n */\n private focusedItemIndex = -1;\n\n /** State of the in-progress mouse/pen drag gesture, if any. */\n private dragState: DragState | null = null;\n\n /** `requestAnimationFrame` handle for an in-progress inertia coast, if any. */\n private inertiaFrameId: number | null = null;\n\n /** Set after a drag gesture so the click it would otherwise trigger on a tab is suppressed. */\n private suppressNextClick = false;\n\n /** Handle of the timer that clears {@link suppressNextClick}, so it can be cancelled on destroy. */\n private suppressClickTimeoutId: ReturnType<Window['setTimeout']> | null = null;\n\n // Attached only while a drag is possibly in progress (from `pointerdown` to `pointerup`/\n // `pointercancel`) rather than for the component's whole lifetime: bound to `ownerDocument`,\n // so every pointer move anywhere on the page would otherwise run this handler for every\n // paginated tab header on the page, whether or not any of them is actually being dragged.\n private readonly documentPointerMoveListener = (event: PointerEvent) => this.handlePointerMove(event);\n private readonly documentPointerUpListener = (event: PointerEvent) => this.endDrag(event, true);\n private readonly documentPointerCancelListener = (event: PointerEvent) => this.endDrag(event, false);\n\n /** Emits on every native `scroll` event and drag/inertia frame; throttled to limit change detection. */\n private readonly scrollProgress = new Subject<void>();\n\n /**\n * Emits scroll-correction requests (from focus or selection changes); debounced so a burst\n * settles once. `ReplaySubject(1)`, not `Subject`: content hooks (where the very first request,\n * from `ngAfterContentChecked`, is sent) run before view hooks in the same initial change-\n * detection pass, so a plain `Subject` would drop it — the `ngAfterViewInit` subscription below\n * doesn't exist yet when it's emitted.\n */\n private readonly scrollCorrectionRequest = new ReplaySubject<{ index: number; behavior: ScrollBehavior }>(1);\n\n /**\n * The latest scroll-correction request, repeated once webfonts finish loading: a label measured in the\n * fallback face moves when the real one swaps in. Dropped once a correction has measured with no font\n * loading, and as soon as the user moves the strip, so the repeat never pulls it back from where they took it.\n */\n private lastScrollCorrection: { index: number; behavior: ScrollBehavior } | null = null;\n\n protected readonly destroyRef = inject(DestroyRef);\n public readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n protected readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly ngZone = inject(NgZone);\n private readonly platform = inject(Platform);\n private readonly dir = inject(Directionality, { optional: true });\n private readonly window = inject(KBQ_WINDOW);\n private readonly sharedResizeObserver = inject(SharedResizeObserver);\n private readonly document = inject(DOCUMENT);\n private readonly scrollbarOptions = inject(KBQ_SCROLLBAR_OPTIONS);\n private readonly injector = inject(Injector);\n\n /** Whether the underline of the active tab moves without motion. */\n protected readonly animationsDisabled = kbqAnimationsDisabled();\n\n /**\n * Scrollbar mode for the tab strip. Only a vertical header scrolls in a direction the user is meant\n * to see, so a horizontal one asks for `hidden`: the native scrollbar stays suppressed and no custom\n * track is built for a strip that is paginated and dragged instead of scrolled by hand.\n *\n * Follows `vertical` itself: the `kbq-tab-group_vertical` class the stylesheet keys `overflow-y: auto`\n * on is bound to the same value. The class of a nav bar is its own host binding, applied only after\n * its content hooks, so reading the class from here would miss it on the first check.\n */\n protected get scrollbarMode(): KbqScrollbarMode {\n return this.vertical ? this.scrollbarOptions.mode : 'hidden';\n }\n\n constructor() {\n const nativeElement = this.elementRef.nativeElement;\n\n // Bind these on the outside since they don't change anything in the view.\n this.ngZone.runOutsideAngular(() => {\n fromEvent(nativeElement, 'mouseleave')\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.stopInterval());\n\n fromEvent<FocusEvent>(nativeElement, 'focusin')\n .pipe(takeUntilDestroyed())\n .subscribe(({ target }) => {\n this.focusWasInside = true;\n this.focusedItemIndex = this.indexOfItemContaining(target);\n });\n\n // Only a move onto a known element outside gives up ownership: a destroyed item reports\n // no `relatedTarget` at all, and that case is what the restore below exists for.\n fromEvent<FocusEvent>(nativeElement, 'focusout')\n .pipe(takeUntilDestroyed())\n .subscribe(({ relatedTarget }) => {\n if (relatedTarget && !nativeElement.contains(relatedTarget as Node)) {\n this.focusWasInside = false;\n }\n });\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member; unbound, it leaves what code wrote.\n if (changes['selectedIndexInput']) this.selectedIndex = this.selectedIndexInput() ?? 0;\n\n if (changes['disablePaginationInput']) {\n const disablePagination = this.disablePaginationInput();\n\n if (disablePagination !== undefined) this.disablePagination = disablePagination;\n }\n\n if (changes['verticalInput']) {\n const vertical = this.verticalInput();\n\n if (vertical !== undefined) this.vertical = vertical;\n }\n }\n\n /** Called when the user has selected an item via the keyboard. */\n ngAfterViewInit() {\n // We need to handle these events manually, because we want to bind passive event listeners.\n fromEvent(this.previousPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.handlePaginatorPress('before'));\n\n fromEvent(this.nextPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.handlePaginatorPress('after'));\n\n this.ngZone.runOutsideAngular(() => {\n const container = this.tabListContainer.nativeElement;\n\n fromEvent(container, 'scroll', passiveEventListenerOptions)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n // A `vertical`/`disablePagination` header still fires native `scroll` events\n // (e.g. `kbq-tab-group_vertical`'s own `overflow-y: auto`); without this guard\n // every one of them would still throttle-trigger a whole-app change-detection\n // tick for four booleans that `updateScrollState` has already pinned to a\n // constant and can never change.\n if (this.disablePagination) return;\n\n this.updateScrollState();\n this.scrollProgress.next();\n });\n\n // Any wheel/trackpad input should immediately take over from a running inertia coast, and from\n // a correction waiting to be repeated.\n fromEvent<WheelEvent>(container, 'wheel', passiveEventListenerOptions)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.cancelInertia();\n this.lastScrollCorrection = null;\n });\n\n fromEvent<PointerEvent>(container, 'pointerdown')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => this.handlePointerDown(event));\n\n // A native drag-and-drop gesture (e.g. starting on a `kbqTabLink`'s `<a href>`) would\n // otherwise hijack our own pointer-based drag partway through, aborting the gesture via\n // a `pointercancel` while a browser-native drag ghost follows the cursor instead.\n fromEvent<DragEvent>(container, 'dragstart')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (this.dragState?.didDrag) event.preventDefault();\n });\n\n // Fallback for when capture is lost without a `pointerup`/`pointercancel` of its own\n // reaching us (e.g. the element is detached, or another element steals capture).\n fromEvent<PointerEvent>(container, 'lostpointercapture')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => this.endDrag(event, true));\n\n fromEvent<MouseEvent>(container, 'click', { capture: true })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (this.suppressNextClick) {\n event.preventDefault();\n event.stopPropagation();\n this.suppressNextClick = false;\n }\n });\n\n this.scrollProgress\n .pipe(auditTime(SCROLL_CD_THROTTLE), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.ngZone.run(() => this.changeDetectorRef.markForCheck()));\n });\n\n // Covers layout changes that resize the scroll box without a `scroll` event of their own\n // (e.g. a sidebar toggling, not just the window resizing). `auditTime`, not `debounceTime`:\n // a `debounceTime` only emits once a live resize (e.g. dragging a window edge or a splitter\n // pane) has stopped for a full `RESIZE_AUDIT_TIME`, so pagination stays frozen — arrows\n // hidden, drag-scroll dead, no edge mask — for the whole drag instead of updating as it goes.\n this.sharedResizeObserver\n .observe(this.tabListContainer.nativeElement)\n .pipe(auditTime(RESIZE_AUDIT_TIME), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.updatePagination());\n\n this.scrollCorrectionRequest\n .pipe(debounceTime(SCROLL_CORRECTION_DEBOUNCE), takeUntilDestroyed(this.destroyRef))\n .subscribe(({ index, behavior }) => {\n this.scrollCorrection(index, behavior);\n\n // Measured with no font left loading, the labels are in their final faces. Kept any longer, the\n // request would let a font loaded later for unrelated text pull the strip back to the selection.\n if (this.document.fonts?.status !== 'loading') this.lastScrollCorrection = null;\n });\n\n // A webfont that arrives after the strip was measured resizes the labels without resizing the scroll\n // box or changing the text, so neither observer above sees it. Re-measuring also re-renders the\n // underline, which reads the selected label's offsets from the template.\n if (this.platform.isBrowser && this.document.fonts) {\n const fonts = this.document.fonts;\n\n // Audited like a resize: faces arrive in bursts, and every header on the page measures on each one.\n this.ngZone.runOutsideAngular(() =>\n fromEvent(fonts, 'loadingdone')\n .pipe(auditTime(RESIZE_AUDIT_TIME), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.disablePagination) return;\n\n this.ngZone.run(() => this.updatePagination());\n\n if (this.lastScrollCorrection) this.scrollCorrectionRequest.next(this.lastScrollCorrection);\n })\n );\n }\n }\n\n ngAfterContentInit() {\n const dirChange = this.dir ? this.dir.change : observableOf('ltr');\n\n const realign = () => {\n this.updatePagination();\n // The ink bar reads `offsetLeft`/`offsetWidth` from the template, so the deferred first\n // measurement only reaches the DOM if the view is re-checked after it.\n this.changeDetectorRef.markForCheck();\n };\n\n this.keyManager = new FocusKeyManager<KbqPaginatedTabHeaderItem>(this.items).withHorizontalOrientation(\n this.getLayoutDirection()\n );\n\n this.keyManager.updateActiveItem(this.selectedIndex);\n\n // Defer the first call in order to allow for slower browsers to lay out the elements.\n // This helps in cases where the user lands directly on a page with paginated tabs.\n if (typeof this.window.requestAnimationFrame !== 'undefined') {\n this.window.requestAnimationFrame(realign);\n } else {\n realign();\n }\n\n // On dir change or content change, realign and update the orientation of the key manager\n // if the direction has changed. Container resize is handled separately by the `ResizeObserver`.\n merge(dirChange, this.items.changes)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n // We need to defer this to give the browser some time to recalculate\n // the element dimensions. The call has to be wrapped in `NgZone.run`,\n // because the direction change handler can run outside of Angular.\n this.ngZone.run(() => Promise.resolve().then(realign));\n\n this.keyManager.withHorizontalOrientation(this.getLayoutDirection());\n });\n\n // If there is a change in the focus key manager we need to emit the `indexFocused`\n // event in order to provide a public event that notifies about focus changes. Also we realign\n // the tabs container by scrolling the new focused tab into the visible section.\n this.keyManager.change.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((newFocusIndex) => {\n // `change` only fires for deliberate focus moves (`setActiveItem`), never for the\n // bookkeeping `updateActiveItem` the `selectedIndex` setter does — which is exactly the\n // distinction `focusedItemIndex` has to preserve.\n this.focusedItemIndex = newFocusIndex;\n this.indexFocused.emit(newFocusIndex);\n this.setTabFocus(newFocusIndex);\n });\n\n this.items.changes\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.restoreFocusAfterItemsChange());\n }\n\n ngAfterContentChecked(): void {\n // Diff the derived value rather than a flag on one of its two inputs: `disablePagination` is\n // `_disablePagination || _vertical`, so watching only `vertical` left a header whose\n // `[disablePagination]` binding was toggled at runtime with stale paginator state.\n const disablePagination = this.disablePagination;\n\n // If the number of tab labels have changed, check if scrolling should be enabled\n if (this.tabLabelCount !== this.items.length || this.previousDisablePagination !== disablePagination) {\n this.previousDisablePagination = disablePagination;\n\n // Read before `tabLabelCount` moves. Gated on growth rather than on any change: losing a tab\n // cannot start the strip scrolling, so re-announcing it there would be noise.\n const gainedTabs = this.items.length > (this.tabLabelCount ?? 0);\n\n this.updatePagination();\n this.tabLabelCount = this.items.length;\n\n // Briefly reveals the scrollbar when the strip arrives or gains tabs, so whether it scrolls\n // is answered on sight rather than only once the pointer enters it. Vertical only: a\n // horizontal strip is paginated and dragged, runs in `hidden` mode and has no scrollbar to\n // announce.\n //\n // Deferred to after the render: the viewport builds its track from an effect, and effects\n // flush after this hook, so flashing here directly would push into a subject nothing is\n // listening to yet and the very first reveal — the one that matters — would be dropped.\n if (gainedTabs && this.vertical && this.platform.isBrowser) {\n afterNextRender(() => this.scrollbarViewport.flashScrollIndicators(), {\n injector: this.injector\n });\n }\n }\n\n // If the selected index has changed, scroll to the label.\n if (this.selectedIndexChanged) {\n this.selectedIndexChanged = false;\n this.requestScrollCorrection(this.selectedIndex, 'smooth');\n }\n }\n\n ngOnDestroy() {\n this.cancelDrag();\n this.cancelInertia();\n\n if (this.suppressClickTimeoutId !== null) {\n this.window.clearTimeout(this.suppressClickTimeoutId);\n }\n\n this.stopScrolling.complete();\n }\n\n handleKeydown(event: KeyboardEvent) {\n // We don't handle any key bindings with a modifier key.\n if (hasModifierKey(event)) {\n return;\n }\n\n const key = event.keyCode;\n\n if (key === HOME) {\n this.keyManager.setFirstItemActive();\n } else if (key === END) {\n this.keyManager.setLastItemActive();\n } else if (key === UP_ARROW && this.vertical) {\n this.keyManager.setPreviousItemActive();\n } else if (key === DOWN_ARROW && this.vertical) {\n this.keyManager.setNextItemActive();\n } else if (key === RIGHT_ARROW && !this.vertical) {\n this.keyManager.setNextItemActive();\n } else if (key === LEFT_ARROW && !this.vertical) {\n this.keyManager.setPreviousItemActive();\n } else if ([ENTER, SPACE].includes(key)) {\n this.selectFocusedIndex.emit(this.focusIndex);\n }\n\n if ([HOME, END, UP_ARROW, DOWN_ARROW, RIGHT_ARROW, LEFT_ARROW, SPACE, ENTER].includes(key)) {\n event.preventDefault();\n }\n }\n\n /**\n * Callback for when the MutationObserver detects that the content has changed.\n */\n onContentChanges() {\n const textContent = this.elementRef.nativeElement.textContent;\n\n // We need to diff the text content of the header, because the MutationObserver callback\n // will fire even if the text content didn't change which is inefficient and is prone\n // to infinite loops if a poorly constructed expression is passed in (see #14249).\n if (textContent !== this.currentTextContent) {\n this.currentTextContent = textContent || '';\n\n // The content observer runs outside the `NgZone` by default, which\n // means that we need to bring the callback back in ourselves.\n this.ngZone.run(() => this.updatePagination());\n }\n }\n\n /**\n * Updates the view whether pagination should be enabled or not.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n if (!this.platform.isBrowser) return;\n\n this.checkPaginationEnabled();\n this.updateScrollState();\n this.changeDetectorRef.markForCheck();\n }\n\n /**\n * Determines if an index is valid. If the tabs are not ready yet, we assume that the user is\n * providing a valid index and return true.\n */\n isValidIndex(index: number): boolean {\n if (!this.items) {\n return true;\n }\n\n const tab = this.items ? this.items.toArray()[index] : null;\n\n return !!tab && !tab.disabled;\n }\n\n /**\n * Sets focus on the HTML element for the label wrapper and scrolls it into the view if\n * scrolling is enabled.\n */\n setTabFocus(tabIndex: number) {\n if (!this.items?.length) return;\n\n const item = this.items.toArray()[tabIndex];\n\n // Prevent the browser's own scroll-into-view behavior so the scroll-correction request\n // below is the only thing driving the scroll position.\n item.elementRef.nativeElement.focus({ preventScroll: true });\n\n if (this.showPaginationControls) {\n this.requestScrollCorrection(tabIndex, 'auto');\n }\n }\n\n /** The layout direction of the containing app. */\n getLayoutDirection(): Direction {\n return this.dir?.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /**\n * Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or\n * the end of the list, respectively).\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n scrollHeader(direction: ScrollDirection) {\n this.lastScrollCorrection = null;\n\n const container = this.tabListContainer.nativeElement;\n const viewLength = container.clientWidth;\n const amount = (direction === 'before' ? -1 : 1) * viewLength * SCROLL_DISTANCE;\n\n this.scroll(this.logicalScrollPosition + amount);\n }\n\n /** Handles click events on the pagination arrows. */\n handlePaginatorClick(direction: ScrollDirection) {\n this.stopInterval();\n this.scrollHeader(direction);\n }\n\n /**\n * Evaluate whether the pagination controls should be displayed. If the scroll width of the\n * tab list is wider than the size of the header container, then the pagination controls should\n * be shown.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n checkPaginationEnabled() {\n if (this.disablePagination) {\n this.showPaginationControls = false;\n\n return;\n }\n\n const container = this.tabListContainer.nativeElement;\n // Tolerated rather than an exact `>`: an overflow no larger than the metrics' own measurement\n // error is not scrollable, and mounting arrows for it would put the header on both bounds at\n // once. `updateScrollState` spends the same tolerance on the far bound only, so anything that\n // does mount here has a scroll range wider than that bound.\n const isEnabled = kbqHasScrollOverflow(container);\n\n if (!isEnabled) {\n this.cancelDrag();\n this.cancelInertia();\n container.scrollLeft = 0;\n }\n\n if (isEnabled !== this.showPaginationControls) {\n this.changeDetectorRef.markForCheck();\n }\n\n this.showPaginationControls = isEnabled;\n }\n\n /** Stops the currently-running paginator interval. */\n stopInterval() {\n this.stopScrolling.next();\n }\n\n /**\n * Handles the user pressing down on one of the paginators.\n * Starts scrolling the header after a certain amount of time.\n *\n * @param direction In which direction the paginator should be scrolled.\n */\n handlePaginatorPress(direction: ScrollDirection, mouseEvent?: MouseEvent) {\n // Don't start auto scrolling for right mouse button clicks. Note that we shouldn't have to\n // null check the `button`, but we do it so we don't break tests that use fake events.\n\n if (mouseEvent && mouseEvent.button != null && mouseEvent.button !== 0) {\n return;\n }\n\n // Avoid overlapping timers.\n this.stopInterval();\n\n // Start a timer after the delay and keep firing based on the interval.\n timer(HEADER_SCROLL_DELAY, HEADER_SCROLL_INTERVAL)\n // Keep the timer going until something tells it to stop or the component is destroyed.\n .pipe(takeUntilDestroyed(this.destroyRef), takeUntil(this.stopScrolling))\n .subscribe(() => {\n // Read live scroll metrics rather than `disableScrollBefore`/`disableScrollAfter`:\n // those are only refreshed by the native `scroll` event, which lags a `smooth`\n // `scrollHeader` write by more than one `HEADER_SCROLL_INTERVAL` tick. Checking the\n // bound matching `direction` (not either bound) also stops the repeat exactly once\n // that side is reached, instead of the moment the *other* side happens to be at rest.\n this.updateScrollState();\n\n if (direction === 'before' ? this.disableScrollBefore : this.disableScrollAfter) {\n this.stopInterval();\n\n return;\n }\n\n this.scrollHeader(direction);\n });\n }\n\n protected abstract itemSelected(event: KeyboardEvent): void;\n\n /** Index of the item owning `target`, or `-1` — `target` is the item itself or something inside it. */\n private indexOfItemContaining(target: EventTarget | null): number {\n if (!target || !this.items) {\n return -1;\n }\n\n return this.items.toArray().findIndex(({ elementRef }) => elementRef.nativeElement.contains(target as Node));\n }\n\n /**\n * Moves focus onto the neighbouring item when the one that held it was removed. Without this the\n * destroyed element takes focus down to `<body>` and a keyboard user has to tab in from the top of\n * the document again (WCAG 2.4.3).\n */\n private restoreFocusAfterItemsChange(): void {\n if (!this.focusWasInside || !this.keyManager) {\n return;\n }\n\n const items = this.items.toArray();\n const { activeElement } = this.document;\n\n // The element holding focus is still one of the items, so nothing was lost. Testing against the\n // query list rather than `document.activeElement === body` because the query list is updated\n // before the removed element is actually detached.\n if (activeElement && items.some(({ elementRef }) => elementRef.nativeElement === activeElement)) {\n return;\n }\n\n const previousIndex = Math.max(0, Math.min(items.length - 1, this.focusedItemIndex));\n const index =\n items[previousIndex] && !items[previousIndex].disabled\n ? previousIndex\n : items.findIndex((item) => !item.disabled);\n\n if (index === -1) {\n this.focusWasInside = false;\n\n return;\n }\n\n this.keyManager.setActiveItem(index);\n }\n\n /**\n * The tab list's scroll position expressed independently of reading direction: `0` at the\n * start of the tab list, growing towards the end — mirrors native `scrollLeft`'s RTL-dependent\n * sign so callers can reason about \"before\"/\"after\" without checking direction themselves.\n */\n private get logicalScrollPosition(): number {\n const scrollLeft = this.tabListContainer.nativeElement.scrollLeft;\n\n return this.getLayoutDirection() === 'rtl' ? -scrollLeft : scrollLeft;\n }\n\n /**\n * Scrolls the header to a given logical position (see {@link logicalScrollPosition}).\n *\n * @param value Logical position to scroll to.\n * @param behavior Scroll animation behavior; `'auto'` jumps instantly, `'smooth'` animates.\n */\n private scroll(value: number, behavior: ScrollBehavior = 'smooth'): void {\n if (this.disablePagination) return;\n\n this.cancelInertia();\n\n const left = this.getLayoutDirection() === 'rtl' ? -value : value;\n\n this.tabListContainer.nativeElement.scrollTo({ left, behavior });\n }\n\n /** Queues a {@link scrollCorrection} behind the debounce, and keeps it to repeat once webfonts load. */\n private requestScrollCorrection(index: number, behavior: ScrollBehavior): void {\n this.lastScrollCorrection = { index, behavior };\n this.scrollCorrectionRequest.next(this.lastScrollCorrection);\n }\n\n /**\n * Moves the tab list such that the desired tab label (marked by index) is moved into view.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n private scrollCorrection(labelIndex: number, behavior: ScrollBehavior = 'smooth'): void {\n if (this.disablePagination) return;\n // A focus/selection change can queue a correction (debounced by `SCROLL_CORRECTION_DEBOUNCE`)\n // that then fires in the middle of an unrelated drag or inertia coast — e.g. a `pointerdown`\n // on a `kbqTabLink` focuses it before the drag threshold is crossed. Without this guard the\n // correction teleports the strip back under the cursor mid-drag, or kills a running coast.\n if (this.dragState || this.inertiaFrameId !== null) return;\n\n const selectedLabel = this.items ? this.items.toArray()[labelIndex] : null;\n\n if (!selectedLabel) return;\n\n const container = this.tabListContainer.nativeElement;\n const viewLength = container.clientWidth;\n const { offsetLeft, offsetWidth } = selectedLabel.elementRef.nativeElement;\n\n let labelBeforePos: number;\n let labelAfterPos: number;\n\n if (this.getLayoutDirection() === 'ltr') {\n labelBeforePos = offsetLeft;\n labelAfterPos = labelBeforePos + (offsetWidth as number);\n } else {\n labelAfterPos = this.tabList.nativeElement.offsetWidth - offsetLeft;\n labelBeforePos = labelAfterPos - offsetWidth;\n }\n\n const scrollPosition = this.logicalScrollPosition;\n const beforeVisiblePos = scrollPosition;\n const afterVisiblePos = scrollPosition + viewLength;\n\n if (labelBeforePos < beforeVisiblePos) {\n // Overshoot by the real paginator button width, so the label isn't flush with the\n // edge the arrow overlays.\n const overscroll = this.previousPaginator.nativeElement.clientWidth || 0;\n\n this.scroll(labelBeforePos - overscroll, behavior);\n } else if (labelAfterPos > afterVisiblePos) {\n const overscroll = this.nextPaginator.nativeElement.clientWidth || 0;\n\n this.scroll(scrollPosition + (labelAfterPos - afterVisiblePos + overscroll), behavior);\n }\n }\n\n /**\n * Recomputes the pagination arrow-enabled state from the container's real scroll metrics.\n * Bound to the native `scroll` event — this is the sole source of truth, no imperative call\n * is needed after drag/inertia/arrow-click scroll writes.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n private updateScrollState(): void {\n if (this.disablePagination) {\n this.disableScrollAfter = this.disableScrollBefore = true;\n\n return;\n }\n\n const container = this.tabListContainer.nativeElement;\n const position = this.logicalScrollPosition;\n const maxScrollPosition = container.scrollWidth - container.clientWidth;\n\n // The start of the range is exactly `0` in both directions — `logicalScrollPosition` negates\n // `scrollLeft` for RTL — and no box metric takes part in that comparison, so it stays exact.\n // The far bound is derived from `scrollWidth`/`clientWidth`, which overstate the largest offset\n // the browser hands out: without the tolerance that reads as remaining scroll distance and\n // leaves the arrow and its edge mask enabled with nowhere left to scroll.\n this.disableScrollBefore = position <= 0;\n this.disableScrollAfter = position >= maxScrollPosition - kbqGetScrollOverflowTolerance(container);\n }\n\n private handlePointerDown(event: PointerEvent): void {\n if (!this.platform.isBrowser || this.disablePagination || !this.showPaginationControls) return;\n\n // Any press on the strip takes over from a running inertia coast, whatever the pointer\n // type — otherwise a tap on a touch-panning device, or a press on a nested control, would\n // leave the previous coast running underneath it. The same goes for a correction waiting to\n // be repeated; a press that changes the selection queues a fresh one.\n this.cancelInertia();\n this.lastScrollCorrection = null;\n\n // Touch keeps its existing interaction model (pagination arrows); only mouse/pen drag here.\n if (this.dragState || event.pointerType === 'touch' || event.button !== 0) return;\n // Don't hijack presses on nested controls (e.g. a tab's remove button) into a drag.\n if ((event.target as HTMLElement).closest?.(NON_DRAGGABLE_TARGET_SELECTOR)) return;\n\n this.attachDocumentDragListeners();\n this.dragState = {\n pointerId: event.pointerId,\n didDrag: false,\n startX: event.clientX,\n lastX: event.clientX,\n lastTimestamp: event.timeStamp,\n velocity: 0\n };\n }\n\n private handlePointerMove(event: PointerEvent): void {\n const state = this.dragState;\n\n if (!state || event.pointerId !== state.pointerId) return;\n\n // A release outside the window/document never reaches `ownerDocument` as a `pointerup` —\n // a buttonless move is the only signal that the gesture already ended.\n if (!event.buttons) {\n this.endDrag(event, true);\n\n return;\n }\n\n if (!state.didDrag) {\n if (Math.abs(event.clientX - state.startX) < DRAG_THRESHOLD) return;\n\n state.didDrag = true;\n this.tabListContainer.nativeElement.classList.add(DRAGGING_CLASS);\n\n try {\n this.tabListContainer.nativeElement.setPointerCapture?.(state.pointerId);\n } catch {\n // Pointer capture can fail if the pointer is no longer active — the drag still\n // works via the document-level pointermove/pointerup listeners.\n }\n }\n\n event.preventDefault();\n\n const distance = event.clientX - state.lastX;\n const elapsed = event.timeStamp - state.lastTimestamp;\n const instantVelocity = elapsed > 0 ? this.clampVelocity(-distance / elapsed) : 0;\n\n // Exponential moving average, not a windowed sample array — smooths out jittery per-move deltas.\n state.velocity = state.velocity === 0 ? instantVelocity : state.velocity * 0.7 + instantVelocity * 0.3;\n state.lastX = event.clientX;\n state.lastTimestamp = event.timeStamp;\n\n // The browser clamps this for free at the scroll bounds — no `getMaxScrollDistance()` needed.\n this.tabListContainer.nativeElement.scrollLeft -= distance;\n }\n\n // Aborts an in-progress drag without applying inertia, e.g. when pagination is disabled mid-gesture.\n private cancelDrag(): void {\n const state = this.dragState;\n\n if (!state) return;\n\n this.tabListContainer.nativeElement.classList.remove(DRAGGING_CLASS);\n this.dragState = null;\n this.detachDocumentDragListeners();\n\n // Only a gesture that actually became a drag captured the pointer / needs its resulting\n // click suppressed — matches the same condition `endDrag` guards on below.\n if (state.didDrag) this.finishDrag(state);\n }\n\n // Ends a drag gesture; `applyInertia` is false for `pointercancel`, where no coast is expected.\n private endDrag(event: PointerEvent, applyInertia: boolean): void {\n const state = this.dragState;\n\n if (!state || event.pointerId !== state.pointerId) return;\n\n this.dragState = null;\n this.tabListContainer.nativeElement.classList.remove(DRAGGING_CLASS);\n this.detachDocumentDragListeners();\n\n if (!state.didDrag) return;\n\n this.finishDrag(state);\n\n const releaseDelay = event.timeStamp - state.lastTimestamp;\n const releaseVelocity =\n applyInertia && releaseDelay <= 80\n ? state.velocity * Math.exp(-FRICTION_PER_MILLISECOND * releaseDelay)\n : 0;\n\n if (Math.abs(releaseVelocity) >= MIN_INERTIA_VELOCITY) {\n this.startInertia(releaseVelocity);\n }\n }\n\n // Releases pointer capture and arms the click-suppression latch — shared by `endDrag`/`cancelDrag`\n // so a drag aborted mid-gesture (e.g. by `checkPaginationEnabled`) doesn't strand capture or end\n // in an unintended tab selection.\n private finishDrag(state: DragState): void {\n try {\n this.tabListContainer.nativeElement.releasePointerCapture?.(state.pointerId);\n } catch {\n // Capture may already be lost, e.g. if the element was detached mid-drag.\n }\n\n this.suppressNextClick = true;\n\n if (this.suppressClickTimeoutId !== null) this.window.clearTimeout(this.suppressClickTimeoutId);\n\n // `pointercancel` never produces a trailing `click` — if it's the one that armed the\n // suppression, it would otherwise stay stuck `true` forever and eat the next unrelated\n // click. Reset unconditionally on a timer instead of only inside the click listener.\n this.suppressClickTimeoutId = this.window.setTimeout(() => {\n this.suppressNextClick = false;\n this.suppressClickTimeoutId = null;\n }, 0);\n }\n\n // Attached for the duration of a possible drag only — see the listener fields' doc comment.\n private attachDocumentDragListeners(): void {\n const ownerDocument = this.elementRef.nativeElement.ownerDocument;\n\n ownerDocument.addEventListener('pointermove', this.documentPointerMoveListener);\n ownerDocument.addEventListener('pointerup', this.documentPointerUpListener);\n ownerDocument.addEventListener('pointercancel', this.documentPointerCancelListener);\n }\n\n private detachDocumentDragListeners(): void {\n const ownerDocument = this.elementRef.nativeElement.ownerDocument;\n\n ownerDocument.removeEventListener('pointermove', this.documentPointerMoveListener);\n ownerDocument.removeEventListener('pointerup', this.documentPointerUpListener);\n ownerDocument.removeEventListener('pointercancel', this.documentPointerCancelListener);\n }\n\n // Coasts the header from the release velocity, decaying it every frame — matches a natural flick.\n private startInertia(releaseVelocity: number): void {\n const container = this.tabListContainer.nativeElement;\n const isRtl = this.getLayoutDirection() === 'rtl';\n const maxScrollLeft = container.scrollWidth - container.clientWidth;\n // `scrollLeft`'s native bounds, expressed in whichever direction is \"positive\" for this\n // reading direction — RTL browsers run `scrollLeft` from 0 down to `-maxScrollLeft`.\n const [minBound, maxBound] = isRtl ? [-maxScrollLeft, 0] : [0, maxScrollLeft];\n // `maxScrollLeft` is derived from rounded box metrics, which overstate the largest offset the\n // browser hands out, so the clamp below never fires at the far end of the range: the coast\n // would keep requesting frames and writing offsets the browser silently drops until friction\n // alone killed it, with `scrollCorrection` suppressed for that whole tail. The coast is\n // finished on contact instead — writing a reduced bound would pull the strip back visibly.\n // The near end is exactly `0` and needs no tolerance.\n const farBoundTolerance = kbqGetScrollOverflowTolerance(container);\n\n let velocity = releaseVelocity;\n // Accumulated in a local rather than read back from `scrollLeft`: the browser snaps the\n // stored offset to the device-pixel grid (e.g. 1/3 px steps at devicePixelRatio 1.5), so a\n // sub-pixel-per-frame write at a high refresh rate would otherwise round away to nothing and\n // the readback-equality boundary check below would mistake that for having hit a bound.\n let position = container.scrollLeft;\n let lastTimestamp: number | null = null;\n\n const step = (timestamp: number) => {\n const frameDuration = lastTimestamp === null ? 0 : Math.min(timestamp - lastTimestamp, MAX_FRAME_DURATION);\n\n lastTimestamp = timestamp;\n velocity *= Math.exp(-FRICTION_PER_MILLISECOND * frameDuration);\n position += velocity * frameDuration;\n\n const clamped = Math.max(minBound, Math.min(maxBound, position));\n\n container.scrollLeft = clamped;\n\n // The direction check keeps a flick back inwards from the far end alive: without it, a\n // coast starting within `farBoundTolerance` of that bound would end on its first frame.\n const reachedBoundary =\n clamped !== position ||\n (isRtl\n ? velocity < 0 && clamped <= minBound + farBoundTolerance\n : velocity > 0 && clamped >= maxBound - farBoundTolerance);\n\n position = clamped;\n\n if (Math.abs(velocity) < MIN_INERTIA_VELOCITY || reachedBoundary) {\n this.inertiaFrameId = null;\n\n return;\n }\n\n this.inertiaFrameId = this.window.requestAnimationFrame(step);\n };\n\n this.inertiaFrameId = this.window.requestAnimationFrame(step);\n }\n\n // Stops an in-progress inertia coast, e.g. because a new gesture or scroll input took over.\n private cancelInertia(): void {\n if (this.inertiaFrameId === null) return;\n\n this.window.cancelAnimationFrame(this.inertiaFrameId);\n this.inertiaFrameId = null;\n }\n\n private clampVelocity(velocity: number): number {\n return Math.max(-MAX_INERTIA_VELOCITY, Math.min(MAX_INERTIA_VELOCITY, velocity));\n }\n}\n","import { Direction, Directionality } from '@angular/cdk/bidi';\nimport { CdkPortalOutlet, TemplatePortal } from '@angular/cdk/portal';\nimport {\n afterNextRender,\n AfterRenderRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n EventEmitter,\n forwardRef,\n inject,\n Injector,\n input,\n MAX_ANIMATION_TIMEOUT,\n OnChanges,\n OnDestroy,\n OnInit,\n output,\n SimpleChanges,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { outputFromObservable } from '@angular/core/rxjs-interop';\nimport { kbqAnimationsDisabled, kbqAnimationsSettled } from '@koobiq/components/core';\nimport { KbqScrollbarViewport } from '@koobiq/components/scrollbar';\nimport { Subscription } from 'rxjs';\nimport { startWith } from 'rxjs/operators';\n\n/**\n * These position states are used internally as the translation states of the tab body. Setting the\n * position state to left, right, or center will transition the tab body from its current\n * position to its respective state. If there is not current position (void, in the case of a new\n * tab body), then there will be no transition to its state.\n *\n * In the case of a new tab body that should immediately be centered with an animating transition,\n * then left-origin-center or right-origin-center can be used, which will use left or right as its\n * pseudo-prior state.\n */\nexport type KbqTabBodyPositionState = 'left' | 'center' | 'right' | 'left-origin-center' | 'right-origin-center';\n\n/**\n * Wrapper for the contents of a tab.\n *\n * @docs-private\n */\n@Component({\n selector: 'kbq-tab-body',\n imports: [KbqScrollbarViewport, forwardRef(() => KbqTabBodyPortal)],\n templateUrl: './tab-body.html',\n styleUrl: './tab-body.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-tab-body'\n }\n})\nexport class KbqTabBody implements OnChanges, OnInit, OnDestroy {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly dir = inject(Directionality, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n\n /** Whether the tab body translates without motion. */\n protected readonly animationsDisabled = kbqAnimationsDisabled();\n\n /** @docs-private */\n readonly positionInput = input<number | undefined>(undefined, { alias: 'position' });\n\n /** @docs-private */\n readonly originInput = input<number | undefined>(undefined, { alias: 'origin' });\n\n /** The shifted index position of the tab body, where zero represents the active center tab. */\n set position(position: number) {\n this.positionIndex = position;\n this.computePositionAnimationState();\n }\n\n /** Tab body position state, rendered as a modifier class of the content. */\n bodyPosition: KbqTabBodyPositionState;\n\n /** Event emitted when the tab begins to animate towards the center as the active tab. */\n readonly onCentering = output<number>();\n\n /** Event emitted before the centering of the tab begins. */\n readonly beforeCentering: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** @docs-private */\n readonly beforeCenteringOutput = outputFromObservable(this.beforeCentering, { alias: 'beforeCentering' });\n\n /** Event emitted once the tab has finished moving away from the center. Carries no payload. */\n readonly afterLeavingCenter: EventEmitter<void> = new EventEmitter<void>();\n\n /** @docs-private */\n readonly afterLeavingCenterOutput = outputFromObservable(this.afterLeavingCenter, { alias: 'afterLeavingCenter' });\n\n /** Event emitted when the tab completes its animation towards the center. */\n readonly onCentered = output<void>();\n\n /** The portal host inside of this container into which the tab body content will be loaded. */\n readonly portalHost = viewChild.required(CdkPortalOutlet);\n\n /** The tab body content to display. */\n readonly content = input<TemplatePortal>(undefined!);\n\n /** Position that will be used when the tab is immediately becoming visible after creation. */\n origin: number;\n\n /** Duration for the tab's animation. */\n readonly animationDuration = input<string>('0ms');\n\n /** The duration as CSS time: a bare number, which CSS rejects, is taken as milliseconds. */\n protected readonly cssAnimationDuration = computed(() => {\n const duration = this.animationDuration();\n\n return /^\\d+$/.test(duration) ? `${duration}ms` : duration;\n });\n\n /** Current position of the tab-body in the tab-group. Zero means that the tab is visible. */\n private positionIndex: number;\n\n /** Subscription to the directionality change observable. */\n private readonly dirChangeSubscription = Subscription.EMPTY;\n\n private readonly contentElement = viewChild.required('content', { read: ElementRef });\n\n /** The position the last translation went to, see `translateOnRender`. */\n private renderedPosition?: KbqTabBodyPositionState;\n\n /** The position the body is created at, see `translateOnRender`. */\n private initialPosition?: KbqTabBodyPositionState;\n\n private translationRender?: AfterRenderRef;\n\n constructor() {\n const changeDetectorRef = inject(ChangeDetectorRef);\n\n if (this.dir && changeDetectorRef) {\n this.dirChangeSubscription = this.dir.change.subscribe((direction: Direction) => {\n this.computePositionAnimationState(direction);\n changeDetectorRef.markForCheck();\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member; unbound, it leaves what code wrote.\n if (changes['positionInput']) {\n const position = this.positionInput();\n\n if (position !== undefined) this.position = position;\n }\n\n if (changes['originInput']) {\n const origin = this.originInput();\n\n if (origin !== undefined) this.origin = origin;\n }\n }\n\n /**\n * After initialized, check if the content is centered and has an origin. If so, set the\n * special position states that transition the tab from the left or right before centering.\n */\n ngOnInit() {\n if (this.bodyPosition === 'center' && this.origin != null) {\n this.bodyPosition = this.computePositionFromOrigin();\n }\n\n this.initialPosition = this.bodyPosition;\n\n this.translateOnRender();\n }\n\n ngOnDestroy() {\n this.dirChangeSubscription.unsubscribe();\n }\n\n /** The text direction of the containing app. */\n getLayoutDirection(): Direction {\n return this.dir && this.dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /** Whether the provided position state is considered center, regardless of origin. */\n isCenterPosition(position: KbqTabBodyPositionState | string): boolean {\n return position === 'center' || position === 'left-origin-center' || position === 'right-origin-center';\n }\n\n /** Computes the position state that the tab body translates to. */\n private computePositionAnimationState(dir: Direction = this.getLayoutDirection()) {\n if (this.positionIndex < 0) {\n this.bodyPosition = dir === 'ltr' ? 'left' : 'right';\n } else if (this.positionIndex > 0) {\n this.bodyPosition = dir === 'ltr' ? 'right' : 'left';\n } else {\n this.bodyPosition = 'center';\n }\n\n this.translateOnRender();\n }\n\n /**\n * Starts the translation to the current position once it has rendered, and ends it once its transition\n * has: the content is attached as the body starts centering and detached once it has left the center.\n * Positions set within one frame translate once, from the last rendered one. The first frame starts from the\n * position the body was created at when it has moved on from it: the content of a body created centered is\n * attached at once, rendered or not.\n */\n private translateOnRender(): void {\n if (this.translationRender) return;\n\n this.translationRender = afterNextRender(\n () => {\n this.translationRender = undefined;\n\n const to = this.bodyPosition;\n const from = this.renderedPosition ?? (to === this.initialPosition ? undefined : this.initialPosition);\n\n if (from === to) return;\n\n this.renderedPosition = to;\n this.translationStarted(to);\n\n const settled = kbqAnimationsSettled(\n this.contentElement().nativeElement,\n this.injector.get(MAX_ANIMATION_TIMEOUT)\n );\n\n if (!settled) return this.translationDone(from, to);\n\n settled.then(() => {\n if (!this.destroyRef.destroyed) this.translationDone(from, to);\n });\n },\n { injector: this.injector }\n );\n }\n\n private translationStarted(to: KbqTabBodyPositionState): void {\n const isCentering = this.isCenterPosition(to);\n\n this.beforeCentering.emit(isCentering);\n\n if (isCentering) {\n this.onCentering.emit(this.elementRef.nativeElement.clientHeight);\n }\n }\n\n private translationDone(from: KbqTabBodyPositionState | undefined, to: KbqTabBodyPositionState): void {\n // A later translation may have started since, so the current position has the last word.\n if (this.isCenterPosition(to) && this.isCenterPosition(this.bodyPosition)) {\n this.onCentered.emit();\n }\n\n if (from !== undefined && this.isCenterPosition(from) && !this.isCenterPosition(this.bodyPosition)) {\n this.afterLeavingCenter.emit();\n }\n }\n\n /**\n * Computes the position state based on the specified origin position. This is used if the\n * tab is becoming visible immediately after creation.\n */\n private computePositionFromOrigin(): KbqTabBodyPositionState {\n const dir = this.getLayoutDirection();\n\n if ((dir === 'ltr' && this.origin <= 0) || (dir === 'rtl' && this.origin > 0)) {\n return 'left-origin-center';\n }\n\n return 'right-origin-center';\n }\n}\n\n/**\n * The portal host directive for the contents of the tab.\n *\n * @docs-private\n */\n@Directive({\n selector: '[kbqTabBodyHost]'\n})\nexport class KbqTabBodyPortal extends CdkPortalOutlet implements OnInit, OnDestroy {\n private readonly host = inject(KbqTabBody);\n\n /** Subscription to events for when the tab body begins centering. */\n private centeringSub = Subscription.EMPTY;\n /** Subscription to events for when the tab body finishes leaving from center position. */\n private leavingSub = Subscription.EMPTY;\n\n /** Set initial visibility or set up subscription for changing visibility. */\n ngOnInit(): void {\n super.ngOnInit();\n\n this.centeringSub = this.host.beforeCentering\n .pipe(startWith(this.host.isCenterPosition(this.host.bodyPosition)))\n .subscribe((isCentering: boolean) => {\n if (isCentering && !this.hasAttached()) {\n this.attach(this.host.content());\n }\n });\n\n this.leavingSub = this.host.afterLeavingCenter.subscribe(() => {\n this.detach();\n });\n }\n\n /** Clean up centering subscription. */\n ngOnDestroy(): void {\n super.ngOnDestroy();\n\n this.centeringSub.unsubscribe();\n this.leavingSub.unsubscribe();\n }\n}\n","<div\n #content\n kbqScrollbarViewport\n class=\"kbq-tab-body__content kbq-hide-nested-popup\"\n [class]=\"`kbq-tab-body__content_${bodyPosition}`\"\n [class.kbq-animations-disabled]=\"animationsDisabled\"\n [style.--kbq-tab-body-animation-duration]=\"cssAnimationDuration()\"\n>\n <ng-template kbqTabBodyHost />\n</div>\n","import { Directive, TemplateRef, inject } from '@angular/core';\n\n/** Decorates the `ng-template` tags and reads out the template from it. */\n@Directive({\n selector: '[kbqTabContent]'\n})\nexport class KbqTabContent {\n // TODO: the library reads the template with `{ read: TemplateRef }`; kept as public API at the DS-2196 review.\n template = inject<TemplateRef<any>>(TemplateRef);\n}\n","import {\n AfterViewInit,\n booleanAttribute,\n contentChild,\n Directive,\n ElementRef,\n inject,\n input,\n OnChanges,\n Renderer2,\n SimpleChanges\n} from '@angular/core';\nimport { KbqTab } from './tab.component';\n\n/**\n * Used in the `kbq-tab-group` view to display tab labels.\n *\n * @docs-private\n */\n@Directive({\n selector: '[kbqTabLabelWrapper]',\n host: {\n '[class.kbq-disabled]': 'disabled',\n // A bare `disabled` attribute is only defined for form controls and is read by no assistive\n // technology; the CSS hook is `.kbq-disabled`.\n '[attr.aria-disabled]': 'disabled'\n }\n})\nexport class KbqTabLabelWrapper implements OnChanges, AfterViewInit {\n elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private renderer = inject(Renderer2);\n\n private readonly labelContentQuery = contentChild<ElementRef<HTMLElement>>('labelContent');\n\n /** The element of the label content, measured to tell whether the label overflows. */\n get labelContent(): ElementRef<HTMLElement> {\n return this.labelContentQuery()!;\n }\n\n /** @docs-private */\n readonly tabInput = input<KbqTab | undefined>(undefined, { alias: 'tab' });\n\n /** @docs-private */\n readonly disabledInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'disabled',\n transform: booleanAttribute\n });\n\n tab: KbqTab;\n\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(value: boolean) {\n if (value !== this.disabled) {\n this._disabled = value;\n }\n }\n\n private _disabled: boolean = false;\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member; unbound, it leaves what code wrote.\n if (changes['tabInput']) {\n const tab = this.tabInput();\n\n if (tab !== undefined) this.tab = tab;\n }\n\n if (changes['disabledInput']) {\n const disabled = this.disabledInput();\n\n if (disabled !== undefined) this.disabled = disabled;\n }\n }\n\n ngAfterViewInit(): void {\n this.addClassModifierForIcons(Array.from(this.elementRef.nativeElement.querySelectorAll('.kbq-icon')));\n }\n\n /**\n * Sets focus on the wrapper element.\n *\n * `preventScroll: true`: `FocusKeyManager.setActiveItem` calls this itself, right after (and\n * unconditionally on) the `change` emission that runs `KbqPaginatedTabHeader.setTabFocus` — so\n * without the guard here too, that call's own `preventScroll: true` is immediately undone by\n * this one, and an overflowing header double-jumps (native scroll-into-view, then the\n * paginator-aware `scrollCorrection`) on every arrow-key press.\n */\n focus(): void {\n this.elementRef.nativeElement.focus({ preventScroll: true });\n }\n\n // TODO: nothing in the library uses it; kept as public API at the DS-2196 review. Document or deprecate it.\n getOffsetLeft(): number {\n return this.elementRef.nativeElement.offsetLeft;\n }\n\n getOffsetWidth(): number {\n return this.elementRef.nativeElement.offsetWidth;\n }\n\n checkOverflow() {\n this.tab.overflowTooltipTitle = this.isOverflown() ? this.getInnerText() : '';\n }\n\n isOverflown() {\n return this.labelContent.nativeElement.scrollWidth > this.labelContent.nativeElement.clientWidth;\n }\n\n getInnerText(): string {\n // `textContent` rather than `innerText`, which jsdom does not implement. Trimmed, because it keeps the\n // whitespace the template puts around the label text.\n return this.labelContent.nativeElement.textContent?.trim() || '';\n }\n\n private addClassModifierForIcons(icons: HTMLElement[]) {\n const twoIcons = 2;\n const [firstIconElement, secondIconElement] = icons;\n\n if (icons.length === 1) {\n const COMMENT_NODE = 8;\n\n if (firstIconElement.nextSibling && firstIconElement.nextSibling.nodeType !== COMMENT_NODE) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_left');\n this.renderer.addClass(this.elementRef.nativeElement, 'kbq-tab-label_with-icon-left');\n }\n\n if (firstIconElement.previousSibling && firstIconElement.previousSibling.nodeType !== COMMENT_NODE) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_right');\n this.renderer.addClass(this.elementRef.nativeElement, 'kbq-tab-label_with-icon-right');\n }\n } else if (icons.length === twoIcons) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_left');\n this.renderer.addClass(secondIconElement, 'kbq-icon_right');\n this.renderer.addClass(this.elementRef.nativeElement, 'kbq-tab-label_with-icon-left');\n this.renderer.addClass(this.elementRef.nativeElement, 'kbq-tab-label_with-icon-right');\n }\n }\n}\n","import { CdkObserveContent } from '@angular/cdk/observers';\nimport { Platform } from '@angular/cdk/platform';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChildren,\n ElementRef,\n inject,\n input,\n QueryList,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { isUndefined, kbqQueryListFrom } from '@koobiq/components/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqScrollbarViewport } from '@koobiq/components/scrollbar';\nimport { KbqPaginatedTabHeader } from './paginated-tab-header';\nimport { KbqTabLabelWrapper } from './tab-label-wrapper.directive';\n\n/** Corresponds to `--kbq-tabs-size-tab-item-padding-horizontal` on text/icon+text tabs. */\nconst TAB_PADDING = 12;\n\n/**\n * The header of the tab group which displays a list of all the tabs in the tab group.\n * When the tabs list's width exceeds the width of the header container,\n * then arrows will be displayed to allow the user to scroll\n * left and right across the header.\n *\n * @docs-private\n */\n@Component({\n selector: 'kbq-tab-header',\n imports: [KbqIconModule, CdkObserveContent, KbqScrollbarViewport],\n templateUrl: './tab-header.html',\n styleUrl: './tab-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-tab-header',\n '[class.kbq-tab-header_vertical]': 'vertical',\n '[class.kbq-tab-header_underlined]': 'underlined()',\n '[class.kbq-tab-header__pagination-controls_enabled]': 'showPaginationControls',\n '[class.kbq-tab-header_rtl]': \"getLayoutDirection() == 'rtl'\"\n },\n outputs: ['selectFocusedIndex', 'indexFocused']\n})\nexport class KbqTabHeader extends KbqPaginatedTabHeader {\n /** Whether the tabs are underlined. */\n readonly underlined = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n private readonly itemsQuery = contentChildren(KbqTabLabelWrapper, { descendants: false });\n private readonly itemsList = kbqQueryListFrom(this.itemsQuery);\n private readonly tabListContainerQuery = viewChild.required<ElementRef>('tabListContainer');\n private readonly scrollbarViewportQuery = viewChild.required('tabListContainer', { read: KbqScrollbarViewport });\n private readonly tabListQuery = viewChild.required<ElementRef>('tabList');\n private readonly nextPaginatorQuery = viewChild.required<ElementRef<HTMLElement>>('nextPaginator');\n private readonly previousPaginatorQuery = viewChild.required<ElementRef<HTMLElement>>('previousPaginator');\n\n /** The label wrappers of the tabs. */\n get items(): QueryList<KbqTabLabelWrapper> {\n return this.itemsList();\n }\n\n /** The scroll container of the tab labels. */\n get tabListContainer(): ElementRef {\n return this.tabListContainerQuery();\n }\n\n protected get scrollbarViewport(): KbqScrollbarViewport {\n return this.scrollbarViewportQuery();\n }\n\n /** The element that holds the tab labels. */\n get tabList(): ElementRef {\n return this.tabListQuery();\n }\n\n /** The pagination arrow towards the end of the tab list. */\n get nextPaginator(): ElementRef<HTMLElement> {\n return this.nextPaginatorQuery();\n }\n\n /** The pagination arrow towards the beginning of the tab list. */\n get previousPaginator(): ElementRef<HTMLElement> {\n return this.previousPaginatorQuery();\n }\n\n private readonly isBrowser = inject(Platform).isBrowser;\n\n /** The underline as the last check of the tab group measured it, see `ngAfterContentChecked`. */\n private checkedUnderline?: string;\n\n protected get activeTabOffsetWidth(): number | undefined {\n if (!this.isBrowser) return undefined;\n\n const item = this.items.get(this.selectedIndex);\n const width = item?.elementRef?.nativeElement?.offsetWidth;\n\n if (!width || item?.tab?.iconOnlyLabel) return width;\n\n return width - TAB_PADDING * 2;\n }\n\n protected get activeTabOffsetLeft(): number | undefined {\n if (!this.isBrowser) return undefined;\n\n const item = this.items.get(this.selectedIndex);\n const left = item?.elementRef?.nativeElement?.offsetLeft;\n\n if (isUndefined(left) || item?.tab?.iconOnlyLabel) return left;\n\n return left + TAB_PADDING;\n }\n\n protected get activeTabDisabled(): boolean {\n return !!this.items.get(this.selectedIndex)?.disabled;\n }\n\n override ngAfterContentChecked(): void {\n super.ngAfterContentChecked();\n\n // The labels belong to the view of the tab group, so a change of their size or state gives this view no\n // notice: the underline is measured again whenever the group is checked, as it was before OnPush.\n const underline = `${this.activeTabOffsetLeft}:${this.activeTabOffsetWidth}:${this.activeTabDisabled}`;\n\n if (underline !== this.checkedUnderline) {\n this.checkedUnderline = underline;\n this.changeDetectorRef.markForCheck();\n }\n }\n\n protected itemSelected(event: KeyboardEvent): void {\n event.preventDefault();\n }\n}\n","<div\n #previousPaginator\n class=\"kbq-tab-header__pagination kbq-tab-header__pagination_before\"\n [class.kbq-disabled]=\"disableScrollBefore\"\n (click)=\"handlePaginatorClick('before')\"\n (mousedown)=\"handlePaginatorPress('before', $event)\"\n (touchend)=\"stopInterval()\"\n>\n <i kbq-icon=\"kbq-chevron-left_16\" color=\"contrast\"></i>\n</div>\n\n<div\n #tabListContainer\n kbqScrollbarViewport\n class=\"kbq-tab-header__container kbq-tab-header__scroll-container\"\n [kbqScrollbarMode]=\"scrollbarMode\"\n [class.kbq-tab-header__scroll-container_overflow-before]=\"!disableScrollBefore\"\n [class.kbq-tab-header__scroll-container_overflow-after]=\"!disableScrollAfter\"\n (keydown)=\"handleKeydown($event)\"\n>\n <div #tabList class=\"kbq-tab-list\" (cdkObserveContent)=\"onContentChanges()\">\n <div class=\"kbq-tab-list__content\" role=\"tablist\" [attr.aria-orientation]=\"vertical ? 'vertical' : null\">\n <ng-content />\n <div\n aria-hidden=\"true\"\n class=\"kbq-tab-list__active-tab-underline\"\n [class.kbq-animations-disabled]=\"animationsDisabled\"\n [class.kbq-disabled]=\"activeTabDisabled\"\n [style.left.px]=\"activeTabOffsetLeft\"\n [style.width.px]=\"activeTabOffsetWidth\"\n ></div>\n </div>\n </div>\n</div>\n\n<div\n #nextPaginator\n class=\"kbq-tab-header__pagination kbq-tab-header__pagination_after\"\n [class.kbq-disabled]=\"disableScrollAfter\"\n (click)=\"handlePaginatorClick('after')\"\n (mousedown)=\"handlePaginatorPress('after', $event)\"\n (touchend)=\"stopInterval()\"\n>\n <i kbq-icon=\"kbq-chevron-right_16\" color=\"contrast\"></i>\n</div>\n","import { CdkPortal } from '@angular/cdk/portal';\nimport { booleanAttribute, Directive, InjectionToken, input } from '@angular/core';\n\nexport const KBQ_TAB_LABEL = new InjectionToken<KbqTabLabel>('KbqTabLabel');\n\n/** Used to flag tab labels for use with the portal directive */\n@Directive({\n selector: '[kbq-tab-label], [kbqTabLabel]',\n providers: [{ provide: KBQ_TAB_LABEL, useExisting: KbqTabLabel }]\n})\nexport class KbqTabLabel extends CdkPortal {\n /** Whether the tab contains only an icon without a label. */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n}\n","import { TemplatePortal } from '@angular/cdk/portal';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n inject,\n input,\n OnChanges,\n OnDestroy,\n OnInit,\n signal,\n SimpleChanges,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport {\n KBQ_CUSTOM_SCROLL_STRATEGY_PROVIDER,\n KBQ_SELECT_SCROLL_STRATEGY,\n KbqPopUpPlacementValues,\n PopUpPlacements\n} from '@koobiq/components/core';\nimport { KBQ_DROPDOWN_SCROLL_STRATEGY } from '@koobiq/components/dropdown';\nimport { Subject } from 'rxjs';\nimport { KbqTabContent } from './tab-content.directive';\nimport { KBQ_TAB_LABEL, KbqTabLabel } from './tab-label.directive';\n\n@Component({\n selector: 'kbq-tab',\n // Create a template for the content of the <kbq-tab> so that we can grab a reference to this\n // TemplateRef and use it in a Portal to render the tab content in the appropriate place in the\n // tab-group.\n template: '<ng-template><ng-content /></ng-template>',\n providers: [\n ...[KBQ_SELECT_SCROLL_STRATEGY, KBQ_DROPDOWN_SCROLL_STRATEGY].map((token) =>\n KBQ_CUSTOM_SCROLL_STRATEGY_PROVIDER(token, (overlay) => () => overlay.scrollStrategies.close())\n )\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'kbqTab'\n})\nexport class KbqTab implements OnInit, OnChanges, OnDestroy {\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n /** @docs-private */\n get content(): TemplatePortal | null {\n return this.contentPortal;\n }\n\n private readonly templateLabelQuery = contentChild(KBQ_TAB_LABEL);\n\n /** The label template of the tab: the `kbqTabLabel` in its content, or else the one assigned in code. */\n get templateLabel(): KbqTabLabel {\n return this.templateLabelQuery() ?? this._templateLabel;\n }\n\n set templateLabel(value: KbqTabLabel) {\n this.setTemplateLabelInput(value);\n }\n\n private _templateLabel: KbqTabLabel;\n\n /**\n * Template provided in the tab content that will be used if present, used to enable lazy-loading\n */\n readonly explicitContent = contentChild(KbqTabContent, { read: TemplateRef });\n\n /** Template inside the KbqTab view that contains an `<ng-content>`. */\n readonly implicitContent = viewChild.required(TemplateRef);\n\n /** @docs-private */\n readonly tooltipTitleInput = input<string | undefined>(undefined, { alias: 'tooltipTitle' });\n\n /** @docs-private */\n readonly disabledInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'disabled',\n transform: booleanAttribute\n });\n\n get tooltipTitle(): string {\n return this.overflowTooltipTitle + this._tooltipTitle;\n }\n\n set tooltipTitle(value: string) {\n this._tooltipTitle = value;\n }\n\n private _tooltipTitle = '';\n\n /** Whether the tab is disabled: it cannot be selected and has no interactive states. */\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(value: boolean) {\n if (value !== this.disabled) {\n this._disabled = value;\n }\n }\n\n private _disabled: boolean = false;\n\n /** Placement of the tooltip shown for a truncated or empty label. */\n readonly tooltipPlacement = input<KbqPopUpPlacementValues>(PopUpPlacements.Right);\n\n /** Plain text label for the tab, used when there is no template label. */\n readonly textLabel = input('', { alias: 'label' });\n\n readonly empty = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n readonly tabId = input<string>(undefined!);\n\n /** Whether the tab label contains only an icon (no text). */\n get iconOnlyLabel(): boolean {\n return this.templateLabel?.iconOnly() ?? false;\n }\n\n /** Emits whenever the internal state of the tab changes. */\n readonly stateChanges = new Subject<void>();\n\n /**\n * The relatively indexed position where 0 represents the center, negative is left, and positive\n * represents the right.\n */\n position: number | null = null;\n\n /**\n * The initial relatively index origin of the tab if it was created and selected after there\n * was already a selected tab. Provides context of what position the tab should originate from.\n */\n origin: number | null = null;\n\n /** Whether the tab is currently active. A template that reads it is updated when it changes. */\n get isActive(): boolean {\n return this.activeState();\n }\n\n set isActive(value: boolean) {\n this.activeState.set(value);\n }\n\n private readonly activeState = signal(false);\n\n get isOverflown(): boolean {\n return !!this._overflowTooltipTitle;\n }\n\n get overflowTooltipTitle(): string {\n if (this.isOverflown) {\n return `${this._overflowTooltipTitle}\\n`;\n }\n\n return '';\n }\n\n set overflowTooltipTitle(value: string) {\n this._overflowTooltipTitle = value;\n }\n\n private _overflowTooltipTitle = '';\n\n /** Portal that will be the hosted content of the tab */\n private contentPortal: TemplatePortal | null = null;\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member, except that `undefined` resets a member\n // typed without it to its default; unbound, it leaves what code wrote.\n if (changes['tooltipTitleInput']) {\n this.tooltipTitle = this.tooltipTitleInput() ?? '';\n }\n\n if (changes['disabledInput']) {\n const disabled = this.disabledInput();\n\n if (disabled !== undefined) this.disabled = disabled;\n }\n\n if (changes['textLabel'] || changes['disabledInput'] || changes['tooltipTitleInput']) {\n this.stateChanges.next();\n }\n }\n\n ngOnInit(): void {\n this.contentPortal = new TemplatePortal(\n this.explicitContent() || this.implicitContent(),\n this.viewContainerRef\n );\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n\n /**\n * Keeps a label template assigned in code, used while the content of the tab has none. A falsy value is\n * ignored.\n *\n * @docs-private\n */\n protected setTemplateLabelInput(value: KbqTabLabel) {\n if (value) {\n this._templateLabel = value;\n }\n }\n}\n","import { CdkMonitorFocus } from '@angular/cdk/a11y';\nimport { SharedResizeObserver } from '@angular/cdk/observers/private';\nimport { Platform } from '@angular/cdk/platform';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport {\n AfterContentChecked,\n AfterContentInit,\n afterNextRender,\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n contentChildren,\n DestroyRef,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n InjectionToken,\n input,\n isDevMode,\n OnChanges,\n OnDestroy,\n output,\n QueryList,\n signal,\n SimpleChanges,\n untracked,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n KBQ_PARENT_ANIMATION_COMPONENT,\n kbqOptionalNumberAttribute,\n kbqQueryListFrom,\n KbqStateSaving\n} from '@koobiq/components/core';\nimport { KbqTooltipTrigger } from '@koobiq/components/tooltip';\nimport { merge, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { KbqTabBody } from './tab-body.component';\nimport { KbqTabHeader } from './tab-header.component';\nimport { KbqTabLabelWrapper } from './tab-label-wrapper.directive';\nimport { KbqTab } from './tab.component';\n\n@Directive({\n selector:\n 'kbq-tab-group[kbq-align-tabs-center], [kbq-tab-nav-bar][kbq-align-tabs-center], [kbqTabNavBar][kbq-align-tabs-center]',\n host: { class: 'kbq-tab-group_align-labels-center' }\n})\nexport class KbqAlignTabsCenterCssStyler {}\n\n@Directive({\n selector:\n 'kbq-tab-group[kbq-align-tabs-end], [kbq-tab-nav-bar][kbq-align-tabs-end], [kbqTabNavBar][kbq-align-tabs-end]',\n host: { class: 'kbq-tab-group_align-labels-end' }\n})\nexport class KbqAlignTabsEndCssStyler {}\n\n@Directive({\n selector: 'kbq-tab-group[kbq-stretch-tabs], [kbq-tab-nav-bar][kbq-stretch-tabs], [kbqTabNavBar][kbq-stretch-tabs]',\n host: { class: 'kbq-tab-group_stretch-labels' }\n})\nexport class KbqStretchTabsCssStyler {}\n\n/**\n * @deprecated No-op. The vertical layout class is bound from `KbqTabGroup`/`KbqTabNavBar` themselves,\n * so it follows the `vertical` value instead of merely the presence of the attribute. Will be removed\n * in a future major version — stop importing it.\n */\n@Directive({\n selector: 'kbq-tab-group[vertical], [kbq-tab-nav-bar][vertical], [kbqTabNavBar][vertical]'\n})\nexport class KbqVerticalTabsCssStyler {}\n\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n\n/** Debounce applied to header resizes before the tab labels are re-measured for overflow. */\nconst RESIZE_DEBOUNCE_INTERVAL = 100;\n\n/** A simple change event emitted on focus or selection changes. */\nexport class KbqTabChangeEvent {\n /** Index of the currently-selected tab. */\n index: number;\n /** Reference to the currently-selected tab. */\n tab: KbqTab;\n}\n\n/** Possible positions for the tab header. */\nexport type KbqTabHeaderPosition = 'above' | 'below';\n\n/** Object that can be used to configure the default options for the tabs module. */\nexport interface KbqTabsConfig {\n /** Duration for the tab animation. Must be a valid CSS value (e.g. 600ms). */\n animationDuration?: string;\n}\n\n/** Injection token that can be used to provide the default options the tabs module. */\nexport const KBQ_TABS_CONFIG = new InjectionToken<KbqTabsConfig>('KBQ_TABS_CONFIG');\n\nexport type KbqTabSelectBy = string | number | ((tabs: KbqTab[]) => KbqTab | null);\n\n/**\n * The persisted state of a tab group — which tab was selected.\n *\n * Both are stored: `tabId` is the only identifier that survives a reordering, and `index` is all there is\n * when the tabs carry no `tabId`.\n */\nexport interface KbqTabsState {\n tabId: string | null;\n index: number;\n}\n\n/**\n * Coerces a raw persisted payload into a `KbqTabsState`, returning `null` for anything unrecognizable.\n *\n * Web storage is origin-wide and user-writable, so a payload is never trusted — without this, an entry\n * such as `{\"index\": \"first\"}` would reach `clampTabIndex` and select nothing.\n */\nconst normalizeTabsState = (parsed: unknown): KbqTabsState | null => {\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return null;\n\n const { tabId, index } = parsed as Partial<KbqTabsState>;\n\n if (typeof index !== 'number' || !Number.isInteger(index) || index < 0) return null;\n\n return { tabId: typeof tabId === 'string' ? tabId : null, index };\n};\n\n/**\n * Tab-group component. Supports basic tab pairs (label + content) and includes keyboard navigation.\n */\n@Component({\n selector: 'kbq-tab-group',\n imports: [KbqTabHeader, CdkMonitorFocus, KbqTabLabelWrapper, KbqTooltipTrigger, CdkPortalOutlet, KbqTabBody],\n templateUrl: './tab-group.html',\n styleUrls: ['./tab-group.scss', './tabs-tokens.scss'],\n providers: [{ provide: KBQ_PARENT_ANIMATION_COMPONENT, useExisting: forwardRef(() => KbqTabGroup) }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-tab-group',\n '[class.kbq-tab-group_filled]': '!transparent()',\n '[class.kbq-tab-group_transparent]': 'transparent()',\n '[class.kbq-tab-group_on-background]': '!onSurface()',\n '[class.kbq-tab-group_on-surface]': 'onSurface()',\n '[class.kbq-tab-group_dynamic-height]': 'dynamicHeight()',\n '[class.kbq-tab-group_vertical]': 'vertical()',\n '[class.kbq-tab-group_inverted-header]': 'headerPosition === \"below\"'\n },\n // `useStateSaving` and `stateSavingKey` are the directive's inputs, surfaced on the tab group.\n hostDirectives: [\n { directive: KbqStateSaving, inputs: ['useStateSaving', 'stateSavingKey'] }\n ],\n exportAs: 'kbqTabGroup'\n})\nexport class KbqTabGroup implements OnChanges, AfterContentInit, AfterViewInit, AfterContentChecked, OnDestroy {\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly resizeObserver = inject(SharedResizeObserver);\n private readonly platform = inject(Platform);\n\n /**\n * Persistence of the selected tab, applied as a host directive. `useStateSaving` and `stateSavingKey`\n * are its inputs, forwarded onto the tab group.\n */\n private readonly stateSaving = inject(KbqStateSaving);\n\n private readonly tabsQuery = contentChildren(KbqTab);\n private readonly tabsList = kbqQueryListFrom(this.tabsQuery);\n\n /** The tabs of the group. */\n get tabs(): QueryList<KbqTab> {\n return this.tabsList();\n }\n\n readonly tabBodyWrapper = viewChild.required<ElementRef>('tabBodyWrapper');\n\n readonly tabHeader = viewChild.required<KbqTabHeader>('tabHeader');\n\n /** Whether the tab strip background should be transparent. */\n readonly transparent = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Whether the group is rendered on a surface rather than on the page background. */\n readonly onSurface = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Whether the selected tab is marked with an underline instead of a filled background. */\n readonly underlined = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Whether the tab strip is laid out vertically, alongside the content instead of above it. */\n readonly vertical = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Whether the tab group should grow to the size of the active tab. */\n readonly dynamicHeight = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** @docs-private */\n readonly selectedIndexInput = input<number | undefined, number | string | null | undefined>(undefined, {\n alias: 'selectedIndex',\n transform: kbqOptionalNumberAttribute\n });\n\n /** @docs-private */\n readonly activeTabInput = input<KbqTabSelectBy | null | undefined>(undefined, { alias: 'activeTab' });\n\n /** @docs-private */\n readonly headerPositionInput = input<KbqTabHeaderPosition | undefined>(undefined, { alias: 'headerPosition' });\n\n /** @docs-private */\n readonly animationDurationInput = input<string | undefined>(undefined, { alias: 'animationDuration' });\n\n /** The index of the active tab. */\n get selectedIndex(): number {\n return this.selectedIndexState()!;\n }\n\n set selectedIndex(value: number) {\n this.activeTab = value;\n }\n\n private readonly selectedIndexState = signal<number | undefined>(undefined);\n\n get activeTab(): KbqTab | null {\n switch (typeof this.attributeToSelectBy) {\n case 'number':\n return this.tabs.get(this.clampTabIndex(this.attributeToSelectBy)) || null;\n case 'string':\n return (\n this.tabs.toArray().find(({ tabId: tabIdInput }) => {\n const tabId = tabIdInput();\n\n return tabId === this.attributeToSelectBy;\n }) ||\n this.tabs.get(0) ||\n null\n );\n case 'function':\n return this.attributeToSelectBy(this.tabs.toArray());\n default:\n return this.getDefaultTab();\n }\n }\n\n set activeTab(value: KbqTabSelectBy | null) {\n // `selectedIndex` assigns through here too, so this one flag covers both inputs.\n this.attributeWritten = true;\n\n this.attributeToSelectBy = value;\n }\n\n /** Position of the tab header. */\n headerPosition: KbqTabHeaderPosition = 'above';\n\n /** Duration for the tab animation. Must be a valid CSS value (e.g. 600ms). */\n animationDuration: string;\n\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\n readonly selectedIndexChange = output<number>();\n\n /** Event emitted when the tab selection has changed. */\n readonly activeTabChange = output<string | number | KbqTab>();\n\n /** Event emitted when focus has changed within a tab group. */\n readonly focusChange = output<KbqTabChangeEvent>();\n\n /** Event emitted when the body animation has completed */\n readonly animationDone = output<void>();\n\n /** Event emitted when the tab selection has changed. */\n readonly selectedTabChange = output<KbqTabChangeEvent>();\n\n private attributeToSelectBy: KbqTabSelectBy | null = null;\n\n /**\n * Whether anything has assigned `activeTab` or `selectedIndex`. Snapshotted while initializing, where\n * only an input binding can have done so, and read from then on as \"the application drives the\n * selection\" — which suppresses persistence.\n */\n private attributeWritten = false;\n\n private controlled = false;\n\n /** Whether the dev-mode warning about a tab with no `tabId` has already been logged. */\n private warnedAboutTabId = false;\n\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\n private tabBodyWrapperHeight = 0;\n\n /** Subscription to tabs being added/removed. */\n private tabsSubscription = Subscription.EMPTY;\n\n /** Subscription to changes in the tab labels. */\n private tabLabelSubscription = Subscription.EMPTY;\n\n private readonly groupId: number;\n\n private readonly defaultAnimationDuration =\n inject<KbqTabsConfig>(KBQ_TABS_CONFIG, { optional: true })?.animationDuration || '0ms';\n\n constructor() {\n this.groupId = nextId++;\n this.animationDuration = this.defaultAnimationDuration;\n\n // The state lives under the new key now, so restore from it.\n this.stateSaving.keyChanges.subscribe(() => this.applySavedState());\n\n // `checkOverflow` writes `tab.overflowTooltipTitle`, which the same view reads through\n // `[kbqTooltipDisabled]`. Deferring it past the render keeps the write out of the checked cycle.\n afterNextRender(() => {\n this.checkOverflow();\n this.changeDetectorRef.markForCheck();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member, except that `undefined` resets a member\n // typed without it to its default; unbound, it leaves what code wrote.\n // Assigned through `activeTab`, because the `selectedIndex` setter takes no `null` — the default, which selects\n // the first enabled tab.\n if (changes['selectedIndexInput']) this.activeTab = this.selectedIndexInput() ?? null;\n\n // A bound `undefined` is handed over too: binding `activeTab` at all lets the application drive the\n // selection, which turns the state saving off.\n if (changes['activeTabInput']) {\n this.activeTab = this.activeTabInput() ?? null;\n }\n\n if (changes['headerPositionInput']) {\n this.headerPosition = this.headerPositionInput() ?? 'above';\n }\n\n if (changes['animationDurationInput']) {\n this.animationDuration = this.animationDurationInput() ?? this.defaultAnimationDuration;\n }\n }\n\n ngAfterContentInit() {\n this.subscribeToTabLabels();\n\n this.restoreState();\n\n // Subscribe to changes in the amount of tabs, in order to be\n // able to re-render the content as new tabs are added or removed.\n this.tabsSubscription = this.tabs.changes.subscribe(() => {\n const indexToSelect = this.getTabIndexToSelect();\n\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\n // explicit change that selects a different tab.\n if (indexToSelect === this.selectedIndexState()) {\n const tabs = this.tabs.toArray();\n\n for (let i = 0; i < tabs.length; i++) {\n if (tabs[i].isActive) {\n // Assign both to the `activeTab` and the selected index so we don't fire a changed\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\n // adding a tab within the `selectedIndexChange` event.\n this.selectedIndexState.set(i);\n this.onSelectFocusedIndex(i);\n break;\n }\n }\n }\n\n this.subscribeToTabLabels();\n // Also marks the ancestors, whose check runs `ngAfterContentChecked` and positions the tabs.\n this.changeDetectorRef.markForCheck();\n });\n }\n\n /**\n * After the content is checked, this component knows what tabs have been defined\n * and what the selected index should be. This is where we can know exactly what position\n * each tab should be in according to the new selected index, and additionally we know how\n * a new selected tab should transition in (from the left or right).\n */\n ngAfterContentChecked() {\n // Brings `tabs` up to date first, so that its `changes` subscribers, which keep the selected tab when tabs are\n // added or removed, run before the selection is computed.\n this.tabsList();\n\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\n // the amount of tabs changes before the actual change detection runs.\n const indexToSelect = this.getTabIndexToSelect();\n\n // If there is a change in selected index, emit a change event. Should not trigger if\n // the selected index has not yet been initialized.\n if (this.selectedIndexState() !== indexToSelect) {\n const isFirstRun = this.selectedIndexState() == null;\n\n if (!isFirstRun) {\n this.selectedTabChange.emit(this.createChangeEvent(indexToSelect));\n }\n\n // Changing these values after change detection has run\n // since the checked content may contain references to them.\n Promise.resolve().then(() => {\n this.tabs.forEach((tab, index) => (tab.isActive = index === indexToSelect));\n\n if (!isFirstRun) {\n const tabToSelect = this.activeTab;\n\n this.selectedIndexChange.emit(indexToSelect);\n this.activeTabChange.emit(\n this.attributeToSelectBy && typeof this.attributeToSelectBy === 'function' && tabToSelect\n ? tabToSelect\n : (this.attributeToSelectBy as string | number)\n );\n }\n });\n }\n\n const selectedIndex = this.selectedIndexState();\n\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\n this.tabs.forEach((tab: KbqTab, index: number) => {\n tab.position = index - indexToSelect;\n\n // If there is already a selected tab, then set up an origin for the next selected tab\n // if it doesn't have one already.\n\n if (selectedIndex != null && tab.position === 0 && !tab.origin) {\n tab.origin = indexToSelect - selectedIndex;\n }\n });\n\n this.selectedIndexState.set(indexToSelect);\n }\n\n ngAfterViewInit(): void {\n if (!this.platform.isBrowser) return;\n\n // An element observer also catches container resizes, which no window resize event reports.\n this.resizeObserver\n .observe(this.tabHeader().elementRef.nativeElement)\n .pipe(debounceTime(RESIZE_DEBOUNCE_INTERVAL), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n // Read the current value: only vertical labels are truncated, and `vertical` can change.\n if (!this.vertical()) return;\n\n this.checkOverflow();\n this.changeDetectorRef.markForCheck();\n });\n }\n\n ngOnDestroy() {\n this.tabsSubscription.unsubscribe();\n this.tabLabelSubscription.unsubscribe();\n }\n\n focusChanged(index: number) {\n this.focusChange.emit(this.createChangeEvent(index));\n }\n\n /** Returns a unique id for each tab label element */\n getTabLabelId(i: number): string {\n return `kbq-tab-label-${this.groupId}-${i}`;\n }\n\n /** Returns a unique id for each tab content element */\n getTabContentId(i: number): string {\n return `kbq-tab-content-${this.groupId}-${i}`;\n }\n\n /**\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\n * height property is true.\n */\n setTabBodyWrapperHeight(tabHeight: number): void {\n if (!this.dynamicHeight() || !this.tabBodyWrapperHeight) {\n return;\n }\n\n const wrapper: HTMLElement = this.tabBodyWrapper().nativeElement;\n\n wrapper.style.height = `${this.tabBodyWrapperHeight}px`;\n\n // This conditional forces the browser to paint the height so that\n // the animation to the new height can have an origin.\n if (this.tabBodyWrapper().nativeElement.offsetHeight) {\n wrapper.style.height = `${tabHeight}px`;\n }\n }\n\n /** Removes the height of the tab body wrapper. */\n removeTabBodyWrapperHeight(): void {\n this.tabBodyWrapperHeight = this.tabBodyWrapper().nativeElement.clientHeight;\n this.tabBodyWrapper().nativeElement.style.height = '';\n this.animationDone.emit();\n }\n\n /** Handle click events, setting new selected index if appropriate. */\n handleClick(tab: KbqTab, tabHeader: KbqTabHeader, index: number) {\n // Untracked, as `onSelectFocusedIndex()`, `saveState()` and `clearSavedState()`: called from a consumer's\n // `effect()`, the state read on the way — the tabs and their inputs, the selection, the state saving inputs —\n // would make the effect run again whenever it changes.\n untracked(() => {\n if (tab.disabled) {\n return;\n }\n\n this.onSelectFocusedIndex(index);\n tabHeader.focusIndex = index;\n });\n }\n\n /**\n * Retrieves the tabindex for the tab. The single `0` follows the header's focus position rather\n * than the selection, so that a disabled selected tab cannot take the whole strip out of the tab\n * order — a disabled tab is `-1`, never absent, so it stays a roving-tabindex participant.\n */\n getTabIndex(tab: KbqTab, tabHeader: KbqTabHeader, index: number): number {\n if (tab.disabled) {\n return -1;\n }\n\n return this.getRovingTabIndex(tabHeader) === index ? 0 : -1;\n }\n\n onSelectFocusedIndex($event: number): void {\n untracked(() => {\n if (typeof this.attributeToSelectBy === 'string') {\n this.activeTab = this.tabs.get($event)?.tabId() || null;\n } else {\n this.activeTab = $event;\n }\n\n this.saveState();\n });\n }\n\n /**\n * Persists which tab is selected.\n *\n * Called for every selection a user makes. Both the tab's `tabId` and its position are stored: the\n * `tabId` is the only one that survives the tabs being reordered, and the position is all there is\n * when the tabs carry none.\n */\n saveState(): void {\n untracked(() => {\n if (!this.persists) return;\n\n this.stateSaving.write(this.snapshot());\n });\n }\n\n /**\n * Removes the state persisted for this tab group.\n *\n * Persistence itself stays on — the next selection is written again. Unset `useStateSaving` to stop\n * it.\n */\n clearSavedState(): void {\n untracked(() => this.stateSaving.clear());\n }\n\n /**\n * Whether state is currently persisted for this tab group — restored on init, or written since.\n * Always `false` while `useStateSaving` is unset, and `false` again after `clearSavedState()`.\n */\n get hasSavedState(): boolean {\n return this.stateSaving.state != null;\n }\n\n /** Whether this tab group reads and writes its selection at all. */\n private get persists(): boolean {\n // A group that is not in the document has no stable key — the default resolver derives one from\n // the path to `<body>` — which is the ordinary state of one projected into an overlay.\n return this.stateSaving.useStateSaving() && !this.controlled && !!this.stateSaving.host?.isConnected;\n }\n\n /** Restores the persisted selection, unless the application drives it. */\n private restoreState(): void {\n // Only an input binding can have assigned by now: `activeTab` needs a view query to reach, and a\n // click needs a rendered header. Snapshotted here rather than in `applySavedState()`, which runs\n // again after a key change — by then a click has assigned too, and would read as an application.\n this.controlled = this.attributeWritten;\n\n this.applySavedState();\n }\n\n /** Reads the persisted selection and applies it. Runs while initializing, and again on a key change. */\n private applySavedState(): void {\n if (!this.persists) return;\n\n const savedState = this.stateSaving.read(normalizeTabsState);\n\n if (!savedState) return;\n\n const tabs = this.tabs.toArray();\n const byId = savedState.tabId === null ? -1 : tabs.findIndex((tab) => tab.tabId() === savedState.tabId);\n\n // The id wins wherever it still names a tab, so a reordering does not select the wrong one. Its\n // position is the fallback, and a payload naming neither is dropped rather than clamped — the\n // group then keeps whatever it would have selected on its own.\n if (byId < 0 && savedState.index >= tabs.length) return;\n\n this.stateSaving.applying(() => {\n this.activeTab = byId < 0 ? savedState.index : savedState.tabId;\n });\n }\n\n /** The whole selection, by id and by position. */\n private snapshot(): KbqTabsState {\n const tabs = this.tabs?.toArray() ?? [];\n const active = this.activeTab;\n const index = active ? tabs.indexOf(active) : -1;\n const tabId = active?.tabId() || null;\n\n if (!tabId && isDevMode() && !this.warnedAboutTabId) {\n this.warnedAboutTabId = true;\n\n // eslint-disable-next-line no-console\n console.warn(\n 'kbq-tab-group: the selected tab has no `tabId`, so the selection is persisted by ' +\n 'position. A position survives a reload but not a reordering, and then restores the ' +\n 'wrong tab. Give the tabs a `tabId`, or unset `useStateSaving`.'\n );\n }\n\n return { tabId, index: index < 0 ? 0 : index };\n }\n\n private checkOverflow(): void {\n this.tabHeader().items.forEach((headerTab) => headerTab.checkOverflow());\n }\n\n private createChangeEvent(index: number): KbqTabChangeEvent {\n const event = new KbqTabChangeEvent();\n\n event.index = index;\n\n if (this.tabs && this.tabs.length) {\n event.tab = this.tabs.toArray()[index];\n }\n\n return event;\n }\n\n /**\n * Subscribes to changes in the tab labels. This is needed, because the `@Input` for the label is\n * on the KbqTab component, whereas the data binding is inside the KbqTabGroup. In order for the\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\n * manually.\n */\n private subscribeToTabLabels() {\n if (this.tabLabelSubscription) {\n this.tabLabelSubscription.unsubscribe();\n }\n\n this.tabLabelSubscription = merge(...this.tabs.map((tab) => tab.stateChanges)).subscribe(() =>\n this.changeDetectorRef.markForCheck()\n );\n }\n\n /**\n * Index that owns `tabindex=\"0\"`, falling back to the first enabled tab when focus sits on a\n * disabled one.\n *\n * The template calls this once per tab, so the common path stays allocation-free: `QueryList.get`\n * indexes the backing array, where `toArray()` would copy it N times per check.\n */\n private getRovingTabIndex(tabHeader: KbqTabHeader): number {\n const { focusIndex } = tabHeader;\n const focused = this.tabs.get(focusIndex);\n\n if (focused && !focused.disabled) {\n return focusIndex;\n }\n\n for (let index = 0; index < this.tabs.length; index++) {\n if (!this.tabs.get(index)!.disabled) {\n return index;\n }\n }\n\n return -1;\n }\n\n /** First tab that can actually be selected, so that a leading disabled tab is not the default. */\n private getDefaultTab(): KbqTab | null {\n return this.tabs.find((tab) => !tab.disabled) || this.tabs.get(0) || null;\n }\n\n /** Clamps the given index to the bounds of 0 and the tabs length. */\n private clampTabIndex(index: number | null): number {\n // Note the `|| 0`, which ensures that values like NaN can't get through\n // and which would otherwise throw the component into an infinite loop\n // (since Math.max(NaN, 0) === NaN).\n return Math.min(this.tabs.length - 1, Math.max(index || 0, 0));\n }\n\n private getTabIndexToSelect(): number {\n const currentSelectedTab = this.activeTab;\n\n if (currentSelectedTab === null) {\n return 0;\n }\n\n return this.tabs ? this.tabs.toArray().indexOf(currentSelectedTab) : 0;\n }\n}\n","<kbq-tab-header\n #tabHeader\n [selectedIndex]=\"selectedIndex\"\n [underlined]=\"underlined()\"\n [vertical]=\"vertical()\"\n (indexFocused)=\"focusChanged($event)\"\n (selectFocusedIndex)=\"onSelectFocusedIndex($event)\"\n>\n @for (tab of tabs; track tab) {\n <div\n cdkMonitorElementFocus\n kbqTabLabelWrapper\n class=\"kbq-tab-label\"\n role=\"tab\"\n [attr.aria-controls]=\"getTabContentId($index)\"\n [attr.aria-selected]=\"selectedIndex === $index\"\n [attr.tabindex]=\"getTabIndex(tab, tabHeader, $index)\"\n [class.kbq-selected]=\"selectedIndex === $index\"\n [class.kbq-tab-label_empty]=\"tab.empty()\"\n [class.kbq-tab-label_horizontal]=\"!vertical()\"\n [class.kbq-tab-label_underlined]=\"underlined()\"\n [class.kbq-tab-label_vertical]=\"vertical()\"\n [class.kbq-tab-label_icon-only]=\"tab.iconOnlyLabel\"\n [disabled]=\"tab.disabled\"\n [id]=\"getTabLabelId($index)\"\n [kbqPlacement]=\"tab.tooltipPlacement()\"\n [kbqTooltip]=\"tab.tooltipTitle\"\n [kbqTooltipDisabled]=\"!tab.empty() && !tab.isOverflown\"\n [kbqTrigger]=\"'hover, focus'\"\n [tab]=\"tab\"\n (click)=\"handleClick(tab, tabHeader, $index)\"\n >\n <div #labelContent class=\"kbq-tab-label__content\" [class.kbq-tab-label__template]=\"tab.templateLabel\">\n <!-- If there is a label template, use it. -->\n @if (tab.templateLabel) {\n <ng-template [cdkPortalOutlet]=\"tab.templateLabel\" />\n }\n <!-- If there is not a label template, fall back to the text label. -->\n @else {\n {{ tab.textLabel() }}\n }\n </div>\n </div>\n }\n</kbq-tab-header>\n\n<div #tabBodyWrapper class=\"kbq-tab-body__wrapper\">\n @for (tab of tabs; track tab) {\n <kbq-tab-body\n role=\"tabpanel\"\n [animationDuration]=\"animationDuration\"\n [attr.aria-labelledby]=\"getTabLabelId($index)\"\n [attr.tabindex]=\"selectedIndex === $index ? 0 : null\"\n [class.kbq-tab-body__active]=\"selectedIndex === $index\"\n [content]=\"tab.content!\"\n [id]=\"getTabContentId($index)\"\n [origin]=\"tab.origin!\"\n [position]=\"tab.position!\"\n (onCentered)=\"removeTabBodyWrapperHeight()\"\n (onCentering)=\"setTabBodyWrapperHeight($event)\"\n />\n }\n</div>\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport { CdkObserveContent } from '@angular/cdk/observers';\nimport { Platform } from '@angular/cdk/platform';\nimport {\n AfterContentInit,\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChildren,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n input,\n OnChanges,\n OnDestroy,\n QueryList,\n Renderer2,\n SimpleChanges,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { isUndefined, kbqOptionalNumberAttribute, kbqQueryListFrom } from '@koobiq/components/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqScrollbarViewport } from '@koobiq/components/scrollbar';\nimport { startWith } from 'rxjs/operators';\nimport { KbqPaginatedTabHeader } from './paginated-tab-header';\n\n// Increasing integer for generating unique ids for tab nav components.\nlet nextUniqueId = 0;\n\n/** Corresponds to `--kbq-tabs-size-tab-item-padding-horizontal` on text tabs in underlined mode. */\nconst TAB_PADDING = 12;\n\n/**\n * Navigation component matching the styles of the tab group header.\n */\n@Component({\n selector: '[kbqTabNavBar], [kbq-tab-nav-bar]',\n imports: [\n KbqIconModule,\n CdkObserveContent,\n KbqScrollbarViewport\n ],\n templateUrl: './tab-nav-bar.html',\n styleUrls: [\n './tab-nav-bar.scss',\n './tabs-tokens.scss',\n // KbqTabLink is a directive and can't have self styles, so we need to include its styles here.\n './tab-link.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-tab-nav-bar',\n '[class.kbq-tab-nav-bar_filled]': '!transparent()',\n '[class.kbq-tab-nav-bar_transparent]': 'transparent()',\n '[class.kbq-tab-nav-bar_on-background]': '!onSurface()',\n '[class.kbq-tab-nav-bar_on-surface]': 'onSurface()',\n '[class.kbq-tab-header_underlined]': 'underlined()',\n '[class.kbq-tab-group_vertical]': 'vertical',\n '[class.kbq-tab-header__pagination-controls_enabled]': 'showPaginationControls',\n '[class.kbq-tab-header_rtl]': \"getLayoutDirection() == 'rtl'\",\n '[attr.role]': 'role',\n '[attr.aria-orientation]': 'ariaOrientation'\n },\n exportAs: 'kbqTabNavBar'\n})\nexport class KbqTabNavBar extends KbqPaginatedTabHeader implements AfterContentInit {\n private readonly tabListContainerQuery = viewChild.required<ElementRef>('tabListContainer');\n private readonly scrollbarViewportQuery = viewChild.required('tabListContainer', { read: KbqScrollbarViewport });\n private readonly tabListQuery = viewChild.required<ElementRef>('tabList');\n private readonly nextPaginatorQuery = viewChild.required<ElementRef<HTMLElement>>('nextPaginator');\n private readonly previousPaginatorQuery = viewChild.required<ElementRef<HTMLElement>>('previousPaginator');\n private readonly itemsQuery = contentChildren(\n forwardRef(() => KbqTabLink),\n { descendants: true }\n );\n private readonly itemsList = kbqQueryListFrom(this.itemsQuery);\n\n /** The scroll container of the tab links. */\n get tabListContainer(): ElementRef {\n return this.tabListContainerQuery();\n }\n\n protected get scrollbarViewport(): KbqScrollbarViewport {\n return this.scrollbarViewportQuery();\n }\n\n /** The element that holds the tab links. */\n get tabList(): ElementRef {\n return this.tabListQuery();\n }\n\n /** The pagination arrow towards the end of the tab list. */\n get nextPaginator(): ElementRef<HTMLElement> {\n return this.nextPaginatorQuery();\n }\n\n /** The pagination arrow towards the beginning of the tab list. */\n get previousPaginator(): ElementRef<HTMLElement> {\n return this.previousPaginatorQuery();\n }\n\n /** The tab links of the nav bar. */\n get items(): QueryList<KbqTabLink> {\n return this.itemsList();\n }\n\n private readonly isBrowser = inject(Platform).isBrowser;\n\n /** Whether the nav bar background should be transparent. */\n readonly transparent = input<boolean, unknown>(false, { transform: booleanAttribute });\n readonly onSurface = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Whether the nav bar should be underlined. */\n readonly underlined = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /**\n * Associated tab panel controlled by the nav bar.\n */\n readonly tabNavPanel = input<KbqTabNavPanel>();\n\n get role(): string | null {\n return this.tabNavPanel() ? 'tablist' : this.elementRef.nativeElement.getAttribute('role');\n }\n\n /**\n * Vertical tablists are walked with ↑/↓ — ←/→ do nothing — so the orientation has to be announced.\n * `aria-orientation` is only meaningful on a role that supports it, hence nothing without a panel.\n */\n protected get ariaOrientation(): string | null {\n return this.role === 'tablist' && this.vertical ? 'vertical' : null;\n }\n\n protected get activeTabOffsetWidth(): number | undefined {\n if (!this.isBrowser) return undefined;\n\n const width = this.items.get(this.selectedIndex)?.elementRef?.nativeElement?.offsetWidth;\n\n if (!width) return width;\n\n return width - TAB_PADDING * 2;\n }\n\n protected get activeTabOffsetLeft(): number | undefined {\n if (!this.isBrowser) return undefined;\n\n const left = this.items.get(this.selectedIndex)?.elementRef?.nativeElement?.offsetLeft;\n\n if (isUndefined(left)) return left;\n\n return left + TAB_PADDING;\n }\n\n protected get activeTabDisabled(): boolean {\n return !!this.items.get(this.selectedIndex)?.disabled;\n }\n\n /** `activeTabDisabled` as this view last rendered it: a link's `disabled` input gives this view no notice. */\n private checkedActiveTabDisabled = false;\n\n override ngAfterContentInit() {\n // We need this to run before the `changes` subscription in parent to ensure that the `selectedIndex` is\n // up-to-date by the time the `KbqPaginatedTabHeader` starts looking for it.\n this.items.changes.pipe(startWith(null), takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.updateActiveLink();\n });\n\n super.ngAfterContentInit();\n }\n\n override ngAfterContentChecked(): void {\n super.ngAfterContentChecked();\n\n const activeTabDisabled = this.activeTabDisabled;\n\n if (activeTabDisabled !== this.checkedActiveTabDisabled) {\n this.checkedActiveTabDisabled = activeTabDisabled;\n this.changeDetectorRef.markForCheck();\n }\n }\n\n protected itemSelected() {}\n\n /** Notifies the component that the active link has been changed. */\n updateActiveLink(): void {\n if (!this.items) {\n return;\n }\n\n const items = this.items.toArray();\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].active) {\n this.selectedIndex = i;\n // Also marks the ancestors, whose check runs `ngAfterContentChecked` and scrolls to the link.\n this.changeDetectorRef.markForCheck();\n\n const tabNavPanel = this.tabNavPanel();\n\n if (tabNavPanel) {\n tabNavPanel.activeTabId = items[i].id;\n }\n\n return;\n }\n }\n\n // The ink bar should hide itself if no items are active.\n this.selectedIndex = -1;\n }\n}\n\n/**\n * Link inside of a KbqTabNavBar.\n */\n@Directive({\n selector: '[kbqTabLink], [kbq-tab-link]',\n host: {\n class: 'kbq-tab-link',\n '[class.kbq-selected]': 'active',\n '[class.kbq-tab-label_vertical]': 'vertical',\n '[class.kbq-tab-label_horizontal]': '!vertical',\n '[class.kbq-tab-label_underlined]': 'underlined',\n '[class.kbq-disabled]': 'disabled',\n\n '[attr.id]': 'id',\n '[attr.tabindex]': 'tabIndex',\n // No `[attr.disabled]`: the directive sits on an `<a>`, where `disabled` is not a valid\n // attribute and no assistive technology reads it. Styling goes through `.kbq-disabled`.\n '[attr.aria-disabled]': 'disabled',\n '[attr.aria-selected]': 'ariaSelected',\n '[attr.role]': 'role',\n '[attr.aria-controls]': 'ariaControls',\n '[attr.aria-current]': 'ariaCurrent',\n\n '(focus)': 'handleFocus()',\n '(keydown)': 'handleKeydown($event)'\n },\n exportAs: 'kbqTabLink'\n})\nexport class KbqTabLink implements OnChanges, OnDestroy, AfterViewInit {\n /** @docs-private */\n readonly idInput = input<string | undefined>(undefined, { alias: 'id' });\n\n /** @docs-private */\n readonly activeInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'active',\n transform: booleanAttribute\n });\n\n /** @docs-private */\n readonly disabledInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'disabled',\n transform: booleanAttribute\n });\n\n /** @docs-private */\n readonly tabIndexInput = input<number | undefined, number | string | null | undefined>(undefined, {\n alias: 'tabIndex',\n transform: kbqOptionalNumberAttribute\n });\n\n private readonly uniqueId = `kbq-tab-link-${nextUniqueId++}`;\n\n /** Unique id for the link. */\n id = this.uniqueId;\n\n /** Whether the link is active. */\n get active(): boolean {\n return this._active;\n }\n\n set active(value: boolean) {\n if (value !== this._active) {\n this._active = value;\n this.tabNavBar.updateActiveLink();\n }\n }\n\n /** Whether the tab link is active or not. */\n private _active: boolean = false;\n\n get vertical(): boolean {\n return this.tabNavBar.vertical;\n }\n\n get underlined(): boolean {\n return this.tabNavBar.underlined();\n }\n\n /** Whether the tab link is disabled. */\n disabled: boolean = false;\n\n /** Link tab index. */\n get tabIndex(): number {\n if (this.tabNavBar.tabNavPanel()) {\n return this.active && !this.disabled ? this._tabIndex : -1;\n } else {\n return this.disabled ? -1 : this._tabIndex;\n }\n }\n\n set tabIndex(value: number) {\n this._tabIndex = value;\n }\n\n private _tabIndex: number = 0;\n\n /** Link aria-selected attribute value. */\n protected get ariaSelected(): string | null {\n if (this.tabNavBar.tabNavPanel()) {\n return this.active ? 'true' : 'false';\n } else {\n return this.elementRef.nativeElement.getAttribute('aria-selected');\n }\n }\n\n /** Link role attribute value. */\n protected get role(): string | null {\n return this.tabNavBar.tabNavPanel() ? 'tab' : this.elementRef.nativeElement.getAttribute('role');\n }\n\n /** Link aria-controls attribute value. */\n protected get ariaControls(): string | null {\n const tabNavPanel = this.tabNavBar.tabNavPanel();\n\n return tabNavPanel ? tabNavPanel?.id() : this.elementRef.nativeElement.getAttribute('aria-controls');\n }\n\n /** Link aria-current attribute value. */\n protected get ariaCurrent(): string | null {\n return this.active && !this.tabNavBar.tabNavPanel() ? 'page' : null;\n }\n\n readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly renderer = inject(Renderer2);\n private readonly tabNavBar = inject(KbqTabNavBar);\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member, except that `undefined` resets a member\n // typed without it to its default; unbound, it leaves what code wrote.\n if (changes['idInput']) {\n this.id = this.idInput() ?? this.uniqueId;\n }\n\n if (changes['disabledInput']) {\n const disabled = this.disabledInput();\n\n if (disabled !== undefined) this.disabled = disabled;\n }\n\n if (changes['tabIndexInput']) this.tabIndex = this.tabIndexInput() ?? 0;\n\n // Last: the nav bar reads the id of the link that becomes active.\n if (changes['activeInput']) {\n const active = this.activeInput();\n\n if (active !== undefined) this.active = active;\n }\n }\n\n ngAfterViewInit(): void {\n this.focusMonitor.monitor(this.elementRef.nativeElement);\n\n this.addClassModifierForIcons(Array.from(this.elementRef.nativeElement.querySelectorAll('.kbq-icon')));\n }\n\n ngOnDestroy() {\n this.focusMonitor.stopMonitoring(this.elementRef.nativeElement);\n }\n\n private addClassModifierForIcons(icons: HTMLElement[]) {\n const twoIcons = 2;\n const [firstIconElement, secondIconElement] = icons;\n\n if (icons.length === 1) {\n const COMMENT_NODE = 8;\n\n if (firstIconElement.nextSibling && firstIconElement.nextSibling.nodeType !== COMMENT_NODE) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_left');\n }\n\n if (firstIconElement.previousSibling && firstIconElement.previousSibling.nodeType !== COMMENT_NODE) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_right');\n }\n } else if (icons.length === twoIcons) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_left');\n this.renderer.addClass(secondIconElement, 'kbq-icon_right');\n }\n }\n\n /**\n * Focuses the tab link.\n *\n * `preventScroll: true`: `FocusKeyManager.setActiveItem` calls this itself, right after (and\n * unconditionally on) the `change` emission that runs `KbqPaginatedTabHeader.setTabFocus` — so\n * without the guard here too, that call's own `preventScroll: true` is immediately undone by\n * this one, and an overflowing nav bar double-jumps (native scroll-into-view, then the\n * paginator-aware `scrollCorrection`) on every arrow-key press.\n */\n focus(): void {\n this.elementRef.nativeElement.focus({ preventScroll: true });\n }\n\n /** Handles the focus event. */\n protected handleFocus() {\n // Since we allow navigation through tabbing in the nav bar, we have to update the focused index whenever the\n // link receives focus.\n this.tabNavBar.focusIndex = this.tabNavBar.items.toArray().indexOf(this);\n }\n\n /** Handles the keydown event. */\n protected handleKeydown(event: KeyboardEvent) {\n if (event.keyCode === SPACE || event.keyCode === ENTER) {\n if (this.disabled) {\n event.preventDefault();\n } else if (this.tabNavBar.tabNavPanel()) {\n // Only prevent the default action on space since it can scroll the page.\n // Don't prevent enter since it can break link navigation.\n if (event.keyCode === SPACE) {\n event.preventDefault();\n }\n\n this.elementRef.nativeElement.click();\n }\n }\n }\n}\n\n/**\n * Tab panel component associated with KbqTabNav.\n */\n@Directive({\n selector: '[kbqTabNavPanel]',\n host: {\n class: 'kbq-tab-nav-panel',\n\n '[attr.id]': 'id()',\n '[attr.aria-labelledby]': 'activeTabId',\n\n role: 'tabpanel'\n },\n exportAs: 'kbqTabNavPanel'\n})\nexport class KbqTabNavPanel {\n /** Unique id for the tab panel. */\n readonly id = input(`kbq-tab-nav-panel-${nextUniqueId++}`);\n\n /** Id of the active tab in the nav bar. */\n activeTabId?: string;\n}\n","<div\n #previousPaginator\n class=\"kbq-tab-header__pagination kbq-tab-header__pagination_before\"\n [class.kbq-disabled]=\"disableScrollBefore\"\n (click)=\"handlePaginatorClick('before')\"\n (mousedown)=\"handlePaginatorPress('before', $event)\"\n (touchend)=\"stopInterval()\"\n>\n <i kbq-icon=\"kbq-chevron-left_16\" color=\"contrast\"></i>\n</div>\n\n<div\n #tabListContainer\n kbqScrollbarViewport\n class=\"kbq-tab-link__container kbq-tab-header__scroll-container\"\n [kbqScrollbarMode]=\"scrollbarMode\"\n [class.kbq-tab-header__scroll-container_overflow-before]=\"!disableScrollBefore\"\n [class.kbq-tab-header__scroll-container_overflow-after]=\"!disableScrollAfter\"\n (keydown)=\"handleKeydown($event)\"\n>\n <div #tabList class=\"kbq-tab-list\" (cdkObserveContent)=\"onContentChanges()\">\n <div class=\"kbq-tab-list__content\">\n <ng-content />\n <div\n aria-hidden=\"true\"\n class=\"kbq-tab-list__active-tab-underline\"\n [class.kbq-animations-disabled]=\"animationsDisabled\"\n [class.kbq-disabled]=\"activeTabDisabled\"\n [style.left.px]=\"activeTabOffsetLeft\"\n [style.width.px]=\"activeTabOffsetWidth\"\n ></div>\n </div>\n </div>\n</div>\n\n<div\n #nextPaginator\n class=\"kbq-tab-header__pagination kbq-tab-header__pagination_after\"\n [class.kbq-disabled]=\"disableScrollAfter\"\n (click)=\"handlePaginatorClick('after')\"\n (mousedown)=\"handlePaginatorPress('after', $event)\"\n (touchend)=\"stopInterval()\"\n>\n <i kbq-icon=\"kbq-chevron-right_16\" color=\"contrast\"></i>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { CdkObserveContent } from '@angular/cdk/observers';\nimport { PortalModule } from '@angular/cdk/portal';\nimport { CdkScrollableModule } from '@angular/cdk/scrolling';\nimport { NgModule } from '@angular/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqToolTipModule } from '@koobiq/components/tooltip';\nimport { KbqTabBody, KbqTabBodyPortal } from './tab-body.component';\nimport { KbqTabContent } from './tab-content.directive';\nimport {\n KbqAlignTabsCenterCssStyler,\n KbqAlignTabsEndCssStyler,\n KbqStretchTabsCssStyler,\n KbqTabGroup,\n KbqVerticalTabsCssStyler\n} from './tab-group.component';\nimport { KbqTabHeader } from './tab-header.component';\nimport { KbqTabLabelWrapper } from './tab-label-wrapper.directive';\nimport { KbqTabLabel } from './tab-label.directive';\nimport { KbqTabLink, KbqTabNavBar, KbqTabNavPanel } from './tab-nav-bar';\nimport { KbqTab } from './tab.component';\n\nconst STANDALONE_COMPONENTS = [\n KbqTabNavBar,\n KbqTabLink,\n KbqTabNavPanel\n];\n\nconst COMPONENTS = [\n KbqTabGroup,\n KbqTabLabel,\n KbqTab,\n KbqTabLabelWrapper,\n KbqTabBody,\n KbqTabBodyPortal,\n KbqTabHeader,\n KbqTabContent,\n KbqAlignTabsCenterCssStyler,\n KbqAlignTabsEndCssStyler,\n KbqStretchTabsCssStyler,\n KbqVerticalTabsCssStyler\n];\n\n@NgModule({\n imports: [\n PortalModule,\n A11yModule,\n CdkScrollableModule,\n KbqIconModule,\n KbqToolTipModule,\n CdkObserveContent,\n ...STANDALONE_COMPONENTS,\n ...COMPONENTS\n ],\n exports: [\n ...COMPONENTS,\n ...STANDALONE_COMPONENTS\n ]\n})\nexport class KbqTabsModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["observableOf","TAB_PADDING","i1"],"mappings":"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"}
1
+ {"version":3,"file":"koobiq-components-tabs.mjs","sources":["../../../packages/components/tabs/paginated-tab-header.ts","../../../packages/components/tabs/tab-body.component.ts","../../../packages/components/tabs/tab-body.html","../../../packages/components/tabs/tab-content.directive.ts","../../../packages/components/tabs/tab-label-wrapper.directive.ts","../../../packages/components/tabs/tab-header.component.ts","../../../packages/components/tabs/tab-header.html","../../../packages/components/tabs/tab-label.directive.ts","../../../packages/components/tabs/tab.component.ts","../../../packages/components/tabs/tab-group.component.ts","../../../packages/components/tabs/tab-group.html","../../../packages/components/tabs/tab-nav-bar.ts","../../../packages/components/tabs/tab-nav-bar.html","../../../packages/components/tabs/tabs.module.ts","../../../packages/components/tabs/koobiq-components-tabs.ts"],"sourcesContent":["import { FocusableOption, FocusKeyManager } from '@angular/cdk/a11y';\nimport { Direction, Directionality } from '@angular/cdk/bidi';\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { ENTER, hasModifierKey, SPACE } from '@angular/cdk/keycodes';\nimport { SharedResizeObserver } from '@angular/cdk/observers/private';\nimport { normalizePassiveListenerOptions, Platform } from '@angular/cdk/platform';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AfterContentChecked,\n AfterContentInit,\n afterNextRender,\n AfterViewInit,\n booleanAttribute,\n ChangeDetectorRef,\n DestroyRef,\n Directive,\n ElementRef,\n EventEmitter,\n inject,\n Injector,\n input,\n NgZone,\n OnChanges,\n OnDestroy,\n QueryList,\n signal,\n SimpleChanges,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n DOWN_ARROW,\n END,\n HOME,\n KBQ_WINDOW,\n kbqAnimationsDisabled,\n kbqGetScrollOverflowTolerance,\n kbqHasScrollOverflow,\n kbqOptionalNumberAttribute,\n LEFT_ARROW,\n RIGHT_ARROW,\n UP_ARROW\n} from '@koobiq/components/core';\nimport { KBQ_SCROLLBAR_OPTIONS, type KbqScrollbarMode, type KbqScrollbarViewport } from '@koobiq/components/scrollbar';\nimport { fromEvent, merge, of as observableOf, ReplaySubject, Subject, timer } from 'rxjs';\nimport { auditTime, debounceTime, takeUntil } from 'rxjs/operators';\n\n/** Config used to bind passive event listeners */\nconst passiveEventListenerOptions = normalizePassiveListenerOptions({ passive: true }) as EventListenerOptions;\n\n/**\n * The directions that scrolling can go in when the header's tabs exceed the header width. 'After'\n * will scroll the header towards the end of the tabs list and 'before' will scroll towards the\n * beginning of the list.\n */\nexport type ScrollDirection = 'after' | 'before';\n\n/**\n * Amount of milliseconds to wait before starting to scroll the header automatically.\n * Set a little conservatively in order to handle fake events dispatched on touch devices.\n */\nconst HEADER_SCROLL_DELAY = 650;\n\n/**\n * Interval in milliseconds at which to scroll the header\n * while the user is holding their pointer.\n */\nconst HEADER_SCROLL_INTERVAL = 100;\n\n/** Fraction of the viewport width scrolled per arrow click/press tick. */\nconst SCROLL_DISTANCE = 0.8;\n\n/** Minimum horizontal pointer movement (px) before a pointerdown is treated as a drag rather than a click. */\nconst DRAG_THRESHOLD = 4;\n\n/** Below this speed (px/ms) an inertia coast stops. */\nconst MIN_INERTIA_VELOCITY = 0.02;\n\n/** Clamp applied to the smoothed drag velocity so a jittery fast flick can't launch a huge coast. */\nconst MAX_INERTIA_VELOCITY = 3;\n\n/** Clamp on a single inertia animation frame's elapsed time, guarding against dropped frames/backgrounded tabs. */\nconst MAX_FRAME_DURATION = 32;\n\n/** Per-millisecond exponential decay rate applied to the inertia velocity. */\nconst FRICTION_PER_MILLISECOND = 0.003;\n\n/** Audit interval (ms) for the scroll-box `ResizeObserver` — see the `auditTime` usage below. */\nconst RESIZE_AUDIT_TIME = 100;\n\n/** Debounce (ms) for scroll-correction requests, so a burst of focus/selection changes settles before scrolling. */\nconst SCROLL_CORRECTION_DEBOUNCE = 100;\n\n/** How often (ms) scroll/drag updates are allowed to trigger Angular change detection (arrow visibility, mask). */\nconst SCROLL_CD_THROTTLE = 48;\n\n/** Applied to the scroll container while a drag gesture is in progress. */\nconst DRAGGING_CLASS = 'kbq-tab-header__scroll-container_dragging';\n\n/**\n * Matches nested interactive controls (e.g. a tab's remove button) that have their own click\n * behavior and are too small to reliably press without a few stray pixels of movement — a drag\n * should never start on them, since crossing `DRAG_THRESHOLD` by accident would swallow their click.\n */\nconst NON_DRAGGABLE_TARGET_SELECTOR = 'button, [kbq-icon-button], input, select, textarea';\n\n/** Tracks an in-progress mouse/pen drag gesture on the tab list. */\ninterface DragState {\n pointerId: number;\n didDrag: boolean;\n startX: number;\n lastX: number;\n lastTimestamp: number;\n /** Smoothed pointer velocity in px/ms, positive meaning the pointer moved right. Exponential moving average. */\n velocity: number;\n}\n\n/** Item inside a paginated tab header. */\nexport type KbqPaginatedTabHeaderItem = FocusableOption & { elementRef: ElementRef };\n\n/**\n * Base class for a tab header that supported pagination.\n *\n * @docs-private\n */\n@Directive()\nexport abstract class KbqPaginatedTabHeader\n implements OnChanges, AfterContentChecked, AfterContentInit, AfterViewInit, OnDestroy\n{\n /** @docs-private */\n readonly selectedIndexInput = input<number | undefined, number | string | null | undefined>(undefined, {\n alias: 'selectedIndex',\n transform: kbqOptionalNumberAttribute\n });\n\n /** @docs-private */\n readonly disablePaginationInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'disablePagination',\n transform: booleanAttribute\n });\n\n /** @docs-private */\n readonly verticalInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'vertical',\n transform: booleanAttribute\n });\n\n /** The index of the active tab. */\n get selectedIndex(): number {\n return this.selectedIndexState();\n }\n\n set selectedIndex(value: number) {\n const coercedValue = coerceNumberProperty(value);\n\n this.selectedIndexChanged = untracked(this.selectedIndexState) !== coercedValue;\n this.selectedIndexState.set(coercedValue);\n\n this.keyManager?.updateActiveItem(coercedValue);\n }\n\n private readonly selectedIndexState = signal(0);\n\n /** Tracks which element has focus; used for keyboard navigation */\n get focusIndex(): number {\n // Before `ngAfterContentInit` builds the key manager the selection is where focus would land —\n // `updateActiveItem(this.selectedIndex)` is the first thing that runs once it exists. Falling\n // back to `0` instead would hand the roving `tabindex=\"0\"` to the first tab on the very first\n // render of any group that does not open on it.\n return this.keyManager ? this.keyManager.activeItemIndex! : this.selectedIndex;\n }\n\n /** When the focus index is set, we must manually send focus to the correct label */\n set focusIndex(value: number) {\n if (!this.isValidIndex(value) || this.focusIndex === value || !this.keyManager) {\n return;\n }\n\n this.keyManager.setActiveItem(value);\n }\n\n abstract get items(): QueryList<KbqPaginatedTabHeaderItem>;\n abstract get tabListContainer(): ElementRef<HTMLElement>;\n /** The strip's scroll viewport — the same element as {@link tabListContainer}. */\n protected abstract get scrollbarViewport(): KbqScrollbarViewport;\n abstract get tabList(): ElementRef<HTMLElement>;\n abstract get nextPaginator(): ElementRef<HTMLElement>;\n abstract get previousPaginator(): ElementRef<HTMLElement>;\n\n /** Event emitted when the option is selected. */\n readonly selectFocusedIndex: EventEmitter<number> = new EventEmitter<number>();\n\n /** Event emitted when a label is focused. */\n readonly indexFocused: EventEmitter<number> = new EventEmitter<number>();\n\n /** Whether the controls for pagination should be displayed */\n showPaginationControls = false;\n\n /** Whether the tab list can be scrolled more towards the end of the tab label list. */\n disableScrollAfter = true;\n\n /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */\n disableScrollBefore = true;\n\n /** @docs-private */\n protected overflowBefore = false;\n\n /** @docs-private */\n protected overflowAfter = false;\n\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n *\n * A vertical header never paginates, so `vertical` forces this on without overwriting the value\n * the consumer set — turning `vertical` back off restores it.\n */\n get disablePagination(): boolean {\n return this._disablePagination || this._vertical;\n }\n\n set disablePagination(value: boolean) {\n this._disablePagination = value;\n }\n\n private _disablePagination = false;\n\n /** Whether the tabs should be displayed vertically. */\n set vertical(value: boolean) {\n this._vertical = value;\n }\n\n get vertical(): boolean {\n return this._vertical;\n }\n\n private _vertical = false;\n\n /** `disablePagination` as of the last content check — see `ngAfterContentChecked`. */\n private previousDisablePagination = false;\n\n /**\n * The number of tab labels that are displayed on the header. When this changes, the header\n * should re-evaluate the scroll position.\n */\n private tabLabelCount: number;\n\n /** Used to manage focus between the tabs. */\n private keyManager: FocusKeyManager<KbqPaginatedTabHeaderItem>;\n\n /** Cached text content of the header. */\n private currentTextContent: string;\n\n /** Stream that will stop the automated scrolling. */\n private stopScrolling = new Subject<void>();\n\n /** Whether the header should scroll to the selected index after the view has been checked. */\n private selectedIndexChanged = false;\n\n /** Whether DOM focus currently sits on one of the items. */\n private focusWasInside = false;\n\n /**\n * Index of the item that last took DOM focus, or `-1`. Recorded from the `focusin` target rather\n * than read back from `keyManager.activeItemIndex`, because the `selectedIndex` setter writes that\n * field too — and on an `items.changes` tick a subscriber registered earlier (`KbqTabNavBar`'s\n * `updateActiveLink`) repoints it at the *active* item before focus restoration gets to run.\n */\n private focusedItemIndex = -1;\n\n /** State of the in-progress mouse/pen drag gesture, if any. */\n private dragState: DragState | null = null;\n\n /** `requestAnimationFrame` handle for an in-progress inertia coast, if any. */\n private inertiaFrameId: number | null = null;\n\n /** Set after a drag gesture so the click it would otherwise trigger on a tab is suppressed. */\n private suppressNextClick = false;\n\n /** Handle of the timer that clears {@link suppressNextClick}, so it can be cancelled on destroy. */\n private suppressClickTimeoutId: ReturnType<Window['setTimeout']> | null = null;\n\n // Attached only while a drag is possibly in progress (from `pointerdown` to `pointerup`/\n // `pointercancel`) rather than for the component's whole lifetime: bound to `ownerDocument`,\n // so every pointer move anywhere on the page would otherwise run this handler for every\n // paginated tab header on the page, whether or not any of them is actually being dragged.\n private readonly documentPointerMoveListener = (event: PointerEvent) => this.handlePointerMove(event);\n private readonly documentPointerUpListener = (event: PointerEvent) => this.endDrag(event, true);\n private readonly documentPointerCancelListener = (event: PointerEvent) => this.endDrag(event, false);\n\n /** Emits on every native `scroll` event and drag/inertia frame; throttled to limit change detection. */\n private readonly scrollProgress = new Subject<void>();\n\n /**\n * Emits scroll-correction requests (from focus or selection changes); debounced so a burst\n * settles once. `ReplaySubject(1)`, not `Subject`: content hooks (where the very first request,\n * from `ngAfterContentChecked`, is sent) run before view hooks in the same initial change-\n * detection pass, so a plain `Subject` would drop it — the `ngAfterViewInit` subscription below\n * doesn't exist yet when it's emitted.\n */\n private readonly scrollCorrectionRequest = new ReplaySubject<{ index: number; behavior: ScrollBehavior }>(1);\n\n /**\n * The latest scroll-correction request, repeated once webfonts finish loading: a label measured in the\n * fallback face moves when the real one swaps in. Dropped once a correction has measured with no font\n * loading, and as soon as the user moves the strip, so the repeat never pulls it back from where they took it.\n */\n private lastScrollCorrection: { index: number; behavior: ScrollBehavior } | null = null;\n\n protected readonly destroyRef = inject(DestroyRef);\n public readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n protected readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly ngZone = inject(NgZone);\n private readonly platform = inject(Platform);\n private readonly dir = inject(Directionality, { optional: true });\n private readonly window = inject(KBQ_WINDOW);\n private readonly sharedResizeObserver = inject(SharedResizeObserver);\n private readonly document = inject(DOCUMENT);\n private readonly scrollbarOptions = inject(KBQ_SCROLLBAR_OPTIONS);\n private readonly injector = inject(Injector);\n\n /** Whether the underline of the active tab moves without motion. */\n protected readonly animationsDisabled = kbqAnimationsDisabled();\n\n /**\n * Scrollbar mode for the tab strip. Only a vertical header scrolls in a direction the user is meant\n * to see, so a horizontal one asks for `hidden`: the native scrollbar stays suppressed and no custom\n * track is built for a strip that is paginated and dragged instead of scrolled by hand.\n *\n * Follows `vertical` itself: the `kbq-tab-group_vertical` class the stylesheet keys `overflow-y: auto`\n * on is bound to the same value. The class of a nav bar is its own host binding, applied only after\n * its content hooks, so reading the class from here would miss it on the first check.\n */\n protected get scrollbarMode(): KbqScrollbarMode {\n return this.vertical ? this.scrollbarOptions.mode : 'hidden';\n }\n\n constructor() {\n const nativeElement = this.elementRef.nativeElement;\n\n // Bind these on the outside since they don't change anything in the view.\n this.ngZone.runOutsideAngular(() => {\n fromEvent(nativeElement, 'mouseleave')\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.stopInterval());\n\n fromEvent<FocusEvent>(nativeElement, 'focusin')\n .pipe(takeUntilDestroyed())\n .subscribe(({ target }) => {\n this.focusWasInside = true;\n this.focusedItemIndex = this.indexOfItemContaining(target);\n });\n\n // Only a move onto a known element outside gives up ownership: a destroyed item reports\n // no `relatedTarget` at all, and that case is what the restore below exists for.\n fromEvent<FocusEvent>(nativeElement, 'focusout')\n .pipe(takeUntilDestroyed())\n .subscribe(({ relatedTarget }) => {\n if (relatedTarget && !nativeElement.contains(relatedTarget as Node)) {\n this.focusWasInside = false;\n }\n });\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member; unbound, it leaves what code wrote.\n if (changes['selectedIndexInput']) this.selectedIndex = this.selectedIndexInput() ?? 0;\n\n if (changes['disablePaginationInput']) {\n const disablePagination = this.disablePaginationInput();\n\n if (disablePagination !== undefined) this.disablePagination = disablePagination;\n }\n\n if (changes['verticalInput']) {\n const vertical = this.verticalInput();\n\n if (vertical !== undefined) this.vertical = vertical;\n }\n }\n\n /** Called when the user has selected an item via the keyboard. */\n ngAfterViewInit() {\n // We need to handle these events manually, because we want to bind passive event listeners.\n fromEvent(this.previousPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.handlePaginatorPress('before'));\n\n fromEvent(this.nextPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.handlePaginatorPress('after'));\n\n this.ngZone.runOutsideAngular(() => {\n const container = this.tabListContainer.nativeElement;\n\n fromEvent(container, 'scroll', passiveEventListenerOptions)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.vertical) {\n const { overflowBefore, overflowAfter } = this;\n\n this.updateScrollState();\n\n if (overflowBefore !== this.overflowBefore || overflowAfter !== this.overflowAfter) {\n this.scrollProgress.next();\n }\n\n return;\n }\n\n // Without this guard every native `scroll` of a `disablePagination` header would\n // throttle-trigger a whole-app change-detection tick for pinned booleans.\n if (this.disablePagination) return;\n\n this.updateScrollState();\n this.scrollProgress.next();\n });\n\n // Any wheel/trackpad input should immediately take over from a running inertia coast, and from\n // a correction waiting to be repeated.\n fromEvent<WheelEvent>(container, 'wheel', passiveEventListenerOptions)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.cancelInertia();\n this.lastScrollCorrection = null;\n });\n\n fromEvent<PointerEvent>(container, 'pointerdown')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => this.handlePointerDown(event));\n\n // A native drag-and-drop gesture (e.g. starting on a `kbqTabLink`'s `<a href>`) would\n // otherwise hijack our own pointer-based drag partway through, aborting the gesture via\n // a `pointercancel` while a browser-native drag ghost follows the cursor instead.\n fromEvent<DragEvent>(container, 'dragstart')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (this.dragState?.didDrag) event.preventDefault();\n });\n\n // Fallback for when capture is lost without a `pointerup`/`pointercancel` of its own\n // reaching us (e.g. the element is detached, or another element steals capture).\n fromEvent<PointerEvent>(container, 'lostpointercapture')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => this.endDrag(event, true));\n\n fromEvent<MouseEvent>(container, 'click', { capture: true })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (this.suppressNextClick) {\n event.preventDefault();\n event.stopPropagation();\n this.suppressNextClick = false;\n }\n });\n\n this.scrollProgress\n .pipe(auditTime(SCROLL_CD_THROTTLE), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.ngZone.run(() => this.changeDetectorRef.markForCheck()));\n });\n\n // Covers layout changes that resize the scroll box without a `scroll` event of their own\n // (e.g. a sidebar toggling, not just the window resizing). `auditTime`, not `debounceTime`:\n // a `debounceTime` only emits once a live resize (e.g. dragging a window edge or a splitter\n // pane) has stopped for a full `RESIZE_AUDIT_TIME`, so pagination stays frozen — arrows\n // hidden, drag-scroll dead, no edge mask — for the whole drag instead of updating as it goes.\n this.sharedResizeObserver\n .observe(this.tabListContainer.nativeElement)\n .pipe(auditTime(RESIZE_AUDIT_TIME), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.updatePagination());\n\n this.scrollCorrectionRequest\n .pipe(debounceTime(SCROLL_CORRECTION_DEBOUNCE), takeUntilDestroyed(this.destroyRef))\n .subscribe(({ index, behavior }) => {\n this.scrollCorrection(index, behavior);\n\n // Measured with no font left loading, the labels are in their final faces. Kept any longer, the\n // request would let a font loaded later for unrelated text pull the strip back to the selection.\n if (this.document.fonts?.status !== 'loading') this.lastScrollCorrection = null;\n });\n\n // A webfont that arrives after the strip was measured resizes the labels without resizing the scroll\n // box or changing the text, so neither observer above sees it. Re-measuring also re-renders the\n // underline, which reads the selected label's offsets from the template.\n if (this.platform.isBrowser && this.document.fonts) {\n const fonts = this.document.fonts;\n\n // Audited like a resize: faces arrive in bursts, and every header on the page measures on each one.\n this.ngZone.runOutsideAngular(() =>\n fromEvent(fonts, 'loadingdone')\n .pipe(auditTime(RESIZE_AUDIT_TIME), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.disablePagination) return;\n\n this.ngZone.run(() => this.updatePagination());\n\n if (this.lastScrollCorrection) this.scrollCorrectionRequest.next(this.lastScrollCorrection);\n })\n );\n }\n }\n\n ngAfterContentInit() {\n const dirChange = this.dir ? this.dir.change : observableOf('ltr');\n\n const realign = () => {\n this.updatePagination();\n // The ink bar reads `offsetLeft`/`offsetWidth` from the template, so the deferred first\n // measurement only reaches the DOM if the view is re-checked after it.\n this.changeDetectorRef.markForCheck();\n };\n\n this.keyManager = new FocusKeyManager<KbqPaginatedTabHeaderItem>(this.items).withHorizontalOrientation(\n this.getLayoutDirection()\n );\n\n this.keyManager.updateActiveItem(this.selectedIndex);\n\n // Defer the first call in order to allow for slower browsers to lay out the elements.\n // This helps in cases where the user lands directly on a page with paginated tabs.\n if (typeof this.window.requestAnimationFrame !== 'undefined') {\n this.window.requestAnimationFrame(realign);\n } else {\n realign();\n }\n\n // On dir change or content change, realign and update the orientation of the key manager\n // if the direction has changed. Container resize is handled separately by the `ResizeObserver`.\n merge(dirChange, this.items.changes)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n // We need to defer this to give the browser some time to recalculate\n // the element dimensions. The call has to be wrapped in `NgZone.run`,\n // because the direction change handler can run outside of Angular.\n this.ngZone.run(() => Promise.resolve().then(realign));\n\n this.keyManager.withHorizontalOrientation(this.getLayoutDirection());\n });\n\n // If there is a change in the focus key manager we need to emit the `indexFocused`\n // event in order to provide a public event that notifies about focus changes. Also we realign\n // the tabs container by scrolling the new focused tab into the visible section.\n this.keyManager.change.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((newFocusIndex) => {\n // `change` only fires for deliberate focus moves (`setActiveItem`), never for the\n // bookkeeping `updateActiveItem` the `selectedIndex` setter does — which is exactly the\n // distinction `focusedItemIndex` has to preserve.\n this.focusedItemIndex = newFocusIndex;\n this.indexFocused.emit(newFocusIndex);\n this.setTabFocus(newFocusIndex);\n });\n\n this.items.changes\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.restoreFocusAfterItemsChange());\n }\n\n ngAfterContentChecked(): void {\n // Diff the derived value rather than a flag on one of its two inputs: `disablePagination` is\n // `_disablePagination || _vertical`, so watching only `vertical` left a header whose\n // `[disablePagination]` binding was toggled at runtime with stale paginator state.\n const disablePagination = this.disablePagination;\n\n // If the number of tab labels have changed, check if scrolling should be enabled\n if (this.tabLabelCount !== this.items.length || this.previousDisablePagination !== disablePagination) {\n this.previousDisablePagination = disablePagination;\n\n // Read before `tabLabelCount` moves. Gated on growth rather than on any change: losing a tab\n // cannot start the strip scrolling, so re-announcing it there would be noise.\n const gainedTabs = this.items.length > (this.tabLabelCount ?? 0);\n\n this.updatePagination();\n this.tabLabelCount = this.items.length;\n\n // Briefly reveals the scrollbar when the strip arrives or gains tabs, so whether it scrolls\n // is answered on sight rather than only once the pointer enters it. Vertical only: a\n // horizontal strip is paginated and dragged, runs in `hidden` mode and has no scrollbar to\n // announce.\n //\n // Deferred to after the render: the viewport builds its track from an effect, and effects\n // flush after this hook, so flashing here directly would push into a subject nothing is\n // listening to yet and the very first reveal — the one that matters — would be dropped.\n if (gainedTabs && this.vertical && this.platform.isBrowser) {\n afterNextRender(() => this.scrollbarViewport.flashScrollIndicators(), {\n injector: this.injector\n });\n }\n }\n\n // If the selected index has changed, scroll to the label.\n if (this.selectedIndexChanged) {\n this.selectedIndexChanged = false;\n this.requestScrollCorrection(this.selectedIndex, 'smooth');\n }\n }\n\n ngOnDestroy() {\n this.cancelDrag();\n this.cancelInertia();\n\n if (this.suppressClickTimeoutId !== null) {\n this.window.clearTimeout(this.suppressClickTimeoutId);\n }\n\n this.stopScrolling.complete();\n }\n\n handleKeydown(event: KeyboardEvent) {\n // We don't handle any key bindings with a modifier key.\n if (hasModifierKey(event)) {\n return;\n }\n\n const key = event.keyCode;\n\n if (key === HOME) {\n this.keyManager.setFirstItemActive();\n } else if (key === END) {\n this.keyManager.setLastItemActive();\n } else if (key === UP_ARROW && this.vertical) {\n this.keyManager.setPreviousItemActive();\n } else if (key === DOWN_ARROW && this.vertical) {\n this.keyManager.setNextItemActive();\n } else if (key === RIGHT_ARROW && !this.vertical) {\n this.keyManager.setNextItemActive();\n } else if (key === LEFT_ARROW && !this.vertical) {\n this.keyManager.setPreviousItemActive();\n } else if ([ENTER, SPACE].includes(key)) {\n this.selectFocusedIndex.emit(this.focusIndex);\n }\n\n if ([HOME, END, UP_ARROW, DOWN_ARROW, RIGHT_ARROW, LEFT_ARROW, SPACE, ENTER].includes(key)) {\n event.preventDefault();\n }\n }\n\n /**\n * Callback for when the MutationObserver detects that the content has changed.\n */\n onContentChanges() {\n const textContent = this.elementRef.nativeElement.textContent;\n\n // We need to diff the text content of the header, because the MutationObserver callback\n // will fire even if the text content didn't change which is inefficient and is prone\n // to infinite loops if a poorly constructed expression is passed in (see #14249).\n if (textContent !== this.currentTextContent) {\n this.currentTextContent = textContent || '';\n\n // The content observer runs outside the `NgZone` by default, which\n // means that we need to bring the callback back in ourselves.\n this.ngZone.run(() => this.updatePagination());\n }\n }\n\n /**\n * Updates the view whether pagination should be enabled or not.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n if (!this.platform.isBrowser) return;\n\n this.checkPaginationEnabled();\n this.updateScrollState();\n this.changeDetectorRef.markForCheck();\n }\n\n /**\n * Determines if an index is valid. If the tabs are not ready yet, we assume that the user is\n * providing a valid index and return true.\n */\n isValidIndex(index: number): boolean {\n if (!this.items) {\n return true;\n }\n\n const tab = this.items ? this.items.toArray()[index] : null;\n\n return !!tab && !tab.disabled;\n }\n\n /**\n * Sets focus on the HTML element for the label wrapper and scrolls it into the view if\n * scrolling is enabled.\n */\n setTabFocus(tabIndex: number) {\n if (!this.items?.length) return;\n\n const item = this.items.toArray()[tabIndex];\n\n // Prevent the browser's own scroll-into-view behavior so the scroll-correction request\n // below is the only thing driving the scroll position.\n item.elementRef.nativeElement.focus({ preventScroll: true });\n\n if (this.showPaginationControls) {\n this.requestScrollCorrection(tabIndex, 'auto');\n }\n }\n\n /** The layout direction of the containing app. */\n getLayoutDirection(): Direction {\n return this.dir?.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /**\n * Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or\n * the end of the list, respectively).\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n scrollHeader(direction: ScrollDirection) {\n this.lastScrollCorrection = null;\n\n const container = this.tabListContainer.nativeElement;\n const viewLength = container.clientWidth;\n const amount = (direction === 'before' ? -1 : 1) * viewLength * SCROLL_DISTANCE;\n\n this.scroll(this.logicalScrollPosition + amount);\n }\n\n /** Handles click events on the pagination arrows. */\n handlePaginatorClick(direction: ScrollDirection) {\n this.stopInterval();\n this.scrollHeader(direction);\n }\n\n /**\n * Evaluate whether the pagination controls should be displayed. If the scroll width of the\n * tab list is wider than the size of the header container, then the pagination controls should\n * be shown.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n checkPaginationEnabled() {\n if (this.disablePagination) {\n this.showPaginationControls = false;\n\n return;\n }\n\n const container = this.tabListContainer.nativeElement;\n // Tolerated rather than an exact `>`: an overflow no larger than the metrics' own measurement\n // error is not scrollable, and mounting arrows for it would put the header on both bounds at\n // once. `updateScrollState` spends the same tolerance on the far bound only, so anything that\n // does mount here has a scroll range wider than that bound.\n const isEnabled = kbqHasScrollOverflow(container);\n\n if (!isEnabled) {\n this.cancelDrag();\n this.cancelInertia();\n container.scrollLeft = 0;\n }\n\n if (isEnabled !== this.showPaginationControls) {\n this.changeDetectorRef.markForCheck();\n }\n\n this.showPaginationControls = isEnabled;\n }\n\n /** Stops the currently-running paginator interval. */\n stopInterval() {\n this.stopScrolling.next();\n }\n\n /**\n * Handles the user pressing down on one of the paginators.\n * Starts scrolling the header after a certain amount of time.\n *\n * @param direction In which direction the paginator should be scrolled.\n */\n handlePaginatorPress(direction: ScrollDirection, mouseEvent?: MouseEvent) {\n // Don't start auto scrolling for right mouse button clicks. Note that we shouldn't have to\n // null check the `button`, but we do it so we don't break tests that use fake events.\n\n if (mouseEvent && mouseEvent.button != null && mouseEvent.button !== 0) {\n return;\n }\n\n // Avoid overlapping timers.\n this.stopInterval();\n\n // Start a timer after the delay and keep firing based on the interval.\n timer(HEADER_SCROLL_DELAY, HEADER_SCROLL_INTERVAL)\n // Keep the timer going until something tells it to stop or the component is destroyed.\n .pipe(takeUntilDestroyed(this.destroyRef), takeUntil(this.stopScrolling))\n .subscribe(() => {\n // Read live scroll metrics rather than `disableScrollBefore`/`disableScrollAfter`:\n // those are only refreshed by the native `scroll` event, which lags a `smooth`\n // `scrollHeader` write by more than one `HEADER_SCROLL_INTERVAL` tick. Checking the\n // bound matching `direction` (not either bound) also stops the repeat exactly once\n // that side is reached, instead of the moment the *other* side happens to be at rest.\n this.updateScrollState();\n\n if (direction === 'before' ? this.disableScrollBefore : this.disableScrollAfter) {\n this.stopInterval();\n\n return;\n }\n\n this.scrollHeader(direction);\n });\n }\n\n protected abstract itemSelected(event: KeyboardEvent): void;\n\n /** Index of the item owning `target`, or `-1` — `target` is the item itself or something inside it. */\n private indexOfItemContaining(target: EventTarget | null): number {\n if (!target || !this.items) {\n return -1;\n }\n\n return this.items.toArray().findIndex(({ elementRef }) => elementRef.nativeElement.contains(target as Node));\n }\n\n /**\n * Moves focus onto the neighbouring item when the one that held it was removed. Without this the\n * destroyed element takes focus down to `<body>` and a keyboard user has to tab in from the top of\n * the document again (WCAG 2.4.3).\n */\n private restoreFocusAfterItemsChange(): void {\n if (!this.focusWasInside || !this.keyManager) {\n return;\n }\n\n const items = this.items.toArray();\n const { activeElement } = this.document;\n\n // The element holding focus is still one of the items, so nothing was lost. Testing against the\n // query list rather than `document.activeElement === body` because the query list is updated\n // before the removed element is actually detached.\n if (activeElement && items.some(({ elementRef }) => elementRef.nativeElement === activeElement)) {\n return;\n }\n\n const previousIndex = Math.max(0, Math.min(items.length - 1, this.focusedItemIndex));\n const index =\n items[previousIndex] && !items[previousIndex].disabled\n ? previousIndex\n : items.findIndex((item) => !item.disabled);\n\n if (index === -1) {\n this.focusWasInside = false;\n\n return;\n }\n\n this.keyManager.setActiveItem(index);\n }\n\n /**\n * The tab list's scroll position expressed independently of reading direction: `0` at the\n * start of the tab list, growing towards the end — mirrors native `scrollLeft`'s RTL-dependent\n * sign so callers can reason about \"before\"/\"after\" without checking direction themselves.\n */\n private get logicalScrollPosition(): number {\n const scrollLeft = this.tabListContainer.nativeElement.scrollLeft;\n\n return this.getLayoutDirection() === 'rtl' ? -scrollLeft : scrollLeft;\n }\n\n /**\n * Scrolls the header to a given logical position (see {@link logicalScrollPosition}).\n *\n * @param value Logical position to scroll to.\n * @param behavior Scroll animation behavior; `'auto'` jumps instantly, `'smooth'` animates.\n */\n private scroll(value: number, behavior: ScrollBehavior = 'smooth'): void {\n if (this.disablePagination) return;\n\n this.cancelInertia();\n\n const left = this.getLayoutDirection() === 'rtl' ? -value : value;\n\n this.tabListContainer.nativeElement.scrollTo({ left, behavior });\n }\n\n /** Queues a {@link scrollCorrection} behind the debounce, and keeps it to repeat once webfonts load. */\n private requestScrollCorrection(index: number, behavior: ScrollBehavior): void {\n this.lastScrollCorrection = { index, behavior };\n this.scrollCorrectionRequest.next(this.lastScrollCorrection);\n }\n\n /**\n * Moves the tab list such that the desired tab label (marked by index) is moved into view.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n private scrollCorrection(labelIndex: number, behavior: ScrollBehavior = 'smooth'): void {\n if (this.disablePagination) return;\n // A focus/selection change can queue a correction (debounced by `SCROLL_CORRECTION_DEBOUNCE`)\n // that then fires in the middle of an unrelated drag or inertia coast — e.g. a `pointerdown`\n // on a `kbqTabLink` focuses it before the drag threshold is crossed. Without this guard the\n // correction teleports the strip back under the cursor mid-drag, or kills a running coast.\n if (this.dragState || this.inertiaFrameId !== null) return;\n\n const selectedLabel = this.items ? this.items.toArray()[labelIndex] : null;\n\n if (!selectedLabel) return;\n\n const container = this.tabListContainer.nativeElement;\n const viewLength = container.clientWidth;\n const { offsetLeft, offsetWidth } = selectedLabel.elementRef.nativeElement;\n\n let labelBeforePos: number;\n let labelAfterPos: number;\n\n if (this.getLayoutDirection() === 'ltr') {\n labelBeforePos = offsetLeft;\n labelAfterPos = labelBeforePos + (offsetWidth as number);\n } else {\n labelAfterPos = this.tabList.nativeElement.offsetWidth - offsetLeft;\n labelBeforePos = labelAfterPos - offsetWidth;\n }\n\n const scrollPosition = this.logicalScrollPosition;\n const beforeVisiblePos = scrollPosition;\n const afterVisiblePos = scrollPosition + viewLength;\n\n if (labelBeforePos < beforeVisiblePos) {\n // Overshoot by the real paginator button width, so the label isn't flush with the\n // edge the arrow overlays.\n const overscroll = this.previousPaginator.nativeElement.clientWidth || 0;\n\n this.scroll(labelBeforePos - overscroll, behavior);\n } else if (labelAfterPos > afterVisiblePos) {\n const overscroll = this.nextPaginator.nativeElement.clientWidth || 0;\n\n this.scroll(scrollPosition + (labelAfterPos - afterVisiblePos + overscroll), behavior);\n }\n }\n\n /**\n * Recomputes the pagination arrow-enabled state from the container's real scroll metrics.\n * Bound to the native `scroll` event — this is the sole source of truth, no imperative call\n * is needed after drag/inertia/arrow-click scroll writes.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n private updateScrollState(): void {\n const container = this.tabListContainer.nativeElement;\n\n if (this.disablePagination) {\n this.disableScrollAfter = this.disableScrollBefore = true;\n\n if (this.vertical) {\n const maxScrollTop = container.scrollHeight - container.clientHeight;\n\n this.overflowBefore = container.scrollTop > 0;\n this.overflowAfter = container.scrollTop < maxScrollTop - kbqGetScrollOverflowTolerance(container);\n } else {\n this.overflowBefore = this.overflowAfter = false;\n }\n\n return;\n }\n\n const position = this.logicalScrollPosition;\n const maxScrollPosition = container.scrollWidth - container.clientWidth;\n\n // The start of the range is exactly `0` in both directions — `logicalScrollPosition` negates\n // `scrollLeft` for RTL — and no box metric takes part in that comparison, so it stays exact.\n // The far bound is derived from `scrollWidth`/`clientWidth`, which overstate the largest offset\n // the browser hands out: without the tolerance that reads as remaining scroll distance and\n // leaves the arrow and its edge mask enabled with nowhere left to scroll.\n this.disableScrollBefore = position <= 0;\n this.disableScrollAfter = position >= maxScrollPosition - kbqGetScrollOverflowTolerance(container);\n this.overflowBefore = !this.disableScrollBefore;\n this.overflowAfter = !this.disableScrollAfter;\n }\n\n private handlePointerDown(event: PointerEvent): void {\n if (!this.platform.isBrowser || this.disablePagination || !this.showPaginationControls) return;\n\n // Any press on the strip takes over from a running inertia coast, whatever the pointer\n // type — otherwise a tap on a touch-panning device, or a press on a nested control, would\n // leave the previous coast running underneath it. The same goes for a correction waiting to\n // be repeated; a press that changes the selection queues a fresh one.\n this.cancelInertia();\n this.lastScrollCorrection = null;\n\n // Touch keeps its existing interaction model (pagination arrows); only mouse/pen drag here.\n if (this.dragState || event.pointerType === 'touch' || event.button !== 0) return;\n // Don't hijack presses on nested controls (e.g. a tab's remove button) into a drag.\n if ((event.target as HTMLElement).closest?.(NON_DRAGGABLE_TARGET_SELECTOR)) return;\n\n this.attachDocumentDragListeners();\n this.dragState = {\n pointerId: event.pointerId,\n didDrag: false,\n startX: event.clientX,\n lastX: event.clientX,\n lastTimestamp: event.timeStamp,\n velocity: 0\n };\n }\n\n private handlePointerMove(event: PointerEvent): void {\n const state = this.dragState;\n\n if (!state || event.pointerId !== state.pointerId) return;\n\n // A release outside the window/document never reaches `ownerDocument` as a `pointerup` —\n // a buttonless move is the only signal that the gesture already ended.\n if (!event.buttons) {\n this.endDrag(event, true);\n\n return;\n }\n\n if (!state.didDrag) {\n if (Math.abs(event.clientX - state.startX) < DRAG_THRESHOLD) return;\n\n state.didDrag = true;\n this.tabListContainer.nativeElement.classList.add(DRAGGING_CLASS);\n\n try {\n this.tabListContainer.nativeElement.setPointerCapture?.(state.pointerId);\n } catch {\n // Pointer capture can fail if the pointer is no longer active — the drag still\n // works via the document-level pointermove/pointerup listeners.\n }\n }\n\n event.preventDefault();\n\n const distance = event.clientX - state.lastX;\n const elapsed = event.timeStamp - state.lastTimestamp;\n const instantVelocity = elapsed > 0 ? this.clampVelocity(-distance / elapsed) : 0;\n\n // Exponential moving average, not a windowed sample array — smooths out jittery per-move deltas.\n state.velocity = state.velocity === 0 ? instantVelocity : state.velocity * 0.7 + instantVelocity * 0.3;\n state.lastX = event.clientX;\n state.lastTimestamp = event.timeStamp;\n\n // The browser clamps this for free at the scroll bounds — no `getMaxScrollDistance()` needed.\n this.tabListContainer.nativeElement.scrollLeft -= distance;\n }\n\n // Aborts an in-progress drag without applying inertia, e.g. when pagination is disabled mid-gesture.\n private cancelDrag(): void {\n const state = this.dragState;\n\n if (!state) return;\n\n this.tabListContainer.nativeElement.classList.remove(DRAGGING_CLASS);\n this.dragState = null;\n this.detachDocumentDragListeners();\n\n // Only a gesture that actually became a drag captured the pointer / needs its resulting\n // click suppressed — matches the same condition `endDrag` guards on below.\n if (state.didDrag) this.finishDrag(state);\n }\n\n // Ends a drag gesture; `applyInertia` is false for `pointercancel`, where no coast is expected.\n private endDrag(event: PointerEvent, applyInertia: boolean): void {\n const state = this.dragState;\n\n if (!state || event.pointerId !== state.pointerId) return;\n\n this.dragState = null;\n this.tabListContainer.nativeElement.classList.remove(DRAGGING_CLASS);\n this.detachDocumentDragListeners();\n\n if (!state.didDrag) return;\n\n this.finishDrag(state);\n\n const releaseDelay = event.timeStamp - state.lastTimestamp;\n const releaseVelocity =\n applyInertia && releaseDelay <= 80\n ? state.velocity * Math.exp(-FRICTION_PER_MILLISECOND * releaseDelay)\n : 0;\n\n if (Math.abs(releaseVelocity) >= MIN_INERTIA_VELOCITY) {\n this.startInertia(releaseVelocity);\n }\n }\n\n // Releases pointer capture and arms the click-suppression latch — shared by `endDrag`/`cancelDrag`\n // so a drag aborted mid-gesture (e.g. by `checkPaginationEnabled`) doesn't strand capture or end\n // in an unintended tab selection.\n private finishDrag(state: DragState): void {\n try {\n this.tabListContainer.nativeElement.releasePointerCapture?.(state.pointerId);\n } catch {\n // Capture may already be lost, e.g. if the element was detached mid-drag.\n }\n\n this.suppressNextClick = true;\n\n if (this.suppressClickTimeoutId !== null) this.window.clearTimeout(this.suppressClickTimeoutId);\n\n // `pointercancel` never produces a trailing `click` — if it's the one that armed the\n // suppression, it would otherwise stay stuck `true` forever and eat the next unrelated\n // click. Reset unconditionally on a timer instead of only inside the click listener.\n this.suppressClickTimeoutId = this.window.setTimeout(() => {\n this.suppressNextClick = false;\n this.suppressClickTimeoutId = null;\n }, 0);\n }\n\n // Attached for the duration of a possible drag only — see the listener fields' doc comment.\n private attachDocumentDragListeners(): void {\n const ownerDocument = this.elementRef.nativeElement.ownerDocument;\n\n ownerDocument.addEventListener('pointermove', this.documentPointerMoveListener);\n ownerDocument.addEventListener('pointerup', this.documentPointerUpListener);\n ownerDocument.addEventListener('pointercancel', this.documentPointerCancelListener);\n }\n\n private detachDocumentDragListeners(): void {\n const ownerDocument = this.elementRef.nativeElement.ownerDocument;\n\n ownerDocument.removeEventListener('pointermove', this.documentPointerMoveListener);\n ownerDocument.removeEventListener('pointerup', this.documentPointerUpListener);\n ownerDocument.removeEventListener('pointercancel', this.documentPointerCancelListener);\n }\n\n // Coasts the header from the release velocity, decaying it every frame — matches a natural flick.\n private startInertia(releaseVelocity: number): void {\n const container = this.tabListContainer.nativeElement;\n const isRtl = this.getLayoutDirection() === 'rtl';\n const maxScrollLeft = container.scrollWidth - container.clientWidth;\n // `scrollLeft`'s native bounds, expressed in whichever direction is \"positive\" for this\n // reading direction — RTL browsers run `scrollLeft` from 0 down to `-maxScrollLeft`.\n const [minBound, maxBound] = isRtl ? [-maxScrollLeft, 0] : [0, maxScrollLeft];\n // `maxScrollLeft` is derived from rounded box metrics, which overstate the largest offset the\n // browser hands out, so the clamp below never fires at the far end of the range: the coast\n // would keep requesting frames and writing offsets the browser silently drops until friction\n // alone killed it, with `scrollCorrection` suppressed for that whole tail. The coast is\n // finished on contact instead — writing a reduced bound would pull the strip back visibly.\n // The near end is exactly `0` and needs no tolerance.\n const farBoundTolerance = kbqGetScrollOverflowTolerance(container);\n\n let velocity = releaseVelocity;\n // Accumulated in a local rather than read back from `scrollLeft`: the browser snaps the\n // stored offset to the device-pixel grid (e.g. 1/3 px steps at devicePixelRatio 1.5), so a\n // sub-pixel-per-frame write at a high refresh rate would otherwise round away to nothing and\n // the readback-equality boundary check below would mistake that for having hit a bound.\n let position = container.scrollLeft;\n let lastTimestamp: number | null = null;\n\n const step = (timestamp: number) => {\n const frameDuration = lastTimestamp === null ? 0 : Math.min(timestamp - lastTimestamp, MAX_FRAME_DURATION);\n\n lastTimestamp = timestamp;\n velocity *= Math.exp(-FRICTION_PER_MILLISECOND * frameDuration);\n position += velocity * frameDuration;\n\n const clamped = Math.max(minBound, Math.min(maxBound, position));\n\n container.scrollLeft = clamped;\n\n // The direction check keeps a flick back inwards from the far end alive: without it, a\n // coast starting within `farBoundTolerance` of that bound would end on its first frame.\n const reachedBoundary =\n clamped !== position ||\n (isRtl\n ? velocity < 0 && clamped <= minBound + farBoundTolerance\n : velocity > 0 && clamped >= maxBound - farBoundTolerance);\n\n position = clamped;\n\n if (Math.abs(velocity) < MIN_INERTIA_VELOCITY || reachedBoundary) {\n this.inertiaFrameId = null;\n\n return;\n }\n\n this.inertiaFrameId = this.window.requestAnimationFrame(step);\n };\n\n this.inertiaFrameId = this.window.requestAnimationFrame(step);\n }\n\n // Stops an in-progress inertia coast, e.g. because a new gesture or scroll input took over.\n private cancelInertia(): void {\n if (this.inertiaFrameId === null) return;\n\n this.window.cancelAnimationFrame(this.inertiaFrameId);\n this.inertiaFrameId = null;\n }\n\n private clampVelocity(velocity: number): number {\n return Math.max(-MAX_INERTIA_VELOCITY, Math.min(MAX_INERTIA_VELOCITY, velocity));\n }\n}\n","import { Direction, Directionality } from '@angular/cdk/bidi';\nimport { CdkPortalOutlet, TemplatePortal } from '@angular/cdk/portal';\nimport {\n afterNextRender,\n AfterRenderRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n EventEmitter,\n forwardRef,\n inject,\n Injector,\n input,\n MAX_ANIMATION_TIMEOUT,\n OnChanges,\n OnDestroy,\n OnInit,\n output,\n SimpleChanges,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { outputFromObservable } from '@angular/core/rxjs-interop';\nimport { kbqAnimationsDisabled, kbqAnimationsSettled } from '@koobiq/components/core';\nimport { KbqScrollbarViewport } from '@koobiq/components/scrollbar';\nimport { Subscription } from 'rxjs';\nimport { startWith } from 'rxjs/operators';\n\n/**\n * These position states are used internally as the translation states of the tab body. Setting the\n * position state to left, right, or center will transition the tab body from its current\n * position to its respective state. If there is not current position (void, in the case of a new\n * tab body), then there will be no transition to its state.\n *\n * In the case of a new tab body that should immediately be centered with an animating transition,\n * then left-origin-center or right-origin-center can be used, which will use left or right as its\n * pseudo-prior state.\n */\nexport type KbqTabBodyPositionState = 'left' | 'center' | 'right' | 'left-origin-center' | 'right-origin-center';\n\n/**\n * Wrapper for the contents of a tab.\n *\n * @docs-private\n */\n@Component({\n selector: 'kbq-tab-body',\n imports: [KbqScrollbarViewport, forwardRef(() => KbqTabBodyPortal)],\n templateUrl: './tab-body.html',\n styleUrl: './tab-body.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-tab-body'\n }\n})\nexport class KbqTabBody implements OnChanges, OnInit, OnDestroy {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly dir = inject(Directionality, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n\n /** Whether the tab body translates without motion. */\n protected readonly animationsDisabled = kbqAnimationsDisabled();\n\n /** @docs-private */\n readonly positionInput = input<number | undefined>(undefined, { alias: 'position' });\n\n /** @docs-private */\n readonly originInput = input<number | undefined>(undefined, { alias: 'origin' });\n\n /** The shifted index position of the tab body, where zero represents the active center tab. */\n set position(position: number) {\n this.positionIndex = position;\n this.computePositionAnimationState();\n }\n\n /** Tab body position state, rendered as a modifier class of the content. */\n bodyPosition: KbqTabBodyPositionState;\n\n /** Event emitted when the tab begins to animate towards the center as the active tab. */\n readonly onCentering = output<number>();\n\n /** Event emitted before the centering of the tab begins. */\n readonly beforeCentering: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** @docs-private */\n readonly beforeCenteringOutput = outputFromObservable(this.beforeCentering, { alias: 'beforeCentering' });\n\n /** Event emitted once the tab has finished moving away from the center. Carries no payload. */\n readonly afterLeavingCenter: EventEmitter<void> = new EventEmitter<void>();\n\n /** @docs-private */\n readonly afterLeavingCenterOutput = outputFromObservable(this.afterLeavingCenter, { alias: 'afterLeavingCenter' });\n\n /** Event emitted when the tab completes its animation towards the center. */\n readonly onCentered = output<void>();\n\n /** The portal host inside of this container into which the tab body content will be loaded. */\n readonly portalHost = viewChild.required(CdkPortalOutlet);\n\n /** The tab body content to display. */\n readonly content = input<TemplatePortal>(undefined!);\n\n /** Position that will be used when the tab is immediately becoming visible after creation. */\n origin: number;\n\n /** Duration for the tab's animation. */\n readonly animationDuration = input<string>('0ms');\n\n /** The duration as CSS time: a bare number, which CSS rejects, is taken as milliseconds. */\n protected readonly cssAnimationDuration = computed(() => {\n const duration = this.animationDuration();\n\n return /^\\d+$/.test(duration) ? `${duration}ms` : duration;\n });\n\n /** Current position of the tab-body in the tab-group. Zero means that the tab is visible. */\n private positionIndex: number;\n\n /** Subscription to the directionality change observable. */\n private readonly dirChangeSubscription = Subscription.EMPTY;\n\n private readonly contentElement = viewChild.required('content', { read: ElementRef });\n\n /** The position the last translation went to, see `translateOnRender`. */\n private renderedPosition?: KbqTabBodyPositionState;\n\n /** The position the body is created at, see `translateOnRender`. */\n private initialPosition?: KbqTabBodyPositionState;\n\n private translationRender?: AfterRenderRef;\n\n constructor() {\n const changeDetectorRef = inject(ChangeDetectorRef);\n\n if (this.dir && changeDetectorRef) {\n this.dirChangeSubscription = this.dir.change.subscribe((direction: Direction) => {\n this.computePositionAnimationState(direction);\n changeDetectorRef.markForCheck();\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member; unbound, it leaves what code wrote.\n if (changes['positionInput']) {\n const position = this.positionInput();\n\n if (position !== undefined) this.position = position;\n }\n\n if (changes['originInput']) {\n const origin = this.originInput();\n\n if (origin !== undefined) this.origin = origin;\n }\n }\n\n /**\n * After initialized, check if the content is centered and has an origin. If so, set the\n * special position states that transition the tab from the left or right before centering.\n */\n ngOnInit() {\n if (this.bodyPosition === 'center' && this.origin != null) {\n this.bodyPosition = this.computePositionFromOrigin();\n }\n\n this.initialPosition = this.bodyPosition;\n\n this.translateOnRender();\n }\n\n ngOnDestroy() {\n this.dirChangeSubscription.unsubscribe();\n }\n\n /** The text direction of the containing app. */\n getLayoutDirection(): Direction {\n return this.dir && this.dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /** Whether the provided position state is considered center, regardless of origin. */\n isCenterPosition(position: KbqTabBodyPositionState | string): boolean {\n return position === 'center' || position === 'left-origin-center' || position === 'right-origin-center';\n }\n\n /** Computes the position state that the tab body translates to. */\n private computePositionAnimationState(dir: Direction = this.getLayoutDirection()) {\n if (this.positionIndex < 0) {\n this.bodyPosition = dir === 'ltr' ? 'left' : 'right';\n } else if (this.positionIndex > 0) {\n this.bodyPosition = dir === 'ltr' ? 'right' : 'left';\n } else {\n this.bodyPosition = 'center';\n }\n\n this.translateOnRender();\n }\n\n /**\n * Starts the translation to the current position once it has rendered, and ends it once its transition\n * has: the content is attached as the body starts centering and detached once it has left the center.\n * Positions set within one frame translate once, from the last rendered one. The first frame starts from the\n * position the body was created at when it has moved on from it: the content of a body created centered is\n * attached at once, rendered or not.\n */\n private translateOnRender(): void {\n if (this.translationRender) return;\n\n this.translationRender = afterNextRender(\n () => {\n this.translationRender = undefined;\n\n const to = this.bodyPosition;\n const from = this.renderedPosition ?? (to === this.initialPosition ? undefined : this.initialPosition);\n\n if (from === to) return;\n\n this.renderedPosition = to;\n this.translationStarted(to);\n\n const settled = kbqAnimationsSettled(\n this.contentElement().nativeElement,\n this.injector.get(MAX_ANIMATION_TIMEOUT)\n );\n\n if (!settled) return this.translationDone(from, to);\n\n settled.then(() => {\n if (!this.destroyRef.destroyed) this.translationDone(from, to);\n });\n },\n { injector: this.injector }\n );\n }\n\n private translationStarted(to: KbqTabBodyPositionState): void {\n const isCentering = this.isCenterPosition(to);\n\n this.beforeCentering.emit(isCentering);\n\n if (isCentering) {\n this.onCentering.emit(this.elementRef.nativeElement.clientHeight);\n }\n }\n\n private translationDone(from: KbqTabBodyPositionState | undefined, to: KbqTabBodyPositionState): void {\n // A later translation may have started since, so the current position has the last word.\n if (this.isCenterPosition(to) && this.isCenterPosition(this.bodyPosition)) {\n this.onCentered.emit();\n }\n\n if (from !== undefined && this.isCenterPosition(from) && !this.isCenterPosition(this.bodyPosition)) {\n this.afterLeavingCenter.emit();\n }\n }\n\n /**\n * Computes the position state based on the specified origin position. This is used if the\n * tab is becoming visible immediately after creation.\n */\n private computePositionFromOrigin(): KbqTabBodyPositionState {\n const dir = this.getLayoutDirection();\n\n if ((dir === 'ltr' && this.origin <= 0) || (dir === 'rtl' && this.origin > 0)) {\n return 'left-origin-center';\n }\n\n return 'right-origin-center';\n }\n}\n\n/**\n * The portal host directive for the contents of the tab.\n *\n * @docs-private\n */\n@Directive({\n selector: '[kbqTabBodyHost]'\n})\nexport class KbqTabBodyPortal extends CdkPortalOutlet implements OnInit, OnDestroy {\n private readonly host = inject(KbqTabBody);\n\n /** Subscription to events for when the tab body begins centering. */\n private centeringSub = Subscription.EMPTY;\n /** Subscription to events for when the tab body finishes leaving from center position. */\n private leavingSub = Subscription.EMPTY;\n\n /** Set initial visibility or set up subscription for changing visibility. */\n ngOnInit(): void {\n super.ngOnInit();\n\n this.centeringSub = this.host.beforeCentering\n .pipe(startWith(this.host.isCenterPosition(this.host.bodyPosition)))\n .subscribe((isCentering: boolean) => {\n if (isCentering && !this.hasAttached()) {\n this.attach(this.host.content());\n }\n });\n\n this.leavingSub = this.host.afterLeavingCenter.subscribe(() => {\n this.detach();\n });\n }\n\n /** Clean up centering subscription. */\n ngOnDestroy(): void {\n super.ngOnDestroy();\n\n this.centeringSub.unsubscribe();\n this.leavingSub.unsubscribe();\n }\n}\n","<div\n #content\n kbqScrollbarViewport\n class=\"kbq-tab-body__content kbq-hide-nested-popup\"\n [class]=\"`kbq-tab-body__content_${bodyPosition}`\"\n [class.kbq-animations-disabled]=\"animationsDisabled\"\n [style.--kbq-tab-body-animation-duration]=\"cssAnimationDuration()\"\n>\n <ng-template kbqTabBodyHost />\n</div>\n","import { Directive, TemplateRef, inject } from '@angular/core';\n\n/** Decorates the `ng-template` tags and reads out the template from it. */\n@Directive({\n selector: '[kbqTabContent]'\n})\nexport class KbqTabContent {\n // TODO: the library reads the template with `{ read: TemplateRef }`; kept as public API at the DS-2196 review.\n template = inject<TemplateRef<any>>(TemplateRef);\n}\n","import {\n AfterViewInit,\n booleanAttribute,\n contentChild,\n Directive,\n ElementRef,\n inject,\n input,\n OnChanges,\n Renderer2,\n SimpleChanges\n} from '@angular/core';\nimport { KbqTab } from './tab.component';\n\n/**\n * Used in the `kbq-tab-group` view to display tab labels.\n *\n * @docs-private\n */\n@Directive({\n selector: '[kbqTabLabelWrapper]',\n host: {\n '[class.kbq-disabled]': 'disabled',\n // A bare `disabled` attribute is only defined for form controls and is read by no assistive\n // technology; the CSS hook is `.kbq-disabled`.\n '[attr.aria-disabled]': 'disabled'\n }\n})\nexport class KbqTabLabelWrapper implements OnChanges, AfterViewInit {\n elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private renderer = inject(Renderer2);\n\n private readonly labelContentQuery = contentChild<ElementRef<HTMLElement>>('labelContent');\n\n /** The element of the label content, measured to tell whether the label overflows. */\n get labelContent(): ElementRef<HTMLElement> {\n return this.labelContentQuery()!;\n }\n\n /** @docs-private */\n readonly tabInput = input<KbqTab | undefined>(undefined, { alias: 'tab' });\n\n /** @docs-private */\n readonly disabledInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'disabled',\n transform: booleanAttribute\n });\n\n tab: KbqTab;\n\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(value: boolean) {\n if (value !== this.disabled) {\n this._disabled = value;\n }\n }\n\n private _disabled: boolean = false;\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member; unbound, it leaves what code wrote.\n if (changes['tabInput']) {\n const tab = this.tabInput();\n\n if (tab !== undefined) this.tab = tab;\n }\n\n if (changes['disabledInput']) {\n const disabled = this.disabledInput();\n\n if (disabled !== undefined) this.disabled = disabled;\n }\n }\n\n ngAfterViewInit(): void {\n this.addClassModifierForIcons(Array.from(this.elementRef.nativeElement.querySelectorAll('.kbq-icon')));\n }\n\n /**\n * Sets focus on the wrapper element.\n *\n * `preventScroll: true`: `FocusKeyManager.setActiveItem` calls this itself, right after (and\n * unconditionally on) the `change` emission that runs `KbqPaginatedTabHeader.setTabFocus` — so\n * without the guard here too, that call's own `preventScroll: true` is immediately undone by\n * this one, and an overflowing header double-jumps (native scroll-into-view, then the\n * paginator-aware `scrollCorrection`) on every arrow-key press.\n */\n focus(): void {\n this.elementRef.nativeElement.focus({ preventScroll: true });\n }\n\n // TODO: nothing in the library uses it; kept as public API at the DS-2196 review. Document or deprecate it.\n getOffsetLeft(): number {\n return this.elementRef.nativeElement.offsetLeft;\n }\n\n getOffsetWidth(): number {\n return this.elementRef.nativeElement.offsetWidth;\n }\n\n checkOverflow() {\n this.tab.overflowTooltipTitle = this.isOverflown() ? this.getInnerText() : '';\n }\n\n isOverflown() {\n return this.labelContent.nativeElement.scrollWidth > this.labelContent.nativeElement.clientWidth;\n }\n\n getInnerText(): string {\n // `textContent` rather than `innerText`, which jsdom does not implement. Trimmed, because it keeps the\n // whitespace the template puts around the label text.\n return this.labelContent.nativeElement.textContent?.trim() || '';\n }\n\n private addClassModifierForIcons(icons: HTMLElement[]) {\n const twoIcons = 2;\n const [firstIconElement, secondIconElement] = icons;\n\n if (icons.length === 1) {\n const COMMENT_NODE = 8;\n\n if (firstIconElement.nextSibling && firstIconElement.nextSibling.nodeType !== COMMENT_NODE) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_left');\n this.renderer.addClass(this.elementRef.nativeElement, 'kbq-tab-label_with-icon-left');\n }\n\n if (firstIconElement.previousSibling && firstIconElement.previousSibling.nodeType !== COMMENT_NODE) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_right');\n this.renderer.addClass(this.elementRef.nativeElement, 'kbq-tab-label_with-icon-right');\n }\n } else if (icons.length === twoIcons) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_left');\n this.renderer.addClass(secondIconElement, 'kbq-icon_right');\n this.renderer.addClass(this.elementRef.nativeElement, 'kbq-tab-label_with-icon-left');\n this.renderer.addClass(this.elementRef.nativeElement, 'kbq-tab-label_with-icon-right');\n }\n }\n}\n","import { CdkObserveContent } from '@angular/cdk/observers';\nimport { Platform } from '@angular/cdk/platform';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChildren,\n ElementRef,\n inject,\n input,\n QueryList,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { isUndefined, kbqQueryListFrom } from '@koobiq/components/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqScrollbarViewport } from '@koobiq/components/scrollbar';\nimport { KbqPaginatedTabHeader } from './paginated-tab-header';\nimport { KbqTabLabelWrapper } from './tab-label-wrapper.directive';\n\n/** Corresponds to `--kbq-tabs-size-tab-item-padding-horizontal` on text/icon+text tabs. */\nconst TAB_PADDING = 12;\n\n/**\n * The header of the tab group which displays a list of all the tabs in the tab group.\n * When the tabs list's width exceeds the width of the header container,\n * then arrows will be displayed to allow the user to scroll\n * left and right across the header.\n *\n * @docs-private\n */\n@Component({\n selector: 'kbq-tab-header',\n imports: [KbqIconModule, CdkObserveContent, KbqScrollbarViewport],\n templateUrl: './tab-header.html',\n styleUrl: './tab-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-tab-header',\n '[class.kbq-tab-header_vertical]': 'vertical',\n '[class.kbq-tab-header_underlined]': 'underlined()',\n '[class.kbq-tab-header__pagination-controls_enabled]': 'showPaginationControls',\n '[class.kbq-tab-header_rtl]': \"getLayoutDirection() == 'rtl'\"\n },\n outputs: ['selectFocusedIndex', 'indexFocused']\n})\nexport class KbqTabHeader extends KbqPaginatedTabHeader {\n /** Whether the tabs are underlined. */\n readonly underlined = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n private readonly itemsQuery = contentChildren(KbqTabLabelWrapper, { descendants: false });\n private readonly itemsList = kbqQueryListFrom(this.itemsQuery);\n private readonly tabListContainerQuery = viewChild.required<ElementRef>('tabListContainer');\n private readonly scrollbarViewportQuery = viewChild.required('tabListContainer', { read: KbqScrollbarViewport });\n private readonly tabListQuery = viewChild.required<ElementRef>('tabList');\n private readonly nextPaginatorQuery = viewChild.required<ElementRef<HTMLElement>>('nextPaginator');\n private readonly previousPaginatorQuery = viewChild.required<ElementRef<HTMLElement>>('previousPaginator');\n\n /** The label wrappers of the tabs. */\n get items(): QueryList<KbqTabLabelWrapper> {\n return this.itemsList();\n }\n\n /** The scroll container of the tab labels. */\n get tabListContainer(): ElementRef {\n return this.tabListContainerQuery();\n }\n\n protected get scrollbarViewport(): KbqScrollbarViewport {\n return this.scrollbarViewportQuery();\n }\n\n /** The element that holds the tab labels. */\n get tabList(): ElementRef {\n return this.tabListQuery();\n }\n\n /** The pagination arrow towards the end of the tab list. */\n get nextPaginator(): ElementRef<HTMLElement> {\n return this.nextPaginatorQuery();\n }\n\n /** The pagination arrow towards the beginning of the tab list. */\n get previousPaginator(): ElementRef<HTMLElement> {\n return this.previousPaginatorQuery();\n }\n\n private readonly isBrowser = inject(Platform).isBrowser;\n\n /** The underline as the last check of the tab group measured it, see `ngAfterContentChecked`. */\n private checkedUnderline?: string;\n\n protected get activeTabOffsetWidth(): number | undefined {\n if (!this.isBrowser) return undefined;\n\n const item = this.items.get(this.selectedIndex);\n const width = item?.elementRef?.nativeElement?.offsetWidth;\n\n if (!width || item?.tab?.iconOnlyLabel) return width;\n\n return width - TAB_PADDING * 2;\n }\n\n protected get activeTabOffsetLeft(): number | undefined {\n if (!this.isBrowser) return undefined;\n\n const item = this.items.get(this.selectedIndex);\n const left = item?.elementRef?.nativeElement?.offsetLeft;\n\n if (isUndefined(left) || item?.tab?.iconOnlyLabel) return left;\n\n return left + TAB_PADDING;\n }\n\n protected get activeTabDisabled(): boolean {\n return !!this.items.get(this.selectedIndex)?.disabled;\n }\n\n override ngAfterContentChecked(): void {\n super.ngAfterContentChecked();\n\n // The labels belong to the view of the tab group, so a change of their size or state gives this view no\n // notice: the underline is measured again whenever the group is checked, as it was before OnPush.\n const underline = `${this.activeTabOffsetLeft}:${this.activeTabOffsetWidth}:${this.activeTabDisabled}`;\n\n if (underline !== this.checkedUnderline) {\n this.checkedUnderline = underline;\n this.changeDetectorRef.markForCheck();\n }\n }\n\n protected itemSelected(event: KeyboardEvent): void {\n event.preventDefault();\n }\n}\n","<div\n #previousPaginator\n class=\"kbq-tab-header__pagination kbq-tab-header__pagination_before\"\n [class.kbq-disabled]=\"disableScrollBefore\"\n (click)=\"handlePaginatorClick('before')\"\n (mousedown)=\"handlePaginatorPress('before', $event)\"\n (touchend)=\"stopInterval()\"\n>\n <i kbq-icon=\"kbq-chevron-left_16\" color=\"contrast\"></i>\n</div>\n\n<div\n #tabListContainer\n kbqScrollbarViewport\n class=\"kbq-tab-header__container kbq-tab-header__scroll-container\"\n [kbqScrollbarMode]=\"scrollbarMode\"\n [class.kbq-tab-header__scroll-container_overflow-before]=\"overflowBefore\"\n [class.kbq-tab-header__scroll-container_overflow-after]=\"overflowAfter\"\n (keydown)=\"handleKeydown($event)\"\n>\n <div #tabList class=\"kbq-tab-list\" (cdkObserveContent)=\"onContentChanges()\">\n <div class=\"kbq-tab-list__content\" role=\"tablist\" [attr.aria-orientation]=\"vertical ? 'vertical' : null\">\n <ng-content />\n <div\n aria-hidden=\"true\"\n class=\"kbq-tab-list__active-tab-underline\"\n [class.kbq-animations-disabled]=\"animationsDisabled\"\n [class.kbq-disabled]=\"activeTabDisabled\"\n [style.left.px]=\"activeTabOffsetLeft\"\n [style.width.px]=\"activeTabOffsetWidth\"\n ></div>\n </div>\n </div>\n</div>\n\n<div\n #nextPaginator\n class=\"kbq-tab-header__pagination kbq-tab-header__pagination_after\"\n [class.kbq-disabled]=\"disableScrollAfter\"\n (click)=\"handlePaginatorClick('after')\"\n (mousedown)=\"handlePaginatorPress('after', $event)\"\n (touchend)=\"stopInterval()\"\n>\n <i kbq-icon=\"kbq-chevron-right_16\" color=\"contrast\"></i>\n</div>\n","import { CdkPortal } from '@angular/cdk/portal';\nimport { booleanAttribute, Directive, InjectionToken, input } from '@angular/core';\n\nexport const KBQ_TAB_LABEL = new InjectionToken<KbqTabLabel>('KbqTabLabel');\n\n/** Used to flag tab labels for use with the portal directive */\n@Directive({\n selector: '[kbq-tab-label], [kbqTabLabel]',\n providers: [{ provide: KBQ_TAB_LABEL, useExisting: KbqTabLabel }]\n})\nexport class KbqTabLabel extends CdkPortal {\n /** Whether the tab contains only an icon without a label. */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n}\n","import { TemplatePortal } from '@angular/cdk/portal';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n inject,\n input,\n OnChanges,\n OnDestroy,\n OnInit,\n signal,\n SimpleChanges,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport {\n KBQ_CUSTOM_SCROLL_STRATEGY_PROVIDER,\n KBQ_SELECT_SCROLL_STRATEGY,\n KbqPopUpPlacementValues,\n PopUpPlacements\n} from '@koobiq/components/core';\nimport { KBQ_DROPDOWN_SCROLL_STRATEGY } from '@koobiq/components/dropdown';\nimport { Subject } from 'rxjs';\nimport { KbqTabContent } from './tab-content.directive';\nimport { KBQ_TAB_LABEL, KbqTabLabel } from './tab-label.directive';\n\n@Component({\n selector: 'kbq-tab',\n // Create a template for the content of the <kbq-tab> so that we can grab a reference to this\n // TemplateRef and use it in a Portal to render the tab content in the appropriate place in the\n // tab-group.\n template: '<ng-template><ng-content /></ng-template>',\n providers: [\n ...[KBQ_SELECT_SCROLL_STRATEGY, KBQ_DROPDOWN_SCROLL_STRATEGY].map((token) =>\n KBQ_CUSTOM_SCROLL_STRATEGY_PROVIDER(token, (overlay) => () => overlay.scrollStrategies.close())\n )\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'kbqTab'\n})\nexport class KbqTab implements OnInit, OnChanges, OnDestroy {\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n /** @docs-private */\n get content(): TemplatePortal | null {\n return this.contentPortal;\n }\n\n private readonly templateLabelQuery = contentChild(KBQ_TAB_LABEL);\n\n /** The label template of the tab: the `kbqTabLabel` in its content, or else the one assigned in code. */\n get templateLabel(): KbqTabLabel {\n return this.templateLabelQuery() ?? this._templateLabel;\n }\n\n set templateLabel(value: KbqTabLabel) {\n this.setTemplateLabelInput(value);\n }\n\n private _templateLabel: KbqTabLabel;\n\n /**\n * Template provided in the tab content that will be used if present, used to enable lazy-loading\n */\n readonly explicitContent = contentChild(KbqTabContent, { read: TemplateRef });\n\n /** Template inside the KbqTab view that contains an `<ng-content>`. */\n readonly implicitContent = viewChild.required(TemplateRef);\n\n /** @docs-private */\n readonly tooltipTitleInput = input<string | undefined>(undefined, { alias: 'tooltipTitle' });\n\n /** @docs-private */\n readonly disabledInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'disabled',\n transform: booleanAttribute\n });\n\n get tooltipTitle(): string {\n return this.overflowTooltipTitle + this._tooltipTitle;\n }\n\n set tooltipTitle(value: string) {\n this._tooltipTitle = value;\n }\n\n private _tooltipTitle = '';\n\n /** Whether the tab is disabled: it cannot be selected and has no interactive states. */\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(value: boolean) {\n if (value !== this.disabled) {\n this._disabled = value;\n }\n }\n\n private _disabled: boolean = false;\n\n /** Placement of the tooltip shown for a truncated or empty label. */\n readonly tooltipPlacement = input<KbqPopUpPlacementValues>(PopUpPlacements.Right);\n\n /** Plain text label for the tab, used when there is no template label. */\n readonly textLabel = input('', { alias: 'label' });\n\n readonly empty = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n readonly tabId = input<string>(undefined!);\n\n /** Whether the tab label contains only an icon (no text). */\n get iconOnlyLabel(): boolean {\n return this.templateLabel?.iconOnly() ?? false;\n }\n\n /** Emits whenever the internal state of the tab changes. */\n readonly stateChanges = new Subject<void>();\n\n /**\n * The relatively indexed position where 0 represents the center, negative is left, and positive\n * represents the right.\n */\n position: number | null = null;\n\n /**\n * The initial relatively index origin of the tab if it was created and selected after there\n * was already a selected tab. Provides context of what position the tab should originate from.\n */\n origin: number | null = null;\n\n /** Whether the tab is currently active. A template that reads it is updated when it changes. */\n get isActive(): boolean {\n return this.activeState();\n }\n\n set isActive(value: boolean) {\n this.activeState.set(value);\n }\n\n private readonly activeState = signal(false);\n\n get isOverflown(): boolean {\n return !!this._overflowTooltipTitle;\n }\n\n get overflowTooltipTitle(): string {\n if (this.isOverflown) {\n return `${this._overflowTooltipTitle}\\n`;\n }\n\n return '';\n }\n\n set overflowTooltipTitle(value: string) {\n this._overflowTooltipTitle = value;\n }\n\n private _overflowTooltipTitle = '';\n\n /** Portal that will be the hosted content of the tab */\n private contentPortal: TemplatePortal | null = null;\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member, except that `undefined` resets a member\n // typed without it to its default; unbound, it leaves what code wrote.\n if (changes['tooltipTitleInput']) {\n this.tooltipTitle = this.tooltipTitleInput() ?? '';\n }\n\n if (changes['disabledInput']) {\n const disabled = this.disabledInput();\n\n if (disabled !== undefined) this.disabled = disabled;\n }\n\n if (changes['textLabel'] || changes['disabledInput'] || changes['tooltipTitleInput']) {\n this.stateChanges.next();\n }\n }\n\n ngOnInit(): void {\n this.contentPortal = new TemplatePortal(\n this.explicitContent() || this.implicitContent(),\n this.viewContainerRef\n );\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n\n /**\n * Keeps a label template assigned in code, used while the content of the tab has none. A falsy value is\n * ignored.\n *\n * @docs-private\n */\n protected setTemplateLabelInput(value: KbqTabLabel) {\n if (value) {\n this._templateLabel = value;\n }\n }\n}\n","import { CdkMonitorFocus } from '@angular/cdk/a11y';\nimport { SharedResizeObserver } from '@angular/cdk/observers/private';\nimport { Platform } from '@angular/cdk/platform';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport {\n AfterContentChecked,\n AfterContentInit,\n afterNextRender,\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n contentChildren,\n DestroyRef,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n InjectionToken,\n input,\n isDevMode,\n OnChanges,\n OnDestroy,\n output,\n QueryList,\n signal,\n SimpleChanges,\n untracked,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n KBQ_PARENT_ANIMATION_COMPONENT,\n kbqOptionalNumberAttribute,\n kbqQueryListFrom,\n KbqStateSaving\n} from '@koobiq/components/core';\nimport { KbqTooltipTrigger } from '@koobiq/components/tooltip';\nimport { merge, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { KbqTabBody } from './tab-body.component';\nimport { KbqTabHeader } from './tab-header.component';\nimport { KbqTabLabelWrapper } from './tab-label-wrapper.directive';\nimport { KbqTab } from './tab.component';\n\n@Directive({\n selector:\n 'kbq-tab-group[kbq-align-tabs-center], [kbq-tab-nav-bar][kbq-align-tabs-center], [kbqTabNavBar][kbq-align-tabs-center]',\n host: { class: 'kbq-tab-group_align-labels-center' }\n})\nexport class KbqAlignTabsCenterCssStyler {}\n\n@Directive({\n selector:\n 'kbq-tab-group[kbq-align-tabs-end], [kbq-tab-nav-bar][kbq-align-tabs-end], [kbqTabNavBar][kbq-align-tabs-end]',\n host: { class: 'kbq-tab-group_align-labels-end' }\n})\nexport class KbqAlignTabsEndCssStyler {}\n\n@Directive({\n selector: 'kbq-tab-group[kbq-stretch-tabs], [kbq-tab-nav-bar][kbq-stretch-tabs], [kbqTabNavBar][kbq-stretch-tabs]',\n host: { class: 'kbq-tab-group_stretch-labels' }\n})\nexport class KbqStretchTabsCssStyler {}\n\n/**\n * @deprecated No-op. The vertical layout class is bound from `KbqTabGroup`/`KbqTabNavBar` themselves,\n * so it follows the `vertical` value instead of merely the presence of the attribute. Will be removed\n * in a future major version — stop importing it.\n */\n@Directive({\n selector: 'kbq-tab-group[vertical], [kbq-tab-nav-bar][vertical], [kbqTabNavBar][vertical]'\n})\nexport class KbqVerticalTabsCssStyler {}\n\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n\n/** Debounce applied to header resizes before the tab labels are re-measured for overflow. */\nconst RESIZE_DEBOUNCE_INTERVAL = 100;\n\n/** A simple change event emitted on focus or selection changes. */\nexport class KbqTabChangeEvent {\n /** Index of the currently-selected tab. */\n index: number;\n /** Reference to the currently-selected tab. */\n tab: KbqTab;\n}\n\n/** Possible positions for the tab header. */\nexport type KbqTabHeaderPosition = 'above' | 'below';\n\n/** Object that can be used to configure the default options for the tabs module. */\nexport interface KbqTabsConfig {\n /** Duration for the tab animation. Must be a valid CSS value (e.g. 600ms). */\n animationDuration?: string;\n}\n\n/** Injection token that can be used to provide the default options the tabs module. */\nexport const KBQ_TABS_CONFIG = new InjectionToken<KbqTabsConfig>('KBQ_TABS_CONFIG');\n\nexport type KbqTabSelectBy = string | number | ((tabs: KbqTab[]) => KbqTab | null);\n\n/**\n * The persisted state of a tab group — which tab was selected.\n *\n * Both are stored: `tabId` is the only identifier that survives a reordering, and `index` is all there is\n * when the tabs carry no `tabId`.\n */\nexport interface KbqTabsState {\n tabId: string | null;\n index: number;\n}\n\n/**\n * Coerces a raw persisted payload into a `KbqTabsState`, returning `null` for anything unrecognizable.\n *\n * Web storage is origin-wide and user-writable, so a payload is never trusted — without this, an entry\n * such as `{\"index\": \"first\"}` would reach `clampTabIndex` and select nothing.\n */\nconst normalizeTabsState = (parsed: unknown): KbqTabsState | null => {\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return null;\n\n const { tabId, index } = parsed as Partial<KbqTabsState>;\n\n if (typeof index !== 'number' || !Number.isInteger(index) || index < 0) return null;\n\n return { tabId: typeof tabId === 'string' ? tabId : null, index };\n};\n\n/**\n * Tab-group component. Supports basic tab pairs (label + content) and includes keyboard navigation.\n */\n@Component({\n selector: 'kbq-tab-group',\n imports: [KbqTabHeader, CdkMonitorFocus, KbqTabLabelWrapper, KbqTooltipTrigger, CdkPortalOutlet, KbqTabBody],\n templateUrl: './tab-group.html',\n styleUrls: ['./tab-group.scss', './tabs-tokens.scss'],\n providers: [{ provide: KBQ_PARENT_ANIMATION_COMPONENT, useExisting: forwardRef(() => KbqTabGroup) }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-tab-group',\n '[class.kbq-tab-group_filled]': '!transparent()',\n '[class.kbq-tab-group_transparent]': 'transparent()',\n '[class.kbq-tab-group_on-background]': '!onSurface()',\n '[class.kbq-tab-group_on-surface]': 'onSurface()',\n '[class.kbq-tab-group_dynamic-height]': 'dynamicHeight()',\n '[class.kbq-tab-group_vertical]': 'vertical()',\n '[class.kbq-tab-group_inverted-header]': 'headerPosition === \"below\"'\n },\n // `useStateSaving` and `stateSavingKey` are the directive's inputs, surfaced on the tab group.\n hostDirectives: [\n { directive: KbqStateSaving, inputs: ['useStateSaving', 'stateSavingKey'] }\n ],\n exportAs: 'kbqTabGroup'\n})\nexport class KbqTabGroup implements OnChanges, AfterContentInit, AfterViewInit, AfterContentChecked, OnDestroy {\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly resizeObserver = inject(SharedResizeObserver);\n private readonly platform = inject(Platform);\n\n /**\n * Persistence of the selected tab, applied as a host directive. `useStateSaving` and `stateSavingKey`\n * are its inputs, forwarded onto the tab group.\n */\n private readonly stateSaving = inject(KbqStateSaving);\n\n private readonly tabsQuery = contentChildren(KbqTab);\n private readonly tabsList = kbqQueryListFrom(this.tabsQuery);\n\n /** The tabs of the group. */\n get tabs(): QueryList<KbqTab> {\n return this.tabsList();\n }\n\n readonly tabBodyWrapper = viewChild.required<ElementRef>('tabBodyWrapper');\n\n readonly tabHeader = viewChild.required<KbqTabHeader>('tabHeader');\n\n /** Whether the tab strip background should be transparent. */\n readonly transparent = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Whether the group is rendered on a surface rather than on the page background. */\n readonly onSurface = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Whether the selected tab is marked with an underline instead of a filled background. */\n readonly underlined = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Whether the tab strip is laid out vertically, alongside the content instead of above it. */\n readonly vertical = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Whether the tab group should grow to the size of the active tab. */\n readonly dynamicHeight = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** @docs-private */\n readonly selectedIndexInput = input<number | undefined, number | string | null | undefined>(undefined, {\n alias: 'selectedIndex',\n transform: kbqOptionalNumberAttribute\n });\n\n /** @docs-private */\n readonly activeTabInput = input<KbqTabSelectBy | null | undefined>(undefined, { alias: 'activeTab' });\n\n /** @docs-private */\n readonly headerPositionInput = input<KbqTabHeaderPosition | undefined>(undefined, { alias: 'headerPosition' });\n\n /** @docs-private */\n readonly animationDurationInput = input<string | undefined>(undefined, { alias: 'animationDuration' });\n\n /** The index of the active tab. */\n get selectedIndex(): number {\n return this.selectedIndexState()!;\n }\n\n set selectedIndex(value: number) {\n this.activeTab = value;\n }\n\n private readonly selectedIndexState = signal<number | undefined>(undefined);\n\n get activeTab(): KbqTab | null {\n switch (typeof this.attributeToSelectBy) {\n case 'number':\n return this.tabs.get(this.clampTabIndex(this.attributeToSelectBy)) || null;\n case 'string':\n return (\n this.tabs.toArray().find(({ tabId: tabIdInput }) => {\n const tabId = tabIdInput();\n\n return tabId === this.attributeToSelectBy;\n }) ||\n this.tabs.get(0) ||\n null\n );\n case 'function':\n return this.attributeToSelectBy(this.tabs.toArray());\n default:\n return this.getDefaultTab();\n }\n }\n\n set activeTab(value: KbqTabSelectBy | null) {\n // `selectedIndex` assigns through here too, so this one flag covers both inputs.\n this.attributeWritten = true;\n\n this.attributeToSelectBy = value;\n }\n\n /** Position of the tab header. */\n headerPosition: KbqTabHeaderPosition = 'above';\n\n /** Duration for the tab animation. Must be a valid CSS value (e.g. 600ms). */\n animationDuration: string;\n\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\n readonly selectedIndexChange = output<number>();\n\n /** Event emitted when the tab selection has changed. */\n readonly activeTabChange = output<string | number | KbqTab>();\n\n /** Event emitted when focus has changed within a tab group. */\n readonly focusChange = output<KbqTabChangeEvent>();\n\n /** Event emitted when the body animation has completed */\n readonly animationDone = output<void>();\n\n /** Event emitted when the tab selection has changed. */\n readonly selectedTabChange = output<KbqTabChangeEvent>();\n\n private attributeToSelectBy: KbqTabSelectBy | null = null;\n\n /**\n * Whether anything has assigned `activeTab` or `selectedIndex`. Snapshotted while initializing, where\n * only an input binding can have done so, and read from then on as \"the application drives the\n * selection\" — which suppresses persistence.\n */\n private attributeWritten = false;\n\n private controlled = false;\n\n /** Whether the dev-mode warning about a tab with no `tabId` has already been logged. */\n private warnedAboutTabId = false;\n\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\n private tabBodyWrapperHeight = 0;\n\n /** Subscription to tabs being added/removed. */\n private tabsSubscription = Subscription.EMPTY;\n\n /** Subscription to changes in the tab labels. */\n private tabLabelSubscription = Subscription.EMPTY;\n\n private readonly groupId: number;\n\n private readonly defaultAnimationDuration =\n inject<KbqTabsConfig>(KBQ_TABS_CONFIG, { optional: true })?.animationDuration || '0ms';\n\n constructor() {\n this.groupId = nextId++;\n this.animationDuration = this.defaultAnimationDuration;\n\n // The state lives under the new key now, so restore from it.\n this.stateSaving.keyChanges.subscribe(() => this.applySavedState());\n\n // `checkOverflow` writes `tab.overflowTooltipTitle`, which the same view reads through\n // `[kbqTooltipDisabled]`. Deferring it past the render keeps the write out of the checked cycle.\n afterNextRender(() => {\n this.checkOverflow();\n this.changeDetectorRef.markForCheck();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member, except that `undefined` resets a member\n // typed without it to its default; unbound, it leaves what code wrote.\n // Assigned through `activeTab`, because the `selectedIndex` setter takes no `null` — the default, which selects\n // the first enabled tab.\n if (changes['selectedIndexInput']) this.activeTab = this.selectedIndexInput() ?? null;\n\n // A bound `undefined` is handed over too: binding `activeTab` at all lets the application drive the\n // selection, which turns the state saving off.\n if (changes['activeTabInput']) {\n this.activeTab = this.activeTabInput() ?? null;\n }\n\n if (changes['headerPositionInput']) {\n this.headerPosition = this.headerPositionInput() ?? 'above';\n }\n\n if (changes['animationDurationInput']) {\n this.animationDuration = this.animationDurationInput() ?? this.defaultAnimationDuration;\n }\n }\n\n ngAfterContentInit() {\n this.subscribeToTabLabels();\n\n this.restoreState();\n\n // Subscribe to changes in the amount of tabs, in order to be\n // able to re-render the content as new tabs are added or removed.\n this.tabsSubscription = this.tabs.changes.subscribe(() => {\n const indexToSelect = this.getTabIndexToSelect();\n\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\n // explicit change that selects a different tab.\n if (indexToSelect === this.selectedIndexState()) {\n const tabs = this.tabs.toArray();\n\n for (let i = 0; i < tabs.length; i++) {\n if (tabs[i].isActive) {\n // Assign both to the `activeTab` and the selected index so we don't fire a changed\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\n // adding a tab within the `selectedIndexChange` event.\n this.selectedIndexState.set(i);\n this.onSelectFocusedIndex(i);\n break;\n }\n }\n }\n\n this.subscribeToTabLabels();\n // Also marks the ancestors, whose check runs `ngAfterContentChecked` and positions the tabs.\n this.changeDetectorRef.markForCheck();\n });\n }\n\n /**\n * After the content is checked, this component knows what tabs have been defined\n * and what the selected index should be. This is where we can know exactly what position\n * each tab should be in according to the new selected index, and additionally we know how\n * a new selected tab should transition in (from the left or right).\n */\n ngAfterContentChecked() {\n // Brings `tabs` up to date first, so that its `changes` subscribers, which keep the selected tab when tabs are\n // added or removed, run before the selection is computed.\n this.tabsList();\n\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\n // the amount of tabs changes before the actual change detection runs.\n const indexToSelect = this.getTabIndexToSelect();\n\n // If there is a change in selected index, emit a change event. Should not trigger if\n // the selected index has not yet been initialized.\n if (this.selectedIndexState() !== indexToSelect) {\n const isFirstRun = this.selectedIndexState() == null;\n\n if (!isFirstRun) {\n this.selectedTabChange.emit(this.createChangeEvent(indexToSelect));\n }\n\n // Changing these values after change detection has run\n // since the checked content may contain references to them.\n Promise.resolve().then(() => {\n this.tabs.forEach((tab, index) => (tab.isActive = index === indexToSelect));\n\n if (!isFirstRun) {\n const tabToSelect = this.activeTab;\n\n this.selectedIndexChange.emit(indexToSelect);\n this.activeTabChange.emit(\n this.attributeToSelectBy && typeof this.attributeToSelectBy === 'function' && tabToSelect\n ? tabToSelect\n : (this.attributeToSelectBy as string | number)\n );\n }\n });\n }\n\n const selectedIndex = this.selectedIndexState();\n\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\n this.tabs.forEach((tab: KbqTab, index: number) => {\n tab.position = index - indexToSelect;\n\n // If there is already a selected tab, then set up an origin for the next selected tab\n // if it doesn't have one already.\n\n if (selectedIndex != null && tab.position === 0 && !tab.origin) {\n tab.origin = indexToSelect - selectedIndex;\n }\n });\n\n this.selectedIndexState.set(indexToSelect);\n }\n\n ngAfterViewInit(): void {\n if (!this.platform.isBrowser) return;\n\n // An element observer also catches container resizes, which no window resize event reports.\n this.resizeObserver\n .observe(this.tabHeader().elementRef.nativeElement)\n .pipe(debounceTime(RESIZE_DEBOUNCE_INTERVAL), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n // Read the current value: only vertical labels are truncated, and `vertical` can change.\n if (!this.vertical()) return;\n\n this.checkOverflow();\n this.changeDetectorRef.markForCheck();\n });\n }\n\n ngOnDestroy() {\n this.tabsSubscription.unsubscribe();\n this.tabLabelSubscription.unsubscribe();\n }\n\n focusChanged(index: number) {\n this.focusChange.emit(this.createChangeEvent(index));\n }\n\n /** Returns a unique id for each tab label element */\n getTabLabelId(i: number): string {\n return `kbq-tab-label-${this.groupId}-${i}`;\n }\n\n /** Returns a unique id for each tab content element */\n getTabContentId(i: number): string {\n return `kbq-tab-content-${this.groupId}-${i}`;\n }\n\n /**\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\n * height property is true.\n */\n setTabBodyWrapperHeight(tabHeight: number): void {\n if (!this.dynamicHeight() || !this.tabBodyWrapperHeight) {\n return;\n }\n\n const wrapper: HTMLElement = this.tabBodyWrapper().nativeElement;\n\n wrapper.style.height = `${this.tabBodyWrapperHeight}px`;\n\n // This conditional forces the browser to paint the height so that\n // the animation to the new height can have an origin.\n if (this.tabBodyWrapper().nativeElement.offsetHeight) {\n wrapper.style.height = `${tabHeight}px`;\n }\n }\n\n /** Removes the height of the tab body wrapper. */\n removeTabBodyWrapperHeight(): void {\n this.tabBodyWrapperHeight = this.tabBodyWrapper().nativeElement.clientHeight;\n this.tabBodyWrapper().nativeElement.style.height = '';\n this.animationDone.emit();\n }\n\n /** Handle click events, setting new selected index if appropriate. */\n handleClick(tab: KbqTab, tabHeader: KbqTabHeader, index: number) {\n // Untracked, as `onSelectFocusedIndex()`, `saveState()` and `clearSavedState()`: called from a consumer's\n // `effect()`, the state read on the way — the tabs and their inputs, the selection, the state saving inputs —\n // would make the effect run again whenever it changes.\n untracked(() => {\n if (tab.disabled) {\n return;\n }\n\n this.onSelectFocusedIndex(index);\n tabHeader.focusIndex = index;\n });\n }\n\n /**\n * Retrieves the tabindex for the tab. The single `0` follows the header's focus position rather\n * than the selection, so that a disabled selected tab cannot take the whole strip out of the tab\n * order — a disabled tab is `-1`, never absent, so it stays a roving-tabindex participant.\n */\n getTabIndex(tab: KbqTab, tabHeader: KbqTabHeader, index: number): number {\n if (tab.disabled) {\n return -1;\n }\n\n return this.getRovingTabIndex(tabHeader) === index ? 0 : -1;\n }\n\n onSelectFocusedIndex($event: number): void {\n untracked(() => {\n if (typeof this.attributeToSelectBy === 'string') {\n this.activeTab = this.tabs.get($event)?.tabId() || null;\n } else {\n this.activeTab = $event;\n }\n\n this.saveState();\n });\n }\n\n /**\n * Persists which tab is selected.\n *\n * Called for every selection a user makes. Both the tab's `tabId` and its position are stored: the\n * `tabId` is the only one that survives the tabs being reordered, and the position is all there is\n * when the tabs carry none.\n */\n saveState(): void {\n untracked(() => {\n if (!this.persists) return;\n\n this.stateSaving.write(this.snapshot());\n });\n }\n\n /**\n * Removes the state persisted for this tab group.\n *\n * Persistence itself stays on — the next selection is written again. Unset `useStateSaving` to stop\n * it.\n */\n clearSavedState(): void {\n untracked(() => this.stateSaving.clear());\n }\n\n /**\n * Whether state is currently persisted for this tab group — restored on init, or written since.\n * Always `false` while `useStateSaving` is unset, and `false` again after `clearSavedState()`.\n */\n get hasSavedState(): boolean {\n return this.stateSaving.state != null;\n }\n\n /** Whether this tab group reads and writes its selection at all. */\n private get persists(): boolean {\n // A group that is not in the document has no stable key — the default resolver derives one from\n // the path to `<body>` — which is the ordinary state of one projected into an overlay.\n return this.stateSaving.useStateSaving() && !this.controlled && !!this.stateSaving.host?.isConnected;\n }\n\n /** Restores the persisted selection, unless the application drives it. */\n private restoreState(): void {\n // Only an input binding can have assigned by now: `activeTab` needs a view query to reach, and a\n // click needs a rendered header. Snapshotted here rather than in `applySavedState()`, which runs\n // again after a key change — by then a click has assigned too, and would read as an application.\n this.controlled = this.attributeWritten;\n\n this.applySavedState();\n }\n\n /** Reads the persisted selection and applies it. Runs while initializing, and again on a key change. */\n private applySavedState(): void {\n if (!this.persists) return;\n\n const savedState = this.stateSaving.read(normalizeTabsState);\n\n if (!savedState) return;\n\n const tabs = this.tabs.toArray();\n const byId = savedState.tabId === null ? -1 : tabs.findIndex((tab) => tab.tabId() === savedState.tabId);\n\n // The id wins wherever it still names a tab, so a reordering does not select the wrong one. Its\n // position is the fallback, and a payload naming neither is dropped rather than clamped — the\n // group then keeps whatever it would have selected on its own.\n if (byId < 0 && savedState.index >= tabs.length) return;\n\n this.stateSaving.applying(() => {\n this.activeTab = byId < 0 ? savedState.index : savedState.tabId;\n });\n }\n\n /** The whole selection, by id and by position. */\n private snapshot(): KbqTabsState {\n const tabs = this.tabs?.toArray() ?? [];\n const active = this.activeTab;\n const index = active ? tabs.indexOf(active) : -1;\n const tabId = active?.tabId() || null;\n\n if (!tabId && isDevMode() && !this.warnedAboutTabId) {\n this.warnedAboutTabId = true;\n\n // eslint-disable-next-line no-console\n console.warn(\n 'kbq-tab-group: the selected tab has no `tabId`, so the selection is persisted by ' +\n 'position. A position survives a reload but not a reordering, and then restores the ' +\n 'wrong tab. Give the tabs a `tabId`, or unset `useStateSaving`.'\n );\n }\n\n return { tabId, index: index < 0 ? 0 : index };\n }\n\n private checkOverflow(): void {\n this.tabHeader().items.forEach((headerTab) => headerTab.checkOverflow());\n }\n\n private createChangeEvent(index: number): KbqTabChangeEvent {\n const event = new KbqTabChangeEvent();\n\n event.index = index;\n\n if (this.tabs && this.tabs.length) {\n event.tab = this.tabs.toArray()[index];\n }\n\n return event;\n }\n\n /**\n * Subscribes to changes in the tab labels. This is needed, because the `@Input` for the label is\n * on the KbqTab component, whereas the data binding is inside the KbqTabGroup. In order for the\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\n * manually.\n */\n private subscribeToTabLabels() {\n if (this.tabLabelSubscription) {\n this.tabLabelSubscription.unsubscribe();\n }\n\n this.tabLabelSubscription = merge(...this.tabs.map((tab) => tab.stateChanges)).subscribe(() =>\n this.changeDetectorRef.markForCheck()\n );\n }\n\n /**\n * Index that owns `tabindex=\"0\"`, falling back to the first enabled tab when focus sits on a\n * disabled one.\n *\n * The template calls this once per tab, so the common path stays allocation-free: `QueryList.get`\n * indexes the backing array, where `toArray()` would copy it N times per check.\n */\n private getRovingTabIndex(tabHeader: KbqTabHeader): number {\n const { focusIndex } = tabHeader;\n const focused = this.tabs.get(focusIndex);\n\n if (focused && !focused.disabled) {\n return focusIndex;\n }\n\n for (let index = 0; index < this.tabs.length; index++) {\n if (!this.tabs.get(index)!.disabled) {\n return index;\n }\n }\n\n return -1;\n }\n\n /** First tab that can actually be selected, so that a leading disabled tab is not the default. */\n private getDefaultTab(): KbqTab | null {\n return this.tabs.find((tab) => !tab.disabled) || this.tabs.get(0) || null;\n }\n\n /** Clamps the given index to the bounds of 0 and the tabs length. */\n private clampTabIndex(index: number | null): number {\n // Note the `|| 0`, which ensures that values like NaN can't get through\n // and which would otherwise throw the component into an infinite loop\n // (since Math.max(NaN, 0) === NaN).\n return Math.min(this.tabs.length - 1, Math.max(index || 0, 0));\n }\n\n private getTabIndexToSelect(): number {\n const currentSelectedTab = this.activeTab;\n\n if (currentSelectedTab === null) {\n return 0;\n }\n\n return this.tabs ? this.tabs.toArray().indexOf(currentSelectedTab) : 0;\n }\n}\n","<kbq-tab-header\n #tabHeader\n [selectedIndex]=\"selectedIndex\"\n [underlined]=\"underlined()\"\n [vertical]=\"vertical()\"\n (indexFocused)=\"focusChanged($event)\"\n (selectFocusedIndex)=\"onSelectFocusedIndex($event)\"\n>\n @for (tab of tabs; track tab) {\n <div\n cdkMonitorElementFocus\n kbqTabLabelWrapper\n class=\"kbq-tab-label\"\n role=\"tab\"\n [attr.aria-controls]=\"getTabContentId($index)\"\n [attr.aria-selected]=\"selectedIndex === $index\"\n [attr.tabindex]=\"getTabIndex(tab, tabHeader, $index)\"\n [class.kbq-selected]=\"selectedIndex === $index\"\n [class.kbq-tab-label_empty]=\"tab.empty()\"\n [class.kbq-tab-label_horizontal]=\"!vertical()\"\n [class.kbq-tab-label_underlined]=\"underlined()\"\n [class.kbq-tab-label_vertical]=\"vertical()\"\n [class.kbq-tab-label_icon-only]=\"tab.iconOnlyLabel\"\n [disabled]=\"tab.disabled\"\n [id]=\"getTabLabelId($index)\"\n [kbqPlacement]=\"tab.tooltipPlacement()\"\n [kbqTooltip]=\"tab.tooltipTitle\"\n [kbqTooltipDisabled]=\"!tab.empty() && !tab.isOverflown\"\n [kbqTrigger]=\"'hover, focus'\"\n [tab]=\"tab\"\n (click)=\"handleClick(tab, tabHeader, $index)\"\n >\n <div #labelContent class=\"kbq-tab-label__content\" [class.kbq-tab-label__template]=\"tab.templateLabel\">\n <!-- If there is a label template, use it. -->\n @if (tab.templateLabel) {\n <ng-template [cdkPortalOutlet]=\"tab.templateLabel\" />\n }\n <!-- If there is not a label template, fall back to the text label. -->\n @else {\n {{ tab.textLabel() }}\n }\n </div>\n </div>\n }\n</kbq-tab-header>\n\n<div #tabBodyWrapper class=\"kbq-tab-body__wrapper\">\n @for (tab of tabs; track tab) {\n <kbq-tab-body\n role=\"tabpanel\"\n [animationDuration]=\"animationDuration\"\n [attr.aria-labelledby]=\"getTabLabelId($index)\"\n [attr.tabindex]=\"selectedIndex === $index ? 0 : null\"\n [class.kbq-tab-body__active]=\"selectedIndex === $index\"\n [content]=\"tab.content!\"\n [id]=\"getTabContentId($index)\"\n [origin]=\"tab.origin!\"\n [position]=\"tab.position!\"\n (onCentered)=\"removeTabBodyWrapperHeight()\"\n (onCentering)=\"setTabBodyWrapperHeight($event)\"\n />\n }\n</div>\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport { CdkObserveContent } from '@angular/cdk/observers';\nimport { Platform } from '@angular/cdk/platform';\nimport {\n AfterContentInit,\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChildren,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n input,\n OnChanges,\n OnDestroy,\n QueryList,\n Renderer2,\n SimpleChanges,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { isUndefined, kbqOptionalNumberAttribute, kbqQueryListFrom } from '@koobiq/components/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqScrollbarViewport } from '@koobiq/components/scrollbar';\nimport { startWith } from 'rxjs/operators';\nimport { KbqPaginatedTabHeader } from './paginated-tab-header';\n\n// Increasing integer for generating unique ids for tab nav components.\nlet nextUniqueId = 0;\n\n/** Corresponds to `--kbq-tabs-size-tab-item-padding-horizontal` on text tabs in underlined mode. */\nconst TAB_PADDING = 12;\n\n/**\n * Navigation component matching the styles of the tab group header.\n */\n@Component({\n selector: '[kbqTabNavBar], [kbq-tab-nav-bar]',\n imports: [\n KbqIconModule,\n CdkObserveContent,\n KbqScrollbarViewport\n ],\n templateUrl: './tab-nav-bar.html',\n styleUrls: [\n './tab-nav-bar.scss',\n './tabs-tokens.scss',\n // KbqTabLink is a directive and can't have self styles, so we need to include its styles here.\n './tab-link.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-tab-nav-bar',\n '[class.kbq-tab-nav-bar_filled]': '!transparent()',\n '[class.kbq-tab-nav-bar_transparent]': 'transparent()',\n '[class.kbq-tab-nav-bar_on-background]': '!onSurface()',\n '[class.kbq-tab-nav-bar_on-surface]': 'onSurface()',\n '[class.kbq-tab-header_underlined]': 'underlined()',\n '[class.kbq-tab-group_vertical]': 'vertical',\n '[class.kbq-tab-header__pagination-controls_enabled]': 'showPaginationControls',\n '[class.kbq-tab-header_rtl]': \"getLayoutDirection() == 'rtl'\",\n '[attr.role]': 'role',\n '[attr.aria-orientation]': 'ariaOrientation'\n },\n exportAs: 'kbqTabNavBar'\n})\nexport class KbqTabNavBar extends KbqPaginatedTabHeader implements AfterContentInit {\n private readonly tabListContainerQuery = viewChild.required<ElementRef>('tabListContainer');\n private readonly scrollbarViewportQuery = viewChild.required('tabListContainer', { read: KbqScrollbarViewport });\n private readonly tabListQuery = viewChild.required<ElementRef>('tabList');\n private readonly nextPaginatorQuery = viewChild.required<ElementRef<HTMLElement>>('nextPaginator');\n private readonly previousPaginatorQuery = viewChild.required<ElementRef<HTMLElement>>('previousPaginator');\n private readonly itemsQuery = contentChildren(\n forwardRef(() => KbqTabLink),\n { descendants: true }\n );\n private readonly itemsList = kbqQueryListFrom(this.itemsQuery);\n\n /** The scroll container of the tab links. */\n get tabListContainer(): ElementRef {\n return this.tabListContainerQuery();\n }\n\n protected get scrollbarViewport(): KbqScrollbarViewport {\n return this.scrollbarViewportQuery();\n }\n\n /** The element that holds the tab links. */\n get tabList(): ElementRef {\n return this.tabListQuery();\n }\n\n /** The pagination arrow towards the end of the tab list. */\n get nextPaginator(): ElementRef<HTMLElement> {\n return this.nextPaginatorQuery();\n }\n\n /** The pagination arrow towards the beginning of the tab list. */\n get previousPaginator(): ElementRef<HTMLElement> {\n return this.previousPaginatorQuery();\n }\n\n /** The tab links of the nav bar. */\n get items(): QueryList<KbqTabLink> {\n return this.itemsList();\n }\n\n private readonly isBrowser = inject(Platform).isBrowser;\n\n /** Whether the nav bar background should be transparent. */\n readonly transparent = input<boolean, unknown>(false, { transform: booleanAttribute });\n readonly onSurface = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Whether the nav bar should be underlined. */\n readonly underlined = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /**\n * Associated tab panel controlled by the nav bar.\n */\n readonly tabNavPanel = input<KbqTabNavPanel>();\n\n get role(): string | null {\n return this.tabNavPanel() ? 'tablist' : this.elementRef.nativeElement.getAttribute('role');\n }\n\n /**\n * Vertical tablists are walked with ↑/↓ — ←/→ do nothing — so the orientation has to be announced.\n * `aria-orientation` is only meaningful on a role that supports it, hence nothing without a panel.\n */\n protected get ariaOrientation(): string | null {\n return this.role === 'tablist' && this.vertical ? 'vertical' : null;\n }\n\n protected get activeTabOffsetWidth(): number | undefined {\n if (!this.isBrowser) return undefined;\n\n const width = this.items.get(this.selectedIndex)?.elementRef?.nativeElement?.offsetWidth;\n\n if (!width) return width;\n\n return width - TAB_PADDING * 2;\n }\n\n protected get activeTabOffsetLeft(): number | undefined {\n if (!this.isBrowser) return undefined;\n\n const left = this.items.get(this.selectedIndex)?.elementRef?.nativeElement?.offsetLeft;\n\n if (isUndefined(left)) return left;\n\n return left + TAB_PADDING;\n }\n\n protected get activeTabDisabled(): boolean {\n return !!this.items.get(this.selectedIndex)?.disabled;\n }\n\n /** `activeTabDisabled` as this view last rendered it: a link's `disabled` input gives this view no notice. */\n private checkedActiveTabDisabled = false;\n\n override ngAfterContentInit() {\n // We need this to run before the `changes` subscription in parent to ensure that the `selectedIndex` is\n // up-to-date by the time the `KbqPaginatedTabHeader` starts looking for it.\n this.items.changes.pipe(startWith(null), takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.updateActiveLink();\n });\n\n super.ngAfterContentInit();\n }\n\n override ngAfterContentChecked(): void {\n super.ngAfterContentChecked();\n\n const activeTabDisabled = this.activeTabDisabled;\n\n if (activeTabDisabled !== this.checkedActiveTabDisabled) {\n this.checkedActiveTabDisabled = activeTabDisabled;\n this.changeDetectorRef.markForCheck();\n }\n }\n\n protected itemSelected() {}\n\n /** Notifies the component that the active link has been changed. */\n updateActiveLink(): void {\n if (!this.items) {\n return;\n }\n\n const items = this.items.toArray();\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].active) {\n this.selectedIndex = i;\n // Also marks the ancestors, whose check runs `ngAfterContentChecked` and scrolls to the link.\n this.changeDetectorRef.markForCheck();\n\n const tabNavPanel = this.tabNavPanel();\n\n if (tabNavPanel) {\n tabNavPanel.activeTabId = items[i].id;\n }\n\n return;\n }\n }\n\n // The ink bar should hide itself if no items are active.\n this.selectedIndex = -1;\n }\n}\n\n/**\n * Link inside of a KbqTabNavBar.\n */\n@Directive({\n selector: '[kbqTabLink], [kbq-tab-link]',\n host: {\n class: 'kbq-tab-link',\n '[class.kbq-selected]': 'active',\n '[class.kbq-tab-label_vertical]': 'vertical',\n '[class.kbq-tab-label_horizontal]': '!vertical',\n '[class.kbq-tab-label_underlined]': 'underlined',\n '[class.kbq-disabled]': 'disabled',\n\n '[attr.id]': 'id',\n '[attr.tabindex]': 'tabIndex',\n // No `[attr.disabled]`: the directive sits on an `<a>`, where `disabled` is not a valid\n // attribute and no assistive technology reads it. Styling goes through `.kbq-disabled`.\n '[attr.aria-disabled]': 'disabled',\n '[attr.aria-selected]': 'ariaSelected',\n '[attr.role]': 'role',\n '[attr.aria-controls]': 'ariaControls',\n '[attr.aria-current]': 'ariaCurrent',\n\n '(focus)': 'handleFocus()',\n '(keydown)': 'handleKeydown($event)'\n },\n exportAs: 'kbqTabLink'\n})\nexport class KbqTabLink implements OnChanges, OnDestroy, AfterViewInit {\n /** @docs-private */\n readonly idInput = input<string | undefined>(undefined, { alias: 'id' });\n\n /** @docs-private */\n readonly activeInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'active',\n transform: booleanAttribute\n });\n\n /** @docs-private */\n readonly disabledInput = input<boolean | undefined, boolean | string | null | undefined>(undefined, {\n alias: 'disabled',\n transform: booleanAttribute\n });\n\n /** @docs-private */\n readonly tabIndexInput = input<number | undefined, number | string | null | undefined>(undefined, {\n alias: 'tabIndex',\n transform: kbqOptionalNumberAttribute\n });\n\n private readonly uniqueId = `kbq-tab-link-${nextUniqueId++}`;\n\n /** Unique id for the link. */\n id = this.uniqueId;\n\n /** Whether the link is active. */\n get active(): boolean {\n return this._active;\n }\n\n set active(value: boolean) {\n if (value !== this._active) {\n this._active = value;\n this.tabNavBar.updateActiveLink();\n }\n }\n\n /** Whether the tab link is active or not. */\n private _active: boolean = false;\n\n get vertical(): boolean {\n return this.tabNavBar.vertical;\n }\n\n get underlined(): boolean {\n return this.tabNavBar.underlined();\n }\n\n /** Whether the tab link is disabled. */\n disabled: boolean = false;\n\n /** Link tab index. */\n get tabIndex(): number {\n if (this.tabNavBar.tabNavPanel()) {\n return this.active && !this.disabled ? this._tabIndex : -1;\n } else {\n return this.disabled ? -1 : this._tabIndex;\n }\n }\n\n set tabIndex(value: number) {\n this._tabIndex = value;\n }\n\n private _tabIndex: number = 0;\n\n /** Link aria-selected attribute value. */\n protected get ariaSelected(): string | null {\n if (this.tabNavBar.tabNavPanel()) {\n return this.active ? 'true' : 'false';\n } else {\n return this.elementRef.nativeElement.getAttribute('aria-selected');\n }\n }\n\n /** Link role attribute value. */\n protected get role(): string | null {\n return this.tabNavBar.tabNavPanel() ? 'tab' : this.elementRef.nativeElement.getAttribute('role');\n }\n\n /** Link aria-controls attribute value. */\n protected get ariaControls(): string | null {\n const tabNavPanel = this.tabNavBar.tabNavPanel();\n\n return tabNavPanel ? tabNavPanel?.id() : this.elementRef.nativeElement.getAttribute('aria-controls');\n }\n\n /** Link aria-current attribute value. */\n protected get ariaCurrent(): string | null {\n return this.active && !this.tabNavBar.tabNavPanel() ? 'page' : null;\n }\n\n readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly renderer = inject(Renderer2);\n private readonly tabNavBar = inject(KbqTabNavBar);\n\n ngOnChanges(changes: SimpleChanges): void {\n // A bound input is handed to its member, except that `undefined` resets a member\n // typed without it to its default; unbound, it leaves what code wrote.\n if (changes['idInput']) {\n this.id = this.idInput() ?? this.uniqueId;\n }\n\n if (changes['disabledInput']) {\n const disabled = this.disabledInput();\n\n if (disabled !== undefined) this.disabled = disabled;\n }\n\n if (changes['tabIndexInput']) this.tabIndex = this.tabIndexInput() ?? 0;\n\n // Last: the nav bar reads the id of the link that becomes active.\n if (changes['activeInput']) {\n const active = this.activeInput();\n\n if (active !== undefined) this.active = active;\n }\n }\n\n ngAfterViewInit(): void {\n this.focusMonitor.monitor(this.elementRef.nativeElement);\n\n this.addClassModifierForIcons(Array.from(this.elementRef.nativeElement.querySelectorAll('.kbq-icon')));\n }\n\n ngOnDestroy() {\n this.focusMonitor.stopMonitoring(this.elementRef.nativeElement);\n }\n\n private addClassModifierForIcons(icons: HTMLElement[]) {\n const twoIcons = 2;\n const [firstIconElement, secondIconElement] = icons;\n\n if (icons.length === 1) {\n const COMMENT_NODE = 8;\n\n if (firstIconElement.nextSibling && firstIconElement.nextSibling.nodeType !== COMMENT_NODE) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_left');\n }\n\n if (firstIconElement.previousSibling && firstIconElement.previousSibling.nodeType !== COMMENT_NODE) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_right');\n }\n } else if (icons.length === twoIcons) {\n this.renderer.addClass(firstIconElement, 'kbq-icon_left');\n this.renderer.addClass(secondIconElement, 'kbq-icon_right');\n }\n }\n\n /**\n * Focuses the tab link.\n *\n * `preventScroll: true`: `FocusKeyManager.setActiveItem` calls this itself, right after (and\n * unconditionally on) the `change` emission that runs `KbqPaginatedTabHeader.setTabFocus` — so\n * without the guard here too, that call's own `preventScroll: true` is immediately undone by\n * this one, and an overflowing nav bar double-jumps (native scroll-into-view, then the\n * paginator-aware `scrollCorrection`) on every arrow-key press.\n */\n focus(): void {\n this.elementRef.nativeElement.focus({ preventScroll: true });\n }\n\n /** Handles the focus event. */\n protected handleFocus() {\n // Since we allow navigation through tabbing in the nav bar, we have to update the focused index whenever the\n // link receives focus.\n this.tabNavBar.focusIndex = this.tabNavBar.items.toArray().indexOf(this);\n }\n\n /** Handles the keydown event. */\n protected handleKeydown(event: KeyboardEvent) {\n if (event.keyCode === SPACE || event.keyCode === ENTER) {\n if (this.disabled) {\n event.preventDefault();\n } else if (this.tabNavBar.tabNavPanel()) {\n // Only prevent the default action on space since it can scroll the page.\n // Don't prevent enter since it can break link navigation.\n if (event.keyCode === SPACE) {\n event.preventDefault();\n }\n\n this.elementRef.nativeElement.click();\n }\n }\n }\n}\n\n/**\n * Tab panel component associated with KbqTabNav.\n */\n@Directive({\n selector: '[kbqTabNavPanel]',\n host: {\n class: 'kbq-tab-nav-panel',\n\n '[attr.id]': 'id()',\n '[attr.aria-labelledby]': 'activeTabId',\n\n role: 'tabpanel'\n },\n exportAs: 'kbqTabNavPanel'\n})\nexport class KbqTabNavPanel {\n /** Unique id for the tab panel. */\n readonly id = input(`kbq-tab-nav-panel-${nextUniqueId++}`);\n\n /** Id of the active tab in the nav bar. */\n activeTabId?: string;\n}\n","<div\n #previousPaginator\n class=\"kbq-tab-header__pagination kbq-tab-header__pagination_before\"\n [class.kbq-disabled]=\"disableScrollBefore\"\n (click)=\"handlePaginatorClick('before')\"\n (mousedown)=\"handlePaginatorPress('before', $event)\"\n (touchend)=\"stopInterval()\"\n>\n <i kbq-icon=\"kbq-chevron-left_16\" color=\"contrast\"></i>\n</div>\n\n<div\n #tabListContainer\n kbqScrollbarViewport\n class=\"kbq-tab-link__container kbq-tab-header__scroll-container\"\n [kbqScrollbarMode]=\"scrollbarMode\"\n [class.kbq-tab-header__scroll-container_overflow-before]=\"overflowBefore\"\n [class.kbq-tab-header__scroll-container_overflow-after]=\"overflowAfter\"\n (keydown)=\"handleKeydown($event)\"\n>\n <div #tabList class=\"kbq-tab-list\" (cdkObserveContent)=\"onContentChanges()\">\n <div class=\"kbq-tab-list__content\">\n <ng-content />\n <div\n aria-hidden=\"true\"\n class=\"kbq-tab-list__active-tab-underline\"\n [class.kbq-animations-disabled]=\"animationsDisabled\"\n [class.kbq-disabled]=\"activeTabDisabled\"\n [style.left.px]=\"activeTabOffsetLeft\"\n [style.width.px]=\"activeTabOffsetWidth\"\n ></div>\n </div>\n </div>\n</div>\n\n<div\n #nextPaginator\n class=\"kbq-tab-header__pagination kbq-tab-header__pagination_after\"\n [class.kbq-disabled]=\"disableScrollAfter\"\n (click)=\"handlePaginatorClick('after')\"\n (mousedown)=\"handlePaginatorPress('after', $event)\"\n (touchend)=\"stopInterval()\"\n>\n <i kbq-icon=\"kbq-chevron-right_16\" color=\"contrast\"></i>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { CdkObserveContent } from '@angular/cdk/observers';\nimport { PortalModule } from '@angular/cdk/portal';\nimport { CdkScrollableModule } from '@angular/cdk/scrolling';\nimport { NgModule } from '@angular/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqToolTipModule } from '@koobiq/components/tooltip';\nimport { KbqTabBody, KbqTabBodyPortal } from './tab-body.component';\nimport { KbqTabContent } from './tab-content.directive';\nimport {\n KbqAlignTabsCenterCssStyler,\n KbqAlignTabsEndCssStyler,\n KbqStretchTabsCssStyler,\n KbqTabGroup,\n KbqVerticalTabsCssStyler\n} from './tab-group.component';\nimport { KbqTabHeader } from './tab-header.component';\nimport { KbqTabLabelWrapper } from './tab-label-wrapper.directive';\nimport { KbqTabLabel } from './tab-label.directive';\nimport { KbqTabLink, KbqTabNavBar, KbqTabNavPanel } from './tab-nav-bar';\nimport { KbqTab } from './tab.component';\n\nconst STANDALONE_COMPONENTS = [\n KbqTabNavBar,\n KbqTabLink,\n KbqTabNavPanel\n];\n\nconst COMPONENTS = [\n KbqTabGroup,\n KbqTabLabel,\n KbqTab,\n KbqTabLabelWrapper,\n KbqTabBody,\n KbqTabBodyPortal,\n KbqTabHeader,\n KbqTabContent,\n KbqAlignTabsCenterCssStyler,\n KbqAlignTabsEndCssStyler,\n KbqStretchTabsCssStyler,\n KbqVerticalTabsCssStyler\n];\n\n@NgModule({\n imports: [\n PortalModule,\n A11yModule,\n CdkScrollableModule,\n KbqIconModule,\n KbqToolTipModule,\n CdkObserveContent,\n ...STANDALONE_COMPONENTS,\n ...COMPONENTS\n ],\n exports: [\n ...COMPONENTS,\n ...STANDALONE_COMPONENTS\n ]\n})\nexport class KbqTabsModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["observableOf","TAB_PADDING","i1"],"mappings":"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"}