Configure global defaults for all forms at provider level, or per-form via defaultProps.
The Cascade
ng-forge applies props in priority order — more specific always wins:
withXxxFields({...})All formsdefaultPropsOne formpropsOne fieldConfig Options
Pass these to withMaterialFields({ ... }) for library-level defaults, or to defaultProps for form-level defaults.
| Option | Type | Default | Description |
|---|---|---|---|
appearance | 'fill' | 'outline' | 'outline' | Default appearance for Material form fields |
subscriptSizing | 'fixed' | 'dynamic' | 'dynamic' | Controls space reserved for hint/error messages |
disableRipple | boolean | false | Disable Material ripple effects on interactive controls |
color | 'primary' | 'accent' | 'warn' | 'primary' | Default theme color for checkboxes, radios, sliders, and toggles |
labelPosition | 'before' | 'after' | 'after' | Default label position for checkboxes and radios |
floatLabel | 'auto' | 'always' | 'never' | 'auto' | Default float label behavior for Material form fields ('auto', 'always', or 'never') |
hideRequiredMarker | boolean | false | Hide the required asterisk on form fields by default |
Library-level (provider)
provideDynamicForm(
...withMaterialFields({
appearance: 'outline',
subscriptSizing: 'dynamic',
color: 'primary',
disableRipple: false,
labelPosition: 'after',
})
)Form-level (defaultProps)
Use MatFormConfig from @ng-forge/dynamic-forms-material for type-safe defaultProps with autocomplete.
import { MatFormConfig } from '@ng-forge/dynamic-forms-material';
const config = {
defaultProps: {
appearance: 'fill', // overrides the library-level setting
color: 'accent',
},
fields: [
{ type: 'input', key: 'name', label: 'Name' },
// This field overrides at field level:
{ type: 'input', key: 'email', label: 'Email', props: { appearance: 'outline' } },
],
} as const satisfies MatFormConfig;Field-level Props
Each field type also accepts its own adapter-specific props. See Field Types for the full per-field reference.
Nullable values
Value fields accept an optional nullable?: boolean flag. When true:
valueacceptsnullin addition to the field's normal type (e.g.string | null).- An omitted
valueresolves tonullinstead of the type-specific empty default ('',NaN,[], …). nullablestays orthogonal torequired— they describe different layers.nullabledeclares that the model acceptsnull(data shape).requiredis a validation constraint. Angular'sValidators.requiredtreatsnullas invalid, so a field that is bothnullableandrequiredwill fail required-validation when the value isnull. The flags are independent OpenAPI concepts; combine them if that matches your schema, but understand the runtime interaction.
{
key: 'middleName',
type: 'input',
label: 'Middle Name',
nullable: true,
value: null, // allowed; also the resolved default when omitted
}Read-side caveat. A user clearing a text input reads back as "", not null — this is a DOM/Web IDL contract, identical to classic Reactive Forms. nullable is a contract for accepted values, not a guarantee of emitted ones. If your backend distinguishes null from empty string, handle the coercion at submission.
Next Steps
- Examples — Browse complete form examples
- Field Types — Per-field adapter props reference
- Building an Adapter — Build your own adapter