@cqa-lib/cqa-ui 0.0.1 → 0.0.2
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 +90 -4
- package/dist/cqa-ui/README.md +226 -0
- package/dist/cqa-ui/esm2020/lib/button/button.component.mjs +257 -0
- package/dist/cqa-ui/esm2020/lib/dialog/dialog.component.mjs +127 -0
- package/dist/cqa-ui/esm2020/lib/search-bar/search-bar.component.mjs +95 -0
- package/dist/cqa-ui/esm2020/lib/segment-control/segment-control.component.mjs +211 -0
- package/{fesm2015 → dist/cqa-ui/fesm2015}/cqa-lib-cqa-ui.mjs +13 -53
- package/dist/cqa-ui/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -0
- package/{fesm2020 → dist/cqa-ui/fesm2020}/cqa-lib-cqa-ui.mjs +13 -53
- package/dist/cqa-ui/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -0
- package/{lib → dist/cqa-ui/lib}/button/button.component.d.ts +0 -2
- package/{lib → dist/cqa-ui/lib}/dialog/dialog.component.d.ts +0 -2
- package/{lib → dist/cqa-ui/lib}/search-bar/search-bar.component.d.ts +0 -3
- package/{lib → dist/cqa-ui/lib}/segment-control/segment-control.component.d.ts +0 -2
- package/dist/cqa-ui/package.json +56 -0
- package/dist/cqa-ui/styles.css +1 -0
- package/package.json +49 -23
- package/esm2020/lib/button/button.component.mjs +0 -265
- package/esm2020/lib/dialog/dialog.component.mjs +0 -135
- package/esm2020/lib/search-bar/search-bar.component.mjs +0 -111
- package/esm2020/lib/segment-control/segment-control.component.mjs +0 -219
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +0 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +0 -1
- package/styles.css +0 -1
- /package/{cqa-lib-cqa-ui.d.ts → dist/cqa-ui/cqa-lib-cqa-ui.d.ts} +0 -0
- /package/{esm2020 → dist/cqa-ui/esm2020}/cqa-lib-cqa-ui.mjs +0 -0
- /package/{esm2020 → dist/cqa-ui/esm2020}/lib/dialog/dialog-ref.mjs +0 -0
- /package/{esm2020 → dist/cqa-ui/esm2020}/lib/dialog/dialog.models.mjs +0 -0
- /package/{esm2020 → dist/cqa-ui/esm2020}/lib/dialog/dialog.service.mjs +0 -0
- /package/{esm2020 → dist/cqa-ui/esm2020}/lib/dialog/dialog.tokens.mjs +0 -0
- /package/{esm2020 → dist/cqa-ui/esm2020}/lib/root-wrapper/root-wrapper.component.mjs +0 -0
- /package/{esm2020 → dist/cqa-ui/esm2020}/lib/ui-kit.module.mjs +0 -0
- /package/{esm2020 → dist/cqa-ui/esm2020}/public-api.mjs +0 -0
- /package/{lib → dist/cqa-ui/lib}/dialog/dialog-ref.d.ts +0 -0
- /package/{lib → dist/cqa-ui/lib}/dialog/dialog.models.d.ts +0 -0
- /package/{lib → dist/cqa-ui/lib}/dialog/dialog.service.d.ts +0 -0
- /package/{lib → dist/cqa-ui/lib}/dialog/dialog.tokens.d.ts +0 -0
- /package/{lib → dist/cqa-ui/lib}/root-wrapper/root-wrapper.component.d.ts +0 -0
- /package/{lib → dist/cqa-ui/lib}/ui-kit.module.d.ts +0 -0
- /package/{public-api.d.ts → dist/cqa-ui/public-api.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -7,24 +7,26 @@ Component library for Angular 13+, built with Tailwind CSS tokens and Storybook-
|
|
|
7
7
|
## 📦 Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install cqa-ui
|
|
10
|
+
npm install @cqa-lib/cqa-ui
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
### Peer dependencies
|
|
14
14
|
|
|
15
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
|
|
16
|
+
npm install @angular/common@^13.4.0 @angular/core@^13.4.0 @angular/forms@^13.4.0 @angular/material@^13.3.9 @angular/cdk@^13.3.9 rxjs@^6.6.7 || ^7.5.0
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
21
|
## 🚀 Quick Start
|
|
22
22
|
|
|
23
|
+
### Step 1: Import the Module
|
|
24
|
+
|
|
23
25
|
```ts
|
|
24
26
|
// app.module.ts
|
|
25
27
|
import { NgModule } from '@angular/core';
|
|
26
28
|
import { BrowserModule } from '@angular/platform-browser';
|
|
27
|
-
import { UiKitModule } from 'cqa-ui';
|
|
29
|
+
import { UiKitModule } from '@cqa-lib/cqa-ui';
|
|
28
30
|
|
|
29
31
|
import { AppComponent } from './app.component';
|
|
30
32
|
|
|
@@ -39,6 +41,49 @@ import { AppComponent } from './app.component';
|
|
|
39
41
|
export class AppModule {}
|
|
40
42
|
```
|
|
41
43
|
|
|
44
|
+
### Step 2: Import the Styles
|
|
45
|
+
|
|
46
|
+
**Option A: In `angular.json`** (Recommended)
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"projects": {
|
|
51
|
+
"your-project": {
|
|
52
|
+
"architect": {
|
|
53
|
+
"build": {
|
|
54
|
+
"options": {
|
|
55
|
+
"styles": [
|
|
56
|
+
"node_modules/@cqa-lib/cqa-ui/styles.css",
|
|
57
|
+
"src/styles.css"
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Option B: In `styles.css`**
|
|
68
|
+
|
|
69
|
+
```css
|
|
70
|
+
@import '@cqa-lib/cqa-ui/styles.css';
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Step 3: Add Angular Material Icon Font
|
|
74
|
+
|
|
75
|
+
Add this to your `index.html`:
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Or in `styles.css`:
|
|
82
|
+
|
|
83
|
+
```css
|
|
84
|
+
@import url('https://fonts.googleapis.com/icon?family=Material+Icons');
|
|
85
|
+
```
|
|
86
|
+
|
|
42
87
|
---
|
|
43
88
|
|
|
44
89
|
## 💡 Usage Examples
|
|
@@ -84,7 +129,7 @@ export class AppModule {}
|
|
|
84
129
|
### Dialog
|
|
85
130
|
|
|
86
131
|
```ts
|
|
87
|
-
import { DialogService } from 'cqa-ui';
|
|
132
|
+
import { DialogService } from '@cqa-lib/cqa-ui';
|
|
88
133
|
|
|
89
134
|
constructor(private readonly dialog: DialogService) {}
|
|
90
135
|
|
|
@@ -107,6 +152,47 @@ openDialog(): void {
|
|
|
107
152
|
|
|
108
153
|
---
|
|
109
154
|
|
|
155
|
+
## 🔧 Troubleshooting
|
|
156
|
+
|
|
157
|
+
### Component renders as empty tag (no inner HTML)
|
|
158
|
+
|
|
159
|
+
If you see `<cqa-search-bar></cqa-search-bar>` without any inner content, check:
|
|
160
|
+
|
|
161
|
+
1. **Missing styles import** - Add to `angular.json`:
|
|
162
|
+
```json
|
|
163
|
+
"styles": [
|
|
164
|
+
"node_modules/@cqa-lib/cqa-ui/styles.css",
|
|
165
|
+
"src/styles.css"
|
|
166
|
+
]
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
2. **Missing Angular Material Icon font** - Add to `index.html`:
|
|
170
|
+
```html
|
|
171
|
+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
3. **Check browser console** for errors:
|
|
175
|
+
- Missing peer dependencies (`@angular/material`, `@angular/cdk`)
|
|
176
|
+
- Module import errors
|
|
177
|
+
- Template compilation errors
|
|
178
|
+
|
|
179
|
+
4. **Verify module import** in your `app.module.ts`:
|
|
180
|
+
```ts
|
|
181
|
+
import { UiKitModule } from '@cqa-lib/cqa-ui';
|
|
182
|
+
|
|
183
|
+
@NgModule({
|
|
184
|
+
imports: [UiKitModule, ...]
|
|
185
|
+
})
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
5. **Clear Angular cache and rebuild**:
|
|
189
|
+
```bash
|
|
190
|
+
rm -rf .angular
|
|
191
|
+
npm start # or ng serve
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
110
196
|
## 📚 Storybook
|
|
111
197
|
|
|
112
198
|
```bash
|
|
@@ -0,0 +1,226 @@
|
|
|
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-lib/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 @angular/cdk@^13.3.9 rxjs@^6.6.7 || ^7.5.0
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 🚀 Quick Start
|
|
22
|
+
|
|
23
|
+
### Step 1: Import the Module
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
// app.module.ts
|
|
27
|
+
import { NgModule } from '@angular/core';
|
|
28
|
+
import { BrowserModule } from '@angular/platform-browser';
|
|
29
|
+
import { UiKitModule } from '@cqa-lib/cqa-ui';
|
|
30
|
+
|
|
31
|
+
import { AppComponent } from './app.component';
|
|
32
|
+
|
|
33
|
+
@NgModule({
|
|
34
|
+
declarations: [AppComponent],
|
|
35
|
+
imports: [
|
|
36
|
+
BrowserModule,
|
|
37
|
+
UiKitModule
|
|
38
|
+
],
|
|
39
|
+
bootstrap: [AppComponent]
|
|
40
|
+
})
|
|
41
|
+
export class AppModule {}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Step 2: Import the Styles
|
|
45
|
+
|
|
46
|
+
**Option A: In `angular.json`** (Recommended)
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"projects": {
|
|
51
|
+
"your-project": {
|
|
52
|
+
"architect": {
|
|
53
|
+
"build": {
|
|
54
|
+
"options": {
|
|
55
|
+
"styles": [
|
|
56
|
+
"node_modules/@cqa-lib/cqa-ui/styles.css",
|
|
57
|
+
"src/styles.css"
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Option B: In `styles.css`**
|
|
68
|
+
|
|
69
|
+
```css
|
|
70
|
+
@import '@cqa-lib/cqa-ui/styles.css';
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Step 3: Add Angular Material Icon Font
|
|
74
|
+
|
|
75
|
+
Add this to your `index.html`:
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Or in `styles.css`:
|
|
82
|
+
|
|
83
|
+
```css
|
|
84
|
+
@import url('https://fonts.googleapis.com/icon?family=Material+Icons');
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 💡 Usage Examples
|
|
90
|
+
|
|
91
|
+
### Button
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<cqa-button variant="filled" icon="save" (clicked)="onSave()">
|
|
95
|
+
Save changes
|
|
96
|
+
</cqa-button>
|
|
97
|
+
|
|
98
|
+
<cqa-button variant="outlined" [disabled]="isSubmitting">
|
|
99
|
+
Cancel
|
|
100
|
+
</cqa-button>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Search bar
|
|
104
|
+
|
|
105
|
+
```html
|
|
106
|
+
<cqa-search-bar
|
|
107
|
+
placeholder="Search components"
|
|
108
|
+
[value]="query"
|
|
109
|
+
[showClear]="true"
|
|
110
|
+
(valueChange)="query = $event"
|
|
111
|
+
(search)="onSearch($event)"
|
|
112
|
+
></cqa-search-bar>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Segment control
|
|
116
|
+
|
|
117
|
+
```html
|
|
118
|
+
<cqa-segment-control
|
|
119
|
+
[segments]="[
|
|
120
|
+
{ label: 'Overview', value: 'overview' },
|
|
121
|
+
{ label: 'Analytics', value: 'analytics' },
|
|
122
|
+
{ label: 'Settings', value: 'settings', disabled: true }
|
|
123
|
+
]"
|
|
124
|
+
[value]="currentTab"
|
|
125
|
+
(valueChange)="currentTab = $event"
|
|
126
|
+
></cqa-segment-control>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Dialog
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
import { DialogService } from '@cqa-lib/cqa-ui';
|
|
133
|
+
|
|
134
|
+
constructor(private readonly dialog: DialogService) {}
|
|
135
|
+
|
|
136
|
+
openDialog(): void {
|
|
137
|
+
this.dialog.open({
|
|
138
|
+
title: 'Delete dashboard',
|
|
139
|
+
description: 'Deleting this dashboard will remove it for all collaborators.',
|
|
140
|
+
warning: 'This action cannot be undone.',
|
|
141
|
+
content: {
|
|
142
|
+
type: 'text',
|
|
143
|
+
text: 'Are you sure you want to continue?'
|
|
144
|
+
},
|
|
145
|
+
buttons: [
|
|
146
|
+
{ label: 'Cancel', role: 'secondary' },
|
|
147
|
+
{ label: 'Delete', role: 'warn', handler: () => 'delete' }
|
|
148
|
+
]
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 🔧 Troubleshooting
|
|
156
|
+
|
|
157
|
+
### Component renders as empty tag (no inner HTML)
|
|
158
|
+
|
|
159
|
+
If you see `<cqa-search-bar></cqa-search-bar>` without any inner content, check:
|
|
160
|
+
|
|
161
|
+
1. **Missing styles import** - Add to `angular.json`:
|
|
162
|
+
```json
|
|
163
|
+
"styles": [
|
|
164
|
+
"node_modules/@cqa-lib/cqa-ui/styles.css",
|
|
165
|
+
"src/styles.css"
|
|
166
|
+
]
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
2. **Missing Angular Material Icon font** - Add to `index.html`:
|
|
170
|
+
```html
|
|
171
|
+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
3. **Check browser console** for errors:
|
|
175
|
+
- Missing peer dependencies (`@angular/material`, `@angular/cdk`)
|
|
176
|
+
- Module import errors
|
|
177
|
+
- Template compilation errors
|
|
178
|
+
|
|
179
|
+
4. **Verify module import** in your `app.module.ts`:
|
|
180
|
+
```ts
|
|
181
|
+
import { UiKitModule } from '@cqa-lib/cqa-ui';
|
|
182
|
+
|
|
183
|
+
@NgModule({
|
|
184
|
+
imports: [UiKitModule, ...]
|
|
185
|
+
})
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
5. **Clear Angular cache and rebuild**:
|
|
189
|
+
```bash
|
|
190
|
+
rm -rf .angular
|
|
191
|
+
npm start # or ng serve
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 📚 Storybook
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
npm run storybook
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
View component documentation and interactive examples at `http://localhost:6006`.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 🛠 Development
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
npm install
|
|
210
|
+
npm run build:cqa-ui # build the library bundle
|
|
211
|
+
npm run storybook # start Storybook
|
|
212
|
+
npm run build-storybook # static Storybook build
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Publish workflow
|
|
216
|
+
|
|
217
|
+
1. Update version in `package.json`
|
|
218
|
+
2. `npm run build:cqa-ui`
|
|
219
|
+
3. `npm publish dist/cqa-ui`
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 📄 License
|
|
224
|
+
|
|
225
|
+
MIT — contributions and issues welcome!
|
|
226
|
+
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, HostListener } 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.variant = 'filled';
|
|
8
|
+
this.disabled = false;
|
|
9
|
+
this.iconPosition = 'start';
|
|
10
|
+
this.type = 'button';
|
|
11
|
+
this.clicked = new EventEmitter();
|
|
12
|
+
// Internal state tracking
|
|
13
|
+
this.isHovered = false;
|
|
14
|
+
this.isFocused = false;
|
|
15
|
+
this.isPressed = false;
|
|
16
|
+
}
|
|
17
|
+
get hasIcon() {
|
|
18
|
+
return !!this.icon;
|
|
19
|
+
}
|
|
20
|
+
get buttonClasses() {
|
|
21
|
+
const baseClasses = [
|
|
22
|
+
'flex',
|
|
23
|
+
'flex-col',
|
|
24
|
+
'justify-center',
|
|
25
|
+
'items-center',
|
|
26
|
+
'p-0',
|
|
27
|
+
'gap-2',
|
|
28
|
+
'rounded-lg',
|
|
29
|
+
'cursor-pointer',
|
|
30
|
+
'font-inter',
|
|
31
|
+
'font-semibold',
|
|
32
|
+
'text-sm',
|
|
33
|
+
'leading-[14px]',
|
|
34
|
+
'transition-all',
|
|
35
|
+
'duration-200',
|
|
36
|
+
'outline-none'
|
|
37
|
+
];
|
|
38
|
+
if (this.disabled) {
|
|
39
|
+
baseClasses.push('cursor-not-allowed');
|
|
40
|
+
}
|
|
41
|
+
// Add variant and state specific classes
|
|
42
|
+
const variantClasses = this.getVariantClasses();
|
|
43
|
+
return [...baseClasses, ...variantClasses].join(' ');
|
|
44
|
+
}
|
|
45
|
+
get stateLayerClasses() {
|
|
46
|
+
const classes = [
|
|
47
|
+
'flex',
|
|
48
|
+
'flex-row',
|
|
49
|
+
'justify-center',
|
|
50
|
+
'items-center',
|
|
51
|
+
'gap-2',
|
|
52
|
+
'w-full',
|
|
53
|
+
'h-full',
|
|
54
|
+
'py-[10px]',
|
|
55
|
+
'px-6',
|
|
56
|
+
];
|
|
57
|
+
return classes.join(' ');
|
|
58
|
+
}
|
|
59
|
+
get labelClasses() {
|
|
60
|
+
const classes = [
|
|
61
|
+
'flex',
|
|
62
|
+
'items-center',
|
|
63
|
+
'text-center',
|
|
64
|
+
'font-inter',
|
|
65
|
+
'font-semibold',
|
|
66
|
+
'text-sm',
|
|
67
|
+
'leading-[14px]',
|
|
68
|
+
'flex-none',
|
|
69
|
+
this.textClass,
|
|
70
|
+
];
|
|
71
|
+
if (this.disabled) {
|
|
72
|
+
classes.push('opacity-[0.38]');
|
|
73
|
+
}
|
|
74
|
+
return classes.join(' ');
|
|
75
|
+
}
|
|
76
|
+
get iconClasses() {
|
|
77
|
+
const classes = [
|
|
78
|
+
'flex',
|
|
79
|
+
'items-center',
|
|
80
|
+
'justify-center',
|
|
81
|
+
'w-[14px]',
|
|
82
|
+
'h-[14px]',
|
|
83
|
+
'shrink-0',
|
|
84
|
+
'flex-none'
|
|
85
|
+
];
|
|
86
|
+
if (this.disabled) {
|
|
87
|
+
classes.push('opacity-[0.38]');
|
|
88
|
+
}
|
|
89
|
+
return classes.join(' ');
|
|
90
|
+
}
|
|
91
|
+
getVariantClasses() {
|
|
92
|
+
const classes = [];
|
|
93
|
+
if (this.variant === 'filled') {
|
|
94
|
+
if (this.disabled) {
|
|
95
|
+
classes.push('bg-primary-muted');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
classes.push('bg-primary');
|
|
99
|
+
if (this.isHovered) {
|
|
100
|
+
classes.push('shadow-[0px_1px_2px_rgba(0,0,0,0.3),0px_1px_3px_1px_rgba(0,0,0,0.15)]');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else if (this.variant === 'outlined') {
|
|
105
|
+
if (this.disabled) {
|
|
106
|
+
classes.push('bg-transparent', 'border', 'border-primary-muted');
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
if (this.isFocused) {
|
|
110
|
+
classes.push('bg-primary-surface-alt', 'border', 'border-primary-hover', 'shadow-[0px_4px_4px_rgba(0,0,0,0.25)]');
|
|
111
|
+
}
|
|
112
|
+
else if (this.isHovered || this.isPressed) {
|
|
113
|
+
classes.push('bg-primary-surface', 'border', 'border-primary');
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
classes.push('bg-transparent', 'border', 'border-slate');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else if (this.variant === 'text') {
|
|
121
|
+
if (this.disabled) {
|
|
122
|
+
classes.push('bg-transparent');
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
classes.push('bg-transparent');
|
|
126
|
+
if (this.isHovered || this.isFocused || this.isPressed) {
|
|
127
|
+
classes.push('bg-primary-surface');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (this.variant === 'elevated') {
|
|
132
|
+
if (this.disabled) {
|
|
133
|
+
classes.push('bg-primary-muted', 'shadow-none');
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
if (this.isFocused) {
|
|
137
|
+
classes.push('bg-primary-surface-alt', 'shadow-[0px_4px_4px_rgba(0,0,0,0.25)]');
|
|
138
|
+
}
|
|
139
|
+
else if (this.isPressed) {
|
|
140
|
+
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)]');
|
|
141
|
+
}
|
|
142
|
+
else if (this.isHovered) {
|
|
143
|
+
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)]');
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
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)]');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else if (this.variant === 'tonal') {
|
|
151
|
+
if (this.disabled) {
|
|
152
|
+
classes.push('bg-primary-muted');
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
if (this.isHovered) {
|
|
156
|
+
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)]');
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
classes.push('bg-primary-surface-alt');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return classes;
|
|
164
|
+
}
|
|
165
|
+
get textClass() {
|
|
166
|
+
if (this.disabled) {
|
|
167
|
+
if (this.variant === 'outlined' || this.variant === 'text') {
|
|
168
|
+
return 'text-ink';
|
|
169
|
+
}
|
|
170
|
+
return 'text-ink-muted';
|
|
171
|
+
}
|
|
172
|
+
switch (this.variant) {
|
|
173
|
+
case 'filled':
|
|
174
|
+
return 'text-surface-default';
|
|
175
|
+
case 'outlined':
|
|
176
|
+
if (this.isFocused || this.isHovered || this.isPressed) {
|
|
177
|
+
return 'text-primary-hover';
|
|
178
|
+
}
|
|
179
|
+
return 'text-slate';
|
|
180
|
+
case 'text':
|
|
181
|
+
case 'elevated':
|
|
182
|
+
return 'text-primary-hover';
|
|
183
|
+
case 'tonal':
|
|
184
|
+
return 'text-ink';
|
|
185
|
+
default:
|
|
186
|
+
return '';
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
onMouseEnter() {
|
|
190
|
+
if (!this.disabled) {
|
|
191
|
+
this.isHovered = true;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
onMouseLeave() {
|
|
195
|
+
this.isHovered = false;
|
|
196
|
+
this.isPressed = false;
|
|
197
|
+
}
|
|
198
|
+
onMouseDown() {
|
|
199
|
+
if (!this.disabled) {
|
|
200
|
+
this.isPressed = true;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
onMouseUp() {
|
|
204
|
+
this.isPressed = false;
|
|
205
|
+
}
|
|
206
|
+
onFocus() {
|
|
207
|
+
if (!this.disabled) {
|
|
208
|
+
this.isFocused = true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
onBlur() {
|
|
212
|
+
this.isFocused = false;
|
|
213
|
+
this.isPressed = false;
|
|
214
|
+
}
|
|
215
|
+
onClick(event) {
|
|
216
|
+
if (!this.disabled) {
|
|
217
|
+
this.clicked.emit(event);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
ButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
222
|
+
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()" } }, ngImport: i0, template: "<div id=\"cqa-ui-root\" style=\"display: inline-block; width: auto;\">\n <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</div>\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"] }] });
|
|
223
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ButtonComponent, decorators: [{
|
|
224
|
+
type: Component,
|
|
225
|
+
args: [{ selector: 'cqa-button', template: "<div id=\"cqa-ui-root\" style=\"display: inline-block; width: auto;\">\n <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</div>\n\n", styles: [] }]
|
|
226
|
+
}], propDecorators: { variant: [{
|
|
227
|
+
type: Input
|
|
228
|
+
}], disabled: [{
|
|
229
|
+
type: Input
|
|
230
|
+
}], icon: [{
|
|
231
|
+
type: Input
|
|
232
|
+
}], iconPosition: [{
|
|
233
|
+
type: Input
|
|
234
|
+
}], type: [{
|
|
235
|
+
type: Input
|
|
236
|
+
}], clicked: [{
|
|
237
|
+
type: Output
|
|
238
|
+
}], onMouseEnter: [{
|
|
239
|
+
type: HostListener,
|
|
240
|
+
args: ['mouseenter']
|
|
241
|
+
}], onMouseLeave: [{
|
|
242
|
+
type: HostListener,
|
|
243
|
+
args: ['mouseleave']
|
|
244
|
+
}], onMouseDown: [{
|
|
245
|
+
type: HostListener,
|
|
246
|
+
args: ['mousedown']
|
|
247
|
+
}], onMouseUp: [{
|
|
248
|
+
type: HostListener,
|
|
249
|
+
args: ['mouseup']
|
|
250
|
+
}], onFocus: [{
|
|
251
|
+
type: HostListener,
|
|
252
|
+
args: ['focus']
|
|
253
|
+
}], onBlur: [{
|
|
254
|
+
type: HostListener,
|
|
255
|
+
args: ['blur']
|
|
256
|
+
}] } });
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2J1dHRvbi9idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFTckYsTUFBTSxPQUFPLGVBQWU7SUFMNUI7UUFPVyxZQUFPLEdBQWtCLFFBQVEsQ0FBQztRQUNsQyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFCLGlCQUFZLEdBQW9CLE9BQU8sQ0FBQztRQUN4QyxTQUFJLEdBQWtDLFFBQVEsQ0FBQztRQUM5QyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUVuRCwwQkFBMEI7UUFDMUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGNBQVMsR0FBWSxLQUFLLENBQUM7S0EwTjVCO0lBeE5DLElBQUksT0FBTztRQUNULE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLE1BQU07WUFDTixVQUFVO1lBQ1YsZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCxLQUFLO1lBQ0wsT0FBTztZQUNQLFlBQVk7WUFDWixnQkFBZ0I7WUFDaEIsWUFBWTtZQUNaLGVBQWU7WUFDZixTQUFTO1lBQ1QsZ0JBQWdCO1lBQ2hCLGdCQUFnQjtZQUNoQixjQUFjO1lBQ2QsY0FBYztTQUNmLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NB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LElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFHRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBR0QsTUFBTTtRQUNKLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUI7SUFDSCxDQUFDOzs0R0FyT1UsZUFBZTtnR0FBZixlQUFlLDhYQ1Q1Qiw0NEJBMEJBOzJGRGpCYSxlQUFlO2tCQUwzQixTQUFTOytCQUNFLFlBQVk7OEJBTWIsT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU07Z0JBcUxQLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZO2dCQVExQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsWUFBWTtnQkFPMUIsV0FBVztzQkFEVixZQUFZO3VCQUFDLFdBQVc7Z0JBUXpCLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTO2dCQU12QixPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTztnQkFRckIsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCB0eXBlIEJ1dHRvblZhcmlhbnQgPSAnZmlsbGVkJyB8ICdvdXRsaW5lZCcgfCAndGV4dCcgfCAnZWxldmF0ZWQnIHwgJ3RvbmFsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIEJ1dHRvbkNvbXBvbmVudCB7XG5cbiAgQElucHV0KCkgdmFyaWFudDogQnV0dG9uVmFyaWFudCA9ICdmaWxsZWQnO1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpY29uPzogc3RyaW5nO1xuICBASW5wdXQoKSBpY29uUG9zaXRpb246ICdzdGFydCcgfCAnZW5kJyA9ICdzdGFydCc7XG4gIEBJbnB1dCgpIHR5cGU6ICdidXR0b24nIHwgJ3N1Ym1pdCcgfCAncmVzZXQnID0gJ2J1dHRvbic7XG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gIC8vIEludGVybmFsIHN0YXRlIHRyYWNraW5nXG4gIGlzSG92ZXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0ZvY3VzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNQcmVzc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGhhc0ljb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5pY29uO1xuICB9XG5cbiAgZ2V0IGJ1dHRvbkNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9IFtcbiAgICAgICdmbGV4JyxcbiAgICAgICdmbGV4LWNvbCcsXG4gICAgICAnanVzdGlmeS1jZW50ZXInLFxuICAgICAgJ2l0ZW1zLWNlbnRlcicsXG4gICAgICAncC0wJyxcbiAgICAgICdnYXAtMicsXG4gICAgICAncm91bmRlZC1sZycsXG4gICAgICAnY3Vyc29yLXBvaW50ZXInLFxuICAgICAgJ2ZvbnQtaW50ZXInLFxuICAgICAgJ2ZvbnQtc2VtaWJvbGQnLFxuICAgICAgJ3RleHQtc20nLFxuICAgICAgJ2xlYWRpbmctWzE0cHhdJyxcbiAgICAgICd0cmFuc2l0aW9uLWFsbCcsXG4gICAgICAnZHVyYXRpb24tMjAwJyxcbiAgICAgICdvdXRsaW5lLW5vbmUnXG4gICAgXTtcblxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICBiYXNlQ2xhc3Nlcy5wdXNoKCdjdXJzb3Itbm90LWFsbG93ZWQnKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdmFyaWFudCBhbmQgc3RhdGUgc3BlY2lmaWMgY2xhc3Nlc1xuICAgIGNvbnN0IHZhcmlhbnRDbGFzc2VzID0gdGhpcy5nZXRWYXJpYW50Q2xhc3NlcygpO1xuICAgIFxuICAgIHJldHVybiBbLi4uYmFzZUNsYXNzZXMsIC4uLnZhcmlhbnRDbGFzc2VzXS5qb2luKCcgJyk7XG4gIH1cblxuICBnZXQgc3RhdGVMYXllckNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc2VzID0gW1xuICAgICAgJ2ZsZXgnLFxuICAgICAgJ2ZsZXgtcm93JyxcbiAgICAgICdqdXN0aWZ5LWNlbnRlcicsXG4gICAgICAnaXRlbXMtY2VudGVyJyxcbiAgICAgICdnYXAtMicsXG4gICAgICAndy1mdWxsJyxcbiAgICAgICdoLWZ1bGwnLFxuICAgICAgJ3B5LVsxMHB4XScsXG4gICAgICAncHgtNicsXG4gICAgXTtcblxuICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGdldCBsYWJlbENsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc2VzID0gW1xuICAgICAgJ2ZsZXgnLFxuICAgICAgJ2l0ZW1zLWNlbnRlcicsXG4gICAgICAndGV4dC1jZW50ZXInLFxuICAgICAgJ2ZvbnQtaW50ZXInLFxuICAgICAgJ2ZvbnQtc2VtaWJvbGQnLFxuICAgICAgJ3RleHQtc20nLFxuICAgICAgJ2xlYWRpbmctWzE0cHhdJyxcbiAgICAgICdmbGV4LW5vbmUnLFxuICAgICAgdGhpcy50ZXh0Q2xhc3MsXG4gICAgXTtcblxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICBjbGFzc2VzLnB1c2goJ29wYWNpdHktWzAuMzhdJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuICB9XG5cbiAgZ2V0IGljb25DbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFtcbiAgICAgICdmbGV4JyxcbiAgICAgICdpdGVtcy1jZW50ZXInLFxuICAgICAgJ2p1c3RpZnktY2VudGVyJyxcbiAgICAgICd3LVsxNHB4XScsXG4gICAgICAnaC1bMTRweF0nLFxuICAgICAgJ3Nocmluay0wJyxcbiAgICAgICdmbGV4LW5vbmUnXG4gICAgXTtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKCdvcGFjaXR5LVswLjM4XScpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICBwcml2YXRlIGdldFZhcmlhbnRDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMudmFyaWFudCA9PT0gJ2ZpbGxlZCcpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnYmctcHJpbWFyeS1tdXRlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1wcmltYXJ5Jyk7XG4gICAgICAgIGlmICh0aGlzLmlzSG92ZXJlZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2hhZG93LVswcHhfMXB4XzJweF9yZ2JhKDAsMCwwLDAuMyksMHB4XzFweF8zcHhfMXB4X3JnYmEoMCwwLDAsMC4xNSldJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMudmFyaWFudCA9PT0gJ291dGxpbmVkJykge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy10cmFuc3BhcmVudCcsICdib3JkZXInLCAnYm9yZGVyLXByaW1hcnktbXV0ZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmlzRm9jdXNlZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYmctcHJpbWFyeS1zdXJmYWNlLWFsdCcsICdib3JkZXInLCAnYm9yZGVyLXByaW1hcnktaG92ZXInLCAnc2hhZG93LVswcHhfNHB4XzRweF9yZ2JhKDAsMCwwLDAuMjUpXScpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNIb3ZlcmVkIHx8IHRoaXMuaXNQcmVzc2VkKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1wcmltYXJ5LXN1cmZhY2UnLCAnYm9yZGVyJywgJ2JvcmRlci1wcmltYXJ5Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy10cmFuc3BhcmVudCcsICdib3JkZXInLCAnYm9yZGVyLXNsYXRlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMudmFyaWFudCA9PT0gJ3RleHQnKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXRyYW5zcGFyZW50Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXRyYW5zcGFyZW50Jyk7XG4gICAgICAgIGlmICh0aGlzLmlzSG92ZXJlZCB8fCB0aGlzLmlzRm9jdXNlZCB8fCB0aGlzLmlzUHJlc3NlZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYmctcHJpbWFyeS1zdXJmYWNlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMudmFyaWFudCA9PT0gJ2VsZXZhdGVkJykge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1wcmltYXJ5LW11dGVkJywgJ3NoYWRvdy1ub25lJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXByaW1hcnktc3VyZmFjZS1hbHQnLCAnc2hhZG93LVswcHhfNHB4XzRweF9yZ2JhKDAsMCwwLDAuMjUpXScpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQcmVzc2VkKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1wcmltYXJ5LXN1cmZhY2UnLCAnc2hhZG93LVswcHhfMXB4XzJweF9yZ2JhKDAsMCwwLDAuMyksMHB4XzFweF8zcHhfMXB4X3JnYmEoMCwwLDAsMC4xNSldJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0hvdmVyZWQpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXByaW1hcnktc3VyZmFjZS1hbHQnLCAnc2hhZG93LVswcHhfMXB4XzJweF9yZ2JhKDAsMCwwLDAuMyksMHB4XzJweF82cHhfMnB4X3JnYmEoMCwwLDAsMC4xNSldJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1wcmltYXJ5LXN1cmZhY2UnLCAnc2hhZG93LVswcHhfMXB4XzJweF9yZ2JhKDAsMCwwLDAuMyksMHB4XzFweF8zcHhfMXB4X3JnYmEoMCwwLDAsMC4xNSldJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMudmFyaWFudCA9PT0gJ3RvbmFsJykge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1wcmltYXJ5LW11dGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5pc0hvdmVyZWQpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2JnLXRvbmFsLWhvdmVyJywgJ3NoYWRvdy1bMHB4XzFweF8ycHhfcmdiYSgwLDAsMCwwLjMpLDBweF8xcHhfM3B4XzFweF9yZ2JhKDAsMCwwLDAuMTUpXScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYmctcHJpbWFyeS1zdXJmYWNlLWFsdCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICBnZXQgdGV4dENsYXNzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIGlmICh0aGlzLnZhcmlhbnQgPT09ICdvdXRsaW5lZCcgfHwgdGhpcy52YXJpYW50ID09PSAndGV4dCcpIHtcbiAgICAgICAgcmV0dXJuICd0ZXh0LWluayc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ3RleHQtaW5rLW11dGVkJztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMudmFyaWFudCkge1xuICAgICAgY2FzZSAnZmlsbGVkJzpcbiAgICAgICAgcmV0dXJuICd0ZXh0LXN1cmZhY2UtZGVmYXVsdCc7XG4gICAgICBjYXNlICdvdXRsaW5lZCc6XG4gICAgICAgIGlmICh0aGlzLmlzRm9jdXNlZCB8fCB0aGlzLmlzSG92ZXJlZCB8fCB0aGlzLmlzUHJlc3NlZCkge1xuICAgICAgICAgIHJldHVybiAndGV4dC1wcmltYXJ5LWhvdmVyJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3RleHQtc2xhdGUnO1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICBjYXNlICdlbGV2YXRlZCc6XG4gICAgICAgIHJldHVybiAndGV4dC1wcmltYXJ5LWhvdmVyJztcbiAgICAgIGNhc2UgJ3RvbmFsJzpcbiAgICAgICAgcmV0dXJuICd0ZXh0LWluayc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpXG4gIG9uTW91c2VFbnRlcigpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcbiAgb25Nb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuaXNIb3ZlcmVkID0gZmFsc2U7XG4gICAgdGhpcy5pc1ByZXNzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicpXG4gIG9uTW91c2VEb3duKCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5pc1ByZXNzZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnKVxuICBvbk1vdXNlVXAoKSB7XG4gICAgdGhpcy5pc1ByZXNzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcbiAgb25Gb2N1cygpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgb25CbHVyKCkge1xuICAgIHRoaXMuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5pc1ByZXNzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBpZD1cImNxYS11aS1yb290XCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiBhdXRvO1wiPlxuICA8YnV0dG9uXG4gICAgW3R5cGVdPVwidHlwZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbY2xhc3NdPVwiYnV0dG9uQ2xhc3Nlc1wiXG4gICAgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gID5cbiAgICA8c3BhbiBbY2xhc3NdPVwic3RhdGVMYXllckNsYXNzZXNcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiaWNvbiAmJiBpY29uUG9zaXRpb24gPT09ICdzdGFydCdcIiBbY2xhc3NdPVwiaWNvbkNsYXNzZXNcIiBbbmdDbGFzc109XCJ0ZXh0Q2xhc3NcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidGV4dC1bMThweF0gbGVhZGluZy1bMThweF0gdy1bMThweF0gaC1bMThweF1cIj5cbiAgICAgICAgICB7eyBpY29uIH19XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBbY2xhc3NdPVwibGFiZWxDbGFzc2VzXCIgW25nQ2xhc3NdPVwidGV4dENsYXNzXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiaWNvbiAmJiBpY29uUG9zaXRpb24gPT09ICdlbmQnXCIgW2NsYXNzXT1cImljb25DbGFzc2VzXCIgW25nQ2xhc3NdPVwidGV4dENsYXNzXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInRleHQtWzE4cHhdIGxlYWRpbmctWzE4cHhdIHctWzE4cHhdIGgtWzE4cHhdXCI+XG4gICAgICAgICAge3sgaWNvbiB9fVxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuIl19
|