@fundamental-ngx/core 0.39.2 → 0.40.0-rc.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 (147) hide show
  1. package/dialog/base/dialog-config-base.class.d.ts +2 -0
  2. package/esm2020/avatar/avatar.component.mjs +6 -3
  3. package/esm2020/calendar/calendar-views/calendar-day-view/calendar-day-view.component.mjs +6 -3
  4. package/esm2020/date-picker/date-picker.component.mjs +5 -15
  5. package/esm2020/dialog/base/dialog-config-base.class.mjs +3 -1
  6. package/esm2020/dialog/dialog-body/dialog-body.component.mjs +3 -3
  7. package/esm2020/dialog/dialog.component.mjs +4 -3
  8. package/esm2020/dynamic-page/dynamic-page.component.mjs +2 -2
  9. package/esm2020/form/form-input-message-group/form-input-message-group.component.mjs +1 -1
  10. package/esm2020/form/form-label/form-label.component.mjs +8 -2
  11. package/esm2020/icon/icon.component.mjs +1 -1
  12. package/esm2020/illustrated-message/illustrated-message.component.mjs +5 -2
  13. package/esm2020/layout-panel/layout-panel-footer/layout-panel-footer.component.mjs +40 -22
  14. package/esm2020/layout-panel/layout-panel-title/layout-panel-title.directive.mjs +4 -4
  15. package/esm2020/layout-panel/layout-panel.component.mjs +15 -3
  16. package/esm2020/link/link.component.mjs +3 -3
  17. package/esm2020/list/list-component.interface.mjs +1 -1
  18. package/esm2020/list/list-item/list-item.component.mjs +9 -10
  19. package/esm2020/list/list-navigation-item/list-navigation-item.component.mjs +2 -2
  20. package/esm2020/list/list.component.mjs +2 -2
  21. package/esm2020/list/tokens.mjs +1 -1
  22. package/esm2020/multi-combobox/base-multi-combobox.class.mjs +2 -2
  23. package/esm2020/multi-combobox/multi-combobox.component.mjs +8 -9
  24. package/esm2020/multi-input/multi-input.component.mjs +7 -4
  25. package/esm2020/object-status/object-status.component.mjs +1 -1
  26. package/esm2020/popover/base/base-popover.class.mjs +18 -4
  27. package/esm2020/popover/popover-service/popover.service.mjs +22 -8
  28. package/esm2020/segmented-button/segmented-button.component.mjs +11 -15
  29. package/esm2020/select/option/option.component.mjs +21 -5
  30. package/esm2020/select/select.component.mjs +1 -1
  31. package/esm2020/splitter/splitter-pane-container/splitter-pane-container.component.mjs +9 -3
  32. package/esm2020/text/text.component.mjs +3 -3
  33. package/esm2020/theming/theming.service.mjs +11 -4
  34. package/esm2020/timeline/timeline.component.mjs +11 -11
  35. package/esm2020/token/token.component.mjs +27 -6
  36. package/esm2020/token/tokenizer.component.mjs +151 -71
  37. package/fesm2015/fundamental-ngx-core-avatar.mjs +5 -2
  38. package/fesm2015/fundamental-ngx-core-avatar.mjs.map +1 -1
  39. package/fesm2015/fundamental-ngx-core-calendar.mjs +5 -2
  40. package/fesm2015/fundamental-ngx-core-calendar.mjs.map +1 -1
  41. package/fesm2015/fundamental-ngx-core-date-picker.mjs +4 -14
  42. package/fesm2015/fundamental-ngx-core-date-picker.mjs.map +1 -1
  43. package/fesm2015/fundamental-ngx-core-dialog.mjs +6 -4
  44. package/fesm2015/fundamental-ngx-core-dialog.mjs.map +1 -1
  45. package/fesm2015/fundamental-ngx-core-dynamic-page.mjs +2 -2
  46. package/fesm2015/fundamental-ngx-core-dynamic-page.mjs.map +1 -1
  47. package/fesm2015/fundamental-ngx-core-form.mjs +7 -1
  48. package/fesm2015/fundamental-ngx-core-form.mjs.map +1 -1
  49. package/fesm2015/fundamental-ngx-core-icon.mjs.map +1 -1
  50. package/fesm2015/fundamental-ngx-core-illustrated-message.mjs +4 -1
  51. package/fesm2015/fundamental-ngx-core-illustrated-message.mjs.map +1 -1
  52. package/fesm2015/fundamental-ngx-core-layout-panel.mjs +55 -25
  53. package/fesm2015/fundamental-ngx-core-layout-panel.mjs.map +1 -1
  54. package/fesm2015/fundamental-ngx-core-link.mjs +2 -2
  55. package/fesm2015/fundamental-ngx-core-link.mjs.map +1 -1
  56. package/fesm2015/fundamental-ngx-core-list.mjs +15 -19
  57. package/fesm2015/fundamental-ngx-core-list.mjs.map +1 -1
  58. package/fesm2015/fundamental-ngx-core-multi-combobox.mjs +9 -11
  59. package/fesm2015/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
  60. package/fesm2015/fundamental-ngx-core-multi-input.mjs +6 -3
  61. package/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
  62. package/fesm2015/fundamental-ngx-core-object-status.mjs.map +1 -1
  63. package/fesm2015/fundamental-ngx-core-popover.mjs +38 -10
  64. package/fesm2015/fundamental-ngx-core-popover.mjs.map +1 -1
  65. package/fesm2015/fundamental-ngx-core-segmented-button.mjs +11 -15
  66. package/fesm2015/fundamental-ngx-core-segmented-button.mjs.map +1 -1
  67. package/fesm2015/fundamental-ngx-core-select.mjs +29 -14
  68. package/fesm2015/fundamental-ngx-core-select.mjs.map +1 -1
  69. package/fesm2015/fundamental-ngx-core-splitter.mjs +8 -2
  70. package/fesm2015/fundamental-ngx-core-splitter.mjs.map +1 -1
  71. package/fesm2015/fundamental-ngx-core-text.mjs +2 -2
  72. package/fesm2015/fundamental-ngx-core-text.mjs.map +1 -1
  73. package/fesm2015/fundamental-ngx-core-theming.mjs +10 -3
  74. package/fesm2015/fundamental-ngx-core-theming.mjs.map +1 -1
  75. package/fesm2015/fundamental-ngx-core-timeline.mjs +9 -10
  76. package/fesm2015/fundamental-ngx-core-timeline.mjs.map +1 -1
  77. package/fesm2015/fundamental-ngx-core-token.mjs +179 -76
  78. package/fesm2015/fundamental-ngx-core-token.mjs.map +1 -1
  79. package/fesm2020/fundamental-ngx-core-avatar.mjs +5 -2
  80. package/fesm2020/fundamental-ngx-core-avatar.mjs.map +1 -1
  81. package/fesm2020/fundamental-ngx-core-calendar.mjs +5 -2
  82. package/fesm2020/fundamental-ngx-core-calendar.mjs.map +1 -1
  83. package/fesm2020/fundamental-ngx-core-date-picker.mjs +4 -14
  84. package/fesm2020/fundamental-ngx-core-date-picker.mjs.map +1 -1
  85. package/fesm2020/fundamental-ngx-core-dialog.mjs +6 -4
  86. package/fesm2020/fundamental-ngx-core-dialog.mjs.map +1 -1
  87. package/fesm2020/fundamental-ngx-core-dynamic-page.mjs +2 -2
  88. package/fesm2020/fundamental-ngx-core-dynamic-page.mjs.map +1 -1
  89. package/fesm2020/fundamental-ngx-core-form.mjs +7 -1
  90. package/fesm2020/fundamental-ngx-core-form.mjs.map +1 -1
  91. package/fesm2020/fundamental-ngx-core-icon.mjs.map +1 -1
  92. package/fesm2020/fundamental-ngx-core-illustrated-message.mjs +4 -1
  93. package/fesm2020/fundamental-ngx-core-illustrated-message.mjs.map +1 -1
  94. package/fesm2020/fundamental-ngx-core-layout-panel.mjs +55 -25
  95. package/fesm2020/fundamental-ngx-core-layout-panel.mjs.map +1 -1
  96. package/fesm2020/fundamental-ngx-core-link.mjs +2 -2
  97. package/fesm2020/fundamental-ngx-core-link.mjs.map +1 -1
  98. package/fesm2020/fundamental-ngx-core-list.mjs +15 -18
  99. package/fesm2020/fundamental-ngx-core-list.mjs.map +1 -1
  100. package/fesm2020/fundamental-ngx-core-multi-combobox.mjs +8 -9
  101. package/fesm2020/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
  102. package/fesm2020/fundamental-ngx-core-multi-input.mjs +6 -3
  103. package/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
  104. package/fesm2020/fundamental-ngx-core-object-status.mjs.map +1 -1
  105. package/fesm2020/fundamental-ngx-core-popover.mjs +38 -10
  106. package/fesm2020/fundamental-ngx-core-popover.mjs.map +1 -1
  107. package/fesm2020/fundamental-ngx-core-segmented-button.mjs +11 -15
  108. package/fesm2020/fundamental-ngx-core-segmented-button.mjs.map +1 -1
  109. package/fesm2020/fundamental-ngx-core-select.mjs +27 -14
  110. package/fesm2020/fundamental-ngx-core-select.mjs.map +1 -1
  111. package/fesm2020/fundamental-ngx-core-splitter.mjs +8 -2
  112. package/fesm2020/fundamental-ngx-core-splitter.mjs.map +1 -1
  113. package/fesm2020/fundamental-ngx-core-text.mjs +2 -2
  114. package/fesm2020/fundamental-ngx-core-text.mjs.map +1 -1
  115. package/fesm2020/fundamental-ngx-core-theming.mjs +10 -3
  116. package/fesm2020/fundamental-ngx-core-theming.mjs.map +1 -1
  117. package/fesm2020/fundamental-ngx-core-timeline.mjs +9 -10
  118. package/fesm2020/fundamental-ngx-core-timeline.mjs.map +1 -1
  119. package/fesm2020/fundamental-ngx-core-token.mjs +173 -74
  120. package/fesm2020/fundamental-ngx-core-token.mjs.map +1 -1
  121. package/form/form-input-message-group/form-input-message-group.component.d.ts +2 -1
  122. package/fundamental-ngx-core-v0.40.0-rc.0.tgz +0 -0
  123. package/illustrated-message/illustrated-message.component.d.ts +2 -2
  124. package/layout-panel/layout-panel-footer/layout-panel-footer.component.d.ts +23 -14
  125. package/layout-panel/layout-panel-title/layout-panel-title.directive.d.ts +1 -1
  126. package/layout-panel/layout-panel.component.d.ts +5 -1
  127. package/list/list-component.interface.d.ts +1 -0
  128. package/list/list-item/list-item.component.d.ts +2 -2
  129. package/list/tokens.d.ts +1 -1
  130. package/multi-combobox/base-multi-combobox.class.d.ts +1 -2
  131. package/multi-combobox/multi-combobox.component.d.ts +2 -3
  132. package/object-status/object-status.component.d.ts +1 -1
  133. package/package.json +4 -4
  134. package/popover/base/base-popover.class.d.ts +17 -3
  135. package/popover/popover-service/popover.service.d.ts +2 -0
  136. package/schematics/add-dependencies/index.js +6 -6
  137. package/segmented-button/segmented-button.component.d.ts +0 -1
  138. package/select/option/option.component.d.ts +9 -2
  139. package/select/select.component.d.ts +1 -1
  140. package/splitter/splitter-pane-container/splitter-pane-container.component.d.ts +5 -1
  141. package/theming/theming.service.d.ts +12 -6
  142. package/timeline/timeline.component.d.ts +3 -2
  143. package/token/token.component.d.ts +7 -1
  144. package/token/tokenizer.component.d.ts +28 -7
  145. package/esm2020/list/list-component.token.mjs +0 -4
  146. package/fundamental-ngx-core-v0.39.2.tgz +0 -0
  147. package/list/list-component.token.d.ts +0 -4
@@ -1,17 +1,17 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, ViewContainerRef, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, ViewChild, Output, ElementRef, Optional, ContentChildren, forwardRef, ContentChild, ViewChildren, HostListener, Directive, NgModule } from '@angular/core';
2
+ import { EventEmitter, inject, ViewContainerRef, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, ViewChild, Output, ElementRef, Optional, Inject, ContentChildren, forwardRef, ContentChild, ViewChildren, HostListener, Directive, NgModule } from '@angular/core';
3
3
  import * as i3 from '@angular/common';
4
- import { CommonModule } from '@angular/common';
5
- import { Subscription, Subject, merge, fromEvent } from 'rxjs';
4
+ import { DOCUMENT, CommonModule } from '@angular/common';
5
+ import { Subscription, fromEvent, Subject, BehaviorSubject, startWith, merge } from 'rxjs';
6
6
  import * as i2 from '@fundamental-ngx/cdk/utils';
7
- import { KeyUtil, resizeObservable, applyCssClass } from '@fundamental-ngx/cdk/utils';
7
+ import { DestroyedService, KeyUtil, resizeObservable, applyCssClass } from '@fundamental-ngx/cdk/utils';
8
8
  import { ENTER, SPACE, DELETE, BACKSPACE, LEFT_ARROW, RIGHT_ARROW, A } from '@angular/cdk/keycodes';
9
9
  import * as i1 from '@fundamental-ngx/core/content-density';
10
10
  import { contentDensityObserverProviders, DeprecatedCompactDirective, CONTENT_DENSITY_DIRECTIVE, ContentDensityModule } from '@fundamental-ngx/core/content-density';
11
+ import { takeUntil, debounceTime, filter, map } from 'rxjs/operators';
11
12
  import * as i3$1 from '@fundamental-ngx/i18n';
12
13
  import { I18nModule } from '@fundamental-ngx/i18n';
13
14
  import { __decorate, __metadata } from 'tslib';
14
- import { filter, mapTo, debounceTime, takeUntil } from 'rxjs/operators';
15
15
  import { FormControlComponent } from '@fundamental-ngx/core/form';
16
16
  import * as i4 from '@fundamental-ngx/core/input-group';
17
17
  import { InputGroupModule } from '@fundamental-ngx/core/input-group';
@@ -60,10 +60,26 @@ class TokenComponent {
60
60
  /** Emitted when a there's a keydown registered on the token. */
61
61
  // eslint-disable-next-line @angular-eslint/no-output-on-prefix
62
62
  this.onTokenKeydown = new EventEmitter();
63
+ /**
64
+ * Emitted when token element received or lost focus.
65
+ */
66
+ this.elementFocused = new EventEmitter();
67
+ /** @hidden */
68
+ this._destroy$ = inject(DestroyedService);
63
69
  }
64
70
  /** @hidden */
65
71
  ngAfterViewInit() {
66
72
  this._viewContainer.createEmbeddedView(this._content);
73
+ fromEvent(this.tokenWrapperElement.nativeElement, 'focus')
74
+ .pipe(takeUntil(this._destroy$))
75
+ .subscribe(() => {
76
+ this.elementFocused.emit(true);
77
+ });
78
+ fromEvent(this.tokenWrapperElement.nativeElement, 'blur')
79
+ .pipe(takeUntil(this._destroy$))
80
+ .subscribe(() => {
81
+ this.elementFocused.emit(false);
82
+ });
67
83
  }
68
84
  /** @hidden */
69
85
  ngOnDestroy() {
@@ -95,10 +111,12 @@ class TokenComponent {
95
111
  }
96
112
  }
97
113
  TokenComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: TokenComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.ContentDensityObserver }], target: i0.ɵɵFactoryTarget.Component });
98
- TokenComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: TokenComponent, selector: "fd-token", inputs: { disabled: "disabled", selected: "selected", readOnly: "readOnly", deleteButtonLabel: "deleteButtonLabel", ariaRoleDescription: "ariaRoleDescription" }, outputs: { onCloseClick: "onCloseClick", onRemove: "onRemove", onTokenClick: "onTokenClick", onTokenKeydown: "onTokenKeydown" }, providers: [contentDensityObserverProviders()], viewQueries: [{ propertyName: "tokenWrapperElement", first: true, predicate: ["tokenWrapperElement"], descendants: true }, { propertyName: "_content", first: true, predicate: ["content"], descendants: true }, { propertyName: "_viewContainer", first: true, predicate: ["viewContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<span\n #tokenWrapperElement\n class=\"fd-token\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\n (keydown)=\"tokenKeydownHandler($event)\"\n [attr.aria-setsize]=\"totalCount\"\n [class.fd-token__disabled]=\"disabled\"\n [class.fd-token--compact]=\"_contentDensityObserver.isCompact$ | async\"\n [class.fd-token--selected]=\"selected\"\n [class.fd-token--readonly]=\"readOnly\"\n [attr.aria-selected]=\"selected\"\n [attr.aria-readonly]=\"readOnly\"\n>\n <span class=\"fd-token__text no-text-select\">\n <ng-container #viewContainer></ng-container>\n </span>\n <span\n (click)=\"closeClickHandler($event)\"\n role=\"button\"\n [attr.aria-label]=\"deleteButtonLabel || ('coreToken.deleteButtonLabel' | fdTranslate)\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.27.1\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-token{-webkit-box-sizing:border-box;-ms-flex-negative:0;align-items:center;background-color:var(--sapButton_TokenBackground);border:0;border:var(--sapButton_BorderWidth) solid var(--sapButton_TokenBorderColor);border-radius:var(--fdToken_Border_Radius);box-sizing:border-box;color:var(--sapTextColor);color:var(--fdToken_Text_Color);cursor:default;display:inline-flex;flex-shrink:0;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.625rem;line-height:var(--sapContent_LineHeight);line-height:1.5rem;margin:0;max-width:100%;min-width:3.625rem;padding:0;padding:.25rem 0 .25rem var(--fdToken_Padding_Left);text-align:center;text-overflow:clip;white-space:nowrap}.fd-token:after,.fd-token:before{box-sizing:inherit;font-size:inherit}.fd-token[dir=rtl],[dir=rtl] .fd-token{padding-left:0;padding-right:var(--fdToken_Padding_Left)}.fd-token__text{max-width:100%;min-width:auto;overflow:hidden;text-overflow:ellipsis;text-shadow:var(--fdToken_Text_Shadow);width:100%}.fd-token__close{-webkit-box-sizing:border-box;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:transparent;border:0;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapContent_IconColor);cursor:pointer;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-size:var(--sapFontSmallSize);font-weight:400;forced-color-adjust:none;height:1.625rem;justify-content:center;line-height:var(--sapContent_LineHeight);line-height:1.25rem;margin:0;min-width:1.75rem;padding:.25rem .5rem;width:1.75rem}.fd-token__close:after,.fd-token__close:before{box-sizing:inherit;font-size:inherit}.fd-token__close:before{content:\"\\e03e\";font-family:SAP-icons;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none}.fd-token__close.is-focus,.fd-token__close:focus{box-shadow:none;outline:none;z-index:5}.fd-token:hover{-webkit-box-shadow:var(--fdToken_Box_Shadow_Hover);background-color:var(--fdToken_Background_Color_Hover);border-color:var(--fdToken_Border_Color_Hover);box-shadow:var(--fdToken_Box_Shadow_Hover)}.fd-token.is-focus,.fd-token:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:var(--fdToken_Outline_Offset);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token--compact{height:1.25rem;line-height:1.125rem;min-width:3rem;padding:.1rem 0 .1rem .25rem}.fd-token--compact .fd-token__close{height:1.25rem;min-width:1.25rem;padding:.1rem .25rem;vertical-align:baseline;width:1.25rem}.fd-token--compact[dir=rtl],[dir=rtl] .fd-token--compact{padding-left:0;padding-right:.25rem}.fd-token--compact.is-focus,.fd-token--compact:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:var(--fdToken_Outline_Offset);outline-offset:var(--fdToken_Outline_Offset_Compact);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token--disabled{cursor:not-allowed}.fd-token--readonly{background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only);color:var(--sapContent_LabelColor);padding:.25rem .375rem}.fd-token--readonly.fd-token--compact{padding:.1rem .25rem}.fd-token--readonly.fd-token--compact[dir=rtl],[dir=rtl] .fd-token--readonly.fd-token--compact{padding-left:.25rem}.fd-token--readonly.is-hover,.fd-token--readonly:hover{-webkit-box-shadow:none;background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only);box-shadow:none;color:var(--sapContent_LabelColor)}.fd-token--readonly[dir=rtl],[dir=rtl] .fd-token--readonly{padding-left:.375rem}.fd-token.fd-token--selected{background-color:var(--sapButton_Selected_Background);border-color:var(--sapButton_Selected_BorderColor)}.fd-token.fd-token--selected,.fd-token.fd-token--selected .fd-token__close{color:var(--sapButton_Selected_TextColor)}.fd-token.fd-token--selected.is-hover,.fd-token.fd-token--selected:hover{-webkit-box-shadow:var(--fdToken_Box_Shadow_Selected_Hover);background-color:var(--sapButton_Selected_Hover_Background);border-color:var(--sapButton_Selected_Hover_BorderColor);box-shadow:var(--fdToken_Box_Shadow_Selected_Hover)}.fd-token.fd-token--selected.is-focus,.fd-token.fd-token--selected:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-color:var(--fdToken_Border_Color_Selected_Focus);outline-offset:var(--fdToken_Outline_Offset);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token__disabled:after{cursor:not-allowed}.no-text-select{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
114
+ TokenComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: TokenComponent, selector: "fd-token", inputs: { disabled: "disabled", selected: "selected", readOnly: "readOnly", deleteButtonLabel: "deleteButtonLabel", ariaRoleDescription: "ariaRoleDescription" }, outputs: { onCloseClick: "onCloseClick", onRemove: "onRemove", onTokenClick: "onTokenClick", onTokenKeydown: "onTokenKeydown", elementFocused: "elementFocused" }, host: { properties: { "style.max-width.%": "100" } }, providers: [contentDensityObserverProviders(), DestroyedService], viewQueries: [{ propertyName: "tokenWrapperElement", first: true, predicate: ["tokenWrapperElement"], descendants: true }, { propertyName: "_content", first: true, predicate: ["content"], descendants: true }, { propertyName: "_viewContainer", first: true, predicate: ["viewContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<span\n #tokenWrapperElement\n class=\"fd-token\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\n (keydown)=\"tokenKeydownHandler($event)\"\n [attr.aria-setsize]=\"totalCount\"\n [class.fd-token__disabled]=\"disabled\"\n [class.fd-token--compact]=\"_contentDensityObserver.isCompact$ | async\"\n [class.fd-token--selected]=\"selected\"\n [class.fd-token--readonly]=\"readOnly\"\n [attr.aria-selected]=\"selected\"\n [attr.aria-readonly]=\"readOnly\"\n>\n <span class=\"fd-token__text no-text-select\">\n <ng-container #viewContainer></ng-container>\n </span>\n <span\n (click)=\"closeClickHandler($event)\"\n role=\"button\"\n [attr.aria-label]=\"deleteButtonLabel || ('coreToken.deleteButtonLabel' | fdTranslate)\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.27.1\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-token{-webkit-box-sizing:border-box;-ms-flex-negative:0;align-items:center;background-color:var(--sapButton_TokenBackground);border:0;border:var(--sapButton_BorderWidth) solid var(--sapButton_TokenBorderColor);border-radius:var(--fdToken_Border_Radius);box-sizing:border-box;color:var(--sapTextColor);color:var(--fdToken_Text_Color);cursor:default;display:inline-flex;flex-shrink:0;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.625rem;line-height:var(--sapContent_LineHeight);line-height:1.5rem;margin:0;max-width:100%;min-width:3.625rem;padding:0;padding:.25rem 0 .25rem var(--fdToken_Padding_Left);text-align:center;text-overflow:clip;white-space:nowrap}.fd-token:after,.fd-token:before{box-sizing:inherit;font-size:inherit}.fd-token[dir=rtl],[dir=rtl] .fd-token{padding-left:0;padding-right:var(--fdToken_Padding_Left)}.fd-token__text{max-width:100%;min-width:auto;overflow:hidden;text-overflow:ellipsis;text-shadow:var(--fdToken_Text_Shadow);width:100%}.fd-token__close{-webkit-box-sizing:border-box;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:transparent;border:0;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapContent_IconColor);cursor:pointer;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-size:var(--sapFontSmallSize);font-weight:400;forced-color-adjust:none;height:1.625rem;justify-content:center;line-height:var(--sapContent_LineHeight);line-height:1.25rem;margin:0;min-width:1.75rem;padding:.25rem .5rem;width:1.75rem}.fd-token__close:after,.fd-token__close:before{box-sizing:inherit;font-size:inherit}.fd-token__close:before{content:\"\\e03e\";font-family:SAP-icons;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none}.fd-token__close.is-focus,.fd-token__close:focus{box-shadow:none;outline:none;z-index:5}.fd-token:hover{-webkit-box-shadow:var(--fdToken_Box_Shadow_Hover);background-color:var(--fdToken_Background_Color_Hover);border-color:var(--fdToken_Border_Color_Hover);box-shadow:var(--fdToken_Box_Shadow_Hover)}.fd-token.is-focus,.fd-token:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:var(--fdToken_Outline_Offset);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token--compact{height:1.25rem;line-height:1.125rem;min-width:3rem;padding:.1rem 0 .1rem .25rem}.fd-token--compact .fd-token__close{height:1.25rem;min-width:1.25rem;padding:.1rem .25rem;vertical-align:baseline;width:1.25rem}.fd-token--compact[dir=rtl],[dir=rtl] .fd-token--compact{padding-left:0;padding-right:.25rem}.fd-token--compact.is-focus,.fd-token--compact:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:var(--fdToken_Outline_Offset);outline-offset:var(--fdToken_Outline_Offset_Compact);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token--disabled{cursor:not-allowed}.fd-token--readonly{background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only);color:var(--sapContent_LabelColor);padding:.25rem .375rem}.fd-token--readonly.fd-token--compact{padding:.1rem .25rem}.fd-token--readonly.fd-token--compact[dir=rtl],[dir=rtl] .fd-token--readonly.fd-token--compact{padding-left:.25rem}.fd-token--readonly.is-hover,.fd-token--readonly:hover{-webkit-box-shadow:none;background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only);box-shadow:none;color:var(--sapContent_LabelColor)}.fd-token--readonly[dir=rtl],[dir=rtl] .fd-token--readonly{padding-left:.375rem}.fd-token.fd-token--selected{background-color:var(--sapButton_Selected_Background);border-color:var(--sapButton_Selected_BorderColor)}.fd-token.fd-token--selected,.fd-token.fd-token--selected .fd-token__close{color:var(--sapButton_Selected_TextColor)}.fd-token.fd-token--selected.is-hover,.fd-token.fd-token--selected:hover{-webkit-box-shadow:var(--fdToken_Box_Shadow_Selected_Hover);background-color:var(--sapButton_Selected_Hover_Background);border-color:var(--sapButton_Selected_Hover_BorderColor);box-shadow:var(--fdToken_Box_Shadow_Selected_Hover)}.fd-token.fd-token--selected.is-focus,.fd-token.fd-token--selected:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-color:var(--fdToken_Border_Color_Selected_Focus);outline-offset:var(--fdToken_Outline_Offset);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token__disabled:after{cursor:not-allowed}.no-text-select{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
99
115
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: TokenComponent, decorators: [{
100
116
  type: Component,
101
- args: [{ selector: 'fd-token', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [contentDensityObserverProviders()], template: "<span\n #tokenWrapperElement\n class=\"fd-token\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\n (keydown)=\"tokenKeydownHandler($event)\"\n [attr.aria-setsize]=\"totalCount\"\n [class.fd-token__disabled]=\"disabled\"\n [class.fd-token--compact]=\"_contentDensityObserver.isCompact$ | async\"\n [class.fd-token--selected]=\"selected\"\n [class.fd-token--readonly]=\"readOnly\"\n [attr.aria-selected]=\"selected\"\n [attr.aria-readonly]=\"readOnly\"\n>\n <span class=\"fd-token__text no-text-select\">\n <ng-container #viewContainer></ng-container>\n </span>\n <span\n (click)=\"closeClickHandler($event)\"\n role=\"button\"\n [attr.aria-label]=\"deleteButtonLabel || ('coreToken.deleteButtonLabel' | fdTranslate)\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.27.1\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-token{-webkit-box-sizing:border-box;-ms-flex-negative:0;align-items:center;background-color:var(--sapButton_TokenBackground);border:0;border:var(--sapButton_BorderWidth) solid var(--sapButton_TokenBorderColor);border-radius:var(--fdToken_Border_Radius);box-sizing:border-box;color:var(--sapTextColor);color:var(--fdToken_Text_Color);cursor:default;display:inline-flex;flex-shrink:0;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.625rem;line-height:var(--sapContent_LineHeight);line-height:1.5rem;margin:0;max-width:100%;min-width:3.625rem;padding:0;padding:.25rem 0 .25rem var(--fdToken_Padding_Left);text-align:center;text-overflow:clip;white-space:nowrap}.fd-token:after,.fd-token:before{box-sizing:inherit;font-size:inherit}.fd-token[dir=rtl],[dir=rtl] .fd-token{padding-left:0;padding-right:var(--fdToken_Padding_Left)}.fd-token__text{max-width:100%;min-width:auto;overflow:hidden;text-overflow:ellipsis;text-shadow:var(--fdToken_Text_Shadow);width:100%}.fd-token__close{-webkit-box-sizing:border-box;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:transparent;border:0;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapContent_IconColor);cursor:pointer;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-size:var(--sapFontSmallSize);font-weight:400;forced-color-adjust:none;height:1.625rem;justify-content:center;line-height:var(--sapContent_LineHeight);line-height:1.25rem;margin:0;min-width:1.75rem;padding:.25rem .5rem;width:1.75rem}.fd-token__close:after,.fd-token__close:before{box-sizing:inherit;font-size:inherit}.fd-token__close:before{content:\"\\e03e\";font-family:SAP-icons;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none}.fd-token__close.is-focus,.fd-token__close:focus{box-shadow:none;outline:none;z-index:5}.fd-token:hover{-webkit-box-shadow:var(--fdToken_Box_Shadow_Hover);background-color:var(--fdToken_Background_Color_Hover);border-color:var(--fdToken_Border_Color_Hover);box-shadow:var(--fdToken_Box_Shadow_Hover)}.fd-token.is-focus,.fd-token:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:var(--fdToken_Outline_Offset);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token--compact{height:1.25rem;line-height:1.125rem;min-width:3rem;padding:.1rem 0 .1rem .25rem}.fd-token--compact .fd-token__close{height:1.25rem;min-width:1.25rem;padding:.1rem .25rem;vertical-align:baseline;width:1.25rem}.fd-token--compact[dir=rtl],[dir=rtl] .fd-token--compact{padding-left:0;padding-right:.25rem}.fd-token--compact.is-focus,.fd-token--compact:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:var(--fdToken_Outline_Offset);outline-offset:var(--fdToken_Outline_Offset_Compact);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token--disabled{cursor:not-allowed}.fd-token--readonly{background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only);color:var(--sapContent_LabelColor);padding:.25rem .375rem}.fd-token--readonly.fd-token--compact{padding:.1rem .25rem}.fd-token--readonly.fd-token--compact[dir=rtl],[dir=rtl] .fd-token--readonly.fd-token--compact{padding-left:.25rem}.fd-token--readonly.is-hover,.fd-token--readonly:hover{-webkit-box-shadow:none;background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only);box-shadow:none;color:var(--sapContent_LabelColor)}.fd-token--readonly[dir=rtl],[dir=rtl] .fd-token--readonly{padding-left:.375rem}.fd-token.fd-token--selected{background-color:var(--sapButton_Selected_Background);border-color:var(--sapButton_Selected_BorderColor)}.fd-token.fd-token--selected,.fd-token.fd-token--selected .fd-token__close{color:var(--sapButton_Selected_TextColor)}.fd-token.fd-token--selected.is-hover,.fd-token.fd-token--selected:hover{-webkit-box-shadow:var(--fdToken_Box_Shadow_Selected_Hover);background-color:var(--sapButton_Selected_Hover_Background);border-color:var(--sapButton_Selected_Hover_BorderColor);box-shadow:var(--fdToken_Box_Shadow_Selected_Hover)}.fd-token.fd-token--selected.is-focus,.fd-token.fd-token--selected:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-color:var(--fdToken_Border_Color_Selected_Focus);outline-offset:var(--fdToken_Outline_Offset);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token__disabled:after{cursor:not-allowed}.no-text-select{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}\n"] }]
117
+ args: [{ selector: 'fd-token', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [contentDensityObserverProviders(), DestroyedService], host: {
118
+ '[style.max-width.%]': '100'
119
+ }, template: "<span\n #tokenWrapperElement\n class=\"fd-token\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\n (keydown)=\"tokenKeydownHandler($event)\"\n [attr.aria-setsize]=\"totalCount\"\n [class.fd-token__disabled]=\"disabled\"\n [class.fd-token--compact]=\"_contentDensityObserver.isCompact$ | async\"\n [class.fd-token--selected]=\"selected\"\n [class.fd-token--readonly]=\"readOnly\"\n [attr.aria-selected]=\"selected\"\n [attr.aria-readonly]=\"readOnly\"\n>\n <span class=\"fd-token__text no-text-select\">\n <ng-container #viewContainer></ng-container>\n </span>\n <span\n (click)=\"closeClickHandler($event)\"\n role=\"button\"\n [attr.aria-label]=\"deleteButtonLabel || ('coreToken.deleteButtonLabel' | fdTranslate)\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.27.1\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-token{-webkit-box-sizing:border-box;-ms-flex-negative:0;align-items:center;background-color:var(--sapButton_TokenBackground);border:0;border:var(--sapButton_BorderWidth) solid var(--sapButton_TokenBorderColor);border-radius:var(--fdToken_Border_Radius);box-sizing:border-box;color:var(--sapTextColor);color:var(--fdToken_Text_Color);cursor:default;display:inline-flex;flex-shrink:0;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:1.625rem;line-height:var(--sapContent_LineHeight);line-height:1.5rem;margin:0;max-width:100%;min-width:3.625rem;padding:0;padding:.25rem 0 .25rem var(--fdToken_Padding_Left);text-align:center;text-overflow:clip;white-space:nowrap}.fd-token:after,.fd-token:before{box-sizing:inherit;font-size:inherit}.fd-token[dir=rtl],[dir=rtl] .fd-token{padding-left:0;padding-right:var(--fdToken_Padding_Left)}.fd-token__text{max-width:100%;min-width:auto;overflow:hidden;text-overflow:ellipsis;text-shadow:var(--fdToken_Text_Shadow);width:100%}.fd-token__close{-webkit-box-sizing:border-box;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:transparent;border:0;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapContent_IconColor);cursor:pointer;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-size:var(--sapFontSmallSize);font-weight:400;forced-color-adjust:none;height:1.625rem;justify-content:center;line-height:var(--sapContent_LineHeight);line-height:1.25rem;margin:0;min-width:1.75rem;padding:.25rem .5rem;width:1.75rem}.fd-token__close:after,.fd-token__close:before{box-sizing:inherit;font-size:inherit}.fd-token__close:before{content:\"\\e03e\";font-family:SAP-icons;text-align:center;text-decoration:inherit;text-rendering:optimizeLegibility;text-transform:none}.fd-token__close.is-focus,.fd-token__close:focus{box-shadow:none;outline:none;z-index:5}.fd-token:hover{-webkit-box-shadow:var(--fdToken_Box_Shadow_Hover);background-color:var(--fdToken_Background_Color_Hover);border-color:var(--fdToken_Border_Color_Hover);box-shadow:var(--fdToken_Box_Shadow_Hover)}.fd-token.is-focus,.fd-token:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:var(--fdToken_Outline_Offset);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token--compact{height:1.25rem;line-height:1.125rem;min-width:3rem;padding:.1rem 0 .1rem .25rem}.fd-token--compact .fd-token__close{height:1.25rem;min-width:1.25rem;padding:.1rem .25rem;vertical-align:baseline;width:1.25rem}.fd-token--compact[dir=rtl],[dir=rtl] .fd-token--compact{padding-left:0;padding-right:.25rem}.fd-token--compact.is-focus,.fd-token--compact:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:var(--fdToken_Outline_Offset);outline-offset:var(--fdToken_Outline_Offset_Compact);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token--disabled{cursor:not-allowed}.fd-token--readonly{background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only);color:var(--sapContent_LabelColor);padding:.25rem .375rem}.fd-token--readonly.fd-token--compact{padding:.1rem .25rem}.fd-token--readonly.fd-token--compact[dir=rtl],[dir=rtl] .fd-token--readonly.fd-token--compact{padding-left:.25rem}.fd-token--readonly.is-hover,.fd-token--readonly:hover{-webkit-box-shadow:none;background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only);box-shadow:none;color:var(--sapContent_LabelColor)}.fd-token--readonly[dir=rtl],[dir=rtl] .fd-token--readonly{padding-left:.375rem}.fd-token.fd-token--selected{background-color:var(--sapButton_Selected_Background);border-color:var(--sapButton_Selected_BorderColor)}.fd-token.fd-token--selected,.fd-token.fd-token--selected .fd-token__close{color:var(--sapButton_Selected_TextColor)}.fd-token.fd-token--selected.is-hover,.fd-token.fd-token--selected:hover{-webkit-box-shadow:var(--fdToken_Box_Shadow_Selected_Hover);background-color:var(--sapButton_Selected_Hover_Background);border-color:var(--sapButton_Selected_Hover_BorderColor);box-shadow:var(--fdToken_Box_Shadow_Selected_Hover)}.fd-token.fd-token--selected.is-focus,.fd-token.fd-token--selected:focus{box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-color:var(--fdToken_Border_Color_Selected_Focus);outline-offset:var(--fdToken_Outline_Offset);outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth)}.fd-token__disabled:after{cursor:not-allowed}.no-text-select{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}\n"] }]
102
120
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.ContentDensityObserver }]; }, propDecorators: { disabled: [{
103
121
  type: Input
104
122
  }], tokenWrapperElement: [{
@@ -130,6 +148,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImpor
130
148
  // eslint-disable-next-line @angular-eslint/no-output-on-prefix
131
149
  onTokenKeydown: [{
132
150
  type: Output
151
+ }], elementFocused: [{
152
+ type: Output
133
153
  }] } });
134
154
 
135
155
  class TokenizerComponent {
@@ -148,12 +168,13 @@ class TokenizerComponent {
148
168
  return this._contentDensityObserver.isCompact;
149
169
  }
150
170
  /** @hidden */
151
- constructor(_contentDensityObserver, _elementRef, _cdRef, _rtlService, _renderer) {
171
+ constructor(_contentDensityObserver, _elementRef, _cdRef, _rtlService, _renderer, _document) {
152
172
  this._contentDensityObserver = _contentDensityObserver;
153
173
  this._elementRef = _elementRef;
154
174
  this._cdRef = _cdRef;
155
175
  this._rtlService = _rtlService;
156
176
  this._renderer = _renderer;
177
+ this._document = _document;
157
178
  /** Disables possibility to remove tokens by keyboard */
158
179
  this.disableKeyboardDeletion = false;
159
180
  /** Whether to use cozy visuals but compact collapsing behavior. */
@@ -176,6 +197,10 @@ class TokenizerComponent {
176
197
  this._tokenizerHasFocus = false;
177
198
  /** @hidden */
178
199
  this._showOverflowPopover = true;
200
+ /** @hidden */
201
+ this._showMoreElement = false;
202
+ /** @hidden */
203
+ this._tokensContainerWidth = 'auto';
179
204
  /** @hidden
180
205
  * Variable which will keep the index of the first token pressed in the tokenizer
181
206
  */
@@ -192,6 +217,12 @@ class TokenizerComponent {
192
217
  this._onDestroy$ = new Subject();
193
218
  /** @hidden */
194
219
  this._eventListeners = [];
220
+ /** @hidden */
221
+ this._forceAllTokensToDisplay = false;
222
+ /** @hidden */
223
+ this._tokenElementFocused = new BehaviorSubject(false);
224
+ /** @hidden */
225
+ this._inputElementFocused = false;
195
226
  this._eventListeners.push(this._renderer.listen('window', 'click', (e) => {
196
227
  if (this._elementRef.nativeElement.contains(e.target) === false) {
197
228
  this.tokenList.forEach((token) => {
@@ -207,33 +238,32 @@ class TokenizerComponent {
207
238
  this._inputKeydownEvent();
208
239
  }
209
240
  // watch for changes to the tokenList and attempt to expand/collapse tokens as needed
210
- if (this.tokenListChangesSubscription) {
211
- this.tokenListChangesSubscription.unsubscribe();
212
- }
213
- this.tokenListChangesSubscription = this.tokenList.changes.subscribe(() => {
241
+ this.tokenList.changes.pipe(startWith(null)).subscribe(() => {
242
+ var _a;
243
+ (_a = this.tokenListChangesSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
244
+ this.tokenListChangesSubscription = new Subscription();
214
245
  this._resetTokens();
215
- });
216
- this.tokenList.forEach((token) => {
217
- this.tokenListChangesSubscription.add(token.onCloseClick.subscribe(() => {
218
- this._resetTokens();
219
- }));
246
+ this.tokenList.forEach((token) => {
247
+ this.tokenListChangesSubscription.add(token.onCloseClick.subscribe(() => {
248
+ this._resetTokens();
249
+ }));
250
+ this.tokenListChangesSubscription.add(token.elementFocused.subscribe((isFocused) => {
251
+ this._tokenElementFocused.next(isFocused);
252
+ }));
253
+ });
220
254
  });
221
255
  if (!this.compact && !this.compactCollapse) {
222
256
  this._handleCozyTokenCount();
223
257
  }
224
- }
225
- /** @hidden */
226
- ngAfterContentInit() {
227
258
  this._listenElementEvents();
228
259
  this.previousElementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
229
260
  this._listenOnResize();
230
- this.onResize();
231
261
  }
232
262
  /** @hidden */
233
263
  ngOnDestroy() {
234
- if (this.tokenListChangesSubscription) {
235
- this.tokenListChangesSubscription.unsubscribe();
236
- }
264
+ var _a, _b;
265
+ (_a = this.tokenListChangesSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
266
+ (_b = this._tokenElementFocusedSub) === null || _b === void 0 ? void 0 : _b.unsubscribe();
237
267
  this._onDestroy$.next();
238
268
  this._onDestroy$.complete();
239
269
  this._eventListeners.forEach((e) => e());
@@ -373,12 +403,17 @@ class TokenizerComponent {
373
403
  }
374
404
  /** @hidden */
375
405
  getCombinedTokenWidth() {
376
- var _a;
377
- let totalTokenWidth = 0;
406
+ let totalTokenWidth = this._getTokensAreaWidthWithoutTokens();
378
407
  // get the width of each token
379
408
  this.tokenList.forEach((token) => {
380
409
  totalTokenWidth = totalTokenWidth + token.elementRef.nativeElement.getBoundingClientRect().width;
381
410
  });
411
+ return totalTokenWidth;
412
+ }
413
+ /** @hidden */
414
+ _getTokensAreaWidthWithoutTokens() {
415
+ var _a;
416
+ let totalTokenWidth = 0;
382
417
  // add input width
383
418
  if ((_a = this.input) === null || _a === void 0 ? void 0 : _a.nativeElement) {
384
419
  totalTokenWidth = totalTokenWidth + this.input.nativeElement.getBoundingClientRect().width;
@@ -416,6 +451,45 @@ class TokenizerComponent {
416
451
  }
417
452
  }
418
453
  /** @hidden */
454
+ _showAllTokens() {
455
+ this._forceAllTokensToDisplay = true;
456
+ this._inputElementFocused = true;
457
+ this.tokenList.forEach((token) => {
458
+ this._makeElementVisible(token.elementRef);
459
+ token._viewContainer.createEmbeddedView(token._content);
460
+ });
461
+ this._tokensContainerWidth = 'auto';
462
+ this._showMoreElement = false;
463
+ this._cdRef.detectChanges();
464
+ this.tokenizerInnerEl.nativeElement.scrollLeft = this.tokenizerInnerEl.nativeElement.scrollWidth;
465
+ }
466
+ /** @hidden */
467
+ _hideTokens() {
468
+ setTimeout(() => {
469
+ this._inputElementFocused = false;
470
+ const tokenFocused = this._getFocusedTokenIndex() > -1;
471
+ if (tokenFocused) {
472
+ this._waitForFocusToDisappear();
473
+ return;
474
+ }
475
+ this._forceAllTokensToDisplay = false;
476
+ this._resetTokens();
477
+ this._cdRef.detectChanges();
478
+ this.tokenizerInnerEl.nativeElement.scrollLeft = this.tokenizerInnerEl.nativeElement.scrollWidth;
479
+ });
480
+ }
481
+ /** @hidden */
482
+ _waitForFocusToDisappear() {
483
+ var _a;
484
+ (_a = this._tokenElementFocusedSub) === null || _a === void 0 ? void 0 : _a.unsubscribe();
485
+ // 5 ms delay for other token to receive focus, check if _showAllTokens was called again
486
+ this._tokenElementFocusedSub = this._tokenElementFocused
487
+ .pipe(debounceTime(5), filter((isFocused) => isFocused && !this._inputElementFocused))
488
+ .subscribe(() => {
489
+ this._hideTokens();
490
+ });
491
+ }
492
+ /** @hidden */
419
493
  _handleArrowRight(fromIndex) {
420
494
  if (fromIndex === this.tokenList.length - this.moreTokensRight.length - 1 && this.moreTokensRight.length) {
421
495
  const poppedToken = this.moreTokensRight.pop();
@@ -429,53 +503,67 @@ class TokenizerComponent {
429
503
  }
430
504
  /** @hidden */
431
505
  _collapseTokens(side) {
432
- if (this.compact || this.compactCollapse) {
433
- this._cdRef.detectChanges();
434
- this._viewContainer.forEach((viewContainer) => viewContainer.clear());
435
- this.tokenList.forEach((token) => token._viewContainer.createEmbeddedView(token._content));
436
- let elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
437
- let combinedTokenWidth = this.getCombinedTokenWidth(); // the combined width of all tokens, the "____ more" text, and the input
438
- let i = 0;
439
- /*
440
- When resizing, we want to collapse the tokens on the left first. However when the user is navigating through
441
- a group of overflowing tokens using the arrow left key, we may need to hide tokens on the right. So if this
442
- function has been called with the param 'right' it will collapse tokens from the right side of the list rather
443
- than the (default) left side.
444
- */
445
- if (side === 'right') {
446
- i = this.tokenList.length - 1;
447
- }
448
- while (combinedTokenWidth > elementWidth && (side === 'right' ? i >= 0 : i < this.tokenList.length)) {
449
- // loop through the tokens and hide them until the combinedTokenWidth fits in the elementWidth
450
- const token = this.tokenList.find((item, index) => index === i);
451
- const moreTokens = side === 'right' ? this.moreTokensRight : this.moreTokensLeft;
452
- if (token) {
453
- if (moreTokens.indexOf(token) === -1) {
454
- moreTokens.push(token);
455
- }
456
- token.elementRef.nativeElement.style.display = 'none';
457
- }
458
- // get the new elementWidth and combinedTokenWidth as these will have changed after setting a token display to 'none'
459
- elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
460
- combinedTokenWidth = this.getCombinedTokenWidth();
461
- side === 'right' ? i-- : i++;
462
- }
463
- this._cdRef.detectChanges();
464
- this._hiddenTokens.forEach((hiddenToken, index) => {
465
- var _a;
466
- hiddenToken._viewContainer.clear();
467
- (_a = this._viewContainer.get(index)) === null || _a === void 0 ? void 0 : _a.createEmbeddedView(hiddenToken._content);
468
- });
506
+ var _a;
507
+ if (this._forceAllTokensToDisplay) {
508
+ return;
469
509
  }
470
- else {
510
+ if (!this.compact && !this.compactCollapse) {
471
511
  this._getHiddenCozyTokenCount();
512
+ return;
513
+ }
514
+ this._cdRef.detectChanges();
515
+ this._viewContainer.forEach((viewContainer) => viewContainer.clear());
516
+ const availableWidth = this._getTokensAreaWidthWithoutTokens();
517
+ if (this.tokenList.length === 1) {
518
+ const tokenWidth = (_a = this.tokenList.get(0)) === null || _a === void 0 ? void 0 : _a.elementRef.nativeElement.getBoundingClientRect().width;
519
+ this._tokensContainerWidth = availableWidth < tokenWidth ? `calc(100% - ${availableWidth}px)` : 'auto';
520
+ return;
521
+ }
522
+ else {
523
+ this._tokensContainerWidth = 'auto';
524
+ }
525
+ this._checkMoreElementVisibility();
526
+ this.tokenList.forEach((token) => token._viewContainer.createEmbeddedView(token._content));
527
+ let elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
528
+ let combinedTokenWidth = this.getCombinedTokenWidth(); // the combined width of all tokens, the "____ more" text, and the input
529
+ let i = 0;
530
+ /*
531
+ When resizing, we want to collapse the tokens on the left first. However, when the user is navigating through
532
+ a group of overflowing tokens using the arrow left key, we may need to hide tokens on the right. So if this
533
+ function has been called with the param 'right' it will collapse tokens from the right side of the list rather
534
+ than the (default) left side.
535
+ */
536
+ if (side === 'right') {
537
+ i = this.tokenList.length - 1;
538
+ }
539
+ while (combinedTokenWidth > elementWidth && (side === 'right' ? i >= 0 : i < this.tokenList.length)) {
540
+ // loop through the tokens and hide them until the combinedTokenWidth fits in the elementWidth
541
+ const token = this.tokenList.get(i);
542
+ const moreTokens = side === 'right' ? this.moreTokensRight : this.moreTokensLeft;
543
+ if (token) {
544
+ if (moreTokens.indexOf(token) === -1) {
545
+ moreTokens.push(token);
546
+ }
547
+ token.elementRef.nativeElement.style.display = 'none';
548
+ }
549
+ // get the new elementWidth and combinedTokenWidth as these will have changed after setting a token display to 'none'
550
+ elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;
551
+ this._checkMoreElementVisibility();
552
+ combinedTokenWidth = this.getCombinedTokenWidth();
553
+ side === 'right' ? i-- : i++;
472
554
  }
555
+ this._cdRef.detectChanges();
556
+ this._hiddenTokens.forEach((hiddenToken, index) => {
557
+ var _a;
558
+ hiddenToken._viewContainer.clear();
559
+ (_a = this._viewContainer.get(index)) === null || _a === void 0 ? void 0 : _a.createEmbeddedView(hiddenToken._content);
560
+ });
473
561
  }
474
562
  /** @hidden */
475
563
  _resetTokens() {
476
564
  this.moreTokensLeft = [];
477
565
  this.moreTokensRight = [];
478
- if (this.compact || this.compactCollapse) {
566
+ if (this.compact || this.compactCollapse || this._forceAllTokensToDisplay) {
479
567
  this.tokenList.forEach((token) => {
480
568
  this._makeElementVisible(token.elementRef);
481
569
  });
@@ -500,7 +588,7 @@ class TokenizerComponent {
500
588
  this.hiddenCozyTokenCount += 1;
501
589
  }
502
590
  });
503
- this._cdRef.detectChanges();
591
+ this._checkMoreElementVisibility();
504
592
  }
505
593
  /** @hidden */
506
594
  _handleCozyTokenCount() {
@@ -627,11 +715,11 @@ class TokenizerComponent {
627
715
  }
628
716
  /** @hidden */
629
717
  _isTokenFocused(token) {
630
- return token.tokenWrapperElement.nativeElement === document.activeElement;
718
+ return token.tokenWrapperElement.nativeElement === this._document.activeElement;
631
719
  }
632
720
  /** @hidden */
633
721
  _isInputFocused() {
634
- return document.activeElement === this.input.nativeElement;
722
+ return this._document.activeElement === this.input.nativeElement;
635
723
  }
636
724
  /** @hidden */
637
725
  _tokensSelected() {
@@ -651,7 +739,7 @@ class TokenizerComponent {
651
739
  }
652
740
  /** @hidden */
653
741
  _listenElementEvents() {
654
- merge(fromEvent(this._elementRef.nativeElement, 'focus', { capture: true }).pipe(filter((event) => { var _a; return ((_a = event['target']) === null || _a === void 0 ? void 0 : _a.tagName) === 'INPUT' && this.tokenizerFocusable; }), mapTo(true)), fromEvent(this._elementRef.nativeElement, 'blur', { capture: true }).pipe(mapTo(false)))
742
+ merge(fromEvent(this._elementRef.nativeElement, 'focus', { capture: true }).pipe(filter((event) => { var _a; return ((_a = event['target']) === null || _a === void 0 ? void 0 : _a.tagName) === 'INPUT' && this.tokenizerFocusable; }), map(() => true)), fromEvent(this._elementRef.nativeElement, 'blur', { capture: true }).pipe(map(() => false)))
655
743
  .pipe(
656
744
  // debounceTime is needed in order to filter subsequent focus-blur events, that happen simultaneously
657
745
  debounceTime(10), takeUntil(this._onDestroy$))
@@ -662,13 +750,25 @@ class TokenizerComponent {
662
750
  }
663
751
  /** @hidden Listen window resize and distribute cards on column change */
664
752
  _listenOnResize() {
665
- resizeObservable(this.elementRef().nativeElement)
666
- .pipe(debounceTime(60), takeUntil(this._onDestroy$))
753
+ this.onResize();
754
+ resizeObservable(this._elementRef.nativeElement)
755
+ .pipe(debounceTime(30), takeUntil(this._onDestroy$))
667
756
  .subscribe(() => this.onResize());
668
757
  }
758
+ /** @hidden */
759
+ _checkMoreElementVisibility() {
760
+ const showMoreElement = (this.moreTokensLeft.length > 0 || this.moreTokensRight.length > 0 || this.hiddenCozyTokenCount > 0) &&
761
+ !this.open &&
762
+ !this._tokenizerHasFocus;
763
+ if (showMoreElement === this._showMoreElement) {
764
+ return;
765
+ }
766
+ this._showMoreElement = showMoreElement;
767
+ this._cdRef.detectChanges();
768
+ }
669
769
  }
670
- TokenizerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: TokenizerComponent, deps: [{ token: i1.ContentDensityObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i2.RtlService, optional: true }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
671
- TokenizerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: TokenizerComponent, selector: "fd-tokenizer", inputs: { class: "class", disableKeyboardDeletion: "disableKeyboardDeletion", compactCollapse: "compactCollapse", tokenizerFocusable: "tokenizerFocusable", inputValue: "inputValue", glyph: "glyph", moreTerm: "moreTerm", open: "open" }, outputs: { moreClickedEvent: "moreClickedEvent" }, host: { listeners: { "keydown": "keyDown($event)" } }, providers: [contentDensityObserverProviders()], queries: [{ propertyName: "input", first: true, predicate: i0.forwardRef(function () { return FormControlComponent; }), descendants: true, read: ElementRef }, { propertyName: "tokenList", predicate: i0.forwardRef(function () { return TokenComponent; }) }], viewQueries: [{ propertyName: "tokenizerInnerEl", first: true, predicate: ["tokenizerInner"], descendants: true }, { propertyName: "moreElement", first: true, predicate: ["moreElement"], descendants: true }, { propertyName: "content", first: true, predicate: ["inputGroupAddOn"], descendants: true }, { propertyName: "_viewContainer", predicate: ["viewContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"fd-tokenizer fd-tokenizer--scrollable\"\n [class.is-focus]=\"_tokenizerHasFocus\"\n [class.fd-tokenizer--compact]=\"compact\"\n>\n <div class=\"fd-tokenizer__inner\" #tokenizerInner>\n <div role=\"listbox\">\n <ng-content select=\"fd-token\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"_showOverflowPopover && (compact || compactCollapse); else moreElement\">\n <ng-container *ngTemplateOutlet=\"tokensOverflow\"></ng-container>\n </ng-container>\n\n <ng-content select=\"[fd-form-control]\"></ng-content>\n </div>\n <span fd-input-group-addon *ngIf=\"glyph\" #inputGroupAddOn [button]=\"true\" placement=\"after\">\n <button\n fd-button\n [class]=\"compact ? 'fd-tokenizer-addon--compact' : 'fd-tokenizer-addon'\"\n fdType=\"transparent\"\n [glyph]=\"glyph\"\n type=\"button\"\n ></button>\n </span>\n</div>\n\n<ng-template #tokensOverflow>\n <fd-popover placement=\"bottom-start\" title=\"\" [noArrow]=\"false\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"moreElement\"></ng-container>\n </fd-popover-control>\n\n <fd-popover-body>\n <ul fd-list class=\"fd-tokenizer__overflow-list\">\n <li fd-list-item class=\"fd-tokenizer__overflow-list-item\" *ngFor=\"let token of _hiddenTokens\">\n <ng-container #viewContainer></ng-container>\n\n <span\n *ngIf=\"!token.readOnly\"\n class=\"fd-token__close\"\n role=\"button\"\n [attr.aria-label]=\"token.deleteButtonLabel || ('coreToken.deleteButtonLabel' | fdTranslate)\"\n (click)=\"token.closeClickHandler($event)\"\n ></span>\n </li>\n </ul>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template #moreElement>\n <span\n (click)=\"moreClicked()\"\n *ngIf=\"\n (moreTokensLeft.length > 0 || moreTokensRight.length > 0 || hiddenCozyTokenCount > 0) &&\n !open &&\n !_tokenizerHasFocus\n \"\n class=\"fd-tokenizer-more\"\n role=\"button\"\n tabindex=\"0\"\n >\n <ng-container *ngIf=\"compact || compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate: { count: moreTokensLeft.length + moreTokensRight.length } }}\n </ng-container>\n <ng-container *ngIf=\"!compact && !compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate: { count: hiddenCozyTokenCount } }}\n </ng-container>\n </span>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.27.1\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-tokenizer{-webkit-box-sizing:border-box;-webkit-box-shadow:none;-moz-appearance:none;-webkit-appearance:none;align-items:center;appearance:none;background:var(--sapField_BackgroundStyle, var(--sapField_BackgroundStyle));background-color:var(--sapField_Background, var(--sapField_Background));border:none;border-radius:var(--sapField_BorderCornerRadius);box-shadow:none;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapField_TextColor);cursor:text;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:2.25rem;height:auto;line-height:var(--sapContent_LineHeight);margin:0;min-height:2.25rem;min-width:var(2.75rem, 2.75rem);outline:none;overflow:hidden;padding:0;text-overflow:ellipsis;text-shadow:var(--fdInput_Text_Shadow);white-space:nowrap;width:100%;z-index:1}.fd-tokenizer:after,.fd-tokenizer:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer::placeholder{color:var(--sapField_PlaceholderTextColor);font-style:var(--fdPlaceholder_Font_Style)}.fd-tokenizer[dir=rtl]::placeholder,[dir=rtl] .fd-tokenizer::placeholder{text-indent:.125rem}.fd-tokenizer::selection{background-color:var(--sapSelectedColor);color:var(--sapContent_ContrastTextColor)}.fd-tokenizer::-ms-clear{display:none}.fd-tokenizer.is-hover,.fd-tokenizer:hover{-webkit-box-shadow:var(--fdInput_Box_Shadow_Hover);background:var(--sapField_Hover_BackgroundStyle, var(--sapField_Hover_BackgroundStyle));background-color:var(--sapField_Hover_Background, var(--sapField_Hover_Background));border-color:var(--sapField_Hover_BorderColor);box-shadow:var(--fdInput_Box_Shadow_Hover)}.fd-tokenizer.is-focus,.fd-tokenizer:focus{background:var(--sapField_Focus_Background, var(--sapField_Focus_Background));outline-color:var(--fdInput_Outline_Color);outline-offset:var(--fdInput_Outline_Offset)}.fd-tokenizer.is-hover,.fd-tokenizer:hover{box-shadow:none}.fd-tokenizer__inner{-ms-overflow-style:none;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:end;-ms-flex-pack:end;align-items:center;display:flex;float:right;justify-content:flex-end;overflow:hidden;padding:0 .3125rem;scrollbar-width:none;white-space:nowrap;width:100%}.fd-tokenizer__inner::-webkit-scrollbar{display:none}.fd-tokenizer .fd-token{margin-right:.3125rem;max-width:calc(100% - 3.3125rem)}.fd-tokenizer .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer__indicator{-webkit-box-sizing:border-box;border:0;box-sizing:border-box;color:var(--sapTextColor);cursor:pointer;display:inline-block;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:var(--sapContent_LineHeight);margin:0;padding:0}.fd-tokenizer__indicator:after,.fd-tokenizer__indicator:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer .fd-tokenizer__input{background:transparent}.fd-tokenizer .fd-tokenizer__input.fd-input{border:none;min-width:3rem;padding:0}.fd-tokenizer .fd-tokenizer__input:first-child{padding:0 .3125rem}.fd-tokenizer .fd-tokenizer__input:last-child{flex-basis:100%}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input:focus{border:none;outline:none;z-index:5}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input.is-hover,.fd-tokenizer .fd-tokenizer__input:focus,.fd-tokenizer .fd-tokenizer__input:hover{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer.is-focus,.fd-tokenizer:focus{-webkit-box-shadow:none;border:none;box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:-.0625rem;outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth);z-index:5}.fd-tokenizer--compact{height:1.625rem;min-height:1.625rem}.fd-tokenizer--compact .fd-tokenizer__inner{padding:0 .25rem}.fd-tokenizer--compact .fd-tokenizer__input.fd-input{min-width:2rem}.fd-tokenizer--compact .fd-tokenizer__input:first-child{padding:0 .25rem}.fd-tokenizer--compact .fd-token{margin-right:.25rem;max-width:calc(100% - 2.25rem)}.fd-tokenizer--compact .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer--compact .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer--readonly{background-color:var(--sapField_ReadOnly_Background);overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__inner{overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true],.fd-tokenizer--readonly .fd-tokenizer__input[readonly]{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly.is-focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly:focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]:focus{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none;z-index:5}.fd-tokenizer--scrollable .fd-tokenizer__inner{justify-content:normal;overflow:scroll}.fd-tokenizer .fd-token{max-width:inherit}input.fd-input.fd-tokenizer__input{background-color:transparent;margin-right:1px;border:none;outline:none}.fd-tokenizer-more{padding-right:.5rem}[dir=rtl] .fd-tokenizer-more,.fd-tokenizer-more[dir=rtl]{padding-left:.5rem;padding-right:0}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon{height:2.25rem}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon--compact{height:1.625rem}.fd-tokenizer__overflow-list-item{display:flex;justify-content:space-between}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.InputGroupAddOnDirective, selector: "[fd-input-group-addon]", inputs: ["class", "placement", "type", "state", "button"] }, { kind: "component", type: i5.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i6.PopoverControlComponent, selector: "fd-popover-control" }, { kind: "component", type: i6.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "component", type: i6.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: i7.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator"], outputs: ["focusEscapeList"] }, { kind: "component", type: i7.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "ariaDescribedBy", "noData", "action", "interactive", "growing", "counter", "unread", "selectedListItemScreenReaderText", "navigatedListItemScreenReaderText", "navigatableListItemScreenReaderText"], outputs: ["keyDown"] }, { kind: "pipe", type: i3$1.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
770
+ TokenizerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: TokenizerComponent, deps: [{ token: i1.ContentDensityObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i2.RtlService, optional: true }, { token: i0.Renderer2 }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
771
+ TokenizerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: TokenizerComponent, selector: "fd-tokenizer", inputs: { class: "class", disableKeyboardDeletion: "disableKeyboardDeletion", compactCollapse: "compactCollapse", tokenizerFocusable: "tokenizerFocusable", inputValue: "inputValue", glyph: "glyph", moreTerm: "moreTerm", open: "open" }, outputs: { moreClickedEvent: "moreClickedEvent" }, host: { listeners: { "keydown": "keyDown($event)" } }, providers: [contentDensityObserverProviders()], queries: [{ propertyName: "input", first: true, predicate: i0.forwardRef(function () { return FormControlComponent; }), descendants: true, read: ElementRef }, { propertyName: "tokenList", predicate: i0.forwardRef(function () { return TokenComponent; }) }], viewQueries: [{ propertyName: "tokenizerInnerEl", first: true, predicate: ["tokenizerInner"], descendants: true }, { propertyName: "moreElement", first: true, predicate: ["moreElementSpan"], descendants: true }, { propertyName: "content", first: true, predicate: ["inputGroupAddOn"], descendants: true }, { propertyName: "_viewContainer", predicate: ["viewContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"fd-tokenizer fd-tokenizer--scrollable\"\n [class.is-focus]=\"_tokenizerHasFocus\"\n [class.fd-tokenizer--compact]=\"compact\"\n>\n <div class=\"fd-tokenizer__inner\" #tokenizerInner>\n <div role=\"listbox\" [style.width]=\"_tokensContainerWidth\">\n <ng-content select=\"fd-token\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"_showOverflowPopover && (compact || compactCollapse); else moreElement\">\n <ng-container *ngTemplateOutlet=\"tokensOverflow\"></ng-container>\n </ng-container>\n\n <ng-content select=\"[fd-form-control]\"></ng-content>\n </div>\n <span fd-input-group-addon *ngIf=\"glyph\" #inputGroupAddOn [button]=\"true\" placement=\"after\">\n <button\n fd-button\n [class]=\"compact ? 'fd-tokenizer-addon--compact' : 'fd-tokenizer-addon'\"\n fdType=\"transparent\"\n [glyph]=\"glyph\"\n type=\"button\"\n ></button>\n </span>\n</div>\n\n<ng-template #tokensOverflow>\n <fd-popover placement=\"bottom-start\" title=\"\" [noArrow]=\"false\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"moreElement\"></ng-container>\n </fd-popover-control>\n\n <fd-popover-body>\n <ul fd-list class=\"fd-tokenizer__overflow-list\">\n <li fd-list-item class=\"fd-tokenizer__overflow-list-item\" *ngFor=\"let token of _hiddenTokens\">\n <ng-container #viewContainer></ng-container>\n\n <span\n *ngIf=\"!token.readOnly\"\n class=\"fd-token__close\"\n role=\"button\"\n [attr.aria-label]=\"token.deleteButtonLabel || ('coreToken.deleteButtonLabel' | fdTranslate)\"\n (click)=\"token.closeClickHandler($event)\"\n ></span>\n </li>\n </ul>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template #moreElement>\n <span\n (click)=\"moreClicked()\"\n *ngIf=\"_showMoreElement\"\n #moreElementSpan\n class=\"fd-tokenizer-more\"\n role=\"button\"\n tabindex=\"0\"\n >\n <ng-container *ngIf=\"compact || compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate : { count: moreTokensLeft.length + moreTokensRight.length } }}\n </ng-container>\n <ng-container *ngIf=\"!compact && !compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate : { count: hiddenCozyTokenCount } }}\n </ng-container>\n </span>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.27.1\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-tokenizer{-webkit-box-sizing:border-box;-webkit-box-shadow:none;-moz-appearance:none;-webkit-appearance:none;align-items:center;appearance:none;background:var(--sapField_BackgroundStyle, var(--sapField_BackgroundStyle));background-color:var(--sapField_Background, var(--sapField_Background));border:none;border-radius:var(--sapField_BorderCornerRadius);box-shadow:none;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapField_TextColor);cursor:text;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:2.25rem;height:auto;line-height:var(--sapContent_LineHeight);margin:0;min-height:2.25rem;min-width:var(2.75rem, 2.75rem);outline:none;overflow:hidden;padding:0;text-overflow:ellipsis;text-shadow:var(--fdInput_Text_Shadow);white-space:nowrap;width:100%;z-index:1}.fd-tokenizer:after,.fd-tokenizer:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer::placeholder{color:var(--sapField_PlaceholderTextColor);font-style:var(--fdPlaceholder_Font_Style)}.fd-tokenizer[dir=rtl]::placeholder,[dir=rtl] .fd-tokenizer::placeholder{text-indent:.125rem}.fd-tokenizer::selection{background-color:var(--sapSelectedColor);color:var(--sapContent_ContrastTextColor)}.fd-tokenizer::-ms-clear{display:none}.fd-tokenizer.is-hover,.fd-tokenizer:hover{-webkit-box-shadow:var(--fdInput_Box_Shadow_Hover);background:var(--sapField_Hover_BackgroundStyle, var(--sapField_Hover_BackgroundStyle));background-color:var(--sapField_Hover_Background, var(--sapField_Hover_Background));border-color:var(--sapField_Hover_BorderColor);box-shadow:var(--fdInput_Box_Shadow_Hover)}.fd-tokenizer.is-focus,.fd-tokenizer:focus{background:var(--sapField_Focus_Background, var(--sapField_Focus_Background));outline-color:var(--fdInput_Outline_Color);outline-offset:var(--fdInput_Outline_Offset)}.fd-tokenizer.is-hover,.fd-tokenizer:hover{box-shadow:none}.fd-tokenizer__inner{-ms-overflow-style:none;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:end;-ms-flex-pack:end;align-items:center;display:flex;float:right;justify-content:flex-end;overflow:hidden;padding:0 .3125rem;scrollbar-width:none;white-space:nowrap;width:100%}.fd-tokenizer__inner::-webkit-scrollbar{display:none}.fd-tokenizer .fd-token{margin-right:.3125rem;max-width:calc(100% - 3.3125rem)}.fd-tokenizer .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer__indicator{-webkit-box-sizing:border-box;border:0;box-sizing:border-box;color:var(--sapTextColor);cursor:pointer;display:inline-block;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:var(--sapContent_LineHeight);margin:0;padding:0}.fd-tokenizer__indicator:after,.fd-tokenizer__indicator:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer .fd-tokenizer__input{background:transparent}.fd-tokenizer .fd-tokenizer__input.fd-input{border:none;min-width:3rem;padding:0}.fd-tokenizer .fd-tokenizer__input:first-child{padding:0 .3125rem}.fd-tokenizer .fd-tokenizer__input:last-child{flex-basis:100%}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input:focus{border:none;outline:none;z-index:5}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input.is-hover,.fd-tokenizer .fd-tokenizer__input:focus,.fd-tokenizer .fd-tokenizer__input:hover{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer.is-focus,.fd-tokenizer:focus{-webkit-box-shadow:none;border:none;box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:-.0625rem;outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth);z-index:5}.fd-tokenizer--compact{height:1.625rem;min-height:1.625rem}.fd-tokenizer--compact .fd-tokenizer__inner{padding:0 .25rem}.fd-tokenizer--compact .fd-tokenizer__input.fd-input{min-width:2rem}.fd-tokenizer--compact .fd-tokenizer__input:first-child{padding:0 .25rem}.fd-tokenizer--compact .fd-token{margin-right:.25rem;max-width:calc(100% - 2.25rem)}.fd-tokenizer--compact .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer--compact .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer--readonly{background-color:var(--sapField_ReadOnly_Background);overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__inner{overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true],.fd-tokenizer--readonly .fd-tokenizer__input[readonly]{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly.is-focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly:focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]:focus{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none;z-index:5}.fd-tokenizer--scrollable .fd-tokenizer__inner{justify-content:normal;overflow:scroll}.fd-tokenizer .fd-token{max-width:inherit}input.fd-input.fd-tokenizer__input{background-color:transparent;margin-right:1px;border:none;outline:none}.fd-tokenizer-more{padding-right:.5rem}[dir=rtl] .fd-tokenizer-more,.fd-tokenizer-more[dir=rtl]{padding-left:.5rem;padding-right:0}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon{height:2.25rem}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon--compact{height:1.625rem}.fd-tokenizer__overflow-list-item{display:flex;justify-content:space-between}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.InputGroupAddOnDirective, selector: "[fd-input-group-addon]", inputs: ["class", "placement", "type", "state", "button"] }, { kind: "component", type: i5.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i6.PopoverControlComponent, selector: "fd-popover-control" }, { kind: "component", type: i6.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "component", type: i6.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: i7.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator"], outputs: ["focusEscapeList"] }, { kind: "component", type: i7.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "ariaDescribedBy", "noData", "action", "interactive", "growing", "counter", "unread", "selectedListItemScreenReaderText", "navigatedListItemScreenReaderText", "navigatableListItemScreenReaderText"], outputs: ["keyDown"] }, { kind: "pipe", type: i3$1.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
672
772
  __decorate([
673
773
  applyCssClass,
674
774
  __metadata("design:type", Function),
@@ -677,11 +777,14 @@ __decorate([
677
777
  ], TokenizerComponent.prototype, "buildComponentCssClass", null);
678
778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: TokenizerComponent, decorators: [{
679
779
  type: Component,
680
- args: [{ selector: 'fd-tokenizer', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [contentDensityObserverProviders()], template: "<div\n class=\"fd-tokenizer fd-tokenizer--scrollable\"\n [class.is-focus]=\"_tokenizerHasFocus\"\n [class.fd-tokenizer--compact]=\"compact\"\n>\n <div class=\"fd-tokenizer__inner\" #tokenizerInner>\n <div role=\"listbox\">\n <ng-content select=\"fd-token\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"_showOverflowPopover && (compact || compactCollapse); else moreElement\">\n <ng-container *ngTemplateOutlet=\"tokensOverflow\"></ng-container>\n </ng-container>\n\n <ng-content select=\"[fd-form-control]\"></ng-content>\n </div>\n <span fd-input-group-addon *ngIf=\"glyph\" #inputGroupAddOn [button]=\"true\" placement=\"after\">\n <button\n fd-button\n [class]=\"compact ? 'fd-tokenizer-addon--compact' : 'fd-tokenizer-addon'\"\n fdType=\"transparent\"\n [glyph]=\"glyph\"\n type=\"button\"\n ></button>\n </span>\n</div>\n\n<ng-template #tokensOverflow>\n <fd-popover placement=\"bottom-start\" title=\"\" [noArrow]=\"false\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"moreElement\"></ng-container>\n </fd-popover-control>\n\n <fd-popover-body>\n <ul fd-list class=\"fd-tokenizer__overflow-list\">\n <li fd-list-item class=\"fd-tokenizer__overflow-list-item\" *ngFor=\"let token of _hiddenTokens\">\n <ng-container #viewContainer></ng-container>\n\n <span\n *ngIf=\"!token.readOnly\"\n class=\"fd-token__close\"\n role=\"button\"\n [attr.aria-label]=\"token.deleteButtonLabel || ('coreToken.deleteButtonLabel' | fdTranslate)\"\n (click)=\"token.closeClickHandler($event)\"\n ></span>\n </li>\n </ul>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template #moreElement>\n <span\n (click)=\"moreClicked()\"\n *ngIf=\"\n (moreTokensLeft.length > 0 || moreTokensRight.length > 0 || hiddenCozyTokenCount > 0) &&\n !open &&\n !_tokenizerHasFocus\n \"\n class=\"fd-tokenizer-more\"\n role=\"button\"\n tabindex=\"0\"\n >\n <ng-container *ngIf=\"compact || compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate: { count: moreTokensLeft.length + moreTokensRight.length } }}\n </ng-container>\n <ng-container *ngIf=\"!compact && !compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate: { count: hiddenCozyTokenCount } }}\n </ng-container>\n </span>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.27.1\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-tokenizer{-webkit-box-sizing:border-box;-webkit-box-shadow:none;-moz-appearance:none;-webkit-appearance:none;align-items:center;appearance:none;background:var(--sapField_BackgroundStyle, var(--sapField_BackgroundStyle));background-color:var(--sapField_Background, var(--sapField_Background));border:none;border-radius:var(--sapField_BorderCornerRadius);box-shadow:none;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapField_TextColor);cursor:text;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:2.25rem;height:auto;line-height:var(--sapContent_LineHeight);margin:0;min-height:2.25rem;min-width:var(2.75rem, 2.75rem);outline:none;overflow:hidden;padding:0;text-overflow:ellipsis;text-shadow:var(--fdInput_Text_Shadow);white-space:nowrap;width:100%;z-index:1}.fd-tokenizer:after,.fd-tokenizer:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer::placeholder{color:var(--sapField_PlaceholderTextColor);font-style:var(--fdPlaceholder_Font_Style)}.fd-tokenizer[dir=rtl]::placeholder,[dir=rtl] .fd-tokenizer::placeholder{text-indent:.125rem}.fd-tokenizer::selection{background-color:var(--sapSelectedColor);color:var(--sapContent_ContrastTextColor)}.fd-tokenizer::-ms-clear{display:none}.fd-tokenizer.is-hover,.fd-tokenizer:hover{-webkit-box-shadow:var(--fdInput_Box_Shadow_Hover);background:var(--sapField_Hover_BackgroundStyle, var(--sapField_Hover_BackgroundStyle));background-color:var(--sapField_Hover_Background, var(--sapField_Hover_Background));border-color:var(--sapField_Hover_BorderColor);box-shadow:var(--fdInput_Box_Shadow_Hover)}.fd-tokenizer.is-focus,.fd-tokenizer:focus{background:var(--sapField_Focus_Background, var(--sapField_Focus_Background));outline-color:var(--fdInput_Outline_Color);outline-offset:var(--fdInput_Outline_Offset)}.fd-tokenizer.is-hover,.fd-tokenizer:hover{box-shadow:none}.fd-tokenizer__inner{-ms-overflow-style:none;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:end;-ms-flex-pack:end;align-items:center;display:flex;float:right;justify-content:flex-end;overflow:hidden;padding:0 .3125rem;scrollbar-width:none;white-space:nowrap;width:100%}.fd-tokenizer__inner::-webkit-scrollbar{display:none}.fd-tokenizer .fd-token{margin-right:.3125rem;max-width:calc(100% - 3.3125rem)}.fd-tokenizer .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer__indicator{-webkit-box-sizing:border-box;border:0;box-sizing:border-box;color:var(--sapTextColor);cursor:pointer;display:inline-block;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:var(--sapContent_LineHeight);margin:0;padding:0}.fd-tokenizer__indicator:after,.fd-tokenizer__indicator:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer .fd-tokenizer__input{background:transparent}.fd-tokenizer .fd-tokenizer__input.fd-input{border:none;min-width:3rem;padding:0}.fd-tokenizer .fd-tokenizer__input:first-child{padding:0 .3125rem}.fd-tokenizer .fd-tokenizer__input:last-child{flex-basis:100%}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input:focus{border:none;outline:none;z-index:5}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input.is-hover,.fd-tokenizer .fd-tokenizer__input:focus,.fd-tokenizer .fd-tokenizer__input:hover{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer.is-focus,.fd-tokenizer:focus{-webkit-box-shadow:none;border:none;box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:-.0625rem;outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth);z-index:5}.fd-tokenizer--compact{height:1.625rem;min-height:1.625rem}.fd-tokenizer--compact .fd-tokenizer__inner{padding:0 .25rem}.fd-tokenizer--compact .fd-tokenizer__input.fd-input{min-width:2rem}.fd-tokenizer--compact .fd-tokenizer__input:first-child{padding:0 .25rem}.fd-tokenizer--compact .fd-token{margin-right:.25rem;max-width:calc(100% - 2.25rem)}.fd-tokenizer--compact .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer--compact .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer--readonly{background-color:var(--sapField_ReadOnly_Background);overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__inner{overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true],.fd-tokenizer--readonly .fd-tokenizer__input[readonly]{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly.is-focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly:focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]:focus{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none;z-index:5}.fd-tokenizer--scrollable .fd-tokenizer__inner{justify-content:normal;overflow:scroll}.fd-tokenizer .fd-token{max-width:inherit}input.fd-input.fd-tokenizer__input{background-color:transparent;margin-right:1px;border:none;outline:none}.fd-tokenizer-more{padding-right:.5rem}[dir=rtl] .fd-tokenizer-more,.fd-tokenizer-more[dir=rtl]{padding-left:.5rem;padding-right:0}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon{height:2.25rem}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon--compact{height:1.625rem}.fd-tokenizer__overflow-list-item{display:flex;justify-content:space-between}\n"] }]
780
+ args: [{ selector: 'fd-tokenizer', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [contentDensityObserverProviders()], template: "<div\n class=\"fd-tokenizer fd-tokenizer--scrollable\"\n [class.is-focus]=\"_tokenizerHasFocus\"\n [class.fd-tokenizer--compact]=\"compact\"\n>\n <div class=\"fd-tokenizer__inner\" #tokenizerInner>\n <div role=\"listbox\" [style.width]=\"_tokensContainerWidth\">\n <ng-content select=\"fd-token\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"_showOverflowPopover && (compact || compactCollapse); else moreElement\">\n <ng-container *ngTemplateOutlet=\"tokensOverflow\"></ng-container>\n </ng-container>\n\n <ng-content select=\"[fd-form-control]\"></ng-content>\n </div>\n <span fd-input-group-addon *ngIf=\"glyph\" #inputGroupAddOn [button]=\"true\" placement=\"after\">\n <button\n fd-button\n [class]=\"compact ? 'fd-tokenizer-addon--compact' : 'fd-tokenizer-addon'\"\n fdType=\"transparent\"\n [glyph]=\"glyph\"\n type=\"button\"\n ></button>\n </span>\n</div>\n\n<ng-template #tokensOverflow>\n <fd-popover placement=\"bottom-start\" title=\"\" [noArrow]=\"false\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"moreElement\"></ng-container>\n </fd-popover-control>\n\n <fd-popover-body>\n <ul fd-list class=\"fd-tokenizer__overflow-list\">\n <li fd-list-item class=\"fd-tokenizer__overflow-list-item\" *ngFor=\"let token of _hiddenTokens\">\n <ng-container #viewContainer></ng-container>\n\n <span\n *ngIf=\"!token.readOnly\"\n class=\"fd-token__close\"\n role=\"button\"\n [attr.aria-label]=\"token.deleteButtonLabel || ('coreToken.deleteButtonLabel' | fdTranslate)\"\n (click)=\"token.closeClickHandler($event)\"\n ></span>\n </li>\n </ul>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template #moreElement>\n <span\n (click)=\"moreClicked()\"\n *ngIf=\"_showMoreElement\"\n #moreElementSpan\n class=\"fd-tokenizer-more\"\n role=\"button\"\n tabindex=\"0\"\n >\n <ng-container *ngIf=\"compact || compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate : { count: moreTokensLeft.length + moreTokensRight.length } }}\n </ng-container>\n <ng-container *ngIf=\"!compact && !compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate : { count: hiddenCozyTokenCount } }}\n </ng-container>\n </span>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.27.1\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-tokenizer{-webkit-box-sizing:border-box;-webkit-box-shadow:none;-moz-appearance:none;-webkit-appearance:none;align-items:center;appearance:none;background:var(--sapField_BackgroundStyle, var(--sapField_BackgroundStyle));background-color:var(--sapField_Background, var(--sapField_Background));border:none;border-radius:var(--sapField_BorderCornerRadius);box-shadow:none;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapField_TextColor);cursor:text;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:2.25rem;height:auto;line-height:var(--sapContent_LineHeight);margin:0;min-height:2.25rem;min-width:var(2.75rem, 2.75rem);outline:none;overflow:hidden;padding:0;text-overflow:ellipsis;text-shadow:var(--fdInput_Text_Shadow);white-space:nowrap;width:100%;z-index:1}.fd-tokenizer:after,.fd-tokenizer:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer::placeholder{color:var(--sapField_PlaceholderTextColor);font-style:var(--fdPlaceholder_Font_Style)}.fd-tokenizer[dir=rtl]::placeholder,[dir=rtl] .fd-tokenizer::placeholder{text-indent:.125rem}.fd-tokenizer::selection{background-color:var(--sapSelectedColor);color:var(--sapContent_ContrastTextColor)}.fd-tokenizer::-ms-clear{display:none}.fd-tokenizer.is-hover,.fd-tokenizer:hover{-webkit-box-shadow:var(--fdInput_Box_Shadow_Hover);background:var(--sapField_Hover_BackgroundStyle, var(--sapField_Hover_BackgroundStyle));background-color:var(--sapField_Hover_Background, var(--sapField_Hover_Background));border-color:var(--sapField_Hover_BorderColor);box-shadow:var(--fdInput_Box_Shadow_Hover)}.fd-tokenizer.is-focus,.fd-tokenizer:focus{background:var(--sapField_Focus_Background, var(--sapField_Focus_Background));outline-color:var(--fdInput_Outline_Color);outline-offset:var(--fdInput_Outline_Offset)}.fd-tokenizer.is-hover,.fd-tokenizer:hover{box-shadow:none}.fd-tokenizer__inner{-ms-overflow-style:none;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:end;-ms-flex-pack:end;align-items:center;display:flex;float:right;justify-content:flex-end;overflow:hidden;padding:0 .3125rem;scrollbar-width:none;white-space:nowrap;width:100%}.fd-tokenizer__inner::-webkit-scrollbar{display:none}.fd-tokenizer .fd-token{margin-right:.3125rem;max-width:calc(100% - 3.3125rem)}.fd-tokenizer .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer__indicator{-webkit-box-sizing:border-box;border:0;box-sizing:border-box;color:var(--sapTextColor);cursor:pointer;display:inline-block;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:var(--sapContent_LineHeight);margin:0;padding:0}.fd-tokenizer__indicator:after,.fd-tokenizer__indicator:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer .fd-tokenizer__input{background:transparent}.fd-tokenizer .fd-tokenizer__input.fd-input{border:none;min-width:3rem;padding:0}.fd-tokenizer .fd-tokenizer__input:first-child{padding:0 .3125rem}.fd-tokenizer .fd-tokenizer__input:last-child{flex-basis:100%}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input:focus{border:none;outline:none;z-index:5}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input.is-hover,.fd-tokenizer .fd-tokenizer__input:focus,.fd-tokenizer .fd-tokenizer__input:hover{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer.is-focus,.fd-tokenizer:focus{-webkit-box-shadow:none;border:none;box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:-.0625rem;outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth);z-index:5}.fd-tokenizer--compact{height:1.625rem;min-height:1.625rem}.fd-tokenizer--compact .fd-tokenizer__inner{padding:0 .25rem}.fd-tokenizer--compact .fd-tokenizer__input.fd-input{min-width:2rem}.fd-tokenizer--compact .fd-tokenizer__input:first-child{padding:0 .25rem}.fd-tokenizer--compact .fd-token{margin-right:.25rem;max-width:calc(100% - 2.25rem)}.fd-tokenizer--compact .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer--compact .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer--readonly{background-color:var(--sapField_ReadOnly_Background);overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__inner{overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true],.fd-tokenizer--readonly .fd-tokenizer__input[readonly]{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly.is-focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly:focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]:focus{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none;z-index:5}.fd-tokenizer--scrollable .fd-tokenizer__inner{justify-content:normal;overflow:scroll}.fd-tokenizer .fd-token{max-width:inherit}input.fd-input.fd-tokenizer__input{background-color:transparent;margin-right:1px;border:none;outline:none}.fd-tokenizer-more{padding-right:.5rem}[dir=rtl] .fd-tokenizer-more,.fd-tokenizer-more[dir=rtl]{padding-left:.5rem;padding-right:0}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon{height:2.25rem}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon--compact{height:1.625rem}.fd-tokenizer__overflow-list-item{display:flex;justify-content:space-between}\n"] }]
681
781
  }], ctorParameters: function () {
682
782
  return [{ type: i1.ContentDensityObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i2.RtlService, decorators: [{
683
783
  type: Optional
684
- }] }, { type: i0.Renderer2 }];
784
+ }] }, { type: i0.Renderer2 }, { type: Document, decorators: [{
785
+ type: Inject,
786
+ args: [DOCUMENT]
787
+ }] }];
685
788
  }, propDecorators: { class: [{
686
789
  type: Input
687
790
  }], disableKeyboardDeletion: [{
@@ -697,7 +800,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImpor
697
800
  args: ['tokenizerInner']
698
801
  }], moreElement: [{
699
802
  type: ViewChild,
700
- args: ['moreElement']
803
+ args: ['moreElementSpan']
701
804
  }], content: [{
702
805
  type: ViewChild,
703
806
  args: ['inputGroupAddOn']