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.
Files changed (50) hide show
  1. package/README.md +271 -24
  2. package/esm2022/lib/components/confirmation-modal/confirmation-modal.component.mjs +182 -0
  3. package/esm2022/lib/components/data-grid/data-grid.component.mjs +1363 -0
  4. package/esm2022/lib/components/data-grid/data-grid.types.mjs +37 -0
  5. package/esm2022/lib/components/dropdown/dropdown.component.mjs +396 -0
  6. package/esm2022/lib/components/global-notifications/global-notifications.component.mjs +30 -0
  7. package/esm2022/lib/components/json-editor/json-editor.component.mjs +521 -0
  8. package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +33 -0
  9. package/esm2022/lib/components/toast-notification/toast-notification.component.mjs +152 -0
  10. package/esm2022/lib/elements/button/cide-ele-button.component.mjs +249 -0
  11. package/esm2022/lib/elements/file-input/file-input.component.mjs +83 -0
  12. package/esm2022/lib/elements/icon/icon.component.mjs +5 -3
  13. package/esm2022/lib/elements/input/input.component.mjs +34 -20
  14. package/esm2022/lib/elements/select/select.component.mjs +471 -0
  15. package/esm2022/lib/elements/tab/cide-ele-tab.component.mjs +74 -0
  16. package/esm2022/lib/elements/textarea/textarea.component.mjs +157 -0
  17. package/esm2022/lib/services/confirmation.service.mjs +151 -0
  18. package/esm2022/lib/services/dropdown-manager.service.mjs +93 -0
  19. package/esm2022/lib/services/notification.service.mjs +196 -0
  20. package/esm2022/lib/utils/directives/resizer/resizer.directive.mjs +231 -0
  21. package/esm2022/lib/utils/directives/tooltip/tooltip.directive.mjs +294 -0
  22. package/esm2022/lib/utils/services/elements/elements.service.mjs +9 -7
  23. package/esm2022/public-api.mjs +23 -2
  24. package/fesm2022/cloud-ide-element.mjs +4646 -47
  25. package/fesm2022/cloud-ide-element.mjs.map +1 -1
  26. package/lib/components/confirmation-modal/confirmation-modal.component.d.ts +16 -0
  27. package/lib/components/data-grid/data-grid.component.d.ts +244 -0
  28. package/lib/components/data-grid/data-grid.types.d.ts +146 -0
  29. package/lib/components/dropdown/dropdown.component.d.ts +75 -0
  30. package/lib/components/global-notifications/global-notifications.component.d.ts +5 -0
  31. package/lib/components/json-editor/json-editor.component.d.ts +116 -0
  32. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +11 -0
  33. package/lib/components/toast-notification/toast-notification.component.d.ts +13 -0
  34. package/lib/elements/button/cide-ele-button.component.d.ts +85 -0
  35. package/lib/elements/file-input/file-input.component.d.ts +25 -0
  36. package/lib/elements/input/input.component.d.ts +7 -4
  37. package/lib/elements/select/select.component.d.ts +91 -0
  38. package/lib/elements/tab/cide-ele-tab.component.d.ts +26 -0
  39. package/lib/elements/textarea/textarea.component.d.ts +47 -0
  40. package/lib/services/confirmation.service.d.ts +65 -0
  41. package/lib/services/dropdown-manager.service.d.ts +22 -0
  42. package/lib/services/notification.service.d.ts +81 -0
  43. package/lib/utils/directives/resizer/resizer.directive.d.ts +44 -0
  44. package/lib/utils/directives/tooltip/tooltip.directive.d.ts +43 -0
  45. package/package.json +32 -4
  46. package/public-api.d.ts +18 -1
  47. package/src/lib/assets/css/cide-ele-style.scss +85 -0
  48. package/src/lib/assets/css/cide-ele-variable.scss +336 -0
  49. package/esm2022/lib/elements/button/button.component.mjs +0 -60
  50. package/lib/elements/button/button.component.d.ts +0 -27
package/README.md CHANGED
@@ -1,24 +1,271 @@
1
- # CloudIdeElement
2
-
3
- This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.0.0.
4
-
5
- ## Code scaffolding
6
-
7
- Run `ng generate component component-name --project cloud-ide-element` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project cloud-ide-element`.
8
- > Note: Don't forget to add `--project cloud-ide-element` or else it will be added to the default project in your `angular.json` file.
9
-
10
- ## Build
11
-
12
- Run `ng build cloud-ide-element` to build the project. The build artifacts will be stored in the `dist/` directory.
13
-
14
- ## Publishing
15
-
16
- After building your library with `ng build cloud-ide-element`, go to the dist folder `cd dist/cloud-ide-element` and run `npm publish`.
17
-
18
- ## Running unit tests
19
-
20
- Run `ng test cloud-ide-element` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
-
22
- ## Further help
23
-
24
- To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
1
+ # cloud-ide-element
2
+
3
+ [![npm version](https://badge.fury.io/js/cloud-ide-element.svg)](https://badge.fury.io/js/cloud-ide-element)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![Angular](https://img.shields.io/badge/Angular-18+-red.svg)](https://angular.io/)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](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