@cqa-lib/cqa-ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLm1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGlhbG9nL2RpYWxvZy5tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBEaWFsb2dSZWYgfSBmcm9tICcuL2RpYWxvZy1yZWYnO1xuXG5leHBvcnQgdHlwZSBEaWFsb2dCdXR0b25Sb2xlID0gJ3ByaW1hcnknIHwgJ3NlY29uZGFyeScgfCAnd2FybicgfCAoc3RyaW5nICYge30pO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ0J1dHRvbkNvbmZpZzxUUmVzdWx0ID0gdW5rbm93bj4ge1xuICBsYWJlbDogc3RyaW5nO1xuICByb2xlPzogRGlhbG9nQnV0dG9uUm9sZTtcbiAgaGFuZGxlcj86IChkaWFsb2dSZWY6IERpYWxvZ1JlZjxUUmVzdWx0PikgPT4gVFJlc3VsdCB8IHZvaWQgfCBQcm9taXNlPFRSZXN1bHQgfCB2b2lkPjtcbiAgY2xvc2VPbkNsaWNrPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgRGlhbG9nQnV0dG9uQWxpZ25tZW50ID0gJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdjZW50ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlRGlhbG9nQ29udGVudDxUQ29udGV4dCA9IGFueT4ge1xuICB0eXBlOiAndGVtcGxhdGUnO1xuICB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8VENvbnRleHQ+O1xuICBjb250ZXh0PzogVENvbnRleHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50RGlhbG9nQ29udGVudDxUSW5wdXRzID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICB0eXBlOiAnY29tcG9uZW50JztcbiAgY29tcG9uZW50OiBDb21wb25lbnRUeXBlPHVua25vd24+O1xuICBpbnB1dHM/OiBUSW5wdXRzO1xufVxuXG5leHBvcnQgdHlwZSBEaWFsb2dDb250ZW50Q29uZmlnID1cbiAgfCBUZW1wbGF0ZURpYWxvZ0NvbnRlbnRcbiAgfCBDb21wb25lbnREaWFsb2dDb250ZW50O1xuXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ0NvbmZpZzxUQ29udGVudCBleHRlbmRzIERpYWxvZ0NvbnRlbnRDb25maWcgPSBEaWFsb2dDb250ZW50Q29uZmlnLCBUUmVzdWx0ID0gdW5rbm93bj4ge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgd2FybmluZz86IHN0cmluZztcbiAgY29udGVudD86IFRDb250ZW50O1xuICBkYXRhPzogdW5rbm93bjtcbiAgYnV0dG9uczogRGlhbG9nQnV0dG9uQ29uZmlnPFRSZXN1bHQ+W107XG4gIGJ1dHRvbkFsaWdubWVudD86IERpYWxvZ0J1dHRvbkFsaWdubWVudDtcbiAgcGFuZWxDbGFzcz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICB3aWR0aD86IHN0cmluZztcbiAgbWF4V2lkdGg/OiBzdHJpbmc7XG4gIGRpc2FibGVDbG9zZT86IGJvb2xlYW47XG59XG5cblxuIl19
@@ -0,0 +1,101 @@
1
+ import { Injectable, Injector } from '@angular/core';
2
+ import { OverlayConfig } from '@angular/cdk/overlay';
3
+ import { ComponentPortal } from '@angular/cdk/portal';
4
+ import { filter } from 'rxjs/operators';
5
+ import { DialogRef } from './dialog-ref';
6
+ import { DialogComponent } from './dialog.component';
7
+ import { DIALOG_DATA, DIALOG_REF } from './dialog.tokens';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/cdk/overlay";
10
+ export class DialogService {
11
+ constructor(overlay, injector) {
12
+ this.overlay = overlay;
13
+ this.injector = injector;
14
+ }
15
+ open(config) {
16
+ this.assertValidConfig(config);
17
+ const overlayRef = this.overlay.create(this.buildOverlayConfig(config));
18
+ const dialogRef = new DialogRef(overlayRef);
19
+ const injector = Injector.create({
20
+ parent: this.injector,
21
+ providers: [
22
+ { provide: DIALOG_REF, useValue: dialogRef },
23
+ { provide: DIALOG_DATA, useValue: config.data },
24
+ ],
25
+ });
26
+ const containerPortal = new ComponentPortal(DialogComponent, undefined, injector);
27
+ const containerRef = overlayRef.attach(containerPortal);
28
+ const containerInstance = containerRef.instance;
29
+ containerInstance.config = config;
30
+ containerInstance.dialogRef = dialogRef;
31
+ if (config.content?.type === 'template') {
32
+ containerInstance.attachTemplate(config.content.template, config.content.context ?? {
33
+ $implicit: config.data,
34
+ data: config.data,
35
+ });
36
+ }
37
+ if (config.content?.type === 'component') {
38
+ const componentPortal = new ComponentPortal(config.content.component, undefined, Injector.create({
39
+ parent: injector,
40
+ providers: [
41
+ { provide: DIALOG_REF, useValue: dialogRef },
42
+ { provide: DIALOG_DATA, useValue: config.data },
43
+ ],
44
+ }));
45
+ const componentRef = containerInstance.attachComponent(componentPortal);
46
+ if (componentRef && config.content.inputs) {
47
+ Object.entries(config.content.inputs).forEach(([key, value]) => {
48
+ componentRef.instance[key] = value;
49
+ });
50
+ componentRef.changeDetectorRef.markForCheck();
51
+ }
52
+ if (componentRef) {
53
+ dialogRef.setComponentInstance(componentRef.instance);
54
+ }
55
+ }
56
+ containerRef.changeDetectorRef.markForCheck();
57
+ if (!config.disableClose) {
58
+ overlayRef.backdropClick().subscribe(() => dialogRef.close());
59
+ overlayRef
60
+ .keydownEvents()
61
+ .pipe(filter((event) => {
62
+ return event.key === 'Escape' || event.key === 'Esc';
63
+ }))
64
+ .subscribe(() => dialogRef.close());
65
+ }
66
+ return dialogRef;
67
+ }
68
+ assertValidConfig(config) {
69
+ if (!config.title) {
70
+ throw new Error('Dialog title is required.');
71
+ }
72
+ if (!config.buttons || config.buttons.length < 2) {
73
+ throw new Error('Dialog requires at least two buttons to be provided.');
74
+ }
75
+ }
76
+ buildOverlayConfig(config) {
77
+ const panelClass = Array.isArray(config.panelClass)
78
+ ? config.panelClass
79
+ : config.panelClass
80
+ ? [config.panelClass]
81
+ : [];
82
+ return new OverlayConfig({
83
+ hasBackdrop: true,
84
+ backdropClass: ['cdk-overlay-dark-backdrop', 'cqa-dialog-backdrop'],
85
+ scrollStrategy: this.overlay.scrollStrategies.block(),
86
+ positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),
87
+ width: config.width,
88
+ maxWidth: config.maxWidth ?? '90vw',
89
+ panelClass: ['cqa-dialog-panel', ...panelClass],
90
+ });
91
+ }
92
+ }
93
+ DialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DialogService, deps: [{ token: i1.Overlay }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
94
+ DialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DialogService, providedIn: 'root' });
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DialogService, decorators: [{
96
+ type: Injectable,
97
+ args: [{
98
+ providedIn: 'root',
99
+ }]
100
+ }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }]; } });
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RpYWxvZy9kaWFsb2cuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFLMUQsTUFBTSxPQUFPLGFBQWE7SUFDeEIsWUFBNkIsT0FBZ0IsRUFBbUIsUUFBa0I7UUFBckQsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUFtQixhQUFRLEdBQVIsUUFBUSxDQUFVO0lBQUcsQ0FBQztJQUV0RixJQUFJLENBQ0YsTUFBdUM7UUFFdkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRS9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFVLFVBQVUsQ0FBQyxDQUFDO1FBRXJELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDL0IsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3JCLFNBQVMsRUFBRTtnQkFDVCxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtnQkFDNUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFO2FBQ2hEO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNsRixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3hELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLFFBQW9DLENBQUM7UUFFNUUsaUJBQWlCLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNsQyxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBRXhDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQ3ZDLGlCQUFpQixDQUFDLGNBQWMsQ0FDOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJO2dCQUN4QixTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ3RCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTthQUNsQixDQUNGLENBQUM7U0FDSDtRQUVELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQ3hDLE1BQU0sZUFBZSxHQUFHLElBQUksZUFBZSxDQUN6QyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFDeEIsU0FBUyxFQUNULFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLFNBQVMsRUFBRTtvQkFDVCxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtvQkFDNUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFO2lCQUNoRDthQUNGLENBQUMsQ0FDSCxDQUFDO1lBRUYsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRXhFLElBQUksWUFBWSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO2dCQUN6QyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtvQkFDNUQsWUFBWSxDQUFDLFFBQW9DLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNsRSxDQUFDLENBQUMsQ0FBQztnQkFDSCxZQUFZLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDL0M7WUFFRCxJQUFJLFlBQVksRUFBRTtnQkFDaEIsU0FBUyxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN2RDtTQUNGO1FBRUQsWUFBWSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ3hCLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDOUQsVUFBVTtpQkFDUCxhQUFhLEVBQUU7aUJBQ2YsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBMEIsRUFBRTtnQkFDdkMsT0FBUSxLQUF1QixDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUssS0FBdUIsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDO1lBQzdGLENBQUMsQ0FBQyxDQUNIO2lCQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN2QztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxpQkFBaUIsQ0FDdkIsTUFBdUM7UUFFdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztTQUN6RTtJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsTUFBdUM7UUFFdkMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQ2pELENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNuQixDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ25CLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7Z0JBQ3JCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFUCxPQUFPLElBQUksYUFBYSxDQUFDO1lBQ3ZCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGFBQWEsRUFBRSxDQUFDLDJCQUEyQixFQUFFLHFCQUFxQixDQUFDO1lBQ25FLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRTtZQUNyRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUYsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1lBQ25CLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU07WUFDbkMsVUFBVSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxVQUFVLENBQUM7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7MEdBOUdVLGFBQWE7OEdBQWIsYUFBYSxjQUZaLE1BQU07MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGlhbG9nQ29uZmlnLCBEaWFsb2dDb250ZW50Q29uZmlnIH0gZnJvbSAnLi9kaWFsb2cubW9kZWxzJztcbmltcG9ydCB7IERpYWxvZ1JlZiB9IGZyb20gJy4vZGlhbG9nLXJlZic7XG5pbXBvcnQgeyBEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRElBTE9HX0RBVEEsIERJQUxPR19SRUYgfSBmcm9tICcuL2RpYWxvZy50b2tlbnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRGlhbG9nU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheTogT3ZlcmxheSwgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgb3BlbjxUQ29udGVudCBleHRlbmRzIERpYWxvZ0NvbnRlbnRDb25maWcgPSBEaWFsb2dDb250ZW50Q29uZmlnLCBUUmVzdWx0ID0gdW5rbm93bj4oXG4gICAgY29uZmlnOiBEaWFsb2dDb25maWc8VENvbnRlbnQsIFRSZXN1bHQ+XG4gICk6IERpYWxvZ1JlZjxUUmVzdWx0PiB7XG4gICAgdGhpcy5hc3NlcnRWYWxpZENvbmZpZyhjb25maWcpO1xuXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUodGhpcy5idWlsZE92ZXJsYXlDb25maWcoY29uZmlnKSk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gbmV3IERpYWxvZ1JlZjxUUmVzdWx0PihvdmVybGF5UmVmKTtcblxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvcixcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IERJQUxPR19SRUYsIHVzZVZhbHVlOiBkaWFsb2dSZWYgfSxcbiAgICAgICAgeyBwcm92aWRlOiBESUFMT0dfREFUQSwgdXNlVmFsdWU6IGNvbmZpZy5kYXRhIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgY29udGFpbmVyUG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChEaWFsb2dDb21wb25lbnQsIHVuZGVmaW5lZCwgaW5qZWN0b3IpO1xuICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IG92ZXJsYXlSZWYuYXR0YWNoKGNvbnRhaW5lclBvcnRhbCk7XG4gICAgY29uc3QgY29udGFpbmVySW5zdGFuY2UgPSBjb250YWluZXJSZWYuaW5zdGFuY2UgYXMgRGlhbG9nQ29tcG9uZW50PFRSZXN1bHQ+O1xuXG4gICAgY29udGFpbmVySW5zdGFuY2UuY29uZmlnID0gY29uZmlnO1xuICAgIGNvbnRhaW5lckluc3RhbmNlLmRpYWxvZ1JlZiA9IGRpYWxvZ1JlZjtcblxuICAgIGlmIChjb25maWcuY29udGVudD8udHlwZSA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgY29udGFpbmVySW5zdGFuY2UuYXR0YWNoVGVtcGxhdGUoXG4gICAgICAgIGNvbmZpZy5jb250ZW50LnRlbXBsYXRlLFxuICAgICAgICBjb25maWcuY29udGVudC5jb250ZXh0ID8/IHtcbiAgICAgICAgICAkaW1wbGljaXQ6IGNvbmZpZy5kYXRhLFxuICAgICAgICAgIGRhdGE6IGNvbmZpZy5kYXRhLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY29udGVudD8udHlwZSA9PT0gJ2NvbXBvbmVudCcpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoXG4gICAgICAgIGNvbmZpZy5jb250ZW50LmNvbXBvbmVudCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICAgIHBhcmVudDogaW5qZWN0b3IsXG4gICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICB7IHByb3ZpZGU6IERJQUxPR19SRUYsIHVzZVZhbHVlOiBkaWFsb2dSZWYgfSxcbiAgICAgICAgICAgIHsgcHJvdmlkZTogRElBTE9HX0RBVEEsIHVzZVZhbHVlOiBjb25maWcuZGF0YSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjb250YWluZXJJbnN0YW5jZS5hdHRhY2hDb21wb25lbnQoY29tcG9uZW50UG9ydGFsKTtcblxuICAgICAgaWYgKGNvbXBvbmVudFJlZiAmJiBjb25maWcuY29udGVudC5pbnB1dHMpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY29uZmlnLmNvbnRlbnQuaW5wdXRzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAoY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wb25lbnRSZWYpIHtcbiAgICAgICAgZGlhbG9nUmVmLnNldENvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudFJlZi5pbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29udGFpbmVyUmVmLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgaWYgKCFjb25maWcuZGlzYWJsZUNsb3NlKSB7XG4gICAgICBvdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gZGlhbG9nUmVmLmNsb3NlKCkpO1xuICAgICAgb3ZlcmxheVJlZlxuICAgICAgICAua2V5ZG93bkV2ZW50cygpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBLZXlib2FyZEV2ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoZXZlbnQgYXMgS2V5Ym9hcmRFdmVudCkua2V5ID09PSAnRXNjYXBlJyB8fCAoZXZlbnQgYXMgS2V5Ym9hcmRFdmVudCkua2V5ID09PSAnRXNjJztcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gZGlhbG9nUmVmLmNsb3NlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkaWFsb2dSZWY7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydFZhbGlkQ29uZmlnPFRDb250ZW50IGV4dGVuZHMgRGlhbG9nQ29udGVudENvbmZpZywgVFJlc3VsdD4oXG4gICAgY29uZmlnOiBEaWFsb2dDb25maWc8VENvbnRlbnQsIFRSZXN1bHQ+XG4gICk6IHZvaWQge1xuICAgIGlmICghY29uZmlnLnRpdGxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpYWxvZyB0aXRsZSBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5idXR0b25zIHx8IGNvbmZpZy5idXR0b25zLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGlhbG9nIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBidXR0b25zIHRvIGJlIHByb3ZpZGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPdmVybGF5Q29uZmlnPFRDb250ZW50IGV4dGVuZHMgRGlhbG9nQ29udGVudENvbmZpZywgVFJlc3VsdD4oXG4gICAgY29uZmlnOiBEaWFsb2dDb25maWc8VENvbnRlbnQsIFRSZXN1bHQ+XG4gICk6IE92ZXJsYXlDb25maWcge1xuICAgIGNvbnN0IHBhbmVsQ2xhc3MgPSBBcnJheS5pc0FycmF5KGNvbmZpZy5wYW5lbENsYXNzKVxuICAgICAgPyBjb25maWcucGFuZWxDbGFzc1xuICAgICAgOiBjb25maWcucGFuZWxDbGFzc1xuICAgICAgPyBbY29uZmlnLnBhbmVsQ2xhc3NdXG4gICAgICA6IFtdO1xuXG4gICAgcmV0dXJuIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgYmFja2Ryb3BDbGFzczogWydjZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wJywgJ2NxYS1kaWFsb2ctYmFja2Ryb3AnXSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ibG9jaygpLFxuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCkuY2VudGVySG9yaXpvbnRhbGx5KCkuY2VudGVyVmVydGljYWxseSgpLFxuICAgICAgd2lkdGg6IGNvbmZpZy53aWR0aCxcbiAgICAgIG1heFdpZHRoOiBjb25maWcubWF4V2lkdGggPz8gJzkwdncnLFxuICAgICAgcGFuZWxDbGFzczogWydjcWEtZGlhbG9nLXBhbmVsJywgLi4ucGFuZWxDbGFzc10sXG4gICAgfSk7XG4gIH1cbn1cblxuXG4iXX0=
@@ -0,0 +1,4 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const DIALOG_REF = new InjectionToken('CQA_DIALOG_REF');
3
+ export const DIALOG_DATA = new InjectionToken('CQA_DIALOG_DATA');
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnRva2Vucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGlhbG9nL2RpYWxvZy50b2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcvQyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxjQUFjLENBQWlCLGdCQUFnQixDQUFDLENBQUM7QUFDL0UsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFNLGlCQUFpQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGlhbG9nUmVmIH0gZnJvbSAnLi9kaWFsb2ctcmVmJztcblxuZXhwb3J0IGNvbnN0IERJQUxPR19SRUYgPSBuZXcgSW5qZWN0aW9uVG9rZW48RGlhbG9nUmVmPGFueT4+KCdDUUFfRElBTE9HX1JFRicpO1xuZXhwb3J0IGNvbnN0IERJQUxPR19EQVRBID0gbmV3IEluamVjdGlvblRva2VuPGFueT4oJ0NRQV9ESUFMT0dfREFUQScpO1xuXG5cbiJdfQ==
@@ -0,0 +1,34 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ export class RootWrapperComponent {
5
+ constructor() {
6
+ this.display = 'inline-block';
7
+ this.fullWidth = false;
8
+ }
9
+ get rootStyles() {
10
+ const styles = {
11
+ display: this.fullWidth ? 'block' : this.display
12
+ };
13
+ if (this.fullWidth) {
14
+ styles['width'] = '100%';
15
+ }
16
+ else if (this.width) {
17
+ styles['width'] = this.width;
18
+ }
19
+ return styles;
20
+ }
21
+ }
22
+ RootWrapperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: RootWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23
+ RootWrapperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: RootWrapperComponent, selector: "cqa-ui-root", inputs: { display: "display", width: "width", fullWidth: "fullWidth" }, ngImport: i0, template: "<div id=\"cqa-ui-root\" [ngStyle]=\"rootStyles\">\n <ng-content></ng-content>\n</div>\n\n", directives: [{ type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: RootWrapperComponent, decorators: [{
25
+ type: Component,
26
+ args: [{ selector: 'cqa-ui-root', styles: [], template: "<div id=\"cqa-ui-root\" [ngStyle]=\"rootStyles\">\n <ng-content></ng-content>\n</div>\n\n" }]
27
+ }], propDecorators: { display: [{
28
+ type: Input
29
+ }], width: [{
30
+ type: Input
31
+ }], fullWidth: [{
32
+ type: Input
33
+ }] } });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdC13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcm9vdC13cmFwcGVyL3Jvb3Qtd3JhcHBlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Jvb3Qtd3JhcHBlci9yb290LXdyYXBwZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU9qRCxNQUFNLE9BQU8sb0JBQW9CO0lBTGpDO1FBTVcsWUFBTyxHQUFpRSxjQUFjLENBQUM7UUFFdkYsY0FBUyxHQUFHLEtBQUssQ0FBQztLQWU1QjtJQWJDLElBQUksVUFBVTtRQUNaLE1BQU0sTUFBTSxHQUEyQjtZQUNyQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztTQUNqRCxDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUM7U0FDMUI7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDOUI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztpSEFqQlUsb0JBQW9CO3FHQUFwQixvQkFBb0IsMkhDUGpDLDRGQUlBOzJGREdhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxhQUFhLFVBRWYsRUFBRTs4QkFHRCxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS11aS1yb290JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Jvb3Qtd3JhcHBlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW11cbn0pXG5leHBvcnQgY2xhc3MgUm9vdFdyYXBwZXJDb21wb25lbnQge1xuICBASW5wdXQoKSBkaXNwbGF5OiAnYmxvY2snIHwgJ2lubGluZS1ibG9jaycgfCAnaW5saW5lJyB8ICdpbmxpbmUtZmxleCcgfCAnZmxleCcgPSAnaW5saW5lLWJsb2NrJztcbiAgQElucHV0KCkgd2lkdGg/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZ1bGxXaWR0aCA9IGZhbHNlO1xuXG4gIGdldCByb290U3R5bGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGRpc3BsYXk6IHRoaXMuZnVsbFdpZHRoID8gJ2Jsb2NrJyA6IHRoaXMuZGlzcGxheVxuICAgIH07XG4gICAgXG4gICAgaWYgKHRoaXMuZnVsbFdpZHRoKSB7XG4gICAgICBzdHlsZXNbJ3dpZHRoJ10gPSAnMTAwJSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBzdHlsZXNbJ3dpZHRoJ10gPSB0aGlzLndpZHRoO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc3R5bGVzO1xuICB9XG59XG5cbiIsIjxkaXYgaWQ9XCJjcWEtdWktcm9vdFwiIFtuZ1N0eWxlXT1cInJvb3RTdHlsZXNcIj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG5cbiJdfQ==
@@ -0,0 +1,111 @@
1
+ import { Component, EventEmitter, Input, Output, HostBinding } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/icon";
4
+ import * as i2 from "@angular/forms";
5
+ import * as i3 from "@angular/common";
6
+ export class SearchBarComponent {
7
+ constructor() {
8
+ this.id = 'cqa-ui-root';
9
+ /** Placeholder text for the input */
10
+ this.placeholder = 'Search';
11
+ /** Initial value or externally controlled value */
12
+ this.value = '';
13
+ /** Disable interactions */
14
+ this.disabled = false;
15
+ /** Whether the clear button should be visible when there is text */
16
+ this.showClear = true;
17
+ /** Accessible label for the input */
18
+ this.ariaLabel = 'Search';
19
+ /** Automatically focus the input when rendered */
20
+ this.autoFocus = false;
21
+ /** Search bar size */
22
+ this.size = 'md';
23
+ /** Stretch to fill container width */
24
+ this.fullWidth = false;
25
+ /** Emit on value changes (e.g. for two-way binding) */
26
+ this.valueChange = new EventEmitter();
27
+ /** Emit when user submits search (Enter key or form submit) */
28
+ this.search = new EventEmitter();
29
+ /** Emit when the value is cleared via the clear button */
30
+ this.cleared = new EventEmitter();
31
+ this.inputValue = '';
32
+ this.widthClasses = {
33
+ sm: 'w-[295px]',
34
+ md: 'w-[395px]',
35
+ lg: 'w-[495px]',
36
+ };
37
+ }
38
+ get displayStyle() {
39
+ return this.fullWidth ? 'block' : 'inline-block';
40
+ }
41
+ get widthStyle() {
42
+ return this.fullWidth ? '100%' : 'auto';
43
+ }
44
+ ngOnChanges(changes) {
45
+ if (changes['value'] && changes['value'].currentValue !== undefined) {
46
+ const newValue = changes['value'].currentValue ?? '';
47
+ if (newValue !== this.inputValue) {
48
+ this.inputValue = newValue;
49
+ }
50
+ }
51
+ }
52
+ onInput(event) {
53
+ const target = event.target;
54
+ const nextValue = target?.value ?? '';
55
+ this.inputValue = nextValue;
56
+ this.valueChange.emit(this.inputValue);
57
+ }
58
+ onSubmit(event) {
59
+ event.preventDefault();
60
+ if (this.disabled) {
61
+ return;
62
+ }
63
+ this.search.emit(this.inputValue.trim());
64
+ }
65
+ clear() {
66
+ if (this.disabled || this.inputValue === '') {
67
+ return;
68
+ }
69
+ this.inputValue = '';
70
+ this.valueChange.emit('');
71
+ this.cleared.emit();
72
+ }
73
+ }
74
+ SearchBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SearchBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
75
+ SearchBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SearchBarComponent, selector: "cqa-search-bar", inputs: { placeholder: "placeholder", value: "value", disabled: "disabled", showClear: "showClear", ariaLabel: "ariaLabel", autoFocus: "autoFocus", size: "size", fullWidth: "fullWidth" }, outputs: { valueChange: "valueChange", search: "search", cleared: "cleared" }, host: { properties: { "attr.id": "this.id", "style.display": "this.displayStyle", "style.width": "this.widthStyle" } }, usesOnChanges: true, ngImport: i0, template: "<form\n class=\"inline-flex items-center gap-2 px-6 py-3 text-[14px] border border-gray-200 rounded-md bg-white shadow-sm transition-colors\"\n [ngClass]=\"fullWidth ? 'w-full' : widthClasses[size]\"\n (submit)=\"onSubmit($event)\"\n>\n <span\n class=\"flex-none flex items-center justify-center text-gray-400 w-4 h-4\"\n [ngClass]=\"{ 'opacity-[0.38]': disabled }\"\n >\n <mat-icon\n class=\"flex items-center justify-center leading-none p-0\"\n [style.width.px]=\"16\"\n [style.height.px]=\"16\"\n [style.fontSize.px]=\"16\"\n >\n search\n </mat-icon>\n </span>\n\n <input\n type=\"text\"\n class=\"flex-1 min-w-[180px] border-none outline-none bg-transparent placeholder:text-gray-400 disabled:text-gray-400 disabled:cursor-not-allowed font-['SF_Pro_Text'] font-normal text-[12.3px] leading-none tracking-normal align-middle text-[#99999E]\"\n style=\"font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; letter-spacing: 0;\"\n [placeholder]=\"placeholder\"\n [value]=\"inputValue\"\n (input)=\"onInput($event)\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ariaLabel\"\n autocomplete=\"off\"\n autocapitalize=\"none\"\n spellcheck=\"false\"\n [attr.autofocus]=\"autoFocus ? '' : null\"\n />\n\n <button\n *ngIf=\"showClear && inputValue\"\n type=\"button\"\n class=\"flex items-center justify-center p-0 w-4 h-4 border-0 bg-transparent cursor-pointer text-gray-500 hover:text-gray-700 disabled:text-gray-300 transition-colors leading-none\"\n (click)=\"clear()\"\n [disabled]=\"disabled\"\n aria-label=\"Clear search\"\n >\n <mat-icon\n class=\"flex items-center justify-center leading-none p-0\"\n [style.width.px]=\"16\"\n [style.height.px]=\"16\"\n [style.fontSize.px]=\"16\"\n [ngClass]=\"{ 'opacity-[0.38]': disabled }\"\n >\n close\n </mat-icon>\n </button>\n</form>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
76
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SearchBarComponent, decorators: [{
77
+ type: Component,
78
+ args: [{ selector: 'cqa-search-bar', template: "<form\n class=\"inline-flex items-center gap-2 px-6 py-3 text-[14px] border border-gray-200 rounded-md bg-white shadow-sm transition-colors\"\n [ngClass]=\"fullWidth ? 'w-full' : widthClasses[size]\"\n (submit)=\"onSubmit($event)\"\n>\n <span\n class=\"flex-none flex items-center justify-center text-gray-400 w-4 h-4\"\n [ngClass]=\"{ 'opacity-[0.38]': disabled }\"\n >\n <mat-icon\n class=\"flex items-center justify-center leading-none p-0\"\n [style.width.px]=\"16\"\n [style.height.px]=\"16\"\n [style.fontSize.px]=\"16\"\n >\n search\n </mat-icon>\n </span>\n\n <input\n type=\"text\"\n class=\"flex-1 min-w-[180px] border-none outline-none bg-transparent placeholder:text-gray-400 disabled:text-gray-400 disabled:cursor-not-allowed font-['SF_Pro_Text'] font-normal text-[12.3px] leading-none tracking-normal align-middle text-[#99999E]\"\n style=\"font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; letter-spacing: 0;\"\n [placeholder]=\"placeholder\"\n [value]=\"inputValue\"\n (input)=\"onInput($event)\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ariaLabel\"\n autocomplete=\"off\"\n autocapitalize=\"none\"\n spellcheck=\"false\"\n [attr.autofocus]=\"autoFocus ? '' : null\"\n />\n\n <button\n *ngIf=\"showClear && inputValue\"\n type=\"button\"\n class=\"flex items-center justify-center p-0 w-4 h-4 border-0 bg-transparent cursor-pointer text-gray-500 hover:text-gray-700 disabled:text-gray-300 transition-colors leading-none\"\n (click)=\"clear()\"\n [disabled]=\"disabled\"\n aria-label=\"Clear search\"\n >\n <mat-icon\n class=\"flex items-center justify-center leading-none p-0\"\n [style.width.px]=\"16\"\n [style.height.px]=\"16\"\n [style.fontSize.px]=\"16\"\n [ngClass]=\"{ 'opacity-[0.38]': disabled }\"\n >\n close\n </mat-icon>\n </button>\n</form>\n", styles: [] }]
79
+ }], propDecorators: { id: [{
80
+ type: HostBinding,
81
+ args: ['attr.id']
82
+ }], displayStyle: [{
83
+ type: HostBinding,
84
+ args: ['style.display']
85
+ }], widthStyle: [{
86
+ type: HostBinding,
87
+ args: ['style.width']
88
+ }], placeholder: [{
89
+ type: Input
90
+ }], value: [{
91
+ type: Input
92
+ }], disabled: [{
93
+ type: Input
94
+ }], showClear: [{
95
+ type: Input
96
+ }], ariaLabel: [{
97
+ type: Input
98
+ }], autoFocus: [{
99
+ type: Input
100
+ }], size: [{
101
+ type: Input
102
+ }], fullWidth: [{
103
+ type: Input
104
+ }], valueChange: [{
105
+ type: Output
106
+ }], search: [{
107
+ type: Output
108
+ }], cleared: [{
109
+ type: Output
110
+ }] } });
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlYXJjaC1iYXIvc2VhcmNoLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlYXJjaC1iYXIvc2VhcmNoLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBUzlHLE1BQU0sT0FBTyxrQkFBa0I7SUFML0I7UUFNMEIsT0FBRSxHQUFHLGFBQWEsQ0FBQztRQVEzQyxxQ0FBcUM7UUFDNUIsZ0JBQVcsR0FBRyxRQUFRLENBQUM7UUFFaEMsbURBQW1EO1FBQzFDLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFcEIsMkJBQTJCO1FBQ2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUIsb0VBQW9FO1FBQzNELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFMUIscUNBQXFDO1FBQzVCLGNBQVMsR0FBRyxRQUFRLENBQUM7UUFFOUIsa0RBQWtEO1FBQ3pDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0Isc0JBQXNCO1FBQ2IsU0FBSSxHQUFrQixJQUFJLENBQUM7UUFFcEMsc0NBQXNDO1FBQzdCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0IsdURBQXVEO1FBQzdDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVuRCwrREFBK0Q7UUFDckQsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFOUMsMERBQTBEO1FBQ2hELFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTdDLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFXUCxpQkFBWSxHQUFrQztZQUNyRCxFQUFFLEVBQUUsV0FBVztZQUNmLEVBQUUsRUFBRSxXQUFXO1lBQ2YsRUFBRSxFQUFFLFdBQVc7U0FDaEIsQ0FBQztLQTJCSDtJQWxGQyxJQUFrQyxZQUFZO1FBQzVDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDbkQsQ0FBQztJQUNELElBQWdDLFVBQVU7UUFDeEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQyxDQUFDO0lBcUNELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUNuRSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUNyRCxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQzthQUM1QjtTQUNGO0lBQ0gsQ0FBQztJQVFELE9BQU8sQ0FBQyxLQUFZO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFpQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQVk7UUFDbkIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxFQUFFLEVBQUU7WUFDM0MsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDOzsrR0FuRlUsa0JBQWtCO21HQUFsQixrQkFBa0IsOGNDVC9CLG1nRUFxREE7MkZENUNhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxnQkFBZ0I7OEJBS0YsRUFBRTtzQkFBekIsV0FBVzt1QkFBQyxTQUFTO2dCQUNZLFlBQVk7c0JBQTdDLFdBQVc7dUJBQUMsZUFBZTtnQkFHSSxVQUFVO3NCQUF6QyxXQUFXO3VCQUFDLGFBQWE7Z0JBS2pCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csSUFBSTtzQkFBWixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0ksV0FBVztzQkFBcEIsTUFBTTtnQkFHRyxNQUFNO3NCQUFmLE1BQU07Z0JBR0csT0FBTztzQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbnR5cGUgU2VhcmNoQmFyU2l6ZSA9ICdzbScgfCAnbWQnIHwgJ2xnJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXNlYXJjaC1iYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWJhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoQmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJykgaWQgPSAnY3FhLXVpLXJvb3QnO1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKSBnZXQgZGlzcGxheVN0eWxlKCkge1xuICAgIHJldHVybiB0aGlzLmZ1bGxXaWR0aCA/ICdibG9jaycgOiAnaW5saW5lLWJsb2NrJztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoJykgZ2V0IHdpZHRoU3R5bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnVsbFdpZHRoID8gJzEwMCUnIDogJ2F1dG8nO1xuICB9XG5cbiAgLyoqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dCAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdTZWFyY2gnO1xuXG4gIC8qKiBJbml0aWFsIHZhbHVlIG9yIGV4dGVybmFsbHkgY29udHJvbGxlZCB2YWx1ZSAqL1xuICBASW5wdXQoKSB2YWx1ZSA9ICcnO1xuXG4gIC8qKiBEaXNhYmxlIGludGVyYWN0aW9ucyAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjbGVhciBidXR0b24gc2hvdWxkIGJlIHZpc2libGUgd2hlbiB0aGVyZSBpcyB0ZXh0ICovXG4gIEBJbnB1dCgpIHNob3dDbGVhciA9IHRydWU7XG5cbiAgLyoqIEFjY2Vzc2libGUgbGFiZWwgZm9yIHRoZSBpbnB1dCAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWwgPSAnU2VhcmNoJztcblxuICAvKiogQXV0b21hdGljYWxseSBmb2N1cyB0aGUgaW5wdXQgd2hlbiByZW5kZXJlZCAqL1xuICBASW5wdXQoKSBhdXRvRm9jdXMgPSBmYWxzZTtcblxuICAvKiogU2VhcmNoIGJhciBzaXplICovXG4gIEBJbnB1dCgpIHNpemU6IFNlYXJjaEJhclNpemUgPSAnbWQnO1xuXG4gIC8qKiBTdHJldGNoIHRvIGZpbGwgY29udGFpbmVyIHdpZHRoICovXG4gIEBJbnB1dCgpIGZ1bGxXaWR0aCA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0IG9uIHZhbHVlIGNoYW5nZXMgKGUuZy4gZm9yIHR3by13YXkgYmluZGluZykgKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiB1c2VyIHN1Ym1pdHMgc2VhcmNoIChFbnRlciBrZXkgb3IgZm9ybSBzdWJtaXQpICovXG4gIEBPdXRwdXQoKSBzZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogRW1pdCB3aGVuIHRoZSB2YWx1ZSBpcyBjbGVhcmVkIHZpYSB0aGUgY2xlYXIgYnV0dG9uICovXG4gIEBPdXRwdXQoKSBjbGVhcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGlucHV0VmFsdWUgPSAnJztcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3ZhbHVlJ10gJiYgY2hhbmdlc1sndmFsdWUnXS5jdXJyZW50VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBjaGFuZ2VzWyd2YWx1ZSddLmN1cnJlbnRWYWx1ZSA/PyAnJztcbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdGhpcy5pbnB1dFZhbHVlKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlYWRvbmx5IHdpZHRoQ2xhc3NlczogUmVjb3JkPFNlYXJjaEJhclNpemUsIHN0cmluZz4gPSB7XG4gICAgc206ICd3LVsyOTVweF0nLFxuICAgIG1kOiAndy1bMzk1cHhdJyxcbiAgICBsZzogJ3ctWzQ5NXB4XScsXG4gIH07XG5cbiAgb25JbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgbmV4dFZhbHVlID0gdGFyZ2V0Py52YWx1ZSA/PyAnJztcbiAgICB0aGlzLmlucHV0VmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuaW5wdXRWYWx1ZSk7XG4gIH1cblxuICBvblN1Ym1pdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2guZW1pdCh0aGlzLmlucHV0VmFsdWUudHJpbSgpKTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMuaW5wdXRWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlucHV0VmFsdWUgPSAnJztcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoJycpO1xuICAgIHRoaXMuY2xlYXJlZC5lbWl0KCk7XG4gIH1cbn1cbiIsIjxmb3JtXG4gIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTYgcHktMyB0ZXh0LVsxNHB4XSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQtbWQgYmctd2hpdGUgc2hhZG93LXNtIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgW25nQ2xhc3NdPVwiZnVsbFdpZHRoID8gJ3ctZnVsbCcgOiB3aWR0aENsYXNzZXNbc2l6ZV1cIlxuICAoc3VibWl0KT1cIm9uU3VibWl0KCRldmVudClcIlxuPlxuICAgIDxzcGFuXG4gICAgICBjbGFzcz1cImZsZXgtbm9uZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWdyYXktNDAwIHctNCBoLTRcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnb3BhY2l0eS1bMC4zOF0nOiBkaXNhYmxlZCB9XCJcbiAgICA+XG4gICAgICA8bWF0LWljb25cbiAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBsZWFkaW5nLW5vbmUgcC0wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIjE2XCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCIxNlwiXG4gICAgICAgIFtzdHlsZS5mb250U2l6ZS5weF09XCIxNlwiXG4gICAgICA+XG4gICAgICAgIHNlYXJjaFxuICAgICAgPC9tYXQtaWNvbj5cbiAgICA8L3NwYW4+XG5cbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIGNsYXNzPVwiZmxleC0xIG1pbi13LVsxODBweF0gYm9yZGVyLW5vbmUgb3V0bGluZS1ub25lIGJnLXRyYW5zcGFyZW50IHBsYWNlaG9sZGVyOnRleHQtZ3JheS00MDAgZGlzYWJsZWQ6dGV4dC1ncmF5LTQwMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZm9udC1bJ1NGX1Byb19UZXh0J10gZm9udC1ub3JtYWwgdGV4dC1bMTIuM3B4XSBsZWFkaW5nLW5vbmUgdHJhY2tpbmctbm9ybWFsIGFsaWduLW1pZGRsZSB0ZXh0LVsjOTk5OTlFXVwiXG4gICAgICBzdHlsZT1cImZvbnQtZmFtaWx5OiAnU0YgUHJvIFRleHQnLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAwO1wiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgW3ZhbHVlXT1cImlucHV0VmFsdWVcIlxuICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIGF1dG9jYXBpdGFsaXplPVwibm9uZVwiXG4gICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgW2F0dHIuYXV0b2ZvY3VzXT1cImF1dG9Gb2N1cyA/ICcnIDogbnVsbFwiXG4gICAgLz5cblxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwic2hvd0NsZWFyICYmIGlucHV0VmFsdWVcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtMCB3LTQgaC00IGJvcmRlci0wIGJnLXRyYW5zcGFyZW50IGN1cnNvci1wb2ludGVyIHRleHQtZ3JheS01MDAgaG92ZXI6dGV4dC1ncmF5LTcwMCBkaXNhYmxlZDp0ZXh0LWdyYXktMzAwIHRyYW5zaXRpb24tY29sb3JzIGxlYWRpbmctbm9uZVwiXG4gICAgICAoY2xpY2spPVwiY2xlYXIoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIHNlYXJjaFwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uXG4gICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbGVhZGluZy1ub25lIHAtMFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCIxNlwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiMTZcIlxuICAgICAgICBbc3R5bGUuZm9udFNpemUucHhdPVwiMTZcIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdvcGFjaXR5LVswLjM4XSc6IGRpc2FibGVkIH1cIlxuICAgICAgPlxuICAgICAgICBjbG9zZVxuICAgICAgPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbjwvZm9ybT5cbiJdfQ==
@@ -0,0 +1,219 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild, ViewChildren, HostBinding, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ export class SegmentControlComponent {
5
+ constructor() {
6
+ this.id = 'cqa-ui-root';
7
+ this.display = 'inline-block';
8
+ this.segments = [
9
+ { label: 'Tab Group', value: 'tab-group-1' },
10
+ { label: 'Tab Group', value: 'tab-group-2' },
11
+ ];
12
+ this.disabled = false;
13
+ this.valueChange = new EventEmitter();
14
+ this.indicatorStyle = {};
15
+ this.indicatorVisible = false;
16
+ }
17
+ ngOnChanges(changes) {
18
+ if (changes['segments'] || changes['value']) {
19
+ this.ensureSelectedValue();
20
+ }
21
+ }
22
+ ngAfterViewInit() {
23
+ this.buttonChangesSub = this.segmentButtons.changes.subscribe(() => this.updateIndicator());
24
+ this.ensureSelectedValue();
25
+ this.updateIndicator();
26
+ }
27
+ ngOnDestroy() {
28
+ this.buttonChangesSub?.unsubscribe?.();
29
+ }
30
+ trackByValue(_index, option) {
31
+ return option.value;
32
+ }
33
+ isSelected(option) {
34
+ return option.value === this.value;
35
+ }
36
+ select(option, index) {
37
+ if (this.disabled || option.disabled) {
38
+ return;
39
+ }
40
+ const nextValue = option.value;
41
+ if (nextValue !== this.value) {
42
+ this.value = nextValue;
43
+ this.valueChange.emit(nextValue);
44
+ }
45
+ this.focusButton(index);
46
+ this.updateIndicator();
47
+ }
48
+ onKeyDown(event, currentIndex) {
49
+ if (this.disabled) {
50
+ return;
51
+ }
52
+ switch (event.key) {
53
+ case 'ArrowRight':
54
+ case 'ArrowDown':
55
+ event.preventDefault();
56
+ this.moveSelection(1, currentIndex);
57
+ break;
58
+ case 'ArrowLeft':
59
+ case 'ArrowUp':
60
+ event.preventDefault();
61
+ this.moveSelection(-1, currentIndex);
62
+ break;
63
+ case 'Home':
64
+ event.preventDefault();
65
+ this.selectFirstEnabled();
66
+ break;
67
+ case 'End':
68
+ event.preventDefault();
69
+ this.selectLastEnabled();
70
+ break;
71
+ case ' ':
72
+ case 'Enter':
73
+ event.preventDefault();
74
+ this.select(this.segments[currentIndex], currentIndex);
75
+ break;
76
+ default:
77
+ break;
78
+ }
79
+ }
80
+ moveSelection(step, startIndex) {
81
+ const enabledIndexes = this.getEnabledIndexes();
82
+ if (enabledIndexes.length === 0) {
83
+ return;
84
+ }
85
+ const currentEnabledIndex = enabledIndexes.indexOf(startIndex);
86
+ const fallbackIndex = this.getSelectedIndex(enabledIndexes);
87
+ const baseIndex = currentEnabledIndex >= 0 ? currentEnabledIndex : fallbackIndex;
88
+ const nextPosition = (baseIndex + step + enabledIndexes.length) % enabledIndexes.length;
89
+ const targetIndex = enabledIndexes[nextPosition];
90
+ this.select(this.segments[targetIndex], targetIndex);
91
+ }
92
+ selectFirstEnabled() {
93
+ const enabledIndexes = this.getEnabledIndexes();
94
+ if (enabledIndexes.length > 0) {
95
+ const index = enabledIndexes[0];
96
+ this.select(this.segments[index], index);
97
+ this.updateIndicator();
98
+ }
99
+ }
100
+ selectLastEnabled() {
101
+ const enabledIndexes = this.getEnabledIndexes();
102
+ if (enabledIndexes.length > 0) {
103
+ const index = enabledIndexes[enabledIndexes.length - 1];
104
+ this.select(this.segments[index], index);
105
+ this.updateIndicator();
106
+ }
107
+ }
108
+ getEnabledIndexes() {
109
+ return this.segments
110
+ .map((option, index) => ({ option, index }))
111
+ .filter(({ option }) => !option.disabled)
112
+ .map(({ index }) => index);
113
+ }
114
+ getSelectedIndex(enabledIndexes) {
115
+ const current = this.segments.findIndex((option) => option.value === this.value && !option.disabled);
116
+ if (current >= 0) {
117
+ return enabledIndexes.indexOf(current);
118
+ }
119
+ return 0;
120
+ }
121
+ ensureSelectedValue() {
122
+ const enabled = this.segments.filter((option) => !option.disabled);
123
+ if (enabled.length === 0) {
124
+ this.value = undefined;
125
+ return;
126
+ }
127
+ if (!this.value || !this.segments.some((option) => option.value === this.value)) {
128
+ this.value = enabled[0].value;
129
+ this.valueChange.emit(this.value);
130
+ const index = this.segments.indexOf(enabled[0]);
131
+ this.focusButton(index);
132
+ this.updateIndicator(index);
133
+ return;
134
+ }
135
+ const selected = this.segments.find((option) => option.value === this.value);
136
+ if (selected?.disabled) {
137
+ this.value = enabled[0].value;
138
+ this.valueChange.emit(this.value);
139
+ const index = this.segments.indexOf(enabled[0]);
140
+ this.focusButton(index);
141
+ this.updateIndicator(index);
142
+ }
143
+ this.updateIndicator();
144
+ }
145
+ focusButton(index) {
146
+ queueMicrotask(() => {
147
+ const button = this.segmentButtons?.get(index)?.nativeElement;
148
+ button?.focus();
149
+ });
150
+ }
151
+ updateIndicator(preferredIndex) {
152
+ queueMicrotask(() => {
153
+ const container = this.segmentContainer?.nativeElement;
154
+ const buttons = this.segmentButtons?.toArray() ?? [];
155
+ if (!container || buttons.length === 0) {
156
+ this.indicatorVisible = false;
157
+ this.indicatorStyle = {};
158
+ return;
159
+ }
160
+ const index = preferredIndex ?? buttons.findIndex((button, idx) => this.segments[idx]?.value === this.value);
161
+ if (index === -1) {
162
+ this.indicatorVisible = false;
163
+ this.indicatorStyle = {};
164
+ return;
165
+ }
166
+ const buttonEl = buttons[index]?.nativeElement;
167
+ if (!buttonEl) {
168
+ this.indicatorVisible = false;
169
+ this.indicatorStyle = {};
170
+ return;
171
+ }
172
+ const containerRect = container.getBoundingClientRect();
173
+ const buttonRect = buttonEl.getBoundingClientRect();
174
+ const offsetLeft = buttonEl.offsetLeft;
175
+ const offsetTop = buttonEl.offsetTop;
176
+ const width = buttonEl.offsetWidth;
177
+ const height = buttonEl.offsetHeight;
178
+ const isDisabled = this.disabled || this.segments[index]?.disabled;
179
+ this.indicatorStyle = {
180
+ width: `${width}px`,
181
+ height: `${height}px`,
182
+ left: `${offsetLeft}px`,
183
+ top: `${offsetTop}px`,
184
+ backgroundColor: isDisabled ? '#9BA0F4' : '#3F43EE',
185
+ };
186
+ this.indicatorVisible = true;
187
+ });
188
+ }
189
+ get isIndicatorVisible() {
190
+ return this.indicatorVisible;
191
+ }
192
+ }
193
+ SegmentControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SegmentControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
194
+ SegmentControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SegmentControlComponent, selector: "cqa-segment-control", inputs: { segments: "segments", value: "value", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, host: { properties: { "attr.id": "this.id", "style.display": "this.display" } }, viewQueries: [{ propertyName: "segmentContainer", first: true, predicate: ["segmentContainer"], descendants: true }, { propertyName: "segmentButtons", predicate: ["segmentButton"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #segmentContainer\n class=\"relative inline-flex flex-row items-start p-[3.5px] h-[31.5px] bg-[#F5F5F5] rounded-[8px]\"\n role=\"tablist\"\n [attr.aria-disabled]=\"disabled || null\"\n>\n <div\n class=\"absolute rounded-[8px] transition-all duration-200 ease-in-out pointer-events-none\"\n [class.opacity-0]=\"!isIndicatorVisible\"\n [ngStyle]=\"indicatorStyle\"\n aria-hidden=\"true\"\n ></div>\n\n <button\n *ngFor=\"let segment of segments; index as index; trackBy: trackByValue\"\n #segmentButton\n type=\"button\"\n role=\"tab\"\n class=\"relative z-10 flex flex-col justify-center items-center px-[14px] py-[3.5px] h-[25px] rounded-[8px] transition-all duration-200 ease-in-out whitespace-nowrap text-center focus:outline-none focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 flex-none\"\n [ngClass]=\"{\n 'text-white font-medium': isSelected(segment),\n 'text-[#99999E]': !isSelected(segment) && !(disabled || segment.disabled),\n 'cursor-not-allowed': disabled || segment.disabled,\n 'text-[#C7C7C7]': (disabled || segment.disabled) && !isSelected(segment),\n 'hover:text-black': !isSelected(segment) && !disabled && !segment.disabled\n }\"\n [disabled]=\"disabled || segment.disabled\"\n [attr.aria-selected]=\"isSelected(segment)\"\n [attr.tabindex]=\"!disabled && !segment.disabled ? (isSelected(segment) ? 0 : -1) : -1\"\n (click)=\"select(segment, index)\"\n (keydown)=\"onKeyDown($event, index)\"\n >\n <span class=\"flex items-center justify-center h-[18px] font-['Inter'] font-normal text-[12px] leading-[12px] text-center align-middle\">\n {{ segment.label }}\n </span>\n </button>\n</div>\n", directives: [{ type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
195
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SegmentControlComponent, decorators: [{
196
+ type: Component,
197
+ args: [{ selector: 'cqa-segment-control', template: "<div\n #segmentContainer\n class=\"relative inline-flex flex-row items-start p-[3.5px] h-[31.5px] bg-[#F5F5F5] rounded-[8px]\"\n role=\"tablist\"\n [attr.aria-disabled]=\"disabled || null\"\n>\n <div\n class=\"absolute rounded-[8px] transition-all duration-200 ease-in-out pointer-events-none\"\n [class.opacity-0]=\"!isIndicatorVisible\"\n [ngStyle]=\"indicatorStyle\"\n aria-hidden=\"true\"\n ></div>\n\n <button\n *ngFor=\"let segment of segments; index as index; trackBy: trackByValue\"\n #segmentButton\n type=\"button\"\n role=\"tab\"\n class=\"relative z-10 flex flex-col justify-center items-center px-[14px] py-[3.5px] h-[25px] rounded-[8px] transition-all duration-200 ease-in-out whitespace-nowrap text-center focus:outline-none focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 flex-none\"\n [ngClass]=\"{\n 'text-white font-medium': isSelected(segment),\n 'text-[#99999E]': !isSelected(segment) && !(disabled || segment.disabled),\n 'cursor-not-allowed': disabled || segment.disabled,\n 'text-[#C7C7C7]': (disabled || segment.disabled) && !isSelected(segment),\n 'hover:text-black': !isSelected(segment) && !disabled && !segment.disabled\n }\"\n [disabled]=\"disabled || segment.disabled\"\n [attr.aria-selected]=\"isSelected(segment)\"\n [attr.tabindex]=\"!disabled && !segment.disabled ? (isSelected(segment) ? 0 : -1) : -1\"\n (click)=\"select(segment, index)\"\n (keydown)=\"onKeyDown($event, index)\"\n >\n <span class=\"flex items-center justify-center h-[18px] font-['Inter'] font-normal text-[12px] leading-[12px] text-center align-middle\">\n {{ segment.label }}\n </span>\n </button>\n</div>\n", styles: [] }]
198
+ }], propDecorators: { id: [{
199
+ type: HostBinding,
200
+ args: ['attr.id']
201
+ }], display: [{
202
+ type: HostBinding,
203
+ args: ['style.display']
204
+ }], segments: [{
205
+ type: Input
206
+ }], value: [{
207
+ type: Input
208
+ }], disabled: [{
209
+ type: Input
210
+ }], valueChange: [{
211
+ type: Output
212
+ }], segmentButtons: [{
213
+ type: ViewChildren,
214
+ args: ['segmentButton']
215
+ }], segmentContainer: [{
216
+ type: ViewChild,
217
+ args: ['segmentContainer']
218
+ }] } });
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudC1jb250cm9sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VnbWVudC1jb250cm9sL3NlZ21lbnQtY29udHJvbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlZ21lbnQtY29udHJvbC9zZWdtZW50LWNvbnRyb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQzs7O0FBY3ZCLE1BQU0sT0FBTyx1QkFBdUI7SUFMcEM7UUFNMEIsT0FBRSxHQUFHLGFBQWEsQ0FBQztRQUNiLFlBQU8sR0FBRyxjQUFjLENBQUM7UUFFOUMsYUFBUSxHQUFvQjtZQUNuQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTtZQUM1QyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTtTQUM3QyxDQUFDO1FBR08sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVoQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFLbkQsbUJBQWMsR0FBMkIsRUFBRSxDQUFDO1FBQzVDLHFCQUFnQixHQUFHLEtBQUssQ0FBQztLQTZNMUI7SUExTUMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMzQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUs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QUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQ25DLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7WUFFckMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQztZQUNuRSxJQUFJLENBQUMsY0FBYyxHQUFHO2dCQUNwQixLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUk7Z0JBQ25CLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSTtnQkFDckIsSUFBSSxFQUFFLEdBQUcsVUFBVSxJQUFJO2dCQUN2QixHQUFHLEVBQUUsR0FBRyxTQUFTLElBQUk7Z0JBQ3JCLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNwRCxDQUFDO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDOztvSEE5TlUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsNmRDNUJwQywrdkRBcUNBOzJGRFRhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUI7OEJBS1AsRUFBRTtzQkFBekIsV0FBVzt1QkFBQyxTQUFTO2dCQUNRLE9BQU87c0JBQXBDLFdBQVc7dUJBQUMsZUFBZTtnQkFFbkIsUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUV3QixjQUFjO3NCQUE1QyxZQUFZO3VCQUFDLGVBQWU7Z0JBQ0UsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgSG9zdEJpbmRpbmcsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbnR5cGUgU2VnbWVudE9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXNlZ21lbnQtY29udHJvbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWdtZW50LWNvbnRyb2wuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBTZWdtZW50Q29udHJvbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJykgaWQgPSAnY3FhLXVpLXJvb3QnO1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKSBkaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG5cbiAgQElucHV0KCkgc2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnVGFiIEdyb3VwJywgdmFsdWU6ICd0YWItZ3JvdXAtMScgfSxcbiAgICB7IGxhYmVsOiAnVGFiIEdyb3VwJywgdmFsdWU6ICd0YWItZ3JvdXAtMicgfSxcbiAgXTtcblxuICBASW5wdXQoKSB2YWx1ZT86IHN0cmluZztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkcmVuKCdzZWdtZW50QnV0dG9uJykgc2VnbWVudEJ1dHRvbnMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD4+O1xuICBAVmlld0NoaWxkKCdzZWdtZW50Q29udGFpbmVyJykgc2VnbWVudENvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIGluZGljYXRvclN0eWxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGluZGljYXRvclZpc2libGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBidXR0b25DaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc2VnbWVudHMnXSB8fCBjaGFuZ2VzWyd2YWx1ZSddKSB7XG4gICAgICB0aGlzLmVuc3VyZVNlbGVjdGVkVmFsdWUoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idXR0b25DaGFuZ2VzU3ViID0gdGhpcy5zZWdtZW50QnV0dG9ucy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZUluZGljYXRvcigpKTtcbiAgICB0aGlzLmVuc3VyZVNlbGVjdGVkVmFsdWUoKTtcbiAgICB0aGlzLnVwZGF0ZUluZGljYXRvcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5idXR0b25DaGFuZ2VzU3ViPy51bnN1YnNjcmliZT8uKCk7XG4gIH1cblxuICB0cmFja0J5VmFsdWUoX2luZGV4OiBudW1iZXIsIG9wdGlvbjogU2VnbWVudE9wdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG9wdGlvbi52YWx1ZTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQob3B0aW9uOiBTZWdtZW50T3B0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG9wdGlvbi52YWx1ZSA9PT0gdGhpcy52YWx1ZTtcbiAgfVxuXG4gIHNlbGVjdChvcHRpb246IFNlZ21lbnRPcHRpb24sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBvcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0VmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgaWYgKG5leHRWYWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5leHRWYWx1ZTtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChuZXh0VmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuZm9jdXNCdXR0b24oaW5kZXgpO1xuICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yKCk7XG4gIH1cblxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGN1cnJlbnRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVTZWxlY3Rpb24oMSwgY3VycmVudEluZGV4KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZVNlbGVjdGlvbigtMSwgY3VycmVudEluZGV4KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RGaXJzdEVuYWJsZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNlbGVjdExhc3RFbmFibGVkKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnICc6XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VsZWN0KHRoaXMuc2VnbWVudHNbY3VycmVudEluZGV4XSwgY3VycmVudEluZGV4KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vdmVTZWxlY3Rpb24oc3RlcDogMSB8IC0xLCBzdGFydEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBlbmFibGVkSW5kZXhlcyA9IHRoaXMuZ2V0RW5hYmxlZEluZGV4ZXMoKTtcbiAgICBpZiAoZW5hYmxlZEluZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudEVuYWJsZWRJbmRleCA9IGVuYWJsZWRJbmRleGVzLmluZGV4T2Yoc3RhcnRJbmRleCk7XG4gICAgY29uc3QgZmFsbGJhY2tJbmRleCA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleChlbmFibGVkSW5kZXhlcyk7XG4gICAgY29uc3QgYmFzZUluZGV4ID0gY3VycmVudEVuYWJsZWRJbmRleCA+PSAwID8gY3VycmVudEVuYWJsZWRJbmRleCA6IGZhbGxiYWNrSW5kZXg7XG4gICAgY29uc3QgbmV4dFBvc2l0aW9uID0gKGJhc2VJbmRleCArIHN0ZXAgKyBlbmFibGVkSW5kZXhlcy5sZW5ndGgpICUgZW5hYmxlZEluZGV4ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gZW5hYmxlZEluZGV4ZXNbbmV4dFBvc2l0aW9uXTtcblxuICAgIHRoaXMuc2VsZWN0KHRoaXMuc2VnbWVudHNbdGFyZ2V0SW5kZXhdLCB0YXJnZXRJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEZpcnN0RW5hYmxlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbmFibGVkSW5kZXhlcyA9IHRoaXMuZ2V0RW5hYmxlZEluZGV4ZXMoKTtcbiAgICBpZiAoZW5hYmxlZEluZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW5kZXggPSBlbmFibGVkSW5kZXhlc1swXTtcbiAgICAgIHRoaXMuc2VsZWN0KHRoaXMuc2VnbWVudHNbaW5kZXhdLCBpbmRleCk7XG4gICAgICB0aGlzLnVwZGF0ZUluZGljYXRvcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0TGFzdEVuYWJsZWQoKTogdm9pZCB7XG4gICAgY29uc3QgZW5hYmxlZEluZGV4ZXMgPSB0aGlzLmdldEVuYWJsZWRJbmRleGVzKCk7XG4gICAgaWYgKGVuYWJsZWRJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZW5hYmxlZEluZGV4ZXNbZW5hYmxlZEluZGV4ZXMubGVuZ3RoIC0gMV07XG4gICAgICB0aGlzLnNlbGVjdCh0aGlzLnNlZ21lbnRzW2luZGV4XSwgaW5kZXgpO1xuICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEVuYWJsZWRJbmRleGVzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zZWdtZW50c1xuICAgICAgLm1hcCgob3B0aW9uLCBpbmRleCkgPT4gKHsgb3B0aW9uLCBpbmRleCB9KSlcbiAgICAgIC5maWx0ZXIoKHsgb3B0aW9uIH0pID0+ICFvcHRpb24uZGlzYWJsZWQpXG4gICAgICAubWFwKCh7IGluZGV4IH0pID0+IGluZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRJbmRleChlbmFibGVkSW5kZXhlczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnNlZ21lbnRzLmZpbmRJbmRleCgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUgPT09IHRoaXMudmFsdWUgJiYgIW9wdGlvbi5kaXNhYmxlZCk7XG4gICAgaWYgKGN1cnJlbnQgPj0gMCkge1xuICAgICAgcmV0dXJuIGVuYWJsZWRJbmRleGVzLmluZGV4T2YoY3VycmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVNlbGVjdGVkVmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3QgZW5hYmxlZCA9IHRoaXMuc2VnbWVudHMuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZGlzYWJsZWQpO1xuICAgIGlmIChlbmFibGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsdWUgfHwgIXRoaXMuc2VnbWVudHMuc29tZSgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUgPT09IHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZW5hYmxlZFswXS52YWx1ZTtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWdtZW50cy5pbmRleE9mKGVuYWJsZWRbMF0pO1xuICAgICAgdGhpcy5mb2N1c0J1dHRvbihpbmRleCk7XG4gICAgICB0aGlzLnVwZGF0ZUluZGljYXRvcihpbmRleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlZ21lbnRzLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSB0aGlzLnZhbHVlKTtcbiAgICBpZiAoc2VsZWN0ZWQ/LmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZW5hYmxlZFswXS52YWx1ZTtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWdtZW50cy5pbmRleE9mKGVuYWJsZWRbMF0pO1xuICAgICAgdGhpcy5mb2N1c0J1dHRvbihpbmRleCk7XG4gICAgICB0aGlzLnVwZGF0ZUluZGljYXRvcihpbmRleCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yKCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzQnV0dG9uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCBidXR0b24gPSB0aGlzLnNlZ21lbnRCdXR0b25zPy5nZXQoaW5kZXgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgYnV0dG9uPy5mb2N1cygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmRpY2F0b3IocHJlZmVycmVkSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNlZ21lbnRDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBidXR0b25zID0gdGhpcy5zZWdtZW50QnV0dG9ucz8udG9BcnJheSgpID8/IFtdO1xuICAgICAgaWYgKCFjb250YWluZXIgfHwgYnV0dG9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yU3R5bGUgPSB7fTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmRleCA9IHByZWZlcnJlZEluZGV4ID8/IGJ1dHRvbnMuZmluZEluZGV4KChidXR0b24sIGlkeCkgPT4gdGhpcy5zZWdtZW50c1tpZHhdPy52YWx1ZSA9PT0gdGhpcy52YWx1ZSk7XG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmluZGljYXRvclN0eWxlID0ge307XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uRWwgPSBidXR0b25zW2luZGV4XT8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghYnV0dG9uRWwpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yU3R5bGUgPSB7fTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgYnV0dG9uUmVjdCA9IGJ1dHRvbkVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgb2Zmc2V0TGVmdCA9IGJ1dHRvbkVsLm9mZnNldExlZnQ7XG4gICAgICBjb25zdCBvZmZzZXRUb3AgPSBidXR0b25FbC5vZmZzZXRUb3A7XG4gICAgICBjb25zdCB3aWR0aCA9IGJ1dHRvbkVsLm9mZnNldFdpZHRoO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gYnV0dG9uRWwub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5kaXNhYmxlZCB8fCB0aGlzLnNlZ21lbnRzW2luZGV4XT8uZGlzYWJsZWQ7XG4gICAgICB0aGlzLmluZGljYXRvclN0eWxlID0ge1xuICAgICAgICB3aWR0aDogYCR7d2lkdGh9cHhgLFxuICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke29mZnNldExlZnR9cHhgLFxuICAgICAgICB0b3A6IGAke29mZnNldFRvcH1weGAsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogaXNEaXNhYmxlZCA/ICcjOUJBMEY0JyA6ICcjM0Y0M0VFJyxcbiAgICAgIH07XG4gICAgICB0aGlzLmluZGljYXRvclZpc2libGUgPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGlzSW5kaWNhdG9yVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbmRpY2F0b3JWaXNpYmxlO1xuICB9XG59XG4iLCI8ZGl2XG4gICNzZWdtZW50Q29udGFpbmVyXG4gIGNsYXNzPVwicmVsYXRpdmUgaW5saW5lLWZsZXggZmxleC1yb3cgaXRlbXMtc3RhcnQgcC1bMy41cHhdIGgtWzMxLjVweF0gYmctWyNGNUY1RjVdIHJvdW5kZWQtWzhweF1cIlxuICByb2xlPVwidGFibGlzdFwiXG4gIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgbnVsbFwiXG4+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJhYnNvbHV0ZSByb3VuZGVkLVs4cHhdIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBlYXNlLWluLW91dCBwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgIFtjbGFzcy5vcGFjaXR5LTBdPVwiIWlzSW5kaWNhdG9yVmlzaWJsZVwiXG4gICAgICBbbmdTdHlsZV09XCJpbmRpY2F0b3JTdHlsZVwiXG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgID48L2Rpdj5cblxuICAgIDxidXR0b25cbiAgICAgICpuZ0Zvcj1cImxldCBzZWdtZW50IG9mIHNlZ21lbnRzOyBpbmRleCBhcyBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVZhbHVlXCJcbiAgICAgICNzZWdtZW50QnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIHJvbGU9XCJ0YWJcIlxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHB4LVsxNHB4XSBweS1bMy41cHhdIGgtWzI1cHhdIHJvdW5kZWQtWzhweF0gdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGVhc2UtaW4tb3V0IHdoaXRlc3BhY2Utbm93cmFwIHRleHQtY2VudGVyIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMCBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTAgZmxleC1ub25lXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3RleHQtd2hpdGUgZm9udC1tZWRpdW0nOiBpc1NlbGVjdGVkKHNlZ21lbnQpLFxuICAgICAgICAndGV4dC1bIzk5OTk5RV0nOiAhaXNTZWxlY3RlZChzZWdtZW50KSAmJiAhKGRpc2FibGVkIHx8IHNlZ21lbnQuZGlzYWJsZWQpLFxuICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkJzogZGlzYWJsZWQgfHwgc2VnbWVudC5kaXNhYmxlZCxcbiAgICAgICAgJ3RleHQtWyNDN0M3QzddJzogKGRpc2FibGVkIHx8IHNlZ21lbnQuZGlzYWJsZWQpICYmICFpc1NlbGVjdGVkKHNlZ21lbnQpLFxuICAgICAgICAnaG92ZXI6dGV4dC1ibGFjayc6ICFpc1NlbGVjdGVkKHNlZ21lbnQpICYmICFkaXNhYmxlZCAmJiAhc2VnbWVudC5kaXNhYmxlZFxuICAgICAgfVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc2VnbWVudC5kaXNhYmxlZFwiXG4gICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQoc2VnbWVudClcIlxuICAgICAgW2F0dHIudGFiaW5kZXhdPVwiIWRpc2FibGVkICYmICFzZWdtZW50LmRpc2FibGVkID8gKGlzU2VsZWN0ZWQoc2VnbWVudCkgPyAwIDogLTEpIDogLTFcIlxuICAgICAgKGNsaWNrKT1cInNlbGVjdChzZWdtZW50LCBpbmRleClcIlxuICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudCwgaW5kZXgpXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtWzE4cHhdIGZvbnQtWydJbnRlciddIGZvbnQtbm9ybWFsIHRleHQtWzEycHhdIGxlYWRpbmctWzEycHhdIHRleHQtY2VudGVyIGFsaWduLW1pZGRsZVwiPlxuICAgICAge3sgc2VnbWVudC5sYWJlbCB9fVxuICAgIDwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbjwvZGl2PlxuIl19