@ethlete/cdk 3.20.1 → 3.22.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 (71) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.mjs +9 -5
  3. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.mjs +33 -7
  4. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.mjs +3 -3
  5. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.mjs +3 -4
  6. package/esm2022/lib/components/forms/components/select/components/combobox/private/combobox.private.types.mjs +1 -1
  7. package/esm2022/lib/components/forms/components/select/components/combobox/utils/public-api.mjs +1 -2
  8. package/esm2022/lib/components/forms/components/select/components/select/components/select/select.component.mjs +3 -3
  9. package/esm2022/lib/components/forms/components/select/components/select/directives/select/select.directive.mjs +144 -312
  10. package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/select-body.directive.mjs +4 -3
  11. package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.mjs +15 -40
  12. package/esm2022/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.mjs +8 -5
  13. package/esm2022/lib/components/forms/components/select/components/{combobox/utils → select/private}/index.mjs +2 -2
  14. package/esm2022/lib/components/forms/components/select/components/select/private/select.private.types.mjs +2 -0
  15. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-container-base/bottom-sheet-container-base.component.mjs +4 -4
  16. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-container-base/dialog-container-base.component.mjs +4 -4
  17. package/esm2022/lib/components/overlay/components/overlay/components/overlay-container/overlay-container.component.mjs +6 -4
  18. package/esm2022/lib/components/overlay/components/overlay/services/overlay.service.mjs +10 -3
  19. package/esm2022/lib/components/overlay/components/overlay/utils/overlay-ref.mjs +35 -6
  20. package/esm2022/lib/components/overlay/components/toggletip/directives/toggletip/toggletip.directive.mjs +5 -3
  21. package/esm2022/lib/components/overlay/components/tooltip/directives/tooltip/tooltip.directive.mjs +5 -3
  22. package/esm2022/lib/components/overlay/directives/overlay-close-auto-blocker/index.mjs +2 -0
  23. package/esm2022/lib/components/overlay/directives/overlay-close-auto-blocker/overlay-close-auto-blocker.directive.mjs +51 -0
  24. package/esm2022/lib/components/overlay/directives/overlay-close-auto-blocker/public-api.mjs +2 -0
  25. package/esm2022/lib/components/overlay/directives/public-api.mjs +2 -1
  26. package/esm2022/lib/components/overlay/public-api.mjs +2 -1
  27. package/esm2022/lib/components/overlay/utils/overlay-dismiss-checker.util.mjs +79 -0
  28. package/esm2022/lib/components/overlay/utils/public-api.mjs +2 -0
  29. package/esm2022/lib/components/picture/picture-data.directive.mjs +1 -1
  30. package/esm2022/lib/components/picture/picture.component.mjs +6 -8
  31. package/esm2022/lib/components/picture/picture.component.types.mjs +1 -1
  32. package/esm2022/lib/components/picture/pipes/index.mjs +2 -0
  33. package/esm2022/lib/components/picture/pipes/normalize-source/index.mjs +2 -0
  34. package/esm2022/lib/components/picture/pipes/normalize-source/normalize-source.pipe.mjs +18 -0
  35. package/esm2022/lib/components/picture/pipes/normalize-source/normalize-source.util.mjs +11 -0
  36. package/fesm2022/ethlete-cdk.mjs +425 -415
  37. package/fesm2022/ethlete-cdk.mjs.map +1 -1
  38. package/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.d.ts +4 -3
  39. package/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.d.ts +4 -1
  40. package/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.d.ts +1 -1
  41. package/lib/components/forms/components/select/components/combobox/private/combobox.private.types.d.ts +1 -1
  42. package/lib/components/forms/components/select/components/combobox/utils/public-api.d.ts +0 -1
  43. package/lib/components/forms/components/select/components/select/directives/select/select.directive.d.ts +16 -53
  44. package/lib/components/forms/components/select/components/select/directives/select-body/select-body.directive.d.ts +2 -1
  45. package/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.d.ts +7 -9
  46. package/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.d.ts +2 -1
  47. package/lib/components/forms/components/select/components/select/private/index.d.ts +1 -0
  48. package/lib/components/forms/components/select/components/select/private/select.private.types.d.ts +13 -0
  49. package/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-container-base/bottom-sheet-container-base.component.d.ts +1 -1
  50. package/lib/components/overlay/components/dialog/partials/dialog-container-base/dialog-container-base.component.d.ts +1 -1
  51. package/lib/components/overlay/components/overlay/components/overlay-container/overlay-container.component.d.ts +5 -3
  52. package/lib/components/overlay/components/overlay/utils/overlay-ref.d.ts +12 -3
  53. package/lib/components/overlay/components/toggletip/directives/toggletip/toggletip.directive.d.ts +2 -1
  54. package/lib/components/overlay/components/tooltip/directives/tooltip/tooltip.directive.d.ts +2 -1
  55. package/lib/components/overlay/directives/overlay-close-auto-blocker/overlay-close-auto-blocker.directive.d.ts +12 -0
  56. package/lib/components/overlay/directives/overlay-close-auto-blocker/public-api.d.ts +1 -0
  57. package/lib/components/overlay/directives/public-api.d.ts +1 -0
  58. package/lib/components/overlay/public-api.d.ts +1 -0
  59. package/lib/components/overlay/utils/overlay-dismiss-checker.util.d.ts +60 -0
  60. package/lib/components/overlay/utils/public-api.d.ts +1 -0
  61. package/lib/components/picture/picture-data.directive.d.ts +1 -1
  62. package/lib/components/picture/picture.component.d.ts +1 -1
  63. package/lib/components/picture/picture.component.types.d.ts +1 -1
  64. package/lib/components/picture/pipes/index.d.ts +1 -0
  65. package/lib/components/picture/pipes/normalize-source/index.d.ts +1 -0
  66. package/lib/components/picture/pipes/normalize-source/normalize-source.pipe.d.ts +7 -0
  67. package/lib/components/picture/pipes/normalize-source/normalize-source.util.d.ts +2 -0
  68. package/package.json +2 -2
  69. package/esm2022/lib/components/forms/components/select/components/combobox/utils/option.utils.mjs +0 -7
  70. package/lib/components/forms/components/select/components/combobox/utils/option.utils.d.ts +0 -1
  71. /package/lib/components/{forms/components/select/components/combobox/utils → overlay/directives/overlay-close-auto-blocker}/index.d.ts +0 -0
@@ -2,20 +2,20 @@ import * as i1 from '@angular/cdk/portal';
2
2
  import { CdkPortal, PortalModule, ComponentPortal, TemplatePortal, CdkPortalOutlet } from '@angular/cdk/portal';
3
3
  import { AsyncPipe, NgIf, NgClass, NgTemplateOutlet, NgForOf, NgFor, NgComponentOutlet, DOCUMENT, JsonPipe, formatDate } from '@angular/common';
4
4
  import * as i0 from '@angular/core';
5
- import { Component, ViewEncapsulation, ChangeDetectionStrategy, Directive, InjectionToken, booleanAttribute, Input, ContentChild, ContentChildren, inject, ElementRef, Injector, HostBinding, computed, signal, Optional, Inject, Injectable, SkipSelf, HostListener, ViewContainerRef, EventEmitter, NgZone, isDevMode, Output, NgModule, ChangeDetectorRef, ViewChild, runInInjectionContext, TemplateRef, forwardRef, LOCALE_ID, numberAttribute, ViewChildren, Renderer2, Attribute } from '@angular/core';
5
+ import { Component, ViewEncapsulation, ChangeDetectionStrategy, Directive, InjectionToken, booleanAttribute, Input, ContentChild, ContentChildren, inject, ElementRef, Injector, HostBinding, computed, signal, Optional, Inject, Injectable, SkipSelf, HostListener, ViewContainerRef, EventEmitter, NgZone, isDevMode, Output, NgModule, ChangeDetectorRef, ViewChild, assertInInjectionContext, runInInjectionContext, TemplateRef, forwardRef, LOCALE_ID, numberAttribute, ViewChildren, Pipe, Renderer2, Attribute } from '@angular/core';
6
6
  import * as i1$2 from '@ethlete/core';
7
- import { LetDirective, createDestroy, ScrollObserverFirstElementDirective, ScrollObserverLastElementDirective, Memo, signalHostAttributes, signalHostClasses, AnimatedIfDirective, AnimatedLifecycleDirective, SmartBlockScrollStrategy, RouterStateService, ANIMATED_LIFECYCLE_TOKEN, nextFrame, elementCanScroll, equal, ViewportService, AnimatedOverlayDirective, ClickObserverService, FocusVisibleService, cloneFormGroup, getFormGroupValue, ObserveVisibilityDirective, signalVisibilityChangeClasses, IS_EMAIL, MUST_MATCH, IS_ARRAY_NOT_EMPTY, AT_LEAST_ONE_REQUIRED, switchQueryListChanges, signalAttributes, ResizeObserverService, createFlipAnimation, RuntimeError, SelectionModel, ActiveSelectionModel, KeyPressManager, signalClasses, scrollToElement, isEmptyArray, isObjectArray, isPrimitiveArray, ClickOutsideDirective, ObserveContentDirective, clamp, DELAYABLE_TOKEN, ObserveResizeDirective, getElementVisibleStates, IS_ACTIVE_ELEMENT, IS_ELEMENT, CursorDragScrollDirective, ObserveScrollStateDirective, IsElementDirective, IsActiveElementDirective, ScrollObserverIgnoreTargetDirective, TypedQueryList } from '@ethlete/core';
8
- import { BehaviorSubject, startWith, map, switchMap, combineLatest, pairwise, tap, takeUntil, skip, of, Subject, filter, take, merge, skipUntil, defer, fromEvent, partition, debounceTime as debounceTime$1, Observable, distinctUntilChanged as distinctUntilChanged$1, withLatestFrom, skipWhile, catchError, throwError, firstValueFrom, timer, Subscription } from 'rxjs';
7
+ import { LetDirective, createDestroy, ScrollObserverFirstElementDirective, ScrollObserverLastElementDirective, Memo, signalHostAttributes, signalHostClasses, AnimatedIfDirective, AnimatedLifecycleDirective, SmartBlockScrollStrategy, RouterStateService, ANIMATED_LIFECYCLE_TOKEN, nextFrame, RootBoundaryDirective, elementCanScroll, equal, ViewportService, ROOT_BOUNDARY_TOKEN, AnimatedOverlayDirective, ClickObserverService, FocusVisibleService, cloneFormGroup, getFormGroupValue, ObserveVisibilityDirective, signalVisibilityChangeClasses, IS_EMAIL, MUST_MATCH, IS_ARRAY_NOT_EMPTY, AT_LEAST_ONE_REQUIRED, switchQueryListChanges, signalAttributes, ResizeObserverService, createFlipAnimation, RuntimeError, SelectionModel, ActiveSelectionModel, KeyPressManager, signalClasses, scrollToElement, isEmptyArray, isObjectArray, isPrimitiveArray, ClickOutsideDirective, ObserveContentDirective, clamp, DELAYABLE_TOKEN, ObserveResizeDirective, inferMimeType, getElementVisibleStates, IS_ACTIVE_ELEMENT, IS_ELEMENT, CursorDragScrollDirective, ObserveScrollStateDirective, IsElementDirective, IsActiveElementDirective, ScrollObserverIgnoreTargetDirective, TypedQueryList } from '@ethlete/core';
8
+ import { BehaviorSubject, startWith, map, switchMap, combineLatest, pairwise, tap, takeUntil, skip, of, Subject, filter, take, merge, skipUntil, defer, fromEvent, partition, debounceTime as debounceTime$1, Observable, from, distinctUntilChanged as distinctUntilChanged$1, withLatestFrom, skipWhile, catchError, throwError, timer, Subscription } from 'rxjs';
9
9
  import { trigger, state, style, transition, animate } from '@angular/animations';
10
10
  import { __decorate, __metadata } from 'tslib';
11
11
  import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
12
12
  import { extractQuery, isQueryStateLoading, isQueryStateSuccess, isQueryStateFailure, QueryDirective, shouldRetryRequest, isClassValidatorError, isSymfonyFormViolationListError } from '@ethlete/query';
13
13
  import { CdkDialogContainer, Dialog, DialogConfig, DIALOG_SCROLL_STRATEGY_PROVIDER as DIALOG_SCROLL_STRATEGY_PROVIDER$1 } from '@angular/cdk/dialog';
14
14
  import * as i1$1 from '@angular/cdk/a11y';
15
- import { InputModalityDetector, FocusKeyManager, FocusTrapFactory, InteractivityChecker, FocusMonitor, AriaDescriber, LiveAnnouncer, A11yModule } from '@angular/cdk/a11y';
15
+ import { InputModalityDetector, FocusKeyManager, FocusTrapFactory, InteractivityChecker, FocusMonitor, AriaDescriber, A11yModule } from '@angular/cdk/a11y';
16
16
  import * as i2 from '@angular/cdk/overlay';
17
17
  import { ViewportRuler, STANDARD_DROPDOWN_BELOW_POSITIONS, Overlay, OverlayConfig, STANDARD_DROPDOWN_ADJACENT_POSITIONS, OverlayModule, OverlayRef as OverlayRef$1 } from '@angular/cdk/overlay';
18
- import { ESCAPE, hasModifierKey, UP_ARROW, DOWN_ARROW, LEFT_ARROW, RIGHT_ARROW, ENTER, SPACE, TAB as TAB$1, BACKSPACE, A, PAGE_DOWN, PAGE_UP, END, HOME } from '@angular/cdk/keycodes';
18
+ import { ESCAPE, hasModifierKey, UP_ARROW, DOWN_ARROW, LEFT_ARROW, RIGHT_ARROW, ENTER, SPACE, TAB as TAB$1, BACKSPACE, A } from '@angular/cdk/keycodes';
19
19
  import * as i1$4 from '@angular/cdk/bidi';
20
20
  import { Directionality } from '@angular/cdk/bidi';
21
21
  import { coerceBooleanProperty, coerceCssPixelValue, coerceElement, _isNumberValue } from '@angular/cdk/coercion';
@@ -1496,11 +1496,11 @@ class BottomSheetContainerBaseComponent extends CdkDialogContainer {
1496
1496
  }
1497
1497
  }
1498
1498
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: BottomSheetContainerBaseComponent, deps: [{ token: i0.ElementRef }, { token: i1$1.FocusTrapFactory }, { token: DOCUMENT, optional: true }, { token: BOTTOM_SHEET_CONFIG }, { token: i1$1.InteractivityChecker }, { token: i0.NgZone }, { token: i2.OverlayRef }, { token: i1$1.FocusMonitor }], target: i0.ɵɵFactoryTarget.Component }); }
1499
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: BottomSheetContainerBaseComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
1499
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: BottomSheetContainerBaseComponent, selector: "et-bottom-sheet-container-base", usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
1500
1500
  }
1501
1501
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: BottomSheetContainerBaseComponent, decorators: [{
1502
1502
  type: Component,
1503
- args: [{ template: '' }]
1503
+ args: [{ selector: 'et-bottom-sheet-container-base', template: '' }]
1504
1504
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$1.FocusTrapFactory }, { type: Document, decorators: [{
1505
1505
  type: Optional
1506
1506
  }, {
@@ -1624,7 +1624,7 @@ const provideBottomSheetDefaultConfig = (config = {}) => {
1624
1624
  return { provide: BOTTOM_SHEET_DEFAULT_OPTIONS, useValue: createBottomSheetConfig(config) };
1625
1625
  };
1626
1626
 
1627
- let uniqueId$6 = 0;
1627
+ let uniqueId$7 = 0;
1628
1628
  class BottomSheetServiceBase {
1629
1629
  get openBottomSheets() {
1630
1630
  return this._parentBottomSheetService
@@ -1656,7 +1656,7 @@ class BottomSheetServiceBase {
1656
1656
  open(componentOrTemplateRef, config) {
1657
1657
  let bottomSheetRef;
1658
1658
  config = createBottomSheetConfig(this._defaultOptions, config);
1659
- config.id = config.id || `${this._idPrefix}${uniqueId$6++}`;
1659
+ config.id = config.id || `${this._idPrefix}${uniqueId$7++}`;
1660
1660
  config.scrollStrategy = config.scrollStrategy || this._scrollStrategy();
1661
1661
  const cdkRef = this._dialog.open(componentOrTemplateRef, {
1662
1662
  ...config,
@@ -2257,7 +2257,7 @@ const provideDialogDefaultConfig = (config = {}) => {
2257
2257
  return { provide: DIALOG_DEFAULT_OPTIONS, useValue: createDialogConfig(config) };
2258
2258
  };
2259
2259
 
2260
- let uniqueId$5 = 0;
2260
+ let uniqueId$6 = 0;
2261
2261
  class DialogServiceBase {
2262
2262
  get openDialogs() {
2263
2263
  return this._parentDialogService ? this._parentDialogService.openDialogs : this._openDialogsAtThisLevel;
@@ -2287,7 +2287,7 @@ class DialogServiceBase {
2287
2287
  open(componentOrTemplateRef, config) {
2288
2288
  let dialogRef;
2289
2289
  config = createDialogConfig(this._defaultOptions, config);
2290
- config.id = config.id || `${this._idPrefix}${uniqueId$5++}`;
2290
+ config.id = config.id || `${this._idPrefix}${uniqueId$6++}`;
2291
2291
  config.scrollStrategy = config.scrollStrategy || this._scrollStrategy();
2292
2292
  const cdkRef = this._dialog.open(componentOrTemplateRef, {
2293
2293
  ...config,
@@ -2462,11 +2462,11 @@ class DialogContainerBaseComponent extends CdkDialogContainer {
2462
2462
  }
2463
2463
  }
2464
2464
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: DialogContainerBaseComponent, deps: [{ token: i0.ElementRef }, { token: i1$1.FocusTrapFactory }, { token: DOCUMENT, optional: true }, { token: DIALOG_CONFIG }, { token: i1$1.InteractivityChecker }, { token: i0.NgZone }, { token: i2.OverlayRef }, { token: i1$1.FocusMonitor }], target: i0.ɵɵFactoryTarget.Component }); }
2465
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: DialogContainerBaseComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
2465
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: DialogContainerBaseComponent, selector: "et-dialog-container-base", usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
2466
2466
  }
2467
2467
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: DialogContainerBaseComponent, decorators: [{
2468
2468
  type: Component,
2469
- args: [{ template: '' }]
2469
+ args: [{ selector: 'et-dialog-container-base', template: '' }]
2470
2470
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$1.FocusTrapFactory }, { type: Document, decorators: [{
2471
2471
  type: Optional
2472
2472
  }, {
@@ -4001,6 +4001,7 @@ class OverlayContainerComponent extends CdkDialogContainer {
4001
4001
  this._dragToDismissStop$ = new Subject();
4002
4002
  this._themeProvider = inject(THEME_PROVIDER);
4003
4003
  this._parentThemeProvider = inject(THEME_PROVIDER, { optional: true, skipSelf: true });
4004
+ this._rootBoundary = inject(RootBoundaryDirective);
4004
4005
  this._animatedLifecycle = inject(ANIMATED_LIFECYCLE_TOKEN);
4005
4006
  this.cdkOverlayRef = inject(OverlayRef$1);
4006
4007
  this.overlayRef = null;
@@ -4011,6 +4012,7 @@ class OverlayContainerComponent extends CdkDialogContainer {
4011
4012
  }
4012
4013
  _contentAttached() {
4013
4014
  super._contentAttached();
4015
+ this._rootBoundary.boundaryElement = this._elementRef.nativeElement;
4014
4016
  nextFrame(() => {
4015
4017
  this._animatedLifecycle.enter();
4016
4018
  });
@@ -4238,7 +4240,7 @@ class OverlayContainerComponent extends CdkDialogContainer {
4238
4240
  }
4239
4241
  }
4240
4242
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: OverlayContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4241
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: OverlayContainerComponent, isStandalone: true, selector: "et-overlay-container", host: { attributes: { "tabindex": "-1" }, properties: { "attr.aria-modal": "_config.ariaModal", "id": "_config.id", "attr.role": "_config.role", "attr.aria-labelledby": "_config.ariaLabel ? null : _ariaLabelledBy", "attr.aria-label": "_config.ariaLabel", "attr.aria-describedby": "_config.ariaDescribedBy || null", "class.et-with-default-animation": "!_config.customAnimated" }, classAttribute: "et-overlay" }, usesInheritance: true, hostDirectives: [{ directive: i1$2.AnimatedLifecycleDirective }, { directive: i2$1.ProvideThemeDirective }], ngImport: i0, template: `<ng-template cdkPortalOutlet></ng-template>`, isInline: true, styles: [".et-overlay{position:relative;display:grid;overflow:hidden;pointer-events:all;outline:none}.et-overlay>*{overflow:auto}.et-overlay-pane{pointer-events:none}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-leave-to{transform:scale(0)!important;border-radius:250px}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-active{transition:transform .3s var(--ease-out-5),border-radius .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-active{transition:transform .3s var(--ease-spring-1),border-radius .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-leave-active{transition:transform .15s var(--ease-in-5),border-radius .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet{bottom:-50px;padding-bottom:50px}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-leave-to{transform:translateY(100%)!important}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--top-sheet{top:-50px;padding-top:50px}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-leave-to{transform:translateY(-100%)!important}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--left-sheet{left:-50px;padding-left:50px}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-leave-to{transform:translate(-100%)!important}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--right-sheet{right:-50px;padding-right:50px}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-leave-to{transform:translate(100%)!important}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-from{opacity:0!important;transform:scale(.85)!important}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-leave-to{opacity:0!important;transform:scale(.7)!important}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-active{transition:transform .3s var(--ease-out-5),opacity .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-active{transition:transform .3s var(--ease-spring-2),opacity .3s var(--ease-out-5)}}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-leave-active{transition:transform .15s var(--ease-out-5),opacity .15s var(--ease-out-5)}\n"], dependencies: [{ kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i1.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
4243
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: OverlayContainerComponent, isStandalone: true, selector: "et-overlay-container", host: { attributes: { "tabindex": "-1" }, properties: { "attr.aria-modal": "_config.ariaModal", "id": "_config.id", "attr.role": "_config.role", "attr.aria-labelledby": "_config.ariaLabel ? null : _ariaLabelledBy", "attr.aria-label": "_config.ariaLabel", "attr.aria-describedby": "_config.ariaDescribedBy || null", "class.et-with-default-animation": "!_config.customAnimated" }, classAttribute: "et-overlay" }, usesInheritance: true, hostDirectives: [{ directive: i1$2.RootBoundaryDirective }, { directive: i1$2.AnimatedLifecycleDirective }, { directive: i2$1.ProvideThemeDirective }], ngImport: i0, template: `<ng-template cdkPortalOutlet></ng-template>`, isInline: true, styles: [".et-overlay{position:relative;display:grid;overflow:hidden;pointer-events:all;outline:none}.et-overlay>*{overflow:auto}.et-overlay-pane{pointer-events:none}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-leave-to{transform:scale(0)!important;border-radius:250px}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-active{transition:transform .3s var(--ease-out-5),border-radius .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-active{transition:transform .3s var(--ease-spring-1),border-radius .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-leave-active{transition:transform .15s var(--ease-in-5),border-radius .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet{bottom:-50px;padding-bottom:50px}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-leave-to{transform:translateY(100%)!important}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--top-sheet{top:-50px;padding-top:50px}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-leave-to{transform:translateY(-100%)!important}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--left-sheet{left:-50px;padding-left:50px}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-leave-to{transform:translate(-100%)!important}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--right-sheet{right:-50px;padding-right:50px}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-leave-to{transform:translate(100%)!important}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-from{opacity:0!important;transform:scale(.85)!important}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-leave-to{opacity:0!important;transform:scale(.7)!important}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-active{transition:transform .3s var(--ease-out-5),opacity .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-active{transition:transform .3s var(--ease-spring-2),opacity .3s var(--ease-out-5)}}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-leave-active{transition:transform .15s var(--ease-out-5),opacity .15s var(--ease-out-5)}\n"], dependencies: [{ kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i1.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
4242
4244
  }
4243
4245
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: OverlayContainerComponent, decorators: [{
4244
4246
  type: Component,
@@ -4252,7 +4254,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
4252
4254
  '[attr.aria-label]': '_config.ariaLabel',
4253
4255
  '[attr.aria-describedby]': '_config.ariaDescribedBy || null',
4254
4256
  '[class.et-with-default-animation]': '!_config.customAnimated',
4255
- }, standalone: true, imports: [PortalModule], hostDirectives: [AnimatedLifecycleDirective, ProvideThemeDirective], styles: [".et-overlay{position:relative;display:grid;overflow:hidden;pointer-events:all;outline:none}.et-overlay>*{overflow:auto}.et-overlay-pane{pointer-events:none}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-leave-to{transform:scale(0)!important;border-radius:250px}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-active{transition:transform .3s var(--ease-out-5),border-radius .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-active{transition:transform .3s var(--ease-spring-1),border-radius .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-leave-active{transition:transform .15s var(--ease-in-5),border-radius .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet{bottom:-50px;padding-bottom:50px}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-leave-to{transform:translateY(100%)!important}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--top-sheet{top:-50px;padding-top:50px}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-leave-to{transform:translateY(-100%)!important}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--left-sheet{left:-50px;padding-left:50px}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-leave-to{transform:translate(-100%)!important}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--right-sheet{right:-50px;padding-right:50px}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-leave-to{transform:translate(100%)!important}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-from{opacity:0!important;transform:scale(.85)!important}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-leave-to{opacity:0!important;transform:scale(.7)!important}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-active{transition:transform .3s var(--ease-out-5),opacity .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-active{transition:transform .3s var(--ease-spring-2),opacity .3s var(--ease-out-5)}}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-leave-active{transition:transform .15s var(--ease-out-5),opacity .15s var(--ease-out-5)}\n"] }]
4257
+ }, standalone: true, imports: [PortalModule], hostDirectives: [RootBoundaryDirective, AnimatedLifecycleDirective, ProvideThemeDirective], styles: [".et-overlay{position:relative;display:grid;overflow:hidden;pointer-events:all;outline:none}.et-overlay>*{overflow:auto}.et-overlay-pane{pointer-events:none}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-leave-to{transform:scale(0)!important;border-radius:250px}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-active{transition:transform .3s var(--ease-out-5),border-radius .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-enter-active{transition:transform .3s var(--ease-spring-1),border-radius .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--full-screen-dialog.et-animation-leave-active{transition:transform .15s var(--ease-in-5),border-radius .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet{bottom:-50px;padding-bottom:50px}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-leave-to{transform:translateY(100%)!important}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--bottom-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--top-sheet{top:-50px;padding-top:50px}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-leave-to{transform:translateY(-100%)!important}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--top-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--left-sheet{left:-50px;padding-left:50px}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-leave-to{transform:translate(-100%)!important}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--left-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--right-sheet{right:-50px;padding-right:50px}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-from,.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-leave-to{transform:translate(100%)!important}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-active{transition:transform .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-enter-active{transition:transform .3s var(--ease-spring-1)}}.et-overlay.et-with-default-animation.et-overlay--right-sheet.et-animation-leave-active{transition:transform .15s var(--ease-in-5)}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-from{opacity:0!important;transform:scale(.85)!important}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-leave-to{opacity:0!important;transform:scale(.7)!important}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-active{transition:transform .3s var(--ease-out-5),opacity .3s var(--ease-out-5)}@supports (transition-timing-function: linear(0,1)){.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-enter-active{transition:transform .3s var(--ease-spring-2),opacity .3s var(--ease-out-5)}}.et-overlay.et-with-default-animation.et-overlay--dialog.et-animation-leave-active{transition:transform .15s var(--ease-out-5),opacity .15s var(--ease-out-5)}\n"] }]
4256
4258
  }], ctorParameters: function () { return []; } });
4257
4259
 
4258
4260
  const createOverlayConfig = (globalConfig, localConfig) => ({
@@ -4438,6 +4440,9 @@ const OVERLAY_STATE = {
4438
4440
 
4439
4441
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4440
4442
  class OverlayRef {
4443
+ get _internalDisableClose() {
4444
+ return this._disableCloseFromInternalInitiators.size > 0;
4445
+ }
4441
4446
  get _cdkRef() {
4442
4447
  return this._ref;
4443
4448
  }
@@ -4448,7 +4453,12 @@ class OverlayRef {
4448
4453
  this.componentRef = null;
4449
4454
  this._afterOpened = new Subject();
4450
4455
  this._beforeClosed = new Subject();
4456
+ this._closeCalled = new Subject();
4451
4457
  this._state = OVERLAY_STATE.OPEN;
4458
+ this._isEscCloseControlledExternally = false;
4459
+ this._isBackdropCloseControlledExternally = false;
4460
+ this._isCloseFnCloseControlledExternally = false;
4461
+ this._disableCloseFromInternalInitiators = new Set();
4452
4462
  this.disableClose = config.disableClose;
4453
4463
  this.id = _ref.id;
4454
4464
  _containerInstance._animatedLifecycle.state$
@@ -4470,16 +4480,24 @@ class OverlayRef {
4470
4480
  merge(this.backdropClick(), this.keydownEvents().pipe(filter((event) => event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event))))
4471
4481
  .pipe(skipUntil(_containerInstance._animatedLifecycle.state$.pipe(filter((e) => e === 'entering'))))
4472
4482
  .subscribe((event) => {
4473
- if (!this.disableClose) {
4483
+ if ((this._isEscCloseControlledExternally && event.type === 'keydown') ||
4484
+ (this._isBackdropCloseControlledExternally && event.type !== 'keydown')) {
4485
+ return;
4486
+ }
4487
+ if (!this.disableClose && !this._internalDisableClose) {
4474
4488
  event.preventDefault();
4475
- this._closeOverlayVia(event.type === 'keydown' ? 'keyboard' : 'mouse');
4489
+ this._closeOverlayVia(event.type === 'keydown' ? 'keyboard' : 'mouse', undefined, true);
4476
4490
  }
4477
4491
  });
4478
4492
  }
4479
- close(result) {
4493
+ close(result, force) {
4480
4494
  if (this._state === OVERLAY_STATE.CLOSING || this._state === OVERLAY_STATE.CLOSED) {
4481
4495
  return;
4482
4496
  }
4497
+ this._closeCalled.next(result);
4498
+ if (this._isCloseFnCloseControlledExternally && !force) {
4499
+ return;
4500
+ }
4483
4501
  this._result = result;
4484
4502
  this._containerInstance._animatedLifecycle.state$
4485
4503
  .pipe(filter((event) => event === 'leaving'), take(1))
@@ -4509,6 +4527,9 @@ class OverlayRef {
4509
4527
  keydownEvents() {
4510
4528
  return this._ref.keydownEvents;
4511
4529
  }
4530
+ closeCalled() {
4531
+ return this._closeCalled;
4532
+ }
4512
4533
  updatePosition(position) {
4513
4534
  const strategy = this._ref.config.positionStrategy;
4514
4535
  if (position && (position.left || position.right)) {
@@ -4546,9 +4567,19 @@ class OverlayRef {
4546
4567
  this._ref.close(this._result, { focusOrigin: this._closeInteractionType });
4547
4568
  this.componentInstance = null;
4548
4569
  }
4549
- _closeOverlayVia(interactionType, result) {
4570
+ _closeOverlayVia(interactionType, result, force) {
4550
4571
  this._closeInteractionType = interactionType;
4551
- return this.close(result);
4572
+ return this.close(result, force);
4573
+ }
4574
+ _addInternalBackdropCloseInitiator(initiatorId) {
4575
+ if (this.disableClose)
4576
+ return;
4577
+ this._disableCloseFromInternalInitiators.add(initiatorId);
4578
+ }
4579
+ _removeInternalBackdropCloseInitiator(initiatorId) {
4580
+ if (this.disableClose)
4581
+ return;
4582
+ this._disableCloseFromInternalInitiators.delete(initiatorId);
4552
4583
  }
4553
4584
  }
4554
4585
 
@@ -4563,7 +4594,7 @@ const provideOverlayDefaultConfig = (config = {}) => {
4563
4594
  return { provide: OVERLAY_DEFAULT_OPTIONS, useValue: createOverlayConfig(config) };
4564
4595
  };
4565
4596
 
4566
- let uniqueId$4 = 0;
4597
+ let uniqueId$5 = 0;
4567
4598
  const ID_PREFIX = 'et-overlay-';
4568
4599
  const setStyle = (el, style, value) => {
4569
4600
  if (value === null || value === undefined) {
@@ -4630,7 +4661,7 @@ class OverlayService {
4630
4661
  open(componentOrTemplateRef, config) {
4631
4662
  let overlayRef;
4632
4663
  const composedConfig = createOverlayConfig(this._defaultOptions, config);
4633
- composedConfig.id = composedConfig.id || `${ID_PREFIX}${uniqueId$4++}`;
4664
+ composedConfig.id = composedConfig.id || `${ID_PREFIX}${uniqueId$5++}`;
4634
4665
  composedConfig.scrollStrategy = composedConfig.scrollStrategy || this._scrollStrategy();
4635
4666
  const cdkRef = this._dialog.open(componentOrTemplateRef, {
4636
4667
  ...composedConfig,
@@ -4646,11 +4677,17 @@ class OverlayService {
4646
4677
  },
4647
4678
  templateContext: () => ({ dialogRef: overlayRef }),
4648
4679
  providers: (ref, cdkConfig, overlayContainer) => {
4649
- overlayRef = new OverlayRef(ref, composedConfig, overlayContainer);
4680
+ const container = overlayContainer;
4681
+ overlayRef = new OverlayRef(ref, composedConfig, container);
4650
4682
  return [
4651
4683
  { provide: OverlayContainerComponent, useValue: overlayContainer },
4684
+ { provide: THEME_PROVIDER, useValue: container._themeProvider },
4685
+ { provide: ProvideThemeDirective, useValue: container._themeProvider },
4686
+ { provide: ROOT_BOUNDARY_TOKEN, useValue: container._rootBoundary },
4687
+ { provide: RootBoundaryDirective, useValue: container._rootBoundary },
4652
4688
  { provide: OVERLAY_DATA, useValue: cdkConfig.data },
4653
4689
  { provide: OverlayRef, useValue: overlayRef },
4690
+ { provide: OverlayRef, useValue: overlayRef },
4654
4691
  ...(composedConfig.providers ?? []),
4655
4692
  ];
4656
4693
  },
@@ -4892,13 +4929,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
4892
4929
  args: ['click', ['$event']]
4893
4930
  }] } });
4894
4931
 
4895
- let uniqueId$3 = 0;
4932
+ let uniqueId$4 = 0;
4896
4933
  class OverlayTitleDirective {
4897
4934
  constructor() {
4898
4935
  this._overlayRef = inject(OverlayRef, { optional: true });
4899
4936
  this._elementRef = inject(ElementRef);
4900
4937
  this._overlayService = inject(OverlayService);
4901
- this.id = `et-overlay-title-${uniqueId$3++}`;
4938
+ this.id = `et-overlay-title-${uniqueId$4++}`;
4902
4939
  }
4903
4940
  ngOnInit() {
4904
4941
  if (!this._overlayRef) {
@@ -4943,6 +4980,51 @@ const TOGGLETIP_DEFAULT_CONFIG = {
4943
4980
  customAnimated: false,
4944
4981
  };
4945
4982
 
4983
+ const OVERLAY_CLOSE_BLOCKER_TOKEN = new InjectionToken('OVERLAY_CLOSE_BLOCKER_TOKEN');
4984
+ let uniqueId$3 = 0;
4985
+ class OverlayCloseBlockerDirective {
4986
+ constructor() {
4987
+ this._id = `et-overlay-close-blocker-${uniqueId$3++}`;
4988
+ this._animatedOverlay = inject(AnimatedOverlayDirective, { optional: true });
4989
+ this._nearestOverlayRef = inject(OverlayRef, { optional: true });
4990
+ if (!this._animatedOverlay || !this._nearestOverlayRef)
4991
+ return;
4992
+ combineLatest([this._animatedOverlay.isMounted$, this._animatedOverlay.isHidden$])
4993
+ .pipe(takeUntilDestroyed(), tap(([mounted, hidden]) => {
4994
+ if (mounted && !hidden) {
4995
+ this._nearestOverlayRef?._addInternalBackdropCloseInitiator(this._id);
4996
+ }
4997
+ else {
4998
+ this._nearestOverlayRef?._removeInternalBackdropCloseInitiator(this._id);
4999
+ }
5000
+ }))
5001
+ .subscribe();
5002
+ }
5003
+ ngOnDestroy() {
5004
+ this._nearestOverlayRef?._removeInternalBackdropCloseInitiator(this._id);
5005
+ }
5006
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: OverlayCloseBlockerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
5007
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: OverlayCloseBlockerDirective, isStandalone: true, selector: "[etOverlayCloseBlocker]", providers: [
5008
+ {
5009
+ provide: OVERLAY_CLOSE_BLOCKER_TOKEN,
5010
+ useExisting: OverlayCloseBlockerDirective,
5011
+ },
5012
+ ], ngImport: i0 }); }
5013
+ }
5014
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: OverlayCloseBlockerDirective, decorators: [{
5015
+ type: Directive,
5016
+ args: [{
5017
+ selector: '[etOverlayCloseBlocker]',
5018
+ standalone: true,
5019
+ providers: [
5020
+ {
5021
+ provide: OVERLAY_CLOSE_BLOCKER_TOKEN,
5022
+ useExisting: OverlayCloseBlockerDirective,
5023
+ },
5024
+ ],
5025
+ }]
5026
+ }], ctorParameters: function () { return []; } });
5027
+
4946
5028
  const createToggletipConfig = (config = {}) => ({
4947
5029
  ...TOGGLETIP_DEFAULT_CONFIG,
4948
5030
  ...(config || {}),
@@ -5053,7 +5135,7 @@ class ToggletipDirective {
5053
5135
  provide: TOGGLETIP_DIRECTIVE,
5054
5136
  useExisting: ToggletipDirective,
5055
5137
  },
5056
- ], hostDirectives: [{ directive: i1$2.AnimatedOverlayDirective, inputs: ["placement", "placement"] }], ngImport: i0 }); }
5138
+ ], hostDirectives: [{ directive: i1$2.AnimatedOverlayDirective, inputs: ["placement", "placement"] }, { directive: OverlayCloseBlockerDirective }], ngImport: i0 }); }
5057
5139
  }
5058
5140
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: ToggletipDirective, decorators: [{
5059
5141
  type: Directive,
@@ -5066,7 +5148,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
5066
5148
  useExisting: ToggletipDirective,
5067
5149
  },
5068
5150
  ],
5069
- hostDirectives: [{ directive: AnimatedOverlayDirective, inputs: ['placement'] }],
5151
+ hostDirectives: [{ directive: AnimatedOverlayDirective, inputs: ['placement'] }, OverlayCloseBlockerDirective],
5070
5152
  }]
5071
5153
  }], ctorParameters: function () { return []; }, propDecorators: { toggletip: [{
5072
5154
  type: Input,
@@ -5297,7 +5379,7 @@ class TooltipDirective {
5297
5379
  provide: TOOLTIP_DIRECTIVE,
5298
5380
  useExisting: TooltipDirective,
5299
5381
  },
5300
- ], hostDirectives: [{ directive: i1$2.AnimatedOverlayDirective, inputs: ["placement", "placement"] }], ngImport: i0 }); }
5382
+ ], hostDirectives: [{ directive: i1$2.AnimatedOverlayDirective, inputs: ["placement", "placement"] }, { directive: OverlayCloseBlockerDirective }], ngImport: i0 }); }
5301
5383
  }
5302
5384
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: TooltipDirective, decorators: [{
5303
5385
  type: Directive,
@@ -5310,7 +5392,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
5310
5392
  useExisting: TooltipDirective,
5311
5393
  },
5312
5394
  ],
5313
- hostDirectives: [{ directive: AnimatedOverlayDirective, inputs: ['placement'] }],
5395
+ hostDirectives: [{ directive: AnimatedOverlayDirective, inputs: ['placement'] }, OverlayCloseBlockerDirective],
5314
5396
  }]
5315
5397
  }], ctorParameters: function () { return []; }, propDecorators: { tooltip: [{
5316
5398
  type: Input,
@@ -5447,6 +5529,80 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
5447
5529
  }]
5448
5530
  }] });
5449
5531
 
5532
+ /**
5533
+ * A utility function to enhance the ux of overlays containing forms.
5534
+ * It can prevent the user from accidentally closing the overlay when the form value is not equal to the default value.
5535
+ */
5536
+ const createOverlayDismissChecker = (config) => {
5537
+ assertInInjectionContext(createOverlayDismissChecker);
5538
+ const { form, defaultValue = form.getRawValue(), dismissEvents = { backdropClick: true, escapeKey: true, closeCall: true }, dismissCheckFn, } = config;
5539
+ const checkBackdropClick = dismissEvents.backdropClick ?? true;
5540
+ const checkEscapeKey = dismissEvents.escapeKey ?? true;
5541
+ const checkCloseCall = dismissEvents.closeCall ?? true;
5542
+ if (!checkBackdropClick && !checkEscapeKey && !checkCloseCall) {
5543
+ throw new Error('At least one dismiss event must be enabled');
5544
+ }
5545
+ const destroy$ = createDestroy();
5546
+ const overlayRef = inject(OverlayRef);
5547
+ overlayRef._isBackdropCloseControlledExternally = checkBackdropClick;
5548
+ overlayRef._isEscCloseControlledExternally = checkEscapeKey;
5549
+ overlayRef._isCloseFnCloseControlledExternally = checkCloseCall;
5550
+ const eventStreams = [];
5551
+ if (checkBackdropClick) {
5552
+ if (!overlayRef.disableClose) {
5553
+ eventStreams.push(overlayRef.backdropClick().pipe(map(() => 'mouse')));
5554
+ }
5555
+ else if (isDevMode() && dismissEvents.backdropClick) {
5556
+ console.warn('dismissEvents.backdropClick being set to true has no effect when overlayRef.disableClose is true.');
5557
+ }
5558
+ }
5559
+ if (checkEscapeKey) {
5560
+ if (!overlayRef.disableClose) {
5561
+ eventStreams.push(overlayRef.keydownEvents().pipe(filter((event) => event.keyCode === ESCAPE), map(() => 'keyboard')));
5562
+ }
5563
+ else if (isDevMode() && dismissEvents.escapeKey) {
5564
+ console.warn('dismissEvents.escapeKey being set to true has no effect when overlayRef.disableClose is true.');
5565
+ }
5566
+ }
5567
+ if (checkCloseCall) {
5568
+ eventStreams.push(overlayRef.closeCalled());
5569
+ }
5570
+ const sub = merge(...eventStreams)
5571
+ .pipe(takeUntil(destroy$), filter(() => {
5572
+ const isNotEqual = !equal(form.getRawValue(), defaultValue);
5573
+ const hasNoOtherInternalOverlays = !overlayRef._internalDisableClose;
5574
+ const wasKeyboard = overlayRef._closeInteractionType === 'keyboard';
5575
+ const wasMouse = overlayRef._closeInteractionType === 'mouse';
5576
+ if ((wasKeyboard && !checkEscapeKey) || (wasMouse && !checkBackdropClick)) {
5577
+ return false;
5578
+ }
5579
+ return isNotEqual && hasNoOtherInternalOverlays;
5580
+ }), switchMap((result) => {
5581
+ const checkResponse = dismissCheckFn(form.getRawValue());
5582
+ let nextObservable;
5583
+ if (checkResponse instanceof Observable) {
5584
+ nextObservable = checkResponse;
5585
+ }
5586
+ else if (checkResponse instanceof Promise) {
5587
+ nextObservable = from(checkResponse);
5588
+ }
5589
+ else {
5590
+ nextObservable = of(checkResponse);
5591
+ }
5592
+ return nextObservable.pipe(filter((response) => !!response), tap((response) => {
5593
+ sub.unsubscribe();
5594
+ if (response === 'keyboard' || response === 'mouse') {
5595
+ overlayRef._closeOverlayVia(response, undefined, true);
5596
+ }
5597
+ else {
5598
+ overlayRef.close(result, true);
5599
+ }
5600
+ }), take(1));
5601
+ }), takeUntil(destroy$), take(1))
5602
+ .subscribe();
5603
+ return sub;
5604
+ };
5605
+
5450
5606
  class FilterOverlayRef {
5451
5607
  constructor(_config) {
5452
5608
  this._config = _config;
@@ -8292,25 +8448,6 @@ const ComboboxOptionType = {
8292
8448
  Object: 'object',
8293
8449
  };
8294
8450
 
8295
- const createComboboxConfig = (globalConfig = {}, localConfig = {}) => ({
8296
- ...COMBOBOX_DEFAULT_CONFIG,
8297
- ...(globalConfig || {}),
8298
- ...(localConfig || {}),
8299
- });
8300
- const provideComboboxConfig = (config = {}) => {
8301
- return {
8302
- provide: COMBOBOX_CONFIG_TOKEN,
8303
- useValue: createComboboxConfig(config),
8304
- };
8305
- };
8306
-
8307
- const isOptionDisabled = (opt) => {
8308
- if (typeof opt === 'object' && opt !== null && 'disabled' in opt) {
8309
- return !!opt.disabled;
8310
- }
8311
- return false;
8312
- };
8313
-
8314
8451
  const COMBOBOX_TOKEN = new InjectionToken('ET_COMBOBOX_INPUT_TOKEN');
8315
8452
  class ComboboxDirective {
8316
8453
  //#region Inputs
@@ -8377,6 +8514,9 @@ class ComboboxDirective {
8377
8514
  set bindKey(value) {
8378
8515
  this._selectionModel.setKeyBinding(value);
8379
8516
  }
8517
+ set bindDisabled(value) {
8518
+ this._selectionModel.setDisabledBinding(value);
8519
+ }
8380
8520
  get allowCustomValues() {
8381
8521
  return this._allowCustomValues$.value;
8382
8522
  }
@@ -8575,18 +8715,28 @@ class ComboboxDirective {
8575
8715
  this.customBodyEmptyComponentInputs$ = this._bodyEmptyComponentInputs$.asObservable();
8576
8716
  this.customBodyMoreItemsHintComponentInputs$ = this._bodyMoreItemsHintComponentInputs$.asObservable();
8577
8717
  this.trackByOptionKeyFn = (index, item) => this._selectionModel.getKey(item);
8718
+ this._selectionModel.setDisabledBinding('disabled');
8578
8719
  this._activeSelectionModel.setSelectionModel(this._selectionModel);
8579
8720
  this._animatedOverlay.placement = 'bottom';
8580
8721
  this._animatedOverlay.fallbackPlacements = ['bottom', 'top'];
8581
8722
  this._animatedOverlay.autoResize = true;
8723
+ this._selectionModel.allowMultiple$
8724
+ .pipe(takeUntilDestroyed(), tap((allowMultiple) => {
8725
+ if (allowMultiple) {
8726
+ this._updateFilter('');
8727
+ }
8728
+ }))
8729
+ .subscribe();
8582
8730
  this._input._setEmptyHelper(this._currentFilter$);
8583
8731
  }
8584
8732
  ngOnInit() {
8585
8733
  this._initDispatchFilterChanges();
8734
+ this._closeBodyOnDisable();
8586
8735
  if (isDevMode()) {
8587
8736
  this._debugValidateComboboxConfig();
8588
8737
  this._debugValidateOptionAndInitialValueSchema();
8589
8738
  }
8739
+ this._selectionModel.setSelectionFromValue$(this._input.value);
8590
8740
  this._selectionModel.value$
8591
8741
  .pipe(takeUntil(this._destroy$), tap((value) => {
8592
8742
  this._input._updateValue(value);
@@ -8594,7 +8744,7 @@ class ComboboxDirective {
8594
8744
  }))
8595
8745
  .subscribe();
8596
8746
  this._input.onExternalUpdate$
8597
- .pipe(takeUntil(this._destroy$), tap(() => this._selectionModel.setSelection(this._input.value)))
8747
+ .pipe(takeUntil(this._destroy$), tap(() => this._selectionModel.setSelectionFromValue$(this._input.value)))
8598
8748
  .subscribe();
8599
8749
  }
8600
8750
  //#endregion
@@ -8685,7 +8835,10 @@ class ComboboxDirective {
8685
8835
  return this._selectionModel.isSelected$(option);
8686
8836
  }
8687
8837
  isOptionActive(option) {
8688
- return this._activeSelectionModel.activeOption$.pipe(map((activeOption) => activeOption === option));
8838
+ return this._activeSelectionModel.isOptionActive$(option);
8839
+ }
8840
+ isOptionDisabled(option) {
8841
+ return this._selectionModel.isDisabled$(option);
8689
8842
  }
8690
8843
  //#endregion
8691
8844
  //#region Protected Methods
@@ -8856,7 +9009,7 @@ class ComboboxDirective {
8856
9009
  }
8857
9010
  else {
8858
9011
  const { type, option } = result.optionAction;
8859
- if (isOptionDisabled(option))
9012
+ if (this._selectionModel.isDisabled(option))
8860
9013
  return;
8861
9014
  if (type === 'add') {
8862
9015
  this._selectionModel.addSelectedOption(option);
@@ -8870,6 +9023,15 @@ class ComboboxDirective {
8870
9023
  }
8871
9024
  }
8872
9025
  }
9026
+ _closeBodyOnDisable() {
9027
+ this._input.disabled$
9028
+ .pipe(tap((disabled) => {
9029
+ if (!disabled)
9030
+ return;
9031
+ this.close();
9032
+ }), takeUntil(this._destroy$))
9033
+ .subscribe();
9034
+ }
8873
9035
  //#endregion
8874
9036
  //#region Dev mode
8875
9037
  _debugValidateComboboxConfig(isRetry = false) {
@@ -8931,7 +9093,7 @@ class ComboboxDirective {
8931
9093
  .subscribe();
8932
9094
  }
8933
9095
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: ComboboxDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
8934
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "16.2.5", type: ComboboxDirective, isStandalone: true, inputs: { options: "options", initialValue: "initialValue", filterInternal: "filterInternal", loading: "loading", error: "error", emptyText: "emptyText", bodyEmptyText: "bodyEmptyText", bodyMoreItemsHintText: "bodyMoreItemsHintText", placeholder: "placeholder", multiple: "multiple", bindLabel: "bindLabel", bindValue: "bindValue", bindKey: "bindKey", allowCustomValues: "allowCustomValues", showBodyMoreItemsHint: ["showBodyMoreItemsHint", "showBodyMoreItemsHint", booleanAttribute], optionComponent: "optionComponent", optionComponentInputs: "optionComponentInputs", selectedOptionComponent: "selectedOptionComponent", selectedOptionComponentInputs: "selectedOptionComponentInputs", bodyErrorComponent: "bodyErrorComponent", bodyErrorComponentInputs: "bodyErrorComponentInputs", bodyLoadingComponent: "bodyLoadingComponent", bodyLoadingComponentInputs: "bodyLoadingComponentInputs", bodyEmptyComponent: "bodyEmptyComponent", bodyEmptyComponentInputs: "bodyEmptyComponentInputs", bodyMoreItemsHintComponent: "bodyMoreItemsHintComponent", bodyMoreItemsHintComponentInputs: "bodyMoreItemsHintComponentInputs" }, outputs: { filterChange: "filterChange" }, providers: [
9096
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "16.2.5", type: ComboboxDirective, isStandalone: true, inputs: { options: "options", initialValue: "initialValue", filterInternal: "filterInternal", loading: "loading", error: "error", emptyText: "emptyText", bodyEmptyText: "bodyEmptyText", bodyMoreItemsHintText: "bodyMoreItemsHintText", placeholder: "placeholder", multiple: "multiple", bindLabel: "bindLabel", bindValue: "bindValue", bindKey: "bindKey", bindDisabled: "bindDisabled", allowCustomValues: "allowCustomValues", showBodyMoreItemsHint: ["showBodyMoreItemsHint", "showBodyMoreItemsHint", booleanAttribute], optionComponent: "optionComponent", optionComponentInputs: "optionComponentInputs", selectedOptionComponent: "selectedOptionComponent", selectedOptionComponentInputs: "selectedOptionComponentInputs", bodyErrorComponent: "bodyErrorComponent", bodyErrorComponentInputs: "bodyErrorComponentInputs", bodyLoadingComponent: "bodyLoadingComponent", bodyLoadingComponentInputs: "bodyLoadingComponentInputs", bodyEmptyComponent: "bodyEmptyComponent", bodyEmptyComponentInputs: "bodyEmptyComponentInputs", bodyMoreItemsHintComponent: "bodyMoreItemsHintComponent", bodyMoreItemsHintComponentInputs: "bodyMoreItemsHintComponentInputs" }, outputs: { filterChange: "filterChange" }, providers: [
8935
9097
  {
8936
9098
  provide: COMBOBOX_TOKEN,
8937
9099
  useExisting: ComboboxDirective,
@@ -8976,6 +9138,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
8976
9138
  type: Input
8977
9139
  }], bindKey: [{
8978
9140
  type: Input
9141
+ }], bindDisabled: [{
9142
+ type: Input
8979
9143
  }], allowCustomValues: [{
8980
9144
  type: Input
8981
9145
  }], showBodyMoreItemsHint: [{
@@ -9035,7 +9199,7 @@ class ComboboxOptionComponent {
9035
9199
  this.combobox = inject(COMBOBOX_TOKEN);
9036
9200
  this._elementRef = inject(ElementRef);
9037
9201
  this._option$ = new BehaviorSubject(null);
9038
- this.disabled$ = this._option$.pipe(map((opt) => isOptionDisabled(opt)));
9202
+ this.disabled$ = this._option$.pipe(map((opt) => this.combobox.isOptionDisabled(opt)));
9039
9203
  this.selected$ = this._option$.pipe(switchMap((opt) => this.combobox.isOptionSelected(opt)));
9040
9204
  this.active$ = this._option$.pipe(switchMap((opt) => this.combobox.isOptionActive(opt)));
9041
9205
  this.customOptionComponentInputs$ = combineLatest([
@@ -9059,7 +9223,7 @@ class ComboboxOptionComponent {
9059
9223
  this._option$.next(value);
9060
9224
  }
9061
9225
  selectOption() {
9062
- if (isOptionDisabled(this.option)) {
9226
+ if (this.combobox._selectionModel.isDisabled(this.option)) {
9063
9227
  return;
9064
9228
  }
9065
9229
  this.combobox.writeValueFromOption(this.option);
@@ -9141,7 +9305,7 @@ class ComboboxBodyComponent {
9141
9305
  provide: COMBOBOX_BODY_TOKEN,
9142
9306
  useExisting: ComboboxBodyComponent,
9143
9307
  },
9144
- ], viewQueries: [{ propertyName: "_containerElementRef", first: true, predicate: ["containerElement"], descendants: true, read: ElementRef, static: true }, { propertyName: "_animatedLifecycle", first: true, predicate: ANIMATED_LIFECYCLE_TOKEN, descendants: true, static: true }, { propertyName: "_options", predicate: ComboboxOptionComponent, descendants: true }], hostDirectives: [{ directive: i1$2.ClickOutsideDirective }, { directive: i2$1.ProvideThemeDirective }], ngImport: i0, template: "<div #containerElement class=\"et-combobox-body-container\" etAnimatedLifecycle>\n <ng-container *etLet=\"combobox.options$ | async as options\">\n <ng-container *ngIf=\"!options?.length && !combobox.error && !combobox.loading\">\n <ng-container *ngIf=\"combobox.customBodyEmptyTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyEmptyComponent$ | async as comp; else default\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyEmptyComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n <ng-template #default>\n <p class=\"et-combobox-body--empty\">{{ combobox._tempEmptyText }}</p>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"combobox.error && !combobox.loading\">\n <ng-container *ngIf=\"combobox.customBodyErrorTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl; context: { error: combobox.error }\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyErrorComponent$ | async as comp\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (customErrorComponentInputs$ | async) ?? { error: combobox.error }\"\n />\n </ng-container>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"combobox.loading$ | async\">\n <ng-container *ngIf=\"combobox.customBodyLoadingTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyLoadingComponent$ | async as comp\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyLoadingComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n </ng-template>\n </ng-container>\n\n <et-combobox-option *ngFor=\"let option of options; trackBy: trackByFn\" [option]=\"option\" />\n\n <ng-container *ngIf=\"options?.length && combobox.showBodyMoreItemsHint\">\n <ng-container *ngIf=\"combobox.customBodyMoreItemsHintTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyMoreItemsHintComponent$ | async as comp; else default\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyMoreItemsHintComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n <ng-template #default>\n <p *ngIf=\"combobox.bodyMoreItemsHintText\" class=\"et-combobox-body--more-items-hint\">\n {{ combobox.bodyMoreItemsHintText }}\n </p>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ComboboxOptionComponent, selector: "et-combobox-option", inputs: ["option"] }, { kind: "directive", type: LetDirective, selector: "[etLet]", inputs: ["etLet"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: AnimatedLifecycleDirective, selector: "[etAnimatedLifecycle]", exportAs: ["etAnimatedLifecycle"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
9308
+ ], viewQueries: [{ propertyName: "_containerElementRef", first: true, predicate: ["containerElement"], descendants: true, read: ElementRef, static: true }, { propertyName: "_animatedLifecycle", first: true, predicate: ANIMATED_LIFECYCLE_TOKEN, descendants: true, static: true }, { propertyName: "_options", predicate: ComboboxOptionComponent, descendants: true }], hostDirectives: [{ directive: i1$2.ClickOutsideDirective }, { directive: i2$1.ProvideThemeDirective }], ngImport: i0, template: "<div #containerElement class=\"et-combobox-body-container\" etAnimatedLifecycle>\n <ng-container *etLet=\"combobox.options$ | async as options\">\n <ng-container *ngIf=\"!options?.length && !combobox.error && !combobox.loading\">\n <ng-container *ngIf=\"combobox.customBodyEmptyTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyEmptyComponent$ | async as comp; else default\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyEmptyComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n <ng-template #default>\n <p class=\"et-combobox-body--empty\">{{ combobox._tempEmptyText }}</p>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"combobox.error && !combobox.loading\">\n <ng-container *ngIf=\"combobox.customBodyErrorTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl; context: { error: combobox.error }\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyErrorComponent$ | async as comp\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (customErrorComponentInputs$ | async) ?? { error: combobox.error }\"\n />\n </ng-container>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"combobox.loading$ | async\">\n <ng-container *ngIf=\"combobox.customBodyLoadingTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyLoadingComponent$ | async as comp\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyLoadingComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"!combobox.error\">\n <et-combobox-option *ngFor=\"let option of options; trackBy: trackByFn\" [option]=\"option\" />\n </ng-container>\n\n <ng-container *ngIf=\"options?.length && combobox.showBodyMoreItemsHint\">\n <ng-container *ngIf=\"combobox.customBodyMoreItemsHintTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyMoreItemsHintComponent$ | async as comp; else default\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyMoreItemsHintComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n <ng-template #default>\n <p *ngIf=\"combobox.bodyMoreItemsHintText\" class=\"et-combobox-body--more-items-hint\">\n {{ combobox.bodyMoreItemsHintText }}\n </p>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ComboboxOptionComponent, selector: "et-combobox-option", inputs: ["option"] }, { kind: "directive", type: LetDirective, selector: "[etLet]", inputs: ["etLet"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: AnimatedLifecycleDirective, selector: "[etAnimatedLifecycle]", exportAs: ["etAnimatedLifecycle"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
9145
9309
  }
9146
9310
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: ComboboxBodyComponent, decorators: [{
9147
9311
  type: Component,
@@ -9164,7 +9328,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
9164
9328
  provide: COMBOBOX_BODY_TOKEN,
9165
9329
  useExisting: ComboboxBodyComponent,
9166
9330
  },
9167
- ], template: "<div #containerElement class=\"et-combobox-body-container\" etAnimatedLifecycle>\n <ng-container *etLet=\"combobox.options$ | async as options\">\n <ng-container *ngIf=\"!options?.length && !combobox.error && !combobox.loading\">\n <ng-container *ngIf=\"combobox.customBodyEmptyTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyEmptyComponent$ | async as comp; else default\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyEmptyComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n <ng-template #default>\n <p class=\"et-combobox-body--empty\">{{ combobox._tempEmptyText }}</p>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"combobox.error && !combobox.loading\">\n <ng-container *ngIf=\"combobox.customBodyErrorTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl; context: { error: combobox.error }\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyErrorComponent$ | async as comp\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (customErrorComponentInputs$ | async) ?? { error: combobox.error }\"\n />\n </ng-container>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"combobox.loading$ | async\">\n <ng-container *ngIf=\"combobox.customBodyLoadingTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyLoadingComponent$ | async as comp\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyLoadingComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n </ng-template>\n </ng-container>\n\n <et-combobox-option *ngFor=\"let option of options; trackBy: trackByFn\" [option]=\"option\" />\n\n <ng-container *ngIf=\"options?.length && combobox.showBodyMoreItemsHint\">\n <ng-container *ngIf=\"combobox.customBodyMoreItemsHintTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyMoreItemsHintComponent$ | async as comp; else default\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyMoreItemsHintComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n <ng-template #default>\n <p *ngIf=\"combobox.bodyMoreItemsHintText\" class=\"et-combobox-body--more-items-hint\">\n {{ combobox.bodyMoreItemsHintText }}\n </p>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n" }]
9331
+ ], template: "<div #containerElement class=\"et-combobox-body-container\" etAnimatedLifecycle>\n <ng-container *etLet=\"combobox.options$ | async as options\">\n <ng-container *ngIf=\"!options?.length && !combobox.error && !combobox.loading\">\n <ng-container *ngIf=\"combobox.customBodyEmptyTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyEmptyComponent$ | async as comp; else default\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyEmptyComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n <ng-template #default>\n <p class=\"et-combobox-body--empty\">{{ combobox._tempEmptyText }}</p>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"combobox.error && !combobox.loading\">\n <ng-container *ngIf=\"combobox.customBodyErrorTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl; context: { error: combobox.error }\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyErrorComponent$ | async as comp\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (customErrorComponentInputs$ | async) ?? { error: combobox.error }\"\n />\n </ng-container>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"combobox.loading$ | async\">\n <ng-container *ngIf=\"combobox.customBodyLoadingTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyLoadingComponent$ | async as comp\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyLoadingComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"!combobox.error\">\n <et-combobox-option *ngFor=\"let option of options; trackBy: trackByFn\" [option]=\"option\" />\n </ng-container>\n\n <ng-container *ngIf=\"options?.length && combobox.showBodyMoreItemsHint\">\n <ng-container *ngIf=\"combobox.customBodyMoreItemsHintTpl$ | async as tpl; else componentOrNone\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </ng-container>\n <ng-template #componentOrNone>\n <ng-container *ngIf=\"combobox.customBodyMoreItemsHintComponent$ | async as comp; else default\">\n <ng-container\n *ngComponentOutlet=\"comp; inputs: (combobox.customBodyMoreItemsHintComponentInputs$ | async) ?? undefined\"\n />\n </ng-container>\n <ng-template #default>\n <p *ngIf=\"combobox.bodyMoreItemsHintText\" class=\"et-combobox-body--more-items-hint\">\n {{ combobox.bodyMoreItemsHintText }}\n </p>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n" }]
9168
9332
  }], propDecorators: { _containerElementRef: [{
9169
9333
  type: ViewChild,
9170
9334
  args: ['containerElement', { static: true, read: ElementRef }]
@@ -9183,7 +9347,7 @@ class ComboboxComponent extends DecoratedInputBase {
9183
9347
  this.combobox.setBodyComponent(ComboboxBodyComponent);
9184
9348
  }
9185
9349
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9186
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: ComboboxComponent, isStandalone: true, selector: "et-combobox", host: { listeners: { "click": "combobox.selectInputAndOpen()" }, classAttribute: "et-combobox" }, usesInheritance: true, hostDirectives: [{ directive: i1$2.AnimatedOverlayDirective }, { directive: InputDirective, inputs: ["placeholder", "placeholder"] }, { directive: ComboboxDirective, inputs: ["options", "options", "initialValue", "initialValue", "filterInternal", "filterInternal", "loading", "loading", "error", "error", "emptyText", "emptyText", "placeholder", "placeholder", "multiple", "multiple", "bindLabel", "bindLabel", "bindValue", "bindValue", "allowCustomValues", "allowCustomValues", "selectedOptionComponent", "selectedOptionComponent", "optionComponent", "optionComponent", "bodyErrorComponent", "bodyErrorComponent", "bodyLoadingComponent", "bodyLoadingComponent", "bodyEmptyComponent", "bodyEmptyComponent", "bodyMoreItemsHintComponent", "bodyMoreItemsHintComponent", "showBodyMoreItemsHint", "showBodyMoreItemsHint", "bodyEmptyText", "bodyEmptyText", "bodyMoreItemsHintText", "bodyMoreItemsHintText", "optionComponentInputs", "optionComponentInputs", "selectedOptionComponentInputs", "selectedOptionComponentInputs", "bodyErrorComponentInputs", "bodyErrorComponentInputs", "bodyLoadingComponentInputs", "bodyLoadingComponentInputs", "bodyEmptyComponentInputs", "bodyEmptyComponentInputs", "bodyMoreItemsHintComponentInputs", "bodyMoreItemsHintComponentInputs"], outputs: ["filterChange", "filterChange"] }], ngImport: i0, template: "<ng-content select=\"[etInputPrefix]\" />\n\n<div>\n <div *ngIf=\"combobox.multiple$ | async\" class=\"et-combobox-selected-options\">\n <div\n *ngFor=\"let item of combobox.selectedOptions$ | async; trackBy: combobox.trackByOptionKeyFn\"\n class=\"et-combobox-selected-option\"\n aria-hidden=\"true\"\n >\n <ng-container\n *ngIf=\"\n combobox.customSelectedOptionTpl$ | async as customSelectedOptionTpl;\n else compOrDefaultSelectedOptionLabelTpl\n \"\n >\n <ng-container *ngTemplateOutlet=\"customSelectedOptionTpl; context: { option: item }\" />\n </ng-container>\n\n <ng-template #compOrDefaultSelectedOptionLabelTpl>\n <ng-container\n *ngIf=\"combobox.customSelectedOptionComponent$ | async as comp; else defaultSelectedOptionLabelTpl\"\n >\n <ng-container\n *ngComponentOutlet=\"\n comp;\n inputs: (combobox.combineSelectedOptionWithComponentInputs(item) | async) ?? { option: item }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultSelectedOptionLabelTpl>\n {{ combobox.getOptionLabel(item) | async }}\n </ng-template>\n </ng-template>\n\n <button\n (click)=\"combobox.removeSelectedOption(item); $event.stopPropagation()\"\n class=\"et-combobox-selected-option-remove\"\n tabindex=\"-1\"\n >\n x\n </button>\n </div>\n <div class=\"et-combobox-muliple-input\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </div>\n </div>\n\n <ng-template #inputTpl>\n <input\n [disabled]=\"input.disabled\"\n [attr.id]=\"input.id\"\n [attr.aria-required]=\"(input.required$ | async) || null\"\n [attr.aria-disabled]=\"(input.disabled$ | async) || null\"\n [attr.aria-invalid]=\"(input.invalid$ | async) || null\"\n [attr.aria-expanded]=\"combobox.isOpen$ | async\"\n [attr.aria-describedby]=\"input.describedBy$ | async\"\n [attr.placeholder]=\"input.placeholder || null\"\n [attr.aria-activedescendant]=\"combobox.activeOptionId$ | async\"\n [attr.aria-controls]=\"(combobox.selectBodyId$ | async) || null\"\n [attr.aria-owns]=\"(combobox.selectBodyId$ | async) || null\"\n (keydown)=\"combobox._processKeydownEvent($event)\"\n (keyup)=\"combobox._processKeyupEvent()\"\n (click)=\"combobox.open()\"\n (blur)=\"combobox._handleBlurEvent()\"\n (input)=\"combobox._processInputEvent($event)\"\n class=\"et-combobox-wrapper\"\n aria-haspopup=\"listbox\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n type=\"text\"\n value=\"{{ combobox.currentFilter }}\"\n etNativeInputRef\n />\n </ng-template>\n\n <ng-container *ngIf=\"(combobox.multiple$ | async) === false\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </ng-container>\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[et-floating-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[et-floating-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:min(200px,var(--et-floating-max-height, 200px));overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid;transform:var(--et-floating-translate);will-change:transform}.et-combobox-option{display:block}:where(.et-combobox-option--active){background-color:#1e1e1e}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NativeInputRefDirective, selector: "input[etNativeInputRef], textarea[etNativeInputRef], select[etNativeInputRef], button[etNativeInputRef]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
9350
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: ComboboxComponent, isStandalone: true, selector: "et-combobox", host: { listeners: { "click": "combobox.selectInputAndOpen()" }, classAttribute: "et-combobox" }, usesInheritance: true, hostDirectives: [{ directive: i1$2.AnimatedOverlayDirective }, { directive: OverlayCloseBlockerDirective }, { directive: InputDirective, inputs: ["placeholder", "placeholder"] }, { directive: ComboboxDirective, inputs: ["options", "options", "initialValue", "initialValue", "filterInternal", "filterInternal", "loading", "loading", "error", "error", "emptyText", "emptyText", "placeholder", "placeholder", "multiple", "multiple", "bindLabel", "bindLabel", "bindValue", "bindValue", "bindDisabled", "bindDisabled", "allowCustomValues", "allowCustomValues", "selectedOptionComponent", "selectedOptionComponent", "optionComponent", "optionComponent", "bodyErrorComponent", "bodyErrorComponent", "bodyLoadingComponent", "bodyLoadingComponent", "bodyEmptyComponent", "bodyEmptyComponent", "bodyMoreItemsHintComponent", "bodyMoreItemsHintComponent", "showBodyMoreItemsHint", "showBodyMoreItemsHint", "bodyEmptyText", "bodyEmptyText", "bodyMoreItemsHintText", "bodyMoreItemsHintText", "optionComponentInputs", "optionComponentInputs", "selectedOptionComponentInputs", "selectedOptionComponentInputs", "bodyErrorComponentInputs", "bodyErrorComponentInputs", "bodyLoadingComponentInputs", "bodyLoadingComponentInputs", "bodyEmptyComponentInputs", "bodyEmptyComponentInputs", "bodyMoreItemsHintComponentInputs", "bodyMoreItemsHintComponentInputs"], outputs: ["filterChange", "filterChange"] }], ngImport: i0, template: "<ng-content select=\"[etInputPrefix]\" />\n\n<div>\n <div *ngIf=\"combobox.multiple$ | async\" class=\"et-combobox-selected-options\">\n <div\n *ngFor=\"let item of combobox.selectedOptions$ | async; trackBy: combobox.trackByOptionKeyFn\"\n class=\"et-combobox-selected-option\"\n aria-hidden=\"true\"\n >\n <ng-container\n *ngIf=\"\n combobox.customSelectedOptionTpl$ | async as customSelectedOptionTpl;\n else compOrDefaultSelectedOptionLabelTpl\n \"\n >\n <ng-container *ngTemplateOutlet=\"customSelectedOptionTpl; context: { option: item }\" />\n </ng-container>\n\n <ng-template #compOrDefaultSelectedOptionLabelTpl>\n <ng-container\n *ngIf=\"combobox.customSelectedOptionComponent$ | async as comp; else defaultSelectedOptionLabelTpl\"\n >\n <ng-container\n *ngComponentOutlet=\"\n comp;\n inputs: (combobox.combineSelectedOptionWithComponentInputs(item) | async) ?? { option: item }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultSelectedOptionLabelTpl>\n {{ combobox.getOptionLabel(item) | async }}\n </ng-template>\n </ng-template>\n\n <button\n (click)=\"combobox.removeSelectedOption(item); $event.stopPropagation(); combobox.focus()\"\n class=\"et-combobox-selected-option-remove\"\n tabindex=\"-1\"\n >\n x\n </button>\n </div>\n <div class=\"et-combobox-muliple-input\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </div>\n </div>\n\n <ng-template #inputTpl>\n <input\n [disabled]=\"input.disabled\"\n [attr.id]=\"input.id\"\n [attr.aria-required]=\"(input.required$ | async) || null\"\n [attr.aria-disabled]=\"(input.disabled$ | async) || null\"\n [attr.aria-invalid]=\"(input.invalid$ | async) || null\"\n [attr.aria-expanded]=\"combobox.isOpen$ | async\"\n [attr.aria-describedby]=\"input.describedBy$ | async\"\n [attr.placeholder]=\"input.placeholder || null\"\n [attr.aria-activedescendant]=\"combobox.activeOptionId$ | async\"\n [attr.aria-controls]=\"(combobox.selectBodyId$ | async) || null\"\n [attr.aria-owns]=\"(combobox.selectBodyId$ | async) || null\"\n (keydown)=\"combobox._processKeydownEvent($event)\"\n (keyup)=\"combobox._processKeyupEvent()\"\n (click)=\"combobox.open()\"\n (blur)=\"combobox._handleBlurEvent()\"\n (input)=\"combobox._processInputEvent($event)\"\n class=\"et-combobox-wrapper\"\n autocomplete=\"off\"\n aria-haspopup=\"listbox\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n type=\"text\"\n value=\"{{ combobox.currentFilter }}\"\n etNativeInputRef\n />\n </ng-template>\n\n <ng-container *ngIf=\"(combobox.multiple$ | async) === false\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </ng-container>\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[et-floating-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[et-floating-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:min(200px,var(--et-floating-max-height, 200px));overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid;transform:var(--et-floating-translate);will-change:transform}.et-combobox-option{display:block}:where(.et-combobox-option--active){background-color:#1e1e1e}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NativeInputRefDirective, selector: "input[etNativeInputRef], textarea[etNativeInputRef], select[etNativeInputRef], button[etNativeInputRef]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
9187
9351
  }
9188
9352
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: ComboboxComponent, decorators: [{
9189
9353
  type: Component,
@@ -9201,6 +9365,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
9201
9365
  NgComponentOutlet,
9202
9366
  ], hostDirectives: [
9203
9367
  AnimatedOverlayDirective,
9368
+ OverlayCloseBlockerDirective,
9204
9369
  { directive: InputDirective, inputs: ['placeholder'] },
9205
9370
  {
9206
9371
  directive: ComboboxDirective,
@@ -9215,6 +9380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
9215
9380
  'multiple',
9216
9381
  'bindLabel',
9217
9382
  'bindValue',
9383
+ 'bindDisabled',
9218
9384
  'allowCustomValues',
9219
9385
  'selectedOptionComponent',
9220
9386
  'optionComponent',
@@ -9235,7 +9401,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
9235
9401
  // eslint-disable-next-line @angular-eslint/no-outputs-metadata-property
9236
9402
  outputs: ['filterChange'],
9237
9403
  },
9238
- ], template: "<ng-content select=\"[etInputPrefix]\" />\n\n<div>\n <div *ngIf=\"combobox.multiple$ | async\" class=\"et-combobox-selected-options\">\n <div\n *ngFor=\"let item of combobox.selectedOptions$ | async; trackBy: combobox.trackByOptionKeyFn\"\n class=\"et-combobox-selected-option\"\n aria-hidden=\"true\"\n >\n <ng-container\n *ngIf=\"\n combobox.customSelectedOptionTpl$ | async as customSelectedOptionTpl;\n else compOrDefaultSelectedOptionLabelTpl\n \"\n >\n <ng-container *ngTemplateOutlet=\"customSelectedOptionTpl; context: { option: item }\" />\n </ng-container>\n\n <ng-template #compOrDefaultSelectedOptionLabelTpl>\n <ng-container\n *ngIf=\"combobox.customSelectedOptionComponent$ | async as comp; else defaultSelectedOptionLabelTpl\"\n >\n <ng-container\n *ngComponentOutlet=\"\n comp;\n inputs: (combobox.combineSelectedOptionWithComponentInputs(item) | async) ?? { option: item }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultSelectedOptionLabelTpl>\n {{ combobox.getOptionLabel(item) | async }}\n </ng-template>\n </ng-template>\n\n <button\n (click)=\"combobox.removeSelectedOption(item); $event.stopPropagation()\"\n class=\"et-combobox-selected-option-remove\"\n tabindex=\"-1\"\n >\n x\n </button>\n </div>\n <div class=\"et-combobox-muliple-input\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </div>\n </div>\n\n <ng-template #inputTpl>\n <input\n [disabled]=\"input.disabled\"\n [attr.id]=\"input.id\"\n [attr.aria-required]=\"(input.required$ | async) || null\"\n [attr.aria-disabled]=\"(input.disabled$ | async) || null\"\n [attr.aria-invalid]=\"(input.invalid$ | async) || null\"\n [attr.aria-expanded]=\"combobox.isOpen$ | async\"\n [attr.aria-describedby]=\"input.describedBy$ | async\"\n [attr.placeholder]=\"input.placeholder || null\"\n [attr.aria-activedescendant]=\"combobox.activeOptionId$ | async\"\n [attr.aria-controls]=\"(combobox.selectBodyId$ | async) || null\"\n [attr.aria-owns]=\"(combobox.selectBodyId$ | async) || null\"\n (keydown)=\"combobox._processKeydownEvent($event)\"\n (keyup)=\"combobox._processKeyupEvent()\"\n (click)=\"combobox.open()\"\n (blur)=\"combobox._handleBlurEvent()\"\n (input)=\"combobox._processInputEvent($event)\"\n class=\"et-combobox-wrapper\"\n aria-haspopup=\"listbox\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n type=\"text\"\n value=\"{{ combobox.currentFilter }}\"\n etNativeInputRef\n />\n </ng-template>\n\n <ng-container *ngIf=\"(combobox.multiple$ | async) === false\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </ng-container>\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[et-floating-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[et-floating-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:min(200px,var(--et-floating-max-height, 200px));overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid;transform:var(--et-floating-translate);will-change:transform}.et-combobox-option{display:block}:where(.et-combobox-option--active){background-color:#1e1e1e}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"] }]
9404
+ ], template: "<ng-content select=\"[etInputPrefix]\" />\n\n<div>\n <div *ngIf=\"combobox.multiple$ | async\" class=\"et-combobox-selected-options\">\n <div\n *ngFor=\"let item of combobox.selectedOptions$ | async; trackBy: combobox.trackByOptionKeyFn\"\n class=\"et-combobox-selected-option\"\n aria-hidden=\"true\"\n >\n <ng-container\n *ngIf=\"\n combobox.customSelectedOptionTpl$ | async as customSelectedOptionTpl;\n else compOrDefaultSelectedOptionLabelTpl\n \"\n >\n <ng-container *ngTemplateOutlet=\"customSelectedOptionTpl; context: { option: item }\" />\n </ng-container>\n\n <ng-template #compOrDefaultSelectedOptionLabelTpl>\n <ng-container\n *ngIf=\"combobox.customSelectedOptionComponent$ | async as comp; else defaultSelectedOptionLabelTpl\"\n >\n <ng-container\n *ngComponentOutlet=\"\n comp;\n inputs: (combobox.combineSelectedOptionWithComponentInputs(item) | async) ?? { option: item }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultSelectedOptionLabelTpl>\n {{ combobox.getOptionLabel(item) | async }}\n </ng-template>\n </ng-template>\n\n <button\n (click)=\"combobox.removeSelectedOption(item); $event.stopPropagation(); combobox.focus()\"\n class=\"et-combobox-selected-option-remove\"\n tabindex=\"-1\"\n >\n x\n </button>\n </div>\n <div class=\"et-combobox-muliple-input\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </div>\n </div>\n\n <ng-template #inputTpl>\n <input\n [disabled]=\"input.disabled\"\n [attr.id]=\"input.id\"\n [attr.aria-required]=\"(input.required$ | async) || null\"\n [attr.aria-disabled]=\"(input.disabled$ | async) || null\"\n [attr.aria-invalid]=\"(input.invalid$ | async) || null\"\n [attr.aria-expanded]=\"combobox.isOpen$ | async\"\n [attr.aria-describedby]=\"input.describedBy$ | async\"\n [attr.placeholder]=\"input.placeholder || null\"\n [attr.aria-activedescendant]=\"combobox.activeOptionId$ | async\"\n [attr.aria-controls]=\"(combobox.selectBodyId$ | async) || null\"\n [attr.aria-owns]=\"(combobox.selectBodyId$ | async) || null\"\n (keydown)=\"combobox._processKeydownEvent($event)\"\n (keyup)=\"combobox._processKeyupEvent()\"\n (click)=\"combobox.open()\"\n (blur)=\"combobox._handleBlurEvent()\"\n (input)=\"combobox._processInputEvent($event)\"\n class=\"et-combobox-wrapper\"\n autocomplete=\"off\"\n aria-haspopup=\"listbox\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n type=\"text\"\n value=\"{{ combobox.currentFilter }}\"\n etNativeInputRef\n />\n </ng-template>\n\n <ng-container *ngIf=\"(combobox.multiple$ | async) === false\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </ng-container>\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[et-floating-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[et-floating-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:min(200px,var(--et-floating-max-height, 200px));overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid;transform:var(--et-floating-translate);will-change:transform}.et-combobox-option{display:block}:where(.et-combobox-option--active){background-color:#1e1e1e}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"] }]
9239
9405
  }], ctorParameters: function () { return []; } });
9240
9406
 
9241
9407
  const ComboboxImports = [
@@ -9251,6 +9417,18 @@ const ComboboxImports = [
9251
9417
  ComboboxBodyEmptyTemplateDirective,
9252
9418
  ];
9253
9419
 
9420
+ const createComboboxConfig = (globalConfig = {}, localConfig = {}) => ({
9421
+ ...COMBOBOX_DEFAULT_CONFIG,
9422
+ ...(globalConfig || {}),
9423
+ ...(localConfig || {}),
9424
+ });
9425
+ const provideComboboxConfig = (config = {}) => {
9426
+ return {
9427
+ provide: COMBOBOX_CONFIG_TOKEN,
9428
+ useValue: createComboboxConfig(config),
9429
+ };
9430
+ };
9431
+
9254
9432
  const NATIVE_SELECT_OPTION_TOKEN = new InjectionToken('ET_NATIVE_SELECT_OPTION_DIRECTIVE_TOKEN');
9255
9433
  class NativeSelectOptionDirective {
9256
9434
  constructor() {
@@ -9406,23 +9584,17 @@ class SelectOptionDirective {
9406
9584
  this._select = inject(SELECT_TOKEN);
9407
9585
  this._elementRef = inject(ElementRef);
9408
9586
  this._viewValue$ = new BehaviorSubject(this._elementRef.nativeElement.textContent?.trim() ?? '');
9409
- this._isActive$ = new BehaviorSubject(false);
9587
+ this.isActive$ = this._select._activeSelectionModel.isOptionActive$(this);
9410
9588
  this.id = `et-select-option-${uniqueId$2++}`;
9411
9589
  this._value$ = new BehaviorSubject(null);
9412
9590
  this._disabled$ = new BehaviorSubject(false);
9413
- this.isSelected$ = combineLatest([this._select.input.value$, this._value$]).pipe(map(([selectValue, optionValue]) => {
9414
- if (Array.isArray(selectValue)) {
9415
- return selectValue.includes(optionValue);
9416
- }
9417
- return selectValue === optionValue;
9418
- }));
9591
+ this.disabled$ = this._disabled$.asObservable();
9592
+ this.isSelected$ = this._select._selectionModel.isSelected$(this);
9419
9593
  this.isSelected = toSignal(this.isSelected$);
9420
9594
  this.viewValue$ = this._viewValue$.asObservable();
9421
- this.disabled$ = this._disabled$.asObservable();
9422
- this.isActive$ = this._isActive$.asObservable();
9423
9595
  this.hostClassBindings = signalHostClasses({
9424
9596
  'et-select-option--selected': this.isSelected,
9425
- 'et-select-option--active': toSignal(this._isActive$),
9597
+ 'et-select-option--active': toSignal(this.isActive$),
9426
9598
  });
9427
9599
  this.hostAttributeBindings = signalHostAttributes({
9428
9600
  'aria-selected': this.isSelected,
@@ -9443,43 +9615,24 @@ class SelectOptionDirective {
9443
9615
  get viewValue() {
9444
9616
  return this._viewValue$.value;
9445
9617
  }
9446
- ngAfterContentInit() {
9618
+ ngAfterViewInit() {
9447
9619
  this._updateViewValue();
9448
9620
  }
9449
- async setSelectValue() {
9450
- if (this.disabled)
9621
+ selectOption() {
9622
+ if (this._select._selectionModel.isDisabled(this)) {
9451
9623
  return;
9452
- if (this._select.multiple) {
9453
- if (!Array.isArray(this._select.input.value)) {
9454
- if (isDevMode()) {
9455
- console.warn('Select multiple is enabled but the value is not an array');
9456
- }
9457
- return;
9458
- }
9459
- const isSelected = await firstValueFrom(this.isSelected$);
9460
- if (isSelected) {
9461
- this._select.setValue(this._select.input.value.filter((value) => value !== this.value));
9462
- }
9463
- else {
9464
- this._select.setValue([...this._select.input.value, this.value]);
9465
- }
9466
- }
9467
- else {
9468
- this._select.setValue(this.value);
9469
- this._select.unmountSelectBody();
9470
9624
  }
9625
+ this._select.writeValueFromOption(this);
9626
+ this._select.focus();
9471
9627
  }
9472
9628
  _updateViewValue() {
9473
9629
  this._viewValue$.next(this._elementRef.nativeElement.textContent?.trim() ?? '');
9474
9630
  }
9475
- _setActive(isActive) {
9476
- this._isActive$.next(isActive);
9477
- }
9478
9631
  setActiveByHover() {
9479
- this._select._setActiveOption(this);
9632
+ this._select._activeSelectionModel.setActiveOption(this);
9480
9633
  }
9481
9634
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SelectOptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
9482
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: SelectOptionDirective, isStandalone: true, inputs: { value: "value", disabled: "disabled" }, host: { attributes: { "role": "option" }, listeners: { "click": "setSelectValue()", "mouseenter": "setActiveByHover()", "etObserveContent": "_updateViewValue()" }, properties: { "attr.id": "id", "attr.aria-disabled": "disabled", "class.et-select-option--disabled": "disabled" } }, providers: [
9635
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: SelectOptionDirective, isStandalone: true, inputs: { value: "value", disabled: "disabled" }, host: { attributes: { "role": "option" }, listeners: { "click": "selectOption()", "mouseenter": "setActiveByHover()", "etObserveContent": "_updateViewValue()" }, properties: { "attr.id": "id", "attr.aria-disabled": "disabled", "class.et-select-option--disabled": "disabled" } }, providers: [
9483
9636
  {
9484
9637
  provide: SELECT_OPTION_TOKEN,
9485
9638
  useExisting: SelectOptionDirective,
@@ -9500,7 +9653,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
9500
9653
  '[attr.id]': 'id',
9501
9654
  '[attr.aria-disabled]': 'disabled',
9502
9655
  '[class.et-select-option--disabled]': 'disabled',
9503
- '(click)': 'setSelectValue()',
9656
+ '(click)': 'selectOption()',
9504
9657
  '(mouseenter)': 'setActiveByHover()',
9505
9658
  '(etObserveContent)': '_updateViewValue()',
9506
9659
  role: 'option',
@@ -9518,12 +9671,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
9518
9671
  const SELECT_TOKEN = new InjectionToken('ET_SELECT_INPUT_TOKEN');
9519
9672
  let uniqueId$1 = 0;
9520
9673
  class SelectDirective {
9521
- get multiple() {
9522
- return this._multiple$.value;
9523
- }
9524
9674
  set multiple(value) {
9525
- this._multiple$.next(booleanAttribute(value));
9526
- this._migrateSelectValue();
9675
+ this._selectionModel.setAllowMultiple(booleanAttribute(value));
9527
9676
  }
9528
9677
  set _selectOptionsQueryList(value) {
9529
9678
  this._selectOptionsQueryList$.next(value);
@@ -9532,7 +9681,6 @@ class SelectDirective {
9532
9681
  this._selectBodyConfig = null;
9533
9682
  this._animatedOverlay = inject(AnimatedOverlayDirective);
9534
9683
  this._destroy$ = createDestroy();
9535
- this._liveAnnouncer = inject(LiveAnnouncer);
9536
9684
  this._selectField = inject(SELECT_FIELD_TOKEN);
9537
9685
  this._themeProvider = inject(THEME_PROVIDER, { optional: true });
9538
9686
  this.input = inject(INPUT_TOKEN);
@@ -9541,55 +9689,27 @@ class SelectDirective {
9541
9689
  this.elementRef = inject(ElementRef);
9542
9690
  this._selectionModel = new SelectionModel();
9543
9691
  this._activeSelectionModel = new ActiveSelectionModel();
9544
- this._multiple$ = new BehaviorSubject(false);
9545
9692
  this._selectOptionsQueryList$ = new BehaviorSubject(null);
9546
- this.selectOptions$ = this._selectOptionsQueryList$.pipe(switchQueryListChanges(), switchMap((queryList) => {
9547
- if (!queryList)
9548
- return of(null);
9549
- const items = queryList.map((opt) => combineLatest([opt.isSelected$, opt.isActive$]).pipe(map(([selected, active]) => ({ opt, selected, active }))));
9550
- return combineLatest(items ?? of(null));
9551
- }));
9552
- this.activeOption$ = this.selectOptions$.pipe(map((options) => {
9553
- if (!options)
9554
- return null;
9555
- return options.find((option) => option.active) ?? null;
9556
- }));
9557
- this.selectedOptions$ = this.selectOptions$.pipe(map((options) => {
9558
- if (!options)
9559
- return null;
9560
- const selectedOptions = options.filter((option) => option.selected);
9561
- if (!selectedOptions.length)
9562
- return null;
9563
- const inputValue = this.input.value;
9564
- if (this.multiple && Array.isArray(inputValue)) {
9565
- // sort selected options by the order of the input value
9566
- const selectedOptionsMap = new Map(selectedOptions.map((option) => [option.opt.value, option]));
9567
- return inputValue
9568
- .map((value) => selectedOptionsMap.get(value))
9569
- .filter((option) => !!option);
9570
- }
9571
- return selectedOptions;
9572
- }));
9573
- this.selectedOption$ = this.selectedOptions$.pipe(map((options) => options?.[0] ?? null));
9574
9693
  this.selectBodyId$ = this._selectBodyId$.asObservable();
9575
9694
  this.isOpen$ = this._isOpen$.asObservable();
9576
9695
  this.isOpen = toSignal(this.isOpen$);
9577
- this.multiple$ = this._multiple$.asObservable();
9696
+ this.multiple$ = this._selectionModel.allowMultiple$;
9578
9697
  this.selectCurrentValueId = `et-select-current-value-${uniqueId$1++}`;
9579
- this.ariaViewValue$ = this.selectedOptions$.pipe(switchMap((options) => {
9698
+ this.ariaViewValue$ = this._selectionModel.selection$.pipe(switchMap((options) => {
9580
9699
  if (!options?.length)
9581
9700
  return of(null);
9582
- const viewValues = options.map((option) => option.opt.viewValue$);
9701
+ const viewValues = options.map((option) => option.viewValue$);
9583
9702
  return combineLatest(viewValues);
9584
9703
  }), map((viewValues) => {
9585
9704
  if (!viewValues)
9586
9705
  return null;
9587
9706
  return viewValues.join(', ');
9588
9707
  }));
9589
- this.activeDescendant$ = combineLatest([this.isOpen$, this.activeOption$]).pipe(map(([isOpen, activeOption]) => {
9708
+ this.ariaViewValue = toSignal(this.ariaViewValue$);
9709
+ this.activeDescendant$ = combineLatest([this.isOpen$, this._activeSelectionModel.activeOption$]).pipe(map(([isOpen, activeOption]) => {
9590
9710
  if (!isOpen || !activeOption)
9591
9711
  return null;
9592
- return activeOption.opt.id;
9712
+ return activeOption.id;
9593
9713
  }));
9594
9714
  this.owns$ = combineLatest([this.isOpen$, this.selectBodyId$]).pipe(map(([isOpen, selectBodyId]) => {
9595
9715
  if (!isOpen || !selectBodyId) {
@@ -9609,6 +9729,7 @@ class SelectDirective {
9609
9729
  'et-select-field--open': this.isOpen,
9610
9730
  'et-select-field--multiple': toSignal(this.multiple$),
9611
9731
  });
9732
+ this.inputElement = null;
9612
9733
  this.trackByFn = (_, item) => item.id;
9613
9734
  this._animatedOverlay.placement = 'bottom';
9614
9735
  this._animatedOverlay.fallbackPlacements = ['bottom', 'top'];
@@ -9620,21 +9741,22 @@ class SelectDirective {
9620
9741
  .setValueBinding((v) => v.value)
9621
9742
  .setDisabledBinding((v) => v.disabled);
9622
9743
  this._activeSelectionModel.setSelectionModel(this._selectionModel);
9623
- //TODO: TO BE CONTINUED...
9624
9744
  }
9625
9745
  ngOnInit() {
9626
- this._unmountSelectBodyOnDisable();
9627
- this._migrateSelectValue();
9628
- }
9629
- ngAfterContentInit() {
9630
- this._setSelectedOptionActive();
9746
+ this._closeBodyOnDisable();
9747
+ this._selectionModel.setSelectionFromValue$(this.input.value);
9748
+ this._selectionModel.value$
9749
+ .pipe(takeUntil(this._destroy$), tap((value) => this.input._updateValue(value)))
9750
+ .subscribe();
9751
+ this.input.onExternalUpdate$
9752
+ .pipe(takeUntil(this._destroy$), tap(() => this._selectionModel.setSelectionFromValue$(this.input.value)))
9753
+ .subscribe();
9631
9754
  }
9632
- mountSelectBody() {
9755
+ open() {
9633
9756
  if (!this._selectBodyConfig)
9634
9757
  return;
9635
9758
  if (this._animatedOverlay.isMounted || this.input.disabled)
9636
9759
  return;
9637
- this._setSelectedOptionActive();
9638
9760
  const instance = this._animatedOverlay.mount({
9639
9761
  component: this._selectBodyConfig.component,
9640
9762
  mirrorWidth: true,
@@ -9645,300 +9767,159 @@ class SelectDirective {
9645
9767
  return;
9646
9768
  this._selectBodyId$.next(instance.selectBody.id);
9647
9769
  this._isOpen$.next(true);
9770
+ this._activeSelectionModel.activeOption$
9771
+ .pipe(debounceTime$1(0), tap((activeOption) => {
9772
+ if (!activeOption)
9773
+ return;
9774
+ scrollToElement({
9775
+ container: instance._containerElementRef?.nativeElement,
9776
+ element: activeOption._elementRef.nativeElement,
9777
+ behavior: 'instant',
9778
+ });
9779
+ }), takeUntil(this._destroy$), takeUntil(this._animatedOverlay.afterClosed()))
9780
+ .subscribe();
9781
+ this._animatedOverlay
9782
+ .afterClosed()
9783
+ .pipe(takeUntil(this._destroy$), tap(() => {
9784
+ this._selectBodyId$.next(null);
9785
+ this._isOpen$.next(false);
9786
+ }))
9787
+ .subscribe();
9648
9788
  }
9649
- unmountSelectBody() {
9789
+ close() {
9650
9790
  if (!this._animatedOverlay.isMounted)
9651
9791
  return;
9652
9792
  this._animatedOverlay.unmount();
9653
- this._selectBodyId$.next(null);
9654
- this._isOpen$.next(false);
9655
9793
  }
9656
- setValue(value) {
9657
- this.input._updateValue(value);
9794
+ writeValueFromOption(option) {
9658
9795
  this.input._markAsTouched();
9659
- this.input._setShouldDisplayError(true);
9660
- }
9661
- handleKeyDown(event) {
9662
- if (this._isOpen$.value) {
9663
- this._handleKeyDownInOpenState(event);
9796
+ if (this._selectionModel.allowMultiple) {
9797
+ this._selectionModel.toggleSelectedOption(option);
9664
9798
  }
9665
9799
  else {
9666
- this._handleKeyDownInClosedState(event);
9800
+ this._selectionModel.addSelectedOption(option);
9667
9801
  }
9802
+ if (!this._selectionModel.allowMultiple) {
9803
+ this.close();
9804
+ }
9805
+ }
9806
+ focus() {
9807
+ this.inputElement?.nativeElement.focus();
9668
9808
  }
9669
9809
  setSelectBody(config) {
9670
9810
  this._selectBodyConfig = config;
9671
9811
  }
9672
9812
  removeOptionFromSelection(option) {
9673
- if (!this.multiple || !Array.isArray(this.input.value))
9674
- return;
9675
- const value = this.input.value.filter((v) => v !== option.value);
9676
- this.setValue(value);
9813
+ this._selectionModel.removeSelectedOption(option);
9677
9814
  }
9678
9815
  _controlTouched() {
9679
9816
  this.input._markAsTouched();
9680
9817
  this.input._setShouldDisplayError(true);
9681
9818
  }
9682
- _unmountSelectBodyOnDisable() {
9683
- this.input.disabled$
9684
- .pipe(tap((disabled) => {
9685
- if (!disabled)
9686
- return;
9687
- this.unmountSelectBody();
9688
- }), takeUntil(this._destroy$))
9689
- .subscribe();
9690
- }
9691
- _handleKeyDownInClosedState(event) {
9692
- const keyCode = event.keyCode;
9693
- const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW || keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW;
9694
- const isOpenKey = keyCode === ENTER || keyCode === SPACE;
9695
- if ((isOpenKey && !hasModifierKey(event)) || ((this.multiple || event.altKey) && isArrowKey)) {
9696
- event.preventDefault();
9697
- this.mountSelectBody();
9698
- }
9699
- else if (!this.multiple) {
9700
- switch (keyCode) {
9701
- case DOWN_ARROW:
9702
- this._selectOptionByOffset(1, true);
9703
- break;
9704
- case UP_ARROW:
9705
- this._selectOptionByOffset(-1, true);
9706
- break;
9707
- case HOME:
9708
- this._selectFirstOption(true);
9709
- break;
9710
- case END:
9711
- this._selectLastOption(true);
9712
- break;
9713
- case PAGE_UP:
9714
- this._selectOptionByOffset(-10, true);
9715
- break;
9716
- case PAGE_DOWN:
9717
- this._selectOptionByOffset(10, true);
9718
- break;
9719
- }
9720
- }
9721
- else if (this.multiple && isArrowKey) {
9722
- event.preventDefault();
9723
- this.mountSelectBody();
9724
- }
9725
- }
9726
- async _handleKeyDownInOpenState(event) {
9819
+ _processKeydownEvent(event) {
9727
9820
  const keyCode = event.keyCode;
9728
- const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
9729
- if (isArrowKey && event.altKey) {
9730
- event.preventDefault();
9731
- this.unmountSelectBody();
9821
+ const isOpen = this.isOpen();
9822
+ const isMultiple = this._selectionModel.allowMultiple;
9823
+ const selection = this._selectionModel.selection;
9824
+ const isArrowKey = keyCode === UP_ARROW || keyCode === DOWN_ARROW;
9825
+ const isAltPressed = hasModifierKey(event, 'altKey');
9826
+ const result = {};
9827
+ if (isArrowKey && isAltPressed && !isOpen) {
9828
+ result.overlayOperation = 'open';
9829
+ return this._interpretKeyHandlerResult(result);
9732
9830
  }
9733
- else if (keyCode === ESCAPE && !hasModifierKey(event)) {
9831
+ if (keyCode === ENTER) {
9734
9832
  event.preventDefault();
9735
9833
  event.stopPropagation();
9736
- this.unmountSelectBody();
9737
- }
9738
- else if (keyCode === ENTER || keyCode === SPACE) {
9739
- if (this.multiple) {
9740
- this._toggleActiveOptionSelection();
9834
+ const activeOption = this._activeSelectionModel.activeOption;
9835
+ if (activeOption && this._selectionModel.isDisabled(activeOption))
9836
+ return;
9837
+ if (activeOption) {
9838
+ if (isMultiple) {
9839
+ result.optionAction = { type: 'toggle', option: activeOption };
9840
+ }
9841
+ else {
9842
+ result.optionAction = { type: 'add', option: activeOption };
9843
+ }
9741
9844
  }
9742
- else {
9743
- this._setActiveOptionSelected();
9845
+ if (!isMultiple) {
9846
+ result.overlayOperation = 'close';
9744
9847
  }
9745
- event.preventDefault();
9746
- }
9747
- else if (this.multiple && keyCode === A && event.ctrlKey) {
9748
- event.preventDefault();
9749
- this._toggleSelectionOfAllOptions();
9750
- }
9751
- else {
9752
- switch (keyCode) {
9753
- case DOWN_ARROW:
9754
- this._activateOptionByOffset(1);
9755
- break;
9756
- case UP_ARROW:
9757
- this._activateOptionByOffset(-1);
9758
- break;
9759
- case HOME:
9760
- this._activateFirstOption();
9761
- break;
9762
- case END:
9763
- this._activateLastOption();
9764
- break;
9765
- case PAGE_UP:
9766
- this._activateOptionByOffset(-10);
9767
- break;
9768
- case PAGE_DOWN:
9769
- this._activateOptionByOffset(10);
9770
- break;
9771
- }
9772
- }
9773
- }
9774
- async _setActiveOption(option) {
9775
- const currentActiveOption = await firstValueFrom(this.activeOption$);
9776
- if (currentActiveOption?.opt === option)
9777
- return false;
9778
- currentActiveOption?.opt._setActive(false);
9779
- if (option) {
9780
- option._setActive(true);
9781
- }
9782
- return true;
9783
- }
9784
- async _addActiveOptionToSelection() {
9785
- const activeOption = await firstValueFrom(this.activeOption$);
9786
- if (!activeOption || activeOption.opt.disabled || activeOption.selected)
9787
- return;
9788
- if (!Array.isArray(this.input.value)) {
9789
- this.setValue([activeOption.opt.value]);
9790
- return;
9848
+ return this._interpretKeyHandlerResult(result);
9791
9849
  }
9792
- this.setValue([...this.input.value, activeOption.opt.value]);
9793
- }
9794
- async _removeActiveOptionFromSelection() {
9795
- const activeOption = await firstValueFrom(this.activeOption$);
9796
- if (!activeOption || activeOption.opt.disabled || !activeOption.selected)
9797
- return;
9798
- if (!Array.isArray(this.input.value)) {
9799
- this.setValue([]);
9800
- return;
9850
+ if (keyCode === ESCAPE) {
9851
+ if (isOpen) {
9852
+ result.overlayOperation = 'close';
9853
+ event.preventDefault();
9854
+ event.stopPropagation();
9855
+ }
9856
+ return this._interpretKeyHandlerResult(result);
9801
9857
  }
9802
- this.setValue(this.input.value.filter((value) => value !== activeOption.opt.value));
9803
- }
9804
- async _toggleSelectionOfAllOptions() {
9805
- const allOptions = await firstValueFrom(this.selectOptions$);
9806
- const hasDeselectedOption = allOptions?.some((opt) => !opt.opt.disabled && !opt.selected);
9807
- if (hasDeselectedOption) {
9808
- this._selectAllOptions();
9858
+ if (keyCode === TAB$1) {
9859
+ result.overlayOperation = 'close';
9860
+ return this._interpretKeyHandlerResult(result);
9809
9861
  }
9810
- else {
9811
- this._deselectAllOptions();
9862
+ if (keyCode === BACKSPACE) {
9863
+ const lastSelectedOption = selection[selection.length - 1];
9864
+ if (isMultiple && lastSelectedOption) {
9865
+ result.optionAction = { type: 'remove', option: lastSelectedOption };
9866
+ return this._interpretKeyHandlerResult(result);
9867
+ }
9812
9868
  }
9813
- }
9814
- async _selectAllOptions() {
9815
- const allOptions = await firstValueFrom(this.selectOptions$);
9816
- if (!allOptions)
9817
- return;
9818
- const selectedOptions = allOptions.filter((opt) => !opt.opt.disabled).map((opt) => opt.opt.value);
9819
- this.setValue(selectedOptions);
9820
- }
9821
- async _deselectAllOptions() {
9822
- this.setValue([]);
9823
- }
9824
- async _toggleActiveOptionSelection() {
9825
- const activeOption = await firstValueFrom(this.activeOption$);
9826
- if (!activeOption)
9827
- return;
9828
- if (activeOption.selected) {
9829
- this._removeActiveOptionFromSelection();
9869
+ if (keyCode === SPACE) {
9870
+ result.overlayOperation = 'open';
9871
+ return this._interpretKeyHandlerResult(result);
9830
9872
  }
9831
- else {
9832
- this._addActiveOptionToSelection();
9873
+ const newActiveOption = this._activeSelectionModel.evaluateKeyboardEvent(event, { skipDisabled: !isOpen });
9874
+ if (newActiveOption && !isOpen && !isMultiple) {
9875
+ result.optionAction = { type: 'add', option: newActiveOption };
9833
9876
  }
9834
- }
9835
- async _setActiveOptionSelected() {
9836
- const activeOption = await firstValueFrom(this.activeOption$);
9837
- if (!activeOption || activeOption.opt.disabled)
9838
- return;
9839
- this._setSelectedOption(activeOption.opt);
9840
- this.unmountSelectBody();
9841
- }
9842
- async _setSelectedOptionActive() {
9843
- const selectedOption = await firstValueFrom(this.selectedOption$);
9844
- if (!selectedOption)
9845
- return;
9846
- this._setActiveOption(selectedOption.opt);
9847
- }
9848
- async _setSelectedOption(option) {
9849
- const selectedOption = await firstValueFrom(this.selectedOption$);
9850
- if (selectedOption === option)
9851
- return false;
9852
- this._setActiveOption(option);
9853
- this.setValue(option?.value ?? null);
9854
- return true;
9855
- }
9856
- async _selectFirstOption(announce) {
9857
- const options = await firstValueFrom(this.selectOptions$);
9858
- if (!options)
9859
- return;
9860
- const firstOption = options[0]?.opt;
9861
- if (!firstOption)
9862
- return;
9863
- if (!this._setSelectedOption(firstOption))
9864
- return;
9865
- if (announce) {
9866
- const text = await firstValueFrom(firstOption.viewValue$);
9867
- this._liveAnnouncer.announce(text, 10000);
9877
+ if (keyCode === A && event.ctrlKey && isMultiple) {
9878
+ result.optionAction = 'toggleAll';
9879
+ event.preventDefault();
9868
9880
  }
9881
+ return this._interpretKeyHandlerResult(result);
9869
9882
  }
9870
- async _selectLastOption(announce) {
9871
- const options = await firstValueFrom(this.selectOptions$);
9872
- if (!options)
9873
- return;
9874
- const lastOption = options[options.length - 1]?.opt;
9875
- if (!lastOption)
9876
- return;
9877
- if (!this._setSelectedOption(lastOption))
9878
- return;
9879
- if (announce) {
9880
- const text = await firstValueFrom(lastOption.viewValue$);
9881
- this._liveAnnouncer.announce(text, 10000);
9883
+ _interpretKeyHandlerResult(result) {
9884
+ if (result.overlayOperation === 'close') {
9885
+ this.close();
9882
9886
  }
9883
- }
9884
- async _selectOptionByOffset(offset, announce) {
9885
- const options = await firstValueFrom(this.selectOptions$);
9886
- if (!options)
9887
- return;
9888
- const selectedOption = await firstValueFrom(this.selectedOption$);
9889
- const selectedOptionIndex = options.findIndex((o) => o.opt === selectedOption?.opt);
9890
- const nextOptionIndex = selectedOptionIndex + offset;
9891
- const nextOption = options[nextOptionIndex];
9892
- if (!nextOption)
9893
- return;
9894
- if (nextOption.opt.disabled) {
9895
- return this._selectOptionByOffset(offset + (offset < 0 ? -1 : 1), announce);
9887
+ else if (result.overlayOperation === 'open') {
9888
+ this.open();
9896
9889
  }
9897
- if (!this._setSelectedOption(nextOption.opt))
9898
- return;
9899
- if (announce) {
9900
- const text = await firstValueFrom(nextOption.opt.viewValue$);
9901
- this._liveAnnouncer.announce(text, 10000);
9890
+ if (result.optionAction) {
9891
+ if (typeof result.optionAction === 'string') {
9892
+ if (result.optionAction === 'clear') {
9893
+ this._selectionModel.clearSelectedOptions();
9894
+ }
9895
+ else if (result.optionAction === 'toggleAll') {
9896
+ this._selectionModel.toggleAllSelectedOptions();
9897
+ }
9898
+ }
9899
+ else {
9900
+ const { type, option } = result.optionAction;
9901
+ if (this._selectionModel.isDisabled(option))
9902
+ return;
9903
+ if (type === 'add') {
9904
+ this._selectionModel.addSelectedOption(option);
9905
+ }
9906
+ if (type === 'remove') {
9907
+ this._selectionModel.removeSelectedOption(option);
9908
+ }
9909
+ if (type === 'toggle') {
9910
+ this._selectionModel.toggleSelectedOption(option);
9911
+ }
9912
+ }
9902
9913
  }
9903
9914
  }
9904
- async _activateFirstOption() {
9905
- const options = await firstValueFrom(this.selectOptions$);
9906
- if (!options)
9907
- return;
9908
- const firstOption = options[0]?.opt;
9909
- if (!firstOption)
9910
- return;
9911
- await this._setActiveOption(firstOption);
9912
- }
9913
- async _activateLastOption() {
9914
- const options = await firstValueFrom(this.selectOptions$);
9915
- if (!options)
9916
- return;
9917
- const lastOption = options[options.length - 1]?.opt;
9918
- if (!lastOption)
9919
- return;
9920
- await this._setActiveOption(lastOption);
9921
- }
9922
- async _activateOptionByOffset(offset) {
9923
- const options = await firstValueFrom(this.selectOptions$);
9924
- if (!options)
9925
- return;
9926
- const activatedOption = await firstValueFrom(this.activeOption$);
9927
- const activatedOptionIndex = options.findIndex((o) => o.opt === activatedOption?.opt);
9928
- const nextOptionIndex = activatedOptionIndex + offset;
9929
- const nextOption = options[nextOptionIndex];
9930
- if (!nextOption)
9931
- return;
9932
- await this._setActiveOption(nextOption.opt);
9933
- }
9934
- async _migrateSelectValue() {
9935
- if (this.multiple && !Array.isArray(this.input.value)) {
9936
- this.setValue([]);
9937
- }
9938
- else if (!this.multiple && Array.isArray(this.input.value)) {
9939
- this.setValue(null);
9940
- }
9941
- this._setActiveOption(null);
9915
+ _closeBodyOnDisable() {
9916
+ this.input.disabled$
9917
+ .pipe(tap((disabled) => {
9918
+ if (!disabled)
9919
+ return;
9920
+ this.close();
9921
+ }), takeUntil(this._destroy$))
9922
+ .subscribe();
9942
9923
  }
9943
9924
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SelectDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
9944
9925
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: SelectDirective, isStandalone: true, inputs: { multiple: "multiple", emptyText: "emptyText" }, providers: [
@@ -9946,13 +9927,13 @@ class SelectDirective {
9946
9927
  provide: SELECT_TOKEN,
9947
9928
  useExisting: SelectDirective,
9948
9929
  },
9949
- ], queries: [{ propertyName: "_selectOptionsQueryList", predicate: SELECT_OPTION_TOKEN, descendants: true }], hostDirectives: [{ directive: i1$2.AnimatedOverlayDirective }], ngImport: i0 }); }
9930
+ ], queries: [{ propertyName: "_selectOptionsQueryList", predicate: SELECT_OPTION_TOKEN, descendants: true }], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }], hostDirectives: [{ directive: i1$2.AnimatedOverlayDirective }, { directive: OverlayCloseBlockerDirective }], ngImport: i0 }); }
9950
9931
  }
9951
9932
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SelectDirective, decorators: [{
9952
9933
  type: Directive,
9953
9934
  args: [{
9954
9935
  standalone: true,
9955
- hostDirectives: [AnimatedOverlayDirective],
9936
+ hostDirectives: [AnimatedOverlayDirective, OverlayCloseBlockerDirective],
9956
9937
  providers: [
9957
9938
  {
9958
9939
  provide: SELECT_TOKEN,
@@ -9967,6 +9948,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
9967
9948
  }], _selectOptionsQueryList: [{
9968
9949
  type: ContentChildren,
9969
9950
  args: [SELECT_OPTION_TOKEN, { descendants: true }]
9951
+ }], inputElement: [{
9952
+ type: ViewChild,
9953
+ args: ['inputElement']
9970
9954
  }] } });
9971
9955
 
9972
9956
  const SELECT_BODY_TOKEN = new InjectionToken('ET_SELECT_BODY_TOKEN');
@@ -9974,6 +9958,7 @@ let uniqueId = 0;
9974
9958
  class SelectBodyDirective {
9975
9959
  constructor() {
9976
9960
  this._destroy$ = createDestroy();
9961
+ this._elementRef = inject(ElementRef);
9977
9962
  this._select = inject(SELECT_TOKEN);
9978
9963
  this._clickOutside = inject(ClickOutsideDirective);
9979
9964
  this.id = `et-select-body-${uniqueId++}`;
@@ -9984,7 +9969,7 @@ class SelectBodyDirective {
9984
9969
  }
9985
9970
  ngOnInit() {
9986
9971
  this._clickOutside.etClickOutside
9987
- .pipe(takeUntil(this._destroy$), tap(() => this._select.unmountSelectBody()))
9972
+ .pipe(takeUntil(this._destroy$), tap(() => this._select.close()))
9988
9973
  .subscribe();
9989
9974
  }
9990
9975
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SelectBodyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
@@ -10024,8 +10009,8 @@ class SelectBodyComponent {
10024
10009
  this._themeProvider.syncWithProvider(provider);
10025
10010
  }
10026
10011
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SelectBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10027
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: SelectBodyComponent, isStandalone: true, selector: "et-select-body", host: { classAttribute: "et-select-body et-with-default-animation" }, viewQueries: [{ propertyName: "_animatedLifecycle", first: true, predicate: ANIMATED_LIFECYCLE_TOKEN, descendants: true, static: true }], hostDirectives: [{ directive: SelectBodyDirective }, { directive: i2$1.ProvideThemeDirective }], ngImport: i0, template: `
10028
- <div class="et-select-body-container" etAnimatedLifecycle>
10012
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: SelectBodyComponent, isStandalone: true, selector: "et-select-body", host: { classAttribute: "et-select-body et-with-default-animation" }, viewQueries: [{ propertyName: "_animatedLifecycle", first: true, predicate: ANIMATED_LIFECYCLE_TOKEN, descendants: true, static: true }, { propertyName: "_containerElementRef", first: true, predicate: ["containerElement"], descendants: true, read: ElementRef, static: true }], hostDirectives: [{ directive: SelectBodyDirective }, { directive: i2$1.ProvideThemeDirective }], ngImport: i0, template: `
10013
+ <div #containerElement class="et-select-body-container" etAnimatedLifecycle>
10029
10014
  <ng-container [ngTemplateOutlet]="_bodyTemplate" />
10030
10015
  </div>
10031
10016
  `, isInline: true, styles: [".et-select-body.et-with-default-animation .et-select-body-container.et-animation-enter-from,.et-select-body.et-with-default-animation .et-select-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-select-body.et-with-default-animation .et-select-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-select-body.et-with-default-animation .et-select-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-select-body.et-with-default-animation[et-floating-placement^=top] .et-select-body-container{transform-origin:bottom}.et-select-body.et-with-default-animation[et-floating-placement^=bottom] .et-select-body-container{transform-origin:top}.et-select-body{transform:var(--et-floating-translate);will-change:transform}.et-select-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:min(200px,var(--et-floating-max-height, 200px));overflow:auto}@supports (overflow: overlay){.et-select-body-container{overflow:overlay}}.et-select-body{width:100%;display:grid}\n"], dependencies: [{ kind: "directive", type: AnimatedLifecycleDirective, selector: "[etAnimatedLifecycle]", exportAs: ["etAnimatedLifecycle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
@@ -10033,7 +10018,7 @@ class SelectBodyComponent {
10033
10018
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SelectBodyComponent, decorators: [{
10034
10019
  type: Component,
10035
10020
  args: [{ selector: 'et-select-body', template: `
10036
- <div class="et-select-body-container" etAnimatedLifecycle>
10021
+ <div #containerElement class="et-select-body-container" etAnimatedLifecycle>
10037
10022
  <ng-container [ngTemplateOutlet]="_bodyTemplate" />
10038
10023
  </div>
10039
10024
  `, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
@@ -10042,6 +10027,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
10042
10027
  }], propDecorators: { _animatedLifecycle: [{
10043
10028
  type: ViewChild,
10044
10029
  args: [ANIMATED_LIFECYCLE_TOKEN, { static: true }]
10030
+ }], _containerElementRef: [{
10031
+ type: ViewChild,
10032
+ args: ['containerElement', { static: true, read: ElementRef }]
10045
10033
  }] } });
10046
10034
 
10047
10035
  class SelectOptionComponent {
@@ -10079,13 +10067,13 @@ class SelectComponent extends DecoratedInputBase {
10079
10067
  this.select.setSelectBody({ component: SelectBodyComponent, template: this.selectBodyTpl });
10080
10068
  }
10081
10069
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
10082
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: SelectComponent, isStandalone: true, selector: "et-select", host: { classAttribute: "et-select" }, viewQueries: [{ propertyName: "selectBodyTpl", first: true, predicate: ["selectBodyTpl"], descendants: true }], usesInheritance: true, hostDirectives: [{ directive: InputDirective }, { directive: SelectDirective, inputs: ["multiple", "multiple", "emptyText", "emptyText"] }], ngImport: i0, template: "<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-select-wrapper\">\n <div\n #inputElement\n [attr.id]=\"input.id\"\n [attr.aria-labelledby]=\"select.labelledBy$ | async\"\n [attr.aria-describedby]=\"input.describedBy$ | async\"\n [attr.tabindex]=\"(input.disabled$ | async) ? -1 : 0\"\n [attr.aria-required]=\"(input.required$ | async) || null\"\n [attr.aria-disabled]=\"(input.disabled$ | async) || null\"\n [attr.aria-invalid]=\"(input.invalid$ | async) || null\"\n [attr.aria-controls]=\"(select.selectBodyId$ | async) || null\"\n [attr.aria-owns]=\"(select.owns$ | async) || null\"\n [attr.aria-expanded]=\"select.isOpen$ | async\"\n [attr.aria-activedescendant]=\"select.activeDescendant$ | async\"\n (click)=\"select.mountSelectBody()\"\n (keydown)=\"select.handleKeyDown($event)\"\n (blur)=\"select._controlTouched()\"\n class=\"et-select-input et-select-input--static\"\n aria-haspopup=\"listbox\"\n role=\"combobox\"\n aria-autocomplete=\"none\"\n >\n <span\n *etLet=\"select.ariaViewValue$ | async as ariaViewValue\"\n [attr.id]=\"select.selectCurrentValueId\"\n [class.cdk-visually-hidden]=\"select.multiple && ariaViewValue\"\n class=\"et-select-current-value\"\n >\n <ng-container *ngIf=\"select.ariaViewValue$ | async as ariaViewValue; else emptyTpl\">\n {{ ariaViewValue }}\n </ng-container>\n <ng-template #emptyTpl> {{ select.emptyText }} </ng-template>\n </span>\n\n <ng-container *ngIf=\"select.multiple\">\n <ng-container *ngIf=\"select.selectedOptions$ | async as selectedOptions\">\n <ul *ngIf=\"selectedOptions.length\" class=\"et-select-selected-options\" aria-hidden=\"true\">\n <li *ngFor=\"let opt of selectedOptions; trackBy: select.trackByFn\" class=\"et-select-selected-option\">\n {{ opt.opt.viewValue$ | async }}\n <button\n (click)=\"\n $event.stopImmediatePropagation(); inputElement.focus(); select.removeOptionFromSelection(opt.opt)\n \"\n class=\"et-select-selected-option-remove\"\n tabindex=\"-1\"\n type=\"button\"\n ></button>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n </div>\n\n <et-chevron-icon class=\"et-select-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template #selectBodyTpl>\n <ng-content />\n</ng-template>\n", styles: [".et-select{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-select-input{position:absolute;inset:0}.et-select-option{display:block}.et-select-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}.et-select-option--active{background-color:#1f1f1f}.et-select-option--selected{font-weight:700}.et-select-selected-options{display:flex;flex-wrap:wrap;list-style:none;margin:0;padding:0;gap:5px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: LetDirective, selector: "[etLet]", inputs: ["etLet"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
10070
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: SelectComponent, isStandalone: true, selector: "et-select", host: { classAttribute: "et-select" }, viewQueries: [{ propertyName: "selectBodyTpl", first: true, predicate: ["selectBodyTpl"], descendants: true }], usesInheritance: true, hostDirectives: [{ directive: InputDirective }, { directive: SelectDirective, inputs: ["multiple", "multiple", "emptyText", "emptyText"] }], ngImport: i0, template: "<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-select-wrapper\">\n <div\n #inputElement\n [attr.id]=\"input.id\"\n [attr.aria-labelledby]=\"select.labelledBy$ | async\"\n [attr.aria-describedby]=\"input.describedBy$ | async\"\n [attr.tabindex]=\"(input.disabled$ | async) ? -1 : 0\"\n [attr.aria-required]=\"(input.required$ | async) || null\"\n [attr.aria-disabled]=\"(input.disabled$ | async) || null\"\n [attr.aria-invalid]=\"(input.invalid$ | async) || null\"\n [attr.aria-controls]=\"(select.selectBodyId$ | async) || null\"\n [attr.aria-owns]=\"(select.owns$ | async) || null\"\n [attr.aria-expanded]=\"select.isOpen$ | async\"\n [attr.aria-activedescendant]=\"select.activeDescendant$ | async\"\n (click)=\"select.open()\"\n (keydown)=\"select._processKeydownEvent($event)\"\n (blur)=\"select._controlTouched()\"\n class=\"et-select-input et-select-input--static\"\n aria-haspopup=\"listbox\"\n role=\"combobox\"\n aria-autocomplete=\"none\"\n >\n <span\n [attr.id]=\"select.selectCurrentValueId\"\n [class.cdk-visually-hidden]=\"select._selectionModel.allowMultiple && select.ariaViewValue()\"\n class=\"et-select-current-value\"\n >\n <ng-container *ngIf=\"select.ariaViewValue(); else emptyTpl\">\n {{ select.ariaViewValue() }}\n </ng-container>\n <ng-template #emptyTpl> {{ select.emptyText }} </ng-template>\n </span>\n\n <ng-container *ngIf=\"select._selectionModel.allowMultiple\">\n <ng-container *ngIf=\"select._selectionModel.selection$ | async as selectedOptions\">\n <ul *ngIf=\"selectedOptions.length\" class=\"et-select-selected-options\" aria-hidden=\"true\">\n <li *ngFor=\"let opt of selectedOptions; trackBy: select.trackByFn\" class=\"et-select-selected-option\">\n {{ opt.viewValue$ | async }}\n <button\n (click)=\"$event.stopPropagation(); select.removeOptionFromSelection(opt); select.focus()\"\n class=\"et-select-selected-option-remove\"\n tabindex=\"-1\"\n type=\"button\"\n ></button>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n </div>\n\n <et-chevron-icon class=\"et-select-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template #selectBodyTpl>\n <ng-content />\n</ng-template>\n", styles: [".et-select{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-select-input{position:absolute;inset:0}.et-select-option{display:block}.et-select-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}.et-select-option--active{background-color:#1f1f1f}.et-select-option--selected{font-weight:700}.et-select-selected-options{display:flex;flex-wrap:wrap;list-style:none;margin:0;padding:0;gap:5px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
10083
10071
  }
10084
10072
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SelectComponent, decorators: [{
10085
10073
  type: Component,
10086
10074
  args: [{ selector: 'et-select', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
10087
10075
  class: 'et-select',
10088
- }, imports: [NgIf, NativeInputRefDirective, AsyncPipe, ChevronIconComponent, LetDirective, NgFor], hostDirectives: [{ directive: InputDirective }, { directive: SelectDirective, inputs: ['multiple', 'emptyText'] }], template: "<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-select-wrapper\">\n <div\n #inputElement\n [attr.id]=\"input.id\"\n [attr.aria-labelledby]=\"select.labelledBy$ | async\"\n [attr.aria-describedby]=\"input.describedBy$ | async\"\n [attr.tabindex]=\"(input.disabled$ | async) ? -1 : 0\"\n [attr.aria-required]=\"(input.required$ | async) || null\"\n [attr.aria-disabled]=\"(input.disabled$ | async) || null\"\n [attr.aria-invalid]=\"(input.invalid$ | async) || null\"\n [attr.aria-controls]=\"(select.selectBodyId$ | async) || null\"\n [attr.aria-owns]=\"(select.owns$ | async) || null\"\n [attr.aria-expanded]=\"select.isOpen$ | async\"\n [attr.aria-activedescendant]=\"select.activeDescendant$ | async\"\n (click)=\"select.mountSelectBody()\"\n (keydown)=\"select.handleKeyDown($event)\"\n (blur)=\"select._controlTouched()\"\n class=\"et-select-input et-select-input--static\"\n aria-haspopup=\"listbox\"\n role=\"combobox\"\n aria-autocomplete=\"none\"\n >\n <span\n *etLet=\"select.ariaViewValue$ | async as ariaViewValue\"\n [attr.id]=\"select.selectCurrentValueId\"\n [class.cdk-visually-hidden]=\"select.multiple && ariaViewValue\"\n class=\"et-select-current-value\"\n >\n <ng-container *ngIf=\"select.ariaViewValue$ | async as ariaViewValue; else emptyTpl\">\n {{ ariaViewValue }}\n </ng-container>\n <ng-template #emptyTpl> {{ select.emptyText }} </ng-template>\n </span>\n\n <ng-container *ngIf=\"select.multiple\">\n <ng-container *ngIf=\"select.selectedOptions$ | async as selectedOptions\">\n <ul *ngIf=\"selectedOptions.length\" class=\"et-select-selected-options\" aria-hidden=\"true\">\n <li *ngFor=\"let opt of selectedOptions; trackBy: select.trackByFn\" class=\"et-select-selected-option\">\n {{ opt.opt.viewValue$ | async }}\n <button\n (click)=\"\n $event.stopImmediatePropagation(); inputElement.focus(); select.removeOptionFromSelection(opt.opt)\n \"\n class=\"et-select-selected-option-remove\"\n tabindex=\"-1\"\n type=\"button\"\n ></button>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n </div>\n\n <et-chevron-icon class=\"et-select-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template #selectBodyTpl>\n <ng-content />\n</ng-template>\n", styles: [".et-select{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-select-input{position:absolute;inset:0}.et-select-option{display:block}.et-select-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}.et-select-option--active{background-color:#1f1f1f}.et-select-option--selected{font-weight:700}.et-select-selected-options{display:flex;flex-wrap:wrap;list-style:none;margin:0;padding:0;gap:5px}\n"] }]
10076
+ }, imports: [NgIf, NativeInputRefDirective, AsyncPipe, ChevronIconComponent, LetDirective, NgFor], hostDirectives: [{ directive: InputDirective }, { directive: SelectDirective, inputs: ['multiple', 'emptyText'] }], template: "<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-select-wrapper\">\n <div\n #inputElement\n [attr.id]=\"input.id\"\n [attr.aria-labelledby]=\"select.labelledBy$ | async\"\n [attr.aria-describedby]=\"input.describedBy$ | async\"\n [attr.tabindex]=\"(input.disabled$ | async) ? -1 : 0\"\n [attr.aria-required]=\"(input.required$ | async) || null\"\n [attr.aria-disabled]=\"(input.disabled$ | async) || null\"\n [attr.aria-invalid]=\"(input.invalid$ | async) || null\"\n [attr.aria-controls]=\"(select.selectBodyId$ | async) || null\"\n [attr.aria-owns]=\"(select.owns$ | async) || null\"\n [attr.aria-expanded]=\"select.isOpen$ | async\"\n [attr.aria-activedescendant]=\"select.activeDescendant$ | async\"\n (click)=\"select.open()\"\n (keydown)=\"select._processKeydownEvent($event)\"\n (blur)=\"select._controlTouched()\"\n class=\"et-select-input et-select-input--static\"\n aria-haspopup=\"listbox\"\n role=\"combobox\"\n aria-autocomplete=\"none\"\n >\n <span\n [attr.id]=\"select.selectCurrentValueId\"\n [class.cdk-visually-hidden]=\"select._selectionModel.allowMultiple && select.ariaViewValue()\"\n class=\"et-select-current-value\"\n >\n <ng-container *ngIf=\"select.ariaViewValue(); else emptyTpl\">\n {{ select.ariaViewValue() }}\n </ng-container>\n <ng-template #emptyTpl> {{ select.emptyText }} </ng-template>\n </span>\n\n <ng-container *ngIf=\"select._selectionModel.allowMultiple\">\n <ng-container *ngIf=\"select._selectionModel.selection$ | async as selectedOptions\">\n <ul *ngIf=\"selectedOptions.length\" class=\"et-select-selected-options\" aria-hidden=\"true\">\n <li *ngFor=\"let opt of selectedOptions; trackBy: select.trackByFn\" class=\"et-select-selected-option\">\n {{ opt.viewValue$ | async }}\n <button\n (click)=\"$event.stopPropagation(); select.removeOptionFromSelection(opt); select.focus()\"\n class=\"et-select-selected-option-remove\"\n tabindex=\"-1\"\n type=\"button\"\n ></button>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n </div>\n\n <et-chevron-icon class=\"et-select-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template #selectBodyTpl>\n <ng-content />\n</ng-template>\n", styles: [".et-select{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-select-input{position:absolute;inset:0}.et-select-option{display:block}.et-select-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}.et-select-option--active{background-color:#1f1f1f}.et-select-option--selected{font-weight:700}.et-select-selected-options{display:flex;flex-wrap:wrap;list-style:none;margin:0;padding:0;gap:5px}\n"] }]
10089
10077
  }], propDecorators: { selectBodyTpl: [{
10090
10078
  type: ViewChild,
10091
10079
  args: ['selectBodyTpl']
@@ -11457,6 +11445,31 @@ const provideImageConfig = (config = {}) => {
11457
11445
  };
11458
11446
  };
11459
11447
 
11448
+ const normalizeSource = (source) => {
11449
+ if (typeof source === 'string') {
11450
+ return { type: inferMimeType(source), srcset: source };
11451
+ }
11452
+ else {
11453
+ const mimeType = source.type && source.type !== '' ? source.type : inferMimeType(source.srcset);
11454
+ return { type: mimeType, srcset: source.srcset };
11455
+ }
11456
+ };
11457
+
11458
+ class NormalizeSourcePipe {
11459
+ constructor() {
11460
+ this.transform = normalizeSource;
11461
+ }
11462
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NormalizeSourcePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
11463
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.5", ngImport: i0, type: NormalizeSourcePipe, isStandalone: true, name: "normalizeSource" }); }
11464
+ }
11465
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NormalizeSourcePipe, decorators: [{
11466
+ type: Pipe,
11467
+ args: [{
11468
+ name: 'normalizeSource',
11469
+ standalone: true,
11470
+ }]
11471
+ }] });
11472
+
11460
11473
  class PictureComponent {
11461
11474
  constructor() {
11462
11475
  this.pictureData = inject(PictureDataDirective);
@@ -11465,9 +11478,6 @@ class PictureComponent {
11465
11478
  this.trackBySrc = (_, item) => item.srcset;
11466
11479
  }
11467
11480
  combineWithConfig(src) {
11468
- if (isDevMode() && src.type === '') {
11469
- console.warn(`The type attribute is missing for the following source`, src.srcset, this);
11470
- }
11471
11481
  if (!this.config?.baseUrl || src.srcset.startsWith('http')) {
11472
11482
  return src;
11473
11483
  }
@@ -11478,11 +11488,11 @@ class PictureComponent {
11478
11488
  };
11479
11489
  }
11480
11490
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: PictureComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11481
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: PictureComponent, isStandalone: true, selector: "et-picture", inputs: { sources: "sources" }, host: { classAttribute: "et-picture" }, hostDirectives: [{ directive: PictureDataDirective, inputs: ["imgClass", "imgClass", "hasPriority", "hasPriority", "figureClass", "figureClass", "pictureClass", "pictureClass", "figcaptionClass", "figcaptionClass", "defaultSrc", "defaultSrc", "alt", "alt", "figcaption", "figcaption", "width", "width", "height", "height", "sizes", "sizes"] }], ngImport: i0, template: "<figure [ngClass]=\"pictureData.figureClass\" class=\"et-picture-figure\">\n <picture [ngClass]=\"pictureData.pictureClass\" class=\"et-picture-picture\">\n <ng-container *ngFor=\"let source of sources; trackBy: trackBySrc\">\n <source\n *etLet=\"combineWithConfig(source) as s\"\n [type]=\"s.type\"\n [attr.srcset]=\"s.srcset\"\n [attr.sizes]=\"pictureData.sizes\"\n />\n </ng-container>\n\n <ng-container *ngIf=\"pictureData.defaultSrc as source\">\n <img\n *etLet=\"combineWithConfig(source) as s\"\n [attr.loading]=\"pictureData.hasPriority ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"pictureData.hasPriority ? 'high' : 'auto'\"\n [ngClass]=\"pictureData.imgClass\"\n [attr.srcset]=\"s.srcset\"\n [attr.type]=\"s.type\"\n [attr.alt]=\"pictureData.alt\"\n [attr.width]=\"pictureData.width\"\n [attr.height]=\"pictureData.height\"\n [attr.sizes]=\"pictureData.sizes\"\n class=\"et-picture-img\"\n />\n </ng-container>\n </picture>\n\n <figcaption *ngIf=\"pictureData.figcaption\" [ngClass]=\"pictureData.figcaptionClass\" class=\"et-picture-figcaption\">\n {{ pictureData.figcaption }}\n </figcaption>\n</figure>\n", dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: LetDirective, selector: "[etLet]", inputs: ["etLet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
11491
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: PictureComponent, isStandalone: true, selector: "et-picture", inputs: { sources: "sources" }, host: { classAttribute: "et-picture" }, hostDirectives: [{ directive: PictureDataDirective, inputs: ["imgClass", "imgClass", "hasPriority", "hasPriority", "figureClass", "figureClass", "pictureClass", "pictureClass", "figcaptionClass", "figcaptionClass", "defaultSrc", "defaultSrc", "alt", "alt", "figcaption", "figcaption", "width", "width", "height", "height", "sizes", "sizes"] }], ngImport: i0, template: "<figure [ngClass]=\"pictureData.figureClass\" class=\"et-picture-figure\">\n <picture [ngClass]=\"pictureData.pictureClass\" class=\"et-picture-picture\">\n <ng-container *ngFor=\"let source of sources; trackBy: trackBySrc\">\n <source\n *etLet=\"combineWithConfig(source | normalizeSource) as s\"\n [type]=\"s.type\"\n [attr.srcset]=\"s.srcset\"\n [attr.sizes]=\"pictureData.sizes\"\n />\n </ng-container>\n\n <ng-container *ngIf=\"pictureData.defaultSrc as source\">\n <img\n *etLet=\"combineWithConfig(source | normalizeSource) as s\"\n [attr.loading]=\"pictureData.hasPriority ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"pictureData.hasPriority ? 'high' : 'auto'\"\n [ngClass]=\"pictureData.imgClass\"\n [attr.srcset]=\"s.srcset\"\n [attr.type]=\"s.type\"\n [attr.alt]=\"pictureData.alt\"\n [attr.width]=\"pictureData.width\"\n [attr.height]=\"pictureData.height\"\n [attr.sizes]=\"pictureData.sizes\"\n class=\"et-picture-img\"\n />\n </ng-container>\n </picture>\n\n <figcaption *ngIf=\"pictureData.figcaption\" [ngClass]=\"pictureData.figcaptionClass\" class=\"et-picture-figcaption\">\n {{ pictureData.figcaption }}\n </figcaption>\n</figure>\n", dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: LetDirective, selector: "[etLet]", inputs: ["etLet"] }, { kind: "pipe", type: NormalizeSourcePipe, name: "normalizeSource" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
11482
11492
  }
11483
11493
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: PictureComponent, decorators: [{
11484
11494
  type: Component,
11485
- args: [{ selector: 'et-picture', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgForOf, NgClass, NgIf, LetDirective], host: {
11495
+ args: [{ selector: 'et-picture', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgForOf, NgClass, NgIf, LetDirective, NormalizeSourcePipe], host: {
11486
11496
  class: 'et-picture',
11487
11497
  }, hostDirectives: [
11488
11498
  {
@@ -11501,7 +11511,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
11501
11511
  'sizes',
11502
11512
  ],
11503
11513
  },
11504
- ], template: "<figure [ngClass]=\"pictureData.figureClass\" class=\"et-picture-figure\">\n <picture [ngClass]=\"pictureData.pictureClass\" class=\"et-picture-picture\">\n <ng-container *ngFor=\"let source of sources; trackBy: trackBySrc\">\n <source\n *etLet=\"combineWithConfig(source) as s\"\n [type]=\"s.type\"\n [attr.srcset]=\"s.srcset\"\n [attr.sizes]=\"pictureData.sizes\"\n />\n </ng-container>\n\n <ng-container *ngIf=\"pictureData.defaultSrc as source\">\n <img\n *etLet=\"combineWithConfig(source) as s\"\n [attr.loading]=\"pictureData.hasPriority ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"pictureData.hasPriority ? 'high' : 'auto'\"\n [ngClass]=\"pictureData.imgClass\"\n [attr.srcset]=\"s.srcset\"\n [attr.type]=\"s.type\"\n [attr.alt]=\"pictureData.alt\"\n [attr.width]=\"pictureData.width\"\n [attr.height]=\"pictureData.height\"\n [attr.sizes]=\"pictureData.sizes\"\n class=\"et-picture-img\"\n />\n </ng-container>\n </picture>\n\n <figcaption *ngIf=\"pictureData.figcaption\" [ngClass]=\"pictureData.figcaptionClass\" class=\"et-picture-figcaption\">\n {{ pictureData.figcaption }}\n </figcaption>\n</figure>\n" }]
11514
+ ], template: "<figure [ngClass]=\"pictureData.figureClass\" class=\"et-picture-figure\">\n <picture [ngClass]=\"pictureData.pictureClass\" class=\"et-picture-picture\">\n <ng-container *ngFor=\"let source of sources; trackBy: trackBySrc\">\n <source\n *etLet=\"combineWithConfig(source | normalizeSource) as s\"\n [type]=\"s.type\"\n [attr.srcset]=\"s.srcset\"\n [attr.sizes]=\"pictureData.sizes\"\n />\n </ng-container>\n\n <ng-container *ngIf=\"pictureData.defaultSrc as source\">\n <img\n *etLet=\"combineWithConfig(source | normalizeSource) as s\"\n [attr.loading]=\"pictureData.hasPriority ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"pictureData.hasPriority ? 'high' : 'auto'\"\n [ngClass]=\"pictureData.imgClass\"\n [attr.srcset]=\"s.srcset\"\n [attr.type]=\"s.type\"\n [attr.alt]=\"pictureData.alt\"\n [attr.width]=\"pictureData.width\"\n [attr.height]=\"pictureData.height\"\n [attr.sizes]=\"pictureData.sizes\"\n class=\"et-picture-img\"\n />\n </ng-container>\n </picture>\n\n <figcaption *ngIf=\"pictureData.figcaption\" [ngClass]=\"pictureData.figcaptionClass\" class=\"et-picture-figcaption\">\n {{ pictureData.figcaption }}\n </figcaption>\n</figure>\n" }]
11505
11515
  }], propDecorators: { sources: [{
11506
11516
  type: Input
11507
11517
  }] } });
@@ -14491,5 +14501,5 @@ const FLOATING_UI_PLACEMENTS = [
14491
14501
  * Generated bundle index. Do not edit.
14492
14502
  */
14493
14503
 
14494
- export { ACCORDION_COMPONENT, ACCORDION_HINT_WRAPPER_DIRECTIVE, ACCORDION_LABEL_WRAPPER_DIRECTIVE, AccordionComponent, AccordionGroupComponent, AccordionHintDirective, AccordionHintWrapperDirective, AccordionImports, AccordionLabelDirective, AccordionLabelWrapperDirective, ActiveTabUnderlineBarManager, ActiveTabUnderlineDirective, AutosizeTextareaDirective, BOTTOM_SHEET_CONFIG, BOTTOM_SHEET_DATA, BOTTOM_SHEET_DEFAULT_CONFIG, BOTTOM_SHEET_DEFAULT_OPTIONS, BOTTOM_SHEET_MIN_SWIPE_TO_CLOSE_LENGTH, BOTTOM_SHEET_MIN_VELOCITY_TO_CLOSE, BOTTOM_SHEET_SCROLL_STRATEGY, BOTTOM_SHEET_SCROLL_STRATEGY_PROVIDER, BOTTOM_SHEET_SCROLL_STRATEGY_PROVIDER_FACTORY, BRACKET_CONFIG_TOKEN, BRACKET_DEFAULT_CONFIG, BRACKET_MATCH_ID_TOKEN, BRACKET_ROUND_ID_TOKEN, BRACKET_TOKEN, BottomSheetContainerBaseComponent, BottomSheetContainerComponent, BottomSheetDragHandleComponent, BottomSheetImports, BottomSheetRef, BottomSheetService, BottomSheetServiceBase, BottomSheetSwipeHandlerService, BottomSheetTitleDirective, Bracket, BracketComponent, BracketImports, BracketMatchComponent, BracketMatchDirective, BracketRoundDirective, BracketRoundHeaderComponent, ButtonComponent, ButtonDirective, ButtonImports, CDK_MENU, CHECKBOX_FIELD_TOKEN, CHECKBOX_GROUP_CONTROL_TOKEN, CHECKBOX_GROUP_TOKEN, CHECKBOX_TOKEN, COMBOBOX_BODY_EMPTY_TEMPLATE_TOKEN, COMBOBOX_BODY_ERROR_TEMPLATE_TOKEN, COMBOBOX_BODY_LOADING_TEMPLATE_TOKEN, COMBOBOX_BODY_MORE_ITEMS_HINT_TEMPLATE_TOKEN, COMBOBOX_CONFIG_TOKEN, COMBOBOX_DEFAULT_CONFIG, COMBOBOX_OPTION_TEMPLATE_TOKEN, COMBOBOX_SELECTED_OPTION_TEMPLATE_TOKEN, COMBOBOX_TOKEN, CdkContextMenuTrigger, CdkMenu, CdkMenuBar, CdkMenuBase, CdkMenuGroup, CdkMenuItem, CdkMenuItemCheckbox, CdkMenuItemRadio, CdkMenuItemSelectable, CdkMenuModule, CdkMenuTrigger, CdkMenuTriggerBase, CdkTargetMenuAim, CellDefDirective, CellDirective, CheckboxComponent, CheckboxDirective, CheckboxFieldComponent, CheckboxFieldDirective, CheckboxGroupComponent, CheckboxGroupControlDirective, CheckboxGroupDirective, CheckboxImports, ChevronIconComponent, ColumnDefDirective, ComboboxBodyEmptyTemplateDirective, ComboboxBodyErrorTemplateDirective, ComboboxBodyLoadingTemplateDirective, ComboboxBodyMoreItemsHintTemplateDirective, ComboboxComponent, ComboboxDirective, ComboboxImports, ComboboxOptionTemplateDirective, ComboboxSelectedOptionTemplateDirective, ContextMenuTracker, DATE_INPUT_FORMAT_TOKEN, DATE_INPUT_TOKEN, DEFAULT_DATE_INPUT_FORMAT, DIALOG_CONFIG, DIALOG_DATA, DIALOG_DEFAULT_CONFIG, DIALOG_DEFAULT_OPTIONS, DIALOG_SCROLL_STRATEGY, DIALOG_SCROLL_STRATEGY_PROVIDER, DIALOG_SCROLL_STRATEGY_PROVIDER_FACTORY, DYNAMIC_FORM_FIELD_TOKEN, DYNAMIC_FORM_GROUP_TOKEN, DateInputComponent, DateInputDirective, DecoratedFormFieldBase, DecoratedInputBase, DefaultValidatorErrorsService, DialogCloseDirective, DialogContainerBaseComponent, DialogContainerComponent, DialogImports, DialogRef, DialogService, DialogServiceBase, DialogTitleDirective, DynamicFormFieldDirective, DynamicFormGroupDirective, DynamicOverlayService, DynamicOverlayTitleDirective, EMAIL_INPUT_TOKEN, ET_OVERLAY_BOTTOM_SHEET_CLASS, ET_OVERLAY_DIALOG_CLASS, ET_OVERLAY_FULL_SCREEN_DIALOG_CLASS, ET_OVERLAY_LEFT_SHEET_CLASS, ET_OVERLAY_RIGHT_SHEET_CLASS, ET_OVERLAY_TOP_SHEET_CLASS, EXPOSE_INPUT_VARS_TOKEN, EmailInputComponent, EmailInputDirective, ErrorComponent, ExposeInputVarsDirective, FILTER_OVERLAY_BACK_OR_CLOSE_TOKEN, FILTER_OVERLAY_LINK_TOKEN, FILTER_OVERLAY_REF, FILTER_OVERLAY_RESET_TOKEN, FILTER_OVERLAY_SUBMIT_TOKEN, FLOATING_UI_PLACEMENTS, FilterOverlayBackOrCloseDirective, FilterOverlayImports, FilterOverlayLinkDirective, FilterOverlayPageOutletComponent, FilterOverlayRef, FilterOverlayResetDirective, FilterOverlayService, FilterOverlaySubmitDirective, FooterCellDefDirective, FooterCellDirective, FooterRowComponent, FooterRowDefDirective, FormFieldStateService, FormGroupStateService, HeaderCellDefDirective, HeaderCellDirective, HeaderRowComponent, HeaderRowDefDirective, IMAGE_CONFIG_TOKEN, INPUT_PREFIX_TOKEN, INPUT_SUFFIX_TOKEN, INPUT_TOKEN, IconImports, IfInputEmptyDirective, IfInputFilledDirective, InlineTabBodyComponent, InlineTabBodyHostDirective, InlineTabChangeEvent, InlineTabComponent, InlineTabContentDirective, InlineTabHeaderComponent, InlineTabLabelDirective, InlineTabLabelWrapperDirective, InlineTabsComponent, InputBase, InputDirective, InputFieldComponent, InputImports, InputPrefixDirective, InputStateService, InputSuffixDirective, LABEL_TOKEN, LabelComponent, LabelImports, LabelSuffixDirective, MASONRY_ITEM_TOKEN, MAX_SAFE_INTEGER, MENU_AIM, MENU_STACK, MENU_TRIGGER, MasonryComponent, MasonryImports, MasonryItemComponent, MenuStack, NATIVE_INPUT_REF_TOKEN, NATIVE_SELECT_INPUT_TOKEN, NATIVE_SELECT_OPTION_TOKEN, NUMBER_INPUT_TOKEN, NativeInputRefDirective, NativeSelectImports, NativeSelectInputComponent, NativeSelectInputDirective, NativeSelectOptionComponent, NativeSelectOptionDirective, NavTabLinkComponent, NavTabsComponent, NavTabsOutletComponent, NoDataRowDirective, NumberInputComponent, NumberInputDirective, OVERLAY_CONFIG, OVERLAY_DATA, OVERLAY_DEFAULT_CONFIG, OVERLAY_DEFAULT_OPTIONS, OVERLAY_SCROLL_STRATEGY, OVERLAY_SCROLL_STRATEGY_PROVIDER, OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY, OVERLAY_STATE, OverlayCloseDirective, OverlayContainerComponent, OverlayImports, OverlayPositionBuilder, OverlayRef, OverlayService, OverlayTitleDirective, PARENT_OR_NEW_INLINE_MENU_STACK_PROVIDER, PARENT_OR_NEW_MENU_STACK_PROVIDER, PASSWORD_INPUT_TOKEN, PROGRESS_SPINNER_DEFAULT_OPTIONS, PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY, PaginatedTabHeaderDirective, PaginationComponent, PaginationImports, PasswordInputComponent, PasswordInputDirective, PasswordInputToggleComponent, PictureComponent, PictureDataDirective, PointerFocusTracker, ProgressSpinnerComponent, QUERY_ERROR_TOKEN, QueryButtonComponent, QueryButtonDirective, QueryErrorComponent, QueryErrorDirective, RADIO_FIELD_TOKEN, RADIO_GROUP_TOKEN, RADIO_TOKEN, RICH_FILTER_BUTTON_SLOT_TOKEN, RICH_FILTER_BUTTON_TOKEN, RICH_FILTER_CONTENT_TOKEN, RICH_FILTER_TOP_TOKEN, RadioComponent, RadioDirective, RadioFieldComponent, RadioFieldDirective, RadioGroupComponent, RadioGroupDirective, RadioImports, RecycleRowsDirective, RichFilterButtonDirective, RichFilterButtonSlotDirective, RichFilterContentDirective, RichFilterHostComponent, RichFilterImports, RichFilterTopDirective, RowComponent, RowDefDirective, SEARCH_INPUT_TOKEN, SEGMENTED_BUTTON_FIELD_TOKEN, SEGMENTED_BUTTON_GROUP_TOKEN, SEGMENTED_BUTTON_TOKEN, SELECTION_LIST_FIELD, SELECTION_LIST_OPTION, SELECT_BODY_TOKEN, SELECT_FIELD_TOKEN, SELECT_OPTION_TOKEN, SELECT_TOKEN, SLIDE_TOGGLE_TOKEN, SORT_DEFAULT_OPTIONS, SORT_HEADER_COLUMN_DEF, SORT_HEADER_INTL_PROVIDER, SORT_HEADER_INTL_PROVIDER_FACTORY, STATIC_FORM_FIELD_TOKEN, STATIC_FORM_GROUP_TOKEN, ScrollableComponent, ScrollableImports, SearchInputClearComponent, SearchInputComponent, SearchInputDirective, SegmentedButtonComponent, SegmentedButtonDirective, SegmentedButtonFieldComponent, SegmentedButtonFieldDirective, SegmentedButtonGroupComponent, SegmentedButtonGroupDirective, SegmentedButtonImports, SelectBodyComponent, SelectBodyDirective, SelectComponent, SelectDirective, SelectFieldComponent, SelectFieldDirective, SelectImports, SelectOptionComponent, SelectOptionDirective, SelectionListFieldComponent, SelectionListFieldDirective, SelectionListImports, SelectionListOptionComponent, SelectionListOptionDirective, SkeletonComponent, SkeletonImports, SkeletonItemComponent, SlideToggleComponent, SlideToggleDirective, SlideToggleFieldComponent, SlideToggleImports, SliderComponent, SliderFieldComponent, SliderImports, SortDirective, SortHeaderComponent, SortHeaderIntl, SortImports, StaticFormFieldDirective, StaticFormGroupDirective, SwipeHandlerService, TAB, TABS_CONFIG, TAB_CONTENT, TAB_GROUP, TAB_LABEL, TEXTAREA_INPUT_TOKEN, TEXT_INPUT_TOKEN, TOGGLETIP, TOGGLETIP_CONFIG, TOGGLETIP_DEFAULT_CONFIG, TOGGLETIP_DIRECTIVE, TOGGLETIP_TEMPLATE, TOGGLETIP_TEXT, TOOLTIP, TOOLTIP_CONFIG, TOOLTIP_DEFAULT_CONFIG, TOOLTIP_DIRECTIVE, TOOLTIP_TEMPLATE, TOOLTIP_TEXT, TabImports, TableBusyDirective, TableBusyOutletDirective, TableComponent, TableDataSource, TableImports, TargetMenuAim, TextColumnComponent, TextInputComponent, TextInputDirective, TextareaInputComponent, TextareaInputDirective, ToggletipComponent, ToggletipDirective, ToggletipImports, TooltipComponent, TooltipDirective, TooltipImports, VALIDATOR_ERROR_SERVICE_TOKEN, WRITEABLE_INPUT_TOKEN, WRITEABLE_INPUT_VALUE_ACCESSOR, WriteableInputDirective, _MAT_INK_BAR_POSITIONER, _MAT_INK_BAR_POSITIONER_FACTORY, accordionAnimations, convertHttpStatusCodeToMessage, createBottomSheetConfig, createBracketConfig, createComboboxConfig, createDialogConfig, createOverlayConfig, createToggletipConfig, createTooltipConfig, getClosestBottomSheet, getClosestDialog, getClosestOverlay, isOptionDisabled, isUpperBracketMatch, normalizeRoundType, orderRounds, orderRoundsByRoundNumber, paginate, provideBottomSheet, provideBottomSheetDefaultConfig, provideBracketConfig, provideComboboxConfig, provideDateFormat, provideDialog, provideDialogDefaultConfig, provideFilterOverlay, provideImageConfig, provideOverlay, provideOverlayDefaultConfig, provideSort, provideToggletipConfig, provideTooltipConfig, provideValidatorErrorsService, tabAnimations };
14504
+ export { ACCORDION_COMPONENT, ACCORDION_HINT_WRAPPER_DIRECTIVE, ACCORDION_LABEL_WRAPPER_DIRECTIVE, AccordionComponent, AccordionGroupComponent, AccordionHintDirective, AccordionHintWrapperDirective, AccordionImports, AccordionLabelDirective, AccordionLabelWrapperDirective, ActiveTabUnderlineBarManager, ActiveTabUnderlineDirective, AutosizeTextareaDirective, BOTTOM_SHEET_CONFIG, BOTTOM_SHEET_DATA, BOTTOM_SHEET_DEFAULT_CONFIG, BOTTOM_SHEET_DEFAULT_OPTIONS, BOTTOM_SHEET_MIN_SWIPE_TO_CLOSE_LENGTH, BOTTOM_SHEET_MIN_VELOCITY_TO_CLOSE, BOTTOM_SHEET_SCROLL_STRATEGY, BOTTOM_SHEET_SCROLL_STRATEGY_PROVIDER, BOTTOM_SHEET_SCROLL_STRATEGY_PROVIDER_FACTORY, BRACKET_CONFIG_TOKEN, BRACKET_DEFAULT_CONFIG, BRACKET_MATCH_ID_TOKEN, BRACKET_ROUND_ID_TOKEN, BRACKET_TOKEN, BottomSheetContainerBaseComponent, BottomSheetContainerComponent, BottomSheetDragHandleComponent, BottomSheetImports, BottomSheetRef, BottomSheetService, BottomSheetServiceBase, BottomSheetSwipeHandlerService, BottomSheetTitleDirective, Bracket, BracketComponent, BracketImports, BracketMatchComponent, BracketMatchDirective, BracketRoundDirective, BracketRoundHeaderComponent, ButtonComponent, ButtonDirective, ButtonImports, CDK_MENU, CHECKBOX_FIELD_TOKEN, CHECKBOX_GROUP_CONTROL_TOKEN, CHECKBOX_GROUP_TOKEN, CHECKBOX_TOKEN, COMBOBOX_BODY_EMPTY_TEMPLATE_TOKEN, COMBOBOX_BODY_ERROR_TEMPLATE_TOKEN, COMBOBOX_BODY_LOADING_TEMPLATE_TOKEN, COMBOBOX_BODY_MORE_ITEMS_HINT_TEMPLATE_TOKEN, COMBOBOX_CONFIG_TOKEN, COMBOBOX_DEFAULT_CONFIG, COMBOBOX_OPTION_TEMPLATE_TOKEN, COMBOBOX_SELECTED_OPTION_TEMPLATE_TOKEN, COMBOBOX_TOKEN, CdkContextMenuTrigger, CdkMenu, CdkMenuBar, CdkMenuBase, CdkMenuGroup, CdkMenuItem, CdkMenuItemCheckbox, CdkMenuItemRadio, CdkMenuItemSelectable, CdkMenuModule, CdkMenuTrigger, CdkMenuTriggerBase, CdkTargetMenuAim, CellDefDirective, CellDirective, CheckboxComponent, CheckboxDirective, CheckboxFieldComponent, CheckboxFieldDirective, CheckboxGroupComponent, CheckboxGroupControlDirective, CheckboxGroupDirective, CheckboxImports, ChevronIconComponent, ColumnDefDirective, ComboboxBodyEmptyTemplateDirective, ComboboxBodyErrorTemplateDirective, ComboboxBodyLoadingTemplateDirective, ComboboxBodyMoreItemsHintTemplateDirective, ComboboxComponent, ComboboxDirective, ComboboxImports, ComboboxOptionTemplateDirective, ComboboxSelectedOptionTemplateDirective, ContextMenuTracker, DATE_INPUT_FORMAT_TOKEN, DATE_INPUT_TOKEN, DEFAULT_DATE_INPUT_FORMAT, DIALOG_CONFIG, DIALOG_DATA, DIALOG_DEFAULT_CONFIG, DIALOG_DEFAULT_OPTIONS, DIALOG_SCROLL_STRATEGY, DIALOG_SCROLL_STRATEGY_PROVIDER, DIALOG_SCROLL_STRATEGY_PROVIDER_FACTORY, DYNAMIC_FORM_FIELD_TOKEN, DYNAMIC_FORM_GROUP_TOKEN, DateInputComponent, DateInputDirective, DecoratedFormFieldBase, DecoratedInputBase, DefaultValidatorErrorsService, DialogCloseDirective, DialogContainerBaseComponent, DialogContainerComponent, DialogImports, DialogRef, DialogService, DialogServiceBase, DialogTitleDirective, DynamicFormFieldDirective, DynamicFormGroupDirective, DynamicOverlayService, DynamicOverlayTitleDirective, EMAIL_INPUT_TOKEN, ET_OVERLAY_BOTTOM_SHEET_CLASS, ET_OVERLAY_DIALOG_CLASS, ET_OVERLAY_FULL_SCREEN_DIALOG_CLASS, ET_OVERLAY_LEFT_SHEET_CLASS, ET_OVERLAY_RIGHT_SHEET_CLASS, ET_OVERLAY_TOP_SHEET_CLASS, EXPOSE_INPUT_VARS_TOKEN, EmailInputComponent, EmailInputDirective, ErrorComponent, ExposeInputVarsDirective, FILTER_OVERLAY_BACK_OR_CLOSE_TOKEN, FILTER_OVERLAY_LINK_TOKEN, FILTER_OVERLAY_REF, FILTER_OVERLAY_RESET_TOKEN, FILTER_OVERLAY_SUBMIT_TOKEN, FLOATING_UI_PLACEMENTS, FilterOverlayBackOrCloseDirective, FilterOverlayImports, FilterOverlayLinkDirective, FilterOverlayPageOutletComponent, FilterOverlayRef, FilterOverlayResetDirective, FilterOverlayService, FilterOverlaySubmitDirective, FooterCellDefDirective, FooterCellDirective, FooterRowComponent, FooterRowDefDirective, FormFieldStateService, FormGroupStateService, HeaderCellDefDirective, HeaderCellDirective, HeaderRowComponent, HeaderRowDefDirective, IMAGE_CONFIG_TOKEN, INPUT_PREFIX_TOKEN, INPUT_SUFFIX_TOKEN, INPUT_TOKEN, IconImports, IfInputEmptyDirective, IfInputFilledDirective, InlineTabBodyComponent, InlineTabBodyHostDirective, InlineTabChangeEvent, InlineTabComponent, InlineTabContentDirective, InlineTabHeaderComponent, InlineTabLabelDirective, InlineTabLabelWrapperDirective, InlineTabsComponent, InputBase, InputDirective, InputFieldComponent, InputImports, InputPrefixDirective, InputStateService, InputSuffixDirective, LABEL_TOKEN, LabelComponent, LabelImports, LabelSuffixDirective, MASONRY_ITEM_TOKEN, MAX_SAFE_INTEGER, MENU_AIM, MENU_STACK, MENU_TRIGGER, MasonryComponent, MasonryImports, MasonryItemComponent, MenuStack, NATIVE_INPUT_REF_TOKEN, NATIVE_SELECT_INPUT_TOKEN, NATIVE_SELECT_OPTION_TOKEN, NUMBER_INPUT_TOKEN, NativeInputRefDirective, NativeSelectImports, NativeSelectInputComponent, NativeSelectInputDirective, NativeSelectOptionComponent, NativeSelectOptionDirective, NavTabLinkComponent, NavTabsComponent, NavTabsOutletComponent, NoDataRowDirective, NumberInputComponent, NumberInputDirective, OVERLAY_CLOSE_BLOCKER_TOKEN, OVERLAY_CONFIG, OVERLAY_DATA, OVERLAY_DEFAULT_CONFIG, OVERLAY_DEFAULT_OPTIONS, OVERLAY_SCROLL_STRATEGY, OVERLAY_SCROLL_STRATEGY_PROVIDER, OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY, OVERLAY_STATE, OverlayCloseBlockerDirective, OverlayCloseDirective, OverlayContainerComponent, OverlayImports, OverlayPositionBuilder, OverlayRef, OverlayService, OverlayTitleDirective, PARENT_OR_NEW_INLINE_MENU_STACK_PROVIDER, PARENT_OR_NEW_MENU_STACK_PROVIDER, PASSWORD_INPUT_TOKEN, PROGRESS_SPINNER_DEFAULT_OPTIONS, PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY, PaginatedTabHeaderDirective, PaginationComponent, PaginationImports, PasswordInputComponent, PasswordInputDirective, PasswordInputToggleComponent, PictureComponent, PictureDataDirective, PointerFocusTracker, ProgressSpinnerComponent, QUERY_ERROR_TOKEN, QueryButtonComponent, QueryButtonDirective, QueryErrorComponent, QueryErrorDirective, RADIO_FIELD_TOKEN, RADIO_GROUP_TOKEN, RADIO_TOKEN, RICH_FILTER_BUTTON_SLOT_TOKEN, RICH_FILTER_BUTTON_TOKEN, RICH_FILTER_CONTENT_TOKEN, RICH_FILTER_TOP_TOKEN, RadioComponent, RadioDirective, RadioFieldComponent, RadioFieldDirective, RadioGroupComponent, RadioGroupDirective, RadioImports, RecycleRowsDirective, RichFilterButtonDirective, RichFilterButtonSlotDirective, RichFilterContentDirective, RichFilterHostComponent, RichFilterImports, RichFilterTopDirective, RowComponent, RowDefDirective, SEARCH_INPUT_TOKEN, SEGMENTED_BUTTON_FIELD_TOKEN, SEGMENTED_BUTTON_GROUP_TOKEN, SEGMENTED_BUTTON_TOKEN, SELECTION_LIST_FIELD, SELECTION_LIST_OPTION, SELECT_BODY_TOKEN, SELECT_FIELD_TOKEN, SELECT_OPTION_TOKEN, SELECT_TOKEN, SLIDE_TOGGLE_TOKEN, SORT_DEFAULT_OPTIONS, SORT_HEADER_COLUMN_DEF, SORT_HEADER_INTL_PROVIDER, SORT_HEADER_INTL_PROVIDER_FACTORY, STATIC_FORM_FIELD_TOKEN, STATIC_FORM_GROUP_TOKEN, ScrollableComponent, ScrollableImports, SearchInputClearComponent, SearchInputComponent, SearchInputDirective, SegmentedButtonComponent, SegmentedButtonDirective, SegmentedButtonFieldComponent, SegmentedButtonFieldDirective, SegmentedButtonGroupComponent, SegmentedButtonGroupDirective, SegmentedButtonImports, SelectBodyComponent, SelectBodyDirective, SelectComponent, SelectDirective, SelectFieldComponent, SelectFieldDirective, SelectImports, SelectOptionComponent, SelectOptionDirective, SelectionListFieldComponent, SelectionListFieldDirective, SelectionListImports, SelectionListOptionComponent, SelectionListOptionDirective, SkeletonComponent, SkeletonImports, SkeletonItemComponent, SlideToggleComponent, SlideToggleDirective, SlideToggleFieldComponent, SlideToggleImports, SliderComponent, SliderFieldComponent, SliderImports, SortDirective, SortHeaderComponent, SortHeaderIntl, SortImports, StaticFormFieldDirective, StaticFormGroupDirective, SwipeHandlerService, TAB, TABS_CONFIG, TAB_CONTENT, TAB_GROUP, TAB_LABEL, TEXTAREA_INPUT_TOKEN, TEXT_INPUT_TOKEN, TOGGLETIP, TOGGLETIP_CONFIG, TOGGLETIP_DEFAULT_CONFIG, TOGGLETIP_DIRECTIVE, TOGGLETIP_TEMPLATE, TOGGLETIP_TEXT, TOOLTIP, TOOLTIP_CONFIG, TOOLTIP_DEFAULT_CONFIG, TOOLTIP_DIRECTIVE, TOOLTIP_TEMPLATE, TOOLTIP_TEXT, TabImports, TableBusyDirective, TableBusyOutletDirective, TableComponent, TableDataSource, TableImports, TargetMenuAim, TextColumnComponent, TextInputComponent, TextInputDirective, TextareaInputComponent, TextareaInputDirective, ToggletipComponent, ToggletipDirective, ToggletipImports, TooltipComponent, TooltipDirective, TooltipImports, VALIDATOR_ERROR_SERVICE_TOKEN, WRITEABLE_INPUT_TOKEN, WRITEABLE_INPUT_VALUE_ACCESSOR, WriteableInputDirective, _MAT_INK_BAR_POSITIONER, _MAT_INK_BAR_POSITIONER_FACTORY, accordionAnimations, convertHttpStatusCodeToMessage, createBottomSheetConfig, createBracketConfig, createComboboxConfig, createDialogConfig, createOverlayConfig, createOverlayDismissChecker, createToggletipConfig, createTooltipConfig, getClosestBottomSheet, getClosestDialog, getClosestOverlay, isUpperBracketMatch, normalizeRoundType, orderRounds, orderRoundsByRoundNumber, paginate, provideBottomSheet, provideBottomSheetDefaultConfig, provideBracketConfig, provideComboboxConfig, provideDateFormat, provideDialog, provideDialogDefaultConfig, provideFilterOverlay, provideImageConfig, provideOverlay, provideOverlayDefaultConfig, provideSort, provideToggletipConfig, provideTooltipConfig, provideValidatorErrorsService, tabAnimations };
14495
14505
  //# sourceMappingURL=ethlete-cdk.mjs.map