@siemens/element-ng 49.12.0 → 49.13.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 (26) hide show
  1. package/fesm2022/siemens-element-ng-application-header.mjs +35 -13
  2. package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
  3. package/fesm2022/siemens-element-ng-autocomplete.mjs +9 -13
  4. package/fesm2022/siemens-element-ng-autocomplete.mjs.map +1 -1
  5. package/fesm2022/siemens-element-ng-form.mjs +24 -46
  6. package/fesm2022/siemens-element-ng-form.mjs.map +1 -1
  7. package/fesm2022/siemens-element-ng-header-dropdown.mjs +14 -7
  8. package/fesm2022/siemens-element-ng-header-dropdown.mjs.map +1 -1
  9. package/fesm2022/siemens-element-ng-ip-input.mjs +1 -1
  10. package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -1
  11. package/fesm2022/siemens-element-ng-phone-number.mjs +63 -42
  12. package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -1
  13. package/fesm2022/siemens-element-ng-tabs.mjs +33 -6
  14. package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -1
  15. package/fesm2022/siemens-element-ng-tooltip.mjs +178 -75
  16. package/fesm2022/siemens-element-ng-tooltip.mjs.map +1 -1
  17. package/fesm2022/siemens-element-ng-tree-view.mjs +1 -1
  18. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
  19. package/package.json +3 -3
  20. package/types/siemens-element-ng-application-header.d.ts +12 -4
  21. package/types/siemens-element-ng-autocomplete.d.ts +19 -19
  22. package/types/siemens-element-ng-form.d.ts +1 -3
  23. package/types/siemens-element-ng-header-dropdown.d.ts +5 -0
  24. package/types/siemens-element-ng-phone-number.d.ts +2 -2
  25. package/types/siemens-element-ng-tabs.d.ts +4 -0
  26. package/types/siemens-element-ng-tooltip.d.ts +10 -26
@@ -1 +1 @@
1
- {"version":3,"file":"siemens-element-ng-tabs.mjs","sources":["../../../../projects/element-ng/tabs/si-tab-badge.component.ts","../../../../projects/element-ng/tabs/si-tab-badge.component.html","../../../../projects/element-ng/tabs/si-tabs-tokens.ts","../../../../projects/element-ng/tabs/si-tab-base.directive.ts","../../../../projects/element-ng/tabs/si-tab-link.component.ts","../../../../projects/element-ng/tabs/si-tab.component.html","../../../../projects/element-ng/tabs/si-tabset.component.ts","../../../../projects/element-ng/tabs/si-tabset.component.html","../../../../projects/element-ng/tabs/si-tab.component.ts","../../../../projects/element-ng/tabs/si-tab-portal.component.ts","../../../../projects/element-ng/tabs/index.ts","../../../../projects/element-ng/tabs/siemens-element-ng-tabs.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { SiTranslatePipe, TranslatableString } from '@siemens/element-translate-ng/translate';\n\n@Component({\n selector: 'si-tab-badge',\n imports: [SiTranslatePipe],\n templateUrl: './si-tab-badge.component.html',\n styleUrl: './si-tab-badge.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'd-contents'\n }\n})\nexport class SiTabBadgeComponent {\n readonly badgeContent = input<TranslatableString | boolean>();\n readonly badgeColor = input<string>();\n}\n","@let badgeContent = this.badgeContent();\n@if (badgeContent === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent && badgeColor()) {\n <span class=\"badge\" [class]=\"`bg-${badgeColor() || 'default'}`\">\n {{ badgeContent ?? '' | translate }}\n </span>\n} @else if (badgeContent && !badgeColor()) {\n <span class=\"badge-text\"> {{ badgeContent ?? '' | translate }}</span>\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { InjectionToken } from '@angular/core';\n\nimport { SiTabsetComponent } from './si-tabset.component';\n\nexport const SI_TABSET = new InjectionToken<SiTabsetComponent>('SiTabsetComponent');\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { FocusableOption } from '@angular/cdk/a11y';\nimport {\n booleanAttribute,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n Signal,\n TemplateRef,\n untracked,\n viewChild\n} from '@angular/core';\nimport { elementCancel } from '@siemens/element-icons';\nimport { addIcons } from '@siemens/element-ng/icon';\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { SI_TABSET } from './si-tabs-tokens';\n\n@Directive({\n selector: '[siTabNextBase]',\n host: {\n class: 'nav-link focus-inside px-5',\n role: 'tab',\n '[class.disabled]': 'disabledTab()',\n '[class.icon-only]': '!!icon()',\n '[class.pe-3]': 'closable()',\n '[class.active]': 'active()',\n '[attr.id]': \"'tab-' + tabId\",\n '[attr.aria-selected]': 'active()',\n '[attr.aria-disabled]': 'disabledTab()',\n '[attr.tabindex]': 'tabset.focusKeyManager.activeItem === this && !disabledTab() ? 0 : -1',\n '[attr.aria-controls]': \"'content-' + tabId\",\n '(keydown.delete)': 'closeTab($event)'\n }\n})\nexport abstract class SiTabBaseDirective implements OnDestroy, FocusableOption {\n abstract readonly active: Signal<boolean | undefined>;\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 protected readonly tabButton = inject<ElementRef<HTMLElement>>(ElementRef);\n /** @internal */\n readonly tabContent = viewChild('tabContent', { read: TemplateRef });\n\n private static tabCounter = 0;\n private indexBeforeClose = -1;\n\n /** @internal */\n tabId = `${SiTabBaseDirective.tabCounter++}`;\n protected readonly icons = addIcons({ elementCancel });\n protected tabset = inject(SI_TABSET);\n private readonly index = computed(() => this.tabset.tabPanels().indexOf(this));\n\n constructor() {\n // Update the focusKeyManager if a tab is added that is active or if the tab is set active by the app.\n // This effect should not run, if active was already applied to the focusKeyManager.\n effect(() => {\n const active = this.active(); // We only want to subscribe to the active signal.\n untracked(() => {\n // !!! focusKeyManger.activeItem has signal reads internally. Do not move this outside of untracked.\n if (active && this.tabset.focusKeyManager.activeItem !== this) {\n this.tabset.focusKeyManager.updateActiveItem(this.index());\n }\n });\n });\n }\n\n ngOnDestroy(): void {\n if (this.indexBeforeClose >= 0) {\n this.tabset.removedTabByUser(this.indexBeforeClose, this.active());\n }\n }\n\n protected closeTab(event: Event): void {\n if (this.closable() && !this.disabledTab()) {\n event.stopPropagation();\n const index = this.index();\n this.closeTriggered.emit();\n this.indexBeforeClose = index;\n }\n }\n\n /** @internal */\n focus(): void {\n this.tabButton.nativeElement.focus({ preventScroll: true });\n // The element is not fully scrolled into view when focused. So we prevent and scroll it manually.\n this.scrollTabIntoView();\n }\n\n /** @internal */\n get disabled(): boolean {\n return this.disabledTab();\n }\n\n /**\n * Programmatically selects the current tab.\n */\n selectTab(retainFocus?: boolean): void {\n this.tabset.focusKeyManager.updateActiveItem(this.index());\n if (retainFocus) {\n // We need the timeout to wait for cdkMenu to restore the focus before we move it again.\n setTimeout(() => this.focus());\n }\n }\n\n /** @internal */\n deSelectTab(): void {\n // Empty be default, can be overridden in derived classes.\n }\n\n /** @internal */\n scrollTabIntoView(): void {\n this.tabButton.nativeElement.scrollIntoView({\n inline: 'nearest',\n block: 'nearest',\n behavior: 'instant'\n });\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router, RouterLink, RouterLinkActive } from '@angular/router';\nimport { SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTranslatePipe } from '@siemens/element-translate-ng/translate';\nimport { startWith } from 'rxjs/operators';\n\nimport { SiTabBadgeComponent } from './si-tab-badge.component';\nimport { SiTabBaseDirective } from './si-tab-base.directive';\n\n/**\n * Creates a tab that uses the Angular router.\n *\n * @example\n * ```html\n * <si-tabset>\n * <a si-tab routerLink=\"/home\" heading=\"Home\"></a>\n *\n * <router-outlet />\n * </si-tabset>\n * ```\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'a[si-tab][routerLink]',\n imports: [SiIconComponent, SiTranslatePipe, SiTabBadgeComponent],\n templateUrl: './si-tab.component.html',\n styleUrl: './si-tab.component.scss',\n providers: [{ provide: SiTabBaseDirective, useExisting: SiTabLinkComponent }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: RouterLinkActive\n }\n ]\n})\nexport class SiTabLinkComponent extends SiTabBaseDirective {\n private router = inject(Router);\n /** @internal */\n routerLink = inject(RouterLink, { self: true });\n protected routerLinkActive = inject(RouterLinkActive, { self: true });\n /** @defaultValue false */\n override readonly active = toSignal(\n this.routerLinkActive.isActiveChange.pipe(startWith(this.routerLinkActive.isActive))\n );\n /** {@inheritDoc} */\n override selectTab(retainFocus?: boolean): void {\n if (this.routerLink.urlTree) {\n this.router.navigateByUrl(this.routerLink.urlTree, {\n skipLocationChange: this.routerLink.skipLocationChange,\n replaceUrl: this.routerLink.replaceUrl,\n info: this.routerLink.info,\n state: this.routerLink.state\n });\n }\n super.selectTab(retainFocus);\n }\n}\n","@let icon = this.icon();\n@if (icon) {\n <si-icon class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n<si-tab-badge [badgeColor]=\"badgeColor()\" [badgeContent]=\"badgeContent()\" />\n@if (closable() && !disabledTab()) {\n <si-icon\n class=\"ms-2 btn btn-circle btn-sm btn-tertiary-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 (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { FocusKeyManager } from '@angular/cdk/a11y';\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n effect,\n inject,\n INJECTOR,\n input,\n signal,\n viewChild\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { elementOptions } from '@siemens/element-icons';\nimport { isRTL } from '@siemens/element-ng/common';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiMenuDirective, SiMenuItemComponent } from '@siemens/element-ng/menu';\nimport { SiResizeObserverModule } from '@siemens/element-ng/resize-observer';\n\nimport { SiTabBadgeComponent } from './si-tab-badge.component';\nimport { SiTabBaseDirective } from './si-tab-base.directive';\nimport { SiTabLinkComponent } from './si-tab-link.component';\nimport { SI_TABSET } from './si-tabs-tokens';\n\n/**\n * A component to group multiple tabs together.\n * Can either be used with {@link SiTabLinkComponent} or {@link SiTabComponent} components.\n */\n@Component({\n selector: 'si-tabset',\n imports: [\n SiMenuDirective,\n SiMenuItemComponent,\n CdkMenuTrigger,\n NgTemplateOutlet,\n SiResizeObserverModule,\n RouterLink,\n SiTabBadgeComponent,\n SiIconComponent\n ],\n templateUrl: './si-tabset.component.html',\n styleUrl: './si-tabset.component.scss',\n providers: [\n {\n provide: SI_TABSET,\n useExisting: SiTabsetComponent\n }\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiTabsetComponent {\n /**\n * When set, the overflowing content inside the tab will automatically scroll\n * @defaultValue false\n **/\n readonly contentOverflowAuto = input(false, { transform: booleanAttribute });\n\n protected readonly icons = addIcons({ elementOptions });\n\n private readonly contentNode = viewChild.required('contentNode');\n /**\n * A `DomPortal` wrapping the tab panel container. Used by {@link SiTabPortalComponent}\n * to render the active tab's content at a remote location in the DOM.\n *\n * @internal\n */\n readonly contentPortal = computed(() => new DomPortal(this.contentNode()));\n\n /** @internal */\n readonly activeTab = computed(() => this.tabPanels().find(tab => tab.active()));\n\n /** @internal */\n readonly tabPanels = contentChildren(SiTabBaseDirective);\n\n /** @internal */\n focusKeyManager = new FocusKeyManager(this.tabPanels, inject(INJECTOR))\n .withHorizontalOrientation(isRTL() ? 'rtl' : 'ltr')\n .withWrap(true);\n\n /** @internal */\n protected readonly showMenuButton = signal(false);\n\n protected tabIsLink(tab: unknown): tab is SiTabLinkComponent {\n return tab instanceof SiTabLinkComponent;\n }\n\n constructor() {\n effect(() => {\n if (this.showMenuButton() && this.activeTab()) {\n // wait for menu button to render on DOM\n setTimeout(() => {\n this.activeTab()?.scrollTabIntoView();\n });\n }\n });\n }\n\n /** @internal */\n removedTabByUser(index: number, active?: boolean): void {\n // The tab was already removed from the tabPanels list when this function is called.\n // We need to:\n // - focus another tab if the closed one was focused\n // - activate another tab if the closed one was active\n // If the closed tab was not focussed, there is no need to restore the focus as it could only be closed by mouse.\n for (let i = 0; i < this.tabPanels().length; i++) {\n // Get the actual index using modulo to wrap around\n const checkIndex = (index + i) % this.tabPanels().length;\n const checkTab = this.tabPanels()[checkIndex];\n if (!checkTab.disabledTab()) {\n if (this.focusKeyManager.activeItemIndex === index) {\n this.focusKeyManager.setActiveItem(checkIndex);\n }\n if (active) {\n checkTab.selectTab(true);\n }\n return;\n }\n }\n }\n\n protected resizeContainer(width: number, scrollWidth: number): void {\n // 48px is the width of the menu button.\n this.showMenuButton.set(scrollWidth > width + (this.showMenuButton() ? 48 : 0));\n }\n\n protected keydown(event: KeyboardEvent): void {\n this.focusKeyManager.onKeydown(event);\n }\n}\n","<div class=\"tabs-container\">\n <div class=\"tab-container-buttonbar-list nav nav-tabs\">\n <div\n #tabScrollContainer\n role=\"tablist\"\n tabindex=\"-1\"\n class=\"d-flex tabs-wrapper\"\n (siResizeObserver)=\"\n resizeContainer(tabScrollContainer.clientWidth, tabScrollContainer.scrollWidth)\n \"\n (keydown)=\"keydown($event)\"\n >\n <ng-content />\n </div>\n\n @if (showMenuButton()) {\n <button\n type=\"button\"\n class=\"dropdown btn btn-tertiary focus-inside\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [cdkMenuTriggerFor]=\"tabsMenu\"\n >\n <si-icon class=\"icon m-0\" [icon]=\"icons.elementOptions\" />\n </button>\n }\n </div>\n @let tabContent = this.activeTab()?.tabContent();\n @let activeTab = this.activeTab();\n\n <div #contentNode class=\"d-contents\">\n @if (activeTab) {\n <div\n class=\"tab-content focus-inside\"\n role=\"tabpanel\"\n [id]=\"`content-${activeTab.tabId}`\"\n [class.tab-scroll]=\"contentOverflowAuto()\"\n [tabIndex]=\"contentOverflowAuto() ? '0' : null\"\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</div>\n\n<ng-template #tabsMenu>\n <si-menu>\n @for (tab of tabPanels(); track tab) {\n @if (tabIsLink(tab)) {\n <a\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tab.routerLink.urlTree\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else {\n <button\n type=\"button\"\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </button>\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 <si-tab-badge [badgeContent]=\"tab.badgeContent()\" [badgeColor]=\"tab.badgeColor()\" />\n </div>\n</ng-template>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component, input, model, OnDestroy } from '@angular/core';\nimport { SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTranslatePipe } from '@siemens/element-translate-ng/translate';\n\nimport { SiTabBadgeComponent } from './si-tab-badge.component';\nimport { SiTabBaseDirective } from './si-tab-base.directive';\n\n/**\n * Creates a normal tab that can contain any content.\n *\n * @example\n * ```html\n * <si-tabset>\n * <si-tab heading=\"Tab 1\">\n * <p>Content of Tab 1</p>\n * </si-tab>\n * </si-tabset>\n * ```\n */\n@Component({\n selector: 'si-tab',\n imports: [SiIconComponent, SiTranslatePipe, SiTabBadgeComponent],\n templateUrl: './si-tab.component.html',\n styleUrl: './si-tab.component.scss',\n providers: [{ provide: SiTabBaseDirective, useExisting: SiTabComponent }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(click)': 'selectTabByUser()',\n '(keydown.enter)': 'selectTabByUser()'\n }\n})\nexport class SiTabComponent extends SiTabBaseDirective 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 /**\n * Guard to check if the tab can be activated.\n * If not provided, the tab can always be activated.\n */\n readonly canActivate = input<() => boolean>();\n /**\n * Guard to check if the tab can be deactivated.\n * If not provided, the tab can always be deactivated.\n */\n readonly canDeactivate = input<() => boolean>();\n\n protected selectTabByUser(): void {\n const canActivate = this.canActivate();\n if (!this.active() && (canActivate ? canActivate() : true)) {\n this.selectTab();\n }\n }\n\n /** {@inheritDoc} */\n override selectTab(retainFocus?: boolean): void {\n const activeTab = this.tabset.activeTab();\n if (activeTab instanceof SiTabComponent) {\n const canDeactivate = activeTab?.canDeactivate();\n if (canDeactivate ? !canDeactivate() : false) {\n return;\n }\n }\n this.tabset.activeTab()?.deSelectTab();\n this.active.set(true);\n super.selectTab(retainFocus);\n }\n\n /** @internal */\n override deSelectTab(): void {\n this.active.set(false);\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nimport { SiTabsetComponent } from './si-tabset.component';\n\n/**\n * A component that renders the active tab's content at a remote\n * location in the DOM using an Angular CDK `DomPortal`.\n *\n * This component **automatically** renders the content of the currently\n * active `si-tab`, including the `role=\"tabpanel\"` container with proper\n * ARIA attributes linked to the active tab.\n *\n * @example\n * ```html\n * <si-tabset #tabset>\n * <si-tab heading=\"Overview\" [active]=\"true\">\n * overview content\n * </si-tab>\n * <si-tab heading=\"History\">\n * history content\n * </si-tab>\n * </si-tabset>\n *\n * <si-tab-portal [tabset]=\"tabset\" />\n * ```\n */\n@Component({\n selector: 'si-tab-portal',\n imports: [CdkPortalOutlet],\n template: ` <ng-template [cdkPortalOutlet]=\"tabset().contentPortal()\" /> `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiTabPortalComponent {\n /**\n * Reference to the {@link SiTabsetComponent} whose active tab content\n * this component renders via a `DomPortal`.\n *\n * The tabset's tab panel container, including the `role=\"tabpanel\"` element\n * with proper ARIA attributes, is transported to this component's location.\n */\n readonly tabset = input.required<SiTabsetComponent>();\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-tabset.component';\nexport * from './si-tab.component';\nexport * from './si-tab-link.component';\nexport * from './si-tab-portal.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"siemens-element-ng-tabs.mjs","sources":["../../../../projects/element-ng/tabs/si-tab-badge.component.ts","../../../../projects/element-ng/tabs/si-tab-badge.component.html","../../../../projects/element-ng/tabs/si-tabs-tokens.ts","../../../../projects/element-ng/tabs/si-tab-base.directive.ts","../../../../projects/element-ng/tabs/si-tab-link.component.ts","../../../../projects/element-ng/tabs/si-tab.component.html","../../../../projects/element-ng/tabs/si-tabset.component.ts","../../../../projects/element-ng/tabs/si-tabset.component.html","../../../../projects/element-ng/tabs/si-tab.component.ts","../../../../projects/element-ng/tabs/si-tab-portal.component.ts","../../../../projects/element-ng/tabs/index.ts","../../../../projects/element-ng/tabs/siemens-element-ng-tabs.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { SiTranslatePipe, TranslatableString } from '@siemens/element-translate-ng/translate';\n\n@Component({\n selector: 'si-tab-badge',\n imports: [SiTranslatePipe],\n templateUrl: './si-tab-badge.component.html',\n styleUrl: './si-tab-badge.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'd-contents'\n }\n})\nexport class SiTabBadgeComponent {\n readonly badgeContent = input<TranslatableString | boolean>();\n readonly badgeColor = input<string>();\n}\n","@let badgeContent = this.badgeContent();\n@if (badgeContent === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent && badgeColor()) {\n <span class=\"badge\" [class]=\"`bg-${badgeColor() || 'default'}`\">\n {{ badgeContent ?? '' | translate }}\n </span>\n} @else if (badgeContent && !badgeColor()) {\n <span class=\"badge-text\"> {{ badgeContent ?? '' | translate }}</span>\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { InjectionToken } from '@angular/core';\n\nimport { SiTabsetComponent } from './si-tabset.component';\n\nexport const SI_TABSET = new InjectionToken<SiTabsetComponent>('SiTabsetComponent');\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { FocusableOption } from '@angular/cdk/a11y';\nimport {\n booleanAttribute,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n Signal,\n TemplateRef,\n untracked,\n viewChild\n} from '@angular/core';\nimport { elementCancel } from '@siemens/element-icons';\nimport { addIcons } from '@siemens/element-ng/icon';\nimport { SiTooltipDirective, SiTooltipService, TooltipRef } from '@siemens/element-ng/tooltip';\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { SI_TABSET } from './si-tabs-tokens';\n\n@Directive({\n selector: '[siTabNextBase]',\n host: {\n class: 'nav-link focus-inside px-5',\n role: 'tab',\n '[class.disabled]': 'disabledTab()',\n '[class.icon-only]': '!!icon()',\n '[class.pe-3]': 'closable()',\n '[class.active]': 'active()',\n '[attr.id]': \"'tab-' + tabId\",\n '[attr.aria-selected]': 'active()',\n '[attr.aria-disabled]': 'disabledTab()',\n '[attr.tabindex]': 'tabset.focusKeyManager.activeItem === this && !disabledTab() ? 0 : -1',\n '[attr.aria-controls]': \"'content-' + tabId\",\n '(keydown.delete)': 'closeTab($event)'\n }\n})\nexport abstract class SiTabBaseDirective implements OnDestroy, FocusableOption {\n abstract readonly active: Signal<boolean | undefined>;\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 protected readonly tabButton = inject<ElementRef<HTMLElement>>(ElementRef);\n /** @internal */\n readonly tabContent = viewChild('tabContent', { read: TemplateRef });\n\n private static tabCounter = 0;\n private indexBeforeClose = -1;\n private readonly tooltipService = inject(SiTooltipService);\n private readonly existingTooltip = inject(SiTooltipDirective, { optional: true });\n private tooltipRef?: TooltipRef;\n\n /** @internal */\n tabId = `${SiTabBaseDirective.tabCounter++}`;\n protected readonly icons = addIcons({ elementCancel });\n protected tabset = inject(SI_TABSET);\n private readonly index = computed(() => this.tabset.tabPanels().indexOf(this));\n\n constructor() {\n this.setupIconTooltip();\n\n // Update the focusKeyManager if a tab is added that is active or if the tab is set active by the app.\n // This effect should not run, if active was already applied to the focusKeyManager.\n effect(() => {\n const active = this.active(); // We only want to subscribe to the active signal.\n untracked(() => {\n // !!! focusKeyManger.activeItem has signal reads internally. Do not move this outside of untracked.\n if (active && this.tabset.focusKeyManager.activeItem !== this) {\n this.tabset.focusKeyManager.updateActiveItem(this.index());\n }\n });\n });\n }\n\n private setupIconTooltip(): void {\n effect(onCleanup => {\n const icon = this.icon();\n // Only add an automatic tooltip if the consumer has not already applied an\n // active `siTooltip` directive (i.e. one that is not disabled and has a tooltip).\n const hasActiveTooltip =\n !!this.existingTooltip &&\n !this.existingTooltip.isDisabled() &&\n !!this.existingTooltip.siTooltip();\n\n if (icon && !hasActiveTooltip) {\n this.tooltipRef = this.tooltipService.createTooltip({\n element: this.tabButton,\n placement: 'auto',\n tooltip: () => this.heading(),\n tooltipContext: () => undefined\n });\n }\n\n onCleanup(() => {\n this.tooltipRef?.destroy();\n this.tooltipRef = undefined;\n });\n });\n }\n\n ngOnDestroy(): void {\n if (this.indexBeforeClose >= 0) {\n this.tabset.removedTabByUser(this.indexBeforeClose, this.active());\n }\n }\n\n protected closeTab(event: Event): void {\n if (this.closable() && !this.disabledTab()) {\n event.stopPropagation();\n const index = this.index();\n this.closeTriggered.emit();\n this.indexBeforeClose = index;\n }\n }\n\n /** @internal */\n focus(): void {\n this.tabButton.nativeElement.focus({ preventScroll: true });\n // The element is not fully scrolled into view when focused. So we prevent and scroll it manually.\n this.scrollTabIntoView();\n }\n\n /** @internal */\n get disabled(): boolean {\n return this.disabledTab();\n }\n\n /**\n * Programmatically selects the current tab.\n */\n selectTab(retainFocus?: boolean): void {\n this.tabset.focusKeyManager.updateActiveItem(this.index());\n if (retainFocus) {\n // We need the timeout to wait for cdkMenu to restore the focus before we move it again.\n setTimeout(() => this.focus());\n }\n }\n\n /** @internal */\n deSelectTab(): void {\n // Empty be default, can be overridden in derived classes.\n }\n\n /** @internal */\n scrollTabIntoView(): void {\n this.tabButton.nativeElement.scrollIntoView({\n inline: 'nearest',\n block: 'nearest',\n behavior: 'instant'\n });\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router, RouterLink, RouterLinkActive } from '@angular/router';\nimport { SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTooltipService } from '@siemens/element-ng/tooltip';\nimport { SiTranslatePipe } from '@siemens/element-translate-ng/translate';\nimport { startWith } from 'rxjs/operators';\n\nimport { SiTabBadgeComponent } from './si-tab-badge.component';\nimport { SiTabBaseDirective } from './si-tab-base.directive';\n\n/**\n * Creates a tab that uses the Angular router.\n *\n * @example\n * ```html\n * <si-tabset>\n * <a si-tab routerLink=\"/home\" heading=\"Home\"></a>\n *\n * <router-outlet />\n * </si-tabset>\n * ```\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'a[si-tab][routerLink]',\n imports: [SiIconComponent, SiTranslatePipe, SiTabBadgeComponent],\n templateUrl: './si-tab.component.html',\n styleUrl: './si-tab.component.scss',\n providers: [SiTooltipService, { provide: SiTabBaseDirective, useExisting: SiTabLinkComponent }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: RouterLinkActive\n }\n ]\n})\nexport class SiTabLinkComponent extends SiTabBaseDirective {\n private router = inject(Router);\n /** @internal */\n routerLink = inject(RouterLink, { self: true });\n protected routerLinkActive = inject(RouterLinkActive, { self: true });\n /** @defaultValue false */\n override readonly active = toSignal(\n this.routerLinkActive.isActiveChange.pipe(startWith(this.routerLinkActive.isActive))\n );\n /** {@inheritDoc} */\n override selectTab(retainFocus?: boolean): void {\n if (this.routerLink.urlTree) {\n this.router.navigateByUrl(this.routerLink.urlTree, {\n skipLocationChange: this.routerLink.skipLocationChange,\n replaceUrl: this.routerLink.replaceUrl,\n info: this.routerLink.info,\n state: this.routerLink.state\n });\n }\n super.selectTab(retainFocus);\n }\n}\n","@let icon = this.icon();\n<span class=\"text-truncate\" [class.visually-hidden]=\"!!icon\">{{ heading() | translate }}</span>\n@if (icon) {\n <si-icon class=\"tab-icon\" [icon]=\"icon\" />\n}\n<si-tab-badge [badgeColor]=\"badgeColor()\" [badgeContent]=\"badgeContent()\" />\n@if (closable() && !disabledTab()) {\n <si-icon\n class=\"ms-2 btn btn-circle btn-sm btn-tertiary-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 (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { FocusKeyManager } from '@angular/cdk/a11y';\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n effect,\n inject,\n INJECTOR,\n input,\n signal,\n viewChild\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { elementOptions } from '@siemens/element-icons';\nimport { isRTL } from '@siemens/element-ng/common';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiMenuDirective, SiMenuItemComponent } from '@siemens/element-ng/menu';\nimport { SiResizeObserverModule } from '@siemens/element-ng/resize-observer';\n\nimport { SiTabBadgeComponent } from './si-tab-badge.component';\nimport { SiTabBaseDirective } from './si-tab-base.directive';\nimport { SiTabLinkComponent } from './si-tab-link.component';\nimport { SI_TABSET } from './si-tabs-tokens';\n\n/**\n * A component to group multiple tabs together.\n * Can either be used with {@link SiTabLinkComponent} or {@link SiTabComponent} components.\n */\n@Component({\n selector: 'si-tabset',\n imports: [\n SiMenuDirective,\n SiMenuItemComponent,\n CdkMenuTrigger,\n NgTemplateOutlet,\n SiResizeObserverModule,\n RouterLink,\n SiTabBadgeComponent,\n SiIconComponent\n ],\n templateUrl: './si-tabset.component.html',\n styleUrl: './si-tabset.component.scss',\n providers: [\n {\n provide: SI_TABSET,\n useExisting: SiTabsetComponent\n }\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiTabsetComponent {\n /**\n * When set, the overflowing content inside the tab will automatically scroll\n * @defaultValue false\n **/\n readonly contentOverflowAuto = input(false, { transform: booleanAttribute });\n\n protected readonly icons = addIcons({ elementOptions });\n\n private readonly contentNode = viewChild.required('contentNode');\n /**\n * A `DomPortal` wrapping the tab panel container. Used by {@link SiTabPortalComponent}\n * to render the active tab's content at a remote location in the DOM.\n *\n * @internal\n */\n readonly contentPortal = computed(() => new DomPortal(this.contentNode()));\n\n /** @internal */\n readonly activeTab = computed(() => this.tabPanels().find(tab => tab.active()));\n\n /** @internal */\n readonly tabPanels = contentChildren(SiTabBaseDirective);\n\n /** @internal */\n focusKeyManager = new FocusKeyManager(this.tabPanels, inject(INJECTOR))\n .withHorizontalOrientation(isRTL() ? 'rtl' : 'ltr')\n .withWrap(true);\n\n /** @internal */\n protected readonly showMenuButton = signal(false);\n\n protected tabIsLink(tab: unknown): tab is SiTabLinkComponent {\n return tab instanceof SiTabLinkComponent;\n }\n\n constructor() {\n effect(() => {\n if (this.showMenuButton() && this.activeTab()) {\n // wait for menu button to render on DOM\n setTimeout(() => {\n this.activeTab()?.scrollTabIntoView();\n });\n }\n });\n }\n\n /** @internal */\n removedTabByUser(index: number, active?: boolean): void {\n // The tab was already removed from the tabPanels list when this function is called.\n // We need to:\n // - focus another tab if the closed one was focused\n // - activate another tab if the closed one was active\n // If the closed tab was not focussed, there is no need to restore the focus as it could only be closed by mouse.\n for (let i = 0; i < this.tabPanels().length; i++) {\n // Get the actual index using modulo to wrap around\n const checkIndex = (index + i) % this.tabPanels().length;\n const checkTab = this.tabPanels()[checkIndex];\n if (!checkTab.disabledTab()) {\n if (this.focusKeyManager.activeItemIndex === index) {\n this.focusKeyManager.setActiveItem(checkIndex);\n }\n if (active) {\n checkTab.selectTab(true);\n }\n return;\n }\n }\n }\n\n protected resizeContainer(width: number, scrollWidth: number): void {\n // 48px is the width of the menu button.\n this.showMenuButton.set(scrollWidth > width + (this.showMenuButton() ? 48 : 0));\n }\n\n protected keydown(event: KeyboardEvent): void {\n this.focusKeyManager.onKeydown(event);\n }\n}\n","<div class=\"tabs-container\">\n <div class=\"tab-container-buttonbar-list nav nav-tabs\">\n <div\n #tabScrollContainer\n role=\"tablist\"\n tabindex=\"-1\"\n class=\"d-flex tabs-wrapper\"\n (siResizeObserver)=\"\n resizeContainer(tabScrollContainer.clientWidth, tabScrollContainer.scrollWidth)\n \"\n (keydown)=\"keydown($event)\"\n >\n <ng-content />\n </div>\n\n @if (showMenuButton()) {\n <button\n type=\"button\"\n class=\"dropdown btn btn-tertiary focus-inside\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [cdkMenuTriggerFor]=\"tabsMenu\"\n >\n <si-icon class=\"icon m-0\" [icon]=\"icons.elementOptions\" />\n </button>\n }\n </div>\n @let tabContent = this.activeTab()?.tabContent();\n @let activeTab = this.activeTab();\n\n <div #contentNode class=\"d-contents\">\n @if (activeTab) {\n <div\n class=\"tab-content focus-inside\"\n role=\"tabpanel\"\n [id]=\"`content-${activeTab.tabId}`\"\n [class.tab-scroll]=\"contentOverflowAuto()\"\n [tabIndex]=\"contentOverflowAuto() ? '0' : null\"\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</div>\n\n<ng-template #tabsMenu>\n <si-menu>\n @for (tab of tabPanels(); track tab) {\n @if (tabIsLink(tab)) {\n <a\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tab.routerLink.urlTree\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else {\n <button\n type=\"button\"\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </button>\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 <si-tab-badge [badgeContent]=\"tab.badgeContent()\" [badgeColor]=\"tab.badgeColor()\" />\n </div>\n</ng-template>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component, input, model, OnDestroy } from '@angular/core';\nimport { SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTooltipService } from '@siemens/element-ng/tooltip';\nimport { SiTranslatePipe } from '@siemens/element-translate-ng/translate';\n\nimport { SiTabBadgeComponent } from './si-tab-badge.component';\nimport { SiTabBaseDirective } from './si-tab-base.directive';\n\n/**\n * Creates a normal tab that can contain any content.\n *\n * @example\n * ```html\n * <si-tabset>\n * <si-tab heading=\"Tab 1\">\n * <p>Content of Tab 1</p>\n * </si-tab>\n * </si-tabset>\n * ```\n */\n@Component({\n selector: 'si-tab',\n imports: [SiIconComponent, SiTranslatePipe, SiTabBadgeComponent],\n templateUrl: './si-tab.component.html',\n styleUrl: './si-tab.component.scss',\n providers: [SiTooltipService, { provide: SiTabBaseDirective, useExisting: SiTabComponent }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(click)': 'selectTabByUser()',\n '(keydown.enter)': 'selectTabByUser()'\n }\n})\nexport class SiTabComponent extends SiTabBaseDirective 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 /**\n * Guard to check if the tab can be activated.\n * If not provided, the tab can always be activated.\n */\n readonly canActivate = input<() => boolean>();\n /**\n * Guard to check if the tab can be deactivated.\n * If not provided, the tab can always be deactivated.\n */\n readonly canDeactivate = input<() => boolean>();\n\n protected selectTabByUser(): void {\n const canActivate = this.canActivate();\n if (!this.active() && (canActivate ? canActivate() : true)) {\n this.selectTab();\n }\n }\n\n /** {@inheritDoc} */\n override selectTab(retainFocus?: boolean): void {\n const activeTab = this.tabset.activeTab();\n if (activeTab instanceof SiTabComponent) {\n const canDeactivate = activeTab?.canDeactivate();\n if (canDeactivate ? !canDeactivate() : false) {\n return;\n }\n }\n this.tabset.activeTab()?.deSelectTab();\n this.active.set(true);\n super.selectTab(retainFocus);\n }\n\n /** @internal */\n override deSelectTab(): void {\n this.active.set(false);\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nimport { SiTabsetComponent } from './si-tabset.component';\n\n/**\n * A component that renders the active tab's content at a remote\n * location in the DOM using an Angular CDK `DomPortal`.\n *\n * This component **automatically** renders the content of the currently\n * active `si-tab`, including the `role=\"tabpanel\"` container with proper\n * ARIA attributes linked to the active tab.\n *\n * @example\n * ```html\n * <si-tabset #tabset>\n * <si-tab heading=\"Overview\" [active]=\"true\">\n * overview content\n * </si-tab>\n * <si-tab heading=\"History\">\n * history content\n * </si-tab>\n * </si-tabset>\n *\n * <si-tab-portal [tabset]=\"tabset\" />\n * ```\n */\n@Component({\n selector: 'si-tab-portal',\n imports: [CdkPortalOutlet],\n template: ` <ng-template [cdkPortalOutlet]=\"tabset().contentPortal()\" /> `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiTabPortalComponent {\n /**\n * Reference to the {@link SiTabsetComponent} whose active tab content\n * this component renders via a `DomPortal`.\n *\n * The tabset's tab panel container, including the `role=\"tabpanel\"` element\n * with proper ARIA attributes, is transported to this component's location.\n */\n readonly tabset = input.required<SiTabsetComponent>();\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-tabset.component';\nexport * from './si-tab.component';\nexport * from './si-tab-link.component';\nexport * from './si-tab-portal.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, signal, inject, ElementRef, computed, TemplateRef, ChangeDetectionStrategy, Component, Injector, Injectable, input, booleanAttribute, PLATFORM_ID, Directive, NgModule } from '@angular/core';
3
- import { NgTemplateOutlet, NgComponentOutlet, isPlatformBrowser } from '@angular/common';
4
- import { Overlay } from '@angular/cdk/overlay';
2
+ import { InjectionToken, signal, inject, ElementRef, afterRenderEffect, computed, TemplateRef, ChangeDetectionStrategy, Component, Injector, PLATFORM_ID, Injectable, input, booleanAttribute, effect, Directive, NgModule } from '@angular/core';
3
+ import { OverlayRef, Overlay } from '@angular/cdk/overlay';
5
4
  import { ComponentPortal } from '@angular/cdk/portal';
6
- import { calculateOverlayArrowPosition, getPositionStrategy, getOverlay } from '@siemens/element-ng/common';
5
+ import { NgTemplateOutlet, NgComponentOutlet, isPlatformBrowser } from '@angular/common';
6
+ import { calculateOverlayArrowPosition, getOverlay, getPositionStrategy } from '@siemens/element-ng/common';
7
+ import { Subject, fromEvent, timer } from 'rxjs';
8
+ import { filter, takeUntil, delayWhen } from 'rxjs/operators';
7
9
  import { SiTranslatePipe } from '@siemens/element-translate-ng/translate';
8
10
 
9
11
  /**
@@ -12,14 +14,45 @@ import { SiTranslatePipe } from '@siemens/element-translate-ng/translate';
12
14
  */
13
15
  const SI_TOOLTIP_CONFIG = new InjectionToken('SiTooltipConfig');
14
16
 
17
+ /**
18
+ * Copyright (c) Siemens 2016 - 2026
19
+ * SPDX-License-Identifier: MIT
20
+ */
15
21
  class TooltipComponent {
16
22
  tooltipPositionClass = signal('', ...(ngDevMode ? [{ debugName: "tooltipPositionClass" }] : []));
17
23
  arrowPos = signal(undefined, ...(ngDevMode ? [{ debugName: "arrowPos" }] : []));
18
24
  config = inject(SI_TOOLTIP_CONFIG);
19
25
  elementRef = inject(ElementRef);
26
+ overlayRef = inject(OverlayRef);
27
+ lastPositionChange;
28
+ lastAnchor;
29
+ constructor() {
30
+ let isFirstRun = true;
31
+ afterRenderEffect(() => {
32
+ this.config.tooltip();
33
+ this.config.tooltipContext();
34
+ if (isFirstRun) {
35
+ isFirstRun = false;
36
+ return;
37
+ }
38
+ this.overlayRef.updatePosition();
39
+ if (this.lastPositionChange) {
40
+ this.updateTooltipPosition(this.lastPositionChange, this.lastAnchor);
41
+ }
42
+ });
43
+ }
20
44
  tooltipText = computed(() => {
21
45
  const tooltip = this.config.tooltip();
22
- return typeof tooltip === 'string' ? tooltip : null;
46
+ if (typeof tooltip === 'string') {
47
+ return tooltip;
48
+ }
49
+ // When an ElementRef is provided, read its current text content whenever the
50
+ // tooltip is shown, so dynamic content is always reflected.
51
+ // The tooltip content is not updated while being displayed.
52
+ if (tooltip instanceof ElementRef) {
53
+ return tooltip.nativeElement.textContent.trim();
54
+ }
55
+ return null;
23
56
  }, ...(ngDevMode ? [{ debugName: "tooltipText" }] : []));
24
57
  tooltipTemplate = computed(() => {
25
58
  const tooltip = this.config.tooltip();
@@ -27,10 +60,16 @@ class TooltipComponent {
27
60
  }, ...(ngDevMode ? [{ debugName: "tooltipTemplate" }] : []));
28
61
  tooltipComponent = computed(() => {
29
62
  const tooltip = this.config.tooltip();
30
- return !(tooltip instanceof TemplateRef) && typeof tooltip !== 'string' ? tooltip : null;
63
+ return !(tooltip instanceof TemplateRef) &&
64
+ !(tooltip instanceof ElementRef) &&
65
+ typeof tooltip !== 'string'
66
+ ? tooltip
67
+ : null;
31
68
  }, ...(ngDevMode ? [{ debugName: "tooltipComponent" }] : []));
32
69
  /** @internal */
33
70
  updateTooltipPosition(change, anchor) {
71
+ this.lastPositionChange = change;
72
+ this.lastAnchor = anchor;
34
73
  const arrowClassTooltip = `tooltip-${change.connectionPair.overlayX}-${change.connectionPair.overlayY}`;
35
74
  // need two updates as class changes affect the position
36
75
  if (arrowClassTooltip !== this.tooltipPositionClass()) {
@@ -47,45 +86,126 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
47
86
  args: [{ selector: 'si-tooltip', imports: [NgTemplateOutlet, SiTranslatePipe, NgComponentOutlet], changeDetection: ChangeDetectionStrategy.Default, host: {
48
87
  'animate.leave': 'tooltip-leave'
49
88
  }, template: "<div\n class=\"tooltip show position-relative\"\n role=\"tooltip\"\n [id]=\"config.id\"\n [class]=\"tooltipPositionClass()\"\n>\n <div\n class=\"tooltip-arrow\"\n [style.left.px]=\"arrowPos()?.left\"\n [style.right.px]=\"arrowPos()?.right\"\n ></div>\n <div class=\"tooltip-inner\">\n @if (tooltipText()) {\n <div class=\"si-body\">{{ tooltipText() | translate }}</div>\n } @else if (tooltipTemplate()) {\n <ng-template\n [ngTemplateOutlet]=\"tooltipTemplate()\"\n [ngTemplateOutletContext]=\"config.tooltipContext()\"\n />\n } @else if (tooltipComponent()) {\n <ng-container [ngComponentOutlet]=\"tooltipComponent()!\" />\n }\n </div>\n</div>\n", styles: [":host .tooltip,:host{transition:opacity calc(.15s * var(--element-animations-enabled, 1)) ease-out,transform calc(.15s * var(--element-animations-enabled, 1)) ease-out}:host{opacity:1;transform:scale(1)}:host.tooltip-leave{opacity:0;transform:scale(.8)}@starting-style{:host .tooltip{opacity:0;transform:scale(.8)}}\n"] }]
50
- }] });
89
+ }], ctorParameters: () => [] });
51
90
 
52
91
  /**
53
92
  * Copyright (c) Siemens 2016 - 2026
54
93
  * SPDX-License-Identifier: MIT
55
94
  */
56
95
  /**
57
- * TooltipRef is attached to a specific element.
96
+ * A no-op TooltipRef used on platform server where DOM APIs are unavailable.
97
+ *
98
+ * @internal
99
+ */
100
+ class NoopTooltipRef {
101
+ destroy() { }
102
+ }
103
+ /**
104
+ * BrowserTooltipRef is attached to a specific element.
58
105
  * Use it to show or hide a tooltip for that element.
59
106
  *
60
107
  * @internal
61
108
  */
62
- class TooltipRef {
109
+ class BrowserTooltipRef {
110
+ config;
111
+ destroy$ = new Subject();
112
+ isFocused = false;
113
+ isHovered = false;
63
114
  overlayRef;
64
- element;
65
- injector;
66
- constructor(overlayRef, element, injector) {
67
- this.overlayRef = overlayRef;
68
- this.element = element;
69
- this.injector = injector;
115
+ positionSubscription;
116
+ constructor(config) {
117
+ this.config = config;
118
+ const nativeElement = this.config.element.nativeElement;
119
+ fromEvent(nativeElement, 'focus')
120
+ .pipe(filter(event => event instanceof FocusEvent), takeUntil(this.destroy$))
121
+ .subscribe(event => this.onFocus(event));
122
+ fromEvent(nativeElement, 'mouseenter')
123
+ .pipe(delayWhen(() =>
124
+ // UX Guideline: tooltips on hover should be delayed by 500ms
125
+ timer(500).pipe(takeUntil(fromEvent(nativeElement, 'mouseleave')), takeUntil(fromEvent(nativeElement, 'focusout')) // user started using keyboard
126
+ )), takeUntil(this.destroy$))
127
+ .subscribe(() => this.onMouseEnter());
128
+ fromEvent(nativeElement, 'focusout')
129
+ .pipe(takeUntil(this.destroy$))
130
+ .subscribe(() => this.onFocusOut());
131
+ fromEvent(nativeElement, 'mouseleave')
132
+ .pipe(takeUntil(this.destroy$))
133
+ .subscribe(() => this.onMouseLeave());
134
+ fromEvent(nativeElement, 'touchstart')
135
+ .pipe(takeUntil(this.destroy$))
136
+ .subscribe(() => this.onTouchStart());
137
+ // The tooltip may be created lazily, after the element is already focused or
138
+ // hovered (e.g. when validation errors appear on blur while the pointer still
139
+ // hovers the element). In that case the initial `focus`/`mouseenter` was
140
+ // missed, so show the tooltip immediately based on the live `:focus-visible`
141
+ // and `:hover` state.
142
+ if (nativeElement === document.activeElement && nativeElement.matches(':focus-visible')) {
143
+ this.isFocused = true;
144
+ this.show();
145
+ }
146
+ else if (nativeElement.matches(':hover')) {
147
+ this.onMouseEnter();
148
+ }
149
+ }
150
+ onFocus(event) {
151
+ if (event.target instanceof Element) {
152
+ if (event.target.matches(':focus-visible')) {
153
+ this.isFocused = true;
154
+ this.show();
155
+ }
156
+ }
157
+ }
158
+ onFocusOut() {
159
+ this.isFocused = false;
160
+ this.isHovered = false;
161
+ this.hide();
162
+ }
163
+ onMouseEnter() {
164
+ this.isHovered = true;
165
+ this.show();
166
+ }
167
+ onMouseLeave() {
168
+ this.isHovered = false;
169
+ this.hide();
170
+ }
171
+ onTouchStart() {
172
+ // On touch devices a tooltip is not useful and would obscure the content the
173
+ // user just tapped. Reset the hover/focus state so it is hidden immediately.
174
+ this.isFocused = false;
175
+ this.isHovered = false;
176
+ this.hide();
177
+ }
178
+ getOrCreateOverlay() {
179
+ this.overlayRef ??= getOverlay(this.config.element, this.config.overlay, false, this.config.placement, false, true, this.config.scrollStrategy?.());
180
+ return this.overlayRef;
70
181
  }
71
- subscription;
72
182
  show() {
73
- if (this.overlayRef.hasAttached()) {
183
+ const overlayRef = this.getOrCreateOverlay();
184
+ if (overlayRef.hasAttached()) {
74
185
  return;
75
186
  }
76
- const toolTipPortal = new ComponentPortal(TooltipComponent, undefined, this.injector);
77
- const tooltipRef = this.overlayRef.attach(toolTipPortal);
78
- const positionStrategy = getPositionStrategy(this.overlayRef);
79
- this.subscription?.unsubscribe();
80
- this.subscription = positionStrategy?.positionChanges.subscribe(change => tooltipRef.instance.updateTooltipPosition(change, this.element));
187
+ const injector = Injector.create({
188
+ parent: this.config.injector,
189
+ providers: [{ provide: OverlayRef, useValue: overlayRef }]
190
+ });
191
+ const toolTipPortal = new ComponentPortal(TooltipComponent, undefined, injector);
192
+ const tooltipRef = overlayRef.attach(toolTipPortal);
193
+ const positionStrategy = getPositionStrategy(overlayRef);
194
+ this.positionSubscription?.unsubscribe();
195
+ this.positionSubscription = positionStrategy?.positionChanges.subscribe(change => tooltipRef.instance.updateTooltipPosition(change, this.config.element));
81
196
  }
82
197
  hide() {
83
- this.overlayRef.detach();
84
- this.subscription?.unsubscribe();
198
+ if (this.isFocused || this.isHovered) {
199
+ return;
200
+ }
201
+ this.overlayRef?.detach();
202
+ this.positionSubscription?.unsubscribe();
85
203
  }
86
204
  destroy() {
87
- this.overlayRef.dispose();
88
- this.subscription?.unsubscribe();
205
+ this.destroy$.next();
206
+ this.destroy$.complete();
207
+ this.overlayRef?.dispose();
208
+ this.positionSubscription?.unsubscribe();
89
209
  }
90
210
  }
91
211
  /**
@@ -98,7 +218,11 @@ class TooltipRef {
98
218
  // We cannot provide this in root, as people may override the cdk overlay creation.
99
219
  class SiTooltipService {
100
220
  overlay = inject(Overlay);
221
+ isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
101
222
  createTooltip(config) {
223
+ if (!this.isBrowser) {
224
+ return new NoopTooltipRef();
225
+ }
102
226
  const injector = Injector.create({
103
227
  parent: config.injector,
104
228
  providers: [
@@ -112,7 +236,11 @@ class SiTooltipService {
112
236
  }
113
237
  ]
114
238
  });
115
- return new TooltipRef(getOverlay(config.element, this.overlay, false, config.placement, false, true, config.scrollStrategy), config.element, injector);
239
+ return new BrowserTooltipRef({
240
+ ...config,
241
+ injector,
242
+ overlay: this.overlay
243
+ });
116
244
  }
117
245
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiTooltipService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
118
246
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiTooltipService });
@@ -152,53 +280,33 @@ class SiTooltipDirective {
152
280
  tooltipContext = input(...(ngDevMode ? [undefined, { debugName: "tooltipContext" }] : []));
153
281
  describedBy = `__tooltip_${SiTooltipDirective.idCounter++}`;
154
282
  tooltipRef;
155
- showTimeout;
156
283
  tooltipService = inject(SiTooltipService);
157
284
  elementRef = inject(ElementRef);
158
- isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
285
+ constructor() {
286
+ effect(() => {
287
+ const tooltip = this.siTooltip();
288
+ const disabled = this.isDisabled();
289
+ if (tooltip && !disabled) {
290
+ this.tooltipRef ??= this.tooltipService.createTooltip({
291
+ describedBy: this.describedBy,
292
+ element: this.elementRef,
293
+ placement: this.placement(),
294
+ tooltip: this.siTooltip,
295
+ tooltipContext: this.tooltipContext,
296
+ scrollStrategy: this.tooltipScrollStrategy
297
+ });
298
+ }
299
+ else if (this.tooltipRef) {
300
+ this.tooltipRef.destroy();
301
+ this.tooltipRef = undefined;
302
+ }
303
+ });
304
+ }
159
305
  ngOnDestroy() {
160
- this.clearShowTimeout();
161
306
  this.tooltipRef?.destroy();
162
307
  }
163
- clearShowTimeout() {
164
- if (this.showTimeout) {
165
- clearTimeout(this.showTimeout);
166
- this.showTimeout = undefined;
167
- }
168
- }
169
- showTooltip(immediate = false) {
170
- const siTooltip = this.siTooltip();
171
- if (this.isDisabled() || !siTooltip) {
172
- return;
173
- }
174
- this.clearShowTimeout();
175
- const delay = immediate ? 0 : 500;
176
- this.showTimeout = setTimeout(() => {
177
- this.tooltipRef ??= this.tooltipService.createTooltip({
178
- describedBy: this.describedBy,
179
- element: this.elementRef,
180
- placement: this.placement(),
181
- tooltip: this.siTooltip,
182
- tooltipContext: this.tooltipContext,
183
- scrollStrategy: this.tooltipScrollStrategy()
184
- });
185
- this.tooltipRef.show();
186
- }, delay);
187
- }
188
- focusIn(event) {
189
- if (this.isBrowser && event.target.matches(':focus-visible')) {
190
- this.showTooltip(true);
191
- }
192
- }
193
- show() {
194
- this.showTooltip(false);
195
- }
196
- hide() {
197
- this.clearShowTimeout();
198
- this.tooltipRef?.hide();
199
- }
200
308
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiTooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
201
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.8", type: SiTooltipDirective, isStandalone: true, selector: "[siTooltip]", inputs: { siTooltip: { classPropertyName: "siTooltip", publicName: "siTooltip", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, isDisabled: { classPropertyName: "isDisabled", publicName: "isDisabled", isSignal: true, isRequired: false, transformFunction: null }, tooltipScrollStrategy: { classPropertyName: "tooltipScrollStrategy", publicName: "tooltipScrollStrategy", isSignal: true, isRequired: false, transformFunction: null }, tooltipContext: { classPropertyName: "tooltipContext", publicName: "tooltipContext", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "focus": "focusIn($event)", "mouseenter": "show()", "touchstart": "hide()", "focusout": "hide()", "mouseleave": "hide()" }, properties: { "attr.aria-describedby": "isDisabled() ? null : describedBy" } }, providers: [SiTooltipService], ngImport: i0 });
309
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.8", type: SiTooltipDirective, isStandalone: true, selector: "[siTooltip]", inputs: { siTooltip: { classPropertyName: "siTooltip", publicName: "siTooltip", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, isDisabled: { classPropertyName: "isDisabled", publicName: "isDisabled", isSignal: true, isRequired: false, transformFunction: null }, tooltipScrollStrategy: { classPropertyName: "tooltipScrollStrategy", publicName: "tooltipScrollStrategy", isSignal: true, isRequired: false, transformFunction: null }, tooltipContext: { classPropertyName: "tooltipContext", publicName: "tooltipContext", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-describedby": "isDisabled() ? null : describedBy" } }, providers: [SiTooltipService], ngImport: i0 });
202
310
  }
203
311
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiTooltipDirective, decorators: [{
204
312
  type: Directive,
@@ -206,15 +314,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
206
314
  selector: '[siTooltip]',
207
315
  providers: [SiTooltipService],
208
316
  host: {
209
- '[attr.aria-describedby]': 'isDisabled() ? null : describedBy',
210
- '(focus)': 'focusIn($event)',
211
- '(mouseenter)': 'show()',
212
- '(touchstart)': 'hide()',
213
- '(focusout)': 'hide()',
214
- '(mouseleave)': 'hide()'
317
+ '[attr.aria-describedby]': 'isDisabled() ? null : describedBy'
215
318
  }
216
319
  }]
217
- }], propDecorators: { siTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "siTooltip", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], isDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isDisabled", required: false }] }], tooltipScrollStrategy: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipScrollStrategy", required: false }] }], tooltipContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipContext", required: false }] }] } });
320
+ }], ctorParameters: () => [], propDecorators: { siTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "siTooltip", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], isDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isDisabled", required: false }] }], tooltipScrollStrategy: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipScrollStrategy", required: false }] }], tooltipContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipContext", required: false }] }] } });
218
321
 
219
322
  /**
220
323
  * Copyright (c) Siemens 2016 - 2026