@siemens/element-ng 47.3.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.
- package/badge/si-badge.component.d.ts +1 -1
- package/breadcrumb/breadcrumb-item.model.d.ts +36 -0
- package/breadcrumb/index.d.ts +7 -0
- package/breadcrumb/package.json +3 -0
- package/breadcrumb/si-breadcrumb-item-template.directive.d.ts +10 -0
- package/breadcrumb/si-breadcrumb.component.d.ts +46 -0
- package/breadcrumb/si-breadcrumb.module.d.ts +7 -0
- package/card/index.d.ts +6 -0
- package/card/package.json +3 -0
- package/card/si-card.component.d.ts +79 -0
- package/card/si-card.module.d.ts +7 -0
- package/circle-status/index.d.ts +6 -0
- package/circle-status/package.json +3 -0
- package/circle-status/si-circle-status.component.d.ts +66 -0
- package/circle-status/si-circle-status.module.d.ts +7 -0
- package/column-selection-dialog/column-selection-editor/si-column-selection-editor.component.d.ts +23 -0
- package/column-selection-dialog/index.d.ts +6 -0
- package/column-selection-dialog/package.json +3 -0
- package/column-selection-dialog/si-column-selection-dialog.component.d.ts +114 -0
- package/column-selection-dialog/si-column-selection-dialog.service.d.ts +20 -0
- package/column-selection-dialog/si-column-selection-dialog.types.d.ts +68 -0
- package/common/models/status-type.model.d.ts +4 -2
- package/datatable/index.d.ts +42 -0
- package/datatable/package.json +3 -0
- package/datatable/si-datatable-interaction.directive.d.ts +34 -0
- package/datatable/si-datatable.module.d.ts +7 -0
- package/date-range-filter/index.d.ts +8 -0
- package/date-range-filter/package.json +3 -0
- package/date-range-filter/si-date-range-calculation.service.d.ts +33 -0
- package/date-range-filter/si-date-range-filter.component.d.ts +248 -0
- package/date-range-filter/si-date-range-filter.module.d.ts +7 -0
- package/date-range-filter/si-date-range-filter.types.d.ts +40 -0
- package/date-range-filter/si-relative-date.component.d.ts +31 -0
- package/datepicker/components/si-calendar-body.component.d.ts +137 -0
- package/datepicker/components/si-calendar-date-cell.directive.d.ts +16 -0
- package/datepicker/components/si-calendar-direction-button.component.d.ts +18 -0
- package/datepicker/components/si-compare-adapter.d.ts +37 -0
- package/datepicker/components/si-day-selection.component.d.ts +76 -0
- package/datepicker/components/si-initial-focus.component.d.ts +74 -0
- package/datepicker/components/si-month-selection.component.d.ts +62 -0
- package/datepicker/components/si-year-selection.component.d.ts +65 -0
- package/datepicker/date-time-helper.d.ts +302 -0
- package/datepicker/index.d.ts +15 -0
- package/datepicker/package.json +3 -0
- package/datepicker/si-calendar-button.component.d.ts +49 -0
- package/datepicker/si-date-input.directive.d.ts +114 -0
- package/datepicker/si-date-range.component.d.ts +150 -0
- package/datepicker/si-datepicker-overlay.component.d.ts +82 -0
- package/datepicker/si-datepicker-overlay.directive.d.ts +104 -0
- package/datepicker/si-datepicker.component.d.ts +228 -0
- package/datepicker/si-datepicker.directive.d.ts +62 -0
- package/datepicker/si-datepicker.model.d.ts +129 -0
- package/datepicker/si-datepicker.module.d.ts +12 -0
- package/datepicker/si-timepicker.component.d.ts +214 -0
- package/electron-titlebar/electron.helpers.d.ts +5 -0
- package/electron-titlebar/index.d.ts +7 -0
- package/electron-titlebar/package.json +3 -0
- package/electron-titlebar/si-electron-titlebar.component.d.ts +72 -0
- package/electron-titlebar/si-electron-titlebar.module.d.ts +7 -0
- package/fesm2022/siemens-element-ng-badge.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-breadcrumb.mjs +302 -0
- package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-card.mjs +122 -0
- package/fesm2022/siemens-element-ng-card.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-circle-status.mjs +146 -0
- package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-column-selection-dialog.mjs +369 -0
- package/fesm2022/siemens-element-ng-column-selection-dialog.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-datatable.mjs +173 -0
- package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-date-range-filter.mjs +649 -0
- package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-datepicker.mjs +4231 -0
- package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-electron-titlebar.mjs +142 -0
- package/fesm2022/siemens-element-ng-electron-titlebar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-file-uploader.mjs +751 -0
- package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-filter-bar.mjs +153 -0
- package/fesm2022/siemens-element-ng-filter-bar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-filtered-search.mjs +1139 -0
- package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-formly.mjs +935 -0
- package/fesm2022/siemens-element-ng-formly.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-icon.mjs +52 -14
- package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-info-page.mjs +63 -0
- package/fesm2022/siemens-element-ng-info-page.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-inline-notification.mjs +4 -6
- package/fesm2022/siemens-element-ng-inline-notification.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-ip-input.mjs +451 -0
- package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-list-details.mjs +390 -0
- package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-loading-spinner.mjs +15 -12
- package/fesm2022/siemens-element-ng-loading-spinner.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-localization.mjs +306 -0
- package/fesm2022/siemens-element-ng-localization.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-modal.mjs +4 -1
- package/fesm2022/siemens-element-ng-modal.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-password-strength.mjs +22 -16
- package/fesm2022/siemens-element-ng-password-strength.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-phone-number.mjs +426 -0
- package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-photo-upload.mjs +480 -0
- package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-result-details-list.mjs +74 -0
- package/fesm2022/siemens-element-ng-result-details-list.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-search-bar.mjs +193 -0
- package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-shadow-root.mjs +70 -0
- package/fesm2022/siemens-element-ng-shadow-root.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-side-panel.mjs +554 -0
- package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-slider.mjs +313 -0
- package/fesm2022/siemens-element-ng-slider.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-sort-bar.mjs +89 -0
- package/fesm2022/siemens-element-ng-sort-bar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-split.mjs +575 -0
- package/fesm2022/siemens-element-ng-split.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-status-bar.mjs +348 -0
- package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-status-toggle.mjs +196 -0
- package/fesm2022/siemens-element-ng-status-toggle.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-system-banner.mjs +47 -0
- package/fesm2022/siemens-element-ng-system-banner.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-tabs-next.mjs +491 -0
- package/fesm2022/siemens-element-ng-tabs-next.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-tabs.mjs +395 -0
- package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tree-view.mjs +2936 -0
- package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-unauthorized-page.mjs +76 -0
- package/fesm2022/siemens-element-ng-unauthorized-page.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-wizard.mjs +2 -2
- package/fesm2022/siemens-element-ng-wizard.mjs.map +1 -1
- package/file-uploader/index.d.ts +8 -0
- package/file-uploader/package.json +3 -0
- package/file-uploader/si-file-dropzone.component.d.ts +106 -0
- package/file-uploader/si-file-uploader.component.d.ts +296 -0
- package/file-uploader/si-file-uploader.model.d.ts +12 -0
- package/file-uploader/si-file-uploader.module.d.ts +8 -0
- package/filter-bar/filter.d.ts +26 -0
- package/filter-bar/index.d.ts +8 -0
- package/filter-bar/package.json +3 -0
- package/filter-bar/si-filter-bar.component.d.ts +65 -0
- package/filter-bar/si-filter-bar.module.d.ts +7 -0
- package/filter-bar/si-filter-pill.component.d.ts +20 -0
- package/filtered-search/index.d.ts +7 -0
- package/filtered-search/package.json +3 -0
- package/filtered-search/si-filtered-search-helper.d.ts +22 -0
- package/filtered-search/si-filtered-search-value.component.d.ts +53 -0
- package/filtered-search/si-filtered-search.component.d.ts +329 -0
- package/filtered-search/si-filtered-search.model.d.ts +139 -0
- package/filtered-search/si-filtered-search.module.d.ts +7 -0
- package/filtered-search/values/date-value/si-filtered-search-date-value.component.d.ts +57 -0
- package/filtered-search/values/si-filtered-search-value.base.d.ts +27 -0
- package/filtered-search/values/typeahead/si-filtered-search-typeahead.component.d.ts +45 -0
- package/formly/fields/button/si-formly-button.component.d.ts +7 -0
- package/formly/fields/date-range/si-formly-date-range.component.d.ts +6 -0
- package/formly/fields/datetime/si-formly-datetime.component.d.ts +13 -0
- package/formly/fields/email/si-formly-email.component.d.ts +6 -0
- package/formly/fields/ip-input/si-formly-ip-input.component.d.ts +6 -0
- package/formly/fields/number/si-formly-number.component.d.ts +6 -0
- package/formly/fields/password/si-formly-password.component.d.ts +6 -0
- package/formly/fields/select/si-formly-select.component.d.ts +6 -0
- package/formly/fields/text/si-formly-text-display.component.d.ts +7 -0
- package/formly/fields/textarea/si-formly-textarea.component.d.ts +18 -0
- package/formly/fields/time/si-formly-time.component.d.ts +13 -0
- package/formly/index.d.ts +6 -0
- package/formly/package.json +3 -0
- package/formly/si-formly-translate.extension.d.ts +11 -0
- package/formly/si-formly.component.d.ts +62 -0
- package/formly/si-formly.module.d.ts +35 -0
- package/formly/structural/si-formly-accordion/si-formly-accordion.component.d.ts +13 -0
- package/formly/structural/si-formly-array/si-formly-array.component.d.ts +6 -0
- package/formly/structural/si-formly-object/si-formly-object.component.d.ts +6 -0
- package/formly/structural/si-formly-object-grid/si-formly-object-grid.component.d.ts +22 -0
- package/formly/structural/si-formly-object-grid/si-formly-object-grid.model.d.ts +21 -0
- package/formly/structural/si-formly-object-plain/si-formly-object-plain.component.d.ts +6 -0
- package/formly/structural/si-formly-tabset/si-formly-object-tabset.component.d.ts +7 -0
- package/formly/utils.d.ts +6 -0
- package/formly/wrapper/si-formly-fieldset.component.d.ts +8 -0
- package/formly/wrapper/si-formly-form-field-provider.directive.d.ts +19 -0
- package/formly/wrapper/si-formly-horizontal-wrapper.component.d.ts +6 -0
- package/formly/wrapper/si-formly-icon-wrapper.component.d.ts +6 -0
- package/formly/wrapper/si-formly-wrapper.component.d.ts +8 -0
- package/icon/element-icons.d.ts +15 -0
- package/icon/si-status-icon.component.d.ts +6 -1
- package/info-page/index.d.ts +5 -0
- package/info-page/package.json +3 -0
- package/info-page/si-info-page.component.d.ts +38 -0
- package/inline-notification/si-inline-notification.component.d.ts +0 -2
- package/ip-input/address-utils.d.ts +28 -0
- package/ip-input/address-validators.d.ts +21 -0
- package/ip-input/index.d.ts +7 -0
- package/ip-input/package.json +3 -0
- package/ip-input/si-ip-input.directive.d.ts +53 -0
- package/ip-input/si-ip4-input.directive.d.ts +9 -0
- package/ip-input/si-ip6-input.directive.d.ts +10 -0
- package/list-details/index.d.ts +12 -0
- package/list-details/package.json +3 -0
- package/list-details/si-details-pane/si-details-pane.component.d.ts +8 -0
- package/list-details/si-details-pane-body/si-details-pane-body.component.d.ts +6 -0
- package/list-details/si-details-pane-footer/si-details-pane-footer.component.d.ts +6 -0
- package/list-details/si-details-pane-header/si-details-pane-header.component.d.ts +38 -0
- package/list-details/si-list-details.component.d.ts +100 -0
- package/list-details/si-list-pane/si-list-pane.component.d.ts +10 -0
- package/list-details/si-list-pane-body/si-list-pane-body.component.d.ts +6 -0
- package/list-details/si-list-pane-header/si-list-pane-header.component.d.ts +6 -0
- package/loading-spinner/si-loading-spinner.directive.d.ts +3 -2
- package/localization/index.d.ts +8 -0
- package/localization/package.json +3 -0
- package/localization/si-directionality.d.ts +41 -0
- package/localization/si-locale-id.d.ts +22 -0
- package/localization/si-locale-store.d.ts +16 -0
- package/localization/si-locale.service.d.ts +73 -0
- package/package.json +161 -9
- package/password-strength/si-password-strength.directive.d.ts +11 -0
- package/phone-number/index.d.ts +7 -0
- package/phone-number/package.json +3 -0
- package/phone-number/si-phone-number-input-select.directive.d.ts +10 -0
- package/phone-number/si-phone-number-input.component.d.ts +137 -0
- package/phone-number/si-phone-number-input.models.d.ts +48 -0
- package/phone-number/si-phone-number-input.module.d.ts +7 -0
- package/photo-upload/index.d.ts +6 -0
- package/photo-upload/package.json +3 -0
- package/photo-upload/si-image-cropper-style.component.d.ts +5 -0
- package/photo-upload/si-photo-upload.component.d.ts +298 -0
- package/result-details-list/index.d.ts +7 -0
- package/result-details-list/package.json +3 -0
- package/result-details-list/si-result-details-list.component.d.ts +14 -0
- package/result-details-list/si-result-details-list.datamodel.d.ts +48 -0
- package/result-details-list/si-result-details-list.module.d.ts +7 -0
- package/search-bar/index.d.ts +6 -0
- package/search-bar/package.json +3 -0
- package/search-bar/si-search-bar.component.d.ts +87 -0
- package/search-bar/si-search-bar.module.d.ts +7 -0
- package/shadow-root/index.d.ts +5 -0
- package/shadow-root/package.json +3 -0
- package/shadow-root/si-shadow-root.directive.d.ts +39 -0
- package/side-panel/index.d.ts +9 -0
- package/side-panel/package.json +3 -0
- package/side-panel/si-side-panel-content.component.d.ts +105 -0
- package/side-panel/si-side-panel.component.d.ts +108 -0
- package/side-panel/si-side-panel.module.d.ts +8 -0
- package/side-panel/si-side-panel.service.d.ts +45 -0
- package/side-panel/side-panel.model.d.ts +16 -0
- package/slider/index.d.ts +6 -0
- package/slider/package.json +3 -0
- package/slider/si-slider.component.d.ts +129 -0
- package/slider/si-slider.module.d.ts +7 -0
- package/sort-bar/index.d.ts +6 -0
- package/sort-bar/package.json +3 -0
- package/sort-bar/si-sort-bar.component.d.ts +42 -0
- package/sort-bar/si-sort-bar.module.d.ts +7 -0
- package/split/index.d.ts +8 -0
- package/split/package.json +3 -0
- package/split/si-split-part.component.d.ts +154 -0
- package/split/si-split.component.d.ts +48 -0
- package/split/si-split.interfaces.d.ts +17 -0
- package/split/si-split.module.d.ts +8 -0
- package/status-bar/index.d.ts +7 -0
- package/status-bar/package.json +3 -0
- package/status-bar/si-status-bar-item/index.d.ts +6 -0
- package/status-bar/si-status-bar-item/si-status-bar-item.component.d.ts +22 -0
- package/status-bar/si-status-bar-item/si-status-bar-item.model.d.ts +33 -0
- package/status-bar/si-status-bar.component.d.ts +116 -0
- package/status-bar/si-status-bar.module.d.ts +7 -0
- package/status-toggle/index.d.ts +6 -0
- package/status-toggle/package.json +3 -0
- package/status-toggle/si-status-toggle.component.d.ts +54 -0
- package/status-toggle/status-toggle.model.d.ts +26 -0
- package/system-banner/index.d.ts +5 -0
- package/system-banner/package.json +3 -0
- package/system-banner/system-banner.component.d.ts +23 -0
- package/tabs/index.d.ts +7 -0
- package/tabs/package.json +3 -0
- package/tabs/si-tab/index.d.ts +5 -0
- package/tabs/si-tab/si-tab.component.d.ts +58 -0
- package/tabs/si-tabs.module.d.ts +8 -0
- package/tabs/si-tabset/index.d.ts +5 -0
- package/tabs/si-tabset/si-tabset.component.d.ts +100 -0
- package/tabs-next/index.d.ts +7 -0
- package/tabs-next/package.json +3 -0
- package/tabs-next/si-tab-next-base.directive.d.ts +66 -0
- package/tabs-next/si-tab-next-link.component.d.ts +18 -0
- package/tabs-next/si-tab-next.component.d.ts +16 -0
- package/tabs-next/si-tabs-tokens.d.ts +7 -0
- package/tabs-next/si-tabset-next.component.d.ts +72 -0
- package/template-i18n.json +111 -0
- package/translate/si-translatable-keys.interface.d.ts +111 -0
- package/tree-view/drag-drop.util.d.ts +32 -0
- package/tree-view/index.d.ts +12 -0
- package/tree-view/package.json +3 -0
- package/tree-view/si-tree-view-converter.service.d.ts +41 -0
- package/tree-view/si-tree-view-item/si-tree-view-item.component.d.ts +105 -0
- package/tree-view/si-tree-view-item/si-tree-view-item.directive.d.ts +24 -0
- package/tree-view/si-tree-view-item-context.d.ts +11 -0
- package/tree-view/si-tree-view-item-height.service.d.ts +49 -0
- package/tree-view/si-tree-view-item-template.directive.d.ts +18 -0
- package/tree-view/si-tree-view-virtualization.service.d.ts +150 -0
- package/tree-view/si-tree-view.component.d.ts +466 -0
- package/tree-view/si-tree-view.model.d.ts +146 -0
- package/tree-view/si-tree-view.module.d.ts +10 -0
- package/tree-view/si-tree-view.service.d.ts +55 -0
- package/tree-view/si-tree-view.utils.d.ts +46 -0
- package/unauthorized-page/index.d.ts +6 -0
- package/unauthorized-page/package.json +3 -0
- package/unauthorized-page/si-unauthorized-page.component.d.ts +35 -0
- package/unauthorized-page/si-unauthorized-page.module.d.ts +7 -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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"}
|