ngx-bootstrap 21.2.0 → 21.2.1

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.
@@ -1,10 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { output, HostListener, ViewChildren, ViewChild, Component, Injectable, input, EventEmitter, Directive, NgModule } from '@angular/core';
3
- import { Utils } from 'ngx-bootstrap/utils';
3
+ import { Utils, animateExpand } from 'ngx-bootstrap/utils';
4
4
  import * as i1 from 'ngx-bootstrap/positioning';
5
5
  import { PositioningService } from 'ngx-bootstrap/positioning';
6
6
  import { Subscription, isObservable, EMPTY, from } from 'rxjs';
7
- import { trigger, state, style, transition, animate } from '@angular/animations';
8
7
  import { NgTemplateOutlet, CommonModule } from '@angular/common';
9
8
  import * as i3 from '@angular/forms';
10
9
  import * as i1$1 from 'ngx-bootstrap/component-loader';
@@ -937,20 +936,8 @@ function getValueFromObject(object, option) {
937
936
  return object.toString();
938
937
  }
939
938
 
940
- const TYPEAHEAD_ANIMATION_TIMING = '220ms cubic-bezier(0, 0, 0.2, 1)';
941
- const typeaheadAnimation = trigger('typeaheadAnimation', [
942
- state('animated-down', style({ height: '*', overflow: 'hidden' })),
943
- transition('* => animated-down', [
944
- style({ height: 0, overflow: 'hidden' }),
945
- animate(TYPEAHEAD_ANIMATION_TIMING)
946
- ]),
947
- state('animated-up', style({ height: '*', overflow: 'hidden' })),
948
- transition('* => animated-up', [
949
- style({ height: '*', overflow: 'hidden' }),
950
- animate(TYPEAHEAD_ANIMATION_TIMING)
951
- ]),
952
- transition('* => unanimated', animate('0s'))
953
- ]);
939
+ const TYPEAHEAD_ANIMATION_DURATION_MS = 220;
940
+ const TYPEAHEAD_ANIMATION_TIMING = `${TYPEAHEAD_ANIMATION_DURATION_MS}ms cubic-bezier(0, 0, 0.2, 1)`;
954
941
 
955
942
  class TypeaheadContainerComponent {
956
943
  get typeaheadTemplateMethods() {
@@ -968,18 +955,26 @@ class TypeaheadContainerComponent {
968
955
  // eslint-disable-next-line @angular-eslint/no-output-rename
969
956
  this.activeChangeEvent = output({ alias: 'activeChange' });
970
957
  this.isFocused = false;
958
+ this._animationPlayed = false;
971
959
  this.positionServiceSubscription = new Subscription();
972
960
  this.height = 0;
973
961
  this.popupId = '';
974
962
  this._matches = [];
963
+ // Start hidden before the first paint; position-service event will reveal or animate it.
964
+ // Using max-height (not height) avoids conflict with the [style.height] host binding.
965
+ this.renderer.setStyle(this.element.nativeElement, 'max-height', '0');
966
+ this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
975
967
  this.positionServiceSubscription.add(this.positionService.event$?.subscribe(() => {
976
- if (this.isAnimated) {
977
- this.animationState = this.isTopPosition ? 'animated-up' : 'animated-down';
978
- this.changeDetectorRef.detectChanges();
979
- return;
968
+ if (!this._animationPlayed) {
969
+ this._animationPlayed = true;
970
+ if (this.isAnimated) {
971
+ this._animateExpand(this.element.nativeElement);
972
+ }
973
+ else {
974
+ this.renderer.removeStyle(this.element.nativeElement, 'max-height');
975
+ this.renderer.removeStyle(this.element.nativeElement, 'overflow');
976
+ }
980
977
  }
981
- this.animationState = 'unanimated';
982
- this.changeDetectorRef.detectChanges();
983
978
  }));
984
979
  }
985
980
  get active() {
@@ -1006,12 +1001,12 @@ class TypeaheadContainerComponent {
1006
1001
  }
1007
1002
  if (this.typeaheadIsFirstItemActive && this._matches.length > 0) {
1008
1003
  this.setActive(this._matches[0]);
1009
- if (this._active?.isHeader()) {
1004
+ if (this.active?.isHeader()) {
1010
1005
  this.nextActiveMatch();
1011
1006
  }
1012
1007
  }
1013
- if (this._active && !this.typeaheadIsFirstItemActive) {
1014
- const concurrency = this._matches.find(match => match.value === this._active?.value);
1008
+ if (this.active && !this.typeaheadIsFirstItemActive) {
1009
+ const concurrency = this._matches.find(match => match.value === this.active?.value);
1015
1010
  if (concurrency) {
1016
1011
  this.selectActive(concurrency);
1017
1012
  this.changeDetectorRef.markForCheck();
@@ -1050,27 +1045,28 @@ class TypeaheadContainerComponent {
1050
1045
  return !!this.parent?.selectItemOnBlur;
1051
1046
  }
1052
1047
  selectActiveMatch(isActiveItemChanged) {
1053
- if (this._active && this.parent?.typeaheadSelectFirstItem()) {
1054
- this.selectMatch(this._active);
1048
+ if (this.active && this.parent?.typeaheadSelectFirstItem()) {
1049
+ this.selectMatch(this.active);
1055
1050
  }
1056
1051
  if (!this.parent?.typeaheadSelectFirstItem() && isActiveItemChanged) {
1057
- this.selectMatch(this._active);
1052
+ this.selectMatch(this.active);
1058
1053
  }
1059
1054
  }
1060
1055
  activeChanged() {
1061
- if (!this._active) {
1056
+ if (!this.active) {
1057
+ this.activeChangeEvent.emit('');
1062
1058
  return;
1063
1059
  }
1064
- const index = this.matches.indexOf(this._active);
1060
+ const index = this.matches.indexOf(this.active);
1065
1061
  this.activeChangeEvent.emit(`${this.popupId}-${index}`);
1066
1062
  }
1067
1063
  prevActiveMatch() {
1068
- if (!this._active) {
1064
+ if (!this.active) {
1069
1065
  return;
1070
1066
  }
1071
- const index = this.matches.indexOf(this._active);
1067
+ const index = this.matches.indexOf(this.active);
1072
1068
  this.setActive(this.matches[index - 1 < 0 ? this.matches.length - 1 : index - 1]);
1073
- if (this._active.isHeader()) {
1069
+ if (this.active.isHeader()) {
1074
1070
  this.prevActiveMatch();
1075
1071
  }
1076
1072
  if (this.typeaheadScrollable) {
@@ -1078,9 +1074,9 @@ class TypeaheadContainerComponent {
1078
1074
  }
1079
1075
  }
1080
1076
  nextActiveMatch() {
1081
- const index = this._active ? this.matches.indexOf(this._active) : -1;
1077
+ const index = this.active ? this.matches.indexOf(this.active) : -1;
1082
1078
  this.setActive(this.matches[index + 1 > this.matches.length - 1 ? 0 : index + 1]);
1083
- if (this._active?.isHeader()) {
1079
+ if (this.active?.isHeader()) {
1084
1080
  this.nextActiveMatch();
1085
1081
  }
1086
1082
  if (this.typeaheadScrollable) {
@@ -1195,13 +1191,24 @@ class TypeaheadContainerComponent {
1195
1191
  }
1196
1192
  }
1197
1193
  }
1194
+ _animateExpand(el) {
1195
+ // el is already at max-height: 0; overflow: hidden (set in constructor).
1196
+ // Animating max-height avoids conflict with the [style.height] host binding.
1197
+ this._cancelExpandAnimation?.();
1198
+ this._cancelExpandAnimation = animateExpand(this.renderer, el, {
1199
+ property: 'max-height',
1200
+ timing: TYPEAHEAD_ANIMATION_TIMING,
1201
+ durationMs: TYPEAHEAD_ANIMATION_DURATION_MS
1202
+ });
1203
+ }
1198
1204
  ngOnDestroy() {
1205
+ this._cancelExpandAnimation?.();
1199
1206
  this.positionServiceSubscription.unsubscribe();
1200
1207
  }
1201
1208
  setActive(value) {
1202
- this._active = value;
1209
+ this.active = value;
1203
1210
  let preview;
1204
- if (!(this._active == null || this._active.isHeader())) {
1211
+ if (!(this.active == null || this.active.isHeader())) {
1205
1212
  preview = value;
1206
1213
  }
1207
1214
  this.parent?.typeaheadOnPreview.emit(preview);
@@ -1230,7 +1237,7 @@ class TypeaheadContainerComponent {
1230
1237
  this.ulElement.nativeElement.scrollTop = 0;
1231
1238
  }
1232
1239
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TypeaheadContainerComponent, deps: [{ token: i1.PositioningService }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1233
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: TypeaheadContainerComponent, isStandalone: true, selector: "typeahead-container", outputs: { activeChangeEvent: "activeChange" }, host: { listeners: { "mouseleave": "focusLost()", "blur": "focusLost()" }, properties: { "style.height": "needScrollbar ? guiHeight: 'auto'", "style.visibility": "'inherit'", "class.dropup": "dropup", "attr.role": "'listbox'" }, styleAttribute: "position: absolute;display: block;", classAttribute: "dropdown open bottom dropdown-menu" }, providers: [PositioningService], viewQueries: [{ propertyName: "ulElement", first: true, predicate: ["ulElement"], descendants: true }, { propertyName: "liElements", predicate: ["liElements"], descendants: true }], ngImport: i0, template: "<!-- inject options list template -->\n<ng-template [ngTemplateOutlet]=\"optionsListTemplate || bs4Template\"\n [ngTemplateOutletContext]=\"{\n matches: matches,\n itemTemplate: itemTemplate || bsItemTemplate,\n query: query,\n $implicit: typeaheadTemplateMethods\n }\">\n</ng-template>\n\n<!-- default options item template -->\n<ng-template #bsItemTemplate let-match=\"match\" let-query=\"query\">\n <span [innerHtml]=\"highlight(match, query)\"></span>\n</ng-template>\n\n<!-- Bootstrap 4 options list template -->\n<ng-template #bs4Template>\n @for (match of matches; track match; let i = $index) {\n @if (match.isHeader()) {\n <h6 class=\"dropdown-header\">{{ match }}</h6>\n }\n @if (!match.isHeader()) {\n <button #liElements\n [id]=\"popupId + '-' + i\"\n role=\"option\"\n [@typeaheadAnimation]=\"animationState\"\n class=\"dropdown-item\"\n (click)=\"selectMatch(match, $event)\"\n (mouseenter)=\"selectActive(match)\"\n [class.active]=\"isActive(match)\">\n <ng-template [ngTemplateOutlet]=\"itemTemplate || bsItemTemplate\"\n [ngTemplateOutletContext]=\"{item: match.item, index: i, match: match, query: query}\">\n </ng-template>\n </button>\n }\n }\n</ng-template>\n", styles: [":host.dropdown{z-index:1000}:host.dropdown-menu,.dropdown-menu{overflow-y:auto;height:100px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [typeaheadAnimation] }); }
1240
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: TypeaheadContainerComponent, isStandalone: true, selector: "typeahead-container", outputs: { activeChangeEvent: "activeChange" }, host: { listeners: { "mouseleave": "focusLost()", "blur": "focusLost()" }, properties: { "style.height": "needScrollbar ? guiHeight: 'auto'", "style.visibility": "'inherit'", "class.dropup": "dropup", "attr.role": "'listbox'" }, styleAttribute: "position: absolute;display: block;", classAttribute: "dropdown open bottom dropdown-menu" }, providers: [PositioningService], viewQueries: [{ propertyName: "ulElement", first: true, predicate: ["ulElement"], descendants: true }, { propertyName: "liElements", predicate: ["liElements"], descendants: true }], ngImport: i0, template: "<!-- inject options list template -->\n<ng-template [ngTemplateOutlet]=\"optionsListTemplate || bs4Template\"\n [ngTemplateOutletContext]=\"{\n matches: matches,\n itemTemplate: itemTemplate || bsItemTemplate,\n query: query,\n $implicit: typeaheadTemplateMethods\n }\">\n</ng-template>\n\n<!-- default options item template -->\n<ng-template #bsItemTemplate let-match=\"match\" let-query=\"query\">\n <span [innerHtml]=\"highlight(match, query)\"></span>\n</ng-template>\n\n<!-- Bootstrap 4 options list template -->\n<ng-template #bs4Template>\n @for (match of matches; track match; let i = $index) {\n @if (match.isHeader()) {\n <h6 class=\"dropdown-header\">{{ match }}</h6>\n }\n @if (!match.isHeader()) {\n <button #liElements\n [id]=\"popupId + '-' + i\"\n role=\"option\"\n class=\"dropdown-item\"\n (click)=\"selectMatch(match, $event)\"\n (mouseenter)=\"selectActive(match)\"\n [class.active]=\"isActive(match)\">\n <ng-template [ngTemplateOutlet]=\"itemTemplate || bsItemTemplate\"\n [ngTemplateOutletContext]=\"{item: match.item, index: i, match: match, query: query}\">\n </ng-template>\n </button>\n }\n }\n</ng-template>\n", styles: [":host.dropdown{z-index:1000}:host.dropdown-menu,.dropdown-menu{overflow-y:auto;height:100px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
1234
1241
  }
1235
1242
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TypeaheadContainerComponent, decorators: [{
1236
1243
  type: Component,
@@ -1241,7 +1248,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1241
1248
  '[class.dropup]': 'dropup',
1242
1249
  style: 'position: absolute;display: block;',
1243
1250
  '[attr.role]': `'listbox'`
1244
- }, animations: [typeaheadAnimation], standalone: true, imports: [NgTemplateOutlet], providers: [PositioningService], template: "<!-- inject options list template -->\n<ng-template [ngTemplateOutlet]=\"optionsListTemplate || bs4Template\"\n [ngTemplateOutletContext]=\"{\n matches: matches,\n itemTemplate: itemTemplate || bsItemTemplate,\n query: query,\n $implicit: typeaheadTemplateMethods\n }\">\n</ng-template>\n\n<!-- default options item template -->\n<ng-template #bsItemTemplate let-match=\"match\" let-query=\"query\">\n <span [innerHtml]=\"highlight(match, query)\"></span>\n</ng-template>\n\n<!-- Bootstrap 4 options list template -->\n<ng-template #bs4Template>\n @for (match of matches; track match; let i = $index) {\n @if (match.isHeader()) {\n <h6 class=\"dropdown-header\">{{ match }}</h6>\n }\n @if (!match.isHeader()) {\n <button #liElements\n [id]=\"popupId + '-' + i\"\n role=\"option\"\n [@typeaheadAnimation]=\"animationState\"\n class=\"dropdown-item\"\n (click)=\"selectMatch(match, $event)\"\n (mouseenter)=\"selectActive(match)\"\n [class.active]=\"isActive(match)\">\n <ng-template [ngTemplateOutlet]=\"itemTemplate || bsItemTemplate\"\n [ngTemplateOutletContext]=\"{item: match.item, index: i, match: match, query: query}\">\n </ng-template>\n </button>\n }\n }\n</ng-template>\n", styles: [":host.dropdown{z-index:1000}:host.dropdown-menu,.dropdown-menu{overflow-y:auto;height:100px}\n"] }]
1251
+ }, standalone: true, imports: [NgTemplateOutlet], providers: [PositioningService], template: "<!-- inject options list template -->\n<ng-template [ngTemplateOutlet]=\"optionsListTemplate || bs4Template\"\n [ngTemplateOutletContext]=\"{\n matches: matches,\n itemTemplate: itemTemplate || bsItemTemplate,\n query: query,\n $implicit: typeaheadTemplateMethods\n }\">\n</ng-template>\n\n<!-- default options item template -->\n<ng-template #bsItemTemplate let-match=\"match\" let-query=\"query\">\n <span [innerHtml]=\"highlight(match, query)\"></span>\n</ng-template>\n\n<!-- Bootstrap 4 options list template -->\n<ng-template #bs4Template>\n @for (match of matches; track match; let i = $index) {\n @if (match.isHeader()) {\n <h6 class=\"dropdown-header\">{{ match }}</h6>\n }\n @if (!match.isHeader()) {\n <button #liElements\n [id]=\"popupId + '-' + i\"\n role=\"option\"\n class=\"dropdown-item\"\n (click)=\"selectMatch(match, $event)\"\n (mouseenter)=\"selectActive(match)\"\n [class.active]=\"isActive(match)\">\n <ng-template [ngTemplateOutlet]=\"itemTemplate || bsItemTemplate\"\n [ngTemplateOutletContext]=\"{item: match.item, index: i, match: match, query: query}\">\n </ng-template>\n </button>\n }\n }\n</ng-template>\n", styles: [":host.dropdown{z-index:1000}:host.dropdown-menu,.dropdown-menu{overflow-y:auto;height:100px}\n"] }]
1245
1252
  }], ctorParameters: () => [{ type: i1.PositioningService }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { activeChangeEvent: [{ type: i0.Output, args: ["activeChange"] }], ulElement: [{
1246
1253
  type: ViewChild,
1247
1254
  args: ['ulElement', { static: false }]
@@ -1596,7 +1603,7 @@ class TypeaheadDirective {
1596
1603
  this._container.matches = this._matches;
1597
1604
  this.element.nativeElement.focus();
1598
1605
  this._container.activeChangeEvent.subscribe((activeId) => {
1599
- this.activeDescendant = activeId;
1606
+ this.activeDescendant = activeId || undefined;
1600
1607
  this.changeDetection.markForCheck();
1601
1608
  });
1602
1609
  this.isOpen = true;
@@ -1607,6 +1614,7 @@ class TypeaheadDirective {
1607
1614
  this._outsideClickListener();
1608
1615
  this._container = void 0;
1609
1616
  this.isOpen = false;
1617
+ this.activeDescendant = void 0;
1610
1618
  this.changeDetection.markForCheck();
1611
1619
  }
1612
1620
  this.typeaheadOnPreview.emit(undefined);
@@ -1807,7 +1815,7 @@ class TypeaheadDirective {
1807
1815
  return false;
1808
1816
  }
1809
1817
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TypeaheadDirective, deps: [{ token: i1$1.ComponentLoaderFactory }, { token: TypeaheadConfig }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i3.NgControl }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }
1810
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: TypeaheadDirective, isStandalone: true, selector: "[typeahead]", inputs: { typeahead: { classPropertyName: "typeahead", publicName: "typeahead", isSignal: true, isRequired: false, transformFunction: null }, typeaheadMinLength: { classPropertyName: "typeaheadMinLength", publicName: "typeaheadMinLength", isSignal: true, isRequired: false, transformFunction: null }, adaptivePosition: { classPropertyName: "adaptivePosition", publicName: "adaptivePosition", isSignal: true, isRequired: false, transformFunction: null }, isAnimated: { classPropertyName: "isAnimated", publicName: "isAnimated", isSignal: true, isRequired: false, transformFunction: null }, typeaheadWaitMs: { classPropertyName: "typeaheadWaitMs", publicName: "typeaheadWaitMs", isSignal: true, isRequired: false, transformFunction: null }, typeaheadOptionsLimit: { classPropertyName: "typeaheadOptionsLimit", publicName: "typeaheadOptionsLimit", isSignal: true, isRequired: false, transformFunction: null }, typeaheadOptionField: { classPropertyName: "typeaheadOptionField", publicName: "typeaheadOptionField", isSignal: true, isRequired: false, transformFunction: null }, typeaheadGroupField: { classPropertyName: "typeaheadGroupField", publicName: "typeaheadGroupField", isSignal: true, isRequired: false, transformFunction: null }, typeaheadOrderBy: { classPropertyName: "typeaheadOrderBy", publicName: "typeaheadOrderBy", isSignal: true, isRequired: false, transformFunction: null }, typeaheadAsync: { classPropertyName: "typeaheadAsync", publicName: "typeaheadAsync", isSignal: true, isRequired: false, transformFunction: null }, typeaheadLatinize: { classPropertyName: "typeaheadLatinize", publicName: "typeaheadLatinize", isSignal: true, isRequired: false, transformFunction: null }, typeaheadSingleWords: { classPropertyName: "typeaheadSingleWords", publicName: "typeaheadSingleWords", isSignal: true, isRequired: false, transformFunction: null }, typeaheadWordDelimiters: { classPropertyName: "typeaheadWordDelimiters", publicName: "typeaheadWordDelimiters", isSignal: true, isRequired: false, transformFunction: null }, typeaheadMultipleSearch: { classPropertyName: "typeaheadMultipleSearch", publicName: "typeaheadMultipleSearch", isSignal: true, isRequired: false, transformFunction: null }, typeaheadMultipleSearchDelimiters: { classPropertyName: "typeaheadMultipleSearchDelimiters", publicName: "typeaheadMultipleSearchDelimiters", isSignal: true, isRequired: false, transformFunction: null }, typeaheadPhraseDelimiters: { classPropertyName: "typeaheadPhraseDelimiters", publicName: "typeaheadPhraseDelimiters", isSignal: true, isRequired: false, transformFunction: null }, typeaheadItemTemplate: { classPropertyName: "typeaheadItemTemplate", publicName: "typeaheadItemTemplate", isSignal: true, isRequired: false, transformFunction: null }, optionsListTemplate: { classPropertyName: "optionsListTemplate", publicName: "optionsListTemplate", isSignal: true, isRequired: false, transformFunction: null }, typeaheadScrollable: { classPropertyName: "typeaheadScrollable", publicName: "typeaheadScrollable", isSignal: true, isRequired: false, transformFunction: null }, typeaheadOptionsInScrollableView: { classPropertyName: "typeaheadOptionsInScrollableView", publicName: "typeaheadOptionsInScrollableView", isSignal: true, isRequired: false, transformFunction: null }, typeaheadHideResultsOnBlur: { classPropertyName: "typeaheadHideResultsOnBlur", publicName: "typeaheadHideResultsOnBlur", isSignal: true, isRequired: false, transformFunction: null }, typeaheadSelectFirstItem: { classPropertyName: "typeaheadSelectFirstItem", publicName: "typeaheadSelectFirstItem", isSignal: true, isRequired: false, transformFunction: null }, typeaheadIsFirstItemActive: { classPropertyName: "typeaheadIsFirstItemActive", publicName: "typeaheadIsFirstItemActive", isSignal: true, isRequired: false, transformFunction: null }, container: { classPropertyName: "container", publicName: "container", isSignal: true, isRequired: false, transformFunction: null }, dropup: { classPropertyName: "dropup", publicName: "dropup", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { typeaheadLoading: "typeaheadLoading", typeaheadNoResults: "typeaheadNoResults", typeaheadOnSelect: "typeaheadOnSelect", typeaheadOnPreview: "typeaheadOnPreview", typeaheadOnBlur: "typeaheadOnBlur" }, host: { listeners: { "input": "onInput($event)", "keyup": "onChange($event)", "click": "onFocus()", "focus": "onFocus()", "blur": "onBlur()", "keydown": "onKeydown($event)" }, properties: { "attr.aria-activedescendant": "activeDescendant", "attr.aria-owns": "isOpen ? popupId : null", "attr.aria-expanded": "isOpen", "attr.aria-autocomplete": "list" } }, providers: [ComponentLoaderFactory, PositioningService], exportAs: ["bs-typeahead"], ngImport: i0 }); }
1818
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: TypeaheadDirective, isStandalone: true, selector: "[typeahead]", inputs: { typeahead: { classPropertyName: "typeahead", publicName: "typeahead", isSignal: true, isRequired: false, transformFunction: null }, typeaheadMinLength: { classPropertyName: "typeaheadMinLength", publicName: "typeaheadMinLength", isSignal: true, isRequired: false, transformFunction: null }, adaptivePosition: { classPropertyName: "adaptivePosition", publicName: "adaptivePosition", isSignal: true, isRequired: false, transformFunction: null }, isAnimated: { classPropertyName: "isAnimated", publicName: "isAnimated", isSignal: true, isRequired: false, transformFunction: null }, typeaheadWaitMs: { classPropertyName: "typeaheadWaitMs", publicName: "typeaheadWaitMs", isSignal: true, isRequired: false, transformFunction: null }, typeaheadOptionsLimit: { classPropertyName: "typeaheadOptionsLimit", publicName: "typeaheadOptionsLimit", isSignal: true, isRequired: false, transformFunction: null }, typeaheadOptionField: { classPropertyName: "typeaheadOptionField", publicName: "typeaheadOptionField", isSignal: true, isRequired: false, transformFunction: null }, typeaheadGroupField: { classPropertyName: "typeaheadGroupField", publicName: "typeaheadGroupField", isSignal: true, isRequired: false, transformFunction: null }, typeaheadOrderBy: { classPropertyName: "typeaheadOrderBy", publicName: "typeaheadOrderBy", isSignal: true, isRequired: false, transformFunction: null }, typeaheadAsync: { classPropertyName: "typeaheadAsync", publicName: "typeaheadAsync", isSignal: true, isRequired: false, transformFunction: null }, typeaheadLatinize: { classPropertyName: "typeaheadLatinize", publicName: "typeaheadLatinize", isSignal: true, isRequired: false, transformFunction: null }, typeaheadSingleWords: { classPropertyName: "typeaheadSingleWords", publicName: "typeaheadSingleWords", isSignal: true, isRequired: false, transformFunction: null }, typeaheadWordDelimiters: { classPropertyName: "typeaheadWordDelimiters", publicName: "typeaheadWordDelimiters", isSignal: true, isRequired: false, transformFunction: null }, typeaheadMultipleSearch: { classPropertyName: "typeaheadMultipleSearch", publicName: "typeaheadMultipleSearch", isSignal: true, isRequired: false, transformFunction: null }, typeaheadMultipleSearchDelimiters: { classPropertyName: "typeaheadMultipleSearchDelimiters", publicName: "typeaheadMultipleSearchDelimiters", isSignal: true, isRequired: false, transformFunction: null }, typeaheadPhraseDelimiters: { classPropertyName: "typeaheadPhraseDelimiters", publicName: "typeaheadPhraseDelimiters", isSignal: true, isRequired: false, transformFunction: null }, typeaheadItemTemplate: { classPropertyName: "typeaheadItemTemplate", publicName: "typeaheadItemTemplate", isSignal: true, isRequired: false, transformFunction: null }, optionsListTemplate: { classPropertyName: "optionsListTemplate", publicName: "optionsListTemplate", isSignal: true, isRequired: false, transformFunction: null }, typeaheadScrollable: { classPropertyName: "typeaheadScrollable", publicName: "typeaheadScrollable", isSignal: true, isRequired: false, transformFunction: null }, typeaheadOptionsInScrollableView: { classPropertyName: "typeaheadOptionsInScrollableView", publicName: "typeaheadOptionsInScrollableView", isSignal: true, isRequired: false, transformFunction: null }, typeaheadHideResultsOnBlur: { classPropertyName: "typeaheadHideResultsOnBlur", publicName: "typeaheadHideResultsOnBlur", isSignal: true, isRequired: false, transformFunction: null }, typeaheadSelectFirstItem: { classPropertyName: "typeaheadSelectFirstItem", publicName: "typeaheadSelectFirstItem", isSignal: true, isRequired: false, transformFunction: null }, typeaheadIsFirstItemActive: { classPropertyName: "typeaheadIsFirstItemActive", publicName: "typeaheadIsFirstItemActive", isSignal: true, isRequired: false, transformFunction: null }, container: { classPropertyName: "container", publicName: "container", isSignal: true, isRequired: false, transformFunction: null }, dropup: { classPropertyName: "dropup", publicName: "dropup", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { typeaheadLoading: "typeaheadLoading", typeaheadNoResults: "typeaheadNoResults", typeaheadOnSelect: "typeaheadOnSelect", typeaheadOnPreview: "typeaheadOnPreview", typeaheadOnBlur: "typeaheadOnBlur" }, host: { listeners: { "input": "onInput($event)", "keyup": "onChange($event)", "click": "onFocus()", "focus": "onFocus()", "blur": "onBlur()", "keydown": "onKeydown($event)" }, properties: { "attr.aria-activedescendant": "activeDescendant", "attr.aria-controls": "isOpen ? popupId : null", "attr.aria-expanded": "isOpen", "attr.aria-autocomplete": "list", "attr.role": "'combobox'" } }, providers: [ComponentLoaderFactory, PositioningService], exportAs: ["bs-typeahead"], ngImport: i0 }); }
1811
1819
  }
1812
1820
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TypeaheadDirective, decorators: [{
1813
1821
  type: Directive,
@@ -1816,9 +1824,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1816
1824
  exportAs: 'bs-typeahead',
1817
1825
  host: {
1818
1826
  '[attr.aria-activedescendant]': 'activeDescendant',
1819
- '[attr.aria-owns]': 'isOpen ? popupId : null',
1827
+ '[attr.aria-controls]': 'isOpen ? popupId : null',
1820
1828
  '[attr.aria-expanded]': 'isOpen',
1821
- '[attr.aria-autocomplete]': 'list'
1829
+ '[attr.aria-autocomplete]': 'list',
1830
+ '[attr.role]': `'combobox'`
1822
1831
  },
1823
1832
  standalone: true,
1824
1833
  providers: [ComponentLoaderFactory, PositioningService]