@fundamental-ngx/core 0.35.2-rc.12 → 0.35.2-rc.13

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 (165) hide show
  1. package/action-bar/package.json +1 -1
  2. package/action-sheet/package.json +1 -1
  3. package/alert/package.json +1 -1
  4. package/avatar/avatar.component.d.ts +5 -4
  5. package/avatar/esm2020/avatar.component.mjs +21 -11
  6. package/avatar/fesm2015/fundamental-ngx-core-avatar.mjs +22 -10
  7. package/avatar/fesm2015/fundamental-ngx-core-avatar.mjs.map +1 -1
  8. package/avatar/fesm2020/fundamental-ngx-core-avatar.mjs +20 -10
  9. package/avatar/fesm2020/fundamental-ngx-core-avatar.mjs.map +1 -1
  10. package/avatar/package.json +1 -1
  11. package/avatar-group/package.json +1 -1
  12. package/bar/package.json +1 -1
  13. package/breadcrumb/package.json +1 -1
  14. package/busy-indicator/package.json +1 -1
  15. package/button/package.json +1 -1
  16. package/calendar/package.json +1 -1
  17. package/card/package.json +1 -1
  18. package/carousel/package.json +1 -1
  19. package/checkbox/package.json +1 -1
  20. package/combobox/package.json +1 -1
  21. package/content-density/package.json +3 -3
  22. package/date-picker/package.json +1 -1
  23. package/datetime/package.json +1 -1
  24. package/datetime-picker/package.json +1 -1
  25. package/dialog/package.json +1 -1
  26. package/dynamic-page/package.json +1 -1
  27. package/dynamic-side-content/package.json +1 -1
  28. package/esm2020/avatar/avatar.component.mjs +21 -11
  29. package/esm2020/grid-list/components/grid-list-item/grid-list-item.component.mjs +12 -8
  30. package/esm2020/input-group/input-group.component.mjs +7 -6
  31. package/esm2020/list/list-item/list-item.component.mjs +12 -7
  32. package/esm2020/multi-input/multi-input.component.mjs +3 -3
  33. package/esm2020/tests/when-stable.mjs +11 -3
  34. package/esm2020/token/token.component.mjs +15 -3
  35. package/esm2020/token/tokenizer.component.mjs +16 -39
  36. package/facets/package.json +1 -1
  37. package/feed-input/package.json +1 -1
  38. package/feed-list-item/package.json +1 -1
  39. package/fesm2015/fundamental-ngx-core-avatar.mjs +22 -10
  40. package/fesm2015/fundamental-ngx-core-avatar.mjs.map +1 -1
  41. package/fesm2015/fundamental-ngx-core-grid-list.mjs +11 -7
  42. package/fesm2015/fundamental-ngx-core-grid-list.mjs.map +1 -1
  43. package/fesm2015/fundamental-ngx-core-input-group.mjs +6 -5
  44. package/fesm2015/fundamental-ngx-core-input-group.mjs.map +1 -1
  45. package/fesm2015/fundamental-ngx-core-list.mjs +12 -7
  46. package/fesm2015/fundamental-ngx-core-list.mjs.map +1 -1
  47. package/fesm2015/fundamental-ngx-core-multi-input.mjs +2 -2
  48. package/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
  49. package/fesm2015/fundamental-ngx-core-tests.mjs +10 -2
  50. package/fesm2015/fundamental-ngx-core-tests.mjs.map +1 -1
  51. package/fesm2015/fundamental-ngx-core-token.mjs +29 -40
  52. package/fesm2015/fundamental-ngx-core-token.mjs.map +1 -1
  53. package/fesm2020/fundamental-ngx-core-avatar.mjs +20 -10
  54. package/fesm2020/fundamental-ngx-core-avatar.mjs.map +1 -1
  55. package/fesm2020/fundamental-ngx-core-grid-list.mjs +11 -7
  56. package/fesm2020/fundamental-ngx-core-grid-list.mjs.map +1 -1
  57. package/fesm2020/fundamental-ngx-core-input-group.mjs +6 -5
  58. package/fesm2020/fundamental-ngx-core-input-group.mjs.map +1 -1
  59. package/fesm2020/fundamental-ngx-core-list.mjs +11 -6
  60. package/fesm2020/fundamental-ngx-core-list.mjs.map +1 -1
  61. package/fesm2020/fundamental-ngx-core-multi-input.mjs +2 -2
  62. package/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
  63. package/fesm2020/fundamental-ngx-core-tests.mjs +10 -2
  64. package/fesm2020/fundamental-ngx-core-tests.mjs.map +1 -1
  65. package/fesm2020/fundamental-ngx-core-token.mjs +29 -40
  66. package/fesm2020/fundamental-ngx-core-token.mjs.map +1 -1
  67. package/file-uploader/package.json +1 -1
  68. package/fixed-card-layout/package.json +1 -1
  69. package/flexible-column-layout/package.json +1 -1
  70. package/form/package.json +1 -1
  71. package/formatted-text/package.json +1 -1
  72. package/grid-list/components/grid-list-item/grid-list-item.component.d.ts +5 -3
  73. package/grid-list/esm2020/components/grid-list-item/grid-list-item.component.mjs +12 -8
  74. package/grid-list/fesm2015/fundamental-ngx-core-grid-list.mjs +11 -7
  75. package/grid-list/fesm2015/fundamental-ngx-core-grid-list.mjs.map +1 -1
  76. package/grid-list/fesm2020/fundamental-ngx-core-grid-list.mjs +11 -7
  77. package/grid-list/fesm2020/fundamental-ngx-core-grid-list.mjs.map +1 -1
  78. package/grid-list/package.json +1 -1
  79. package/icon/package.json +1 -1
  80. package/illustrated-message/package.json +1 -1
  81. package/infinite-scroll/package.json +1 -1
  82. package/info-label/package.json +1 -1
  83. package/inline-help/package.json +1 -1
  84. package/input-group/esm2020/input-group.component.mjs +7 -6
  85. package/input-group/fesm2015/fundamental-ngx-core-input-group.mjs +6 -5
  86. package/input-group/fesm2015/fundamental-ngx-core-input-group.mjs.map +1 -1
  87. package/input-group/fesm2020/fundamental-ngx-core-input-group.mjs +6 -5
  88. package/input-group/fesm2020/fundamental-ngx-core-input-group.mjs.map +1 -1
  89. package/input-group/package.json +1 -1
  90. package/layout-grid/package.json +1 -1
  91. package/layout-panel/package.json +1 -1
  92. package/link/package.json +1 -1
  93. package/list/esm2020/list-item/list-item.component.mjs +12 -7
  94. package/list/fesm2015/fundamental-ngx-core-list.mjs +12 -7
  95. package/list/fesm2015/fundamental-ngx-core-list.mjs.map +1 -1
  96. package/list/fesm2020/fundamental-ngx-core-list.mjs +11 -6
  97. package/list/fesm2020/fundamental-ngx-core-list.mjs.map +1 -1
  98. package/list/list-item/list-item.component.d.ts +2 -0
  99. package/list/package.json +1 -1
  100. package/menu/package.json +1 -1
  101. package/message-box/package.json +1 -1
  102. package/message-strip/package.json +1 -1
  103. package/message-toast/package.json +1 -1
  104. package/micro-process-flow/package.json +1 -1
  105. package/mobile-mode/package.json +1 -1
  106. package/multi-input/esm2020/multi-input.component.mjs +3 -3
  107. package/multi-input/fesm2015/fundamental-ngx-core-multi-input.mjs +2 -2
  108. package/multi-input/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
  109. package/multi-input/fesm2020/fundamental-ngx-core-multi-input.mjs +2 -2
  110. package/multi-input/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
  111. package/multi-input/package.json +1 -1
  112. package/nested-list/package.json +1 -1
  113. package/notification/package.json +1 -1
  114. package/object-identifier/package.json +1 -1
  115. package/object-marker/package.json +1 -1
  116. package/object-number/package.json +1 -1
  117. package/object-status/package.json +1 -1
  118. package/overflow-layout/package.json +13 -13
  119. package/package.json +1 -1
  120. package/pagination/package.json +1 -1
  121. package/panel/package.json +1 -1
  122. package/popover/package.json +1 -1
  123. package/product-switch/package.json +1 -1
  124. package/progress-indicator/package.json +1 -1
  125. package/quick-view/package.json +1 -1
  126. package/radio/package.json +1 -1
  127. package/rating-indicator/package.json +1 -1
  128. package/resizable-card-layout/package.json +1 -1
  129. package/scroll-spy/package.json +1 -1
  130. package/scrollbar/package.json +1 -1
  131. package/segmented-button/package.json +1 -1
  132. package/select/package.json +1 -1
  133. package/shared/package.json +1 -1
  134. package/shellbar/package.json +1 -1
  135. package/side-navigation/package.json +1 -1
  136. package/slider/package.json +1 -1
  137. package/split-button/package.json +1 -1
  138. package/splitter/package.json +1 -1
  139. package/status-indicator/package.json +1 -1
  140. package/step-input/package.json +1 -1
  141. package/switch/package.json +1 -1
  142. package/table/package.json +1 -1
  143. package/tabs/package.json +1 -1
  144. package/text/package.json +1 -1
  145. package/theming/package.json +1 -1
  146. package/tile/package.json +1 -1
  147. package/time/package.json +1 -1
  148. package/time-picker/package.json +1 -1
  149. package/timeline/package.json +1 -1
  150. package/title/package.json +1 -1
  151. package/token/esm2020/token.component.mjs +15 -3
  152. package/token/esm2020/tokenizer.component.mjs +16 -39
  153. package/token/fesm2015/fundamental-ngx-core-token.mjs +29 -40
  154. package/token/fesm2015/fundamental-ngx-core-token.mjs.map +1 -1
  155. package/token/fesm2020/fundamental-ngx-core-token.mjs +29 -40
  156. package/token/fesm2020/fundamental-ngx-core-token.mjs.map +1 -1
  157. package/token/package.json +1 -1
  158. package/token/token.component.d.ts +8 -2
  159. package/token/tokenizer.component.d.ts +5 -9
  160. package/toolbar/package.json +1 -1
  161. package/tree/package.json +1 -1
  162. package/upload-collection/package.json +1 -1
  163. package/utils/package.json +1 -1
  164. package/vertical-navigation/package.json +1 -1
  165. package/wizard/package.json +1 -1
@@ -2,12 +2,12 @@ import * as i0 from '@angular/core';
2
2
  import { EventEmitter, ViewContainerRef, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, ViewChild, Output, Optional, ContentChildren, forwardRef, ContentChild, ViewChildren, HostListener, Directive, NgModule } from '@angular/core';
3
3
  import * as i6 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
- import { Subscription, Subject, fromEvent } from 'rxjs';
5
+ import { Subscription, Subject, merge, fromEvent } from 'rxjs';
6
6
  import * as i1 from '@fundamental-ngx/core/content-density';
7
7
  import { contentDensityObserverProviders, DeprecatedCompactDirective, CONTENT_DENSITY_DIRECTIVE, ContentDensityModule } from '@fundamental-ngx/core/content-density';
8
8
  import { __decorate, __metadata } from 'tslib';
9
9
  import { DELETE, BACKSPACE, SPACE, ENTER, LEFT_ARROW, RIGHT_ARROW, A } from '@angular/cdk/keycodes';
10
- import { filter, tap, takeUntil } from 'rxjs/operators';
10
+ import { filter, mapTo, debounceTime, takeUntil } from 'rxjs/operators';
11
11
  import { FormControlComponent } from '@fundamental-ngx/core/form';
12
12
  import * as i2 from '@fundamental-ngx/core/utils';
13
13
  import { KeyUtil, applyCssClass } from '@fundamental-ngx/core/utils';
@@ -46,6 +46,9 @@ class TokenComponent {
46
46
  /** Emitted when a token is clicked. */
47
47
  // eslint-disable-next-line @angular-eslint/no-output-on-prefix
48
48
  this.onTokenClick = new EventEmitter();
49
+ /** Emitted when a there's a keydown registered on the token. */
50
+ // eslint-disable-next-line @angular-eslint/no-output-on-prefix
51
+ this.onTokenKeydown = new EventEmitter();
49
52
  }
50
53
  /** Whether the token is selected. */
51
54
  get selected() {
@@ -78,12 +81,17 @@ class TokenComponent {
78
81
  tokenClickHandler(event) {
79
82
  this.onTokenClick.emit(event);
80
83
  }
84
+ /** @hidden */
85
+ _setTotalCount(count) {
86
+ this.totalCount = count;
87
+ this._cdRef.markForCheck();
88
+ }
81
89
  }
82
90
  TokenComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: TokenComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.ContentDensityObserver }], target: i0.ɵɵFactoryTarget.Component });
83
- TokenComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.4", type: TokenComponent, selector: "fd-token", inputs: { disabled: "disabled", selected: "selected", readOnly: "readOnly", deleteButtonLabel: "deleteButtonLabel", ariaRoleDescription: "ariaRoleDescription" }, outputs: { onCloseClick: "onCloseClick", onRemove: "onRemove", onTokenClick: "onTokenClick" }, 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 [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\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\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n tabindex=\"-1\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.24.1-rc.1\n * Copyright (c) 2022 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{cursor:default;line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;font-size:var(--sapFontSize);color:var(--fdToken_Text_Color);border-radius:var(--fdToken_Border_Radius);background-color:var(--sapButton_TokenBackground);border:var(--sapButton_BorderWidth) solid var(--sapButton_TokenBorderColor);display:inline-flex;flex-shrink:0;align-items:center;text-align:center;padding:.25rem 0 .25rem var(--fdToken_Padding_Left);white-space:nowrap;max-width:100%;min-width:3.625rem;text-overflow:clip;height:1.625rem;line-height:1.5rem}.fd-token:before,.fd-token:after{box-sizing:inherit;font-size:inherit}[dir=rtl] .fd-token,.fd-token[dir=rtl]{padding-left:0;padding-right:var(--fdToken_Padding_Left)}.fd-token__text{overflow:hidden;max-width:100%;min-width:auto;width:100%;text-overflow:ellipsis;text-shadow:var(--fdToken_Text_Shadow)}.fd-token__close{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;font-size:var(--sapFontSmallSize);color:var(--sapContent_IconColor);padding:.25rem .5rem;width:1.75rem;min-width:1.75rem;height:1.625rem;background-color:transparent;line-height:1.25rem;cursor:pointer;display:flex;align-items:center;justify-content:center}.fd-token__close:before,.fd-token__close:after{box-sizing:inherit;font-size:inherit}.fd-token__close:before{font-family:SAP-icons;text-align:center;text-decoration:inherit;text-transform:none;text-rendering:optimizeLegibility}.fd-token__close:before{content:\"\\e03e\"}.fd-token__close:focus,.fd-token__close.is-focus{z-index:5;outline:none;box-shadow:none}.fd-token:hover{background-color:var(--fdToken_Background_Color_Hover);border-color:var(--fdToken_Border_Color_Hover);box-shadow:var(--fdToken_Box_Shadow_Hover)}.fd-token:focus,.fd-token.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle)}.fd-token--compact{padding:.1rem 0 .1rem .25rem;height:1.25rem;min-width:3rem;line-height:1.125rem}.fd-token--compact .fd-token__close{padding:.1rem .25rem;vertical-align:baseline;width:1.25rem;min-width:1.25rem;height:1.25rem}[dir=rtl] .fd-token--compact,.fd-token--compact[dir=rtl]{padding-left:0;padding-right:.25rem}.fd-token--compact:focus,.fd-token--compact.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle);outline-offset:var(--fdToken_Outline_Offset_Compact)}.fd-token--selected{color:var(--sapButton_Selected_TextColor);background-color:var(--sapButton_Selected_Background);border-color:var(--sapButton_Selected_BorderColor)}.fd-token--selected .fd-token__close{color:var(--sapButton_Selected_TextColor)}.fd-token--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--selected:focus,.fd-token--selected.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle);outline-color:var(--fdToken_Border_Color_Selected_Focus)}.fd-token--readonly{color:var(--sapContent_LabelColor);background-color:var(--fdToken_Background_Color_Read_Only);padding:.25rem .375rem;border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only)}.fd-token--readonly.fd-token--compact{padding:.1rem .25rem}[dir=rtl] .fd-token--readonly.fd-token--compact,.fd-token--readonly.fd-token--compact[dir=rtl]{padding-left:.25rem}.fd-token--readonly:hover,.fd-token--readonly.is-hover{box-shadow:none;color:var(--sapContent_LabelColor);background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only)}[dir=rtl] .fd-token--readonly,.fd-token--readonly[dir=rtl]{padding-left:.375rem}.fd-token__disabled:after{cursor:not-allowed}.no-text-select{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}\n"], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i6.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
91
+ TokenComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.4", 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-setsize]=\"totalCount\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\n (keydown)=\"onTokenKeydown.emit($event)\"\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\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n tabindex=\"-1\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.24.1-rc.1\n * Copyright (c) 2022 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{cursor:default;line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;font-size:var(--sapFontSize);color:var(--fdToken_Text_Color);border-radius:var(--fdToken_Border_Radius);background-color:var(--sapButton_TokenBackground);border:var(--sapButton_BorderWidth) solid var(--sapButton_TokenBorderColor);display:inline-flex;flex-shrink:0;align-items:center;text-align:center;padding:.25rem 0 .25rem var(--fdToken_Padding_Left);white-space:nowrap;max-width:100%;min-width:3.625rem;text-overflow:clip;height:1.625rem;line-height:1.5rem}.fd-token:before,.fd-token:after{box-sizing:inherit;font-size:inherit}[dir=rtl] .fd-token,.fd-token[dir=rtl]{padding-left:0;padding-right:var(--fdToken_Padding_Left)}.fd-token__text{overflow:hidden;max-width:100%;min-width:auto;width:100%;text-overflow:ellipsis;text-shadow:var(--fdToken_Text_Shadow)}.fd-token__close{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;font-size:var(--sapFontSmallSize);color:var(--sapContent_IconColor);padding:.25rem .5rem;width:1.75rem;min-width:1.75rem;height:1.625rem;background-color:transparent;line-height:1.25rem;cursor:pointer;display:flex;align-items:center;justify-content:center}.fd-token__close:before,.fd-token__close:after{box-sizing:inherit;font-size:inherit}.fd-token__close:before{font-family:SAP-icons;text-align:center;text-decoration:inherit;text-transform:none;text-rendering:optimizeLegibility}.fd-token__close:before{content:\"\\e03e\"}.fd-token__close:focus,.fd-token__close.is-focus{z-index:5;outline:none;box-shadow:none}.fd-token:hover{background-color:var(--fdToken_Background_Color_Hover);border-color:var(--fdToken_Border_Color_Hover);box-shadow:var(--fdToken_Box_Shadow_Hover)}.fd-token:focus,.fd-token.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle)}.fd-token--compact{padding:.1rem 0 .1rem .25rem;height:1.25rem;min-width:3rem;line-height:1.125rem}.fd-token--compact .fd-token__close{padding:.1rem .25rem;vertical-align:baseline;width:1.25rem;min-width:1.25rem;height:1.25rem}[dir=rtl] .fd-token--compact,.fd-token--compact[dir=rtl]{padding-left:0;padding-right:.25rem}.fd-token--compact:focus,.fd-token--compact.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle);outline-offset:var(--fdToken_Outline_Offset_Compact)}.fd-token--selected{color:var(--sapButton_Selected_TextColor);background-color:var(--sapButton_Selected_Background);border-color:var(--sapButton_Selected_BorderColor)}.fd-token--selected .fd-token__close{color:var(--sapButton_Selected_TextColor)}.fd-token--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--selected:focus,.fd-token--selected.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle);outline-color:var(--fdToken_Border_Color_Selected_Focus)}.fd-token--readonly{color:var(--sapContent_LabelColor);background-color:var(--fdToken_Background_Color_Read_Only);padding:.25rem .375rem;border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only)}.fd-token--readonly.fd-token--compact{padding:.1rem .25rem}[dir=rtl] .fd-token--readonly.fd-token--compact,.fd-token--readonly.fd-token--compact[dir=rtl]{padding-left:.25rem}.fd-token--readonly:hover,.fd-token--readonly.is-hover{box-shadow:none;color:var(--sapContent_LabelColor);background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only)}[dir=rtl] .fd-token--readonly,.fd-token--readonly[dir=rtl]{padding-left:.375rem}.fd-token__disabled:after{cursor:not-allowed}.no-text-select{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}\n"], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i6.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
84
92
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: TokenComponent, decorators: [{
85
93
  type: Component,
86
- args: [{ selector: 'fd-token', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [contentDensityObserverProviders()], template: "<span\n #tokenWrapperElement\n class=\"fd-token\"\n role=\"option\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\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\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n tabindex=\"-1\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.24.1-rc.1\n * Copyright (c) 2022 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{cursor:default;line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;font-size:var(--sapFontSize);color:var(--fdToken_Text_Color);border-radius:var(--fdToken_Border_Radius);background-color:var(--sapButton_TokenBackground);border:var(--sapButton_BorderWidth) solid var(--sapButton_TokenBorderColor);display:inline-flex;flex-shrink:0;align-items:center;text-align:center;padding:.25rem 0 .25rem var(--fdToken_Padding_Left);white-space:nowrap;max-width:100%;min-width:3.625rem;text-overflow:clip;height:1.625rem;line-height:1.5rem}.fd-token:before,.fd-token:after{box-sizing:inherit;font-size:inherit}[dir=rtl] .fd-token,.fd-token[dir=rtl]{padding-left:0;padding-right:var(--fdToken_Padding_Left)}.fd-token__text{overflow:hidden;max-width:100%;min-width:auto;width:100%;text-overflow:ellipsis;text-shadow:var(--fdToken_Text_Shadow)}.fd-token__close{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;font-size:var(--sapFontSmallSize);color:var(--sapContent_IconColor);padding:.25rem .5rem;width:1.75rem;min-width:1.75rem;height:1.625rem;background-color:transparent;line-height:1.25rem;cursor:pointer;display:flex;align-items:center;justify-content:center}.fd-token__close:before,.fd-token__close:after{box-sizing:inherit;font-size:inherit}.fd-token__close:before{font-family:SAP-icons;text-align:center;text-decoration:inherit;text-transform:none;text-rendering:optimizeLegibility}.fd-token__close:before{content:\"\\e03e\"}.fd-token__close:focus,.fd-token__close.is-focus{z-index:5;outline:none;box-shadow:none}.fd-token:hover{background-color:var(--fdToken_Background_Color_Hover);border-color:var(--fdToken_Border_Color_Hover);box-shadow:var(--fdToken_Box_Shadow_Hover)}.fd-token:focus,.fd-token.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle)}.fd-token--compact{padding:.1rem 0 .1rem .25rem;height:1.25rem;min-width:3rem;line-height:1.125rem}.fd-token--compact .fd-token__close{padding:.1rem .25rem;vertical-align:baseline;width:1.25rem;min-width:1.25rem;height:1.25rem}[dir=rtl] .fd-token--compact,.fd-token--compact[dir=rtl]{padding-left:0;padding-right:.25rem}.fd-token--compact:focus,.fd-token--compact.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle);outline-offset:var(--fdToken_Outline_Offset_Compact)}.fd-token--selected{color:var(--sapButton_Selected_TextColor);background-color:var(--sapButton_Selected_Background);border-color:var(--sapButton_Selected_BorderColor)}.fd-token--selected .fd-token__close{color:var(--sapButton_Selected_TextColor)}.fd-token--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--selected:focus,.fd-token--selected.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle);outline-color:var(--fdToken_Border_Color_Selected_Focus)}.fd-token--readonly{color:var(--sapContent_LabelColor);background-color:var(--fdToken_Background_Color_Read_Only);padding:.25rem .375rem;border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only)}.fd-token--readonly.fd-token--compact{padding:.1rem .25rem}[dir=rtl] .fd-token--readonly.fd-token--compact,.fd-token--readonly.fd-token--compact[dir=rtl]{padding-left:.25rem}.fd-token--readonly:hover,.fd-token--readonly.is-hover{box-shadow:none;color:var(--sapContent_LabelColor);background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only)}[dir=rtl] .fd-token--readonly,.fd-token--readonly[dir=rtl]{padding-left:.375rem}.fd-token__disabled:after{cursor:not-allowed}.no-text-select{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}\n"] }]
94
+ 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-setsize]=\"totalCount\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\n (keydown)=\"onTokenKeydown.emit($event)\"\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\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n tabindex=\"-1\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.24.1-rc.1\n * Copyright (c) 2022 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{cursor:default;line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;font-size:var(--sapFontSize);color:var(--fdToken_Text_Color);border-radius:var(--fdToken_Border_Radius);background-color:var(--sapButton_TokenBackground);border:var(--sapButton_BorderWidth) solid var(--sapButton_TokenBorderColor);display:inline-flex;flex-shrink:0;align-items:center;text-align:center;padding:.25rem 0 .25rem var(--fdToken_Padding_Left);white-space:nowrap;max-width:100%;min-width:3.625rem;text-overflow:clip;height:1.625rem;line-height:1.5rem}.fd-token:before,.fd-token:after{box-sizing:inherit;font-size:inherit}[dir=rtl] .fd-token,.fd-token[dir=rtl]{padding-left:0;padding-right:var(--fdToken_Padding_Left)}.fd-token__text{overflow:hidden;max-width:100%;min-width:auto;width:100%;text-overflow:ellipsis;text-shadow:var(--fdToken_Text_Shadow)}.fd-token__close{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;font-size:var(--sapFontSmallSize);color:var(--sapContent_IconColor);padding:.25rem .5rem;width:1.75rem;min-width:1.75rem;height:1.625rem;background-color:transparent;line-height:1.25rem;cursor:pointer;display:flex;align-items:center;justify-content:center}.fd-token__close:before,.fd-token__close:after{box-sizing:inherit;font-size:inherit}.fd-token__close:before{font-family:SAP-icons;text-align:center;text-decoration:inherit;text-transform:none;text-rendering:optimizeLegibility}.fd-token__close:before{content:\"\\e03e\"}.fd-token__close:focus,.fd-token__close.is-focus{z-index:5;outline:none;box-shadow:none}.fd-token:hover{background-color:var(--fdToken_Background_Color_Hover);border-color:var(--fdToken_Border_Color_Hover);box-shadow:var(--fdToken_Box_Shadow_Hover)}.fd-token:focus,.fd-token.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle)}.fd-token--compact{padding:.1rem 0 .1rem .25rem;height:1.25rem;min-width:3rem;line-height:1.125rem}.fd-token--compact .fd-token__close{padding:.1rem .25rem;vertical-align:baseline;width:1.25rem;min-width:1.25rem;height:1.25rem}[dir=rtl] .fd-token--compact,.fd-token--compact[dir=rtl]{padding-left:0;padding-right:.25rem}.fd-token--compact:focus,.fd-token--compact.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle);outline-offset:var(--fdToken_Outline_Offset_Compact)}.fd-token--selected{color:var(--sapButton_Selected_TextColor);background-color:var(--sapButton_Selected_Background);border-color:var(--sapButton_Selected_BorderColor)}.fd-token--selected .fd-token__close{color:var(--sapButton_Selected_TextColor)}.fd-token--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--selected:focus,.fd-token--selected.is-focus{z-index:5;box-shadow:none;outline-offset:var(--fdToken_Outline_Offset);outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle);outline-color:var(--fdToken_Border_Color_Selected_Focus)}.fd-token--readonly{color:var(--sapContent_LabelColor);background-color:var(--fdToken_Background_Color_Read_Only);padding:.25rem .375rem;border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only)}.fd-token--readonly.fd-token--compact{padding:.1rem .25rem}[dir=rtl] .fd-token--readonly.fd-token--compact,.fd-token--readonly.fd-token--compact[dir=rtl]{padding-left:.25rem}.fd-token--readonly:hover,.fd-token--readonly.is-hover{box-shadow:none;color:var(--sapContent_LabelColor);background-color:var(--fdToken_Background_Color_Read_Only);border:var(--sapButton_BorderWidth) solid var(--fdToken_Border_Color_Read_Only)}[dir=rtl] .fd-token--readonly,.fd-token--readonly[dir=rtl]{padding-left:.375rem}.fd-token__disabled:after{cursor:not-allowed}.no-text-select{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}\n"] }]
87
95
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.ContentDensityObserver }]; }, propDecorators: { disabled: [{
88
96
  type: Input
89
97
  }], tokenWrapperElement: [{
@@ -111,6 +119,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImpor
111
119
  // eslint-disable-next-line @angular-eslint/no-output-on-prefix
112
120
  onTokenClick: [{
113
121
  type: Output
122
+ }],
123
+ // eslint-disable-next-line @angular-eslint/no-output-on-prefix
124
+ onTokenKeydown: [{
125
+ type: Output
114
126
  }] } });
115
127
 
116
128
  class TokenizerComponent {
@@ -182,13 +194,6 @@ class TokenizerComponent {
182
194
  if (this.input && this.input.elementRef()) {
183
195
  this._inputKeydownEvent();
184
196
  }
185
- }
186
- /** @hidden */
187
- ngAfterViewChecked() {
188
- if (this.tokenList) {
189
- this.previousTokenCount = this.tokenList.length;
190
- }
191
- this.handleTokenClickSubscriptions();
192
197
  // watch for changes to the tokenList and attempt to expand/collapse tokens as needed
193
198
  if (this.tokenListChangesSubscription) {
194
199
  this.tokenListChangesSubscription.unsubscribe();
@@ -256,6 +261,9 @@ class TokenizerComponent {
256
261
  this._shiftSelected(index);
257
262
  }
258
263
  }));
264
+ this.tokenListClickSubscriptions.push(token.onTokenKeydown.subscribe((event) => {
265
+ this.handleKeyDown(event, index);
266
+ }));
259
267
  });
260
268
  }
261
269
  /** @hidden */
@@ -265,27 +273,11 @@ class TokenizerComponent {
265
273
  if (tokenListArray[newIndex]) {
266
274
  elementToFocus = tokenListArray[newIndex].tokenWrapperElement.nativeElement;
267
275
  // element needs tabindex in order to be focused
268
- elementToFocus.setAttribute('tabindex', '0');
269
276
  elementToFocus.focus();
270
- this.addKeyboardListener(elementToFocus, newIndex);
271
277
  }
272
278
  return elementToFocus;
273
279
  }
274
280
  /** @hidden */
275
- addKeyboardListener(element, newIndex) {
276
- // function needs to be defined in order to be referenced later by addEventListener/removeEventListener
277
- const handleFunctionReference = (e) => {
278
- if (newIndex || newIndex === 0) {
279
- this.handleKeyDown(e, newIndex);
280
- }
281
- };
282
- element.addEventListener('keydown', handleFunctionReference);
283
- element.addEventListener('blur', () => {
284
- element.setAttribute('tabindex', '-1');
285
- element.removeEventListener('keydown', handleFunctionReference);
286
- });
287
- }
288
- /** @hidden */
289
281
  keyDown(keyboardEvent) {
290
282
  if (KeyUtil.isKeyCode(keyboardEvent, [DELETE, BACKSPACE]) &&
291
283
  (!this._isInputFocused() || this._tokensSelected()) &&
@@ -472,6 +464,7 @@ class TokenizerComponent {
472
464
  }
473
465
  this.handleTokenClickSubscriptions();
474
466
  this.previousTokenCount = this.tokenList.length;
467
+ this.tokenList.forEach((token) => token._setTotalCount(this.tokenList.length));
475
468
  }
476
469
  /** @hidden */
477
470
  _getHiddenCozyTokenCount() {
@@ -632,22 +625,18 @@ class TokenizerComponent {
632
625
  }
633
626
  /** @hidden */
634
627
  _listenElementEvents() {
635
- fromEvent(this.elementRef().nativeElement, 'focus', { capture: true })
636
- .pipe(filter((event) => { var _a; return ((_a = event['target']) === null || _a === void 0 ? void 0 : _a.tagName) === 'INPUT' && this.tokenizerFocusable; }), tap(() => {
637
- this._tokenizerHasFocus = true;
628
+ 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)))
629
+ .pipe(
630
+ // debounceTime is needed in order to filter subsequent focus-blur events, that happen simultaneously
631
+ debounceTime(10), takeUntil(this._onDestroy$))
632
+ .subscribe((focused) => {
633
+ this._tokenizerHasFocus = focused;
638
634
  this._cdRef.markForCheck();
639
- }), takeUntil(this._onDestroy$))
640
- .subscribe();
641
- fromEvent(this.elementRef().nativeElement, 'blur', { capture: true })
642
- .pipe(tap(() => {
643
- this._tokenizerHasFocus = false;
644
- this._cdRef.markForCheck();
645
- }), takeUntil(this._onDestroy$))
646
- .subscribe();
635
+ });
647
636
  }
648
637
  }
649
638
  TokenizerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", 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 });
650
- TokenizerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.4", type: TokenizerComponent, selector: "fd-tokenizer", inputs: { class: "class", disableKeyboardDeletion: "disableKeyboardDeletion", ariaRoleDescription: "ariaRoleDescription", compactCollapse: "compactCollapse", tokenizerFocusable: "tokenizerFocusable", inputValue: "inputValue", glyph: "glyph", moreTerm: "moreTerm", open: "open" }, outputs: { moreClickedEvent: "moreClickedEvent" }, host: { listeners: { "keydown": "keyDown($event)", "window:resize": "onResize()" } }, providers: [contentDensityObserverProviders()], queries: [{ propertyName: "input", first: true, predicate: i0.forwardRef(function () { return FormControlComponent; }), descendants: true }, { 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 <ng-content select=\"fd-token\"></ng-content>\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 tabindex=\"-1\"\n [attr.aria-label]=\"token.deleteButtonLabel\"\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 #moreElement\n >\n <ng-container *ngIf=\"compact || compactCollapse\">\n {{ moreTokensLeft.length + moreTokensRight.length }} {{ moreTerm }}\n </ng-container>\n <ng-container *ngIf=\"!compact && !compactCollapse\"> {{ hiddenCozyTokenCount }} {{ moreTerm }} </ng-container>\n </span>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.24.1-rc.1\n * Copyright (c) 2022 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{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;border:0;white-space:nowrap;text-overflow:ellipsis;z-index:1;min-width:2.75rem;border-radius:var(--sapField_BorderCornerRadius);padding:0 .625rem;margin:.25rem 0;height:2.25rem;box-shadow:none;color:var(--sapField_TextColor);text-shadow:var(--fdInput_Text_Shadow);background:var(--sapField_BackgroundStyle);background-color:var(--sapField_Background);border:var(--sapField_BorderWidth) var(--sapField_BorderStyle) var(--sapField_BorderColor);cursor:text;outline:none;overflow:hidden;appearance:none;-moz-appearance:none;-webkit-appearance:none;width:100%;height:auto;display:flex;padding:0;margin:0;border:none;align-items:center}.fd-tokenizer:before,.fd-tokenizer:after{box-sizing:inherit;font-size:inherit}.fd-tokenizer::placeholder{font-style:var(--fdPlaceholder_Font_Style);color:var(--sapField_PlaceholderTextColor)}.fd-tokenizer::selection{color:var(--sapContent_ContrastTextColor);background-color:var(--sapSelectedColor)}.fd-tokenizer::-ms-clear{display:none}.fd-tokenizer:hover,.fd-tokenizer.is-hover{background:var(--sapField_Hover_BackgroundStyle);background-color:var(--sapField_Hover_Background);border-color:var(--sapField_Hover_BorderColor);box-shadow:var(--fdInput_Box_Shadow_Hover)}.fd-tokenizer:focus,.fd-tokenizer.is-focus{z-index:5;background:var(--sapField_Focus_Background);outline-width:var(--sapContent_FocusWidth);outline-style:var(--sapContent_FocusStyle);outline-color:var(--fdInput_Outline_Color);outline-offset:var(--fdInput_Outline_Offset);box-shadow:none}.fd-tokenizer:hover,.fd-tokenizer.is-hover{box-shadow:none}.fd-tokenizer__inner{-ms-overflow-style:none;scrollbar-width:none;padding:0 .3125rem;overflow:hidden;float:right;white-space:nowrap;width:100%;display:flex;align-items:center;justify-content:flex-end}.fd-tokenizer__inner::-webkit-scrollbar{display:none}.fd-tokenizer .fd-token{margin-right:.3125rem;max-width:calc(100% - 3.3125rem)}[dir=rtl] .fd-tokenizer .fd-token,.fd-tokenizer .fd-token[dir=rtl]{margin:0 0 0 .3125rem}.fd-tokenizer__indicator{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;display:inline-block;cursor:pointer}.fd-tokenizer__indicator:before,.fd-tokenizer__indicator:after{box-sizing:inherit;font-size:inherit}.fd-tokenizer .fd-tokenizer__input{background:transparent}.fd-tokenizer .fd-tokenizer__input.fd-input{border:none;padding:0;min-width:3rem}.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:focus,.fd-tokenizer .fd-tokenizer__input.is-focus{z-index:5;box-shadow:none;background:none;background-color:transparent;border:none;outline:none}.fd-tokenizer .fd-tokenizer__input:hover,.fd-tokenizer .fd-tokenizer__input.is-hover{box-shadow:none;background:none;background-color:transparent}.fd-tokenizer:focus,.fd-tokenizer.is-focus{z-index:5;box-shadow:none;border:none;outline-offset:-.0625rem;outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle)}.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)}[dir=rtl] .fd-tokenizer--compact .fd-token,.fd-tokenizer--compact .fd-token[dir=rtl]{margin:0 0 0 .3125rem}.fd-tokenizer--readonly{overflow:visible;background-color:var(--sapField_ReadOnly_Background)}.fd-tokenizer--readonly .fd-tokenizer__inner{overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true],.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]{box-shadow:none;background:none;background-color:transparent}.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly:focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly.is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly].is-focus{z-index:5;box-shadow:none;background:none;background-color:transparent}.fd-tokenizer--scrollable .fd-tokenizer__inner{justify-content:initial;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"], components: [{ type: i3.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { type: i4.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { type: i4.PopoverControlComponent, selector: "fd-popover-control" }, { type: i4.PopoverBodyComponent, selector: "fd-popover-body" }, { type: i5.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline"], outputs: ["focusEscapeList"] }, { type: i5.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "ariaDescribedBy", "noData", "action", "interactive", "growing", "counter", "unread", "selectedListItemScreenReaderText", "navigatedListItemScreenReaderText", "navigatableListItemScreenReaderText"], outputs: ["keyDown"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.InputGroupAddOnDirective, selector: "[fd-input-group-addon]", inputs: ["class", "placement", "type", "state", "button"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
639
+ TokenizerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.4", type: TokenizerComponent, selector: "fd-tokenizer", inputs: { class: "class", disableKeyboardDeletion: "disableKeyboardDeletion", ariaRoleDescription: "ariaRoleDescription", compactCollapse: "compactCollapse", tokenizerFocusable: "tokenizerFocusable", inputValue: "inputValue", glyph: "glyph", moreTerm: "moreTerm", open: "open" }, outputs: { moreClickedEvent: "moreClickedEvent" }, host: { listeners: { "keydown": "keyDown($event)", "window:resize": "onResize()" } }, providers: [contentDensityObserverProviders()], queries: [{ propertyName: "input", first: true, predicate: i0.forwardRef(function () { return FormControlComponent; }), descendants: true }, { 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 tabindex=\"-1\"\n [attr.aria-label]=\"token.deleteButtonLabel\"\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 #moreElement\n >\n <ng-container *ngIf=\"compact || compactCollapse\">\n {{ moreTokensLeft.length + moreTokensRight.length }} {{ moreTerm }}\n </ng-container>\n <ng-container *ngIf=\"!compact && !compactCollapse\"> {{ hiddenCozyTokenCount }} {{ moreTerm }} </ng-container>\n </span>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.24.1-rc.1\n * Copyright (c) 2022 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{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;border:0;white-space:nowrap;text-overflow:ellipsis;z-index:1;min-width:2.75rem;border-radius:var(--sapField_BorderCornerRadius);padding:0 .625rem;margin:.25rem 0;height:2.25rem;box-shadow:none;color:var(--sapField_TextColor);text-shadow:var(--fdInput_Text_Shadow);background:var(--sapField_BackgroundStyle);background-color:var(--sapField_Background);border:var(--sapField_BorderWidth) var(--sapField_BorderStyle) var(--sapField_BorderColor);cursor:text;outline:none;overflow:hidden;appearance:none;-moz-appearance:none;-webkit-appearance:none;width:100%;height:auto;display:flex;padding:0;margin:0;border:none;align-items:center}.fd-tokenizer:before,.fd-tokenizer:after{box-sizing:inherit;font-size:inherit}.fd-tokenizer::placeholder{font-style:var(--fdPlaceholder_Font_Style);color:var(--sapField_PlaceholderTextColor)}.fd-tokenizer::selection{color:var(--sapContent_ContrastTextColor);background-color:var(--sapSelectedColor)}.fd-tokenizer::-ms-clear{display:none}.fd-tokenizer:hover,.fd-tokenizer.is-hover{background:var(--sapField_Hover_BackgroundStyle);background-color:var(--sapField_Hover_Background);border-color:var(--sapField_Hover_BorderColor);box-shadow:var(--fdInput_Box_Shadow_Hover)}.fd-tokenizer:focus,.fd-tokenizer.is-focus{z-index:5;background:var(--sapField_Focus_Background);outline-width:var(--sapContent_FocusWidth);outline-style:var(--sapContent_FocusStyle);outline-color:var(--fdInput_Outline_Color);outline-offset:var(--fdInput_Outline_Offset);box-shadow:none}.fd-tokenizer:hover,.fd-tokenizer.is-hover{box-shadow:none}.fd-tokenizer__inner{-ms-overflow-style:none;scrollbar-width:none;padding:0 .3125rem;overflow:hidden;float:right;white-space:nowrap;width:100%;display:flex;align-items:center;justify-content:flex-end}.fd-tokenizer__inner::-webkit-scrollbar{display:none}.fd-tokenizer .fd-token{margin-right:.3125rem;max-width:calc(100% - 3.3125rem)}[dir=rtl] .fd-tokenizer .fd-token,.fd-tokenizer .fd-token[dir=rtl]{margin:0 0 0 .3125rem}.fd-tokenizer__indicator{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;display:inline-block;cursor:pointer}.fd-tokenizer__indicator:before,.fd-tokenizer__indicator:after{box-sizing:inherit;font-size:inherit}.fd-tokenizer .fd-tokenizer__input{background:transparent}.fd-tokenizer .fd-tokenizer__input.fd-input{border:none;padding:0;min-width:3rem}.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:focus,.fd-tokenizer .fd-tokenizer__input.is-focus{z-index:5;box-shadow:none;background:none;background-color:transparent;border:none;outline:none}.fd-tokenizer .fd-tokenizer__input:hover,.fd-tokenizer .fd-tokenizer__input.is-hover{box-shadow:none;background:none;background-color:transparent}.fd-tokenizer:focus,.fd-tokenizer.is-focus{z-index:5;box-shadow:none;border:none;outline-offset:-.0625rem;outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle)}.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)}[dir=rtl] .fd-tokenizer--compact .fd-token,.fd-tokenizer--compact .fd-token[dir=rtl]{margin:0 0 0 .3125rem}.fd-tokenizer--readonly{overflow:visible;background-color:var(--sapField_ReadOnly_Background)}.fd-tokenizer--readonly .fd-tokenizer__inner{overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true],.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]{box-shadow:none;background:none;background-color:transparent}.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly:focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly.is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly].is-focus{z-index:5;box-shadow:none;background:none;background-color:transparent}.fd-tokenizer--scrollable .fd-tokenizer__inner{justify-content:initial;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"], components: [{ type: i3.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { type: i4.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { type: i4.PopoverControlComponent, selector: "fd-popover-control" }, { type: i4.PopoverBodyComponent, selector: "fd-popover-body" }, { type: i5.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline"], outputs: ["focusEscapeList"] }, { type: i5.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "ariaDescribedBy", "noData", "action", "interactive", "growing", "counter", "unread", "selectedListItemScreenReaderText", "navigatedListItemScreenReaderText", "navigatableListItemScreenReaderText"], outputs: ["keyDown"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.InputGroupAddOnDirective, selector: "[fd-input-group-addon]", inputs: ["class", "placement", "type", "state", "button"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
651
640
  __decorate([
652
641
  applyCssClass,
653
642
  __metadata("design:type", Function),
@@ -656,7 +645,7 @@ __decorate([
656
645
  ], TokenizerComponent.prototype, "buildComponentCssClass", null);
657
646
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: TokenizerComponent, decorators: [{
658
647
  type: Component,
659
- 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 <ng-content select=\"fd-token\"></ng-content>\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 tabindex=\"-1\"\n [attr.aria-label]=\"token.deleteButtonLabel\"\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 #moreElement\n >\n <ng-container *ngIf=\"compact || compactCollapse\">\n {{ moreTokensLeft.length + moreTokensRight.length }} {{ moreTerm }}\n </ng-container>\n <ng-container *ngIf=\"!compact && !compactCollapse\"> {{ hiddenCozyTokenCount }} {{ moreTerm }} </ng-container>\n </span>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.24.1-rc.1\n * Copyright (c) 2022 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{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;border:0;white-space:nowrap;text-overflow:ellipsis;z-index:1;min-width:2.75rem;border-radius:var(--sapField_BorderCornerRadius);padding:0 .625rem;margin:.25rem 0;height:2.25rem;box-shadow:none;color:var(--sapField_TextColor);text-shadow:var(--fdInput_Text_Shadow);background:var(--sapField_BackgroundStyle);background-color:var(--sapField_Background);border:var(--sapField_BorderWidth) var(--sapField_BorderStyle) var(--sapField_BorderColor);cursor:text;outline:none;overflow:hidden;appearance:none;-moz-appearance:none;-webkit-appearance:none;width:100%;height:auto;display:flex;padding:0;margin:0;border:none;align-items:center}.fd-tokenizer:before,.fd-tokenizer:after{box-sizing:inherit;font-size:inherit}.fd-tokenizer::placeholder{font-style:var(--fdPlaceholder_Font_Style);color:var(--sapField_PlaceholderTextColor)}.fd-tokenizer::selection{color:var(--sapContent_ContrastTextColor);background-color:var(--sapSelectedColor)}.fd-tokenizer::-ms-clear{display:none}.fd-tokenizer:hover,.fd-tokenizer.is-hover{background:var(--sapField_Hover_BackgroundStyle);background-color:var(--sapField_Hover_Background);border-color:var(--sapField_Hover_BorderColor);box-shadow:var(--fdInput_Box_Shadow_Hover)}.fd-tokenizer:focus,.fd-tokenizer.is-focus{z-index:5;background:var(--sapField_Focus_Background);outline-width:var(--sapContent_FocusWidth);outline-style:var(--sapContent_FocusStyle);outline-color:var(--fdInput_Outline_Color);outline-offset:var(--fdInput_Outline_Offset);box-shadow:none}.fd-tokenizer:hover,.fd-tokenizer.is-hover{box-shadow:none}.fd-tokenizer__inner{-ms-overflow-style:none;scrollbar-width:none;padding:0 .3125rem;overflow:hidden;float:right;white-space:nowrap;width:100%;display:flex;align-items:center;justify-content:flex-end}.fd-tokenizer__inner::-webkit-scrollbar{display:none}.fd-tokenizer .fd-token{margin-right:.3125rem;max-width:calc(100% - 3.3125rem)}[dir=rtl] .fd-tokenizer .fd-token,.fd-tokenizer .fd-token[dir=rtl]{margin:0 0 0 .3125rem}.fd-tokenizer__indicator{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;display:inline-block;cursor:pointer}.fd-tokenizer__indicator:before,.fd-tokenizer__indicator:after{box-sizing:inherit;font-size:inherit}.fd-tokenizer .fd-tokenizer__input{background:transparent}.fd-tokenizer .fd-tokenizer__input.fd-input{border:none;padding:0;min-width:3rem}.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:focus,.fd-tokenizer .fd-tokenizer__input.is-focus{z-index:5;box-shadow:none;background:none;background-color:transparent;border:none;outline:none}.fd-tokenizer .fd-tokenizer__input:hover,.fd-tokenizer .fd-tokenizer__input.is-hover{box-shadow:none;background:none;background-color:transparent}.fd-tokenizer:focus,.fd-tokenizer.is-focus{z-index:5;box-shadow:none;border:none;outline-offset:-.0625rem;outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle)}.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)}[dir=rtl] .fd-tokenizer--compact .fd-token,.fd-tokenizer--compact .fd-token[dir=rtl]{margin:0 0 0 .3125rem}.fd-tokenizer--readonly{overflow:visible;background-color:var(--sapField_ReadOnly_Background)}.fd-tokenizer--readonly .fd-tokenizer__inner{overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true],.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]{box-shadow:none;background:none;background-color:transparent}.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly:focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly.is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly].is-focus{z-index:5;box-shadow:none;background:none;background-color:transparent}.fd-tokenizer--scrollable .fd-tokenizer__inner{justify-content:initial;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"] }]
648
+ 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 tabindex=\"-1\"\n [attr.aria-label]=\"token.deleteButtonLabel\"\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 #moreElement\n >\n <ng-container *ngIf=\"compact || compactCollapse\">\n {{ moreTokensLeft.length + moreTokensRight.length }} {{ moreTerm }}\n </ng-container>\n <ng-container *ngIf=\"!compact && !compactCollapse\"> {{ hiddenCozyTokenCount }} {{ moreTerm }} </ng-container>\n </span>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.24.1-rc.1\n * Copyright (c) 2022 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{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;border:0;white-space:nowrap;text-overflow:ellipsis;z-index:1;min-width:2.75rem;border-radius:var(--sapField_BorderCornerRadius);padding:0 .625rem;margin:.25rem 0;height:2.25rem;box-shadow:none;color:var(--sapField_TextColor);text-shadow:var(--fdInput_Text_Shadow);background:var(--sapField_BackgroundStyle);background-color:var(--sapField_Background);border:var(--sapField_BorderWidth) var(--sapField_BorderStyle) var(--sapField_BorderColor);cursor:text;outline:none;overflow:hidden;appearance:none;-moz-appearance:none;-webkit-appearance:none;width:100%;height:auto;display:flex;padding:0;margin:0;border:none;align-items:center}.fd-tokenizer:before,.fd-tokenizer:after{box-sizing:inherit;font-size:inherit}.fd-tokenizer::placeholder{font-style:var(--fdPlaceholder_Font_Style);color:var(--sapField_PlaceholderTextColor)}.fd-tokenizer::selection{color:var(--sapContent_ContrastTextColor);background-color:var(--sapSelectedColor)}.fd-tokenizer::-ms-clear{display:none}.fd-tokenizer:hover,.fd-tokenizer.is-hover{background:var(--sapField_Hover_BackgroundStyle);background-color:var(--sapField_Hover_Background);border-color:var(--sapField_Hover_BorderColor);box-shadow:var(--fdInput_Box_Shadow_Hover)}.fd-tokenizer:focus,.fd-tokenizer.is-focus{z-index:5;background:var(--sapField_Focus_Background);outline-width:var(--sapContent_FocusWidth);outline-style:var(--sapContent_FocusStyle);outline-color:var(--fdInput_Outline_Color);outline-offset:var(--fdInput_Outline_Offset);box-shadow:none}.fd-tokenizer:hover,.fd-tokenizer.is-hover{box-shadow:none}.fd-tokenizer__inner{-ms-overflow-style:none;scrollbar-width:none;padding:0 .3125rem;overflow:hidden;float:right;white-space:nowrap;width:100%;display:flex;align-items:center;justify-content:flex-end}.fd-tokenizer__inner::-webkit-scrollbar{display:none}.fd-tokenizer .fd-token{margin-right:.3125rem;max-width:calc(100% - 3.3125rem)}[dir=rtl] .fd-tokenizer .fd-token,.fd-tokenizer .fd-token[dir=rtl]{margin:0 0 0 .3125rem}.fd-tokenizer__indicator{font-size:var(--sapFontSize);line-height:var(--sapContent_LineHeight);color:var(--sapTextColor);font-family:var(--sapFontFamily);font-weight:400;box-sizing:border-box;padding:0;margin:0;border:0;display:inline-block;cursor:pointer}.fd-tokenizer__indicator:before,.fd-tokenizer__indicator:after{box-sizing:inherit;font-size:inherit}.fd-tokenizer .fd-tokenizer__input{background:transparent}.fd-tokenizer .fd-tokenizer__input.fd-input{border:none;padding:0;min-width:3rem}.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:focus,.fd-tokenizer .fd-tokenizer__input.is-focus{z-index:5;box-shadow:none;background:none;background-color:transparent;border:none;outline:none}.fd-tokenizer .fd-tokenizer__input:hover,.fd-tokenizer .fd-tokenizer__input.is-hover{box-shadow:none;background:none;background-color:transparent}.fd-tokenizer:focus,.fd-tokenizer.is-focus{z-index:5;box-shadow:none;border:none;outline-offset:-.0625rem;outline-width:var(--sapContent_FocusWidth);outline-color:var(--sapContent_FocusColor);outline-style:var(--sapContent_FocusStyle)}.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)}[dir=rtl] .fd-tokenizer--compact .fd-token,.fd-tokenizer--compact .fd-token[dir=rtl]{margin:0 0 0 .3125rem}.fd-tokenizer--readonly{overflow:visible;background-color:var(--sapField_ReadOnly_Background)}.fd-tokenizer--readonly .fd-tokenizer__inner{overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true],.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]{box-shadow:none;background:none;background-color:transparent}.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly:focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly.is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly].is-focus{z-index:5;box-shadow:none;background:none;background-color:transparent}.fd-tokenizer--scrollable .fd-tokenizer__inner{justify-content:initial;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"] }]
660
649
  }], ctorParameters: function () {
661
650
  return [{ type: i1.ContentDensityObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i2.RtlService, decorators: [{
662
651
  type: Optional
@@ -1 +1 @@
1
- {"version":3,"file":"fundamental-ngx-core-token.mjs","sources":["../../../../libs/core/src/lib/token/token.component.ts","../../../../libs/core/src/lib/token/token.component.html","../../../../libs/core/src/lib/token/tokenizer.component.ts","../../../../libs/core/src/lib/token/tokenizer.component.html","../../../../libs/core/src/lib/token/token-input.directive.ts","../../../../libs/core/src/lib/token/deprecated-tokenizer-content-density.directive.ts","../../../../libs/core/src/lib/token/token.module.ts","../../../../libs/core/src/lib/token/fundamental-ngx-core-token.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\n\n/**\n * A token is used to represent contextualizing information.\n * They can be useful to show applied filters, selected values for form fields or object metadata.\n */\n@Component({\n selector: 'fd-token',\n templateUrl: './token.component.html',\n styleUrls: ['./token.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [contentDensityObserverProviders()]\n})\nexport class TokenComponent implements AfterViewInit, OnDestroy {\n /** Whether the token is disabled. */\n @Input()\n disabled = false;\n\n /** @hidden */\n @ViewChild('tokenWrapperElement')\n tokenWrapperElement: ElementRef;\n\n /** @hidden */\n @ViewChild('content')\n readonly _content: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild('viewContainer', { read: ViewContainerRef })\n readonly _viewContainer: ViewContainerRef;\n\n private _selected = false;\n\n private _subscriptions = new Subscription();\n\n /** Whether the token is selected. */\n @Input()\n get selected(): boolean {\n return this._selected;\n }\n\n set selected(val: boolean) {\n if (this._selected !== val) {\n this._cdRef.markForCheck();\n }\n this._selected = val;\n }\n\n /** Whether the token is read-only. */\n @Input()\n readOnly = false;\n\n /** label for close icon */\n @Input()\n deleteButtonLabel = 'Deletable';\n\n /** role description for token */\n @Input()\n ariaRoleDescription = 'token';\n\n /** Emitted when the *x* icon is clicked. Specifically, any pseudo-element. */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onCloseClick: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();\n\n /** Emitted when token should be removed */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onRemove: EventEmitter<void> = new EventEmitter<void>();\n\n /** Emitted when a token is clicked. */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n onTokenClick: EventEmitter<KeyboardEvent> = new EventEmitter<KeyboardEvent>();\n\n constructor(\n public elementRef: ElementRef,\n private _cdRef: ChangeDetectorRef,\n readonly _contentDensityObserver: ContentDensityObserver\n ) {}\n\n /** @hidden */\n ngAfterViewInit(): void {\n this._viewContainer.createEmbeddedView(this._content);\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n /** @hidden */\n closeClickHandler(event?): void {\n if (event) {\n event.stopPropagation();\n if (!this.disabled) {\n this.onCloseClick.emit(event);\n }\n }\n }\n\n /** @hidden */\n tokenClickHandler(event): void {\n this.onTokenClick.emit(event);\n }\n}\n","<span\n #tokenWrapperElement\n class=\"fd-token\"\n role=\"option\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\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\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n tabindex=\"-1\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n","import {\n AfterContentInit,\n AfterViewChecked,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n Renderer2,\n ViewChild,\n ViewChildren,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { A, BACKSPACE, DELETE, ENTER, LEFT_ARROW, RIGHT_ARROW, SPACE } from '@angular/cdk/keycodes';\nimport { fromEvent, Subject, Subscription } from 'rxjs';\nimport { filter, takeUntil, tap } from 'rxjs/operators';\nimport { FormControlComponent } from '@fundamental-ngx/core/form';\nimport { applyCssClass, CssClassBuilder, KeyUtil, RtlService } from '@fundamental-ngx/core/utils';\nimport { TokenComponent } from './token.component';\nimport { ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\n\n@Component({\n selector: 'fd-tokenizer',\n templateUrl: './tokenizer.component.html',\n styleUrls: ['./tokenizer.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [contentDensityObserverProviders()]\n})\nexport class TokenizerComponent\n implements AfterViewChecked, AfterViewInit, AfterContentInit, OnDestroy, CssClassBuilder, OnInit, OnChanges\n{\n /** user's custom classes */\n @Input()\n class: string;\n\n /** Disables possibility to remove tokens by keyboard */\n @Input()\n disableKeyboardDeletion = false;\n\n /** role description for tokenizer component */\n @Input()\n ariaRoleDescription = 'tokenizer';\n\n /** @hidden */\n @ContentChildren(forwardRef(() => TokenComponent))\n tokenList: QueryList<TokenComponent>;\n\n /** @hidden */\n @ContentChild(forwardRef(() => FormControlComponent))\n input: FormControlComponent;\n\n /** @hidden */\n @ViewChild('tokenizerInner')\n tokenizerInnerEl: ElementRef;\n\n /** @hidden */\n @ViewChild('moreElement')\n moreElement: ElementRef;\n\n /** @hidden */\n @ViewChild('inputGroupAddOn') set content(content: ElementRef) {\n this.inputGroupAddonEl = content;\n }\n\n /** @hidden */\n @ViewChildren('viewContainer', { read: ViewContainerRef })\n readonly _viewContainer: QueryList<ViewContainerRef>;\n\n /** @hidden */\n get _hiddenTokens(): TokenComponent[] {\n return this.tokenList.filter((token) => token.elementRef.nativeElement.style.display === 'none');\n }\n\n /**\n * Component is in compact mode, determined by the consumer\n */\n get compact(): boolean {\n return this._contentDensityObserver.isCompact;\n }\n\n /** @hidden */\n inputGroupAddonEl: ElementRef;\n\n /** Whether to use cozy visuals but compact collapsing behavior. */\n @Input()\n compactCollapse = false;\n\n /** Whether tokenizer should have fake focus indicator, when input is focused inside*/\n @Input()\n tokenizerFocusable = true;\n\n /** The value for the tokenizer input */\n @Input()\n inputValue: string;\n\n /** Icon of the button on the right of the input field. */\n @Input()\n glyph: string;\n\n /** Word to use for when there are extra tokens. */\n @Input()\n moreTerm = 'more';\n\n /** @hidden */\n @Input()\n open: boolean;\n\n /** Event emitted when the search term changes. Use *$event* to access the new term. */\n @Output()\n readonly moreClickedEvent: EventEmitter<any> = new EventEmitter<any>();\n\n /** @hidden */\n previousElementWidth: number;\n\n /** @hidden */\n moreTokensLeft: Array<TokenComponent> = [];\n\n /** @hidden */\n moreTokensRight: Array<TokenComponent> = [];\n\n /** @hidden */\n previousTokenCount: number;\n\n /** @hidden */\n tokenListChangesSubscription: Subscription;\n\n /** @hidden */\n tokenListClickSubscriptions: Subscription[] = [];\n\n /** @hidden */\n hiddenCozyTokenCount = 0;\n\n /** @hidden Used to add focus to tokenizer element */\n _tokenizerHasFocus = false;\n\n /** @hidden */\n _showOverflowPopover = true;\n\n /** @hidden */\n /* Variable which will keep the index of the first token pressed in the tokenizer*/\n private _firstElementInSelection: number | null = null;\n\n /** @hidden */\n /* Variable which will keep the index of the last token pressed in the tokenizer*/\n private _lastElementInSelection: number | null = null;\n\n /** @hidden */\n /* Flag which will say if the last keyboard and click operation they used was using control*/\n private _ctrlPrevious: boolean;\n\n /** @hidden */\n /* Flag which will say if they held shift and clicked highlighting elements before or*/\n private _directionShiftIsRight: boolean | null = null;\n\n /** An RxJS Subject that will kill the data stream upon destruction (for unsubscribing) */\n private readonly _onDestroy$: Subject<void> = new Subject<void>();\n\n constructor(\n readonly _contentDensityObserver: ContentDensityObserver,\n private _elementRef: ElementRef,\n private _cdRef: ChangeDetectorRef,\n @Optional() private _rtlService: RtlService,\n private _renderer: Renderer2\n ) {\n this._renderer.listen('window', 'click', (e: Event) => {\n if (this.elementRef().nativeElement.contains(e.target) === false) {\n this.tokenList.forEach((token) => {\n token.selected = false;\n });\n }\n });\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n if (this.input && this.input.elementRef()) {\n this._inputKeydownEvent();\n }\n }\n\n /** @hidden */\n ngAfterViewChecked(): void {\n if (this.tokenList) {\n this.previousTokenCount = this.tokenList.length;\n }\n this.handleTokenClickSubscriptions();\n // watch for changes to the tokenList and attempt to expand/collapse tokens as needed\n if (this.tokenListChangesSubscription) {\n this.tokenListChangesSubscription.unsubscribe();\n }\n this.tokenListChangesSubscription = this.tokenList.changes.subscribe(() => {\n this._resetTokens();\n });\n this.tokenList.forEach((token) => {\n this.tokenListChangesSubscription.add(\n token.onCloseClick.subscribe(() => {\n this._resetTokens();\n })\n );\n });\n if (!this.compact && !this.compactCollapse) {\n this._handleInitCozyTokenCount();\n }\n }\n\n /** @hidden */\n ngAfterContentInit(): void {\n this._listenElementEvents();\n this.previousElementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n this.onResize();\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n if (this.tokenListChangesSubscription) {\n this.tokenListChangesSubscription.unsubscribe();\n }\n this._onDestroy$.next();\n this._onDestroy$.complete();\n this._unsubscribeClicks();\n }\n\n /** @hidden */\n ngOnInit(): void {\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n ngOnChanges(): void {\n this.buildComponentCssClass();\n }\n\n @applyCssClass\n /** CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n buildComponentCssClass(): string[] {\n return [this.class];\n }\n\n elementRef(): ElementRef {\n return this._elementRef;\n }\n\n /** @hidden */\n handleTokenClickSubscriptions(): void {\n this._unsubscribeClicks();\n this.tokenList.forEach((token, index) => {\n this.tokenListClickSubscriptions.push(\n token.onTokenClick.subscribe((event) => {\n event.stopPropagation();\n this.focusTokenElement(index);\n if (this._isControlKey(event)) {\n this._ctrlSelected(token, index);\n } else if (!event.shiftKey || this._ctrlPrevious) {\n this._basicSelected(token, index);\n } else if (event.shiftKey) {\n this.resetFirstAndLastElement();\n this._shiftSelected(index);\n }\n })\n );\n });\n }\n\n /** @hidden */\n focusTokenElement(newIndex: number): HTMLElement | undefined {\n let elementToFocus: HTMLElement | undefined;\n const tokenListArray: TokenComponent[] = this.tokenList.toArray();\n if (tokenListArray[newIndex]) {\n elementToFocus = tokenListArray[newIndex].tokenWrapperElement.nativeElement;\n // element needs tabindex in order to be focused\n elementToFocus!.setAttribute('tabindex', '0');\n elementToFocus!.focus();\n this.addKeyboardListener(elementToFocus!, newIndex);\n }\n\n return elementToFocus;\n }\n\n /** @hidden */\n addKeyboardListener(element: HTMLElement, newIndex: number): void {\n // function needs to be defined in order to be referenced later by addEventListener/removeEventListener\n const handleFunctionReference = (e): void => {\n if (newIndex || newIndex === 0) {\n this.handleKeyDown(e, newIndex);\n }\n };\n element.addEventListener('keydown', handleFunctionReference);\n element.addEventListener('blur', () => {\n element.setAttribute('tabindex', '-1');\n element.removeEventListener('keydown', handleFunctionReference);\n });\n }\n\n /** @hidden */\n @HostListener('keydown', ['$event'])\n keyDown(keyboardEvent: KeyboardEvent): void {\n if (\n KeyUtil.isKeyCode(keyboardEvent, [DELETE, BACKSPACE]) &&\n (!this._isInputFocused() || this._tokensSelected()) &&\n !this.disableKeyboardDeletion\n ) {\n const selectedElements = this._getActiveTokens();\n const focusedTokenIndex = this._getFocusedTokenIndex();\n selectedElements.forEach((element) => element.onCloseClick.emit());\n if (selectedElements.length > 0) {\n if (KeyUtil.isKeyCode(keyboardEvent, DELETE)) {\n this._focusInput();\n } else {\n this.focusTokenElement(focusedTokenIndex - 1);\n }\n }\n }\n\n if (\n KeyUtil.isKeyCode(keyboardEvent, BACKSPACE) &&\n this._isInputFocused() &&\n !this._getInputValue() &&\n !this.disableKeyboardDeletion\n ) {\n this.focusTokenElement(this.tokenList.length - 1);\n }\n }\n\n /** @hidden */\n @HostListener('window:resize', [])\n onResize(): void {\n if (this._elementRef) {\n const elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n this._resetTokens();\n this.previousElementWidth = elementWidth;\n }\n }\n\n /** @hidden */\n handleKeyDown(event: KeyboardEvent, fromIndex: number): void {\n let newIndex: number | undefined;\n const rtl = this._rtlService && this._rtlService.rtl ? this._rtlService.rtl.getValue() : false;\n if (KeyUtil.isKeyCode(event, SPACE) && !this._isInputFocused()) {\n const token = this.tokenList.find((_, index) => index === fromIndex);\n this.tokenList.forEach((shadowedToken) => {\n if (shadowedToken !== token) {\n shadowedToken.selected = false;\n }\n });\n token && (token.selected = !token.selected);\n event.preventDefault();\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n this._focusInput();\n } else if ((KeyUtil.isKeyCode(event, LEFT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, RIGHT_ARROW) && rtl)) {\n this._handleArrowLeft(fromIndex);\n newIndex = fromIndex - 1;\n } else if ((KeyUtil.isKeyCode(event, RIGHT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, LEFT_ARROW) && rtl)) {\n this._handleArrowRight(fromIndex);\n newIndex = fromIndex + 1;\n } else if (KeyUtil.isKeyCode(event, A) && !this._getInputValue() && this._isControlKey(event)) {\n event.preventDefault();\n this.tokenList.forEach((token) => (token.selected = true));\n }\n if (\n newIndex === this.tokenList.length &&\n ((KeyUtil.isKeyCode(event, RIGHT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, LEFT_ARROW) && rtl))\n ) {\n this._focusInput();\n } else if (newIndex! > this.tokenList.length - this.moreTokensRight.length && this._isInputFocused()) {\n this.focusTokenElement(newIndex! - this.moreTokensRight.length);\n } else if (newIndex || newIndex === 0) {\n this.focusTokenElement(newIndex);\n }\n }\n\n /** @hidden */\n getCombinedTokenWidth(): number {\n let totalTokenWidth = 0;\n // get the width of each token\n this.tokenList.forEach((token) => {\n totalTokenWidth = totalTokenWidth + token.elementRef.nativeElement.getBoundingClientRect().width;\n });\n // add input width\n if (this.input && this.input.elementRef()) {\n totalTokenWidth = totalTokenWidth + this.input.elementRef().nativeElement.getBoundingClientRect().width;\n }\n // add the width of the \"____ more\" element\n if (this.moreTokensLeft.length > 0 && this.moreElement && this.moreElement.nativeElement) {\n totalTokenWidth = totalTokenWidth + this.moreElement.nativeElement.getBoundingClientRect().width;\n }\n // add the input group addon\n if (this.inputGroupAddonEl && this.inputGroupAddonEl.nativeElement) {\n totalTokenWidth = totalTokenWidth + this.inputGroupAddonEl.nativeElement.getBoundingClientRect().width;\n }\n\n return totalTokenWidth;\n }\n\n /** @hidden */\n moreClicked(): void {\n this.moreClickedEvent.emit();\n }\n\n /** Removes all selected tokens */\n removeSelectedTokens(): void {\n const selectedElements = this._getActiveTokens();\n selectedElements.forEach((element) => element.onRemove.emit());\n }\n\n /** @hidden */\n private _handleArrowLeft(fromIndex: number): void {\n // if the leftmost visible token is selected, and there are moreTokensLeft, need to display a moreTokenLeft\n if (fromIndex === this.moreTokensLeft.length) {\n const poppedToken = this.moreTokensLeft.pop();\n if (poppedToken) {\n this._makeElementVisible(poppedToken.elementRef);\n }\n // and then hide any tokens from the right that no longer fit\n this._collapseTokens('right');\n\n this._cdRef.detectChanges();\n }\n }\n\n /** @hidden */\n private _handleArrowRight(fromIndex: number): void {\n if (fromIndex === this.tokenList.length - this.moreTokensRight.length - 1 && this.moreTokensRight.length) {\n const poppedToken = this.moreTokensRight.pop();\n if (poppedToken) {\n this._makeElementVisible(poppedToken.elementRef);\n }\n // and then hide any tokens from the left that no longer fit\n this._collapseTokens('left');\n\n this._cdRef.detectChanges();\n }\n }\n\n /** @hidden */\n private _collapseTokens(side?: string): void {\n if (this.compact || this.compactCollapse) {\n this._cdRef.detectChanges();\n this._viewContainer.forEach((viewContainer) => viewContainer.clear());\n this.tokenList.forEach((token) => token._viewContainer.createEmbeddedView(token._content));\n\n let elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n let combinedTokenWidth = this.getCombinedTokenWidth(); // the combined width of all tokens, the \"____ more\" text, and the input\n let i = 0;\n /*\n When resizing, we want to collapse the tokens on the left first. However when the user is navigating through\n a group of overflowing tokens using the arrow left key, we may need to hide tokens on the right. So if this\n function has been called with the param 'right' it will collapse tokens from the right side of the list rather\n than the (default) left side.\n */\n if (side === 'right') {\n i = this.tokenList.length - 1;\n }\n while (combinedTokenWidth > elementWidth && (side === 'right' ? i >= 0 : i < this.tokenList.length)) {\n // loop through the tokens and hide them until the combinedTokenWidth fits in the elementWidth\n const token = this.tokenList.find((item, index) => index === i);\n const moreTokens = side === 'right' ? this.moreTokensRight : this.moreTokensLeft;\n\n if (token) {\n if (moreTokens.indexOf(token) === -1) {\n moreTokens.push(token);\n }\n token.elementRef.nativeElement.style.display = 'none';\n }\n // get the new elementWidth and combinedTokenWidth as these will have changed after setting a token display to 'none'\n elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n combinedTokenWidth = this.getCombinedTokenWidth();\n side === 'right' ? i-- : i++;\n }\n\n this._cdRef.detectChanges();\n this._hiddenTokens.forEach((hiddenToken, index) => {\n hiddenToken._viewContainer.clear();\n this._viewContainer.get(index)?.createEmbeddedView(hiddenToken._content);\n });\n } else {\n this._getHiddenCozyTokenCount();\n }\n }\n\n /** @hidden */\n private _resetTokens(): void {\n this.moreTokensLeft = [];\n this.moreTokensRight = [];\n if (this.compact || this.compactCollapse) {\n this.tokenList.forEach((token) => {\n this._makeElementVisible(token.elementRef);\n });\n this._cdRef.markForCheck();\n this._collapseTokens();\n } else {\n this._getHiddenCozyTokenCount();\n }\n this.handleTokenClickSubscriptions();\n this.previousTokenCount = this.tokenList.length;\n }\n\n /** @hidden */\n private _getHiddenCozyTokenCount(): void {\n const elementLeft = this._elementRef.nativeElement.getBoundingClientRect().left;\n this.hiddenCozyTokenCount = 0;\n this.tokenList.forEach((token) => {\n if (\n token.tokenWrapperElement &&\n token.tokenWrapperElement.nativeElement.getBoundingClientRect().right < elementLeft\n ) {\n this.hiddenCozyTokenCount += 1;\n }\n });\n\n this._cdRef.detectChanges();\n }\n\n /** @hidden */\n private _handleInitCozyTokenCount(): void {\n // because justify-content breaks scrollbar, it cannot be used on cozy screens, so use JS to scroll to the end\n this.tokenizerInnerEl.nativeElement.scrollLeft = this.tokenizerInnerEl.nativeElement.scrollWidth;\n this._getHiddenCozyTokenCount();\n if (this.hiddenCozyTokenCount > 0) {\n // need to do this again in case \"____ more\" text was added\n this.tokenizerInnerEl.nativeElement.scrollLeft = this.tokenizerInnerEl.nativeElement.scrollWidth;\n this._getHiddenCozyTokenCount();\n }\n }\n\n /** @hidden */\n private _makeElementVisible(elementRef: ElementRef): void {\n elementRef.nativeElement.style.display = 'inline-block';\n elementRef.nativeElement.style.visibility = 'visible';\n }\n\n private _unsubscribeClicks(): void {\n if (this.tokenListClickSubscriptions && this.tokenListClickSubscriptions.length) {\n this.tokenListClickSubscriptions.forEach((subscription) => {\n subscription.unsubscribe();\n });\n }\n }\n\n private _inputKeydownEvent(): void {\n this.input.elementRef().nativeElement.addEventListener('keydown', (event) => {\n this.handleKeyDown(event, this.tokenList.length);\n });\n }\n\n /** @hidden Method which handles what happens to token when it is clicked and no key is being held down.*/\n private _basicSelected(token, index): void {\n this.tokenList.forEach((shadowedToken) => {\n if (shadowedToken !== token) {\n shadowedToken.selected = false;\n }\n });\n this._firstElementInSelection = index;\n this._lastElementInSelection = index;\n token.selected = true;\n this._ctrlPrevious = false;\n }\n\n /** @hidden Restart first and last elements for shift selection.*/\n private resetFirstAndLastElement(): void {\n const reset = !this.tokenList.some((token) => token.selected);\n if (reset) {\n this._firstElementInSelection = null;\n this._lastElementInSelection = null;\n }\n }\n\n /** @hidden Method which handles what happens to token when it is clicked and the shift key is being held down.*/\n private _shiftSelected(index): void {\n if (!this._firstElementInSelection && !this._lastElementInSelection) {\n this._firstElementInSelection = index;\n this._lastElementInSelection = index;\n this._directionShiftIsRight = null;\n } else {\n if (this._firstElementInSelection && index < this._firstElementInSelection) {\n if (this._directionShiftIsRight) {\n this._lastElementInSelection = this._firstElementInSelection;\n }\n this._directionShiftIsRight = false;\n this._firstElementInSelection = index;\n } else if (this._lastElementInSelection && index > this._lastElementInSelection) {\n if (!this._directionShiftIsRight) {\n this._firstElementInSelection = this._lastElementInSelection;\n }\n this._directionShiftIsRight = true;\n this._lastElementInSelection = index;\n }\n if (!this._directionShiftIsRight) {\n this._firstElementInSelection = index;\n } else if (this._directionShiftIsRight) {\n this._lastElementInSelection = index;\n }\n }\n\n this.tokenList.forEach((token, indexOfToken) => {\n token.selected =\n this._firstElementInSelection != null &&\n this._lastElementInSelection != null &&\n indexOfToken >= this._firstElementInSelection &&\n indexOfToken <= this._lastElementInSelection;\n });\n this._ctrlPrevious = false;\n }\n\n /** @hidden Method which handles what happens to token when it is clicked and the control or meta key is being held down.*/\n private _ctrlSelected(token, index): void {\n this._firstElementInSelection = null;\n this._lastElementInSelection = null;\n const selected = token.selected;\n token.selected = true;\n if (selected) {\n token.selected = false;\n this.tokenList.forEach((element, indexOfToken) => {\n if (!this._firstElementInSelection) {\n if (element.selected) {\n this._firstElementInSelection = indexOfToken;\n }\n } else {\n this._lastElementInSelection = indexOfToken;\n }\n });\n if (index === this._lastElementInSelection) {\n this._lastElementInSelection = this._lastElementInSelection! - 1;\n }\n if (index === this._firstElementInSelection) {\n this._firstElementInSelection = this._firstElementInSelection! - 1;\n }\n }\n this._ctrlPrevious = true;\n }\n\n /** Get selected and focused tokens */\n private _getActiveTokens(): TokenComponent[] {\n return this.tokenList.filter((item) => item.selected || this._isTokenFocused(item));\n }\n\n /** @hidden */\n private _getFocusedTokenIndex(): number {\n return this.tokenList.toArray().findIndex((token) => this._isTokenFocused(token));\n }\n\n /** @hidden */\n private _isTokenFocused(token: TokenComponent): boolean {\n return token.tokenWrapperElement.nativeElement === document.activeElement;\n }\n\n /** @hidden */\n private _isInputFocused(): boolean {\n return document.activeElement === this.input.elementRef().nativeElement;\n }\n\n /** @hidden */\n private _tokensSelected(): boolean {\n return this.tokenList.some((t) => t.selected);\n }\n\n /** @hidden */\n private _getInputValue(): string {\n return this.input.elementRef().nativeElement.value;\n }\n\n /** @hidden */\n private _focusInput(): void {\n this.input.elementRef().nativeElement.focus();\n }\n\n /** @hidden */\n private _isControlKey(keyboardEvent: KeyboardEvent): boolean {\n return keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n }\n\n /** @hidden */\n private _listenElementEvents(): void {\n fromEvent<Event>(this.elementRef().nativeElement, 'focus', { capture: true })\n .pipe(\n filter((event) => (event['target'] as any)?.tagName === 'INPUT' && this.tokenizerFocusable),\n tap(() => {\n this._tokenizerHasFocus = true;\n this._cdRef.markForCheck();\n }),\n takeUntil(this._onDestroy$)\n )\n .subscribe();\n fromEvent(this.elementRef().nativeElement, 'blur', { capture: true })\n .pipe(\n tap(() => {\n this._tokenizerHasFocus = false;\n this._cdRef.markForCheck();\n }),\n takeUntil(this._onDestroy$)\n )\n .subscribe();\n }\n}\n","<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 <ng-content select=\"fd-token\"></ng-content>\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 tabindex=\"-1\"\n [attr.aria-label]=\"token.deleteButtonLabel\"\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 #moreElement\n >\n <ng-container *ngIf=\"compact || compactCollapse\">\n {{ moreTokensLeft.length + moreTokensRight.length }} {{ moreTerm }}\n </ng-container>\n <ng-container *ngIf=\"!compact && !compactCollapse\"> {{ hiddenCozyTokenCount }} {{ moreTerm }} </ng-container>\n </span>\n</ng-template>\n","import { Directive, ElementRef, Input, OnChanges, OnInit } from '@angular/core';\nimport { applyCssClass } from '@fundamental-ngx/core/utils';\nimport { CssClassBuilder } from '@fundamental-ngx/core/utils';\n\n@Directive({\n // TODO to be discussed\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[fd-tokenizer-input]'\n})\nexport class TokenizerInputDirective implements OnInit, OnChanges, CssClassBuilder {\n /** user's custom classes */\n @Input()\n class: string;\n\n @applyCssClass\n /** CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n buildComponentCssClass(): string[] {\n return ['fd-tokenizer__input', this.class];\n }\n\n /** @hidden */\n constructor(private _elementRef: ElementRef) {}\n\n /** @hidden */\n ngOnInit(): void {\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n ngOnChanges(): void {\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n elementRef(): ElementRef<any> {\n return this._elementRef;\n }\n}\n","import { CONTENT_DENSITY_DIRECTIVE, DeprecatedCompactDirective } from '@fundamental-ngx/core/content-density';\nimport { Directive, forwardRef } from '@angular/core';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: 'fd-tokenizer[compact], fd-token[compact]',\n providers: [\n {\n provide: CONTENT_DENSITY_DIRECTIVE,\n useExisting: forwardRef(() => DeprecatedTokenizerContentDensityDirective)\n }\n ]\n})\nexport class DeprecatedTokenizerContentDensityDirective extends DeprecatedCompactDirective {\n constructor() {\n super('fd-tokenizer[compact], fd-token');\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TokenComponent } from './token.component';\nimport { TokenizerComponent } from './tokenizer.component';\nimport { TokenizerInputDirective } from './token-input.directive';\nimport { InputGroupModule } from '@fundamental-ngx/core/input-group';\nimport { ButtonModule } from '@fundamental-ngx/core/button';\nimport { PopoverModule } from '@fundamental-ngx/core/popover';\nimport { ListModule } from '@fundamental-ngx/core/list';\nimport { DeprecatedTokenizerContentDensityDirective } from './deprecated-tokenizer-content-density.directive';\nimport { ContentDensityModule } from '@fundamental-ngx/core/content-density';\n\n@NgModule({\n declarations: [\n TokenComponent,\n TokenizerComponent,\n TokenizerInputDirective,\n DeprecatedTokenizerContentDensityDirective\n ],\n imports: [CommonModule, InputGroupModule, ButtonModule, PopoverModule, ListModule, ContentDensityModule],\n exports: [\n TokenComponent,\n TokenizerComponent,\n TokenizerInputDirective,\n DeprecatedTokenizerContentDensityDirective,\n ContentDensityModule\n ]\n})\nexport class TokenModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAkBA;;;;MAYa,cAAc;IA6DvB,YACW,UAAsB,EACrB,MAAyB,EACxB,uBAA+C;QAFjD,eAAU,GAAV,UAAU,CAAY;QACrB,WAAM,GAAN,MAAM,CAAmB;QACxB,4BAAuB,GAAvB,uBAAuB,CAAwB;;QA7D5D,aAAQ,GAAG,KAAK,CAAC;QAcT,cAAS,GAAG,KAAK,CAAC;QAElB,mBAAc,GAAG,IAAI,YAAY,EAAE,CAAC;;QAiB5C,aAAQ,GAAG,KAAK,CAAC;;QAIjB,sBAAiB,GAAG,WAAW,CAAC;;QAIhC,wBAAmB,GAAG,OAAO,CAAC;;QAKrB,iBAAY,GAA6B,IAAI,YAAY,EAAc,CAAC;;QAKxE,aAAQ,GAAuB,IAAI,YAAY,EAAQ,CAAC;;;QAKjE,iBAAY,GAAgC,IAAI,YAAY,EAAiB,CAAC;KAM1E;;IA3CJ,IACI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;KACzB;IAED,IAAI,QAAQ,CAAC,GAAY;QACrB,IAAI,IAAI,CAAC,SAAS,KAAK,GAAG,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;SAC9B;QACD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;KACxB;;IAoCD,eAAe;QACX,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACzD;;IAGD,WAAW;QACP,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;KACrC;;IAGD,iBAAiB,CAAC,KAAM;QACpB,IAAI,KAAK,EAAE;YACP,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAChB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACjC;SACJ;KACJ;;IAGD,iBAAiB,CAAC,KAAK;QACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACjC;;2GA1FQ,cAAc;+FAAd,cAAc,oSAFZ,CAAC,+BAA+B,EAAE,CAAC,yTAgBV,gBAAgB,6BC5CxD,84BA6BA;2FDCa,cAAc;kBAR1B,SAAS;+BACI,UAAU,iBAGL,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,MAAM,aACpC,CAAC,+BAA+B,EAAE,CAAC;sKAK9C,QAAQ;sBADP,KAAK;gBAKN,mBAAmB;sBADlB,SAAS;uBAAC,qBAAqB;gBAKvB,QAAQ;sBADhB,SAAS;uBAAC,SAAS;gBAKX,cAAc;sBADtB,SAAS;uBAAC,eAAe,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;gBASlD,QAAQ;sBADX,KAAK;gBAcN,QAAQ;sBADP,KAAK;gBAKN,iBAAiB;sBADhB,KAAK;gBAKN,mBAAmB;sBADlB,KAAK;gBAMG,YAAY;sBAFpB,MAAM;gBAOE,QAAQ;sBAFhB,MAAM;;;QAOP,YAAY;sBAFX,MAAM;;;ME7CE,kBAAkB;IAiI3B,YACa,uBAA+C,EAChD,WAAuB,EACvB,MAAyB,EACb,WAAuB,EACnC,SAAoB;QAJnB,4BAAuB,GAAvB,uBAAuB,CAAwB;QAChD,gBAAW,GAAX,WAAW,CAAY;QACvB,WAAM,GAAN,MAAM,CAAmB;QACb,gBAAW,GAAX,WAAW,CAAY;QACnC,cAAS,GAAT,SAAS,CAAW;;QA7HhC,4BAAuB,GAAG,KAAK,CAAC;;QAIhC,wBAAmB,GAAG,WAAW,CAAC;;QA4ClC,oBAAe,GAAG,KAAK,CAAC;;QAIxB,uBAAkB,GAAG,IAAI,CAAC;;QAY1B,aAAQ,GAAG,MAAM,CAAC;;QAQT,qBAAgB,GAAsB,IAAI,YAAY,EAAO,CAAC;;QAMvE,mBAAc,GAA0B,EAAE,CAAC;;QAG3C,oBAAe,GAA0B,EAAE,CAAC;;QAS5C,gCAA2B,GAAmB,EAAE,CAAC;;QAGjD,yBAAoB,GAAG,CAAC,CAAC;;QAGzB,uBAAkB,GAAG,KAAK,CAAC;;QAG3B,yBAAoB,GAAG,IAAI,CAAC;;;QAIpB,6BAAwB,GAAkB,IAAI,CAAC;;;QAI/C,4BAAuB,GAAkB,IAAI,CAAC;;;QAQ9C,2BAAsB,GAAmB,IAAI,CAAC;;QAGrC,gBAAW,GAAkB,IAAI,OAAO,EAAQ,CAAC;QAS9D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAQ;YAC9C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE;gBAC9D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK;oBACzB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;iBAC1B,CAAC,CAAC;aACN;SACJ,CAAC,CAAC;KACN;;IA/GD,IAAkC,OAAO,CAAC,OAAmB;QACzD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;KACpC;;IAOD,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;KACpG;;;;IAKD,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC;KACjD;;IAgGD,eAAe;QACX,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE;YACvC,IAAI,CAAC,kBAAkB,EAAE,CAAC;SAC7B;KACJ;;IAGD,kBAAkB;QACd,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;SACnD;QACD,IAAI,CAAC,6BAA6B,EAAE,CAAC;;QAErC,IAAI,IAAI,CAAC,4BAA4B,EAAE;YACnC,IAAI,CAAC,4BAA4B,CAAC,WAAW,EAAE,CAAC;SACnD;QACD,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;YACjE,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK;YACzB,IAAI,CAAC,4BAA4B,CAAC,GAAG,CACjC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC;gBACzB,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB,CAAC,CACL,CAAC;SACL,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACxC,IAAI,CAAC,yBAAyB,EAAE,CAAC;SACpC;KACJ;;IAGD,kBAAkB;QACd,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;QACzF,IAAI,CAAC,QAAQ,EAAE,CAAC;KACnB;;IAGD,WAAW;QACP,IAAI,IAAI,CAAC,4BAA4B,EAAE;YACnC,IAAI,CAAC,4BAA4B,CAAC,WAAW,EAAE,CAAC;SACnD;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC7B;;IAGD,QAAQ;QACJ,IAAI,CAAC,sBAAsB,EAAE,CAAC;KACjC;;IAGD,WAAW;QACP,IAAI,CAAC,sBAAsB,EAAE,CAAC;KACjC;;;;;IAOD,sBAAsB;QAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACvB;IAED,UAAU;QACN,OAAO,IAAI,CAAC,WAAW,CAAC;KAC3B;;IAGD,6BAA6B;QACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK;YAChC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CACjC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK;gBAC/B,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;oBAC3B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;iBACpC;qBAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE;oBAC9C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;iBACrC;qBAAM,IAAI,KAAK,CAAC,QAAQ,EAAE;oBACvB,IAAI,CAAC,wBAAwB,EAAE,CAAC;oBAChC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;iBAC9B;aACJ,CAAC,CACL,CAAC;SACL,CAAC,CAAC;KACN;;IAGD,iBAAiB,CAAC,QAAgB;QAC9B,IAAI,cAAuC,CAAC;QAC5C,MAAM,cAAc,GAAqB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAClE,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE;YAC1B,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,aAAa,CAAC;;YAE5E,cAAe,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAC9C,cAAe,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,mBAAmB,CAAC,cAAe,EAAE,QAAQ,CAAC,CAAC;SACvD;QAED,OAAO,cAAc,CAAC;KACzB;;IAGD,mBAAmB,CAAC,OAAoB,EAAE,QAAgB;;QAEtD,MAAM,uBAAuB,GAAG,CAAC,CAAC;YAC9B,IAAI,QAAQ,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAC5B,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;aACnC;SACJ,CAAC;QACF,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;QAC7D,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE;YAC7B,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;SACnE,CAAC,CAAC;KACN;;IAID,OAAO,CAAC,aAA4B;QAChC,IACI,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;aACpD,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACnD,CAAC,IAAI,CAAC,uBAAuB,EAC/B;YACE,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACvD,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YACnE,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,IAAI,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE;oBAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;iBACtB;qBAAM;oBACH,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;iBACjD;aACJ;SACJ;QAED,IACI,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC;YAC3C,IAAI,CAAC,eAAe,EAAE;YACtB,CAAC,IAAI,CAAC,cAAc,EAAE;YACtB,CAAC,IAAI,CAAC,uBAAuB,EAC/B;YACE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACrD;KACJ;;IAID,QAAQ;QACJ,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;YAClF,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,oBAAoB,GAAG,YAAY,CAAC;SAC5C;KACJ;;IAGD,aAAa,CAAC,KAAoB,EAAE,SAAiB;QACjD,IAAI,QAA4B,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC;QAC/F,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;YAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,KAAK,SAAS,CAAC,CAAC;YACrE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,aAAa;gBACjC,IAAI,aAAa,KAAK,KAAK,EAAE;oBACzB,aAAa,CAAC,QAAQ,GAAG,KAAK,CAAC;iBAClC;aACJ,CAAC,CAAC;YACH,KAAK,KAAK,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5C,KAAK,CAAC,cAAc,EAAE,CAAC;SAC1B;aAAM,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;YACxC,IAAI,CAAC,WAAW,EAAE,CAAC;SACtB;aAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE;YACzG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACjC,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC;SAC5B;aAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE;YACzG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAClC,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC;SAC5B;aAAM,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;YAC3F,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,MAAM,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;SAC9D;QACD,IACI,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM;aACjC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,EACpG;YACE,IAAI,CAAC,WAAW,EAAE,CAAC;SACtB;aAAM,IAAI,QAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAClG,IAAI,CAAC,iBAAiB,CAAC,QAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SACnE;aAAM,IAAI,QAAQ,IAAI,QAAQ,KAAK,CAAC,EAAE;YACnC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;SACpC;KACJ;;IAGD,qBAAqB;QACjB,IAAI,eAAe,GAAG,CAAC,CAAC;;QAExB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK;YACzB,eAAe,GAAG,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;SACpG,CAAC,CAAC;;QAEH,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE;YACvC,eAAe,GAAG,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;SAC3G;;QAED,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;YACtF,eAAe,GAAG,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;SACpG;;QAED,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;YAChE,eAAe,GAAG,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;SAC1G;QAED,OAAO,eAAe,CAAC;KAC1B;;IAGD,WAAW;QACP,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;KAChC;;IAGD,oBAAoB;QAChB,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACjD,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;KAClE;;IAGO,gBAAgB,CAAC,SAAiB;;QAEtC,IAAI,SAAS,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;YAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;YAC9C,IAAI,WAAW,EAAE;gBACb,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;aACpD;;YAED,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAE9B,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;SAC/B;KACJ;;IAGO,iBAAiB,CAAC,SAAiB;QACvC,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;YACtG,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;YAC/C,IAAI,WAAW,EAAE;gBACb,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;aACpD;;YAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAE7B,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;SAC/B;KACJ;;IAGO,eAAe,CAAC,IAAa;QACjC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE;YACtC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,aAAa,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE3F,IAAI,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;YAChF,IAAI,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACtD,IAAI,CAAC,GAAG,CAAC,CAAC;;;;;;;YAOV,IAAI,IAAI,KAAK,OAAO,EAAE;gBAClB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;aACjC;YACD,OAAO,kBAAkB,GAAG,YAAY,KAAK,IAAI,KAAK,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;;gBAEjG,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;gBAChE,MAAM,UAAU,GAAG,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC;gBAEjF,IAAI,KAAK,EAAE;oBACP,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;wBAClC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;qBAC1B;oBACD,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;iBACzD;;gBAED,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;gBAC5E,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAClD,IAAI,KAAK,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;aAChC;YAED,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK;;gBAC1C,WAAW,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;gBACnC,MAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,0CAAE,kBAAkB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;aAC5E,CAAC,CAAC;SACN;aAAM;YACH,IAAI,CAAC,wBAAwB,EAAE,CAAC;SACnC;KACJ;;IAGO,YAAY;QAChB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE;YACtC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK;gBACzB,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;aAC9C,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;SAC1B;aAAM;YACH,IAAI,CAAC,wBAAwB,EAAE,CAAC;SACnC;QACD,IAAI,CAAC,6BAA6B,EAAE,CAAC;QACrC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;KACnD;;IAGO,wBAAwB;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC;QAChF,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK;YACzB,IACI,KAAK,CAAC,mBAAmB;gBACzB,KAAK,CAAC,mBAAmB,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,GAAG,WAAW,EACrF;gBACE,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;aAClC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;KAC/B;;IAGO,yBAAyB;;QAE7B,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,WAAW,CAAC;QACjG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,oBAAoB,GAAG,CAAC,EAAE;;YAE/B,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,WAAW,CAAC;YACjG,IAAI,CAAC,wBAAwB,EAAE,CAAC;SACnC;KACJ;;IAGO,mBAAmB,CAAC,UAAsB;QAC9C,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;QACxD,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;KACzD;IAEO,kBAAkB;QACtB,IAAI,IAAI,CAAC,2BAA2B,IAAI,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE;YAC7E,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,YAAY;gBAClD,YAAY,CAAC,WAAW,EAAE,CAAC;aAC9B,CAAC,CAAC;SACN;KACJ;IAEO,kBAAkB;QACtB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK;YACpE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;SACpD,CAAC,CAAC;KACN;;IAGO,cAAc,CAAC,KAAK,EAAE,KAAK;QAC/B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,aAAa;YACjC,IAAI,aAAa,KAAK,KAAK,EAAE;gBACzB,aAAa,CAAC,QAAQ,GAAG,KAAK,CAAC;aAClC;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;QACtC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;QACrC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;KAC9B;;IAGO,wBAAwB;QAC5B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;YACrC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;SACvC;KACJ;;IAGO,cAAc,CAAC,KAAK;QACxB,IAAI,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACjE,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;YACtC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;YACrC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;SACtC;aAAM;YACH,IAAI,IAAI,CAAC,wBAAwB,IAAI,KAAK,GAAG,IAAI,CAAC,wBAAwB,EAAE;gBACxE,IAAI,IAAI,CAAC,sBAAsB,EAAE;oBAC7B,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,wBAAwB,CAAC;iBAChE;gBACD,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;gBACpC,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;aACzC;iBAAM,IAAI,IAAI,CAAC,uBAAuB,IAAI,KAAK,GAAG,IAAI,CAAC,uBAAuB,EAAE;gBAC7E,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;oBAC9B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,uBAAuB,CAAC;iBAChE;gBACD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;gBACnC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;aACxC;YACD,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;gBAC9B,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;aACzC;iBAAM,IAAI,IAAI,CAAC,sBAAsB,EAAE;gBACpC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;aACxC;SACJ;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,YAAY;YACvC,KAAK,CAAC,QAAQ;gBACV,IAAI,CAAC,wBAAwB,IAAI,IAAI;oBACrC,IAAI,CAAC,uBAAuB,IAAI,IAAI;oBACpC,YAAY,IAAI,IAAI,CAAC,wBAAwB;oBAC7C,YAAY,IAAI,IAAI,CAAC,uBAAuB,CAAC;SACpD,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;KAC9B;;IAGO,aAAa,CAAC,KAAK,EAAE,KAAK;QAC9B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACrC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,IAAI,QAAQ,EAAE;YACV,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY;gBACzC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;oBAChC,IAAI,OAAO,CAAC,QAAQ,EAAE;wBAClB,IAAI,CAAC,wBAAwB,GAAG,YAAY,CAAC;qBAChD;iBACJ;qBAAM;oBACH,IAAI,CAAC,uBAAuB,GAAG,YAAY,CAAC;iBAC/C;aACJ,CAAC,CAAC;YACH,IAAI,KAAK,KAAK,IAAI,CAAC,uBAAuB,EAAE;gBACxC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAwB,GAAG,CAAC,CAAC;aACpE;YACD,IAAI,KAAK,KAAK,IAAI,CAAC,wBAAwB,EAAE;gBACzC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAyB,GAAG,CAAC,CAAC;aACtE;SACJ;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;KAC7B;;IAGO,gBAAgB;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;KACvF;;IAGO,qBAAqB;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;KACrF;;IAGO,eAAe,CAAC,KAAqB;QACzC,OAAO,KAAK,CAAC,mBAAmB,CAAC,aAAa,KAAK,QAAQ,CAAC,aAAa,CAAC;KAC7E;;IAGO,eAAe;QACnB,OAAO,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC;KAC3E;;IAGO,eAAe;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;KACjD;;IAGO,cAAc;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;KACtD;;IAGO,WAAW;QACf,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;KACjD;;IAGO,aAAa,CAAC,aAA4B;QAC9C,OAAO,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC;KACzD;;IAGO,oBAAoB;QACxB,SAAS,CAAQ,IAAI,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aACxE,IAAI,CACD,MAAM,CAAC,CAAC,KAAK,eAAM,OAAA,CAAA,MAAA,KAAK,CAAC,QAAQ,CAAS,0CAAE,OAAO,MAAK,OAAO,IAAI,IAAI,CAAC,kBAAkB,CAAA,EAAA,CAAC,EAC3F,GAAG,CAAC;YACA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;SAC9B,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAC9B;aACA,SAAS,EAAE,CAAC;QACjB,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aAChE,IAAI,CACD,GAAG,CAAC;YACA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;SAC9B,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAC9B;aACA,SAAS,EAAE,CAAC;KACpB;;+GA1pBQ,kBAAkB;mGAAlB,kBAAkB,wcAFhB,CAAC,+BAA+B,EAAE,CAAC,gGAsBf,oBAAoB,sGAJjB,cAAc,+YAqBT,gBAAgB,kDC/E3D,2kFAmEA;ADwLI;IALC,aAAa;;;;gEAOb;2FAnNQ,kBAAkB;kBAR9B,SAAS;+BACI,cAAc,iBAGT,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,MAAM,aACpC,CAAC,+BAA+B,EAAE,CAAC;;;8BAuIzC,QAAQ;;yBAhIb,KAAK;sBADJ,KAAK;gBAKN,uBAAuB;sBADtB,KAAK;gBAKN,mBAAmB;sBADlB,KAAK;gBAKN,SAAS;sBADR,eAAe;uBAAC,UAAU,CAAC,MAAM,cAAc,CAAC;gBAKjD,KAAK;sBADJ,YAAY;uBAAC,UAAU,CAAC,MAAM,oBAAoB,CAAC;gBAKpD,gBAAgB;sBADf,SAAS;uBAAC,gBAAgB;gBAK3B,WAAW;sBADV,SAAS;uBAAC,aAAa;gBAIU,OAAO;sBAAxC,SAAS;uBAAC,iBAAiB;gBAMnB,cAAc;sBADtB,YAAY;uBAAC,eAAe,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;gBAoBzD,eAAe;sBADd,KAAK;gBAKN,kBAAkB;sBADjB,KAAK;gBAKN,UAAU;sBADT,KAAK;gBAKN,KAAK;sBADJ,KAAK;gBAKN,QAAQ;sBADP,KAAK;gBAKN,IAAI;sBADH,KAAK;gBAKG,gBAAgB;sBADxB,MAAM;;;;;;QAiIP,sBAAsB,MA6DtB,OAAO;sBADN,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;gBA+BnC,QAAQ;sBADP,YAAY;uBAAC,eAAe,EAAE,EAAE;;;ME5UxB,uBAAuB;;IAehC,YAAoB,WAAuB;QAAvB,gBAAW,GAAX,WAAW,CAAY;KAAI;;;;;IAL/C,sBAAsB;QAClB,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;KAC9C;;IAMD,QAAQ;QACJ,IAAI,CAAC,sBAAsB,EAAE,CAAC;KACjC;;IAGD,WAAW;QACP,IAAI,CAAC,sBAAsB,EAAE,CAAC;KACjC;;IAGD,UAAU;QACN,OAAO,IAAI,CAAC,WAAW,CAAC;KAC3B;;oHA9BQ,uBAAuB;wGAAvB,uBAAuB;AAUhC;IALC,aAAa;;;;qEAOb;2FAZQ,uBAAuB;kBALnC,SAAS;mBAAC;;;oBAGP,QAAQ,EAAE,sBAAsB;iBACnC;iGAIG,KAAK;sBADJ,KAAK;;;;;;QAQN,sBAAsB;;MCNb,mDAAmD,0BAA0B;IACtF;QACI,KAAK,CAAC,iCAAiC,CAAC,CAAC;KAC5C;;uIAHQ,0CAA0C;2HAA1C,0CAA0C,mEAPxC;QACP;YACI,OAAO,EAAE,yBAAyB;YAClC,WAAW,EAAE,UAAU,CAAC,MAAM,0CAA0C,CAAC;SAC5E;KACJ;2FAEQ,0CAA0C;kBAVtD,SAAS;mBAAC;;oBAEP,QAAQ,EAAE,0CAA0C;oBACpD,SAAS,EAAE;wBACP;4BACI,OAAO,EAAE,yBAAyB;4BAClC,WAAW,EAAE,UAAU,CAAC,gDAAgD,CAAC;yBAC5E;qBACJ;iBACJ;;;MCgBY,WAAW;;wGAAX,WAAW;yGAAX,WAAW,iBAdhB,cAAc;QACd,kBAAkB;QAClB,uBAAuB;QACvB,0CAA0C,aAEpC,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,aAEnG,cAAc;QACd,kBAAkB;QAClB,uBAAuB;QACvB,0CAA0C;QAC1C,oBAAoB;yGAGf,WAAW,YATX,CAAC,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAMpG,oBAAoB;2FAGf,WAAW;kBAhBvB,QAAQ;mBAAC;oBACN,YAAY,EAAE;wBACV,cAAc;wBACd,kBAAkB;wBAClB,uBAAuB;wBACvB,0CAA0C;qBAC7C;oBACD,OAAO,EAAE,CAAC,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,CAAC;oBACxG,OAAO,EAAE;wBACL,cAAc;wBACd,kBAAkB;wBAClB,uBAAuB;wBACvB,0CAA0C;wBAC1C,oBAAoB;qBACvB;iBACJ;;;AC3BD;;;;;;"}
1
+ {"version":3,"file":"fundamental-ngx-core-token.mjs","sources":["../../../../libs/core/src/lib/token/token.component.ts","../../../../libs/core/src/lib/token/token.component.html","../../../../libs/core/src/lib/token/tokenizer.component.ts","../../../../libs/core/src/lib/token/tokenizer.component.html","../../../../libs/core/src/lib/token/token-input.directive.ts","../../../../libs/core/src/lib/token/deprecated-tokenizer-content-density.directive.ts","../../../../libs/core/src/lib/token/token.module.ts","../../../../libs/core/src/lib/token/fundamental-ngx-core-token.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\n\n/**\n * A token is used to represent contextualizing information.\n * They can be useful to show applied filters, selected values for form fields or object metadata.\n */\n@Component({\n selector: 'fd-token',\n templateUrl: './token.component.html',\n styleUrls: ['./token.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [contentDensityObserverProviders()]\n})\nexport class TokenComponent implements AfterViewInit, OnDestroy {\n /** Whether the token is disabled. */\n @Input()\n disabled = false;\n\n /** @hidden */\n @ViewChild('tokenWrapperElement')\n tokenWrapperElement: ElementRef;\n\n /** @hidden */\n @ViewChild('content')\n readonly _content: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild('viewContainer', { read: ViewContainerRef })\n readonly _viewContainer: ViewContainerRef;\n\n private _selected = false;\n\n private _subscriptions = new Subscription();\n\n /** Whether the token is selected. */\n @Input()\n get selected(): boolean {\n return this._selected;\n }\n\n set selected(val: boolean) {\n if (this._selected !== val) {\n this._cdRef.markForCheck();\n }\n this._selected = val;\n }\n\n /** Whether the token is read-only. */\n @Input()\n readOnly = false;\n\n /** label for close icon */\n @Input()\n deleteButtonLabel = 'Deletable';\n\n /** role description for token */\n @Input()\n ariaRoleDescription = 'token';\n\n /** Emitted when the *x* icon is clicked. Specifically, any pseudo-element. */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onCloseClick: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();\n\n /** Emitted when token should be removed */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onRemove: EventEmitter<void> = new EventEmitter<void>();\n\n /** Emitted when a token is clicked. */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n onTokenClick = new EventEmitter<MouseEvent>();\n\n /** Emitted when a there's a keydown registered on the token. */\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n onTokenKeydown = new EventEmitter<KeyboardEvent>();\n\n /** @hidden */\n totalCount: number;\n\n constructor(\n public elementRef: ElementRef,\n private _cdRef: ChangeDetectorRef,\n readonly _contentDensityObserver: ContentDensityObserver\n ) {}\n\n /** @hidden */\n ngAfterViewInit(): void {\n this._viewContainer.createEmbeddedView(this._content);\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n /** @hidden */\n closeClickHandler(event?): void {\n if (event) {\n event.stopPropagation();\n if (!this.disabled) {\n this.onCloseClick.emit(event);\n }\n }\n }\n\n /** @hidden */\n tokenClickHandler(event): void {\n this.onTokenClick.emit(event);\n }\n\n /** @hidden */\n _setTotalCount(count: number): void {\n this.totalCount = count;\n this._cdRef.markForCheck();\n }\n}\n","<span\n #tokenWrapperElement\n class=\"fd-token\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-setsize]=\"totalCount\"\n [attr.aria-roledescription]=\"ariaRoleDescription\"\n (click)=\"tokenClickHandler($event)\"\n (keydown)=\"onTokenKeydown.emit($event)\"\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\"\n *ngIf=\"!readOnly\"\n class=\"fd-token__close\"\n tabindex=\"-1\"\n ></span>\n</span>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n","import {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n Renderer2,\n ViewChild,\n ViewChildren,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { A, BACKSPACE, DELETE, ENTER, LEFT_ARROW, RIGHT_ARROW, SPACE } from '@angular/cdk/keycodes';\nimport { fromEvent, merge, Subject, Subscription } from 'rxjs';\nimport { filter, mapTo, takeUntil, debounceTime } from 'rxjs/operators';\nimport { FormControlComponent } from '@fundamental-ngx/core/form';\nimport { applyCssClass, CssClassBuilder, KeyUtil, RtlService } from '@fundamental-ngx/core/utils';\nimport { TokenComponent } from './token.component';\nimport { ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\n\n@Component({\n selector: 'fd-tokenizer',\n templateUrl: './tokenizer.component.html',\n styleUrls: ['./tokenizer.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [contentDensityObserverProviders()]\n})\nexport class TokenizerComponent\n implements AfterViewInit, AfterContentInit, OnDestroy, CssClassBuilder, OnInit, OnChanges\n{\n /** user's custom classes */\n @Input()\n class: string;\n\n /** Disables possibility to remove tokens by keyboard */\n @Input()\n disableKeyboardDeletion = false;\n\n /** role description for tokenizer component */\n @Input()\n ariaRoleDescription = 'tokenizer';\n\n /** @hidden */\n @ContentChildren(forwardRef(() => TokenComponent))\n tokenList: QueryList<TokenComponent>;\n\n /** @hidden */\n @ContentChild(forwardRef(() => FormControlComponent))\n input: FormControlComponent;\n\n /** @hidden */\n @ViewChild('tokenizerInner')\n tokenizerInnerEl: ElementRef<HTMLDivElement>;\n\n /** @hidden */\n @ViewChild('moreElement')\n moreElement: ElementRef<HTMLElement>;\n\n /** @hidden */\n @ViewChild('inputGroupAddOn') set content(content: ElementRef<HTMLElement>) {\n this.inputGroupAddonEl = content;\n }\n\n /** @hidden */\n @ViewChildren('viewContainer', { read: ViewContainerRef })\n readonly _viewContainer: QueryList<ViewContainerRef>;\n\n /** @hidden */\n get _hiddenTokens(): TokenComponent[] {\n return this.tokenList.filter((token) => token.elementRef.nativeElement.style.display === 'none');\n }\n\n /**\n * Component is in compact mode, determined by the consumer\n */\n get compact(): boolean {\n return this._contentDensityObserver.isCompact;\n }\n\n /** @hidden */\n inputGroupAddonEl: ElementRef;\n\n /** Whether to use cozy visuals but compact collapsing behavior. */\n @Input()\n compactCollapse = false;\n\n /** Whether tokenizer should have fake focus indicator, when input is focused inside*/\n @Input()\n tokenizerFocusable = true;\n\n /** The value for the tokenizer input */\n @Input()\n inputValue: string;\n\n /** Icon of the button on the right of the input field. */\n @Input()\n glyph: string;\n\n /** Word to use for when there are extra tokens. */\n @Input()\n moreTerm = 'more';\n\n /** @hidden */\n @Input()\n open: boolean;\n\n /** Event emitted when the search term changes. Use *$event* to access the new term. */\n @Output()\n readonly moreClickedEvent: EventEmitter<any> = new EventEmitter<any>();\n\n /** @hidden */\n previousElementWidth: number;\n\n /** @hidden */\n moreTokensLeft: Array<TokenComponent> = [];\n\n /** @hidden */\n moreTokensRight: Array<TokenComponent> = [];\n\n /** @hidden */\n previousTokenCount: number;\n\n /** @hidden */\n tokenListChangesSubscription: Subscription;\n\n /** @hidden */\n tokenListClickSubscriptions: Subscription[] = [];\n\n /** @hidden */\n hiddenCozyTokenCount = 0;\n\n /** @hidden Used to add focus to tokenizer element */\n _tokenizerHasFocus = false;\n\n /** @hidden */\n _showOverflowPopover = true;\n\n /** @hidden */\n /* Variable which will keep the index of the first token pressed in the tokenizer*/\n private _firstElementInSelection: number | null = null;\n\n /** @hidden */\n /* Variable which will keep the index of the last token pressed in the tokenizer*/\n private _lastElementInSelection: number | null = null;\n\n /** @hidden */\n /* Flag which will say if the last keyboard and click operation they used was using control*/\n private _ctrlPrevious: boolean;\n\n /** @hidden */\n /* Flag which will say if they held shift and clicked highlighting elements before or*/\n private _directionShiftIsRight: boolean | null = null;\n\n /** An RxJS Subject that will kill the data stream upon destruction (for unsubscribing) */\n private readonly _onDestroy$: Subject<void> = new Subject<void>();\n\n constructor(\n readonly _contentDensityObserver: ContentDensityObserver,\n private _elementRef: ElementRef,\n private _cdRef: ChangeDetectorRef,\n @Optional() private _rtlService: RtlService,\n private _renderer: Renderer2\n ) {\n this._renderer.listen('window', 'click', (e: Event) => {\n if (this.elementRef().nativeElement.contains(e.target) === false) {\n this.tokenList.forEach((token) => {\n token.selected = false;\n });\n }\n });\n }\n\n /** @hidden */\n ngAfterViewInit(): void {\n if (this.input && this.input.elementRef()) {\n this._inputKeydownEvent();\n }\n // watch for changes to the tokenList and attempt to expand/collapse tokens as needed\n if (this.tokenListChangesSubscription) {\n this.tokenListChangesSubscription.unsubscribe();\n }\n this.tokenListChangesSubscription = this.tokenList.changes.subscribe(() => {\n this._resetTokens();\n });\n this.tokenList.forEach((token) => {\n this.tokenListChangesSubscription.add(\n token.onCloseClick.subscribe(() => {\n this._resetTokens();\n })\n );\n });\n if (!this.compact && !this.compactCollapse) {\n this._handleInitCozyTokenCount();\n }\n }\n\n /** @hidden */\n ngAfterContentInit(): void {\n this._listenElementEvents();\n this.previousElementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n this.onResize();\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n if (this.tokenListChangesSubscription) {\n this.tokenListChangesSubscription.unsubscribe();\n }\n this._onDestroy$.next();\n this._onDestroy$.complete();\n this._unsubscribeClicks();\n }\n\n /** @hidden */\n ngOnInit(): void {\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n ngOnChanges(): void {\n this.buildComponentCssClass();\n }\n\n @applyCssClass\n /** CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n buildComponentCssClass(): string[] {\n return [this.class];\n }\n\n elementRef(): ElementRef {\n return this._elementRef;\n }\n\n /** @hidden */\n handleTokenClickSubscriptions(): void {\n this._unsubscribeClicks();\n this.tokenList.forEach((token, index) => {\n this.tokenListClickSubscriptions.push(\n token.onTokenClick.subscribe((event) => {\n event.stopPropagation();\n this.focusTokenElement(index);\n if (this._isControlKey(event)) {\n this._ctrlSelected(token, index);\n } else if (!event.shiftKey || this._ctrlPrevious) {\n this._basicSelected(token, index);\n } else if (event.shiftKey) {\n this.resetFirstAndLastElement();\n this._shiftSelected(index);\n }\n })\n );\n this.tokenListClickSubscriptions.push(\n token.onTokenKeydown.subscribe((event) => {\n this.handleKeyDown(event, index);\n })\n );\n });\n }\n\n /** @hidden */\n focusTokenElement(newIndex: number): HTMLElement | undefined {\n let elementToFocus: HTMLElement | undefined;\n const tokenListArray: TokenComponent[] = this.tokenList.toArray();\n if (tokenListArray[newIndex]) {\n elementToFocus = tokenListArray[newIndex].tokenWrapperElement.nativeElement;\n // element needs tabindex in order to be focused\n elementToFocus!.focus();\n }\n\n return elementToFocus;\n }\n\n /** @hidden */\n @HostListener('keydown', ['$event'])\n keyDown(keyboardEvent: KeyboardEvent): void {\n if (\n KeyUtil.isKeyCode(keyboardEvent, [DELETE, BACKSPACE]) &&\n (!this._isInputFocused() || this._tokensSelected()) &&\n !this.disableKeyboardDeletion\n ) {\n const selectedElements = this._getActiveTokens();\n const focusedTokenIndex = this._getFocusedTokenIndex();\n selectedElements.forEach((element) => element.onCloseClick.emit());\n if (selectedElements.length > 0) {\n if (KeyUtil.isKeyCode(keyboardEvent, DELETE)) {\n this._focusInput();\n } else {\n this.focusTokenElement(focusedTokenIndex - 1);\n }\n }\n }\n\n if (\n KeyUtil.isKeyCode(keyboardEvent, BACKSPACE) &&\n this._isInputFocused() &&\n !this._getInputValue() &&\n !this.disableKeyboardDeletion\n ) {\n this.focusTokenElement(this.tokenList.length - 1);\n }\n }\n\n /** @hidden */\n @HostListener('window:resize', [])\n onResize(): void {\n if (this._elementRef) {\n const elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n this._resetTokens();\n this.previousElementWidth = elementWidth;\n }\n }\n\n /** @hidden */\n handleKeyDown(event: KeyboardEvent, fromIndex: number): void {\n let newIndex: number | undefined;\n const rtl = this._rtlService && this._rtlService.rtl ? this._rtlService.rtl.getValue() : false;\n if (KeyUtil.isKeyCode(event, SPACE) && !this._isInputFocused()) {\n const token = this.tokenList.find((_, index) => index === fromIndex);\n this.tokenList.forEach((shadowedToken) => {\n if (shadowedToken !== token) {\n shadowedToken.selected = false;\n }\n });\n token && (token.selected = !token.selected);\n event.preventDefault();\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n this._focusInput();\n } else if ((KeyUtil.isKeyCode(event, LEFT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, RIGHT_ARROW) && rtl)) {\n this._handleArrowLeft(fromIndex);\n newIndex = fromIndex - 1;\n } else if ((KeyUtil.isKeyCode(event, RIGHT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, LEFT_ARROW) && rtl)) {\n this._handleArrowRight(fromIndex);\n newIndex = fromIndex + 1;\n } else if (KeyUtil.isKeyCode(event, A) && !this._getInputValue() && this._isControlKey(event)) {\n event.preventDefault();\n this.tokenList.forEach((token) => (token.selected = true));\n }\n if (\n newIndex === this.tokenList.length &&\n ((KeyUtil.isKeyCode(event, RIGHT_ARROW) && !rtl) || (KeyUtil.isKeyCode(event, LEFT_ARROW) && rtl))\n ) {\n this._focusInput();\n } else if (newIndex! > this.tokenList.length - this.moreTokensRight.length && this._isInputFocused()) {\n this.focusTokenElement(newIndex! - this.moreTokensRight.length);\n } else if (newIndex || newIndex === 0) {\n this.focusTokenElement(newIndex);\n }\n }\n\n /** @hidden */\n getCombinedTokenWidth(): number {\n let totalTokenWidth = 0;\n // get the width of each token\n this.tokenList.forEach((token) => {\n totalTokenWidth = totalTokenWidth + token.elementRef.nativeElement.getBoundingClientRect().width;\n });\n // add input width\n if (this.input && this.input.elementRef()) {\n totalTokenWidth = totalTokenWidth + this.input.elementRef().nativeElement.getBoundingClientRect().width;\n }\n // add the width of the \"____ more\" element\n if (this.moreTokensLeft.length > 0 && this.moreElement && this.moreElement.nativeElement) {\n totalTokenWidth = totalTokenWidth + this.moreElement.nativeElement.getBoundingClientRect().width;\n }\n // add the input group addon\n if (this.inputGroupAddonEl && this.inputGroupAddonEl.nativeElement) {\n totalTokenWidth = totalTokenWidth + this.inputGroupAddonEl.nativeElement.getBoundingClientRect().width;\n }\n\n return totalTokenWidth;\n }\n\n /** @hidden */\n moreClicked(): void {\n this.moreClickedEvent.emit();\n }\n\n /** Removes all selected tokens */\n removeSelectedTokens(): void {\n const selectedElements = this._getActiveTokens();\n selectedElements.forEach((element) => element.onRemove.emit());\n }\n\n /** @hidden */\n private _handleArrowLeft(fromIndex: number): void {\n // if the leftmost visible token is selected, and there are moreTokensLeft, need to display a moreTokenLeft\n if (fromIndex === this.moreTokensLeft.length) {\n const poppedToken = this.moreTokensLeft.pop();\n if (poppedToken) {\n this._makeElementVisible(poppedToken.elementRef);\n }\n // and then hide any tokens from the right that no longer fit\n this._collapseTokens('right');\n\n this._cdRef.detectChanges();\n }\n }\n\n /** @hidden */\n private _handleArrowRight(fromIndex: number): void {\n if (fromIndex === this.tokenList.length - this.moreTokensRight.length - 1 && this.moreTokensRight.length) {\n const poppedToken = this.moreTokensRight.pop();\n if (poppedToken) {\n this._makeElementVisible(poppedToken.elementRef);\n }\n // and then hide any tokens from the left that no longer fit\n this._collapseTokens('left');\n\n this._cdRef.detectChanges();\n }\n }\n\n /** @hidden */\n private _collapseTokens(side?: string): void {\n if (this.compact || this.compactCollapse) {\n this._cdRef.detectChanges();\n this._viewContainer.forEach((viewContainer) => viewContainer.clear());\n this.tokenList.forEach((token) => token._viewContainer.createEmbeddedView(token._content));\n\n let elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n let combinedTokenWidth = this.getCombinedTokenWidth(); // the combined width of all tokens, the \"____ more\" text, and the input\n let i = 0;\n /*\n When resizing, we want to collapse the tokens on the left first. However when the user is navigating through\n a group of overflowing tokens using the arrow left key, we may need to hide tokens on the right. So if this\n function has been called with the param 'right' it will collapse tokens from the right side of the list rather\n than the (default) left side.\n */\n if (side === 'right') {\n i = this.tokenList.length - 1;\n }\n while (combinedTokenWidth > elementWidth && (side === 'right' ? i >= 0 : i < this.tokenList.length)) {\n // loop through the tokens and hide them until the combinedTokenWidth fits in the elementWidth\n const token = this.tokenList.find((item, index) => index === i);\n const moreTokens = side === 'right' ? this.moreTokensRight : this.moreTokensLeft;\n\n if (token) {\n if (moreTokens.indexOf(token) === -1) {\n moreTokens.push(token);\n }\n token.elementRef.nativeElement.style.display = 'none';\n }\n // get the new elementWidth and combinedTokenWidth as these will have changed after setting a token display to 'none'\n elementWidth = this._elementRef.nativeElement.getBoundingClientRect().width;\n combinedTokenWidth = this.getCombinedTokenWidth();\n side === 'right' ? i-- : i++;\n }\n\n this._cdRef.detectChanges();\n this._hiddenTokens.forEach((hiddenToken, index) => {\n hiddenToken._viewContainer.clear();\n this._viewContainer.get(index)?.createEmbeddedView(hiddenToken._content);\n });\n } else {\n this._getHiddenCozyTokenCount();\n }\n }\n\n /** @hidden */\n private _resetTokens(): void {\n this.moreTokensLeft = [];\n this.moreTokensRight = [];\n if (this.compact || this.compactCollapse) {\n this.tokenList.forEach((token) => {\n this._makeElementVisible(token.elementRef);\n });\n this._cdRef.markForCheck();\n this._collapseTokens();\n } else {\n this._getHiddenCozyTokenCount();\n }\n this.handleTokenClickSubscriptions();\n this.previousTokenCount = this.tokenList.length;\n this.tokenList.forEach((token) => token._setTotalCount(this.tokenList.length));\n }\n\n /** @hidden */\n private _getHiddenCozyTokenCount(): void {\n const elementLeft = this._elementRef.nativeElement.getBoundingClientRect().left;\n this.hiddenCozyTokenCount = 0;\n this.tokenList.forEach((token) => {\n if (\n token.tokenWrapperElement &&\n token.tokenWrapperElement.nativeElement.getBoundingClientRect().right < elementLeft\n ) {\n this.hiddenCozyTokenCount += 1;\n }\n });\n\n this._cdRef.detectChanges();\n }\n\n /** @hidden */\n private _handleInitCozyTokenCount(): void {\n // because justify-content breaks scrollbar, it cannot be used on cozy screens, so use JS to scroll to the end\n this.tokenizerInnerEl.nativeElement.scrollLeft = this.tokenizerInnerEl.nativeElement.scrollWidth;\n this._getHiddenCozyTokenCount();\n if (this.hiddenCozyTokenCount > 0) {\n // need to do this again in case \"____ more\" text was added\n this.tokenizerInnerEl.nativeElement.scrollLeft = this.tokenizerInnerEl.nativeElement.scrollWidth;\n this._getHiddenCozyTokenCount();\n }\n }\n\n /** @hidden */\n private _makeElementVisible(elementRef: ElementRef): void {\n elementRef.nativeElement.style.display = 'inline-block';\n elementRef.nativeElement.style.visibility = 'visible';\n }\n\n private _unsubscribeClicks(): void {\n if (this.tokenListClickSubscriptions && this.tokenListClickSubscriptions.length) {\n this.tokenListClickSubscriptions.forEach((subscription) => {\n subscription.unsubscribe();\n });\n }\n }\n\n private _inputKeydownEvent(): void {\n this.input.elementRef().nativeElement.addEventListener('keydown', (event) => {\n this.handleKeyDown(event, this.tokenList.length);\n });\n }\n\n /** @hidden Method which handles what happens to token when it is clicked and no key is being held down.*/\n private _basicSelected(token, index): void {\n this.tokenList.forEach((shadowedToken) => {\n if (shadowedToken !== token) {\n shadowedToken.selected = false;\n }\n });\n this._firstElementInSelection = index;\n this._lastElementInSelection = index;\n token.selected = true;\n this._ctrlPrevious = false;\n }\n\n /** @hidden Restart first and last elements for shift selection.*/\n private resetFirstAndLastElement(): void {\n const reset = !this.tokenList.some((token) => token.selected);\n if (reset) {\n this._firstElementInSelection = null;\n this._lastElementInSelection = null;\n }\n }\n\n /** @hidden Method which handles what happens to token when it is clicked and the shift key is being held down.*/\n private _shiftSelected(index): void {\n if (!this._firstElementInSelection && !this._lastElementInSelection) {\n this._firstElementInSelection = index;\n this._lastElementInSelection = index;\n this._directionShiftIsRight = null;\n } else {\n if (this._firstElementInSelection && index < this._firstElementInSelection) {\n if (this._directionShiftIsRight) {\n this._lastElementInSelection = this._firstElementInSelection;\n }\n this._directionShiftIsRight = false;\n this._firstElementInSelection = index;\n } else if (this._lastElementInSelection && index > this._lastElementInSelection) {\n if (!this._directionShiftIsRight) {\n this._firstElementInSelection = this._lastElementInSelection;\n }\n this._directionShiftIsRight = true;\n this._lastElementInSelection = index;\n }\n if (!this._directionShiftIsRight) {\n this._firstElementInSelection = index;\n } else if (this._directionShiftIsRight) {\n this._lastElementInSelection = index;\n }\n }\n\n this.tokenList.forEach((token, indexOfToken) => {\n token.selected =\n this._firstElementInSelection != null &&\n this._lastElementInSelection != null &&\n indexOfToken >= this._firstElementInSelection &&\n indexOfToken <= this._lastElementInSelection;\n });\n this._ctrlPrevious = false;\n }\n\n /** @hidden Method which handles what happens to token when it is clicked and the control or meta key is being held down.*/\n private _ctrlSelected(token, index): void {\n this._firstElementInSelection = null;\n this._lastElementInSelection = null;\n const selected = token.selected;\n token.selected = true;\n if (selected) {\n token.selected = false;\n this.tokenList.forEach((element, indexOfToken) => {\n if (!this._firstElementInSelection) {\n if (element.selected) {\n this._firstElementInSelection = indexOfToken;\n }\n } else {\n this._lastElementInSelection = indexOfToken;\n }\n });\n if (index === this._lastElementInSelection) {\n this._lastElementInSelection = this._lastElementInSelection! - 1;\n }\n if (index === this._firstElementInSelection) {\n this._firstElementInSelection = this._firstElementInSelection! - 1;\n }\n }\n this._ctrlPrevious = true;\n }\n\n /** Get selected and focused tokens */\n private _getActiveTokens(): TokenComponent[] {\n return this.tokenList.filter((item) => item.selected || this._isTokenFocused(item));\n }\n\n /** @hidden */\n private _getFocusedTokenIndex(): number {\n return this.tokenList.toArray().findIndex((token) => this._isTokenFocused(token));\n }\n\n /** @hidden */\n private _isTokenFocused(token: TokenComponent): boolean {\n return token.tokenWrapperElement.nativeElement === document.activeElement;\n }\n\n /** @hidden */\n private _isInputFocused(): boolean {\n return document.activeElement === this.input.elementRef().nativeElement;\n }\n\n /** @hidden */\n private _tokensSelected(): boolean {\n return this.tokenList.some((t) => t.selected);\n }\n\n /** @hidden */\n private _getInputValue(): string {\n return this.input.elementRef().nativeElement.value;\n }\n\n /** @hidden */\n private _focusInput(): void {\n this.input.elementRef().nativeElement.focus();\n }\n\n /** @hidden */\n private _isControlKey(keyboardEvent: KeyboardEvent | MouseEvent): boolean {\n return keyboardEvent.ctrlKey || keyboardEvent.metaKey;\n }\n\n /** @hidden */\n private _listenElementEvents(): void {\n merge(\n fromEvent<Event>(this.elementRef().nativeElement, 'focus', { capture: true }).pipe(\n filter((event) => (event['target'] as any)?.tagName === 'INPUT' && this.tokenizerFocusable),\n mapTo(true)\n ),\n fromEvent<Event>(this.elementRef().nativeElement, 'blur', { capture: true }).pipe(mapTo(false))\n )\n .pipe(\n // debounceTime is needed in order to filter subsequent focus-blur events, that happen simultaneously\n debounceTime(10),\n takeUntil(this._onDestroy$)\n )\n .subscribe((focused) => {\n this._tokenizerHasFocus = focused;\n this._cdRef.markForCheck();\n });\n }\n}\n","<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 tabindex=\"-1\"\n [attr.aria-label]=\"token.deleteButtonLabel\"\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 #moreElement\n >\n <ng-container *ngIf=\"compact || compactCollapse\">\n {{ moreTokensLeft.length + moreTokensRight.length }} {{ moreTerm }}\n </ng-container>\n <ng-container *ngIf=\"!compact && !compactCollapse\"> {{ hiddenCozyTokenCount }} {{ moreTerm }} </ng-container>\n </span>\n</ng-template>\n","import { Directive, ElementRef, Input, OnChanges, OnInit } from '@angular/core';\nimport { applyCssClass } from '@fundamental-ngx/core/utils';\nimport { CssClassBuilder } from '@fundamental-ngx/core/utils';\n\n@Directive({\n // TODO to be discussed\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[fd-tokenizer-input]'\n})\nexport class TokenizerInputDirective implements OnInit, OnChanges, CssClassBuilder {\n /** user's custom classes */\n @Input()\n class: string;\n\n @applyCssClass\n /** CssClassBuilder interface implementation\n * function must return single string\n * function is responsible for order which css classes are applied\n */\n buildComponentCssClass(): string[] {\n return ['fd-tokenizer__input', this.class];\n }\n\n /** @hidden */\n constructor(private _elementRef: ElementRef) {}\n\n /** @hidden */\n ngOnInit(): void {\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n ngOnChanges(): void {\n this.buildComponentCssClass();\n }\n\n /** @hidden */\n elementRef(): ElementRef<any> {\n return this._elementRef;\n }\n}\n","import { CONTENT_DENSITY_DIRECTIVE, DeprecatedCompactDirective } from '@fundamental-ngx/core/content-density';\nimport { Directive, forwardRef } from '@angular/core';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: 'fd-tokenizer[compact], fd-token[compact]',\n providers: [\n {\n provide: CONTENT_DENSITY_DIRECTIVE,\n useExisting: forwardRef(() => DeprecatedTokenizerContentDensityDirective)\n }\n ]\n})\nexport class DeprecatedTokenizerContentDensityDirective extends DeprecatedCompactDirective {\n constructor() {\n super('fd-tokenizer[compact], fd-token');\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TokenComponent } from './token.component';\nimport { TokenizerComponent } from './tokenizer.component';\nimport { TokenizerInputDirective } from './token-input.directive';\nimport { InputGroupModule } from '@fundamental-ngx/core/input-group';\nimport { ButtonModule } from '@fundamental-ngx/core/button';\nimport { PopoverModule } from '@fundamental-ngx/core/popover';\nimport { ListModule } from '@fundamental-ngx/core/list';\nimport { DeprecatedTokenizerContentDensityDirective } from './deprecated-tokenizer-content-density.directive';\nimport { ContentDensityModule } from '@fundamental-ngx/core/content-density';\n\n@NgModule({\n declarations: [\n TokenComponent,\n TokenizerComponent,\n TokenizerInputDirective,\n DeprecatedTokenizerContentDensityDirective\n ],\n imports: [CommonModule, InputGroupModule, ButtonModule, PopoverModule, ListModule, ContentDensityModule],\n exports: [\n TokenComponent,\n TokenizerComponent,\n TokenizerInputDirective,\n DeprecatedTokenizerContentDensityDirective,\n ContentDensityModule\n ]\n})\nexport class TokenModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}