cloud-ide-element 0.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +30 -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
@@ -0,0 +1,521 @@
1
+ import { Component, Input, Output, EventEmitter, signal, computed, inject, DestroyRef, forwardRef, viewChild } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { FormsModule } from '@angular/forms';
5
+ import * as i0 from "@angular/core";
6
+ export class CideEleJsonEditorComponent {
7
+ constructor() {
8
+ this.required = false;
9
+ this.disabled = signal(false);
10
+ this.showCharacterCount = false;
11
+ this.config = {};
12
+ this.configSignal = signal({});
13
+ // Outputs
14
+ this.valueChange = new EventEmitter();
15
+ this.objectChange = new EventEmitter();
16
+ this.errorsChange = new EventEmitter();
17
+ this.validChange = new EventEmitter();
18
+ // ViewChild
19
+ this.jsonTextarea = viewChild.required('jsonTextarea');
20
+ // Dependency injection
21
+ this.destroyRef = inject(DestroyRef);
22
+ // Internal state
23
+ this.jsonString = signal('');
24
+ this.jsonObject = signal(null);
25
+ this.errors = signal([]);
26
+ this.editorId = `json-editor-${Math.random().toString(36).substr(2, 9)}`;
27
+ // Computed values
28
+ this.hasErrors = computed(() => this.errors().length > 0);
29
+ this.isValid = computed(() => !this.hasErrors() && this.jsonObject() !== null);
30
+ this.lineNumbers = computed(() => {
31
+ const lines = this.jsonString().split('\n');
32
+ return Array.from({ length: Math.max(lines.length, 1) }, (_, i) => i + 1);
33
+ });
34
+ this.containerClass = computed(() => {
35
+ const classes = ['tw-w-full'];
36
+ if (this.disabled()) {
37
+ classes.push('tw-opacity-50');
38
+ }
39
+ return classes.join(' ');
40
+ });
41
+ // Default configuration
42
+ this.defaultConfig = {
43
+ syntaxHighlighting: true,
44
+ showLineNumbers: true,
45
+ autoFormat: true,
46
+ validateOnChange: true,
47
+ theme: 'light',
48
+ minHeight: 120,
49
+ maxHeight: 400,
50
+ placeholder: 'Enter JSON configuration...',
51
+ readOnly: false,
52
+ showErrors: true
53
+ };
54
+ this.onChange = () => { };
55
+ this.onTouched = () => { };
56
+ }
57
+ ngOnInit() {
58
+ // Merge default config with input config
59
+ const mergedConfig = { ...this.defaultConfig, ...this.config };
60
+ this.configSignal.set(mergedConfig);
61
+ // Initial validation
62
+ if (mergedConfig.validateOnChange && this.jsonString()) {
63
+ this.validateJson();
64
+ }
65
+ }
66
+ /**
67
+ * Handle input changes
68
+ */
69
+ onInput(event) {
70
+ const target = event.target;
71
+ const value = target.value;
72
+ this.jsonString.set(value);
73
+ this.valueChange.emit(value);
74
+ // Call ControlValueAccessor onChange callback
75
+ this.onChange(value);
76
+ if (this.configSignal().validateOnChange) {
77
+ this.validateJson();
78
+ }
79
+ this.parseJson(value);
80
+ }
81
+ /**
82
+ * Handle blur event
83
+ */
84
+ onBlur() {
85
+ // Call ControlValueAccessor onTouched callback
86
+ this.onTouched();
87
+ if (this.configSignal().autoFormat && this.isValid()) {
88
+ this.formatJson();
89
+ }
90
+ }
91
+ /**
92
+ * Parse JSON string and emit object
93
+ */
94
+ parseJson(jsonStr) {
95
+ if (!jsonStr.trim()) {
96
+ this.jsonObject.set(null);
97
+ this.objectChange.emit(null);
98
+ return;
99
+ }
100
+ try {
101
+ const parsed = JSON.parse(jsonStr);
102
+ this.jsonObject.set(parsed);
103
+ this.objectChange.emit(parsed);
104
+ }
105
+ catch (error) {
106
+ // Error will be handled by validateJson
107
+ this.jsonObject.set(null);
108
+ this.objectChange.emit(null);
109
+ }
110
+ }
111
+ /**
112
+ * Validate JSON and update errors
113
+ */
114
+ validateJson() {
115
+ const jsonStr = this.jsonString();
116
+ const newErrors = [];
117
+ if (!jsonStr.trim()) {
118
+ this.errors.set(newErrors);
119
+ this.errorsChange.emit(newErrors);
120
+ this.validChange.emit(true);
121
+ return;
122
+ }
123
+ try {
124
+ JSON.parse(jsonStr);
125
+ // JSON is valid
126
+ this.errors.set(newErrors);
127
+ this.errorsChange.emit(newErrors);
128
+ this.validChange.emit(true);
129
+ }
130
+ catch (error) {
131
+ // Parse error - extract line and column information
132
+ const errorMessage = error.message;
133
+ const lineMatch = errorMessage.match(/position (\d+)/);
134
+ if (lineMatch) {
135
+ const position = parseInt(lineMatch[1]);
136
+ const lines = jsonStr.substring(0, position).split('\n');
137
+ const line = lines.length;
138
+ const column = lines[lines.length - 1].length + 1;
139
+ newErrors.push({
140
+ line,
141
+ column,
142
+ message: 'Invalid JSON syntax',
143
+ type: 'syntax'
144
+ });
145
+ }
146
+ else {
147
+ newErrors.push({
148
+ line: 1,
149
+ column: 1,
150
+ message: 'Invalid JSON format',
151
+ type: 'syntax'
152
+ });
153
+ }
154
+ this.errors.set(newErrors);
155
+ this.errorsChange.emit(newErrors);
156
+ this.validChange.emit(false);
157
+ }
158
+ }
159
+ /**
160
+ * Format JSON with proper indentation
161
+ */
162
+ formatJson() {
163
+ if (!this.jsonString().trim()) {
164
+ return;
165
+ }
166
+ try {
167
+ const parsed = JSON.parse(this.jsonString());
168
+ const formatted = JSON.stringify(parsed, null, 2);
169
+ this.jsonString.set(formatted);
170
+ this.valueChange.emit(formatted);
171
+ this.jsonObject.set(parsed);
172
+ this.objectChange.emit(parsed);
173
+ this.errors.set([]);
174
+ this.errorsChange.emit([]);
175
+ this.validChange.emit(true);
176
+ }
177
+ catch (error) {
178
+ // Don't format if JSON is invalid
179
+ console.warn('Cannot format invalid JSON');
180
+ }
181
+ }
182
+ /**
183
+ * Check if there's an error on a specific line
184
+ */
185
+ hasErrorOnLine(line) {
186
+ return this.errors().some(error => error.line === line);
187
+ }
188
+ /**
189
+ * Get error ID for accessibility
190
+ */
191
+ errorId() {
192
+ return `${this.editorId}-errors`;
193
+ }
194
+ /**
195
+ * Focus the editor
196
+ */
197
+ focus() {
198
+ this.jsonTextarea().nativeElement.focus();
199
+ }
200
+ /**
201
+ * Clear the editor
202
+ */
203
+ clear() {
204
+ this.jsonString.set('');
205
+ this.jsonObject.set(null);
206
+ this.errors.set([]);
207
+ this.valueChange.emit('');
208
+ this.objectChange.emit(null);
209
+ this.errorsChange.emit([]);
210
+ this.validChange.emit(true);
211
+ }
212
+ /**
213
+ * Get current JSON object
214
+ */
215
+ getValue() {
216
+ return this.jsonObject();
217
+ }
218
+ /**
219
+ * Get current JSON string
220
+ */
221
+ getStringValue() {
222
+ return this.jsonString();
223
+ }
224
+ /**
225
+ * Check if JSON is valid
226
+ */
227
+ isValidJson() {
228
+ return this.isValid();
229
+ }
230
+ /**
231
+ * Get validation errors
232
+ */
233
+ getErrors() {
234
+ return this.errors();
235
+ }
236
+ // ControlValueAccessor methods
237
+ writeValue(value) {
238
+ if (value === null || value === undefined) {
239
+ this.jsonString.set('');
240
+ this.jsonObject.set(null);
241
+ }
242
+ else if (typeof value === 'string') {
243
+ this.jsonString.set(value);
244
+ this.parseJson(value);
245
+ }
246
+ else if (typeof value === 'object') {
247
+ this.jsonObject.set(value);
248
+ this.jsonString.set(JSON.stringify(value, null, 2));
249
+ }
250
+ }
251
+ registerOnChange(fn) {
252
+ this.onChange = fn;
253
+ }
254
+ registerOnTouched(fn) {
255
+ this.onTouched = fn;
256
+ }
257
+ setDisabledState(isDisabled) {
258
+ this.disabled.set(isDisabled);
259
+ }
260
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleJsonEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
261
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: CideEleJsonEditorComponent, isStandalone: true, selector: "cide-ele-json-editor", inputs: { label: "label", helperText: "helperText", required: "required", disabled: "disabled", showCharacterCount: "showCharacterCount", config: "config" }, outputs: { valueChange: "valueChange", objectChange: "objectChange", errorsChange: "errorsChange", validChange: "validChange" }, providers: [
262
+ {
263
+ provide: NG_VALUE_ACCESSOR,
264
+ useExisting: forwardRef(() => CideEleJsonEditorComponent),
265
+ multi: true
266
+ }
267
+ ], viewQueries: [{ propertyName: "jsonTextarea", first: true, predicate: ["jsonTextarea"], descendants: true, isSignal: true }], ngImport: i0, template: `
268
+ <div class="tw-relative tw-w-full" [class]="containerClass()">
269
+ <!-- Label -->
270
+ @if (label) {
271
+ <label
272
+ [for]="editorId"
273
+ class="tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2"
274
+ [class.tw-text-red-600]="hasErrors()">
275
+ {{ label }}
276
+ @if (required) {
277
+ <span class="tw-text-red-500 tw-ml-1">*</span>
278
+ }
279
+ </label>
280
+ }
281
+
282
+ <!-- Editor Container -->
283
+ <div
284
+ class="tw-relative tw-border tw-rounded-md tw-bg-white tw-overflow-hidden"
285
+ [class.tw-border-red-300]="hasErrors()"
286
+ [class.tw-border-gray-300]="!hasErrors()"
287
+ [class.tw-focus-within:tw-border-blue-500]="!hasErrors()"
288
+ [class.tw-focus-within:tw-ring-1]="!hasErrors()"
289
+ [class.tw-focus-within:tw-ring-blue-500]="!hasErrors()"
290
+ [class.tw-opacity-50]="disabled()"
291
+ [class.tw-cursor-not-allowed]="disabled()">
292
+
293
+ <!-- Line Numbers -->
294
+ @if (configSignal().showLineNumbers) {
295
+ <div
296
+ class="tw-absolute tw-left-0 tw-top-0 tw-bottom-0 tw-w-12 tw-bg-gray-50 tw-border-r tw-border-gray-200 tw-text-xs tw-text-gray-500 tw-font-mono tw-select-none tw-overflow-hidden"
297
+ [class.tw-bg-gray-800]="configSignal().theme === 'dark'"
298
+ [class.tw-border-gray-600]="configSignal().theme === 'dark'"
299
+ [class.tw-text-gray-400]="configSignal().theme === 'dark'">
300
+ @for (line of lineNumbers(); track line) {
301
+ <div
302
+ class="tw-px-2 tw-py-1 tw-text-right"
303
+ [class.tw-bg-red-100]="hasErrorOnLine(line)"
304
+ [class.tw-text-red-600]="hasErrorOnLine(line)"
305
+ [class.tw-bg-red-900]="configSignal().theme === 'dark' && hasErrorOnLine(line)"
306
+ [class.tw-text-red-400]="configSignal().theme === 'dark' && hasErrorOnLine(line)">
307
+ {{ line }}
308
+ </div>
309
+ }
310
+ </div>
311
+ }
312
+
313
+ <!-- Textarea -->
314
+ <textarea
315
+ #jsonTextarea
316
+ [id]="editorId"
317
+ [value]="jsonString()"
318
+ (input)="onInput($event)"
319
+ (blur)="onBlur()"
320
+ [placeholder]="configSignal().placeholder || 'Enter JSON configuration...'"
321
+ [readonly]="configSignal().readOnly || disabled()"
322
+ [disabled]="disabled()"
323
+ class="tw-w-full tw-p-3 tw-text-sm tw-font-mono tw-leading-relaxed tw-resize-none tw-outline-none tw-bg-transparent"
324
+ [class.tw-pl-12]="configSignal().showLineNumbers"
325
+ [class.tw-text-gray-900]="configSignal().theme === 'light'"
326
+ [class.tw-text-gray-100]="configSignal().theme === 'dark'"
327
+ [class.tw-bg-gray-900]="configSignal().theme === 'dark'"
328
+ [style.min-height.px]="configSignal().minHeight || 120"
329
+ [style.max-height.px]="configSignal().maxHeight || 400"
330
+ [attr.aria-describedby]="errorId()"
331
+ [attr.aria-invalid]="hasErrors()">
332
+ </textarea>
333
+
334
+ <!-- Format Button -->
335
+ @if (!configSignal().readOnly && !disabled()) {
336
+ <button
337
+ type="button"
338
+ (click)="formatJson()"
339
+ class="tw-absolute tw-top-2 tw-right-2 tw-p-1 tw-text-gray-400 hover:tw-text-gray-600 tw-rounded tw-transition-colors"
340
+ [class.tw-text-gray-500]="configSignal().theme === 'dark'"
341
+ [class.hover:tw-text-gray-300]="configSignal().theme === 'dark'"
342
+ title="Format JSON">
343
+ <svg class="tw-w-4 tw-h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
344
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h7"></path>
345
+ </svg>
346
+ </button>
347
+ }
348
+ </div>
349
+
350
+ <!-- Helper Text -->
351
+ @if (helperText && !hasErrors()) {
352
+ <p class="tw-mt-1 tw-text-xs tw-text-gray-500">{{ helperText }}</p>
353
+ }
354
+
355
+ <!-- Error Messages -->
356
+ @if (configSignal().showErrors && hasErrors()) {
357
+ <div [id]="errorId()" class="tw-mt-1 tw-space-y-1">
358
+ @for (error of errors(); track error.line + '-' + error.column) {
359
+ <p class="tw-text-xs tw-text-red-600 tw-flex tw-items-start tw-gap-1">
360
+ <svg class="tw-w-3 tw-h-3 tw-mt-0.5 tw-flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
361
+ <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z" clip-rule="evenodd"></path>
362
+ </svg>
363
+ <span>
364
+ Line {{ error.line }}, Column {{ error.column }}: {{ error.message }}
365
+ </span>
366
+ </p>
367
+ }
368
+ </div>
369
+ }
370
+
371
+ <!-- Character Count -->
372
+ @if (showCharacterCount) {
373
+ <p class="tw-mt-1 tw-text-xs tw-text-gray-400 tw-text-right">
374
+ {{ jsonString().length }} characters
375
+ </p>
376
+ }
377
+ </div>
378
+ `, isInline: true, styles: [":host{display:block}textarea{font-family:Monaco,Menlo,Ubuntu Mono,monospace;tab-size:2}textarea:focus{box-shadow:none}.tw-cursor-not-allowed{cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }] }); }
379
+ }
380
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleJsonEditorComponent, decorators: [{
381
+ type: Component,
382
+ args: [{ selector: 'cide-ele-json-editor', standalone: true, imports: [CommonModule, FormsModule], template: `
383
+ <div class="tw-relative tw-w-full" [class]="containerClass()">
384
+ <!-- Label -->
385
+ @if (label) {
386
+ <label
387
+ [for]="editorId"
388
+ class="tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2"
389
+ [class.tw-text-red-600]="hasErrors()">
390
+ {{ label }}
391
+ @if (required) {
392
+ <span class="tw-text-red-500 tw-ml-1">*</span>
393
+ }
394
+ </label>
395
+ }
396
+
397
+ <!-- Editor Container -->
398
+ <div
399
+ class="tw-relative tw-border tw-rounded-md tw-bg-white tw-overflow-hidden"
400
+ [class.tw-border-red-300]="hasErrors()"
401
+ [class.tw-border-gray-300]="!hasErrors()"
402
+ [class.tw-focus-within:tw-border-blue-500]="!hasErrors()"
403
+ [class.tw-focus-within:tw-ring-1]="!hasErrors()"
404
+ [class.tw-focus-within:tw-ring-blue-500]="!hasErrors()"
405
+ [class.tw-opacity-50]="disabled()"
406
+ [class.tw-cursor-not-allowed]="disabled()">
407
+
408
+ <!-- Line Numbers -->
409
+ @if (configSignal().showLineNumbers) {
410
+ <div
411
+ class="tw-absolute tw-left-0 tw-top-0 tw-bottom-0 tw-w-12 tw-bg-gray-50 tw-border-r tw-border-gray-200 tw-text-xs tw-text-gray-500 tw-font-mono tw-select-none tw-overflow-hidden"
412
+ [class.tw-bg-gray-800]="configSignal().theme === 'dark'"
413
+ [class.tw-border-gray-600]="configSignal().theme === 'dark'"
414
+ [class.tw-text-gray-400]="configSignal().theme === 'dark'">
415
+ @for (line of lineNumbers(); track line) {
416
+ <div
417
+ class="tw-px-2 tw-py-1 tw-text-right"
418
+ [class.tw-bg-red-100]="hasErrorOnLine(line)"
419
+ [class.tw-text-red-600]="hasErrorOnLine(line)"
420
+ [class.tw-bg-red-900]="configSignal().theme === 'dark' && hasErrorOnLine(line)"
421
+ [class.tw-text-red-400]="configSignal().theme === 'dark' && hasErrorOnLine(line)">
422
+ {{ line }}
423
+ </div>
424
+ }
425
+ </div>
426
+ }
427
+
428
+ <!-- Textarea -->
429
+ <textarea
430
+ #jsonTextarea
431
+ [id]="editorId"
432
+ [value]="jsonString()"
433
+ (input)="onInput($event)"
434
+ (blur)="onBlur()"
435
+ [placeholder]="configSignal().placeholder || 'Enter JSON configuration...'"
436
+ [readonly]="configSignal().readOnly || disabled()"
437
+ [disabled]="disabled()"
438
+ class="tw-w-full tw-p-3 tw-text-sm tw-font-mono tw-leading-relaxed tw-resize-none tw-outline-none tw-bg-transparent"
439
+ [class.tw-pl-12]="configSignal().showLineNumbers"
440
+ [class.tw-text-gray-900]="configSignal().theme === 'light'"
441
+ [class.tw-text-gray-100]="configSignal().theme === 'dark'"
442
+ [class.tw-bg-gray-900]="configSignal().theme === 'dark'"
443
+ [style.min-height.px]="configSignal().minHeight || 120"
444
+ [style.max-height.px]="configSignal().maxHeight || 400"
445
+ [attr.aria-describedby]="errorId()"
446
+ [attr.aria-invalid]="hasErrors()">
447
+ </textarea>
448
+
449
+ <!-- Format Button -->
450
+ @if (!configSignal().readOnly && !disabled()) {
451
+ <button
452
+ type="button"
453
+ (click)="formatJson()"
454
+ class="tw-absolute tw-top-2 tw-right-2 tw-p-1 tw-text-gray-400 hover:tw-text-gray-600 tw-rounded tw-transition-colors"
455
+ [class.tw-text-gray-500]="configSignal().theme === 'dark'"
456
+ [class.hover:tw-text-gray-300]="configSignal().theme === 'dark'"
457
+ title="Format JSON">
458
+ <svg class="tw-w-4 tw-h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
459
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h7"></path>
460
+ </svg>
461
+ </button>
462
+ }
463
+ </div>
464
+
465
+ <!-- Helper Text -->
466
+ @if (helperText && !hasErrors()) {
467
+ <p class="tw-mt-1 tw-text-xs tw-text-gray-500">{{ helperText }}</p>
468
+ }
469
+
470
+ <!-- Error Messages -->
471
+ @if (configSignal().showErrors && hasErrors()) {
472
+ <div [id]="errorId()" class="tw-mt-1 tw-space-y-1">
473
+ @for (error of errors(); track error.line + '-' + error.column) {
474
+ <p class="tw-text-xs tw-text-red-600 tw-flex tw-items-start tw-gap-1">
475
+ <svg class="tw-w-3 tw-h-3 tw-mt-0.5 tw-flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
476
+ <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z" clip-rule="evenodd"></path>
477
+ </svg>
478
+ <span>
479
+ Line {{ error.line }}, Column {{ error.column }}: {{ error.message }}
480
+ </span>
481
+ </p>
482
+ }
483
+ </div>
484
+ }
485
+
486
+ <!-- Character Count -->
487
+ @if (showCharacterCount) {
488
+ <p class="tw-mt-1 tw-text-xs tw-text-gray-400 tw-text-right">
489
+ {{ jsonString().length }} characters
490
+ </p>
491
+ }
492
+ </div>
493
+ `, providers: [
494
+ {
495
+ provide: NG_VALUE_ACCESSOR,
496
+ useExisting: forwardRef(() => CideEleJsonEditorComponent),
497
+ multi: true
498
+ }
499
+ ], styles: [":host{display:block}textarea{font-family:Monaco,Menlo,Ubuntu Mono,monospace;tab-size:2}textarea:focus{box-shadow:none}.tw-cursor-not-allowed{cursor:not-allowed}\n"] }]
500
+ }], propDecorators: { label: [{
501
+ type: Input
502
+ }], helperText: [{
503
+ type: Input
504
+ }], required: [{
505
+ type: Input
506
+ }], disabled: [{
507
+ type: Input
508
+ }], showCharacterCount: [{
509
+ type: Input
510
+ }], config: [{
511
+ type: Input
512
+ }], valueChange: [{
513
+ type: Output
514
+ }], objectChange: [{
515
+ type: Output
516
+ }], errorsChange: [{
517
+ type: Output
518
+ }], validChange: [{
519
+ type: Output
520
+ }] } });
521
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xvdWQtaWRlLWVsZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL2pzb24tZWRpdG9yL2pzb24tZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFzQixNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUE4SzdDLE1BQU0sT0FBTywwQkFBMEI7SUE5SXZDO1FBa0pXLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6Qix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsV0FBTSxHQUFxQixFQUFFLENBQUM7UUFDdkMsaUJBQVksR0FBRyxNQUFNLENBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBRTVDLFVBQVU7UUFDQSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDekMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUNqRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQ3JELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVwRCxZQUFZO1FBQ1osaUJBQVksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFrQyxjQUFjLENBQUMsQ0FBQztRQUVuRix1QkFBdUI7UUFD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Ozs7Ozs7Ozs7R0ErR1QsYUFtQlU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMkJBQTJCLENBQUM7NEJBQ3pELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhCQUlRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUlJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBFbGVtZW50UmVmLCBzaWduYWwsIGNvbXB1dGVkLCBpbmplY3QsIERlc3Ryb3lSZWYsIGZvcndhcmRSZWYsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBKc29uRWRpdG9yQ29uZmlnIHtcclxuICAvKiogRW5hYmxlIHN5bnRheCBoaWdobGlnaHRpbmcgKi9cclxuICBzeW50YXhIaWdobGlnaHRpbmc/OiBib29sZWFuO1xyXG4gIC8qKiBFbmFibGUgbGluZSBudW1iZXJzICovXHJcbiAgc2hvd0xpbmVOdW1iZXJzPzogYm9vbGVhbjtcclxuICAvKiogRW5hYmxlIGF1dG8tZm9ybWF0dGluZyAqL1xyXG4gIGF1dG9Gb3JtYXQ/OiBib29sZWFuO1xyXG4gIC8qKiBFbmFibGUgdmFsaWRhdGlvbiAqL1xyXG4gIHZhbGlkYXRlT25DaGFuZ2U/OiBib29sZWFuO1xyXG4gIC8qKiBUaGVtZSBmb3IgdGhlIGVkaXRvciAqL1xyXG4gIHRoZW1lPzogJ2xpZ2h0JyB8ICdkYXJrJztcclxuICAvKiogTWluaW11bSBoZWlnaHQgaW4gcGl4ZWxzICovXHJcbiAgbWluSGVpZ2h0PzogbnVtYmVyO1xyXG4gIC8qKiBNYXhpbXVtIGhlaWdodCBpbiBwaXhlbHMgKi9cclxuICBtYXhIZWlnaHQ/OiBudW1iZXI7XHJcbiAgLyoqIFBsYWNlaG9sZGVyIHRleHQgKi9cclxuICBwbGFjZWhvbGRlcj86IHN0cmluZztcclxuICAvKiogUmVhZC1vbmx5IG1vZGUgKi9cclxuICByZWFkT25seT86IGJvb2xlYW47XHJcbiAgLyoqIFNob3cgZXJyb3IgbWVzc2FnZXMgKi9cclxuICBzaG93RXJyb3JzPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBKc29uRWRpdG9yRXJyb3Ige1xyXG4gIGxpbmU6IG51bWJlcjtcclxuICBjb2x1bW46IG51bWJlcjtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgdHlwZTogJ3N5bnRheCcgfCAndmFsaWRhdGlvbic7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2lkZS1lbGUtanNvbi1lZGl0b3InLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwidHctcmVsYXRpdmUgdHctdy1mdWxsXCIgW2NsYXNzXT1cImNvbnRhaW5lckNsYXNzKClcIj5cclxuICAgICAgPCEtLSBMYWJlbCAtLT5cclxuICAgICAgQGlmIChsYWJlbCkge1xyXG4gICAgICAgIDxsYWJlbCBcclxuICAgICAgICAgIFtmb3JdPVwiZWRpdG9ySWRcIiBcclxuICAgICAgICAgIGNsYXNzPVwidHctYmxvY2sgdHctdGV4dC1zbSB0dy1mb250LW1lZGl1bSB0dy10ZXh0LWdyYXktNzAwIHR3LW1iLTJcIlxyXG4gICAgICAgICAgW2NsYXNzLnR3LXRleHQtcmVkLTYwMF09XCJoYXNFcnJvcnMoKVwiPlxyXG4gICAgICAgICAge3sgbGFiZWwgfX1cclxuICAgICAgICAgIEBpZiAocmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0dy10ZXh0LXJlZC01MDAgdHctbWwtMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgfVxyXG5cclxuICAgICAgPCEtLSBFZGl0b3IgQ29udGFpbmVyIC0tPlxyXG4gICAgICA8ZGl2IFxyXG4gICAgICAgIGNsYXNzPVwidHctcmVsYXRpdmUgdHctYm9yZGVyIHR3LXJvdW5kZWQtbWQgdHctYmctd2hpdGUgdHctb3ZlcmZsb3ctaGlkZGVuXCJcclxuICAgICAgICBbY2xhc3MudHctYm9yZGVyLXJlZC0zMDBdPVwiaGFzRXJyb3JzKClcIlxyXG4gICAgICAgIFtjbGFzcy50dy1ib3JkZXItZ3JheS0zMDBdPVwiIWhhc0Vycm9ycygpXCJcclxuICAgICAgICBbY2xhc3MudHctZm9jdXMtd2l0aGluOnR3LWJvcmRlci1ibHVlLTUwMF09XCIhaGFzRXJyb3JzKClcIlxyXG4gICAgICAgIFtjbGFzcy50dy1mb2N1cy13aXRoaW46dHctcmluZy0xXT1cIiFoYXNFcnJvcnMoKVwiXHJcbiAgICAgICAgW2NsYXNzLnR3LWZvY3VzLXdpdGhpbjp0dy1yaW5nLWJsdWUtNTAwXT1cIiFoYXNFcnJvcnMoKVwiXHJcbiAgICAgICAgW2NsYXNzLnR3LW9wYWNpdHktNTBdPVwiZGlzYWJsZWQoKVwiXHJcbiAgICAgICAgW2NsYXNzLnR3LWN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPCEtLSBMaW5lIE51bWJlcnMgLS0+XHJcbiAgICAgICAgQGlmIChjb25maWdTaWduYWwoKS5zaG93TGluZU51bWJlcnMpIHtcclxuICAgICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgdHctbGVmdC0wIHR3LXRvcC0wIHR3LWJvdHRvbS0wIHR3LXctMTIgdHctYmctZ3JheS01MCB0dy1ib3JkZXItciB0dy1ib3JkZXItZ3JheS0yMDAgdHctdGV4dC14cyB0dy10ZXh0LWdyYXktNTAwIHR3LWZvbnQtbW9ubyB0dy1zZWxlY3Qtbm9uZSB0dy1vdmVyZmxvdy1oaWRkZW5cIlxyXG4gICAgICAgICAgICBbY2xhc3MudHctYmctZ3JheS04MDBdPVwiY29uZmlnU2lnbmFsKCkudGhlbWUgPT09ICdkYXJrJ1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy50dy1ib3JkZXItZ3JheS02MDBdPVwiY29uZmlnU2lnbmFsKCkudGhlbWUgPT09ICdkYXJrJ1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy50dy10ZXh0LWdyYXktNDAwXT1cImNvbmZpZ1NpZ25hbCgpLnRoZW1lID09PSAnZGFyaydcIj5cclxuICAgICAgICAgICAgQGZvciAobGluZSBvZiBsaW5lTnVtYmVycygpOyB0cmFjayBsaW5lKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctcHgtMiB0dy1weS0xIHR3LXRleHQtcmlnaHRcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLnR3LWJnLXJlZC0xMDBdPVwiaGFzRXJyb3JPbkxpbmUobGluZSlcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLnR3LXRleHQtcmVkLTYwMF09XCJoYXNFcnJvck9uTGluZShsaW5lKVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudHctYmctcmVkLTkwMF09XCJjb25maWdTaWduYWwoKS50aGVtZSA9PT0gJ2RhcmsnICYmIGhhc0Vycm9yT25MaW5lKGxpbmUpXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy50dy10ZXh0LXJlZC00MDBdPVwiY29uZmlnU2lnbmFsKCkudGhlbWUgPT09ICdkYXJrJyAmJiBoYXNFcnJvck9uTGluZShsaW5lKVwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGluZSB9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDwhLS0gVGV4dGFyZWEgLS0+XHJcbiAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAjanNvblRleHRhcmVhXHJcbiAgICAgICAgICBbaWRdPVwiZWRpdG9ySWRcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImpzb25TdHJpbmcoKVwiXHJcbiAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb25maWdTaWduYWwoKS5wbGFjZWhvbGRlciB8fCAnRW50ZXIgSlNPTiBjb25maWd1cmF0aW9uLi4uJ1wiXHJcbiAgICAgICAgICBbcmVhZG9ubHldPVwiY29uZmlnU2lnbmFsKCkucmVhZE9ubHkgfHwgZGlzYWJsZWQoKVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXHJcbiAgICAgICAgICBjbGFzcz1cInR3LXctZnVsbCB0dy1wLTMgdHctdGV4dC1zbSB0dy1mb250LW1vbm8gdHctbGVhZGluZy1yZWxheGVkIHR3LXJlc2l6ZS1ub25lIHR3LW91dGxpbmUtbm9uZSB0dy1iZy10cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICBbY2xhc3MudHctcGwtMTJdPVwiY29uZmlnU2lnbmFsKCkuc2hvd0xpbmVOdW1iZXJzXCJcclxuICAgICAgICAgIFtjbGFzcy50dy10ZXh0LWdyYXktOTAwXT1cImNvbmZpZ1NpZ25hbCgpLnRoZW1lID09PSAnbGlnaHQnXCJcclxuICAgICAgICAgIFtjbGFzcy50dy10ZXh0LWdyYXktMTAwXT1cImNvbmZpZ1NpZ25hbCgpLnRoZW1lID09PSAnZGFyaydcIlxyXG4gICAgICAgICAgW2NsYXNzLnR3LWJnLWdyYXktOTAwXT1cImNvbmZpZ1NpZ25hbCgpLnRoZW1lID09PSAnZGFyaydcIlxyXG4gICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiY29uZmlnU2lnbmFsKCkubWluSGVpZ2h0IHx8IDEyMFwiXHJcbiAgICAgICAgICBbc3R5bGUubWF4LWhlaWdodC5weF09XCJjb25maWdTaWduYWwoKS5tYXhIZWlnaHQgfHwgNDAwXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZXJyb3JJZCgpXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJoYXNFcnJvcnMoKVwiPlxyXG4gICAgICAgIDwvdGV4dGFyZWE+XHJcblxyXG4gICAgICAgIDwhLS0gRm9ybWF0IEJ1dHRvbiAtLT5cclxuICAgICAgICBAaWYgKCFjb25maWdTaWduYWwoKS5yZWFkT25seSAmJiAhZGlzYWJsZWQoKSkge1xyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdEpzb24oKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgdHctdG9wLTIgdHctcmlnaHQtMiB0dy1wLTEgdHctdGV4dC1ncmF5LTQwMCBob3Zlcjp0dy10ZXh0LWdyYXktNjAwIHR3LXJvdW5kZWQgdHctdHJhbnNpdGlvbi1jb2xvcnNcIlxyXG4gICAgICAgICAgICBbY2xhc3MudHctdGV4dC1ncmF5LTUwMF09XCJjb25maWdTaWduYWwoKS50aGVtZSA9PT0gJ2RhcmsnXCJcclxuICAgICAgICAgICAgW2NsYXNzLmhvdmVyOnR3LXRleHQtZ3JheS0zMDBdPVwiY29uZmlnU2lnbmFsKCkudGhlbWUgPT09ICdkYXJrJ1wiXHJcbiAgICAgICAgICAgIHRpdGxlPVwiRm9ybWF0IEpTT05cIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInR3LXctNCB0dy1oLTRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk00IDZoMTZNNCAxMmgxNk00IDE4aDdcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gSGVscGVyIFRleHQgLS0+XHJcbiAgICAgIEBpZiAoaGVscGVyVGV4dCAmJiAhaGFzRXJyb3JzKCkpIHtcclxuICAgICAgICA8cCBjbGFzcz1cInR3LW10LTEgdHctdGV4dC14cyB0dy10ZXh0LWdyYXktNTAwXCI+e3sgaGVscGVyVGV4dCB9fTwvcD5cclxuICAgICAgfVxyXG5cclxuICAgICAgPCEtLSBFcnJvciBNZXNzYWdlcyAtLT5cclxuICAgICAgQGlmIChjb25maWdTaWduYWwoKS5zaG93RXJyb3JzICYmIGhhc0Vycm9ycygpKSB7XHJcbiAgICAgICAgPGRpdiBbaWRdPVwiZXJyb3JJZCgpXCIgY2xhc3M9XCJ0dy1tdC0xIHR3LXNwYWNlLXktMVwiPlxyXG4gICAgICAgICAgQGZvciAoZXJyb3Igb2YgZXJyb3JzKCk7IHRyYWNrIGVycm9yLmxpbmUgKyAnLScgKyBlcnJvci5jb2x1bW4pIHtcclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LXhzIHR3LXRleHQtcmVkLTYwMCB0dy1mbGV4IHR3LWl0ZW1zLXN0YXJ0IHR3LWdhcC0xXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInR3LXctMyB0dy1oLTMgdHctbXQtMC41IHR3LWZsZXgtc2hyaW5rLTBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTggMTBhOCA4IDAgMTEtMTYgMCA4IDggMCAwMTE2IDB6bS03IDRhMSAxIDAgMTEtMiAwIDEgMSAwIDAxMiAwem0tMS05YTEgMSAwIDAwLTEgMXY0YTEgMSAwIDEwMiAwVjZhMSAxIDAgMDAtMS0xelwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICBMaW5lIHt7IGVycm9yLmxpbmUgfX0sIENvbHVtbiB7eyBlcnJvci5jb2x1bW4gfX06IHt7IGVycm9yLm1lc3NhZ2UgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPCEtLSBDaGFyYWN0ZXIgQ291bnQgLS0+XHJcbiAgICAgIEBpZiAoc2hvd0NoYXJhY3RlckNvdW50KSB7XHJcbiAgICAgICAgPHAgY2xhc3M9XCJ0dy1tdC0xIHR3LXRleHQteHMgdHctdGV4dC1ncmF5LTQwMCB0dy10ZXh0LXJpZ2h0XCI+XHJcbiAgICAgICAgICB7eyBqc29uU3RyaW5nKCkubGVuZ3RoIH19IGNoYXJhY3RlcnNcclxuICAgICAgICA8L3A+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYFxyXG4gICAgOmhvc3Qge1xyXG4gICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGV4dGFyZWEge1xyXG4gICAgICBmb250LWZhbWlseTogJ01vbmFjbycsICdNZW5sbycsICdVYnVudHUgTW9ubycsIG1vbm9zcGFjZTtcclxuICAgICAgdGFiLXNpemU6IDI7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRleHRhcmVhOmZvY3VzIHtcclxuICAgICAgYm94LXNoYWRvdzogbm9uZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLnR3LWN1cnNvci1ub3QtYWxsb3dlZCB7XHJcbiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XHJcbiAgICB9XHJcbiAgYF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaWRlRWxlSnNvbkVkaXRvckNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2lkZUVsZUpzb25FZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICAvLyBJbnB1dHNcclxuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZztcclxuICBASW5wdXQoKSBoZWxwZXJUZXh0Pzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xyXG4gIEBJbnB1dCgpIHNob3dDaGFyYWN0ZXJDb3VudCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNvbmZpZzogSnNvbkVkaXRvckNvbmZpZyA9IHt9O1xyXG4gIGNvbmZpZ1NpZ25hbCA9IHNpZ25hbDxKc29uRWRpdG9yQ29uZmlnPih7fSk7XHJcblxyXG4gIC8vIE91dHB1dHNcclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgb2JqZWN0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3QgfCBudWxsPigpO1xyXG4gIEBPdXRwdXQoKSBlcnJvcnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEpzb25FZGl0b3JFcnJvcltdPigpO1xyXG4gIEBPdXRwdXQoKSB2YWxpZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgLy8gVmlld0NoaWxkXHJcbiAganNvblRleHRhcmVhID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD4+KCdqc29uVGV4dGFyZWEnKTtcclxuXHJcbiAgLy8gRGVwZW5kZW5jeSBpbmplY3Rpb25cclxuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcblxyXG4gIC8vIEludGVybmFsIHN0YXRlXHJcbiAganNvblN0cmluZyA9IHNpZ25hbCgnJyk7XHJcbiAganNvbk9iamVjdCA9IHNpZ25hbDxvYmplY3QgfCBudWxsPihudWxsKTtcclxuICBlcnJvcnMgPSBzaWduYWw8SnNvbkVkaXRvckVycm9yW10+KFtdKTtcclxuICBlZGl0b3JJZCA9IGBqc29uLWVkaXRvci0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gO1xyXG5cclxuICAvLyBDb21wdXRlZCB2YWx1ZXNcclxuICBoYXNFcnJvcnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmVycm9ycygpLmxlbmd0aCA+IDApO1xyXG4gIGlzVmFsaWQgPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5oYXNFcnJvcnMoKSAmJiB0aGlzLmpzb25PYmplY3QoKSAhPT0gbnVsbCk7XHJcbiAgbGluZU51bWJlcnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBsaW5lcyA9IHRoaXMuanNvblN0cmluZygpLnNwbGl0KCdcXG4nKTtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1heChsaW5lcy5sZW5ndGgsIDEpIH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfSk7XHJcbiAgY29udGFpbmVyQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gWyd0dy13LWZ1bGwnXTtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcclxuICAgICAgY2xhc3Nlcy5wdXNoKCd0dy1vcGFjaXR5LTUwJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XHJcbiAgfSk7XHJcblxyXG4gIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxyXG4gIHByaXZhdGUgZGVmYXVsdENvbmZpZzogSnNvbkVkaXRvckNvbmZpZyA9IHtcclxuICAgIHN5bnRheEhpZ2hsaWdodGluZzogdHJ1ZSxcclxuICAgIHNob3dMaW5lTnVtYmVyczogdHJ1ZSxcclxuICAgIGF1dG9Gb3JtYXQ6IHRydWUsXHJcbiAgICB2YWxpZGF0ZU9uQ2hhbmdlOiB0cnVlLFxyXG4gICAgdGhlbWU6ICdsaWdodCcsXHJcbiAgICBtaW5IZWlnaHQ6IDEyMCxcclxuICAgIG1heEhlaWdodDogNDAwLFxyXG4gICAgcGxhY2Vob2xkZXI6ICdFbnRlciBKU09OIGNvbmZpZ3VyYXRpb24uLi4nLFxyXG4gICAgcmVhZE9ubHk6IGZhbHNlLFxyXG4gICAgc2hvd0Vycm9yczogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gTWVyZ2UgZGVmYXVsdCBjb25maWcgd2l0aCBpbnB1dCBjb25maWdcclxuICAgIGNvbnN0IG1lcmdlZENvbmZpZyA9IHsgLi4udGhpcy5kZWZhdWx0Q29uZmlnLCAuLi50aGlzLmNvbmZpZyB9O1xyXG4gICAgdGhpcy5jb25maWdTaWduYWwuc2V0KG1lcmdlZENvbmZpZyk7XHJcbiAgICBcclxuICAgIC8vIEluaXRpYWwgdmFsaWRhdGlvblxyXG4gICAgaWYgKG1lcmdlZENvbmZpZy52YWxpZGF0ZU9uQ2hhbmdlICYmIHRoaXMuanNvblN0cmluZygpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVKc29uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgaW5wdXQgY2hhbmdlc1xyXG4gICAqL1xyXG4gIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0LnZhbHVlO1xyXG4gICAgXHJcbiAgICB0aGlzLmpzb25TdHJpbmcuc2V0KHZhbHVlKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgICBcclxuICAgIC8vIENhbGwgQ29udHJvbFZhbHVlQWNjZXNzb3Igb25DaGFuZ2UgY2FsbGJhY2tcclxuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy5jb25maWdTaWduYWwoKS52YWxpZGF0ZU9uQ2hhbmdlKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVKc29uKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMucGFyc2VKc29uKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBibHVyIGV2ZW50XHJcbiAgICovXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgLy8gQ2FsbCBDb250cm9sVmFsdWVBY2Nlc3NvciBvblRvdWNoZWQgY2FsbGJhY2tcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICBcclxuICAgIGlmICh0aGlzLmNvbmZpZ1NpZ25hbCgpLmF1dG9Gb3JtYXQgJiYgdGhpcy5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy5mb3JtYXRKc29uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXJzZSBKU09OIHN0cmluZyBhbmQgZW1pdCBvYmplY3RcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlSnNvbihqc29uU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghanNvblN0ci50cmltKCkpIHtcclxuICAgICAgdGhpcy5qc29uT2JqZWN0LnNldChudWxsKTtcclxuICAgICAgdGhpcy5vYmplY3RDaGFuZ2UuZW1pdChudWxsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoanNvblN0cik7XHJcbiAgICAgIHRoaXMuanNvbk9iamVjdC5zZXQocGFyc2VkKTtcclxuICAgICAgdGhpcy5vYmplY3RDaGFuZ2UuZW1pdChwYXJzZWQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gRXJyb3Igd2lsbCBiZSBoYW5kbGVkIGJ5IHZhbGlkYXRlSnNvblxyXG4gICAgICB0aGlzLmpzb25PYmplY3Quc2V0KG51bGwpO1xyXG4gICAgICB0aGlzLm9iamVjdENoYW5nZS5lbWl0KG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgSlNPTiBhbmQgdXBkYXRlIGVycm9yc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdmFsaWRhdGVKc29uKCk6IHZvaWQge1xyXG4gICAgY29uc3QganNvblN0ciA9IHRoaXMuanNvblN0cmluZygpO1xyXG4gICAgY29uc3QgbmV3RXJyb3JzOiBKc29uRWRpdG9yRXJyb3JbXSA9IFtdO1xyXG5cclxuICAgIGlmICghanNvblN0ci50cmltKCkpIHtcclxuICAgICAgdGhpcy5lcnJvcnMuc2V0KG5ld0Vycm9ycyk7XHJcbiAgICAgIHRoaXMuZXJyb3JzQ2hhbmdlLmVtaXQobmV3RXJyb3JzKTtcclxuICAgICAgdGhpcy52YWxpZENoYW5nZS5lbWl0KHRydWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgSlNPTi5wYXJzZShqc29uU3RyKTtcclxuICAgICAgLy8gSlNPTiBpcyB2YWxpZFxyXG4gICAgICB0aGlzLmVycm9ycy5zZXQobmV3RXJyb3JzKTtcclxuICAgICAgdGhpcy5lcnJvcnNDaGFuZ2UuZW1pdChuZXdFcnJvcnMpO1xyXG4gICAgICB0aGlzLnZhbGlkQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyBQYXJzZSBlcnJvciAtIGV4dHJhY3QgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uXHJcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IChlcnJvciBhcyBFcnJvcikubWVzc2FnZTtcclxuICAgICAgY29uc3QgbGluZU1hdGNoID0gZXJyb3JNZXNzYWdlLm1hdGNoKC9wb3NpdGlvbiAoXFxkKykvKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChsaW5lTWF0Y2gpIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHBhcnNlSW50KGxpbmVNYXRjaFsxXSk7XHJcbiAgICAgICAgY29uc3QgbGluZXMgPSBqc29uU3RyLnN1YnN0cmluZygwLCBwb3NpdGlvbikuc3BsaXQoJ1xcbicpO1xyXG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lcy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV0ubGVuZ3RoICsgMTtcclxuICAgICAgICBcclxuICAgICAgICBuZXdFcnJvcnMucHVzaCh7XHJcbiAgICAgICAgICBsaW5lLFxyXG4gICAgICAgICAgY29sdW1uLFxyXG4gICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgSlNPTiBzeW50YXgnLFxyXG4gICAgICAgICAgdHlwZTogJ3N5bnRheCdcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXdFcnJvcnMucHVzaCh7XHJcbiAgICAgICAgICBsaW5lOiAxLFxyXG4gICAgICAgICAgY29sdW1uOiAxLFxyXG4gICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgSlNPTiBmb3JtYXQnLFxyXG4gICAgICAgICAgdHlwZTogJ3N5bnRheCdcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhpcy5lcnJvcnMuc2V0KG5ld0Vycm9ycyk7XHJcbiAgICAgIHRoaXMuZXJyb3JzQ2hhbmdlLmVtaXQobmV3RXJyb3JzKTtcclxuICAgICAgdGhpcy52YWxpZENoYW5nZS5lbWl0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvcm1hdCBKU09OIHdpdGggcHJvcGVyIGluZGVudGF0aW9uXHJcbiAgICovXHJcbiAgZm9ybWF0SnNvbigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5qc29uU3RyaW5nKCkudHJpbSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRoaXMuanNvblN0cmluZygpKTtcclxuICAgICAgY29uc3QgZm9ybWF0dGVkID0gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcclxuICAgICAgdGhpcy5qc29uU3RyaW5nLnNldChmb3JtYXR0ZWQpO1xyXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZm9ybWF0dGVkKTtcclxuICAgICAgdGhpcy5qc29uT2JqZWN0LnNldChwYXJzZWQpO1xyXG4gICAgICB0aGlzLm9iamVjdENoYW5nZS5lbWl0KHBhcnNlZCk7XHJcbiAgICAgIHRoaXMuZXJyb3JzLnNldChbXSk7XHJcbiAgICAgIHRoaXMuZXJyb3JzQ2hhbmdlLmVtaXQoW10pO1xyXG4gICAgICB0aGlzLnZhbGlkQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyBEb24ndCBmb3JtYXQgaWYgSlNPTiBpcyBpbnZhbGlkXHJcbiAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IGZvcm1hdCBpbnZhbGlkIEpTT04nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZXJlJ3MgYW4gZXJyb3Igb24gYSBzcGVjaWZpYyBsaW5lXHJcbiAgICovXHJcbiAgaGFzRXJyb3JPbkxpbmUobGluZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMoKS5zb21lKGVycm9yID0+IGVycm9yLmxpbmUgPT09IGxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGVycm9yIElEIGZvciBhY2Nlc3NpYmlsaXR5XHJcbiAgICovXHJcbiAgZXJyb3JJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuZWRpdG9ySWR9LWVycm9yc2A7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb2N1cyB0aGUgZWRpdG9yXHJcbiAgICovXHJcbiAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmpzb25UZXh0YXJlYSgpLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBlZGl0b3JcclxuICAgKi9cclxuICBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuanNvblN0cmluZy5zZXQoJycpO1xyXG4gICAgdGhpcy5qc29uT2JqZWN0LnNldChudWxsKTtcclxuICAgIHRoaXMuZXJyb3JzLnNldChbXSk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoJycpO1xyXG4gICAgdGhpcy5vYmplY3RDaGFuZ2UuZW1pdChudWxsKTtcclxuICAgIHRoaXMuZXJyb3JzQ2hhbmdlLmVtaXQoW10pO1xyXG4gICAgdGhpcy52YWxpZENoYW5nZS5lbWl0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGN1cnJlbnQgSlNPTiBvYmplY3RcclxuICAgKi9cclxuICBnZXRWYWx1ZSgpOiBvYmplY3QgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmpzb25PYmplY3QoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjdXJyZW50IEpTT04gc3RyaW5nXHJcbiAgICovXHJcbiAgZ2V0U3RyaW5nVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmpzb25TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIEpTT04gaXMgdmFsaWRcclxuICAgKi9cclxuICBpc1ZhbGlkSnNvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB2YWxpZGF0aW9uIGVycm9yc1xyXG4gICAqL1xyXG4gIGdldEVycm9ycygpOiBKc29uRWRpdG9yRXJyb3JbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMoKTtcclxuICB9XHJcblxyXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIG1ldGhvZHNcclxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmpzb25TdHJpbmcuc2V0KCcnKTtcclxuICAgICAgdGhpcy5qc29uT2JqZWN0LnNldChudWxsKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0aGlzLmpzb25TdHJpbmcuc2V0KHZhbHVlKTtcclxuICAgICAgdGhpcy5wYXJzZUpzb24odmFsdWUpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHRoaXMuanNvbk9iamVjdC5zZXQodmFsdWUpO1xyXG4gICAgICB0aGlzLmpzb25TdHJpbmcuc2V0KEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQuc2V0KGlzRGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG59ICJdfQ==
@@ -0,0 +1,33 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, Input } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ export class CideEleSkeletonLoaderComponent {
6
+ constructor() {
7
+ this.width = '100%';
8
+ this.height = '1rem';
9
+ this.borderRadius = '0.375rem'; // rounded-md
10
+ this.count = 1;
11
+ this.circle = false;
12
+ this.animation = 'pulse';
13
+ }
14
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleSkeletonLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: CideEleSkeletonLoaderComponent, isStandalone: true, selector: "cide-ele-skeleton-loader", inputs: { width: "width", height: "height", borderRadius: "borderRadius", count: "count", circle: "circle", animation: "animation" }, ngImport: i0, template: "<ng-container *ngFor=\"let i of [].constructor(count)\">\r\n <div\r\n [ngClass]=\"[\r\n 'tw-bg-gray-200',\r\n animation === 'pulse' ? 'tw-animate-pulse' : '',\r\n circle ? 'tw-rounded-full' : 'tw-rounded-md'\r\n ]\"\r\n [style.width]=\"width\"\r\n [style.height]=\"height\"\r\n [style.borderRadius]=\"circle ? '50%' : borderRadius\"\r\n class=\"tw-mb-2\"\r\n ></div>\r\n</ng-container>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); }
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleSkeletonLoaderComponent, decorators: [{
18
+ type: Component,
19
+ args: [{ selector: 'cide-ele-skeleton-loader', standalone: true, imports: [CommonModule], template: "<ng-container *ngFor=\"let i of [].constructor(count)\">\r\n <div\r\n [ngClass]=\"[\r\n 'tw-bg-gray-200',\r\n animation === 'pulse' ? 'tw-animate-pulse' : '',\r\n circle ? 'tw-rounded-full' : 'tw-rounded-md'\r\n ]\"\r\n [style.width]=\"width\"\r\n [style.height]=\"height\"\r\n [style.borderRadius]=\"circle ? '50%' : borderRadius\"\r\n class=\"tw-mb-2\"\r\n ></div>\r\n</ng-container>\r\n" }]
20
+ }], propDecorators: { width: [{
21
+ type: Input
22
+ }], height: [{
23
+ type: Input
24
+ }], borderRadius: [{
25
+ type: Input
26
+ }], count: [{
27
+ type: Input
28
+ }], circle: [{
29
+ type: Input
30
+ }], animation: [{
31
+ type: Input
32
+ }] } });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tlbGV0b24tbG9hZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1lbGVtZW50L3NyYy9saWIvY29tcG9uZW50cy9za2VsZXRvbi1sb2FkZXIvc2tlbGV0b24tbG9hZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1lbGVtZW50L3NyYy9saWIvY29tcG9uZW50cy9za2VsZXRvbi1sb2FkZXIvc2tlbGV0b24tbG9hZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBU2pELE1BQU0sT0FBTyw4QkFBOEI7SUFQM0M7UUFRVyxVQUFLLEdBQVcsTUFBTSxDQUFDO1FBQ3ZCLFdBQU0sR0FBVyxNQUFNLENBQUM7UUFDeEIsaUJBQVksR0FBVyxVQUFVLENBQUMsQ0FBQyxhQUFhO1FBQ2hELFVBQUssR0FBVyxDQUFDLENBQUM7UUFDbEIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixjQUFTLEdBQThCLE9BQU8sQ0FBQztLQUN6RDs4R0FQWSw4QkFBOEI7a0dBQTlCLDhCQUE4QiwwTkNWM0MsMGFBYUEseURETlksWUFBWTs7MkZBR1gsOEJBQThCO2tCQVAxQyxTQUFTOytCQUNFLDBCQUEwQixjQUV4QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUM7OEJBSWQsS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2lkZS1lbGUtc2tlbGV0b24tbG9hZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2tlbGV0b24tbG9hZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gIHN0eWxlVXJsczogWycuL3NrZWxldG9uLWxvYWRlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaWRlRWxlU2tlbGV0b25Mb2FkZXJDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIHdpZHRoOiBzdHJpbmcgPSAnMTAwJSc7XHJcbiAgQElucHV0KCkgaGVpZ2h0OiBzdHJpbmcgPSAnMXJlbSc7XHJcbiAgQElucHV0KCkgYm9yZGVyUmFkaXVzOiBzdHJpbmcgPSAnMC4zNzVyZW0nOyAvLyByb3VuZGVkLW1kXHJcbiAgQElucHV0KCkgY291bnQ6IG51bWJlciA9IDE7XHJcbiAgQElucHV0KCkgY2lyY2xlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgYW5pbWF0aW9uOiAncHVsc2UnIHwgJ3dhdmUnIHwgJ25vbmUnID0gJ3B1bHNlJztcclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpIG9mIFtdLmNvbnN0cnVjdG9yKGNvdW50KVwiPlxyXG4gIDxkaXZcclxuICAgIFtuZ0NsYXNzXT1cIltcclxuICAgICAgJ3R3LWJnLWdyYXktMjAwJyxcclxuICAgICAgYW5pbWF0aW9uID09PSAncHVsc2UnID8gJ3R3LWFuaW1hdGUtcHVsc2UnIDogJycsXHJcbiAgICAgIGNpcmNsZSA/ICd0dy1yb3VuZGVkLWZ1bGwnIDogJ3R3LXJvdW5kZWQtbWQnXHJcbiAgICBdXCJcclxuICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiXHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFwiXHJcbiAgICBbc3R5bGUuYm9yZGVyUmFkaXVzXT1cImNpcmNsZSA/ICc1MCUnIDogYm9yZGVyUmFkaXVzXCJcclxuICAgIGNsYXNzPVwidHctbWItMlwiXHJcbiAgPjwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuIl19