@dynamic-field-kit/angular 1.2.10 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +113 -4
  3. package/dist/README.md +113 -4
  4. package/dist/components/BaseInput.d.ts +23 -11
  5. package/dist/components/DynamicInput.d.ts +19 -8
  6. package/dist/components/FieldInput.d.ts +15 -7
  7. package/dist/components/MultiFieldInput.d.ts +30 -4
  8. package/dist/esm2022/components/BaseInput.mjs +17 -18
  9. package/dist/esm2022/components/DynamicInput.mjs +166 -84
  10. package/dist/esm2022/components/FieldInput.mjs +54 -26
  11. package/dist/esm2022/components/MultiFieldInput.mjs +282 -29
  12. package/dist/esm2022/fieldRegistryToken.mjs +12 -0
  13. package/dist/esm2022/layout/defaultLayouts.mjs +70 -23
  14. package/dist/esm2022/layout/index.mjs +2 -1
  15. package/dist/esm2022/layout/layoutRegistry.mjs +14 -0
  16. package/dist/esm2022/public-api.mjs +6 -2
  17. package/dist/esm2022/types/layout.mjs +1 -1
  18. package/dist/fesm2022/dynamic-field-kit-angular.mjs +604 -173
  19. package/dist/fesm2022/dynamic-field-kit-angular.mjs.map +1 -1
  20. package/dist/fieldRegistryToken.d.ts +3 -0
  21. package/dist/layout/defaultLayouts.d.ts +21 -3
  22. package/dist/layout/index.d.ts +1 -0
  23. package/dist/layout/layoutRegistry.d.ts +12 -0
  24. package/dist/public-api.d.ts +5 -2
  25. package/dist/types/layout.d.ts +4 -1
  26. package/package.json +19 -8
  27. package/src/components/BaseInput.ts +36 -10
  28. package/src/components/DynamicInput.ts +196 -104
  29. package/src/components/FieldInput.ts +43 -18
  30. package/src/components/MultiFieldInput.ts +275 -19
  31. package/src/fieldRegistryToken.ts +15 -0
  32. package/src/layout/defaultLayouts.ts +42 -10
  33. package/src/layout/index.ts +1 -0
  34. package/src/layout/layoutRegistry.ts +25 -0
  35. package/src/public-api.ts +40 -24
  36. package/src/types/layout.ts +14 -1
  37. package/test/DynamicInput.spec.ts +230 -0
  38. package/test/FieldInput.spec.ts +146 -0
  39. package/test/MultiFieldInput.spec.ts +256 -0
  40. package/test/helpers/renderers.ts +89 -0
  41. package/test/layout.spec.ts +119 -0
  42. package/test/publicApi.spec.ts +64 -0
  43. package/test/setup.ts +12 -0
  44. package/test/smoke.spec.ts +27 -0
  45. package/tsconfig.json +13 -13
  46. package/tsconfig.spec.json +9 -0
  47. package/vitest.config.ts +30 -0
  48. package/src/adapters/tailwind.ts +0 -13
  49. package/src/components/imports.ts +0 -3
  50. package/src/examples/index.ts +0 -4
  51. package/src/examples/registerExample.ts +0 -7
  52. package/src/examples/text-field.component.ts +0 -18
  53. package/src/types.ts +0 -1
@@ -1,85 +1,338 @@
1
- import { NgClass, NgFor } from '@angular/common';
2
- import { Component, Input, Output, EventEmitter, } from '@angular/core';
1
+ import { NgClass, NgFor, NgIf } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, } from '@angular/core';
3
+ import { applyComputedValues, canAddGroupItem, canRemoveGroupItem, createGroupItem, resolveDisabled, resolveOptions, resolveReadOnly, validateField, validateFields, } from '@dynamic-field-kit/core';
3
4
  import { FieldInput } from './FieldInput';
4
5
  import * as i0 from "@angular/core";
6
+ const DEFAULT_BREAKPOINT = 768;
5
7
  export class MultiFieldInput {
8
+ cdr;
6
9
  fieldDescriptions = [];
7
10
  properties;
8
11
  onChange = new EventEmitter();
12
+ validityChange = new EventEmitter();
9
13
  layout = 'column';
14
+ // Top-level form data, threaded down through repeatable groups so a nested
15
+ // field's appearCondition/computeValue can read the root form. Omitted at
16
+ // the top level, where the form's own data is the root.
17
+ rootData;
10
18
  data = {};
11
19
  visibleFields = [];
20
+ isMobile = false;
21
+ constructor(cdr) {
22
+ this.cdr = cdr;
23
+ }
24
+ onWindowResize() {
25
+ const wasMobile = this.isMobile;
26
+ this.updateIsMobile();
27
+ if (wasMobile !== this.isMobile) {
28
+ this.cdr.markForCheck();
29
+ }
30
+ }
31
+ get resolvedLayout() {
32
+ if (typeof this.layout === 'object' && this.layout.type === 'responsive') {
33
+ return this.isMobile ? this.layout.mobile : this.layout.desktop;
34
+ }
35
+ return this.layout;
36
+ }
37
+ get resolvedLayoutType() {
38
+ const resolved = this.resolvedLayout;
39
+ return typeof resolved === 'string' ? resolved : resolved.type;
40
+ }
41
+ get gap() {
42
+ const resolved = this.resolvedLayout;
43
+ if (typeof resolved === 'object' && resolved.gap !== undefined) {
44
+ return resolved.gap;
45
+ }
46
+ return 12;
47
+ }
48
+ get columns() {
49
+ const resolved = this.resolvedLayout;
50
+ if (typeof resolved === 'object' && resolved.type === 'grid') {
51
+ return resolved.columns ?? 2;
52
+ }
53
+ return 2;
54
+ }
12
55
  trackByFn(index, field) {
13
56
  return field.name || index;
14
57
  }
58
+ trackByIndex(index) {
59
+ return index;
60
+ }
61
+ groupTrackByCache = new WeakMap();
62
+ // Returns a stable trackBy per group field: item[keyField] when configured,
63
+ // else the index. Cached by field reference so the template hands Angular the
64
+ // same function each change-detection pass.
65
+ groupTrackBy(field) {
66
+ let fn = this.groupTrackByCache.get(field);
67
+ if (!fn) {
68
+ fn = (index, item) => field.keyField ? item[field.keyField] ?? index : index;
69
+ this.groupTrackByCache.set(field, fn);
70
+ }
71
+ return fn;
72
+ }
15
73
  ngOnInit() {
74
+ this.updateIsMobile();
16
75
  this.init();
17
76
  }
18
77
  ngOnChanges(_changes) {
19
78
  this.init();
20
79
  }
80
+ updateIsMobile() {
81
+ const breakpoint = typeof this.layout === 'object' && this.layout.type === 'responsive'
82
+ ? this.layout.breakpoint ?? DEFAULT_BREAKPOINT
83
+ : DEFAULT_BREAKPOINT;
84
+ if (typeof window !== 'undefined' &&
85
+ typeof window.matchMedia === 'function') {
86
+ this.isMobile = window.matchMedia(`(max-width: ${breakpoint - 1}px)`).matches;
87
+ }
88
+ else {
89
+ this.isMobile =
90
+ typeof window !== 'undefined' && window.innerWidth < breakpoint;
91
+ }
92
+ }
21
93
  init() {
22
94
  if (this.properties) {
23
- this.data = { ...this.properties };
95
+ this.data = applyComputedValues(this.fieldDescriptions, { ...this.properties }, this.rootData);
24
96
  }
25
97
  this.updateVisibleFields();
98
+ this.validityChange.emit(validateFields(this.fieldDescriptions, this.data, this.rootData));
26
99
  }
27
100
  updateVisibleFields() {
28
- this.visibleFields = this.fieldDescriptions.filter((f) => !f.appearCondition || f.appearCondition(this.data));
101
+ const root = this.rootData ?? this.data;
102
+ this.visibleFields = this.fieldDescriptions.filter((f) => !f.appearCondition || f.appearCondition(this.data, root));
29
103
  }
30
104
  onFieldChange(event) {
31
- this.data = { ...this.data, [event.key]: event.value };
105
+ this.commitData({ ...this.data, [event.key]: event.value });
106
+ }
107
+ getItems(field) {
108
+ const value = this.data[field.name];
109
+ return Array.isArray(value) ? value : [];
110
+ }
111
+ getResolvedOptions(field) {
112
+ return resolveOptions(field, this.data, this.rootData);
113
+ }
114
+ getDisabled(field) {
115
+ return resolveDisabled(field, this.data, this.rootData);
116
+ }
117
+ getReadOnly(field) {
118
+ return resolveReadOnly(field, this.data, this.rootData);
119
+ }
120
+ getError(field) {
121
+ if (this.getDisabled(field)) {
122
+ return undefined;
123
+ }
124
+ const errors = validateField(field, this.data[field.name], this.data, this.rootData);
125
+ return errors.length > 0 ? errors : undefined;
126
+ }
127
+ canAddItem(field) {
128
+ return canAddGroupItem(field, this.getItems(field));
129
+ }
130
+ canRemoveItem(field) {
131
+ return canRemoveGroupItem(field, this.getItems(field));
132
+ }
133
+ onGroupItemAdd(field) {
134
+ if (!this.canAddItem(field)) {
135
+ return;
136
+ }
137
+ const items = this.getItems(field);
138
+ this.commitData({
139
+ ...this.data,
140
+ [field.name]: [...items, createGroupItem(field)],
141
+ });
142
+ }
143
+ onGroupItemRemove(field, index) {
144
+ if (!this.canRemoveItem(field)) {
145
+ return;
146
+ }
147
+ const items = this.getItems(field).filter((_, i) => i !== index);
148
+ this.commitData({ ...this.data, [field.name]: items });
149
+ }
150
+ onGroupItemChange(field, index, next) {
151
+ const items = this.getItems(field).slice();
152
+ items[index] = next;
153
+ this.commitData({ ...this.data, [field.name]: items });
154
+ }
155
+ commitData(nextData) {
156
+ this.data = applyComputedValues(this.fieldDescriptions, nextData, this.rootData);
32
157
  this.updateVisibleFields();
33
158
  this.onChange.emit(this.data);
159
+ this.validityChange.emit(validateFields(this.fieldDescriptions, this.data, this.rootData));
160
+ this.cdr.markForCheck();
34
161
  }
35
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MultiFieldInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
36
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: MultiFieldInput, isStandalone: true, selector: "dfk-multi-field-input", inputs: { fieldDescriptions: "fieldDescriptions", properties: "properties", layout: "layout" }, outputs: { onChange: "onChange" }, usesOnChanges: true, ngImport: i0, template: `
162
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MultiFieldInput, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
163
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: MultiFieldInput, isStandalone: true, selector: "dfk-multi-field-input", inputs: { fieldDescriptions: "fieldDescriptions", properties: "properties", layout: "layout", rootData: "rootData" }, outputs: { onChange: "onChange", validityChange: "validityChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, usesOnChanges: true, ngImport: i0, template: `
37
164
  <div
38
- class="flex flex-col gap-3 p-4 border rounded-lg bg-gray-50"
165
+ class="p-4 border rounded-lg bg-gray-50"
39
166
  [ngClass]="{
40
- 'flex-row gap-3': layout === 'row',
41
- 'grid grid-cols-2 gap-3': layout === 'grid'
167
+ 'flex flex-col': resolvedLayoutType === 'column',
168
+ 'flex flex-row': resolvedLayoutType === 'row',
169
+ grid: resolvedLayoutType === 'grid'
42
170
  }"
171
+ [style.gap.px]="gap"
172
+ [style.gridTemplateColumns]="
173
+ resolvedLayoutType === 'grid' ? 'repeat(' + columns + ', 1fr)' : null
174
+ "
43
175
  >
44
- <dfk-field-input
45
- *ngFor="let field of visibleFields; trackBy: trackByFn"
46
- [fieldDescription]="field"
47
- [renderInfos]="data"
48
- (onValueChangeField)="onFieldChange($event)"
49
- ></dfk-field-input>
176
+ <ng-container *ngFor="let field of visibleFields; trackBy: trackByFn">
177
+ <dfk-field-input
178
+ *ngIf="!field.fields"
179
+ [fieldDescription]="field"
180
+ [value]="data[field.name]"
181
+ [options]="getResolvedOptions(field)"
182
+ [disabled]="getDisabled(field)"
183
+ [readOnly]="getReadOnly(field)"
184
+ [error]="getError(field)"
185
+ (onValueChangeField)="onFieldChange($event)"
186
+ ></dfk-field-input>
187
+
188
+ <div *ngIf="field.fields" [class]="field.className">
189
+ <div *ngIf="field.label">{{ field.label }}</div>
190
+ <div
191
+ *ngFor="
192
+ let item of getItems(field);
193
+ let i = index;
194
+ trackBy: groupTrackBy(field)
195
+ "
196
+ style="display: flex; align-items: flex-start; gap: 8px;"
197
+ >
198
+ <div style="flex: 1">
199
+ <dfk-multi-field-input
200
+ [fieldDescriptions]="field.fields"
201
+ [properties]="item"
202
+ [rootData]="rootData ?? data"
203
+ (onChange)="onGroupItemChange(field, i, $event)"
204
+ ></dfk-multi-field-input>
205
+ </div>
206
+ <button
207
+ type="button"
208
+ [attr.aria-label]="
209
+ (field.removeLabel || 'Remove') +
210
+ ' ' +
211
+ (field.label || field.name) +
212
+ ' ' +
213
+ (i + 1)
214
+ "
215
+ (click)="onGroupItemRemove(field, i)"
216
+ [disabled]="!canRemoveItem(field)"
217
+ >
218
+ {{ field.removeLabel || 'Remove' }}
219
+ </button>
220
+ </div>
221
+ <button
222
+ type="button"
223
+ [attr.aria-label]="
224
+ (field.addLabel || 'Add') + ' ' + (field.label || field.name)
225
+ "
226
+ (click)="onGroupItemAdd(field)"
227
+ [disabled]="!canAddItem(field)"
228
+ >
229
+ {{ field.addLabel || 'Add' }}
230
+ </button>
231
+ </div>
232
+ </ng-container>
50
233
  </div>
51
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: FieldInput, selector: "dfk-field-input", inputs: ["fieldDescription", "renderInfos"], outputs: ["onValueChangeField"] }] });
234
+ `, isInline: true, dependencies: [{ kind: "component", type: MultiFieldInput, selector: "dfk-multi-field-input", inputs: ["fieldDescriptions", "properties", "layout", "rootData"], outputs: ["onChange", "validityChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FieldInput, selector: "dfk-field-input", inputs: ["fieldDescription", "value", "options", "disabled", "readOnly", "error"], outputs: ["onValueChangeField"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
52
235
  }
53
236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MultiFieldInput, decorators: [{
54
237
  type: Component,
55
238
  args: [{
56
239
  selector: 'dfk-multi-field-input',
57
240
  standalone: true,
58
- imports: [NgClass, NgFor, FieldInput],
241
+ // Repeatable field groups render a nested <dfk-multi-field-input> per item
242
+ // (see the #groupTpl below), so this component imports itself. That's the
243
+ // supported way to give a standalone component recursive template usage
244
+ // without a cross-file circular import between FieldInput and a separate
245
+ // group component (whose `imports` arrays are evaluated eagerly at module
246
+ // load time and would deadlock on an actual circular module reference).
247
+ imports: [NgClass, NgFor, NgIf, FieldInput, MultiFieldInput],
248
+ changeDetection: ChangeDetectionStrategy.OnPush,
59
249
  template: `
60
250
  <div
61
- class="flex flex-col gap-3 p-4 border rounded-lg bg-gray-50"
251
+ class="p-4 border rounded-lg bg-gray-50"
62
252
  [ngClass]="{
63
- 'flex-row gap-3': layout === 'row',
64
- 'grid grid-cols-2 gap-3': layout === 'grid'
253
+ 'flex flex-col': resolvedLayoutType === 'column',
254
+ 'flex flex-row': resolvedLayoutType === 'row',
255
+ grid: resolvedLayoutType === 'grid'
65
256
  }"
257
+ [style.gap.px]="gap"
258
+ [style.gridTemplateColumns]="
259
+ resolvedLayoutType === 'grid' ? 'repeat(' + columns + ', 1fr)' : null
260
+ "
66
261
  >
67
- <dfk-field-input
68
- *ngFor="let field of visibleFields; trackBy: trackByFn"
69
- [fieldDescription]="field"
70
- [renderInfos]="data"
71
- (onValueChangeField)="onFieldChange($event)"
72
- ></dfk-field-input>
262
+ <ng-container *ngFor="let field of visibleFields; trackBy: trackByFn">
263
+ <dfk-field-input
264
+ *ngIf="!field.fields"
265
+ [fieldDescription]="field"
266
+ [value]="data[field.name]"
267
+ [options]="getResolvedOptions(field)"
268
+ [disabled]="getDisabled(field)"
269
+ [readOnly]="getReadOnly(field)"
270
+ [error]="getError(field)"
271
+ (onValueChangeField)="onFieldChange($event)"
272
+ ></dfk-field-input>
273
+
274
+ <div *ngIf="field.fields" [class]="field.className">
275
+ <div *ngIf="field.label">{{ field.label }}</div>
276
+ <div
277
+ *ngFor="
278
+ let item of getItems(field);
279
+ let i = index;
280
+ trackBy: groupTrackBy(field)
281
+ "
282
+ style="display: flex; align-items: flex-start; gap: 8px;"
283
+ >
284
+ <div style="flex: 1">
285
+ <dfk-multi-field-input
286
+ [fieldDescriptions]="field.fields"
287
+ [properties]="item"
288
+ [rootData]="rootData ?? data"
289
+ (onChange)="onGroupItemChange(field, i, $event)"
290
+ ></dfk-multi-field-input>
291
+ </div>
292
+ <button
293
+ type="button"
294
+ [attr.aria-label]="
295
+ (field.removeLabel || 'Remove') +
296
+ ' ' +
297
+ (field.label || field.name) +
298
+ ' ' +
299
+ (i + 1)
300
+ "
301
+ (click)="onGroupItemRemove(field, i)"
302
+ [disabled]="!canRemoveItem(field)"
303
+ >
304
+ {{ field.removeLabel || 'Remove' }}
305
+ </button>
306
+ </div>
307
+ <button
308
+ type="button"
309
+ [attr.aria-label]="
310
+ (field.addLabel || 'Add') + ' ' + (field.label || field.name)
311
+ "
312
+ (click)="onGroupItemAdd(field)"
313
+ [disabled]="!canAddItem(field)"
314
+ >
315
+ {{ field.addLabel || 'Add' }}
316
+ </button>
317
+ </div>
318
+ </ng-container>
73
319
  </div>
74
320
  `,
75
321
  }]
76
- }], propDecorators: { fieldDescriptions: [{
322
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { fieldDescriptions: [{
77
323
  type: Input
78
324
  }], properties: [{
79
325
  type: Input
80
326
  }], onChange: [{
81
327
  type: Output
328
+ }], validityChange: [{
329
+ type: Output
82
330
  }], layout: [{
83
331
  type: Input
332
+ }], rootData: [{
333
+ type: Input
334
+ }], onWindowResize: [{
335
+ type: HostListener,
336
+ args: ['window:resize']
84
337
  }] } });
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlGaWVsZElucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvTXVsdGlGaWVsZElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FJYixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQXVCMUMsTUFBTSxPQUFPLGVBQWU7SUFDakIsaUJBQWlCLEdBQXVCLEVBQUUsQ0FBQztJQUMzQyxVQUFVLENBQWM7SUFDdkIsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFDM0MsTUFBTSxHQUFpQixRQUFRLENBQUM7SUFFekMsSUFBSSxHQUFlLEVBQUUsQ0FBQztJQUN0QixhQUFhLEdBQXVCLEVBQUUsQ0FBQztJQUV2QyxTQUFTLENBQUMsS0FBYSxFQUFFLEtBQXVCO1FBQzlDLE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQXVCO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFTyxJQUFJO1FBQ1YsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FDaEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBa0M7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7d0dBdENVLGVBQWU7NEZBQWYsZUFBZSx5T0FqQmhCOzs7Ozs7Ozs7Ozs7Ozs7R0FlVCw0REFoQlMsT0FBTyxvRkFBRSxLQUFLLG1IQUFFLFVBQVU7OzRGQWtCekIsZUFBZTtrQkFyQjNCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDO29CQUNyQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7OztHQWVUO2lCQUNGOzhCQUVVLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0UsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcywgTmdGb3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpZWxkRGVzY3JpcHRpb24sIFByb3BlcnRpZXMgfSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5pbXBvcnQgeyBMYXlvdXRDb25maWcgfSBmcm9tICcuLi90eXBlcy9sYXlvdXQnO1xuaW1wb3J0IHsgRmllbGRJbnB1dCB9IGZyb20gJy4vRmllbGRJbnB1dCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rmay1tdWx0aS1maWVsZC1pbnB1dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0NsYXNzLCBOZ0ZvciwgRmllbGRJbnB1dF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zIHAtNCBib3JkZXIgcm91bmRlZC1sZyBiZy1ncmF5LTUwXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ2ZsZXgtcm93IGdhcC0zJzogbGF5b3V0ID09PSAncm93JyxcbiAgICAgICAgJ2dyaWQgZ3JpZC1jb2xzLTIgZ2FwLTMnOiBsYXlvdXQgPT09ICdncmlkJ1xuICAgICAgfVwiXG4gICAgPlxuICAgICAgPGRmay1maWVsZC1pbnB1dFxuICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgdmlzaWJsZUZpZWxkczsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgW2ZpZWxkRGVzY3JpcHRpb25dPVwiZmllbGRcIlxuICAgICAgICBbcmVuZGVySW5mb3NdPVwiZGF0YVwiXG4gICAgICAgIChvblZhbHVlQ2hhbmdlRmllbGQpPVwib25GaWVsZENoYW5nZSgkZXZlbnQpXCJcbiAgICAgID48L2Rmay1maWVsZC1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlGaWVsZElucHV0IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBmaWVsZERlc2NyaXB0aW9uczogRmllbGREZXNjcmlwdGlvbltdID0gW107XG4gIEBJbnB1dCgpIHByb3BlcnRpZXM/OiBQcm9wZXJ0aWVzO1xuICBAT3V0cHV0KCkgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFByb3BlcnRpZXM+KCk7XG4gIEBJbnB1dCgpIGxheW91dDogTGF5b3V0Q29uZmlnID0gJ2NvbHVtbic7XG5cbiAgZGF0YTogUHJvcGVydGllcyA9IHt9O1xuICB2aXNpYmxlRmllbGRzOiBGaWVsZERlc2NyaXB0aW9uW10gPSBbXTtcblxuICB0cmFja0J5Rm4oaW5kZXg6IG51bWJlciwgZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBmaWVsZC5uYW1lIHx8IGluZGV4O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhfY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0KCkge1xuICAgIGlmICh0aGlzLnByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuZGF0YSA9IHsgLi4udGhpcy5wcm9wZXJ0aWVzIH07XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVmlzaWJsZUZpZWxkcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlRmllbGRzKCkge1xuICAgIHRoaXMudmlzaWJsZUZpZWxkcyA9IHRoaXMuZmllbGREZXNjcmlwdGlvbnMuZmlsdGVyKFxuICAgICAgKGYpID0+ICFmLmFwcGVhckNvbmRpdGlvbiB8fCBmLmFwcGVhckNvbmRpdGlvbih0aGlzLmRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIG9uRmllbGRDaGFuZ2UoZXZlbnQ6IHsgdmFsdWU6IGFueTsga2V5OiBzdHJpbmcgfSkge1xuICAgIHRoaXMuZGF0YSA9IHsgLi4udGhpcy5kYXRhLCBbZXZlbnQua2V5XTogZXZlbnQudmFsdWUgfTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVGaWVsZHMoKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5kYXRhKTtcbiAgfVxufVxuIl19
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlGaWVsZElucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvTXVsdGlGaWVsZElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGVBQWUsRUFDZixjQUFjLEVBQ2QsZUFBZSxFQUNmLGFBQWEsRUFDYixjQUFjLEdBR2YsTUFBTSx5QkFBeUIsQ0FBQztBQUdqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUUxQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQXNGL0IsTUFBTSxPQUFPLGVBQWU7SUFlTjtJQWRYLGlCQUFpQixHQUF1QixFQUFFLENBQUM7SUFDM0MsVUFBVSxDQUFjO0lBQ3ZCLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO0lBQzFDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztJQUN2RCxNQUFNLEdBQWlCLFFBQVEsQ0FBQztJQUN6QywyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHdEQUF3RDtJQUMvQyxRQUFRLENBQWM7SUFFL0IsSUFBSSxHQUFlLEVBQUUsQ0FBQztJQUN0QixhQUFhLEdBQXVCLEVBQUUsQ0FBQztJQUMvQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRXpCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQztJQUc5QyxjQUFjO1FBQ1osTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFB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OEtBM0VoQixPQUFPLG9GQUFFLEtBQUssbUhBQUUsSUFBSSw2RkFBRSxVQUFVOzs0RkEyRS9CLGVBQWU7a0JBcEYzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLFVBQVUsRUFBRSxJQUFJO29CQUNoQiwyRUFBMkU7b0JBQzNFLDBFQUEwRTtvQkFDMUUsd0VBQXdFO29CQUN4RSx5RUFBeUU7b0JBQ3pFLDBFQUEwRTtvQkFDMUUsd0VBQXdFO29CQUN4RSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLGtCQUFrQjtvQkFDNUQsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RVQ7aUJBQ0Y7c0ZBRVUsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNFLE1BQU07c0JBQWQsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQVNOLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcywgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBhcHBseUNvbXB1dGVkVmFsdWVzLFxuICBjYW5BZGRHcm91cEl0ZW0sXG4gIGNhblJlbW92ZUdyb3VwSXRlbSxcbiAgY3JlYXRlR3JvdXBJdGVtLFxuICByZXNvbHZlRGlzYWJsZWQsXG4gIHJlc29sdmVPcHRpb25zLFxuICByZXNvbHZlUmVhZE9ubHksXG4gIHZhbGlkYXRlRmllbGQsXG4gIHZhbGlkYXRlRmllbGRzLFxuICBGaWVsZERlc2NyaXB0aW9uLFxuICBQcm9wZXJ0aWVzLFxufSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5pbXBvcnQgeyBCYXNlTGF5b3V0Q29uZmlnLCBMYXlvdXRDb25maWcgfSBmcm9tICcuLi90eXBlcy9sYXlvdXQnO1xuaW1wb3J0IHsgRmllbGRJbnB1dCB9IGZyb20gJy4vRmllbGRJbnB1dCc7XG5cbmNvbnN0IERFRkFVTFRfQlJFQUtQT0lOVCA9IDc2ODtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGZrLW11bHRpLWZpZWxkLWlucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgLy8gUmVwZWF0YWJsZSBmaWVsZCBncm91cHMgcmVuZGVyIGEgbmVzdGVkIDxkZmstbXVsdGktZmllbGQtaW5wdXQ+IHBlciBpdGVtXG4gIC8vIChzZWUgdGhlICNncm91cFRwbCBiZWxvdyksIHNvIHRoaXMgY29tcG9uZW50IGltcG9ydHMgaXRzZWxmLiBUaGF0J3MgdGhlXG4gIC8vIHN1cHBvcnRlZCB3YXkgdG8gZ2l2ZSBhIHN0YW5kYWxvbmUgY29tcG9uZW50IHJlY3Vyc2l2ZSB0ZW1wbGF0ZSB1c2FnZVxuICAvLyB3aXRob3V0IGEgY3Jvc3MtZmlsZSBjaXJjdWxhciBpbXBvcnQgYmV0d2VlbiBGaWVsZElucHV0IGFuZCBhIHNlcGFyYXRlXG4gIC8vIGdyb3VwIGNvbXBvbmVudCAod2hvc2UgYGltcG9ydHNgIGFycmF5cyBhcmUgZXZhbHVhdGVkIGVhZ2VybHkgYXQgbW9kdWxlXG4gIC8vIGxvYWQgdGltZSBhbmQgd291bGQgZGVhZGxvY2sgb24gYW4gYWN0dWFsIGNpcmN1bGFyIG1vZHVsZSByZWZlcmVuY2UpLlxuICBpbXBvcnRzOiBbTmdDbGFzcywgTmdGb3IsIE5nSWYsIEZpZWxkSW5wdXQsIE11bHRpRmllbGRJbnB1dF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicC00IGJvcmRlciByb3VuZGVkLWxnIGJnLWdyYXktNTBcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnZmxleCBmbGV4LWNvbCc6IHJlc29sdmVkTGF5b3V0VHlwZSA9PT0gJ2NvbHVtbicsXG4gICAgICAgICdmbGV4IGZsZXgtcm93JzogcmVzb2x2ZWRMYXlvdXRUeXBlID09PSAncm93JyxcbiAgICAgICAgZ3JpZDogcmVzb2x2ZWRMYXlvdXRUeXBlID09PSAnZ3JpZCdcbiAgICAgIH1cIlxuICAgICAgW3N0eWxlLmdhcC5weF09XCJnYXBcIlxuICAgICAgW3N0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnNdPVwiXG4gICAgICAgIHJlc29sdmVkTGF5b3V0VHlwZSA9PT0gJ2dyaWQnID8gJ3JlcGVhdCgnICsgY29sdW1ucyArICcsIDFmciknIDogbnVsbFxuICAgICAgXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiB2aXNpYmxlRmllbGRzOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgPGRmay1maWVsZC1pbnB1dFxuICAgICAgICAgICpuZ0lmPVwiIWZpZWxkLmZpZWxkc1wiXG4gICAgICAgICAgW2ZpZWxkRGVzY3JpcHRpb25dPVwiZmllbGRcIlxuICAgICAgICAgIFt2YWx1ZV09XCJkYXRhW2ZpZWxkLm5hbWVdXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJnZXRSZXNvbHZlZE9wdGlvbnMoZmllbGQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0RGlzYWJsZWQoZmllbGQpXCJcbiAgICAgICAgICBbcmVhZE9ubHldPVwiZ2V0UmVhZE9ubHkoZmllbGQpXCJcbiAgICAgICAgICBbZXJyb3JdPVwiZ2V0RXJyb3IoZmllbGQpXCJcbiAgICAgICAgICAob25WYWx1ZUNoYW5nZUZpZWxkKT1cIm9uRmllbGRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID48L2Rmay1maWVsZC1pbnB1dD5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQuZmllbGRzXCIgW2NsYXNzXT1cImZpZWxkLmNsYXNzTmFtZVwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC5sYWJlbFwiPnt7IGZpZWxkLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBpdGVtIG9mIGdldEl0ZW1zKGZpZWxkKTtcbiAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgICAgICAgICAgdHJhY2tCeTogZ3JvdXBUcmFja0J5KGZpZWxkKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogOHB4O1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDFcIj5cbiAgICAgICAgICAgICAgPGRmay1tdWx0aS1maWVsZC1pbnB1dFxuICAgICAgICAgICAgICAgIFtmaWVsZERlc2NyaXB0aW9uc109XCJmaWVsZC5maWVsZHNcIlxuICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgIFtyb290RGF0YV09XCJyb290RGF0YSA/PyBkYXRhXCJcbiAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25Hcm91cEl0ZW1DaGFuZ2UoZmllbGQsIGksICRldmVudClcIlxuICAgICAgICAgICAgICA+PC9kZmstbXVsdGktZmllbGQtaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgKGZpZWxkLnJlbW92ZUxhYmVsIHx8ICdSZW1vdmUnKSArXG4gICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAoZmllbGQubGFiZWwgfHwgZmllbGQubmFtZSkgK1xuICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgKGkgKyAxKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEl0ZW1SZW1vdmUoZmllbGQsIGkpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5SZW1vdmVJdGVtKGZpZWxkKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGZpZWxkLnJlbW92ZUxhYmVsIHx8ICdSZW1vdmUnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgIChmaWVsZC5hZGRMYWJlbCB8fCAnQWRkJykgKyAnICcgKyAoZmllbGQubGFiZWwgfHwgZmllbGQubmFtZSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEl0ZW1BZGQoZmllbGQpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuQWRkSXRlbShmaWVsZClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGZpZWxkLmFkZExhYmVsIHx8ICdBZGQnIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpRmllbGRJbnB1dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZmllbGREZXNjcmlwdGlvbnM6IEZpZWxkRGVzY3JpcHRpb25bXSA9IFtdO1xuICBASW5wdXQoKSBwcm9wZXJ0aWVzPzogUHJvcGVydGllcztcbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9wZXJ0aWVzPigpO1xuICBAT3V0cHV0KCkgdmFsaWRpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFZhbGlkYXRpb25SZXN1bHQ+KCk7XG4gIEBJbnB1dCgpIGxheW91dDogTGF5b3V0Q29uZmlnID0gJ2NvbHVtbic7XG4gIC8vIFRvcC1sZXZlbCBmb3JtIGRhdGEsIHRocmVhZGVkIGRvd24gdGhyb3VnaCByZXBlYXRhYmxlIGdyb3VwcyBzbyBhIG5lc3RlZFxuICAvLyBmaWVsZCdzIGFwcGVhckNvbmRpdGlvbi9jb21wdXRlVmFsdWUgY2FuIHJlYWQgdGhlIHJvb3QgZm9ybS4gT21pdHRlZCBhdFxuICAvLyB0aGUgdG9wIGxldmVsLCB3aGVyZSB0aGUgZm9ybSdzIG93biBkYXRhIGlzIHRoZSByb290LlxuICBASW5wdXQoKSByb290RGF0YT86IFByb3BlcnRpZXM7XG5cbiAgZGF0YTogUHJvcGVydGllcyA9IHt9O1xuICB2aXNpYmxlRmllbGRzOiBGaWVsZERlc2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBpc01vYmlsZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzTW9iaWxlID0gdGhpcy5pc01vYmlsZTtcbiAgICB0aGlzLnVwZGF0ZUlzTW9iaWxlKCk7XG4gICAgaWYgKHdhc01vYmlsZSAhPT0gdGhpcy5pc01vYmlsZSkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlc29sdmVkTGF5b3V0KCk6IEJhc2VMYXlvdXRDb25maWcge1xuICAgIGlmICh0eXBlb2YgdGhpcy5sYXlvdXQgPT09ICdvYmplY3QnICYmIHRoaXMubGF5b3V0LnR5cGUgPT09ICdyZXNwb25zaXZlJykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNNb2JpbGUgPyB0aGlzLmxheW91dC5tb2JpbGUgOiB0aGlzLmxheW91dC5kZXNrdG9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sYXlvdXQgYXMgQmFzZUxheW91dENvbmZpZztcbiAgfVxuXG4gIGdldCByZXNvbHZlZExheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZWRMYXlvdXQ7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZlZCA9PT0gJ3N0cmluZycgPyByZXNvbHZlZCA6IHJlc29sdmVkLnR5cGU7XG4gIH1cblxuICBnZXQgZ2FwKCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVkTGF5b3V0O1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09ICdvYmplY3QnICYmIHJlc29sdmVkLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQuZ2FwO1xuICAgIH1cbiAgICByZXR1cm4gMTI7XG4gIH1cblxuICBnZXQgY29sdW1ucygpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlZExheW91dDtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSAnb2JqZWN0JyAmJiByZXNvbHZlZC50eXBlID09PSAnZ3JpZCcpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZC5jb2x1bW5zID8/IDI7XG4gICAgfVxuICAgIHJldHVybiAyO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gZmllbGQubmFtZSB8fCBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBwcml2YXRlIGdyb3VwVHJhY2tCeUNhY2hlID0gbmV3IFdlYWtNYXA8XG4gICAgRmllbGREZXNjcmlwdGlvbixcbiAgICAoaW5kZXg6IG51bWJlciwgaXRlbTogUHJvcGVydGllcykgPT4gdW5rbm93blxuICA+KCk7XG5cbiAgLy8gUmV0dXJucyBhIHN0YWJsZSB0cmFja0J5IHBlciBncm91cCBmaWVsZDogaXRlbVtrZXlGaWVsZF0gd2hlbiBjb25maWd1cmVkLFxuICAvLyBlbHNlIHRoZSBpbmRleC4gQ2FjaGVkIGJ5IGZpZWxkIHJlZmVyZW5jZSBzbyB0aGUgdGVtcGxhdGUgaGFuZHMgQW5ndWxhciB0aGVcbiAgLy8gc2FtZSBmdW5jdGlvbiBlYWNoIGNoYW5nZS1kZXRlY3Rpb24gcGFzcy5cbiAgZ3JvdXBUcmFja0J5KFxuICAgIGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uXG4gICk6IChpbmRleDogbnVtYmVyLCBpdGVtOiBQcm9wZXJ0aWVzKSA9PiB1bmtub3duIHtcbiAgICBsZXQgZm4gPSB0aGlzLmdyb3VwVHJhY2tCeUNhY2hlLmdldChmaWVsZCk7XG4gICAgaWYgKCFmbikge1xuICAgICAgZm4gPSAoaW5kZXg6IG51bWJlciwgaXRlbTogUHJvcGVydGllcykgPT5cbiAgICAgICAgZmllbGQua2V5RmllbGQgPyBpdGVtW2ZpZWxkLmtleUZpZWxkXSA/PyBpbmRleCA6IGluZGV4O1xuICAgICAgdGhpcy5ncm91cFRyYWNrQnlDYWNoZS5zZXQoZmllbGQsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVJc01vYmlsZSgpO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSXNNb2JpbGUoKTogdm9pZCB7XG4gICAgY29uc3QgYnJlYWtwb2ludCA9XG4gICAgICB0eXBlb2YgdGhpcy5sYXlvdXQgPT09ICdvYmplY3QnICYmIHRoaXMubGF5b3V0LnR5cGUgPT09ICdyZXNwb25zaXZlJ1xuICAgICAgICA/IHRoaXMubGF5b3V0LmJyZWFrcG9pbnQgPz8gREVGQVVMVF9CUkVBS1BPSU5UXG4gICAgICAgIDogREVGQVVMVF9CUkVBS1BPSU5UO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRoaXMuaXNNb2JpbGUgPSB3aW5kb3cubWF0Y2hNZWRpYShcbiAgICAgICAgYChtYXgtd2lkdGg6ICR7YnJlYWtwb2ludCAtIDF9cHgpYFxuICAgICAgKS5tYXRjaGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzTW9iaWxlID1cbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmlubmVyV2lkdGggPCBicmVha3BvaW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdCgpIHtcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICB0aGlzLmRhdGEgPSBhcHBseUNvbXB1dGVkVmFsdWVzKFxuICAgICAgICB0aGlzLmZpZWxkRGVzY3JpcHRpb25zLFxuICAgICAgICB7IC4uLnRoaXMucHJvcGVydGllcyB9LFxuICAgICAgICB0aGlzLnJvb3REYXRhXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZpc2libGVGaWVsZHMoKTtcbiAgICB0aGlzLnZhbGlkaXR5Q2hhbmdlLmVtaXQoXG4gICAgICB2YWxpZGF0ZUZpZWxkcyh0aGlzLmZpZWxkRGVzY3JpcHRpb25zLCB0aGlzLmRhdGEsIHRoaXMucm9vdERhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUZpZWxkcygpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5yb290RGF0YSA/PyB0aGlzLmRhdGE7XG4gICAgdGhpcy52aXNpYmxlRmllbGRzID0gdGhpcy5maWVsZERlc2NyaXB0aW9ucy5maWx0ZXIoXG4gICAgICAoZikgPT4gIWYuYXBwZWFyQ29uZGl0aW9uIHx8IGYuYXBwZWFyQ29uZGl0aW9uKHRoaXMuZGF0YSwgcm9vdClcbiAgICApO1xuICB9XG5cbiAgb25GaWVsZENoYW5nZShldmVudDogeyB2YWx1ZTogdW5rbm93bjsga2V5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWl0RGF0YSh7IC4uLnRoaXMuZGF0YSwgW2V2ZW50LmtleV06IGV2ZW50LnZhbHVlIH0pO1xuICB9XG5cbiAgZ2V0SXRlbXMoZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBQcm9wZXJ0aWVzW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhW2ZpZWxkLm5hbWVdO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICh2YWx1ZSBhcyBQcm9wZXJ0aWVzW10pIDogW107XG4gIH1cblxuICBnZXRSZXNvbHZlZE9wdGlvbnMoZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBQcm9wZXJ0aWVzW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiByZXNvbHZlT3B0aW9ucyhmaWVsZCwgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKTtcbiAgfVxuXG4gIGdldERpc2FibGVkKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVEaXNhYmxlZChmaWVsZCwgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKTtcbiAgfVxuXG4gIGdldFJlYWRPbmx5KGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVSZWFkT25seShmaWVsZCwgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKTtcbiAgfVxuXG4gIGdldEVycm9yKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmdldERpc2FibGVkKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVGaWVsZChcbiAgICAgIGZpZWxkLFxuICAgICAgdGhpcy5kYXRhW2ZpZWxkLm5hbWVdLFxuICAgICAgdGhpcy5kYXRhLFxuICAgICAgdGhpcy5yb290RGF0YVxuICAgICk7XG4gICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPiAwID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgY2FuQWRkSXRlbShmaWVsZDogRmllbGREZXNjcmlwdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjYW5BZGRHcm91cEl0ZW0oZmllbGQsIHRoaXMuZ2V0SXRlbXMoZmllbGQpKTtcbiAgfVxuXG4gIGNhblJlbW92ZUl0ZW0oZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2FuUmVtb3ZlR3JvdXBJdGVtKGZpZWxkLCB0aGlzLmdldEl0ZW1zKGZpZWxkKSk7XG4gIH1cblxuICBvbkdyb3VwSXRlbUFkZChmaWVsZDogRmllbGREZXNjcmlwdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5BZGRJdGVtKGZpZWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoZmllbGQpO1xuICAgIHRoaXMuY29tbWl0RGF0YSh7XG4gICAgICAuLi50aGlzLmRhdGEsXG4gICAgICBbZmllbGQubmFtZV06IFsuLi5pdGVtcywgY3JlYXRlR3JvdXBJdGVtKGZpZWxkKV0sXG4gICAgfSk7XG4gIH1cblxuICBvbkdyb3VwSXRlbVJlbW92ZShmaWVsZDogRmllbGREZXNjcmlwdGlvbiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5SZW1vdmVJdGVtKGZpZWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoZmllbGQpLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgIHRoaXMuY29tbWl0RGF0YSh7IC4uLnRoaXMuZGF0YSwgW2ZpZWxkLm5hbWVdOiBpdGVtcyB9KTtcbiAgfVxuXG4gIG9uR3JvdXBJdGVtQ2hhbmdlKFxuICAgIGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgbmV4dDogUHJvcGVydGllc1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoZmllbGQpLnNsaWNlKCk7XG4gICAgaXRlbXNbaW5kZXhdID0gbmV4dDtcbiAgICB0aGlzLmNvbW1pdERhdGEoeyAuLi50aGlzLmRhdGEsIFtmaWVsZC5uYW1lXTogaXRlbXMgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1pdERhdGEobmV4dERhdGE6IFByb3BlcnRpZXMpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEgPSBhcHBseUNvbXB1dGVkVmFsdWVzKFxuICAgICAgdGhpcy5maWVsZERlc2NyaXB0aW9ucyxcbiAgICAgIG5leHREYXRhLFxuICAgICAgdGhpcy5yb290RGF0YVxuICAgICk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlRmllbGRzKCk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuZGF0YSk7XG4gICAgdGhpcy52YWxpZGl0eUNoYW5nZS5lbWl0KFxuICAgICAgdmFsaWRhdGVGaWVsZHModGhpcy5maWVsZERlc2NyaXB0aW9ucywgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKVxuICAgICk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { fieldRegistry } from '@dynamic-field-kit/core';
3
+ // Injecting this token yields the process-wide singleton by default, so code
4
+ // that never provides it keeps working. Provide it on a component/route to give
5
+ // that subtree an isolated set of renderers:
6
+ //
7
+ // providers: [{ provide: FIELD_REGISTRY, useValue: myScopedRegistry }]
8
+ export const FIELD_REGISTRY = new InjectionToken('dfk.FieldRegistry', {
9
+ providedIn: 'root',
10
+ factory: () => fieldRegistry,
11
+ });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRSZWdpc3RyeVRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpZWxkUmVnaXN0cnlUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBaUIsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkUsNkVBQTZFO0FBQzdFLGdGQUFnRjtBQUNoRiw2Q0FBNkM7QUFDN0MsRUFBRTtBQUNGLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQzlDLG1CQUFtQixFQUNuQjtJQUNFLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhO0NBQzdCLENBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWVsZFJlZ2lzdHJ5LCBmaWVsZFJlZ2lzdHJ5IH0gZnJvbSAnQGR5bmFtaWMtZmllbGQta2l0L2NvcmUnO1xuXG4vLyBJbmplY3RpbmcgdGhpcyB0b2tlbiB5aWVsZHMgdGhlIHByb2Nlc3Mtd2lkZSBzaW5nbGV0b24gYnkgZGVmYXVsdCwgc28gY29kZVxuLy8gdGhhdCBuZXZlciBwcm92aWRlcyBpdCBrZWVwcyB3b3JraW5nLiBQcm92aWRlIGl0IG9uIGEgY29tcG9uZW50L3JvdXRlIHRvIGdpdmVcbi8vIHRoYXQgc3VidHJlZSBhbiBpc29sYXRlZCBzZXQgb2YgcmVuZGVyZXJzOlxuLy9cbi8vICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBGSUVMRF9SRUdJU1RSWSwgdXNlVmFsdWU6IG15U2NvcGVkUmVnaXN0cnkgfV1cbmV4cG9ydCBjb25zdCBGSUVMRF9SRUdJU1RSWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxGaWVsZFJlZ2lzdHJ5PihcbiAgJ2Rmay5GaWVsZFJlZ2lzdHJ5JyxcbiAge1xuICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICBmYWN0b3J5OiAoKSA9PiBmaWVsZFJlZ2lzdHJ5LFxuICB9XG4pO1xuIl19
@@ -1,13 +1,22 @@
1
1
  import { CommonModule } from '@angular/common';
2
- import { Component } from '@angular/core';
2
+ import { Component, Input } from '@angular/core';
3
+ import { layoutRegistry } from './layoutRegistry';
3
4
  import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
4
6
  export class ColumnLayout {
7
+ config;
8
+ template;
9
+ get gap() {
10
+ return this.config?.gap ?? 12;
11
+ }
5
12
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ColumnLayout, deps: [], target: i0.ɵɵFactoryTarget.Component });
6
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: ColumnLayout, isStandalone: true, selector: "dfk-column-layout", ngImport: i0, template: `<div
7
- style="display:flex;flex-direction:column;gap:var(--dfk-gap,12px)"
13
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: ColumnLayout, isStandalone: true, selector: "dfk-column-layout", inputs: { config: "config", template: "template" }, ngImport: i0, template: `<div
14
+ [style.display]="'flex'"
15
+ [style.flexDirection]="'column'"
16
+ [style.gap]="gap + 'px'"
8
17
  >
9
- <ng-content></ng-content>
10
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
18
+ <ng-container *ngTemplateOutlet="template"></ng-container>
19
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
11
20
  }
12
21
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ColumnLayout, decorators: [{
13
22
  type: Component,
@@ -16,19 +25,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
16
25
  standalone: true,
17
26
  imports: [CommonModule],
18
27
  template: `<div
19
- style="display:flex;flex-direction:column;gap:var(--dfk-gap,12px)"
28
+ [style.display]="'flex'"
29
+ [style.flexDirection]="'column'"
30
+ [style.gap]="gap + 'px'"
20
31
  >
21
- <ng-content></ng-content>
32
+ <ng-container *ngTemplateOutlet="template"></ng-container>
22
33
  </div>`,
23
34
  }]
24
- }] });
35
+ }], propDecorators: { config: [{
36
+ type: Input
37
+ }], template: [{
38
+ type: Input
39
+ }] } });
25
40
  export class RowLayout {
41
+ config;
42
+ template;
43
+ get gap() {
44
+ return this.config?.gap ?? 12;
45
+ }
26
46
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: RowLayout, deps: [], target: i0.ɵɵFactoryTarget.Component });
27
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: RowLayout, isStandalone: true, selector: "dfk-row-layout", ngImport: i0, template: `<div
28
- style="display:flex;flex-direction:row;gap:var(--dfk-gap,12px)"
47
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: RowLayout, isStandalone: true, selector: "dfk-row-layout", inputs: { config: "config", template: "template" }, ngImport: i0, template: `<div
48
+ [style.display]="'flex'"
49
+ [style.flexDirection]="'row'"
50
+ [style.gap]="gap + 'px'"
29
51
  >
30
- <ng-content></ng-content>
31
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
52
+ <ng-container *ngTemplateOutlet="template"></ng-container>
53
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
32
54
  }
33
55
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: RowLayout, decorators: [{
34
56
  type: Component,
@@ -37,19 +59,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
37
59
  standalone: true,
38
60
  imports: [CommonModule],
39
61
  template: `<div
40
- style="display:flex;flex-direction:row;gap:var(--dfk-gap,12px)"
62
+ [style.display]="'flex'"
63
+ [style.flexDirection]="'row'"
64
+ [style.gap]="gap + 'px'"
41
65
  >
42
- <ng-content></ng-content>
66
+ <ng-container *ngTemplateOutlet="template"></ng-container>
43
67
  </div>`,
44
68
  }]
45
- }] });
69
+ }], propDecorators: { config: [{
70
+ type: Input
71
+ }], template: [{
72
+ type: Input
73
+ }] } });
46
74
  export class GridLayout {
75
+ config;
76
+ template;
77
+ get columns() {
78
+ return this.config?.columns ?? 2;
79
+ }
80
+ get gap() {
81
+ return this.config?.gap ?? 12;
82
+ }
47
83
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: GridLayout, deps: [], target: i0.ɵɵFactoryTarget.Component });
48
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: GridLayout, isStandalone: true, selector: "dfk-grid-layout", ngImport: i0, template: `<div
49
- style="display:grid;grid-template-columns:repeat(var(--dfk-columns,2),1fr);gap:var(--dfk-gap,12px)"
84
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: GridLayout, isStandalone: true, selector: "dfk-grid-layout", inputs: { config: "config", template: "template" }, ngImport: i0, template: `<div
85
+ [style.display]="'grid'"
86
+ [style.gridTemplateColumns]="'repeat(' + columns + ', 1fr)'"
87
+ [style.gap]="gap + 'px'"
50
88
  >
51
- <ng-content></ng-content>
52
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
89
+ <ng-container *ngTemplateOutlet="template"></ng-container>
90
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
53
91
  }
54
92
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: GridLayout, decorators: [{
55
93
  type: Component,
@@ -58,10 +96,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
58
96
  standalone: true,
59
97
  imports: [CommonModule],
60
98
  template: `<div
61
- style="display:grid;grid-template-columns:repeat(var(--dfk-columns,2),1fr);gap:var(--dfk-gap,12px)"
99
+ [style.display]="'grid'"
100
+ [style.gridTemplateColumns]="'repeat(' + columns + ', 1fr)'"
101
+ [style.gap]="gap + 'px'"
62
102
  >
63
- <ng-content></ng-content>
103
+ <ng-container *ngTemplateOutlet="template"></ng-container>
64
104
  </div>`,
65
105
  }]
66
- }] });
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdExheW91dHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGF5b3V0L2RlZmF1bHRMYXlvdXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVkxQyxNQUFNLE9BQU8sWUFBWTt3R0FBWixZQUFZOzRGQUFaLFlBQVksNkVBTmI7Ozs7U0FJSCwyREFMRyxZQUFZOzs0RkFPWCxZQUFZO2tCQVZ4QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFFBQVEsRUFBRTs7OztTQUlIO2lCQUNSOztBQWFELE1BQU0sT0FBTyxTQUFTO3dHQUFULFNBQVM7NEZBQVQsU0FBUywwRUFOVjs7OztTQUlILDJEQUxHLFlBQVk7OzRGQU9YLFNBQVM7a0JBVnJCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFOzs7O1NBSUg7aUJBQ1I7O0FBYUQsTUFBTSxPQUFPLFVBQVU7d0dBQVYsVUFBVTs0RkFBVixVQUFVLDJFQU5YOzs7O1NBSUgsMkRBTEcsWUFBWTs7NEZBT1gsVUFBVTtrQkFWdEIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixRQUFRLEVBQUU7Ozs7U0FJSDtpQkFDUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGZrLWNvbHVtbi1sYXlvdXQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGA8ZGl2XG4gICAgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDp2YXIoLS1kZmstZ2FwLDEycHgpXCJcbiAgPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgQ29sdW1uTGF5b3V0IHt9XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rmay1yb3ctbGF5b3V0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlOiBgPGRpdlxuICAgIHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztnYXA6dmFyKC0tZGZrLWdhcCwxMnB4KVwiXG4gID5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PmAsXG59KVxuZXhwb3J0IGNsYXNzIFJvd0xheW91dCB7fVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZmstZ3JpZC1sYXlvdXQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGA8ZGl2XG4gICAgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCh2YXIoLS1kZmstY29sdW1ucywyKSwxZnIpO2dhcDp2YXIoLS1kZmstZ2FwLDEycHgpXCJcbiAgPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgR3JpZExheW91dCB7fVxuIl19
106
+ }], propDecorators: { config: [{
107
+ type: Input
108
+ }], template: [{
109
+ type: Input
110
+ }] } });
111
+ layoutRegistry.register('column', ColumnLayout);
112
+ layoutRegistry.register('row', RowLayout);
113
+ layoutRegistry.register('grid', GridLayout);
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdExheW91dHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGF5b3V0L2RlZmF1bHRMYXlvdXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7OztBQWNsRCxNQUFNLE9BQU8sWUFBWTtJQUNkLE1BQU0sQ0FBb0I7SUFDMUIsUUFBUSxDQUF3QjtJQUN6QyxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO3dHQUxVLFlBQVk7NEZBQVosWUFBWSxpSUFSYjs7Ozs7O1NBTUgsMkRBUEcsWUFBWTs7NEZBU1gsWUFBWTtrQkFaeEIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixRQUFRLEVBQUU7Ozs7OztTQU1IO2lCQUNSOzhCQUVVLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLOztBQWtCUixNQUFNLE9BQU8sU0FBUztJQUNYLE1BQU0sQ0FBb0I7SUFDMUIsUUFBUSxDQUF3QjtJQUN6QyxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO3dHQUxVLFNBQVM7NEZBQVQsU0FBUyw4SEFSVjs7Ozs7O1NBTUgsMkRBUEcsWUFBWTs7NEZBU1gsU0FBUztrQkFackIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixRQUFRLEVBQUU7Ozs7OztTQU1IO2lCQUNSOzhCQUVVLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLOztBQWtCUixNQUFNLE9BQU8sVUFBVTtJQUNaLE1BQU0sQ0FBc0M7SUFDNUMsUUFBUSxDQUF3QjtJQUN6QyxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDaEMsQ0FBQzt3R0FSVSxVQUFVOzRGQUFWLFVBQVUsK0hBUlg7Ozs7OztTQU1ILDJEQVBHLFlBQVk7OzRGQVNYLFVBQVU7a0JBWnRCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFOzs7Ozs7U0FNSDtpQkFDUjs4QkFFVSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSzs7QUFTUixjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNoRCxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbGF5b3V0UmVnaXN0cnkgfSBmcm9tICcuL2xheW91dFJlZ2lzdHJ5JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGZrLWNvbHVtbi1sYXlvdXQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGA8ZGl2XG4gICAgW3N0eWxlLmRpc3BsYXldPVwiJ2ZsZXgnXCJcbiAgICBbc3R5bGUuZmxleERpcmVjdGlvbl09XCInY29sdW1uJ1wiXG4gICAgW3N0eWxlLmdhcF09XCJnYXAgKyAncHgnXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBDb2x1bW5MYXlvdXQge1xuICBASW5wdXQoKSBjb25maWc/OiB7IGdhcD86IG51bWJlciB9O1xuICBASW5wdXQoKSB0ZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICBnZXQgZ2FwKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8uZ2FwID8/IDEyO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rmay1yb3ctbGF5b3V0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlOiBgPGRpdlxuICAgIFtzdHlsZS5kaXNwbGF5XT1cIidmbGV4J1wiXG4gICAgW3N0eWxlLmZsZXhEaXJlY3Rpb25dPVwiJ3JvdydcIlxuICAgIFtzdHlsZS5nYXBdPVwiZ2FwICsgJ3B4J1wiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgUm93TGF5b3V0IHtcbiAgQElucHV0KCkgY29uZmlnPzogeyBnYXA/OiBudW1iZXIgfTtcbiAgQElucHV0KCkgdGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgZ2V0IGdhcCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LmdhcCA/PyAxMjtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZmstZ3JpZC1sYXlvdXQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGA8ZGl2XG4gICAgW3N0eWxlLmRpc3BsYXldPVwiJ2dyaWQnXCJcbiAgICBbc3R5bGUuZ3JpZFRlbXBsYXRlQ29sdW1uc109XCIncmVwZWF0KCcgKyBjb2x1bW5zICsgJywgMWZyKSdcIlxuICAgIFtzdHlsZS5nYXBdPVwiZ2FwICsgJ3B4J1wiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgR3JpZExheW91dCB7XG4gIEBJbnB1dCgpIGNvbmZpZz86IHsgY29sdW1ucz86IG51bWJlcjsgZ2FwPzogbnVtYmVyIH07XG4gIEBJbnB1dCgpIHRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gIGdldCBjb2x1bW5zKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8uY29sdW1ucyA/PyAyO1xuICB9XG4gIGdldCBnYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy5nYXAgPz8gMTI7XG4gIH1cbn1cblxubGF5b3V0UmVnaXN0cnkucmVnaXN0ZXIoJ2NvbHVtbicsIENvbHVtbkxheW91dCk7XG5sYXlvdXRSZWdpc3RyeS5yZWdpc3Rlcigncm93JywgUm93TGF5b3V0KTtcbmxheW91dFJlZ2lzdHJ5LnJlZ2lzdGVyKCdncmlkJywgR3JpZExheW91dCk7XG4iXX0=
@@ -1,2 +1,3 @@
1
1
  export * from './defaultLayouts';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGF5b3V0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0JBQWtCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RlZmF1bHRMYXlvdXRzJztcbiJdfQ==
2
+ export { layoutRegistry, LayoutRegistry } from './layoutRegistry';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGF5b3V0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGVmYXVsdExheW91dHMnO1xuZXhwb3J0IHsgbGF5b3V0UmVnaXN0cnksIExheW91dFJlZ2lzdHJ5IH0gZnJvbSAnLi9sYXlvdXRSZWdpc3RyeSc7XG4iXX0=
@@ -0,0 +1,14 @@
1
+ export class LayoutRegistry {
2
+ layouts = new Map();
3
+ register(type, component) {
4
+ if (this.layouts.has(type)) {
5
+ console.warn(`[dynamic-field-kit] Layout "${type}" already exists`);
6
+ }
7
+ this.layouts.set(type, component);
8
+ }
9
+ get(type) {
10
+ return this.layouts.get(type);
11
+ }
12
+ }
13
+ export const layoutRegistry = new LayoutRegistry();
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0UmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGF5b3V0L2xheW91dFJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE1BQU0sT0FBTyxjQUFjO0lBQ2pCLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztJQUU1RCxRQUFRLENBQUMsSUFBWSxFQUFFLFNBQWlDO1FBQ3RELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixJQUFJLGtCQUFrQixDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBMYXlvdXRSZW5kZXJlcjxDID0gdW5rbm93bj4gPSAocHJvcHM6IHtcbiAgY2hpbGRyZW46IHVua25vd25bXTtcbiAgY29uZmlnPzogQztcbn0pID0+IHVua25vd247XG5cbmV4cG9ydCB0eXBlIEFuZ3VsYXJMYXlvdXRDb21wb25lbnQgPSBUeXBlPHVua25vd24+O1xuXG5leHBvcnQgY2xhc3MgTGF5b3V0UmVnaXN0cnkge1xuICBwcml2YXRlIGxheW91dHMgPSBuZXcgTWFwPHN0cmluZywgQW5ndWxhckxheW91dENvbXBvbmVudD4oKTtcblxuICByZWdpc3Rlcih0eXBlOiBzdHJpbmcsIGNvbXBvbmVudDogQW5ndWxhckxheW91dENvbXBvbmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxheW91dHMuaGFzKHR5cGUpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtkeW5hbWljLWZpZWxkLWtpdF0gTGF5b3V0IFwiJHt0eXBlfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMubGF5b3V0cy5zZXQodHlwZSwgY29tcG9uZW50KTtcbiAgfVxuXG4gIGdldCh0eXBlOiBzdHJpbmcpOiBBbmd1bGFyTGF5b3V0Q29tcG9uZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRzLmdldCh0eXBlKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbGF5b3V0UmVnaXN0cnkgPSBuZXcgTGF5b3V0UmVnaXN0cnkoKTtcbiJdfQ==
@@ -10,5 +10,9 @@ export * from './types/layout';
10
10
  // Module
11
11
  export * from './lib/dynamic-field-kit.module';
12
12
  // Optional: expose registry for advanced use cases, but not required for basic usage
13
- export { fieldRegistry } from '@dynamic-field-kit/core';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQjtBQUVoQixhQUFhO0FBQ2IsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxTQUFTO0FBQ1QsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxnQkFBZ0IsQ0FBQztBQUUvQixTQUFTO0FBQ1QsY0FBYyxnQ0FBZ0MsQ0FBQztBQVMvQyxxRkFBcUY7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcHVibGljLWFwaS50c1xyXG5cclxuLy8gQ29tcG9uZW50c1xyXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvQmFzZUlucHV0JztcclxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL0R5bmFtaWNJbnB1dCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9GaWVsZElucHV0JztcclxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL011bHRpRmllbGRJbnB1dCc7XHJcblxyXG4vLyBMYXlvdXRcclxuZXhwb3J0ICogZnJvbSAnLi9sYXlvdXQnO1xyXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2xheW91dCc7XHJcblxyXG4vLyBNb2R1bGVcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZHluYW1pYy1maWVsZC1raXQubW9kdWxlJztcclxuXHJcbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIGNvcmUgKG9ubHkgdHlwZSwgbm90IGV4cG9ydCAqIClcclxuZXhwb3J0IHR5cGUge1xyXG4gIEZpZWxkVHlwZUtleSxcclxuICBGaWVsZERlc2NyaXB0aW9uLFxyXG4gIEZpZWxkUmVuZGVyZXJQcm9wcyxcclxufSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XHJcblxyXG4vLyBPcHRpb25hbDogZXhwb3NlIHJlZ2lzdHJ5IGZvciBhZHZhbmNlZCB1c2UgY2FzZXMsIGJ1dCBub3QgcmVxdWlyZWQgZm9yIGJhc2ljIHVzYWdlXHJcbmV4cG9ydCB7IGZpZWxkUmVnaXN0cnkgfSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XHJcbiJdfQ==
13
+ export { fieldRegistry, FieldRegistry } from '@dynamic-field-kit/core';
14
+ export { validateField, validateFieldAsync, validateFields, validateFieldsAsync, resolveDisabled, resolveReadOnly, resolveOptions, validators, } from '@dynamic-field-kit/core';
15
+ // Scoped registry: provide FIELD_REGISTRY on a component/route to give that
16
+ // subtree an isolated set of renderers.
17
+ export { FIELD_REGISTRY } from './fieldRegistryToken';
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQjtBQUVoQixhQUFhO0FBQ2IsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxTQUFTO0FBQ1QsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxnQkFBZ0IsQ0FBQztBQUUvQixTQUFTO0FBQ1QsY0FBYyxnQ0FBZ0MsQ0FBQztBQVMvQyxxRkFBcUY7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixlQUFlLEVBQ2YsY0FBYyxFQUNkLFVBQVUsR0FDWCxNQUFNLHlCQUF5QixDQUFDO0FBR2pDLDRFQUE0RTtBQUM1RSx3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcHVibGljLWFwaS50c1xuXG4vLyBDb21wb25lbnRzXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvQmFzZUlucHV0JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9EeW5hbWljSW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL0ZpZWxkSW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL011bHRpRmllbGRJbnB1dCc7XG5cbi8vIExheW91dFxuZXhwb3J0ICogZnJvbSAnLi9sYXlvdXQnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy9sYXlvdXQnO1xuXG4vLyBNb2R1bGVcbmV4cG9ydCAqIGZyb20gJy4vbGliL2R5bmFtaWMtZmllbGQta2l0Lm1vZHVsZSc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIGNvcmUgKG9ubHkgdHlwZSwgbm90IGV4cG9ydCAqIClcbmV4cG9ydCB0eXBlIHtcbiAgRmllbGREZXNjcmlwdGlvbixcbiAgRmllbGRSZW5kZXJlclByb3BzLFxuICBGaWVsZFR5cGVLZXksXG59IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcblxuLy8gT3B0aW9uYWw6IGV4cG9zZSByZWdpc3RyeSBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzLCBidXQgbm90IHJlcXVpcmVkIGZvciBiYXNpYyB1c2FnZVxuZXhwb3J0IHsgZmllbGRSZWdpc3RyeSwgRmllbGRSZWdpc3RyeSB9IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcblxuZXhwb3J0IHtcbiAgdmFsaWRhdGVGaWVsZCxcbiAgdmFsaWRhdGVGaWVsZEFzeW5jLFxuICB2YWxpZGF0ZUZpZWxkcyxcbiAgdmFsaWRhdGVGaWVsZHNBc3luYyxcbiAgcmVzb2x2ZURpc2FibGVkLFxuICByZXNvbHZlUmVhZE9ubHksXG4gIHJlc29sdmVPcHRpb25zLFxuICB2YWxpZGF0b3JzLFxufSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5leHBvcnQgdHlwZSB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5cbi8vIFNjb3BlZCByZWdpc3RyeTogcHJvdmlkZSBGSUVMRF9SRUdJU1RSWSBvbiBhIGNvbXBvbmVudC9yb3V0ZSB0byBnaXZlIHRoYXRcbi8vIHN1YnRyZWUgYW4gaXNvbGF0ZWQgc2V0IG9mIHJlbmRlcmVycy5cbmV4cG9ydCB7IEZJRUxEX1JFR0lTVFJZIH0gZnJvbSAnLi9maWVsZFJlZ2lzdHJ5VG9rZW4nO1xuIl19