cloud-ide-element 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -271
- package/fesm2022/cloud-ide-element.mjs +614 -618
- package/fesm2022/cloud-ide-element.mjs.map +1 -1
- package/index.d.ts +1362 -3
- package/package.json +4 -31
- package/esm2022/cloud-ide-element.mjs +0 -5
- package/esm2022/lib/components/confirmation-modal/confirmation-modal.component.mjs +0 -182
- package/esm2022/lib/components/data-grid/data-grid.component.mjs +0 -1363
- package/esm2022/lib/components/data-grid/data-grid.types.mjs +0 -37
- package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -396
- package/esm2022/lib/components/global-notifications/global-notifications.component.mjs +0 -30
- package/esm2022/lib/components/json-editor/json-editor.component.mjs +0 -521
- package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +0 -33
- package/esm2022/lib/components/toast-notification/toast-notification.component.mjs +0 -152
- package/esm2022/lib/elements/button/cide-ele-button.component.mjs +0 -249
- package/esm2022/lib/elements/file-input/file-input.component.mjs +0 -83
- package/esm2022/lib/elements/icon/icon.component.mjs +0 -26
- package/esm2022/lib/elements/input/input.component.mjs +0 -467
- package/esm2022/lib/elements/select/select.component.mjs +0 -471
- package/esm2022/lib/elements/spinner/spinner.component.mjs +0 -32
- package/esm2022/lib/elements/tab/cide-ele-tab.component.mjs +0 -74
- package/esm2022/lib/elements/textarea/textarea.component.mjs +0 -157
- package/esm2022/lib/services/confirmation.service.mjs +0 -151
- package/esm2022/lib/services/dropdown-manager.service.mjs +0 -93
- package/esm2022/lib/services/notification.service.mjs +0 -196
- package/esm2022/lib/utils/directives/resizer/resizer.directive.mjs +0 -231
- package/esm2022/lib/utils/directives/tooltip/tooltip.directive.mjs +0 -294
- package/esm2022/lib/utils/pipes/capitalize/capitalize.pipe.mjs +0 -38
- package/esm2022/lib/utils/services/elements/elements.service.mjs +0 -39
- package/esm2022/public-api.mjs +0 -31
- package/lib/components/confirmation-modal/confirmation-modal.component.d.ts +0 -16
- package/lib/components/data-grid/data-grid.component.d.ts +0 -244
- package/lib/components/data-grid/data-grid.types.d.ts +0 -146
- package/lib/components/dropdown/dropdown.component.d.ts +0 -75
- package/lib/components/global-notifications/global-notifications.component.d.ts +0 -5
- package/lib/components/json-editor/json-editor.component.d.ts +0 -116
- package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +0 -11
- package/lib/components/toast-notification/toast-notification.component.d.ts +0 -13
- package/lib/elements/button/cide-ele-button.component.d.ts +0 -85
- package/lib/elements/file-input/file-input.component.d.ts +0 -25
- package/lib/elements/icon/icon.component.d.ts +0 -9
- package/lib/elements/input/input.component.d.ts +0 -182
- package/lib/elements/select/select.component.d.ts +0 -91
- package/lib/elements/spinner/spinner.component.d.ts +0 -19
- package/lib/elements/tab/cide-ele-tab.component.d.ts +0 -26
- package/lib/elements/textarea/textarea.component.d.ts +0 -47
- package/lib/services/confirmation.service.d.ts +0 -65
- package/lib/services/dropdown-manager.service.d.ts +0 -22
- package/lib/services/notification.service.d.ts +0 -81
- package/lib/utils/directives/resizer/resizer.directive.d.ts +0 -44
- package/lib/utils/directives/tooltip/tooltip.directive.d.ts +0 -43
- package/lib/utils/pipes/capitalize/capitalize.pipe.d.ts +0 -7
- package/lib/utils/services/elements/elements.service.d.ts +0 -12
- package/public-api.d.ts +0 -22
|
@@ -1,521 +0,0 @@
|
|
|
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==
|
|
@@ -1,33 +0,0 @@
|
|
|
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
|