@siemens/element-ng 47.4.0 → 47.5.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 (145) hide show
  1. package/common/models/status-type.model.d.ts +2 -0
  2. package/datatable/index.d.ts +42 -0
  3. package/datatable/package.json +3 -0
  4. package/datatable/si-datatable-interaction.directive.d.ts +34 -0
  5. package/datatable/si-datatable.module.d.ts +7 -0
  6. package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
  7. package/fesm2022/siemens-element-ng-datatable.mjs +173 -0
  8. package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -0
  9. package/fesm2022/siemens-element-ng-filtered-search.mjs +1139 -0
  10. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -0
  11. package/fesm2022/siemens-element-ng-formly.mjs +935 -0
  12. package/fesm2022/siemens-element-ng-formly.mjs.map +1 -0
  13. package/fesm2022/siemens-element-ng-icon.mjs +42 -14
  14. package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
  15. package/fesm2022/siemens-element-ng-list-details.mjs +390 -0
  16. package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -0
  17. package/fesm2022/siemens-element-ng-loading-spinner.mjs +15 -12
  18. package/fesm2022/siemens-element-ng-loading-spinner.mjs.map +1 -1
  19. package/fesm2022/siemens-element-ng-modal.mjs +4 -1
  20. package/fesm2022/siemens-element-ng-modal.mjs.map +1 -1
  21. package/fesm2022/siemens-element-ng-password-strength.mjs +22 -16
  22. package/fesm2022/siemens-element-ng-password-strength.mjs.map +1 -1
  23. package/fesm2022/siemens-element-ng-phone-number.mjs +426 -0
  24. package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -0
  25. package/fesm2022/siemens-element-ng-result-details-list.mjs +74 -0
  26. package/fesm2022/siemens-element-ng-result-details-list.mjs.map +1 -0
  27. package/fesm2022/siemens-element-ng-shadow-root.mjs +70 -0
  28. package/fesm2022/siemens-element-ng-shadow-root.mjs.map +1 -0
  29. package/fesm2022/siemens-element-ng-side-panel.mjs +554 -0
  30. package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -0
  31. package/fesm2022/siemens-element-ng-status-bar.mjs +348 -0
  32. package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -0
  33. package/fesm2022/siemens-element-ng-tabs-next.mjs +491 -0
  34. package/fesm2022/siemens-element-ng-tabs-next.mjs.map +1 -0
  35. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  36. package/fesm2022/siemens-element-ng-tree-view.mjs +2936 -0
  37. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -0
  38. package/fesm2022/siemens-element-ng-wizard.mjs +2 -2
  39. package/fesm2022/siemens-element-ng-wizard.mjs.map +1 -1
  40. package/filtered-search/index.d.ts +7 -0
  41. package/filtered-search/package.json +3 -0
  42. package/filtered-search/si-filtered-search-helper.d.ts +22 -0
  43. package/filtered-search/si-filtered-search-value.component.d.ts +53 -0
  44. package/filtered-search/si-filtered-search.component.d.ts +329 -0
  45. package/filtered-search/si-filtered-search.model.d.ts +139 -0
  46. package/filtered-search/si-filtered-search.module.d.ts +7 -0
  47. package/filtered-search/values/date-value/si-filtered-search-date-value.component.d.ts +57 -0
  48. package/filtered-search/values/si-filtered-search-value.base.d.ts +27 -0
  49. package/filtered-search/values/typeahead/si-filtered-search-typeahead.component.d.ts +45 -0
  50. package/formly/fields/button/si-formly-button.component.d.ts +7 -0
  51. package/formly/fields/date-range/si-formly-date-range.component.d.ts +6 -0
  52. package/formly/fields/datetime/si-formly-datetime.component.d.ts +13 -0
  53. package/formly/fields/email/si-formly-email.component.d.ts +6 -0
  54. package/formly/fields/ip-input/si-formly-ip-input.component.d.ts +6 -0
  55. package/formly/fields/number/si-formly-number.component.d.ts +6 -0
  56. package/formly/fields/password/si-formly-password.component.d.ts +6 -0
  57. package/formly/fields/select/si-formly-select.component.d.ts +6 -0
  58. package/formly/fields/text/si-formly-text-display.component.d.ts +7 -0
  59. package/formly/fields/textarea/si-formly-textarea.component.d.ts +18 -0
  60. package/formly/fields/time/si-formly-time.component.d.ts +13 -0
  61. package/formly/index.d.ts +6 -0
  62. package/formly/package.json +3 -0
  63. package/formly/si-formly-translate.extension.d.ts +11 -0
  64. package/formly/si-formly.component.d.ts +62 -0
  65. package/formly/si-formly.module.d.ts +35 -0
  66. package/formly/structural/si-formly-accordion/si-formly-accordion.component.d.ts +13 -0
  67. package/formly/structural/si-formly-array/si-formly-array.component.d.ts +6 -0
  68. package/formly/structural/si-formly-object/si-formly-object.component.d.ts +6 -0
  69. package/formly/structural/si-formly-object-grid/si-formly-object-grid.component.d.ts +22 -0
  70. package/formly/structural/si-formly-object-grid/si-formly-object-grid.model.d.ts +21 -0
  71. package/formly/structural/si-formly-object-plain/si-formly-object-plain.component.d.ts +6 -0
  72. package/formly/structural/si-formly-tabset/si-formly-object-tabset.component.d.ts +7 -0
  73. package/formly/utils.d.ts +6 -0
  74. package/formly/wrapper/si-formly-fieldset.component.d.ts +8 -0
  75. package/formly/wrapper/si-formly-form-field-provider.directive.d.ts +19 -0
  76. package/formly/wrapper/si-formly-horizontal-wrapper.component.d.ts +6 -0
  77. package/formly/wrapper/si-formly-icon-wrapper.component.d.ts +6 -0
  78. package/formly/wrapper/si-formly-wrapper.component.d.ts +8 -0
  79. package/icon/element-icons.d.ts +5 -0
  80. package/icon/si-status-icon.component.d.ts +6 -1
  81. package/list-details/index.d.ts +12 -0
  82. package/list-details/package.json +3 -0
  83. package/list-details/si-details-pane/si-details-pane.component.d.ts +8 -0
  84. package/list-details/si-details-pane-body/si-details-pane-body.component.d.ts +6 -0
  85. package/list-details/si-details-pane-footer/si-details-pane-footer.component.d.ts +6 -0
  86. package/list-details/si-details-pane-header/si-details-pane-header.component.d.ts +38 -0
  87. package/list-details/si-list-details.component.d.ts +100 -0
  88. package/list-details/si-list-pane/si-list-pane.component.d.ts +10 -0
  89. package/list-details/si-list-pane-body/si-list-pane-body.component.d.ts +6 -0
  90. package/list-details/si-list-pane-header/si-list-pane-header.component.d.ts +6 -0
  91. package/loading-spinner/si-loading-spinner.directive.d.ts +3 -2
  92. package/package.json +73 -9
  93. package/password-strength/si-password-strength.directive.d.ts +11 -0
  94. package/phone-number/index.d.ts +7 -0
  95. package/phone-number/package.json +3 -0
  96. package/phone-number/si-phone-number-input-select.directive.d.ts +10 -0
  97. package/phone-number/si-phone-number-input.component.d.ts +137 -0
  98. package/phone-number/si-phone-number-input.models.d.ts +48 -0
  99. package/phone-number/si-phone-number-input.module.d.ts +7 -0
  100. package/result-details-list/index.d.ts +7 -0
  101. package/result-details-list/package.json +3 -0
  102. package/result-details-list/si-result-details-list.component.d.ts +14 -0
  103. package/result-details-list/si-result-details-list.datamodel.d.ts +48 -0
  104. package/result-details-list/si-result-details-list.module.d.ts +7 -0
  105. package/shadow-root/index.d.ts +5 -0
  106. package/shadow-root/package.json +3 -0
  107. package/shadow-root/si-shadow-root.directive.d.ts +39 -0
  108. package/side-panel/index.d.ts +9 -0
  109. package/side-panel/package.json +3 -0
  110. package/side-panel/si-side-panel-content.component.d.ts +105 -0
  111. package/side-panel/si-side-panel.component.d.ts +108 -0
  112. package/side-panel/si-side-panel.module.d.ts +8 -0
  113. package/side-panel/si-side-panel.service.d.ts +45 -0
  114. package/side-panel/side-panel.model.d.ts +16 -0
  115. package/status-bar/index.d.ts +7 -0
  116. package/status-bar/package.json +3 -0
  117. package/status-bar/si-status-bar-item/index.d.ts +6 -0
  118. package/status-bar/si-status-bar-item/si-status-bar-item.component.d.ts +22 -0
  119. package/status-bar/si-status-bar-item/si-status-bar-item.model.d.ts +33 -0
  120. package/status-bar/si-status-bar.component.d.ts +116 -0
  121. package/status-bar/si-status-bar.module.d.ts +7 -0
  122. package/tabs-next/index.d.ts +7 -0
  123. package/tabs-next/package.json +3 -0
  124. package/tabs-next/si-tab-next-base.directive.d.ts +66 -0
  125. package/tabs-next/si-tab-next-link.component.d.ts +18 -0
  126. package/tabs-next/si-tab-next.component.d.ts +16 -0
  127. package/tabs-next/si-tabs-tokens.d.ts +7 -0
  128. package/tabs-next/si-tabset-next.component.d.ts +72 -0
  129. package/template-i18n.json +29 -0
  130. package/translate/si-translatable-keys.interface.d.ts +29 -0
  131. package/tree-view/drag-drop.util.d.ts +32 -0
  132. package/tree-view/index.d.ts +12 -0
  133. package/tree-view/package.json +3 -0
  134. package/tree-view/si-tree-view-converter.service.d.ts +41 -0
  135. package/tree-view/si-tree-view-item/si-tree-view-item.component.d.ts +105 -0
  136. package/tree-view/si-tree-view-item/si-tree-view-item.directive.d.ts +24 -0
  137. package/tree-view/si-tree-view-item-context.d.ts +11 -0
  138. package/tree-view/si-tree-view-item-height.service.d.ts +49 -0
  139. package/tree-view/si-tree-view-item-template.directive.d.ts +18 -0
  140. package/tree-view/si-tree-view-virtualization.service.d.ts +150 -0
  141. package/tree-view/si-tree-view.component.d.ts +466 -0
  142. package/tree-view/si-tree-view.model.d.ts +146 -0
  143. package/tree-view/si-tree-view.module.d.ts +10 -0
  144. package/tree-view/si-tree-view.service.d.ts +55 -0
  145. package/tree-view/si-tree-view.utils.d.ts +46 -0
@@ -0,0 +1,491 @@
1
+ import { FocusKeyManager } from '@angular/cdk/a11y';
2
+ import { CdkMenu, CdkMenuTrigger } from '@angular/cdk/menu';
3
+ import { NgClass, NgTemplateOutlet } from '@angular/common';
4
+ import * as i0 from '@angular/core';
5
+ import { InjectionToken, input, booleanAttribute, output, computed, inject, ElementRef, viewChild, TemplateRef, Directive, signal, effect, ChangeDetectionStrategy, Component, model, contentChildren, INJECTOR } from '@angular/core';
6
+ import * as i1$1 from '@angular/router';
7
+ import { Router, RouterLink, RouterLinkActive } from '@angular/router';
8
+ import { SiMenuDirective, SiMenuItemComponent } from '@siemens/element-ng/menu';
9
+ import * as i2 from '@siemens/element-ng/resize-observer';
10
+ import { SiResizeObserverModule } from '@siemens/element-ng/resize-observer';
11
+ import * as i1 from '@siemens/element-translate-ng/translate';
12
+ import { SiTranslateModule } from '@siemens/element-translate-ng/translate';
13
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
14
+ import { addIcons, elementCancel, SiIconNextComponent } from '@siemens/element-ng/icon';
15
+
16
+ /**
17
+ * Copyright Siemens 2016 - 2025.
18
+ * SPDX-License-Identifier: MIT
19
+ */
20
+ const SI_TABSET_NEXT = new InjectionToken('SiTabsetNextComponent');
21
+
22
+ class SiTabNextBaseDirective {
23
+ /** Title of the tab item. */
24
+ heading = input.required();
25
+ /**
26
+ * Icon of the tab item.
27
+ * If provided, heading text will be ignored and only icon will be displayed.
28
+ */
29
+ icon = input();
30
+ /**
31
+ * Additional badge content. A value of
32
+ * - `true` will render a red dot
33
+ * - any string without a `badgeColor` will render a red dot with text
34
+ * - any string with a `badgeColor` will render a normal badge
35
+ */
36
+ badgeContent = input();
37
+ /**
38
+ * Background color of the badge.
39
+ * If no color is provided a red dot badge will be rendered.
40
+ */
41
+ badgeColor = input();
42
+ /**
43
+ * Disables the tab.
44
+ *
45
+ * @defaultValue false
46
+ */
47
+ disabledTab = input(false, {
48
+ transform: booleanAttribute,
49
+ // eslint-disable-next-line @angular-eslint/no-input-rename
50
+ alias: 'disabled'
51
+ });
52
+ /**
53
+ * Close the current tab.
54
+ *
55
+ * @defaultValue false
56
+ */
57
+ closable = input(false, {
58
+ transform: booleanAttribute
59
+ });
60
+ /** Event emitter to notify when a tab is closed. */
61
+ closeTriggered = output();
62
+ /** @internal */
63
+ badgeIsNumber = computed(() => {
64
+ return typeof this.badgeContent() !== 'boolean';
65
+ });
66
+ tabButton = inject(ElementRef);
67
+ tabContent = viewChild('tabContent', { read: TemplateRef });
68
+ static tabCounter = 0;
69
+ retainFocus = false;
70
+ indexBeforeClose = -1;
71
+ /** @internal */
72
+ tabId = `${SiTabNextBaseDirective.tabCounter++}`;
73
+ icons = addIcons({ elementCancel });
74
+ tabset = inject(SI_TABSET_NEXT);
75
+ /** @internal */
76
+ index = computed(() => this.tabset.tabPanels().findIndex(tab => tab.tabId === this.tabId));
77
+ /** @internal */
78
+ isTabButtonFullyVisible() {
79
+ const tabButton = this.tabButton.nativeElement;
80
+ const tabsetElement = this.tabset.tabScrollContainer().nativeElement;
81
+ const tabButtonRect = tabButton.getBoundingClientRect();
82
+ const tabsetRect = tabsetElement.getBoundingClientRect();
83
+ return (Math.round(tabButtonRect.left) >= Math.round(tabsetRect.left) &&
84
+ Math.round(tabButtonRect.right) <= Math.round(tabsetRect.right));
85
+ }
86
+ ngOnDestroy() {
87
+ // adjust the focus index and selected tab index if component is destroyed
88
+ // as a side effect to close tab event
89
+ if (this.indexBeforeClose >= 0) {
90
+ const indexToFocus = this.tabset.getNextIndexToFocus(this.indexBeforeClose);
91
+ if (this.retainFocus) {
92
+ // wait for a cycle to render the tab if not visible
93
+ setTimeout(() => {
94
+ this.tabset.focusKeyManager?.setActiveItem(indexToFocus);
95
+ });
96
+ }
97
+ else if (this.indexBeforeClose >= 0 && this.active()) {
98
+ this.tabset.focusKeyManager?.updateActiveItem(indexToFocus);
99
+ this.tabset.tabPanels()[indexToFocus].tabButton.nativeElement.focus();
100
+ }
101
+ else {
102
+ let selectedItemIndex = this.tabset.activeTabIndex() ?? 0;
103
+ if (selectedItemIndex > this.indexBeforeClose) {
104
+ selectedItemIndex--;
105
+ }
106
+ this.tabset.focusKeyManager?.updateActiveItem(selectedItemIndex);
107
+ this.tabset.tabPanels()[selectedItemIndex].tabButton.nativeElement.focus();
108
+ }
109
+ // if this tab was the active one we need to select next tab as active
110
+ if (this.active()) {
111
+ const targetActiveTab = this.tabset.tabPanels()[indexToFocus];
112
+ if (targetActiveTab) {
113
+ targetActiveTab.active.set(true);
114
+ }
115
+ }
116
+ this.tabset.updateVisibleTabIndexes(indexToFocus, 'next', true);
117
+ }
118
+ }
119
+ closeTab(event, retainFocus = false) {
120
+ if (this.closable() && !this.disabledTab()) {
121
+ event.stopPropagation();
122
+ const index = this.index();
123
+ this.closeTriggered.emit();
124
+ this.retainFocus = retainFocus;
125
+ this.indexBeforeClose = index;
126
+ }
127
+ }
128
+ focus(origin) {
129
+ this.tabButton.nativeElement.focus();
130
+ }
131
+ get disabled() {
132
+ return this.disabledTab();
133
+ }
134
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextBaseDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
135
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "19.0.6", type: SiTabNextBaseDirective, isStandalone: true, selector: "[siTabNextBase]", inputs: { heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, badgeContent: { classPropertyName: "badgeContent", publicName: "badgeContent", isSignal: true, isRequired: false, transformFunction: null }, badgeColor: { classPropertyName: "badgeColor", publicName: "badgeColor", isSignal: true, isRequired: false, transformFunction: null }, disabledTab: { classPropertyName: "disabledTab", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeTriggered: "closeTriggered" }, host: { attributes: { "role": "tab" }, listeners: { "keydown.arrowLeft": "tabset.focusPrevious($event)", "keydown.arrowRight": "tabset.focusNext($event)", "keydown.delete": "closeTab($event, true)" }, properties: { "class.disabled": "disabledTab()", "attr.id": "'tab-' + tabId", "attr.aria-disabled": "disabledTab()", "attr.tabindex": "tabset.focusKeyManager?.activeItem === this && !disabledTab() ? 0 : -1", "attr.aria-controls": "'content-' + tabId" }, classAttribute: "nav-link focus-inside px-5 si-title-1" }, viewQueries: [{ propertyName: "tabContent", first: true, predicate: ["tabContent"], descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0 });
136
+ }
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextBaseDirective, decorators: [{
138
+ type: Directive,
139
+ args: [{
140
+ selector: '[siTabNextBase]',
141
+ host: {
142
+ class: 'nav-link focus-inside px-5 si-title-1',
143
+ role: 'tab',
144
+ '[class.disabled]': 'disabledTab()',
145
+ '[attr.id]': "'tab-' + tabId",
146
+ '[attr.aria-disabled]': 'disabledTab()',
147
+ '[attr.tabindex]': 'tabset.focusKeyManager?.activeItem === this && !disabledTab() ? 0 : -1',
148
+ '[attr.aria-controls]': "'content-' + tabId",
149
+ '(keydown.arrowLeft)': 'tabset.focusPrevious($event)',
150
+ '(keydown.arrowRight)': 'tabset.focusNext($event)',
151
+ '(keydown.delete)': 'closeTab($event, true)'
152
+ }
153
+ }]
154
+ }] });
155
+
156
+ /**
157
+ * Copyright Siemens 2016 - 2025.
158
+ * SPDX-License-Identifier: MIT
159
+ */
160
+ /** @experimental */
161
+ class SiTabNextLinkComponent extends SiTabNextBaseDirective {
162
+ router = inject(Router, { optional: true });
163
+ /** @defaultValue false */
164
+ active = signal(false);
165
+ /** @internal */
166
+ routerLink = inject(RouterLink, { optional: true, self: true });
167
+ routerLinkActive = inject(RouterLinkActive, { self: true });
168
+ constructor() {
169
+ super();
170
+ this.routerLinkActive.isActiveChange
171
+ .pipe(takeUntilDestroyed())
172
+ .subscribe(isActive => this.active.set(isActive));
173
+ effect(() => {
174
+ if (this.active()) {
175
+ if (this.router && this.routerLink?.urlTree) {
176
+ this.router.navigateByUrl(this.routerLink.urlTree);
177
+ }
178
+ }
179
+ });
180
+ }
181
+ /** @internal */
182
+ selectTab(retainFocus) {
183
+ if (!this.isTabButtonFullyVisible()) {
184
+ this.tabset.updateVisibleTabIndexes(this.index(), 'next');
185
+ this.tabset.focusKeyManager?.updateActiveItem(this.index());
186
+ }
187
+ if (retainFocus) {
188
+ setTimeout(() => {
189
+ this.tabset.focusKeyManager?.setActiveItem(this);
190
+ });
191
+ }
192
+ }
193
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
194
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiTabNextLinkComponent, isStandalone: true, selector: "a[si-tab-next][routerLink]", host: { properties: { "class.active": "routerLinkActive.isActive", "attr.aria-selected": "routerLinkActive.isActive" } }, usesInheritance: true, hostDirectives: [{ directive: i1$1.RouterLinkActive }], ngImport: i0, template: "@let icon = this.icon();\n@if (icon) {\n <si-icon-next class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n@if (badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent() && badgeColor()) {\n <span class=\"badge\" [ngClass]=\"'bg-' + badgeColor()\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(badgeContent() ?? '') | translate }}\n </span>\n} @else if (badgeContent() && !badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(badgeContent() ?? '') | translate }}</span>\n}\n@if (closable() && !disabledTab()) {\n <si-icon-next\n class=\"ms-4 me-n4 btn btn-circle btn-xs btn-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0);color:var(--element-text-primary)}:host.nav-link span.badge-dot{inset-block-end:100%;inset-inline-start:12px;margin-inline-end:12px}:host.nav-link span.badge-text{inset-block-end:calc(100% - 7px);inset-inline-start:2px}.tab-icon{font-size:24px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SiIconNextComponent, selector: "si-icon-next", inputs: ["icon"] }, { kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i1.SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
195
+ }
196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextLinkComponent, decorators: [{
197
+ type: Component,
198
+ args: [{ selector: 'a[si-tab-next][routerLink]', imports: [NgClass, SiIconNextComponent, SiTranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, host: {
199
+ '[class.active]': 'routerLinkActive.isActive',
200
+ '[attr.aria-selected]': 'routerLinkActive.isActive'
201
+ }, hostDirectives: [
202
+ {
203
+ directive: RouterLinkActive
204
+ }
205
+ ], template: "@let icon = this.icon();\n@if (icon) {\n <si-icon-next class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n@if (badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent() && badgeColor()) {\n <span class=\"badge\" [ngClass]=\"'bg-' + badgeColor()\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(badgeContent() ?? '') | translate }}\n </span>\n} @else if (badgeContent() && !badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(badgeContent() ?? '') | translate }}</span>\n}\n@if (closable() && !disabledTab()) {\n <si-icon-next\n class=\"ms-4 me-n4 btn btn-circle btn-xs btn-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0);color:var(--element-text-primary)}:host.nav-link span.badge-dot{inset-block-end:100%;inset-inline-start:12px;margin-inline-end:12px}:host.nav-link span.badge-text{inset-block-end:calc(100% - 7px);inset-inline-start:2px}.tab-icon{font-size:24px}\n"] }]
206
+ }], ctorParameters: () => [] });
207
+
208
+ /**
209
+ * Copyright Siemens 2016 - 2025.
210
+ * SPDX-License-Identifier: MIT
211
+ */
212
+ /** @experimental */
213
+ class SiTabNextComponent extends SiTabNextBaseDirective {
214
+ /**
215
+ * Whether the tab is active or not.
216
+ * If set to `true`, the tab will be selected and its content will be displayed.
217
+ * @defaultValue false
218
+ * */
219
+ active = model(false);
220
+ /** @internal */
221
+ selectTab(retainFocus) {
222
+ const tabs = this.tabset.tabPanels();
223
+ const newTabIndex = this.index();
224
+ const currentTabIndex = this.tabset.activeTabIndex();
225
+ let continueWithSelection = newTabIndex !== currentTabIndex;
226
+ if (continueWithSelection && currentTabIndex !== -1) {
227
+ const currentTab = tabs[currentTabIndex];
228
+ const deselectEvent = {
229
+ target: currentTab,
230
+ tabIndex: currentTabIndex,
231
+ cancel: () => {
232
+ continueWithSelection = false;
233
+ currentTab.active.set(true);
234
+ }
235
+ };
236
+ currentTab.active.set(false);
237
+ this.tabset.deselect.emit(deselectEvent);
238
+ }
239
+ if (continueWithSelection) {
240
+ this.active.set(true);
241
+ this.tabset.focusKeyManager?.updateActiveItem(newTabIndex);
242
+ }
243
+ if (!this.isTabButtonFullyVisible()) {
244
+ this.tabset.updateVisibleTabIndexes(newTabIndex, 'next');
245
+ this.tabset.focusKeyManager?.updateActiveItem(newTabIndex);
246
+ }
247
+ if (retainFocus) {
248
+ setTimeout(() => {
249
+ this.tabset.focusKeyManager?.activeItem?.focus();
250
+ });
251
+ }
252
+ }
253
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
254
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiTabNextComponent, isStandalone: true, selector: "si-tab-next", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { active: "activeChange" }, host: { listeners: { "click": "selectTab()", "keydown.enter": "selectTab()" }, properties: { "class.active": "active()", "attr.aria-selected": "active()" } }, usesInheritance: true, ngImport: i0, template: "@let icon = this.icon();\n@if (icon) {\n <si-icon-next class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n@if (badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent() && badgeColor()) {\n <span class=\"badge\" [ngClass]=\"'bg-' + badgeColor()\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(badgeContent() ?? '') | translate }}\n </span>\n} @else if (badgeContent() && !badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(badgeContent() ?? '') | translate }}</span>\n}\n@if (closable() && !disabledTab()) {\n <si-icon-next\n class=\"ms-4 me-n4 btn btn-circle btn-xs btn-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0);color:var(--element-text-primary)}:host.nav-link span.badge-dot{inset-block-end:100%;inset-inline-start:12px;margin-inline-end:12px}:host.nav-link span.badge-text{inset-block-end:calc(100% - 7px);inset-inline-start:2px}.tab-icon{font-size:24px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SiIconNextComponent, selector: "si-icon-next", inputs: ["icon"] }, { kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i1.SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
255
+ }
256
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextComponent, decorators: [{
257
+ type: Component,
258
+ args: [{ selector: 'si-tab-next', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgClass, SiIconNextComponent, SiTranslateModule], host: {
259
+ '[class.active]': 'active()',
260
+ '[attr.aria-selected]': 'active()',
261
+ '(click)': 'selectTab()',
262
+ '(keydown.enter)': 'selectTab()'
263
+ }, template: "@let icon = this.icon();\n@if (icon) {\n <si-icon-next class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n@if (badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent() && badgeColor()) {\n <span class=\"badge\" [ngClass]=\"'bg-' + badgeColor()\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(badgeContent() ?? '') | translate }}\n </span>\n} @else if (badgeContent() && !badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(badgeContent() ?? '') | translate }}</span>\n}\n@if (closable() && !disabledTab()) {\n <si-icon-next\n class=\"ms-4 me-n4 btn btn-circle btn-xs btn-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0);color:var(--element-text-primary)}:host.nav-link span.badge-dot{inset-block-end:100%;inset-inline-start:12px;margin-inline-end:12px}:host.nav-link span.badge-text{inset-block-end:calc(100% - 7px);inset-inline-start:2px}.tab-icon{font-size:24px}\n"] }]
264
+ }] });
265
+
266
+ /**
267
+ * Copyright Siemens 2016 - 2025.
268
+ * SPDX-License-Identifier: MIT
269
+ */
270
+ /** @experimental */
271
+ class SiTabsetNextComponent {
272
+ /**
273
+ * Event emitter to notify when a tab became inactive.
274
+ */
275
+ deselect = output();
276
+ /** @internal */
277
+ visibleTabIndexes = signal([]);
278
+ /** @internal */
279
+ activeTab = computed(() => {
280
+ return this.tabPanels().find(tab => tab.active());
281
+ });
282
+ /** @internal */
283
+ activeTabIndex = computed(() => this.activeTab()?.index() ?? -1);
284
+ /** @internal */
285
+ focusKeyManager;
286
+ tabPanelsLinks = contentChildren(SiTabNextLinkComponent);
287
+ tabPanelsComponents = contentChildren(SiTabNextComponent);
288
+ /** @internal */
289
+ tabPanels = computed(() => {
290
+ const allTabs = [
291
+ ...this.tabPanelsLinks(),
292
+ ...this.tabPanelsComponents()
293
+ ];
294
+ return allTabs;
295
+ });
296
+ /** @internal */
297
+ tabContainer = viewChild.required('tabContainer');
298
+ tabScrollContainer = viewChild.required('tabScrollContainer');
299
+ maxWrapperWidth = computed(() => {
300
+ const visibleIndexes = this.visibleTabIndexes();
301
+ return visibleIndexes.length
302
+ ? this.tabButtons()
303
+ .filter((_, index) => visibleIndexes.includes(index))
304
+ .reduce((total, current) => {
305
+ return total + current.nativeElement.clientWidth;
306
+ }, 0)
307
+ : undefined;
308
+ });
309
+ menu = viewChild('menu', { read: CdkMenu });
310
+ tabButtons = computed(() => {
311
+ return this.tabPanels().map(tab => tab.tabButton);
312
+ });
313
+ menuButton = viewChild('menuButton');
314
+ previousWidth = 0;
315
+ injector = inject(INJECTOR);
316
+ ngAfterViewInit() {
317
+ this.focusKeyManager = new FocusKeyManager(this.tabPanels, this.injector);
318
+ // To avoid ExpressionChangedAfterItHasBeenCheckedError
319
+ setTimeout(() => {
320
+ this.focusKeyManager?.updateActiveItem(this.tabPanels().findIndex(tab => !tab.disabledTab()));
321
+ });
322
+ }
323
+ resize(e) {
324
+ if (this.previousWidth && this.previousWidth === e.width) {
325
+ return;
326
+ }
327
+ else {
328
+ this.previousWidth = e.width;
329
+ }
330
+ this.updateVisibleTabIndexes(this.activeTabIndex(), 'next', true);
331
+ }
332
+ menuOpened() {
333
+ // wait for menu items to be rendered
334
+ setTimeout(() => {
335
+ const nextMenuItemToFocus = this.getNextIndexToFocus(this.activeTabIndex() + 1);
336
+ const menuItems = this.menu()?.items.toArray() ?? [];
337
+ if (nextMenuItemToFocus >= 0 && nextMenuItemToFocus < menuItems.length) {
338
+ menuItems[nextMenuItemToFocus].focus();
339
+ // bug in cdk as setting focus on menu item does not update focus manager active item
340
+ // eslint-disable-next-line @typescript-eslint/dot-notation
341
+ const focusManager = this.menu()?.['keyManager'];
342
+ focusManager?.updateActiveItem(nextMenuItemToFocus);
343
+ }
344
+ else {
345
+ menuItems[0].focus();
346
+ }
347
+ });
348
+ }
349
+ tabIsLink(tab) {
350
+ return tab instanceof SiTabNextLinkComponent;
351
+ }
352
+ /** @internal */
353
+ focusPrevious(e) {
354
+ e.preventDefault();
355
+ const activeItemIndex = this.focusKeyManager?.activeItemIndex;
356
+ if (activeItemIndex > 0) {
357
+ this.focusKeyManager?.setPreviousItemActive();
358
+ this.updateVisibleTabIndexes(this.focusKeyManager.activeItemIndex, 'previous');
359
+ setTimeout(() => {
360
+ this.focusKeyManager?.setActiveItem(this.focusKeyManager.activeItemIndex);
361
+ });
362
+ }
363
+ }
364
+ /** @internal */
365
+ focusNext(e) {
366
+ e.preventDefault();
367
+ const activeItemIndex = this.focusKeyManager?.activeItemIndex;
368
+ if (activeItemIndex < this.tabButtons().length) {
369
+ this.focusKeyManager?.setNextItemActive();
370
+ this.updateVisibleTabIndexes(this.focusKeyManager.activeItemIndex, 'next');
371
+ setTimeout(() => {
372
+ this.focusKeyManager?.setActiveItem(this.focusKeyManager.activeItemIndex);
373
+ });
374
+ }
375
+ }
376
+ /** @internal */
377
+ updateVisibleTabIndexes(startIndex, type, forceUpdate) {
378
+ if (startIndex < this.tabButtons().length) {
379
+ if (!this.visibleTabIndexes().includes(startIndex) || forceUpdate) {
380
+ let availableWidth = this.tabContainer().nativeElement.clientWidth;
381
+ if (this.menuButton()) {
382
+ availableWidth = availableWidth - this.menuButton().nativeElement.clientWidth;
383
+ }
384
+ let consumedWidth = 0;
385
+ const visibleTabIndexes = [];
386
+ const calculateConsumedWidth = (i) => {
387
+ consumedWidth += this.tabButtons()[i].nativeElement.clientWidth;
388
+ if (visibleTabIndexes.includes(0) &&
389
+ i === this.tabButtons().length - 1 &&
390
+ this.menuButton()) {
391
+ availableWidth = availableWidth + this.menuButton().nativeElement.clientWidth;
392
+ }
393
+ if (consumedWidth <= availableWidth) {
394
+ visibleTabIndexes.push(i);
395
+ return false;
396
+ }
397
+ else {
398
+ consumedWidth -= this.tabButtons()[i].nativeElement.clientWidth;
399
+ return true;
400
+ }
401
+ };
402
+ const isNextDirection = type === 'next';
403
+ // First pass: Calculate in primary direction
404
+ const primaryRange = this.getPrimaryRange(isNextDirection, startIndex, this.tabButtons().length);
405
+ this.traverseRange(primaryRange, calculateConsumedWidth);
406
+ // Second pass: Calculate in opposite direction if space available
407
+ if (consumedWidth < availableWidth) {
408
+ const secondaryRange = this.getSecondaryRange(isNextDirection, startIndex, this.tabButtons().length);
409
+ this.traverseRange(secondaryRange, calculateConsumedWidth);
410
+ }
411
+ visibleTabIndexes.sort((a, b) => a - b);
412
+ this.visibleTabIndexes.set(visibleTabIndexes);
413
+ this.scrollFirstVisibleTabIntoView();
414
+ }
415
+ }
416
+ }
417
+ /** @internal */
418
+ getNextIndexToFocus(currentIndex) {
419
+ for (let i = 0; i < this.tabPanels().length; i++) {
420
+ // Get the actual index using modulo to wrap around
421
+ const checkIndex = (currentIndex + i) % this.tabPanels().length;
422
+ if (!this.tabPanels()[checkIndex].disabledTab()) {
423
+ return this.tabPanels()[checkIndex].index();
424
+ }
425
+ }
426
+ return -1;
427
+ }
428
+ getPrimaryRange(isNextDirection, startIndex, length) {
429
+ return isNextDirection
430
+ ? { start: startIndex, end: 0, step: -1 }
431
+ : { start: startIndex, end: length - 1, step: 1 };
432
+ }
433
+ getSecondaryRange(isNextDirection, startIndex, length) {
434
+ return isNextDirection
435
+ ? { start: startIndex + 1, end: length - 1, step: 1 }
436
+ : { start: startIndex - 1, end: 0, step: -1 };
437
+ }
438
+ traverseRange(range, callback) {
439
+ const condition = (i) => (range.step > 0 ? i <= range.end : i >= range.end);
440
+ for (let i = range.start; condition(i); i += range.step) {
441
+ if (callback(i)) {
442
+ break;
443
+ }
444
+ }
445
+ }
446
+ scrollFirstVisibleTabIntoView() {
447
+ setTimeout(() => {
448
+ this.tabButtons().at(this.visibleTabIndexes()[0])?.nativeElement.scrollIntoView({
449
+ behavior: 'instant',
450
+ inline: 'start',
451
+ block: 'nearest'
452
+ });
453
+ });
454
+ }
455
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabsetNextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
456
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiTabsetNextComponent, isStandalone: true, selector: "si-tabset-next", outputs: { deselect: "deselect" }, providers: [
457
+ {
458
+ provide: SI_TABSET_NEXT,
459
+ useExisting: SiTabsetNextComponent
460
+ }
461
+ ], queries: [{ propertyName: "tabPanelsLinks", predicate: SiTabNextLinkComponent, isSignal: true }, { propertyName: "tabPanelsComponents", predicate: SiTabNextComponent, isSignal: true }], viewQueries: [{ propertyName: "tabContainer", first: true, predicate: ["tabContainer"], descendants: true, isSignal: true }, { propertyName: "tabScrollContainer", first: true, predicate: ["tabScrollContainer"], descendants: true, isSignal: true }, { propertyName: "menu", first: true, predicate: ["menu"], descendants: true, read: CdkMenu, isSignal: true }, { propertyName: "menuButton", first: true, predicate: ["menuButton"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"tabs-container\">\n <div\n #tabContainer\n class=\"tab-container-buttonbar-list nav nav-tabs\"\n (siResizeObserver)=\"resize($event)\"\n >\n <div\n #tabScrollContainer\n role=\"tablist\"\n tabindex=\"-1\"\n class=\"d-flex tabs-wrapper\"\n [style.max-width.px]=\"maxWrapperWidth()\"\n >\n <ng-content />\n </div>\n\n @if (visibleTabIndexes().length < tabPanels().length) {\n <button\n #menuButton\n type=\"button\"\n class=\"dropdown btn btn-tertiary focus-inside\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [cdkMenuTriggerFor]=\"tabsMenu\"\n (cdkMenuOpened)=\"menuOpened()\"\n >\n <i class=\"icon element-options m-0\"></i>\n </button>\n }\n </div>\n @let tabContent = this.activeTab()?.tabContent();\n @let activeTab = this.activeTab();\n\n @if (activeTab) {\n <div\n class=\"tab-content\"\n role=\"tabpanel\"\n [id]=\"'content-' + activeTab.tabId\"\n [attr.aria-labelledby]=\"'tab-' + activeTab.tabId\"\n >\n @if (tabContent) {\n <ng-container [ngTemplateOutlet]=\"tabContent\" />\n }\n\n <ng-content select=\"router-outlet\" />\n </div>\n }\n</div>\n\n<ng-template #tabsMenu>\n <si-menu #menu>\n @for (tab of tabPanels(); track tab) {\n @let badgeColor = tab.badgeColor();\n @let badgeIsNumber = tab.badgeIsNumber();\n\n @if (badgeColor && badgeIsNumber) {\n <!-- eslint-disable @angular-eslint/template/no-any -->\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else if (badgeIsNumber && badgeColor) {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <!-- eslint-enable -->\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n }\n }\n </si-menu>\n</ng-template>\n\n<ng-template #badgeTemplate let-tab=\"tab\">\n <div class=\"d-flex align-items-center space-between flex-no-wrap justify-content-between\">\n {{ tab.heading() }}\n @if (tab.badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n } @else if (tab.badgeContent() && !tab.badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(tab.badgeContent() ?? '') | translate }}</span>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;flex-direction:column}.tabs-container{display:flex;flex-wrap:wrap;overflow:hidden;block-size:100%;min-block-size:40px}.tabs-container:before{inset-block-start:38px;inset-block-end:auto}.tab-container-buttonbar-list{display:flex;min-block-size:40px;overflow:hidden;flex:1;order:1;min-inline-size:100px}.btn.dropdown{color:var(--element-text-primary);min-inline-size:0;border-block-end:2px solid var(--element-ui-4);order:2;block-size:40px;padding-inline:12px}.btn.dropdown:hover{border-color:var(--element-ui-4);color:var(--element-action-secondary-text-hover)}a[si-menu-item] .badge-dot{inset-block-end:4px;min-inline-size:12px;margin-inline-start:4px}.tab-content{inline-size:100%;block-size:calc(100% - 40px);order:3}.tabs-wrapper{overflow-y:hidden;overflow-x:auto;scroll-behavior:smooth;scrollbar-width:none}\n"], dependencies: [{ kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i1.SiTranslatePipe, name: "translate" }, { kind: "directive", type: SiMenuDirective, selector: "si-menu" }, { kind: "component", type: SiMenuItemComponent, selector: "si-menu-item, a[si-menu-item], button[si-menu-item]" }, { kind: "directive", type: CdkMenuTrigger, selector: "[cdkMenuTriggerFor]", inputs: ["cdkMenuTriggerFor", "cdkMenuPosition", "cdkMenuTriggerData"], outputs: ["cdkMenuOpened", "cdkMenuClosed"], exportAs: ["cdkMenuTriggerFor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: SiResizeObserverModule }, { kind: "directive", type: i2.SiResizeObserverDirective, selector: "[siResizeObserver]", inputs: ["resizeThrottle"], outputs: ["siResizeObserver"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
462
+ }
463
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabsetNextComponent, decorators: [{
464
+ type: Component,
465
+ args: [{ selector: 'si-tabset-next', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
466
+ SiTranslateModule,
467
+ SiMenuDirective,
468
+ SiMenuItemComponent,
469
+ CdkMenuTrigger,
470
+ NgTemplateOutlet,
471
+ SiResizeObserverModule,
472
+ RouterLink
473
+ ], providers: [
474
+ {
475
+ provide: SI_TABSET_NEXT,
476
+ useExisting: SiTabsetNextComponent
477
+ }
478
+ ], template: "<div class=\"tabs-container\">\n <div\n #tabContainer\n class=\"tab-container-buttonbar-list nav nav-tabs\"\n (siResizeObserver)=\"resize($event)\"\n >\n <div\n #tabScrollContainer\n role=\"tablist\"\n tabindex=\"-1\"\n class=\"d-flex tabs-wrapper\"\n [style.max-width.px]=\"maxWrapperWidth()\"\n >\n <ng-content />\n </div>\n\n @if (visibleTabIndexes().length < tabPanels().length) {\n <button\n #menuButton\n type=\"button\"\n class=\"dropdown btn btn-tertiary focus-inside\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [cdkMenuTriggerFor]=\"tabsMenu\"\n (cdkMenuOpened)=\"menuOpened()\"\n >\n <i class=\"icon element-options m-0\"></i>\n </button>\n }\n </div>\n @let tabContent = this.activeTab()?.tabContent();\n @let activeTab = this.activeTab();\n\n @if (activeTab) {\n <div\n class=\"tab-content\"\n role=\"tabpanel\"\n [id]=\"'content-' + activeTab.tabId\"\n [attr.aria-labelledby]=\"'tab-' + activeTab.tabId\"\n >\n @if (tabContent) {\n <ng-container [ngTemplateOutlet]=\"tabContent\" />\n }\n\n <ng-content select=\"router-outlet\" />\n </div>\n }\n</div>\n\n<ng-template #tabsMenu>\n <si-menu #menu>\n @for (tab of tabPanels(); track tab) {\n @let badgeColor = tab.badgeColor();\n @let badgeIsNumber = tab.badgeIsNumber();\n\n @if (badgeColor && badgeIsNumber) {\n <!-- eslint-disable @angular-eslint/template/no-any -->\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else if (badgeIsNumber && badgeColor) {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <!-- eslint-enable -->\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n }\n }\n </si-menu>\n</ng-template>\n\n<ng-template #badgeTemplate let-tab=\"tab\">\n <div class=\"d-flex align-items-center space-between flex-no-wrap justify-content-between\">\n {{ tab.heading() }}\n @if (tab.badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n } @else if (tab.badgeContent() && !tab.badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(tab.badgeContent() ?? '') | translate }}</span>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;flex-direction:column}.tabs-container{display:flex;flex-wrap:wrap;overflow:hidden;block-size:100%;min-block-size:40px}.tabs-container:before{inset-block-start:38px;inset-block-end:auto}.tab-container-buttonbar-list{display:flex;min-block-size:40px;overflow:hidden;flex:1;order:1;min-inline-size:100px}.btn.dropdown{color:var(--element-text-primary);min-inline-size:0;border-block-end:2px solid var(--element-ui-4);order:2;block-size:40px;padding-inline:12px}.btn.dropdown:hover{border-color:var(--element-ui-4);color:var(--element-action-secondary-text-hover)}a[si-menu-item] .badge-dot{inset-block-end:4px;min-inline-size:12px;margin-inline-start:4px}.tab-content{inline-size:100%;block-size:calc(100% - 40px);order:3}.tabs-wrapper{overflow-y:hidden;overflow-x:auto;scroll-behavior:smooth;scrollbar-width:none}\n"] }]
479
+ }] });
480
+
481
+ /**
482
+ * Copyright Siemens 2016 - 2025.
483
+ * SPDX-License-Identifier: MIT
484
+ */
485
+
486
+ /**
487
+ * Generated bundle index. Do not edit.
488
+ */
489
+
490
+ export { SiTabNextComponent, SiTabNextLinkComponent, SiTabsetNextComponent };
491
+ //# sourceMappingURL=siemens-element-ng-tabs-next.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siemens-element-ng-tabs-next.mjs","sources":["../../../../projects/element-ng/tabs-next/si-tabs-tokens.ts","../../../../projects/element-ng/tabs-next/si-tab-next-base.directive.ts","../../../../projects/element-ng/tabs-next/si-tab-next-link.component.ts","../../../../projects/element-ng/tabs-next/si-tab-next.component.html","../../../../projects/element-ng/tabs-next/si-tab-next.component.ts","../../../../projects/element-ng/tabs-next/si-tabset-next.component.ts","../../../../projects/element-ng/tabs-next/si-tabset-next.component.html","../../../../projects/element-ng/tabs-next/index.ts","../../../../projects/element-ng/tabs-next/siemens-element-ng-tabs-next.ts"],"sourcesContent":["/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { InjectionToken } from '@angular/core';\n\nimport { SiTabsetNextComponent } from './si-tabset-next.component';\n\nexport const SI_TABSET_NEXT = new InjectionToken<SiTabsetNextComponent>('SiTabsetNextComponent');\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { FocusableOption, FocusOrigin } from '@angular/cdk/a11y';\nimport {\n booleanAttribute,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n TemplateRef,\n viewChild,\n WritableSignal\n} from '@angular/core';\nimport { addIcons, elementCancel } from '@siemens/element-ng/icon';\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { SI_TABSET_NEXT } from './si-tabs-tokens';\n\n@Directive({\n selector: '[siTabNextBase]',\n host: {\n class: 'nav-link focus-inside px-5 si-title-1',\n role: 'tab',\n '[class.disabled]': 'disabledTab()',\n '[attr.id]': \"'tab-' + tabId\",\n '[attr.aria-disabled]': 'disabledTab()',\n '[attr.tabindex]': 'tabset.focusKeyManager?.activeItem === this && !disabledTab() ? 0 : -1',\n '[attr.aria-controls]': \"'content-' + tabId\",\n '(keydown.arrowLeft)': 'tabset.focusPrevious($event)',\n '(keydown.arrowRight)': 'tabset.focusNext($event)',\n '(keydown.delete)': 'closeTab($event, true)'\n }\n})\nexport abstract class SiTabNextBaseDirective implements OnDestroy, FocusableOption {\n abstract readonly active: WritableSignal<boolean>;\n /** Title of the tab item. */\n readonly heading = input.required<TranslatableString>();\n /**\n * Icon of the tab item.\n * If provided, heading text will be ignored and only icon will be displayed.\n */\n readonly icon = input<string>();\n /**\n * Additional badge content. A value of\n * - `true` will render a red dot\n * - any string without a `badgeColor` will render a red dot with text\n * - any string with a `badgeColor` will render a normal badge\n */\n readonly badgeContent = input<TranslatableString | boolean>();\n /**\n * Background color of the badge.\n * If no color is provided a red dot badge will be rendered.\n */\n readonly badgeColor = input<string>();\n /**\n * Disables the tab.\n *\n * @defaultValue false\n */\n readonly disabledTab = input(false, {\n transform: booleanAttribute,\n // eslint-disable-next-line @angular-eslint/no-input-rename\n alias: 'disabled'\n });\n /**\n * Close the current tab.\n *\n * @defaultValue false\n */\n readonly closable = input(false, {\n transform: booleanAttribute\n });\n /** Event emitter to notify when a tab is closed. */\n readonly closeTriggered = output();\n\n /** @internal */\n readonly badgeIsNumber = computed(() => {\n return typeof this.badgeContent() !== 'boolean';\n });\n\n readonly tabButton = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly tabContent = viewChild('tabContent', { read: TemplateRef });\n\n private static tabCounter = 0;\n private retainFocus = false;\n private indexBeforeClose = -1;\n\n /** @internal */\n tabId = `${SiTabNextBaseDirective.tabCounter++}`;\n protected readonly icons = addIcons({ elementCancel });\n protected tabset = inject(SI_TABSET_NEXT);\n /** @internal */\n readonly index = computed(() =>\n this.tabset.tabPanels().findIndex(tab => tab.tabId === this.tabId)\n );\n\n /** @internal */\n isTabButtonFullyVisible(): boolean {\n const tabButton = this.tabButton.nativeElement;\n const tabsetElement = this.tabset.tabScrollContainer().nativeElement;\n\n const tabButtonRect = tabButton.getBoundingClientRect();\n const tabsetRect = tabsetElement.getBoundingClientRect();\n return (\n Math.round(tabButtonRect.left) >= Math.round(tabsetRect.left) &&\n Math.round(tabButtonRect.right) <= Math.round(tabsetRect.right)\n );\n }\n\n ngOnDestroy(): void {\n // adjust the focus index and selected tab index if component is destroyed\n // as a side effect to close tab event\n if (this.indexBeforeClose >= 0) {\n const indexToFocus = this.tabset.getNextIndexToFocus(this.indexBeforeClose);\n if (this.retainFocus) {\n // wait for a cycle to render the tab if not visible\n setTimeout(() => {\n this.tabset.focusKeyManager?.setActiveItem(indexToFocus);\n });\n } else if (this.indexBeforeClose >= 0 && this.active()) {\n this.tabset.focusKeyManager?.updateActiveItem(indexToFocus);\n this.tabset.tabPanels()[indexToFocus].tabButton.nativeElement.focus();\n } else {\n let selectedItemIndex = this.tabset.activeTabIndex() ?? 0;\n if (selectedItemIndex > this.indexBeforeClose) {\n selectedItemIndex--;\n }\n this.tabset.focusKeyManager?.updateActiveItem(selectedItemIndex);\n this.tabset.tabPanels()[selectedItemIndex].tabButton.nativeElement.focus();\n }\n // if this tab was the active one we need to select next tab as active\n if (this.active()) {\n const targetActiveTab = this.tabset.tabPanels()[indexToFocus];\n if (targetActiveTab) {\n targetActiveTab.active.set(true);\n }\n }\n this.tabset.updateVisibleTabIndexes(indexToFocus, 'next', true);\n }\n }\n\n protected closeTab(event: Event, retainFocus = false): void {\n if (this.closable() && !this.disabledTab()) {\n event.stopPropagation();\n const index = this.index();\n this.closeTriggered.emit();\n this.retainFocus = retainFocus;\n this.indexBeforeClose = index;\n }\n }\n\n focus(origin?: FocusOrigin): void {\n this.tabButton.nativeElement.focus();\n }\n\n get disabled(): boolean {\n return this.disabledTab();\n }\n\n abstract selectTab(retainFocus?: boolean): void;\n}\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router, RouterLink, RouterLinkActive } from '@angular/router';\nimport { SiIconNextComponent } from '@siemens/element-ng/icon';\nimport { SiTranslateModule } from '@siemens/element-translate-ng/translate';\n\nimport { SiTabNextBaseDirective } from './si-tab-next-base.directive';\n\n/** @experimental */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'a[si-tab-next][routerLink]',\n templateUrl: './si-tab-next.component.html',\n styleUrl: './si-tab-next.component.scss',\n imports: [NgClass, SiIconNextComponent, SiTranslateModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.active]': 'routerLinkActive.isActive',\n '[attr.aria-selected]': 'routerLinkActive.isActive'\n },\n hostDirectives: [\n {\n directive: RouterLinkActive\n }\n ]\n})\nexport class SiTabNextLinkComponent extends SiTabNextBaseDirective {\n private router = inject(Router, { optional: true });\n /** @defaultValue false */\n override readonly active = signal(false);\n /** @internal */\n routerLink = inject(RouterLink, { optional: true, self: true });\n private routerLinkActive = inject(RouterLinkActive, { self: true });\n constructor() {\n super();\n this.routerLinkActive.isActiveChange\n .pipe(takeUntilDestroyed())\n .subscribe(isActive => this.active.set(isActive));\n\n effect(() => {\n if (this.active()) {\n if (this.router && this.routerLink?.urlTree) {\n this.router.navigateByUrl(this.routerLink.urlTree);\n }\n }\n });\n }\n\n /** @internal */\n override selectTab(retainFocus?: boolean): void {\n if (!this.isTabButtonFullyVisible()) {\n this.tabset.updateVisibleTabIndexes(this.index(), 'next');\n this.tabset.focusKeyManager?.updateActiveItem(this.index());\n }\n if (retainFocus) {\n setTimeout(() => {\n this.tabset.focusKeyManager?.setActiveItem(this);\n });\n }\n }\n}\n","@let icon = this.icon();\n@if (icon) {\n <si-icon-next class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n@if (badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent() && badgeColor()) {\n <span class=\"badge\" [ngClass]=\"'bg-' + badgeColor()\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(badgeContent() ?? '') | translate }}\n </span>\n} @else if (badgeContent() && !badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(badgeContent() ?? '') | translate }}</span>\n}\n@if (closable() && !disabledTab()) {\n <si-icon-next\n class=\"ms-4 me-n4 btn btn-circle btn-xs btn-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, model, OnDestroy } from '@angular/core';\nimport { SiIconNextComponent } from '@siemens/element-ng/icon';\nimport { SiTranslateModule } from '@siemens/element-translate-ng/translate';\n\nimport { SiTabNextBaseDirective } from './si-tab-next-base.directive';\n\n/** @experimental */\n@Component({\n selector: 'si-tab-next',\n templateUrl: './si-tab-next.component.html',\n styleUrl: './si-tab-next.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, SiIconNextComponent, SiTranslateModule],\n host: {\n '[class.active]': 'active()',\n '[attr.aria-selected]': 'active()',\n '(click)': 'selectTab()',\n '(keydown.enter)': 'selectTab()'\n }\n})\nexport class SiTabNextComponent extends SiTabNextBaseDirective implements OnDestroy {\n /**\n * Whether the tab is active or not.\n * If set to `true`, the tab will be selected and its content will be displayed.\n * @defaultValue false\n * */\n override readonly active = model(false);\n\n /** @internal */\n selectTab(retainFocus?: boolean): void {\n const tabs = this.tabset.tabPanels();\n const newTabIndex = this.index();\n const currentTabIndex = this.tabset.activeTabIndex();\n let continueWithSelection = newTabIndex !== currentTabIndex;\n\n if (continueWithSelection && currentTabIndex !== -1) {\n const currentTab = tabs[currentTabIndex];\n const deselectEvent = {\n target: currentTab,\n tabIndex: currentTabIndex,\n cancel: () => {\n continueWithSelection = false;\n currentTab.active.set(true);\n }\n };\n\n currentTab.active.set(false);\n this.tabset.deselect.emit(deselectEvent);\n }\n\n if (continueWithSelection) {\n this.active.set(true);\n this.tabset.focusKeyManager?.updateActiveItem(newTabIndex);\n }\n if (!this.isTabButtonFullyVisible()) {\n this.tabset.updateVisibleTabIndexes(newTabIndex, 'next');\n this.tabset.focusKeyManager?.updateActiveItem(newTabIndex);\n }\n if (retainFocus) {\n setTimeout(() => {\n this.tabset.focusKeyManager?.activeItem?.focus();\n });\n }\n }\n}\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { FocusKeyManager } from '@angular/cdk/a11y';\nimport { CdkMenu, CdkMenuTrigger } from '@angular/cdk/menu';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n ElementRef,\n inject,\n INJECTOR,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { SiMenuDirective, SiMenuItemComponent } from '@siemens/element-ng/menu';\nimport { ElementDimensions, SiResizeObserverModule } from '@siemens/element-ng/resize-observer';\nimport { SiTranslateModule } from '@siemens/element-translate-ng/translate';\n\nimport { SiTabNextLinkComponent } from './si-tab-next-link.component';\nimport { SiTabNextComponent } from './si-tab-next.component';\nimport { SI_TABSET_NEXT } from './si-tabs-tokens';\n\n/** @experimental */\nexport interface SiTabNextDeselectionEvent {\n /**\n * The target tab\n */\n target: SiTabNextComponent | SiTabNextLinkComponent;\n /**\n * The index of target tab\n */\n tabIndex: number;\n /**\n * To be called to prevent switching the tab\n */\n cancel: () => void;\n}\n\ninterface RangeConfig {\n start: number;\n end: number;\n step: number;\n}\n\n/** @experimental */\n@Component({\n selector: 'si-tabset-next',\n templateUrl: './si-tabset-next.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './si-tabset-next.component.scss',\n imports: [\n SiTranslateModule,\n SiMenuDirective,\n SiMenuItemComponent,\n CdkMenuTrigger,\n NgTemplateOutlet,\n SiResizeObserverModule,\n RouterLink\n ],\n providers: [\n {\n provide: SI_TABSET_NEXT,\n useExisting: SiTabsetNextComponent\n }\n ]\n})\nexport class SiTabsetNextComponent implements AfterViewInit {\n /**\n * Event emitter to notify when a tab became inactive.\n */\n readonly deselect = output<SiTabNextDeselectionEvent>();\n\n /** @internal */\n readonly visibleTabIndexes = signal<number[]>([]);\n /** @internal */\n readonly activeTab = computed(() => {\n return this.tabPanels().find(tab => tab.active());\n });\n /** @internal */\n readonly activeTabIndex = computed(() => this.activeTab()?.index() ?? -1);\n\n /** @internal */\n focusKeyManager?: FocusKeyManager<SiTabNextComponent | SiTabNextLinkComponent>;\n\n private readonly tabPanelsLinks = contentChildren(SiTabNextLinkComponent);\n private readonly tabPanelsComponents = contentChildren(SiTabNextComponent);\n\n /** @internal */\n readonly tabPanels = computed(() => {\n const allTabs: (SiTabNextLinkComponent | SiTabNextComponent)[] = [\n ...this.tabPanelsLinks(),\n ...this.tabPanelsComponents()\n ];\n return allTabs;\n });\n /** @internal */\n private readonly tabContainer = viewChild.required<ElementRef<HTMLDivElement>>('tabContainer');\n readonly tabScrollContainer =\n viewChild.required<ElementRef<HTMLDivElement>>('tabScrollContainer');\n\n protected readonly maxWrapperWidth = computed(() => {\n const visibleIndexes = this.visibleTabIndexes();\n return visibleIndexes.length\n ? this.tabButtons()\n .filter((_, index) => visibleIndexes.includes(index))\n .reduce((total, current) => {\n return total + current.nativeElement.clientWidth;\n }, 0)\n : undefined;\n });\n protected readonly menu = viewChild('menu', { read: CdkMenu });\n\n private readonly tabButtons = computed(() => {\n return this.tabPanels().map(tab => tab.tabButton);\n });\n\n private readonly menuButton = viewChild<ElementRef<HTMLButtonElement>>('menuButton');\n private previousWidth = 0;\n private injector = inject(INJECTOR);\n\n ngAfterViewInit(): void {\n this.focusKeyManager = new FocusKeyManager(this.tabPanels, this.injector);\n // To avoid ExpressionChangedAfterItHasBeenCheckedError\n setTimeout(() => {\n this.focusKeyManager?.updateActiveItem(this.tabPanels().findIndex(tab => !tab.disabledTab()));\n });\n }\n\n protected resize(e: ElementDimensions): void {\n if (this.previousWidth && this.previousWidth === e.width) {\n return;\n } else {\n this.previousWidth = e.width;\n }\n this.updateVisibleTabIndexes(this.activeTabIndex(), 'next', true);\n }\n\n protected menuOpened(): void {\n // wait for menu items to be rendered\n setTimeout(() => {\n const nextMenuItemToFocus = this.getNextIndexToFocus(this.activeTabIndex() + 1);\n const menuItems = this.menu()?.items.toArray() ?? [];\n if (nextMenuItemToFocus >= 0 && nextMenuItemToFocus < menuItems.length) {\n menuItems[nextMenuItemToFocus].focus();\n // bug in cdk as setting focus on menu item does not update focus manager active item\n // eslint-disable-next-line @typescript-eslint/dot-notation\n const focusManager = this.menu()?.['keyManager'];\n focusManager?.updateActiveItem(nextMenuItemToFocus);\n } else {\n menuItems[0].focus();\n }\n });\n }\n\n protected tabIsLink(tab: unknown): tab is SiTabNextLinkComponent {\n return tab instanceof SiTabNextLinkComponent;\n }\n\n /** @internal */\n focusPrevious(e: Event): void {\n e.preventDefault();\n const activeItemIndex = this.focusKeyManager?.activeItemIndex;\n if (activeItemIndex! > 0) {\n this.focusKeyManager?.setPreviousItemActive();\n this.updateVisibleTabIndexes(this.focusKeyManager!.activeItemIndex!, 'previous');\n setTimeout(() => {\n this.focusKeyManager?.setActiveItem(this.focusKeyManager!.activeItemIndex!);\n });\n }\n }\n\n /** @internal */\n focusNext(e: Event): void {\n e.preventDefault();\n const activeItemIndex = this.focusKeyManager?.activeItemIndex;\n if (activeItemIndex! < this.tabButtons().length) {\n this.focusKeyManager?.setNextItemActive();\n this.updateVisibleTabIndexes(this.focusKeyManager!.activeItemIndex!, 'next');\n setTimeout(() => {\n this.focusKeyManager?.setActiveItem(this.focusKeyManager!.activeItemIndex!);\n });\n }\n }\n\n /** @internal */\n updateVisibleTabIndexes(\n startIndex: number,\n type: 'next' | 'previous',\n forceUpdate?: boolean\n ): void {\n if (startIndex < this.tabButtons().length) {\n if (!this.visibleTabIndexes().includes(startIndex) || forceUpdate) {\n let availableWidth = this.tabContainer().nativeElement.clientWidth;\n\n if (this.menuButton()) {\n availableWidth = availableWidth - this.menuButton()!.nativeElement.clientWidth;\n }\n\n let consumedWidth = 0;\n const visibleTabIndexes: number[] = [];\n\n const calculateConsumedWidth = (i: number): boolean => {\n consumedWidth += this.tabButtons()[i].nativeElement.clientWidth;\n if (\n visibleTabIndexes.includes(0) &&\n i === this.tabButtons().length - 1 &&\n this.menuButton()\n ) {\n availableWidth = availableWidth + this.menuButton()!.nativeElement.clientWidth;\n }\n if (consumedWidth <= availableWidth) {\n visibleTabIndexes.push(i);\n return false;\n } else {\n consumedWidth -= this.tabButtons()[i].nativeElement.clientWidth;\n return true;\n }\n };\n\n const isNextDirection: boolean = type === 'next';\n\n // First pass: Calculate in primary direction\n const primaryRange = this.getPrimaryRange(\n isNextDirection,\n startIndex,\n this.tabButtons().length\n );\n this.traverseRange(primaryRange, calculateConsumedWidth);\n\n // Second pass: Calculate in opposite direction if space available\n if (consumedWidth < availableWidth) {\n const secondaryRange = this.getSecondaryRange(\n isNextDirection,\n startIndex,\n this.tabButtons().length\n );\n this.traverseRange(secondaryRange, calculateConsumedWidth);\n }\n visibleTabIndexes.sort((a, b) => a - b);\n this.visibleTabIndexes.set(visibleTabIndexes);\n this.scrollFirstVisibleTabIntoView();\n }\n }\n }\n\n /** @internal */\n getNextIndexToFocus(currentIndex: number): number {\n for (let i = 0; i < this.tabPanels().length; i++) {\n // Get the actual index using modulo to wrap around\n const checkIndex = (currentIndex + i) % this.tabPanels().length;\n\n if (!this.tabPanels()[checkIndex].disabledTab()) {\n return this.tabPanels()[checkIndex].index();\n }\n }\n return -1;\n }\n\n private getPrimaryRange(\n isNextDirection: boolean,\n startIndex: number,\n length: number\n ): RangeConfig {\n return isNextDirection\n ? { start: startIndex, end: 0, step: -1 }\n : { start: startIndex, end: length - 1, step: 1 };\n }\n\n private getSecondaryRange(\n isNextDirection: boolean,\n startIndex: number,\n length: number\n ): RangeConfig {\n return isNextDirection\n ? { start: startIndex + 1, end: length - 1, step: 1 }\n : { start: startIndex - 1, end: 0, step: -1 };\n }\n\n private traverseRange(range: RangeConfig, callback: (index: number) => boolean): void {\n const condition = (i: number): boolean => (range.step > 0 ? i <= range.end : i >= range.end);\n\n for (let i = range.start; condition(i); i += range.step) {\n if (callback(i)) {\n break;\n }\n }\n }\n\n private scrollFirstVisibleTabIntoView(): void {\n setTimeout(() => {\n this.tabButtons().at(this.visibleTabIndexes()[0])?.nativeElement.scrollIntoView({\n behavior: 'instant',\n inline: 'start',\n block: 'nearest'\n });\n });\n }\n}\n","<div class=\"tabs-container\">\n <div\n #tabContainer\n class=\"tab-container-buttonbar-list nav nav-tabs\"\n (siResizeObserver)=\"resize($event)\"\n >\n <div\n #tabScrollContainer\n role=\"tablist\"\n tabindex=\"-1\"\n class=\"d-flex tabs-wrapper\"\n [style.max-width.px]=\"maxWrapperWidth()\"\n >\n <ng-content />\n </div>\n\n @if (visibleTabIndexes().length < tabPanels().length) {\n <button\n #menuButton\n type=\"button\"\n class=\"dropdown btn btn-tertiary focus-inside\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [cdkMenuTriggerFor]=\"tabsMenu\"\n (cdkMenuOpened)=\"menuOpened()\"\n >\n <i class=\"icon element-options m-0\"></i>\n </button>\n }\n </div>\n @let tabContent = this.activeTab()?.tabContent();\n @let activeTab = this.activeTab();\n\n @if (activeTab) {\n <div\n class=\"tab-content\"\n role=\"tabpanel\"\n [id]=\"'content-' + activeTab.tabId\"\n [attr.aria-labelledby]=\"'tab-' + activeTab.tabId\"\n >\n @if (tabContent) {\n <ng-container [ngTemplateOutlet]=\"tabContent\" />\n }\n\n <ng-content select=\"router-outlet\" />\n </div>\n }\n</div>\n\n<ng-template #tabsMenu>\n <si-menu #menu>\n @for (tab of tabPanels(); track tab) {\n @let badgeColor = tab.badgeColor();\n @let badgeIsNumber = tab.badgeIsNumber();\n\n @if (badgeColor && badgeIsNumber) {\n <!-- eslint-disable @angular-eslint/template/no-any -->\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else if (badgeIsNumber && badgeColor) {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <!-- eslint-enable -->\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n }\n }\n </si-menu>\n</ng-template>\n\n<ng-template #badgeTemplate let-tab=\"tab\">\n <div class=\"d-flex align-items-center space-between flex-no-wrap justify-content-between\">\n {{ tab.heading() }}\n @if (tab.badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n } @else if (tab.badgeContent() && !tab.badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(tab.badgeContent() ?? '') | translate }}</span>\n }\n </div>\n</ng-template>\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-tabset-next.component';\nexport * from './si-tab-next.component';\nexport * from './si-tab-next-link.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2"],"mappings":"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"}