@ng-forge/dynamic-forms 1.3.0-next.1 → 1.3.0-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-CiKN-mcc.mjs +12 -0
  2. package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-CiKN-mcc.mjs.map +1 -0
  3. package/fesm2022/ng-forge-dynamic-forms-array-field.component-Dv9mPnJ3.mjs +770 -0
  4. package/fesm2022/ng-forge-dynamic-forms-array-field.component-Dv9mPnJ3.mjs.map +1 -0
  5. package/fesm2022/ng-forge-dynamic-forms-array-item-registry.service-D-AxVLdk.mjs +83 -0
  6. package/fesm2022/ng-forge-dynamic-forms-array-item-registry.service-D-AxVLdk.mjs.map +1 -0
  7. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-EuYCbquo.mjs +1887 -0
  8. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-EuYCbquo.mjs.map +1 -0
  9. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-2wQK_wPp.mjs +954 -0
  10. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-2wQK_wPp.mjs.map +1 -0
  11. package/fesm2022/ng-forge-dynamic-forms-container-field-processors-C_JRvaVt.mjs +117 -0
  12. package/fesm2022/ng-forge-dynamic-forms-container-field-processors-C_JRvaVt.mjs.map +1 -0
  13. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs +228 -0
  14. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs.map +1 -0
  15. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs +102 -0
  16. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs.map +1 -0
  17. package/fesm2022/ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs +4 -0
  18. package/fesm2022/{ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs.map → ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs.map} +1 -1
  19. package/fesm2022/ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs +77 -0
  20. package/fesm2022/ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs.map +1 -0
  21. package/fesm2022/ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs +4 -0
  22. package/fesm2022/ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs.map +1 -0
  23. package/fesm2022/ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs +644 -0
  24. package/fesm2022/ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs.map +1 -0
  25. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-DKgkpIpG.mjs +56 -0
  26. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-DKgkpIpG.mjs.map +1 -0
  27. package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dd-gHJ_7.mjs +38 -0
  28. package/fesm2022/{ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs.map → ng-forge-dynamic-forms-form-schema.service-Dd-gHJ_7.mjs.map} +1 -1
  29. package/fesm2022/ng-forge-dynamic-forms-form-state-manager-DcOXRFRL.mjs +1522 -0
  30. package/fesm2022/ng-forge-dynamic-forms-form-state-manager-DcOXRFRL.mjs.map +1 -0
  31. package/fesm2022/ng-forge-dynamic-forms-group-field.component-BjZi0bhq.mjs +292 -0
  32. package/fesm2022/ng-forge-dynamic-forms-group-field.component-BjZi0bhq.mjs.map +1 -0
  33. package/fesm2022/ng-forge-dynamic-forms-integration.mjs +1318 -843
  34. package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
  35. package/fesm2022/ng-forge-dynamic-forms-internal.mjs +3326 -3641
  36. package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
  37. package/fesm2022/ng-forge-dynamic-forms-page-field.component-BRjQmWC9.mjs +295 -0
  38. package/fesm2022/ng-forge-dynamic-forms-page-field.component-BRjQmWC9.mjs.map +1 -0
  39. package/fesm2022/ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs +329 -0
  40. package/fesm2022/ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs.map +1 -0
  41. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs +81 -0
  42. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs.map +1 -0
  43. package/fesm2022/ng-forge-dynamic-forms-schema-builder-C62afItJ.mjs +400 -0
  44. package/fesm2022/ng-forge-dynamic-forms-schema-builder-C62afItJ.mjs.map +1 -0
  45. package/fesm2022/ng-forge-dynamic-forms-schema-registry.service-axBV9FBH.mjs +45 -0
  46. package/fesm2022/ng-forge-dynamic-forms-schema-registry.service-axBV9FBH.mjs.map +1 -0
  47. package/fesm2022/ng-forge-dynamic-forms-schema.mjs +8 -14
  48. package/fesm2022/ng-forge-dynamic-forms-schema.mjs.map +1 -1
  49. package/fesm2022/ng-forge-dynamic-forms-testing.mjs +68 -73
  50. package/fesm2022/ng-forge-dynamic-forms-testing.mjs.map +1 -1
  51. package/fesm2022/ng-forge-dynamic-forms-text-field.component--MAh_h4Q.mjs +257 -0
  52. package/fesm2022/ng-forge-dynamic-forms-text-field.component--MAh_h4Q.mjs.map +1 -0
  53. package/fesm2022/ng-forge-dynamic-forms-validation-execution.token-BFyySKtp.mjs +8 -0
  54. package/fesm2022/ng-forge-dynamic-forms-validation-execution.token-BFyySKtp.mjs.map +1 -0
  55. package/fesm2022/ng-forge-dynamic-forms-with-logger-config-BAATqYY0.mjs +94 -0
  56. package/fesm2022/ng-forge-dynamic-forms-with-logger-config-BAATqYY0.mjs.map +1 -0
  57. package/fesm2022/ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs +115 -0
  58. package/fesm2022/ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs.map +1 -0
  59. package/fesm2022/ng-forge-dynamic-forms.mjs +2136 -3
  60. package/fesm2022/ng-forge-dynamic-forms.mjs.map +1 -1
  61. package/package.json +1 -1
  62. package/types/ng-forge-dynamic-forms-integration.d.ts +543 -415
  63. package/types/ng-forge-dynamic-forms-internal.d.ts +2319 -2436
  64. package/types/ng-forge-dynamic-forms-schema.d.ts +13 -16
  65. package/types/ng-forge-dynamic-forms-testing.d.ts +34 -37
  66. package/types/ng-forge-dynamic-forms.d.ts +735 -722
  67. package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs +0 -750
  68. package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs.map +0 -1
  69. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs +0 -2394
  70. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs.map +0 -1
  71. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs +0 -1054
  72. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs.map +0 -1
  73. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs +0 -86
  74. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs.map +0 -1
  75. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs +0 -33
  76. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs.map +0 -1
  77. package/fesm2022/ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs +0 -17
  78. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs +0 -25
  79. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs.map +0 -1
  80. package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs +0 -24
  81. package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs +0 -177
  82. package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs.map +0 -1
  83. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs +0 -5133
  84. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs.map +0 -1
  85. package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs +0 -176
  86. package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs.map +0 -1
  87. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs +0 -19
  88. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs.map +0 -1
  89. package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs +0 -570
  90. package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs.map +0 -1
  91. package/fesm2022/ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs +0 -126
  92. package/fesm2022/ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs.map +0 -1
@@ -1,12 +1,9 @@
1
- import { FormEvent, FormEventConstructor, FormSubmitEvent, NextPageEvent, PreviousPageEvent, FieldWithValidation, ArrayItemContext, BaseAddon, DynamicValue } from '@ng-forge/dynamic-forms';
2
- export { BUILT_IN_FIELDS, FieldWrapper, InferWrapperRegistry, WrapperRegistration, WrapperTypeDefinition, WrappersBundle, createWrappers, isWrappersBundle, wrapperProps } from '@ng-forge/dynamic-forms';
3
- import { FieldDef, StateLogicConfig, BaseCheckedField, FieldMeta, BaseValueField, FieldOption, ArrayAllowedChildren, NonFieldLogicConfig, LogicConfig, ResolvedError, DynamicText, ValidationMessages, AnyAddon, AddonActionHandler, WrapperFieldInputs, AddonActionContext } from '@ng-forge/dynamic-forms/internal';
4
- export { ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, AddonActionHandler, AddonShapeValidator, AddonTypeDefinition, AddonTypeSchema, ArrayContext, ArrayFieldTree, CheckedFieldComponent, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, DfAddonSlot, DynamicTextPipe, EventBus, FIELD_ERROR_DISPLAY, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_OPTIONS, FieldAddonSupport, FieldAddonSupportEntry, FieldErrorDisplayClaim, FieldErrors, FieldErrorsOptions, FieldErrorsWrapperBase, FieldScope, FieldSignalContext, FieldStateContext, FieldStateInfo, FieldTypeDefinition, FormFieldStateMap, GROUP_CONTEXT, HttpResourceRequest, INITIALIZATION_TIMEOUT_MS, MapperFn, NonFieldLogicConfig, NonFieldLogicContext, NonFieldLogicType, PresetCollaborators, ReadonlyFieldTree, ResolvedError, RootFormRegistryService, ValueFieldComponent, ValueHandlingMode, WrapperFieldInputs, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, baseFieldMapper, buildBaseInputs, containerFieldMapper, createResolvedErrorsSignal, dynamicTextToObservable, getArrayLength, groupFieldMapper, injectAddonTypeRegistry, injectFieldErrors, injectFieldSignalContext, injectFieldsSupportingAddons, interpolateParams, isCheckedField, isEqual, isValueField, pageFieldMapper, provideFieldErrorDisplay, resolveDynamicValue, resolveNonFieldDisabled, resolveNonFieldHidden, resolveTokens, rowFieldMapper, runPresetAction, shouldShowErrors, textFieldMapper, toReadonlyFieldTree, withPreviousValue, writeToFieldValue } from '@ng-forge/dynamic-forms/internal';
5
- import * as i0 from '@angular/core';
6
- import { Signal, ElementRef, InjectionToken } from '@angular/core';
7
- import { FieldTree } from '@angular/forms/signals';
8
- export { CreateNgForgeActionFixtureOptions, CreateNgForgeFieldFixtureOptions, NgForgeActionFixture, NgForgeFieldFixture, createNgForgeActionFixture, createNgForgeFieldFixture, provideTestValidationMessages } from '@ng-forge/dynamic-forms/testing';
9
-
1
+ import { ArrayItemContext, BUILT_IN_FIELDS, BaseAddon, DynamicValue, FieldWithValidation, FieldWrapper, FormEvent, FormEventConstructor, FormSubmitEvent, InferWrapperRegistry, NextPageEvent, PreviousPageEvent, WrapperRegistration, WrapperTypeDefinition, WrappersBundle, createWrappers, isWrappersBundle, wrapperProps } from "@ng-forge/dynamic-forms";
2
+ import { ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, AddonActionContext, AddonActionHandler, AddonActionHandler as AddonActionHandler$1, AddonShapeValidator, AddonTypeDefinition, AddonTypeSchema, AnyAddon, ArrayAllowedChildren, ArrayContext, ArrayFieldTree, BaseCheckedField, BaseValueField, CheckedFieldComponent, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, DfAddonSlot, DynamicText, DynamicTextPipe, EventBus, FIELD_ERROR_DISPLAY, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_OPTIONS, FieldAddonSupport, FieldAddonSupportEntry, FieldDef, FieldErrorDisplayClaim, FieldErrors, FieldErrorsOptions, FieldErrorsWrapperBase, FieldMeta, FieldOption, FieldScope, FieldSignalContext, FieldStateContext, FieldStateInfo, FieldTypeDefinition, FormFieldStateMap, GROUP_CONTEXT, HttpResourceRequest, INITIALIZATION_TIMEOUT_MS, LogicConfig, MapperFn, NonFieldLogicConfig, NonFieldLogicConfig as NonFieldLogicConfig$1, NonFieldLogicContext, NonFieldLogicType, PresetCollaborators, ReadonlyFieldTree, ResolvedError, ResolvedError as ResolvedError$1, RootFormRegistryService, StateLogicConfig, ValidationMessages, ValueFieldComponent, ValueHandlingMode, WrapperFieldInputs, WrapperFieldInputs as WrapperFieldInputs$1, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, baseFieldMapper, buildBaseInputs, containerFieldMapper, createResolvedErrorsSignal, dynamicTextToObservable, getArrayLength, groupFieldMapper, injectAddonTypeRegistry, injectFieldErrors, injectFieldSignalContext, injectFieldsSupportingAddons, interpolateParams, isCheckedField, isEqual, isValueField, pageFieldMapper, provideFieldErrorDisplay, resolveDynamicValue, resolveNonFieldDisabled, resolveNonFieldHidden, resolveTokens, rowFieldMapper, runPresetAction, shouldShowErrors, textFieldMapper, toReadonlyFieldTree, withPreviousValue, writeToFieldValue } from "@ng-forge/dynamic-forms/internal";
3
+ import * as i0 from "@angular/core";
4
+ import { ElementRef, InjectionToken, Signal } from "@angular/core";
5
+ import { FieldTree } from "@angular/forms/signals";
6
+ import { CreateNgForgeActionFixtureOptions, CreateNgForgeFieldFixtureOptions, NgForgeActionFixture, NgForgeFieldFixture, createNgForgeActionFixture, createNgForgeFieldFixture, provideTestValidationMessages } from "@ng-forge/dynamic-forms/testing";
10
7
  /**
11
8
  * Event arguments that can contain static values or tokens to be resolved at runtime.
12
9
  * Tokens supported: $key, $index, $arrayKey, $template, formValue
@@ -14,38 +11,35 @@ export { CreateNgForgeActionFixtureOptions, CreateNgForgeFieldFixtureOptions, Ng
14
11
  type EventArgs = readonly (string | number | boolean | null | undefined)[];
15
12
  /** Base interface for button fields. */
16
13
  interface ButtonField<TProps, TEvent extends FormEvent> extends FieldDef<TProps> {
17
- type: 'button';
18
- event: FormEventConstructor<TEvent>;
19
- /**
20
- * Optional arguments to pass to the event constructor.
21
- * Can contain special tokens that will be resolved at runtime:
22
- * - $key: The current field key
23
- * - $index: The array index (if inside an array field)
24
- * - $arrayKey: The parent array field key (if inside an array field)
25
- * - $template: The template for array item creation (for array add buttons)
26
- * - formValue: Access to the current form value for indexing
27
- */
28
- eventArgs?: EventArgs;
29
- /** Logic rules for dynamic disabled state (overrides form-level defaults) */
30
- logic?: StateLogicConfig[];
31
- }
32
-
14
+ type: 'button';
15
+ event: FormEventConstructor<TEvent>;
16
+ /**
17
+ * Optional arguments to pass to the event constructor.
18
+ * Can contain special tokens that will be resolved at runtime:
19
+ * - $key: The current field key
20
+ * - $index: The array index (if inside an array field)
21
+ * - $arrayKey: The parent array field key (if inside an array field)
22
+ * - $template: The template for array item creation (for array add buttons)
23
+ * - formValue: Access to the current form value for indexing
24
+ */
25
+ eventArgs?: EventArgs;
26
+ /** Logic rules for dynamic disabled state (overrides form-level defaults) */
27
+ logic?: StateLogicConfig[];
28
+ }
33
29
  interface CheckboxField<TProps, TNullable extends boolean = boolean> extends BaseCheckedField<TProps, FieldMeta, TNullable> {
34
- type: 'checkbox';
30
+ type: 'checkbox';
35
31
  }
36
-
37
32
  /**
38
33
  * Base props for datepicker fields. Intentionally empty — adapter libraries
39
34
  * extend this with adapter-specific options (startView, appearance, hint, etc.).
40
35
  */
41
36
  type DatepickerProps = object;
42
37
  interface DatepickerField<TProps, TNullable extends boolean = boolean> extends BaseValueField<TProps, Date | string, FieldMeta, TNullable> {
43
- type: 'datepicker';
44
- minDate?: Date | string | null;
45
- maxDate?: Date | string | null;
46
- startAt?: Date | null;
38
+ type: 'datepicker';
39
+ minDate?: Date | string | null;
40
+ maxDate?: Date | string | null;
41
+ startAt?: Date | null;
47
42
  }
48
-
49
43
  /**
50
44
  * Autocomplete values for HTML input elements.
51
45
  * Based on the WHATWG HTML specification for autofill.
@@ -73,26 +67,25 @@ type EnterKeyHint = 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | '
73
67
  type Autocapitalize = 'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters';
74
68
  /** Meta attributes specific to HTML input elements. */
75
69
  interface InputMeta extends FieldMeta {
76
- /** Hint for form autofill behavior. */
77
- autocomplete?: AutocompleteValue;
78
- /** Hint for virtual keyboard type on mobile devices. */
79
- inputmode?: InputMode;
80
- /** Hint for the enter key label on virtual keyboards. */
81
- enterkeyhint?: EnterKeyHint;
82
- /** Whether to enable spellchecking for the input. */
83
- spellcheck?: boolean;
84
- /** Hint for autocapitalization behavior on virtual keyboards. */
85
- autocapitalize?: Autocapitalize;
86
- /** Pattern for client-side validation (regex). */
87
- pattern?: string;
88
- /** Size hint for the input element (character count). */
89
- size?: number;
90
- /** Maximum number of characters allowed. */
91
- maxlength?: number;
92
- /** Minimum number of characters required. */
93
- minlength?: number;
94
- }
95
-
70
+ /** Hint for form autofill behavior. */
71
+ autocomplete?: AutocompleteValue;
72
+ /** Hint for virtual keyboard type on mobile devices. */
73
+ inputmode?: InputMode;
74
+ /** Hint for the enter key label on virtual keyboards. */
75
+ enterkeyhint?: EnterKeyHint;
76
+ /** Whether to enable spellchecking for the input. */
77
+ spellcheck?: boolean;
78
+ /** Hint for autocapitalization behavior on virtual keyboards. */
79
+ autocapitalize?: Autocapitalize;
80
+ /** Pattern for client-side validation (regex). */
81
+ pattern?: string;
82
+ /** Size hint for the input element (character count). */
83
+ size?: number;
84
+ /** Maximum number of characters allowed. */
85
+ maxlength?: number;
86
+ /** Minimum number of characters required. */
87
+ minlength?: number;
88
+ }
96
89
  /**
97
90
  * All valid HTML input types per MDN specification.
98
91
  *
@@ -116,12 +109,12 @@ type InferInputValue<T extends HtmlInputType> = T extends 'number' ? number : st
116
109
  * Generic parameter allows extending InputType with additional HtmlInputType values.
117
110
  */
118
111
  interface InputProps<T extends HtmlInputType = InputType> {
119
- /**
120
- * The HTML input type. Determines the value type:
121
- * - 'number': value will be number
122
- * - All other types: value will be string
123
- */
124
- type?: T;
112
+ /**
113
+ * The HTML input type. Determines the value type:
114
+ * - 'number': value will be number
115
+ * - All other types: value will be string
116
+ */
117
+ type?: T;
125
118
  }
126
119
  /**
127
120
  * Input types that produce numeric values.
@@ -136,14 +129,14 @@ type StringInputType<T extends HtmlInputType = InputType> = Exclude<T, 'number'>
136
129
  * Props is REQUIRED and must include type: 'number'.
137
130
  */
138
131
  interface NumberInputField<TProps extends {
139
- type?: string;
132
+ type?: string;
140
133
  } = InputProps, TNullable extends boolean = boolean> extends BaseValueField<TProps & {
141
- type: 'number';
134
+ type: 'number';
142
135
  }, number, InputMeta, TNullable> {
143
- type: 'input';
144
- props: TProps & {
145
- type: 'number';
146
- };
136
+ type: 'input';
137
+ props: TProps & {
138
+ type: 'number';
139
+ };
147
140
  }
148
141
  /**
149
142
  * String input field with strict string value type.
@@ -151,14 +144,14 @@ interface NumberInputField<TProps extends {
151
144
  * Props type cannot be 'number'.
152
145
  */
153
146
  interface StringInputField<TProps extends {
154
- type?: string;
147
+ type?: string;
155
148
  } = InputProps, TNullable extends boolean = boolean> extends BaseValueField<TProps & {
156
- type?: Exclude<TProps['type'], 'number'>;
149
+ type?: Exclude<TProps['type'], 'number'>;
157
150
  }, string, InputMeta, TNullable> {
158
- type: 'input';
159
- props?: TProps & {
160
- type?: Exclude<TProps['type'], 'number'>;
161
- };
151
+ type: 'input';
152
+ props?: TProps & {
153
+ type?: Exclude<TProps['type'], 'number'>;
154
+ };
162
155
  }
163
156
  /**
164
157
  * Builds discriminated union where props.type determines value type.
@@ -166,47 +159,42 @@ interface StringInputField<TProps extends {
166
159
  * - If props.type is undefined/text/email/etc, only StringInputField matches (value: string)
167
160
  */
168
161
  type BuildInputFieldUnion<TProps extends {
169
- type?: string;
162
+ type?: string;
170
163
  }, TNullable extends boolean = boolean> = NumberInputField<TProps, TNullable> | StringInputField<TProps, TNullable>;
171
164
  /**
172
165
  * Input field with automatic type-safe value inference.
173
166
  * TypeScript automatically infers the correct value type based on props.type.
174
167
  */
175
168
  type InputField<TProps extends {
176
- type?: string;
169
+ type?: string;
177
170
  } = InputProps, TNullable extends boolean = boolean> = BuildInputFieldUnion<TProps, TNullable>;
178
-
179
171
  /**
180
172
  * Multi-checkbox field for selecting multiple values from a list of options.
181
173
  * The value is an array of selected option values.
182
174
  */
183
175
  interface MultiCheckboxField<TValue, TProps = object, TNullable extends boolean = boolean> extends BaseValueField<TProps, TValue[], FieldMeta, TNullable> {
184
- type: 'multi-checkbox';
185
- readonly options: readonly FieldOption<TValue>[];
176
+ type: 'multi-checkbox';
177
+ readonly options: readonly FieldOption<TValue>[];
186
178
  }
187
-
188
179
  interface RadioField<T, TProps, TNullable extends boolean = boolean> extends BaseValueField<TProps, T, FieldMeta, TNullable> {
189
- type: 'radio';
190
- readonly options: readonly FieldOption<T>[];
180
+ type: 'radio';
181
+ readonly options: readonly FieldOption<T>[];
191
182
  }
192
-
193
183
  /**
194
184
  * Base props for select fields. Intentionally empty — adapter libraries
195
185
  * extend this with adapter-specific options (styleClass, size, appearance, etc.).
196
186
  */
197
187
  type SelectProps = object;
198
188
  interface SelectField<T, TProps = SelectProps, TNullable extends boolean = boolean> extends BaseValueField<TProps, T, FieldMeta, TNullable> {
199
- type: 'select';
200
- readonly options: readonly FieldOption<T>[];
189
+ type: 'select';
190
+ readonly options: readonly FieldOption<T>[];
201
191
  }
202
-
203
192
  interface SliderField<TProps, TNullable extends boolean = boolean> extends BaseValueField<TProps, number, FieldMeta, TNullable> {
204
- type: 'slider';
205
- minValue?: number;
206
- maxValue?: number;
207
- step?: number;
193
+ type: 'slider';
194
+ minValue?: number;
195
+ maxValue?: number;
196
+ step?: number;
208
197
  }
209
-
210
198
  /**
211
199
  * Text wrapping behavior for textarea elements.
212
200
  *
@@ -215,51 +203,48 @@ interface SliderField<TProps, TNullable extends boolean = boolean> extends BaseV
215
203
  type TextareaWrap = 'hard' | 'soft' | 'off';
216
204
  /** Meta attributes specific to HTML textarea elements. */
217
205
  interface TextareaMeta extends FieldMeta {
218
- /**
219
- * How text should wrap when submitted.
220
- * - 'hard': Line breaks are inserted to wrap text at cols width
221
- * - 'soft': Text is wrapped for display but not in submitted value
222
- * - 'off': No wrapping, horizontal scrolling if needed
223
- */
224
- wrap?: TextareaWrap;
225
- /** Whether to enable spellchecking for the textarea. */
226
- spellcheck?: boolean;
227
- /** Hint for form autofill behavior. */
228
- autocomplete?: AutocompleteValue;
229
- /** Hint for autocapitalization behavior on virtual keyboards. */
230
- autocapitalize?: Autocapitalize;
231
- /** Hint for the enter key label on virtual keyboards. */
232
- enterkeyhint?: EnterKeyHint;
233
- /** Maximum number of characters allowed. */
234
- maxlength?: number;
235
- /** Minimum number of characters required. */
236
- minlength?: number;
237
- }
238
-
206
+ /**
207
+ * How text should wrap when submitted.
208
+ * - 'hard': Line breaks are inserted to wrap text at cols width
209
+ * - 'soft': Text is wrapped for display but not in submitted value
210
+ * - 'off': No wrapping, horizontal scrolling if needed
211
+ */
212
+ wrap?: TextareaWrap;
213
+ /** Whether to enable spellchecking for the textarea. */
214
+ spellcheck?: boolean;
215
+ /** Hint for form autofill behavior. */
216
+ autocomplete?: AutocompleteValue;
217
+ /** Hint for autocapitalization behavior on virtual keyboards. */
218
+ autocapitalize?: Autocapitalize;
219
+ /** Hint for the enter key label on virtual keyboards. */
220
+ enterkeyhint?: EnterKeyHint;
221
+ /** Maximum number of characters allowed. */
222
+ maxlength?: number;
223
+ /** Minimum number of characters required. */
224
+ minlength?: number;
225
+ }
239
226
  interface TextareaProps {
240
- rows?: number;
241
- cols?: number | undefined;
227
+ rows?: number;
228
+ cols?: number | undefined;
242
229
  }
243
230
  interface TextareaField<TProps = TextareaProps, TNullable extends boolean = boolean> extends BaseValueField<TProps, string, TextareaMeta, TNullable> {
244
- type: 'textarea';
245
- maxLength?: number | undefined;
231
+ type: 'textarea';
232
+ maxLength?: number | undefined;
246
233
  }
247
-
248
234
  interface ToggleField<TProps, TNullable extends boolean = boolean> extends BaseCheckedField<TProps, FieldMeta, TNullable> {
249
- type: 'toggle';
235
+ type: 'toggle';
250
236
  }
251
-
252
237
  /**
253
238
  * Context for value field mapping, containing the injected context reference.
254
239
  * Used by specialized mappers to avoid duplicate injection.
255
240
  */
256
241
  interface ValueFieldContext {
257
- /**
258
- * Gets the field tree for a given key from the form context.
259
- * This is reactive for array items - the form getter is evaluated each time,
260
- * allowing the computed to re-run when the root form structure updates.
261
- */
262
- getFieldTree: (fieldKey: string) => FieldTree<unknown> | undefined;
242
+ /**
243
+ * Gets the field tree for a given key from the form context.
244
+ * This is reactive for array items - the form getter is evaluated each time,
245
+ * allowing the computed to re-run when the root form structure updates.
246
+ */
247
+ getFieldTree: (fieldKey: string) => FieldTree<unknown> | undefined;
263
248
  }
264
249
  /**
265
250
  * Creates a value field context from the injected FIELD_SIGNAL_CONTEXT.
@@ -267,7 +252,7 @@ interface ValueFieldContext {
267
252
  *
268
253
  * @returns The value field context with reactive field tree accessor
269
254
  */
270
- declare function resolveValueFieldContext(): ValueFieldContext;
255
+ export declare function resolveValueFieldContext(): ValueFieldContext;
271
256
  /**
272
257
  * Builds the base inputs for a value field.
273
258
  * This is a helper function used by valueFieldMapper and specialized mappers.
@@ -277,31 +262,28 @@ declare function resolveValueFieldContext(): ValueFieldContext;
277
262
  * @param defaultProps Default props from the form configuration (may be undefined if not configured)
278
263
  * @returns Record of input names to values
279
264
  */
280
- declare function buildValueFieldInputs<TProps, TValue = unknown>(fieldDef: BaseValueField<TProps, TValue, FieldMeta, boolean>, ctx: ValueFieldContext, defaultProps?: Record<string, unknown>): Record<string, unknown>;
265
+ export declare function buildValueFieldInputs<TProps, TValue = unknown>(fieldDef: BaseValueField<TProps, TValue, FieldMeta, boolean>, ctx: ValueFieldContext, defaultProps?: Record<string, unknown>): Record<string, unknown>;
281
266
  /**
282
267
  * Maps a value field definition to component inputs.
283
268
  *
284
269
  * @param fieldDef The value field definition
285
270
  * @returns Signal containing Record of input names to values for ngComponentOutlet
286
271
  */
287
- declare function valueFieldMapper<TProps = unknown, TValue = unknown>(fieldDef: BaseValueField<TProps, TValue, FieldMeta, boolean>): Signal<Record<string, unknown>>;
288
-
272
+ export declare function valueFieldMapper<TProps = unknown, TValue = unknown>(fieldDef: BaseValueField<TProps, TValue, FieldMeta, boolean>): Signal<Record<string, unknown>>;
289
273
  /**
290
274
  * Maps a checkbox/toggle field definition to component inputs.
291
275
  *
292
276
  * @param fieldDef The checkbox field definition
293
277
  * @returns Signal containing Record of input names to values for ngComponentOutlet
294
278
  */
295
- declare function checkboxFieldMapper(fieldDef: BaseCheckedField<unknown, FieldMeta, boolean>): Signal<Record<string, unknown>>;
296
-
279
+ export declare function checkboxFieldMapper(fieldDef: BaseCheckedField<unknown, FieldMeta, boolean>): Signal<Record<string, unknown>>;
297
280
  /**
298
281
  * Maps a datepicker field to component inputs.
299
282
  *
300
283
  * @param fieldDef The datepicker field definition
301
284
  * @returns Signal containing Record of input names to values for ngComponentOutlet
302
285
  */
303
- declare function datepickerFieldMapper<TProps>(fieldDef: DatepickerField<TProps>): Signal<Record<string, unknown>>;
304
-
286
+ export declare function datepickerFieldMapper<TProps>(fieldDef: DatepickerField<TProps>): Signal<Record<string, unknown>>;
305
287
  /** Field types that have an options property. */
306
288
  type FieldWithOptions<T = unknown, TProps = unknown> = SelectField<T, TProps> | RadioField<T, TProps> | MultiCheckboxField<T, TProps>;
307
289
  /**
@@ -310,51 +292,49 @@ type FieldWithOptions<T = unknown, TProps = unknown> = SelectField<T, TProps> |
310
292
  * @param fieldDef The field definition with options
311
293
  * @returns Signal containing Record of input names to values for ngComponentOutlet
312
294
  */
313
- declare function optionsFieldMapper<T, TProps>(fieldDef: FieldWithOptions<T, TProps>): Signal<Record<string, unknown>>;
314
-
295
+ export declare function optionsFieldMapper<T, TProps>(fieldDef: FieldWithOptions<T, TProps>): Signal<Record<string, unknown>>;
315
296
  /**
316
297
  * Maps a button field to component inputs.
317
298
  *
318
299
  * @param fieldDef The button field definition
319
300
  * @returns Signal containing Record of input names to values for ngComponentOutlet
320
301
  */
321
- declare function buttonFieldMapper<TProps, TEvent extends FormEvent>(fieldDef: ButtonField<TProps, TEvent>): Signal<Record<string, unknown>>;
322
-
302
+ export declare function buttonFieldMapper<TProps, TEvent extends FormEvent>(fieldDef: ButtonField<TProps, TEvent>): Signal<Record<string, unknown>>;
323
303
  /**
324
304
  * Context for array button mapping, containing resolved array information.
325
305
  * Used by array button mappers to build event context.
326
306
  */
327
307
  interface ArrayButtonContext {
328
- /** The target array key (from explicit arrayKey or ARRAY_CONTEXT) */
329
- targetArrayKey: string | undefined;
330
- /** Computed signal that returns the current array index (-1 if not inside array) */
331
- indexSignal: Signal<number>;
332
- /**
333
- * Current form value for token resolution. Implemented as a lazy getter so it
334
- * is read at event-dispatch time, not when the mapper builds its context —
335
- * reading it eagerly inside the mapper's computed would resnapshot a stale
336
- * value and subscribe every array button to the whole form entity per
337
- * keystroke. Keep it a getter on any reimplementation.
338
- */
339
- formValue: Record<string, unknown>;
340
- /** Whether this button is inside an array context */
341
- isInsideArray: boolean;
308
+ /** The target array key (from explicit arrayKey or ARRAY_CONTEXT) */
309
+ targetArrayKey: string | undefined;
310
+ /** Computed signal that returns the current array index (-1 if not inside array) */
311
+ indexSignal: Signal<number>;
312
+ /**
313
+ * Current form value for token resolution. Implemented as a lazy getter so it
314
+ * is read at event-dispatch time, not when the mapper builds its context —
315
+ * reading it eagerly inside the mapper's computed would resnapshot a stale
316
+ * value and subscribe every array button to the whole form entity per
317
+ * keystroke. Keep it a getter on any reimplementation.
318
+ */
319
+ formValue: Record<string, unknown>;
320
+ /** Whether this button is inside an array context */
321
+ isInsideArray: boolean;
342
322
  }
343
323
  /** Event context passed to button components for array operations. */
344
324
  interface ArrayButtonEventContext {
345
- /** The button field key */
346
- key: string;
347
- /** The current array index (-1 if outside array) */
348
- index: number;
349
- /** The target array key */
350
- arrayKey: string;
351
- /** Form value for token resolution — a lazy getter, resolved at dispatch time. See {@link ArrayButtonContext.formValue}. */
352
- formValue: Record<string, unknown>;
353
- /**
354
- * Optional template for add operations.
355
- * Can be a single field (primitive item) or array of fields (object item).
356
- */
357
- template?: ArrayAllowedChildren | readonly ArrayAllowedChildren[];
325
+ /** The button field key */
326
+ key: string;
327
+ /** The current array index (-1 if outside array) */
328
+ index: number;
329
+ /** The target array key */
330
+ arrayKey: string;
331
+ /** Form value for token resolution — a lazy getter, resolved at dispatch time. See {@link ArrayButtonContext.formValue}. */
332
+ formValue: Record<string, unknown>;
333
+ /**
334
+ * Optional template for add operations.
335
+ * Can be a single field (primitive item) or array of fields (object item).
336
+ */
337
+ template?: ArrayAllowedChildren | readonly ArrayAllowedChildren[];
358
338
  }
359
339
  /**
360
340
  * Resolves array button context for button mappers.
@@ -364,7 +344,7 @@ interface ArrayButtonEventContext {
364
344
  * @param explicitArrayKey Optional explicit arrayKey from field definition
365
345
  * @returns The array button context with reactive index signal
366
346
  */
367
- declare function resolveArrayButtonContext(fieldKey: string, buttonType: string, explicitArrayKey?: string): ArrayButtonContext;
347
+ export declare function resolveArrayButtonContext(fieldKey: string, buttonType: string, explicitArrayKey?: string): ArrayButtonContext;
368
348
  /**
369
349
  * Builds the event context passed to the button component.
370
350
  *
@@ -373,7 +353,7 @@ declare function resolveArrayButtonContext(fieldKey: string, buttonType: string,
373
353
  * @param template Optional template for add operations (single field or array of fields)
374
354
  * @returns The event context for the button component
375
355
  */
376
- declare function buildArrayButtonEventContext(fieldKey: string, ctx: ArrayButtonContext, template?: ArrayAllowedChildren | readonly ArrayAllowedChildren[]): ArrayButtonEventContext;
356
+ export declare function buildArrayButtonEventContext(fieldKey: string, ctx: ArrayButtonContext, template?: ArrayAllowedChildren | readonly ArrayAllowedChildren[]): ArrayButtonEventContext;
377
357
  /**
378
358
  * Event argument type - supports static values and tokens.
379
359
  * Tokens: $key, $index, $arrayKey, $template, formValue
@@ -386,25 +366,24 @@ type EventArg = string | number | boolean | null | undefined;
386
366
  * @param defaultEventArgs The default eventArgs to use if not specified
387
367
  * @returns The resolved eventArgs array
388
368
  */
389
- declare function resolveArrayButtonEventArgs(fieldEventArgs: readonly EventArg[] | undefined, defaultEventArgs?: readonly EventArg[]): readonly EventArg[];
390
-
369
+ export declare function resolveArrayButtonEventArgs(fieldEventArgs: readonly EventArg[] | undefined, defaultEventArgs?: readonly EventArg[]): readonly EventArg[];
391
370
  /**
392
371
  * Field definition with optional hidden/disabled and logic properties.
393
372
  * This is the minimal interface needed by applyNonFieldLogic.
394
373
  */
395
374
  interface FieldDefWithLogic {
396
- key?: string;
397
- hidden?: boolean;
398
- disabled?: boolean;
399
- logic?: NonFieldLogicConfig[] | LogicConfig[];
375
+ key?: string;
376
+ hidden?: boolean;
377
+ disabled?: boolean;
378
+ logic?: NonFieldLogicConfig$1[] | LogicConfig[];
400
379
  }
401
380
  /**
402
381
  * Result of applying non-field logic to a field.
403
382
  * Only includes properties that have values to apply.
404
383
  */
405
384
  interface NonFieldLogicResult {
406
- hidden?: boolean;
407
- disabled?: boolean;
385
+ hidden?: boolean;
386
+ disabled?: boolean;
408
387
  }
409
388
  /**
410
389
  * Injects everything a non-form-bound button mapper needs to evaluate hidden/disabled logic,
@@ -412,113 +391,110 @@ interface NonFieldLogicResult {
412
391
  * generic `{ type: 'button', logic: [...] }` evaluates its conditions with `externalData` and
413
392
  * custom functions in scope, matching the built-in button field types.
414
393
  */
415
- declare function injectNonFieldLogicResolver(fieldDef: FieldDefWithLogic): () => NonFieldLogicResult;
416
-
394
+ export declare function injectNonFieldLogicResolver(fieldDef: FieldDefWithLogic): () => NonFieldLogicResult;
417
395
  /**
418
396
  * Base interface for array add button fields (append, prepend, insert).
419
397
  * Template is required to define the structure for new items.
420
398
  */
421
399
  interface BaseArrayAddButtonField<TProps = unknown> {
422
- key: string;
423
- type: string;
424
- label?: string;
425
- disabled?: boolean;
426
- hidden?: boolean;
427
- className?: string;
428
- props?: TProps;
429
- /** Target array key (required when outside array, optional inside) */
430
- arrayKey?: string;
431
- /**
432
- * Template defining the field structure for new items. REQUIRED.
433
- * - Single field (ArrayAllowedChildren): Creates a primitive item (field's value is extracted directly)
434
- * - Array of fields (ArrayAllowedChildren[]): Creates an object item (fields merged into object)
435
- */
436
- template: ArrayAllowedChildren | readonly ArrayAllowedChildren[];
437
- /** Optional custom eventArgs */
438
- eventArgs?: readonly EventArg[];
439
- /** Logic rules for dynamic hidden/disabled state (only hidden and disabled are supported) */
440
- logic?: NonFieldLogicConfig[];
400
+ key: string;
401
+ type: string;
402
+ label?: string;
403
+ disabled?: boolean;
404
+ hidden?: boolean;
405
+ className?: string;
406
+ props?: TProps;
407
+ /** Target array key (required when outside array, optional inside) */
408
+ arrayKey?: string;
409
+ /**
410
+ * Template defining the field structure for new items. REQUIRED.
411
+ * - Single field (ArrayAllowedChildren): Creates a primitive item (field's value is extracted directly)
412
+ * - Array of fields (ArrayAllowedChildren[]): Creates an object item (fields merged into object)
413
+ */
414
+ template: ArrayAllowedChildren | readonly ArrayAllowedChildren[];
415
+ /** Optional custom eventArgs */
416
+ eventArgs?: readonly EventArg[];
417
+ /** Logic rules for dynamic hidden/disabled state (only hidden and disabled are supported) */
418
+ logic?: NonFieldLogicConfig$1[];
441
419
  }
442
420
  /**
443
421
  * Base interface for array remove button fields (remove, pop, shift).
444
422
  * No template needed - removes existing items.
445
423
  */
446
424
  interface BaseArrayRemoveButtonField<TProps = unknown> {
447
- key: string;
448
- type: string;
449
- label?: string;
450
- disabled?: boolean;
451
- hidden?: boolean;
452
- className?: string;
453
- props?: TProps;
454
- /** Target array key (required when outside array, optional inside) */
455
- arrayKey?: string;
456
- /** Optional custom eventArgs */
457
- eventArgs?: readonly EventArg[];
458
- /** Logic rules for dynamic hidden/disabled state (only hidden and disabled are supported) */
459
- logic?: NonFieldLogicConfig[];
425
+ key: string;
426
+ type: string;
427
+ label?: string;
428
+ disabled?: boolean;
429
+ hidden?: boolean;
430
+ className?: string;
431
+ props?: TProps;
432
+ /** Target array key (required when outside array, optional inside) */
433
+ arrayKey?: string;
434
+ /** Optional custom eventArgs */
435
+ eventArgs?: readonly EventArg[];
436
+ /** Logic rules for dynamic hidden/disabled state (only hidden and disabled are supported) */
437
+ logic?: NonFieldLogicConfig$1[];
460
438
  }
461
439
  /**
462
440
  * Interface for insert array item button fields.
463
441
  * Extends add button with required index.
464
442
  */
465
443
  interface BaseInsertArrayItemButtonField<TProps = unknown> extends BaseArrayAddButtonField<TProps> {
466
- /** The index at which to insert the new item */
467
- index: number;
444
+ /** The index at which to insert the new item */
445
+ index: number;
468
446
  }
469
447
  /**
470
448
  * Mapper for add array item button — appends new item to end of array.
471
449
  * Template is REQUIRED to define the field structure for new items.
472
450
  */
473
- declare function addArrayItemButtonMapper<TProps>(fieldDef: BaseArrayAddButtonField<TProps>): Signal<Record<string, unknown>>;
451
+ export declare function addArrayItemButtonMapper<TProps>(fieldDef: BaseArrayAddButtonField<TProps>): Signal<Record<string, unknown>>;
474
452
  /**
475
453
  * Mapper for prepend array item button — inserts new item at beginning of array.
476
454
  * Template is REQUIRED to define the field structure for new items.
477
455
  */
478
- declare function prependArrayItemButtonMapper<TProps>(fieldDef: BaseArrayAddButtonField<TProps>): Signal<Record<string, unknown>>;
456
+ export declare function prependArrayItemButtonMapper<TProps>(fieldDef: BaseArrayAddButtonField<TProps>): Signal<Record<string, unknown>>;
479
457
  /**
480
458
  * Mapper for insert array item button — inserts new item at specific index.
481
459
  * Template and index are REQUIRED.
482
460
  */
483
- declare function insertArrayItemButtonMapper<TProps>(fieldDef: BaseInsertArrayItemButtonField<TProps>): Signal<Record<string, unknown>>;
461
+ export declare function insertArrayItemButtonMapper<TProps>(fieldDef: BaseInsertArrayItemButtonField<TProps>): Signal<Record<string, unknown>>;
484
462
  /**
485
463
  * Mapper for remove array item button.
486
464
  * Inside array: RemoveAtIndexEvent. Outside array: PopArrayItemEvent.
487
465
  */
488
- declare function removeArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
466
+ export declare function removeArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
489
467
  /** Mapper for pop array item button — removes the last item from array. */
490
- declare function popArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
468
+ export declare function popArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
491
469
  /** Mapper for shift array item button — removes the first item from array. */
492
- declare function shiftArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
493
-
470
+ export declare function shiftArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
494
471
  /** Base interface for navigation button fields (submit, next, previous). */
495
472
  type BaseNavigationButtonField<TProps = unknown> = ButtonField<TProps, FormSubmitEvent | NextPageEvent | PreviousPageEvent> & {
496
- type: string;
497
- /** Logic rules for dynamic disabled state */
498
- logic?: FieldWithValidation['logic'];
473
+ type: string;
474
+ /** Logic rules for dynamic disabled state */
475
+ logic?: FieldWithValidation['logic'];
499
476
  };
500
477
  /**
501
478
  * Mapper for submit button — configures native form submission via type="submit".
502
479
  * Triggers native form submission rather than dispatching events directly.
503
480
  */
504
- declare function submitButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
481
+ export declare function submitButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
505
482
  /** Mapper for next page button — preconfigures NextPageEvent. */
506
- declare function nextButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
483
+ export declare function nextButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
507
484
  /** Mapper for previous page button — preconfigures PreviousPageEvent. */
508
- declare function previousButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
509
-
485
+ export declare function previousButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
510
486
  /** Configuration options for setupMetaTracking. */
511
487
  interface MetaTrackingOptions {
512
- /**
513
- * CSS selector for target elements within the host.
514
- * If not provided, meta attributes are applied directly to the host element.
515
- */
516
- selector?: string;
517
- /**
518
- * Additional signals to track that should trigger re-application of meta.
519
- * Useful for components where DOM elements are dynamically created (e.g., radio options).
520
- */
521
- dependents?: Signal<unknown>[];
488
+ /**
489
+ * CSS selector for target elements within the host.
490
+ * If not provided, meta attributes are applied directly to the host element.
491
+ */
492
+ selector?: string;
493
+ /**
494
+ * Additional signals to track that should trigger re-application of meta.
495
+ * Useful for components where DOM elements are dynamically created (e.g., radio options).
496
+ */
497
+ dependents?: Signal<unknown>[];
522
498
  }
523
499
  /**
524
500
  * Sets up automatic meta attribute tracking and application for wrapped components.
@@ -527,8 +503,7 @@ interface MetaTrackingOptions {
527
503
  * @param meta - Signal containing meta attributes to apply
528
504
  * @param options - Configuration options
529
505
  */
530
- declare function setupMetaTracking(elementRef: ElementRef<HTMLElement>, meta: Signal<FieldMeta | undefined>, options?: MetaTrackingOptions): void;
531
-
506
+ export declare function setupMetaTracking(elementRef: ElementRef<HTMLElement>, meta: Signal<FieldMeta | undefined>, options?: MetaTrackingOptions): void;
532
507
  /**
533
508
  * Creates a signal that computes the aria-describedby value based on errors and hint state.
534
509
  * Errors take precedence over hints - when errors are displayed, the hint is hidden.
@@ -540,23 +515,32 @@ declare function setupMetaTracking(elementRef: ElementRef<HTMLElement>, meta: Si
540
515
  * @param hasHint Function that returns true if a hint is configured
541
516
  * @returns Signal containing the aria-describedby value or null
542
517
  */
543
- declare function createAriaDescribedBySignal(errorsToDisplay: Signal<ResolvedError[]>, errorId: Signal<string>, hintId: Signal<string>, hasHint: () => boolean): Signal<string | null>;
544
-
518
+ export declare function createAriaDescribedBySignal(errorsToDisplay: Signal<ResolvedError$1[]>, errorId: Signal<string>, hintId: Signal<string>, hasHint: () => boolean): Signal<string | null>;
545
519
  /**
546
520
  * Base directive composed into every ng-forge component via `hostDirectives`.
547
521
  * Owns the universal identity inputs (`key`, `className`) and the host
548
522
  * bindings that every field shape — value-bearing, action, future container —
549
523
  * shares: `[id]`, `[attr.data-testid]`, `[class]`.
550
524
  */
551
- declare class NgForgeFieldShell {
552
- readonly key: i0.InputSignal<string>;
553
- readonly className: i0.InputSignal<string>;
554
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeFieldShell, never>;
555
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeFieldShell, never, never, { "key": { "alias": "key"; "required": true; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
525
+ export declare class NgForgeFieldShell {
526
+ readonly key: import("@angular/core").InputSignal<string>;
527
+ readonly className: import("@angular/core").InputSignal<string>;
528
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeFieldShell, never>;
529
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeFieldShell, never, never, {
530
+ "key": {
531
+ "alias": "key";
532
+ "required": true;
533
+ "isSignal": true;
534
+ };
535
+ "className": {
536
+ "alias": "className";
537
+ "required": false;
538
+ "isSignal": true;
539
+ };
540
+ }, {}, never, never, true, never>;
556
541
  }
557
542
  /** Input names forwarded onto `NgForgeFieldShell` via `hostDirectives`. */
558
- declare const NG_FORGE_FIELD_SHELL_INPUTS: readonly ["key", "className"];
559
-
543
+ export declare const NG_FORGE_FIELD_SHELL_INPUTS: readonly ["key", "className"];
560
544
  /**
561
545
  * Value-bearing add-on directive — composed alongside `NgForgeFieldShell` via
562
546
  * the `NG_FORGE_FIELD` preset. Owns the value/validation/aria plumbing every
@@ -575,37 +559,73 @@ declare const NG_FORGE_FIELD_SHELL_INPUTS: readonly ["key", "className"];
575
559
  * Selectorless — usage is exclusively via `hostDirectives`. Prefer the
576
560
  * `NG_FORGE_FIELD` preset over composing this directive manually.
577
561
  */
578
- declare class NgForgeField {
579
- private readonly shell;
580
- /** Shell-owned key, re-exported as plain `Signal<string>` so it doesn't get flagged by the host-directive input-lockstep assertion. */
581
- readonly key: Signal<string>;
582
- /** Shell-owned className, re-exported as plain `Signal<string>` for the same reason. */
583
- readonly className: Signal<string>;
584
- readonly field: i0.InputSignal<FieldTree<unknown>>;
585
- readonly label: i0.InputSignal<DynamicText | undefined>;
586
- readonly placeholder: i0.InputSignal<DynamicText | undefined>;
587
- readonly tabIndex: i0.InputSignal<number | undefined>;
588
- readonly props: i0.InputSignal<unknown>;
589
- readonly meta: i0.InputSignal<FieldMeta | undefined>;
590
- readonly validationMessages: i0.InputSignal<ValidationMessages | undefined>;
591
- private readonly defaultValidationMessages;
592
- readonly errors: Signal<ResolvedError[]>;
593
- readonly showErrors: Signal<boolean>;
594
- /** An ancestor wrapper's claim to render errors — see `FIELD_ERROR_DISPLAY`. */
595
- private readonly errorDisplayClaim;
596
- readonly errorsToDisplay: Signal<ResolvedError[]>;
597
- readonly errorId: Signal<string>;
598
- readonly hintId: Signal<string>;
599
- readonly ariaInvalid: Signal<boolean>;
600
- readonly ariaRequired: Signal<true | null>;
601
- readonly ariaDescribedBy: Signal<string | null>;
602
- private readonly _claimed;
603
- /** @internal Marker directives + ambient sub-components call this on construction. */
604
- markClaimed(): void;
605
- private readonly logger;
606
- constructor();
607
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeField, never>;
608
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeField, never, never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "meta": { "alias": "meta"; "required": false; "isSignal": true; }; "validationMessages": { "alias": "validationMessages"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
562
+ export declare class NgForgeField {
563
+ private readonly shell;
564
+ /** Shell-owned key, re-exported as plain `Signal<string>` so it doesn't get flagged by the host-directive input-lockstep assertion. */
565
+ readonly key: Signal<string>;
566
+ /** Shell-owned className, re-exported as plain `Signal<string>` for the same reason. */
567
+ readonly className: Signal<string>;
568
+ readonly field: import("@angular/core").InputSignal<FieldTree<unknown>>;
569
+ readonly label: import("@angular/core").InputSignal<DynamicText | undefined>;
570
+ readonly placeholder: import("@angular/core").InputSignal<DynamicText | undefined>;
571
+ readonly tabIndex: import("@angular/core").InputSignal<number | undefined>;
572
+ readonly props: import("@angular/core").InputSignal<unknown>;
573
+ readonly meta: import("@angular/core").InputSignal<FieldMeta | undefined>;
574
+ readonly validationMessages: import("@angular/core").InputSignal<ValidationMessages | undefined>;
575
+ private readonly defaultValidationMessages;
576
+ readonly errors: Signal<ResolvedError$1[]>;
577
+ readonly showErrors: Signal<boolean>;
578
+ /** An ancestor wrapper's claim to render errors — see `FIELD_ERROR_DISPLAY`. */
579
+ private readonly errorDisplayClaim;
580
+ readonly errorsToDisplay: Signal<ResolvedError$1[]>;
581
+ readonly errorId: Signal<string>;
582
+ readonly hintId: Signal<string>;
583
+ readonly ariaInvalid: Signal<boolean>;
584
+ readonly ariaRequired: Signal<true | null>;
585
+ readonly ariaDescribedBy: Signal<string | null>;
586
+ private readonly _claimed;
587
+ /** @internal Marker directives + ambient sub-components call this on construction. */
588
+ markClaimed(): void;
589
+ private readonly logger;
590
+ constructor();
591
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeField, never>;
592
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeField, never, never, {
593
+ "field": {
594
+ "alias": "field";
595
+ "required": true;
596
+ "isSignal": true;
597
+ };
598
+ "label": {
599
+ "alias": "label";
600
+ "required": false;
601
+ "isSignal": true;
602
+ };
603
+ "placeholder": {
604
+ "alias": "placeholder";
605
+ "required": false;
606
+ "isSignal": true;
607
+ };
608
+ "tabIndex": {
609
+ "alias": "tabIndex";
610
+ "required": false;
611
+ "isSignal": true;
612
+ };
613
+ "props": {
614
+ "alias": "props";
615
+ "required": false;
616
+ "isSignal": true;
617
+ };
618
+ "meta": {
619
+ "alias": "meta";
620
+ "required": false;
621
+ "isSignal": true;
622
+ };
623
+ "validationMessages": {
624
+ "alias": "validationMessages";
625
+ "required": false;
626
+ "isSignal": true;
627
+ };
628
+ }, {}, never, never, true, never>;
609
629
  }
610
630
  /**
611
631
  * Inputs forwarded onto `NgForgeField` via `hostDirectives`. Excludes
@@ -613,7 +633,7 @@ declare class NgForgeField {
613
633
  * `NG_FORGE_FIELD_SHELL_INPUTS`). Most consumers shouldn't reference this
614
634
  * directly — use the `NG_FORGE_FIELD` preset.
615
635
  */
616
- declare const NG_FORGE_VALUE_FIELD_INPUTS: readonly ["field", "label", "placeholder", "tabIndex", "props", "meta", "validationMessages"];
636
+ export declare const NG_FORGE_VALUE_FIELD_INPUTS: readonly ["field", "label", "placeholder", "tabIndex", "props", "meta", "validationMessages"];
617
637
  /**
618
638
  * `NgForgeField` typed for a specific value type. The directive itself stores
619
639
  * `field` as `Signal<FieldTree<unknown>>` because Angular's `hostDirectives`
@@ -621,7 +641,7 @@ declare const NG_FORGE_VALUE_FIELD_INPUTS: readonly ["field", "label", "placehol
621
641
  * inject site so consumers don't have to declare a separate cast computed.
622
642
  */
623
643
  type TypedNgForgeField<T> = Omit<NgForgeField, 'field'> & {
624
- readonly field: Signal<FieldTree<T>>;
644
+ readonly field: Signal<FieldTree<T>>;
625
645
  };
626
646
  /**
627
647
  * Typed wrapper around `inject(NgForgeField)`. The generic narrows the
@@ -629,8 +649,7 @@ type TypedNgForgeField<T> = Omit<NgForgeField, 'field'> & {
629
649
  * type. The cast is unchecked — the runtime contract is that mappers only
630
650
  * forward a `field` whose value type matches the field-type definition.
631
651
  */
632
- declare function injectNgForgeField<T = unknown>(): TypedNgForgeField<T>;
633
-
652
+ export declare function injectNgForgeField<T = unknown>(): TypedNgForgeField<T>;
634
653
  /**
635
654
  * Action add-on directive — composed alongside `NgForgeFieldShell` via the
636
655
  * `NG_FORGE_ACTION` preset. Owns the inputs + dispatch logic every button /
@@ -638,30 +657,71 @@ declare function injectNgForgeField<T = unknown>(): TypedNgForgeField<T>;
638
657
  * `[attr.hidden]` / `[attr.aria-disabled]` host bindings driven by its own
639
658
  * inputs (no field tree).
640
659
  */
641
- declare class NgForgeAction<TEvent extends FormEvent = FormEvent> {
642
- private readonly shell;
643
- readonly key: Signal<string>;
644
- readonly className: Signal<string>;
645
- readonly label: i0.InputSignal<DynamicText>;
646
- readonly disabled: i0.InputSignal<boolean>;
647
- readonly hidden: i0.InputSignal<boolean>;
648
- readonly tabIndex: i0.InputSignal<number | undefined>;
649
- readonly event: i0.InputSignal<FormEventConstructor<TEvent> | undefined>;
650
- readonly eventArgs: i0.InputSignal<EventArgs | undefined>;
651
- readonly eventContext: i0.InputSignal<ArrayItemContext | undefined>;
652
- readonly props: i0.InputSignal<unknown>;
653
- private readonly eventBus;
654
- private readonly arrayContext;
655
- /**
656
- * Dispatch the configured event through the EventBus. Resolves `eventArgs`
657
- * tokens (`$key`, `$index`, `$arrayKey`, `formValue`, …) against the
658
- * ambient array context if present, falling back to a static `eventContext`
659
- * input or the field's own `key` otherwise. No-op when `event` is unset
660
- * (e.g. submit buttons handled by the native form lifecycle).
661
- */
662
- dispatch(): void;
663
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAction<any>, never>;
664
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAction<any>, never, never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "event": { "alias": "event"; "required": false; "isSignal": true; }; "eventArgs": { "alias": "eventArgs"; "required": false; "isSignal": true; }; "eventContext": { "alias": "eventContext"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
660
+ export declare class NgForgeAction<TEvent extends FormEvent = FormEvent> {
661
+ private readonly shell;
662
+ readonly key: Signal<string>;
663
+ readonly className: Signal<string>;
664
+ readonly label: import("@angular/core").InputSignal<DynamicText>;
665
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
666
+ readonly hidden: import("@angular/core").InputSignal<boolean>;
667
+ readonly tabIndex: import("@angular/core").InputSignal<number | undefined>;
668
+ readonly event: import("@angular/core").InputSignal<FormEventConstructor<TEvent> | undefined>;
669
+ readonly eventArgs: import("@angular/core").InputSignal<EventArgs | undefined>;
670
+ readonly eventContext: import("@angular/core").InputSignal<ArrayItemContext | undefined>;
671
+ readonly props: import("@angular/core").InputSignal<unknown>;
672
+ private readonly eventBus;
673
+ private readonly arrayContext;
674
+ /**
675
+ * Dispatch the configured event through the EventBus. Resolves `eventArgs`
676
+ * tokens (`$key`, `$index`, `$arrayKey`, `formValue`, …) against the
677
+ * ambient array context if present, falling back to a static `eventContext`
678
+ * input or the field's own `key` otherwise. No-op when `event` is unset
679
+ * (e.g. submit buttons handled by the native form lifecycle).
680
+ */
681
+ dispatch(): void;
682
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAction<any>, never>;
683
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAction<any>, never, never, {
684
+ "label": {
685
+ "alias": "label";
686
+ "required": true;
687
+ "isSignal": true;
688
+ };
689
+ "disabled": {
690
+ "alias": "disabled";
691
+ "required": false;
692
+ "isSignal": true;
693
+ };
694
+ "hidden": {
695
+ "alias": "hidden";
696
+ "required": false;
697
+ "isSignal": true;
698
+ };
699
+ "tabIndex": {
700
+ "alias": "tabIndex";
701
+ "required": false;
702
+ "isSignal": true;
703
+ };
704
+ "event": {
705
+ "alias": "event";
706
+ "required": false;
707
+ "isSignal": true;
708
+ };
709
+ "eventArgs": {
710
+ "alias": "eventArgs";
711
+ "required": false;
712
+ "isSignal": true;
713
+ };
714
+ "eventContext": {
715
+ "alias": "eventContext";
716
+ "required": false;
717
+ "isSignal": true;
718
+ };
719
+ "props": {
720
+ "alias": "props";
721
+ "required": false;
722
+ "isSignal": true;
723
+ };
724
+ }, {}, never, never, true, never>;
665
725
  }
666
726
  /**
667
727
  * Inputs forwarded onto `NgForgeAction` via `hostDirectives`. Excludes
@@ -669,51 +729,56 @@ declare class NgForgeAction<TEvent extends FormEvent = FormEvent> {
669
729
  * `NG_FORGE_FIELD_SHELL_INPUTS`). Most consumers shouldn't reference this
670
730
  * directly — use the `NG_FORGE_ACTION` preset.
671
731
  */
672
- declare const NG_FORGE_ACTION_INPUTS: readonly ["label", "disabled", "hidden", "tabIndex", "event", "eventArgs", "eventContext", "props"];
732
+ export declare const NG_FORGE_ACTION_INPUTS: readonly ["label", "disabled", "hidden", "tabIndex", "event", "eventArgs", "eventContext", "props"];
673
733
  /**
674
734
  * Typed wrapper around `inject(NgForgeAction)`. The generic narrows the
675
735
  * `event` input to a specific FormEvent subclass.
676
736
  */
677
- declare function injectNgForgeAction<TEvent extends FormEvent = FormEvent>(): NgForgeAction<TEvent>;
678
-
737
+ export declare function injectNgForgeAction<TEvent extends FormEvent = FormEvent>(): NgForgeAction<TEvent>;
679
738
  /**
680
739
  * Universal addon-array plumbing: signal-cached `hidden` resolution and
681
740
  * slot bucketing. Used internally by the `NgForgeAddons` host wrapper —
682
741
  * consumers should compose `NgForgeAddons` directly and inject the
683
742
  * directive instance via `injectNgForgeAddons<TAddon>()`.
684
743
  */
685
- declare class NgForgeAddonsBase {
686
- /** Capture the host's injector so `toSignal` (inside `resolveDynamicValue`) ties to the host's `DestroyRef`. */
687
- private readonly hostInjector;
688
- /** Addon array mapped from `FieldDef.addons` by `buildBaseInputs`. */
689
- readonly addons: i0.InputSignal<readonly AnyAddon[] | undefined>;
690
- /**
691
- * Per-addon `hidden` signal cache. Built via `explicitEffect` rather
692
- * than `computed` because `toSignal` (inside `resolveDynamicValue` for
693
- * Observable inputs) is disallowed in reactive contexts (NG0602).
694
- */
695
- private readonly _hiddenSignalCache;
696
- readonly hiddenSignalCache: Signal<ReadonlyMap<AnyAddon, Signal<boolean>>>;
697
- readonly visibleAddons: Signal<ReadonlyArray<AnyAddon>>;
698
- readonly hasAddons: Signal<boolean>;
699
- readonly prefixAddons: Signal<ReadonlyArray<AnyAddon>>;
700
- readonly suffixAddons: Signal<ReadonlyArray<AnyAddon>>;
701
- /**
702
- * Visible addons grouped by their `slot` string. Convenience view for
703
- * adapters with non-universal slots (e.g., Ionic `start` / `end`).
704
- */
705
- readonly addonsBySlot: Signal<ReadonlyMap<string, ReadonlyArray<AnyAddon>>>;
706
- /** Secondary index keyed by `hidden` value identity. Catches the common case
707
- * where a FormConfig re-emit produces structurally-different-but-content-
708
- * identical addon objects — without this, every re-emit would spawn a new
709
- * `toSignal` subscription for each addon's hidden axis. */
710
- private readonly _hiddenByValue;
711
- constructor();
712
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddonsBase, never>;
713
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddonsBase, never, never, { "addons": { "alias": "addons"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
744
+ export declare class NgForgeAddonsBase {
745
+ /** Capture the host's injector so `toSignal` (inside `resolveDynamicValue`) ties to the host's `DestroyRef`. */
746
+ private readonly hostInjector;
747
+ /** Addon array mapped from `FieldDef.addons` by `buildBaseInputs`. */
748
+ readonly addons: import("@angular/core").InputSignal<readonly AnyAddon[] | undefined>;
749
+ /**
750
+ * Per-addon `hidden` signal cache. Built via `explicitEffect` rather
751
+ * than `computed` because `toSignal` (inside `resolveDynamicValue` for
752
+ * Observable inputs) is disallowed in reactive contexts (NG0602).
753
+ */
754
+ private readonly _hiddenSignalCache;
755
+ readonly hiddenSignalCache: Signal<ReadonlyMap<AnyAddon, Signal<boolean>>>;
756
+ readonly visibleAddons: Signal<ReadonlyArray<AnyAddon>>;
757
+ readonly hasAddons: Signal<boolean>;
758
+ readonly prefixAddons: Signal<ReadonlyArray<AnyAddon>>;
759
+ readonly suffixAddons: Signal<ReadonlyArray<AnyAddon>>;
760
+ /**
761
+ * Visible addons grouped by their `slot` string. Convenience view for
762
+ * adapters with non-universal slots (e.g., Ionic `start` / `end`).
763
+ */
764
+ readonly addonsBySlot: Signal<ReadonlyMap<string, ReadonlyArray<AnyAddon>>>;
765
+ /** Secondary index keyed by `hidden` value identity. Catches the common case
766
+ * where a FormConfig re-emit produces structurally-different-but-content-
767
+ * identical addon objects — without this, every re-emit would spawn a new
768
+ * `toSignal` subscription for each addon's hidden axis. */
769
+ private readonly _hiddenByValue;
770
+ constructor();
771
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddonsBase, never>;
772
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddonsBase, never, never, {
773
+ "addons": {
774
+ "alias": "addons";
775
+ "required": false;
776
+ "isSignal": true;
777
+ };
778
+ }, {}, never, never, true, never>;
714
779
  }
715
780
  /** Forwarded onto `NgForgeAddonsBase` via the `NgForgeAddons` wrapper. */
716
- declare const NG_FORGE_ADDONS_INPUTS: readonly ["addons"];
781
+ export declare const NG_FORGE_ADDONS_INPUTS: readonly ["addons"];
717
782
  /**
718
783
  * Host wrapper for `NgForgeAddonsBase`. Consumers compose this directly:
719
784
  *
@@ -735,35 +800,40 @@ declare const NG_FORGE_ADDONS_INPUTS: readonly ["addons"];
735
800
  * The wrapper exists so `hostDirectives: [NgForgeAddons]` resolves
736
801
  * cross-package — same constraint that drives `NgForgeFieldHost`.
737
802
  */
738
- declare class NgForgeAddons {
739
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddons, never>;
740
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddons, never, never, {}, {}, never, never, true, [{ directive: typeof NgForgeAddonsBase; inputs: { "addons": "addons"; }; outputs: {}; }]>;
803
+ export declare class NgForgeAddons {
804
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddons, never>;
805
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddons, never, never, {}, {}, never, never, true, [{
806
+ directive: typeof NgForgeAddonsBase;
807
+ inputs: {
808
+ "addons": "addons";
809
+ };
810
+ outputs: {};
811
+ }]>;
741
812
  }
742
813
  /** Narrowed view of `NgForgeAddonsBase` returned by `injectNgForgeAddons<TAddon>()`. */
743
814
  type TypedNgForgeAddons<TAddon extends AnyAddon = AnyAddon> = Omit<NgForgeAddonsBase, 'addons' | 'visibleAddons' | 'prefixAddons' | 'suffixAddons'> & {
744
- readonly addons: Signal<ReadonlyArray<TAddon> | undefined>;
745
- readonly visibleAddons: Signal<ReadonlyArray<TAddon>>;
746
- readonly prefixAddons: Signal<ReadonlyArray<TAddon>>;
747
- readonly suffixAddons: Signal<ReadonlyArray<TAddon>>;
815
+ readonly addons: Signal<ReadonlyArray<TAddon> | undefined>;
816
+ readonly visibleAddons: Signal<ReadonlyArray<TAddon>>;
817
+ readonly prefixAddons: Signal<ReadonlyArray<TAddon>>;
818
+ readonly suffixAddons: Signal<ReadonlyArray<TAddon>>;
748
819
  };
749
820
  /**
750
821
  * Typed inject helper. Always resolves to the underlying
751
822
  * `NgForgeAddonsBase` instance — the wrapper class has no instance
752
823
  * fields of its own.
753
824
  */
754
- declare function injectNgForgeAddons<TAddon extends AnyAddon = AnyAddon>(): TypedNgForgeAddons<TAddon>;
755
-
825
+ export declare function injectNgForgeAddons<TAddon extends AnyAddon = AnyAddon>(): TypedNgForgeAddons<TAddon>;
756
826
  /**
757
827
  * Permissive shape the directive reads from `addon()`. Adapter-specific
758
828
  * addon types (e.g., `PrimeButtonAddon`) narrow this at the inject site via
759
829
  * `injectNgForgeAddonAction<T>()`.
760
830
  */
761
831
  interface ActionAddonShape extends BaseAddon {
762
- readonly preset?: string;
763
- readonly actionRef?: string;
764
- readonly action?: AddonActionHandler;
765
- readonly disabled?: DynamicValue<boolean>;
766
- readonly loading?: DynamicValue<boolean>;
832
+ readonly preset?: string;
833
+ readonly actionRef?: string;
834
+ readonly action?: AddonActionHandler$1;
835
+ readonly disabled?: DynamicValue<boolean>;
836
+ readonly loading?: DynamicValue<boolean>;
767
837
  }
768
838
  /**
769
839
  * Universal click-dispatch plumbing for action-style addons (icon buttons,
@@ -771,59 +841,76 @@ interface ActionAddonShape extends BaseAddon {
771
841
  * `DynamicValue<boolean>`, action context construction, and the
772
842
  * `preset / actionRef / action` precedence dispatcher.
773
843
  */
774
- declare class NgForgeAddonActionBase {
775
- private readonly actionRegistry;
776
- private readonly presetHandler;
777
- private readonly logger;
778
- private readonly hostInjector;
779
- readonly addon: i0.InputSignal<ActionAddonShape>;
780
- readonly fieldInputs: i0.InputSignal<WrapperFieldInputs | undefined>;
781
- /**
782
- * Per-value caches for `disabled` / `loading` signal resolution. Keyed by
783
- * the `DynamicValue` identity so a single `toSignal` subscription is
784
- * shared across addon-reference swaps that pass the same Observable.
785
- * Mirrors `NgForgeAddonsBase._hiddenByValue` — `resolveDynamicValue`
786
- * cannot run inside `computed`/`linkedSignal.computation` because
787
- * `toSignal` throws in reactive contexts (NG0602), and re-running it on
788
- * every recomputation would leak subscriptions on each cycle.
789
- */
790
- private readonly _disabledByValue;
791
- private readonly _loadingByValue;
792
- private readonly _resolvedDisabled;
793
- private readonly _resolvedLoading;
794
- readonly disabled: Signal<boolean>;
795
- readonly loading: Signal<boolean>;
796
- constructor();
797
- private _resolveAxis;
798
- /**
799
- * Resolve the click handler from the addon's three-axis click variant and
800
- * invoke it. Precedence on multi-set: `preset > actionRef > action`. The
801
- * validator drops multi-set configs at config-init time; this is
802
- * defence-in-depth + a logged warning so the misconfiguration is loud.
803
- */
804
- dispatch(): void;
805
- /**
806
- * Build an `AddonActionContext` for handlers from the wrapper-style
807
- * `fieldInputs` bag. Returns the field-bound variant when a host field
808
- * is reachable, or the orphan variant otherwise.
809
- */
810
- buildActionContext(): AddonActionContext;
811
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddonActionBase, never>;
812
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddonActionBase, never, never, { "addon": { "alias": "addon"; "required": true; "isSignal": true; }; "fieldInputs": { "alias": "fieldInputs"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
844
+ export declare class NgForgeAddonActionBase {
845
+ private readonly actionRegistry;
846
+ private readonly presetHandler;
847
+ private readonly logger;
848
+ private readonly hostInjector;
849
+ readonly addon: import("@angular/core").InputSignal<ActionAddonShape>;
850
+ readonly fieldInputs: import("@angular/core").InputSignal<WrapperFieldInputs$1 | undefined>;
851
+ /**
852
+ * Per-value caches for `disabled` / `loading` signal resolution. Keyed by
853
+ * the `DynamicValue` identity so a single `toSignal` subscription is
854
+ * shared across addon-reference swaps that pass the same Observable.
855
+ * Mirrors `NgForgeAddonsBase._hiddenByValue` — `resolveDynamicValue`
856
+ * cannot run inside `computed`/`linkedSignal.computation` because
857
+ * `toSignal` throws in reactive contexts (NG0602), and re-running it on
858
+ * every recomputation would leak subscriptions on each cycle.
859
+ */
860
+ private readonly _disabledByValue;
861
+ private readonly _loadingByValue;
862
+ private readonly _resolvedDisabled;
863
+ private readonly _resolvedLoading;
864
+ readonly disabled: Signal<boolean>;
865
+ readonly loading: Signal<boolean>;
866
+ constructor();
867
+ private _resolveAxis;
868
+ /**
869
+ * Resolve the click handler from the addon's three-axis click variant and
870
+ * invoke it. Precedence on multi-set: `preset > actionRef > action`. The
871
+ * validator drops multi-set configs at config-init time; this is
872
+ * defence-in-depth + a logged warning so the misconfiguration is loud.
873
+ */
874
+ dispatch(): void;
875
+ /**
876
+ * Build an `AddonActionContext` for handlers from the wrapper-style
877
+ * `fieldInputs` bag. Returns the field-bound variant when a host field
878
+ * is reachable, or the orphan variant otherwise.
879
+ */
880
+ buildActionContext(): AddonActionContext;
881
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddonActionBase, never>;
882
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddonActionBase, never, never, {
883
+ "addon": {
884
+ "alias": "addon";
885
+ "required": true;
886
+ "isSignal": true;
887
+ };
888
+ "fieldInputs": {
889
+ "alias": "fieldInputs";
890
+ "required": false;
891
+ "isSignal": true;
892
+ };
893
+ }, {}, never, never, true, never>;
813
894
  }
814
895
  /** Forwarded onto `NgForgeAddonActionBase` via the `NgForgeAddonAction` wrapper. */
815
- declare const NG_FORGE_ADDON_ACTION_INPUTS: readonly ["addon", "fieldInputs"];
896
+ export declare const NG_FORGE_ADDON_ACTION_INPUTS: readonly ["addon", "fieldInputs"];
816
897
  /** Host wrapper for `NgForgeAddonActionBase`. Consumers compose this directly: */
817
- declare class NgForgeAddonAction {
818
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddonAction, never>;
819
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddonAction, never, never, {}, {}, never, never, true, [{ directive: typeof NgForgeAddonActionBase; inputs: { "addon": "addon"; "fieldInputs": "fieldInputs"; }; outputs: {}; }]>;
898
+ export declare class NgForgeAddonAction {
899
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddonAction, never>;
900
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddonAction, never, never, {}, {}, never, never, true, [{
901
+ directive: typeof NgForgeAddonActionBase;
902
+ inputs: {
903
+ "addon": "addon";
904
+ "fieldInputs": "fieldInputs";
905
+ };
906
+ outputs: {};
907
+ }]>;
820
908
  }
821
909
  /** Narrowed view of `NgForgeAddonActionBase` returned by `injectNgForgeAddonAction<T>()`. */
822
910
  type TypedNgForgeAddonAction<TAddon extends ActionAddonShape = ActionAddonShape> = Omit<NgForgeAddonActionBase, 'addon'> & {
823
- readonly addon: Signal<TAddon>;
911
+ readonly addon: Signal<TAddon>;
824
912
  };
825
- declare function injectNgForgeAddonAction<TAddon extends ActionAddonShape = ActionAddonShape>(): TypedNgForgeAddonAction<TAddon>;
826
-
913
+ export declare function injectNgForgeAddonAction<TAddon extends ActionAddonShape = ActionAddonShape>(): TypedNgForgeAddonAction<TAddon>;
827
914
  /**
828
915
  * Adapter-supplied resolver for `preset` addon actions (e.g., `'clear'`,
829
916
  * `'toggle-password-visibility'`). The universal click-dispatch directive
@@ -832,10 +919,9 @@ declare function injectNgForgeAddonAction<TAddon extends ActionAddonShape = Acti
832
919
  * provider scope.
833
920
  */
834
921
  interface AddonPresetHandler {
835
- run(preset: string, ctx: AddonActionContext): void | Promise<void>;
922
+ run(preset: string, ctx: AddonActionContext): void | Promise<void>;
836
923
  }
837
- declare const ADDON_PRESET_HANDLER: InjectionToken<AddonPresetHandler>;
838
-
924
+ export declare const ADDON_PRESET_HANDLER: InjectionToken<AddonPresetHandler>;
839
925
  /**
840
926
  * Marker directive applied to the canonical control element of an
841
927
  * `NgForgeField`-using component. Forwards the field's `meta` AND
@@ -850,11 +936,17 @@ declare const ADDON_PRESET_HANDLER: InjectionToken<AddonPresetHandler>;
850
936
  * Each `@for` iteration creates its own directive instance; Angular's
851
937
  * structural lifecycle handles add/remove naturally.
852
938
  */
853
- declare class NgForgeControl {
854
- readonly target: i0.InputSignal<string | undefined>;
855
- constructor();
856
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeControl, never>;
857
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeControl, "[ngForgeControl]", never, { "target": { "alias": "ngForgeControl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
939
+ export declare class NgForgeControl {
940
+ readonly target: import("@angular/core").InputSignal<string | undefined>;
941
+ constructor();
942
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeControl, never>;
943
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeControl, "[ngForgeControl]", never, {
944
+ "target": {
945
+ "alias": "ngForgeControl";
946
+ "required": false;
947
+ "isSignal": true;
948
+ };
949
+ }, {}, never, never, true, never>;
858
950
  }
859
951
  /**
860
952
  * Selectorless companion directive for shadow-DOM-encapsulated components
@@ -862,31 +954,67 @@ declare class NgForgeControl {
862
954
  * is the canonical control. Added to the component's `hostDirectives` so the
863
955
  * field's `meta` + parent aria land on the component's own host element.
864
956
  */
865
- declare class NgForgeHostControl {
866
- constructor();
867
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeHostControl, never>;
868
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeHostControl, never, never, {}, {}, never, never, true, never>;
957
+ export declare class NgForgeHostControl {
958
+ constructor();
959
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeHostControl, never>;
960
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeHostControl, never, never, {}, {}, never, never, true, never>;
869
961
  }
870
-
871
962
  /**
872
963
  * Value-bearing field host wrapper. Composes `NgForgeFieldShell` (universal
873
964
  * identity) with `NgForgeField` (value + validation + aria + meta-tracking)
874
965
  * in a single host-directive entry, so consumer components compose just one
875
966
  * directive instead of two.
876
967
  */
877
- declare class NgForgeFieldHost {
878
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeFieldHost, never>;
879
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeFieldHost, never, never, {}, {}, never, never, true, [{ directive: typeof NgForgeFieldShell; inputs: { "key": "key"; "className": "className"; }; outputs: {}; }, { directive: typeof NgForgeField; inputs: { "field": "field"; "label": "label"; "placeholder": "placeholder"; "tabIndex": "tabIndex"; "props": "props"; "meta": "meta"; "validationMessages": "validationMessages"; }; outputs: {}; }]>;
968
+ export declare class NgForgeFieldHost {
969
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeFieldHost, never>;
970
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeFieldHost, never, never, {}, {}, never, never, true, [{
971
+ directive: typeof NgForgeFieldShell;
972
+ inputs: {
973
+ "key": "key";
974
+ "className": "className";
975
+ };
976
+ outputs: {};
977
+ }, {
978
+ directive: typeof NgForgeField;
979
+ inputs: {
980
+ "field": "field";
981
+ "label": "label";
982
+ "placeholder": "placeholder";
983
+ "tabIndex": "tabIndex";
984
+ "props": "props";
985
+ "meta": "meta";
986
+ "validationMessages": "validationMessages";
987
+ };
988
+ outputs: {};
989
+ }]>;
880
990
  }
881
991
  /**
882
992
  * Action / button host wrapper. Composes `NgForgeFieldShell` with
883
993
  * `NgForgeAction` (event dispatch + aria-disabled) for button-shaped
884
994
  * components.
885
995
  */
886
- declare class NgForgeActionHost {
887
- static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeActionHost, never>;
888
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeActionHost, never, never, {}, {}, never, never, true, [{ directive: typeof NgForgeFieldShell; inputs: { "key": "key"; "className": "className"; }; outputs: {}; }, { directive: typeof NgForgeAction; inputs: { "label": "label"; "disabled": "disabled"; "hidden": "hidden"; "tabIndex": "tabIndex"; "event": "event"; "eventArgs": "eventArgs"; "eventContext": "eventContext"; "props": "props"; }; outputs: {}; }]>;
996
+ export declare class NgForgeActionHost {
997
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeActionHost, never>;
998
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeActionHost, never, never, {}, {}, never, never, true, [{
999
+ directive: typeof NgForgeFieldShell;
1000
+ inputs: {
1001
+ "key": "key";
1002
+ "className": "className";
1003
+ };
1004
+ outputs: {};
1005
+ }, {
1006
+ directive: typeof NgForgeAction;
1007
+ inputs: {
1008
+ "label": "label";
1009
+ "disabled": "disabled";
1010
+ "hidden": "hidden";
1011
+ "tabIndex": "tabIndex";
1012
+ "event": "event";
1013
+ "eventArgs": "eventArgs";
1014
+ "eventContext": "eventContext";
1015
+ "props": "props";
1016
+ };
1017
+ outputs: {};
1018
+ }]>;
889
1019
  }
890
-
891
- export { ADDON_PRESET_HANDLER, NG_FORGE_ACTION_INPUTS, NG_FORGE_ADDONS_INPUTS, NG_FORGE_ADDON_ACTION_INPUTS, NG_FORGE_FIELD_SHELL_INPUTS, NG_FORGE_VALUE_FIELD_INPUTS, NgForgeAction, NgForgeActionHost, NgForgeAddonAction, NgForgeAddonActionBase, NgForgeAddons, NgForgeAddonsBase, NgForgeControl, NgForgeField, NgForgeFieldHost, NgForgeFieldShell, NgForgeHostControl, addArrayItemButtonMapper, buildArrayButtonEventContext, buildValueFieldInputs, buttonFieldMapper, checkboxFieldMapper, createAriaDescribedBySignal, datepickerFieldMapper, injectNgForgeAction, injectNgForgeAddonAction, injectNgForgeAddons, injectNgForgeField, injectNonFieldLogicResolver, insertArrayItemButtonMapper, nextButtonFieldMapper, optionsFieldMapper, popArrayItemButtonMapper, prependArrayItemButtonMapper, previousButtonFieldMapper, removeArrayItemButtonMapper, resolveArrayButtonContext, resolveArrayButtonEventArgs, resolveValueFieldContext, setupMetaTracking, shiftArrayItemButtonMapper, submitButtonFieldMapper, valueFieldMapper };
892
- export type { AddonPresetHandler, ArrayButtonContext, ArrayButtonEventContext, Autocapitalize, AutocompleteValue, BaseArrayAddButtonField, BaseArrayRemoveButtonField, BaseInsertArrayItemButtonField, BaseNavigationButtonField, ButtonField, CheckboxField, DatepickerField, DatepickerProps, EnterKeyHint, EventArg, EventArgs, FieldWithOptions, HtmlInputType, InferInputValue, InputField, InputMeta, InputMode, InputProps, InputType, MetaTrackingOptions, MultiCheckboxField, NumericInputType, RadioField, SelectField, SelectProps, SliderField, StringInputType, TextareaField, TextareaMeta, TextareaProps, TextareaWrap, ToggleField, TypedNgForgeAddonAction, TypedNgForgeAddons, TypedNgForgeField, ValueFieldContext };
1020
+ export { ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, type AddonActionHandler, type AddonPresetHandler, type AddonShapeValidator, type AddonTypeDefinition, type AddonTypeSchema, type ArrayButtonContext, type ArrayButtonEventContext, type ArrayContext, type ArrayFieldTree, type Autocapitalize, type AutocompleteValue, BUILT_IN_FIELDS, type BaseArrayAddButtonField, type BaseArrayRemoveButtonField, type BaseInsertArrayItemButtonField, type BaseNavigationButtonField, type ButtonField, type CheckboxField, type CheckedFieldComponent, type CreateNgForgeActionFixtureOptions, type CreateNgForgeFieldFixtureOptions, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, type DatepickerField, type DatepickerProps, DfAddonSlot, DynamicTextPipe, type EnterKeyHint, type EventArg, type EventArgs, EventBus, FIELD_ERROR_DISPLAY, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_OPTIONS, type FieldAddonSupport, type FieldAddonSupportEntry, type FieldErrorDisplayClaim, type FieldErrors, type FieldErrorsOptions, FieldErrorsWrapperBase, type FieldScope, type FieldSignalContext, type FieldStateContext, type FieldStateInfo, type FieldTypeDefinition, type FieldWithOptions, type FieldWrapper, type FormFieldStateMap, GROUP_CONTEXT, type HtmlInputType, type HttpResourceRequest, INITIALIZATION_TIMEOUT_MS, type InferInputValue, type InferWrapperRegistry, type InputField, type InputMeta, type InputMode, type InputProps, type InputType, type MapperFn, type MetaTrackingOptions, type MultiCheckboxField, type NgForgeActionFixture, type NgForgeFieldFixture, type NonFieldLogicConfig, type NonFieldLogicContext, type NonFieldLogicType, type NumericInputType, type PresetCollaborators, type RadioField, type ReadonlyFieldTree, type ResolvedError, RootFormRegistryService, type SelectField, type SelectProps, type SliderField, type StringInputType, type TextareaField, type TextareaMeta, type TextareaProps, type TextareaWrap, type ToggleField, type TypedNgForgeAddonAction, type TypedNgForgeAddons, type TypedNgForgeField, type ValueFieldComponent, type ValueFieldContext, type ValueHandlingMode, type WrapperFieldInputs, type WrapperRegistration, type WrapperTypeDefinition, type WrappersBundle, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, baseFieldMapper, buildBaseInputs, containerFieldMapper, createNgForgeActionFixture, createNgForgeFieldFixture, createResolvedErrorsSignal, createWrappers, dynamicTextToObservable, getArrayLength, groupFieldMapper, injectAddonTypeRegistry, injectFieldErrors, injectFieldSignalContext, injectFieldsSupportingAddons, interpolateParams, isCheckedField, isEqual, isValueField, isWrappersBundle, pageFieldMapper, provideFieldErrorDisplay, provideTestValidationMessages, resolveDynamicValue, resolveNonFieldDisabled, resolveNonFieldHidden, resolveTokens, rowFieldMapper, runPresetAction, shouldShowErrors, textFieldMapper, toReadonlyFieldTree, withPreviousValue, wrapperProps, writeToFieldValue };