UNPKG

@covalent/core

Version:

Core Teradata UI Platform for layouts, icons, custom components and themes. This should be added as a dependency for any project that wants to use layouts, icons and themes for Angular Material.

1 lines 83 kB
{"version":3,"file":"covalent-core-search.mjs","sources":["../tmp-esm2022/search/search-input/search-input.component.js","../tmp-esm2022/search/search-box/search-box.component.js","../tmp-esm2022/search/search.module.js","../tmp-esm2022/search/covalent-core-search.js"],"sourcesContent":["import { Component, ViewChild, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, forwardRef, ElementRef, NgZone, inject, } from '@angular/core';\nimport { trigger, state, style, transition, animate, } from '@angular/animations';\nimport { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Dir } from '@angular/cdk/bidi';\nimport { MatInput } from '@angular/material/input';\nimport { MatFormField, } from '@angular/material/form-field';\nimport { fromEvent, Subject } from 'rxjs';\nimport { debounceTime, skip, takeUntil } from 'rxjs/operators';\nimport { mixinControlValueAccessor, } from '@covalent/core/common';\nimport { MatIcon } from '@angular/material/icon';\nimport { CommonModule } from '@angular/common';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/forms\";\nconst _c0 = [\"searchElement\"];\nfunction TdSearchInputComponent_ng_template_8_Template(rf, ctx) { }\nexport class TdSearchInputBase {\n _changeDetectorRef;\n constructor(_changeDetectorRef) {\n this._changeDetectorRef = _changeDetectorRef;\n }\n}\nexport const _TdSearchInputMixinBase = mixinControlValueAccessor(TdSearchInputBase);\nexport class TdSearchInputComponent extends _TdSearchInputMixinBase {\n _dir = inject(Dir, { optional: true });\n _ngZone = inject(NgZone);\n _input;\n _searchElement;\n /**\n * appearance?: MatFormFieldAppearance\n * Appearance style for the underlying input component.\n */\n appearance = 'fill';\n /**\n * showUnderline?: boolean\n * Sets if the input underline should be visible. Defaults to 'false'.\n */\n showUnderline = false;\n /**\n * debounce?: number\n * Debounce timeout between keypresses. Defaults to 400.\n */\n debounce = 400;\n /**\n * placeholder?: string\n * Placeholder for the underlying input component.\n */\n placeholder = '';\n /**\n * clearIcon?: string\n * The icon used to clear the search input.\n * Defaults to 'cancel' icon.\n */\n clearIcon = 'cancel';\n value;\n /**\n * searchDebounce: function($event)\n * Event emitted after the [debounce] timeout.\n */\n searchDebounce = new EventEmitter();\n /**\n * search: function($event)\n * Event emitted after the key enter has been pressed.\n */\n searchChange = new EventEmitter();\n /**\n * clear: function()\n * Event emitted after the clear icon has been clicked.\n */\n clear = new EventEmitter();\n /**\n * blur: function()\n * Event emitted after the blur event has been called in underlying input.\n */\n blurSearch = new EventEmitter();\n get isRTL() {\n if (this._dir) {\n return this._dir.dir === 'rtl';\n }\n return false;\n }\n _destroy$ = new Subject();\n constructor() {\n const _changeDetectorRef = inject(ChangeDetectorRef);\n super(_changeDetectorRef);\n }\n ngOnInit() {\n this._input?.ngControl?.valueChanges\n ?.pipe(debounceTime(this.debounce), skip(1), // skip first change when value is set to undefined\n takeUntil(this._destroy$))\n .subscribe((value) => {\n this._searchTermChanged(value);\n });\n this._ngZone.runOutsideAngular(() => fromEvent(this._searchElement.nativeElement, 'search')\n .pipe(takeUntil(this._destroy$))\n .subscribe(this._stopPropagation));\n }\n ngOnDestroy() {\n this._destroy$.next();\n }\n /**\n * Method to focus to underlying input.\n */\n focus() {\n this._input?.focus();\n }\n handleBlur() {\n this.blurSearch.emit();\n }\n handleSearch(event) {\n this._stopPropagation(event);\n if (typeof this.value == 'string') {\n this.searchChange.emit(this.value);\n }\n }\n /**\n * Method to clear the underlying input.\n */\n clearSearch() {\n this.value = '';\n this._changeDetectorRef.markForCheck();\n this.clear.emit();\n }\n _searchTermChanged(value) {\n this.searchDebounce.emit(value);\n }\n _stopPropagation(event) {\n event.stopPropagation();\n }\n static ɵfac = function TdSearchInputComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TdSearchInputComponent)(); };\n static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TdSearchInputComponent, selectors: [[\"td-search-input\"]], viewQuery: function TdSearchInputComponent_Query(rf, ctx) { if (rf & 1) {\n i0.ɵɵviewQuery(MatInput, 7);\n i0.ɵɵviewQuery(_c0, 7, ElementRef);\n } if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._input = _t.first);\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._searchElement = _t.first);\n } }, inputs: { appearance: \"appearance\", showUnderline: \"showUnderline\", debounce: \"debounce\", placeholder: \"placeholder\", clearIcon: \"clearIcon\", value: \"value\" }, outputs: { searchDebounce: \"searchDebounce\", searchChange: \"searchChange\", clear: \"clear\", blurSearch: \"blurSearch\" }, features: [i0.ɵɵProvidersFeature([\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TdSearchInputComponent),\n multi: true,\n },\n ]), i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 7, consts: [[\"searchElement\", \"\"], [\"clearButton\", \"\"], [1, \"td-search-input\"], [1, \"td-search-input-field\", 3, \"appearance\"], [\"matInput\", \"\", \"type\", \"search\", 3, \"ngModelChange\", \"blur\", \"keyup.enter\", \"ngModel\", \"placeholder\"], [1, \"td-search-input-clear-wrapper\"], [\"mat-icon-button\", \"\", \"type\", \"button\", 1, \"td-search-input-clear\", 3, \"click\"]], template: function TdSearchInputComponent_Template(rf, ctx) { if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"div\", 2)(1, \"mat-form-field\", 3)(2, \"input\", 4, 0);\n i0.ɵɵtwoWayListener(\"ngModelChange\", function TdSearchInputComponent_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.value, $event) || (ctx.value = $event); return i0.ɵɵresetView($event); });\n i0.ɵɵlistener(\"blur\", function TdSearchInputComponent_Template_input_blur_2_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleBlur()); })(\"keyup.enter\", function TdSearchInputComponent_Template_input_keyup_enter_2_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleSearch($event)); });\n i0.ɵɵelementEnd()();\n i0.ɵɵelementStart(4, \"div\", 5)(5, \"button\", 6);\n i0.ɵɵlistener(\"click\", function TdSearchInputComponent_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.clearSearch()); });\n i0.ɵɵelementStart(6, \"mat-icon\");\n i0.ɵɵtext(7);\n i0.ɵɵelementEnd()()()();\n i0.ɵɵtemplate(8, TdSearchInputComponent_ng_template_8_Template, 0, 0, \"ng-template\", null, 1, i0.ɵɵtemplateRefExtractor);\n } if (rf & 2) {\n const searchElement_r2 = i0.ɵɵreference(3);\n i0.ɵɵadvance();\n i0.ɵɵclassProp(\"mat-hide-underline\", !ctx.showUnderline);\n i0.ɵɵproperty(\"appearance\", ctx.appearance);\n i0.ɵɵadvance();\n i0.ɵɵtwoWayProperty(\"ngModel\", ctx.value);\n i0.ɵɵproperty(\"placeholder\", ctx.placeholder);\n i0.ɵɵadvance(3);\n i0.ɵɵproperty(\"@searchState\", searchElement_r2.value ? \"show\" : ctx.isRTL ? \"hide-left\" : \"hide-right\");\n i0.ɵɵadvance(2);\n i0.ɵɵtextInterpolate(ctx.clearIcon);\n } }, dependencies: [CommonModule, FormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, MatInput, MatFormField, MatIcon], styles: [\"[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%]{box-sizing:border-box;display:flex;flex-direction:row;align-items:center;align-content:center;max-width:100%;justify-content:flex-end}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] .td-search-input-field[_ngcontent-%COMP%]{flex:1}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] .mat-mdc-text-field-wrapper.mdc-text-field{padding-right:48px}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] mat-form-field .mat-mdc-form-field-subscript-wrapper{display:none}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] mat-form-field.mat-form-field-appearance-outline .mat-form-field-wrapper{padding-bottom:0}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] mat-form-field.mat-form-field-appearance-fill .mat-form-field-wrapper{padding-bottom:0}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] mat-form-field.mat-form-field-appearance-fill .mat-form-field-wrapper .mat-form-field-flex{height:52px}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] mat-form-field.mat-form-field-appearance-fill .mat-form-field-wrapper .mat-form-field-underline{bottom:0}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] mat-form-field.mat-form-field-appearance-standard .mat-form-field-wrapper{padding-bottom:0}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] mat-form-field.mat-form-field-appearance-standard .mat-form-field-wrapper .mat-form-field-infix{bottom:.4em}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] mat-form-field.mat-form-field-appearance-standard .mat-form-field-wrapper .mat-form-field-underline{bottom:0}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] mat-form-field .mat-input-element{caret-color:currentColor}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] mat-form-field.mat-hide-underline .mat-form-field-underline{display:none}[_nghost-%COMP%] .td-search-input[_ngcontent-%COMP%] .td-search-input-clear[_ngcontent-%COMP%]{margin-left:-48px;margin-right:0;overflow:hidden}\"], data: { animation: [\n trigger('searchState', [\n state('hide-left', style({\n transform: 'translateX(-150%)',\n opacity: 0,\n display: 'none',\n })),\n state('hide-right', style({\n transform: 'translateX(150%)',\n opacity: 0,\n display: 'none',\n })),\n state('show', style({\n transform: 'translateX(0%)',\n opacity: 1,\n display: 'block',\n })),\n transition('* => show', animate('200ms ease-in')),\n transition('show => *', animate('200ms ease-out')),\n ]),\n ] }, changeDetection: 0 });\n}\n(() => { (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(TdSearchInputComponent, [{\n type: Component,\n args: [{ providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TdSearchInputComponent),\n multi: true,\n },\n ], selector: 'td-search-input', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormsModule, MatInput, MatFormField, MatIcon], animations: [\n trigger('searchState', [\n state('hide-left', style({\n transform: 'translateX(-150%)',\n opacity: 0,\n display: 'none',\n })),\n state('hide-right', style({\n transform: 'translateX(150%)',\n opacity: 0,\n display: 'none',\n })),\n state('show', style({\n transform: 'translateX(0%)',\n opacity: 1,\n display: 'block',\n })),\n transition('* => show', animate('200ms ease-in')),\n transition('show => *', animate('200ms ease-out')),\n ]),\n ], template: \"<div class=\\\"td-search-input\\\">\\n <mat-form-field\\n class=\\\"td-search-input-field\\\"\\n [class.mat-hide-underline]=\\\"!showUnderline\\\"\\n [appearance]=\\\"appearance\\\"\\n >\\n <input\\n matInput\\n #searchElement\\n type=\\\"search\\\"\\n [(ngModel)]=\\\"value\\\"\\n [placeholder]=\\\"placeholder\\\"\\n (blur)=\\\"handleBlur()\\\"\\n (keyup.enter)=\\\"handleSearch($event)\\\"\\n />\\n </mat-form-field>\\n <div class=\\\"td-search-input-clear-wrapper\\\">\\n <button mat-icon-button class=\\\"td-search-input-clear\\\" type=\\\"button\\\" [@searchState]=\\\"\\n searchElement.value ? 'show' : isRTL ? 'hide-left' : 'hide-right'\\n \\\" (click)=\\\"clearSearch()\\\">\\n <mat-icon>{{ clearIcon }}</mat-icon>\\n </button>\\n </div>\\n</div>\\n\\n<ng-template #clearButton>\\n \\n</ng-template>\\n\", styles: [\":host .td-search-input{box-sizing:border-box;display:flex;flex-direction:row;align-items:center;align-content:center;max-width:100%;justify-content:flex-end}:host .td-search-input .td-search-input-field{flex:1}:host .td-search-input ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field{padding-right:48px}:host .td-search-input ::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper{display:none}:host .td-search-input ::ng-deep mat-form-field.mat-form-field-appearance-outline .mat-form-field-wrapper{padding-bottom:0}:host .td-search-input ::ng-deep mat-form-field.mat-form-field-appearance-fill .mat-form-field-wrapper{padding-bottom:0}:host .td-search-input ::ng-deep mat-form-field.mat-form-field-appearance-fill .mat-form-field-wrapper .mat-form-field-flex{height:52px}:host .td-search-input ::ng-deep mat-form-field.mat-form-field-appearance-fill .mat-form-field-wrapper .mat-form-field-underline{bottom:0}:host .td-search-input ::ng-deep mat-form-field.mat-form-field-appearance-standard .mat-form-field-wrapper{padding-bottom:0}:host .td-search-input ::ng-deep mat-form-field.mat-form-field-appearance-standard .mat-form-field-wrapper .mat-form-field-infix{bottom:.4em}:host .td-search-input ::ng-deep mat-form-field.mat-form-field-appearance-standard .mat-form-field-wrapper .mat-form-field-underline{bottom:0}:host .td-search-input ::ng-deep mat-form-field .mat-input-element{caret-color:currentColor}:host .td-search-input ::ng-deep mat-form-field.mat-hide-underline .mat-form-field-underline{display:none}:host .td-search-input .td-search-input-clear{margin-left:-48px;margin-right:0;overflow:hidden}\\n\"] }]\n }], () => [], { _input: [{\n type: ViewChild,\n args: [MatInput, { static: true }]\n }], _searchElement: [{\n type: ViewChild,\n args: ['searchElement', { static: true, read: ElementRef }]\n }], appearance: [{\n type: Input\n }], showUnderline: [{\n type: Input\n }], debounce: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], clearIcon: [{\n type: Input\n }], value: [{\n type: Input\n }], searchDebounce: [{\n type: Output\n }], searchChange: [{\n type: Output\n }], clear: [{\n type: Output\n }], blurSearch: [{\n type: Output\n }] }); })();\n(() => { (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassDebugInfo(TdSearchInputComponent, { className: \"TdSearchInputComponent\", filePath: \"search-input/search-input.component.ts\", lineNumber: 90 }); })();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9zZWFyY2gvc3JjL3NlYXJjaC1pbnB1dC9zZWFyY2gtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NlYXJjaC9zcmMvc2VhcmNoLWlucHV0L3NlYXJjaC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFFVixVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsVUFBVSxFQUNWLE9BQU8sR0FDUixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFDTCxZQUFZLEdBRWIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBRUwseUJBQXlCLEdBQzFCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZ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b3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIGZvcndhcmRSZWYsXG4gIE9uRGVzdHJveSxcbiAgRWxlbWVudFJlZixcbiAgTmdab25lLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgdHJpZ2dlcixcbiAgc3RhdGUsXG4gIHN0eWxlLFxuICB0cmFuc2l0aW9uLFxuICBhbmltYXRlLFxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERpciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHtcbiAgTWF0Rm9ybUZpZWxkLFxuICBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLFxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBza2lwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBJQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIG1peGluQ29udHJvbFZhbHVlQWNjZXNzb3IsXG59IGZyb20gJ0Bjb3ZhbGVudC9jb3JlL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5leHBvcnQgY2xhc3MgVGRTZWFyY2hJbnB1dEJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge31cbn1cblxuZXhwb3J0IGNvbnN0IF9UZFNlYXJjaElucHV0TWl4aW5CYXNlID1cbiAgbWl4aW5Db250cm9sVmFsdWVBY2Nlc3NvcihUZFNlYXJjaElucHV0QmFzZSk7XG5cbkBDb21wb25lbnQoe1xuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRkU2VhcmNoSW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc2VsZWN0b3I6ICd0ZC1zZWFyY2gtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VhcmNoLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgTWF0SW5wdXQsIE1hdEZvcm1GaWVsZCwgTWF0SWNvbl0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdzZWFyY2hTdGF0ZScsIFtcbiAgICAgIHN0YXRlKFxuICAgICAgICAnaGlkZS1sZWZ0JyxcbiAgICAgICAgc3R5bGUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTE1MCUpJyxcbiAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgIGRpc3BsYXk6ICdub25lJyxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgc3RhdGUoXG4gICAgICAgICdoaWRlLXJpZ2h0JyxcbiAgICAgICAgc3R5bGUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTUwJSknLFxuICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBzdGF0ZShcbiAgICAgICAgJ3Nob3cnLFxuICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwJSknLFxuICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgdHJhbnNpdGlvbignKiA9PiBzaG93JywgYW5pbWF0ZSgnMjAwbXMgZWFzZS1pbicpKSxcbiAgICAgIHRyYW5zaXRpb24oJ3Nob3cgPT4gKicsIGFuaW1hdGUoJzIwMG1zIGVhc2Utb3V0JykpLFxuICAgIF0pLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUZFNlYXJjaElucHV0Q29tcG9uZW50XG4gIGV4dGVuZHMgX1RkU2VhcmNoSW5wdXRNaXhpbkJhc2VcbiAgaW1wbGVtZW50cyBJQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIHByaXZhdGUgX2RpciA9IGluamVjdChEaXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgX25nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIEBWaWV3Q2hpbGQoTWF0SW5wdXQsIHsgc3RhdGljOiB0cnVlIH0pIF9pbnB1dD86IE1hdElucHV0O1xuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaEVsZW1lbnQnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBfc2VhcmNoRWxlbWVudCE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgLyoqXG4gICAqIGFwcGVhcmFuY2U/OiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlXG4gICAqIEFwcGVhcmFuY2Ugc3R5bGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgPSAnZmlsbCc7XG5cbiAgLyoqXG4gICAqIHNob3dVbmRlcmxpbmU/OiBib29sZWFuXG4gICAqIFNldHMgaWYgdGhlIGlucHV0IHVuZGVybGluZSBzaG91bGQgYmUgdmlzaWJsZS4gRGVmYXVsdHMgdG8gJ2ZhbHNlJy5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dVbmRlcmxpbmUgPSBmYWxzZTtcblxuICAvKipcbiAgICogZGVib3VuY2U/OiBudW1iZXJcbiAgICogRGVib3VuY2UgdGltZW91dCBiZXR3ZWVuIGtleXByZXNzZXMuIERlZmF1bHRzIHRvIDQwMC5cbiAgICovXG4gIEBJbnB1dCgpIGRlYm91bmNlID0gNDAwO1xuXG4gIC8qKlxuICAgKiBwbGFjZWhvbGRlcj86IHN0cmluZ1xuICAgKiBQbGFjZWhvbGRlciBmb3IgdGhlIHVuZGVybHlpbmcgaW5wdXQgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcblxuICAvKipcbiAgICogY2xlYXJJY29uPzogc3RyaW5nXG4gICAqIFRoZSBpY29uIHVzZWQgdG8gY2xlYXIgdGhlIHNlYXJjaCBpbnB1dC5cbiAgICogRGVmYXVsdHMgdG8gJ2NhbmNlbCcgaWNvbi5cbiAgICovXG4gIEBJbnB1dCgpIGNsZWFySWNvbiA9ICdjYW5jZWwnO1xuXG4gIEBJbnB1dCgpIG92ZXJyaWRlIHZhbHVlITogdW5rbm93bjtcblxuICAvKipcbiAgICogc2VhcmNoRGVib3VuY2U6IGZ1bmN0aW9uKCRldmVudClcbiAgICogRXZlbnQgZW1pdHRlZCBhZnRlciB0aGUgW2RlYm91bmNlXSB0aW1lb3V0LlxuICAgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERlYm91bmNlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBzZWFyY2g6IGZ1bmN0aW9uKCRldmVudClcbiAgICogRXZlbnQgZW1pdHRlZCBhZnRlciB0aGUga2V5IGVudGVyIGhhcyBiZWVuIHByZXNzZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgc2VhcmNoQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBjbGVhcjogZnVuY3Rpb24oKVxuICAgKiBFdmVudCBlbWl0dGVkIGFmdGVyIHRoZSBjbGVhciBpY29uIGhhcyBiZWVuIGNsaWNrZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgY2xlYXI6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogYmx1cjogZnVuY3Rpb24oKVxuICAgKiBFdmVudCBlbWl0dGVkIGFmdGVyIHRoZSBibHVyIGV2ZW50IGhhcyBiZWVuIGNhbGxlZCBpbiB1bmRlcmx5aW5nIGlucHV0LlxuICAgKi9cbiAgQE91dHB1dCgpIGJsdXJTZWFyY2g6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBnZXQgaXNSVEwoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2Rpcikge1xuICAgICAgcmV0dXJuIHRoaXMuX2Rpci5kaXIgPT09ICdydGwnO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgX2NoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAgIHN1cGVyKF9jaGFuZ2VEZXRlY3RvclJlZik7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnB1dD8ubmdDb250cm9sPy52YWx1ZUNoYW5nZXNcbiAgICAgID8ucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2UpLFxuICAgICAgICBza2lwKDEpLCAvLyBza2lwIGZpcnN0IGNoYW5nZSB3aGVuIHZhbHVlIGlzIHNldCB0byB1bmRlZmluZWRcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5fc2VhcmNoVGVybUNoYW5nZWQodmFsdWUpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT5cbiAgICAgIGZyb21FdmVudCh0aGlzLl9zZWFyY2hFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdzZWFyY2gnKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKHRoaXMuX3N0b3BQcm9wYWdhdGlvbiksXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZm9jdXMgdG8gdW5kZXJseWluZyBpbnB1dC5cbiAgICovXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX2lucHV0Py5mb2N1cygpO1xuICB9XG5cbiAgaGFuZGxlQmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLmJsdXJTZWFyY2guZW1pdCgpO1xuICB9XG5cbiAgaGFuZGxlU2VhcmNoKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3N0b3BQcm9wYWdhdGlvbihldmVudCk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlID09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnNlYXJjaENoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gY2xlYXIgdGhlIHVuZGVybHlpbmcgaW5wdXQuXG4gICAqL1xuICBjbGVhclNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5jbGVhci5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIF9zZWFyY2hUZXJtQ2hhbmdlZCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hEZWJvdW5jZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0b3BQcm9wYWdhdGlvbihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRkLXNlYXJjaC1pbnB1dFwiPlxuICA8bWF0LWZvcm0tZmllbGRcbiAgICBjbGFzcz1cInRkLXNlYXJjaC1pbnB1dC1maWVsZFwiXG4gICAgW2NsYXNzLm1hdC1oaWRlLXVuZGVybGluZV09XCIhc2hvd1VuZGVybGluZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gID5cbiAgICA8aW5wdXRcbiAgICAgIG1hdElucHV0XG4gICAgICAjc2VhcmNoRWxlbWVudFxuICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKClcIlxuICAgICAgKGtleXVwLmVudGVyKT1cImhhbmRsZVNlYXJjaCgkZXZlbnQpXCJcbiAgICAvPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuICA8ZGl2IGNsYXNzPVwidGQtc2VhcmNoLWlucHV0LWNsZWFyLXdyYXBwZXJcIj5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cInRkLXNlYXJjaC1pbnB1dC1jbGVhclwiIHR5cGU9XCJidXR0b25cIiBbQHNlYXJjaFN0YXRlXT1cIlxuICAgICAgc2VhcmNoRWxlbWVudC52YWx1ZSA/ICdzaG93JyA6IGlzUlRMID8gJ2hpZGUtbGVmdCcgOiAnaGlkZS1yaWdodCdcbiAgICBcIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiPlxuICAgICAgPG1hdC1pY29uPnt7IGNsZWFySWNvbiB9fTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjY2xlYXJCdXR0b24+XG4gIFxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==","import { Component, ViewChild, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, forwardRef, inject, } from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR, } from '@angular/forms';\nimport { trigger, state, style, transition, animate, AUTO_STYLE, } from '@angular/animations';\nimport { TdSearchInputComponent } from '../search-input/search-input.component';\nimport { noop } from 'rxjs';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { CommonModule } from '@angular/common';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nimport * as i2 from \"@angular/forms\";\nconst _c0 = a0 => ({ \"td-search-icon-active\": a0 });\nfunction TdSearchBoxComponent_mat_icon_2_Template(rf, ctx) { if (rf & 1) {\n i0.ɵɵelementStart(0, \"mat-icon\");\n i0.ɵɵtext(1);\n i0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate(ctx_r1.backIcon);\n} }\nfunction TdSearchBoxComponent_mat_icon_3_Template(rf, ctx) { if (rf & 1) {\n i0.ɵɵelementStart(0, \"mat-icon\");\n i0.ɵɵtext(1);\n i0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate(ctx_r1.searchIcon);\n} }\nexport class TdSearchBoxBase {\n _changeDetectorRef;\n constructor(_changeDetectorRef) {\n this._changeDetectorRef = _changeDetectorRef;\n }\n}\nexport class TdSearchBoxComponent {\n _changeDetectorRef = inject(ChangeDetectorRef);\n _searchVisible = false;\n _searchInput;\n get searchVisible() {\n return this._searchVisible;\n }\n /**\n * backIcon?: string\n * The icon used to close the search toggle, only shown when [alwaysVisible] is false.\n * Defaults to 'search' icon.\n */\n backIcon = 'search';\n /**\n * searchIcon?: string\n * The icon used to open/focus the search toggle.\n * Defaults to 'search' icon.\n */\n searchIcon = 'search';\n /**\n * clearIcon?: string\n * The icon used to clear the search input.\n * Defaults to 'cancel' icon.\n */\n clearIcon = 'close';\n /**\n * showUnderline?: boolean\n * Sets if the input underline should be visible. Defaults to 'false'.\n */\n showUnderline = false;\n /**\n * debounce?: number\n * Debounce timeout between keypresses. Defaults to 400.\n */\n debounce = 400;\n /**\n * alwaysVisible?: boolean\n * Sets if the input should always be visible. Defaults to 'false'.\n */\n alwaysVisible = false;\n /**\n * placeholder?: string\n * Placeholder for the underlying input component.\n */\n placeholder = '';\n value;\n /**\n * searchDebounce: function($event)\n * Event emitted after the [debounce] timeout.\n */\n searchDebounce = new EventEmitter();\n /**\n * search: function($event)\n * Event emitted after the key enter has been pressed.\n */\n searchChange = new EventEmitter();\n /**\n * clear: function()\n * Event emitted after the clear icon has been clicked.\n */\n clear = new EventEmitter();\n /**\n * blur: function()\n * Event emitted after the blur event has been called in underlying input.\n */\n blurSearch = new EventEmitter();\n writeValue(value) {\n this.value = value;\n this._changeDetectorRef.markForCheck();\n }\n registerOnChange() {\n noop;\n }\n registerOnTouched() {\n noop;\n }\n /**\n * Method executed when the search icon is clicked.\n */\n searchClicked() {\n if (!this.alwaysVisible && this._searchVisible) {\n this.value = '';\n this.handleClear();\n }\n else if (this.alwaysVisible || !this._searchVisible) {\n this._searchInput?.focus();\n }\n this.toggleVisibility();\n }\n toggleVisibility() {\n this._searchVisible = !this._searchVisible;\n this._changeDetectorRef.markForCheck();\n }\n handleSearchDebounce(value) {\n this.searchDebounce.emit(value);\n }\n handleSearch(value) {\n this.searchChange.emit(value);\n }\n handleClear() {\n this.clear.emit();\n }\n handleBlur() {\n this.blurSearch.emit();\n }\n static ɵfac = function TdSearchBoxComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TdSearchBoxComponent)(); };\n static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TdSearchBoxComponent, selectors: [[\"td-search-box\"]], viewQuery: function TdSearchBoxComponent_Query(rf, ctx) { if (rf & 1) {\n i0.ɵɵviewQuery(TdSearchInputComponent, 7);\n } if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._searchInput = _t.first);\n } }, inputs: { backIcon: \"backIcon\", searchIcon: \"searchIcon\", clearIcon: \"clearIcon\", showUnderline: \"showUnderline\", debounce: \"debounce\", alwaysVisible: \"alwaysVisible\", placeholder: \"placeholder\", value: \"value\" }, outputs: { searchDebounce: \"searchDebounce\", searchChange: \"searchChange\", clear: \"clear\", blurSearch: \"blurSearch\" }, features: [i0.ɵɵProvidersFeature([\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TdSearchBoxComponent),\n multi: true,\n },\n ])], decls: 6, vars: 11, consts: [[\"searchInput\", \"\"], [1, \"td-search-box\"], [\"mat-icon-button\", \"\", \"type\", \"button\", 1, \"td-search-icon\", 3, \"click\", \"ngClass\"], [4, \"ngIf\"], [3, \"ngModelChange\", \"searchDebounce\", \"searchChange\", \"clear\", \"blur\", \"debounce\", \"ngModel\", \"showUnderline\", \"placeholder\", \"clearIcon\"]], template: function TdSearchBoxComponent_Template(rf, ctx) { if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"div\", 1)(1, \"button\", 2);\n i0.ɵɵlistener(\"click\", function TdSearchBoxComponent_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.searchClicked()); });\n i0.ɵɵtemplate(2, TdSearchBoxComponent_mat_icon_2_Template, 2, 1, \"mat-icon\", 3)(3, TdSearchBoxComponent_mat_icon_3_Template, 2, 1, \"mat-icon\", 3);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(4, \"td-search-input\", 4, 0);\n i0.ɵɵtwoWayListener(\"ngModelChange\", function TdSearchBoxComponent_Template_td_search_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.value, $event) || (ctx.value = $event); return i0.ɵɵresetView($event); });\n i0.ɵɵlistener(\"searchDebounce\", function TdSearchBoxComponent_Template_td_search_input_searchDebounce_4_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleSearchDebounce($event)); })(\"searchChange\", function TdSearchBoxComponent_Template_td_search_input_searchChange_4_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleSearch($event)); })(\"clear\", function TdSearchBoxComponent_Template_td_search_input_clear_4_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleClear()); })(\"blur\", function TdSearchBoxComponent_Template_td_search_input_blur_4_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleBlur()); });\n i0.ɵɵelementEnd()();\n } if (rf & 2) {\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngClass\", i0.ɵɵpureFunction1(9, _c0, ctx.searchVisible || ctx.alwaysVisible));\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngIf\", ctx.searchVisible && !ctx.alwaysVisible);\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngIf\", !ctx.searchVisible || ctx.alwaysVisible);\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"@inputState\", ctx.alwaysVisible || ctx.searchVisible)(\"debounce\", ctx.debounce);\n i0.ɵɵtwoWayProperty(\"ngModel\", ctx.value);\n i0.ɵɵproperty(\"showUnderline\", ctx.showUnderline)(\"placeholder\", ctx.placeholder)(\"clearIcon\", ctx.clearIcon);\n } }, dependencies: [CommonModule, i1.NgClass, i1.NgIf, FormsModule, i2.NgControlStatus, i2.NgModel, MatIconButton,\n TdSearchInputComponent,\n MatIcon], styles: [\"[_nghost-%COMP%]{display:block}.td-search-box[_ngcontent-%COMP%]{box-sizing:border-box;display:flex;flex-direction:row;align-content:center;max-width:100%;justify-content:flex-end;align-items:center;position:relative}.td-search-box[_ngcontent-%COMP%] .td-search-icon.td-search-icon-active[_ngcontent-%COMP%]{margin-right:-48px;margin-left:0;z-index:1}.td-search-box[_ngcontent-%COMP%] td-search-input[_ngcontent-%COMP%]{--mdc-filled-text-field-container-color: transparent;--mat-form-field-state-layer-color: transparent;--mdc-filled-text-field-active-indicator-color: transparent;--mdc-filled-text-field-hover-active-indicator-color: transparent}[dir=rtl][_ngcontent-%COMP%] .td-search-box[_ngcontent-%COMP%] td-search-input[_ngcontent-%COMP%] {margin-left:0!important}.td-search-box[_ngcontent-%COMP%] td-search-input[_ngcontent-%COMP%] .mat-mdc-text-field-wrapper.mdc-text-field{padding-left:48px;overflow:visible}.td-search-box[_ngcontent-%COMP%] td-search-input[_ngcontent-%COMP%] .mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple:after{bottom:-1px}\"], data: { animation: [\n trigger('inputState', [\n state('0', style({\n width: '0%',\n margin: '0px',\n })),\n state('1', style({\n width: '100%',\n margin: AUTO_STYLE,\n })),\n transition('0 => 1', animate('200ms ease-in')),\n transition('1 => 0', animate('200ms ease-out')),\n ]),\n ] }, changeDetection: 0 });\n}\n(() => { (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(TdSearchBoxComponent, [{\n type: Component,\n args: [{ providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TdSearchBoxComponent),\n multi: true,\n },\n ], selector: 'td-search-box', changeDetection: ChangeDetectionStrategy.OnPush, imports: [\n CommonModule,\n FormsModule,\n MatIconButton,\n TdSearchInputComponent,\n MatIcon,\n ], animations: [\n trigger('inputState', [\n state('0', style({\n width: '0%',\n margin: '0px',\n })),\n state('1', style({\n width: '100%',\n margin: AUTO_STYLE,\n })),\n transition('0 => 1', animate('200ms ease-in')),\n transition('1 => 0', animate('200ms ease-out')),\n ]),\n ], template: \"<div class=\\\"td-search-box\\\">\\n <button\\n mat-icon-button\\n type=\\\"button\\\"\\n class=\\\"td-search-icon\\\"\\n (click)=\\\"searchClicked()\\\"\\n [ngClass]=\\\"{ 'td-search-icon-active': searchVisible || alwaysVisible }\\\"\\n >\\n <mat-icon *ngIf=\\\"searchVisible && !alwaysVisible\\\">{{ backIcon }}</mat-icon>\\n <mat-icon *ngIf=\\\"!searchVisible || alwaysVisible\\\">{{\\n searchIcon\\n }}</mat-icon>\\n </button>\\n <td-search-input\\n #searchInput\\n [@inputState]=\\\"alwaysVisible || searchVisible\\\"\\n [debounce]=\\\"debounce\\\"\\n [(ngModel)]=\\\"value\\\"\\n [showUnderline]=\\\"showUnderline\\\"\\n [placeholder]=\\\"placeholder\\\"\\n [clearIcon]=\\\"clearIcon\\\"\\n (searchDebounce)=\\\"handleSearchDebounce($event)\\\"\\n (searchChange)=\\\"handleSearch($event)\\\"\\n (clear)=\\\"handleClear()\\\"\\n (blur)=\\\"handleBlur()\\\"\\n ></td-search-input>\\n</div>\\n\", styles: [\":host{display:block}.td-search-box{box-sizing:border-box;display:flex;flex-direction:row;align-content:center;max-width:100%;justify-content:flex-end;align-items:center;position:relative}.td-search-box .td-search-icon.td-search-icon-active{margin-right:-48px;margin-left:0;z-index:1}.td-search-box td-search-input{--mdc-filled-text-field-container-color: transparent;--mat-form-field-state-layer-color: transparent;--mdc-filled-text-field-active-indicator-color: transparent;--mdc-filled-text-field-hover-active-indicator-color: transparent}[dir=rtl] .td-search-box td-search-input ::ng-deep{margin-left:0!important}.td-search-box td-search-input ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field{padding-left:48px;overflow:visible}.td-search-box td-search-input ::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple:after{bottom:-1px}\\n\"] }]\n }], null, { _searchInput: [{\n type: ViewChild,\n args: [TdSearchInputComponent, { static: true }]\n }], backIcon: [{\n type: Input\n }], searchIcon: [{\n type: Input\n }], clearIcon: [{\n type: Input\n }], showUnderline: [{\n type: Input\n }], debounce: [{\n type: Input\n }], alwaysVisible: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], value: [{\n type: Input\n }], searchDebounce: [{\n type: Output\n }], searchChange: [{\n type: Output\n }], clear: [{\n type: Output\n }], blurSearch: [{\n type: Output\n }] }); })();\n(() => { (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassDebugInfo(TdSearchBoxComponent, { className: \"TdSearchBoxComponent\", filePath: \"search-box/search-box.component.ts\", lineNumber: 76 }); })();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc2VhcmNoL3NyYy9zZWFyY2gtYm94L3NlYXJjaC1ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NlYXJjaC9zcmMvc2VhcmNoLWJveC9zZWFyY2gtYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsV0FBVyxFQUNYLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxPQUFPLEVBQ1AsS0FBSyxFQUNMLEtBQUssRUFDTCxVQUFVLEVBQ1YsT0FBTyxFQUNQLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7OztJQ3JCM0MsZ0NBQWtEO0lBQUEsWUFBYztJQUFBLGlCQUFXOzs7SUFBekIsY0FBYztJQUFkLHFDQUFjOzs7SUFDaEUsZ0NBQWtEO0lBQUEsWUFFaEQ7SUFBQSxpQkFBVzs7O0lBRnFDLGNBRWhEO0lBRmdELHVDQUVoRDs7QURvQk4sTUFBTSxPQUFPLGVBQWU7SUFD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