@coreui/angular-pro 5.7.13 → 5.7.15

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.
@@ -14,8 +14,8 @@ import { DomPortal, CdkPortalOutlet } from '@angular/cdk/portal';
14
14
  import { DomSanitizer } from '@angular/platform-browser';
15
15
  import * as i1$1 from '@angular/router';
16
16
  import { RouterModule, Router, ActivatedRoute, NavigationEnd, RouterLink } from '@angular/router';
17
- import { animation, group, query, animate, style, trigger, state, transition, useAnimation, animateChild } from '@angular/animations';
18
17
  import { BreakpointObserver } from '@angular/cdk/layout';
18
+ import { trigger, state, style, transition, animate } from '@angular/animations';
19
19
  import { IconDirective } from '@coreui/icons-angular';
20
20
 
21
21
  var BreakpointInfix;
@@ -2997,7 +2997,11 @@ class MultiSelectComponent {
2997
2997
  return this.multiSelectOptionsContent.reset(sortedOptions);
2998
2998
  });
2999
2999
  this.scrollViewportView.changes
3000
- .pipe(take(1), map((changes) => changes.toArray()[0]), tap((scrollViewport) => {
3000
+ .pipe(take(1), tap((changes) => {
3001
+ changes.toArray()[0]
3002
+ ?.getElementRef()
3003
+ ?.nativeElement?.firstElementChild?.classList.add('form-multi-select-options');
3004
+ }), map((changes) => changes.toArray()[0]), tap((scrollViewport) => {
3001
3005
  if (!this.scrollViewport) {
3002
3006
  this.scrollViewport = scrollViewport;
3003
3007
  const cdkVirtualScrollContentWrapper = this.scrollViewport.getElementRef().nativeElement?.firstElementChild;
@@ -3105,7 +3109,7 @@ class MultiSelectComponent {
3105
3109
  useExisting: forwardRef(() => MultiSelectComponent),
3106
3110
  multi: true
3107
3111
  }
3108
- ], queries: [{ propertyName: "multiSelectOptionsContent", predicate: MultiSelectOptionComponent, descendants: true }, { propertyName: "contentTemplates", predicate: TemplateIdDirective, descendants: true }], viewQueries: [{ propertyName: "optionsElementRef", first: true, predicate: ["options"], descendants: true }, { propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }, { propertyName: "dropdownMenu", first: true, predicate: DropdownMenuDirective, descendants: true, read: ElementRef }, { propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true, read: ElementRef }, { propertyName: "dropdownToggle", first: true, predicate: DropdownToggleDirective, descendants: true, read: ElementRef }, { propertyName: "multiSelectOptionsView", predicate: MultiSelectOptionComponent, descendants: true }, { propertyName: "scrollViewportView", predicate: ["scrollViewport"], descendants: true }], exportAs: ["cMultiSelect"], usesOnChanges: true, ngImport: i0, template: "@let isDisabled = disabled();\n@let placeholderText = placeholder();\n@let searchOn = search();\n@let cleanerBtn = cleaner();\n@let vScroller = virtualScroller();\n@let selType = selectionType();\n@let selectedSize = optionsSelected().size;\n@let selectedOpts = selectedOptions();\n@let counterPlaceholderTxt = counterPlaceholderText();\n<c-dropdown\n #dropdown=\"cDropdown\"\n [(visible)]=\"visible\"\n [autoClose]=\"'outside'\"\n [class]=\"multiselectClasses()\"\n [popperOptions]=\"popperOptions()\"\n>\n <div\n #dropdownToggle=\"cDropdownToggle\"\n [caret]=\"false\"\n [disabled]=\"isDisabled\"\n cDropdownToggle\n role=\"button\"\n class=\"form-multi-select-input-group\"\n >\n <span\n [class]=\"multiselectSelectionClasses()\"\n [class.form-multi-select-selection-tags]=\"selType === 'tags' && selectedOpts.length\"\n >\n @if (selType === 'tags') {\n @for (option of optionTags(); track option.value; let i = $index) {\n <c-multi-select-tag\n (remove)=\"handleTagRemove($event)\"\n [disabled]=\"isDisabled || (option.disabled ?? false)\"\n [label]=\"option.label ?? option.value?.toString()\"\n [option]=\"option\"\n [value]=\"option.value\"\n class=\"form-multi-select-tag text-truncate\"\n tabindex=\"-1\"\n />\n }\n } @else if (selType === 'text' && !!selectedOpts.length) {\n @for (option of selectedOpts; track option.value; let i = $index, last = $last) {\n <span class=\"form-multi-select-text text-truncate\">{{ option.label }}{{ last ? '&nbsp;' : ',&nbsp;' }}</span>\n }\n }\n @if (!searchOn) {\n <span class=\"text-placeholder text-truncate\">\n {{ selectedSize === 0 ? placeholderText : counterPlaceholderTxt }}\n </span>\n } @else {\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n (valueChange)=\"handleSearchValueChange($event)\"\n [attr.placeholder]=\"selectedOpts.length === 0 ? placeholderText : counterPlaceholderTxt\"\n [disabled]=\"isDisabled || !searchOn\"\n [class]=\"{ 'form-multi-select-search': true, disabled: isDisabled || !searchOn, 'text-truncate': true }\"\n [ngModel]=\"searchValue\"\n [value]=\"searchValue\"\n autocomplete=\"off\"\n cMultiSelectSearch\n size=\"2\"\n tabindex=\"{{ isDisabled ? -1 : 0 }}\"\n type=\"text\"\n />\n }\n </span>\n <div class=\"form-multi-select-buttons\">\n @if (!!cleanerBtn && selectedSize > 0 && !isDisabled) {\n <button\n (click)=\"clearAllOptions($event)\"\n [disabled]=\"isDisabled || (!isDropdownVisible() && cleanerBtn !== 'active')\"\n [attr.aria-label]=\"ariaCleanerLabel()\"\n class=\"form-multi-select-cleaner\"\n type=\"button\"\n ></button>\n }\n <button\n (click)=\"handleIndicatorClick($event)\"\n [disabled]=\"isDisabled\"\n [attr.aria-label]=\"ariaIndicatorLabel()\"\n class=\"form-multi-select-indicator\"\n type=\"button\"\n ></button>\n </div>\n </div>\n @if (!isDisabled) {\n <div\n #dropdownMenu=\"cDropdownMenu\"\n [visible]=\"dropdown.visible()\"\n cDropdownMenu\n class=\"form-multi-select-dropdown\"\n role=\"menu\"\n >\n @if (visibleOptions() && options.length > 0) {\n @if (selectAll() && multiple() && !vScroller) {\n <div class=\"form-multi-select-dropdown-header\">\n <button (click)=\"selectAllOptions()\" class=\"form-multi-select-all\" type=\"button\" tabindex=\"0\">\n {{ selectAllLabel() }}\n </button>\n </div>\n }\n }\n @if ((visibleOptions() && options.length > 0) || loading()) {\n <ng-container *ngTemplateOutlet=\"vScroller ? multiselectVirtualScroller : multiselectOptionsDiv\" />\n } @else {\n <div class=\"form-multi-select-options-empty\" role=\"status\">{{ searchNoResultsLabel() }}</div>\n }\n @if (loading()) {\n <c-element-cover [style]=\"{ 'border-radius': '6px', 'z-index': 2 }\" />\n }\n </div>\n }\n</c-dropdown>\n\n<ng-template #multiselectVirtualScroller>\n @let itemSizePx = itemSize();\n @let bufferPx = itemSizePx * visibleItems();\n @defer (on immediate) {\n @let optionsArray = $safeNavigationMigration(multiSelectService?.optionsArray$) | async;\n @if (optionsArray) {\n @let optMaxHeight = optionsMaxHeight();\n @let optMinWidth = minWidth();\n <cdk-virtual-scroll-viewport\n #scrollViewport\n (scrolledIndexChange)=\"handleScrolledIndexChange($event, scrollViewport)\"\n [itemSize]=\"itemSizePx\"\n [ngStyle]=\"\n optMaxHeight !== 'auto'\n ? {\n 'height.px': optMaxHeight,\n 'maxHeight.px': optMaxHeight,\n 'minWidth.px': optMinWidth,\n overflowX: 'hidden'\n }\n : { 'minWidth.px': optMinWidth, overflowX: 'hidden' }\n \"\n maxBufferPx=\"{{ bufferPx }}\"\n minBufferPx=\"{{ bufferPx }}\"\n class=\"form-multi-select-options\"\n tabindex=\"-1\"\n >\n <ng-container\n #cdkVirtualFor\n *cdkVirtualFor=\"\n let option of optionsArray;\n trackBy: trackByFn;\n templateCacheSize: 0;\n even as even;\n odd as odd;\n index as index;\n count as count;\n first as first;\n last as last\n \"\n [ngTemplateOutletContext]=\"{ $implicit: option, even, odd, index, count, first, last }\"\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n />\n </cdk-virtual-scroll-viewport>\n }\n }\n</ng-template>\n\n<ng-template #multiselectOptionsDiv>\n @let optMaxHeight = optionsMaxHeight();\n <div\n [class.form-multi-select-options]=\"visibleOptions()\"\n [ngStyle]=\"optMaxHeight !== 'auto' ? { 'maxHeight.px': optMaxHeight, overflowY: 'scroll' } : {}\"\n >\n <ng-content />\n <ng-container [ngTemplateOutlet]=\"userOptionsTemplate\" />\n </div>\n</ng-template>\n\n<ng-template #defaultMultiSelectOptionTemplate let-option>\n <c-multi-select-option\n [disabled]=\"option.disabled\"\n [label]=\"option.label\"\n [text]=\"option.text\"\n [value]=\"option.value\"\n [visible]=\"option.visible\"\n >\n {{ option.text }}\n </c-multi-select-option>\n</ng-template>\n\n<ng-template #userOptionsTemplate>\n @for (\n option of userOptionsArray$ | async;\n track option;\n let even = $even, odd = $odd, index = $index, count = $count, first = $first, last = $last\n ) {\n <ng-container\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option, even, odd, index, count, first, last }\"\n />\n }\n</ng-template>\n", styles: [":host .disabled{pointer-events:none}:host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{outline:none;--cui-form-multi-select-focus-box-shadow: 0 0 0 var(--cui-focus-ring-width) rgb(from var(--cui-form-multi-select-focus-border-color) r g b / var(--cui-focus-ring-opacity))}:host.cdk-focused:not(.disabled) .form-multi-select.is-valid{--cui-form-multi-select-focus-border-color: var(--cui-form-valid-border-color)}:host.cdk-focused:not(.disabled) .form-multi-select.is-invalid{--cui-form-multi-select-focus-border-color: var(--cui-form-invalid-border-color)}:host .form-multi-select .form-multi-select-selection{display:flex;flex:1 1 auto;flex-wrap:wrap}:host .form-multi-select .form-multi-select-selection .text-placeholder,:host .form-multi-select .form-multi-select-selection .form-multi-select-search::placeholder{color:var(--cui-form-multi-select-color);opacity:.8}:host .form-multi-select .form-multi-select-selection.form-control{border:none}:host .form-multi-select .form-multi-select-search[size]{display:flex}:host ::ng-deep .cdk-virtual-scroll-content-wrapper{display:contents}:host .cdk-virtual-scroll-viewport{width:var(--cui-dropdown-min-width)}:host .dropdown-menu{--cui-dropdown-padding-y: 0}:host-context(.input-group) :host:not(:first-child) .form-multi-select-input-group{border-start-start-radius:0;border-end-start-radius:0}:host-context(.input-group) :host:not(:last-child) .form-multi-select-input-group{border-start-end-radius:0;border-end-end-radius:0}:host-context(.input-group.has-validation,.input-group:not(.has-validation)) :host:not(:last-child):has(+[class*=valid-],+[class*=invalid-]) .form-multi-select-input-group,:host-context(.input-group.has-validation,.input-group:not(.has-validation)) :host:last-child .form-multi-select-input-group{border-start-end-radius:var(--cui-form-multi-select-border-radius);border-end-end-radius:var(--cui-form-multi-select-border-radius)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MultiSelectTagComponent, selector: "c-multi-select-tag", inputs: ["option", "disabled", "label", "value"], outputs: ["remove"] }, { kind: "component", type: MultiSelectOptionComponent, selector: "c-multi-select-option", inputs: ["optionsStyle", "label", "text", "visible", "disabled", "selected", "value", "active", "role"], outputs: ["selectedChange", "focusChange"], exportAs: ["cMultiSelectOption"] }, { kind: "directive", type: MultiSelectSearchDirective, selector: "[cMultiSelectSearch]", inputs: ["delay", "value"], outputs: ["valueChange"], exportAs: ["cMultiSelectSearch"] }, { kind: "component", type: DropdownComponent, selector: "c-dropdown", inputs: ["alignment", "autoClose", "direction", "placement", "popper", "popperOptions", "variant", "visible"], outputs: ["visibleChange"], exportAs: ["cDropdown"] }, { kind: "directive", type: DropdownMenuDirective, selector: "[cDropdownMenu]", inputs: ["alignment", "visible"], exportAs: ["cDropdownMenu"] }, { kind: "directive", type: DropdownToggleDirective, selector: "[cDropdownToggle]", inputs: ["dropdownComponent", "disabled", "caret", "split"], exportAs: ["cDropdownToggle"] }, { kind: "component", type: ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager, deferBlockDependencies: [() => [NgTemplateOutlet, /* @ts-ignore */
3112
+ ], queries: [{ propertyName: "multiSelectOptionsContent", predicate: MultiSelectOptionComponent, descendants: true }, { propertyName: "contentTemplates", predicate: TemplateIdDirective, descendants: true }], viewQueries: [{ propertyName: "optionsElementRef", first: true, predicate: ["options"], descendants: true }, { propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }, { propertyName: "dropdownMenu", first: true, predicate: DropdownMenuDirective, descendants: true, read: ElementRef }, { propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true, read: ElementRef }, { propertyName: "dropdownToggle", first: true, predicate: DropdownToggleDirective, descendants: true, read: ElementRef }, { propertyName: "multiSelectOptionsView", predicate: MultiSelectOptionComponent, descendants: true }, { propertyName: "scrollViewportView", predicate: ["scrollViewport"], descendants: true }], exportAs: ["cMultiSelect"], usesOnChanges: true, ngImport: i0, template: "@let isDisabled = disabled();\n@let placeholderText = placeholder();\n@let searchOn = search();\n@let cleanerBtn = cleaner();\n@let vScroller = virtualScroller();\n@let selType = selectionType();\n@let selectedSize = optionsSelected().size;\n@let selectedOpts = selectedOptions();\n@let counterPlaceholderTxt = counterPlaceholderText();\n<c-dropdown\n #dropdown=\"cDropdown\"\n [(visible)]=\"visible\"\n [autoClose]=\"'outside'\"\n [class]=\"multiselectClasses()\"\n [popperOptions]=\"popperOptions()\"\n>\n <div\n #dropdownToggle=\"cDropdownToggle\"\n [caret]=\"false\"\n [disabled]=\"isDisabled\"\n cDropdownToggle\n role=\"button\"\n class=\"form-multi-select-input-group\"\n >\n <span\n [class]=\"multiselectSelectionClasses()\"\n [class.form-multi-select-selection-tags]=\"selType === 'tags' && selectedOpts.length\"\n >\n @if (selType === 'tags') {\n @for (option of optionTags(); track option.value; let i = $index) {\n <c-multi-select-tag\n (remove)=\"handleTagRemove($event)\"\n [disabled]=\"isDisabled || (option.disabled ?? false)\"\n [label]=\"option.label ?? option.value?.toString()\"\n [option]=\"option\"\n [value]=\"option.value\"\n class=\"form-multi-select-tag text-truncate\"\n tabindex=\"-1\"\n />\n }\n } @else if (selType === 'text' && !!selectedOpts.length) {\n @for (option of selectedOpts; track option.value; let i = $index, last = $last) {\n <span class=\"form-multi-select-text text-truncate\">{{ option.label }}{{ last ? '&nbsp;' : ',&nbsp;' }}</span>\n }\n }\n @if (!searchOn) {\n <span class=\"text-placeholder text-truncate\">\n {{ selectedSize === 0 ? placeholderText : counterPlaceholderTxt }}\n </span>\n } @else {\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n (valueChange)=\"handleSearchValueChange($event)\"\n [attr.placeholder]=\"selectedOpts.length === 0 ? placeholderText : counterPlaceholderTxt\"\n [disabled]=\"isDisabled || !searchOn\"\n [class]=\"{ 'form-multi-select-search': true, disabled: isDisabled || !searchOn, 'text-truncate': true }\"\n [ngModel]=\"searchValue\"\n [value]=\"searchValue\"\n autocomplete=\"off\"\n cMultiSelectSearch\n size=\"2\"\n tabindex=\"{{ isDisabled ? -1 : 0 }}\"\n type=\"text\"\n />\n }\n </span>\n <div class=\"form-multi-select-buttons\">\n @if (!!cleanerBtn && selectedSize > 0 && !isDisabled) {\n <button\n (click)=\"clearAllOptions($event)\"\n [disabled]=\"isDisabled || (!isDropdownVisible() && cleanerBtn !== 'active')\"\n [attr.aria-label]=\"ariaCleanerLabel()\"\n class=\"form-multi-select-cleaner\"\n type=\"button\"\n ></button>\n }\n <button\n (click)=\"handleIndicatorClick($event)\"\n [disabled]=\"isDisabled\"\n [attr.aria-label]=\"ariaIndicatorLabel()\"\n class=\"form-multi-select-indicator\"\n type=\"button\"\n ></button>\n </div>\n </div>\n @if (!isDisabled) {\n <div\n #dropdownMenu=\"cDropdownMenu\"\n [visible]=\"dropdown.visible()\"\n cDropdownMenu\n class=\"form-multi-select-dropdown\"\n role=\"menu\"\n >\n @if (visibleOptions() && options.length > 0) {\n @if (selectAll() && multiple() && !vScroller) {\n <div class=\"form-multi-select-dropdown-header\">\n <button (click)=\"selectAllOptions()\" class=\"form-multi-select-all\" type=\"button\" tabindex=\"0\">\n {{ selectAllLabel() }}\n </button>\n </div>\n }\n }\n @if ((visibleOptions() && options.length > 0) || loading()) {\n <ng-container *ngTemplateOutlet=\"vScroller ? multiselectVirtualScroller : multiselectOptionsDiv\" />\n } @else {\n <div class=\"form-multi-select-options-empty\" role=\"status\">{{ searchNoResultsLabel() }}</div>\n }\n @if (loading()) {\n <c-element-cover [style]=\"{ 'border-radius': '6px', 'z-index': 2 }\" />\n }\n </div>\n }\n</c-dropdown>\n\n<ng-template #multiselectVirtualScroller>\n @let itemSizePx = itemSize();\n @let bufferPx = itemSizePx * visibleItems();\n @defer (on immediate) {\n @let optionsArray = $safeNavigationMigration(multiSelectService?.optionsArray$) | async;\n @if (optionsArray) {\n @let optMaxHeight = optionsMaxHeight();\n @let optMinWidth = minWidth();\n <cdk-virtual-scroll-viewport\n #scrollViewport\n (scrolledIndexChange)=\"handleScrolledIndexChange($event, scrollViewport)\"\n [itemSize]=\"itemSizePx\"\n [ngStyle]=\"\n optMaxHeight !== 'auto'\n ? {\n 'height.px': optMaxHeight,\n 'maxHeight.px': optMaxHeight,\n 'minWidth.px': optMinWidth,\n overflowX: 'hidden'\n }\n : { 'minWidth.px': optMinWidth, overflowX: 'hidden' }\n \"\n maxBufferPx=\"{{ bufferPx }}\"\n minBufferPx=\"{{ bufferPx }}\"\n tabindex=\"-1\"\n >\n <ng-container\n #cdkVirtualFor\n *cdkVirtualFor=\"\n let option of optionsArray;\n trackBy: trackByFn;\n templateCacheSize: 0;\n even as even;\n odd as odd;\n index as index;\n count as count;\n first as first;\n last as last\n \"\n [ngTemplateOutletContext]=\"{ $implicit: option, even, odd, index, count, first, last }\"\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n />\n </cdk-virtual-scroll-viewport>\n }\n }\n</ng-template>\n\n<ng-template #multiselectOptionsDiv>\n @let optMaxHeight = optionsMaxHeight();\n <div\n [class.form-multi-select-options]=\"visibleOptions()\"\n [ngStyle]=\"optMaxHeight !== 'auto' ? { 'maxHeight.px': optMaxHeight, overflowY: 'scroll' } : {}\"\n >\n <ng-content />\n <ng-container [ngTemplateOutlet]=\"userOptionsTemplate\" />\n </div>\n</ng-template>\n\n<ng-template #defaultMultiSelectOptionTemplate let-option>\n <c-multi-select-option\n [disabled]=\"option.disabled\"\n [label]=\"option.label\"\n [text]=\"option.text\"\n [value]=\"option.value\"\n [visible]=\"option.visible\"\n >\n {{ option.text }}\n </c-multi-select-option>\n</ng-template>\n\n<ng-template #userOptionsTemplate>\n @for (\n option of userOptionsArray$ | async;\n track option;\n let even = $even, odd = $odd, index = $index, count = $count, first = $first, last = $last\n ) {\n <ng-container\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option, even, odd, index, count, first, last }\"\n />\n }\n</ng-template>\n", styles: [":host .disabled{pointer-events:none}:host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{outline:none;--cui-form-multi-select-focus-box-shadow: 0 0 0 var(--cui-focus-ring-width) rgb(from var(--cui-form-multi-select-focus-border-color) r g b / var(--cui-focus-ring-opacity))}:host.cdk-focused:not(.disabled) .form-multi-select.is-valid{--cui-form-multi-select-focus-border-color: var(--cui-form-valid-border-color)}:host.cdk-focused:not(.disabled) .form-multi-select.is-invalid{--cui-form-multi-select-focus-border-color: var(--cui-form-invalid-border-color)}:host .form-multi-select .form-multi-select-selection{display:flex;flex:1 1 auto;flex-wrap:wrap}:host .form-multi-select .form-multi-select-selection .text-placeholder,:host .form-multi-select .form-multi-select-selection .form-multi-select-search::placeholder{color:var(--cui-form-multi-select-color);opacity:.8}:host .form-multi-select .form-multi-select-selection.form-control{border:none}:host .form-multi-select .form-multi-select-search[size]{display:flex}:host .cdk-virtual-scroll-viewport{width:var(--cui-dropdown-min-width)}:host .dropdown-menu{--cui-dropdown-padding-y: 0}:host-context(.input-group) :host:not(:first-child) .form-multi-select-input-group{border-start-start-radius:0;border-end-start-radius:0}:host-context(.input-group) :host:not(:last-child) .form-multi-select-input-group{border-start-end-radius:0;border-end-end-radius:0}:host-context(.input-group.has-validation,.input-group:not(.has-validation)) :host:not(:last-child):has(+[class*=valid-],+[class*=invalid-]) .form-multi-select-input-group,:host-context(.input-group.has-validation,.input-group:not(.has-validation)) :host:last-child .form-multi-select-input-group{border-start-end-radius:var(--cui-form-multi-select-border-radius);border-end-end-radius:var(--cui-form-multi-select-border-radius)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MultiSelectTagComponent, selector: "c-multi-select-tag", inputs: ["option", "disabled", "label", "value"], outputs: ["remove"] }, { kind: "component", type: MultiSelectOptionComponent, selector: "c-multi-select-option", inputs: ["optionsStyle", "label", "text", "visible", "disabled", "selected", "value", "active", "role"], outputs: ["selectedChange", "focusChange"], exportAs: ["cMultiSelectOption"] }, { kind: "directive", type: MultiSelectSearchDirective, selector: "[cMultiSelectSearch]", inputs: ["delay", "value"], outputs: ["valueChange"], exportAs: ["cMultiSelectSearch"] }, { kind: "component", type: DropdownComponent, selector: "c-dropdown", inputs: ["alignment", "autoClose", "direction", "placement", "popper", "popperOptions", "variant", "visible"], outputs: ["visibleChange"], exportAs: ["cDropdown"] }, { kind: "directive", type: DropdownMenuDirective, selector: "[cDropdownMenu]", inputs: ["alignment", "visible"], exportAs: ["cDropdownMenu"] }, { kind: "directive", type: DropdownToggleDirective, selector: "[cDropdownToggle]", inputs: ["dropdownComponent", "disabled", "caret", "split"], exportAs: ["cDropdownToggle"] }, { kind: "component", type: ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager, deferBlockDependencies: [() => [NgTemplateOutlet, /* @ts-ignore */
3109
3113
  import('@angular/cdk/scrolling').then(m => m.CdkFixedSizeVirtualScroll), /* @ts-ignore */
3110
3114
  import('@angular/cdk/scrolling').then(m => m.CdkVirtualScrollViewport), /* @ts-ignore */
3111
3115
  import('@angular/cdk/scrolling').then(m => m.CdkVirtualForOf), NgStyle,
@@ -3148,7 +3152,7 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.1.0", ng
3148
3152
  '[attr.aria-expanded]': 'visible()',
3149
3153
  '[attr.aria-disabled]': 'disabled()',
3150
3154
  '[attr.tabindex]': 'tabIndex'
3151
- }, template: "@let isDisabled = disabled();\n@let placeholderText = placeholder();\n@let searchOn = search();\n@let cleanerBtn = cleaner();\n@let vScroller = virtualScroller();\n@let selType = selectionType();\n@let selectedSize = optionsSelected().size;\n@let selectedOpts = selectedOptions();\n@let counterPlaceholderTxt = counterPlaceholderText();\n<c-dropdown\n #dropdown=\"cDropdown\"\n [(visible)]=\"visible\"\n [autoClose]=\"'outside'\"\n [class]=\"multiselectClasses()\"\n [popperOptions]=\"popperOptions()\"\n>\n <div\n #dropdownToggle=\"cDropdownToggle\"\n [caret]=\"false\"\n [disabled]=\"isDisabled\"\n cDropdownToggle\n role=\"button\"\n class=\"form-multi-select-input-group\"\n >\n <span\n [class]=\"multiselectSelectionClasses()\"\n [class.form-multi-select-selection-tags]=\"selType === 'tags' && selectedOpts.length\"\n >\n @if (selType === 'tags') {\n @for (option of optionTags(); track option.value; let i = $index) {\n <c-multi-select-tag\n (remove)=\"handleTagRemove($event)\"\n [disabled]=\"isDisabled || (option.disabled ?? false)\"\n [label]=\"option.label ?? option.value?.toString()\"\n [option]=\"option\"\n [value]=\"option.value\"\n class=\"form-multi-select-tag text-truncate\"\n tabindex=\"-1\"\n />\n }\n } @else if (selType === 'text' && !!selectedOpts.length) {\n @for (option of selectedOpts; track option.value; let i = $index, last = $last) {\n <span class=\"form-multi-select-text text-truncate\">{{ option.label }}{{ last ? '&nbsp;' : ',&nbsp;' }}</span>\n }\n }\n @if (!searchOn) {\n <span class=\"text-placeholder text-truncate\">\n {{ selectedSize === 0 ? placeholderText : counterPlaceholderTxt }}\n </span>\n } @else {\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n (valueChange)=\"handleSearchValueChange($event)\"\n [attr.placeholder]=\"selectedOpts.length === 0 ? placeholderText : counterPlaceholderTxt\"\n [disabled]=\"isDisabled || !searchOn\"\n [class]=\"{ 'form-multi-select-search': true, disabled: isDisabled || !searchOn, 'text-truncate': true }\"\n [ngModel]=\"searchValue\"\n [value]=\"searchValue\"\n autocomplete=\"off\"\n cMultiSelectSearch\n size=\"2\"\n tabindex=\"{{ isDisabled ? -1 : 0 }}\"\n type=\"text\"\n />\n }\n </span>\n <div class=\"form-multi-select-buttons\">\n @if (!!cleanerBtn && selectedSize > 0 && !isDisabled) {\n <button\n (click)=\"clearAllOptions($event)\"\n [disabled]=\"isDisabled || (!isDropdownVisible() && cleanerBtn !== 'active')\"\n [attr.aria-label]=\"ariaCleanerLabel()\"\n class=\"form-multi-select-cleaner\"\n type=\"button\"\n ></button>\n }\n <button\n (click)=\"handleIndicatorClick($event)\"\n [disabled]=\"isDisabled\"\n [attr.aria-label]=\"ariaIndicatorLabel()\"\n class=\"form-multi-select-indicator\"\n type=\"button\"\n ></button>\n </div>\n </div>\n @if (!isDisabled) {\n <div\n #dropdownMenu=\"cDropdownMenu\"\n [visible]=\"dropdown.visible()\"\n cDropdownMenu\n class=\"form-multi-select-dropdown\"\n role=\"menu\"\n >\n @if (visibleOptions() && options.length > 0) {\n @if (selectAll() && multiple() && !vScroller) {\n <div class=\"form-multi-select-dropdown-header\">\n <button (click)=\"selectAllOptions()\" class=\"form-multi-select-all\" type=\"button\" tabindex=\"0\">\n {{ selectAllLabel() }}\n </button>\n </div>\n }\n }\n @if ((visibleOptions() && options.length > 0) || loading()) {\n <ng-container *ngTemplateOutlet=\"vScroller ? multiselectVirtualScroller : multiselectOptionsDiv\" />\n } @else {\n <div class=\"form-multi-select-options-empty\" role=\"status\">{{ searchNoResultsLabel() }}</div>\n }\n @if (loading()) {\n <c-element-cover [style]=\"{ 'border-radius': '6px', 'z-index': 2 }\" />\n }\n </div>\n }\n</c-dropdown>\n\n<ng-template #multiselectVirtualScroller>\n @let itemSizePx = itemSize();\n @let bufferPx = itemSizePx * visibleItems();\n @defer (on immediate) {\n @let optionsArray = $safeNavigationMigration(multiSelectService?.optionsArray$) | async;\n @if (optionsArray) {\n @let optMaxHeight = optionsMaxHeight();\n @let optMinWidth = minWidth();\n <cdk-virtual-scroll-viewport\n #scrollViewport\n (scrolledIndexChange)=\"handleScrolledIndexChange($event, scrollViewport)\"\n [itemSize]=\"itemSizePx\"\n [ngStyle]=\"\n optMaxHeight !== 'auto'\n ? {\n 'height.px': optMaxHeight,\n 'maxHeight.px': optMaxHeight,\n 'minWidth.px': optMinWidth,\n overflowX: 'hidden'\n }\n : { 'minWidth.px': optMinWidth, overflowX: 'hidden' }\n \"\n maxBufferPx=\"{{ bufferPx }}\"\n minBufferPx=\"{{ bufferPx }}\"\n class=\"form-multi-select-options\"\n tabindex=\"-1\"\n >\n <ng-container\n #cdkVirtualFor\n *cdkVirtualFor=\"\n let option of optionsArray;\n trackBy: trackByFn;\n templateCacheSize: 0;\n even as even;\n odd as odd;\n index as index;\n count as count;\n first as first;\n last as last\n \"\n [ngTemplateOutletContext]=\"{ $implicit: option, even, odd, index, count, first, last }\"\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n />\n </cdk-virtual-scroll-viewport>\n }\n }\n</ng-template>\n\n<ng-template #multiselectOptionsDiv>\n @let optMaxHeight = optionsMaxHeight();\n <div\n [class.form-multi-select-options]=\"visibleOptions()\"\n [ngStyle]=\"optMaxHeight !== 'auto' ? { 'maxHeight.px': optMaxHeight, overflowY: 'scroll' } : {}\"\n >\n <ng-content />\n <ng-container [ngTemplateOutlet]=\"userOptionsTemplate\" />\n </div>\n</ng-template>\n\n<ng-template #defaultMultiSelectOptionTemplate let-option>\n <c-multi-select-option\n [disabled]=\"option.disabled\"\n [label]=\"option.label\"\n [text]=\"option.text\"\n [value]=\"option.value\"\n [visible]=\"option.visible\"\n >\n {{ option.text }}\n </c-multi-select-option>\n</ng-template>\n\n<ng-template #userOptionsTemplate>\n @for (\n option of userOptionsArray$ | async;\n track option;\n let even = $even, odd = $odd, index = $index, count = $count, first = $first, last = $last\n ) {\n <ng-container\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option, even, odd, index, count, first, last }\"\n />\n }\n</ng-template>\n", styles: [":host .disabled{pointer-events:none}:host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{outline:none;--cui-form-multi-select-focus-box-shadow: 0 0 0 var(--cui-focus-ring-width) rgb(from var(--cui-form-multi-select-focus-border-color) r g b / var(--cui-focus-ring-opacity))}:host.cdk-focused:not(.disabled) .form-multi-select.is-valid{--cui-form-multi-select-focus-border-color: var(--cui-form-valid-border-color)}:host.cdk-focused:not(.disabled) .form-multi-select.is-invalid{--cui-form-multi-select-focus-border-color: var(--cui-form-invalid-border-color)}:host .form-multi-select .form-multi-select-selection{display:flex;flex:1 1 auto;flex-wrap:wrap}:host .form-multi-select .form-multi-select-selection .text-placeholder,:host .form-multi-select .form-multi-select-selection .form-multi-select-search::placeholder{color:var(--cui-form-multi-select-color);opacity:.8}:host .form-multi-select .form-multi-select-selection.form-control{border:none}:host .form-multi-select .form-multi-select-search[size]{display:flex}:host ::ng-deep .cdk-virtual-scroll-content-wrapper{display:contents}:host .cdk-virtual-scroll-viewport{width:var(--cui-dropdown-min-width)}:host .dropdown-menu{--cui-dropdown-padding-y: 0}:host-context(.input-group) :host:not(:first-child) .form-multi-select-input-group{border-start-start-radius:0;border-end-start-radius:0}:host-context(.input-group) :host:not(:last-child) .form-multi-select-input-group{border-start-end-radius:0;border-end-end-radius:0}:host-context(.input-group.has-validation,.input-group:not(.has-validation)) :host:not(:last-child):has(+[class*=valid-],+[class*=invalid-]) .form-multi-select-input-group,:host-context(.input-group.has-validation,.input-group:not(.has-validation)) :host:last-child .form-multi-select-input-group{border-start-end-radius:var(--cui-form-multi-select-border-radius);border-end-end-radius:var(--cui-form-multi-select-border-radius)}\n"] }]
3155
+ }, template: "@let isDisabled = disabled();\n@let placeholderText = placeholder();\n@let searchOn = search();\n@let cleanerBtn = cleaner();\n@let vScroller = virtualScroller();\n@let selType = selectionType();\n@let selectedSize = optionsSelected().size;\n@let selectedOpts = selectedOptions();\n@let counterPlaceholderTxt = counterPlaceholderText();\n<c-dropdown\n #dropdown=\"cDropdown\"\n [(visible)]=\"visible\"\n [autoClose]=\"'outside'\"\n [class]=\"multiselectClasses()\"\n [popperOptions]=\"popperOptions()\"\n>\n <div\n #dropdownToggle=\"cDropdownToggle\"\n [caret]=\"false\"\n [disabled]=\"isDisabled\"\n cDropdownToggle\n role=\"button\"\n class=\"form-multi-select-input-group\"\n >\n <span\n [class]=\"multiselectSelectionClasses()\"\n [class.form-multi-select-selection-tags]=\"selType === 'tags' && selectedOpts.length\"\n >\n @if (selType === 'tags') {\n @for (option of optionTags(); track option.value; let i = $index) {\n <c-multi-select-tag\n (remove)=\"handleTagRemove($event)\"\n [disabled]=\"isDisabled || (option.disabled ?? false)\"\n [label]=\"option.label ?? option.value?.toString()\"\n [option]=\"option\"\n [value]=\"option.value\"\n class=\"form-multi-select-tag text-truncate\"\n tabindex=\"-1\"\n />\n }\n } @else if (selType === 'text' && !!selectedOpts.length) {\n @for (option of selectedOpts; track option.value; let i = $index, last = $last) {\n <span class=\"form-multi-select-text text-truncate\">{{ option.label }}{{ last ? '&nbsp;' : ',&nbsp;' }}</span>\n }\n }\n @if (!searchOn) {\n <span class=\"text-placeholder text-truncate\">\n {{ selectedSize === 0 ? placeholderText : counterPlaceholderTxt }}\n </span>\n } @else {\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n (valueChange)=\"handleSearchValueChange($event)\"\n [attr.placeholder]=\"selectedOpts.length === 0 ? placeholderText : counterPlaceholderTxt\"\n [disabled]=\"isDisabled || !searchOn\"\n [class]=\"{ 'form-multi-select-search': true, disabled: isDisabled || !searchOn, 'text-truncate': true }\"\n [ngModel]=\"searchValue\"\n [value]=\"searchValue\"\n autocomplete=\"off\"\n cMultiSelectSearch\n size=\"2\"\n tabindex=\"{{ isDisabled ? -1 : 0 }}\"\n type=\"text\"\n />\n }\n </span>\n <div class=\"form-multi-select-buttons\">\n @if (!!cleanerBtn && selectedSize > 0 && !isDisabled) {\n <button\n (click)=\"clearAllOptions($event)\"\n [disabled]=\"isDisabled || (!isDropdownVisible() && cleanerBtn !== 'active')\"\n [attr.aria-label]=\"ariaCleanerLabel()\"\n class=\"form-multi-select-cleaner\"\n type=\"button\"\n ></button>\n }\n <button\n (click)=\"handleIndicatorClick($event)\"\n [disabled]=\"isDisabled\"\n [attr.aria-label]=\"ariaIndicatorLabel()\"\n class=\"form-multi-select-indicator\"\n type=\"button\"\n ></button>\n </div>\n </div>\n @if (!isDisabled) {\n <div\n #dropdownMenu=\"cDropdownMenu\"\n [visible]=\"dropdown.visible()\"\n cDropdownMenu\n class=\"form-multi-select-dropdown\"\n role=\"menu\"\n >\n @if (visibleOptions() && options.length > 0) {\n @if (selectAll() && multiple() && !vScroller) {\n <div class=\"form-multi-select-dropdown-header\">\n <button (click)=\"selectAllOptions()\" class=\"form-multi-select-all\" type=\"button\" tabindex=\"0\">\n {{ selectAllLabel() }}\n </button>\n </div>\n }\n }\n @if ((visibleOptions() && options.length > 0) || loading()) {\n <ng-container *ngTemplateOutlet=\"vScroller ? multiselectVirtualScroller : multiselectOptionsDiv\" />\n } @else {\n <div class=\"form-multi-select-options-empty\" role=\"status\">{{ searchNoResultsLabel() }}</div>\n }\n @if (loading()) {\n <c-element-cover [style]=\"{ 'border-radius': '6px', 'z-index': 2 }\" />\n }\n </div>\n }\n</c-dropdown>\n\n<ng-template #multiselectVirtualScroller>\n @let itemSizePx = itemSize();\n @let bufferPx = itemSizePx * visibleItems();\n @defer (on immediate) {\n @let optionsArray = $safeNavigationMigration(multiSelectService?.optionsArray$) | async;\n @if (optionsArray) {\n @let optMaxHeight = optionsMaxHeight();\n @let optMinWidth = minWidth();\n <cdk-virtual-scroll-viewport\n #scrollViewport\n (scrolledIndexChange)=\"handleScrolledIndexChange($event, scrollViewport)\"\n [itemSize]=\"itemSizePx\"\n [ngStyle]=\"\n optMaxHeight !== 'auto'\n ? {\n 'height.px': optMaxHeight,\n 'maxHeight.px': optMaxHeight,\n 'minWidth.px': optMinWidth,\n overflowX: 'hidden'\n }\n : { 'minWidth.px': optMinWidth, overflowX: 'hidden' }\n \"\n maxBufferPx=\"{{ bufferPx }}\"\n minBufferPx=\"{{ bufferPx }}\"\n tabindex=\"-1\"\n >\n <ng-container\n #cdkVirtualFor\n *cdkVirtualFor=\"\n let option of optionsArray;\n trackBy: trackByFn;\n templateCacheSize: 0;\n even as even;\n odd as odd;\n index as index;\n count as count;\n first as first;\n last as last\n \"\n [ngTemplateOutletContext]=\"{ $implicit: option, even, odd, index, count, first, last }\"\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n />\n </cdk-virtual-scroll-viewport>\n }\n }\n</ng-template>\n\n<ng-template #multiselectOptionsDiv>\n @let optMaxHeight = optionsMaxHeight();\n <div\n [class.form-multi-select-options]=\"visibleOptions()\"\n [ngStyle]=\"optMaxHeight !== 'auto' ? { 'maxHeight.px': optMaxHeight, overflowY: 'scroll' } : {}\"\n >\n <ng-content />\n <ng-container [ngTemplateOutlet]=\"userOptionsTemplate\" />\n </div>\n</ng-template>\n\n<ng-template #defaultMultiSelectOptionTemplate let-option>\n <c-multi-select-option\n [disabled]=\"option.disabled\"\n [label]=\"option.label\"\n [text]=\"option.text\"\n [value]=\"option.value\"\n [visible]=\"option.visible\"\n >\n {{ option.text }}\n </c-multi-select-option>\n</ng-template>\n\n<ng-template #userOptionsTemplate>\n @for (\n option of userOptionsArray$ | async;\n track option;\n let even = $even, odd = $odd, index = $index, count = $count, first = $first, last = $last\n ) {\n <ng-container\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option, even, odd, index, count, first, last }\"\n />\n }\n</ng-template>\n", styles: [":host .disabled{pointer-events:none}:host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{outline:none;--cui-form-multi-select-focus-box-shadow: 0 0 0 var(--cui-focus-ring-width) rgb(from var(--cui-form-multi-select-focus-border-color) r g b / var(--cui-focus-ring-opacity))}:host.cdk-focused:not(.disabled) .form-multi-select.is-valid{--cui-form-multi-select-focus-border-color: var(--cui-form-valid-border-color)}:host.cdk-focused:not(.disabled) .form-multi-select.is-invalid{--cui-form-multi-select-focus-border-color: var(--cui-form-invalid-border-color)}:host .form-multi-select .form-multi-select-selection{display:flex;flex:1 1 auto;flex-wrap:wrap}:host .form-multi-select .form-multi-select-selection .text-placeholder,:host .form-multi-select .form-multi-select-selection .form-multi-select-search::placeholder{color:var(--cui-form-multi-select-color);opacity:.8}:host .form-multi-select .form-multi-select-selection.form-control{border:none}:host .form-multi-select .form-multi-select-search[size]{display:flex}:host .cdk-virtual-scroll-viewport{width:var(--cui-dropdown-min-width)}:host .dropdown-menu{--cui-dropdown-padding-y: 0}:host-context(.input-group) :host:not(:first-child) .form-multi-select-input-group{border-start-start-radius:0;border-end-start-radius:0}:host-context(.input-group) :host:not(:last-child) .form-multi-select-input-group{border-start-end-radius:0;border-end-end-radius:0}:host-context(.input-group.has-validation,.input-group:not(.has-validation)) :host:not(:last-child):has(+[class*=valid-],+[class*=invalid-]) .form-multi-select-input-group,:host-context(.input-group.has-validation,.input-group:not(.has-validation)) :host:last-child .form-multi-select-input-group{border-start-end-radius:var(--cui-form-multi-select-border-radius);border-end-end-radius:var(--cui-form-multi-select-border-radius)}\n"] }]
3152
3156
  }], ctorParameters: () => [], propDecorators: { allowCreateOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowCreateOptions", required: false }] }], ariaCleanerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaCleanerLabel", required: false }] }], ariaIndicatorLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaIndicatorLabel", required: false }] }], cleaner: [{ type: i0.Input, args: [{ isSignal: true, alias: "cleaner", required: false }] }], clearSearchOnSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearSearchOnSelect", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], options: [{
3153
3157
  type: Input
3154
3158
  }], optionsMaxHeightInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionsMaxHeight", required: false }] }], optionsStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionsStyle", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], resetSelectionOnOptionsChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "resetSelectionOnOptionsChange", required: false }] }], search: [{ type: i0.Input, args: [{ isSignal: true, alias: "search", required: false }] }], searchNoResultsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchNoResultsLabel", required: false }] }], searchValue: [{
@@ -8233,15 +8237,8 @@ class CarouselService {
8233
8237
  setIndex(index) {
8234
8238
  this.#carouselIndex.next(index);
8235
8239
  }
8236
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8237
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselService });
8238
- }
8239
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselService, decorators: [{
8240
- type: Injectable
8241
- }] });
8242
-
8243
- class CarouselState {
8244
- #carouselService = inject(CarouselService);
8240
+ animating = signal(false, /* @ts-ignore */
8241
+ ...(ngDevMode ? [{ debugName: "animating" }] : /* istanbul ignore next */ []));
8245
8242
  #state = {
8246
8243
  activeItemIndex: -1,
8247
8244
  animate: true,
@@ -8260,7 +8257,7 @@ class CarouselState {
8260
8257
  if (prevState.activeItemIndex !== nextState.activeItemIndex) {
8261
8258
  const activeItemIndex = this.state.activeItemIndex || 0;
8262
8259
  const itemInterval = (this.state.items && this.state.items[activeItemIndex]?.interval()) || -1;
8263
- this.#carouselService.setIndex({
8260
+ this.setIndex({
8264
8261
  active: nextState.activeItemIndex,
8265
8262
  interval: itemInterval,
8266
8263
  lastItemIndex: (nextState.items?.length ?? 0) - 1
@@ -8282,7 +8279,7 @@ class CarouselState {
8282
8279
  }
8283
8280
  }
8284
8281
  setNextIndex(nextIndex) {
8285
- this.#carouselService.setIndex(nextIndex);
8282
+ this.setIndex(nextIndex);
8286
8283
  }
8287
8284
  direction(direction = 'next') {
8288
8285
  this.state = { direction };
@@ -8311,10 +8308,10 @@ class CarouselState {
8311
8308
  interval: 0
8312
8309
  };
8313
8310
  }
8314
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8315
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselState });
8311
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8312
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselService });
8316
8313
  }
8317
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselState, decorators: [{
8314
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselService, decorators: [{
8318
8315
  type: Injectable
8319
8316
  }] });
8320
8317
 
@@ -8323,9 +8320,9 @@ class CarouselConfig {
8323
8320
  activeIndex = 0;
8324
8321
  /* Animate transition of slides */
8325
8322
  animate = true;
8326
- /* Default direction of auto changing of slides */
8323
+ /* Default direction of auto-changing of slides */
8327
8324
  direction = 'next';
8328
- /* Default interval of auto changing of slides */
8325
+ /* Default interval of auto-changing of slides */
8329
8326
  interval;
8330
8327
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8331
8328
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselConfig, providedIn: 'root' });
@@ -8339,7 +8336,6 @@ class CarouselComponent {
8339
8336
  config = inject(CarouselConfig);
8340
8337
  #hostElement = inject(ElementRef);
8341
8338
  #carouselService = inject(CarouselService);
8342
- #carouselState = inject(CarouselState);
8343
8339
  #intersectionService = inject(IntersectionService);
8344
8340
  #listenersService = inject(ListenersService);
8345
8341
  constructor() {
@@ -8347,7 +8343,7 @@ class CarouselComponent {
8347
8343
  }
8348
8344
  loadConfig() {
8349
8345
  this.activeIndex.update((activeIndex) => this.config?.activeIndex ?? activeIndex);
8350
- this.animate.update((animate) => this.config?.animate ?? animate);
8346
+ this.animate.update((animate) => (animate === false ? animate : (this.config?.animate ?? animate)));
8351
8347
  this.direction.update((direction) => this.config?.direction ?? direction);
8352
8348
  this.interval.update((interval) => this.config?.interval ?? interval);
8353
8349
  }
@@ -8363,8 +8359,8 @@ class CarouselComponent {
8363
8359
  * @return boolean
8364
8360
  */
8365
8361
  animateInput = input(true, { ...(ngDevMode ? { debugName: "animateInput" } : /* istanbul ignore next */ {}), alias: 'animate' });
8366
- animate = linkedSignal({ ...(ngDevMode ? { debugName: "animate" } : /* istanbul ignore next */ {}), source: this.animateInput,
8367
- computation: (value) => value });
8362
+ animate = linkedSignal(this.animateInput, /* @ts-ignore */
8363
+ ...(ngDevMode ? [{ debugName: "animate" }] : /* istanbul ignore next */ []));
8368
8364
  /**
8369
8365
  * Carousel direction. [docs]
8370
8366
  * @return {'next' | 'prev'}
@@ -8382,7 +8378,7 @@ class CarouselComponent {
8382
8378
  computation: (value) => value });
8383
8379
  #intervalEffect = effect(() => {
8384
8380
  const interval = this.interval();
8385
- this.#carouselState.state = { interval: interval };
8381
+ this.#carouselService.state = { interval: interval };
8386
8382
  interval ? this.setTimer() : this.resetTimer();
8387
8383
  }, /* @ts-ignore */
8388
8384
  ...(ngDevMode ? [{ debugName: "#intervalEffect" }] : /* istanbul ignore next */ []));
@@ -8400,7 +8396,7 @@ class CarouselComponent {
8400
8396
  touch = input(true, /* @ts-ignore */
8401
8397
  ...(ngDevMode ? [{ debugName: "touch" }] : /* istanbul ignore next */ []));
8402
8398
  /**
8403
- * Set type of the transition.
8399
+ * Set the type of the transition.
8404
8400
  * @return {'slide' | 'crossfade'}
8405
8401
  * @default 'slide'
8406
8402
  */
@@ -8423,16 +8419,18 @@ class CarouselComponent {
8423
8419
  swipeSubscription;
8424
8420
  #destroyRef = inject(DestroyRef);
8425
8421
  ngOnInit() {
8426
- this.carouselStateSubscribe();
8422
+ this.carouselServiceSubscribe();
8427
8423
  }
8428
8424
  ngOnDestroy() {
8429
8425
  this.resetTimer();
8430
8426
  this.clearListeners();
8431
8427
  this.swipeSubscribe(false);
8428
+ // Ensure IntersectionObserver is cleaned up
8429
+ this.#intersectionService?.unobserve(this.#hostElement);
8432
8430
  }
8433
8431
  ngAfterContentInit() {
8434
8432
  this.intersectionServiceSubscribe();
8435
- this.#carouselState.state = {
8433
+ this.#carouselService.state = {
8436
8434
  activeItemIndex: this.activeIndex(),
8437
8435
  animate: this.animate(),
8438
8436
  interval: this.interval(),
@@ -8470,8 +8468,8 @@ class CarouselComponent {
8470
8468
  this.resetTimer();
8471
8469
  if (interval > 0) {
8472
8470
  this.timerId = setTimeout(() => {
8473
- const nextIndex = this.#carouselState.direction(direction);
8474
- this.#carouselState.state = { activeItemIndex: nextIndex };
8471
+ const nextIndex = this.#carouselService.direction(direction);
8472
+ this.#carouselService.state = { activeItemIndex: nextIndex };
8475
8473
  }, interval);
8476
8474
  }
8477
8475
  }
@@ -8479,7 +8477,7 @@ class CarouselComponent {
8479
8477
  clearTimeout(this.timerId);
8480
8478
  this.timerId = undefined;
8481
8479
  }
8482
- carouselStateSubscribe() {
8480
+ carouselServiceSubscribe() {
8483
8481
  this.#carouselService.carouselIndex$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((nextItem) => {
8484
8482
  if ('active' in nextItem && typeof nextItem.active === 'number') {
8485
8483
  this.itemChange?.emit(nextItem.active);
@@ -8496,7 +8494,7 @@ class CarouselComponent {
8496
8494
  this.#intersectionService.createIntersectionObserver(this.#hostElement);
8497
8495
  this.#intersectionService.intersecting$
8498
8496
  .pipe(filter((next) => next.hostElement === this.#hostElement), finalize(() => {
8499
- this.#intersectionService.unobserve(this.#hostElement);
8497
+ this.#intersectionService?.unobserve(this.#hostElement);
8500
8498
  }), takeUntilDestroyed(this.#destroyRef))
8501
8499
  .subscribe((next) => {
8502
8500
  this.visible = next.isIntersecting;
@@ -8514,10 +8512,13 @@ class CarouselComponent {
8514
8512
  .subscribe(([touchstart, [touchend, touchmove]]) => {
8515
8513
  touchstart.stopPropagation();
8516
8514
  touchmove.stopPropagation();
8515
+ if (this.#carouselService.animating()) {
8516
+ return;
8517
+ }
8517
8518
  const distanceX = touchstart.touches[0]?.clientX - touchmove.touches[0]?.clientX || 0;
8518
8519
  if (Math.abs(distanceX) > 0.3 * carouselElement.clientWidth && touchstart.timeStamp <= touchmove.timeStamp) {
8519
- const nextIndex = this.#carouselState.direction(distanceX > 0 ? 'next' : 'prev');
8520
- this.#carouselState.state = { activeItemIndex: nextIndex };
8520
+ const nextIndex = this.#carouselService.direction(distanceX > 0 ? 'next' : 'prev');
8521
+ this.#carouselService.state = { activeItemIndex: nextIndex };
8521
8522
  }
8522
8523
  });
8523
8524
  }
@@ -8526,11 +8527,11 @@ class CarouselComponent {
8526
8527
  }
8527
8528
  }
8528
8529
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8529
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.0", type: CarouselComponent, isStandalone: true, selector: "c-carousel", inputs: { activeIndexInput: { classPropertyName: "activeIndexInput", publicName: "activeIndex", isSignal: true, isRequired: false, transformFunction: null }, animateInput: { classPropertyName: "animateInput", publicName: "animate", isSignal: true, isRequired: false, transformFunction: null }, directionInput: { classPropertyName: "directionInput", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, intervalInput: { classPropertyName: "intervalInput", publicName: "interval", isSignal: true, isRequired: false, transformFunction: null }, pause: { classPropertyName: "pause", publicName: "pause", isSignal: true, isRequired: false, transformFunction: null }, touch: { classPropertyName: "touch", publicName: "touch", isSignal: true, isRequired: false, transformFunction: null }, transition: { classPropertyName: "transition", publicName: "transition", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemChange: "itemChange" }, host: { properties: { "class.carousel-fade": "transition() === \"crossfade\" && animate()" }, classAttribute: "carousel slide" }, providers: [CarouselService, CarouselState, ListenersService], exportAs: ["cCarousel"], hostDirectives: [{ directive: ThemeDirective, inputs: ["dark", "dark"] }], ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{display:block}\n"] });
8530
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.0", type: CarouselComponent, isStandalone: true, selector: "c-carousel", inputs: { activeIndexInput: { classPropertyName: "activeIndexInput", publicName: "activeIndex", isSignal: true, isRequired: false, transformFunction: null }, animateInput: { classPropertyName: "animateInput", publicName: "animate", isSignal: true, isRequired: false, transformFunction: null }, directionInput: { classPropertyName: "directionInput", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, intervalInput: { classPropertyName: "intervalInput", publicName: "interval", isSignal: true, isRequired: false, transformFunction: null }, pause: { classPropertyName: "pause", publicName: "pause", isSignal: true, isRequired: false, transformFunction: null }, touch: { classPropertyName: "touch", publicName: "touch", isSignal: true, isRequired: false, transformFunction: null }, transition: { classPropertyName: "transition", publicName: "transition", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemChange: "itemChange" }, host: { properties: { "class.carousel-fade": "transition() === \"crossfade\" && animate()" }, classAttribute: "carousel slide" }, providers: [CarouselService, ListenersService], exportAs: ["cCarousel"], hostDirectives: [{ directive: ThemeDirective, inputs: ["dark", "dark"] }], ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{display:block}\n"] });
8530
8531
  }
8531
8532
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselComponent, decorators: [{
8532
8533
  type: Component,
8533
- args: [{ selector: 'c-carousel', template: '<ng-content />', providers: [CarouselService, CarouselState, ListenersService], hostDirectives: [{ directive: ThemeDirective, inputs: ['dark'] }], exportAs: 'cCarousel', host: {
8534
+ args: [{ selector: 'c-carousel', template: '<ng-content />', providers: [CarouselService, ListenersService], hostDirectives: [{ directive: ThemeDirective, inputs: ['dark'] }], exportAs: 'cCarousel', host: {
8534
8535
  class: 'carousel slide',
8535
8536
  '[class.carousel-fade]': 'transition() === "crossfade" && animate()'
8536
8537
  }, styles: [":host{display:block}\n"] }]
@@ -8548,7 +8549,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
8548
8549
  }] });
8549
8550
 
8550
8551
  class CarouselControlComponent {
8551
- #carouselState = inject(CarouselState);
8552
+ #carouselService = inject(CarouselService);
8552
8553
  /**
8553
8554
  * Carousel control caption. [docs]
8554
8555
  * @return string
@@ -8590,11 +8591,14 @@ class CarouselControlComponent {
8590
8591
  }
8591
8592
  }
8592
8593
  onClick($event) {
8594
+ if (this.#carouselService.animating()) {
8595
+ return;
8596
+ }
8593
8597
  this.#play();
8594
8598
  }
8595
8599
  #play(direction = this.direction()) {
8596
- const nextIndex = this.#carouselState.direction(direction);
8597
- this.#carouselState.state = { activeItemIndex: nextIndex };
8600
+ const nextIndex = this.#carouselService.direction(direction);
8601
+ this.#carouselService.state = { activeItemIndex: nextIndex };
8598
8602
  }
8599
8603
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8600
8604
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.0", type: CarouselControlComponent, isStandalone: true, selector: "c-carousel-control", inputs: { captionInput: { classPropertyName: "captionInput", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keyup": "onKeyUp($event)", "click": "onClick($event)" }, properties: { "attr.role": "role()", "class": "hostClasses()" } }, exportAs: ["cCarouselControl"], ngImport: i0, template: "<ng-content>\n <span [attr.aria-hidden]=\"true\" [class]=\"carouselControlIconClass()\"></span>\n <span class=\"visually-hidden\">{{ caption() }}</span>\n</ng-content>\n" });
@@ -8612,7 +8616,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
8612
8616
  class CarouselIndicatorsComponent {
8613
8617
  #destroyRef = inject(DestroyRef);
8614
8618
  #carouselService = inject(CarouselService);
8615
- #carouselState = inject(CarouselState);
8616
8619
  items = [];
8617
8620
  active = signal(0, /* @ts-ignore */
8618
8621
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
@@ -8626,16 +8629,19 @@ class CarouselIndicatorsComponent {
8626
8629
  ...(ngDevMode ? [{ debugName: "templates" }] : /* istanbul ignore next */ []));
8627
8630
  ngOnInit() {
8628
8631
  this.#carouselService.carouselIndex$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((nextIndex) => {
8629
- this.items = this.#carouselState?.state?.items?.map((item) => item.index) ?? [];
8632
+ this.items = this.#carouselService?.state?.items?.map((item) => item.index) ?? [];
8630
8633
  if ('active' in nextIndex) {
8631
8634
  this.active.set(nextIndex.active ?? 0);
8632
8635
  }
8633
8636
  });
8634
8637
  }
8635
8638
  onClick(index) {
8639
+ if (this.#carouselService.animating()) {
8640
+ return;
8641
+ }
8636
8642
  if (index !== this.active()) {
8637
8643
  const direction = index < this.active() ? 'prev' : 'next';
8638
- this.#carouselState.state = { direction, activeItemIndex: index };
8644
+ this.#carouselService.state = { direction, activeItemIndex: index };
8639
8645
  }
8640
8646
  }
8641
8647
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselIndicatorsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -8647,19 +8653,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
8647
8653
  }], propDecorators: { contentTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TemplateIdDirective), { ...{ descendants: true }, isSignal: true }] }] } });
8648
8654
 
8649
8655
  class CarouselItemComponent {
8656
+ #elementRef = inject((ElementRef));
8650
8657
  #destroyRef = inject(DestroyRef);
8651
8658
  #carouselService = inject(CarouselService);
8659
+ #timeoutId;
8660
+ #rafId;
8652
8661
  index;
8653
8662
  /**
8654
8663
  * @ignore
8655
8664
  */
8656
8665
  activeInput = input(false, { ...(ngDevMode ? { debugName: "activeInput" } : /* istanbul ignore next */ {}), transform: booleanAttribute, alias: 'active' });
8657
- active = linkedSignal({ ...(ngDevMode ? { debugName: "active" } : /* istanbul ignore next */ {}), source: this.activeInput,
8658
- computation: (value) => {
8659
- return value;
8660
- } });
8666
+ active = linkedSignal(this.activeInput, /* @ts-ignore */
8667
+ ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
8661
8668
  /**
8662
- * Time delay before cycling to next item. If -1, uses carousel interval value.
8669
+ * Time delay before cycling to the next item. If -1, uses carousel interval value.
8663
8670
  * @return number
8664
8671
  * @default -1
8665
8672
  */
@@ -8673,102 +8680,119 @@ class CarouselItemComponent {
8673
8680
  role = input('group', /* @ts-ignore */
8674
8681
  ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
8675
8682
  constructor() {
8683
+ this.#elementRef.nativeElement.style.transition = '1ms';
8684
+ }
8685
+ ngOnInit() {
8686
+ console.log('OnInit', this.#carouselService.state.animate);
8676
8687
  this.#carouselService.carouselIndex$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((nextIndex) => {
8677
8688
  if ('active' in nextIndex) {
8689
+ console.log('#carouselService', this.#carouselService.state.animate, this.#elementRef.nativeElement.style.transition);
8690
+ if (this.#carouselService.state.animate && this.#elementRef.nativeElement.style.transition !== '') {
8691
+ this.#timeoutId = setTimeout(() => {
8692
+ this.#elementRef.nativeElement.style.transition = '';
8693
+ this.#timeoutId = undefined;
8694
+ }, 500);
8695
+ }
8696
+ this.prevActive.set(this.active());
8678
8697
  this.active.set(nextIndex.active === this.index);
8679
8698
  }
8680
8699
  });
8700
+ // Clean up timeout on destroy
8701
+ this.#destroyRef.onDestroy(() => {
8702
+ if (this.#timeoutId !== undefined) {
8703
+ clearTimeout(this.#timeoutId);
8704
+ }
8705
+ if (this.#rafId !== undefined) {
8706
+ cancelAnimationFrame(this.#rafId);
8707
+ }
8708
+ });
8681
8709
  }
8710
+ hostClasses = computed(() => {
8711
+ const order = this.orderClassName();
8712
+ const direction = this.directionClassName();
8713
+ return {
8714
+ active: this.activeClass(),
8715
+ [`${order}`]: !!order,
8716
+ [`${direction}`]: !!direction,
8717
+ 'd-none': !this.activeClass() && !order && !direction
8718
+ };
8719
+ }, /* @ts-ignore */
8720
+ ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
8721
+ prevActive = signal(false, /* @ts-ignore */
8722
+ ...(ngDevMode ? [{ debugName: "prevActive" }] : /* istanbul ignore next */ []));
8723
+ activeClass = signal(false, /* @ts-ignore */
8724
+ ...(ngDevMode ? [{ debugName: "activeClass" }] : /* istanbul ignore next */ []));
8725
+ orderClassName = signal('', /* @ts-ignore */
8726
+ ...(ngDevMode ? [{ debugName: "orderClassName" }] : /* istanbul ignore next */ []));
8727
+ directionClassName = signal('', /* @ts-ignore */
8728
+ ...(ngDevMode ? [{ debugName: "directionClassName" }] : /* istanbul ignore next */ []));
8729
+ #activeEffect = effect((OnCleanup) => {
8730
+ const active = this.active();
8731
+ const prevActive = untracked(this.prevActive);
8732
+ const direction = this.#carouselService.state?.direction;
8733
+ this.activeClass.set(prevActive);
8734
+ if (active) {
8735
+ this.orderClassName.set(`carousel-item-${direction}`);
8736
+ }
8737
+ if (prevActive || active) {
8738
+ if (this.#rafId) {
8739
+ cancelAnimationFrame(this.#rafId);
8740
+ }
8741
+ this.#rafId = requestAnimationFrame(() => {
8742
+ // reflow is necessary to proper transition
8743
+ void this.#elementRef.nativeElement.offsetHeight;
8744
+ this.directionClassName.set(`carousel-item-${direction === 'next' ? 'start' : 'end'}`);
8745
+ this.#rafId = undefined;
8746
+ });
8747
+ }
8748
+ const handleTransitionStart = () => {
8749
+ if (active) {
8750
+ this.#carouselService.animating.set(true);
8751
+ }
8752
+ };
8753
+ const handleTransitionEnd = () => {
8754
+ if (active) {
8755
+ this.#carouselService.animating.set(false);
8756
+ }
8757
+ this.directionClassName.set('');
8758
+ this.orderClassName.set('');
8759
+ this.activeClass.set(active);
8760
+ };
8761
+ this.#elementRef.nativeElement.addEventListener('transitionstart', handleTransitionStart);
8762
+ this.#elementRef.nativeElement.addEventListener('transitionend', handleTransitionEnd);
8763
+ OnCleanup(() => {
8764
+ this.#elementRef.nativeElement.removeEventListener('transitionstart', handleTransitionStart);
8765
+ this.#elementRef.nativeElement.removeEventListener('transitionend', handleTransitionEnd);
8766
+ });
8767
+ }, /* @ts-ignore */
8768
+ ...(ngDevMode ? [{ debugName: "#activeEffect" }] : /* istanbul ignore next */ []));
8682
8769
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8683
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.0", type: CarouselItemComponent, isStandalone: true, selector: "c-carousel-item", inputs: { activeInput: { classPropertyName: "activeInput", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, interval: { classPropertyName: "interval", publicName: "interval", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.active": "active()", "attr.role": "role()" }, classAttribute: "carousel-item" }, exportAs: ["cCarouselItem"], ngImport: i0, template: "@if (active()) {\n <ng-content />\n}\n", styles: [":host{display:block}\n"] });
8770
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.0", type: CarouselItemComponent, isStandalone: true, selector: "c-carousel-item", inputs: { activeInput: { classPropertyName: "activeInput", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, interval: { classPropertyName: "interval", publicName: "interval", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()", "attr.role": "role()" }, classAttribute: "carousel-item" }, exportAs: ["cCarouselItem"], ngImport: i0, template: `
8771
+ <!-- @if (this.activeClass() || (this.orderClassName() && this.directionClassName())) {-->
8772
+ <ng-content />
8773
+ <!-- }-->
8774
+ `, isInline: true });
8684
8775
  }
8685
8776
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselItemComponent, decorators: [{
8686
8777
  type: Component,
8687
- args: [{ selector: 'c-carousel-item', exportAs: 'cCarouselItem', host: {
8778
+ args: [{
8779
+ selector: 'c-carousel-item',
8780
+ template: `
8781
+ <!-- @if (this.activeClass() || (this.orderClassName() && this.directionClassName())) {-->
8782
+ <ng-content />
8783
+ <!-- }-->
8784
+ `,
8785
+ exportAs: 'cCarouselItem',
8786
+ host: {
8688
8787
  class: 'carousel-item',
8689
- '[class.active]': 'active()',
8788
+ '[class]': 'hostClasses()',
8690
8789
  '[attr.role]': 'role()'
8691
- }, template: "@if (active()) {\n <ng-content />\n}\n", styles: [":host{display:block}\n"] }]
8790
+ }
8791
+ }]
8692
8792
  }], ctorParameters: () => [], propDecorators: { activeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], interval: [{ type: i0.Input, args: [{ isSignal: true, alias: "interval", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }] } });
8693
8793
 
8694
- function toSlideLeft(fromState, toState) {
8695
- return toState.left === true && toState.type === 'slide';
8696
- }
8697
- function toSlideRight(fromState, toState) {
8698
- return toState.left === false && toState.type === 'slide';
8699
- }
8700
- function toFadeLeft(fromState, toState) {
8701
- return toState.left === true && toState.type !== 'slide';
8702
- }
8703
- function toFadeRight(fromState, toState) {
8704
- return toState.left === false && toState.type !== 'slide';
8705
- }
8706
- const slideAnimationLeft = animation(group([
8707
- query(':leave', [
8708
- animate('0.6s ease-in-out', style({
8709
- transform: 'translateX(-100%)'
8710
- }))
8711
- ], { optional: true }),
8712
- query(':enter', [
8713
- style({
8714
- transform: 'translateX(100%)'
8715
- }),
8716
- animate('0.6s ease-in-out', style('*'))
8717
- ], { optional: true })
8718
- ]));
8719
- const slideAnimationRight = animation(group([
8720
- query(':enter', [
8721
- style({
8722
- transform: 'translateX(-100%)'
8723
- }),
8724
- animate('0.6s ease-in-out', style('*'))
8725
- ], { optional: true }),
8726
- query(':leave', [
8727
- animate('0.6s ease-in-out', style({
8728
- transform: 'translateX(100%)'
8729
- }))
8730
- ], { optional: true })
8731
- ]));
8732
- const fadeAnimationLeft = animation(group([
8733
- query(':leave', [
8734
- animate('0.9s ease-in-out', style({
8735
- zIndex: 0,
8736
- opacity: 0
8737
- }))
8738
- ], { optional: true }),
8739
- query(':enter', [
8740
- style({
8741
- zIndex: 1,
8742
- opacity: 1
8743
- }),
8744
- animate('0.6s ease-in-out', style('*'))
8745
- ], { optional: true })
8746
- ]));
8747
- const fadeAnimationRight = animation(group([
8748
- query(':enter', [
8749
- style({
8750
- zIndex: 1,
8751
- opacity: 1
8752
- }),
8753
- animate('0.6s ease-in-out', style('*'))
8754
- ], { optional: true }),
8755
- query(':leave', [
8756
- animate('0.9s ease-in-out', style({
8757
- zIndex: 0,
8758
- opacity: 0
8759
- }))
8760
- ], { optional: true })
8761
- ]));
8762
- const carouselPlay = trigger('carouselPlay', [
8763
- state('*', style({ transform: 'translateX(0)', display: 'block', opacity: 1 })),
8764
- transition(toFadeLeft, useAnimation(fadeAnimationLeft)),
8765
- transition(toFadeRight, useAnimation(fadeAnimationRight)),
8766
- transition(toSlideLeft, useAnimation(slideAnimationLeft)),
8767
- transition(toSlideRight, useAnimation(slideAnimationRight))
8768
- ]);
8769
-
8770
8794
  class CarouselInnerComponent {
8771
- #carouselState = inject(CarouselState);
8795
+ #carouselService = inject(CarouselService);
8772
8796
  activeIndex = signal(undefined, /* @ts-ignore */
8773
8797
  ...(ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []));
8774
8798
  animate = signal(true, /* @ts-ignore */
@@ -8796,7 +8820,7 @@ class CarouselInnerComponent {
8796
8820
  }
8797
8821
  ngAfterContentChecked() {
8798
8822
  this.setItems();
8799
- const state = this.#carouselState?.state;
8823
+ const state = this.#carouselService?.state;
8800
8824
  const nextIndex = state?.activeItemIndex;
8801
8825
  const nextDirection = state?.direction;
8802
8826
  if (this.activeIndex() !== nextIndex) {
@@ -8811,18 +8835,16 @@ class CarouselInnerComponent {
8811
8835
  const contentItems = this.contentItems();
8812
8836
  if (this.#prevContentItems() !== contentItems) {
8813
8837
  this.#prevContentItems.set([...contentItems]);
8814
- this.#carouselState.setItems(contentItems);
8838
+ this.#carouselService.setItems(contentItems);
8815
8839
  }
8816
8840
  }
8817
8841
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselInnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8818
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.0", type: CarouselInnerComponent, isStandalone: true, selector: "c-carousel-inner", host: { properties: { "@carouselPlay": "slideType()", "@.disabled": "!animate()", "attr.aria-live": "ariaLive()" }, classAttribute: "carousel-inner" }, queries: [{ propertyName: "contentItems", predicate: CarouselItemComponent, isSignal: true }], ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{display:block}\n"], animations: [carouselPlay] });
8842
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.0", type: CarouselInnerComponent, isStandalone: true, selector: "c-carousel-inner", host: { properties: { "attr.aria-live": "ariaLive()" }, classAttribute: "carousel-inner" }, queries: [{ propertyName: "contentItems", predicate: CarouselItemComponent, isSignal: true }], ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{display:block}\n"] });
8819
8843
  }
8820
8844
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselInnerComponent, decorators: [{
8821
8845
  type: Component,
8822
- args: [{ selector: 'c-carousel-inner', animations: [carouselPlay], template: '<ng-content />', host: {
8846
+ args: [{ selector: 'c-carousel-inner', template: '<ng-content />', host: {
8823
8847
  class: 'carousel-inner',
8824
- '[@carouselPlay]': 'slideType()',
8825
- '[@.disabled]': '!animate()',
8826
8848
  '[attr.aria-live]': 'ariaLive()'
8827
8849
  }, styles: [":host{display:block}\n"] }]
8828
8850
  }], propDecorators: { contentItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => CarouselItemComponent), { isSignal: true }] }] } });
@@ -8843,7 +8865,7 @@ class CarouselModule {
8843
8865
  CarouselIndicatorsComponent,
8844
8866
  CarouselInnerComponent,
8845
8867
  CarouselItemComponent] });
8846
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselModule, providers: [CarouselService, CarouselState, CarouselConfig] });
8868
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselModule, providers: [CarouselService, CarouselConfig] });
8847
8869
  }
8848
8870
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: CarouselModule, decorators: [{
8849
8871
  type: NgModule,
@@ -8856,7 +8878,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
8856
8878
  CarouselInnerComponent,
8857
8879
  CarouselItemComponent
8858
8880
  ],
8859
- providers: [CarouselService, CarouselState, CarouselConfig],
8881
+ providers: [CarouselService, CarouselConfig],
8860
8882
  exports: [
8861
8883
  CarouselComponent,
8862
8884
  CarouselCaptionComponent,
@@ -20213,85 +20235,116 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
20213
20235
  }]
20214
20236
  }] });
20215
20237
 
20238
+ const getTransitionDurationFromElement = (element) => {
20239
+ if (!element) {
20240
+ return 0;
20241
+ }
20242
+ // Get transition-duration of the element
20243
+ let { transitionDuration, transitionDelay } = window.getComputedStyle(element);
20244
+ const floatTransitionDuration = Number.parseFloat(transitionDuration);
20245
+ const floatTransitionDelay = Number.parseFloat(transitionDelay);
20246
+ // Return 0 if element or transition duration is not found
20247
+ if (!floatTransitionDuration && !floatTransitionDelay) {
20248
+ return 0;
20249
+ }
20250
+ // If multiple durations are defined, take the first
20251
+ transitionDuration = transitionDuration.split(',')[0];
20252
+ transitionDelay = transitionDelay.split(',')[0];
20253
+ return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * 1000;
20254
+ };
20255
+
20216
20256
  class TabPanelComponent {
20217
- tabsService = inject(TabsService);
20257
+ #tabsService = inject(TabsService);
20258
+ #elementRef = inject(ElementRef);
20218
20259
  /**
20219
20260
  * aria-labelledby attribute
20220
- * @type string
20261
+ * @return string
20221
20262
  * @default undefined
20222
20263
  */
20223
20264
  ariaLabelledBy = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabelledBy" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
20224
20265
  /**
20225
20266
  * Element id attribute
20226
- * @type string
20267
+ * @return string
20227
20268
  * @default undefined
20228
20269
  */
20229
20270
  id = input(/* @ts-ignore */
20230
20271
  ...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
20231
20272
  /**
20232
20273
  * Item key.
20233
- * @type string | number
20274
+ * @return string | number
20234
20275
  * @required
20235
20276
  */
20236
20277
  itemKey = input.required(/* @ts-ignore */
20237
20278
  ...(ngDevMode ? [{ debugName: "itemKey" }] : /* istanbul ignore next */ []));
20238
20279
  /**
20239
20280
  * Element role.
20240
- * @type string
20281
+ * @return string
20241
20282
  * @default 'tabpanel'
20242
20283
  */
20243
20284
  role = input('tabpanel', /* @ts-ignore */
20244
20285
  ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
20245
20286
  /**
20246
20287
  * tabindex attribute.
20247
- * @type number
20288
+ * @return number
20248
20289
  * @default 0
20249
20290
  */
20250
20291
  tabindex = input(0, { ...(ngDevMode ? { debugName: "tabindex" } : /* istanbul ignore next */ {}), transform: numberAttribute });
20251
20292
  /**
20252
20293
  * Enable fade in transition.
20253
- * @type boolean
20294
+ * @return boolean
20254
20295
  * @default true
20255
20296
  */
20256
20297
  transition = input(true, /* @ts-ignore */
20257
20298
  ...(ngDevMode ? [{ debugName: "transition" }] : /* istanbul ignore next */ []));
20258
20299
  /**
20259
20300
  * visible change output
20260
- * @type OutputEmitterRef<VisibleChangeEvent>
20301
+ * @return VisibleChangeEvent
20261
20302
  */
20262
20303
  visibleChange = output();
20263
20304
  show = signal(false, /* @ts-ignore */
20264
20305
  ...(ngDevMode ? [{ debugName: "show" }] : /* istanbul ignore next */ []));
20265
20306
  visible = computed(() => {
20266
- const visible = this.tabsService.activeItemKey() === this.itemKey() && !this.tabsService.activeItem()?.disabled;
20307
+ const visible = this.#tabsService.activeItemKey() === this.itemKey() && !this.#tabsService.activeItem()?.disabled;
20267
20308
  this.visibleChange?.emit({ itemKey: this.itemKey(), visible });
20268
20309
  return visible;
20269
20310
  }, /* @ts-ignore */
20270
20311
  ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
20271
- propId = computed(() => this.id() ?? `${this.tabsService.id()}-panel-${this.itemKey()}`, /* @ts-ignore */
20312
+ #transitionDuration = 0;
20313
+ #visibleEffect = effect(() => {
20314
+ const isVisible = this.visible();
20315
+ const hasTransition = this.transition();
20316
+ if (!hasTransition) {
20317
+ this.show.set(isVisible);
20318
+ }
20319
+ else {
20320
+ requestAnimationFrame(() => {
20321
+ if (this.#transitionDuration === 0) {
20322
+ this.#transitionDuration = getTransitionDurationFromElement(this.#elementRef.nativeElement);
20323
+ }
20324
+ setTimeout(() => this.show.set(isVisible), this.#transitionDuration || 0);
20325
+ });
20326
+ }
20327
+ }, /* @ts-ignore */
20328
+ ...(ngDevMode ? [{ debugName: "#visibleEffect" }] : /* istanbul ignore next */ []));
20329
+ propId = computed(() => this.id() ?? `${this.#tabsService.id()}-panel-${this.itemKey()}`, /* @ts-ignore */
20272
20330
  ...(ngDevMode ? [{ debugName: "propId" }] : /* istanbul ignore next */ []));
20273
- attrAriaLabelledBy = computed(() => this.ariaLabelledBy() ?? `${this.tabsService.id()}-tab-${this.itemKey()}`, /* @ts-ignore */
20331
+ attrAriaLabelledBy = computed(() => this.ariaLabelledBy() ?? `${this.#tabsService.id()}-tab-${this.itemKey()}`, /* @ts-ignore */
20274
20332
  ...(ngDevMode ? [{ debugName: "attrAriaLabelledBy" }] : /* istanbul ignore next */ []));
20275
20333
  hostClasses = computed(() => ({
20276
20334
  'tab-pane': true,
20277
- active: this.show(),
20335
+ active: this.visible(),
20278
20336
  fade: this.transition(),
20279
20337
  show: this.show(),
20280
- invisible: this.tabsService.activeItem()?.disabled
20338
+ invisible: this.#tabsService.activeItem()?.disabled
20281
20339
  }), /* @ts-ignore */
20282
20340
  ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
20283
- onAnimationDone($event) {
20284
- this.show.set(this.visible());
20341
+ onTransitionEnd($event) {
20342
+ if ($event.propertyName === 'opacity' && $event.target === this.#elementRef.nativeElement) {
20343
+ this.show.set(this.visible());
20344
+ }
20285
20345
  }
20286
20346
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: TabPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20287
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.0", type: TabPanelComponent, isStandalone: true, selector: "c-tab-panel", inputs: { ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, itemKey: { classPropertyName: "itemKey", publicName: "itemKey", isSignal: true, isRequired: true, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, tabindex: { classPropertyName: "tabindex", publicName: "tabindex", isSignal: true, isRequired: false, transformFunction: null }, transition: { classPropertyName: "transition", publicName: "transition", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, host: { listeners: { "@fadeInOut.done": "onAnimationDone($event)" }, properties: { "class": "hostClasses()", "tabindex": "visible() ? tabindex() : -1", "attr.aria-labelledby": "attrAriaLabelledBy()", "id": "propId()", "attr.role": "role()", "@.disabled": "!transition()", "@fadeInOut": "visible() ? \"show\" : \"hide\"" } }, exportAs: ["cTabPanel"], ngImport: i0, template: '<ng-content />', isInline: true, animations: [
20288
- trigger('fadeInOut', [
20289
- state('show', style({ opacity: 1 })),
20290
- state('hide', style({ opacity: 0 })),
20291
- state('void', style({ opacity: 1 })),
20292
- transition('* => *', [query('@*', [animateChild()], { optional: true }), animate('150ms linear')])
20293
- ])
20294
- ] });
20347
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.0", type: TabPanelComponent, isStandalone: true, selector: "c-tab-panel", inputs: { ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, itemKey: { classPropertyName: "itemKey", publicName: "itemKey", isSignal: true, isRequired: true, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, tabindex: { classPropertyName: "tabindex", publicName: "tabindex", isSignal: true, isRequired: false, transformFunction: null }, transition: { classPropertyName: "transition", publicName: "transition", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, host: { listeners: { "transitionend": "onTransitionEnd($event)" }, properties: { "class": "hostClasses()", "tabindex": "visible() ? tabindex() : -1", "attr.aria-labelledby": "attrAriaLabelledBy()", "id": "propId()", "attr.role": "role()" } }, exportAs: ["cTabPanel"], ngImport: i0, template: '<ng-content />', isInline: true });
20295
20348
  }
20296
20349
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: TabPanelComponent, decorators: [{
20297
20350
  type: Component,
@@ -20305,18 +20358,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
20305
20358
  '[attr.aria-labelledby]': 'attrAriaLabelledBy()',
20306
20359
  '[id]': 'propId()',
20307
20360
  '[attr.role]': 'role()',
20308
- '[@.disabled]': '!transition()',
20309
- '[@fadeInOut]': 'visible() ? "show" : "hide"',
20310
- '(@fadeInOut.done)': 'onAnimationDone($event)'
20311
- },
20312
- animations: [
20313
- trigger('fadeInOut', [
20314
- state('show', style({ opacity: 1 })),
20315
- state('hide', style({ opacity: 0 })),
20316
- state('void', style({ opacity: 1 })),
20317
- transition('* => *', [query('@*', [animateChild()], { optional: true }), animate('150ms linear')])
20318
- ])
20319
- ]
20361
+ '(transitionend)': 'onTransitionEnd($event)'
20362
+ }
20320
20363
  }]
20321
20364
  }], propDecorators: { ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], itemKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemKey", required: true }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], tabindex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabindex", required: false }] }], transition: [{ type: i0.Input, args: [{ isSignal: true, alias: "transition", required: false }] }], visibleChange: [{ type: i0.Output, args: ["visibleChange"] }] } });
20322
20365