@fundamental-ngx/core 0.63.0-rc.9 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/fesm2022/fundamental-ngx-core-action-bar.mjs +2 -2
  2. package/fesm2022/fundamental-ngx-core-action-sheet.mjs +2 -2
  3. package/fesm2022/fundamental-ngx-core-action-sheet.mjs.map +1 -1
  4. package/fesm2022/fundamental-ngx-core-avatar-group.mjs +2 -2
  5. package/fesm2022/fundamental-ngx-core-avatar-group.mjs.map +1 -1
  6. package/fesm2022/fundamental-ngx-core-avatar.mjs +2 -2
  7. package/fesm2022/fundamental-ngx-core-bar.mjs +2 -2
  8. package/fesm2022/fundamental-ngx-core-bar.mjs.map +1 -1
  9. package/fesm2022/fundamental-ngx-core-breadcrumb.mjs +2 -2
  10. package/fesm2022/fundamental-ngx-core-busy-indicator.mjs +2 -2
  11. package/fesm2022/fundamental-ngx-core-button.mjs +2 -2
  12. package/fesm2022/fundamental-ngx-core-calendar.mjs +52 -47
  13. package/fesm2022/fundamental-ngx-core-calendar.mjs.map +1 -1
  14. package/fesm2022/fundamental-ngx-core-card.mjs +2 -2
  15. package/fesm2022/fundamental-ngx-core-card.mjs.map +1 -1
  16. package/fesm2022/fundamental-ngx-core-carousel.mjs +2 -2
  17. package/fesm2022/fundamental-ngx-core-checkbox.mjs +2 -2
  18. package/fesm2022/fundamental-ngx-core-combobox.mjs +42 -4
  19. package/fesm2022/fundamental-ngx-core-combobox.mjs.map +1 -1
  20. package/fesm2022/fundamental-ngx-core-date-picker.mjs +7 -6
  21. package/fesm2022/fundamental-ngx-core-date-picker.mjs.map +1 -1
  22. package/fesm2022/fundamental-ngx-core-datetime-picker.mjs +12 -12
  23. package/fesm2022/fundamental-ngx-core-datetime-picker.mjs.map +1 -1
  24. package/fesm2022/fundamental-ngx-core-datetime.mjs +295 -100
  25. package/fesm2022/fundamental-ngx-core-datetime.mjs.map +1 -1
  26. package/fesm2022/fundamental-ngx-core-dialog.mjs +2 -2
  27. package/fesm2022/fundamental-ngx-core-dynamic-page.mjs +2 -2
  28. package/fesm2022/fundamental-ngx-core-dynamic-side-content.mjs +2 -2
  29. package/fesm2022/fundamental-ngx-core-facets.mjs +2 -2
  30. package/fesm2022/fundamental-ngx-core-feed-input.mjs +2 -2
  31. package/fesm2022/fundamental-ngx-core-feed-list-item.mjs +2 -2
  32. package/fesm2022/fundamental-ngx-core-file-uploader.mjs +2 -2
  33. package/fesm2022/fundamental-ngx-core-fixed-card-layout.mjs +2 -2
  34. package/fesm2022/fundamental-ngx-core-flexible-column-layout.mjs +2 -2
  35. package/fesm2022/fundamental-ngx-core-form.mjs +19 -16
  36. package/fesm2022/fundamental-ngx-core-form.mjs.map +1 -1
  37. package/fesm2022/fundamental-ngx-core-generic-tag.mjs +2 -2
  38. package/fesm2022/fundamental-ngx-core-grid-list.mjs +2 -2
  39. package/fesm2022/fundamental-ngx-core-icon.mjs +2 -2
  40. package/fesm2022/fundamental-ngx-core-info-label.mjs +2 -2
  41. package/fesm2022/fundamental-ngx-core-input-group.mjs +2 -2
  42. package/fesm2022/fundamental-ngx-core-layout-grid.mjs +2 -2
  43. package/fesm2022/fundamental-ngx-core-layout-panel.mjs +2 -2
  44. package/fesm2022/fundamental-ngx-core-link.mjs +2 -2
  45. package/fesm2022/fundamental-ngx-core-list.mjs +4 -4
  46. package/fesm2022/fundamental-ngx-core-message-box.mjs +2 -2
  47. package/fesm2022/fundamental-ngx-core-message-page.mjs +2 -2
  48. package/fesm2022/fundamental-ngx-core-message-strip.mjs +2 -2
  49. package/fesm2022/fundamental-ngx-core-message-strip.mjs.map +1 -1
  50. package/fesm2022/fundamental-ngx-core-message-toast.mjs +2 -2
  51. package/fesm2022/fundamental-ngx-core-micro-process-flow.mjs +2 -2
  52. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs +2 -2
  53. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
  54. package/fesm2022/fundamental-ngx-core-multi-input.mjs +45 -8
  55. package/fesm2022/fundamental-ngx-core-multi-input.mjs.map +1 -1
  56. package/fesm2022/fundamental-ngx-core-nested-list.mjs +1 -1
  57. package/fesm2022/fundamental-ngx-core-nested-list.mjs.map +1 -1
  58. package/fesm2022/fundamental-ngx-core-notification.mjs +2 -2
  59. package/fesm2022/fundamental-ngx-core-object-attribute.mjs +2 -2
  60. package/fesm2022/fundamental-ngx-core-object-identifier.mjs +2 -2
  61. package/fesm2022/fundamental-ngx-core-object-marker.mjs +2 -2
  62. package/fesm2022/fundamental-ngx-core-object-status.mjs +2 -2
  63. package/fesm2022/fundamental-ngx-core-overflow-layout.mjs +1 -1
  64. package/fesm2022/fundamental-ngx-core-overflow-layout.mjs.map +1 -1
  65. package/fesm2022/fundamental-ngx-core-pagination.mjs +2 -2
  66. package/fesm2022/fundamental-ngx-core-panel.mjs +2 -2
  67. package/fesm2022/fundamental-ngx-core-popover.mjs +110 -6
  68. package/fesm2022/fundamental-ngx-core-popover.mjs.map +1 -1
  69. package/fesm2022/fundamental-ngx-core-product-switch.mjs +3 -3
  70. package/fesm2022/fundamental-ngx-core-product-switch.mjs.map +1 -1
  71. package/fesm2022/fundamental-ngx-core-progress-indicator.mjs +2 -2
  72. package/fesm2022/fundamental-ngx-core-progress-indicator.mjs.map +1 -1
  73. package/fesm2022/fundamental-ngx-core-quick-view.mjs +2 -2
  74. package/fesm2022/fundamental-ngx-core-radio.mjs +2 -2
  75. package/fesm2022/fundamental-ngx-core-rating-indicator.mjs +2 -2
  76. package/fesm2022/fundamental-ngx-core-rating-indicator.mjs.map +1 -1
  77. package/fesm2022/fundamental-ngx-core-resizable-card-layout.mjs +4 -4
  78. package/fesm2022/fundamental-ngx-core-segmented-button.mjs +2 -2
  79. package/fesm2022/fundamental-ngx-core-select.mjs +9 -3
  80. package/fesm2022/fundamental-ngx-core-select.mjs.map +1 -1
  81. package/fesm2022/fundamental-ngx-core-settings.mjs +4 -4
  82. package/fesm2022/fundamental-ngx-core-shellbar.mjs +2 -2
  83. package/fesm2022/fundamental-ngx-core-shellbar.mjs.map +1 -1
  84. package/fesm2022/fundamental-ngx-core-side-navigation.mjs +2 -2
  85. package/fesm2022/fundamental-ngx-core-skeleton.mjs +2 -2
  86. package/fesm2022/fundamental-ngx-core-slider.mjs +2 -2
  87. package/fesm2022/fundamental-ngx-core-slider.mjs.map +1 -1
  88. package/fesm2022/fundamental-ngx-core-split-button.mjs +2 -2
  89. package/fesm2022/fundamental-ngx-core-status-indicator.mjs +2 -2
  90. package/fesm2022/fundamental-ngx-core-step-input.mjs +2 -2
  91. package/fesm2022/fundamental-ngx-core-switch.mjs +2 -2
  92. package/fesm2022/fundamental-ngx-core-table.mjs +4 -4
  93. package/fesm2022/fundamental-ngx-core-tabs.mjs +4 -4
  94. package/fesm2022/fundamental-ngx-core-text.mjs +2 -2
  95. package/fesm2022/fundamental-ngx-core-tile.mjs +2 -2
  96. package/fesm2022/fundamental-ngx-core-time-picker.mjs +8 -17
  97. package/fesm2022/fundamental-ngx-core-time-picker.mjs.map +1 -1
  98. package/fesm2022/fundamental-ngx-core-time.mjs +8 -16
  99. package/fesm2022/fundamental-ngx-core-time.mjs.map +1 -1
  100. package/fesm2022/fundamental-ngx-core-title.mjs +2 -2
  101. package/fesm2022/fundamental-ngx-core-token.mjs +24 -14
  102. package/fesm2022/fundamental-ngx-core-token.mjs.map +1 -1
  103. package/fesm2022/fundamental-ngx-core-toolbar.mjs +2 -2
  104. package/fesm2022/fundamental-ngx-core-toolbar.mjs.map +1 -1
  105. package/fesm2022/fundamental-ngx-core-tree.mjs +2 -2
  106. package/fesm2022/fundamental-ngx-core-upload-collection.mjs +2 -2
  107. package/fesm2022/fundamental-ngx-core-user-menu.mjs +114 -8
  108. package/fesm2022/fundamental-ngx-core-user-menu.mjs.map +1 -1
  109. package/fesm2022/fundamental-ngx-core-vertical-navigation.mjs +4 -4
  110. package/fesm2022/fundamental-ngx-core-wizard.mjs +2 -2
  111. package/package.json +5 -5
  112. package/types/fundamental-ngx-core-calendar.d.ts +5 -12
  113. package/types/fundamental-ngx-core-combobox.d.ts +9 -1
  114. package/types/fundamental-ngx-core-datetime-picker.d.ts +0 -2
  115. package/types/fundamental-ngx-core-datetime.d.ts +109 -68
  116. package/types/fundamental-ngx-core-form.d.ts +2 -0
  117. package/types/fundamental-ngx-core-multi-input.d.ts +22 -4
  118. package/types/fundamental-ngx-core-popover.d.ts +378 -319
  119. package/types/fundamental-ngx-core-time-picker.d.ts +2 -8
  120. package/types/fundamental-ngx-core-time.d.ts +1 -7
  121. package/types/fundamental-ngx-core-token.d.ts +8 -2
  122. package/types/fundamental-ngx-core-user-menu.d.ts +23 -3
@@ -1,7 +1,7 @@
1
1
  import { NgTemplateOutlet, AsyncPipe } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { InjectionToken, ViewChild, Inject, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule, EventEmitter, inject, ElementRef, computed, ChangeDetectorRef, Injector, ViewContainerRef, effect, isDevMode, TemplateRef, forwardRef, Output, Input } from '@angular/core';
4
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { InjectionToken, ViewChild, Inject, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule, EventEmitter, input, inject, ElementRef, computed, signal, ChangeDetectorRef, Injector, ViewContainerRef, effect, isDevMode, TemplateRef, forwardRef, Output, Input } from '@angular/core';
4
+ import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
5
5
  import { TemplateDirective, RangeSelector, DynamicComponentService, RtlService, FocusTrapService, uuidv4, KeyUtil, get, AutoCompleteDirective, TruncatedTitleDirective, SearchHighlightPipe, applyCssClass } from '@fundamental-ngx/cdk/utils';
6
6
  import { BarMiddleDirective, BarElementDirective, ButtonBarComponent } from '@fundamental-ngx/core/bar';
7
7
  import { ButtonComponent } from '@fundamental-ngx/core/button';
@@ -13,7 +13,7 @@ import { SPACE, ENTER, DOWN_ARROW, UP_ARROW, TAB } from '@angular/cdk/keycodes';
13
13
  import * as i1 from '@angular/forms';
14
14
  import { FormControl, FormsModule, ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
15
15
  import { BehaviorSubject, Subscription, combineLatest } from 'rxjs';
16
- import { distinctUntilChanged, map, first, startWith } from 'rxjs/operators';
16
+ import { map, distinctUntilChanged, first, startWith } from 'rxjs/operators';
17
17
  import { FormControlComponent, registerFormItemControl } from '@fundamental-ngx/core/form';
18
18
  import { ListComponent, ListItemComponent, ListTitleDirective } from '@fundamental-ngx/core/list';
19
19
  import { MenuKeyboardService } from '@fundamental-ngx/core/menu';
@@ -338,6 +338,12 @@ class MultiInputComponent {
338
338
  this.addOnButtonClicked = new EventEmitter();
339
339
  /** Event emitted, when the multi input's all item checked or not */
340
340
  this.allItemsSelectedChange = new EventEmitter();
341
+ /**
342
+ * Maximum number of selected tokens to render when the input is not focused.
343
+ * When the selection exceeds this limit, the remaining count is shown as a
344
+ * "+N more" indicator. Defaults to 12.
345
+ */
346
+ this.maxVisibleTokens = input(12, ...(ngDevMode ? [{ debugName: "maxVisibleTokens" }] : []));
341
347
  /** @hidden */
342
348
  this.optionItems$ = new BehaviorSubject([]);
343
349
  /** @hidden */
@@ -349,9 +355,25 @@ class MultiInputComponent {
349
355
  /** @hidden */
350
356
  this._viewModel$ = this._getViewModel();
351
357
  /** @hidden */
352
- this._contentDensityObserver = inject(ContentDensityObserver);
358
+ this.contentDensityObserver = inject(ContentDensityObserver);
353
359
  /** @hidden */
354
360
  this.elementRef = inject(ElementRef);
361
+ /** @hidden — slice (or full list) of options rendered into <fd-tokenizer>. */
362
+ this.renderedTokens = computed(() => {
363
+ const all = this._selectedOptionsSignal();
364
+ if (this._renderAllTokens() || all.length <= this.maxVisibleTokens()) {
365
+ return all;
366
+ }
367
+ return all.slice(0, this.maxVisibleTokens());
368
+ }, ...(ngDevMode ? [{ debugName: "renderedTokens" }] : []));
369
+ /** @hidden — count of selected tokens not currently rendered. Fed into tokenizer's externalHiddenCount input. */
370
+ this.hiddenCount = computed(() => this._selectedOptionsSignal().length - this.renderedTokens().length, ...(ngDevMode ? [{ debugName: "hiddenCount" }] : []));
371
+ /** @hidden — the selected option list as a signal, derived from the view model. */
372
+ this._selectedOptionsSignal = toSignal(this._viewModel$.pipe(map((vm) => vm.selectedOptions)), {
373
+ initialValue: []
374
+ });
375
+ /** @hidden — true while the input has focus. Renders the full token list. */
376
+ this._renderAllTokens = signal(false, ...(ngDevMode ? [{ debugName: "_renderAllTokens" }] : []));
355
377
  /** @hidden */
356
378
  this._dir = computed(() => (this._rtlService?.rtl() ? 'rtl' : 'ltr'), ...(ngDevMode ? [{ debugName: "_dir" }] : []));
357
379
  /** @hidden */
@@ -396,6 +418,11 @@ class MultiInputComponent {
396
418
  }
397
419
  return ['fd-multi-input', 'fd-multi-input-custom', this.class];
398
420
  }
421
+ /** @hidden Called on input focus — render all tokens, then expand the tokenizer. */
422
+ _onInputFocus() {
423
+ this._renderAllTokens.set(true);
424
+ this.tokenizer._showAllTokens();
425
+ }
399
426
  /** @hidden */
400
427
  ngOnInit() {
401
428
  this.buildComponentCssClass();
@@ -636,6 +663,12 @@ class MultiInputComponent {
636
663
  this._onlySelected$.next(true);
637
664
  this.openChangeHandle(true);
638
665
  }
666
+ /** @hidden Click handler for the "+N more" indicator owned by multi-input. */
667
+ _onMoreClicked() {
668
+ this.tokenizer._showAllTokens();
669
+ this._renderAllTokens.set(true);
670
+ this.searchInputElement?.nativeElement.focus();
671
+ }
639
672
  /** @hidden */
640
673
  _addOnButtonClicked(event) {
641
674
  this.addOnButtonClicked.emit(event);
@@ -663,6 +696,10 @@ class MultiInputComponent {
663
696
  _focusOut(event) {
664
697
  if (!this.elementRef.nativeElement.contains(event.relatedTarget)) {
665
698
  this.onTouched();
699
+ if (this._renderAllTokens()) {
700
+ this.tokenizer._hideTokens();
701
+ this._renderAllTokens.set(false);
702
+ }
666
703
  }
667
704
  }
668
705
  /** @hidden */
@@ -815,7 +852,7 @@ class MultiInputComponent {
815
852
  }));
816
853
  }
817
854
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MultiInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
818
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: MultiInputComponent, isStandalone: true, selector: "fd-multi-input", inputs: { placeholder: "placeholder", disabled: "disabled", required: "required", compactCollapse: "compactCollapse", maxHeight: "maxHeight", glyph: "glyph", glyphFont: "glyphFont", dropdownValues: "dropdownValues", openDropdownOnAddOnClicked: "openDropdownOnAddOnClicked", addonIconTitle: "addonIconTitle", searchTerm: "searchTerm", inputId: "inputId", highlight: "highlight", selected: "selected", class: "class", filterFn: "filterFn", valueFn: "valueFn", displayFn: "displayFn", newTokenParseFn: "newTokenParseFn", optionItemIdentifier: "optionItemIdentifier", newTokenValidateFn: "newTokenValidateFn", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", fillControlMode: "fillControlMode", state: "state", buttonFocusable: "buttonFocusable", allowNewTokens: "allowNewTokens", mobile: "mobile", showAllButton: "showAllButton", bodyMaxWidth: "bodyMaxWidth", mobileConfig: "mobileConfig", includes: "includes", itemTemplate: "itemTemplate", title: "title", byline: "byline", autoComplete: "autoComplete", open: "open", displayAddonButton: "displayAddonButton", addOnButtonAriaLabel: "addOnButtonAriaLabel" }, outputs: { searchTermChange: "searchTermChange", selectedChange: "selectedChange", openChange: "openChange", addOnButtonClicked: "addOnButtonClicked", allItemsSelectedChange: "allItemsSelectedChange" }, host: { listeners: { "focusout": "_focusOut($event)" } }, providers: [
855
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: MultiInputComponent, isStandalone: true, selector: "fd-multi-input", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, compactCollapse: { classPropertyName: "compactCollapse", publicName: "compactCollapse", isSignal: false, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: false, isRequired: false, transformFunction: null }, glyph: { classPropertyName: "glyph", publicName: "glyph", isSignal: false, isRequired: false, transformFunction: null }, glyphFont: { classPropertyName: "glyphFont", publicName: "glyphFont", isSignal: false, isRequired: false, transformFunction: null }, dropdownValues: { classPropertyName: "dropdownValues", publicName: "dropdownValues", isSignal: false, isRequired: false, transformFunction: null }, openDropdownOnAddOnClicked: { classPropertyName: "openDropdownOnAddOnClicked", publicName: "openDropdownOnAddOnClicked", isSignal: false, isRequired: false, transformFunction: null }, addonIconTitle: { classPropertyName: "addonIconTitle", publicName: "addonIconTitle", isSignal: false, isRequired: false, transformFunction: null }, searchTerm: { classPropertyName: "searchTerm", publicName: "searchTerm", isSignal: false, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: false, isRequired: false, transformFunction: null }, highlight: { classPropertyName: "highlight", publicName: "highlight", isSignal: false, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: false, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: false, isRequired: false, transformFunction: null }, filterFn: { classPropertyName: "filterFn", publicName: "filterFn", isSignal: false, isRequired: false, transformFunction: null }, valueFn: { classPropertyName: "valueFn", publicName: "valueFn", isSignal: false, isRequired: false, transformFunction: null }, displayFn: { classPropertyName: "displayFn", publicName: "displayFn", isSignal: false, isRequired: false, transformFunction: null }, newTokenParseFn: { classPropertyName: "newTokenParseFn", publicName: "newTokenParseFn", isSignal: false, isRequired: false, transformFunction: null }, optionItemIdentifier: { classPropertyName: "optionItemIdentifier", publicName: "optionItemIdentifier", isSignal: false, isRequired: false, transformFunction: null }, newTokenValidateFn: { classPropertyName: "newTokenValidateFn", publicName: "newTokenValidateFn", isSignal: false, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: false, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: false, isRequired: false, transformFunction: null }, fillControlMode: { classPropertyName: "fillControlMode", publicName: "fillControlMode", isSignal: false, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: false, isRequired: false, transformFunction: null }, buttonFocusable: { classPropertyName: "buttonFocusable", publicName: "buttonFocusable", isSignal: false, isRequired: false, transformFunction: null }, allowNewTokens: { classPropertyName: "allowNewTokens", publicName: "allowNewTokens", isSignal: false, isRequired: false, transformFunction: null }, mobile: { classPropertyName: "mobile", publicName: "mobile", isSignal: false, isRequired: false, transformFunction: null }, showAllButton: { classPropertyName: "showAllButton", publicName: "showAllButton", isSignal: false, isRequired: false, transformFunction: null }, bodyMaxWidth: { classPropertyName: "bodyMaxWidth", publicName: "bodyMaxWidth", isSignal: false, isRequired: false, transformFunction: null }, mobileConfig: { classPropertyName: "mobileConfig", publicName: "mobileConfig", isSignal: false, isRequired: false, transformFunction: null }, includes: { classPropertyName: "includes", publicName: "includes", isSignal: false, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: false, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: false, isRequired: false, transformFunction: null }, byline: { classPropertyName: "byline", publicName: "byline", isSignal: false, isRequired: false, transformFunction: null }, autoComplete: { classPropertyName: "autoComplete", publicName: "autoComplete", isSignal: false, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: false, isRequired: false, transformFunction: null }, displayAddonButton: { classPropertyName: "displayAddonButton", publicName: "displayAddonButton", isSignal: false, isRequired: false, transformFunction: null }, addOnButtonAriaLabel: { classPropertyName: "addOnButtonAriaLabel", publicName: "addOnButtonAriaLabel", isSignal: false, isRequired: false, transformFunction: null }, maxVisibleTokens: { classPropertyName: "maxVisibleTokens", publicName: "maxVisibleTokens", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { searchTermChange: "searchTermChange", selectedChange: "selectedChange", openChange: "openChange", addOnButtonClicked: "addOnButtonClicked", allItemsSelectedChange: "allItemsSelectedChange" }, host: { listeners: { "focusout": "_focusOut($event)" } }, providers: [
819
856
  {
820
857
  provide: NG_VALUE_ACCESSOR,
821
858
  useExisting: forwardRef(() => MultiInputComponent),
@@ -824,7 +861,7 @@ class MultiInputComponent {
824
861
  MenuKeyboardService,
825
862
  registerFormItemControl(MultiInputComponent),
826
863
  contentDensityObserverProviders()
827
- ], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["control"], descendants: true, read: TemplateRef }, { propertyName: "listTemplate", first: true, predicate: ["list"], descendants: true, read: TemplateRef }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true, read: ElementRef }, { propertyName: "tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (_viewModel$ | async; as viewModel) {\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n @if (mobile) {\n <ng-template\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n ></ng-template>\n } @else {\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n [focusTrapped]=\"true\"\n [focusAutoCapture]=\"false\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-template\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n ></ng-template>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-template [ngTemplateOutlet]=\"list\"></ng-template>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n }\n </div>\n </div>\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [glyphFont]=\"glyphFont\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n [glyphAriaLabel]=\"addOnButtonAriaLabel\"\n [iconTitle]=\"addonIconTitle\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [showOverflowPopover]=\"false\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n fdMultiAnnouncer\n [multiAnnouncerOptions]=\"filterFn(dropdownValues, searchTerm)\"\n >\n @for (option of viewModel.selectedOptions; track valueFn(option.item)) {\n <fd-token\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenCloseClick(option, false, $event)\"\n (onRemove)=\"_onTokenCloseClick(option, false)\"\n [title]=\"option.label\"\n (onTokenClick)=\"_tokenElementClicked($event)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n }\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"!includes && autoComplete && !mobile\"\n [attr.placeholder]=\"viewModel.selectedOptions.length ? null : placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [ariaLabel]=\"ariaLabel || ('coreMultiInput.multiInputAriaLabel' | fdTranslate)()\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"tokenizer._hideTokens()\"\n [attr.title]=\"title\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n <ng-template #list>\n @if (viewModel.displayedOptions.length) {\n <ul\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n (keydown.tab)=\"_close()\"\n (keydown.escape)=\"_close()\"\n aria-multiselectable=\"true\"\n >\n @for (option of viewModel.displayedOptions; track valueFn(option.item); let idx = $index) {\n <li\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option, $event, idx, true)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n <ng-template\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-template>\n </li>\n }\n @if (\n showAllButton &&\n (_onlySelected$ | async) !== true &&\n viewModel.displayedOptions.length < dropdownValues.length\n ) {\n <li\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link role=\"button\" tabindex=\"0\">{{\n ('coreMultiInput.showAll' | fdTranslate: { count: dropdownValues.length })()\n }}</a>\n </li>\n }\n </ul>\n }\n </ng-template>\n <ng-template let-option=\"option\" #itemSource>\n @if (!itemTemplate) {\n <span\n fd-list-title\n fdTruncatedTitle\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value || '' : highlight\"\n ></span>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-template>\n }\n </ng-template>\n}\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}[class*=--compact] .fd-multi-input-tokenizer-custom:not([class*=--cozy]):not([class*=--condensed]),.is-compact .fd-multi-input-tokenizer-custom:not(.is-cozy):not(.is-condensed),.fd-multi-input-tokenizer-custom[class*=--compact],.fd-multi-input-tokenizer-custom.is-compact{width:calc(100% - 2rem)}.fd-multi-input__invisible-text{display:none!important}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-multi-input-menu-overflow{max-width:37.5rem}.fd-input.fd-multi-input-tokenizer-input{min-width:4rem;margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopoverComponent, selector: "fd-popover", inputs: ["config", "title", "trigger", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll", "placement", "maxWidth", "fillControlMode", "closeOnOutsideClick", "closeOnEscapeKey", "disabled", "triggers", "focusTrapped", "focusAutoCapture", "restoreFocusOnClose", "noArrow", "disableScrollbar", "appendTo", "placementContainer", "scrollStrategy", "cdkPositions", "applyOverlay", "additionalBodyClass", "additionalTriggerClass", "closeOnNavigation", "fixedPosition", "resizable", "bodyAriaLabel", "isOpen"], outputs: ["triggerChange", "isOpenChange", "beforeOpen"] }, { kind: "component", type: PopoverControlComponent, selector: "fd-popover-control, [fdPopoverControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"], outputs: ["onClose"] }, { kind: "component", type: InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "addOnText", "buttonFocusable", "type", "glyph", "glyphFont", "button", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "addonButtonAriaHidden", "iconTitle", "ariaLabelledBy", "ariaLabel"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "component", type: TokenComponent, selector: "fd-token", inputs: ["disabled", "selected", "readOnly"], outputs: ["onCloseClick", "onRemove", "onTokenClick", "onTokenKeydown", "elementFocused", "selectedChange"] }, { kind: "component", type: TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "glyphFont", "moreTerm", "open", "showOverflowPopover"], outputs: ["moreClickedEvent"] }, { kind: "component", type: FormControlComponent, selector: "input[fd-form-control], textarea[fd-form-control]", inputs: ["state", "type", "class", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: AutoCompleteDirective, selector: "[fdkAutoComplete]", inputs: ["options", "inputText", "enable", "displayFn", "matcher"], outputs: ["onComplete"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "subline", "theme", "unreadIndicator", "role", "settingsList", "settingsListFooter", "searchResultsList"], outputs: ["focusEscapeList"] }, { kind: "component", type: ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "counterRole", "counterAriaLabel", "active", "unread", "byline", "ariaRole", "id", "preventClick", "settingsListTpl", "suggestion"], outputs: ["keyDown"], exportAs: ["fdListItem"] }, { kind: "directive", type: ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap", "truncate", "scope"] }, { kind: "component", type: CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "role", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "readonly", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["emphasized", "disabled", "inverted", "subtle", "undecorated", "touchTarget"] }, { kind: "directive", type: MultiAnnouncerDirective, selector: "[fdMultiAnnouncer]", inputs: ["multiAnnouncerOptions"], exportAs: ["fdMultiAnnouncer"] }, { kind: "directive", type: TruncatedTitleDirective, selector: "[fdkTruncatedTitle], [fdTruncatedTitle], [fd-truncate-title]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SearchHighlightPipe, name: "highlight" }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
864
+ ], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["control"], descendants: true, read: TemplateRef }, { propertyName: "listTemplate", first: true, predicate: ["list"], descendants: true, read: TemplateRef }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true, read: ElementRef }, { propertyName: "tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (_viewModel$ | async; as viewModel) {\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n @if (mobile) {\n <ng-template\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n ></ng-template>\n } @else {\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n [focusTrapped]=\"true\"\n [focusAutoCapture]=\"false\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-template\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n ></ng-template>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-template [ngTemplateOutlet]=\"list\"></ng-template>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n }\n </div>\n </div>\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [glyphFont]=\"glyphFont\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n [glyphAriaLabel]=\"addOnButtonAriaLabel\"\n [iconTitle]=\"addonIconTitle\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [showOverflowPopover]=\"false\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n [externalHiddenCount]=\"hiddenCount()\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n fdMultiAnnouncer\n [multiAnnouncerOptions]=\"filterFn(dropdownValues, searchTerm)\"\n >\n @for (option of renderedTokens(); track valueFn(option.item)) {\n <fd-token\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenCloseClick(option, false, $event)\"\n (onRemove)=\"_onTokenCloseClick(option, false)\"\n [title]=\"option.label\"\n (onTokenClick)=\"_tokenElementClicked($event)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n }\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"!includes && autoComplete && !mobile\"\n [attr.placeholder]=\"viewModel.selectedOptions.length ? null : placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [ariaLabel]=\"ariaLabel || ('coreMultiInput.multiInputAriaLabel' | fdTranslate)()\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"_onInputFocus()\"\n [attr.title]=\"title\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n <ng-template #list>\n @if (viewModel.displayedOptions.length) {\n <ul\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n (keydown.tab)=\"_close()\"\n (keydown.escape)=\"_close()\"\n aria-multiselectable=\"true\"\n >\n @for (option of viewModel.displayedOptions; track valueFn(option.item); let idx = $index) {\n <li\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option, $event, idx, true)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n <ng-template\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-template>\n </li>\n }\n @if (\n showAllButton &&\n (_onlySelected$ | async) !== true &&\n viewModel.displayedOptions.length < dropdownValues.length\n ) {\n <li\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link role=\"button\" tabindex=\"0\">{{\n ('coreMultiInput.showAll' | fdTranslate: { count: dropdownValues.length })()\n }}</a>\n </li>\n }\n </ul>\n }\n </ng-template>\n <ng-template let-option=\"option\" #itemSource>\n @if (!itemTemplate) {\n <span\n fd-list-title\n fdTruncatedTitle\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value || '' : highlight\"\n ></span>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-template>\n }\n </ng-template>\n}\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}[class*=--compact] .fd-multi-input-tokenizer-custom:not([class*=--cozy]):not([class*=--condensed]),.is-compact .fd-multi-input-tokenizer-custom:not(.is-cozy):not(.is-condensed),.fd-multi-input-tokenizer-custom[class*=--compact],.fd-multi-input-tokenizer-custom.is-compact{width:calc(100% - 2rem)}.fd-multi-input__invisible-text{display:none!important}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-multi-input-menu-overflow{max-width:37.5rem}.fd-input.fd-multi-input-tokenizer-input{min-width:4rem;margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopoverComponent, selector: "fd-popover", inputs: ["config", "title", "trigger", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll", "placement", "maxWidth", "fillControlMode", "closeOnOutsideClick", "closeOnEscapeKey", "disabled", "triggers", "focusTrapped", "focusAutoCapture", "restoreFocusOnClose", "noArrow", "disableScrollbar", "appendTo", "placementContainer", "scrollStrategy", "cdkPositions", "applyOverlay", "additionalBodyClass", "additionalTriggerClass", "closeOnNavigation", "fixedPosition", "resizable", "bodyAriaLabel", "bodyRole", "bodyAriaLabelledBy", "isOpen"], outputs: ["triggerChange", "isOpenChange", "beforeOpen"] }, { kind: "component", type: PopoverControlComponent, selector: "fd-popover-control, [fdPopoverControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"], outputs: ["onClose"] }, { kind: "component", type: InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "addOnText", "buttonFocusable", "type", "glyph", "glyphFont", "button", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "addonButtonAriaHidden", "iconTitle", "ariaLabelledBy", "ariaLabel"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "component", type: TokenComponent, selector: "fd-token", inputs: ["disabled", "selected", "readOnly"], outputs: ["onCloseClick", "onRemove", "onTokenClick", "onTokenKeydown", "elementFocused", "selectedChange"] }, { kind: "component", type: TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "glyphFont", "moreTerm", "open", "showOverflowPopover", "externalHiddenCount"], outputs: ["moreClickedEvent"] }, { kind: "component", type: FormControlComponent, selector: "input[fd-form-control], textarea[fd-form-control]", inputs: ["state", "type", "class", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: AutoCompleteDirective, selector: "[fdkAutoComplete]", inputs: ["options", "inputText", "enable", "displayFn", "matcher"], outputs: ["onComplete"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "subline", "theme", "unreadIndicator", "role", "settingsList", "settingsListFooter", "searchResultsList"], outputs: ["focusEscapeList"] }, { kind: "component", type: ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "counterRole", "counterAriaLabel", "active", "unread", "byline", "ariaRole", "id", "preventClick", "settingsListTpl", "suggestion"], outputs: ["keyDown"], exportAs: ["fdListItem"] }, { kind: "directive", type: ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap", "truncate", "scope"] }, { kind: "component", type: CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "role", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "readonly", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["emphasized", "disabled", "inverted", "subtle", "undecorated", "touchTarget"] }, { kind: "directive", type: MultiAnnouncerDirective, selector: "[fdMultiAnnouncer]", inputs: ["multiAnnouncerOptions"], exportAs: ["fdMultiAnnouncer"] }, { kind: "directive", type: TruncatedTitleDirective, selector: "[fdkTruncatedTitle], [fdTruncatedTitle], [fd-truncate-title]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SearchHighlightPipe, name: "highlight" }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
828
865
  }
829
866
  __decorate([
830
867
  applyCssClass,
@@ -868,7 +905,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
868
905
  FdTranslatePipe,
869
906
  MultiAnnouncerDirective,
870
907
  TruncatedTitleDirective
871
- ], template: "@if (_viewModel$ | async; as viewModel) {\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n @if (mobile) {\n <ng-template\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n ></ng-template>\n } @else {\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n [focusTrapped]=\"true\"\n [focusAutoCapture]=\"false\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-template\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n ></ng-template>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-template [ngTemplateOutlet]=\"list\"></ng-template>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n }\n </div>\n </div>\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [glyphFont]=\"glyphFont\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n [glyphAriaLabel]=\"addOnButtonAriaLabel\"\n [iconTitle]=\"addonIconTitle\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [showOverflowPopover]=\"false\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n fdMultiAnnouncer\n [multiAnnouncerOptions]=\"filterFn(dropdownValues, searchTerm)\"\n >\n @for (option of viewModel.selectedOptions; track valueFn(option.item)) {\n <fd-token\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenCloseClick(option, false, $event)\"\n (onRemove)=\"_onTokenCloseClick(option, false)\"\n [title]=\"option.label\"\n (onTokenClick)=\"_tokenElementClicked($event)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n }\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"!includes && autoComplete && !mobile\"\n [attr.placeholder]=\"viewModel.selectedOptions.length ? null : placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [ariaLabel]=\"ariaLabel || ('coreMultiInput.multiInputAriaLabel' | fdTranslate)()\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"tokenizer._showAllTokens()\"\n (blur)=\"tokenizer._hideTokens()\"\n [attr.title]=\"title\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n <ng-template #list>\n @if (viewModel.displayedOptions.length) {\n <ul\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n (keydown.tab)=\"_close()\"\n (keydown.escape)=\"_close()\"\n aria-multiselectable=\"true\"\n >\n @for (option of viewModel.displayedOptions; track valueFn(option.item); let idx = $index) {\n <li\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option, $event, idx, true)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n <ng-template\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-template>\n </li>\n }\n @if (\n showAllButton &&\n (_onlySelected$ | async) !== true &&\n viewModel.displayedOptions.length < dropdownValues.length\n ) {\n <li\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link role=\"button\" tabindex=\"0\">{{\n ('coreMultiInput.showAll' | fdTranslate: { count: dropdownValues.length })()\n }}</a>\n </li>\n }\n </ul>\n }\n </ng-template>\n <ng-template let-option=\"option\" #itemSource>\n @if (!itemTemplate) {\n <span\n fd-list-title\n fdTruncatedTitle\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value || '' : highlight\"\n ></span>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-template>\n }\n </ng-template>\n}\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}[class*=--compact] .fd-multi-input-tokenizer-custom:not([class*=--cozy]):not([class*=--condensed]),.is-compact .fd-multi-input-tokenizer-custom:not(.is-cozy):not(.is-condensed),.fd-multi-input-tokenizer-custom[class*=--compact],.fd-multi-input-tokenizer-custom.is-compact{width:calc(100% - 2rem)}.fd-multi-input__invisible-text{display:none!important}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-multi-input-menu-overflow{max-width:37.5rem}.fd-input.fd-multi-input-tokenizer-input{min-width:4rem;margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"] }]
908
+ ], template: "@if (_viewModel$ | async; as viewModel) {\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n @if (mobile) {\n <ng-template\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n ></ng-template>\n } @else {\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"_popoverMaxWidth\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n [focusTrapped]=\"true\"\n [focusAutoCapture]=\"false\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-template\n [ngTemplateOutlet]=\"control\"\n [ngTemplateOutletContext]=\"{ displayAddonButton: displayAddonButton }\"\n ></ng-template>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!viewModel.displayedOptions.length\"\n >\n <ng-template [ngTemplateOutlet]=\"list\"></ng-template>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n }\n </div>\n </div>\n <ng-template #control let-showAddonButton=\"displayAddonButton\">\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"showAddonButton\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && viewModel.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"showAddonButton ? glyph : ''\"\n [glyphFont]=\"glyphFont\"\n (addOnButtonClicked)=\"_addOnButtonClicked($event)\"\n [glyphAriaLabel]=\"addOnButtonAriaLabel\"\n [iconTitle]=\"addonIconTitle\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"compactCollapse\"\n [showOverflowPopover]=\"false\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n [externalHiddenCount]=\"hiddenCount()\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n tabindex=\"-1\"\n fdMultiAnnouncer\n [multiAnnouncerOptions]=\"filterFn(dropdownValues, searchTerm)\"\n >\n @for (option of renderedTokens(); track valueFn(option.item)) {\n <fd-token\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenCloseClick(option, false, $event)\"\n (onRemove)=\"_onTokenCloseClick(option, false)\"\n [title]=\"option.label\"\n (onTokenClick)=\"_tokenElementClicked($event)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n }\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fdkAutoComplete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [matcher]=\"typeAheadMatcher\"\n [inputText]=\"_searchTermCtrl.value || ''\"\n [options]=\"dropdownValues\"\n [enable]=\"!includes && autoComplete && !mobile\"\n [attr.placeholder]=\"viewModel.selectedOptions.length ? null : placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [attr.aria-required]=\"required\"\n [ariaLabel]=\"ariaLabel || ('coreMultiInput.multiInputAriaLabel' | fdTranslate)()\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n (focus)=\"_onInputFocus()\"\n [attr.title]=\"title\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n <ng-template #list>\n @if (viewModel.displayedOptions.length) {\n <ul\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [style.max-height]=\"!mobile ? maxHeight : 'auto'\"\n [byline]=\"byline\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.min-width]=\"'100%'\"\n (keydown.tab)=\"_close()\"\n (keydown.escape)=\"_close()\"\n aria-multiselectable=\"true\"\n >\n @for (option of viewModel.displayedOptions; track valueFn(option.item); let idx = $index) {\n <li\n fd-list-item\n [attr.aria-label]=\"option.label\"\n (click)=\"_onCheckboxClick(option, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option, $event, idx, true)\"\n [selected]=\"!!option.isSelected\"\n >\n <fd-checkbox (click)=\"_onCheckboxClick(option, $event, idx)\" [value]=\"option.isSelected\">\n <!-- TODO -->\n </fd-checkbox>\n <ng-template\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-template>\n </li>\n }\n @if (\n showAllButton &&\n (_onlySelected$ | async) !== true &&\n viewModel.displayedOptions.length < dropdownValues.length\n ) {\n <li\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link role=\"button\" tabindex=\"0\">{{\n ('coreMultiInput.showAll' | fdTranslate: { count: dropdownValues.length })()\n }}</a>\n </li>\n }\n </ul>\n }\n </ng-template>\n <ng-template let-option=\"option\" #itemSource>\n @if (!itemTemplate) {\n <span\n fd-list-title\n fdTruncatedTitle\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value || '' : highlight\"\n ></span>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-template>\n }\n </ng-template>\n}\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}[class*=--compact] .fd-multi-input-tokenizer-custom:not([class*=--cozy]):not([class*=--condensed]),.is-compact .fd-multi-input-tokenizer-custom:not(.is-cozy):not(.is-condensed),.fd-multi-input-tokenizer-custom[class*=--compact],.fd-multi-input-tokenizer-custom.is-compact{width:calc(100% - 2rem)}.fd-multi-input__invisible-text{display:none!important}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-multi-input-menu-overflow{max-width:37.5rem}.fd-input.fd-multi-input-tokenizer-input{min-width:4rem;margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"] }]
872
909
  }], ctorParameters: () => [], propDecorators: { placeholder: [{
873
910
  type: Input
874
911
  }], disabled: [{
@@ -975,7 +1012,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
975
1012
  }], tokenizer: [{
976
1013
  type: ViewChild,
977
1014
  args: [TokenizerComponent]
978
- }], buildComponentCssClass: [] } });
1015
+ }], maxVisibleTokens: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisibleTokens", required: false }] }], buildComponentCssClass: [] } });
979
1016
 
980
1017
  /**
981
1018
  * @deprecated