@ng-forge/dynamic-forms-bootstrap 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,590 @@
1
+ import * as _ng_forge_dynamic_forms from '@ng-forge/dynamic-forms';
2
+ import { FormEvent, ButtonField, FieldDef, LogicConfig, FieldComponent, DynamicText, FormEventConstructor, EventArgs, ArrayItemContext, CheckboxField, CheckedFieldComponent, ValidationMessages, DatepickerField, DatepickerProps, ValueFieldComponent, InputField, InputProps, MultiCheckboxField, ValueType, FieldOption, RadioField, SelectField, SelectProps, SliderField, TextareaField, TextareaProps, ToggleField, FieldTypeDefinition } from '@ng-forge/dynamic-forms';
3
+ import * as _angular_core from '@angular/core';
4
+ import { ElementRef, InjectionToken, Provider } from '@angular/core';
5
+ import { FieldTree } from '@angular/forms/signals';
6
+
7
+ interface BsButtonProps {
8
+ variant?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';
9
+ outline?: boolean;
10
+ size?: 'sm' | 'lg';
11
+ block?: boolean;
12
+ active?: boolean;
13
+ type?: 'button' | 'submit' | 'reset';
14
+ }
15
+ type BsButtonField<TEvent extends FormEvent> = ButtonField<BsButtonProps, TEvent>;
16
+ type BsButtonComponent<TEvent extends FormEvent> = FieldComponent<BsButtonField<TEvent>>;
17
+ /**
18
+ * Specific button field types with preconfigured events
19
+ */
20
+ /** Submit button field - automatically disabled when form is invalid */
21
+ interface BsSubmitButtonField extends Omit<FieldDef<BsButtonProps>, 'event'> {
22
+ type: 'submit';
23
+ key: string;
24
+ label: string;
25
+ disabled?: boolean;
26
+ className?: string;
27
+ props?: BsButtonProps;
28
+ /** Logic rules for dynamic disabled state (overrides form-level defaults) */
29
+ logic?: LogicConfig[];
30
+ }
31
+ /** Next page button field - with preconfigured NextPageEvent */
32
+ interface BsNextButtonField extends Omit<FieldDef<BsButtonProps>, 'event'> {
33
+ type: 'next';
34
+ key: string;
35
+ label: string;
36
+ disabled?: boolean;
37
+ className?: string;
38
+ props?: BsButtonProps;
39
+ /** Logic rules for dynamic disabled state (overrides form-level defaults) */
40
+ logic?: LogicConfig[];
41
+ }
42
+ /** Previous page button field - with preconfigured PreviousPageEvent */
43
+ interface BsPreviousButtonField extends Omit<FieldDef<BsButtonProps>, 'event'> {
44
+ type: 'previous';
45
+ key: string;
46
+ label: string;
47
+ disabled?: boolean;
48
+ className?: string;
49
+ props?: BsButtonProps;
50
+ }
51
+ /** Add array item button field - with preconfigured AddArrayItemEvent */
52
+ interface AddArrayItemButtonField extends Omit<FieldDef<BsButtonProps>, 'event'> {
53
+ type: 'addArrayItem';
54
+ key: string;
55
+ label: string;
56
+ disabled?: boolean;
57
+ className?: string;
58
+ props?: BsButtonProps;
59
+ /**
60
+ * The key of the array field to add items to.
61
+ * Required when the button is placed outside the array.
62
+ * When inside an array, this is automatically determined from context.
63
+ */
64
+ arrayKey?: string;
65
+ }
66
+ /** Remove array item button field - with preconfigured RemoveArrayItemEvent */
67
+ interface RemoveArrayItemButtonField extends Omit<FieldDef<BsButtonProps>, 'event'> {
68
+ type: 'removeArrayItem';
69
+ key: string;
70
+ label: string;
71
+ disabled?: boolean;
72
+ className?: string;
73
+ props?: BsButtonProps;
74
+ /**
75
+ * The key of the array field to remove items from.
76
+ * Required when the button is placed outside the array.
77
+ * When inside an array, this is automatically determined from context.
78
+ */
79
+ arrayKey?: string;
80
+ }
81
+
82
+ declare class BsButtonFieldComponent<TEvent extends FormEvent> implements BsButtonComponent<TEvent> {
83
+ private readonly eventBus;
84
+ private readonly arrayContext;
85
+ readonly key: _angular_core.InputSignal<string>;
86
+ readonly label: _angular_core.InputSignal<DynamicText>;
87
+ readonly disabled: _angular_core.InputSignal<boolean>;
88
+ readonly hidden: _angular_core.InputSignal<boolean>;
89
+ readonly tabIndex: _angular_core.InputSignal<number | undefined>;
90
+ readonly className: _angular_core.InputSignal<string>;
91
+ /** Event to dispatch on click. Optional for submit buttons (native form submit handles it). */
92
+ readonly event: _angular_core.InputSignal<FormEventConstructor<TEvent> | undefined>;
93
+ readonly eventArgs: _angular_core.InputSignal<EventArgs | undefined>;
94
+ readonly props: _angular_core.InputSignal<BsButtonProps | undefined>;
95
+ readonly eventContext: _angular_core.InputSignal<ArrayItemContext | undefined>;
96
+ /** Resolved button type - defaults to 'button' if not specified in props */
97
+ readonly buttonType: _angular_core.Signal<"button" | "submit" | "reset">;
98
+ readonly buttonTestId: _angular_core.Signal<string>;
99
+ readonly buttonClasses: _angular_core.Signal<string>;
100
+ /**
101
+ * Handle button click.
102
+ * - For submit buttons (type="submit"): do nothing, native form submit handles it
103
+ * - For other buttons: dispatch the configured event via EventBus
104
+ */
105
+ onClick(): void;
106
+ private dispatchEvent;
107
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsButtonFieldComponent<any>, never>;
108
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsButtonFieldComponent<any>, "df-bs-button", never, { "key": { "alias": "key"; "required": true; "isSignal": true; }; "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; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "event": { "alias": "event"; "required": false; "isSignal": true; }; "eventArgs": { "alias": "eventArgs"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "eventContext": { "alias": "eventContext"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
109
+ }
110
+
111
+ interface BsCheckboxProps {
112
+ switch?: boolean;
113
+ inline?: boolean;
114
+ reverse?: boolean;
115
+ indeterminate?: boolean;
116
+ helpText?: DynamicText;
117
+ }
118
+ type BsCheckboxField = CheckboxField<BsCheckboxProps>;
119
+ type BsCheckboxComponent = CheckedFieldComponent<BsCheckboxField>;
120
+
121
+ declare class BsCheckboxFieldComponent implements BsCheckboxComponent {
122
+ readonly field: _angular_core.InputSignal<FieldTree<boolean>>;
123
+ readonly key: _angular_core.InputSignal<string>;
124
+ readonly label: _angular_core.InputSignal<DynamicText | undefined>;
125
+ readonly placeholder: _angular_core.InputSignal<DynamicText | undefined>;
126
+ readonly className: _angular_core.InputSignal<string>;
127
+ readonly tabIndex: _angular_core.InputSignal<number | undefined>;
128
+ readonly props: _angular_core.InputSignal<BsCheckboxProps | undefined>;
129
+ readonly validationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
130
+ readonly defaultValidationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
131
+ readonly resolvedErrors: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
132
+ readonly showErrors: _angular_core.Signal<boolean>;
133
+ readonly errorsToDisplay: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
134
+ readonly checkboxInput: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
135
+ constructor();
136
+ protected readonly helpTextId: _angular_core.Signal<string>;
137
+ protected readonly errorId: _angular_core.Signal<string>;
138
+ protected readonly ariaInvalid: _angular_core.Signal<boolean>;
139
+ protected readonly ariaRequired: _angular_core.Signal<true | null>;
140
+ protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
141
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsCheckboxFieldComponent, never>;
142
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsCheckboxFieldComponent, "df-bs-checkbox", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "validationMessages": { "alias": "validationMessages"; "required": false; "isSignal": true; }; "defaultValidationMessages": { "alias": "defaultValidationMessages"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
143
+ }
144
+
145
+ interface BsDatepickerProps extends DatepickerProps {
146
+ useNgBootstrap?: boolean;
147
+ size?: 'sm' | 'lg';
148
+ floatingLabel?: boolean;
149
+ helpText?: DynamicText;
150
+ validFeedback?: DynamicText;
151
+ invalidFeedback?: DynamicText;
152
+ displayMonths?: number;
153
+ navigation?: 'select' | 'arrows' | 'none';
154
+ outsideDays?: 'visible' | 'collapsed' | 'hidden';
155
+ showWeekNumbers?: boolean;
156
+ }
157
+ type BsDatepickerField = DatepickerField<BsDatepickerProps>;
158
+ type BsDatepickerComponent = ValueFieldComponent<BsDatepickerField>;
159
+
160
+ declare class BsDatepickerFieldComponent implements BsDatepickerComponent {
161
+ readonly field: _angular_core.InputSignal<FieldTree<string | Date>>;
162
+ readonly key: _angular_core.InputSignal<string>;
163
+ readonly label: _angular_core.InputSignal<DynamicText | undefined>;
164
+ readonly placeholder: _angular_core.InputSignal<DynamicText | undefined>;
165
+ readonly className: _angular_core.InputSignal<string>;
166
+ readonly tabIndex: _angular_core.InputSignal<number | undefined>;
167
+ readonly minDate: _angular_core.InputSignal<string | Date | null>;
168
+ readonly maxDate: _angular_core.InputSignal<string | Date | null>;
169
+ readonly startAt: _angular_core.InputSignal<Date | null>;
170
+ readonly props: _angular_core.InputSignal<BsDatepickerProps | undefined>;
171
+ readonly validationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
172
+ readonly defaultValidationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
173
+ readonly resolvedErrors: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
174
+ readonly showErrors: _angular_core.Signal<boolean>;
175
+ readonly errorsToDisplay: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
176
+ readonly minAsString: _angular_core.Signal<string | null>;
177
+ readonly maxAsString: _angular_core.Signal<string | null>;
178
+ protected readonly helpTextId: _angular_core.Signal<string>;
179
+ protected readonly errorId: _angular_core.Signal<string>;
180
+ protected readonly ariaInvalid: _angular_core.Signal<boolean>;
181
+ protected readonly ariaRequired: _angular_core.Signal<true | null>;
182
+ protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
183
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsDatepickerFieldComponent, never>;
184
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsDatepickerFieldComponent, "df-bs-datepicker", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "validationMessages": { "alias": "validationMessages"; "required": false; "isSignal": true; }; "defaultValidationMessages": { "alias": "defaultValidationMessages"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
185
+ }
186
+
187
+ interface BsInputProps extends InputProps {
188
+ size?: 'sm' | 'lg';
189
+ floatingLabel?: boolean;
190
+ helpText?: DynamicText;
191
+ validFeedback?: DynamicText;
192
+ invalidFeedback?: DynamicText;
193
+ plaintext?: boolean;
194
+ type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url';
195
+ }
196
+ type BsInputField = InputField<BsInputProps>;
197
+ type BsInputComponent = ValueFieldComponent<BsInputField>;
198
+
199
+ declare class BsInputFieldComponent implements BsInputComponent {
200
+ private bootstrapConfig;
201
+ readonly field: _angular_core.InputSignal<FieldTree<string>>;
202
+ readonly key: _angular_core.InputSignal<string>;
203
+ readonly label: _angular_core.InputSignal<DynamicText | undefined>;
204
+ readonly placeholder: _angular_core.InputSignal<DynamicText | undefined>;
205
+ readonly className: _angular_core.InputSignal<string>;
206
+ readonly tabIndex: _angular_core.InputSignal<number | undefined>;
207
+ readonly props: _angular_core.InputSignal<BsInputProps | undefined>;
208
+ readonly validationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
209
+ readonly defaultValidationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
210
+ readonly effectiveSize: _angular_core.Signal<"sm" | "lg" | undefined>;
211
+ readonly effectiveFloatingLabel: _angular_core.Signal<boolean>;
212
+ readonly resolvedErrors: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
213
+ readonly showErrors: _angular_core.Signal<boolean>;
214
+ readonly errorsToDisplay: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
215
+ /** Unique ID for the help text element, used for aria-describedby */
216
+ protected readonly helpTextId: _angular_core.Signal<string>;
217
+ /** Base ID for error elements, used for aria-describedby */
218
+ protected readonly errorId: _angular_core.Signal<string>;
219
+ /** aria-invalid: true when field is invalid AND touched, false otherwise */
220
+ protected readonly ariaInvalid: _angular_core.Signal<boolean>;
221
+ /** aria-required: true if field is required, null otherwise (to remove attribute) */
222
+ protected readonly ariaRequired: _angular_core.Signal<true | null>;
223
+ /** aria-describedby: links to help text and error messages for screen readers */
224
+ protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
225
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsInputFieldComponent, never>;
226
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsInputFieldComponent, "df-bs-input", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "validationMessages": { "alias": "validationMessages"; "required": false; "isSignal": true; }; "defaultValidationMessages": { "alias": "defaultValidationMessages"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
227
+ }
228
+
229
+ interface BsMultiCheckboxProps<T> {
230
+ switch?: boolean;
231
+ inline?: boolean;
232
+ reverse?: boolean;
233
+ helpText?: DynamicText;
234
+ }
235
+ type BsMultiCheckboxField<T> = MultiCheckboxField<T, BsMultiCheckboxProps<T>>;
236
+ type BsMultiCheckboxComponent<T> = ValueFieldComponent<BsMultiCheckboxField<T>>;
237
+
238
+ declare class BsMultiCheckboxFieldComponent<T extends ValueType> implements BsMultiCheckboxComponent<T> {
239
+ readonly field: _angular_core.InputSignal<FieldTree<T[]>>;
240
+ readonly key: _angular_core.InputSignal<string>;
241
+ readonly label: _angular_core.InputSignal<DynamicText | undefined>;
242
+ readonly placeholder: _angular_core.InputSignal<DynamicText | undefined>;
243
+ readonly className: _angular_core.InputSignal<string>;
244
+ readonly tabIndex: _angular_core.InputSignal<number | undefined>;
245
+ readonly options: _angular_core.InputSignal<FieldOption<T>[]>;
246
+ readonly props: _angular_core.InputSignal<BsMultiCheckboxProps<T> | undefined>;
247
+ readonly validationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
248
+ readonly defaultValidationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
249
+ readonly resolvedErrors: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
250
+ readonly showErrors: _angular_core.Signal<boolean>;
251
+ readonly errorsToDisplay: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
252
+ valueViewModel: _angular_core.WritableSignal<FieldOption<T>[]>;
253
+ constructor();
254
+ onCheckboxChange(option: FieldOption<T>, checked: boolean): void;
255
+ isChecked(option: FieldOption<T>): boolean;
256
+ protected readonly helpTextId: _angular_core.Signal<string>;
257
+ protected readonly errorId: _angular_core.Signal<string>;
258
+ protected readonly ariaInvalid: _angular_core.Signal<boolean>;
259
+ protected readonly ariaRequired: _angular_core.Signal<true | null>;
260
+ protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
261
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsMultiCheckboxFieldComponent<any>, never>;
262
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsMultiCheckboxFieldComponent<any>, "df-bs-multi-checkbox", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "validationMessages": { "alias": "validationMessages"; "required": false; "isSignal": true; }; "defaultValidationMessages": { "alias": "defaultValidationMessages"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
263
+ }
264
+
265
+ interface BsRadioProps {
266
+ inline?: boolean;
267
+ reverse?: boolean;
268
+ buttonGroup?: boolean;
269
+ buttonSize?: 'sm' | 'lg';
270
+ helpText?: DynamicText;
271
+ }
272
+ type BsRadioField<T> = RadioField<T, BsRadioProps>;
273
+ type BsRadioComponent<T> = ValueFieldComponent<BsRadioField<T>>;
274
+
275
+ declare class BsRadioFieldComponent<T extends string> implements BsRadioComponent<T> {
276
+ readonly field: _angular_core.InputSignal<FieldTree<T>>;
277
+ readonly key: _angular_core.InputSignal<string>;
278
+ readonly label: _angular_core.InputSignal<DynamicText | undefined>;
279
+ readonly placeholder: _angular_core.InputSignal<DynamicText | undefined>;
280
+ readonly className: _angular_core.InputSignal<string>;
281
+ readonly tabIndex: _angular_core.InputSignal<number | undefined>;
282
+ readonly options: _angular_core.InputSignal<FieldOption<T>[]>;
283
+ readonly props: _angular_core.InputSignal<BsRadioProps | undefined>;
284
+ readonly validationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
285
+ readonly defaultValidationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
286
+ readonly resolvedErrors: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
287
+ readonly showErrors: _angular_core.Signal<boolean>;
288
+ readonly errorsToDisplay: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
289
+ protected readonly helpTextId: _angular_core.Signal<string>;
290
+ protected readonly errorId: _angular_core.Signal<string>;
291
+ protected readonly ariaInvalid: _angular_core.Signal<boolean>;
292
+ protected readonly ariaRequired: _angular_core.Signal<true | null>;
293
+ protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
294
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsRadioFieldComponent<any>, never>;
295
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsRadioFieldComponent<any>, "df-bs-radio", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "validationMessages": { "alias": "validationMessages"; "required": false; "isSignal": true; }; "defaultValidationMessages": { "alias": "defaultValidationMessages"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
296
+ }
297
+
298
+ interface BsSelectProps<T> extends SelectProps {
299
+ multiple?: boolean;
300
+ size?: 'sm' | 'lg';
301
+ htmlSize?: number;
302
+ floatingLabel?: boolean;
303
+ helpText?: DynamicText;
304
+ validFeedback?: DynamicText;
305
+ invalidFeedback?: DynamicText;
306
+ compareWith?: (o1: T, o2: T) => boolean;
307
+ }
308
+ type BsSelectField<T> = SelectField<T, BsSelectProps<T>>;
309
+ type BsSelectComponent<T> = ValueFieldComponent<BsSelectField<T>>;
310
+
311
+ declare class BsSelectFieldComponent<T extends string = string> implements BsSelectComponent<T> {
312
+ readonly field: _angular_core.InputSignal<FieldTree<T>>;
313
+ readonly key: _angular_core.InputSignal<string>;
314
+ readonly label: _angular_core.InputSignal<DynamicText | undefined>;
315
+ readonly placeholder: _angular_core.InputSignal<DynamicText | undefined>;
316
+ readonly className: _angular_core.InputSignal<string>;
317
+ readonly tabIndex: _angular_core.InputSignal<number | undefined>;
318
+ readonly options: _angular_core.InputSignal<FieldOption<T>[]>;
319
+ readonly props: _angular_core.InputSignal<BsSelectProps<T> | undefined>;
320
+ readonly validationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
321
+ readonly defaultValidationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
322
+ readonly resolvedErrors: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
323
+ readonly showErrors: _angular_core.Signal<boolean>;
324
+ readonly errorsToDisplay: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
325
+ defaultCompare: (value1: any, value2: any) => boolean;
326
+ protected isSelected(optionValue: T, fieldValue: T | T[] | null): boolean;
327
+ protected readonly helpTextId: _angular_core.Signal<string>;
328
+ protected readonly errorId: _angular_core.Signal<string>;
329
+ protected readonly ariaInvalid: _angular_core.Signal<boolean>;
330
+ protected readonly ariaRequired: _angular_core.Signal<true | null>;
331
+ protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
332
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsSelectFieldComponent<any>, never>;
333
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsSelectFieldComponent<any>, "df-bs-select", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "validationMessages": { "alias": "validationMessages"; "required": false; "isSignal": true; }; "defaultValidationMessages": { "alias": "defaultValidationMessages"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
334
+ }
335
+
336
+ interface BsSliderProps {
337
+ showValue?: boolean;
338
+ valuePrefix?: string;
339
+ valueSuffix?: string;
340
+ helpText?: DynamicText;
341
+ min?: number;
342
+ max?: number;
343
+ step?: number;
344
+ }
345
+ type BsSliderField = SliderField<BsSliderProps>;
346
+ type BsSliderComponent = ValueFieldComponent<BsSliderField>;
347
+
348
+ declare class BsSliderFieldComponent implements BsSliderComponent {
349
+ readonly field: _angular_core.InputSignal<FieldTree<number>>;
350
+ readonly key: _angular_core.InputSignal<string>;
351
+ readonly label: _angular_core.InputSignal<DynamicText | undefined>;
352
+ readonly placeholder: _angular_core.InputSignal<DynamicText | undefined>;
353
+ readonly className: _angular_core.InputSignal<string>;
354
+ readonly tabIndex: _angular_core.InputSignal<number | undefined>;
355
+ readonly min: _angular_core.InputSignal<number>;
356
+ readonly max: _angular_core.InputSignal<number>;
357
+ readonly step: _angular_core.InputSignal<number>;
358
+ readonly props: _angular_core.InputSignal<BsSliderProps | undefined>;
359
+ readonly validationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
360
+ readonly defaultValidationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
361
+ readonly resolvedErrors: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
362
+ readonly showErrors: _angular_core.Signal<boolean>;
363
+ readonly errorsToDisplay: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
364
+ protected readonly helpTextId: _angular_core.Signal<string>;
365
+ protected readonly errorId: _angular_core.Signal<string>;
366
+ protected readonly ariaInvalid: _angular_core.Signal<boolean>;
367
+ protected readonly ariaRequired: _angular_core.Signal<true | null>;
368
+ protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
369
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsSliderFieldComponent, never>;
370
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsSliderFieldComponent, "df-bs-slider", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "validationMessages": { "alias": "validationMessages"; "required": false; "isSignal": true; }; "defaultValidationMessages": { "alias": "defaultValidationMessages"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
371
+ }
372
+
373
+ interface BsTextareaProps extends TextareaProps {
374
+ rows?: number;
375
+ size?: 'sm' | 'lg';
376
+ floatingLabel?: boolean;
377
+ helpText?: DynamicText;
378
+ validFeedback?: DynamicText;
379
+ invalidFeedback?: DynamicText;
380
+ }
381
+ type BsTextareaField = TextareaField<BsTextareaProps>;
382
+ type BsTextareaComponent = ValueFieldComponent<BsTextareaField>;
383
+
384
+ declare class BsTextareaFieldComponent implements BsTextareaComponent {
385
+ readonly field: _angular_core.InputSignal<FieldTree<string>>;
386
+ readonly key: _angular_core.InputSignal<string>;
387
+ readonly label: _angular_core.InputSignal<DynamicText | undefined>;
388
+ readonly placeholder: _angular_core.InputSignal<DynamicText | undefined>;
389
+ readonly className: _angular_core.InputSignal<string>;
390
+ readonly tabIndex: _angular_core.InputSignal<number | undefined>;
391
+ readonly props: _angular_core.InputSignal<BsTextareaProps | undefined>;
392
+ readonly validationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
393
+ readonly defaultValidationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
394
+ readonly resolvedErrors: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
395
+ readonly showErrors: _angular_core.Signal<boolean>;
396
+ readonly errorsToDisplay: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
397
+ protected readonly helpTextId: _angular_core.Signal<string>;
398
+ protected readonly errorId: _angular_core.Signal<string>;
399
+ protected readonly ariaInvalid: _angular_core.Signal<boolean>;
400
+ protected readonly ariaRequired: _angular_core.Signal<true | null>;
401
+ protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
402
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsTextareaFieldComponent, never>;
403
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsTextareaFieldComponent, "df-bs-textarea", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "validationMessages": { "alias": "validationMessages"; "required": false; "isSignal": true; }; "defaultValidationMessages": { "alias": "defaultValidationMessages"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
404
+ }
405
+
406
+ interface BsToggleProps {
407
+ size?: 'sm' | 'lg';
408
+ reverse?: boolean;
409
+ inline?: boolean;
410
+ helpText?: DynamicText;
411
+ }
412
+ type BsToggleField = ToggleField<BsToggleProps>;
413
+ type BsToggleComponent = CheckedFieldComponent<BsToggleField>;
414
+
415
+ declare class BsToggleFieldComponent implements BsToggleComponent {
416
+ readonly field: _angular_core.InputSignal<FieldTree<boolean>>;
417
+ readonly key: _angular_core.InputSignal<string>;
418
+ readonly label: _angular_core.InputSignal<DynamicText | undefined>;
419
+ readonly placeholder: _angular_core.InputSignal<DynamicText | undefined>;
420
+ readonly className: _angular_core.InputSignal<string>;
421
+ readonly tabIndex: _angular_core.InputSignal<number | undefined>;
422
+ readonly props: _angular_core.InputSignal<BsToggleProps | undefined>;
423
+ readonly validationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
424
+ readonly defaultValidationMessages: _angular_core.InputSignal<ValidationMessages | undefined>;
425
+ readonly resolvedErrors: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
426
+ readonly showErrors: _angular_core.Signal<boolean>;
427
+ readonly errorsToDisplay: _angular_core.Signal<_ng_forge_dynamic_forms.ResolvedError[]>;
428
+ protected readonly helpTextId: _angular_core.Signal<string>;
429
+ protected readonly errorId: _angular_core.Signal<string>;
430
+ protected readonly ariaInvalid: _angular_core.Signal<boolean>;
431
+ protected readonly ariaRequired: _angular_core.Signal<true | null>;
432
+ protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
433
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsToggleFieldComponent, never>;
434
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsToggleFieldComponent, "df-bs-toggle", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "key": { "alias": "key"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "props": { "alias": "props"; "required": false; "isSignal": true; }; "validationMessages": { "alias": "validationMessages"; "required": false; "isSignal": true; }; "defaultValidationMessages": { "alias": "defaultValidationMessages"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
435
+ }
436
+
437
+ declare const BOOTSTRAP_FIELD_TYPES: FieldTypeDefinition[];
438
+
439
+ /**
440
+ * Configuration options for Bootstrap form fields.
441
+ * These settings will be applied as defaults to all Bootstrap form fields
442
+ * unless overridden by individual field props.
443
+ */
444
+ interface BootstrapConfig {
445
+ /**
446
+ * Default size for form controls
447
+ * @default undefined
448
+ */
449
+ size?: 'sm' | 'lg';
450
+ /**
451
+ * Whether to use floating labels by default for inputs
452
+ * @default false
453
+ */
454
+ floatingLabel?: boolean;
455
+ /**
456
+ * Default variant for buttons
457
+ * @default 'primary'
458
+ */
459
+ variant?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';
460
+ /**
461
+ * Whether buttons should be outlined by default
462
+ * @default false
463
+ */
464
+ outline?: boolean;
465
+ /**
466
+ * Whether buttons should be block-level by default
467
+ * @default false
468
+ */
469
+ block?: boolean;
470
+ }
471
+
472
+ /**
473
+ * Injection token for Bootstrap form configuration.
474
+ * Use this to provide global configuration for Bootstrap form fields.
475
+ *
476
+ * @example
477
+ * ```typescript
478
+ * import { provideDynamicForm } from '@ng-forge/dynamic-forms';
479
+ * import { withBootstrapFields } from '@ng-forge/dynamic-forms-bootstrap';
480
+ *
481
+ * export const appConfig: ApplicationConfig = {
482
+ * providers: [
483
+ * provideDynamicForm(
484
+ * ...withBootstrapFields({
485
+ * floatingLabel: true,
486
+ * size: 'lg'
487
+ * })
488
+ * )
489
+ * ]
490
+ * };
491
+ * ```
492
+ */
493
+ declare const BOOTSTRAP_CONFIG: InjectionToken<BootstrapConfig>;
494
+
495
+ /**
496
+ * Bootstrap field type constants
497
+ * Based on available field components in the /fields folder
498
+ */
499
+ declare const BsField: {
500
+ readonly Input: "input";
501
+ readonly Select: "select";
502
+ readonly Checkbox: "checkbox";
503
+ readonly Button: "button";
504
+ readonly Submit: "submit";
505
+ readonly Next: "next";
506
+ readonly Previous: "previous";
507
+ readonly AddArrayItem: "addArrayItem";
508
+ readonly RemoveArrayItem: "removeArrayItem";
509
+ readonly Textarea: "textarea";
510
+ readonly Radio: "radio";
511
+ readonly MultiCheckbox: "multi-checkbox";
512
+ readonly Datepicker: "datepicker";
513
+ readonly Slider: "slider";
514
+ readonly Toggle: "toggle";
515
+ };
516
+ type BsFieldType = (typeof BsField)[keyof typeof BsField];
517
+
518
+ /**
519
+ * Module augmentation for @ng-forge/dynamic-form
520
+ * This file augments the FieldRegistryLeaves interface to include
521
+ * all Bootstrap field types provided by this library.
522
+ */
523
+
524
+ declare module '@ng-forge/dynamic-forms' {
525
+ interface FieldRegistryLeaves {
526
+ input: BsInputField;
527
+ select: BsSelectField<unknown>;
528
+ checkbox: BsCheckboxField;
529
+ button: BsButtonField<FormEvent>;
530
+ submit: BsSubmitButtonField;
531
+ next: BsNextButtonField;
532
+ previous: BsPreviousButtonField;
533
+ addArrayItem: AddArrayItemButtonField;
534
+ removeArrayItem: RemoveArrayItemButtonField;
535
+ textarea: BsTextareaField;
536
+ radio: BsRadioField<unknown>;
537
+ 'multi-checkbox': BsMultiCheckboxField<unknown>;
538
+ datepicker: BsDatepickerField;
539
+ slider: BsSliderField;
540
+ toggle: BsToggleField;
541
+ }
542
+ }
543
+
544
+ /**
545
+ * Field type definitions with optional config providers
546
+ */
547
+ type FieldTypeDefinitionsWithConfig = FieldTypeDefinition[] & {
548
+ __configProviders?: Provider[];
549
+ };
550
+ /**
551
+ * Provides Bootstrap field types for the dynamic form system.
552
+ * Use with provideDynamicForm(...withBootstrapFields())
553
+ *
554
+ * @param config - Optional global configuration for Bootstrap form fields
555
+ *
556
+ * @example
557
+ * ```typescript
558
+ * // Application-level setup
559
+ * import { ApplicationConfig } from '@angular/core';
560
+ * import { provideDynamicForm } from '@ng-forge/dynamic-form';
561
+ * import { withBootstrapFields } from '@ng-forge/dynamic-form-bootstrap';
562
+ *
563
+ * export const appConfig: ApplicationConfig = {
564
+ * providers: [
565
+ * provideDynamicForm(...withBootstrapFields())
566
+ * ]
567
+ * };
568
+ * ```
569
+ *
570
+ * @example
571
+ * ```typescript
572
+ * // With global configuration
573
+ * export const appConfig: ApplicationConfig = {
574
+ * providers: [
575
+ * provideDynamicForm(
576
+ * ...withBootstrapFields({
577
+ * floatingLabel: true,
578
+ * size: 'lg'
579
+ * })
580
+ * )
581
+ * ]
582
+ * };
583
+ * ```
584
+ *
585
+ * @returns Array of field type definitions for Bootstrap components
586
+ */
587
+ declare function withBootstrapFields(config?: BootstrapConfig): FieldTypeDefinitionsWithConfig;
588
+
589
+ export { BOOTSTRAP_CONFIG, BOOTSTRAP_FIELD_TYPES, BsButtonFieldComponent, BsCheckboxFieldComponent, BsDatepickerFieldComponent, BsField, BsInputFieldComponent, BsMultiCheckboxFieldComponent, BsRadioFieldComponent, BsSelectFieldComponent, BsSliderFieldComponent, BsTextareaFieldComponent, BsToggleFieldComponent, withBootstrapFields };
590
+ export type { AddArrayItemButtonField, BootstrapConfig, BsButtonField, BsButtonProps, BsCheckboxComponent, BsCheckboxField, BsCheckboxProps, BsDatepickerComponent, BsDatepickerField, BsDatepickerProps, BsFieldType, BsInputComponent, BsInputField, BsInputProps, BsMultiCheckboxComponent, BsMultiCheckboxField, BsMultiCheckboxProps, BsNextButtonField, BsPreviousButtonField, BsRadioComponent, BsRadioField, BsRadioProps, BsSelectComponent, BsSelectField, BsSelectProps, BsSliderComponent, BsSliderField, BsSliderProps, BsSubmitButtonField, BsTextareaComponent, BsTextareaField, BsTextareaProps, BsToggleComponent, BsToggleField, BsToggleProps, RemoveArrayItemButtonField };