UNPKG

@ngx-dummy/select-simple

Version:

A simple select component to use in Angular / Ionic projects .. (WIP) and sample app using it

736 lines (729 loc) 50.3 kB
import * as i0 from '@angular/core'; import { EventEmitter, Component, ChangeDetectionStrategy, Input, Output, SecurityContext, forwardRef, TemplateRef, ViewEncapsulation, ViewChild, ContentChildren, NgModule } from '@angular/core'; import * as i3 from '@angular/common'; import { CommonModule } from '@angular/common'; import { NG_VALUE_ACCESSOR, NG_VALIDATORS, Validators, FormsModule } from '@angular/forms'; import * as i1 from '@angular/platform-browser'; import { BehaviorSubject, fromEvent, of } from 'rxjs'; import { shareReplay, switchMap, takeUntil, debounceTime } from 'rxjs/operators'; /* eslint-disable @angular-eslint/no-host-metadata-property */ class SelectItemComponent { constructor() { this.option = undefined; this.selected = false; this.disabled = false; this.visible = true; this.itemBg = 'transparent'; this.color = '#ddd'; this.itemSize = 25; this.label = null; this.optionClick = new EventEmitter(); this.height = '100%'; this.visibility = 'hidden'; this.caption = 'Empty'; } ngOnChanges(changes) { Object.entries(changes).forEach(([changeKey, changeVal]) => { if (changeVal.currentValue === changeVal.previousValue) return; if (changeKey === 'itemSize') { this.height = (typeof this.itemSize === 'number' ? `${this.itemSize}px` : this.itemSize) ?? '100%'; } if (changeKey === 'visible') { this.visibility = this.visible ? 'visible' : 'hidden'; } if (changeKey === 'option' || changeKey === 'label') { this.caption = this.label?.trim().length ? this.label : 'Empty'; } }); } onOptionClick($event) { this.optionClick.emit({ baseEvent: $event, option: this.option ?? (this.label || 'Nothing selected'), }); } } SelectItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SelectItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); SelectItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: SelectItemComponent, selector: "ngxd-select-item", inputs: { option: "option", selected: "selected", disabled: "disabled", visible: "visible", itemBg: "itemBg", color: "color", itemSize: "itemSize", label: "label", template: "template" }, outputs: { optionClick: "optionClick" }, host: { listeners: { "click": "onOptionClick($event)" }, properties: { "attr.role": "\"option\"", "attr.disabled": "disabled", "ngStyle": "{ \"height\": \"height\", \"visibility\": \"visibility\", \"background-color\": \"itemBg\", \"color\": \"color\" }", "class.select-item": "true", "class.item-highlight": "selected", "class.item-disabled": "disabled", "ngClass": "option?.styleClass" } }, usesOnChanges: true, ngImport: i0, template: ` <ng-container *ngIf="template; else simpleItemTmpl"> <ng-container *ngTemplateOutlet="template; context: { $implicit: option }"></ng-container> </ng-container> <ng-template #simpleItemTmpl>{{ caption }}</ng-template> `, isInline: true, styles: [":host{display:block;padding:.1rem;.item-disabled {cursor: not-allowed !important; pointer-events: none; color: var(--ngxd-disabled); -webkit-user-select: none; user-select: none;} .item-highlight:not(.item-disabled) {-webkit-user-select: none; user-select: none; cursor: pointer; pointer-events: all;}}\n"], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SelectItemComponent, decorators: [{ type: Component, args: [{ selector: 'ngxd-select-item', styles: [ ` :host { display: block; padding: 0.1rem; .item-disabled { cursor: not-allowed !important; pointer-events: none; color: var(--ngxd-disabled); user-select: none; } .item-highlight:not(.item-disabled) { user-select: none; cursor: pointer; pointer-events: all; } } `, ], template: ` <ng-container *ngIf="template; else simpleItemTmpl"> <ng-container *ngTemplateOutlet="template; context: { $implicit: option }"></ng-container> </ng-container> <ng-template #simpleItemTmpl>{{ caption }}</ng-template> `, host: { '[attr.role]': '"option"', '[attr.disabled]': 'disabled', '[ngStyle]': '{ "height": "height", "visibility": "visibility", "background-color": "itemBg", "color": "color" }', '[class.select-item]': 'true', '[class.item-highlight]': 'selected', '[class.item-disabled]': 'disabled', '[ngClass]': 'option?.styleClass', '(click)': 'onOptionClick($event)', }, changeDetection: ChangeDetectionStrategy.OnPush, }] }], propDecorators: { option: [{ type: Input }], selected: [{ type: Input }], disabled: [{ type: Input }], visible: [{ type: Input }], itemBg: [{ type: Input }], color: [{ type: Input }], itemSize: [{ type: Input }], label: [{ type: Input }], template: [{ type: Input }], optionClick: [{ type: Output }] } }); /*! * @ngx-dummy/select-Simple library * Simple select created for angular / ionic projects. * https://github.com/ngx-dummy/select-simple * * Copyright Vladimir Ovsyukov <ovsyukov@yandex.com> * Published under MIT License */ const imgBase64ToBlob = (Base64Image, imageType = 'image/png') => { const parts = Base64Image.split(';base64,'); const decodedData = window.atob(parts[1]); const uInt8Array = new Uint8Array(decodedData.length); for (let i = 0; i < decodedData.length; ++i) { uInt8Array[i] = decodedData.charCodeAt(i); } return new Blob([uInt8Array], { type: imageType }); }; const svgToBase64src = (rawSvg) => 'data:image/svg+xml;base64,' + btoa(rawSvg); const prepRes = (item, sanitizer) => sanitizer.bypassSecurityTrustResourceUrl(item); const sanitizeHTML = (item, sanitizer) => sanitizer.sanitize(SecurityContext.HTML, item); const getSvgSafeRes = (file, sanitizer) => prepRes(svgToBase64src(file), sanitizer); const getPngSafeRes = (file, sanitizer) => prepRes(URL.createObjectURL(imgBase64ToBlob(file)), sanitizer); const blobToSafeRes = (blob, sanitizer) => prepRes(URL.createObjectURL(blob), sanitizer); /** * * @param data - option value (could be simple string or complex object to resolve) * @param field - the key (or complex lookup object key) of data object to resolve value by * @returns resolved single option value (Input for SelectItem) */ const resolveFieldData = (data, field) => { if (isEmpty(data)) return null; if (isString(data)) return data; if (isSelectItem(data)) { if (data['label']) return data['label']; if (data['value']) data = data['value']; } if (field) { if (isString(field) && field.indexOf('.') === -1) { return data[field]; } else if (isString(field)) { const fields = field.split('.'); let value = data; for (let i = 0, len = fields.length; i < len; ++i) { if (value == null) { return null; } value = value[fields[i]]; } return resolveFieldData(value); } } else { return resolveFieldData(Object.values(data)[0]); } return null; }; const isValue = (obj) => obj !== undefined && obj !== null; const isEmpty = (obj) => !isValue(obj); const isString = (obj) => typeof obj === 'string'; const isObject = (obj) => typeof obj !== 'string' && !Array.isArray(obj) && typeof obj === 'object'; const isSelectItem = (obj) => (isObject(obj) && !!obj.value) || !!obj.label; const areEqual = (obj1, obj2, field) => { if (isEmpty(obj1) || isEmpty(obj2)) return false; if (isString(obj1) && isString(obj2)) return obj1 === obj2; if (field) return resolveFieldData(obj1, field) === resolveFieldData(obj2, field); return JSON.stringify(obj1) === JSON.stringify(obj2); }; var OptionKeyboardEventHandleKeys; (function (OptionKeyboardEventHandleKeys) { OptionKeyboardEventHandleKeys["ArrowDown"] = "ArrowDown"; OptionKeyboardEventHandleKeys["Down"] = "Down"; OptionKeyboardEventHandleKeys["ArrowUp"] = "ArrowUp"; OptionKeyboardEventHandleKeys["Enter"] = "Enter"; OptionKeyboardEventHandleKeys["Escape"] = "Escape"; OptionKeyboardEventHandleKeys["Esc"] = "Esc"; OptionKeyboardEventHandleKeys["Up"] = "Up"; OptionKeyboardEventHandleKeys["Tab"] = "Tab"; OptionKeyboardEventHandleKeys["Space"] = " "; })(OptionKeyboardEventHandleKeys || (OptionKeyboardEventHandleKeys = {})); /*! * @ngx-dummy/select-Simple library * Simple select created for angular / ionic projects. * https://github.com/ngx-dummy/select-simple * * Copyright Vladimir Ovsyukov <ovsyukov@yandex.com> * Published under MIT License */ const arrow_down = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#454" width="48px" height="48px"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z"/><path d="M0 0h24v24H0V0z" fill="none"/></svg>'; const SELECT_VALUE_ACCESSOR_PROVIDER = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectComponent), multi: true, }; const NG_VALIDATORS_PROVIDER = { provide: NG_VALIDATORS, useExisting: forwardRef(() => SelectComponent), multi: true, }; class SelectComponent { constructor( // @Self() @Optional() ngControl: NgControl, el, renderer, cd, sanitizer, zone) { this.el = el; this.renderer = renderer; this.cd = cd; this.sanitizer = sanitizer; this.zone = zone; this.name = null; /** set additional custom classList to the Select component's panel */ this.panelStyleClass = 'panel'; /** set additional custom classList to the Select component */ this.styleClass = ''; this.readonly = false; this.required = false; /** whether to display reset button in the end of the options */ this.resetBtn = false; /** whether to display search field */ this.searchField = false; /** whether to set auto focus to component */ this.autofocus = false; /** default component caption (panel caption) */ this.placeholder = undefined; /** string key of the Options input (in case of complex object) of kind: 'key' / 'key.subkey'... if set, would resolve the options' captions */ this.optionLabelKey = undefined; this.selectIconClass = ''; this.tabindex = 0; this.onChange = new EventEmitter(); this.onClick = new EventEmitter(); this.onShow = new EventEmitter(); this.onHide = new EventEmitter(); this.onFocus = new EventEmitter(); this.onBlur = new EventEmitter(); this.trigger_icon = getSvgSafeRes(arrow_down, this.sanitizer); this._overlayVisible$$ = new BehaviorSubject(false); this._optionsToDisplay$$ = new BehaviorSubject([]); this._headerStyle = {}; this._options = []; this._disabled = false; this._panelStyle = { backgroundColor: 'rgba(1, 1, 1, 0.45)', color: '#fff', border: '1px solid var(--ngxd-primary-color)', borderRadius: '0.2rem', boxShadow: '2px 5px 10px rgba(55, 55, 55, 0.8)', }; this.overlayVisible$ = this._overlayVisible$$.asObservable().pipe(shareReplay({ refCount: true, bufferSize: 1, })); this.optionsToDisplay$ = this._optionsToDisplay$$.asObservable().pipe(shareReplay({ refCount: true, bufferSize: 1, })); this.selectedItemTemplate = null; this.selectedOption = null; this.selectedItemIndex = 0; this.hover = false; this.optionsChanged = false; this.focused = false; this.onModelChange = () => void 0; this.onModelTouched = () => void 0; // if (ngControl) { // ngControl.valueAccessor = this; // } } onHostFocus() { console.log('Focus, prev value :: ', this.prevValue); } onHostBlur() { this.prevValue = this.selectedOption || null; console.log('BLUR, prev val :: ', this.prevValue); } /** * @property * @param {BasicStylesSet} headStyleObj - styles to override the defaults of Select component panel */ set headerStyle(headStyleObj) { if (!!headStyleObj && !!Object.keys(headStyleObj).length) { this._headerStyle = { ...this._headerStyle, ...headStyleObj, }; } } get headerStyle() { return this._headerStyle; } set panelStyle(stylesObj) { if (!!stylesObj && !!Object.keys(stylesObj).length) { this._panelStyle = { ...this._panelStyle, ...stylesObj, }; } } get panelStyle() { return this._panelStyle; } // get options(): IOption[] { // return this._options; // } set options(val) { this._options = val; // this.optionsToDisplay = this._options; this._optionsToDisplay$$.next(val); this.updateSelectedOption(); } get disabled() { return this._disabled; } set disabled(_disabled) { if (_disabled) { this.focused = false; if (this._overlayVisible$$.value) this.hide(); } this._disabled = _disabled; if (!this.cd.destroyed) { this.cd.detectChanges(); } } ngOnChanges(changes) { Object.entries(changes).forEach(([changeKey, change]) => { if (changeKey === 'templates') { if (change.currentValue === change.previousValue) return; // if (!change.isFirstChange()) return; this.openerBtnTemplate = change.currentValue['openerBtnTemplate'] || this.defaultOpenerTemplate; this.itemsListDefaultTmpl = change.currentValue['itemslistTemplate'] || this.itemsListDefaultTmpl; this.cd.markForCheck(); } }); } ngAfterContentInit() { this.openerBtnTemplate = this.templates?.openerBtnTemplate ? this.templates.openerBtnTemplate : this.defaultOpenerTemplate; this.itemsListDefaultTmpl = this.templates?.itemslistTemplate ? this.templates.itemslistTemplate : this.itemsListDefaultTmpl; if (this.templates?.selectedItemTemplate) { this.selectedItemTemplate = this.templates.selectedItemTemplate; } this.projectedItems?.forEach((itemCmp) => { itemCmp.optionClick.subscribe((e) => this.onItemClick(e)); }); fromEvent(document, 'click') .pipe(switchMap((ev) => { const iconContainer = ev.target?.classList?.contains('select-trigger-icon'); if (this.isOutsideClicked(ev) && !iconContainer) { this.cd.markForCheck(); this.hide(); } return of(ev); })) .subscribe(); // this.updateSelectedOption(); } onInputFocus($event) { this.focused = true; this.onFocus.emit($event); } onInputBlur($event) { this.focused = false; this.onBlur.emit($event); } get label() { return this.selectedOption ? this.getOptionLabel(this.selectedOption) : this.placeholder?.length ? this.placeholder : this.options?.length ? this.getOptionLabel(this.options[0]) : null; } getOptionLabel(option) { return resolveFieldData(option, this.optionLabelKey); } getOptionValue(option) { if (!option) return null; return resolveFieldData(option); } isOptionDisabled(option) { return isString(option) ? false : !!option?.disabled || false; } onItemClick({ option, baseEvent }) { if (this.readonly) { console.log('DropDown is READONLY'); return; } if (!option) return; if (!this.isOptionDisabled(option)) { this.selectItem(baseEvent, option); } setTimeout(() => { this.hide(); }, 150); } selectItem($event, option, update = true) { // if (this.selectedOption != option) { this.selectedOption = option; if (update) { this.value = this.getOptionValue(option); this.onModelChange(this.value); this.onChange.emit({ originalEvent: $event, value: this.value, }); } // } } writeValue(value) { this.value = value; this.updateSelectedOption(); this.cd.markForCheck(); } validate({ value }) { if (this.required && !value) return { invalid: true }; const isNotValid = this.required && !value && !!Validators.required(value); return (isNotValid && { invalid: true, }); } updateSelectedOption() { // this.selectedOption = this.findOption(val, this.optionsToDisplay); if (!this.placeholder && !this.selectedOption && this._optionsToDisplay$$.value?.length) { this.selectedOption = this._optionsToDisplay$$.value[0]; } } registerOnChange(fn) { this.onModelChange = fn; } registerOnTouched(fn) { this.onModelTouched = fn; } setDisabledState(val) { this.disabled = val; this.cd.markForCheck(); } onMouseclick($event) { if (this.disabled) { return; } if (!this.readonly) { this.onClick.emit($event); } if (this._overlayVisible$$.value) this.hide(); else this.show(); this.cd.detectChanges(); } reset() { this.selectItem(new MouseEvent('click'), null); } isOutsideClicked(event) { return !(this.el.nativeElement.isSameNode(event.target) || this.el.nativeElement.contains(event.target)); } show() { this._overlayVisible$$.next(true); this.onShow.emit(true); if (!this.searchField || !this._optionsToDisplay$$.value?.length) return; setTimeout(() => { const searchFieldInputEl = this.el.nativeElement?.querySelector('.search-term__container .search-term'); if (!searchFieldInputEl) return; searchFieldInputEl?.focus(); fromEvent(searchFieldInputEl, 'input') .pipe(takeUntil(this.onHide), debounceTime(200), switchMap(($event) => of($event.target.value))) .subscribe((searchTerm) => this._optionsToDisplay$$.next(searchTerm.length ? this._options?.filter((opt) => { const optionValue = this.getOptionValue(opt); const found = !!optionValue?.toLowerCase().includes(searchTerm.toLowerCase()); return found; }) : this._options)); }); } hide() { this.onHide.emit(false); this._overlayVisible$$.next(false); this._optionsToDisplay$$.next(this._options); } onKeydown($event) { if (this.isOutsideClicked($event)) { console.log('Clicked outside of the component ...'); return; } if (this.readonly || !this._optionsToDisplay$$.value?.length) { return; } switch ($event.key) { case OptionKeyboardEventHandleKeys.ArrowDown: case OptionKeyboardEventHandleKeys.Down: { if (!this._overlayVisible$$.value && $event.altKey) { this.show(); } else { this.selectedItemIndex = this.selectedOption ? this.findOptionIndex(this.getOptionValue(this.selectedOption), this._optionsToDisplay$$.value) : -1; const nextEnabledOption = this.findNextEnabledOption(this.selectedItemIndex); if (nextEnabledOption) { this.selectItem($event, nextEnabledOption, false); } } $event.preventDefault(); break; } case OptionKeyboardEventHandleKeys.ArrowUp: case OptionKeyboardEventHandleKeys.Up: { this.selectedItemIndex = this.selectedOption ? this.findOptionIndex(this.getOptionValue(this.selectedOption), this._optionsToDisplay$$.value) : -1; const prevEnabledOption = this.findPrevEnabledOption(this.selectedItemIndex); if (prevEnabledOption) { this.selectItem($event, prevEnabledOption, false); } $event.preventDefault(); break; } case OptionKeyboardEventHandleKeys.Space: { if (!this._overlayVisible$$.value) { this.show(); } else { this.hide(); } $event.preventDefault(); break; } case OptionKeyboardEventHandleKeys.Enter: { this.hide(); this.prevValue = this.selectedOption; this.selectItem($event, this.selectedOption, true); $event.preventDefault(); break; } case OptionKeyboardEventHandleKeys.Escape: case OptionKeyboardEventHandleKeys.Esc: { this.selectItem($event, this.prevValue); this.hide(); $event.preventDefault(); break; } case OptionKeyboardEventHandleKeys.Tab: { this.hide(); break; } } } findOptionIndex(val, opts) { if (!val?.trim().length) return -1; if (!opts?.length) return -1; let index = -1; for (let i = 0; i < opts.length; i++) { if (areEqual(val, this.getOptionValue(opts[i]))) { index = i; break; } } return index; } findPrevEnabledOption(index) { let prevEnabledOption; if (this._optionsToDisplay$$.value?.length) { for (let i = index - 1; 0 <= i; i--) { const option = this._optionsToDisplay$$.value[i]; if (option?.disabled) { continue; } else { prevEnabledOption = option; break; } } if (!prevEnabledOption) { for (let i = this._optionsToDisplay$$.value?.length - 1; i >= index; i--) { const option = this._optionsToDisplay$$.value?.[i]; if (this.isOptionDisabled(option)) { continue; } else { prevEnabledOption = option; break; } } } } return prevEnabledOption; } findNextEnabledOption(index) { let nextEnabledOption; if (this._optionsToDisplay$$.value?.length) { for (let i = index + 1; i < this._optionsToDisplay$$.value?.length; i++) { const option = this._optionsToDisplay$$.value?.[i]; if (this.isOptionDisabled(option)) { continue; } else { nextEnabledOption = option; break; } } if (!nextEnabledOption) { for (let i = 0; i < index; i++) { const option = this._optionsToDisplay$$.value?.[i]; if (this.isOptionDisabled(option)) { continue; } else { nextEnabledOption = option; break; } } } } return nextEnabledOption; } } SelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.DomSanitizer }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); SelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: SelectComponent, selector: "ngxd-select", inputs: { templates: "templates", name: "name", panelStyleClass: "panelStyleClass", styleClass: "styleClass", readonly: "readonly", required: "required", resetBtn: "resetBtn", searchField: "searchField", autofocus: "autofocus", placeholder: "placeholder", optionLabelKey: "optionLabelKey", selectIconClass: "selectIconClass", tabindex: "tabindex", itemSize: "itemSize", headerStyle: "headerStyle", panelStyle: "panelStyle", options: "options", disabled: "disabled" }, outputs: { onChange: "onChange", onClick: "onClick", onShow: "onShow", onHide: "onHide", onFocus: "onFocus", onBlur: "onBlur" }, host: { listeners: { "blur": "onHostBlur($event)", "focus": "onHostFocus($event)", "keydown": "onKeydown($event)", "click": "onMouseclick($event)" }, properties: { "class": "styleClass", "style": "headerStyle", "class.wrapper-focus": "focused || overlayVisible", "class.select": "true", "class.disabled": "disabled", "class.focus": "focused || overlayVisible", "class.select-open": "overlayVisible", "attr.tabIndex": "tabindex", "attr.autofocus": "autofocus", "attr.name": "name" } }, providers: [SELECT_VALUE_ACCESSOR_PROVIDER, NG_VALIDATORS_PROVIDER], queries: [{ propertyName: "projectedItems", predicate: SelectItemComponent, descendants: true }], viewQueries: [{ propertyName: "defaultOpenerTemplate", first: true, predicate: ["defaultSelectIconTmpl"], descendants: true, read: TemplateRef, static: true }, { propertyName: "itemsListDefaultTmpl", first: true, predicate: ["itemsListDefaultTmpl"], descendants: true, read: TemplateRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<span *ngIf=\"!!label; else NoLabelTmpl\">\n\t<ng-container *ngIf=\"!selectedItemTemplate; else selectedItemSelectedTmpl\">{{\n\t\tlabel\n\t}}</ng-container>\n</span>\n\n<div\n\tclass=\"select-trigger\"\n\trole=\"button\"\n\t[attr.aria-expanded]=\"overlayVisible$ | async\"\n>\n\t<ng-container *ngIf=\"openerBtnTemplate\">\n\t\t<ng-container\n\t\t\t*ngTemplateOutlet=\"\n\t\t\t\topenerBtnTemplate;\n\t\t\t\tcontext: { $implicit: overlayVisible$ | async }\n\t\t\t\"\n\t\t></ng-container>\n\t</ng-container>\n</div>\n\n<div\n\t*ngIf=\"overlayVisible$ | async\"\n\tclass=\"select-panel\"\n\t[ngStyle]=\"panelStyle\"\n\t[class]=\"panelStyleClass\"\n>\n\t<ng-container *ngIf=\"searchField\">\n\t\t<ng-container *ngTemplateOutlet=\"searchTermTmpl\"></ng-container>\n\t</ng-container>\n\n\t<ng-container\n\t\t*ngIf=\"\n\t\t\t!!(optionsToDisplay$ | async)?.length;\n\t\t\tthen itemsListDefaultTmpl;\n\t\t\telse noInputOptionsTmpl\n\t\t\"\n\t>\n\t</ng-container>\n\n\t<button\n\t\t*ngIf=\"resetBtn\"\n\t\tclass=\"reset\"\n\t\t(click)=\"reset()\"\n\t>\n\t\t<span>Reset</span>\n\t</button>\n</div>\n\n<ng-template #NoLabelTmpl>\n\t<span\n\t\t[ngClass]=\"{\n\t\t\t'select-label': true,\n\t\t\t'select-label-empty': !!!placeholder?.length\n\t\t}\"\n\t>\n\t\t{{ placeholder || 'empty' }}\n\t</span>\n</ng-template>\n\n<ng-template #selectedItemSelectedTmpl>\n\t<ng-container\n\t\t*ngTemplateOutlet=\"\n\t\t\tselectedItemTemplate;\n\t\t\tcontext: { $implicit: label, selectedOption: selectedOption }\n\t\t\"\n\t>\n\t</ng-container>\n</ng-template>\n\n<ng-template\n\t#defaultSelectIconTmpl\n\tlet-overlayVisible\n>\n\t<span\n\t\tclass=\"select-trigger-icon\"\n\t\t[ngClass]=\"selectIconClass\"\n\t\t[ngClass]=\"{ open: overlayVisible, close: !overlayVisible }\"\n\t>\n\t\t<img\n\t\t\tclass=\"select-trigger__default-img\"\n\t\t\t[src]=\"trigger_icon\"\n\t\t/>\n\t</span>\n</ng-template>\n\n<ng-template #itemsListDefaultTmpl>\n\t<div class=\"select-items-wrapper\">\n\t\t<div class=\"select-items\">\n\t\t\t<ng-container *ngIf=\"optionsToDisplay$ | async as optionsToDisplay\">\n\t\t\t\t<ng-template\n\t\t\t\t\tngFor\n\t\t\t\t\tlet-option\n\t\t\t\t\tlet-i=\"index\"\n\t\t\t\t\t[ngForOf]=\"optionsToDisplay\"\n\t\t\t\t>\n\t\t\t\t\t<ngxd-select-item\n\t\t\t\t\t\t[id]=\"i\"\n\t\t\t\t\t\t[selected]=\"selectedOption === option\"\n\t\t\t\t\t\t[label]=\"getOptionLabel(option)\"\n\t\t\t\t\t\t[disabled]=\"isOptionDisabled(option)\"\n\t\t\t\t\t\t(optionClick)=\"onItemClick($event)\"\n\t\t\t\t\t\t[template]=\"itemTemplate\"\n\t\t\t\t\t\t[itemSize]=\"itemSize\"\n\t\t\t\t\t></ngxd-select-item>\n\t\t\t\t</ng-template>\n\t\t\t</ng-container>\n\t\t</div>\n\t</div>\n</ng-template>\n\n<ng-template #noInputOptionsTmpl>\n\t<div class=\"select-items-wrapper\">\n\t\t<div class=\"select-items\">\n\t\t\t<ng-content select=\".simple-items\"></ng-content>\n\t\t</div>\n\t</div>\n</ng-template>\n\n<ng-template #searchTermTmpl>\n\t<div class=\"search-term__container\">\n\t\t<div class=\"search-term__sub-container\">\n\t\t\t<input\n\t\t\t\ttype=\"text\"\n\t\t\t\tclass=\"search-term\"\n\t\t\t\tplaceholder=\"search for an item ...\"\n\t\t\t\t(click)=\"$event.preventDefault(); $event.stopPropagation()\"\n\t\t\t/>\n\t\t\t<svg\n\t\t\t\tclass=\"search-term__icon\"\n\t\t\t\twidth=\"20\"\n\t\t\t\theight=\"20\"\n\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\tfill=\"none\"\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\td=\"M18.8167 18.0154L12.15 11.8615\"\n\t\t\t\t\tstroke=\"#adc9cebf\"\n\t\t\t\t\tstroke-width=\"3\"\n\t\t\t\t/>\n\t\t\t\t<path\n\t\t\t\t\td=\"M8.33335 13.8461C12.0153 13.8461 15 11.091 15 7.6923C15 4.29362 12.0153 1.53845 8.33335 1.53845C4.65146 1.53845 1.66669 4.29362 1.66669 7.6923C1.66669 11.091 4.65146 13.8461 8.33335 13.8461Z\"\n\t\t\t\t\tstroke=\"#adc9cebf\"\n\t\t\t\t\tstroke-width=\"3\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t</div>\n\t</div>\n</ng-template>\n", styles: ["/*!\n * @ngx-dummy/select-Simple library\n * Simple select created for angular / ionic projects.\n * https://github.com/ngx-dummy/select-simple\n *\n * Copyright Vladimir Ovsyukov <ovsyukov@yandex.com>\n * Published under MIT License\n */:root{--color-white: #fff;--ngxd-primary-color: #adc9cebf;--ngxd-secondary-color: #0b2424;--ngxd-primary-color-t50: #00556680;--ngxd-disabled: #8a8a8a80;--ngxd-primary-icon-color: #89a5aa40;--ngxd-primary-color--active: rgba(221, 233, 235, .7490196078);--ngxd-primary-color--opened: rgba(141, 180, 187, .7490196078)}:host,.select{width:max-content;box-sizing:border-box;min-height:2rem;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none;display:inline-flex;flex-direction:row;align-items:center;justify-content:space-between;gap:1rem;padding:.5rem;background:var(--ngxd-primary-color);border-radius:3px;border:1px solid var(--color-white);transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}:host:not(.disabled):hover,.select:not(.disabled):hover{border-color:var(--ngxd-secondary-color)}:host:not(.disabled).focus,.select:not(.disabled).focus{outline-offset:0;box-shadow:0 0 0 .1rem var(--ngxd-secondary-color);border-color:var(--ngxd-primary-color)}:host:not(.disabled).wrapper-focus,.select:not(.disabled).wrapper-focus{box-shadow:none;background-color:var(--ngxd-primary-color-t50);border-color:var(--ngxd-secondary-color);background-size:100% 2px,100% 1px}:host.disabled,.select.disabled{cursor:not-allowed!important;pointer-events:none;color:var(--ngxd-disabled)}:host .select-trigger,.select .select-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}:host .select-trigger-icon,.select .select-trigger-icon{display:grid;place-content:center;color:var(--ngxd-primary-color);border-radius:50%;background-color:var(--ngxd-primary-icon-color)}:host .select-trigger-icon.open,.select .select-trigger-icon.open{transform:rotate(180deg);transition:transform .1s ease-out}:host .select-trigger-icon.close,.select .select-trigger-icon.close{transform:rotate(0);transition:transform .1s ease-out}:host .select-trigger__default-img,.select .select-trigger__default-img{max-width:2rem}:host .select-label,.select .select-label{display:block;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:1%;text-overflow:ellipsis;cursor:pointer}:host .select-label-empty,.select .select-label-empty{overflow:hidden;visibility:hidden}:host .select-panel,.select .select-panel{height:auto;min-width:100%;position:absolute;top:100%;left:0;padding:.5rem;transition:all .3s ease;z-index:1}:host .select-panel .select-items-wrapper,.select .select-panel .select-items-wrapper{overflow:auto;width:100%}:host .select-panel .select-items,.select .select-panel .select-items{margin:0;padding:0;list-style-type:none}:host .select-panel .select-items .select-item,.select .select-panel .select-items .select-item{cursor:pointer;font-weight:400;white-space:nowrap;position:relative;overflow:hidden;margin:.1rem}:host .select-panel .select-items .select-item.item-highlight,.select .select-panel .select-items .select-item.item-highlight{background-color:var(--ngxd-primary-color--opened);color:var(#0b2424)}:host .select-panel .select-items .select-item:hover,.select .select-panel .select-items .select-item:hover{background-color:var(-ngxd-primary-color-t50);color:var(--ngxd-secondary-color)}:host .select-panel .search-term__container,.select .select-panel .search-term__container{padding:.75rem 1.25rem;border:none;border-bottom:1px solid var(--color-white);color:var(--ngxd-secondary-color);background:transparent;margin:0;border-top-right-radius:6px;border-top-left-radius:6px}:host .select-panel .search-term__container .search-term__sub-container,.select .select-panel .search-term__container .search-term__sub-container{position:relative}:host .select-panel .search-term__container .search-term__sub-container .search-term,.select .select-panel .search-term__container .search-term__sub-container .search-term{margin:.1rem;background-color:transparent;font-size:1.2rem;background:transparent;padding:.75rem;border:1px solid #ced4da;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;-webkit-appearance:none;appearance:none;border-radius:6px;color:var(--ngxd-primary-color)}:host .select-panel .search-term__container .search-term__sub-container .search-term__icon,.select .select-panel .search-term__container .search-term__sub-container .search-term__icon{position:absolute;top:50%;transform:translateY(-50%);right:1rem}:host .select-panel .reset,.select .select-panel .reset{border:none;outline:0;text-decoration:none;font-size:100%;list-style:none;margin-top:.5rem;padding:.4rem 2rem;width:100%;display:grid;place-content:center;border-radius:.2rem;background-color:var(--ngxd-primary-color)}@keyframes fadein{0%{opacity:0}to{opacity:1}}\n"], components: [{ type: SelectItemComponent, selector: "ngxd-select-item", inputs: ["option", "selected", "disabled", "visible", "itemBg", "color", "itemSize", "label", "template"], outputs: ["optionClick"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i3.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SelectComponent, decorators: [{ type: Component, args: [{ selector: 'ngxd-select', providers: [SELECT_VALUE_ACCESSOR_PROVIDER, NG_VALIDATORS_PROVIDER], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { '[class]': 'styleClass', '[style]': 'headerStyle', '[class.wrapper-focus]': 'focused || overlayVisible', '[class.select]': 'true', '[class.disabled]': 'disabled', '[class.focus]': 'focused || overlayVisible', '[class.select-open]': 'overlayVisible', '[attr.tabIndex]': 'tabindex', '[attr.autofocus]': 'autofocus', '[attr.name]': 'name', '(blur)': 'onHostBlur($event)', '(focus)': 'onHostFocus($event)', '(keydown)': 'onKeydown($event)', '(click)': 'onMouseclick($event)', }, template: "<span *ngIf=\"!!label; else NoLabelTmpl\">\n\t<ng-container *ngIf=\"!selectedItemTemplate; else selectedItemSelectedTmpl\">{{\n\t\tlabel\n\t}}</ng-container>\n</span>\n\n<div\n\tclass=\"select-trigger\"\n\trole=\"button\"\n\t[attr.aria-expanded]=\"overlayVisible$ | async\"\n>\n\t<ng-container *ngIf=\"openerBtnTemplate\">\n\t\t<ng-container\n\t\t\t*ngTemplateOutlet=\"\n\t\t\t\topenerBtnTemplate;\n\t\t\t\tcontext: { $implicit: overlayVisible$ | async }\n\t\t\t\"\n\t\t></ng-container>\n\t</ng-container>\n</div>\n\n<div\n\t*ngIf=\"overlayVisible$ | async\"\n\tclass=\"select-panel\"\n\t[ngStyle]=\"panelStyle\"\n\t[class]=\"panelStyleClass\"\n>\n\t<ng-container *ngIf=\"searchField\">\n\t\t<ng-container *ngTemplateOutlet=\"searchTermTmpl\"></ng-container>\n\t</ng-container>\n\n\t<ng-container\n\t\t*ngIf=\"\n\t\t\t!!(optionsToDisplay$ | async)?.length;\n\t\t\tthen itemsListDefaultTmpl;\n\t\t\telse noInputOptionsTmpl\n\t\t\"\n\t>\n\t</ng-container>\n\n\t<button\n\t\t*ngIf=\"resetBtn\"\n\t\tclass=\"reset\"\n\t\t(click)=\"reset()\"\n\t>\n\t\t<span>Reset</span>\n\t</button>\n</div>\n\n<ng-template #NoLabelTmpl>\n\t<span\n\t\t[ngClass]=\"{\n\t\t\t'select-label': true,\n\t\t\t'select-label-empty': !!!placeholder?.length\n\t\t}\"\n\t>\n\t\t{{ placeholder || 'empty' }}\n\t</span>\n</ng-template>\n\n<ng-template #selectedItemSelectedTmpl>\n\t<ng-container\n\t\t*ngTemplateOutlet=\"\n\t\t\tselectedItemTemplate;\n\t\t\tcontext: { $implicit: label, selectedOption: selectedOption }\n\t\t\"\n\t>\n\t</ng-container>\n</ng-template>\n\n<ng-template\n\t#defaultSelectIconTmpl\n\tlet-overlayVisible\n>\n\t<span\n\t\tclass=\"select-trigger-icon\"\n\t\t[ngClass]=\"selectIconClass\"\n\t\t[ngClass]=\"{ open: overlayVisible, close: !overlayVisible }\"\n\t>\n\t\t<img\n\t\t\tclass=\"select-trigger__default-img\"\n\t\t\t[src]=\"trigger_icon\"\n\t\t/>\n\t</span>\n</ng-template>\n\n<ng-template #itemsListDefaultTmpl>\n\t<div class=\"select-items-wrapper\">\n\t\t<div class=\"select-items\">\n\t\t\t<ng-container *ngIf=\"optionsToDisplay$ | async as optionsToDisplay\">\n\t\t\t\t<ng-template\n\t\t\t\t\tngFor\n\t\t\t\t\tlet-option\n\t\t\t\t\tlet-i=\"index\"\n\t\t\t\t\t[ngForOf]=\"optionsToDisplay\"\n\t\t\t\t>\n\t\t\t\t\t<ngxd-select-item\n\t\t\t\t\t\t[id]=\"i\"\n\t\t\t\t\t\t[selected]=\"selectedOption === option\"\n\t\t\t\t\t\t[label]=\"getOptionLabel(option)\"\n\t\t\t\t\t\t[disabled]=\"isOptionDisabled(option)\"\n\t\t\t\t\t\t(optionClick)=\"onItemClick($event)\"\n\t\t\t\t\t\t[template]=\"itemTemplate\"\n\t\t\t\t\t\t[itemSize]=\"itemSize\"\n\t\t\t\t\t></ngxd-select-item>\n\t\t\t\t</ng-template>\n\t\t\t</ng-container>\n\t\t</div>\n\t</div>\n</ng-template>\n\n<ng-template #noInputOptionsTmpl>\n\t<div class=\"select-items-wrapper\">\n\t\t<div class=\"select-items\">\n\t\t\t<ng-content select=\".simple-items\"></ng-content>\n\t\t</div>\n\t</div>\n</ng-template>\n\n<ng-template #searchTermTmpl>\n\t<div class=\"search-term__container\">\n\t\t<div class=\"search-term__sub-container\">\n\t\t\t<input\n\t\t\t\ttype=\"text\"\n\t\t\t\tclass=\"search-term\"\n\t\t\t\tplaceholder=\"search for an item ...\"\n\t\t\t\t(click)=\"$event.preventDefault(); $event.stopPropagation()\"\n\t\t\t/>\n\t\t\t<svg\n\t\t\t\tclass=\"search-term__icon\"\n\t\t\t\twidth=\"20\"\n\t\t\t\theight=\"20\"\n\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\tfill=\"none\"\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\td=\"M18.8167 18.0154L12.15 11.8615\"\n\t\t\t\t\tstroke=\"#adc9cebf\"\n\t\t\t\t\tstroke-width=\"3\"\n\t\t\t\t/>\n\t\t\t\t<path\n\t\t\t\t\td=\"M8.33335 13.8461C12.0153 13.8461 15 11.091 15 7.6923C15 4.29362 12.0153 1.53845 8.33335 1.53845C4.65146 1.53845 1.66669 4.29362 1.66669 7.6923C1.66669 11.091 4.65146 13.8461 8.33335 13.8461Z\"\n\t\t\t\t\tstroke=\"#adc9cebf\"\n\t\t\t\t\tstroke-width=\"3\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t</div>\n\t</div>\n</ng-template>\n", styles: ["/*!\n * @ngx-dummy/select-Simple library\n * Simple select created for angular / ionic projects.\n * https://github.com/ngx-dummy/select-simple\n *\n * Copyright Vladimir Ovsyukov <ovsyukov@yandex.com>\n * Published under MIT License\n */:root{--color-white: #fff;--ngxd-primary-color: #adc9cebf;--ngxd-secondary-color: #0b2424;--ngxd-primary-color-t50: #00556680;--ngxd-disabled: #8a8a8a80;--ngxd-primary-icon-color: #89a5aa40;--ngxd-primary-color--active: rgba(221, 233, 235, .7490196078);--ngxd-primary-color--opened: rgba(141, 180, 187, .7490196078)}:host,.select{width:max-content;box-sizing:border-box;min-height:2rem;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none;display:inline-flex;flex-direction:row;align-items:center;justify-content:space-between;gap:1rem;padding:.5rem;background:var(--ngxd-primary-color);border-radius:3px;border:1px solid var(--color-white);transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}:host:not(.disabled):hover,.select:not(.disabled):hover{border-color:var(--ngxd-secondary-color)}:host:not(.disabled).focus,.select:not(.disabled).focus{outline-offset:0;box-shadow:0 0 0 .1rem var(--ngxd-secondary-color);border-color:var(--ngxd-primary-color)}:host:not(.disabled).wrapper-focus,.select:not(.disabled).wrapper-focus{box-shadow:none;background-color:var(--ngxd-primary-color-t50);border-color:var(--ngxd-secondary-color);background-size:100% 2px,100% 1px}:host.disabled,.select.disabled{cursor:not-allowed!important;pointer-events:none;color:var(--ngxd-disabled)}:host .select-trigger,.select .select-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}:host .select-trigger-icon,.select .select-trigger-icon{display:grid;place-content:center;color:var(--ngxd-primary-color);border-radius:50%;background-color:var(--ngxd-primary-icon-color)}:host .select-trigger-icon.open,.select .select-trigger-icon.open{transform:rotate(180deg);transition:transform .1s ease-out}:host .select-trigger-icon.close,.select .select-trigger-icon.close{transform:rotate(0);transition:transform .1s ease-out}:host .select-trigger__default-img,.select .select-trigger__default-img{max-width:2rem}:host .select-label,.select .select-label{display:block;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:1%;text-overflow:ellipsis;cursor:pointer}:host .select-label-empty,.select .select-label-empty{overflow:hidden;visibility:hidden}:host .select-panel,.select .select-panel{height:auto;min-width:100%;position:absolute;top:100%;left:0;padding:.5rem;transition:all .3s ease;z-index:1}:host .select-panel .select-items-wrapper,.select .select-panel .select-items-wrapper{overflow:auto;width:100%}:host .select-panel .select-items,.select .select-panel .select-items{margin:0;padding:0;list-style-type:none}:host .select-panel .select-items .select-item,.select .select-panel .select-items .select-item{cursor:pointer;font-weight:400;white-space:nowrap;position:relative;overflow:hidden;margin:.1rem}:host .select-panel .select-items .select-item.item-highlight,.select .select-panel .select-items .select-item.item-highlight{background-color:var(--ngxd-primary-color--opened);color:var(#0b2424)}:host .select-panel .select-items .select-item:hover,.select .select-panel .select-items .select-item:hover{background-color:var(-ngxd-primary-color-t50);color:var(--ngxd-secondary-color)}:host .select-panel .search-term__container,.select .select-panel .search-term__container{padding:.75rem 1.25rem;border:none;border-bottom:1px solid var(--color-white);color:var(--ngxd-secondary-color);background:transparent;margin:0;border-top-right-radius:6px;border-top-left-radius:6px}:host .select-panel .search-term__container .search-term__sub-container,.select .select-panel .search-term__container .search-term__sub-container{position:relative}:host .select-panel .search-term__container .search-term__sub-container .search-term,.select .select-panel .search-term__container .search-term__sub-container .search-term{margin:.1rem;background-color:transparent;font-size:1.2rem;background:transparent;padding:.75rem;border:1px solid #ced4da;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;-webkit-appearance:none;appearance:none;border-radius:6px;color:var(--ngxd-primary-color)}:host .select-panel .search-term__container .search-term__sub-container .search-term__icon,.select .select-panel .search-term__container .search-term__sub-container .search-term__icon{position:absolute;top:50%;transform:translateY(-50%);right:1rem}:host .select-panel .reset,.select .select-panel .reset{border:none;outline:0;text-decoration:none;font-size:100%;list-style:none;margin-top:.5rem;padding:.4rem 2rem;width:100%;display:grid;place-content:center;border-radius:.2rem;background-color:var(--ngxd-primary-color)}@keyframes fadein{0%{opacity:0}to{opacity:1}}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }, { type: i0.NgZone }]; }, propDecorators: { defaultOpenerTemplate: [{ type: ViewChild, args: ['defaultSelectIconTmpl', { read: TemplateRef, static: true }] }], itemsListDefaultTmpl: [{ type: ViewChild, args: ['itemsListDefaultTmpl', { read: TemplateRef, static: true }] }], projectedItems: [{ type: ContentChildren, args: [SelectItemComponent, { descendants: true }] }], templates: [{ type: Input }], name: [{ type: Input }], panelStyleClass: [{ type: Input }], styleClass: [{ type: Input }], readonly: [{ type: Input }], required: [{ type: Input }], resetBtn: [{ type: Input }], searchField: [{ type: Input }], autofocus: [{ type: Input }], placeholder: [{ type: Input }], optionLabelKey: [{ type: Input }], selectIconClass: [{ type: Input }], tabindex: [{ type: Input }], itemSize: [{ type: Input }], onChange: [{ type: Output }], onClick: [{ type: Output }], onShow: [{ type: Output }], onHide: [{ type: Output }], onFocus: [{ type: Output }], onBlur: [{ type: Output }], headerStyle: [{ type: Input }], panelStyle: [{ type: Input }], options: [{ type: Input }], disabled: [{ type: Input }] } }); class SelectSimpleModule { } SelectSimpleModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SelectSimpleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); SelectSimpleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SelectSimpleModule, declarations: [SelectComponent, SelectItemComponent], imports: [CommonModule, FormsModule], exports: [SelectComponent, SelectItemComponent] }); SelectSimpleModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SelectSimpleModule, imports: [[CommonModule, FormsModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SelectSimpleModule, decorators: [{ type: NgModule, args: [{ imports: [CommonModule, FormsModule], declarations: [SelectComponent, SelectItemComponent],