cloud-ide-element 0.0.1 → 1.0.0
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 +271 -24
- package/esm2022/lib/components/confirmation-modal/confirmation-modal.component.mjs +182 -0
- package/esm2022/lib/components/data-grid/data-grid.component.mjs +1363 -0
- package/esm2022/lib/components/data-grid/data-grid.types.mjs +37 -0
- package/esm2022/lib/components/dropdown/dropdown.component.mjs +396 -0
- package/esm2022/lib/components/global-notifications/global-notifications.component.mjs +30 -0
- package/esm2022/lib/components/json-editor/json-editor.component.mjs +521 -0
- package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +33 -0
- package/esm2022/lib/components/toast-notification/toast-notification.component.mjs +152 -0
- package/esm2022/lib/elements/button/cide-ele-button.component.mjs +249 -0
- package/esm2022/lib/elements/file-input/file-input.component.mjs +83 -0
- package/esm2022/lib/elements/icon/icon.component.mjs +5 -3
- package/esm2022/lib/elements/input/input.component.mjs +34 -20
- package/esm2022/lib/elements/select/select.component.mjs +471 -0
- package/esm2022/lib/elements/tab/cide-ele-tab.component.mjs +74 -0
- package/esm2022/lib/elements/textarea/textarea.component.mjs +157 -0
- package/esm2022/lib/services/confirmation.service.mjs +151 -0
- package/esm2022/lib/services/dropdown-manager.service.mjs +93 -0
- package/esm2022/lib/services/notification.service.mjs +196 -0
- package/esm2022/lib/utils/directives/resizer/resizer.directive.mjs +231 -0
- package/esm2022/lib/utils/directives/tooltip/tooltip.directive.mjs +294 -0
- package/esm2022/lib/utils/services/elements/elements.service.mjs +9 -7
- package/esm2022/public-api.mjs +23 -2
- package/fesm2022/cloud-ide-element.mjs +4646 -47
- package/fesm2022/cloud-ide-element.mjs.map +1 -1
- package/lib/components/confirmation-modal/confirmation-modal.component.d.ts +16 -0
- package/lib/components/data-grid/data-grid.component.d.ts +244 -0
- package/lib/components/data-grid/data-grid.types.d.ts +146 -0
- package/lib/components/dropdown/dropdown.component.d.ts +75 -0
- package/lib/components/global-notifications/global-notifications.component.d.ts +5 -0
- package/lib/components/json-editor/json-editor.component.d.ts +116 -0
- package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +11 -0
- package/lib/components/toast-notification/toast-notification.component.d.ts +13 -0
- package/lib/elements/button/cide-ele-button.component.d.ts +85 -0
- package/lib/elements/file-input/file-input.component.d.ts +25 -0
- package/lib/elements/input/input.component.d.ts +7 -4
- package/lib/elements/select/select.component.d.ts +91 -0
- package/lib/elements/tab/cide-ele-tab.component.d.ts +26 -0
- package/lib/elements/textarea/textarea.component.d.ts +47 -0
- package/lib/services/confirmation.service.d.ts +65 -0
- package/lib/services/dropdown-manager.service.d.ts +22 -0
- package/lib/services/notification.service.d.ts +81 -0
- package/lib/utils/directives/resizer/resizer.directive.d.ts +44 -0
- package/lib/utils/directives/tooltip/tooltip.directive.d.ts +43 -0
- package/package.json +32 -4
- package/public-api.d.ts +18 -1
- package/src/lib/assets/css/cide-ele-style.scss +85 -0
- package/src/lib/assets/css/cide-ele-variable.scss +336 -0
- package/esm2022/lib/elements/button/button.component.mjs +0 -60
- package/lib/elements/button/button.component.d.ts +0 -27
package/README.md
CHANGED
|
@@ -1,24 +1,271 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
# cloud-ide-element
|
|
2
|
+
|
|
3
|
+
[](https://badge.fury.io/js/cloud-ide-element)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://angular.io/)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
|
|
8
|
+
A comprehensive Angular UI component library built for modern web applications. Featuring responsive design, TypeScript support, and Angular 18+ compatibility with signals and standalone components.
|
|
9
|
+
|
|
10
|
+
## ✨ Features
|
|
11
|
+
|
|
12
|
+
- 🎨 **Modern Design** - Clean, responsive components with Tailwind CSS
|
|
13
|
+
- 🔧 **TypeScript** - Full type safety and IntelliSense support
|
|
14
|
+
- 📱 **Responsive** - Mobile-first design approach
|
|
15
|
+
- ⚡ **Angular 18+** - Built with latest Angular features (signals, control flow)
|
|
16
|
+
- 🧩 **Standalone** - Tree-shakable standalone components
|
|
17
|
+
- 🎯 **Accessible** - WCAG compliant components
|
|
18
|
+
- 🔥 **Performance** - Optimized for production use
|
|
19
|
+
|
|
20
|
+
## 📦 Installation
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install cloud-ide-element
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 🚀 Quick Start
|
|
27
|
+
|
|
28
|
+
### Import Components
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import {
|
|
32
|
+
CideEleButtonComponent,
|
|
33
|
+
CideEleInputComponent,
|
|
34
|
+
CideEleTabComponent,
|
|
35
|
+
CideEleDataGridComponent
|
|
36
|
+
} from 'cloud-ide-element';
|
|
37
|
+
|
|
38
|
+
@Component({
|
|
39
|
+
standalone: true,
|
|
40
|
+
imports: [
|
|
41
|
+
CideEleButtonComponent,
|
|
42
|
+
CideEleInputComponent,
|
|
43
|
+
CideEleTabComponent,
|
|
44
|
+
CideEleDataGridComponent
|
|
45
|
+
],
|
|
46
|
+
template: `
|
|
47
|
+
<cide-ele-button variant="primary" size="md">
|
|
48
|
+
Click me!
|
|
49
|
+
</cide-ele-button>
|
|
50
|
+
|
|
51
|
+
<cide-ele-input
|
|
52
|
+
label="Email"
|
|
53
|
+
type="email"
|
|
54
|
+
placeholder="Enter your email">
|
|
55
|
+
</cide-ele-input>
|
|
56
|
+
|
|
57
|
+
<cide-ele-tab [tabs]="tabs" (tabChange)="onTabChange($event)"></cide-ele-tab>
|
|
58
|
+
|
|
59
|
+
<cide-ele-data-grid [config]="gridConfig"></cide-ele-data-grid>
|
|
60
|
+
`
|
|
61
|
+
})
|
|
62
|
+
export class MyComponent { }
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Data Grid Example
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
import { Component, signal } from '@angular/core';
|
|
69
|
+
import { CideEleDataGridComponent, GridConfiguration } from 'cloud-ide-element';
|
|
70
|
+
|
|
71
|
+
@Component({
|
|
72
|
+
standalone: true,
|
|
73
|
+
imports: [CideEleDataGridComponent],
|
|
74
|
+
template: `<cide-ele-data-grid [config]="gridConfig()"></cide-ele-data-grid>`
|
|
75
|
+
})
|
|
76
|
+
export class UserGridComponent {
|
|
77
|
+
gridConfig = signal<GridConfiguration>({
|
|
78
|
+
id: 'users',
|
|
79
|
+
title: 'User Management',
|
|
80
|
+
columns: [
|
|
81
|
+
{ key: 'name', header: 'Name', type: 'text', searchable: true },
|
|
82
|
+
{ key: 'email', header: 'Email', type: 'text', searchable: true },
|
|
83
|
+
{ key: 'isActive', header: 'Status', type: 'boolean' },
|
|
84
|
+
{
|
|
85
|
+
key: 'actions',
|
|
86
|
+
header: 'Actions',
|
|
87
|
+
type: 'actions',
|
|
88
|
+
actions: [
|
|
89
|
+
{ key: 'edit', label: 'Edit', variant: 'primary', onClick: 'editUser' }
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
data: [
|
|
94
|
+
{ id: 1, name: 'John Doe', email: 'john@example.com', isActive: true },
|
|
95
|
+
{ id: 2, name: 'Jane Smith', email: 'jane@example.com', isActive: false }
|
|
96
|
+
],
|
|
97
|
+
pagination: { enabled: true, pageSize: 10 },
|
|
98
|
+
search: { enabled: true, placeholder: 'Search users...' }
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 📚 Component Library
|
|
104
|
+
|
|
105
|
+
### 🎯 Basic UI Elements
|
|
106
|
+
|
|
107
|
+
| Component | Description | Features |
|
|
108
|
+
|-----------|-------------|----------|
|
|
109
|
+
| **Button** | Customizable button component | Multiple variants, sizes, loading states |
|
|
110
|
+
| **Input** | Form input with validation | Text, email, password, number types |
|
|
111
|
+
| **Select** | Dropdown select component | Single/multi-select, searchable options |
|
|
112
|
+
| **Textarea** | Multi-line text input | Auto-resize, character counting |
|
|
113
|
+
| **Tab** | Navigation tab component | Simple, compact design with variants |
|
|
114
|
+
| **Icon** | SVG icon component | Customizable size and color |
|
|
115
|
+
| **Spinner** | Loading indicator | Multiple sizes and variants |
|
|
116
|
+
|
|
117
|
+
### 🚀 Advanced Components
|
|
118
|
+
|
|
119
|
+
| Component | Description | Key Features |
|
|
120
|
+
|-----------|-------------|--------------|
|
|
121
|
+
| **Data Grid** | Enterprise-grade data table | Pagination, search, sorting, custom renderers, actions |
|
|
122
|
+
|
|
123
|
+
### 🔧 Utilities
|
|
124
|
+
|
|
125
|
+
| Directive | Description | Use Case |
|
|
126
|
+
|-----------|-------------|----------|
|
|
127
|
+
| **Tooltip** | Hover tooltip directive | Help text and information display |
|
|
128
|
+
| **Resizer** | Element resize directive | Draggable resize functionality |
|
|
129
|
+
|
|
130
|
+
## 📖 Documentation
|
|
131
|
+
|
|
132
|
+
### Component Documentation
|
|
133
|
+
|
|
134
|
+
- [Button Component](./src/lib/elements/button/README.md) - Buttons, links, and action triggers
|
|
135
|
+
- [Input Component](./src/lib/elements/input/README.md) - Form inputs with validation
|
|
136
|
+
- [Select Component](./src/lib/elements/select/README.md) - Dropdown selects and multi-selects
|
|
137
|
+
- [Textarea Component](./src/lib/elements/textarea/README.md) - Multi-line text areas
|
|
138
|
+
- [Tab Component](./src/lib/elements/tab/README.md) - Navigation tabs for content organization
|
|
139
|
+
- [Icon Component](./src/lib/elements/icon/README.md) - SVG icons and graphics
|
|
140
|
+
- [Spinner Component](./src/lib/elements/spinner/README.md) - Loading states and progress
|
|
141
|
+
|
|
142
|
+
### Advanced Components
|
|
143
|
+
|
|
144
|
+
- [**Data Grid Component**](./src/lib/components/data-grid/README.md) - Complete data table solution with advanced features
|
|
145
|
+
|
|
146
|
+
### Directives
|
|
147
|
+
|
|
148
|
+
- [Tooltip Directive](./src/lib/utils/directives/tooltip/README.md) - Hover tooltips and help text
|
|
149
|
+
- [Resizer Directive](./src/lib/utils/directives/resizer/README.md) - Draggable element resizing
|
|
150
|
+
|
|
151
|
+
## 🎨 Styling & Theming
|
|
152
|
+
|
|
153
|
+
This library uses Tailwind CSS for styling. Import the theme variables:
|
|
154
|
+
|
|
155
|
+
```scss
|
|
156
|
+
@import 'cloud-ide-element/style';
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Custom Theme Variables
|
|
160
|
+
|
|
161
|
+
```scss
|
|
162
|
+
// Override default theme variables
|
|
163
|
+
:root {
|
|
164
|
+
--cide-primary-color: #3b82f6;
|
|
165
|
+
--cide-secondary-color: #6b7280;
|
|
166
|
+
--cide-border-radius: 6px;
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 🔧 Configuration
|
|
171
|
+
|
|
172
|
+
### Angular.json Setup
|
|
173
|
+
|
|
174
|
+
Add to your `angular.json` styles array:
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"styles": [
|
|
179
|
+
"node_modules/cloud-ide-element/lib/assets/css/cide-ele-style.scss"
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Module Setup (Optional)
|
|
185
|
+
|
|
186
|
+
For non-standalone usage:
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
import { NgModule } from '@angular/core';
|
|
190
|
+
import {
|
|
191
|
+
CideEleButtonComponent,
|
|
192
|
+
CideEleInputComponent,
|
|
193
|
+
CideEleDataGridComponent
|
|
194
|
+
} from 'cloud-ide-element';
|
|
195
|
+
|
|
196
|
+
@NgModule({
|
|
197
|
+
imports: [
|
|
198
|
+
CideEleButtonComponent,
|
|
199
|
+
CideEleInputComponent,
|
|
200
|
+
CideEleDataGridComponent
|
|
201
|
+
],
|
|
202
|
+
exports: [
|
|
203
|
+
CideEleButtonComponent,
|
|
204
|
+
CideEleInputComponent,
|
|
205
|
+
CideEleDataGridComponent
|
|
206
|
+
]
|
|
207
|
+
})
|
|
208
|
+
export class CloudIdeElementModule { }
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## 🌟 Key Highlights
|
|
212
|
+
|
|
213
|
+
### Data Grid Features
|
|
214
|
+
- **📊 Rich Data Display** - Tables with sorting, filtering, and pagination
|
|
215
|
+
- **🔍 Advanced Search** - Multi-column search with debouncing
|
|
216
|
+
- **⚡ Performance** - Virtual scrolling for large datasets
|
|
217
|
+
- **🎨 Custom Rendering** - Custom cell renderers and formatters
|
|
218
|
+
- **📱 Responsive** - Mobile-optimized layouts
|
|
219
|
+
- **🔧 Action Buttons** - Configurable row actions with conditions
|
|
220
|
+
|
|
221
|
+
### Form Components
|
|
222
|
+
- **✅ Validation** - Built-in form validation support
|
|
223
|
+
- **♿ Accessibility** - WCAG 2.1 AA compliant
|
|
224
|
+
- **🎯 Consistent** - Unified design language across all components
|
|
225
|
+
- **🔧 Flexible** - Extensive customization options
|
|
226
|
+
|
|
227
|
+
## 🤝 Contributing
|
|
228
|
+
|
|
229
|
+
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
|
|
230
|
+
|
|
231
|
+
### Development Setup
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# Clone the repository
|
|
235
|
+
git clone https://github.com/your-org/cloud-ide-element.git
|
|
236
|
+
|
|
237
|
+
# Install dependencies
|
|
238
|
+
npm install
|
|
239
|
+
|
|
240
|
+
# Start development server
|
|
241
|
+
ng serve
|
|
242
|
+
|
|
243
|
+
# Build the library
|
|
244
|
+
ng build cloud-ide-element
|
|
245
|
+
|
|
246
|
+
# Run tests
|
|
247
|
+
ng test cloud-ide-element
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## 📄 License
|
|
251
|
+
|
|
252
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
253
|
+
|
|
254
|
+
## 🚀 Roadmap
|
|
255
|
+
|
|
256
|
+
- [ ] Tree Table Component
|
|
257
|
+
- [ ] Calendar/Date Picker
|
|
258
|
+
- [ ] File Upload Component
|
|
259
|
+
- [ ] Chart Components
|
|
260
|
+
- [ ] Rich Text Editor
|
|
261
|
+
- [ ] Dashboard Widgets
|
|
262
|
+
|
|
263
|
+
## 💬 Support
|
|
264
|
+
|
|
265
|
+
- 📧 Email: support@cide-lms.com
|
|
266
|
+
- 🐛 Issues: [GitHub Issues](https://github.com/your-org/cloud-ide-element/issues)
|
|
267
|
+
- 📖 Documentation: [Full Documentation](https://docs.cide-lms.com)
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
Made with ❤️ by the CIDE-LMS Team
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { Component, signal, computed, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { CideIconComponent } from '../../elements/icon/icon.component';
|
|
4
|
+
import { ConfirmationService } from '../../services/confirmation.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
export class CideEleConfirmationModalComponent {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.confirmationService = inject(ConfirmationService);
|
|
10
|
+
// Signals
|
|
11
|
+
this.hasActiveConfirmation = this.confirmationService.hasActiveConfirmation;
|
|
12
|
+
this.currentRequest = this.confirmationService.getCurrentRequest();
|
|
13
|
+
this.customData = signal(null);
|
|
14
|
+
// Computed
|
|
15
|
+
this.getHeaderClass = computed(() => {
|
|
16
|
+
const request = this.currentRequest();
|
|
17
|
+
return request ? `header-${request.type}` : '';
|
|
18
|
+
});
|
|
19
|
+
this.getIconClass = computed(() => {
|
|
20
|
+
const request = this.currentRequest();
|
|
21
|
+
return request ? request.type : 'info';
|
|
22
|
+
});
|
|
23
|
+
this.getConfirmButtonClass = computed(() => {
|
|
24
|
+
const request = this.currentRequest();
|
|
25
|
+
if (!request)
|
|
26
|
+
return 'btn-primary';
|
|
27
|
+
const classMap = {
|
|
28
|
+
danger: 'btn-danger',
|
|
29
|
+
warning: 'btn-warning',
|
|
30
|
+
info: 'btn-primary',
|
|
31
|
+
success: 'btn-success'
|
|
32
|
+
};
|
|
33
|
+
return classMap[request.type] || 'btn-primary';
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
onBackdropClick(event) {
|
|
37
|
+
// Only close if clicking the backdrop itself, not its children
|
|
38
|
+
if (event.target === event.currentTarget) {
|
|
39
|
+
this.onCancel();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
onCancel() {
|
|
43
|
+
this.confirmationService.cancelCurrentRequest();
|
|
44
|
+
}
|
|
45
|
+
onConfirm() {
|
|
46
|
+
// If there's custom data, pass it to the confirmation
|
|
47
|
+
const data = this.customData();
|
|
48
|
+
this.confirmationService.confirmCurrentRequest(data);
|
|
49
|
+
this.customData.set(null); // Reset custom data
|
|
50
|
+
}
|
|
51
|
+
// Method to update custom data (called by custom templates)
|
|
52
|
+
updateCustomData(data) {
|
|
53
|
+
this.customData.set(data);
|
|
54
|
+
}
|
|
55
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleConfirmationModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
56
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: CideEleConfirmationModalComponent, isStandalone: true, selector: "cide-ele-confirmation-modal", ngImport: i0, template: `
|
|
57
|
+
<!-- Backdrop -->
|
|
58
|
+
<div
|
|
59
|
+
*ngIf="hasActiveConfirmation()"
|
|
60
|
+
class="confirmation-backdrop"
|
|
61
|
+
(click)="onBackdropClick($event)"
|
|
62
|
+
[@backdropAnimation]>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<!-- Modal -->
|
|
66
|
+
<div
|
|
67
|
+
*ngIf="hasActiveConfirmation()"
|
|
68
|
+
class="confirmation-modal"
|
|
69
|
+
[@modalAnimation]>
|
|
70
|
+
|
|
71
|
+
<!-- Modal Header -->
|
|
72
|
+
<div class="modal-header" [class]="getHeaderClass()">
|
|
73
|
+
<div class="header-content">
|
|
74
|
+
<div class="icon-container" [class]="getIconClass()">
|
|
75
|
+
<cide-ele-icon
|
|
76
|
+
size="lg">
|
|
77
|
+
{{ currentRequest()?.icon || 'info' }}
|
|
78
|
+
</cide-ele-icon>
|
|
79
|
+
</div>
|
|
80
|
+
<h2 class="modal-title">{{ currentRequest()?.title }}</h2>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<!-- Modal Body -->
|
|
85
|
+
<div class="modal-body">
|
|
86
|
+
<p class="modal-message">{{ currentRequest()?.message }}</p>
|
|
87
|
+
|
|
88
|
+
<!-- Custom Template Slot -->
|
|
89
|
+
<div *ngIf="currentRequest()?.customTemplate" class="custom-content">
|
|
90
|
+
<ng-container
|
|
91
|
+
*ngTemplateOutlet="currentRequest()?.customTemplate!; context: { $implicit: customData }">
|
|
92
|
+
</ng-container>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<!-- Modal Footer -->
|
|
97
|
+
<div class="modal-footer">
|
|
98
|
+
<button
|
|
99
|
+
type="button"
|
|
100
|
+
class="btn btn-secondary"
|
|
101
|
+
(click)="onCancel()">
|
|
102
|
+
{{ currentRequest()?.cancelText || 'Cancel' }}
|
|
103
|
+
</button>
|
|
104
|
+
|
|
105
|
+
<button
|
|
106
|
+
type="button"
|
|
107
|
+
class="btn"
|
|
108
|
+
[class]="getConfirmButtonClass()"
|
|
109
|
+
(click)="onConfirm()">
|
|
110
|
+
{{ currentRequest()?.confirmText || 'Confirm' }}
|
|
111
|
+
</button>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
`, isInline: true, styles: [".confirmation-backdrop{position:fixed;inset:0;background-color:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10000;display:flex;align-items:center;justify-content:center}.confirmation-modal{background:#fff;border-radius:12px;box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a;max-width:480px;width:90%;max-height:90vh;overflow:hidden;z-index:10001;position:relative}.modal-header{padding:24px 24px 16px;border-bottom:1px solid #e5e7eb}.header-content{display:flex;align-items:center;gap:16px}.icon-container{width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.icon-container.danger{background-color:#fef2f2;color:#dc2626}.icon-container.warning{background-color:#fffbeb;color:#d97706}.icon-container.info{background-color:#eff6ff;color:#2563eb}.icon-container.success{background-color:#f0fdf4;color:#16a34a}.modal-title{margin:0;font-size:20px;font-weight:600;color:#111827;line-height:1.4}.modal-body{padding:16px 24px 24px}.modal-message{margin:0 0 16px;font-size:16px;line-height:1.5;color:#6b7280}.custom-content{margin-top:16px;padding-top:16px;border-top:1px solid #f3f4f6}.modal-footer{padding:16px 24px 24px;display:flex;gap:12px;justify-content:flex-end;border-top:1px solid #e5e7eb}.btn{padding:10px 20px;border-radius:8px;font-size:14px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;min-width:80px}.btn:hover{transform:translateY(-1px)}.btn:active{transform:translateY(0)}.btn-secondary{background-color:#f9fafb;color:#374151;border:1px solid #d1d5db}.btn-secondary:hover{background-color:#f3f4f6;border-color:#9ca3af}.btn-primary{background-color:#2563eb;color:#fff}.btn-primary:hover{background-color:#1d4ed8}.btn-danger{background-color:#dc2626;color:#fff}.btn-danger:hover{background-color:#b91c1c}.btn-warning{background-color:#d97706;color:#fff}.btn-warning:hover{background-color:#b45309}.btn-success{background-color:#16a34a;color:#fff}.btn-success:hover{background-color:#15803d}@media (max-width: 640px){.confirmation-modal{width:95%;margin:20px}.modal-header{padding:20px 20px 12px}.modal-body{padding:12px 20px 20px}.modal-footer{padding:12px 20px 20px;flex-direction:column-reverse}.btn{width:100%;justify-content:center}.header-content{flex-direction:column;text-align:center;gap:12px}.modal-title{font-size:18px}}.btn:focus{outline:2px solid #2563eb;outline-offset:2px}.modal-enter{opacity:0;transform:scale(.95) translateY(-10px)}.modal-enter-active{opacity:1;transform:scale(1) translateY(0);transition:all .2s ease-out}.modal-exit{opacity:1;transform:scale(1) translateY(0)}.modal-exit-active{opacity:0;transform:scale(.95) translateY(-10px);transition:all .15s ease-in}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }], animations: [
|
|
115
|
+
// Add animations here if needed
|
|
116
|
+
] }); }
|
|
117
|
+
}
|
|
118
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleConfirmationModalComponent, decorators: [{
|
|
119
|
+
type: Component,
|
|
120
|
+
args: [{ selector: 'cide-ele-confirmation-modal', standalone: true, imports: [CommonModule, CideIconComponent], template: `
|
|
121
|
+
<!-- Backdrop -->
|
|
122
|
+
<div
|
|
123
|
+
*ngIf="hasActiveConfirmation()"
|
|
124
|
+
class="confirmation-backdrop"
|
|
125
|
+
(click)="onBackdropClick($event)"
|
|
126
|
+
[@backdropAnimation]>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<!-- Modal -->
|
|
130
|
+
<div
|
|
131
|
+
*ngIf="hasActiveConfirmation()"
|
|
132
|
+
class="confirmation-modal"
|
|
133
|
+
[@modalAnimation]>
|
|
134
|
+
|
|
135
|
+
<!-- Modal Header -->
|
|
136
|
+
<div class="modal-header" [class]="getHeaderClass()">
|
|
137
|
+
<div class="header-content">
|
|
138
|
+
<div class="icon-container" [class]="getIconClass()">
|
|
139
|
+
<cide-ele-icon
|
|
140
|
+
size="lg">
|
|
141
|
+
{{ currentRequest()?.icon || 'info' }}
|
|
142
|
+
</cide-ele-icon>
|
|
143
|
+
</div>
|
|
144
|
+
<h2 class="modal-title">{{ currentRequest()?.title }}</h2>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<!-- Modal Body -->
|
|
149
|
+
<div class="modal-body">
|
|
150
|
+
<p class="modal-message">{{ currentRequest()?.message }}</p>
|
|
151
|
+
|
|
152
|
+
<!-- Custom Template Slot -->
|
|
153
|
+
<div *ngIf="currentRequest()?.customTemplate" class="custom-content">
|
|
154
|
+
<ng-container
|
|
155
|
+
*ngTemplateOutlet="currentRequest()?.customTemplate!; context: { $implicit: customData }">
|
|
156
|
+
</ng-container>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
|
|
160
|
+
<!-- Modal Footer -->
|
|
161
|
+
<div class="modal-footer">
|
|
162
|
+
<button
|
|
163
|
+
type="button"
|
|
164
|
+
class="btn btn-secondary"
|
|
165
|
+
(click)="onCancel()">
|
|
166
|
+
{{ currentRequest()?.cancelText || 'Cancel' }}
|
|
167
|
+
</button>
|
|
168
|
+
|
|
169
|
+
<button
|
|
170
|
+
type="button"
|
|
171
|
+
class="btn"
|
|
172
|
+
[class]="getConfirmButtonClass()"
|
|
173
|
+
(click)="onConfirm()">
|
|
174
|
+
{{ currentRequest()?.confirmText || 'Confirm' }}
|
|
175
|
+
</button>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
`, animations: [
|
|
179
|
+
// Add animations here if needed
|
|
180
|
+
], styles: [".confirmation-backdrop{position:fixed;inset:0;background-color:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10000;display:flex;align-items:center;justify-content:center}.confirmation-modal{background:#fff;border-radius:12px;box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a;max-width:480px;width:90%;max-height:90vh;overflow:hidden;z-index:10001;position:relative}.modal-header{padding:24px 24px 16px;border-bottom:1px solid #e5e7eb}.header-content{display:flex;align-items:center;gap:16px}.icon-container{width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.icon-container.danger{background-color:#fef2f2;color:#dc2626}.icon-container.warning{background-color:#fffbeb;color:#d97706}.icon-container.info{background-color:#eff6ff;color:#2563eb}.icon-container.success{background-color:#f0fdf4;color:#16a34a}.modal-title{margin:0;font-size:20px;font-weight:600;color:#111827;line-height:1.4}.modal-body{padding:16px 24px 24px}.modal-message{margin:0 0 16px;font-size:16px;line-height:1.5;color:#6b7280}.custom-content{margin-top:16px;padding-top:16px;border-top:1px solid #f3f4f6}.modal-footer{padding:16px 24px 24px;display:flex;gap:12px;justify-content:flex-end;border-top:1px solid #e5e7eb}.btn{padding:10px 20px;border-radius:8px;font-size:14px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;min-width:80px}.btn:hover{transform:translateY(-1px)}.btn:active{transform:translateY(0)}.btn-secondary{background-color:#f9fafb;color:#374151;border:1px solid #d1d5db}.btn-secondary:hover{background-color:#f3f4f6;border-color:#9ca3af}.btn-primary{background-color:#2563eb;color:#fff}.btn-primary:hover{background-color:#1d4ed8}.btn-danger{background-color:#dc2626;color:#fff}.btn-danger:hover{background-color:#b91c1c}.btn-warning{background-color:#d97706;color:#fff}.btn-warning:hover{background-color:#b45309}.btn-success{background-color:#16a34a;color:#fff}.btn-success:hover{background-color:#15803d}@media (max-width: 640px){.confirmation-modal{width:95%;margin:20px}.modal-header{padding:20px 20px 12px}.modal-body{padding:12px 20px 20px}.modal-footer{padding:12px 20px 20px;flex-direction:column-reverse}.btn{width:100%;justify-content:center}.header-content{flex-direction:column;text-align:center;gap:12px}.modal-title{font-size:18px}}.btn:focus{outline:2px solid #2563eb;outline-offset:2px}.modal-enter{opacity:0;transform:scale(.95) translateY(-10px)}.modal-enter-active{opacity:1;transform:scale(1) translateY(0);transition:all .2s ease-out}.modal-exit{opacity:1;transform:scale(1) translateY(0)}.modal-exit-active{opacity:0;transform:scale(.95) translateY(-10px);transition:all .15s ease-in}\n"] }]
|
|
181
|
+
}] });
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybWF0aW9uLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1lbGVtZW50L3NyYy9saWIvY29tcG9uZW50cy9jb25maXJtYXRpb24tbW9kYWwvY29uZmlybWF0aW9uLW1vZGFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7O0FBNlMxRSxNQUFNLE9BQU8saUNBQWlDO0lBM1M5QztRQTRTVSx3QkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUUxRCxVQUFVO1FBQ1YsMEJBQXFCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDO1FBQ3ZFLG1CQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDOUQsZUFBVSxHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUVuQyxXQUFXO1FBQ1gsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztRQUVILGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztRQUVILDBCQUFxQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU8sYUFBYSxDQUFDO1lBRW5DLE1BQU0sUUFBUSxHQUFHO2dCQUNmLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixPQUFPLEVBQUUsYUFBYTtnQkFDdEIsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLE9BQU8sRUFBRSxhQUFhO2FBQ3ZCLENBQUM7WUFFRixPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0tBd0JKO0lBdEJDLGVBQWUsQ0FBQyxLQUFZO1FBQzFCLCtEQUErRDtRQUMvRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsU0FBUztRQUNQLHNEQUFzRDtRQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CO0lBQ2pELENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsZ0JBQWdCLENBQUMsSUFBYTtRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDOzhHQXREVSxpQ0FBaUM7a0dBQWpDLGlDQUFpQyx1RkF2U2xDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERULGd2RkEzRFMsWUFBWSwwU0FBRSxpQkFBaUIsaUZBb1M3QjtRQUNWLGdDQUFnQztTQUNqQzs7MkZBRVUsaUNBQWlDO2tCQTNTN0MsU0FBUzsrQkFDRSw2QkFBNkIsY0FDM0IsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLFlBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERULGNBeU9XO29CQUNWLGdDQUFnQztxQkFDakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIHNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDaWRlSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2ljb24vaWNvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlybWF0aW9uLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjaWRlLWVsZS1jb25maXJtYXRpb24tbW9kYWwnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ2lkZUljb25Db21wb25lbnRdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8IS0tIEJhY2tkcm9wIC0tPlxyXG4gICAgPGRpdiBcclxuICAgICAgKm5nSWY9XCJoYXNBY3RpdmVDb25maXJtYXRpb24oKVwiXHJcbiAgICAgIGNsYXNzPVwiY29uZmlybWF0aW9uLWJhY2tkcm9wXCJcclxuICAgICAgKGNsaWNrKT1cIm9uQmFja2Ryb3BDbGljaygkZXZlbnQpXCJcclxuICAgICAgW0BiYWNrZHJvcEFuaW1hdGlvbl0+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIE1vZGFsIC0tPlxyXG4gICAgPGRpdiBcclxuICAgICAgKm5nSWY9XCJoYXNBY3RpdmVDb25maXJtYXRpb24oKVwiXHJcbiAgICAgIGNsYXNzPVwiY29uZmlybWF0aW9uLW1vZGFsXCJcclxuICAgICAgW0Btb2RhbEFuaW1hdGlvbl0+XHJcbiAgICAgIFxyXG4gICAgICA8IS0tIE1vZGFsIEhlYWRlciAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiIFtjbGFzc109XCJnZXRIZWFkZXJDbGFzcygpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1jb250ZW50XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIiBbY2xhc3NdPVwiZ2V0SWNvbkNsYXNzKClcIj5cclxuICAgICAgICAgICAgPGNpZGUtZWxlLWljb24gXHJcbiAgICAgICAgICAgICAgc2l6ZT1cImxnXCI+XHJcbiAgICAgICAgICAgICAge3sgY3VycmVudFJlcXVlc3QoKT8uaWNvbiB8fCAnaW5mbycgfX1cclxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pY29uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8aDIgY2xhc3M9XCJtb2RhbC10aXRsZVwiPnt7IGN1cnJlbnRSZXF1ZXN0KCk/LnRpdGxlIH19PC9oMj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIE1vZGFsIEJvZHkgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1tZXNzYWdlXCI+e3sgY3VycmVudFJlcXVlc3QoKT8ubWVzc2FnZSB9fTwvcD5cclxuICAgICAgICBcclxuICAgICAgICA8IS0tIEN1c3RvbSBUZW1wbGF0ZSBTbG90IC0tPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50UmVxdWVzdCgpPy5jdXN0b21UZW1wbGF0ZVwiIGNsYXNzPVwiY3VzdG9tLWNvbnRlbnRcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgXHJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VycmVudFJlcXVlc3QoKT8uY3VzdG9tVGVtcGxhdGUhOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogY3VzdG9tRGF0YSB9XCI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIE1vZGFsIEZvb3RlciAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5cclxuICAgICAgICAgIHt7IGN1cnJlbnRSZXF1ZXN0KCk/LmNhbmNlbFRleHQgfHwgJ0NhbmNlbCcgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICBcclxuICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0blwiXHJcbiAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29uZmlybUJ1dHRvbkNsYXNzKClcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ29uZmlybSgpXCI+XHJcbiAgICAgICAgICB7eyBjdXJyZW50UmVxdWVzdCgpPy5jb25maXJtVGV4dCB8fCAnQ29uZmlybScgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHN0eWxlczogW2BcclxuICAgIC5jb25maXJtYXRpb24tYmFja2Ryb3Age1xyXG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgbGVmdDogMDtcclxuICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIGJvdHRvbTogMDtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xyXG4gICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcclxuICAgICAgei1pbmRleDogMTAwMDA7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC5jb25maXJtYXRpb24tbW9kYWwge1xyXG4gICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcclxuICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDI1cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMTBweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjA0KTtcclxuICAgICAgbWF4LXdpZHRoOiA0ODBweDtcclxuICAgICAgd2lkdGg6IDkwJTtcclxuICAgICAgbWF4LWhlaWdodDogOTB2aDtcclxuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgICAgei1pbmRleDogMTAwMDE7XHJcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICAubW9kYWwtaGVhZGVyIHtcclxuICAgICAgcGFkZGluZzogMjRweCAyNHB4IDE2cHg7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlN2ViO1xyXG4gICAgfVxyXG5cclxuICAgIC5oZWFkZXItY29udGVudCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogMTZweDtcclxuICAgIH1cclxuXHJcbiAgICAuaWNvbi1jb250YWluZXIge1xyXG4gICAgICB3aWR0aDogNDhweDtcclxuICAgICAgaGVpZ2h0OiA0OHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBmbGV4LXNocmluazogMDtcclxuICAgIH1cclxuXHJcbiAgICAuaWNvbi1jb250YWluZXIuZGFuZ2VyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZjJmMjtcclxuICAgICAgY29sb3I6ICNkYzI2MjY7XHJcbiAgICB9XHJcblxyXG4gICAgLmljb24tY29udGFpbmVyLndhcm5pbmcge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmYmViO1xyXG4gICAgICBjb2xvcjogI2Q5NzcwNjtcclxuICAgIH1cclxuXHJcbiAgICAuaWNvbi1jb250YWluZXIuaW5mbyB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmY2ZmY7XHJcbiAgICAgIGNvbG9yOiAjMjU2M2ViO1xyXG4gICAgfVxyXG5cclxuICAgIC5pY29uLWNvbnRhaW5lci5zdWNjZXNzIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZmRmNDtcclxuICAgICAgY29sb3I6ICMxNmEzNGE7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vZGFsLXRpdGxlIHtcclxuICAgICAgbWFyZ2luOiAwO1xyXG4gICAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIGNvbG9yOiAjMTExODI3O1xyXG4gICAgICBsaW5lLWhlaWdodDogMS40O1xyXG4gICAgfVxyXG5cclxuICAgIC5tb2RhbC1ib2R5IHtcclxuICAgICAgcGFkZGluZzogMTZweCAyNHB4IDI0cHg7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vZGFsLW1lc3NhZ2Uge1xyXG4gICAgICBtYXJnaW46IDAgMCAxNnB4IDA7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgICAgbGluZS1oZWlnaHQ6IDEuNTtcclxuICAgICAgY29sb3I6ICM2YjcyODA7XHJcbiAgICB9XHJcblxyXG4gICAgLmN1c3RvbS1jb250ZW50IHtcclxuICAgICAgbWFyZ2luLXRvcDogMTZweDtcclxuICAgICAgcGFkZGluZy10b3A6IDE2cHg7XHJcbiAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjNmNGY2O1xyXG4gICAgfVxyXG5cclxuICAgIC5tb2RhbC1mb290ZXIge1xyXG4gICAgICBwYWRkaW5nOiAxNnB4IDI0cHggMjRweDtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xyXG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U1ZTdlYjtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuIHtcclxuICAgICAgcGFkZGluZzogMTBweCAyMHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XHJcbiAgICAgIG1pbi13aWR0aDogODBweDtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuOmhvdmVyIHtcclxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG46YWN0aXZlIHtcclxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tc2Vjb25kYXJ5IHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZmFmYjtcclxuICAgICAgY29sb3I6ICMzNzQxNTE7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMWQ1ZGI7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1zZWNvbmRhcnk6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNGY2O1xyXG4gICAgICBib3JkZXItY29sb3I6ICM5Y2EzYWY7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1wcmltYXJ5IHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzI1NjNlYjtcclxuICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tcHJpbWFyeTpob3ZlciB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxZDRlZDg7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1kYW5nZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGMyNjI2O1xyXG4gICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1kYW5nZXI6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYjkxYzFjO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4td2FybmluZyB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkOTc3MDY7XHJcbiAgICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLXdhcm5pbmc6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYjQ1MzA5O1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tc3VjY2VzcyB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxNmEzNGE7XHJcbiAgICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLXN1Y2Nlc3M6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTU4MDNkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFJlc3BvbnNpdmUgRGVzaWduICovXHJcbiAgICBAbWVkaWEgKG1heC13aWR0aDogNjQwcHgpIHtcclxuICAgICAgLmNvbmZpcm1hdGlvbi1tb2RhbCB7XHJcbiAgICAgICAgd2lkdGg6IDk1JTtcclxuICAgICAgICBtYXJnaW46IDIwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5tb2RhbC1oZWFkZXIge1xyXG4gICAgICAgIHBhZGRpbmc6IDIwcHggMjBweCAxMnB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAubW9kYWwtYm9keSB7XHJcbiAgICAgICAgcGFkZGluZzogMTJweCAyMHB4IDIwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5tb2RhbC1mb290ZXIge1xyXG4gICAgICAgIHBhZGRpbmc6IDEycHggMjBweCAyMHB4O1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmJ0biB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5oZWFkZXItY29udGVudCB7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAubW9kYWwtdGl0bGUge1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMThweDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qIEZvY3VzIHN0eWxlcyBmb3IgYWNjZXNzaWJpbGl0eSAqL1xyXG4gICAgLmJ0bjpmb2N1cyB7XHJcbiAgICAgIG91dGxpbmU6IDJweCBzb2xpZCAjMjU2M2ViO1xyXG4gICAgICBvdXRsaW5lLW9mZnNldDogMnB4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qIEFuaW1hdGlvbiBjbGFzc2VzICovXHJcbiAgICAubW9kYWwtZW50ZXIge1xyXG4gICAgICBvcGFjaXR5OiAwO1xyXG4gICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpIHRyYW5zbGF0ZVkoLTEwcHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb2RhbC1lbnRlci1hY3RpdmUge1xyXG4gICAgICBvcGFjaXR5OiAxO1xyXG4gICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZVkoMCk7XHJcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2Utb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIC5tb2RhbC1leGl0IHtcclxuICAgICAgb3BhY2l0eTogMTtcclxuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGVZKDApO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb2RhbC1leGl0LWFjdGl2ZSB7XHJcbiAgICAgIG9wYWNpdHk6IDA7XHJcbiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSkgdHJhbnNsYXRlWSgtMTBweCk7XHJcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlLWluO1xyXG4gICAgfVxyXG4gIGBdLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIC8vIEFkZCBhbmltYXRpb25zIGhlcmUgaWYgbmVlZGVkXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2lkZUVsZUNvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50IHtcclxuICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2UgPSBpbmplY3QoQ29uZmlybWF0aW9uU2VydmljZSk7XHJcblxyXG4gIC8vIFNpZ25hbHNcclxuICBoYXNBY3RpdmVDb25maXJtYXRpb24gPSB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuaGFzQWN0aXZlQ29uZmlybWF0aW9uO1xyXG4gIGN1cnJlbnRSZXF1ZXN0ID0gdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRSZXF1ZXN0KCk7XHJcbiAgY3VzdG9tRGF0YSA9IHNpZ25hbDx1bmtub3duPihudWxsKTtcclxuXHJcbiAgLy8gQ29tcHV0ZWRcclxuICBnZXRIZWFkZXJDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmN1cnJlbnRSZXF1ZXN0KCk7XHJcbiAgICByZXR1cm4gcmVxdWVzdCA/IGBoZWFkZXItJHtyZXF1ZXN0LnR5cGV9YCA6ICcnO1xyXG4gIH0pO1xyXG5cclxuICBnZXRJY29uQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5jdXJyZW50UmVxdWVzdCgpO1xyXG4gICAgcmV0dXJuIHJlcXVlc3QgPyByZXF1ZXN0LnR5cGUgOiAnaW5mbyc7XHJcbiAgfSk7XHJcblxyXG4gIGdldENvbmZpcm1CdXR0b25DbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmN1cnJlbnRSZXF1ZXN0KCk7XHJcbiAgICBpZiAoIXJlcXVlc3QpIHJldHVybiAnYnRuLXByaW1hcnknO1xyXG4gICAgXHJcbiAgICBjb25zdCBjbGFzc01hcCA9IHtcclxuICAgICAgZGFuZ2VyOiAnYnRuLWRhbmdlcicsXHJcbiAgICAgIHdhcm5pbmc6ICdidG4td2FybmluZycsXHJcbiAgICAgIGluZm86ICdidG4tcHJpbWFyeScsXHJcbiAgICAgIHN1Y2Nlc3M6ICdidG4tc3VjY2VzcydcclxuICAgIH07XHJcbiAgICBcclxuICAgIHJldHVybiBjbGFzc01hcFtyZXF1ZXN0LnR5cGVdIHx8ICdidG4tcHJpbWFyeSc7XHJcbiAgfSk7XHJcblxyXG4gIG9uQmFja2Ryb3BDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIE9ubHkgY2xvc2UgaWYgY2xpY2tpbmcgdGhlIGJhY2tkcm9wIGl0c2VsZiwgbm90IGl0cyBjaGlsZHJlblxyXG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldCkge1xyXG4gICAgICB0aGlzLm9uQ2FuY2VsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jYW5jZWxDdXJyZW50UmVxdWVzdCgpO1xyXG4gIH1cclxuXHJcbiAgb25Db25maXJtKCk6IHZvaWQge1xyXG4gICAgLy8gSWYgdGhlcmUncyBjdXN0b20gZGF0YSwgcGFzcyBpdCB0byB0aGUgY29uZmlybWF0aW9uXHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jdXN0b21EYXRhKCk7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybUN1cnJlbnRSZXF1ZXN0KGRhdGEpO1xyXG4gICAgdGhpcy5jdXN0b21EYXRhLnNldChudWxsKTsgLy8gUmVzZXQgY3VzdG9tIGRhdGFcclxuICB9XHJcblxyXG4gIC8vIE1ldGhvZCB0byB1cGRhdGUgY3VzdG9tIGRhdGEgKGNhbGxlZCBieSBjdXN0b20gdGVtcGxhdGVzKVxyXG4gIHVwZGF0ZUN1c3RvbURhdGEoZGF0YTogdW5rbm93bik6IHZvaWQge1xyXG4gICAgdGhpcy5jdXN0b21EYXRhLnNldChkYXRhKTtcclxuICB9XHJcbn1cclxuIl19
|