@ng-forge/dynamic-forms 0.4.0 → 0.5.1

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 (22) hide show
  1. package/README.md +3 -0
  2. package/fesm2022/ng-forge-dynamic-forms-integration.mjs +138 -58
  3. package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
  4. package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-BWFdMPyw.mjs} +3876 -354
  5. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-BWFdMPyw.mjs.map +1 -0
  6. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-Bt6blv9I.mjs → ng-forge-dynamic-forms-page-field.component-RN1hmG69.mjs} +2 -2
  7. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-Bt6blv9I.mjs.map → ng-forge-dynamic-forms-page-field.component-RN1hmG69.mjs.map} +1 -1
  8. package/fesm2022/ng-forge-dynamic-forms-schema.mjs +92 -0
  9. package/fesm2022/ng-forge-dynamic-forms-schema.mjs.map +1 -0
  10. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-DKCx7Z_U.mjs → ng-forge-dynamic-forms-text-field.component-DIVyioMX.mjs} +2 -2
  11. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-DKCx7Z_U.mjs.map → ng-forge-dynamic-forms-text-field.component-DIVyioMX.mjs.map} +1 -1
  12. package/fesm2022/ng-forge-dynamic-forms.mjs +1 -1
  13. package/package.json +5 -4
  14. package/types/ng-forge-dynamic-forms-integration.d.ts +6 -14
  15. package/types/ng-forge-dynamic-forms-schema.d.ts +178 -0
  16. package/types/ng-forge-dynamic-forms.d.ts +1040 -45
  17. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs.map +0 -1
  18. package/fesm2022/ng-forge-dynamic-forms-testing-test-button.harness-C79EBW0o.mjs +0 -31
  19. package/fesm2022/ng-forge-dynamic-forms-testing-test-button.harness-C79EBW0o.mjs.map +0 -1
  20. package/fesm2022/ng-forge-dynamic-forms-testing.mjs +0 -973
  21. package/fesm2022/ng-forge-dynamic-forms-testing.mjs.map +0 -1
  22. package/types/ng-forge-dynamic-forms-testing.d.ts +0 -603
package/README.md CHANGED
@@ -18,6 +18,7 @@ Core library for building type-safe, dynamic Angular forms with signal forms int
18
18
 
19
19
  | @ng-forge/dynamic-forms | Angular |
20
20
  | ----------------------- | ------------- |
21
+ | 0.5.x | >=21.1.0 |
21
22
  | 0.4.x | >=21.1.0 |
22
23
  | 0.3.x | 21.0.7-21.0.x |
23
24
  | 0.2.x | 21.0.6 |
@@ -72,6 +73,7 @@ export class UserFormComponent {
72
73
  - **UI Agnostic** - Bring your own UI or use official integrations
73
74
  - **Validation** - Shorthand validators (`required`, `email`, `minLength`) and custom validators
74
75
  - **Conditional Logic** - Dynamic visibility and validation based on form state
76
+ - **Value Derivation** - Automatic value computation with expression, function, or static values
75
77
  - **Container Fields** - Groups, rows, and pages for complex layouts
76
78
  - **i18n Ready** - Observable/Signal support for labels and messages
77
79
  - **Event System** - Custom events for buttons and form actions
@@ -95,6 +97,7 @@ Or [create your own](https://ng-forge.com/dynamic-forms/deep-dive/custom-integra
95
97
  - [Field Types](https://ng-forge.com/dynamic-forms/core/field-types)
96
98
  - [Validation](https://ng-forge.com/dynamic-forms/core/validation)
97
99
  - [Conditional Logic](https://ng-forge.com/dynamic-forms/core/conditional-logic)
100
+ - [Value Derivation](https://ng-forge.com/dynamic-forms/core/derivation)
98
101
  - [Type Safety](https://ng-forge.com/dynamic-forms/core/type-safety)
99
102
  - [Events](https://ng-forge.com/dynamic-forms/core/events)
100
103
  - [i18n](https://ng-forge.com/dynamic-forms/core/i18n)
@@ -1,6 +1,6 @@
1
- import * as i0 from '@angular/core';
2
- import { inject, computed, signal, Injector, afterRenderEffect, Pipe } from '@angular/core';
3
- import { FIELD_SIGNAL_CONTEXT, omit, buildBaseInputs, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DynamicFormLogger, dynamicTextToObservable, interpolateParams, applyMetaToElement } from '@ng-forge/dynamic-forms';
1
+ import { inject, computed, signal, Injector, afterRenderEffect } from '@angular/core';
2
+ import { FIELD_SIGNAL_CONTEXT, omit, buildBaseInputs, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DynamicFormLogger, dynamicTextToObservable, interpolateParams, isEqual, applyMetaToElement } from '@ng-forge/dynamic-forms';
3
+ export { isEqual } from '@ng-forge/dynamic-forms';
4
4
  import { toObservable, toSignal } from '@angular/core/rxjs-interop';
5
5
  import { combineLatest, of } from 'rxjs';
6
6
  import { switchMap, map } from 'rxjs/operators';
@@ -106,6 +106,21 @@ function checkboxFieldMapper(fieldDef) {
106
106
  });
107
107
  }
108
108
 
109
+ /**
110
+ * Converts a date value (string, Date, or null) to a Date object or null.
111
+ * This ensures UI libraries that expect Date objects receive the correct type.
112
+ */
113
+ function toDate(value) {
114
+ if (value === null || value === undefined) {
115
+ return null;
116
+ }
117
+ if (value instanceof Date) {
118
+ return value;
119
+ }
120
+ // Parse string to Date
121
+ const date = new Date(value);
122
+ return isNaN(date.getTime()) ? null : date;
123
+ }
109
124
  /**
110
125
  * Maps a datepicker field to component inputs.
111
126
  *
@@ -114,22 +129,27 @@ function checkboxFieldMapper(fieldDef) {
114
129
  * - maxDate: Maximum selectable date
115
130
  * - startAt: Initial date to display when opening the picker
116
131
  *
132
+ * Date values are automatically converted from strings to Date objects
133
+ * since UI libraries (Material, PrimeNG, etc.) expect Date objects.
134
+ *
117
135
  * @param fieldDef The datepicker field definition
118
136
  * @returns Signal containing Record of input names to values for ngComponentOutlet
119
137
  */
120
138
  function datepickerFieldMapper(fieldDef) {
121
139
  const ctx = resolveValueFieldContext(fieldDef.key);
140
+ const defaultProps = inject(DEFAULT_PROPS);
141
+ const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);
122
142
  return computed(() => {
123
- const inputs = buildValueFieldInputs(fieldDef, ctx);
124
- // Add datepicker-specific properties
143
+ const inputs = buildValueFieldInputs(fieldDef, ctx, defaultProps(), defaultValidationMessages());
144
+ // Add datepicker-specific properties, converting strings to Date objects
125
145
  if (fieldDef.minDate !== undefined) {
126
- inputs['minDate'] = fieldDef.minDate;
146
+ inputs['minDate'] = toDate(fieldDef.minDate);
127
147
  }
128
148
  if (fieldDef.maxDate !== undefined) {
129
- inputs['maxDate'] = fieldDef.maxDate;
149
+ inputs['maxDate'] = toDate(fieldDef.maxDate);
130
150
  }
131
151
  if (fieldDef.startAt !== undefined) {
132
- inputs['startAt'] = fieldDef.startAt;
152
+ inputs['startAt'] = toDate(fieldDef.startAt);
133
153
  }
134
154
  return inputs;
135
155
  });
@@ -145,15 +165,109 @@ function datepickerFieldMapper(fieldDef) {
145
165
  */
146
166
  function optionsFieldMapper(fieldDef) {
147
167
  const ctx = resolveValueFieldContext(fieldDef.key);
168
+ const defaultProps = inject(DEFAULT_PROPS);
169
+ const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);
148
170
  return computed(() => {
149
171
  // Cast to BaseValueField - safe because all FieldWithOptions types extend BaseValueField
150
- const inputs = buildValueFieldInputs(fieldDef, ctx);
172
+ const inputs = buildValueFieldInputs(fieldDef, ctx, defaultProps(), defaultValidationMessages());
151
173
  // Add options property
152
174
  inputs['options'] = fieldDef.options;
153
175
  return inputs;
154
176
  });
155
177
  }
156
178
 
179
+ /**
180
+ * Maps a textarea field to component inputs.
181
+ *
182
+ * Extends the base value field mapper by adding textarea-specific properties:
183
+ * - rows: Number of visible text rows
184
+ * - cols: Number of visible text columns
185
+ * - maxLength: Maximum character length (also used for validation)
186
+ *
187
+ * @param fieldDef The textarea field definition
188
+ * @returns Signal containing Record of input names to values for ngComponentOutlet
189
+ */
190
+ function textareaFieldMapper(fieldDef) {
191
+ const ctx = resolveValueFieldContext(fieldDef.key);
192
+ const defaultProps = inject(DEFAULT_PROPS);
193
+ const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);
194
+ return computed(() => {
195
+ const inputs = buildValueFieldInputs(fieldDef, ctx, defaultProps(), defaultValidationMessages());
196
+ // Add textarea-specific properties from props
197
+ const props = fieldDef.props;
198
+ if (props && typeof props === 'object') {
199
+ if (props['rows'] !== undefined) {
200
+ inputs['rows'] = props['rows'];
201
+ }
202
+ if (props['cols'] !== undefined) {
203
+ inputs['cols'] = props['cols'];
204
+ }
205
+ }
206
+ // maxLength is at field level for validation
207
+ if (fieldDef.maxLength !== undefined) {
208
+ inputs['maxLength'] = fieldDef.maxLength;
209
+ }
210
+ return inputs;
211
+ });
212
+ }
213
+
214
+ /**
215
+ * Maps a slider field to component inputs.
216
+ *
217
+ * Extends the base value field mapper by adding slider-specific properties:
218
+ * - minValue: Minimum slider value
219
+ * - maxValue: Maximum slider value
220
+ * - step: Step increment for the slider
221
+ *
222
+ * @param fieldDef The slider field definition
223
+ * @returns Signal containing Record of input names to values for ngComponentOutlet
224
+ */
225
+ function sliderFieldMapper(fieldDef) {
226
+ const ctx = resolveValueFieldContext(fieldDef.key);
227
+ const defaultProps = inject(DEFAULT_PROPS);
228
+ const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);
229
+ return computed(() => {
230
+ const inputs = buildValueFieldInputs(fieldDef, ctx, defaultProps(), defaultValidationMessages());
231
+ // Add slider-specific properties (these are at field level, not in props)
232
+ if (fieldDef.minValue !== undefined) {
233
+ inputs['minValue'] = fieldDef.minValue;
234
+ }
235
+ if (fieldDef.maxValue !== undefined) {
236
+ inputs['maxValue'] = fieldDef.maxValue;
237
+ }
238
+ if (fieldDef.step !== undefined) {
239
+ inputs['step'] = fieldDef.step;
240
+ }
241
+ return inputs;
242
+ });
243
+ }
244
+
245
+ /**
246
+ * Maps a button field to component inputs.
247
+ *
248
+ * Unlike value field mappers, button fields do not participate in form values
249
+ * and do not need field tree resolution or validation messages.
250
+ *
251
+ * Button-specific properties:
252
+ * - event: The FormEvent constructor to emit when clicked
253
+ * - eventArgs: Optional arguments to pass to the event constructor
254
+ *
255
+ * @param fieldDef The button field definition
256
+ * @returns Signal containing Record of input names to values for ngComponentOutlet
257
+ */
258
+ function buttonFieldMapper(fieldDef) {
259
+ const defaultProps = inject(DEFAULT_PROPS);
260
+ return computed(() => {
261
+ const inputs = buildBaseInputs(fieldDef, defaultProps());
262
+ // Add button-specific properties
263
+ inputs['event'] = fieldDef.event;
264
+ if (fieldDef.eventArgs !== undefined) {
265
+ inputs['eventArgs'] = fieldDef.eventArgs;
266
+ }
267
+ return inputs;
268
+ });
269
+ }
270
+
157
271
  // UI-specific field mappers
158
272
 
159
273
  /**
@@ -210,7 +324,12 @@ function createResolvedErrorsSignal(field, validationMessages, defaultValidation
210
324
  }
211
325
  /**
212
326
  * Resolves a single error message from DynamicText sources with fallback logic
213
- * Priority: field-level message → default message → no message (logs warning)
327
+ * Priority: field-level message → default message → error.message → no message (logs warning)
328
+ *
329
+ * The error.message fallback enables schema validation libraries (Zod, Valibot, etc.)
330
+ * to provide their own messages without requiring explicit validationMessages configuration.
331
+ * Users who want translations can still override by configuring validationMessages.
332
+ *
214
333
  * @internal
215
334
  */
216
335
  function resolveErrorMessage(error, fieldMessages, defaultMessages, injector, logger) {
@@ -218,16 +337,20 @@ function resolveErrorMessage(error, fieldMessages, defaultMessages, injector, lo
218
337
  const fieldMessage = fieldMessages[error.kind];
219
338
  // Fall back to default message if no field-level message exists
220
339
  const defaultMessage = defaultMessages[error.kind];
221
- // Determine which message to use: field-level → default
222
- const messageToUse = fieldMessage ?? defaultMessage;
340
+ // Determine which message to use: field-level → default → error.message (from schema validators)
341
+ const messageToUse = fieldMessage ?? defaultMessage ?? error.message;
223
342
  // If no message found, log warning and return null (will be filtered out)
224
343
  if (!messageToUse) {
225
344
  logger.warn(`No validation message found for error kind "${error.kind}". ` +
226
345
  `Please provide a message via field-level validationMessages or form-level defaultValidationMessages.`);
227
346
  return of(null);
228
347
  }
229
- // Convert DynamicText to Observable
230
- const messageObservable = dynamicTextToObservable(messageToUse, injector);
348
+ // If using error.message directly (from schema validators), wrap in of() instead of dynamicTextToObservable
349
+ // error.message is always a plain string, not DynamicText
350
+ const isSchemaMessage = fieldMessage === undefined && defaultMessage === undefined;
351
+ const messageObservable = isSchemaMessage
352
+ ? of(messageToUse) // error.message is always string
353
+ : dynamicTextToObservable(messageToUse, injector);
231
354
  // Apply parameter interpolation to support {{param}} syntax
232
355
  return messageObservable.pipe(map((msg) => ({
233
356
  kind: error.kind,
@@ -250,34 +373,6 @@ function shouldShowErrors(field) {
250
373
  });
251
374
  }
252
375
 
253
- /**
254
- * Performs a deep equality comparison between two values
255
- */
256
- function isEqual(a, b) {
257
- if (a === b)
258
- return true;
259
- if (a == null || b == null)
260
- return false;
261
- if (typeof a !== typeof b)
262
- return false;
263
- if (a instanceof Date && b instanceof Date) {
264
- return a.getTime() === b.getTime();
265
- }
266
- if (Array.isArray(a) && Array.isArray(b)) {
267
- if (a.length !== b.length)
268
- return false;
269
- return a.every((item, index) => isEqual(item, b[index]));
270
- }
271
- if (typeof a === 'object' && typeof b === 'object') {
272
- const keysA = Object.keys(a);
273
- const keysB = Object.keys(b);
274
- if (keysA.length !== keysB.length)
275
- return false;
276
- return keysA.every((key) => keysB.includes(key) && isEqual(a[key], b[key]));
277
- }
278
- return Object.is(a, b);
279
- }
280
-
281
376
  /**
282
377
  * Sets up automatic meta attribute tracking and application for wrapped components.
283
378
  *
@@ -353,21 +448,6 @@ function setupMetaTracking(elementRef, meta, options) {
353
448
 
354
449
  // Error display utilities for field components
355
450
 
356
- class ValueInArrayPipe {
357
- transform(element, array) {
358
- return array?.includes(element) ?? false;
359
- }
360
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: ValueInArrayPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
361
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.1.0", ngImport: i0, type: ValueInArrayPipe, isStandalone: true, name: "inArray" });
362
- }
363
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: ValueInArrayPipe, decorators: [{
364
- type: Pipe,
365
- args: [{
366
- pure: true,
367
- name: 'inArray',
368
- }]
369
- }] });
370
-
371
451
  /**
372
452
  * @ng-forge/dynamic-forms/integration
373
453
  *
@@ -387,5 +467,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
387
467
  * Generated bundle index. Do not edit.
388
468
  */
389
469
 
390
- export { ValueInArrayPipe, buildValueFieldInputs, checkboxFieldMapper, createResolvedErrorsSignal, datepickerFieldMapper, isEqual, optionsFieldMapper, resolveValueFieldContext, setupMetaTracking, shouldShowErrors, valueFieldMapper };
470
+ export { buildValueFieldInputs, checkboxFieldMapper, createResolvedErrorsSignal, datepickerFieldMapper, optionsFieldMapper, resolveValueFieldContext, setupMetaTracking, shouldShowErrors, valueFieldMapper };
391
471
  //# sourceMappingURL=ng-forge-dynamic-forms-integration.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-forge-dynamic-forms-integration.mjs","sources":["../../../../packages/dynamic-forms/integration/src/mappers/value/value-field.mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/checkbox/checkbox-field-mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/datepicker/datepicker-field-mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/select/options-field-mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/index.ts","../../../../packages/dynamic-forms/integration/src/utils/create-resolved-errors-signal.ts","../../../../packages/dynamic-forms/integration/src/utils/should-show-errors.ts","../../../../packages/dynamic-forms/integration/src/utils/is-equal.ts","../../../../packages/dynamic-forms/integration/src/utils/setup-meta-tracking.ts","../../../../packages/dynamic-forms/integration/src/utils/index.ts","../../../../packages/dynamic-forms/integration/src/pipes/value-in-array.pipe.ts","../../../../packages/dynamic-forms/integration/src/public_api.ts","../../../../packages/dynamic-forms/integration/src/ng-forge-dynamic-forms-integration.ts"],"sourcesContent":["import { BaseValueField } from '@ng-forge/dynamic-forms';\nimport { computed, inject, Signal } from '@angular/core';\nimport { FieldTree } from '@angular/forms/signals';\nimport { buildBaseInputs, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES } from '@ng-forge/dynamic-forms';\nimport { FIELD_SIGNAL_CONTEXT } from '@ng-forge/dynamic-forms';\nimport { omit } from '@ng-forge/dynamic-forms';\nimport { ValidationMessages } from '@ng-forge/dynamic-forms';\n\n/**\n * Context for value field mapping, containing resolved field tree.\n * Used by specialized mappers to avoid duplicate context resolution.\n */\nexport interface ValueFieldContext {\n fieldTree: FieldTree<unknown> | undefined;\n}\n\n/**\n * Resolves the field tree from the form context.\n * Must be called within an injection context.\n *\n * Uses type-safe field tree utilities to access child FieldTrees from the parent form.\n *\n * @param fieldKey The key of the field to resolve\n * @returns The resolved context with field tree\n */\nexport function resolveValueFieldContext(fieldKey: string): ValueFieldContext {\n const context = inject(FIELD_SIGNAL_CONTEXT);\n const formRoot = context.form as Record<string, FieldTree<unknown> | undefined>;\n const fieldTree = formRoot[fieldKey];\n return { fieldTree };\n}\n\n/**\n * Builds the base inputs for a value field.\n * This is a helper function used by valueFieldMapper and specialized mappers.\n *\n * @param fieldDef The value field definition\n * @param ctx The resolved value field context\n * @param defaultProps Default props from the form configuration (may be undefined if not configured)\n * @param defaultValidationMessages Default validation messages from the form configuration (may be undefined if not configured)\n * @returns Record of input names to values\n */\nexport function buildValueFieldInputs<TProps, TValue = unknown>(\n fieldDef: BaseValueField<TProps, TValue>,\n ctx: ValueFieldContext,\n defaultProps?: Record<string, unknown>,\n defaultValidationMessages?: ValidationMessages,\n): Record<string, unknown> {\n const omittedFields = omit(fieldDef, ['value']);\n const baseInputs = buildBaseInputs(omittedFields, defaultProps);\n\n const inputs: Record<string, unknown> = {\n ...baseInputs,\n validationMessages: fieldDef.validationMessages ?? {},\n };\n\n if (fieldDef.placeholder !== undefined) {\n inputs['placeholder'] = fieldDef.placeholder;\n }\n\n if (defaultValidationMessages !== undefined) {\n inputs['defaultValidationMessages'] = defaultValidationMessages;\n }\n\n if (ctx.fieldTree !== undefined) {\n inputs['field'] = ctx.fieldTree;\n }\n\n return inputs;\n}\n\n/**\n * Maps a value field definition to component inputs.\n *\n * Value fields are input fields that contribute to the form's value (text, number, etc.).\n * This mapper injects FIELD_SIGNAL_CONTEXT to access the form structure and retrieve the field proxy.\n *\n * For fields with specific properties (select, datepicker, textarea, slider), use the specialized mappers:\n * - selectFieldMapper: for fields with options (select, radio, multi-checkbox)\n * - datepickerFieldMapper: for fields with minDate, maxDate, startAt\n * - textareaFieldMapper: for fields with rows, cols\n * - sliderFieldMapper: for fields with minValue, maxValue, step\n *\n * @param fieldDef The value field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function valueFieldMapper<TProps = unknown, TValue = unknown>(\n fieldDef: BaseValueField<TProps, TValue>,\n): Signal<Record<string, unknown>> {\n const ctx = resolveValueFieldContext(fieldDef.key);\n const defaultProps = inject(DEFAULT_PROPS);\n const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);\n\n return computed(() => buildValueFieldInputs(fieldDef, ctx, defaultProps(), defaultValidationMessages()));\n}\n","import { BaseCheckedField } from '@ng-forge/dynamic-forms';\nimport { FieldDef } from '@ng-forge/dynamic-forms';\nimport { computed, inject, Signal } from '@angular/core';\nimport { FieldTree } from '@angular/forms/signals';\nimport { buildBaseInputs, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES } from '@ng-forge/dynamic-forms';\nimport { FIELD_SIGNAL_CONTEXT } from '@ng-forge/dynamic-forms';\nimport { omit } from '@ng-forge/dynamic-forms';\n\n/**\n * Maps a checkbox/toggle field definition to component inputs.\n *\n * Checkbox fields are checked fields that contribute to the form's value as boolean.\n * This mapper injects FIELD_SIGNAL_CONTEXT to access the form structure and retrieve the field tree.\n *\n * @param fieldDef The checkbox field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function checkboxFieldMapper(fieldDef: BaseCheckedField<unknown>): Signal<Record<string, unknown>> {\n const context = inject(FIELD_SIGNAL_CONTEXT);\n const defaultProps = inject(DEFAULT_PROPS);\n const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);\n const formRoot = context.form as Record<string, FieldTree<unknown> | undefined>;\n const fieldTree = formRoot[fieldDef.key];\n\n return computed(() => {\n const omittedFields = omit(fieldDef, ['value']) as FieldDef<unknown>;\n const baseInputs = buildBaseInputs(omittedFields, defaultProps());\n const validationMessages = defaultValidationMessages();\n\n const inputs: Record<string, unknown> = {\n ...baseInputs,\n validationMessages: fieldDef.validationMessages ?? {},\n };\n\n if (fieldDef.placeholder !== undefined) {\n inputs['placeholder'] = fieldDef.placeholder;\n }\n\n if (validationMessages !== undefined) {\n inputs['defaultValidationMessages'] = validationMessages;\n }\n\n if (fieldTree !== undefined) {\n inputs['field'] = fieldTree;\n }\n\n return inputs;\n });\n}\n","import { computed, Signal } from '@angular/core';\nimport { DatepickerField } from '../../definitions';\nimport { resolveValueFieldContext, buildValueFieldInputs } from '../value/value-field.mapper';\n\n/**\n * Maps a datepicker field to component inputs.\n *\n * Extends the base value field mapper by adding datepicker-specific properties:\n * - minDate: Minimum selectable date\n * - maxDate: Maximum selectable date\n * - startAt: Initial date to display when opening the picker\n *\n * @param fieldDef The datepicker field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function datepickerFieldMapper<TProps>(fieldDef: DatepickerField<TProps>): Signal<Record<string, unknown>> {\n const ctx = resolveValueFieldContext(fieldDef.key);\n\n return computed(() => {\n const inputs = buildValueFieldInputs(fieldDef, ctx);\n\n // Add datepicker-specific properties\n if (fieldDef.minDate !== undefined) {\n inputs['minDate'] = fieldDef.minDate;\n }\n if (fieldDef.maxDate !== undefined) {\n inputs['maxDate'] = fieldDef.maxDate;\n }\n if (fieldDef.startAt !== undefined) {\n inputs['startAt'] = fieldDef.startAt;\n }\n\n return inputs;\n });\n}\n","import { computed, Signal } from '@angular/core';\nimport { SelectField } from '../../definitions';\nimport { RadioField } from '../../definitions';\nimport { MultiCheckboxField } from '../../definitions';\nimport { BaseValueField } from '@ng-forge/dynamic-forms';\nimport { resolveValueFieldContext, buildValueFieldInputs } from '../value/value-field.mapper';\n\n/**\n * Field types that have an options property.\n */\nexport type FieldWithOptions<T = unknown, TProps = unknown> =\n | SelectField<T, TProps>\n | RadioField<T, TProps>\n | MultiCheckboxField<T, TProps>;\n\n/**\n * Maps a field with options (select, radio, multi-checkbox) to component inputs.\n *\n * Extends the base value field mapper by adding the options property.\n *\n * @param fieldDef The field definition with options\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function optionsFieldMapper<T, TProps>(fieldDef: FieldWithOptions<T, TProps>): Signal<Record<string, unknown>> {\n const ctx = resolveValueFieldContext(fieldDef.key);\n\n return computed(() => {\n // Cast to BaseValueField - safe because all FieldWithOptions types extend BaseValueField\n const inputs = buildValueFieldInputs(fieldDef as BaseValueField<TProps, unknown>, ctx);\n\n // Add options property\n inputs['options'] = fieldDef.options;\n\n return inputs;\n });\n}\n","// UI-specific field mappers\nexport { valueFieldMapper, buildValueFieldInputs, resolveValueFieldContext } from './value/value-field.mapper';\nexport type { ValueFieldContext } from './value/value-field.mapper';\nexport { checkboxFieldMapper } from './checkbox/checkbox-field-mapper';\nexport { datepickerFieldMapper } from './datepicker/datepicker-field-mapper';\nexport { optionsFieldMapper } from './select/options-field-mapper';\nexport type { FieldWithOptions } from './select/options-field-mapper';\n","import { computed, inject, Injector, signal, Signal } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { FieldTree, ValidationError } from '@angular/forms/signals';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { ValidationMessages } from '@ng-forge/dynamic-forms';\nimport { dynamicTextToObservable } from '@ng-forge/dynamic-forms';\nimport { interpolateParams } from '@ng-forge/dynamic-forms';\nimport { DynamicFormLogger } from '@ng-forge/dynamic-forms';\nimport type { Logger } from '@ng-forge/dynamic-forms';\n\n/**\n * Resolved validation error with interpolated message\n */\nexport interface ResolvedError {\n kind: string;\n message: string;\n}\n\n/**\n * Factory function that creates a signal of resolved validation errors\n * Handles async resolution of DynamicText validation messages\n *\n * @param field - Signal containing FieldTree\n * @param validationMessages - Signal containing custom field-level validation messages\n * @param defaultValidationMessages - Signal containing default validation messages (fallback)\n * @param injector - Optional injector for DynamicText resolution\n * @returns Signal<ResolvedError[]> - Reactively resolved error messages\n *\n * @example\n * ```typescript\n * readonly resolvedErrors = createResolvedErrorsSignal(\n * this.field,\n * this.validationMessages,\n * this.defaultValidationMessages\n * );\n * ```\n */\nexport function createResolvedErrorsSignal<T>(\n field: Signal<FieldTree<T>>,\n validationMessages: Signal<ValidationMessages | undefined>,\n defaultValidationMessages: Signal<ValidationMessages | undefined> = signal(undefined),\n injector = inject(Injector),\n): Signal<ResolvedError[]> {\n // Get logger from injector\n const logger = injector.get(DynamicFormLogger);\n\n // Ensure validationMessages is never undefined (mappers pass {} if not defined)\n const messages = computed(() => validationMessages() ?? {});\n const defaultMessages = computed(() => defaultValidationMessages() ?? {});\n\n // Create a computed signal that reads the actual errors from the field\n // This ensures the signal tracks changes to field().errors(), not just the field reference\n const errors = computed(() => {\n const control = field()();\n return control.errors();\n });\n\n // Convert signals to observables using toObservable with injector\n const errors$ = toObservable(errors, { injector });\n const messages$ = toObservable(messages, { injector });\n const defaultMessages$ = toObservable(defaultMessages, { injector });\n\n // Combine observables and process errors\n const resolvedErrors$ = combineLatest([errors$, messages$, defaultMessages$]).pipe(\n switchMap(([currentErrors, msgs, defaultMsgs]) => {\n // No errors - return empty array\n if (!currentErrors || currentErrors.length === 0) {\n return of([]);\n }\n\n // Create observable for each error's resolved message\n const errorResolvers = currentErrors.map((error: ValidationError) => resolveErrorMessage(error, msgs, defaultMsgs, injector, logger));\n\n // Combine all error message observables into single array emission, filtering out nulls\n return errorResolvers.length > 0\n ? combineLatest(errorResolvers).pipe(map((errors) => errors.filter((e): e is ResolvedError => e !== null)))\n : of([]);\n }),\n );\n\n // Convert observable back to signal using toSignal with injector\n // toSignal properly handles the injection context and manages subscriptions\n return toSignal(resolvedErrors$, { initialValue: [] as ResolvedError[], injector });\n}\n\n/**\n * Resolves a single error message from DynamicText sources with fallback logic\n * Priority: field-level message → default message → no message (logs warning)\n * @internal\n */\nfunction resolveErrorMessage(\n error: ValidationError,\n fieldMessages: ValidationMessages,\n defaultMessages: ValidationMessages,\n injector: Injector,\n logger: Logger,\n): Observable<ResolvedError | null> {\n // Check for field-level custom message first\n const fieldMessage = fieldMessages[error.kind];\n\n // Fall back to default message if no field-level message exists\n const defaultMessage = defaultMessages[error.kind];\n\n // Determine which message to use: field-level → default\n const messageToUse = fieldMessage ?? defaultMessage;\n\n // If no message found, log warning and return null (will be filtered out)\n if (!messageToUse) {\n logger.warn(\n `No validation message found for error kind \"${error.kind}\". ` +\n `Please provide a message via field-level validationMessages or form-level defaultValidationMessages.`,\n );\n return of(null);\n }\n\n // Convert DynamicText to Observable\n const messageObservable = dynamicTextToObservable(messageToUse, injector);\n\n // Apply parameter interpolation to support {{param}} syntax\n return messageObservable.pipe(\n map((msg) => ({\n kind: error.kind,\n message: interpolateParams(msg, error),\n })),\n );\n}\n","import { Signal, computed } from '@angular/core';\nimport { FieldTree } from '@angular/forms/signals';\n\n/**\n * Computed signal that determines if errors should be displayed\n * Based on field's invalid, touched, and error count\n *\n * @param field - Signal containing FieldTree\n * @returns Signal<boolean> - True if errors should be displayed\n */\nexport function shouldShowErrors<T>(field: Signal<FieldTree<T>>): Signal<boolean> {\n return computed(() => {\n const fieldTree = field();\n const control = fieldTree();\n return control.invalid() && control.touched() && control.errors().length > 0;\n });\n}\n","/**\n * Performs a deep equality comparison between two values\n */\nexport function isEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== typeof b) return false;\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => isEqual(item, b[index]));\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n return keysA.every((key) => keysB.includes(key) && isEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]));\n }\n\n return Object.is(a, b);\n}\n","import { afterRenderEffect, ElementRef, Signal } from '@angular/core';\nimport { applyMetaToElement, FieldMeta } from '@ng-forge/dynamic-forms';\nimport { isEqual } from './is-equal';\n\n/**\n * Configuration options for setupMetaTracking.\n */\nexport interface MetaTrackingOptions {\n /**\n * CSS selector for target elements within the host.\n * If not provided, meta attributes are applied directly to the host element.\n *\n * @example\n * // Apply to internal radio inputs\n * selector: 'input[type=\"radio\"]'\n *\n * // Apply to host element (for Shadow DOM components)\n * selector: undefined\n */\n selector?: string;\n\n /**\n * Additional signals to track that should trigger re-application of meta.\n * Useful for components where DOM elements are dynamically created (e.g., radio options).\n *\n * @example\n * // Re-apply when options change\n * dependents: [this.options]\n */\n dependents?: Signal<unknown>[];\n}\n\n/**\n * Sets up automatic meta attribute tracking and application for wrapped components.\n *\n * This utility creates an `afterRenderEffect` that applies meta attributes to DOM elements\n * after Angular's render cycle. It efficiently tracks signal dependencies and only re-applies\n * when the meta signal or any dependent signals change.\n *\n * Use this instead of MutationObserver for better performance and integration with Angular's\n * change detection.\n *\n * @param elementRef - Reference to the host element\n * @param meta - Signal containing meta attributes to apply\n * @param options - Configuration options\n *\n * @example\n * ```typescript\n * // For a radio group with dynamic options\n * constructor() {\n * setupMetaTracking(inject(ElementRef), this.meta, {\n * selector: 'input[type=\"radio\"]',\n * dependents: [this.options]\n * });\n * }\n *\n * // For a simple checkbox\n * constructor() {\n * setupMetaTracking(inject(ElementRef), this.meta, {\n * selector: 'input[type=\"checkbox\"]'\n * });\n * }\n *\n * // For Shadow DOM components (apply to host)\n * constructor() {\n * setupMetaTracking(inject(ElementRef), this.meta);\n * }\n * ```\n */\nexport function setupMetaTracking(\n elementRef: ElementRef<HTMLElement>,\n meta: Signal<FieldMeta | undefined>,\n options?: MetaTrackingOptions,\n): void {\n let appliedAttributes = new Set<string>();\n let previousMeta: FieldMeta | undefined;\n let previousDeps: unknown[] | undefined;\n\n afterRenderEffect({\n write: () => {\n // Read dependents to establish signal tracking and collect their values\n const currentDeps = options?.dependents?.map((dep) => dep());\n\n const currentMeta = meta();\n const hostElement = elementRef.nativeElement;\n\n // Early exit if nothing changed (using deep equality for meta)\n const metaChanged = !isEqual(currentMeta, previousMeta);\n const depsChanged =\n !previousDeps || currentDeps?.length !== previousDeps.length || currentDeps?.some((d, i) => d !== previousDeps![i]);\n\n if (!metaChanged && !depsChanged) {\n return;\n }\n\n previousMeta = currentMeta;\n previousDeps = currentDeps;\n\n if (options?.selector) {\n // Apply to elements matching selector\n const elements = hostElement.querySelectorAll(options.selector);\n const allApplied = new Set<string>();\n\n elements.forEach((el) => {\n const applied = applyMetaToElement(el, currentMeta, appliedAttributes);\n applied.forEach((attr) => allApplied.add(attr));\n });\n\n appliedAttributes = allApplied;\n } else {\n // Apply to host element (for Shadow DOM components)\n appliedAttributes = applyMetaToElement(hostElement, currentMeta, appliedAttributes);\n }\n },\n });\n}\n","// Error display utilities for field components\nexport { createResolvedErrorsSignal } from './create-resolved-errors-signal';\nexport type { ResolvedError } from './create-resolved-errors-signal';\nexport { shouldShowErrors } from './should-show-errors';\n\n// Value comparison utilities\nexport { isEqual } from './is-equal';\n\n// Meta tracking utilities\nexport { setupMetaTracking } from './setup-meta-tracking';\nexport type { MetaTrackingOptions } from './setup-meta-tracking';\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n pure: true,\n name: 'inArray',\n})\nexport class ValueInArrayPipe implements PipeTransform {\n transform<T>(element: T, array: T[] | undefined): boolean {\n return array?.includes(element) ?? false;\n }\n}\n","/**\n * @ng-forge/dynamic-forms/integration\n *\n * Integration API for UI library authors building field implementations\n * (Material, Bootstrap, PrimeNG, Ionic, etc.)\n *\n * This entrypoint provides:\n * - Specific field type definitions (InputField, SelectField, etc.)\n * - Field mappers for creating FieldTypeDefinition\n * - Error display utilities for field components\n */\n\n// =============================================================================\n// Field Type Definitions\n// =============================================================================\n\nexport type {\n ButtonField,\n EventArgs,\n CheckboxField,\n DatepickerField,\n DatepickerProps,\n InputField,\n InputProps,\n InputType,\n InputTypeToValueType,\n InferInputValue,\n NumericInputType,\n StringInputType,\n HtmlInputType,\n InputMeta,\n AutocompleteValue,\n InputMode,\n EnterKeyHint,\n Autocapitalize,\n MultiCheckboxField,\n RadioField,\n SelectField,\n SelectProps,\n SliderField,\n TextareaField,\n TextareaProps,\n TextareaMeta,\n TextareaWrap,\n ToggleField,\n} from './definitions';\n\n// =============================================================================\n// Field Mappers\n// =============================================================================\n\nexport {\n valueFieldMapper,\n buildValueFieldInputs,\n resolveValueFieldContext,\n checkboxFieldMapper,\n datepickerFieldMapper,\n optionsFieldMapper,\n} from './mappers';\n\nexport type { ValueFieldContext, FieldWithOptions } from './mappers';\n\n// =============================================================================\n// Error Display Utilities\n// =============================================================================\n\nexport { createResolvedErrorsSignal, shouldShowErrors } from './utils';\nexport type { ResolvedError } from './utils';\n\n// =============================================================================\n// Value Comparison Utilities\n// =============================================================================\n\nexport { isEqual } from './utils';\n\n// =============================================================================\n// Meta Tracking Utilities\n// =============================================================================\n\nexport { setupMetaTracking } from './utils';\nexport type { MetaTrackingOptions } from './utils';\n\n// =============================================================================\n// Pipes\n// =============================================================================\n\nexport { ValueInArrayPipe } from './pipes';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-forge-dynamic-forms-integration.mjs","sources":["../../../../packages/dynamic-forms/integration/src/mappers/value/value-field.mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/checkbox/checkbox-field-mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/datepicker/datepicker-field-mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/select/options-field-mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/textarea/textarea-field-mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/slider/slider-field-mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/button/button-field-mapper.ts","../../../../packages/dynamic-forms/integration/src/mappers/index.ts","../../../../packages/dynamic-forms/integration/src/utils/create-resolved-errors-signal.ts","../../../../packages/dynamic-forms/integration/src/utils/should-show-errors.ts","../../../../packages/dynamic-forms/integration/src/utils/setup-meta-tracking.ts","../../../../packages/dynamic-forms/integration/src/utils/index.ts","../../../../packages/dynamic-forms/integration/src/public_api.ts","../../../../packages/dynamic-forms/integration/src/ng-forge-dynamic-forms-integration.ts"],"sourcesContent":["import { BaseValueField } from '@ng-forge/dynamic-forms';\nimport { computed, inject, Signal } from '@angular/core';\nimport { FieldTree } from '@angular/forms/signals';\nimport { buildBaseInputs, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES } from '@ng-forge/dynamic-forms';\nimport { FIELD_SIGNAL_CONTEXT } from '@ng-forge/dynamic-forms';\nimport { omit } from '@ng-forge/dynamic-forms';\nimport { ValidationMessages } from '@ng-forge/dynamic-forms';\n\n/**\n * Context for value field mapping, containing resolved field tree.\n * Used by specialized mappers to avoid duplicate context resolution.\n */\nexport interface ValueFieldContext {\n fieldTree: FieldTree<unknown> | undefined;\n}\n\n/**\n * Resolves the field tree from the form context.\n * Must be called within an injection context.\n *\n * Uses type-safe field tree utilities to access child FieldTrees from the parent form.\n *\n * @param fieldKey The key of the field to resolve\n * @returns The resolved context with field tree\n */\nexport function resolveValueFieldContext(fieldKey: string): ValueFieldContext {\n const context = inject(FIELD_SIGNAL_CONTEXT);\n const formRoot = context.form as Record<string, FieldTree<unknown> | undefined>;\n const fieldTree = formRoot[fieldKey];\n return { fieldTree };\n}\n\n/**\n * Builds the base inputs for a value field.\n * This is a helper function used by valueFieldMapper and specialized mappers.\n *\n * @param fieldDef The value field definition\n * @param ctx The resolved value field context\n * @param defaultProps Default props from the form configuration (may be undefined if not configured)\n * @param defaultValidationMessages Default validation messages from the form configuration (may be undefined if not configured)\n * @returns Record of input names to values\n */\nexport function buildValueFieldInputs<TProps, TValue = unknown>(\n fieldDef: BaseValueField<TProps, TValue>,\n ctx: ValueFieldContext,\n defaultProps?: Record<string, unknown>,\n defaultValidationMessages?: ValidationMessages,\n): Record<string, unknown> {\n const omittedFields = omit(fieldDef, ['value']);\n const baseInputs = buildBaseInputs(omittedFields, defaultProps);\n\n const inputs: Record<string, unknown> = {\n ...baseInputs,\n validationMessages: fieldDef.validationMessages ?? {},\n };\n\n if (fieldDef.placeholder !== undefined) {\n inputs['placeholder'] = fieldDef.placeholder;\n }\n\n if (defaultValidationMessages !== undefined) {\n inputs['defaultValidationMessages'] = defaultValidationMessages;\n }\n\n if (ctx.fieldTree !== undefined) {\n inputs['field'] = ctx.fieldTree;\n }\n\n return inputs;\n}\n\n/**\n * Maps a value field definition to component inputs.\n *\n * Value fields are input fields that contribute to the form's value (text, number, etc.).\n * This mapper injects FIELD_SIGNAL_CONTEXT to access the form structure and retrieve the field proxy.\n *\n * For fields with specific properties (select, datepicker, textarea, slider), use the specialized mappers:\n * - selectFieldMapper: for fields with options (select, radio, multi-checkbox)\n * - datepickerFieldMapper: for fields with minDate, maxDate, startAt\n * - textareaFieldMapper: for fields with rows, cols\n * - sliderFieldMapper: for fields with minValue, maxValue, step\n *\n * @param fieldDef The value field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function valueFieldMapper<TProps = unknown, TValue = unknown>(\n fieldDef: BaseValueField<TProps, TValue>,\n): Signal<Record<string, unknown>> {\n const ctx = resolveValueFieldContext(fieldDef.key);\n const defaultProps = inject(DEFAULT_PROPS);\n const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);\n\n return computed(() => buildValueFieldInputs(fieldDef, ctx, defaultProps(), defaultValidationMessages()));\n}\n","import { BaseCheckedField } from '@ng-forge/dynamic-forms';\nimport { FieldDef } from '@ng-forge/dynamic-forms';\nimport { computed, inject, Signal } from '@angular/core';\nimport { FieldTree } from '@angular/forms/signals';\nimport { buildBaseInputs, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES } from '@ng-forge/dynamic-forms';\nimport { FIELD_SIGNAL_CONTEXT } from '@ng-forge/dynamic-forms';\nimport { omit } from '@ng-forge/dynamic-forms';\n\n/**\n * Maps a checkbox/toggle field definition to component inputs.\n *\n * Checkbox fields are checked fields that contribute to the form's value as boolean.\n * This mapper injects FIELD_SIGNAL_CONTEXT to access the form structure and retrieve the field tree.\n *\n * @param fieldDef The checkbox field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function checkboxFieldMapper(fieldDef: BaseCheckedField<unknown>): Signal<Record<string, unknown>> {\n const context = inject(FIELD_SIGNAL_CONTEXT);\n const defaultProps = inject(DEFAULT_PROPS);\n const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);\n const formRoot = context.form as Record<string, FieldTree<unknown> | undefined>;\n const fieldTree = formRoot[fieldDef.key];\n\n return computed(() => {\n const omittedFields = omit(fieldDef, ['value']) as FieldDef<unknown>;\n const baseInputs = buildBaseInputs(omittedFields, defaultProps());\n const validationMessages = defaultValidationMessages();\n\n const inputs: Record<string, unknown> = {\n ...baseInputs,\n validationMessages: fieldDef.validationMessages ?? {},\n };\n\n if (fieldDef.placeholder !== undefined) {\n inputs['placeholder'] = fieldDef.placeholder;\n }\n\n if (validationMessages !== undefined) {\n inputs['defaultValidationMessages'] = validationMessages;\n }\n\n if (fieldTree !== undefined) {\n inputs['field'] = fieldTree;\n }\n\n return inputs;\n });\n}\n","import { computed, inject, Signal } from '@angular/core';\nimport { DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES } from '@ng-forge/dynamic-forms';\nimport { DatepickerField } from '../../definitions';\nimport { resolveValueFieldContext, buildValueFieldInputs } from '../value/value-field.mapper';\n\n/**\n * Converts a date value (string, Date, or null) to a Date object or null.\n * This ensures UI libraries that expect Date objects receive the correct type.\n */\nfunction toDate(value: Date | string | null | undefined): Date | null {\n if (value === null || value === undefined) {\n return null;\n }\n if (value instanceof Date) {\n return value;\n }\n // Parse string to Date\n const date = new Date(value);\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Maps a datepicker field to component inputs.\n *\n * Extends the base value field mapper by adding datepicker-specific properties:\n * - minDate: Minimum selectable date\n * - maxDate: Maximum selectable date\n * - startAt: Initial date to display when opening the picker\n *\n * Date values are automatically converted from strings to Date objects\n * since UI libraries (Material, PrimeNG, etc.) expect Date objects.\n *\n * @param fieldDef The datepicker field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function datepickerFieldMapper<TProps>(fieldDef: DatepickerField<TProps>): Signal<Record<string, unknown>> {\n const ctx = resolveValueFieldContext(fieldDef.key);\n const defaultProps = inject(DEFAULT_PROPS);\n const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);\n\n return computed(() => {\n const inputs = buildValueFieldInputs(fieldDef, ctx, defaultProps(), defaultValidationMessages());\n\n // Add datepicker-specific properties, converting strings to Date objects\n if (fieldDef.minDate !== undefined) {\n inputs['minDate'] = toDate(fieldDef.minDate);\n }\n if (fieldDef.maxDate !== undefined) {\n inputs['maxDate'] = toDate(fieldDef.maxDate);\n }\n if (fieldDef.startAt !== undefined) {\n inputs['startAt'] = toDate(fieldDef.startAt);\n }\n\n return inputs;\n });\n}\n","import { computed, inject, Signal } from '@angular/core';\nimport { SelectField } from '../../definitions';\nimport { RadioField } from '../../definitions';\nimport { MultiCheckboxField } from '../../definitions';\nimport { BaseValueField, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES } from '@ng-forge/dynamic-forms';\nimport { resolveValueFieldContext, buildValueFieldInputs } from '../value/value-field.mapper';\n\n/**\n * Field types that have an options property.\n */\nexport type FieldWithOptions<T = unknown, TProps = unknown> =\n | SelectField<T, TProps>\n | RadioField<T, TProps>\n | MultiCheckboxField<T, TProps>;\n\n/**\n * Maps a field with options (select, radio, multi-checkbox) to component inputs.\n *\n * Extends the base value field mapper by adding the options property.\n *\n * @param fieldDef The field definition with options\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function optionsFieldMapper<T, TProps>(fieldDef: FieldWithOptions<T, TProps>): Signal<Record<string, unknown>> {\n const ctx = resolveValueFieldContext(fieldDef.key);\n const defaultProps = inject(DEFAULT_PROPS);\n const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);\n\n return computed(() => {\n // Cast to BaseValueField - safe because all FieldWithOptions types extend BaseValueField\n const inputs = buildValueFieldInputs(fieldDef as BaseValueField<TProps, unknown>, ctx, defaultProps(), defaultValidationMessages());\n\n // Add options property\n inputs['options'] = fieldDef.options;\n\n return inputs;\n });\n}\n","import { computed, inject, Signal } from '@angular/core';\nimport { DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES } from '@ng-forge/dynamic-forms';\nimport { TextareaField } from '../../definitions';\nimport { resolveValueFieldContext, buildValueFieldInputs } from '../value/value-field.mapper';\n\n/**\n * Maps a textarea field to component inputs.\n *\n * Extends the base value field mapper by adding textarea-specific properties:\n * - rows: Number of visible text rows\n * - cols: Number of visible text columns\n * - maxLength: Maximum character length (also used for validation)\n *\n * @param fieldDef The textarea field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function textareaFieldMapper<TProps>(fieldDef: TextareaField<TProps>): Signal<Record<string, unknown>> {\n const ctx = resolveValueFieldContext(fieldDef.key);\n const defaultProps = inject(DEFAULT_PROPS);\n const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);\n\n return computed(() => {\n const inputs = buildValueFieldInputs(fieldDef, ctx, defaultProps(), defaultValidationMessages());\n\n // Add textarea-specific properties from props\n const props = fieldDef.props as Record<string, unknown> | undefined;\n if (props && typeof props === 'object') {\n if (props['rows'] !== undefined) {\n inputs['rows'] = props['rows'];\n }\n if (props['cols'] !== undefined) {\n inputs['cols'] = props['cols'];\n }\n }\n\n // maxLength is at field level for validation\n if (fieldDef.maxLength !== undefined) {\n inputs['maxLength'] = fieldDef.maxLength;\n }\n\n return inputs;\n });\n}\n","import { computed, inject, Signal } from '@angular/core';\nimport { DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES } from '@ng-forge/dynamic-forms';\nimport { SliderField } from '../../definitions';\nimport { resolveValueFieldContext, buildValueFieldInputs } from '../value/value-field.mapper';\n\n/**\n * Maps a slider field to component inputs.\n *\n * Extends the base value field mapper by adding slider-specific properties:\n * - minValue: Minimum slider value\n * - maxValue: Maximum slider value\n * - step: Step increment for the slider\n *\n * @param fieldDef The slider field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function sliderFieldMapper<TProps>(fieldDef: SliderField<TProps>): Signal<Record<string, unknown>> {\n const ctx = resolveValueFieldContext(fieldDef.key);\n const defaultProps = inject(DEFAULT_PROPS);\n const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES);\n\n return computed(() => {\n const inputs = buildValueFieldInputs(fieldDef, ctx, defaultProps(), defaultValidationMessages());\n\n // Add slider-specific properties (these are at field level, not in props)\n if (fieldDef.minValue !== undefined) {\n inputs['minValue'] = fieldDef.minValue;\n }\n if (fieldDef.maxValue !== undefined) {\n inputs['maxValue'] = fieldDef.maxValue;\n }\n if (fieldDef.step !== undefined) {\n inputs['step'] = fieldDef.step;\n }\n\n return inputs;\n });\n}\n","import { computed, inject, Signal } from '@angular/core';\nimport { buildBaseInputs, DEFAULT_PROPS, FormEvent } from '@ng-forge/dynamic-forms';\nimport { ButtonField } from '../../definitions';\n\n/**\n * Maps a button field to component inputs.\n *\n * Unlike value field mappers, button fields do not participate in form values\n * and do not need field tree resolution or validation messages.\n *\n * Button-specific properties:\n * - event: The FormEvent constructor to emit when clicked\n * - eventArgs: Optional arguments to pass to the event constructor\n *\n * @param fieldDef The button field definition\n * @returns Signal containing Record of input names to values for ngComponentOutlet\n */\nexport function buttonFieldMapper<TProps, TEvent extends FormEvent>(\n fieldDef: ButtonField<TProps, TEvent>,\n): Signal<Record<string, unknown>> {\n const defaultProps = inject(DEFAULT_PROPS);\n\n return computed(() => {\n const inputs = buildBaseInputs(fieldDef, defaultProps());\n\n // Add button-specific properties\n inputs['event'] = fieldDef.event;\n\n if (fieldDef.eventArgs !== undefined) {\n inputs['eventArgs'] = fieldDef.eventArgs;\n }\n\n return inputs;\n });\n}\n","// UI-specific field mappers\nexport { valueFieldMapper, buildValueFieldInputs, resolveValueFieldContext } from './value/value-field.mapper';\nexport type { ValueFieldContext } from './value/value-field.mapper';\nexport { checkboxFieldMapper } from './checkbox/checkbox-field-mapper';\nexport { datepickerFieldMapper } from './datepicker/datepicker-field-mapper';\nexport { optionsFieldMapper } from './select/options-field-mapper';\nexport type { FieldWithOptions } from './select/options-field-mapper';\nexport { textareaFieldMapper } from './textarea/textarea-field-mapper';\nexport { sliderFieldMapper } from './slider/slider-field-mapper';\nexport { buttonFieldMapper } from './button/button-field-mapper';\n","import { computed, inject, Injector, signal, Signal } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { FieldTree, ValidationError } from '@angular/forms/signals';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { ValidationMessages } from '@ng-forge/dynamic-forms';\nimport { dynamicTextToObservable } from '@ng-forge/dynamic-forms';\nimport { interpolateParams } from '@ng-forge/dynamic-forms';\nimport { DynamicFormLogger } from '@ng-forge/dynamic-forms';\nimport type { Logger } from '@ng-forge/dynamic-forms';\n\n/**\n * Resolved validation error with interpolated message\n */\nexport interface ResolvedError {\n kind: string;\n message: string;\n}\n\n/**\n * Factory function that creates a signal of resolved validation errors\n * Handles async resolution of DynamicText validation messages\n *\n * @param field - Signal containing FieldTree\n * @param validationMessages - Signal containing custom field-level validation messages\n * @param defaultValidationMessages - Signal containing default validation messages (fallback)\n * @param injector - Optional injector for DynamicText resolution\n * @returns Signal<ResolvedError[]> - Reactively resolved error messages\n *\n * @example\n * ```typescript\n * readonly resolvedErrors = createResolvedErrorsSignal(\n * this.field,\n * this.validationMessages,\n * this.defaultValidationMessages\n * );\n * ```\n */\nexport function createResolvedErrorsSignal<T>(\n field: Signal<FieldTree<T>>,\n validationMessages: Signal<ValidationMessages | undefined>,\n defaultValidationMessages: Signal<ValidationMessages | undefined> = signal(undefined),\n injector = inject(Injector),\n): Signal<ResolvedError[]> {\n // Get logger from injector\n const logger = injector.get(DynamicFormLogger);\n\n // Ensure validationMessages is never undefined (mappers pass {} if not defined)\n const messages = computed(() => validationMessages() ?? {});\n const defaultMessages = computed(() => defaultValidationMessages() ?? {});\n\n // Create a computed signal that reads the actual errors from the field\n // This ensures the signal tracks changes to field().errors(), not just the field reference\n const errors = computed(() => {\n const control = field()();\n return control.errors();\n });\n\n // Convert signals to observables using toObservable with injector\n const errors$ = toObservable(errors, { injector });\n const messages$ = toObservable(messages, { injector });\n const defaultMessages$ = toObservable(defaultMessages, { injector });\n\n // Combine observables and process errors\n const resolvedErrors$ = combineLatest([errors$, messages$, defaultMessages$]).pipe(\n switchMap(([currentErrors, msgs, defaultMsgs]) => {\n // No errors - return empty array\n if (!currentErrors || currentErrors.length === 0) {\n return of([]);\n }\n\n // Create observable for each error's resolved message\n const errorResolvers = currentErrors.map((error: ValidationError) => resolveErrorMessage(error, msgs, defaultMsgs, injector, logger));\n\n // Combine all error message observables into single array emission, filtering out nulls\n return errorResolvers.length > 0\n ? combineLatest(errorResolvers).pipe(map((errors) => errors.filter((e): e is ResolvedError => e !== null)))\n : of([]);\n }),\n );\n\n // Convert observable back to signal using toSignal with injector\n // toSignal properly handles the injection context and manages subscriptions\n return toSignal(resolvedErrors$, { initialValue: [] as ResolvedError[], injector });\n}\n\n/**\n * Resolves a single error message from DynamicText sources with fallback logic\n * Priority: field-level message → default message → error.message → no message (logs warning)\n *\n * The error.message fallback enables schema validation libraries (Zod, Valibot, etc.)\n * to provide their own messages without requiring explicit validationMessages configuration.\n * Users who want translations can still override by configuring validationMessages.\n *\n * @internal\n */\nfunction resolveErrorMessage(\n error: ValidationError,\n fieldMessages: ValidationMessages,\n defaultMessages: ValidationMessages,\n injector: Injector,\n logger: Logger,\n): Observable<ResolvedError | null> {\n // Check for field-level custom message first\n const fieldMessage = fieldMessages[error.kind];\n\n // Fall back to default message if no field-level message exists\n const defaultMessage = defaultMessages[error.kind];\n\n // Determine which message to use: field-level → default → error.message (from schema validators)\n const messageToUse = fieldMessage ?? defaultMessage ?? error.message;\n\n // If no message found, log warning and return null (will be filtered out)\n if (!messageToUse) {\n logger.warn(\n `No validation message found for error kind \"${error.kind}\". ` +\n `Please provide a message via field-level validationMessages or form-level defaultValidationMessages.`,\n );\n return of(null);\n }\n\n // If using error.message directly (from schema validators), wrap in of() instead of dynamicTextToObservable\n // error.message is always a plain string, not DynamicText\n const isSchemaMessage = fieldMessage === undefined && defaultMessage === undefined;\n const messageObservable = isSchemaMessage\n ? of(messageToUse as string) // error.message is always string\n : dynamicTextToObservable(messageToUse, injector);\n\n // Apply parameter interpolation to support {{param}} syntax\n return messageObservable.pipe(\n map((msg) => ({\n kind: error.kind,\n message: interpolateParams(msg, error),\n })),\n );\n}\n","import { Signal, computed } from '@angular/core';\nimport { FieldTree } from '@angular/forms/signals';\n\n/**\n * Computed signal that determines if errors should be displayed\n * Based on field's invalid, touched, and error count\n *\n * @param field - Signal containing FieldTree\n * @returns Signal<boolean> - True if errors should be displayed\n */\nexport function shouldShowErrors<T>(field: Signal<FieldTree<T>>): Signal<boolean> {\n return computed(() => {\n const fieldTree = field();\n const control = fieldTree();\n return control.invalid() && control.touched() && control.errors().length > 0;\n });\n}\n","import { afterRenderEffect, ElementRef, Signal } from '@angular/core';\nimport { applyMetaToElement, FieldMeta, isEqual } from '@ng-forge/dynamic-forms';\n\n/**\n * Configuration options for setupMetaTracking.\n */\nexport interface MetaTrackingOptions {\n /**\n * CSS selector for target elements within the host.\n * If not provided, meta attributes are applied directly to the host element.\n *\n * @example\n * // Apply to internal radio inputs\n * selector: 'input[type=\"radio\"]'\n *\n * // Apply to host element (for Shadow DOM components)\n * selector: undefined\n */\n selector?: string;\n\n /**\n * Additional signals to track that should trigger re-application of meta.\n * Useful for components where DOM elements are dynamically created (e.g., radio options).\n *\n * @example\n * // Re-apply when options change\n * dependents: [this.options]\n */\n dependents?: Signal<unknown>[];\n}\n\n/**\n * Sets up automatic meta attribute tracking and application for wrapped components.\n *\n * This utility creates an `afterRenderEffect` that applies meta attributes to DOM elements\n * after Angular's render cycle. It efficiently tracks signal dependencies and only re-applies\n * when the meta signal or any dependent signals change.\n *\n * Use this instead of MutationObserver for better performance and integration with Angular's\n * change detection.\n *\n * @param elementRef - Reference to the host element\n * @param meta - Signal containing meta attributes to apply\n * @param options - Configuration options\n *\n * @example\n * ```typescript\n * // For a radio group with dynamic options\n * constructor() {\n * setupMetaTracking(inject(ElementRef), this.meta, {\n * selector: 'input[type=\"radio\"]',\n * dependents: [this.options]\n * });\n * }\n *\n * // For a simple checkbox\n * constructor() {\n * setupMetaTracking(inject(ElementRef), this.meta, {\n * selector: 'input[type=\"checkbox\"]'\n * });\n * }\n *\n * // For Shadow DOM components (apply to host)\n * constructor() {\n * setupMetaTracking(inject(ElementRef), this.meta);\n * }\n * ```\n */\nexport function setupMetaTracking(\n elementRef: ElementRef<HTMLElement>,\n meta: Signal<FieldMeta | undefined>,\n options?: MetaTrackingOptions,\n): void {\n let appliedAttributes = new Set<string>();\n let previousMeta: FieldMeta | undefined;\n let previousDeps: unknown[] | undefined;\n\n afterRenderEffect({\n write: () => {\n // Read dependents to establish signal tracking and collect their values\n const currentDeps = options?.dependents?.map((dep) => dep());\n\n const currentMeta = meta();\n const hostElement = elementRef.nativeElement;\n\n // Early exit if nothing changed (using deep equality for meta)\n const metaChanged = !isEqual(currentMeta, previousMeta);\n const depsChanged =\n !previousDeps || currentDeps?.length !== previousDeps.length || currentDeps?.some((d, i) => d !== previousDeps![i]);\n\n if (!metaChanged && !depsChanged) {\n return;\n }\n\n previousMeta = currentMeta;\n previousDeps = currentDeps;\n\n if (options?.selector) {\n // Apply to elements matching selector\n const elements = hostElement.querySelectorAll(options.selector);\n const allApplied = new Set<string>();\n\n elements.forEach((el) => {\n const applied = applyMetaToElement(el, currentMeta, appliedAttributes);\n applied.forEach((attr) => allApplied.add(attr));\n });\n\n appliedAttributes = allApplied;\n } else {\n // Apply to host element (for Shadow DOM components)\n appliedAttributes = applyMetaToElement(hostElement, currentMeta, appliedAttributes);\n }\n },\n });\n}\n","// Error display utilities for field components\nexport { createResolvedErrorsSignal } from './create-resolved-errors-signal';\nexport type { ResolvedError } from './create-resolved-errors-signal';\nexport { shouldShowErrors } from './should-show-errors';\n\n// Value comparison utilities - re-exported from main library\nexport { isEqual } from '@ng-forge/dynamic-forms';\n\n// Meta tracking utilities\nexport { setupMetaTracking } from './setup-meta-tracking';\nexport type { MetaTrackingOptions } from './setup-meta-tracking';\n","/**\n * @ng-forge/dynamic-forms/integration\n *\n * Integration API for UI library authors building field implementations\n * (Material, Bootstrap, PrimeNG, Ionic, etc.)\n *\n * This entrypoint provides:\n * - Specific field type definitions (InputField, SelectField, etc.)\n * - Field mappers for creating FieldTypeDefinition\n * - Error display utilities for field components\n */\n\n// =============================================================================\n// Field Type Definitions\n// =============================================================================\n\nexport type {\n ButtonField,\n EventArgs,\n CheckboxField,\n DatepickerField,\n DatepickerProps,\n InputField,\n InputProps,\n InputType,\n InputTypeToValueType,\n InferInputValue,\n NumericInputType,\n StringInputType,\n HtmlInputType,\n InputMeta,\n AutocompleteValue,\n InputMode,\n EnterKeyHint,\n Autocapitalize,\n MultiCheckboxField,\n RadioField,\n SelectField,\n SelectProps,\n SliderField,\n TextareaField,\n TextareaProps,\n TextareaMeta,\n TextareaWrap,\n ToggleField,\n} from './definitions';\n\n// =============================================================================\n// Field Mappers\n// =============================================================================\n\nexport {\n valueFieldMapper,\n buildValueFieldInputs,\n resolveValueFieldContext,\n checkboxFieldMapper,\n datepickerFieldMapper,\n optionsFieldMapper,\n} from './mappers';\n\nexport type { ValueFieldContext, FieldWithOptions } from './mappers';\n\n// =============================================================================\n// Error Display Utilities\n// =============================================================================\n\nexport { createResolvedErrorsSignal, shouldShowErrors } from './utils';\nexport type { ResolvedError } from './utils';\n\n// =============================================================================\n// Value Comparison Utilities\n// =============================================================================\n\nexport { isEqual } from './utils';\n\n// =============================================================================\n// Meta Tracking Utilities\n// =============================================================================\n\nexport { setupMetaTracking } from './utils';\nexport type { MetaTrackingOptions } from './utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;AAgBA;;;;;;;;AAQG;AACG,SAAU,wBAAwB,CAAC,QAAgB,EAAA;AACvD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC5C,IAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAsD;AAC/E,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACpC,OAAO,EAAE,SAAS,EAAE;AACtB;AAEA;;;;;;;;;AASG;AACG,SAAU,qBAAqB,CACnC,QAAwC,EACxC,GAAsB,EACtB,YAAsC,EACtC,yBAA8C,EAAA;IAE9C,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,EAAE,YAAY,CAAC;AAE/D,IAAA,MAAM,MAAM,GAA4B;AACtC,QAAA,GAAG,UAAU;AACb,QAAA,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,IAAI,EAAE;KACtD;AAED,IAAA,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE;AACtC,QAAA,MAAM,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,WAAW;IAC9C;AAEA,IAAA,IAAI,yBAAyB,KAAK,SAAS,EAAE;AAC3C,QAAA,MAAM,CAAC,2BAA2B,CAAC,GAAG,yBAAyB;IACjE;AAEA,IAAA,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE;AAC/B,QAAA,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,SAAS;IACjC;AAEA,IAAA,OAAO,MAAM;AACf;AAEA;;;;;;;;;;;;;;AAcG;AACG,SAAU,gBAAgB,CAC9B,QAAwC,EAAA;IAExC,MAAM,GAAG,GAAG,wBAAwB,CAAC,QAAQ,CAAC,GAAG,CAAC;AAClD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,yBAAyB,GAAG,MAAM,CAAC,2BAA2B,CAAC;AAErE,IAAA,OAAO,QAAQ,CAAC,MAAM,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,yBAAyB,EAAE,CAAC,CAAC;AAC1G;;ACtFA;;;;;;;;AAQG;AACG,SAAU,mBAAmB,CAAC,QAAmC,EAAA;AACrE,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC5C,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,yBAAyB,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACrE,IAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAsD;IAC/E,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;IAExC,OAAO,QAAQ,CAAC,MAAK;QACnB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAsB;QACpE,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC;AACjE,QAAA,MAAM,kBAAkB,GAAG,yBAAyB,EAAE;AAEtD,QAAA,MAAM,MAAM,GAA4B;AACtC,YAAA,GAAG,UAAU;AACb,YAAA,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,IAAI,EAAE;SACtD;AAED,QAAA,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE;AACtC,YAAA,MAAM,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,WAAW;QAC9C;AAEA,QAAA,IAAI,kBAAkB,KAAK,SAAS,EAAE;AACpC,YAAA,MAAM,CAAC,2BAA2B,CAAC,GAAG,kBAAkB;QAC1D;AAEA,QAAA,IAAI,SAAS,KAAK,SAAS,EAAE;AAC3B,YAAA,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS;QAC7B;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,CAAC;AACJ;;AC3CA;;;AAGG;AACH,SAAS,MAAM,CAAC,KAAuC,EAAA;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,QAAA,OAAO,IAAI;IACb;AACA,IAAA,IAAI,KAAK,YAAY,IAAI,EAAE;AACzB,QAAA,OAAO,KAAK;IACd;;AAEA,IAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;AAC5B,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;AAC5C;AAEA;;;;;;;;;;;;;AAaG;AACG,SAAU,qBAAqB,CAAS,QAAiC,EAAA;IAC7E,MAAM,GAAG,GAAG,wBAAwB,CAAC,QAAQ,CAAC,GAAG,CAAC;AAClD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,yBAAyB,GAAG,MAAM,CAAC,2BAA2B,CAAC;IAErE,OAAO,QAAQ,CAAC,MAAK;AACnB,QAAA,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,yBAAyB,EAAE,CAAC;;AAGhG,QAAA,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE;YAClC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9C;AACA,QAAA,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE;YAClC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9C;AACA,QAAA,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE;YAClC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9C;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,CAAC;AACJ;;ACzCA;;;;;;;AAOG;AACG,SAAU,kBAAkB,CAAY,QAAqC,EAAA;IACjF,MAAM,GAAG,GAAG,wBAAwB,CAAC,QAAQ,CAAC,GAAG,CAAC;AAClD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,yBAAyB,GAAG,MAAM,CAAC,2BAA2B,CAAC;IAErE,OAAO,QAAQ,CAAC,MAAK;;AAEnB,QAAA,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAA2C,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,yBAAyB,EAAE,CAAC;;AAGnI,QAAA,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,OAAO;AAEpC,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,CAAC;AACJ;;AChCA;;;;;;;;;;AAUG;AACG,SAAU,mBAAmB,CAAS,QAA+B,EAAA;IACzE,MAAM,GAAG,GAAG,wBAAwB,CAAC,QAAQ,CAAC,GAAG,CAAC;AAClD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,yBAAyB,GAAG,MAAM,CAAC,2BAA2B,CAAC;IAErE,OAAO,QAAQ,CAAC,MAAK;AACnB,QAAA,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,yBAAyB,EAAE,CAAC;;AAGhG,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAA4C;AACnE,QAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACtC,YAAA,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE;gBAC/B,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;YAChC;AACA,YAAA,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE;gBAC/B,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;YAChC;QACF;;AAGA,QAAA,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE;AACpC,YAAA,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,SAAS;QAC1C;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,CAAC;AACJ;;ACrCA;;;;;;;;;;AAUG;AACG,SAAU,iBAAiB,CAAS,QAA6B,EAAA;IACrE,MAAM,GAAG,GAAG,wBAAwB,CAAC,QAAQ,CAAC,GAAG,CAAC;AAClD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,yBAAyB,GAAG,MAAM,CAAC,2BAA2B,CAAC;IAErE,OAAO,QAAQ,CAAC,MAAK;AACnB,QAAA,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,yBAAyB,EAAE,CAAC;;AAGhG,QAAA,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE;AACnC,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,QAAQ;QACxC;AACA,QAAA,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE;AACnC,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,QAAQ;QACxC;AACA,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;AAC/B,YAAA,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI;QAChC;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,CAAC;AACJ;;ACjCA;;;;;;;;;;;;AAYG;AACG,SAAU,iBAAiB,CAC/B,QAAqC,EAAA;AAErC,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;IAE1C,OAAO,QAAQ,CAAC,MAAK;QACnB,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;;AAGxD,QAAA,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK;AAEhC,QAAA,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE;AACpC,YAAA,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,SAAS;QAC1C;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,CAAC;AACJ;;AClCA;;ACmBA;;;;;;;;;;;;;;;;;;AAkBG;SACa,0BAA0B,CACxC,KAA2B,EAC3B,kBAA0D,EAC1D,yBAAA,GAAoE,MAAM,CAAC,SAAS,CAAC,EACrF,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAA;;IAG3B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC;;AAG9C,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,kBAAkB,EAAE,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAC3D,IAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,yBAAyB,EAAE,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;;AAIzE,IAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAK;AAC3B,QAAA,MAAM,OAAO,GAAG,KAAK,EAAE,EAAE;AACzB,QAAA,OAAO,OAAO,CAAC,MAAM,EAAE;AACzB,IAAA,CAAC,kDAAC;;IAGF,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC;IAClD,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC;IACtD,MAAM,gBAAgB,GAAG,YAAY,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,CAAC;;IAGpE,MAAM,eAAe,GAAG,aAAa,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAChF,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC,KAAI;;QAE/C,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;AAChD,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC;QACf;;QAGA,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,KAAsB,KAAK,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;;AAGrI,QAAA,OAAO,cAAc,CAAC,MAAM,GAAG;AAC7B,cAAE,aAAa,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAyB,CAAC,KAAK,IAAI,CAAC,CAAC;AAC1G,cAAE,EAAE,CAAC,EAAE,CAAC;IACZ,CAAC,CAAC,CACH;;;AAID,IAAA,OAAO,QAAQ,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,EAAqB,EAAE,QAAQ,EAAE,CAAC;AACrF;AAEA;;;;;;;;;AASG;AACH,SAAS,mBAAmB,CAC1B,KAAsB,EACtB,aAAiC,EACjC,eAAmC,EACnC,QAAkB,EAClB,MAAc,EAAA;;IAGd,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;;IAG9C,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;;IAGlD,MAAM,YAAY,GAAG,YAAY,IAAI,cAAc,IAAI,KAAK,CAAC,OAAO;;IAGpE,IAAI,CAAC,YAAY,EAAE;AACjB,QAAA,MAAM,CAAC,IAAI,CACT,+CAA+C,KAAK,CAAC,IAAI,CAAA,GAAA,CAAK;AAC5D,YAAA,CAAA,oGAAA,CAAsG,CACzG;AACD,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC;IACjB;;;IAIA,MAAM,eAAe,GAAG,YAAY,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS;IAClF,MAAM,iBAAiB,GAAG;AACxB,UAAE,EAAE,CAAC,YAAsB,CAAC;AAC5B,UAAE,uBAAuB,CAAC,YAAY,EAAE,QAAQ,CAAC;;IAGnD,OAAO,iBAAiB,CAAC,IAAI,CAC3B,GAAG,CAAC,CAAC,GAAG,MAAM;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC;KACvC,CAAC,CAAC,CACJ;AACH;;ACpIA;;;;;;AAMG;AACG,SAAU,gBAAgB,CAAI,KAA2B,EAAA;IAC7D,OAAO,QAAQ,CAAC,MAAK;AACnB,QAAA,MAAM,SAAS,GAAG,KAAK,EAAE;AACzB,QAAA,MAAM,OAAO,GAAG,SAAS,EAAE;AAC3B,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC;AAC9E,IAAA,CAAC,CAAC;AACJ;;ACeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCG;SACa,iBAAiB,CAC/B,UAAmC,EACnC,IAAmC,EACnC,OAA6B,EAAA;AAE7B,IAAA,IAAI,iBAAiB,GAAG,IAAI,GAAG,EAAU;AACzC,IAAA,IAAI,YAAmC;AACvC,IAAA,IAAI,YAAmC;AAEvC,IAAA,iBAAiB,CAAC;QAChB,KAAK,EAAE,MAAK;;AAEV,YAAA,MAAM,WAAW,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;AAE5D,YAAA,MAAM,WAAW,GAAG,IAAI,EAAE;AAC1B,YAAA,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa;;YAG5C,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC;AACvD,YAAA,MAAM,WAAW,GACf,CAAC,YAAY,IAAI,WAAW,EAAE,MAAM,KAAK,YAAY,CAAC,MAAM,IAAI,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,YAAa,CAAC,CAAC,CAAC,CAAC;AAErH,YAAA,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE;gBAChC;YACF;YAEA,YAAY,GAAG,WAAW;YAC1B,YAAY,GAAG,WAAW;AAE1B,YAAA,IAAI,OAAO,EAAE,QAAQ,EAAE;;gBAErB,MAAM,QAAQ,GAAG,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC/D,gBAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU;AAEpC,gBAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;oBACtB,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,iBAAiB,CAAC;AACtE,oBAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACjD,gBAAA,CAAC,CAAC;gBAEF,iBAAiB,GAAG,UAAU;YAChC;iBAAO;;gBAEL,iBAAiB,GAAG,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC;YACrF;QACF,CAAC;AACF,KAAA,CAAC;AACJ;;AClHA;;ACAA;;;;;;;;;;AAUG;AAqCH;AACA;AACA;;ACjDA;;AAEG;;;;"}