cax-design-system 2.6.1 → 2.7.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 (41) hide show
  1. package/README.md +1 -1
  2. package/commentbox/commentbox.d.ts +111 -0
  3. package/commentbox/commentbox.module.d.ts +17 -0
  4. package/commentbox/index.d.ts +5 -0
  5. package/commentbox/public_api.d.ts +2 -0
  6. package/esm2022/card/card.mjs +2 -2
  7. package/esm2022/commentbox/cax-design-system-commentbox.mjs +5 -0
  8. package/esm2022/commentbox/commentbox.mjs +541 -0
  9. package/esm2022/commentbox/commentbox.module.mjs +27 -0
  10. package/esm2022/commentbox/public_api.mjs +3 -0
  11. package/esm2022/inputtext/inputtext.component.mjs +13 -4
  12. package/esm2022/inputtextarea/inputtextarea.component.mjs +8 -4
  13. package/esm2022/table/components/column-filter/column-filter.mjs +2 -2
  14. package/esm2022/upload/cax-design-system-upload.mjs +5 -0
  15. package/esm2022/upload/public_api.mjs +3 -0
  16. package/esm2022/upload/upload.component.mjs +355 -0
  17. package/esm2022/upload/upload.component.module.mjs +21 -0
  18. package/fesm2022/cax-design-system-card.mjs +2 -2
  19. package/fesm2022/cax-design-system-card.mjs.map +1 -1
  20. package/fesm2022/cax-design-system-commentbox.mjs +572 -0
  21. package/fesm2022/cax-design-system-commentbox.mjs.map +1 -0
  22. package/fesm2022/cax-design-system-inputtext.mjs +12 -3
  23. package/fesm2022/cax-design-system-inputtext.mjs.map +1 -1
  24. package/fesm2022/cax-design-system-inputtextarea.mjs +7 -3
  25. package/fesm2022/cax-design-system-inputtextarea.mjs.map +1 -1
  26. package/fesm2022/cax-design-system-table.mjs +1 -1
  27. package/fesm2022/cax-design-system-table.mjs.map +1 -1
  28. package/fesm2022/cax-design-system-upload.mjs +380 -0
  29. package/fesm2022/cax-design-system-upload.mjs.map +1 -0
  30. package/inputtext/inputtext.component.d.ts +4 -1
  31. package/inputtextarea/inputtextarea.component.d.ts +2 -2
  32. package/package.json +156 -144
  33. package/resources/cax.min.scss +1 -1
  34. package/resources/cax.scss +83 -37
  35. package/resources/components/card/card.scss +1 -1
  36. package/resources/components/commentbox/commentbox.scss +604 -0
  37. package/resources/components/upload/upload.component.scss +147 -0
  38. package/upload/index.d.ts +5 -0
  39. package/upload/public_api.d.ts +2 -0
  40. package/upload/upload.component.d.ts +61 -0
  41. package/upload/upload.component.module.d.ts +11 -0
@@ -0,0 +1,355 @@
1
+ import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "cax-design-system/progressspinner";
5
+ import * as i3 from "cax-design-system/button";
6
+ export class UploadComponent {
7
+ invalid = false;
8
+ style;
9
+ maxFileSize = 30;
10
+ inputFiles = 'Input Files';
11
+ uploadString = 'uploading the file';
12
+ errorText = 'Please upload a file';
13
+ allowMultiple = true;
14
+ // Enhanced event emitters
15
+ fileSelected = new EventEmitter();
16
+ filesQueued = new EventEmitter(); // Emit when files are queued for upload
17
+ uploadStarted = new EventEmitter();
18
+ uploadCompleted = new EventEmitter();
19
+ uploadCanceled = new EventEmitter(); // When user cancels an upload
20
+ uploadError = new EventEmitter(); // When upload fails
21
+ fileRemoved = new EventEmitter(); // When a file is removed from the list
22
+ allFilesRemoved = new EventEmitter(); // When all files are cleared
23
+ uploadStatusChange = new EventEmitter(); // Status changes
24
+ isDragging = false;
25
+ uploadedFiles = [];
26
+ uploadStatus = 'idle';
27
+ isProcessingQueue = false;
28
+ // Track actual files to process (excludes canceled ones)
29
+ get activeFilesCount() {
30
+ return this.uploadedFiles.filter((file) => file.status !== 'canceled').length;
31
+ }
32
+ onDragOver(event) {
33
+ event.preventDefault();
34
+ event.stopPropagation();
35
+ this.isDragging = true;
36
+ }
37
+ onDragLeave(event) {
38
+ event.preventDefault();
39
+ event.stopPropagation();
40
+ this.isDragging = false;
41
+ }
42
+ onDrop(event) {
43
+ event.preventDefault();
44
+ event.stopPropagation();
45
+ this.isDragging = false;
46
+ const files = event.dataTransfer?.files;
47
+ if (!files || files.length === 0)
48
+ return;
49
+ const fileArray = Array.from(files);
50
+ const validFiles = fileArray.filter((file) => {
51
+ if (file.size > this.maxFileSize * 1024 * 1024) {
52
+ this.emitError(file, `File size should be less than ${this.maxFileSize}MB`);
53
+ return false;
54
+ }
55
+ return true;
56
+ });
57
+ // Queue all files for upload
58
+ validFiles.forEach((file) => this.queueFile(file));
59
+ // Emit the queued files event
60
+ if (validFiles.length > 0) {
61
+ this.filesQueued.emit(validFiles);
62
+ }
63
+ // Start processing the queue if not already processing
64
+ if (!this.isProcessingQueue) {
65
+ this.processQueue();
66
+ }
67
+ }
68
+ handleFileInput(event) {
69
+ const files = event.target.files;
70
+ if (!files)
71
+ return;
72
+ const fileArray = Array.from(files);
73
+ const validFiles = fileArray.filter((file) => {
74
+ if (file.size > this.maxFileSize * 1024 * 1024) {
75
+ this.emitError(file, `File size should be less than ${this.maxFileSize}MB`);
76
+ return false;
77
+ }
78
+ return true;
79
+ });
80
+ // Queue all files for upload
81
+ validFiles.forEach((file) => this.queueFile(file));
82
+ // Emit the queued files event
83
+ if (validFiles.length > 0) {
84
+ this.filesQueued.emit(validFiles);
85
+ }
86
+ // Start processing the queue if not already processing
87
+ if (!this.isProcessingQueue) {
88
+ this.processQueue();
89
+ }
90
+ }
91
+ // Queue a file for upload
92
+ queueFile(file) {
93
+ const uploadEntry = {
94
+ file,
95
+ status: 'queued',
96
+ progress: 0
97
+ };
98
+ this.uploadedFiles.push(uploadEntry);
99
+ if (this.uploadStatus === 'idle') {
100
+ this.updateUploadStatus('uploading');
101
+ }
102
+ }
103
+ // Update upload status and emit event
104
+ updateUploadStatus(status) {
105
+ if (this.uploadStatus !== status) {
106
+ this.uploadStatus = status;
107
+ this.uploadStatusChange.emit(status);
108
+ }
109
+ }
110
+ // Process the queue of files sequentially
111
+ async processQueue() {
112
+ if (this.isProcessingQueue)
113
+ return;
114
+ this.isProcessingQueue = true;
115
+ // Find the next file to upload
116
+ let nextFileIndex = this.uploadedFiles.findIndex((file) => file.status === 'queued');
117
+ while (nextFileIndex !== -1) {
118
+ const currentFile = this.uploadedFiles[nextFileIndex];
119
+ await this.processFile(currentFile, nextFileIndex);
120
+ // Find the next file after processing
121
+ nextFileIndex = this.uploadedFiles.findIndex((file) => file.status === 'queued');
122
+ }
123
+ this.isProcessingQueue = false;
124
+ // Check if all uploads are complete and there are no more files to process
125
+ if (this.uploadedFiles.length > 0 && this.uploadedFiles.some((file) => file.status === 'complete') && !this.hasQueuedOrUploading) {
126
+ this.updateUploadStatus('complete');
127
+ }
128
+ }
129
+ // Trigger file input click programmatically
130
+ openFileSelector() {
131
+ const fileInput = document.getElementById('fileInput');
132
+ if (fileInput) {
133
+ fileInput.click();
134
+ }
135
+ }
136
+ // Emit error event
137
+ emitError(file, message) {
138
+ this.uploadError.emit({ file, error: message });
139
+ }
140
+ async processFile(fileEntry, index) {
141
+ // Update status to uploading
142
+ fileEntry.status = 'uploading';
143
+ fileEntry.progress = 0;
144
+ this.fileSelected.emit(fileEntry.file);
145
+ this.uploadStarted.emit(fileEntry.file);
146
+ try {
147
+ // Simulate upload with progress updates
148
+ for (let progress = 0; progress <= 100; progress += 10) {
149
+ // Check if upload was canceled during progress
150
+ // Need to check current status since it might have changed
151
+ if (fileEntry.status !== 'uploading') {
152
+ // Either canceled or errored
153
+ break;
154
+ }
155
+ fileEntry.progress = progress;
156
+ //this.uploadProgress.emit({ file: fileEntry.file, progress });
157
+ // Simulate network delay
158
+ await new Promise((resolve) => setTimeout(resolve, 200));
159
+ }
160
+ // Only set to complete if still uploading (not canceled or errored)
161
+ if (fileEntry.status === 'uploading') {
162
+ fileEntry.status = 'complete';
163
+ fileEntry.progress = 100;
164
+ this.uploadCompleted.emit(fileEntry.file);
165
+ }
166
+ }
167
+ catch (error) {
168
+ // Handle errors
169
+ fileEntry.status = 'error';
170
+ const errorMessage = error instanceof Error ? error.message : 'Unknown upload error';
171
+ fileEntry.errorMessage = errorMessage;
172
+ this.emitError(fileEntry.file, errorMessage);
173
+ }
174
+ }
175
+ cancelUpload(index) {
176
+ // Cancel the specified file and all files below it
177
+ for (let i = index; i < this.uploadedFiles.length; i++) {
178
+ const fileToCancel = this.uploadedFiles[i];
179
+ if (fileToCancel) {
180
+ const previousStatus = fileToCancel.status;
181
+ if (previousStatus === 'uploading' || previousStatus === 'queued') {
182
+ fileToCancel.status = 'canceled';
183
+ // Only emit if it was actively uploading (not just queued)
184
+ if (previousStatus === 'uploading') {
185
+ this.uploadCanceled.emit(fileToCancel.file);
186
+ }
187
+ }
188
+ }
189
+ }
190
+ // If the file at the specified index was uploading, process the next file in queue
191
+ // (which would now be a file before the index that might be queued)
192
+ if (this.uploadedFiles[index]?.status === 'canceled') {
193
+ setTimeout(() => this.processQueue(), 0);
194
+ }
195
+ }
196
+ // Cancel the current upload
197
+ cancelCurrentUpload() {
198
+ // Find the file that's currently uploading
199
+ const currentUploadIndex = this.uploadedFiles.findIndex((file) => file.status === 'uploading');
200
+ if (currentUploadIndex >= 0) {
201
+ this.cancelUpload(currentUploadIndex);
202
+ }
203
+ }
204
+ // Cancel all uploads
205
+ cancelAllUploads() {
206
+ let hadActiveUploads = false;
207
+ this.uploadedFiles.forEach((file) => {
208
+ if (file.status === 'uploading' || file.status === 'queued') {
209
+ hadActiveUploads = true;
210
+ const previousStatus = file.status;
211
+ file.status = 'canceled';
212
+ if (previousStatus === 'uploading') {
213
+ this.uploadCanceled.emit(file.file);
214
+ }
215
+ }
216
+ });
217
+ if (hadActiveUploads && !this.hasQueuedOrUploading) {
218
+ this.updateUploadStatus('idle');
219
+ }
220
+ }
221
+ // Remove a file from the list
222
+ removeFile(index) {
223
+ const fileToRemove = this.uploadedFiles[index];
224
+ // Cancel first if it's active
225
+ if (fileToRemove.status === 'uploading' || fileToRemove.status === 'queued') {
226
+ this.cancelUpload(index);
227
+ }
228
+ // Emit removal event
229
+ this.fileRemoved.emit(fileToRemove.file);
230
+ // Remove from array
231
+ this.uploadedFiles.splice(index, 1);
232
+ // Reset status if no files left
233
+ if (this.uploadedFiles.length === 0) {
234
+ this.updateUploadStatus('idle');
235
+ }
236
+ else if (!this.hasQueuedOrUploading && this.uploadStatus !== 'complete') {
237
+ // If there are no more queued or uploading files but we have completed files
238
+ this.updateUploadStatus('complete');
239
+ }
240
+ }
241
+ // Remove all files
242
+ removeAllFiles() {
243
+ // Cancel any active uploads
244
+ this.cancelAllUploads();
245
+ // Only emit if there were files to remove
246
+ if (this.uploadedFiles.length > 0) {
247
+ this.allFilesRemoved.emit();
248
+ }
249
+ this.uploadedFiles = [];
250
+ this.updateUploadStatus('idle');
251
+ }
252
+ // Retry a failed upload
253
+ retryUpload(index) {
254
+ const fileToRetry = this.uploadedFiles[index];
255
+ if (fileToRetry) {
256
+ const currentStatus = fileToRetry.status;
257
+ if (currentStatus === 'error' || currentStatus === 'canceled') {
258
+ fileToRetry.status = 'queued';
259
+ fileToRetry.errorMessage = undefined;
260
+ // Start processing if not already doing so
261
+ if (!this.isProcessingQueue) {
262
+ this.processQueue();
263
+ }
264
+ }
265
+ }
266
+ }
267
+ get hasUploading() {
268
+ return this.uploadedFiles.some((file) => file.status === 'uploading');
269
+ }
270
+ get hasQueuedOrUploading() {
271
+ return this.uploadedFiles.some((file) => file.status === 'uploading' || file.status === 'queued');
272
+ }
273
+ get hasErrors() {
274
+ return this.uploadedFiles.some((file) => file.status === 'error');
275
+ }
276
+ get allUploadsComplete() {
277
+ return this.uploadedFiles.length > 0 && this.uploadedFiles.some((file) => file.status === 'complete') && !this.hasQueuedOrUploading;
278
+ }
279
+ get uploadingProgressText() {
280
+ // Count active files (excluding canceled ones)
281
+ const totalActiveFiles = this.activeFilesCount;
282
+ const completedCount = this.uploadedFiles.filter((file) => file.status === 'complete').length;
283
+ const uploadingFile = this.uploadedFiles.find((file) => file.status === 'uploading');
284
+ if (uploadingFile) {
285
+ // We're currently uploading the (completedCount + 1)th active file
286
+ return `Uploading ${completedCount}/${totalActiveFiles} file${totalActiveFiles > 1 ? 's' : ''}...`;
287
+ }
288
+ if (this.uploadedFiles.some((file) => file.status === 'queued')) {
289
+ return `Uploading ${completedCount + 1}/${totalActiveFiles} file${totalActiveFiles > 1 ? 's' : ''}...`;
290
+ }
291
+ return `Uploading ${completedCount}/${totalActiveFiles} file${totalActiveFiles > 1 ? 's' : ''}...`;
292
+ }
293
+ // Calculate overall progress percentage across all files
294
+ get overallProgress() {
295
+ if (this.uploadedFiles.length === 0)
296
+ return 0;
297
+ const totalProgress = this.uploadedFiles.reduce((sum, file) => {
298
+ if (file.status === 'complete')
299
+ return sum + 100;
300
+ if (file.status === 'canceled' || file.status === 'error')
301
+ return sum;
302
+ return sum + (file.progress || 0);
303
+ }, 0);
304
+ const activeFilesCount = this.uploadedFiles.filter((file) => file.status !== 'canceled' && file.status !== 'error').length;
305
+ return activeFilesCount > 0 ? Math.round((totalProgress / (activeFilesCount * 100)) * 100) : 0;
306
+ }
307
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
308
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: UploadComponent, selector: "cax-upload", inputs: { invalid: "invalid", style: "style", maxFileSize: "maxFileSize", inputFiles: "inputFiles", uploadString: "uploadString", errorText: "errorText", allowMultiple: "allowMultiple" }, outputs: { fileSelected: "fileSelected", filesQueued: "filesQueued", uploadStarted: "uploadStarted", uploadCompleted: "uploadCompleted", uploadCanceled: "uploadCanceled", uploadError: "uploadError", fileRemoved: "fileRemoved", allFilesRemoved: "allFilesRemoved", uploadStatusChange: "uploadStatusChange" }, host: { listeners: { "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" } }, ngImport: i0, template: "<p class=\"cax-files\">{{inputFiles}}</p>\r\n<div class=\"cax-upload-menu\" [ngStyle]=\"style\"\r\n [class.dragging]=\"isDragging\" \r\n (click)=\"openFileSelector()\">\r\n <input\r\n id=\"fileInput\"\r\n type=\"file\"\r\n (change)=\"handleFileInput($event)\"\r\n hidden\r\n multiple\r\n >\r\n\r\n <!-- Default Upload State -->\r\n <ng-container *ngIf=\"uploadStatus === 'idle'\" >\r\n <div class=\"cax-upload-options\" >\r\n <p class=\"hint-text\">\r\n <span class=\"drop-files\">Drop files here</span> or browse files from your device\r\n </p>\r\n <p class=\"max-size\">Max. File Size: {{ maxFileSize }}MB</p>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <!-- Uploading State -->\r\n<div *ngIf=\"uploadStatus === 'uploading'\" class=\"cax-upload-status uploading\" >\r\n <div class=\"status-container\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'lg'\"\r\n [animationDuration]=\"'2s'\"\r\n ></cax-progressSpinner>\r\n <p >{{ uploadingProgressText }}</p>\r\n <cax-button\r\n [label]=\"'Cancel'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"cancelCurrentUpload(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n</div>\r\n\r\n <!-- Complete State -->\r\n <div *ngIf=\"uploadStatus === 'complete'\" class=\"cax-upload-status complete\">\r\n <div class=\"status-container\">\r\n <div class=\"success-icon\"><i class=\"cax cax-check\"></i></div>\r\n <p>{{uploadString}}</p>\r\n <cax-button\r\n [label]=\"'Remove'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"removeAllFiles(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n </div>\r\n <div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\"></div>\r\n</div>\r\n<div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\">\r\n {{ errorText }}\r\n</div>\r\n\r\n<!-- stacked file -->\r\n<div *ngIf=\"uploadedFiles.length > 0\" class=\"cax-file-preview-wrapper\" [ngStyle]=\"style\">\r\n <div\r\n *ngFor=\"let item of uploadedFiles; let i = index\"\r\n class=\"cax-file-preview\"\r\n [ngClass]=\"{\r\n 'queued': item.status === 'queued',\r\n 'uploading': item.status === 'uploading',\r\n 'complete': item.status === 'complete',\r\n 'canceled': item.status === 'canceled'\r\n }\"\r\n >\r\n <div class=\"file-info\">\r\n <p class=\"file-name\">{{ item.file.name }}</p>\r\n </div> \r\n\r\n <!-- Show spinner for queued or uploading files -->\r\n <div *ngIf=\"item.status === 'queued' || item.status === 'uploading'\" class=\"spinner\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'sm'\"\r\n [animationDuration]=\"'2s'\">\r\n </cax-progressSpinner>\r\n </div>\r\n \r\n <!-- Show remove button only for complete or canceled files -->\r\n <button\r\n *ngIf=\"item.status === 'complete' || item.status === 'canceled'\"\r\n class=\"remove-button\"\r\n (click)=\"removeFile(i); $event.stopPropagation()\">\r\n <i class=\"cax cax-close\"></i> \r\n </button>\r\n </div>\r\n</div>", styles: ["@layer cax{.cax-files{font-size:14px;font-weight:500;margin-bottom:10px}.cax-upload-menu{width:569px;border-radius:12px;padding:24px 56px}.status-container{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:16px;height:150px}.status-container p{margin:0;font-size:14px;font-weight:500}.status-container .success-icon{width:50px;height:50px;border-radius:50%;display:flex;align-items:center;justify-content:center}.status-container .success-icon i{font-size:1.5rem;font-weight:800}.cax-upload-options{text-align:center}.cax-upload-options .hint-text{font-size:14px;font-weight:500}.cax-upload-options .drop-files{font-weight:500;font-size:14px}.cax-upload-options .max-size{font-size:12px;margin-bottom:20px;font-weight:400}.cax-error-upload{font-size:14px;font-weight:400;padding-top:8px}.cax-options-container{display:flex;gap:24px;justify-content:center}.cax-upload-option{display:flex;flex-direction:column;align-items:center;cursor:pointer}.cax-upload-option .icon-container{width:48px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.cax-upload-option span{font-size:14px;font-weight:600;padding-top:10px}.cax-file-preview-wrapper{display:flex;flex-direction:column;gap:10px;margin-top:1rem;width:569px}.cax-file-preview{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-radius:8px}.cax-file-preview .file-info{display:flex;align-items:center;gap:10px}.cax-file-preview .file-info .file-icon img{width:32px;height:32px}.cax-file-preview .file-info .file-name{font-weight:500;font-size:14px}.cax-file-preview .spinner{margin-left:auto;font-size:20px!important}.cax-file-preview .remove-button{background:none;border:none;margin-left:auto;cursor:pointer}.cax-file-preview .remove-button i{font-size:20px}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.ProgressSpinner, selector: "cax-progressSpinner", inputs: ["styleClass", "strokeColor", "backgroundStrokeColor", "size", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i3.Button, selector: "cax-button", inputs: ["type", "iconPos", "icon", "badge", "rightIcon", "leftIcon", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }] });
309
+ }
310
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UploadComponent, decorators: [{
311
+ type: Component,
312
+ args: [{ selector: 'cax-upload', template: "<p class=\"cax-files\">{{inputFiles}}</p>\r\n<div class=\"cax-upload-menu\" [ngStyle]=\"style\"\r\n [class.dragging]=\"isDragging\" \r\n (click)=\"openFileSelector()\">\r\n <input\r\n id=\"fileInput\"\r\n type=\"file\"\r\n (change)=\"handleFileInput($event)\"\r\n hidden\r\n multiple\r\n >\r\n\r\n <!-- Default Upload State -->\r\n <ng-container *ngIf=\"uploadStatus === 'idle'\" >\r\n <div class=\"cax-upload-options\" >\r\n <p class=\"hint-text\">\r\n <span class=\"drop-files\">Drop files here</span> or browse files from your device\r\n </p>\r\n <p class=\"max-size\">Max. File Size: {{ maxFileSize }}MB</p>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <!-- Uploading State -->\r\n<div *ngIf=\"uploadStatus === 'uploading'\" class=\"cax-upload-status uploading\" >\r\n <div class=\"status-container\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'lg'\"\r\n [animationDuration]=\"'2s'\"\r\n ></cax-progressSpinner>\r\n <p >{{ uploadingProgressText }}</p>\r\n <cax-button\r\n [label]=\"'Cancel'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"cancelCurrentUpload(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n</div>\r\n\r\n <!-- Complete State -->\r\n <div *ngIf=\"uploadStatus === 'complete'\" class=\"cax-upload-status complete\">\r\n <div class=\"status-container\">\r\n <div class=\"success-icon\"><i class=\"cax cax-check\"></i></div>\r\n <p>{{uploadString}}</p>\r\n <cax-button\r\n [label]=\"'Remove'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"removeAllFiles(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n </div>\r\n <div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\"></div>\r\n</div>\r\n<div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\">\r\n {{ errorText }}\r\n</div>\r\n\r\n<!-- stacked file -->\r\n<div *ngIf=\"uploadedFiles.length > 0\" class=\"cax-file-preview-wrapper\" [ngStyle]=\"style\">\r\n <div\r\n *ngFor=\"let item of uploadedFiles; let i = index\"\r\n class=\"cax-file-preview\"\r\n [ngClass]=\"{\r\n 'queued': item.status === 'queued',\r\n 'uploading': item.status === 'uploading',\r\n 'complete': item.status === 'complete',\r\n 'canceled': item.status === 'canceled'\r\n }\"\r\n >\r\n <div class=\"file-info\">\r\n <p class=\"file-name\">{{ item.file.name }}</p>\r\n </div> \r\n\r\n <!-- Show spinner for queued or uploading files -->\r\n <div *ngIf=\"item.status === 'queued' || item.status === 'uploading'\" class=\"spinner\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'sm'\"\r\n [animationDuration]=\"'2s'\">\r\n </cax-progressSpinner>\r\n </div>\r\n \r\n <!-- Show remove button only for complete or canceled files -->\r\n <button\r\n *ngIf=\"item.status === 'complete' || item.status === 'canceled'\"\r\n class=\"remove-button\"\r\n (click)=\"removeFile(i); $event.stopPropagation()\">\r\n <i class=\"cax cax-close\"></i> \r\n </button>\r\n </div>\r\n</div>", styles: ["@layer cax{.cax-files{font-size:14px;font-weight:500;margin-bottom:10px}.cax-upload-menu{width:569px;border-radius:12px;padding:24px 56px}.status-container{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:16px;height:150px}.status-container p{margin:0;font-size:14px;font-weight:500}.status-container .success-icon{width:50px;height:50px;border-radius:50%;display:flex;align-items:center;justify-content:center}.status-container .success-icon i{font-size:1.5rem;font-weight:800}.cax-upload-options{text-align:center}.cax-upload-options .hint-text{font-size:14px;font-weight:500}.cax-upload-options .drop-files{font-weight:500;font-size:14px}.cax-upload-options .max-size{font-size:12px;margin-bottom:20px;font-weight:400}.cax-error-upload{font-size:14px;font-weight:400;padding-top:8px}.cax-options-container{display:flex;gap:24px;justify-content:center}.cax-upload-option{display:flex;flex-direction:column;align-items:center;cursor:pointer}.cax-upload-option .icon-container{width:48px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.cax-upload-option span{font-size:14px;font-weight:600;padding-top:10px}.cax-file-preview-wrapper{display:flex;flex-direction:column;gap:10px;margin-top:1rem;width:569px}.cax-file-preview{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-radius:8px}.cax-file-preview .file-info{display:flex;align-items:center;gap:10px}.cax-file-preview .file-info .file-icon img{width:32px;height:32px}.cax-file-preview .file-info .file-name{font-weight:500;font-size:14px}.cax-file-preview .spinner{margin-left:auto;font-size:20px!important}.cax-file-preview .remove-button{background:none;border:none;margin-left:auto;cursor:pointer}.cax-file-preview .remove-button i{font-size:20px}}\n"] }]
313
+ }], propDecorators: { invalid: [{
314
+ type: Input
315
+ }], style: [{
316
+ type: Input
317
+ }], maxFileSize: [{
318
+ type: Input
319
+ }], inputFiles: [{
320
+ type: Input
321
+ }], uploadString: [{
322
+ type: Input
323
+ }], errorText: [{
324
+ type: Input
325
+ }], allowMultiple: [{
326
+ type: Input
327
+ }], fileSelected: [{
328
+ type: Output
329
+ }], filesQueued: [{
330
+ type: Output
331
+ }], uploadStarted: [{
332
+ type: Output
333
+ }], uploadCompleted: [{
334
+ type: Output
335
+ }], uploadCanceled: [{
336
+ type: Output
337
+ }], uploadError: [{
338
+ type: Output
339
+ }], fileRemoved: [{
340
+ type: Output
341
+ }], allFilesRemoved: [{
342
+ type: Output
343
+ }], uploadStatusChange: [{
344
+ type: Output
345
+ }], onDragOver: [{
346
+ type: HostListener,
347
+ args: ['dragover', ['$event']]
348
+ }], onDragLeave: [{
349
+ type: HostListener,
350
+ args: ['dragleave', ['$event']]
351
+ }], onDrop: [{
352
+ type: HostListener,
353
+ args: ['drop', ['$event']]
354
+ }] } });
355
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy91cGxvYWQvdXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy91cGxvYWQvdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQWdCckYsTUFBTSxPQUFPLGVBQWU7SUFDZixPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLEtBQUssQ0FBOEM7SUFDbkQsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixVQUFVLEdBQVcsYUFBYSxDQUFDO0lBQ25DLFlBQVksR0FBVyxvQkFBb0IsQ0FBQztJQUM1QyxTQUFTLEdBQVcsc0JBQXNCLENBQUM7SUFDM0MsYUFBYSxHQUFZLElBQUksQ0FBQztJQUV2QywwQkFBMEI7SUFDaEIsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDeEMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUMsQ0FBQyx3Q0FBd0M7SUFDbEYsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDekMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDM0MsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUMsQ0FBQyw4QkFBOEI7SUFDekUsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDLENBQUMsb0JBQW9CO0lBQ3JGLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDLENBQUMsdUNBQXVDO0lBQy9FLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDLENBQUMsNkJBQTZCO0lBQ3pFLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFxQyxDQUFDLENBQUMsaUJB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ZTsyRkFBZixlQUFlLDBwQkNoQjVCLDIwR0FtR007OzJGRG5GTyxlQUFlO2tCQUwzQixTQUFTOytCQUNJLFlBQVk7OEJBS2IsT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0ksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFhUCxVQUFVO3NCQURULFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFwQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFyQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBVcGxvYWRGaWxlU3RhdHVzID0gJ3F1ZXVlZCcgfCAndXBsb2FkaW5nJyB8ICdjb21wbGV0ZScgfCAnY2FuY2VsZWQnIHwgJ2Vycm9yJztcblxuZXhwb3J0IHR5cGUgVXBsb2FkRmlsZSA9IHtcbiAgICBmaWxlOiBGaWxlO1xuICAgIHN0YXR1czogVXBsb2FkRmlsZVN0YXR1cztcbiAgICBwcm9ncmVzcz86IG51bWJlcjtcbiAgICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NheC11cGxvYWQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3VwbG9hZC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHN0eWxlOiB7IFtrbGFzczogc3RyaW5nXTogYW55IH0gfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIEBJbnB1dCgpIG1heEZpbGVTaXplOiBudW1iZXIgPSAzMDtcbiAgICBASW5wdXQoKSBpbnB1dEZpbGVzOiBzdHJpbmcgPSAnSW5wdXQgRmlsZXMnO1xuICAgIEBJbnB1dCgpIHVwbG9hZFN0cmluZzogc3RyaW5nID0gJ3VwbG9hZGluZyB0aGUgZmlsZSc7XG4gICAgQElucHV0KCkgZXJyb3JUZXh0OiBzdHJpbmcgPSAnUGxlYXNlIHVwbG9hZCBhIGZpbGUnO1xuICAgIEBJbnB1dCgpIGFsbG93TXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLy8gRW5oYW5jZWQgZXZlbnQgZW1pdHRlcnNcbiAgICBAT3V0cHV0KCkgZmlsZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlPigpO1xuICAgIEBPdXRwdXQoKSBmaWxlc1F1ZXVlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpOyAvLyBFbWl0IHdoZW4gZmlsZXMgYXJlIHF1ZXVlZCBmb3IgdXBsb2FkXG4gICAgQE91dHB1dCgpIHVwbG9hZFN0YXJ0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7XG4gICAgQE91dHB1dCgpIHVwbG9hZENvbXBsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgICBAT3V0cHV0KCkgdXBsb2FkQ2FuY2VsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7IC8vIFdoZW4gdXNlciBjYW5jZWxzIGFuIHVwbG9hZFxuICAgIEBPdXRwdXQoKSB1cGxvYWRFcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBmaWxlOiBGaWxlOyBlcnJvcjogc3RyaW5nIH0+KCk7IC8vIFdoZW4gdXBsb2FkIGZhaWxzXG4gICAgQE91dHB1dCgpIGZpbGVSZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlPigpOyAvLyBXaGVuIGEgZmlsZSBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3RcbiAgICBAT3V0cHV0KCkgYWxsRmlsZXNSZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBXaGVuIGFsbCBmaWxlcyBhcmUgY2xlYXJlZFxuICAgIEBPdXRwdXQoKSB1cGxvYWRTdGF0dXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPCdpZGxlJyB8ICd1cGxvYWRpbmcnIHwgJ2NvbXBsZXRlJz4oKTsgLy8gU3RhdHVzIGNoYW5nZXNcblxuICAgIGlzRHJhZ2dpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRGaWxlW10gPSBbXTtcbiAgICB1cGxvYWRTdGF0dXM6ICdpZGxlJyB8ICd1cGxvYWRpbmcnIHwgJ2NvbXBsZXRlJyA9ICdpZGxlJztcbiAgICBpc1Byb2Nlc3NpbmdRdWV1ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gVHJhY2sgYWN0dWFsIGZpbGVzIHRvIHByb2Nlc3MgKGV4Y2x1ZGVzIGNhbmNlbGVkIG9uZXMpXG4gICAgcHJpdmF0ZSBnZXQgYWN0aXZlRmlsZXNDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRlZEZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5zdGF0dXMgIT09ICdjYW5jZWxlZCcpLmxlbmd0aDtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkcmFnb3ZlcicsIFsnJGV2ZW50J10pXG4gICAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIFsnJGV2ZW50J10pXG4gICAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXG4gICAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyPy5maWxlcztcbiAgICAgICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCBmaWxlQXJyYXkgPSBBcnJheS5mcm9tKGZpbGVzKTtcbiAgICAgICAgY29uc3QgdmFsaWRGaWxlcyA9IGZpbGVBcnJheS5maWx0ZXIoKGZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPiB0aGlzLm1heEZpbGVTaXplICogMTAyNCAqIDEwMjQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRFcnJvcihmaWxlLCBgRmlsZSBzaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gJHt0aGlzLm1heEZpbGVTaXplfU1CYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFF1ZXVlIGFsbCBmaWxlcyBmb3IgdXBsb2FkXG4gICAgICAgIHZhbGlkRmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4gdGhpcy5xdWV1ZUZpbGUoZmlsZSkpO1xuXG4gICAgICAgIC8vIEVtaXQgdGhlIHF1ZXVlZCBmaWxlcyBldmVudFxuICAgICAgICBpZiAodmFsaWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVzUXVldWVkLmVtaXQodmFsaWRGaWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZSBpZiBub3QgYWxyZWFkeSBwcm9jZXNzaW5nXG4gICAgICAgIGlmICghdGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUZpbGVJbnB1dChldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcbiAgICAgICAgaWYgKCFmaWxlcykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZpbGVBcnJheSA9IEFycmF5LmZyb20oZmlsZXMpO1xuICAgICAgICBjb25zdCB2YWxpZEZpbGVzID0gZmlsZUFycmF5LmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUgKiAxMDI0ICogMTAyNCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEVycm9yKGZpbGUsIGBGaWxlIHNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAke3RoaXMubWF4RmlsZVNpemV9TUJgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUXVldWUgYWxsIGZpbGVzIGZvciB1cGxvYWRcbiAgICAgICAgdmFsaWRGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB0aGlzLnF1ZXVlRmlsZShmaWxlKSk7XG5cbiAgICAgICAgLy8gRW1pdCB0aGUgcXVldWVkIGZpbGVzIGV2ZW50XG4gICAgICAgIGlmICh2YWxpZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZXNRdWV1ZWQuZW1pdCh2YWxpZEZpbGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IHByb2Nlc3NpbmcgdGhlIHF1ZXVlIGlmIG5vdCBhbHJlYWR5IHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKCF0aGlzLmlzUHJvY2Vzc2luZ1F1ZXVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUXVldWUgYSBmaWxlIGZvciB1cGxvYWRcbiAgICBwcml2YXRlIHF1ZXVlRmlsZShmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVwbG9hZEVudHJ5OiBVcGxvYWRGaWxlID0ge1xuICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgIHN0YXR1czogJ3F1ZXVlZCcsXG5cbiAgICAgICAgICAgIHByb2dyZXNzOiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzLnB1c2godXBsb2FkRW50cnkpO1xuXG4gICAgICAgIGlmICh0aGlzLnVwbG9hZFN0YXR1cyA9PT0gJ2lkbGUnKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVwbG9hZFN0YXR1cygndXBsb2FkaW5nJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdXBsb2FkIHN0YXR1cyBhbmQgZW1pdCBldmVudFxuICAgIHByaXZhdGUgdXBkYXRlVXBsb2FkU3RhdHVzKHN0YXR1czogJ2lkbGUnIHwgJ3VwbG9hZGluZycgfCAnY29tcGxldGUnKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZFN0YXR1cyAhPT0gc3RhdHVzKSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgICAgIHRoaXMudXBsb2FkU3RhdHVzQ2hhbmdlLmVtaXQoc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgdGhlIHF1ZXVlIG9mIGZpbGVzIHNlcXVlbnRpYWxseVxuICAgIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nUXVldWUgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIG5leHQgZmlsZSB0byB1cGxvYWRcbiAgICAgICAgbGV0IG5leHRGaWxlSW5kZXggPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmluZEluZGV4KChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpO1xuXG4gICAgICAgIHdoaWxlIChuZXh0RmlsZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEZpbGUgPSB0aGlzLnVwbG9hZGVkRmlsZXNbbmV4dEZpbGVJbmRleF07XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NGaWxlKGN1cnJlbnRGaWxlLCBuZXh0RmlsZUluZGV4KTtcblxuICAgICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBmaWxlIGFmdGVyIHByb2Nlc3NpbmdcbiAgICAgICAgICAgIG5leHRGaWxlSW5kZXggPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmluZEluZGV4KChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGFsbCB1cGxvYWRzIGFyZSBjb21wbGV0ZSBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgZmlsZXMgdG8gcHJvY2Vzc1xuICAgICAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aCA+IDAgJiYgdGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAnY29tcGxldGUnKSAmJiAhdGhpcy5oYXNRdWV1ZWRPclVwbG9hZGluZykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRTdGF0dXMoJ2NvbXBsZXRlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIGZpbGUgaW5wdXQgY2xpY2sgcHJvZ3JhbW1hdGljYWxseVxuICAgIG9wZW5GaWxlU2VsZWN0b3IoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlSW5wdXQnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBpZiAoZmlsZUlucHV0KSB7XG4gICAgICAgICAgICBmaWxlSW5wdXQuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICBwcml2YXRlIGVtaXRFcnJvcihmaWxlOiBGaWxlLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGxvYWRFcnJvci5lbWl0KHsgZmlsZSwgZXJyb3I6IG1lc3NhZ2UgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0ZpbGUoZmlsZUVudHJ5OiBVcGxvYWRGaWxlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFVwZGF0ZSBzdGF0dXMgdG8gdXBsb2FkaW5nXG4gICAgICAgIGZpbGVFbnRyeS5zdGF0dXMgPSAndXBsb2FkaW5nJztcbiAgICAgICAgZmlsZUVudHJ5LnByb2dyZXNzID0gMDtcblxuICAgICAgICB0aGlzLmZpbGVTZWxlY3RlZC5lbWl0KGZpbGVFbnRyeS5maWxlKTtcbiAgICAgICAgdGhpcy51cGxvYWRTdGFydGVkLmVtaXQoZmlsZUVudHJ5LmZpbGUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBTaW11bGF0ZSB1cGxvYWQgd2l0aCBwcm9ncmVzcyB1cGRhdGVzXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9ncmVzcyA9IDA7IHByb2dyZXNzIDw9IDEwMDsgcHJvZ3Jlc3MgKz0gMTApIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB1cGxvYWQgd2FzIGNhbmNlbGVkIGR1cmluZyBwcm9ncmVzc1xuICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgY3VycmVudCBzdGF0dXMgc2luY2UgaXQgbWlnaHQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgaWYgKGZpbGVFbnRyeS5zdGF0dXMgIT09ICd1cGxvYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVpdGhlciBjYW5jZWxlZCBvciBlcnJvcmVkXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZpbGVFbnRyeS5wcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgICAgICAgICAgIC8vdGhpcy51cGxvYWRQcm9ncmVzcy5lbWl0KHsgZmlsZTogZmlsZUVudHJ5LmZpbGUsIHByb2dyZXNzIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgbmV0d29yayBkZWxheVxuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIwMCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbmx5IHNldCB0byBjb21wbGV0ZSBpZiBzdGlsbCB1cGxvYWRpbmcgKG5vdCBjYW5jZWxlZCBvciBlcnJvcmVkKVxuICAgICAgICAgICAgaWYgKGZpbGVFbnRyeS5zdGF0dXMgPT09ICd1cGxvYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgZmlsZUVudHJ5LnN0YXR1cyA9ICdjb21wbGV0ZSc7XG4gICAgICAgICAgICAgICAgZmlsZUVudHJ5LnByb2dyZXNzID0gMTAwO1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkQ29tcGxldGVkLmVtaXQoZmlsZUVudHJ5LmZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAgICAgICAgICAgZmlsZUVudHJ5LnN0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHVwbG9hZCBlcnJvcic7XG4gICAgICAgICAgICBmaWxlRW50cnkuZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlO1xuICAgICAgICAgICAgdGhpcy5lbWl0RXJyb3IoZmlsZUVudHJ5LmZpbGUsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYW5jZWxVcGxvYWQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICAvLyBDYW5jZWwgdGhlIHNwZWNpZmllZCBmaWxlIGFuZCBhbGwgZmlsZXMgYmVsb3cgaXRcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgdGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlVG9DYW5jZWwgPSB0aGlzLnVwbG9hZGVkRmlsZXNbaV07XG4gICAgICAgICAgICBpZiAoZmlsZVRvQ2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNTdGF0dXMgPSBmaWxlVG9DYW5jZWwuc3RhdHVzO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXR1cyA9PT0gJ3VwbG9hZGluZycgfHwgcHJldmlvdXNTdGF0dXMgPT09ICdxdWV1ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVUb0NhbmNlbC5zdGF0dXMgPSAnY2FuY2VsZWQnO1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGVtaXQgaWYgaXQgd2FzIGFjdGl2ZWx5IHVwbG9hZGluZyAobm90IGp1c3QgcXVldWVkKVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0dXMgPT09ICd1cGxvYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZENhbmNlbGVkLmVtaXQoZmlsZVRvQ2FuY2VsLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZSBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggd2FzIHVwbG9hZGluZywgcHJvY2VzcyB0aGUgbmV4dCBmaWxlIGluIHF1ZXVlXG4gICAgICAgIC8vICh3aGljaCB3b3VsZCBub3cgYmUgYSBmaWxlIGJlZm9yZSB0aGUgaW5kZXggdGhhdCBtaWdodCBiZSBxdWV1ZWQpXG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZXNbaW5kZXhdPy5zdGF0dXMgPT09ICdjYW5jZWxlZCcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcm9jZXNzUXVldWUoKSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgdGhlIGN1cnJlbnQgdXBsb2FkXG4gICAgY2FuY2VsQ3VycmVudFVwbG9hZCgpOiB2b2lkIHtcbiAgICAgICAgLy8gRmluZCB0aGUgZmlsZSB0aGF0J3MgY3VycmVudGx5IHVwbG9hZGluZ1xuICAgICAgICBjb25zdCBjdXJyZW50VXBsb2FkSW5kZXggPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmluZEluZGV4KChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3VwbG9hZGluZycpO1xuICAgICAgICBpZiAoY3VycmVudFVwbG9hZEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsVXBsb2FkKGN1cnJlbnRVcGxvYWRJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgYWxsIHVwbG9hZHNcbiAgICBjYW5jZWxBbGxVcGxvYWRzKCk6IHZvaWQge1xuICAgICAgICBsZXQgaGFkQWN0aXZlVXBsb2FkcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZS5zdGF0dXMgPT09ICd1cGxvYWRpbmcnIHx8IGZpbGUuc3RhdHVzID09PSAncXVldWVkJykge1xuICAgICAgICAgICAgICAgIGhhZEFjdGl2ZVVwbG9hZHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdHVzID0gZmlsZS5zdGF0dXM7XG4gICAgICAgICAgICAgICAgZmlsZS5zdGF0dXMgPSAnY2FuY2VsZWQnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdHVzID09PSAndXBsb2FkaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZENhbmNlbGVkLmVtaXQoZmlsZS5maWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYWRBY3RpdmVVcGxvYWRzICYmICF0aGlzLmhhc1F1ZXVlZE9yVXBsb2FkaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVwbG9hZFN0YXR1cygnaWRsZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgZmlsZSBmcm9tIHRoZSBsaXN0XG4gICAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVUb1JlbW92ZSA9IHRoaXMudXBsb2FkZWRGaWxlc1tpbmRleF07XG5cbiAgICAgICAgLy8gQ2FuY2VsIGZpcnN0IGlmIGl0J3MgYWN0aXZlXG4gICAgICAgIGlmIChmaWxlVG9SZW1vdmUuc3RhdHVzID09PSAndXBsb2FkaW5nJyB8fCBmaWxlVG9SZW1vdmUuc3RhdHVzID09PSAncXVldWVkJykge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxVcGxvYWQoaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCByZW1vdmFsIGV2ZW50XG4gICAgICAgIHRoaXMuZmlsZVJlbW92ZWQuZW1pdChmaWxlVG9SZW1vdmUuZmlsZSk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gYXJyYXlcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgLy8gUmVzZXQgc3RhdHVzIGlmIG5vIGZpbGVzIGxlZnRcbiAgICAgICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXBsb2FkU3RhdHVzKCdpZGxlJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaGFzUXVldWVkT3JVcGxvYWRpbmcgJiYgdGhpcy51cGxvYWRTdGF0dXMgIT09ICdjb21wbGV0ZScpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBtb3JlIHF1ZXVlZCBvciB1cGxvYWRpbmcgZmlsZXMgYnV0IHdlIGhhdmUgY29tcGxldGVkIGZpbGVzXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVwbG9hZFN0YXR1cygnY29tcGxldGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgZmlsZXNcbiAgICByZW1vdmVBbGxGaWxlcygpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFueSBhY3RpdmUgdXBsb2Fkc1xuICAgICAgICB0aGlzLmNhbmNlbEFsbFVwbG9hZHMoKTtcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgdGhlcmUgd2VyZSBmaWxlcyB0byByZW1vdmVcbiAgICAgICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFsbEZpbGVzUmVtb3ZlZC5lbWl0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRTdGF0dXMoJ2lkbGUnKTtcbiAgICB9XG5cbiAgICAvLyBSZXRyeSBhIGZhaWxlZCB1cGxvYWRcbiAgICByZXRyeVVwbG9hZChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVUb1JldHJ5ID0gdGhpcy51cGxvYWRlZEZpbGVzW2luZGV4XTtcbiAgICAgICAgaWYgKGZpbGVUb1JldHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gZmlsZVRvUmV0cnkuc3RhdHVzO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgPT09ICdlcnJvcicgfHwgY3VycmVudFN0YXR1cyA9PT0gJ2NhbmNlbGVkJykge1xuICAgICAgICAgICAgICAgIGZpbGVUb1JldHJ5LnN0YXR1cyA9ICdxdWV1ZWQnO1xuICAgICAgICAgICAgICAgIGZpbGVUb1JldHJ5LmVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHByb2Nlc3NpbmcgaWYgbm90IGFscmVhZHkgZG9pbmcgc29cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNQcm9jZXNzaW5nUXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgaGFzVXBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJyk7XG4gICAgfVxuXG4gICAgZ2V0IGhhc1F1ZXVlZE9yVXBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJyB8fCBmaWxlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpO1xuICAgIH1cblxuICAgIGdldCBoYXNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwbG9hZGVkRmlsZXMuc29tZSgoZmlsZSkgPT4gZmlsZS5zdGF0dXMgPT09ICdlcnJvcicpO1xuICAgIH1cblxuICAgIGdldCBhbGxVcGxvYWRzQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwbG9hZGVkRmlsZXMubGVuZ3RoID4gMCAmJiB0aGlzLnVwbG9hZGVkRmlsZXMuc29tZSgoZmlsZSkgPT4gZmlsZS5zdGF0dXMgPT09ICdjb21wbGV0ZScpICYmICF0aGlzLmhhc1F1ZXVlZE9yVXBsb2FkaW5nO1xuICAgIH1cblxuICAgIGdldCB1cGxvYWRpbmdQcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gQ291bnQgYWN0aXZlIGZpbGVzIChleGNsdWRpbmcgY2FuY2VsZWQgb25lcylcbiAgICAgICAgY29uc3QgdG90YWxBY3RpdmVGaWxlcyA9IHRoaXMuYWN0aXZlRmlsZXNDb3VudDtcbiAgICAgICAgY29uc3QgY29tcGxldGVkQ291bnQgPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykubGVuZ3RoO1xuICAgICAgICBjb25zdCB1cGxvYWRpbmdGaWxlID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbmQoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJyk7XG4gICAgICAgIGlmICh1cGxvYWRpbmdGaWxlKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBjdXJyZW50bHkgdXBsb2FkaW5nIHRoZSAoY29tcGxldGVkQ291bnQgKyAxKXRoIGFjdGl2ZSBmaWxlXG4gICAgICAgICAgICByZXR1cm4gYFVwbG9hZGluZyAke2NvbXBsZXRlZENvdW50fS8ke3RvdGFsQWN0aXZlRmlsZXN9IGZpbGUke3RvdGFsQWN0aXZlRmlsZXMgPiAxID8gJ3MnIDogJyd9Li4uYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAncXVldWVkJykpIHtcbiAgICAgICAgICAgIHJldHVybiBgVXBsb2FkaW5nICR7Y29tcGxldGVkQ291bnQgKyAxfS8ke3RvdGFsQWN0aXZlRmlsZXN9IGZpbGUke3RvdGFsQWN0aXZlRmlsZXMgPiAxID8gJ3MnIDogJyd9Li4uYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFVwbG9hZGluZyAke2NvbXBsZXRlZENvdW50fS8ke3RvdGFsQWN0aXZlRmlsZXN9IGZpbGUke3RvdGFsQWN0aXZlRmlsZXMgPiAxID8gJ3MnIDogJyd9Li4uYDtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgb3ZlcmFsbCBwcm9ncmVzcyBwZXJjZW50YWdlIGFjcm9zcyBhbGwgZmlsZXNcbiAgICBnZXQgb3ZlcmFsbFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcblxuICAgICAgICBjb25zdCB0b3RhbFByb2dyZXNzID0gdGhpcy51cGxvYWRlZEZpbGVzLnJlZHVjZSgoc3VtLCBmaWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZS5zdGF0dXMgPT09ICdjb21wbGV0ZScpIHJldHVybiBzdW0gKyAxMDA7XG4gICAgICAgICAgICBpZiAoZmlsZS5zdGF0dXMgPT09ICdjYW5jZWxlZCcgfHwgZmlsZS5zdGF0dXMgPT09ICdlcnJvcicpIHJldHVybiBzdW07XG4gICAgICAgICAgICByZXR1cm4gc3VtICsgKGZpbGUucHJvZ3Jlc3MgfHwgMCk7XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2ZUZpbGVzQ291bnQgPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnN0YXR1cyAhPT0gJ2NhbmNlbGVkJyAmJiBmaWxlLnN0YXR1cyAhPT0gJ2Vycm9yJykubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiBhY3RpdmVGaWxlc0NvdW50ID4gMCA/IE1hdGgucm91bmQoKHRvdGFsUHJvZ3Jlc3MgLyAoYWN0aXZlRmlsZXNDb3VudCAqIDEwMCkpICogMTAwKSA6IDA7XG4gICAgfVxufVxuIiwiPHAgY2xhc3M9XCJjYXgtZmlsZXNcIj57e2lucHV0RmlsZXN9fTwvcD5cclxuPGRpdiBjbGFzcz1cImNheC11cGxvYWQtbWVudVwiIFtuZ1N0eWxlXT1cInN0eWxlXCJcclxuICAgICBbY2xhc3MuZHJhZ2dpbmddPVwiaXNEcmFnZ2luZ1wiIFxyXG4gICAgIChjbGljayk9XCJvcGVuRmlsZVNlbGVjdG9yKClcIj5cclxuICA8aW5wdXRcclxuICAgIGlkPVwiZmlsZUlucHV0XCJcclxuICAgIHR5cGU9XCJmaWxlXCJcclxuICAgIChjaGFuZ2UpPVwiaGFuZGxlRmlsZUlucHV0KCRldmVudClcIlxyXG4gICAgaGlkZGVuXHJcbiAgICBtdWx0aXBsZVxyXG4gID5cclxuXHJcbiAgPCEtLSBEZWZhdWx0IFVwbG9hZCBTdGF0ZSAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidXBsb2FkU3RhdHVzID09PSAnaWRsZSdcIiA+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2F4LXVwbG9hZC1vcHRpb25zXCIgPlxyXG4gICAgICA8cCBjbGFzcz1cImhpbnQtdGV4dFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcC1maWxlc1wiPkRyb3AgZmlsZXMgaGVyZTwvc3Bhbj4gb3IgYnJvd3NlIGZpbGVzIGZyb20geW91ciBkZXZpY2VcclxuICAgICAgPC9wPlxyXG4gICAgICA8cCBjbGFzcz1cIm1heC1zaXplXCI+TWF4LiBGaWxlIFNpemU6IHt7IG1heEZpbGVTaXplIH19TUI8L3A+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gIDwhLS0gVXBsb2FkaW5nIFN0YXRlIC0tPlxyXG48ZGl2ICpuZ0lmPVwidXBsb2FkU3RhdHVzID09PSAndXBsb2FkaW5nJ1wiIGNsYXNzPVwiY2F4LXVwbG9hZC1zdGF0dXMgdXBsb2FkaW5nXCIgPlxyXG4gIDxkaXYgY2xhc3M9XCJzdGF0dXMtY29udGFpbmVyXCI+XHJcbiAgICA8Y2F4LXByb2dyZXNzU3Bpbm5lclxyXG4gICAgICAgIFtzdHJva2VDb2xvcl09XCIncHJpbWFyeSdcIlxyXG4gICAgICAgIFtzaXplXT1cIidsZydcIlxyXG4gICAgICAgIFthbmltYXRpb25EdXJhdGlvbl09XCInMnMnXCJcclxuICAgICAgPjwvY2F4LXByb2dyZXNzU3Bpbm5lcj5cclxuICAgIDxwID57eyB1cGxvYWRpbmdQcm9ncmVzc1RleHQgfX08L3A+XHJcbiAgICA8Y2F4LWJ1dHRvblxyXG4gICAgICBbbGFiZWxdPVwiJ0NhbmNlbCdcIlxyXG4gICAgICBbcm91bmRlZF09XCJmYWxzZVwiXHJcbiAgICAgIFtzZXZlcml0eV09XCInZGFuZ2VyJ1wiXHJcbiAgICAgIFtzaXplXT1cIidsYXJnZSdcIlxyXG4gICAgICBbb3V0bGluZWRdPVwiJ2ZhbHNlJ1wiXHJcbiAgICAgIFtsaW5rXT1cInRydWVcIlxyXG4gICAgICAoY2xpY2spPVwiY2FuY2VsQ3VycmVudFVwbG9hZCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG4gIDwhLS0gQ29tcGxldGUgU3RhdGUgLS0+XHJcbiAgPGRpdiAqbmdJZj1cInVwbG9hZFN0YXR1cyA9PT0gJ2NvbXBsZXRlJ1wiIGNsYXNzPVwiY2F4LXVwbG9hZC1zdGF0dXMgY29tcGxldGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWNjZXNzLWljb25cIj48aSBjbGFzcz1cImNheCBjYXgtY2hlY2tcIj48L2k+PC9kaXY+XHJcbiAgICAgIDxwPnt7dXBsb2FkU3RyaW5nfX08L3A+XHJcbiAgICAgIDxjYXgtYnV0dG9uXHJcbiAgICAgICAgW2xhYmVsXT1cIidSZW1vdmUnXCJcclxuICAgICAgICBbcm91bmRlZF09XCJmYWxzZVwiXHJcbiAgICAgICAgW3NldmVyaXR5XT1cIidkYW5nZXInXCJcclxuICAgICAgICBbc2l6ZV09XCInbGFyZ2UnXCJcclxuICAgICAgICBbb3V0bGluZWRdPVwiJ2ZhbHNlJ1wiXHJcbiAgICAgICAgW2xpbmtdPVwidHJ1ZVwiXHJcbiAgICAgICAgKGNsaWNrKT1cInJlbW92ZUFsbEZpbGVzKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2ICpuZ0lmPVwiaW52YWxpZFwiIGlkPVwiaGVscGVyLXRleHRcIiBjbGFzcz1cImNheC1lcnJvci11cGxvYWRcIj48L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgKm5nSWY9XCJpbnZhbGlkXCIgaWQ9XCJoZWxwZXItdGV4dFwiIGNsYXNzPVwiY2F4LWVycm9yLXVwbG9hZFwiPlxyXG4gIHt7IGVycm9yVGV4dCB9fVxyXG48L2Rpdj5cclxuXHJcbjwhLS0gc3RhY2tlZCBmaWxlIC0tPlxyXG48ZGl2ICpuZ0lmPVwidXBsb2FkZWRGaWxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJjYXgtZmlsZS1wcmV2aWV3LXdyYXBwZXJcIiBbbmdTdHlsZV09XCJzdHlsZVwiPlxyXG4gIDxkaXZcclxuICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHVwbG9hZGVkRmlsZXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgY2xhc3M9XCJjYXgtZmlsZS1wcmV2aWV3XCJcclxuICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgJ3F1ZXVlZCc6IGl0ZW0uc3RhdHVzID09PSAncXVldWVkJyxcclxuICAgICAgJ3VwbG9hZGluZyc6IGl0ZW0uc3RhdHVzID09PSAndXBsb2FkaW5nJyxcclxuICAgICAgJ2NvbXBsZXRlJzogaXRlbS5zdGF0dXMgPT09ICdjb21wbGV0ZScsXHJcbiAgICAgICdjYW5jZWxlZCc6IGl0ZW0uc3RhdHVzID09PSAnY2FuY2VsZWQnXHJcbiAgICB9XCJcclxuICA+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pbmZvXCI+XHJcbiAgICAgIDxwIGNsYXNzPVwiZmlsZS1uYW1lXCI+e3sgaXRlbS5maWxlLm5hbWUgfX08L3A+XHJcbiAgICA8L2Rpdj4gXHJcblxyXG4gICAgPCEtLSBTaG93IHNwaW5uZXIgZm9yIHF1ZXVlZCBvciB1cGxvYWRpbmcgZmlsZXMgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09ICdxdWV1ZWQnIHx8IGl0ZW0uc3RhdHVzID09PSAndXBsb2FkaW5nJ1wiIGNsYXNzPVwic3Bpbm5lclwiPlxyXG4gICAgICA8Y2F4LXByb2dyZXNzU3Bpbm5lclxyXG4gICAgICAgIFtzdHJva2VDb2xvcl09XCIncHJpbWFyeSdcIlxyXG4gICAgICAgIFtzaXplXT1cIidzbSdcIlxyXG4gICAgICAgIFthbmltYXRpb25EdXJhdGlvbl09XCInMnMnXCI+XHJcbiAgICAgIDwvY2F4LXByb2dyZXNzU3Bpbm5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICA8IS0tIFNob3cgcmVtb3ZlIGJ1dHRvbiBvbmx5IGZvciBjb21wbGV0ZSBvciBjYW5jZWxlZCBmaWxlcyAtLT5cclxuICAgIDxidXR0b25cclxuICAgICAgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJyB8fCBpdGVtLnN0YXR1cyA9PT0gJ2NhbmNlbGVkJ1wiXHJcbiAgICAgIGNsYXNzPVwicmVtb3ZlLWJ1dHRvblwiXHJcbiAgICAgIChjbGljayk9XCJyZW1vdmVGaWxlKGkpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgPGkgY2xhc3M9XCJjYXggY2F4LWNsb3NlXCI+PC9pPiBcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
@@ -0,0 +1,21 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { UploadComponent } from './upload.component';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { NgModule } from '@angular/core';
5
+ import { ProgressSpinnerModule } from 'cax-design-system/progressspinner';
6
+ import { Button } from 'cax-design-system/button';
7
+ import * as i0 from "@angular/core";
8
+ export class UploadModule {
9
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UploadModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.9", ngImport: i0, type: UploadModule, declarations: [UploadComponent], imports: [CommonModule, FormsModule, ProgressSpinnerModule, Button], exports: [UploadComponent] });
11
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UploadModule, imports: [CommonModule, FormsModule, ProgressSpinnerModule, Button] });
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UploadModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ declarations: [UploadComponent],
17
+ imports: [CommonModule, FormsModule, ProgressSpinnerModule, Button],
18
+ exports: [UploadComponent]
19
+ }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvdXBsb2FkL3VwbG9hZC5jb21wb25lbnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQU9sRCxNQUFNLE9BQU8sWUFBWTt1R0FBWixZQUFZO3dHQUFaLFlBQVksaUJBSk4sZUFBZSxhQUNwQixZQUFZLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFDeEQsZUFBZTt3R0FFaEIsWUFBWSxZQUhYLFlBQVksRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTTs7MkZBR3pELFlBQVk7a0JBTHhCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLENBQUMsZUFBZSxDQUFDO29CQUMvQixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztvQkFDbkUsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDO2lCQUM3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBVcGxvYWRDb21wb25lbnQgfSBmcm9tICcuL3VwbG9hZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnY2F4LWRlc2lnbi1zeXN0ZW0vcHJvZ3Jlc3NzcGlubmVyJztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJ2NheC1kZXNpZ24tc3lzdGVtL2J1dHRvbic7XG5cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbVXBsb2FkQ29tcG9uZW50XSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUHJvZ3Jlc3NTcGlubmVyTW9kdWxlLCBCdXR0b25dLFxuICAgIGV4cG9ydHM6IFtVcGxvYWRDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZE1vZHVsZSB7fVxuIl19
@@ -83,13 +83,13 @@ class Card {
83
83
  return this.el.nativeElement.children[0];
84
84
  }
85
85
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: Card, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
86
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: Card, selector: "cax-card", inputs: { header: "header", activeCard: "activeCard", imageUrl: "imageUrl", badgeSeverity: "badgeSeverity", badgeValue: "badgeValue", iconClass: "iconClass", subheader: "subheader", style: "style", styleClass: "styleClass" }, host: { classAttribute: "cax-element" }, queries: [{ propertyName: "headerFacet", first: true, predicate: Header, descendants: true }, { propertyName: "footerFacet", first: true, predicate: Footer, descendants: true }, { propertyName: "templates", predicate: CaxTemplate }], ngImport: i0, template: "<div [ngClass]=\"'cax-card cax-component'\" [ngStyle]=\"_style()\" [class]=\"styleClass\" [attr.data-pc-name]=\"'card'\">\r\n <div [ngClass]=\"{\r\n 'cax-card-header': true,\r\n 'cax-card-header-no-padding': !header && !headerTemplate && !imageUrl && !iconClass && activeCard,\r\n 'cax-card-header-default-padding': (header || headerTemplate || imageUrl || iconClass) && !(!iconClass && !imageUrl),\r\n 'cax-card-header-with-image': imageUrl && !iconClass,\r\n 'cax-card-header-with-icon': iconClass && !imageUrl\r\n\r\n }\" *ngIf=\"header || headerTemplate || iconClass || imageUrl || activeCard\">\r\n <ng-content select=\"cax-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n <i [class]=\"iconClass\" *ngIf=\"!imageUrl\"></i>\r\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" alt=\"Card\" />\r\n <div *ngIf=\"activeCard\">\r\n <cax-badge\r\n [value]=\"badgeValue\"\r\n [severity]=\"badgeSeverity\">\r\n </cax-badge>\r\n </div>\r\n </div>\r\n <div class=\"cax-card-body\">\r\n <div class=\"cax-card-title\" *ngIf=\"header || titleTemplate\">\r\n {{ header }}\r\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-subtitle\" *ngIf=\"subheader || subtitleTemplate\">\r\n {{ subheader }}\r\n <ng-container *ngTemplateOutlet=\"subtitleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-content\">\r\n <ng-content></ng-content>\r\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-footer\" *ngIf=\"footerFacet || footerTemplate\">\r\n <ng-content select=\"cax-footer\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["@layer cax{.cax-card-header{display:flex;align-items:center;position:relative;justify-content:space-between;padding:24px 24px 0}.cax-card-header-default-padding{padding:24px 24px 16px}.cax-card-no-header{padding:10px}.cax-card-header img{width:100%;height:180px;border-radius:12px;border:1px solid #e0e5eb}.cax-card-header i{width:100%;font-size:48px;line-height:48px}.cax-card-header cax-badge{position:absolute;top:24px;right:36px;z-index:10}.cax-card-header cax-badge .cax-card-header-default-padding{padding:24px 24px 0}.cax-card-header-with-image cax-badge{right:36px;top:36px}.cax-card-header-with-icon cax-badge{right:26px;top:36px}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.Badge, selector: "cax-badge", inputs: ["styleClass", "style", "badgeSize", "severity", "value", "badgeDisabled", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
86
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: Card, selector: "cax-card", inputs: { header: "header", activeCard: "activeCard", imageUrl: "imageUrl", badgeSeverity: "badgeSeverity", badgeValue: "badgeValue", iconClass: "iconClass", subheader: "subheader", style: "style", styleClass: "styleClass" }, host: { classAttribute: "cax-element" }, queries: [{ propertyName: "headerFacet", first: true, predicate: Header, descendants: true }, { propertyName: "footerFacet", first: true, predicate: Footer, descendants: true }, { propertyName: "templates", predicate: CaxTemplate }], ngImport: i0, template: "<div [ngClass]=\"'cax-card cax-component'\" [ngStyle]=\"_style()\" [class]=\"styleClass\" [attr.data-pc-name]=\"'card'\">\r\n <div [ngClass]=\"{\r\n 'cax-card-header': true,\r\n 'cax-card-header-no-padding': !header && !headerTemplate && !imageUrl && !iconClass && activeCard,\r\n 'cax-card-header-default-padding': (header || headerTemplate || imageUrl || iconClass) && !(!iconClass && !imageUrl),\r\n 'cax-card-header-with-image': imageUrl && !iconClass,\r\n 'cax-card-header-with-icon': iconClass && !imageUrl\r\n\r\n }\" *ngIf=\"header || headerTemplate || iconClass || imageUrl || activeCard\">\r\n <ng-content select=\"cax-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n <i [class]=\"iconClass\" *ngIf=\"!imageUrl\"></i>\r\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" alt=\"Card\" />\r\n <div *ngIf=\"activeCard\">\r\n <cax-badge\r\n [value]=\"badgeValue\"\r\n [severity]=\"badgeSeverity\">\r\n </cax-badge>\r\n </div>\r\n </div>\r\n <div class=\"cax-card-body\">\r\n <div class=\"cax-card-title\" *ngIf=\"header || titleTemplate\">\r\n {{ header }}\r\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-subtitle\" *ngIf=\"subheader || subtitleTemplate\">\r\n {{ subheader }}\r\n <ng-container *ngTemplateOutlet=\"subtitleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-content\">\r\n <ng-content></ng-content>\r\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-footer\" *ngIf=\"footerFacet || footerTemplate\">\r\n <ng-content select=\"cax-footer\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["@layer cax{.cax-card-header{display:flex;align-items:center;position:relative;justify-content:space-between;padding:24px 24px 0}.cax-card-header-default-padding{padding:24px 24px 16px}.cax-card-no-header{padding:10px}.cax-card-header img{width:100%;height:180px;border-radius:12px;border:1px solid var(--neutral-100)}.cax-card-header i{width:100%;font-size:48px;line-height:48px}.cax-card-header cax-badge{position:absolute;top:24px;right:36px;z-index:10}.cax-card-header cax-badge .cax-card-header-default-padding{padding:24px 24px 0}.cax-card-header-with-image cax-badge{right:36px;top:36px}.cax-card-header-with-icon cax-badge{right:26px;top:36px}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.Badge, selector: "cax-badge", inputs: ["styleClass", "style", "badgeSize", "severity", "value", "badgeDisabled", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
87
87
  }
88
88
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: Card, decorators: [{
89
89
  type: Component,
90
90
  args: [{ selector: 'cax-card', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
91
91
  class: 'cax-element'
92
- }, template: "<div [ngClass]=\"'cax-card cax-component'\" [ngStyle]=\"_style()\" [class]=\"styleClass\" [attr.data-pc-name]=\"'card'\">\r\n <div [ngClass]=\"{\r\n 'cax-card-header': true,\r\n 'cax-card-header-no-padding': !header && !headerTemplate && !imageUrl && !iconClass && activeCard,\r\n 'cax-card-header-default-padding': (header || headerTemplate || imageUrl || iconClass) && !(!iconClass && !imageUrl),\r\n 'cax-card-header-with-image': imageUrl && !iconClass,\r\n 'cax-card-header-with-icon': iconClass && !imageUrl\r\n\r\n }\" *ngIf=\"header || headerTemplate || iconClass || imageUrl || activeCard\">\r\n <ng-content select=\"cax-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n <i [class]=\"iconClass\" *ngIf=\"!imageUrl\"></i>\r\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" alt=\"Card\" />\r\n <div *ngIf=\"activeCard\">\r\n <cax-badge\r\n [value]=\"badgeValue\"\r\n [severity]=\"badgeSeverity\">\r\n </cax-badge>\r\n </div>\r\n </div>\r\n <div class=\"cax-card-body\">\r\n <div class=\"cax-card-title\" *ngIf=\"header || titleTemplate\">\r\n {{ header }}\r\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-subtitle\" *ngIf=\"subheader || subtitleTemplate\">\r\n {{ subheader }}\r\n <ng-container *ngTemplateOutlet=\"subtitleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-content\">\r\n <ng-content></ng-content>\r\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-footer\" *ngIf=\"footerFacet || footerTemplate\">\r\n <ng-content select=\"cax-footer\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["@layer cax{.cax-card-header{display:flex;align-items:center;position:relative;justify-content:space-between;padding:24px 24px 0}.cax-card-header-default-padding{padding:24px 24px 16px}.cax-card-no-header{padding:10px}.cax-card-header img{width:100%;height:180px;border-radius:12px;border:1px solid #e0e5eb}.cax-card-header i{width:100%;font-size:48px;line-height:48px}.cax-card-header cax-badge{position:absolute;top:24px;right:36px;z-index:10}.cax-card-header cax-badge .cax-card-header-default-padding{padding:24px 24px 0}.cax-card-header-with-image cax-badge{right:36px;top:36px}.cax-card-header-with-icon cax-badge{right:26px;top:36px}}\n"] }]
92
+ }, template: "<div [ngClass]=\"'cax-card cax-component'\" [ngStyle]=\"_style()\" [class]=\"styleClass\" [attr.data-pc-name]=\"'card'\">\r\n <div [ngClass]=\"{\r\n 'cax-card-header': true,\r\n 'cax-card-header-no-padding': !header && !headerTemplate && !imageUrl && !iconClass && activeCard,\r\n 'cax-card-header-default-padding': (header || headerTemplate || imageUrl || iconClass) && !(!iconClass && !imageUrl),\r\n 'cax-card-header-with-image': imageUrl && !iconClass,\r\n 'cax-card-header-with-icon': iconClass && !imageUrl\r\n\r\n }\" *ngIf=\"header || headerTemplate || iconClass || imageUrl || activeCard\">\r\n <ng-content select=\"cax-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n <i [class]=\"iconClass\" *ngIf=\"!imageUrl\"></i>\r\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" alt=\"Card\" />\r\n <div *ngIf=\"activeCard\">\r\n <cax-badge\r\n [value]=\"badgeValue\"\r\n [severity]=\"badgeSeverity\">\r\n </cax-badge>\r\n </div>\r\n </div>\r\n <div class=\"cax-card-body\">\r\n <div class=\"cax-card-title\" *ngIf=\"header || titleTemplate\">\r\n {{ header }}\r\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-subtitle\" *ngIf=\"subheader || subtitleTemplate\">\r\n {{ subheader }}\r\n <ng-container *ngTemplateOutlet=\"subtitleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-content\">\r\n <ng-content></ng-content>\r\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-footer\" *ngIf=\"footerFacet || footerTemplate\">\r\n <ng-content select=\"cax-footer\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["@layer cax{.cax-card-header{display:flex;align-items:center;position:relative;justify-content:space-between;padding:24px 24px 0}.cax-card-header-default-padding{padding:24px 24px 16px}.cax-card-no-header{padding:10px}.cax-card-header img{width:100%;height:180px;border-radius:12px;border:1px solid var(--neutral-100)}.cax-card-header i{width:100%;font-size:48px;line-height:48px}.cax-card-header cax-badge{position:absolute;top:24px;right:36px;z-index:10}.cax-card-header cax-badge .cax-card-header-default-padding{padding:24px 24px 0}.cax-card-header-with-image cax-badge{right:36px;top:36px}.cax-card-header-with-icon cax-badge{right:26px;top:36px}}\n"] }]
93
93
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { header: [{
94
94
  type: Input
95
95
  }], activeCard: [{
@@ -1 +1 @@
1
- {"version":3,"file":"cax-design-system-card.mjs","sources":["../../src/app/components/card/card.ts","../../src/app/components/card/card.html","../../src/app/components/card/card.module.ts","../../src/app/components/card/cax-design-system-card.ts"],"sourcesContent":["import { AfterContentInit, ChangeDetectionStrategy, Component, ContentChild, ContentChildren, ElementRef, Input, QueryList, TemplateRef, ViewEncapsulation, signal } from '@angular/core';\nimport { BlockableUI, Footer, Header, CaxTemplate } from 'cax-design-system/api';\nimport { ObjectUtils } from 'cax-design-system/utils';\n\n/**\n * Card is a flexible container component.\n * @group Components\n */\n@Component({\n selector: 'cax-card',\n templateUrl: './card.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['./card.scss'],\n host: {\n class: 'cax-element'\n }\n})\nexport class Card implements AfterContentInit, BlockableUI {\n /**\n * Header of the card.\n * @group Props\n */\n @Input() header: string | undefined;\n @Input() activeCard: boolean;\n @Input() imageUrl: string;\n @Input() badgeSeverity: 'success' | 'info' | 'warning' | 'danger' | 'help' | 'primary' | 'secondary' | 'contrast' | null | undefined;\n @Input() badgeValue: string | number | null | undefined = 'Active';\n @Input() iconClass!: string;\n\n /**\n * Subheader of the card.\n * @group Props\n */\n\n @Input() subheader: string | undefined;\n /**\n * Inline style of the element.\n * @group Props\n */\n\n @Input() set style(value: { [klass: string]: any } | null | undefined) {\n if (!ObjectUtils.equals(this._style(), value)) {\n this._style.set(value);\n }\n }\n /**\n * Class of the element.\n * @group Props\n */\n @Input() styleClass: string | undefined;\n\n @ContentChild(Header) headerFacet: TemplateRef<any> | undefined;\n\n @ContentChild(Footer) footerFacet: TemplateRef<any> | undefined;\n\n @ContentChildren(CaxTemplate) templates: QueryList<CaxTemplate> | undefined;\n\n headerTemplate: TemplateRef<any> | undefined;\n\n titleTemplate: TemplateRef<any> | undefined;\n\n subtitleTemplate: TemplateRef<any> | undefined;\n\n contentTemplate: TemplateRef<any> | undefined;\n\n footerTemplate: TemplateRef<any> | undefined;\n\n _style = signal<{ [klass: string]: any } | null | undefined>(null);\n\n constructor(private el: ElementRef) {}\n\n ngAfterContentInit() {\n (this.templates as QueryList<CaxTemplate>).forEach((item) => {\n switch (item.getType()) {\n case 'header':\n this.headerTemplate = item.template;\n break;\n\n case 'title':\n this.titleTemplate = item.template;\n break;\n\n case 'subtitle':\n this.subtitleTemplate = item.template;\n break;\n\n case 'content':\n this.contentTemplate = item.template;\n break;\n\n case 'footer':\n this.footerTemplate = item.template;\n break;\n\n default:\n this.contentTemplate = item.template;\n break;\n }\n });\n }\n\n getBlockableElement(): HTMLElement {\n return this.el.nativeElement.children[0];\n }\n}\n","<div [ngClass]=\"'cax-card cax-component'\" [ngStyle]=\"_style()\" [class]=\"styleClass\" [attr.data-pc-name]=\"'card'\">\r\n <div [ngClass]=\"{\r\n 'cax-card-header': true,\r\n 'cax-card-header-no-padding': !header && !headerTemplate && !imageUrl && !iconClass && activeCard,\r\n 'cax-card-header-default-padding': (header || headerTemplate || imageUrl || iconClass) && !(!iconClass && !imageUrl),\r\n 'cax-card-header-with-image': imageUrl && !iconClass,\r\n 'cax-card-header-with-icon': iconClass && !imageUrl\r\n\r\n }\" *ngIf=\"header || headerTemplate || iconClass || imageUrl || activeCard\">\r\n <ng-content select=\"cax-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n <i [class]=\"iconClass\" *ngIf=\"!imageUrl\"></i>\r\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" alt=\"Card\" />\r\n <div *ngIf=\"activeCard\">\r\n <cax-badge\r\n [value]=\"badgeValue\"\r\n [severity]=\"badgeSeverity\">\r\n </cax-badge>\r\n </div>\r\n </div>\r\n <div class=\"cax-card-body\">\r\n <div class=\"cax-card-title\" *ngIf=\"header || titleTemplate\">\r\n {{ header }}\r\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-subtitle\" *ngIf=\"subheader || subtitleTemplate\">\r\n {{ subheader }}\r\n <ng-container *ngTemplateOutlet=\"subtitleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-content\">\r\n <ng-content></ng-content>\r\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-footer\" *ngIf=\"footerFacet || footerTemplate\">\r\n <ng-content select=\"cax-footer\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SharedModule } from 'cax-design-system/api';\nimport { Card } from './card';\nimport { Button, ButtonModule } from 'cax-design-system/button';\nimport { BadgeModule } from 'cax-design-system/badge';\n\n@NgModule({\n imports: [Button, CommonModule, SharedModule, ButtonModule, BadgeModule],\n declarations: [Card],\n exports: [Card, SharedModule]\n})\nexport class CardModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cax-design-system-card.mjs","sources":["../../src/app/components/card/card.ts","../../src/app/components/card/card.html","../../src/app/components/card/card.module.ts","../../src/app/components/card/cax-design-system-card.ts"],"sourcesContent":["import { AfterContentInit, ChangeDetectionStrategy, Component, ContentChild, ContentChildren, ElementRef, Input, QueryList, TemplateRef, ViewEncapsulation, signal } from '@angular/core';\nimport { BlockableUI, Footer, Header, CaxTemplate } from 'cax-design-system/api';\nimport { ObjectUtils } from 'cax-design-system/utils';\n\n/**\n * Card is a flexible container component.\n * @group Components\n */\n@Component({\n selector: 'cax-card',\n templateUrl: './card.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['./card.scss'],\n host: {\n class: 'cax-element'\n }\n})\nexport class Card implements AfterContentInit, BlockableUI {\n /**\n * Header of the card.\n * @group Props\n */\n @Input() header: string | undefined;\n @Input() activeCard: boolean;\n @Input() imageUrl: string;\n @Input() badgeSeverity: 'success' | 'info' | 'warning' | 'danger' | 'help' | 'primary' | 'secondary' | 'contrast' | null | undefined;\n @Input() badgeValue: string | number | null | undefined = 'Active';\n @Input() iconClass!: string;\n\n /**\n * Subheader of the card.\n * @group Props\n */\n\n @Input() subheader: string | undefined;\n /**\n * Inline style of the element.\n * @group Props\n */\n\n @Input() set style(value: { [klass: string]: any } | null | undefined) {\n if (!ObjectUtils.equals(this._style(), value)) {\n this._style.set(value);\n }\n }\n /**\n * Class of the element.\n * @group Props\n */\n @Input() styleClass: string | undefined;\n\n @ContentChild(Header) headerFacet: TemplateRef<any> | undefined;\n\n @ContentChild(Footer) footerFacet: TemplateRef<any> | undefined;\n\n @ContentChildren(CaxTemplate) templates: QueryList<CaxTemplate> | undefined;\n\n headerTemplate: TemplateRef<any> | undefined;\n\n titleTemplate: TemplateRef<any> | undefined;\n\n subtitleTemplate: TemplateRef<any> | undefined;\n\n contentTemplate: TemplateRef<any> | undefined;\n\n footerTemplate: TemplateRef<any> | undefined;\n\n _style = signal<{ [klass: string]: any } | null | undefined>(null);\n\n constructor(private el: ElementRef) {}\n\n ngAfterContentInit() {\n (this.templates as QueryList<CaxTemplate>).forEach((item) => {\n switch (item.getType()) {\n case 'header':\n this.headerTemplate = item.template;\n break;\n\n case 'title':\n this.titleTemplate = item.template;\n break;\n\n case 'subtitle':\n this.subtitleTemplate = item.template;\n break;\n\n case 'content':\n this.contentTemplate = item.template;\n break;\n\n case 'footer':\n this.footerTemplate = item.template;\n break;\n\n default:\n this.contentTemplate = item.template;\n break;\n }\n });\n }\n\n getBlockableElement(): HTMLElement {\n return this.el.nativeElement.children[0];\n }\n}\n","<div [ngClass]=\"'cax-card cax-component'\" [ngStyle]=\"_style()\" [class]=\"styleClass\" [attr.data-pc-name]=\"'card'\">\r\n <div [ngClass]=\"{\r\n 'cax-card-header': true,\r\n 'cax-card-header-no-padding': !header && !headerTemplate && !imageUrl && !iconClass && activeCard,\r\n 'cax-card-header-default-padding': (header || headerTemplate || imageUrl || iconClass) && !(!iconClass && !imageUrl),\r\n 'cax-card-header-with-image': imageUrl && !iconClass,\r\n 'cax-card-header-with-icon': iconClass && !imageUrl\r\n\r\n }\" *ngIf=\"header || headerTemplate || iconClass || imageUrl || activeCard\">\r\n <ng-content select=\"cax-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n <i [class]=\"iconClass\" *ngIf=\"!imageUrl\"></i>\r\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" alt=\"Card\" />\r\n <div *ngIf=\"activeCard\">\r\n <cax-badge\r\n [value]=\"badgeValue\"\r\n [severity]=\"badgeSeverity\">\r\n </cax-badge>\r\n </div>\r\n </div>\r\n <div class=\"cax-card-body\">\r\n <div class=\"cax-card-title\" *ngIf=\"header || titleTemplate\">\r\n {{ header }}\r\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-subtitle\" *ngIf=\"subheader || subtitleTemplate\">\r\n {{ subheader }}\r\n <ng-container *ngTemplateOutlet=\"subtitleTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-content\">\r\n <ng-content></ng-content>\r\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\r\n </div>\r\n <div class=\"cax-card-footer\" *ngIf=\"footerFacet || footerTemplate\">\r\n <ng-content select=\"cax-footer\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SharedModule } from 'cax-design-system/api';\nimport { Card } from './card';\nimport { Button, ButtonModule } from 'cax-design-system/button';\nimport { BadgeModule } from 'cax-design-system/badge';\n\n@NgModule({\n imports: [Button, CommonModule, SharedModule, ButtonModule, BadgeModule],\n declarations: [Card],\n exports: [Card, SharedModule]\n})\nexport class CardModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}