@ng-forge/dynamic-forms-material 1.3.0-next.2 → 1.3.0-next.3
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/fesm2022/ng-forge-dynamic-forms-material-lazy-addon-button.mjs +118 -33
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-addon-button.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-addon-icon.mjs +112 -33
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-addon-icon.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-button.mjs +96 -33
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-button.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-checkbox.mjs +137 -29
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-checkbox.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-datepicker.mjs +316 -62
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-datepicker.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-input.mjs +253 -107
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-input.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-multi-checkbox.mjs +179 -65
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-multi-checkbox.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-radio.mjs +168 -27
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-radio.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-select.mjs +253 -56
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-select.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-slider.mjs +157 -27
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-slider.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-textarea.mjs +206 -51
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-textarea.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-toggle.mjs +134 -29
- package/fesm2022/ng-forge-dynamic-forms-material-lazy-toggle.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material-mat-field-errors-wrapper.component-bFeO_Ift.mjs +64 -0
- package/fesm2022/ng-forge-dynamic-forms-material-mat-field-errors-wrapper.component-bFeO_Ift.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-material-shared.mjs +7 -11
- package/fesm2022/ng-forge-dynamic-forms-material-shared.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-material.mjs +241 -260
- package/fesm2022/ng-forge-dynamic-forms-material.mjs.map +1 -1
- package/package.json +2 -2
- package/types/ng-forge-dynamic-forms-material-lazy-addon-button.d.ts +17 -17
- package/types/ng-forge-dynamic-forms-material-lazy-addon-icon.d.ts +23 -16
- package/types/ng-forge-dynamic-forms-material-lazy-button.d.ts +87 -81
- package/types/ng-forge-dynamic-forms-material-lazy-checkbox.d.ts +27 -21
- package/types/ng-forge-dynamic-forms-material-lazy-datepicker.d.ts +68 -40
- package/types/ng-forge-dynamic-forms-material-lazy-input.d.ts +54 -41
- package/types/ng-forge-dynamic-forms-material-lazy-multi-checkbox.d.ts +35 -24
- package/types/ng-forge-dynamic-forms-material-lazy-radio.d.ts +30 -19
- package/types/ng-forge-dynamic-forms-material-lazy-select.d.ts +56 -38
- package/types/ng-forge-dynamic-forms-material-lazy-slider.d.ts +33 -22
- package/types/ng-forge-dynamic-forms-material-lazy-textarea.d.ts +47 -34
- package/types/ng-forge-dynamic-forms-material-lazy-toggle.d.ts +29 -23
- package/types/ng-forge-dynamic-forms-material-shared.d.ts +56 -64
- package/types/ng-forge-dynamic-forms-material.d.ts +211 -237
- package/fesm2022/ng-forge-dynamic-forms-material-mat-field-errors-wrapper.component-Dz2-IbBh.mjs +0 -26
- package/fesm2022/ng-forge-dynamic-forms-material-mat-field-errors-wrapper.component-Dz2-IbBh.mjs.map +0 -1
|
@@ -1,279 +1,260 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { MATERIAL_CONFIG } from
|
|
4
|
-
|
|
5
|
-
import { DynamicFormError } from '@ng-forge/dynamic-forms';
|
|
6
|
-
|
|
1
|
+
import { ADDON_TYPE_DEFINITIONS, ARRAY_CONTEXT, DEFAULT_PROPS, addArrayItemButtonMapper, buildBaseInputs, checkboxFieldMapper, datepickerFieldMapper, injectNonFieldLogicResolver, insertArrayItemButtonMapper, nextButtonFieldMapper, optionsFieldMapper, popArrayItemButtonMapper, prependArrayItemButtonMapper, previousButtonFieldMapper, removeArrayItemButtonMapper, shiftArrayItemButtonMapper, submitButtonFieldMapper, valueFieldMapper } from "@ng-forge/dynamic-forms/integration";
|
|
2
|
+
import { computed, inject, isSignal } from "@angular/core";
|
|
3
|
+
import { MATERIAL_CONFIG, MATERIAL_CONFIG as MATERIAL_CONFIG$1, MAT_INPUT_TYPE_OVERRIDE } from "@ng-forge/dynamic-forms-material/shared";
|
|
4
|
+
import { DynamicFormError } from "@ng-forge/dynamic-forms";
|
|
7
5
|
const MatField = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
6
|
+
Input: "input",
|
|
7
|
+
Select: "select",
|
|
8
|
+
Checkbox: "checkbox",
|
|
9
|
+
Button: "button",
|
|
10
|
+
Submit: "submit",
|
|
11
|
+
Next: "next",
|
|
12
|
+
Previous: "previous",
|
|
13
|
+
AddArrayItem: "add-array-item",
|
|
14
|
+
PrependArrayItem: "prepend-array-item",
|
|
15
|
+
InsertArrayItem: "insert-array-item",
|
|
16
|
+
RemoveArrayItem: "remove-array-item",
|
|
17
|
+
PopArrayItem: "pop-array-item",
|
|
18
|
+
ShiftArrayItem: "shift-array-item",
|
|
19
|
+
Textarea: "textarea",
|
|
20
|
+
Radio: "radio",
|
|
21
|
+
MultiCheckbox: "multi-checkbox",
|
|
22
|
+
Datepicker: "datepicker",
|
|
23
|
+
Slider: "slider",
|
|
24
|
+
Toggle: "toggle"
|
|
27
25
|
};
|
|
28
|
-
|
|
29
26
|
function buttonFieldMapper(fieldDef) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
},
|
|
59
|
-
template,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
return inputs;
|
|
63
|
-
});
|
|
27
|
+
const defaultProps = inject(DEFAULT_PROPS);
|
|
28
|
+
const arrayContext = inject(ARRAY_CONTEXT, { optional: true });
|
|
29
|
+
const resolveLogic = injectNonFieldLogicResolver(fieldDef);
|
|
30
|
+
return computed(() => {
|
|
31
|
+
const inputs = {
|
|
32
|
+
...buildBaseInputs(fieldDef, defaultProps()),
|
|
33
|
+
...resolveLogic()
|
|
34
|
+
};
|
|
35
|
+
if ("event" in fieldDef && fieldDef.event !== void 0) inputs["event"] = fieldDef.event;
|
|
36
|
+
if ("eventArgs" in fieldDef && fieldDef.eventArgs !== void 0) inputs["eventArgs"] = fieldDef.eventArgs;
|
|
37
|
+
const template = "template" in fieldDef ? fieldDef.template : void 0;
|
|
38
|
+
if (template || arrayContext) {
|
|
39
|
+
const getIndex = () => {
|
|
40
|
+
if (!arrayContext) return -1;
|
|
41
|
+
return isSignal(arrayContext.index) ? arrayContext.index() : arrayContext.index;
|
|
42
|
+
};
|
|
43
|
+
inputs["eventContext"] = {
|
|
44
|
+
key: fieldDef.key,
|
|
45
|
+
index: getIndex(),
|
|
46
|
+
arrayKey: arrayContext?.arrayKey ?? "",
|
|
47
|
+
get formValue() {
|
|
48
|
+
return arrayContext?.formValue ?? {};
|
|
49
|
+
},
|
|
50
|
+
template
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return inputs;
|
|
54
|
+
});
|
|
64
55
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const VALUE_FIELD_TYPES_BASE = {
|
|
68
|
-
renderReadyWhen: ['field'],
|
|
69
|
-
};
|
|
56
|
+
const VALUE_FIELD_TYPES_BASE = { renderReadyWhen: ["field"] };
|
|
70
57
|
const BUTTON_FIELD_TYPES_BASE = {
|
|
71
|
-
|
|
72
|
-
|
|
58
|
+
renderReadyWhen: [],
|
|
59
|
+
valueHandling: "exclude"
|
|
73
60
|
};
|
|
74
|
-
const loadInputComponent = () => import(
|
|
75
|
-
const loadSelectComponent = () => import(
|
|
76
|
-
const loadCheckboxComponent = () => import(
|
|
77
|
-
const loadButtonComponent = () => import(
|
|
78
|
-
const loadTextareaComponent = () => import(
|
|
79
|
-
const loadRadioComponent = () => import(
|
|
80
|
-
const loadMultiCheckboxComponent = () => import(
|
|
81
|
-
const loadDatepickerComponent = () => import(
|
|
82
|
-
const loadSliderComponent = () => import(
|
|
83
|
-
const loadToggleComponent = () => import(
|
|
61
|
+
const loadInputComponent = () => import("@ng-forge/dynamic-forms-material/lazy/input").then(({ MatInputFieldComponent }) => MatInputFieldComponent);
|
|
62
|
+
const loadSelectComponent = () => import("@ng-forge/dynamic-forms-material/lazy/select").then(({ MatSelectFieldComponent }) => MatSelectFieldComponent);
|
|
63
|
+
const loadCheckboxComponent = () => import("@ng-forge/dynamic-forms-material/lazy/checkbox").then(({ MatCheckboxFieldComponent }) => MatCheckboxFieldComponent);
|
|
64
|
+
const loadButtonComponent = () => import("@ng-forge/dynamic-forms-material/lazy/button").then(({ MatButtonFieldComponent }) => MatButtonFieldComponent);
|
|
65
|
+
const loadTextareaComponent = () => import("@ng-forge/dynamic-forms-material/lazy/textarea").then(({ MatTextareaFieldComponent }) => MatTextareaFieldComponent);
|
|
66
|
+
const loadRadioComponent = () => import("@ng-forge/dynamic-forms-material/lazy/radio").then(({ MatRadioFieldComponent }) => MatRadioFieldComponent);
|
|
67
|
+
const loadMultiCheckboxComponent = () => import("@ng-forge/dynamic-forms-material/lazy/multi-checkbox").then(({ MatMultiCheckboxFieldComponent }) => MatMultiCheckboxFieldComponent);
|
|
68
|
+
const loadDatepickerComponent = () => import("@ng-forge/dynamic-forms-material/lazy/datepicker").then(({ MatDatepickerFieldComponent }) => MatDatepickerFieldComponent);
|
|
69
|
+
const loadSliderComponent = () => import("@ng-forge/dynamic-forms-material/lazy/slider").then(({ MatSliderFieldComponent }) => MatSliderFieldComponent);
|
|
70
|
+
const loadToggleComponent = () => import("@ng-forge/dynamic-forms-material/lazy/toggle").then(({ MatToggleFieldComponent }) => MatToggleFieldComponent);
|
|
84
71
|
const MATERIAL_FIELD_TYPES = [
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
},
|
|
215
|
-
{
|
|
216
|
-
name: MatField.Toggle,
|
|
217
|
-
loadComponent: loadToggleComponent,
|
|
218
|
-
mapper: checkboxFieldMapper,
|
|
219
|
-
scope: 'boolean',
|
|
220
|
-
...VALUE_FIELD_TYPES_BASE,
|
|
221
|
-
},
|
|
72
|
+
{
|
|
73
|
+
name: MatField.Input,
|
|
74
|
+
loadComponent: loadInputComponent,
|
|
75
|
+
mapper: valueFieldMapper,
|
|
76
|
+
propsToMeta: ["type"],
|
|
77
|
+
scope: ["text-input", "numeric"],
|
|
78
|
+
addons: { slots: ["prefix", "suffix"] },
|
|
79
|
+
...VALUE_FIELD_TYPES_BASE
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: MatField.Select,
|
|
83
|
+
loadComponent: loadSelectComponent,
|
|
84
|
+
mapper: optionsFieldMapper,
|
|
85
|
+
scope: "single-select",
|
|
86
|
+
addons: { slots: ["prefix", "suffix"] },
|
|
87
|
+
...VALUE_FIELD_TYPES_BASE
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: MatField.Checkbox,
|
|
91
|
+
loadComponent: loadCheckboxComponent,
|
|
92
|
+
mapper: checkboxFieldMapper,
|
|
93
|
+
scope: "boolean",
|
|
94
|
+
...VALUE_FIELD_TYPES_BASE
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: MatField.Button,
|
|
98
|
+
loadComponent: loadButtonComponent,
|
|
99
|
+
mapper: buttonFieldMapper,
|
|
100
|
+
...BUTTON_FIELD_TYPES_BASE
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: MatField.Submit,
|
|
104
|
+
loadComponent: loadButtonComponent,
|
|
105
|
+
mapper: submitButtonFieldMapper,
|
|
106
|
+
...BUTTON_FIELD_TYPES_BASE
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: MatField.Next,
|
|
110
|
+
loadComponent: loadButtonComponent,
|
|
111
|
+
mapper: nextButtonFieldMapper,
|
|
112
|
+
...BUTTON_FIELD_TYPES_BASE
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: MatField.Previous,
|
|
116
|
+
loadComponent: loadButtonComponent,
|
|
117
|
+
mapper: previousButtonFieldMapper,
|
|
118
|
+
...BUTTON_FIELD_TYPES_BASE
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: MatField.AddArrayItem,
|
|
122
|
+
loadComponent: loadButtonComponent,
|
|
123
|
+
mapper: addArrayItemButtonMapper,
|
|
124
|
+
...BUTTON_FIELD_TYPES_BASE
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: MatField.PrependArrayItem,
|
|
128
|
+
loadComponent: loadButtonComponent,
|
|
129
|
+
mapper: prependArrayItemButtonMapper,
|
|
130
|
+
...BUTTON_FIELD_TYPES_BASE
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: MatField.InsertArrayItem,
|
|
134
|
+
loadComponent: loadButtonComponent,
|
|
135
|
+
mapper: insertArrayItemButtonMapper,
|
|
136
|
+
...BUTTON_FIELD_TYPES_BASE
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: MatField.RemoveArrayItem,
|
|
140
|
+
loadComponent: loadButtonComponent,
|
|
141
|
+
mapper: removeArrayItemButtonMapper,
|
|
142
|
+
...BUTTON_FIELD_TYPES_BASE
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: MatField.PopArrayItem,
|
|
146
|
+
loadComponent: loadButtonComponent,
|
|
147
|
+
mapper: popArrayItemButtonMapper,
|
|
148
|
+
...BUTTON_FIELD_TYPES_BASE
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: MatField.ShiftArrayItem,
|
|
152
|
+
loadComponent: loadButtonComponent,
|
|
153
|
+
mapper: shiftArrayItemButtonMapper,
|
|
154
|
+
...BUTTON_FIELD_TYPES_BASE
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
name: MatField.Textarea,
|
|
158
|
+
loadComponent: loadTextareaComponent,
|
|
159
|
+
mapper: valueFieldMapper,
|
|
160
|
+
propsToMeta: ["rows", "cols"],
|
|
161
|
+
scope: "text-input",
|
|
162
|
+
addons: { slots: ["prefix", "suffix"] },
|
|
163
|
+
...VALUE_FIELD_TYPES_BASE
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: MatField.Radio,
|
|
167
|
+
loadComponent: loadRadioComponent,
|
|
168
|
+
mapper: optionsFieldMapper,
|
|
169
|
+
scope: "single-select",
|
|
170
|
+
...VALUE_FIELD_TYPES_BASE
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: MatField.MultiCheckbox,
|
|
174
|
+
loadComponent: loadMultiCheckboxComponent,
|
|
175
|
+
mapper: optionsFieldMapper,
|
|
176
|
+
scope: "multi-select",
|
|
177
|
+
...VALUE_FIELD_TYPES_BASE
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: MatField.Datepicker,
|
|
181
|
+
loadComponent: loadDatepickerComponent,
|
|
182
|
+
mapper: datepickerFieldMapper,
|
|
183
|
+
scope: "date",
|
|
184
|
+
addons: { slots: ["prefix", "suffix"] },
|
|
185
|
+
...VALUE_FIELD_TYPES_BASE
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: MatField.Slider,
|
|
189
|
+
loadComponent: loadSliderComponent,
|
|
190
|
+
mapper: valueFieldMapper,
|
|
191
|
+
scope: "numeric",
|
|
192
|
+
...VALUE_FIELD_TYPES_BASE
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: MatField.Toggle,
|
|
196
|
+
loadComponent: loadToggleComponent,
|
|
197
|
+
mapper: checkboxFieldMapper,
|
|
198
|
+
scope: "boolean",
|
|
199
|
+
...VALUE_FIELD_TYPES_BASE
|
|
200
|
+
}
|
|
222
201
|
];
|
|
223
|
-
|
|
224
|
-
|
|
225
202
|
const MATERIAL_FIELD_ERRORS_WRAPPER = {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
203
|
+
wrapperName: "field-errors",
|
|
204
|
+
loadComponent: () => import("./ng-forge-dynamic-forms-material-mat-field-errors-wrapper.component-bFeO_Ift.mjs"),
|
|
205
|
+
rendersFieldErrors: true
|
|
229
206
|
};
|
|
230
207
|
function withMaterialFields(config) {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
208
|
+
const base = [
|
|
209
|
+
...MATERIAL_FIELD_TYPES,
|
|
210
|
+
withMaterialAddons(),
|
|
211
|
+
MATERIAL_FIELD_ERRORS_WRAPPER
|
|
212
|
+
];
|
|
213
|
+
if (config) {
|
|
214
|
+
base.push({
|
|
215
|
+
ɵkind: "material-config",
|
|
216
|
+
ɵproviders: [{
|
|
217
|
+
provide: MATERIAL_CONFIG$1,
|
|
218
|
+
useValue: config
|
|
219
|
+
}]
|
|
220
|
+
});
|
|
221
|
+
return base;
|
|
222
|
+
}
|
|
223
|
+
return base;
|
|
240
224
|
}
|
|
241
|
-
/* -- Material addon types ----------------------------------------------- */
|
|
242
225
|
const MAT_ICON_KIND = {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
},
|
|
226
|
+
type: "mat-icon",
|
|
227
|
+
loadComponent: () => import("@ng-forge/dynamic-forms-material/lazy/addon-icon").then((m) => m.MatIconAddonComponent),
|
|
228
|
+
validate: (addon, fieldKey) => {
|
|
229
|
+
if (typeof addon.icon !== "string" || addon.icon.length === 0) throw new DynamicFormError(`Addon type 'mat-icon' requires a non-empty 'icon' string (field: '${fieldKey}').`);
|
|
230
|
+
}
|
|
250
231
|
};
|
|
251
232
|
const MAT_BUTTON_KIND = {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
},
|
|
233
|
+
type: "mat-button",
|
|
234
|
+
loadComponent: () => import("@ng-forge/dynamic-forms-material/lazy/addon-button").then((m) => m.MatButtonAddonComponent),
|
|
235
|
+
validate: (addon, fieldKey) => {
|
|
236
|
+
if ([
|
|
237
|
+
addon.preset,
|
|
238
|
+
addon.actionRef,
|
|
239
|
+
addon.action
|
|
240
|
+
].filter((v) => v !== void 0).length > 1) throw new DynamicFormError(`Addon type 'mat-button' on field '${fieldKey}' has more than one of preset/actionRef/action — exactly one allowed.`);
|
|
241
|
+
if (addon.icon && !addon.label && !addon.ariaLabel) throw new DynamicFormError(`Addon type 'mat-button' on field '${fieldKey}' is icon-only — provide 'ariaLabel' for accessibility.`);
|
|
242
|
+
}
|
|
263
243
|
};
|
|
264
244
|
function withMaterialAddons() {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
245
|
+
return {
|
|
246
|
+
ɵkind: "addons",
|
|
247
|
+
ɵproviders: [{
|
|
248
|
+
provide: ADDON_TYPE_DEFINITIONS,
|
|
249
|
+
useValue: MAT_ICON_KIND,
|
|
250
|
+
multi: true
|
|
251
|
+
}, {
|
|
252
|
+
provide: ADDON_TYPE_DEFINITIONS,
|
|
253
|
+
useValue: MAT_BUTTON_KIND,
|
|
254
|
+
multi: true
|
|
255
|
+
}]
|
|
256
|
+
};
|
|
272
257
|
}
|
|
258
|
+
export { MATERIAL_CONFIG, MATERIAL_FIELD_TYPES, MAT_INPUT_TYPE_OVERRIDE, MatField, withMaterialAddons, withMaterialFields };
|
|
273
259
|
|
|
274
|
-
|
|
275
|
-
/* eslint-disable @nx/enforce-module-boundaries -- Package self-imports preserve ng-packagr secondary entry points. */
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
export { MATERIAL_FIELD_TYPES, MatField, withMaterialAddons, withMaterialFields };
|
|
279
|
-
//# sourceMappingURL=ng-forge-dynamic-forms-material.mjs.map
|
|
260
|
+
//# sourceMappingURL=ng-forge-dynamic-forms-material.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-forge-dynamic-forms-material.mjs","mappings":";;;;;;AAIO;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACXI;AACJ;AACA;AACA;;;AAKE;AACE;AACA;;;AAKA;;;AAKA;;QAIF;AACA;;AAGI;;AACA;AACF;;;;AAKE;AACA;AACE;;;;;AAMN;AACF;AACF;;;AClCA;;;AAQA;AACE;AACA;;AAGF;AAEA;AAEA;AAEA;AAEA;AAEA;AAEA;AAIA;AAEA;AAEA;AAOO;AACL;;AAEE;AACA;;AAEA;AACA;AACE;AACD;AACD;AACD;AACD;;AAEE;AACA;AACA;AACA;AACE;AACD;AACD;AACD;AACD;;AAEE;AACA;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACA;AACA;AACE;AACD;AACD;AACD;AACD;;AAEE;AACA;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACA;AACE;AACD;AACD;AACD;AACD;;AAEE;AACA;AACA;AACA;AACD;AACD;;AAEE;AACA;AACA;AACA;AACD;;;;AC5KH;AACE;AACA;AACA;;AAeI;;;;AAOA;;AAE+B;AACjC;;AAGF;AACF;AAEA;AAEA;AACE;AACA;AACA;AACE;AACE;;;;AAKN;AACE;AACA;AACA;;AAIE;AACE;;QAKF;AACE;;;;;;AAkBF;AACA;;;AAGC;;AAEL;;;AChHA","names":[],"ignoreList":[],"sources":["../../../../packages/dynamic-forms-material/src/lib/types/types.ts","../../../../packages/dynamic-forms-material/src/lib/fields/button/mat-button.mapper.ts","../../../../packages/dynamic-forms-material/src/lib/config/material-field-config.ts","../../../../packages/dynamic-forms-material/src/lib/providers/material-providers.ts","../../../../packages/dynamic-forms-material/src/index.ts"],"sourcesContent":["/**\n * Material Design field type constants\n * Based on available field components in the /fields folder\n */\nexport const MatField = {\n Input: 'input',\n Select: 'select',\n Checkbox: 'checkbox',\n Button: 'button',\n Submit: 'submit',\n Next: 'next',\n Previous: 'previous',\n AddArrayItem: 'add-array-item',\n PrependArrayItem: 'prepend-array-item',\n InsertArrayItem: 'insert-array-item',\n RemoveArrayItem: 'remove-array-item',\n PopArrayItem: 'pop-array-item',\n ShiftArrayItem: 'shift-array-item',\n Textarea: 'textarea',\n Radio: 'radio',\n MultiCheckbox: 'multi-checkbox',\n Datepicker: 'datepicker',\n Slider: 'slider',\n Toggle: 'toggle',\n} as const;\n\nexport type MatFieldType = (typeof MatField)[keyof typeof MatField];\n","import { computed, inject, isSignal, Signal } from '@angular/core';\nimport { FieldDef } from '@ng-forge/dynamic-forms';\nimport { ARRAY_CONTEXT, buildBaseInputs, DEFAULT_PROPS, injectNonFieldLogicResolver } from '@ng-forge/dynamic-forms/integration';\n\n/**\n * Generic button mapper for custom events or basic buttons.\n * For specific button types (submit, next, prev, add/remove array items),\n * use the dedicated field types and their specific mappers.\n *\n * @param fieldDef The button field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function buttonFieldMapper(fieldDef: FieldDef<Record<string, unknown>>): Signal<Record<string, unknown>> {\n const defaultProps = inject(DEFAULT_PROPS);\n const arrayContext = inject(ARRAY_CONTEXT, { optional: true });\n const resolveLogic = injectNonFieldLogicResolver(fieldDef);\n\n return computed(() => {\n const baseInputs = buildBaseInputs(fieldDef, defaultProps());\n\n const inputs: Record<string, unknown> = {\n ...baseInputs,\n ...resolveLogic(),\n };\n\n // Add event binding for button events\n if ('event' in fieldDef && fieldDef.event !== undefined) {\n inputs['event'] = fieldDef.event;\n }\n\n // Add eventArgs binding if provided\n if ('eventArgs' in fieldDef && fieldDef.eventArgs !== undefined) {\n inputs['eventArgs'] = fieldDef.eventArgs;\n }\n\n // Add eventContext for token resolution (supports $template, $arrayKey, $index, etc.)\n const template = 'template' in fieldDef ? fieldDef.template : undefined;\n if (template || arrayContext) {\n // Read signal value if index is a signal (supports differential updates)\n const getIndex = () => {\n if (!arrayContext) return -1;\n return isSignal(arrayContext.index) ? arrayContext.index() : arrayContext.index;\n };\n\n inputs['eventContext'] = {\n key: fieldDef.key,\n index: getIndex(),\n arrayKey: arrayContext?.arrayKey ?? '',\n get formValue() {\n return arrayContext?.formValue ?? {};\n },\n template,\n };\n }\n\n return inputs;\n });\n}\n","/* eslint-disable @nx/enforce-module-boundaries -- Package self-imports preserve ng-packagr secondary entry points. */\nimport { FieldTypeDefinition } from '@ng-forge/dynamic-forms/integration';\nimport {\n addArrayItemButtonMapper,\n checkboxFieldMapper,\n datepickerFieldMapper,\n insertArrayItemButtonMapper,\n optionsFieldMapper,\n popArrayItemButtonMapper,\n prependArrayItemButtonMapper,\n removeArrayItemButtonMapper,\n shiftArrayItemButtonMapper,\n valueFieldMapper,\n} from '@ng-forge/dynamic-forms/integration';\nimport { MatField } from '../types/types';\nimport { buttonFieldMapper } from '../fields/button/mat-button.mapper';\nimport { nextButtonFieldMapper, previousButtonFieldMapper, submitButtonFieldMapper } from '../fields/button/mat-specific-button.mapper';\n\n/**\n * Base for value-bearing field types — waits for the mapper to emit the `field`\n * input before instantiating the component (matches NgForgeField's\n * `input.required<FieldTree<T>>()` contract).\n */\nconst VALUE_FIELD_TYPES_BASE = {\n renderReadyWhen: ['field'],\n} as const;\n\n/**\n * Base for action/button field types that don't bind to a form value.\n * Renders immediately, opted out of form-value collection.\n */\nconst BUTTON_FIELD_TYPES_BASE = {\n renderReadyWhen: [],\n valueHandling: 'exclude',\n} as const;\n\nconst loadInputComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/input').then(({ MatInputFieldComponent }) => MatInputFieldComponent);\nconst loadSelectComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/select').then(({ MatSelectFieldComponent }) => MatSelectFieldComponent);\nconst loadCheckboxComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/checkbox').then(({ MatCheckboxFieldComponent }) => MatCheckboxFieldComponent);\nconst loadButtonComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/button').then(({ MatButtonFieldComponent }) => MatButtonFieldComponent);\nconst loadTextareaComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/textarea').then(({ MatTextareaFieldComponent }) => MatTextareaFieldComponent);\nconst loadRadioComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/radio').then(({ MatRadioFieldComponent }) => MatRadioFieldComponent);\nconst loadMultiCheckboxComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/multi-checkbox').then(\n ({ MatMultiCheckboxFieldComponent }) => MatMultiCheckboxFieldComponent,\n );\nconst loadDatepickerComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/datepicker').then(({ MatDatepickerFieldComponent }) => MatDatepickerFieldComponent);\nconst loadSliderComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/slider').then(({ MatSliderFieldComponent }) => MatSliderFieldComponent);\nconst loadToggleComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/toggle').then(({ MatToggleFieldComponent }) => MatToggleFieldComponent);\n\n/**\n * Material Design field type definitions\n * Follows the FieldTypeDefinition interface for proper registry integration\n */\nexport const MATERIAL_FIELD_TYPES: FieldTypeDefinition[] = [\n {\n name: MatField.Input,\n loadComponent: loadInputComponent,\n mapper: valueFieldMapper,\n propsToMeta: ['type'],\n scope: ['text-input', 'numeric'],\n addons: {\n slots: ['prefix', 'suffix'],\n },\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Select,\n loadComponent: loadSelectComponent,\n mapper: optionsFieldMapper,\n scope: 'single-select',\n addons: {\n slots: ['prefix', 'suffix'],\n },\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Checkbox,\n loadComponent: loadCheckboxComponent,\n mapper: checkboxFieldMapper,\n scope: 'boolean',\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Button,\n loadComponent: loadButtonComponent,\n mapper: buttonFieldMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Submit,\n loadComponent: loadButtonComponent,\n mapper: submitButtonFieldMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Next,\n loadComponent: loadButtonComponent,\n mapper: nextButtonFieldMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Previous,\n loadComponent: loadButtonComponent,\n mapper: previousButtonFieldMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.AddArrayItem,\n loadComponent: loadButtonComponent,\n mapper: addArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.PrependArrayItem,\n loadComponent: loadButtonComponent,\n mapper: prependArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.InsertArrayItem,\n loadComponent: loadButtonComponent,\n mapper: insertArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.RemoveArrayItem,\n loadComponent: loadButtonComponent,\n mapper: removeArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.PopArrayItem,\n loadComponent: loadButtonComponent,\n mapper: popArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.ShiftArrayItem,\n loadComponent: loadButtonComponent,\n mapper: shiftArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Textarea,\n loadComponent: loadTextareaComponent,\n mapper: valueFieldMapper,\n propsToMeta: ['rows', 'cols'],\n scope: 'text-input',\n addons: {\n slots: ['prefix', 'suffix'],\n },\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Radio,\n loadComponent: loadRadioComponent,\n mapper: optionsFieldMapper,\n scope: 'single-select',\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.MultiCheckbox,\n loadComponent: loadMultiCheckboxComponent,\n mapper: optionsFieldMapper,\n scope: 'multi-select',\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Datepicker,\n loadComponent: loadDatepickerComponent,\n mapper: datepickerFieldMapper,\n scope: 'date',\n addons: {\n slots: ['prefix', 'suffix'],\n },\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Slider,\n loadComponent: loadSliderComponent,\n mapper: valueFieldMapper,\n scope: 'numeric',\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Toggle,\n loadComponent: loadToggleComponent,\n mapper: checkboxFieldMapper,\n scope: 'boolean',\n ...VALUE_FIELD_TYPES_BASE,\n },\n];\n","/* eslint-disable @nx/enforce-module-boundaries -- Package self-imports preserve ng-packagr secondary entry points. */\nimport type { Provider } from '@angular/core';\nimport { DynamicFormError, type AddonTypeDefinition } from '@ng-forge/dynamic-forms';\nimport { ADDON_TYPE_DEFINITIONS, type FieldTypeDefinition, type WrapperTypeDefinition } from '@ng-forge/dynamic-forms/integration';\nimport { MATERIAL_CONFIG, type MaterialConfig, type MatButtonAddon, type MatIconAddon } from '@ng-forge/dynamic-forms-material/shared';\nimport { MATERIAL_FIELD_TYPES } from '../config/material-field-config';\n\n/** Field type definitions for Material Design components. */\nexport type MaterialFieldTypes = FieldTypeDefinition[];\n\ntype MaterialConfigFeature = {\n ɵkind: 'material-config';\n ɵproviders: Provider[];\n};\n\n/**\n * Default `withMaterialFields()` shape — field defs + the auto-included\n * addons feature so `mat-icon` / `mat-button` work out of the box.\n */\ntype MaterialFieldsWithAddons = [...MaterialFieldTypes, MaterialAddonsFeature, WrapperTypeDefinition];\n\ntype MaterialFieldsWithConfig = [...MaterialFieldTypes, MaterialAddonsFeature, WrapperTypeDefinition, MaterialConfigFeature];\n\n/**\n * Replaces the neutral core `field-errors` wrapper with the Material one, so\n * a container-level validation message renders like a field-level one.\n * Registered under the same name, so the later registration wins.\n */\nconst MATERIAL_FIELD_ERRORS_WRAPPER: WrapperTypeDefinition = {\n wrapperName: 'field-errors',\n loadComponent: () => import('../wrappers/field-errors/mat-field-errors-wrapper.component'),\n rendersFieldErrors: true,\n};\n\n/**\n * Configure dynamic forms with Material Design field types, with\n * Material-shipped addon types (`mat-icon`, `mat-button`) auto-included so\n * addons work out of the box.\n *\n * @param config - Optional global configuration for Material form fields\n * @returns Tuple of field type definitions, the addons feature, and\n * optionally a config feature.\n */\nexport function withMaterialFields(): MaterialFieldsWithAddons;\nexport function withMaterialFields(config: MaterialConfig): MaterialFieldsWithConfig;\nexport function withMaterialFields(config: MaterialConfig | undefined): MaterialFieldsWithAddons | MaterialFieldsWithConfig;\nexport function withMaterialFields(config?: MaterialConfig): MaterialFieldsWithAddons | MaterialFieldsWithConfig {\n // Always include the addons feature — mat-icon / mat-button are part of\n // the canonical Material surface.\n const base: unknown[] = [...MATERIAL_FIELD_TYPES, withMaterialAddons(), MATERIAL_FIELD_ERRORS_WRAPPER];\n\n if (config) {\n base.push({\n ɵkind: 'material-config',\n ɵproviders: [{ provide: MATERIAL_CONFIG, useValue: config }],\n } satisfies MaterialConfigFeature);\n return base as MaterialFieldsWithConfig;\n }\n\n return base as MaterialFieldsWithAddons;\n}\n\n/* -- Material addon types ----------------------------------------------- */\n\nconst MAT_ICON_KIND: AddonTypeDefinition<MatIconAddon> = {\n type: 'mat-icon',\n loadComponent: () => import('@ng-forge/dynamic-forms-material/lazy/addon-icon').then((m) => m.MatIconAddonComponent),\n validate: (addon, fieldKey) => {\n if (typeof addon.icon !== 'string' || addon.icon.length === 0) {\n throw new DynamicFormError(`Addon type 'mat-icon' requires a non-empty 'icon' string (field: '${fieldKey}').`);\n }\n },\n};\n\nconst MAT_BUTTON_KIND: AddonTypeDefinition<MatButtonAddon> = {\n type: 'mat-button',\n loadComponent: () => import('@ng-forge/dynamic-forms-material/lazy/addon-button').then((m) => m.MatButtonAddonComponent),\n validate: (addon, fieldKey) => {\n // Exactly one of preset / actionRef / action — validator drops the addon\n // (with warning) if the rule is violated.\n const set = [addon.preset, addon.actionRef, addon.action].filter((v) => v !== undefined);\n if (set.length > 1) {\n throw new DynamicFormError(\n `Addon type 'mat-button' on field '${fieldKey}' has more than one of preset/actionRef/action — exactly one allowed.`,\n );\n }\n // Icon-only buttons require ariaLabel for screen readers.\n if (addon.icon && !addon.label && !addon.ariaLabel) {\n throw new DynamicFormError(`Addon type 'mat-button' on field '${fieldKey}' is icon-only — provide 'ariaLabel' for accessibility.`);\n }\n },\n};\n\n/**\n * Feature type discriminant for the Material addons feature. Matches core's\n * `'addons'` type so providers flow through the standard addon-type pipeline\n * in `provideDynamicForm`.\n */\ntype MaterialAddonsFeature = {\n ɵkind: 'addons';\n ɵproviders: Provider[];\n};\n\n/** Register Material-shipped addon types (`mat-icon`, `mat-button`) standalone. */\nexport function withMaterialAddons(): MaterialAddonsFeature {\n return {\n ɵkind: 'addons',\n ɵproviders: [\n { provide: ADDON_TYPE_DEFINITIONS, useValue: MAT_ICON_KIND, multi: true },\n { provide: ADDON_TYPE_DEFINITIONS, useValue: MAT_BUTTON_KIND, multi: true },\n ],\n };\n}\n","/* eslint-disable @nx/enforce-module-boundaries -- Package self-imports preserve ng-packagr secondary entry points. */\nexport { MATERIAL_FIELD_TYPES, MATERIAL_CONFIG, MatField, withMaterialFields, withMaterialAddons, MAT_INPUT_TYPE_OVERRIDE } from './lib';\n\nexport type { MatIconAddon, MatButtonAddon, MatAddon, MatInputAddon, MatAddonExtensions } from './lib';\n\nexport type {\n MatButtonProps,\n MatButtonField,\n MatSubmitButtonField,\n MatNextButtonField,\n MatPreviousButtonField,\n MatAddArrayItemButtonField,\n MatPrependArrayItemButtonField,\n MatInsertArrayItemButtonField,\n MatRemoveArrayItemButtonField,\n MatPopArrayItemButtonField,\n MatShiftArrayItemButtonField,\n MatCheckboxProps,\n MatCheckboxField,\n MatDatepickerProps,\n MatDatepickerField,\n MatInputProps,\n MatInputField,\n MatMultiCheckboxProps,\n MatMultiCheckboxField,\n MatRadioProps,\n MatRadioField,\n MatSelectProps,\n MatSelectField,\n MatSliderProps,\n MatSliderField,\n MatTextareaProps,\n MatTextareaField,\n MatToggleProps,\n MatToggleField,\n MaterialConfig,\n MatFieldType,\n MatFormProps,\n MatFormConfig,\n} from './lib';\n\n// Component classes load from the lazy entries. Re-exporting their values here would bundle them\n// eagerly, and compiling them into this entry creates duplicate classes (NG0912, #625).\nimport type { FormEvent } from '@ng-forge/dynamic-forms';\nimport type { MatButtonFieldComponent as MatButtonFieldComponentClass } from '@ng-forge/dynamic-forms-material/lazy/button';\nimport type { MatCheckboxFieldComponent as MatCheckboxFieldComponentClass } from '@ng-forge/dynamic-forms-material/lazy/checkbox';\nimport type { MatDatepickerFieldComponent as MatDatepickerFieldComponentClass } from '@ng-forge/dynamic-forms-material/lazy/datepicker';\nimport type { MatInputFieldComponent as MatInputFieldComponentClass } from '@ng-forge/dynamic-forms-material/lazy/input';\nimport type { MatMultiCheckboxFieldComponent as MatMultiCheckboxFieldComponentClass } from '@ng-forge/dynamic-forms-material/lazy/multi-checkbox';\nimport type { MatRadioFieldComponent as MatRadioFieldComponentClass } from '@ng-forge/dynamic-forms-material/lazy/radio';\nimport type { MatSelectFieldComponent as MatSelectFieldComponentClass } from '@ng-forge/dynamic-forms-material/lazy/select';\nimport type { MatSliderFieldComponent as MatSliderFieldComponentClass } from '@ng-forge/dynamic-forms-material/lazy/slider';\nimport type { MatTextareaFieldComponent as MatTextareaFieldComponentClass } from '@ng-forge/dynamic-forms-material/lazy/textarea';\nimport type { MatToggleFieldComponent as MatToggleFieldComponentClass } from '@ng-forge/dynamic-forms-material/lazy/toggle';\nimport type { MatIconAddonComponent as MatIconAddonComponentClass } from '@ng-forge/dynamic-forms-material/lazy/addon-icon';\nimport type { MatButtonAddonComponent as MatButtonAddonComponentClass } from '@ng-forge/dynamic-forms-material/lazy/addon-button';\n\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/button`. Import it from there to use the class as a value. */\nexport type MatButtonFieldComponent<TEvent extends FormEvent> = MatButtonFieldComponentClass<TEvent>;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/checkbox`. Import it from there to use the class as a value. */\nexport type MatCheckboxFieldComponent = MatCheckboxFieldComponentClass;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/datepicker`. Import it from there to use the class as a value. */\nexport type MatDatepickerFieldComponent = MatDatepickerFieldComponentClass;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/input`. Import it from there to use the class as a value. */\nexport type MatInputFieldComponent = MatInputFieldComponentClass;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/multi-checkbox`. Import it from there to use the class as a value. */\nexport type MatMultiCheckboxFieldComponent = MatMultiCheckboxFieldComponentClass;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/radio`. Import it from there to use the class as a value. */\nexport type MatRadioFieldComponent = MatRadioFieldComponentClass;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/select`. Import it from there to use the class as a value. */\nexport type MatSelectFieldComponent = MatSelectFieldComponentClass;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/slider`. Import it from there to use the class as a value. */\nexport type MatSliderFieldComponent = MatSliderFieldComponentClass;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/textarea`. Import it from there to use the class as a value. */\nexport type MatTextareaFieldComponent = MatTextareaFieldComponentClass;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/toggle`. Import it from there to use the class as a value. */\nexport type MatToggleFieldComponent = MatToggleFieldComponentClass;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/addon-icon`. Import it from there to use the class as a value. */\nexport type MatIconAddonComponent = MatIconAddonComponentClass;\n/** Class type of the component in `@ng-forge/dynamic-forms-material/lazy/addon-button`. Import it from there to use the class as a value. */\nexport type MatButtonAddonComponent = MatButtonAddonComponentClass;\n"]}
|
|
1
|
+
{"version":3,"file":"ng-forge-dynamic-forms-material.mjs","names":["MATERIAL_CONFIG"],"sources":["../../../../packages/dynamic-forms-material/src/lib/types/types.ts","../../../../packages/dynamic-forms-material/src/lib/fields/button/mat-button.mapper.ts","../../../../packages/dynamic-forms-material/src/lib/config/material-field-config.ts","../../../../packages/dynamic-forms-material/src/lib/providers/material-providers.ts"],"sourcesContent":["/**\n * Material Design field type constants\n * Based on available field components in the /fields folder\n */\nexport const MatField = {\n Input: 'input',\n Select: 'select',\n Checkbox: 'checkbox',\n Button: 'button',\n Submit: 'submit',\n Next: 'next',\n Previous: 'previous',\n AddArrayItem: 'add-array-item',\n PrependArrayItem: 'prepend-array-item',\n InsertArrayItem: 'insert-array-item',\n RemoveArrayItem: 'remove-array-item',\n PopArrayItem: 'pop-array-item',\n ShiftArrayItem: 'shift-array-item',\n Textarea: 'textarea',\n Radio: 'radio',\n MultiCheckbox: 'multi-checkbox',\n Datepicker: 'datepicker',\n Slider: 'slider',\n Toggle: 'toggle',\n} as const;\n\nexport type MatFieldType = (typeof MatField)[keyof typeof MatField];\n","import { computed, inject, isSignal, Signal } from '@angular/core';\nimport { FieldDef } from '@ng-forge/dynamic-forms';\nimport { ARRAY_CONTEXT, buildBaseInputs, DEFAULT_PROPS, injectNonFieldLogicResolver } from '@ng-forge/dynamic-forms/integration';\n\n/**\n * Generic button mapper for custom events or basic buttons.\n * For specific button types (submit, next, prev, add/remove array items),\n * use the dedicated field types and their specific mappers.\n *\n * @param fieldDef The button field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function buttonFieldMapper(fieldDef: FieldDef<Record<string, unknown>>): Signal<Record<string, unknown>> {\n const defaultProps = inject(DEFAULT_PROPS);\n const arrayContext = inject(ARRAY_CONTEXT, { optional: true });\n const resolveLogic = injectNonFieldLogicResolver(fieldDef);\n\n return computed(() => {\n const baseInputs = buildBaseInputs(fieldDef, defaultProps());\n\n const inputs: Record<string, unknown> = {\n ...baseInputs,\n ...resolveLogic(),\n };\n\n // Add event binding for button events\n if ('event' in fieldDef && fieldDef.event !== undefined) {\n inputs['event'] = fieldDef.event;\n }\n\n // Add eventArgs binding if provided\n if ('eventArgs' in fieldDef && fieldDef.eventArgs !== undefined) {\n inputs['eventArgs'] = fieldDef.eventArgs;\n }\n\n // Add eventContext for token resolution (supports $template, $arrayKey, $index, etc.)\n const template = 'template' in fieldDef ? fieldDef.template : undefined;\n if (template || arrayContext) {\n // Read signal value if index is a signal (supports differential updates)\n const getIndex = () => {\n if (!arrayContext) return -1;\n return isSignal(arrayContext.index) ? arrayContext.index() : arrayContext.index;\n };\n\n inputs['eventContext'] = {\n key: fieldDef.key,\n index: getIndex(),\n arrayKey: arrayContext?.arrayKey ?? '',\n get formValue() {\n return arrayContext?.formValue ?? {};\n },\n template,\n };\n }\n\n return inputs;\n });\n}\n","/* eslint-disable @nx/enforce-module-boundaries -- Package self-imports preserve ng-packagr secondary entry points. */\nimport { FieldTypeDefinition } from '@ng-forge/dynamic-forms/integration';\nimport {\n addArrayItemButtonMapper,\n checkboxFieldMapper,\n datepickerFieldMapper,\n insertArrayItemButtonMapper,\n optionsFieldMapper,\n popArrayItemButtonMapper,\n prependArrayItemButtonMapper,\n removeArrayItemButtonMapper,\n shiftArrayItemButtonMapper,\n valueFieldMapper,\n} from '@ng-forge/dynamic-forms/integration';\nimport { MatField } from '../types/types';\nimport { buttonFieldMapper } from '../fields/button/mat-button.mapper';\nimport { nextButtonFieldMapper, previousButtonFieldMapper, submitButtonFieldMapper } from '../fields/button/mat-specific-button.mapper';\n\n/**\n * Base for value-bearing field types — waits for the mapper to emit the `field`\n * input before instantiating the component (matches NgForgeField's\n * `input.required<FieldTree<T>>()` contract).\n */\nconst VALUE_FIELD_TYPES_BASE = {\n renderReadyWhen: ['field'],\n} as const;\n\n/**\n * Base for action/button field types that don't bind to a form value.\n * Renders immediately, opted out of form-value collection.\n */\nconst BUTTON_FIELD_TYPES_BASE = {\n renderReadyWhen: [],\n valueHandling: 'exclude',\n} as const;\n\nconst loadInputComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/input').then(({ MatInputFieldComponent }) => MatInputFieldComponent);\nconst loadSelectComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/select').then(({ MatSelectFieldComponent }) => MatSelectFieldComponent);\nconst loadCheckboxComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/checkbox').then(({ MatCheckboxFieldComponent }) => MatCheckboxFieldComponent);\nconst loadButtonComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/button').then(({ MatButtonFieldComponent }) => MatButtonFieldComponent);\nconst loadTextareaComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/textarea').then(({ MatTextareaFieldComponent }) => MatTextareaFieldComponent);\nconst loadRadioComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/radio').then(({ MatRadioFieldComponent }) => MatRadioFieldComponent);\nconst loadMultiCheckboxComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/multi-checkbox').then(\n ({ MatMultiCheckboxFieldComponent }) => MatMultiCheckboxFieldComponent,\n );\nconst loadDatepickerComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/datepicker').then(({ MatDatepickerFieldComponent }) => MatDatepickerFieldComponent);\nconst loadSliderComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/slider').then(({ MatSliderFieldComponent }) => MatSliderFieldComponent);\nconst loadToggleComponent = () =>\n import('@ng-forge/dynamic-forms-material/lazy/toggle').then(({ MatToggleFieldComponent }) => MatToggleFieldComponent);\n\n/**\n * Material Design field type definitions\n * Follows the FieldTypeDefinition interface for proper registry integration\n */\nexport const MATERIAL_FIELD_TYPES: FieldTypeDefinition[] = [\n {\n name: MatField.Input,\n loadComponent: loadInputComponent,\n mapper: valueFieldMapper,\n propsToMeta: ['type'],\n scope: ['text-input', 'numeric'],\n addons: {\n slots: ['prefix', 'suffix'],\n },\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Select,\n loadComponent: loadSelectComponent,\n mapper: optionsFieldMapper,\n scope: 'single-select',\n addons: {\n slots: ['prefix', 'suffix'],\n },\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Checkbox,\n loadComponent: loadCheckboxComponent,\n mapper: checkboxFieldMapper,\n scope: 'boolean',\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Button,\n loadComponent: loadButtonComponent,\n mapper: buttonFieldMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Submit,\n loadComponent: loadButtonComponent,\n mapper: submitButtonFieldMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Next,\n loadComponent: loadButtonComponent,\n mapper: nextButtonFieldMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Previous,\n loadComponent: loadButtonComponent,\n mapper: previousButtonFieldMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.AddArrayItem,\n loadComponent: loadButtonComponent,\n mapper: addArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.PrependArrayItem,\n loadComponent: loadButtonComponent,\n mapper: prependArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.InsertArrayItem,\n loadComponent: loadButtonComponent,\n mapper: insertArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.RemoveArrayItem,\n loadComponent: loadButtonComponent,\n mapper: removeArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.PopArrayItem,\n loadComponent: loadButtonComponent,\n mapper: popArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.ShiftArrayItem,\n loadComponent: loadButtonComponent,\n mapper: shiftArrayItemButtonMapper,\n ...BUTTON_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Textarea,\n loadComponent: loadTextareaComponent,\n mapper: valueFieldMapper,\n propsToMeta: ['rows', 'cols'],\n scope: 'text-input',\n addons: {\n slots: ['prefix', 'suffix'],\n },\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Radio,\n loadComponent: loadRadioComponent,\n mapper: optionsFieldMapper,\n scope: 'single-select',\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.MultiCheckbox,\n loadComponent: loadMultiCheckboxComponent,\n mapper: optionsFieldMapper,\n scope: 'multi-select',\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Datepicker,\n loadComponent: loadDatepickerComponent,\n mapper: datepickerFieldMapper,\n scope: 'date',\n addons: {\n slots: ['prefix', 'suffix'],\n },\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Slider,\n loadComponent: loadSliderComponent,\n mapper: valueFieldMapper,\n scope: 'numeric',\n ...VALUE_FIELD_TYPES_BASE,\n },\n {\n name: MatField.Toggle,\n loadComponent: loadToggleComponent,\n mapper: checkboxFieldMapper,\n scope: 'boolean',\n ...VALUE_FIELD_TYPES_BASE,\n },\n];\n","/* eslint-disable @nx/enforce-module-boundaries -- Package self-imports preserve ng-packagr secondary entry points. */\nimport type { Provider } from '@angular/core';\nimport { DynamicFormError, type AddonTypeDefinition } from '@ng-forge/dynamic-forms';\nimport { ADDON_TYPE_DEFINITIONS, type FieldTypeDefinition, type WrapperTypeDefinition } from '@ng-forge/dynamic-forms/integration';\nimport { MATERIAL_CONFIG, type MaterialConfig, type MatButtonAddon, type MatIconAddon } from '@ng-forge/dynamic-forms-material/shared';\nimport { MATERIAL_FIELD_TYPES } from '../config/material-field-config';\n\n/** Field type definitions for Material Design components. */\nexport type MaterialFieldTypes = FieldTypeDefinition[];\n\ntype MaterialConfigFeature = {\n ɵkind: 'material-config';\n ɵproviders: Provider[];\n};\n\n/**\n * Default `withMaterialFields()` shape — field defs + the auto-included\n * addons feature so `mat-icon` / `mat-button` work out of the box.\n */\ntype MaterialFieldsWithAddons = [...MaterialFieldTypes, MaterialAddonsFeature, WrapperTypeDefinition];\n\ntype MaterialFieldsWithConfig = [...MaterialFieldTypes, MaterialAddonsFeature, WrapperTypeDefinition, MaterialConfigFeature];\n\n/**\n * Replaces the neutral core `field-errors` wrapper with the Material one, so\n * a container-level validation message renders like a field-level one.\n * Registered under the same name, so the later registration wins.\n */\nconst MATERIAL_FIELD_ERRORS_WRAPPER: WrapperTypeDefinition = {\n wrapperName: 'field-errors',\n loadComponent: () => import('../wrappers/field-errors/mat-field-errors-wrapper.component'),\n rendersFieldErrors: true,\n};\n\n/**\n * Configure dynamic forms with Material Design field types, with\n * Material-shipped addon types (`mat-icon`, `mat-button`) auto-included so\n * addons work out of the box.\n *\n * @param config - Optional global configuration for Material form fields\n * @returns Tuple of field type definitions, the addons feature, and\n * optionally a config feature.\n */\nexport function withMaterialFields(): MaterialFieldsWithAddons;\nexport function withMaterialFields(config: MaterialConfig): MaterialFieldsWithConfig;\nexport function withMaterialFields(config: MaterialConfig | undefined): MaterialFieldsWithAddons | MaterialFieldsWithConfig;\nexport function withMaterialFields(config?: MaterialConfig): MaterialFieldsWithAddons | MaterialFieldsWithConfig {\n // Always include the addons feature — mat-icon / mat-button are part of\n // the canonical Material surface.\n const base: unknown[] = [...MATERIAL_FIELD_TYPES, withMaterialAddons(), MATERIAL_FIELD_ERRORS_WRAPPER];\n\n if (config) {\n base.push({\n ɵkind: 'material-config',\n ɵproviders: [{ provide: MATERIAL_CONFIG, useValue: config }],\n } satisfies MaterialConfigFeature);\n return base as MaterialFieldsWithConfig;\n }\n\n return base as MaterialFieldsWithAddons;\n}\n\n/* -- Material addon types ----------------------------------------------- */\n\nconst MAT_ICON_KIND: AddonTypeDefinition<MatIconAddon> = {\n type: 'mat-icon',\n loadComponent: () => import('@ng-forge/dynamic-forms-material/lazy/addon-icon').then((m) => m.MatIconAddonComponent),\n validate: (addon, fieldKey) => {\n if (typeof addon.icon !== 'string' || addon.icon.length === 0) {\n throw new DynamicFormError(`Addon type 'mat-icon' requires a non-empty 'icon' string (field: '${fieldKey}').`);\n }\n },\n};\n\nconst MAT_BUTTON_KIND: AddonTypeDefinition<MatButtonAddon> = {\n type: 'mat-button',\n loadComponent: () => import('@ng-forge/dynamic-forms-material/lazy/addon-button').then((m) => m.MatButtonAddonComponent),\n validate: (addon, fieldKey) => {\n // Exactly one of preset / actionRef / action — validator drops the addon\n // (with warning) if the rule is violated.\n const set = [addon.preset, addon.actionRef, addon.action].filter((v) => v !== undefined);\n if (set.length > 1) {\n throw new DynamicFormError(\n `Addon type 'mat-button' on field '${fieldKey}' has more than one of preset/actionRef/action — exactly one allowed.`,\n );\n }\n // Icon-only buttons require ariaLabel for screen readers.\n if (addon.icon && !addon.label && !addon.ariaLabel) {\n throw new DynamicFormError(`Addon type 'mat-button' on field '${fieldKey}' is icon-only — provide 'ariaLabel' for accessibility.`);\n }\n },\n};\n\n/**\n * Feature type discriminant for the Material addons feature. Matches core's\n * `'addons'` type so providers flow through the standard addon-type pipeline\n * in `provideDynamicForm`.\n */\ntype MaterialAddonsFeature = {\n ɵkind: 'addons';\n ɵproviders: Provider[];\n};\n\n/** Register Material-shipped addon types (`mat-icon`, `mat-button`) standalone. */\nexport function withMaterialAddons(): MaterialAddonsFeature {\n return {\n ɵkind: 'addons',\n ɵproviders: [\n { provide: ADDON_TYPE_DEFINITIONS, useValue: MAT_ICON_KIND, multi: true },\n { provide: ADDON_TYPE_DEFINITIONS, useValue: MAT_BUTTON_KIND, multi: true },\n ],\n };\n}\n"],"mappings":";;;;AAIA,MAAa,WAAW;CACtB,OAAO;CACP,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,UAAU;CACV,cAAc;CACd,kBAAkB;CAClB,iBAAiB;CACjB,iBAAiB;CACjB,cAAc;CACd,gBAAgB;CAChB,UAAU;CACV,OAAO;CACP,eAAe;CACf,YAAY;CACZ,QAAQ;CACR,QAAQ;AACA;ACZV,SAAgB,kBAAkB,UAA2C;CAC3E,MAAM,eAAe,OAAO,aAAa;CACzC,MAAM,eAAe,OAAO,eAAe,EAAE,UAAU,KAAI,CAAE;CAC7D,MAAM,eAAe,4BAA4B,QAAQ;CAEzD,OAAO,eAAc;EAGnB,MAAM,SAAkC;GACtC,GAHiB,gBAAgB,UAAU,aAAY,CAGpD;GACH,GAAG,aAAY;EAChB;EAGD,IAAI,WAAW,YAAY,SAAS,UAAU,QAC5C,OAAO,WAAW,SAAS;EAI7B,IAAI,eAAe,YAAY,SAAS,cAAc,QACpD,OAAO,eAAe,SAAS;EAIjC,MAAM,WAAW,cAAc,WAAW,SAAS,WAAW;EAC9D,IAAI,YAAY,cAAc;GAE5B,MAAM,iBAAgB;IACpB,IAAI,CAAC,cAAc,OAAO;IAC1B,OAAO,SAAS,aAAa,KAAK,IAAI,aAAa,MAAK,IAAK,aAAa;GAC5E;GAEA,OAAO,kBAAkB;IACvB,KAAK,SAAS;IACd,OAAO,SAAQ;IACf,UAAU,cAAc,YAAY;IACpC,IAAI,YAAS;KACX,OAAO,cAAc,aAAa,CAAA;IACpC;IACA;GACD;EACH;EAEA,OAAO;CACT,CAAC;AACH;AClCA,MAAM,yBAAyB,EAC7B,iBAAiB,CAAC,OAAO,EACjB;AAMV,MAAM,0BAA0B;CAC9B,iBAAiB,CAAA;CACjB,eAAe;AACP;AAEV,MAAM,2BACJ,OAAO,8CAA8C,CAAC,MAAM,EAAE,6BAA6B,sBAAsB;AACnH,MAAM,4BACJ,OAAO,+CAA+C,CAAC,MAAM,EAAE,8BAA8B,uBAAuB;AACtH,MAAM,8BACJ,OAAO,iDAAiD,CAAC,MAAM,EAAE,gCAAgC,yBAAyB;AAC5H,MAAM,4BACJ,OAAO,+CAA+C,CAAC,MAAM,EAAE,8BAA8B,uBAAuB;AACtH,MAAM,8BACJ,OAAO,iDAAiD,CAAC,MAAM,EAAE,gCAAgC,yBAAyB;AAC5H,MAAM,2BACJ,OAAO,8CAA8C,CAAC,MAAM,EAAE,6BAA6B,sBAAsB;AACnH,MAAM,mCACJ,OAAO,uDAAuD,CAAC,MAC5D,EAAE,qCAAqC,8BAA8B;AAE1E,MAAM,gCACJ,OAAO,mDAAmD,CAAC,MAAM,EAAE,kCAAkC,2BAA2B;AAClI,MAAM,4BACJ,OAAO,+CAA+C,CAAC,MAAM,EAAE,8BAA8B,uBAAuB;AACtH,MAAM,4BACJ,OAAO,+CAA+C,CAAC,MAAM,EAAE,8BAA8B,uBAAuB;AAMtH,MAAa,uBAA8C;CACzD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,aAAa,CAAC,MAAM;EACpB,OAAO,CAAC,cAAc,SAAS;EAC/B,QAAQ,EACN,OAAO,CAAC,UAAU,QAAQ,EAC3B;EACD,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,OAAO;EACP,QAAQ,EACN,OAAO,CAAC,UAAU,QAAQ,EAC3B;EACD,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,OAAO;EACP,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,aAAa,CAAC,QAAQ,MAAM;EAC5B,OAAO;EACP,QAAQ,EACN,OAAO,CAAC,UAAU,QAAQ,EAC3B;EACD,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,OAAO;EACP,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,OAAO;EACP,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,OAAO;EACP,QAAQ,EACN,OAAO,CAAC,UAAU,QAAQ,EAC3B;EACD,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,OAAO;EACP,GAAG;CACJ;CACD;EACE,MAAM,SAAS;EACf,eAAe;EACf,QAAQ;EACR,OAAO;EACP,GAAG;CACJ;AACF;AC7KD,MAAM,gCAAuD;CAC3D,aAAa;CACb,qBAAqB,OAAO;CAC5B,oBAAoB;AACrB;AAcD,SAAgB,mBAAmB,QAAuB;CAGxD,MAAM,OAAkB;EAAC,GAAG;EAAsB,mBAAkB;EAAI;CAA6B;CAErG,IAAI,QAAQ;EACV,KAAK,KAAK;GACR,OAAO;GACP,YAAY,CAAC;IAAE,SAASA;IAAiB,UAAU;GAAM,CAAE;EAC5B,CAAA;EACjC,OAAO;CACT;CAEA,OAAO;AACT;AAIA,MAAM,gBAAmD;CACvD,MAAM;CACN,qBAAqB,OAAO,mDAAmD,CAAC,MAAM,MAAM,EAAE,qBAAqB;CACnH,WAAW,OAAO,aAAY;EAC5B,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,WAAW,GAC1D,MAAM,IAAI,iBAAiB,qEAAqE,SAAQ,IAAK;CAEjH;AACD;AAED,MAAM,kBAAuD;CAC3D,MAAM;CACN,qBAAqB,OAAO,qDAAqD,CAAC,MAAM,MAAM,EAAE,uBAAuB;CACvH,WAAW,OAAO,aAAY;EAI5B,IADY;GAAC,MAAM;GAAQ,MAAM;GAAW,MAAM;EAAM,CAAC,CAAC,QAAQ,MAAM,MAAM,MAC1E,CAAA,CAAI,SAAS,GACf,MAAM,IAAI,iBACR,qCAAqC,SAAQ,sEAAuE;EAIxH,IAAI,MAAM,QAAQ,CAAC,MAAM,SAAS,CAAC,MAAM,WACvC,MAAM,IAAI,iBAAiB,qCAAqC,SAAQ,wDAAyD;CAErI;AACD;AAaD,SAAgB,qBAAkB;CAChC,OAAO;EACL,OAAO;EACP,YAAY,CACV;GAAE,SAAS;GAAwB,UAAU;GAAe,OAAO;EAAI,GACvE;GAAE,SAAS;GAAwB,UAAU;GAAiB,OAAO;EAAI,CAC1E;CACF;AACH"}
|