@ng-forge/dynamic-forms 0.2.0 → 0.3.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 (21) hide show
  1. package/README.md +7 -5
  2. package/fesm2022/ng-forge-dynamic-forms-integration.mjs +79 -6
  3. package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
  4. package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-CZBdtTAU.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-D58rojQc.mjs} +375 -78
  5. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-D58rojQc.mjs.map +1 -0
  6. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-BM32StxL.mjs → ng-forge-dynamic-forms-page-field.component-m35XgkkL.mjs} +13 -7
  7. package/fesm2022/ng-forge-dynamic-forms-page-field.component-m35XgkkL.mjs.map +1 -0
  8. package/fesm2022/{ng-forge-dynamic-forms-testing-test-button.harness-CbctXjtc.mjs → ng-forge-dynamic-forms-testing-test-button.harness-0iXHLraC.mjs} +7 -7
  9. package/fesm2022/ng-forge-dynamic-forms-testing-test-button.harness-0iXHLraC.mjs.map +1 -0
  10. package/fesm2022/ng-forge-dynamic-forms-testing.mjs +25 -25
  11. package/fesm2022/ng-forge-dynamic-forms-testing.mjs.map +1 -1
  12. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-C0I8jf9T.mjs → ng-forge-dynamic-forms-text-field.component-CfDZFTyf.mjs} +5 -5
  13. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-C0I8jf9T.mjs.map → ng-forge-dynamic-forms-text-field.component-CfDZFTyf.mjs.map} +1 -1
  14. package/fesm2022/ng-forge-dynamic-forms.mjs +1 -1
  15. package/package.json +4 -4
  16. package/types/ng-forge-dynamic-forms-integration.d.ts +225 -9
  17. package/types/ng-forge-dynamic-forms-testing.d.ts +32 -1
  18. package/types/ng-forge-dynamic-forms.d.ts +211 -18
  19. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CZBdtTAU.mjs.map +0 -1
  20. package/fesm2022/ng-forge-dynamic-forms-page-field.component-BM32StxL.mjs.map +0 -1
  21. package/fesm2022/ng-forge-dynamic-forms-testing-test-button.harness-CbctXjtc.mjs.map +0 -1
@@ -17,6 +17,39 @@ type Prettify<T> = {
17
17
 
18
18
  type DynamicText = string | Observable<string> | Signal<string>;
19
19
 
20
+ /**
21
+ * Base interface for native HTML attributes that can be passed to form field elements.
22
+ *
23
+ * This interface serves as the base type for all meta attributes. Specific field types
24
+ * (like input, textarea) extend this with their own specialized meta types.
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // Using FieldMeta for custom attributes
29
+ * meta: {
30
+ * 'data-testid': 'email-input',
31
+ * 'aria-describedby': 'email-help',
32
+ * 'x-custom': 'value'
33
+ * }
34
+ * ```
35
+ *
36
+ * @public
37
+ */
38
+ interface FieldMeta {
39
+ /**
40
+ * Allows any data-* attribute
41
+ */
42
+ [key: `data-${string}`]: string | undefined;
43
+ /**
44
+ * Allows any aria-* attribute
45
+ */
46
+ [key: `aria-${string}`]: string | boolean | undefined;
47
+ /**
48
+ * Allows additional custom attributes as escape hatch
49
+ */
50
+ [key: string]: string | number | boolean | undefined;
51
+ }
52
+
20
53
  /**
21
54
  * Base interface for all dynamic form field definitions.
22
55
  *
@@ -56,10 +89,11 @@ type DynamicText = string | Observable<string> | Signal<string>;
56
89
  * ```
57
90
  *
58
91
  * @typeParam TProps - Field-specific properties interface
92
+ * @typeParam TMeta - Native HTML attributes interface (extends FieldMeta)
59
93
  *
60
94
  * @public
61
95
  */
62
- interface FieldDef<TProps> {
96
+ interface FieldDef<TProps, TMeta extends FieldMeta = FieldMeta> {
63
97
  /**
64
98
  * Unique field identifier used for form binding and value tracking.
65
99
  *
@@ -136,6 +170,32 @@ interface FieldDef<TProps> {
136
170
  * ```
137
171
  */
138
172
  props?: TProps;
173
+ /**
174
+ * Native HTML attributes to pass through to the underlying element.
175
+ *
176
+ * Contains attributes that are applied directly to the native input/element.
177
+ * Useful for accessibility, autocomplete hints, and custom attributes.
178
+ * The shape is defined by the TMeta generic parameter, which extends FieldMeta.
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * // Input field meta
183
+ * meta: {
184
+ * autocomplete: 'email',
185
+ * inputmode: 'email',
186
+ * 'aria-describedby': 'email-help',
187
+ * 'data-testid': 'email-input'
188
+ * }
189
+ *
190
+ * // Textarea meta
191
+ * meta: {
192
+ * wrap: 'soft',
193
+ * spellcheck: true,
194
+ * 'aria-label': 'Description field'
195
+ * }
196
+ * ```
197
+ */
198
+ meta?: TMeta;
139
199
  /**
140
200
  * Additional CSS classes for custom styling.
141
201
  *
@@ -236,7 +296,7 @@ type IncludedKeys = 'label' | 'className' | 'hidden' | 'tabIndex';
236
296
  *
237
297
  * @public
238
298
  */
239
- type FieldComponent<T extends FieldDef<Record<string, unknown> | unknown>> = Prettify<WithInputSignals<Pick<T, IncludedKeys>>>;
299
+ type FieldComponent<T extends FieldDef<unknown, FieldMeta>> = Prettify<WithInputSignals<Pick<T, IncludedKeys>>>;
240
300
 
241
301
  /**
242
302
  * Re-export Angular's ValidationError for consistency
@@ -261,8 +321,10 @@ interface ValidationMessages {
261
321
  * This is a programmatic field type only - users cannot customize this field type
262
322
  *
263
323
  * TypeScript cannot enforce field nesting rules due to circular dependency limitations.
264
- * For documentation: Rows should contain groups and leaf fields, but NOT pages or other rows.
324
+ * For documentation: Rows should contain groups and leaf fields, but NOT pages, other rows, or hidden fields.
265
325
  * Runtime validation enforces these rules.
326
+ *
327
+ * Note: Rows are container fields and do not support `meta` since they have no native form element.
266
328
  */
267
329
  interface RowField<TFields extends readonly RowAllowedChildren[] = readonly RowAllowedChildren[]> extends FieldDef<never> {
268
330
  type: 'row';
@@ -270,6 +332,8 @@ interface RowField<TFields extends readonly RowAllowedChildren[] = readonly RowA
270
332
  readonly fields: TFields;
271
333
  /** Row fields do not have a label property **/
272
334
  readonly label?: never;
335
+ /** Rows do not support meta - they have no native form element **/
336
+ readonly meta?: never;
273
337
  }
274
338
  /**
275
339
  * Type guard for RowField with proper type narrowing
@@ -284,18 +348,74 @@ declare function isRowField(field: FieldDef<any>): field is RowField;
284
348
  * TypeScript cannot enforce field nesting rules due to circular dependency limitations.
285
349
  * For documentation: Groups should contain rows and leaf fields, but NOT pages or other groups.
286
350
  * Runtime validation enforces these rules.
351
+ *
352
+ * Note: Groups are container fields and do not support `meta` since they have no native form element.
287
353
  */
288
354
  interface GroupField<TFields extends readonly GroupAllowedChildren[] = readonly GroupAllowedChildren[]> extends FieldDef<never> {
289
355
  type: 'group';
290
356
  readonly fields: TFields;
291
357
  /** Groups do not have a label property - they are logical containers only **/
292
358
  readonly label?: never;
359
+ /** Groups do not support meta - they have no native form element **/
360
+ readonly meta?: never;
293
361
  }
294
362
  /**
295
363
  * Type guard for GroupField with proper type narrowing
296
364
  */
297
365
  declare function isGroupField(field: FieldDef<any>): field is GroupField;
298
366
 
367
+ /**
368
+ * Scalar types supported by hidden fields.
369
+ * These are the primitive value types that can be stored.
370
+ */
371
+ type HiddenScalar = string | number | boolean;
372
+ /**
373
+ * All value types supported by hidden fields.
374
+ * Supports both scalar values and arrays of scalars for storing
375
+ * multiple IDs or similar data.
376
+ */
377
+ type HiddenValue = HiddenScalar | HiddenScalar[];
378
+ /**
379
+ * Hidden field definition for storing values without rendering UI.
380
+ *
381
+ * Hidden fields participate in the form schema and contribute to form values,
382
+ * but do not render any visible component. They are useful for:
383
+ * - Storing IDs when updating existing records
384
+ * - Persisting metadata that shouldn't be user-editable
385
+ * - Tracking computed values that need to be submitted
386
+ *
387
+ * Unlike the `hidden` property on other fields (which hides a rendered field),
388
+ * this field type renders nothing at all - it's a componentless field.
389
+ *
390
+ * @example
391
+ * ```typescript
392
+ * // Store a record ID for updates
393
+ * const idField: HiddenField<string> = {
394
+ * type: 'hidden',
395
+ * key: 'id',
396
+ * value: '550e8400-e29b-41d4-a716-446655440000',
397
+ * };
398
+ *
399
+ * // Store multiple tag IDs
400
+ * const tagIdsField: HiddenField<number[]> = {
401
+ * type: 'hidden',
402
+ * key: 'tagIds',
403
+ * value: [1, 2, 3],
404
+ * };
405
+ * ```
406
+ *
407
+ * @typeParam TValue - The type of value stored (must be HiddenValue compatible)
408
+ */
409
+ interface HiddenField<TValue extends HiddenValue = HiddenValue> extends FieldDef<never> {
410
+ /** Discriminant for hidden field type */
411
+ type: 'hidden';
412
+ /**
413
+ * The value to store in the form.
414
+ * This is required - a hidden field without a value serves no purpose.
415
+ */
416
+ value: TValue;
417
+ }
418
+
299
419
  /**
300
420
  * Type constraints for field nesting rules
301
421
  * These ensure that container fields can only contain valid child field types
@@ -309,9 +429,10 @@ declare function isGroupField(field: FieldDef<any>): field is GroupField;
309
429
  type PageAllowedChildren = LeafFieldTypes | RowField | GroupField | ArrayField;
310
430
  /**
311
431
  * Fields that are allowed as children of Row fields
312
- * Rows can contain: groups, arrays, and leaf fields (but NOT pages or other rows)
432
+ * Rows can contain: groups, arrays, and leaf fields (but NOT pages, other rows, or hidden fields)
433
+ * Hidden fields are excluded because rows are for horizontal layouts and hidden fields don't render
313
434
  */
314
- type RowAllowedChildren = LeafFieldTypes | GroupField | ArrayField;
435
+ type RowAllowedChildren = Exclude<LeafFieldTypes, HiddenField> | GroupField | ArrayField;
315
436
  /**
316
437
  * Fields that are allowed as children of Group fields
317
438
  * Groups can contain: rows and leaf fields (but NOT pages or other groups)
@@ -359,6 +480,8 @@ type ArrayAllowedChildren = LeafFieldTypes | RowField | GroupField;
359
480
  *
360
481
  * Nesting constraints: Arrays can contain rows, leaf fields, or groups (for object arrays),
361
482
  * but NOT pages or other arrays. Runtime validation enforces these rules.
483
+ *
484
+ * Note: Arrays are container fields and do not support `meta` since they have no native form element.
362
485
  */
363
486
  interface ArrayField<TFields extends readonly ArrayAllowedChildren[] = readonly ArrayAllowedChildren[]> extends FieldDef<never> {
364
487
  type: 'array';
@@ -371,6 +494,8 @@ interface ArrayField<TFields extends readonly ArrayAllowedChildren[] = readonly
371
494
  readonly fields: TFields;
372
495
  /** Array fields do not have a label property **/
373
496
  readonly label?: never;
497
+ /** Arrays do not support meta - they have no native form element **/
498
+ readonly meta?: never;
374
499
  }
375
500
  /**
376
501
  * Type guard for ArrayField with proper type narrowing
@@ -416,6 +541,8 @@ interface PageLogicConfig {
416
541
  * TypeScript cannot enforce field nesting rules due to circular dependency limitations.
417
542
  * For documentation: Pages should contain rows, groups, and leaf fields, but NOT other pages.
418
543
  * Runtime validation enforces these rules.
544
+ *
545
+ * Note: Pages are container fields and do not support `meta` since they have no native form element.
419
546
  */
420
547
  interface PageField<TFields extends readonly PageAllowedChildren[] = PageAllowedChildren[]> extends FieldDef<never> {
421
548
  type: 'page';
@@ -423,6 +550,8 @@ interface PageField<TFields extends readonly PageAllowedChildren[] = PageAllowed
423
550
  readonly fields: TFields;
424
551
  /** Page fields do not have a label property **/
425
552
  readonly label?: never;
553
+ /** Pages do not support meta - they have no native form element **/
554
+ readonly meta?: never;
426
555
  /**
427
556
  * Logic configurations for conditional page visibility.
428
557
  * Only 'hidden' type logic is supported for pages.
@@ -618,6 +747,7 @@ interface FieldRegistryContainers {
618
747
  */
619
748
  interface FieldRegistryLeaves {
620
749
  text: TextField;
750
+ hidden: HiddenField;
621
751
  }
622
752
  /**
623
753
  * Global interface for dynamic form field definitions with categorization
@@ -1957,14 +2087,44 @@ interface FieldTypeDefinition<T extends FieldDef<any> = any> {
1957
2087
  /** Field definition type marker (internal use) */
1958
2088
  _fieldDef?: T;
1959
2089
  /**
1960
- * Function to load the component (supports lazy loading)
1961
- * Returns a Promise that resolves to the component class or module with default export
2090
+ * Function to load the component (supports lazy loading).
2091
+ * Returns a Promise that resolves to the component class or module with default export.
2092
+ *
2093
+ * Optional - omit for componentless fields (e.g., hidden fields) that only
2094
+ * contribute to form values without rendering any UI.
1962
2095
  */
1963
2096
  loadComponent?: () => Promise<any>;
1964
- /** Mapper function that converts field definition to component bindings */
1965
- mapper: MapperFn<T>;
2097
+ /**
2098
+ * Mapper function that converts field definition to component bindings.
2099
+ *
2100
+ * Optional - omit for componentless fields (like hidden fields) that don't need
2101
+ * input mapping. When omitted for componentless fields (no loadComponent), an empty
2102
+ * signal is returned. When omitted for regular fields with a component, falls back
2103
+ * to baseFieldMapper.
2104
+ */
2105
+ mapper?: MapperFn<T>;
1966
2106
  /** How this field type handles form values and data collection (defaults to 'include') */
1967
2107
  valueHandling?: ValueHandlingMode;
2108
+ /**
2109
+ * List of prop keys to forward to the meta object.
2110
+ *
2111
+ * Some props (like `type` for inputs, `rows`/`cols` for textareas) are actually
2112
+ * native HTML attributes. Specifying them here causes them to be merged into
2113
+ * the meta object before being passed to the component, ensuring they're applied
2114
+ * via the meta tracking mechanism.
2115
+ *
2116
+ * Note: Meta values always take precedence over forwarded props.
2117
+ *
2118
+ * @example
2119
+ * ```typescript
2120
+ * {
2121
+ * name: 'input',
2122
+ * propsToMeta: ['type'],
2123
+ * // ...
2124
+ * }
2125
+ * ```
2126
+ */
2127
+ propsToMeta?: string[];
1968
2128
  }
1969
2129
  /**
1970
2130
  * Injection token for the global field type registry.
@@ -2665,7 +2825,7 @@ interface FieldWithValidation {
2665
2825
  * This type represents all possible value types that can be used in form fields.
2666
2826
  */
2667
2827
  type ValueType = string | number | boolean | Date | object | unknown[];
2668
- interface BaseValueField<TProps, TValue> extends FieldDef<TProps>, FieldWithValidation {
2828
+ interface BaseValueField<TProps, TValue, TMeta extends FieldMeta = FieldMeta> extends FieldDef<TProps, TMeta>, FieldWithValidation {
2669
2829
  value?: TValue;
2670
2830
  /**
2671
2831
  * Placeholder text displayed when the field is empty.
@@ -2674,11 +2834,11 @@ interface BaseValueField<TProps, TValue> extends FieldDef<TProps>, FieldWithVali
2674
2834
  placeholder?: DynamicText;
2675
2835
  required?: boolean;
2676
2836
  }
2677
- declare function isValueField<TProps>(field: FieldDef<TProps>): field is BaseValueField<TProps, ValueType>;
2837
+ declare function isValueField<TProps, TMeta extends FieldMeta = FieldMeta>(field: FieldDef<TProps, TMeta>): field is BaseValueField<TProps, ValueType, TMeta>;
2678
2838
  type ExcludedKeys$1 = 'type' | 'conditionals' | 'value' | 'valueType' | 'disabled' | 'readonly' | 'hidden' | 'col' | 'minValue' | 'maxValue' | 'step' | 'required' | 'email' | 'min' | 'max' | 'minLength' | 'maxLength' | 'pattern' | 'validators' | 'logic' | 'schemas';
2679
2839
  type ValueFieldComponent<T extends BaseValueField<Record<string, unknown> | unknown, unknown>> = Prettify<WithInputSignals<Omit<T, ExcludedKeys$1>>>;
2680
2840
 
2681
- interface BaseCheckedField<TProps> extends FieldDef<TProps>, FieldWithValidation {
2841
+ interface BaseCheckedField<TProps, TMeta extends FieldMeta = FieldMeta> extends FieldDef<TProps, TMeta>, FieldWithValidation {
2682
2842
  value?: boolean;
2683
2843
  /**
2684
2844
  * Placeholder text displayed when the field is empty.
@@ -2687,7 +2847,7 @@ interface BaseCheckedField<TProps> extends FieldDef<TProps>, FieldWithValidation
2687
2847
  placeholder?: DynamicText;
2688
2848
  required?: boolean;
2689
2849
  }
2690
- declare function isCheckedField<TProps>(field: FieldDef<TProps>): field is BaseCheckedField<TProps>;
2850
+ declare function isCheckedField<TProps, TMeta extends FieldMeta = FieldMeta>(field: FieldDef<TProps, TMeta>): field is BaseCheckedField<TProps, TMeta>;
2691
2851
  type ExcludedKeys = 'type' | 'conditionals' | 'value' | 'disabled' | 'readonly' | 'hidden' | 'col' | keyof FieldWithValidation;
2692
2852
  type CheckedFieldComponent<T extends BaseCheckedField<Record<string, unknown> | unknown>> = Prettify<WithInputSignals<Omit<T, ExcludedKeys>>>;
2693
2853
 
@@ -3001,6 +3161,33 @@ declare function textFieldMapper(fieldDef: TextField): Signal<Record<string, unk
3001
3161
  */
3002
3162
  declare function dynamicTextToObservable(value: DynamicText | undefined, injector?: Injector): Observable<string>;
3003
3163
 
3164
+ /**
3165
+ * Applies meta attributes to a DOM element and tracks which attributes were applied.
3166
+ *
3167
+ * This utility handles:
3168
+ * - Removing previously applied attributes that are no longer in meta
3169
+ * - Setting new attributes from meta
3170
+ * - Converting all values to strings via String()
3171
+ *
3172
+ * @param element - The DOM element to apply attributes to
3173
+ * @param meta - The meta object containing attributes to apply
3174
+ * @param previouslyApplied - Set of attribute names that were previously applied
3175
+ * @returns A new Set containing the attribute names that were applied
3176
+ *
3177
+ * @example
3178
+ * ```typescript
3179
+ * private appliedAttrs = new Set<string>();
3180
+ *
3181
+ * explicitEffect([this.meta], ([meta]) => {
3182
+ * const input = this.el.nativeElement.querySelector('input');
3183
+ * if (input) {
3184
+ * this.appliedAttrs = applyMetaToElement(input, meta, this.appliedAttrs);
3185
+ * }
3186
+ * });
3187
+ * ```
3188
+ */
3189
+ declare function applyMetaToElement(element: Element, meta: FieldMeta | undefined, previouslyApplied: Set<string>): Set<string>;
3190
+
3004
3191
  /**
3005
3192
  * Pipe that handles dynamic text resolution with support for static strings,
3006
3193
  * Observables, and Signals.
@@ -3052,6 +3239,8 @@ declare class RowFieldComponent {
3052
3239
  private readonly logger;
3053
3240
  field: _angular_core.InputSignal<RowField<readonly _ng_forge_dynamic_forms.RowAllowedChildren[]>>;
3054
3241
  key: _angular_core.InputSignal<string>;
3242
+ className: _angular_core.InputSignal<string | undefined>;
3243
+ readonly hostClasses: _angular_core.Signal<string>;
3055
3244
  readonly disabled: _angular_core.Signal<boolean>;
3056
3245
  private readonly rawFieldRegistry;
3057
3246
  private readonly fieldsSource;
@@ -3059,7 +3248,7 @@ declare class RowFieldComponent {
3059
3248
  constructor();
3060
3249
  private setupEffects;
3061
3250
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RowFieldComponent, never>;
3062
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RowFieldComponent, "div[row-field]", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3251
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RowFieldComponent, "div[row-field]", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3063
3252
  }
3064
3253
 
3065
3254
  /**
@@ -3081,6 +3270,8 @@ declare class GroupFieldComponent<TModel extends Record<string, unknown> = Recor
3081
3270
  private readonly memoizedDefaultValues;
3082
3271
  field: _angular_core.InputSignal<GroupField<readonly _ng_forge_dynamic_forms.GroupAllowedChildren[]>>;
3083
3272
  key: _angular_core.InputSignal<string>;
3273
+ className: _angular_core.InputSignal<string | undefined>;
3274
+ readonly hostClasses: _angular_core.Signal<string>;
3084
3275
  private readonly rawFieldRegistry;
3085
3276
  private readonly formSetup;
3086
3277
  readonly defaultValues: _angular_core.WritableSignal<Record<string, unknown>>;
@@ -3103,7 +3294,7 @@ declare class GroupFieldComponent<TModel extends Record<string, unknown> = Recor
3103
3294
  constructor();
3104
3295
  private setupEffects;
3105
3296
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<GroupFieldComponent<any>, never>;
3106
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<GroupFieldComponent<any>, "fieldset[group-field]", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; }, { "validityChange": "validityChange"; "dirtyChange": "dirtyChange"; "submitted": "submitted"; }, never, never, true, never>;
3297
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GroupFieldComponent<any>, "fieldset[group-field]", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; }, { "validityChange": "validityChange"; "dirtyChange": "dirtyChange"; "submitted": "submitted"; }, never, never, true, never>;
3107
3298
  }
3108
3299
 
3109
3300
  /**
@@ -3138,6 +3329,8 @@ declare class ArrayFieldComponent<TModel extends Record<string, unknown> = Recor
3138
3329
  private readonly logger;
3139
3330
  field: _angular_core.InputSignal<ArrayField<readonly _ng_forge_dynamic_forms.ArrayAllowedChildren[]>>;
3140
3331
  key: _angular_core.InputSignal<string>;
3332
+ className: _angular_core.InputSignal<string | undefined>;
3333
+ readonly hostClasses: _angular_core.Signal<string>;
3141
3334
  private readonly rawFieldRegistry;
3142
3335
  private readonly fieldTemplate;
3143
3336
  private readonly arrayFieldTrees;
@@ -3155,7 +3348,7 @@ declare class ArrayFieldComponent<TModel extends Record<string, unknown> = Recor
3155
3348
  private addItem;
3156
3349
  private removeItem;
3157
3350
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ArrayFieldComponent<any>, never>;
3158
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ArrayFieldComponent<any>, "array-field", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
3351
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ArrayFieldComponent<any>, "array-field", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3159
3352
  }
3160
3353
 
3161
3354
  /**
@@ -3203,5 +3396,5 @@ declare function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): O
3203
3396
  */
3204
3397
  declare function interpolateParams(message: string, error: ValidationError): string;
3205
3398
 
3206
- export { ARRAY_CONTEXT, AddArrayItemEvent, ArrayFieldComponent, BUILT_IN_FIELDS, ConsoleLogger, DynamicForm, DynamicFormError, DynamicFormLogger, DynamicTextPipe, EventBus, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FormClearEvent, FormResetEvent, GroupFieldComponent, NextPageEvent, NoopLogger, PageChangeEvent, PreviousPageEvent, RemoveArrayItemEvent, RowFieldComponent, SubmitEvent, applyValidator, applyValidators, arrayFieldMapper, baseFieldMapper, buildBaseInputs, dynamicTextToObservable, getArrayLength, groupFieldMapper, interpolateParams, isArrayField, isCheckedField, isContainerField, isDisplayOnlyField, isFormStateCondition, isGroupField, isLeafField, isPageField, isRowField, isValueBearingField, isValueField, omit, pageFieldMapper, provideDynamicForm, resolveNextButtonDisabled, resolveSubmitButtonDisabled, resolveTokens, rowFieldMapper, textFieldMapper, withLoggerConfig };
3207
- export type { ArrayAllowedChildren, ArrayContext, ArrayField, ArrayFieldTree, ArrayItemContext, AsyncCustomValidator, AsyncValidatorConfig, AvailableFieldTypes, BaseCheckedField, BaseValidatorConfig, BaseValueField, BuiltInValidatorConfig, ButtonLogicContext, CheckedFieldComponent, ConditionalExpression, ContainerFieldTypes, CustomFnConfig, CustomValidator, CustomValidatorConfig, DynamicFormFieldRegistry, DynamicText, EvaluationContext, ExtractField, ExtractFieldDefs, ExtractFormValue, FieldComponent, FieldDef, FieldOption, FieldPathAccess, FieldRegistryContainers, FieldRegistryLeaves, FieldSignalContext, FieldTypeDefinition, FieldWithValidation, FormConfig, FormEvent, FormEventConstructor, FormMode, FormModeDetectionResult, FormOptions, FormStateCondition, GroupAllowedChildren, GroupField, HttpCustomValidator, HttpResourceRequest, HttpValidatorConfig, InferFormValue$1 as InferFormValue, LeafFieldTypes, Logger, LogicConfig, MapperFn, NarrowField, NarrowFields, NextButtonOptions, PageAllowedChildren, PageField, Prettify, RegisteredFieldTypes, RowAllowedChildren, RowField, SchemaApplicationConfig, SchemaDefinition, SubmissionActionResult, SubmissionConfig, SubmitButtonOptions, TextElementType, TextField, TextProps, TokenContext, ValidationError, ValidationMessages, ValidatorConfig, ValueFieldComponent, ValueHandlingMode, ValueType, WithInputSignals };
3399
+ export { ARRAY_CONTEXT, AddArrayItemEvent, ArrayFieldComponent, BUILT_IN_FIELDS, ConsoleLogger, DynamicForm, DynamicFormError, DynamicFormLogger, DynamicTextPipe, EventBus, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FormClearEvent, FormResetEvent, GroupFieldComponent, NextPageEvent, NoopLogger, PageChangeEvent, PreviousPageEvent, RemoveArrayItemEvent, RowFieldComponent, SubmitEvent, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, baseFieldMapper, buildBaseInputs, dynamicTextToObservable, getArrayLength, groupFieldMapper, interpolateParams, isArrayField, isCheckedField, isContainerField, isDisplayOnlyField, isFormStateCondition, isGroupField, isLeafField, isPageField, isRowField, isValueBearingField, isValueField, omit, pageFieldMapper, provideDynamicForm, resolveNextButtonDisabled, resolveSubmitButtonDisabled, resolveTokens, rowFieldMapper, textFieldMapper, withLoggerConfig };
3400
+ export type { ArrayAllowedChildren, ArrayContext, ArrayField, ArrayFieldTree, ArrayItemContext, AsyncCustomValidator, AsyncValidatorConfig, AvailableFieldTypes, BaseCheckedField, BaseValidatorConfig, BaseValueField, BuiltInValidatorConfig, ButtonLogicContext, CheckedFieldComponent, ConditionalExpression, ContainerFieldTypes, CustomFnConfig, CustomValidator, CustomValidatorConfig, DynamicFormFieldRegistry, DynamicText, EvaluationContext, ExtractField, ExtractFieldDefs, ExtractFormValue, FieldComponent, FieldDef, FieldMeta, FieldOption, FieldPathAccess, FieldRegistryContainers, FieldRegistryLeaves, FieldSignalContext, FieldTypeDefinition, FieldWithValidation, FormConfig, FormEvent, FormEventConstructor, FormMode, FormModeDetectionResult, FormOptions, FormStateCondition, GroupAllowedChildren, GroupField, HttpCustomValidator, HttpResourceRequest, HttpValidatorConfig, InferFormValue$1 as InferFormValue, LeafFieldTypes, Logger, LogicConfig, MapperFn, NarrowField, NarrowFields, NextButtonOptions, PageAllowedChildren, PageField, Prettify, RegisteredFieldTypes, RowAllowedChildren, RowField, SchemaApplicationConfig, SchemaDefinition, SubmissionActionResult, SubmissionConfig, SubmitButtonOptions, TextElementType, TextField, TextProps, TokenContext, ValidationError, ValidationMessages, ValidatorConfig, ValueFieldComponent, ValueHandlingMode, ValueType, WithInputSignals };