@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.
package/README.md ADDED
@@ -0,0 +1,140 @@
1
+ # CQA UI
2
+
3
+ Component library for Angular 13+, built with Tailwind CSS tokens and Storybook-driven documentation.
4
+
5
+ ---
6
+
7
+ ## 📦 Installation
8
+
9
+ ```bash
10
+ npm install cqa-ui
11
+ ```
12
+
13
+ ### Peer dependencies
14
+
15
+ ```bash
16
+ npm install @angular/common@^13.4.0 @angular/core@^13.4.0 @angular/forms@^13.4.0 @angular/material@^13.3.9 rxjs@^7.5.0
17
+ ```
18
+
19
+ ---
20
+
21
+ ## 🚀 Quick Start
22
+
23
+ ```ts
24
+ // app.module.ts
25
+ import { NgModule } from '@angular/core';
26
+ import { BrowserModule } from '@angular/platform-browser';
27
+ import { UiKitModule } from 'cqa-ui';
28
+
29
+ import { AppComponent } from './app.component';
30
+
31
+ @NgModule({
32
+ declarations: [AppComponent],
33
+ imports: [
34
+ BrowserModule,
35
+ UiKitModule
36
+ ],
37
+ bootstrap: [AppComponent]
38
+ })
39
+ export class AppModule {}
40
+ ```
41
+
42
+ ---
43
+
44
+ ## 💡 Usage Examples
45
+
46
+ ### Button
47
+
48
+ ```html
49
+ <cqa-button variant="filled" icon="save" (clicked)="onSave()">
50
+ Save changes
51
+ </cqa-button>
52
+
53
+ <cqa-button variant="outlined" [disabled]="isSubmitting">
54
+ Cancel
55
+ </cqa-button>
56
+ ```
57
+
58
+ ### Search bar
59
+
60
+ ```html
61
+ <cqa-search-bar
62
+ placeholder="Search components"
63
+ [value]="query"
64
+ [showClear]="true"
65
+ (valueChange)="query = $event"
66
+ (search)="onSearch($event)"
67
+ ></cqa-search-bar>
68
+ ```
69
+
70
+ ### Segment control
71
+
72
+ ```html
73
+ <cqa-segment-control
74
+ [segments]="[
75
+ { label: 'Overview', value: 'overview' },
76
+ { label: 'Analytics', value: 'analytics' },
77
+ { label: 'Settings', value: 'settings', disabled: true }
78
+ ]"
79
+ [value]="currentTab"
80
+ (valueChange)="currentTab = $event"
81
+ ></cqa-segment-control>
82
+ ```
83
+
84
+ ### Dialog
85
+
86
+ ```ts
87
+ import { DialogService } from 'cqa-ui';
88
+
89
+ constructor(private readonly dialog: DialogService) {}
90
+
91
+ openDialog(): void {
92
+ this.dialog.open({
93
+ title: 'Delete dashboard',
94
+ description: 'Deleting this dashboard will remove it for all collaborators.',
95
+ warning: 'This action cannot be undone.',
96
+ content: {
97
+ type: 'text',
98
+ text: 'Are you sure you want to continue?'
99
+ },
100
+ buttons: [
101
+ { label: 'Cancel', role: 'secondary' },
102
+ { label: 'Delete', role: 'warn', handler: () => 'delete' }
103
+ ]
104
+ });
105
+ }
106
+ ```
107
+
108
+ ---
109
+
110
+ ## 📚 Storybook
111
+
112
+ ```bash
113
+ npm run storybook
114
+ ```
115
+
116
+ View component documentation and interactive examples at `http://localhost:6006`.
117
+
118
+ ---
119
+
120
+ ## 🛠 Development
121
+
122
+ ```bash
123
+ npm install
124
+ npm run build:cqa-ui # build the library bundle
125
+ npm run storybook # start Storybook
126
+ npm run build-storybook # static Storybook build
127
+ ```
128
+
129
+ ### Publish workflow
130
+
131
+ 1. Update version in `package.json`
132
+ 2. `npm run build:cqa-ui`
133
+ 3. `npm publish dist/cqa-ui`
134
+
135
+ ---
136
+
137
+ ## 📄 License
138
+
139
+ MIT — contributions and issues welcome!
140
+
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@cqa-lib/cqa-ui" />
5
+ export * from './public-api';
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3FhLWxpYi1jcWEtdWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY3FhLWxpYi1jcWEtdWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,265 @@
1
+ import { Component, Input, Output, EventEmitter, HostListener, 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/common";
5
+ export class ButtonComponent {
6
+ constructor() {
7
+ this.id = 'cqa-ui-root';
8
+ this.display = 'contents';
9
+ this.variant = 'filled';
10
+ this.disabled = false;
11
+ this.iconPosition = 'start';
12
+ this.type = 'button';
13
+ this.clicked = new EventEmitter();
14
+ // Internal state tracking
15
+ this.isHovered = false;
16
+ this.isFocused = false;
17
+ this.isPressed = false;
18
+ }
19
+ get hasIcon() {
20
+ return !!this.icon;
21
+ }
22
+ get buttonClasses() {
23
+ const baseClasses = [
24
+ 'flex',
25
+ 'flex-col',
26
+ 'justify-center',
27
+ 'items-center',
28
+ 'p-0',
29
+ 'gap-2',
30
+ 'rounded-lg',
31
+ 'cursor-pointer',
32
+ 'font-inter',
33
+ 'font-semibold',
34
+ 'text-sm',
35
+ 'leading-[14px]',
36
+ 'transition-all',
37
+ 'duration-200',
38
+ 'outline-none'
39
+ ];
40
+ if (this.disabled) {
41
+ baseClasses.push('cursor-not-allowed');
42
+ }
43
+ // Add variant and state specific classes
44
+ const variantClasses = this.getVariantClasses();
45
+ return [...baseClasses, ...variantClasses].join(' ');
46
+ }
47
+ get stateLayerClasses() {
48
+ const classes = [
49
+ 'flex',
50
+ 'flex-row',
51
+ 'justify-center',
52
+ 'items-center',
53
+ 'gap-2',
54
+ 'w-full',
55
+ 'h-full',
56
+ 'py-[10px]',
57
+ 'px-6',
58
+ ];
59
+ return classes.join(' ');
60
+ }
61
+ get labelClasses() {
62
+ const classes = [
63
+ 'flex',
64
+ 'items-center',
65
+ 'text-center',
66
+ 'font-inter',
67
+ 'font-semibold',
68
+ 'text-sm',
69
+ 'leading-[14px]',
70
+ 'flex-none',
71
+ this.textClass,
72
+ ];
73
+ if (this.disabled) {
74
+ classes.push('opacity-[0.38]');
75
+ }
76
+ return classes.join(' ');
77
+ }
78
+ get iconClasses() {
79
+ const classes = [
80
+ 'flex',
81
+ 'items-center',
82
+ 'justify-center',
83
+ 'w-[14px]',
84
+ 'h-[14px]',
85
+ 'shrink-0',
86
+ 'flex-none'
87
+ ];
88
+ if (this.disabled) {
89
+ classes.push('opacity-[0.38]');
90
+ }
91
+ return classes.join(' ');
92
+ }
93
+ getVariantClasses() {
94
+ const classes = [];
95
+ if (this.variant === 'filled') {
96
+ if (this.disabled) {
97
+ classes.push('bg-primary-muted');
98
+ }
99
+ else {
100
+ classes.push('bg-primary');
101
+ if (this.isHovered) {
102
+ classes.push('shadow-[0px_1px_2px_rgba(0,0,0,0.3),0px_1px_3px_1px_rgba(0,0,0,0.15)]');
103
+ }
104
+ }
105
+ }
106
+ else if (this.variant === 'outlined') {
107
+ if (this.disabled) {
108
+ classes.push('bg-transparent', 'border', 'border-primary-muted');
109
+ }
110
+ else {
111
+ if (this.isFocused) {
112
+ classes.push('bg-primary-surface-alt', 'border', 'border-primary-hover', 'shadow-[0px_4px_4px_rgba(0,0,0,0.25)]');
113
+ }
114
+ else if (this.isHovered || this.isPressed) {
115
+ classes.push('bg-primary-surface', 'border', 'border-primary');
116
+ }
117
+ else {
118
+ classes.push('bg-transparent', 'border', 'border-slate');
119
+ }
120
+ }
121
+ }
122
+ else if (this.variant === 'text') {
123
+ if (this.disabled) {
124
+ classes.push('bg-transparent');
125
+ }
126
+ else {
127
+ classes.push('bg-transparent');
128
+ if (this.isHovered || this.isFocused || this.isPressed) {
129
+ classes.push('bg-primary-surface');
130
+ }
131
+ }
132
+ }
133
+ else if (this.variant === 'elevated') {
134
+ if (this.disabled) {
135
+ classes.push('bg-primary-muted', 'shadow-none');
136
+ }
137
+ else {
138
+ if (this.isFocused) {
139
+ classes.push('bg-primary-surface-alt', 'shadow-[0px_4px_4px_rgba(0,0,0,0.25)]');
140
+ }
141
+ else if (this.isPressed) {
142
+ classes.push('bg-primary-surface', 'shadow-[0px_1px_2px_rgba(0,0,0,0.3),0px_1px_3px_1px_rgba(0,0,0,0.15)]');
143
+ }
144
+ else if (this.isHovered) {
145
+ classes.push('bg-primary-surface-alt', 'shadow-[0px_1px_2px_rgba(0,0,0,0.3),0px_2px_6px_2px_rgba(0,0,0,0.15)]');
146
+ }
147
+ else {
148
+ classes.push('bg-primary-surface', 'shadow-[0px_1px_2px_rgba(0,0,0,0.3),0px_1px_3px_1px_rgba(0,0,0,0.15)]');
149
+ }
150
+ }
151
+ }
152
+ else if (this.variant === 'tonal') {
153
+ if (this.disabled) {
154
+ classes.push('bg-primary-muted');
155
+ }
156
+ else {
157
+ if (this.isHovered) {
158
+ classes.push('bg-tonal-hover', 'shadow-[0px_1px_2px_rgba(0,0,0,0.3),0px_1px_3px_1px_rgba(0,0,0,0.15)]');
159
+ }
160
+ else {
161
+ classes.push('bg-primary-surface-alt');
162
+ }
163
+ }
164
+ }
165
+ return classes;
166
+ }
167
+ get textClass() {
168
+ if (this.disabled) {
169
+ if (this.variant === 'outlined' || this.variant === 'text') {
170
+ return 'text-ink';
171
+ }
172
+ return 'text-ink-muted';
173
+ }
174
+ switch (this.variant) {
175
+ case 'filled':
176
+ return 'text-surface-default';
177
+ case 'outlined':
178
+ if (this.isFocused || this.isHovered || this.isPressed) {
179
+ return 'text-primary-hover';
180
+ }
181
+ return 'text-slate';
182
+ case 'text':
183
+ case 'elevated':
184
+ return 'text-primary-hover';
185
+ case 'tonal':
186
+ return 'text-ink';
187
+ default:
188
+ return '';
189
+ }
190
+ }
191
+ onMouseEnter() {
192
+ if (!this.disabled) {
193
+ this.isHovered = true;
194
+ }
195
+ }
196
+ onMouseLeave() {
197
+ this.isHovered = false;
198
+ this.isPressed = false;
199
+ }
200
+ onMouseDown() {
201
+ if (!this.disabled) {
202
+ this.isPressed = true;
203
+ }
204
+ }
205
+ onMouseUp() {
206
+ this.isPressed = false;
207
+ }
208
+ onFocus() {
209
+ if (!this.disabled) {
210
+ this.isFocused = true;
211
+ }
212
+ }
213
+ onBlur() {
214
+ this.isFocused = false;
215
+ this.isPressed = false;
216
+ }
217
+ onClick(event) {
218
+ if (!this.disabled) {
219
+ this.clicked.emit(event);
220
+ }
221
+ }
222
+ }
223
+ ButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
224
+ ButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ButtonComponent, selector: "cqa-button", inputs: { variant: "variant", disabled: "disabled", icon: "icon", iconPosition: "iconPosition", type: "type" }, outputs: { clicked: "clicked" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "mousedown": "onMouseDown()", "mouseup": "onMouseUp()", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.id": "this.id", "style.display": "this.display" } }, ngImport: i0, template: "<button\n [type]=\"type\"\n [disabled]=\"disabled\"\n [attr.aria-disabled]=\"disabled\"\n [class]=\"buttonClasses\"\n (click)=\"onClick($event)\"\n>\n <span [class]=\"stateLayerClasses\">\n <span *ngIf=\"icon && iconPosition === 'start'\" [class]=\"iconClasses\" [ngClass]=\"textClass\">\n <mat-icon class=\"text-[18px] leading-[18px] w-[18px] h-[18px]\">\n {{ icon }}\n </mat-icon>\n </span>\n <span [class]=\"labelClasses\" [ngClass]=\"textClass\">\n <ng-content></ng-content>\n </span>\n <span *ngIf=\"icon && iconPosition === 'end'\" [class]=\"iconClasses\" [ngClass]=\"textClass\">\n <mat-icon class=\"text-[18px] leading-[18px] w-[18px] h-[18px]\">\n {{ icon }}\n </mat-icon>\n </span>\n </span>\n</button>\n\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
225
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ButtonComponent, decorators: [{
226
+ type: Component,
227
+ args: [{ selector: 'cqa-button', template: "<button\n [type]=\"type\"\n [disabled]=\"disabled\"\n [attr.aria-disabled]=\"disabled\"\n [class]=\"buttonClasses\"\n (click)=\"onClick($event)\"\n>\n <span [class]=\"stateLayerClasses\">\n <span *ngIf=\"icon && iconPosition === 'start'\" [class]=\"iconClasses\" [ngClass]=\"textClass\">\n <mat-icon class=\"text-[18px] leading-[18px] w-[18px] h-[18px]\">\n {{ icon }}\n </mat-icon>\n </span>\n <span [class]=\"labelClasses\" [ngClass]=\"textClass\">\n <ng-content></ng-content>\n </span>\n <span *ngIf=\"icon && iconPosition === 'end'\" [class]=\"iconClasses\" [ngClass]=\"textClass\">\n <mat-icon class=\"text-[18px] leading-[18px] w-[18px] h-[18px]\">\n {{ icon }}\n </mat-icon>\n </span>\n </span>\n</button>\n\n", styles: [] }]
228
+ }], propDecorators: { id: [{
229
+ type: HostBinding,
230
+ args: ['attr.id']
231
+ }], display: [{
232
+ type: HostBinding,
233
+ args: ['style.display']
234
+ }], variant: [{
235
+ type: Input
236
+ }], disabled: [{
237
+ type: Input
238
+ }], icon: [{
239
+ type: Input
240
+ }], iconPosition: [{
241
+ type: Input
242
+ }], type: [{
243
+ type: Input
244
+ }], clicked: [{
245
+ type: Output
246
+ }], onMouseEnter: [{
247
+ type: HostListener,
248
+ args: ['mouseenter']
249
+ }], onMouseLeave: [{
250
+ type: HostListener,
251
+ args: ['mouseleave']
252
+ }], onMouseDown: [{
253
+ type: HostListener,
254
+ args: ['mousedown']
255
+ }], onMouseUp: [{
256
+ type: HostListener,
257
+ args: ['mouseup']
258
+ }], onFocus: [{
259
+ type: HostListener,
260
+ args: ['focus']
261
+ }], onBlur: [{
262
+ type: HostListener,
263
+ args: ['blur']
264
+ }] } });
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2J1dHRvbi9idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBU2xHLE1BQU0sT0FBTyxlQUFlO0lBTDVCO1FBTTBCLE9BQUUsR0FBRyxhQUFhLENBQUM7UUFDYixZQUFPLEdBQUcsVUFBVSxDQUFDO1FBRTFDLFlBQU8sR0FBa0IsUUFBUSxDQUFDO1FBQ2xDLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsaUJBQVksR0FBb0IsT0FBTyxDQUFDO1FBQ3hDLFNBQUksR0FBa0MsUUFBUSxDQUFDO1FBQzlDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBRW5ELDBCQUEwQjtRQUMxQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztLQTBONUI7SUF4TkMsSUFBSSxPQUFPO1FBQ1QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsTUFBTSxXQUFXLEdBQUc7WUFDbEIsTUFBTTtZQUNOLFVBQVU7WUFDVixnQkFBZ0I7WUFDaEIsY0FBYztZQUNkLEtBQUs7WUFDTCxPQUFPO1lBQ1AsWUFBWTtZQUNaLGdCQUFnQjtZQUNoQixZQUFZO1lBQ1osZUFBZTtZQUNmLFNBQVM7WUFDVCxnQkFBZ0I7WUFDaEIsZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCxjQUFjO1NBQ2YsQ0FBQztRQUVGLElBQUksSUFB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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgQnV0dG9uVmFyaWFudCA9ICdmaWxsZWQnIHwgJ291dGxpbmVkJyB8ICd0ZXh0JyB8ICdlbGV2YXRlZCcgfCAndG9uYWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2J1dHRvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgQnV0dG9uQ29tcG9uZW50IHtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJykgaWQgPSAnY3FhLXVpLXJvb3QnO1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKSBkaXNwbGF5ID0gJ2NvbnRlbnRzJztcblxuICBASW5wdXQoKSB2YXJpYW50OiBCdXR0b25WYXJpYW50ID0gJ2ZpbGxlZCc7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGljb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGljb25Qb3NpdGlvbjogJ3N0YXJ0JyB8ICdlbmQnID0gJ3N0YXJ0JztcbiAgQElucHV0KCkgdHlwZTogJ2J1dHRvbicgfCAnc3VibWl0JyB8ICdyZXNldCcgPSAnYnV0dG9uJztcbiAgQE91dHB1dCgpIGNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cbiAgLy8gSW50ZXJuYWwgc3RhdGUgdHJhY2tpbmdcbiAgaXNIb3ZlcmVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1ByZXNzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBnZXQgaGFzSWNvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmljb247XG4gIH1cblxuICBnZXQgYnV0dG9uQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gW1xuICAgICAgJ2ZsZXgnLFxuICAgICAgJ2ZsZXgtY29sJyxcbiAgICAgICdqdXN0aWZ5LWNlbnRlcicsXG4gICAgICAnaXRlbXMtY2VudGVyJyxcbiAgICAgICdwLTAnLFxuICAgICAgJ2dhcC0yJyxcbiAgICAgICdyb3VuZGVkLWxnJyxcbiAgICAgICdjdXJzb3ItcG9pbnRlcicsXG4gICAgICAnZm9udC1pbnRlcicsXG4gICAgICAnZm9udC1zZW1pYm9sZCcsXG4gICAgICAndGV4dC1zbScsXG4gICAgICAnbGVhZGluZy1bMTRweF0nLFxuICAgICAgJ3RyYW5zaXRpb24tYWxsJyxcbiAgICAgICdkdXJhdGlvbi0yMDAnLFxuICAgICAgJ291dGxpbmUtbm9uZSdcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIGJhc2VDbGFzc2VzLnB1c2goJ2N1cnNvci1ub3QtYWxsb3dlZCcpO1xuICAgIH1cblxuICAgIC8vIEFkZCB2YXJpYW50IGFuZCBzdGF0ZSBzcGVjaWZpYyBjbGFzc2VzXG4gICAgY29uc3QgdmFyaWFudENsYXNzZXMgPSB0aGlzLmdldFZhcmlhbnRDbGFzc2VzKCk7XG4gICAgXG4gICAgcmV0dXJuIFsuLi5iYXNlQ2xhc3NlcywgLi4udmFyaWFudENsYXNzZXNdLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGdldCBzdGF0ZUxheWVyQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbXG4gICAgICAnZmxleCcsXG4gICAgICAnZmxleC1yb3cnLFxuICAgICAgJ2p1c3RpZnktY2VudGVyJyxcbiAgICAgICdpdGVtcy1jZW50ZXInLFxuICAgICAgJ2dhcC0yJyxcbiAgICAgICd3LWZ1bGwnLFxuICAgICAgJ2gtZnVsbCcsXG4gICAgICAncHktWzEwcHhdJyxcbiAgICAgICdweC02JyxcbiAgICBdO1xuXG4gICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuICB9XG5cbiAgZ2V0IGxhYmVsQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbXG4gICAgICAnZmxleCcsXG4gICAgICAnaXRlbXMtY2VudGVyJyxcbiAgICAgICd0ZXh0LWNlbnRlcicsXG4gICAgICAnZm9udC1pbnRlcicsXG4gICAgICAnZm9udC1zZW1pYm9sZCcsXG4gICAgICAndGV4dC1zbScsXG4gICAgICAnbGVhZGluZy1bMTRweF0nLFxuICAgICAgJ2ZsZXgtbm9uZScsXG4gICAgICB0aGlzLnRleHRDbGFzcyxcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnb3BhY2l0eS1bMC4zOF0nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICBnZXQgaWNvbkNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc2VzID0gW1xuICAgICAgJ2ZsZXgnLFxuICAgICAgJ2l0ZW1zLWNlbnRlcicsXG4gICAgICAnanVzdGlmeS1jZW50ZXInLFxuICAgICAgJ3ctWzE0cHhdJyxcbiAgICAgICdoLVsxNHB4XScsXG4gICAgICAnc2hyaW5rLTAnLFxuICAgICAgJ2ZsZXgtbm9uZSdcbiAgICBdO1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICBjbGFzc2VzLnB1c2goJ29wYWNpdHktWzAuMzhdJyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFyaWFudENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodGhpcy52YXJpYW50ID09PSAnZmlsbGVkJykge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1wcmltYXJ5LW11dGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXByaW1hcnknKTtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3ZlcmVkKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaGFkb3ctWzBweF8xcHhfMnB4X3JnYmEoMCwwLDAsMC4zKSwwcHhfMXB4XzNweF8xcHhfcmdiYSgwLDAsMCwwLjE1KV0nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy52YXJpYW50ID09PSAnb3V0bGluZWQnKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXRyYW5zcGFyZW50JywgJ2JvcmRlcicsICdib3JkZXItcHJpbWFyeS1tdXRlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1wcmltYXJ5LXN1cmZhY2UtYWx0JywgJ2JvcmRlcicsICdib3JkZXItcHJpbWFyeS1ob3ZlcicsICdzaGFkb3ctWzBweF80cHhfNHB4X3JnYmEoMCwwLDAsMC4yNSldJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0hvdmVyZWQgfHwgdGhpcy5pc1ByZXNzZWQpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXByaW1hcnktc3VyZmFjZScsICdib3JkZXInLCAnYm9yZGVyLXByaW1hcnknKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXRyYW5zcGFyZW50JywgJ2JvcmRlcicsICdib3JkZXItc2xhdGUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy52YXJpYW50ID09PSAndGV4dCcpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnYmctdHJhbnNwYXJlbnQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnYmctdHJhbnNwYXJlbnQnKTtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3ZlcmVkIHx8IHRoaXMuaXNGb2N1c2VkIHx8IHRoaXMuaXNQcmVzc2VkKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1wcmltYXJ5LXN1cmZhY2UnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy52YXJpYW50ID09PSAnZWxldmF0ZWQnKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXByaW1hcnktbXV0ZWQnLCAnc2hhZG93LW5vbmUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmlzRm9jdXNlZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYmctcHJpbWFyeS1zdXJmYWNlLWFsdCcsICdzaGFkb3ctWzBweF80cHhfNHB4X3JnYmEoMCwwLDAsMC4yNSldJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1ByZXNzZWQpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXByaW1hcnktc3VyZmFjZScsICdzaGFkb3ctWzBweF8xcHhfMnB4X3JnYmEoMCwwLDAsMC4zKSwwcHhfMXB4XzNweF8xcHhfcmdiYSgwLDAsMCwwLjE1KV0nKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSG92ZXJlZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYmctcHJpbWFyeS1zdXJmYWNlLWFsdCcsICdzaGFkb3ctWzBweF8xcHhfMnB4X3JnYmEoMCwwLDAsMC4zKSwwcHhfMnB4XzZweF8ycHhfcmdiYSgwLDAsMCwwLjE1KV0nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXByaW1hcnktc3VyZmFjZScsICdzaGFkb3ctWzBweF8xcHhfMnB4X3JnYmEoMCwwLDAsMC4zKSwwcHhfMXB4XzNweF8xcHhfcmdiYSgwLDAsMCwwLjE1KV0nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy52YXJpYW50ID09PSAndG9uYWwnKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXByaW1hcnktbXV0ZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmlzSG92ZXJlZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYmctdG9uYWwtaG92ZXInLCAnc2hhZG93LVswcHhfMXB4XzJweF9yZ2JhKDAsMCwwLDAuMyksMHB4XzFweF8zcHhfMXB4X3JnYmEoMCwwLDAsMC4xNSldJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1wcmltYXJ5LXN1cmZhY2UtYWx0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuXG4gIGdldCB0ZXh0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgaWYgKHRoaXMudmFyaWFudCA9PT0gJ291dGxpbmVkJyB8fCB0aGlzLnZhcmlhbnQgPT09ICd0ZXh0Jykge1xuICAgICAgICByZXR1cm4gJ3RleHQtaW5rJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAndGV4dC1pbmstbXV0ZWQnO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy52YXJpYW50KSB7XG4gICAgICBjYXNlICdmaWxsZWQnOlxuICAgICAgICByZXR1cm4gJ3RleHQtc3VyZmFjZS1kZWZhdWx0JztcbiAgICAgIGNhc2UgJ291dGxpbmVkJzpcbiAgICAgICAgaWYgKHRoaXMuaXNGb2N1c2VkIHx8IHRoaXMuaXNIb3ZlcmVkIHx8IHRoaXMuaXNQcmVzc2VkKSB7XG4gICAgICAgICAgcmV0dXJuICd0ZXh0LXByaW1hcnktaG92ZXInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAndGV4dC1zbGF0ZSc7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgIGNhc2UgJ2VsZXZhdGVkJzpcbiAgICAgICAgcmV0dXJuICd0ZXh0LXByaW1hcnktaG92ZXInO1xuICAgICAgY2FzZSAndG9uYWwnOlxuICAgICAgICByZXR1cm4gJ3RleHQtaW5rJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcbiAgb25Nb3VzZUVudGVyKCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5pc0hvdmVyZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxuICBvbk1vdXNlTGVhdmUoKSB7XG4gICAgdGhpcy5pc0hvdmVyZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzUHJlc3NlZCA9IGZhbHNlO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJylcbiAgb25Nb3VzZURvd24oKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmlzUHJlc3NlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcpXG4gIG9uTW91c2VVcCgpIHtcbiAgICB0aGlzLmlzUHJlc3NlZCA9IGZhbHNlO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXMnKVxuICBvbkZvY3VzKCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBvbkJsdXIoKSB7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzUHJlc3NlZCA9IGZhbHNlO1xuICB9XG5cbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5jbGlja2VkLmVtaXQoZXZlbnQpO1xuICAgIH1cbiAgfVxufVxuXG4iLCI8YnV0dG9uXG4gIFt0eXBlXT1cInR5cGVcIlxuICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgW2NsYXNzXT1cImJ1dHRvbkNsYXNzZXNcIlxuICAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCJcbj5cbiAgICA8c3BhbiBbY2xhc3NdPVwic3RhdGVMYXllckNsYXNzZXNcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiaWNvbiAmJiBpY29uUG9zaXRpb24gPT09ICdzdGFydCdcIiBbY2xhc3NdPVwiaWNvbkNsYXNzZXNcIiBbbmdDbGFzc109XCJ0ZXh0Q2xhc3NcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidGV4dC1bMThweF0gbGVhZGluZy1bMThweF0gdy1bMThweF0gaC1bMThweF1cIj5cbiAgICAgICAgICB7eyBpY29uIH19XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBbY2xhc3NdPVwibGFiZWxDbGFzc2VzXCIgW25nQ2xhc3NdPVwidGV4dENsYXNzXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiaWNvbiAmJiBpY29uUG9zaXRpb24gPT09ICdlbmQnXCIgW2NsYXNzXT1cImljb25DbGFzc2VzXCIgW25nQ2xhc3NdPVwidGV4dENsYXNzXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInRleHQtWzE4cHhdIGxlYWRpbmctWzE4cHhdIHctWzE4cHhdIGgtWzE4cHhdXCI+XG4gICAgICAgICAge3sgaWNvbiB9fVxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbjwvYnV0dG9uPlxuXG4iXX0=
@@ -0,0 +1,36 @@
1
+ import { Subject } from 'rxjs';
2
+ export class DialogRef {
3
+ constructor(overlayRef) {
4
+ this.overlayRef = overlayRef;
5
+ this.closed$ = new Subject();
6
+ this.isClosed = false;
7
+ this.overlayRef.detachments().subscribe(() => {
8
+ this.finishClose(undefined);
9
+ });
10
+ }
11
+ close(result) {
12
+ if (this.isClosed) {
13
+ return;
14
+ }
15
+ this.finishClose(result);
16
+ this.overlayRef.dispose();
17
+ }
18
+ afterClosed() {
19
+ return this.closed$.asObservable();
20
+ }
21
+ setComponentInstance(instance) {
22
+ this.componentInstance = instance;
23
+ }
24
+ getComponentInstance() {
25
+ return this.componentInstance;
26
+ }
27
+ finishClose(result) {
28
+ if (this.isClosed) {
29
+ return;
30
+ }
31
+ this.isClosed = true;
32
+ this.closed$.next(result);
33
+ this.closed$.complete();
34
+ }
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLXJlZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGlhbG9nL2RpYWxvZy1yZWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxNQUFNLE9BQU8sU0FBUztJQUtwQixZQUE2QixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBSmxDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztRQUN0RCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBSXZCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFnQjtRQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxRQUFpQjtRQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQTJDLENBQUM7SUFDMUQsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUEyQjtRQUM3QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgY2xhc3MgRGlhbG9nUmVmPFRSZXN1bHQgPSB1bmtub3duPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvc2VkJCA9IG5ldyBTdWJqZWN0PFRSZXN1bHQgfCB1bmRlZmluZWQ+KCk7XG4gIHByaXZhdGUgaXNDbG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb21wb25lbnRJbnN0YW5jZT86IHVua25vd247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvdmVybGF5UmVmOiBPdmVybGF5UmVmKSB7XG4gICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaG1lbnRzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZmluaXNoQ2xvc2UodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKHJlc3VsdD86IFRSZXN1bHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Nsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmluaXNoQ2xvc2UocmVzdWx0KTtcbiAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICB9XG5cbiAgYWZ0ZXJDbG9zZWQoKTogT2JzZXJ2YWJsZTxUUmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHNldENvbXBvbmVudEluc3RhbmNlKGluc3RhbmNlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IGluc3RhbmNlO1xuICB9XG5cbiAgZ2V0Q29tcG9uZW50SW5zdGFuY2U8VENvbXBvbmVudD4oKTogVENvbXBvbmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2UgYXMgVENvbXBvbmVudCB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoQ2xvc2UocmVzdWx0OiBUUmVzdWx0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNDbG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlZCQubmV4dChyZXN1bHQpO1xuICAgIHRoaXMuY2xvc2VkJC5jb21wbGV0ZSgpO1xuICB9XG59XG5cblxuIl19
@@ -0,0 +1,135 @@
1
+ import { ChangeDetectionStrategy, Component, ViewChild, HostBinding, } from '@angular/core';
2
+ import { CdkPortalOutlet, TemplatePortal } from '@angular/cdk/portal';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../button/button.component";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "@angular/cdk/portal";
7
+ export class DialogComponent {
8
+ constructor(viewContainerRef, cdr) {
9
+ this.viewContainerRef = viewContainerRef;
10
+ this.cdr = cdr;
11
+ this.id = 'cqa-ui-root';
12
+ this.display = 'block';
13
+ this.contentAttached = false;
14
+ }
15
+ attachTemplate(template, context) {
16
+ if (!this.portalOutlet) {
17
+ return;
18
+ }
19
+ const templateContext = context ??
20
+ {
21
+ $implicit: this.config?.data,
22
+ data: this.config?.data,
23
+ };
24
+ const portal = new TemplatePortal(template, this.viewContainerRef, templateContext);
25
+ this.portalOutlet.attachTemplatePortal(portal);
26
+ this.markContentAttached();
27
+ }
28
+ attachComponent(component) {
29
+ if (!this.portalOutlet) {
30
+ return undefined;
31
+ }
32
+ const componentRef = this.portalOutlet.attachComponentPortal(component);
33
+ this.markContentAttached();
34
+ return componentRef;
35
+ }
36
+ async onButtonClick(button) {
37
+ const closeOnClick = button.closeOnClick ?? true;
38
+ let handlerResult = undefined;
39
+ if (button.handler) {
40
+ handlerResult = button.handler(this.dialogRef);
41
+ }
42
+ const resolved = handlerResult instanceof Promise ? await handlerResult : handlerResult;
43
+ if (!closeOnClick || resolved === false) {
44
+ return;
45
+ }
46
+ this.dialogRef.close(resolved);
47
+ }
48
+ get buttonAlignmentClass() {
49
+ const alignment = this.config?.buttonAlignment ?? 'right';
50
+ return this.mapAlignmentToClass(alignment);
51
+ }
52
+ get panelClassList() {
53
+ const baseClasses = [
54
+ 'relative',
55
+ 'w-full',
56
+ 'bg-white',
57
+ 'rounded-2xl',
58
+ 'shadow-md',
59
+ 'border',
60
+ 'border-[#E5E7EB]',
61
+ 'p-6',
62
+ 'text-left',
63
+ ];
64
+ const custom = this.config?.panelClass;
65
+ if (!custom) {
66
+ return baseClasses;
67
+ }
68
+ return Array.isArray(custom) ? [...baseClasses, ...custom] : [...baseClasses, custom];
69
+ }
70
+ get panelStyles() {
71
+ return {
72
+ width: this.config?.width,
73
+ maxWidth: this.config?.maxWidth ?? '480px',
74
+ };
75
+ }
76
+ buttonVariant(button) {
77
+ const role = this.normalizeRole(button.role);
78
+ switch (role) {
79
+ case 'secondary':
80
+ return 'outlined';
81
+ case 'text':
82
+ return 'text';
83
+ case 'tonal':
84
+ return 'tonal';
85
+ case 'elevated':
86
+ return 'elevated';
87
+ case 'filled':
88
+ case 'primary':
89
+ case 'warn':
90
+ default:
91
+ return 'filled';
92
+ }
93
+ }
94
+ buttonHostClasses(button) {
95
+ const role = this.normalizeRole(button.role);
96
+ if (role === 'warn') {
97
+ return ['cqa-dialog-btn-warn'];
98
+ }
99
+ return [];
100
+ }
101
+ mapAlignmentToClass(alignment) {
102
+ switch (alignment) {
103
+ case 'left':
104
+ return 'justify-start';
105
+ case 'center':
106
+ return 'justify-center';
107
+ case 'right':
108
+ default:
109
+ return 'justify-end';
110
+ }
111
+ }
112
+ markContentAttached() {
113
+ this.contentAttached = true;
114
+ this.cdr.markForCheck();
115
+ }
116
+ normalizeRole(role) {
117
+ return (role ?? 'secondary').trim().split(/\s+/)[0];
118
+ }
119
+ }
120
+ DialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DialogComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
121
+ DialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DialogComponent, selector: "cqa-dialog", host: { properties: { "attr.id": "this.id", "style.display": "this.display" } }, viewQueries: [{ propertyName: "portalOutlet", first: true, predicate: CdkPortalOutlet, descendants: true, static: true }], ngImport: i0, template: "<div class=\"flex w-full justify-center px-4 sm:px-6\">\n <div [ngClass]=\"panelClassList\" [ngStyle]=\"panelStyles\">\n <div class=\"flex flex-col gap-5\">\n <div class=\"flex flex-col gap-3\">\n <h2 class=\"text-lg font-semibold text-[#111827]\">\n {{ config.title }}\n </h2>\n\n <p *ngIf=\"config.description\" class=\"text-sm leading-6 text-[#4B5563]\">\n {{ config.description }}\n </p>\n\n <div\n *ngIf=\"config.warning\"\n class=\"rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm leading-5 text-red-700\"\n >\n {{ config.warning }}\n </div>\n </div>\n\n <div class=\"text-sm text-[#111827]\" [class.hidden]=\"!contentAttached\">\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n\n <div class=\"mt-4 flex flex-wrap gap-3\" [ngClass]=\"buttonAlignmentClass\">\n <cqa-button\n *ngFor=\"let button of config.buttons\"\n type=\"button\"\n [variant]=\"buttonVariant(button)\"\n [ngClass]=\"buttonHostClasses(button)\"\n (clicked)=\"onButtonClick(button)\"\n >\n {{ button.label }}\n </cqa-button>\n </div>\n </div>\n </div>\n</div>\n\n\n", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "disabled", "icon", "iconPosition", "type"], outputs: ["clicked"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DialogComponent, decorators: [{
123
+ type: Component,
124
+ args: [{ selector: 'cqa-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex w-full justify-center px-4 sm:px-6\">\n <div [ngClass]=\"panelClassList\" [ngStyle]=\"panelStyles\">\n <div class=\"flex flex-col gap-5\">\n <div class=\"flex flex-col gap-3\">\n <h2 class=\"text-lg font-semibold text-[#111827]\">\n {{ config.title }}\n </h2>\n\n <p *ngIf=\"config.description\" class=\"text-sm leading-6 text-[#4B5563]\">\n {{ config.description }}\n </p>\n\n <div\n *ngIf=\"config.warning\"\n class=\"rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm leading-5 text-red-700\"\n >\n {{ config.warning }}\n </div>\n </div>\n\n <div class=\"text-sm text-[#111827]\" [class.hidden]=\"!contentAttached\">\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n\n <div class=\"mt-4 flex flex-wrap gap-3\" [ngClass]=\"buttonAlignmentClass\">\n <cqa-button\n *ngFor=\"let button of config.buttons\"\n type=\"button\"\n [variant]=\"buttonVariant(button)\"\n [ngClass]=\"buttonHostClasses(button)\"\n (clicked)=\"onButtonClick(button)\"\n >\n {{ button.label }}\n </cqa-button>\n </div>\n </div>\n </div>\n</div>\n\n\n", styles: [] }]
125
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { id: [{
126
+ type: HostBinding,
127
+ args: ['attr.id']
128
+ }], display: [{
129
+ type: HostBinding,
130
+ args: ['style.display']
131
+ }], portalOutlet: [{
132
+ type: ViewChild,
133
+ args: [CdkPortalOutlet, { static: true }]
134
+ }] } });
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGlhbG9nL2RpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBR1QsU0FBUyxFQUVULFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFtQixjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFXdkYsTUFBTSxPQUFPLGVBQWU7SUFXMUIsWUFBNkIsZ0JBQWtDLEVBQW1CLEdBQXNCO1FBQTNFLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBbUIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFWaEYsT0FBRSxHQUFHLGFBQWEsQ0FBQztRQUNiLFlBQU8sR0FBRyxPQUFPLENBQUM7UUFPaEQsb0JBQWUsR0FBRyxLQUFLLENBQUM7SUFFbUYsQ0FBQztJQUU1RyxjQUFjLENBQUMsUUFBOEIsRUFBRSxPQUFpQztRQUM5RSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixPQUFPO1NBQ1I7UUFFRCxNQUFNLGVBQWUsR0FDbkIsT0FBTztZQUNQO2dCQUNFLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUk7Z0JBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUk7YUFDeEIsQ0FBQztRQUNKLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsbUJBQW1CLEVB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O1lBQ25CLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU8sbUJBQW1CLENBQUMsU0FBZ0M7UUFDMUQsUUFBUSxTQUFTLEVBQUU7WUFDakIsS0FBSyxNQUFNO2dCQUNULE9BQU8sZUFBZSxDQUFDO1lBQ3pCLEtBQUssUUFBUTtnQkFDWCxPQUFPLGdCQUFnQixDQUFDO1lBQzFCLEtBQUssT0FBTyxDQUFDO1lBQ2I7Z0JBQ0UsT0FBTyxhQUFhLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUF3QjtRQUM1QyxPQUFPLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDOzs0R0EzSVUsZUFBZTtnR0FBZixlQUFlLGlMQUlmLGVBQWUsOERDekI1Qix5ekNBd0NBOzJGRG5CYSxlQUFlO2tCQU4zQixTQUFTOytCQUNFLFlBQVksbUJBR0wsdUJBQXVCLENBQUMsTUFBTTt1SUFHdkIsRUFBRTtzQkFBekIsV0FBVzt1QkFBQyxTQUFTO2dCQUNRLE9BQU87c0JBQXBDLFdBQVc7dUJBQUMsZUFBZTtnQkFFa0IsWUFBWTtzQkFBekQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgSG9zdEJpbmRpbmcsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2RrUG9ydGFsT3V0bGV0LCBDb21wb25lbnRQb3J0YWwsIFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBEaWFsb2dCdXR0b25BbGlnbm1lbnQsIERpYWxvZ0J1dHRvbkNvbmZpZywgRGlhbG9nQ29uZmlnLCBEaWFsb2dDb250ZW50Q29uZmlnIH0gZnJvbSAnLi9kaWFsb2cubW9kZWxzJztcbmltcG9ydCB7IEJ1dHRvblZhcmlhbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaWFsb2dSZWYgfSBmcm9tICcuL2RpYWxvZy1yZWYnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEaWFsb2dDb21wb25lbnQ8VFJlc3VsdCA9IHVua25vd24+IHtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJykgaWQgPSAnY3FhLXVpLXJvb3QnO1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKSBkaXNwbGF5ID0gJ2Jsb2NrJztcblxuICBAVmlld0NoaWxkKENka1BvcnRhbE91dGxldCwgeyBzdGF0aWM6IHRydWUgfSkgcG9ydGFsT3V0bGV0PzogQ2RrUG9ydGFsT3V0bGV0O1xuXG4gIGNvbmZpZyE6IERpYWxvZ0NvbmZpZzxEaWFsb2dDb250ZW50Q29uZmlnLCBUUmVzdWx0PjtcbiAgZGlhbG9nUmVmITogRGlhbG9nUmVmPFRSZXN1bHQ+O1xuXG4gIGNvbnRlbnRBdHRhY2hlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIGF0dGFjaFRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPiwgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvcnRhbE91dGxldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlQ29udGV4dCA9XG4gICAgICBjb250ZXh0ID8/XG4gICAgICB7XG4gICAgICAgICRpbXBsaWNpdDogdGhpcy5jb25maWc/LmRhdGEsXG4gICAgICAgIGRhdGE6IHRoaXMuY29uZmlnPy5kYXRhLFxuICAgICAgfTtcbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGVtcGxhdGUsIHRoaXMudmlld0NvbnRhaW5lclJlZiwgdGVtcGxhdGVDb250ZXh0KTtcbiAgICB0aGlzLnBvcnRhbE91dGxldC5hdHRhY2hUZW1wbGF0ZVBvcnRhbChwb3J0YWwpO1xuICAgIHRoaXMubWFya0NvbnRlbnRBdHRhY2hlZCgpO1xuICB9XG5cbiAgYXR0YWNoQ29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50UG9ydGFsPHVua25vd24+KTogQ29tcG9uZW50UmVmPHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMucG9ydGFsT3V0bGV0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMucG9ydGFsT3V0bGV0LmF0dGFjaENvbXBvbmVudFBvcnRhbChjb21wb25lbnQpO1xuICAgIHRoaXMubWFya0NvbnRlbnRBdHRhY2hlZCgpO1xuICAgIHJldHVybiBjb21wb25lbnRSZWY7XG4gIH1cblxuICBhc3luYyBvbkJ1dHRvbkNsaWNrKGJ1dHRvbjogRGlhbG9nQnV0dG9uQ29uZmlnPFRSZXN1bHQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xvc2VPbkNsaWNrID0gYnV0dG9uLmNsb3NlT25DbGljayA/PyB0cnVlO1xuICAgIGxldCBoYW5kbGVyUmVzdWx0OiBUUmVzdWx0IHwgZmFsc2UgfCB2b2lkIHwgUHJvbWlzZTxUUmVzdWx0IHwgZmFsc2UgfCB2b2lkPiA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChidXR0b24uaGFuZGxlcikge1xuICAgICAgaGFuZGxlclJlc3VsdCA9IGJ1dHRvbi5oYW5kbGVyKHRoaXMuZGlhbG9nUmVmKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IGhhbmRsZXJSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlID8gYXdhaXQgaGFuZGxlclJlc3VsdCA6IGhhbmRsZXJSZXN1bHQ7XG5cbiAgICBpZiAoIWNsb3NlT25DbGljayB8fCByZXNvbHZlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShyZXNvbHZlZCBhcyBUUmVzdWx0IHwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIGdldCBidXR0b25BbGlnbm1lbnRDbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFsaWdubWVudCA9IHRoaXMuY29uZmlnPy5idXR0b25BbGlnbm1lbnQgPz8gJ3JpZ2h0JztcbiAgICByZXR1cm4gdGhpcy5tYXBBbGlnbm1lbnRUb0NsYXNzKGFsaWdubWVudCk7XG4gIH1cblxuICBnZXQgcGFuZWxDbGFzc0xpc3QoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gW1xuICAgICAgJ3JlbGF0aXZlJyxcbiAgICAgICd3LWZ1bGwnLFxuICAgICAgJ2JnLXdoaXRlJyxcbiAgICAgICdyb3VuZGVkLTJ4bCcsXG4gICAgICAnc2hhZG93LW1kJyxcbiAgICAgICdib3JkZXInLFxuICAgICAgJ2JvcmRlci1bI0U1RTdFQl0nLFxuICAgICAgJ3AtNicsXG4gICAgICAndGV4dC1sZWZ0JyxcbiAgICBdO1xuXG4gICAgY29uc3QgY3VzdG9tID0gdGhpcy5jb25maWc/LnBhbmVsQ2xhc3M7XG5cbiAgICBpZiAoIWN1c3RvbSkge1xuICAgICAgcmV0dXJuIGJhc2VDbGFzc2VzO1xuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGN1c3RvbSkgPyBbLi4uYmFzZUNsYXNzZXMsIC4uLmN1c3RvbV0gOiBbLi4uYmFzZUNsYXNzZXMsIGN1c3RvbV07XG4gIH1cblxuICBnZXQgcGFuZWxTdHlsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB0aGlzLmNvbmZpZz8ud2lkdGgsXG4gICAgICBtYXhXaWR0aDogdGhpcy5jb25maWc/Lm1heFdpZHRoID8/ICc0ODBweCcsXG4gICAgfTtcbiAgfVxuXG4gIGJ1dHRvblZhcmlhbnQoYnV0dG9uOiBEaWFsb2dCdXR0b25Db25maWc8VFJlc3VsdD4pOiBCdXR0b25WYXJpYW50IHtcbiAgICBjb25zdCByb2xlID0gdGhpcy5ub3JtYWxpemVSb2xlKGJ1dHRvbi5yb2xlKTtcblxuICAgIHN3aXRjaCAocm9sZSkge1xuICAgICAgY2FzZSAnc2Vjb25kYXJ5JzpcbiAgICAgICAgcmV0dXJuICdvdXRsaW5lZCc7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICAgIGNhc2UgJ3RvbmFsJzpcbiAgICAgICAgcmV0dXJuICd0b25hbCc7XG4gICAgICBjYXNlICdlbGV2YXRlZCc6XG4gICAgICAgIHJldHVybiAnZWxldmF0ZWQnO1xuICAgICAgY2FzZSAnZmlsbGVkJzpcbiAgICAgIGNhc2UgJ3ByaW1hcnknOlxuICAgICAgY2FzZSAnd2Fybic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2ZpbGxlZCc7XG4gICAgfVxuICB9XG5cbiAgYnV0dG9uSG9zdENsYXNzZXMoYnV0dG9uOiBEaWFsb2dCdXR0b25Db25maWc8VFJlc3VsdD4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgcm9sZSA9IHRoaXMubm9ybWFsaXplUm9sZShidXR0b24ucm9sZSk7XG5cbiAgICBpZiAocm9sZSA9PT0gJ3dhcm4nKSB7XG4gICAgICByZXR1cm4gWydjcWEtZGlhbG9nLWJ0bi13YXJuJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBBbGlnbm1lbnRUb0NsYXNzKGFsaWdubWVudDogRGlhbG9nQnV0dG9uQWxpZ25tZW50KTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHJldHVybiAnanVzdGlmeS1zdGFydCc7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICByZXR1cm4gJ2p1c3RpZnktY2VudGVyJztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnanVzdGlmeS1lbmQnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFya0NvbnRlbnRBdHRhY2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRlbnRBdHRhY2hlZCA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVJvbGUocm9sZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHJvbGUgPz8gJ3NlY29uZGFyeScpLnRyaW0oKS5zcGxpdCgvXFxzKy8pWzBdO1xuICB9XG59XG5cblxuIiwiPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGp1c3RpZnktY2VudGVyIHB4LTQgc206cHgtNlwiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwicGFuZWxDbGFzc0xpc3RcIiBbbmdTdHlsZV09XCJwYW5lbFN0eWxlc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIj5cbiAgICAgICAgICA8aDIgY2xhc3M9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC1bIzExMTgyN11cIj5cbiAgICAgICAgICAgIHt7IGNvbmZpZy50aXRsZSB9fVxuICAgICAgICAgIDwvaDI+XG5cbiAgICAgICAgICA8cCAqbmdJZj1cImNvbmZpZy5kZXNjcmlwdGlvblwiIGNsYXNzPVwidGV4dC1zbSBsZWFkaW5nLTYgdGV4dC1bIzRCNTU2M11cIj5cbiAgICAgICAgICAgIHt7IGNvbmZpZy5kZXNjcmlwdGlvbiB9fVxuICAgICAgICAgIDwvcD5cblxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLndhcm5pbmdcIlxuICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXhsIGJvcmRlciBib3JkZXItcmVkLTIwMCBiZy1yZWQtNTAgcHgtNCBweS0zIHRleHQtc20gbGVhZGluZy01IHRleHQtcmVkLTcwMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgY29uZmlnLndhcm5pbmcgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gdGV4dC1bIzExMTgyN11cIiBbY2xhc3MuaGlkZGVuXT1cIiFjb250ZW50QXR0YWNoZWRcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgY2RrUG9ydGFsT3V0bGV0PjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IGZsZXggZmxleC13cmFwIGdhcC0zXCIgW25nQ2xhc3NdPVwiYnV0dG9uQWxpZ25tZW50Q2xhc3NcIj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBjb25maWcuYnV0dG9uc1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFt2YXJpYW50XT1cImJ1dHRvblZhcmlhbnQoYnV0dG9uKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJidXR0b25Ib3N0Q2xhc3NlcyhidXR0b24pXCJcbiAgICAgICAgICAgIChjbGlja2VkKT1cIm9uQnV0dG9uQ2xpY2soYnV0dG9uKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgYnV0dG9uLmxhYmVsIH19XG4gICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cblxuIl19