@ng-forge/dynamic-forms-material 0.6.1 → 0.8.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -65,21 +65,21 @@ function createAriaDescribedBySignal(errorsToDisplay, errorId, hintId, hasHint)
65
65
  class MatCheckboxFieldComponent {
66
66
  materialConfig = inject(MATERIAL_CONFIG, { optional: true });
67
67
  elementRef = inject((ElementRef));
68
- field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
69
- key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
68
+ field = input.required(...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
69
+ key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
70
70
  // Properties
71
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
72
- placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : []));
73
- className = input('', ...(ngDevMode ? [{ debugName: "className" }] : []));
74
- tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : []));
75
- props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
76
- meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : []));
77
- validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : []));
78
- defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : []));
79
- effectiveDisableRipple = computed(() => this.props()?.disableRipple ?? this.materialConfig?.disableRipple ?? false, ...(ngDevMode ? [{ debugName: "effectiveDisableRipple" }] : []));
71
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
72
+ placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
73
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
74
+ tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : /* istanbul ignore next */ []));
75
+ props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : /* istanbul ignore next */ []));
76
+ meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : /* istanbul ignore next */ []));
77
+ validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
78
+ defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : /* istanbul ignore next */ []));
79
+ effectiveDisableRipple = computed(() => this.props()?.disableRipple ?? this.materialConfig?.disableRipple ?? false, ...(ngDevMode ? [{ debugName: "effectiveDisableRipple" }] : /* istanbul ignore next */ []));
80
80
  resolvedErrors = createResolvedErrorsSignal(this.field, this.validationMessages, this.defaultValidationMessages);
81
81
  showErrors = shouldShowErrors(this.field);
82
- errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : []));
82
+ errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : /* istanbul ignore next */ []));
83
83
  constructor() {
84
84
  // Apply meta attributes to the internal checkbox input
85
85
  setupMetaTracking(this.elementRef, this.meta, {
@@ -90,18 +90,18 @@ class MatCheckboxFieldComponent {
90
90
  // Accessibility
91
91
  // ─────────────────────────────────────────────────────────────────────────────
92
92
  /** Unique ID for the hint element, used for aria-describedby */
93
- hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : []));
93
+ hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : /* istanbul ignore next */ []));
94
94
  /** Base ID for error elements, used for aria-describedby */
95
- errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : []));
95
+ errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []));
96
96
  /** aria-invalid: true when field is invalid AND touched, false otherwise */
97
97
  ariaInvalid = computed(() => {
98
98
  const fieldState = this.field()();
99
99
  return fieldState.invalid() && fieldState.touched();
100
- }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : []));
100
+ }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
101
101
  /** aria-required: true if field is required, null otherwise (to remove attribute) */
102
102
  ariaRequired = computed(() => {
103
103
  return this.field()().required?.() === true ? true : null;
104
- }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : []));
104
+ }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : /* istanbul ignore next */ []));
105
105
  /** aria-describedby: links to hint and error messages for screen readers */
106
106
  ariaDescribedBy = createAriaDescribedBySignal(this.errorsToDisplay, this.errorId, this.hintId, () => !!this.props()?.hint);
107
107
  /**
@@ -144,8 +144,8 @@ class MatCheckboxFieldComponent {
144
144
  }
145
145
  }
146
146
  });
147
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatCheckboxFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
148
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MatCheckboxFieldComponent, isStandalone: true, selector: "df-mat-checkbox", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "className()", "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
147
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatCheckboxFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
148
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MatCheckboxFieldComponent, isStandalone: true, selector: "df-mat-checkbox", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "className()", "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
149
149
  @let f = field();
150
150
  @let checkboxId = key() + '-checkbox';
151
151
 
@@ -171,7 +171,7 @@ class MatCheckboxFieldComponent {
171
171
  }
172
172
  `, isInline: true, styles: [":host{--df-field-gap: .5rem;--df-label-font-weight: 500;--df-label-color: inherit;--df-hint-color: rgba(0, 0, 0, .6);--df-hint-font-size: .875rem;--df-error-color: #f44336;--df-error-font-size: .875rem;display:block;width:100%}:host([hidden]){display:none!important}.df-mat-field{display:flex;flex-direction:column;gap:var(--df-field-gap);width:100%}.df-mat-label{font-weight:var(--df-label-font-weight);color:var(--df-label-color)}.df-mat-hint{color:var(--df-hint-color);font-size:var(--df-hint-font-size)}.df-mat-error{color:var(--df-error-color);font-size:var(--df-error-font-size)}\n"], dependencies: [{ kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
173
173
  }
174
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatCheckboxFieldComponent, decorators: [{
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatCheckboxFieldComponent, decorators: [{
175
175
  type: Component,
176
176
  args: [{ selector: 'df-mat-checkbox', imports: [MatCheckbox, FormField, MatError, DynamicTextPipe, AsyncPipe], template: `
177
177
  @let f = field();
@@ -213,51 +213,58 @@ var matCheckbox_component = /*#__PURE__*/Object.freeze({
213
213
  class MatDatepickerFieldComponent {
214
214
  materialConfig = inject(MATERIAL_CONFIG, { optional: true });
215
215
  elementRef = inject((ElementRef));
216
- field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
217
- key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
216
+ field = input.required(...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
217
+ key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
218
218
  constructor() {
219
219
  setupMetaTracking(this.elementRef, this.meta, { selector: 'input' });
220
220
  }
221
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
222
- placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : []));
223
- className = input('', ...(ngDevMode ? [{ debugName: "className" }] : []));
224
- tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : []));
225
- minDate = input(null, ...(ngDevMode ? [{ debugName: "minDate" }] : []));
226
- maxDate = input(null, ...(ngDevMode ? [{ debugName: "maxDate" }] : []));
227
- startAt = input(null, ...(ngDevMode ? [{ debugName: "startAt" }] : []));
228
- props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
229
- meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : []));
230
- validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : []));
231
- defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : []));
232
- effectiveAppearance = computed(() => this.props()?.appearance ?? this.materialConfig?.appearance ?? 'outline', ...(ngDevMode ? [{ debugName: "effectiveAppearance" }] : []));
233
- effectiveSubscriptSizing = computed(() => this.props()?.subscriptSizing ?? this.materialConfig?.subscriptSizing ?? 'dynamic', ...(ngDevMode ? [{ debugName: "effectiveSubscriptSizing" }] : []));
221
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
222
+ placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
223
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
224
+ tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : /* istanbul ignore next */ []));
225
+ minDate = input(null, ...(ngDevMode ? [{ debugName: "minDate" }] : /* istanbul ignore next */ []));
226
+ maxDate = input(null, ...(ngDevMode ? [{ debugName: "maxDate" }] : /* istanbul ignore next */ []));
227
+ startAt = input(null, ...(ngDevMode ? [{ debugName: "startAt" }] : /* istanbul ignore next */ []));
228
+ props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : /* istanbul ignore next */ []));
229
+ meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : /* istanbul ignore next */ []));
230
+ validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
231
+ defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : /* istanbul ignore next */ []));
232
+ effectiveAppearance = computed(() => this.props()?.appearance ?? this.materialConfig?.appearance ?? 'outline', ...(ngDevMode ? [{ debugName: "effectiveAppearance" }] : /* istanbul ignore next */ []));
233
+ effectiveSubscriptSizing = computed(() => this.props()?.subscriptSizing ?? this.materialConfig?.subscriptSizing ?? 'dynamic', ...(ngDevMode ? [{ debugName: "effectiveSubscriptSizing" }] : /* istanbul ignore next */ []));
234
+ effectiveFloatLabel = computed(() => this.props()?.floatLabel ?? this.materialConfig?.floatLabel ?? 'auto', ...(ngDevMode ? [{ debugName: "effectiveFloatLabel" }] : /* istanbul ignore next */ []));
235
+ effectiveHideRequiredMarker = computed(() => this.props()?.hideRequiredMarker ?? this.materialConfig?.hideRequiredMarker ?? false, ...(ngDevMode ? [{ debugName: "effectiveHideRequiredMarker" }] : /* istanbul ignore next */ []));
234
236
  resolvedErrors = createResolvedErrorsSignal(this.field, this.validationMessages, this.defaultValidationMessages);
235
237
  showErrors = shouldShowErrors(this.field);
236
- errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : []));
238
+ errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : /* istanbul ignore next */ []));
237
239
  // ─────────────────────────────────────────────────────────────────────────────
238
240
  // Accessibility
239
241
  // ─────────────────────────────────────────────────────────────────────────────
240
242
  /** Unique ID for the hint element, used for aria-describedby */
241
- hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : []));
243
+ hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : /* istanbul ignore next */ []));
242
244
  /** Base ID for error elements, used for aria-describedby */
243
- errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : []));
245
+ errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []));
244
246
  /** aria-invalid: true when field is invalid AND touched, false otherwise */
245
247
  ariaInvalid = computed(() => {
246
248
  const fieldState = this.field()();
247
249
  return fieldState.invalid() && fieldState.touched();
248
- }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : []));
250
+ }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
249
251
  /** aria-required: true if field is required, null otherwise (to remove attribute) */
250
252
  ariaRequired = computed(() => {
251
253
  return this.field()().required?.() === true ? true : null;
252
- }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : []));
254
+ }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : /* istanbul ignore next */ []));
253
255
  /** aria-describedby: links to hint and error messages for screen readers */
254
256
  ariaDescribedBy = createAriaDescribedBySignal(this.errorsToDisplay, this.errorId, this.hintId, () => !!this.props()?.hint);
255
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatDatepickerFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
256
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MatDatepickerFieldComponent, isStandalone: true, selector: "df-mat-datepicker", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "class": "className()", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, providers: [provideNativeDateAdapter()], ngImport: i0, template: `
257
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatDatepickerFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
258
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MatDatepickerFieldComponent, isStandalone: true, selector: "df-mat-datepicker", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "class": "className()", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, providers: [provideNativeDateAdapter()], ngImport: i0, template: `
257
259
  @let f = field();
258
260
  @let inputId = key() + '-input';
259
261
 
260
- <mat-form-field [appearance]="effectiveAppearance()" [subscriptSizing]="effectiveSubscriptSizing()">
262
+ <mat-form-field
263
+ [appearance]="effectiveAppearance()"
264
+ [subscriptSizing]="effectiveSubscriptSizing()"
265
+ [floatLabel]="effectiveFloatLabel()"
266
+ [hideRequiredMarker]="effectiveHideRequiredMarker()"
267
+ >
261
268
  @if (label(); as label) {
262
269
  <mat-label>{{ label | dynamicText | async }}</mat-label>
263
270
  }
@@ -287,7 +294,7 @@ class MatDatepickerFieldComponent {
287
294
  </mat-form-field>
288
295
  `, isInline: true, styles: [":host{--df-field-gap: .5rem;--df-label-font-weight: 500;--df-label-color: inherit;--df-hint-color: rgba(0, 0, 0, .6);--df-hint-font-size: .875rem;--df-error-color: #f44336;--df-error-font-size: .875rem;display:block;width:100%}:host([hidden]){display:none!important}.df-mat-field{display:flex;flex-direction:column;gap:var(--df-field-gap);width:100%}.df-mat-label{font-weight:var(--df-label-font-weight);color:var(--df-label-color)}.df-mat-hint{color:var(--df-hint-color);font-size:var(--df-hint-font-size)}.df-mat-error{color:var(--df-error-color);font-size:var(--df-error-font-size)}\n", "mat-form-field{width:100%}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "directive", type: MatError$1, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
289
296
  }
290
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatDatepickerFieldComponent, decorators: [{
297
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatDatepickerFieldComponent, decorators: [{
291
298
  type: Component,
292
299
  args: [{ selector: 'df-mat-datepicker', imports: [
293
300
  MatFormField,
@@ -311,7 +318,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
311
318
  @let f = field();
312
319
  @let inputId = key() + '-input';
313
320
 
314
- <mat-form-field [appearance]="effectiveAppearance()" [subscriptSizing]="effectiveSubscriptSizing()">
321
+ <mat-form-field
322
+ [appearance]="effectiveAppearance()"
323
+ [subscriptSizing]="effectiveSubscriptSizing()"
324
+ [floatLabel]="effectiveFloatLabel()"
325
+ [hideRequiredMarker]="effectiveHideRequiredMarker()"
326
+ >
315
327
  @if (label(); as label) {
316
328
  <mat-label>{{ label | dynamicText | async }}</mat-label>
317
329
  }
@@ -350,16 +362,16 @@ var matDatepicker_component = /*#__PURE__*/Object.freeze({
350
362
  class MatInputFieldComponent {
351
363
  materialConfig = inject(MATERIAL_CONFIG, { optional: true });
352
364
  elementRef = inject((ElementRef));
353
- field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
354
- key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
355
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
356
- placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : []));
357
- className = input('', ...(ngDevMode ? [{ debugName: "className" }] : []));
358
- tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : []));
359
- props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
360
- meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : []));
361
- validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : []));
362
- defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : []));
365
+ field = input.required(...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
366
+ key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
367
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
368
+ placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
369
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
370
+ tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : /* istanbul ignore next */ []));
371
+ props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : /* istanbul ignore next */ []));
372
+ meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : /* istanbul ignore next */ []));
373
+ validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
374
+ defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : /* istanbul ignore next */ []));
363
375
  constructor() {
364
376
  setupMetaTracking(this.elementRef, this.meta, { selector: 'input' });
365
377
  }
@@ -368,12 +380,12 @@ class MatInputFieldComponent {
368
380
  * Used to imperatively sync the readonly attribute since Angular Signal Forms'
369
381
  * [field] directive doesn't sync FieldState.readonly() to the DOM.
370
382
  */
371
- inputRef = viewChild('inputRef', ...(ngDevMode ? [{ debugName: "inputRef" }] : []));
383
+ inputRef = viewChild('inputRef', ...(ngDevMode ? [{ debugName: "inputRef" }] : /* istanbul ignore next */ []));
372
384
  /**
373
385
  * Computed signal that extracts the readonly state from the field.
374
386
  * Used by the effect to reactively sync the readonly attribute to the DOM.
375
387
  */
376
- isReadonly = computed(() => this.field()().readonly(), ...(ngDevMode ? [{ debugName: "isReadonly" }] : []));
388
+ isReadonly = computed(() => this.field()().readonly(), ...(ngDevMode ? [{ debugName: "isReadonly" }] : /* istanbul ignore next */ []));
377
389
  /**
378
390
  * Workaround: Angular Signal Forms' [field] directive does NOT sync the readonly
379
391
  * attribute to the DOM, even though FieldState.readonly() returns the correct value.
@@ -401,35 +413,42 @@ class MatInputFieldComponent {
401
413
  }
402
414
  },
403
415
  });
404
- effectiveAppearance = computed(() => this.props()?.appearance ?? this.materialConfig?.appearance ?? 'outline', ...(ngDevMode ? [{ debugName: "effectiveAppearance" }] : []));
405
- effectiveSubscriptSizing = computed(() => this.props()?.subscriptSizing ?? this.materialConfig?.subscriptSizing ?? 'dynamic', ...(ngDevMode ? [{ debugName: "effectiveSubscriptSizing" }] : []));
416
+ effectiveAppearance = computed(() => this.props()?.appearance ?? this.materialConfig?.appearance ?? 'outline', ...(ngDevMode ? [{ debugName: "effectiveAppearance" }] : /* istanbul ignore next */ []));
417
+ effectiveSubscriptSizing = computed(() => this.props()?.subscriptSizing ?? this.materialConfig?.subscriptSizing ?? 'dynamic', ...(ngDevMode ? [{ debugName: "effectiveSubscriptSizing" }] : /* istanbul ignore next */ []));
418
+ effectiveFloatLabel = computed(() => this.props()?.floatLabel ?? this.materialConfig?.floatLabel ?? 'auto', ...(ngDevMode ? [{ debugName: "effectiveFloatLabel" }] : /* istanbul ignore next */ []));
419
+ effectiveHideRequiredMarker = computed(() => this.props()?.hideRequiredMarker ?? this.materialConfig?.hideRequiredMarker ?? false, ...(ngDevMode ? [{ debugName: "effectiveHideRequiredMarker" }] : /* istanbul ignore next */ []));
406
420
  resolvedErrors = createResolvedErrorsSignal(this.field, this.validationMessages, this.defaultValidationMessages);
407
421
  showErrors = shouldShowErrors(this.field);
408
- errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : []));
422
+ errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : /* istanbul ignore next */ []));
409
423
  // ─────────────────────────────────────────────────────────────────────────────
410
424
  // Accessibility
411
425
  // ─────────────────────────────────────────────────────────────────────────────
412
426
  /** Unique ID for the hint element, used for aria-describedby */
413
- hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : []));
427
+ hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : /* istanbul ignore next */ []));
414
428
  /** Base ID for error elements, used for aria-describedby */
415
- errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : []));
429
+ errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []));
416
430
  /** aria-invalid: true when field is invalid AND touched, false otherwise */
417
431
  ariaInvalid = computed(() => {
418
432
  const fieldState = this.field()();
419
433
  return fieldState.invalid() && fieldState.touched();
420
- }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : []));
434
+ }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
421
435
  /** aria-required: true if field is required, null otherwise (to remove attribute) */
422
436
  ariaRequired = computed(() => {
423
437
  return this.field()().required?.() === true ? true : null;
424
- }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : []));
438
+ }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : /* istanbul ignore next */ []));
425
439
  /** aria-describedby: links to hint and error messages for screen readers */
426
440
  ariaDescribedBy = createAriaDescribedBySignal(this.errorsToDisplay, this.errorId, this.hintId, () => !!this.props()?.hint);
427
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatInputFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
428
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MatInputFieldComponent, isStandalone: true, selector: "df-mat-input", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "attr.data-testid": "key()", "class": "className()", "attr.hidden": "field()().hidden() || null" } }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
441
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatInputFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
442
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MatInputFieldComponent, isStandalone: true, selector: "df-mat-input", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "attr.data-testid": "key()", "class": "className()", "attr.hidden": "field()().hidden() || null" } }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
429
443
  @let f = field();
430
444
  @let inputId = key() + '-input';
431
445
 
432
- <mat-form-field [appearance]="effectiveAppearance()" [subscriptSizing]="effectiveSubscriptSizing()">
446
+ <mat-form-field
447
+ [appearance]="effectiveAppearance()"
448
+ [subscriptSizing]="effectiveSubscriptSizing()"
449
+ [floatLabel]="effectiveFloatLabel()"
450
+ [hideRequiredMarker]="effectiveHideRequiredMarker()"
451
+ >
433
452
  @if (label()) {
434
453
  <mat-label>{{ label() | dynamicText | async }}</mat-label>
435
454
  }
@@ -453,13 +472,18 @@ class MatInputFieldComponent {
453
472
  </mat-form-field>
454
473
  `, isInline: true, styles: [":host{--df-field-gap: .5rem;--df-label-font-weight: 500;--df-label-color: inherit;--df-hint-color: rgba(0, 0, 0, .6);--df-hint-font-size: .875rem;--df-error-color: #f44336;--df-error-font-size: .875rem;display:block;width:100%}:host([hidden]){display:none!important}.df-mat-field{display:flex;flex-direction:column;gap:var(--df-field-gap);width:100%}.df-mat-label{font-weight:var(--df-label-font-weight);color:var(--df-label-color)}.df-mat-hint{color:var(--df-hint-color);font-size:var(--df-hint-font-size)}.df-mat-error{color:var(--df-error-color);font-size:var(--df-error-font-size)}\n", "mat-form-field{width:100%}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "directive", type: MatError$1, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
455
474
  }
456
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatInputFieldComponent, decorators: [{
475
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatInputFieldComponent, decorators: [{
457
476
  type: Component,
458
477
  args: [{ selector: 'df-mat-input', imports: [MatFormField, MatLabel, MatInput, MatHint, FormField, MatError$1, DynamicTextPipe, AsyncPipe], template: `
459
478
  @let f = field();
460
479
  @let inputId = key() + '-input';
461
480
 
462
- <mat-form-field [appearance]="effectiveAppearance()" [subscriptSizing]="effectiveSubscriptSizing()">
481
+ <mat-form-field
482
+ [appearance]="effectiveAppearance()"
483
+ [subscriptSizing]="effectiveSubscriptSizing()"
484
+ [floatLabel]="effectiveFloatLabel()"
485
+ [hideRequiredMarker]="effectiveHideRequiredMarker()"
486
+ >
463
487
  @if (label()) {
464
488
  <mat-label>{{ label() | dynamicText | async }}</mat-label>
465
489
  }
@@ -496,19 +520,19 @@ var matInput_component = /*#__PURE__*/Object.freeze({
496
520
 
497
521
  class MatMultiCheckboxFieldComponent {
498
522
  elementRef = inject((ElementRef));
499
- field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
500
- key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
501
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
502
- placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : []));
503
- className = input('', ...(ngDevMode ? [{ debugName: "className" }] : []));
504
- tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : []));
505
- options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
506
- props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
507
- meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : []));
523
+ field = input.required(...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
524
+ key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
525
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
526
+ placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
527
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
528
+ tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : /* istanbul ignore next */ []));
529
+ options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
530
+ props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : /* istanbul ignore next */ []));
531
+ meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : /* istanbul ignore next */ []));
508
532
  valueViewModel = linkedSignal(() => {
509
533
  const currentValues = this.field()().value();
510
534
  return this.options().filter((option) => currentValues.includes(option.value));
511
- }, { ...(ngDevMode ? { debugName: "valueViewModel" } : {}), equal: isEqual });
535
+ }, { ...(ngDevMode ? { debugName: "valueViewModel" } : /* istanbul ignore next */ {}), equal: isEqual });
512
536
  /** Computed map of checked option values for O(1) lookup in template */
513
537
  checkedValuesMap = computed(() => {
514
538
  const map = {};
@@ -516,7 +540,7 @@ class MatMultiCheckboxFieldComponent {
516
540
  map[String(opt.value)] = true;
517
541
  }
518
542
  return map;
519
- }, ...(ngDevMode ? [{ debugName: "checkedValuesMap" }] : []));
543
+ }, ...(ngDevMode ? [{ debugName: "checkedValuesMap" }] : /* istanbul ignore next */ []));
520
544
  constructor() {
521
545
  // Apply meta attributes to all checkbox inputs, re-apply when options change
522
546
  setupMetaTracking(this.elementRef, this.meta, {
@@ -548,31 +572,31 @@ class MatMultiCheckboxFieldComponent {
548
572
  }
549
573
  });
550
574
  }
551
- validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : []));
552
- defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : []));
575
+ validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
576
+ defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : /* istanbul ignore next */ []));
553
577
  resolvedErrors = createResolvedErrorsSignal(this.field, this.validationMessages, this.defaultValidationMessages);
554
578
  showErrors = shouldShowErrors(this.field);
555
- errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : []));
579
+ errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : /* istanbul ignore next */ []));
556
580
  // ─────────────────────────────────────────────────────────────────────────────
557
581
  // Accessibility
558
582
  // ─────────────────────────────────────────────────────────────────────────────
559
583
  /** Unique ID for the hint element, used for aria-describedby */
560
- hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : []));
584
+ hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : /* istanbul ignore next */ []));
561
585
  /** Base ID for error elements, used for aria-describedby */
562
- errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : []));
586
+ errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []));
563
587
  /** aria-invalid: true when field is invalid AND touched, false otherwise */
564
588
  ariaInvalid = computed(() => {
565
589
  const fieldState = this.field()();
566
590
  return fieldState.invalid() && fieldState.touched();
567
- }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : []));
591
+ }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
568
592
  /** aria-required: true if field is required, null otherwise (to remove attribute) */
569
593
  ariaRequired = computed(() => {
570
594
  return this.field()().required?.() === true ? true : null;
571
- }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : []));
595
+ }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : /* istanbul ignore next */ []));
572
596
  /** aria-describedby: links to hint and error messages for screen readers */
573
597
  ariaDescribedBy = createAriaDescribedBySignal(this.errorsToDisplay, this.errorId, this.hintId, () => !!this.props()?.hint);
574
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatMultiCheckboxFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
575
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MatMultiCheckboxFieldComponent, isStandalone: true, selector: "df-mat-multi-checkbox", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "className() || \"\"", "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
598
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatMultiCheckboxFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
599
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MatMultiCheckboxFieldComponent, isStandalone: true, selector: "df-mat-multi-checkbox", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "className() || \"\"", "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
576
600
  @let f = field();
577
601
  @let checkboxGroupId = key() + '-checkbox-group';
578
602
  @let checked = checkedValuesMap();
@@ -609,7 +633,7 @@ class MatMultiCheckboxFieldComponent {
609
633
  }
610
634
  `, isInline: true, styles: [":host{--df-field-gap: .5rem;--df-label-font-weight: 500;--df-label-color: inherit;--df-hint-color: rgba(0, 0, 0, .6);--df-hint-font-size: .875rem;--df-error-color: #f44336;--df-error-font-size: .875rem;display:block;width:100%}:host([hidden]){display:none!important}.df-mat-field{display:flex;flex-direction:column;gap:var(--df-field-gap);width:100%}.df-mat-label{font-weight:var(--df-label-font-weight);color:var(--df-label-color)}.df-mat-hint{color:var(--df-hint-color);font-size:var(--df-hint-font-size)}.df-mat-error{color:var(--df-error-color);font-size:var(--df-error-font-size)}\n"], dependencies: [{ kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
611
635
  }
612
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatMultiCheckboxFieldComponent, decorators: [{
636
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatMultiCheckboxFieldComponent, decorators: [{
613
637
  type: Component,
614
638
  args: [{ selector: 'df-mat-multi-checkbox', imports: [MatCheckbox, MatError, DynamicTextPipe, AsyncPipe], template: `
615
639
  @let f = field();
@@ -661,20 +685,20 @@ var matMultiCheckbox_component = /*#__PURE__*/Object.freeze({
661
685
 
662
686
  class MatRadioFieldComponent {
663
687
  elementRef = inject((ElementRef));
664
- field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
665
- key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
666
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
667
- placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : []));
668
- className = input('', ...(ngDevMode ? [{ debugName: "className" }] : []));
669
- tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : []));
670
- options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
671
- props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
672
- meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : []));
673
- validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : []));
674
- defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : []));
688
+ field = input.required(...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
689
+ key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
690
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
691
+ placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
692
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
693
+ tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : /* istanbul ignore next */ []));
694
+ options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
695
+ props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : /* istanbul ignore next */ []));
696
+ meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : /* istanbul ignore next */ []));
697
+ validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
698
+ defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : /* istanbul ignore next */ []));
675
699
  resolvedErrors = createResolvedErrorsSignal(this.field, this.validationMessages, this.defaultValidationMessages);
676
700
  showErrors = shouldShowErrors(this.field);
677
- errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : []));
701
+ errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : /* istanbul ignore next */ []));
678
702
  constructor() {
679
703
  // Apply meta attributes to all radio inputs, re-apply when options change
680
704
  setupMetaTracking(this.elementRef, this.meta, {
@@ -686,22 +710,22 @@ class MatRadioFieldComponent {
686
710
  // Accessibility
687
711
  // ─────────────────────────────────────────────────────────────────────────────
688
712
  /** Unique ID for the hint element, used for aria-describedby */
689
- hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : []));
713
+ hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : /* istanbul ignore next */ []));
690
714
  /** Base ID for error elements, used for aria-describedby */
691
- errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : []));
715
+ errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []));
692
716
  /** aria-invalid: true when field is invalid AND touched, false otherwise */
693
717
  ariaInvalid = computed(() => {
694
718
  const fieldState = this.field()();
695
719
  return fieldState.invalid() && fieldState.touched();
696
- }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : []));
720
+ }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
697
721
  /** aria-required: true if field is required, null otherwise (to remove attribute) */
698
722
  ariaRequired = computed(() => {
699
723
  return this.field()().required?.() === true ? true : null;
700
- }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : []));
724
+ }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : /* istanbul ignore next */ []));
701
725
  /** aria-describedby: links to hint and error messages for screen readers */
702
726
  ariaDescribedBy = createAriaDescribedBySignal(this.errorsToDisplay, this.errorId, this.hintId, () => !!this.props()?.hint);
703
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatRadioFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
704
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MatRadioFieldComponent, isStandalone: true, selector: "df-mat-radio", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "className() || \"\"", "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
727
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatRadioFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
728
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MatRadioFieldComponent, isStandalone: true, selector: "df-mat-radio", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "className() || \"\"", "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
705
729
  @let f = field();
706
730
  @let radioGroupId = key() + '-radio-group';
707
731
 
@@ -735,7 +759,7 @@ class MatRadioFieldComponent {
735
759
  }
736
760
  `, isInline: true, styles: [":host{--df-field-gap: .5rem;--df-label-font-weight: 500;--df-label-color: inherit;--df-hint-color: rgba(0, 0, 0, .6);--df-hint-font-size: .875rem;--df-error-color: #f44336;--df-error-font-size: .875rem;display:block;width:100%}:host([hidden]){display:none!important}.df-mat-field{display:flex;flex-direction:column;gap:var(--df-field-gap);width:100%}.df-mat-label{font-weight:var(--df-label-font-weight);color:var(--df-label-color)}.df-mat-hint{color:var(--df-hint-color);font-size:var(--df-hint-font-size)}.df-mat-error{color:var(--df-error-color);font-size:var(--df-error-font-size)}\n"], dependencies: [{ kind: "directive", type: MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
737
761
  }
738
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatRadioFieldComponent, decorators: [{
762
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatRadioFieldComponent, decorators: [{
739
763
  type: Component,
740
764
  args: [{ selector: 'df-mat-radio', imports: [MatRadioGroup, MatRadioButton, FormField, MatError, DynamicTextPipe, AsyncPipe], template: `
741
765
  @let f = field();
@@ -785,22 +809,24 @@ var matRadio_component = /*#__PURE__*/Object.freeze({
785
809
  class MatSelectFieldComponent {
786
810
  materialConfig = inject(MATERIAL_CONFIG, { optional: true });
787
811
  elementRef = inject((ElementRef));
788
- field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
789
- key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
790
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
791
- placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : []));
792
- className = input('', ...(ngDevMode ? [{ debugName: "className" }] : []));
793
- tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : []));
794
- options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
795
- props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
796
- meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : []));
797
- validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : []));
798
- defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : []));
799
- effectiveAppearance = computed(() => this.props()?.appearance ?? this.materialConfig?.appearance ?? 'outline', ...(ngDevMode ? [{ debugName: "effectiveAppearance" }] : []));
800
- effectiveSubscriptSizing = computed(() => this.props()?.subscriptSizing ?? this.materialConfig?.subscriptSizing ?? 'dynamic', ...(ngDevMode ? [{ debugName: "effectiveSubscriptSizing" }] : []));
812
+ field = input.required(...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
813
+ key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
814
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
815
+ placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
816
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
817
+ tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : /* istanbul ignore next */ []));
818
+ options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
819
+ props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : /* istanbul ignore next */ []));
820
+ meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : /* istanbul ignore next */ []));
821
+ validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
822
+ defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : /* istanbul ignore next */ []));
823
+ effectiveAppearance = computed(() => this.props()?.appearance ?? this.materialConfig?.appearance ?? 'outline', ...(ngDevMode ? [{ debugName: "effectiveAppearance" }] : /* istanbul ignore next */ []));
824
+ effectiveSubscriptSizing = computed(() => this.props()?.subscriptSizing ?? this.materialConfig?.subscriptSizing ?? 'dynamic', ...(ngDevMode ? [{ debugName: "effectiveSubscriptSizing" }] : /* istanbul ignore next */ []));
825
+ effectiveFloatLabel = computed(() => this.props()?.floatLabel ?? this.materialConfig?.floatLabel ?? 'auto', ...(ngDevMode ? [{ debugName: "effectiveFloatLabel" }] : /* istanbul ignore next */ []));
826
+ effectiveHideRequiredMarker = computed(() => this.props()?.hideRequiredMarker ?? this.materialConfig?.hideRequiredMarker ?? false, ...(ngDevMode ? [{ debugName: "effectiveHideRequiredMarker" }] : /* istanbul ignore next */ []));
801
827
  resolvedErrors = createResolvedErrorsSignal(this.field, this.validationMessages, this.defaultValidationMessages);
802
828
  showErrors = shouldShowErrors(this.field);
803
- errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : []));
829
+ errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : /* istanbul ignore next */ []));
804
830
  defaultCompare = Object.is;
805
831
  constructor() {
806
832
  // mat-select has no native input - apply meta to mat-select element
@@ -812,26 +838,31 @@ class MatSelectFieldComponent {
812
838
  // Accessibility
813
839
  // ─────────────────────────────────────────────────────────────────────────────
814
840
  /** Unique ID for the hint element, used for aria-describedby */
815
- hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : []));
841
+ hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : /* istanbul ignore next */ []));
816
842
  /** Base ID for error elements, used for aria-describedby */
817
- errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : []));
843
+ errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []));
818
844
  /** aria-invalid: true when field is invalid AND touched, false otherwise */
819
845
  ariaInvalid = computed(() => {
820
846
  const fieldState = this.field()();
821
847
  return fieldState.invalid() && fieldState.touched();
822
- }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : []));
848
+ }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
823
849
  /** aria-required: true if field is required, null otherwise (to remove attribute) */
824
850
  ariaRequired = computed(() => {
825
851
  return this.field()().required?.() === true ? true : null;
826
- }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : []));
852
+ }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : /* istanbul ignore next */ []));
827
853
  /** aria-describedby: links to hint and error messages for screen readers */
828
854
  ariaDescribedBy = createAriaDescribedBySignal(this.errorsToDisplay, this.errorId, this.hintId, () => !!this.props()?.hint);
829
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatSelectFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
830
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MatSelectFieldComponent, isStandalone: true, selector: "df-mat-select", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "attr.data-testid": "key()", "class": "className()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
855
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatSelectFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
856
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MatSelectFieldComponent, isStandalone: true, selector: "df-mat-select", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "attr.data-testid": "key()", "class": "className()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
831
857
  @let f = field();
832
858
  @let selectId = key() + '-select';
833
859
 
834
- <mat-form-field [appearance]="effectiveAppearance()" [subscriptSizing]="effectiveSubscriptSizing()">
860
+ <mat-form-field
861
+ [appearance]="effectiveAppearance()"
862
+ [subscriptSizing]="effectiveSubscriptSizing()"
863
+ [floatLabel]="effectiveFloatLabel()"
864
+ [hideRequiredMarker]="effectiveHideRequiredMarker()"
865
+ >
835
866
  @if (label(); as label) {
836
867
  <mat-label>{{ label | dynamicText | async }}</mat-label>
837
868
  }
@@ -861,13 +892,18 @@ class MatSelectFieldComponent {
861
892
  </mat-form-field>
862
893
  `, isInline: true, styles: [":host{--df-field-gap: .5rem;--df-label-font-weight: 500;--df-label-color: inherit;--df-hint-color: rgba(0, 0, 0, .6);--df-hint-font-size: .875rem;--df-error-color: #f44336;--df-error-font-size: .875rem;display:block;width:100%}:host([hidden]){display:none!important}.df-mat-field{display:flex;flex-direction:column;gap:var(--df-field-gap);width:100%}.df-mat-label{font-weight:var(--df-label-font-weight);color:var(--df-label-color)}.df-mat-hint{color:var(--df-hint-color);font-size:var(--df-hint-font-size)}.df-mat-error{color:var(--df-error-color);font-size:var(--df-error-font-size)}\n", "mat-form-field{width:100%}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "directive", type: MatError$1, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
863
894
  }
864
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatSelectFieldComponent, decorators: [{
895
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatSelectFieldComponent, decorators: [{
865
896
  type: Component,
866
897
  args: [{ selector: 'df-mat-select', imports: [MatFormField, MatLabel, MatSelect, MatOption, MatHint, FormField, MatError$1, DynamicTextPipe, AsyncPipe], template: `
867
898
  @let f = field();
868
899
  @let selectId = key() + '-select';
869
900
 
870
- <mat-form-field [appearance]="effectiveAppearance()" [subscriptSizing]="effectiveSubscriptSizing()">
901
+ <mat-form-field
902
+ [appearance]="effectiveAppearance()"
903
+ [subscriptSizing]="effectiveSubscriptSizing()"
904
+ [floatLabel]="effectiveFloatLabel()"
905
+ [hideRequiredMarker]="effectiveHideRequiredMarker()"
906
+ >
871
907
  @if (label(); as label) {
872
908
  <mat-label>{{ label | dynamicText | async }}</mat-label>
873
909
  }
@@ -910,42 +946,42 @@ var matSelect_component = /*#__PURE__*/Object.freeze({
910
946
 
911
947
  class MatSliderFieldComponent {
912
948
  elementRef = inject((ElementRef));
913
- field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
914
- key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
949
+ field = input.required(...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
950
+ key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
915
951
  constructor() {
916
952
  setupMetaTracking(this.elementRef, this.meta, { selector: 'input' });
917
953
  }
918
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
919
- placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : []));
920
- className = input('', ...(ngDevMode ? [{ debugName: "className" }] : []));
921
- tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : []));
922
- props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
923
- meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : []));
924
- validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : []));
925
- defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : []));
954
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
955
+ placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
956
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
957
+ tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : /* istanbul ignore next */ []));
958
+ props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : /* istanbul ignore next */ []));
959
+ meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : /* istanbul ignore next */ []));
960
+ validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
961
+ defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : /* istanbul ignore next */ []));
926
962
  resolvedErrors = createResolvedErrorsSignal(this.field, this.validationMessages, this.defaultValidationMessages);
927
963
  showErrors = shouldShowErrors(this.field);
928
- errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : []));
964
+ errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : /* istanbul ignore next */ []));
929
965
  // ─────────────────────────────────────────────────────────────────────────────
930
966
  // Accessibility
931
967
  // ─────────────────────────────────────────────────────────────────────────────
932
968
  /** Unique ID for the hint element, used for aria-describedby */
933
- hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : []));
969
+ hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : /* istanbul ignore next */ []));
934
970
  /** Base ID for error elements, used for aria-describedby */
935
- errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : []));
971
+ errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []));
936
972
  /** aria-required: true when field has required validation, null otherwise */
937
973
  ariaRequired = computed(() => {
938
974
  return this.field()().required?.() === true ? true : null;
939
- }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : []));
975
+ }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : /* istanbul ignore next */ []));
940
976
  /** aria-invalid: true when field is invalid AND touched, false otherwise */
941
977
  ariaInvalid = computed(() => {
942
978
  const fieldState = this.field()();
943
979
  return fieldState.invalid() && fieldState.touched();
944
- }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : []));
980
+ }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
945
981
  /** aria-describedby: links to hint and error messages for screen readers */
946
982
  ariaDescribedBy = createAriaDescribedBySignal(this.errorsToDisplay, this.errorId, this.hintId, () => !!this.props()?.hint);
947
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatSliderFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
948
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MatSliderFieldComponent, isStandalone: true, selector: "df-mat-slider", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "className()", "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
983
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatSliderFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
984
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MatSliderFieldComponent, isStandalone: true, selector: "df-mat-slider", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "className()", "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
949
985
  @let f = field();
950
986
  @let inputId = key() + '-input';
951
987
 
@@ -980,7 +1016,7 @@ class MatSliderFieldComponent {
980
1016
  }
981
1017
  `, isInline: true, styles: [":host{--df-field-gap: .5rem;--df-label-font-weight: 500;--df-label-color: inherit;--df-hint-color: rgba(0, 0, 0, .6);--df-hint-font-size: .875rem;--df-error-color: #f44336;--df-error-font-size: .875rem;display:block;width:100%}:host([hidden]){display:none!important}.df-mat-field{display:flex;flex-direction:column;gap:var(--df-field-gap);width:100%}.df-mat-label{font-weight:var(--df-label-font-weight);color:var(--df-label-color)}.df-mat-hint{color:var(--df-hint-color);font-size:var(--df-hint-font-size)}.df-mat-error{color:var(--df-error-color);font-size:var(--df-error-font-size)}\n", ".slider-container{width:100%}\n"], dependencies: [{ kind: "component", type: MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
982
1018
  }
983
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatSliderFieldComponent, decorators: [{
1019
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatSliderFieldComponent, decorators: [{
984
1020
  type: Component,
985
1021
  args: [{ selector: 'df-mat-slider', imports: [MatSlider, MatSliderThumb, MatError, DynamicTextPipe, AsyncPipe, FormField], template: `
986
1022
  @let f = field();
@@ -1031,20 +1067,20 @@ var matSlider_component = /*#__PURE__*/Object.freeze({
1031
1067
  class MatButtonFieldComponent {
1032
1068
  eventBus = inject(EventBus);
1033
1069
  arrayContext = inject(ARRAY_CONTEXT, { optional: true });
1034
- key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
1035
- label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
1036
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
1037
- hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : []));
1038
- tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : []));
1039
- className = input('', ...(ngDevMode ? [{ debugName: "className" }] : []));
1070
+ key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
1071
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1072
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
1073
+ hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
1074
+ tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : /* istanbul ignore next */ []));
1075
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
1040
1076
  /** Event to dispatch on click. Optional for submit buttons (native form submit handles it). */
1041
- event = input(...(ngDevMode ? [undefined, { debugName: "event" }] : []));
1042
- eventArgs = input(...(ngDevMode ? [undefined, { debugName: "eventArgs" }] : []));
1043
- props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
1044
- eventContext = input(...(ngDevMode ? [undefined, { debugName: "eventContext" }] : []));
1077
+ event = input(...(ngDevMode ? [undefined, { debugName: "event" }] : /* istanbul ignore next */ []));
1078
+ eventArgs = input(...(ngDevMode ? [undefined, { debugName: "eventArgs" }] : /* istanbul ignore next */ []));
1079
+ props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : /* istanbul ignore next */ []));
1080
+ eventContext = input(...(ngDevMode ? [undefined, { debugName: "eventContext" }] : /* istanbul ignore next */ []));
1045
1081
  /** Resolved button type - defaults to 'button' if not specified in props */
1046
- buttonType = computed(() => this.props()?.type ?? 'button', ...(ngDevMode ? [{ debugName: "buttonType" }] : []));
1047
- buttonTestId = computed(() => `${this.buttonType()}-${this.key()}`, ...(ngDevMode ? [{ debugName: "buttonTestId" }] : []));
1082
+ buttonType = computed(() => this.props()?.type ?? 'button', ...(ngDevMode ? [{ debugName: "buttonType" }] : /* istanbul ignore next */ []));
1083
+ buttonTestId = computed(() => `${this.buttonType()}-${this.key()}`, ...(ngDevMode ? [{ debugName: "buttonTestId" }] : /* istanbul ignore next */ []));
1048
1084
  /**
1049
1085
  * Handle button click.
1050
1086
  * - For submit buttons (type="submit"): do nothing, native form submit handles it
@@ -1084,8 +1120,8 @@ class MatButtonFieldComponent {
1084
1120
  this.eventBus.dispatch(event);
1085
1121
  }
1086
1122
  }
1087
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatButtonFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1088
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: MatButtonFieldComponent, isStandalone: true, selector: "df-mat-button", inputs: { key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, event: { classPropertyName: "event", publicName: "event", isSignal: true, isRequired: false, transformFunction: null }, eventArgs: { classPropertyName: "eventArgs", publicName: "eventArgs", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, eventContext: { classPropertyName: "eventContext", publicName: "eventContext", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "attr.data-testid": "key()", "class": "className()", "attr.hidden": "hidden() || null" } }, ngImport: i0, template: `
1123
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatButtonFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1124
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.8", type: MatButtonFieldComponent, isStandalone: true, selector: "df-mat-button", inputs: { key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, event: { classPropertyName: "event", publicName: "event", isSignal: true, isRequired: false, transformFunction: null }, eventArgs: { classPropertyName: "eventArgs", publicName: "eventArgs", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, eventContext: { classPropertyName: "eventContext", publicName: "eventContext", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "attr.data-testid": "key()", "class": "className()", "attr.hidden": "hidden() || null" } }, ngImport: i0, template: `
1089
1125
  @let buttonId = key() + '-button';
1090
1126
  <button
1091
1127
  mat-raised-button
@@ -1100,7 +1136,7 @@ class MatButtonFieldComponent {
1100
1136
  </button>
1101
1137
  `, isInline: true, styles: [":host{--df-field-gap: .5rem;--df-label-font-weight: 500;--df-label-color: inherit;--df-hint-color: rgba(0, 0, 0, .6);--df-hint-font-size: .875rem;--df-error-color: #f44336;--df-error-font-size: .875rem;display:block;width:100%}:host([hidden]){display:none!important}.df-mat-field{display:flex;flex-direction:column;gap:var(--df-field-gap);width:100%}.df-mat-label{font-weight:var(--df-label-font-weight);color:var(--df-label-color)}.df-mat-hint{color:var(--df-hint-color);font-size:var(--df-hint-font-size)}.df-mat-error{color:var(--df-error-color);font-size:var(--df-error-font-size)}\n", "button{min-width:fit-content}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1102
1138
  }
1103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatButtonFieldComponent, decorators: [{
1139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatButtonFieldComponent, decorators: [{
1104
1140
  type: Component,
1105
1141
  args: [{ selector: 'df-mat-button', imports: [MatButton, DynamicTextPipe, AsyncPipe], host: {
1106
1142
  '[id]': '`${key()}`',
@@ -1133,16 +1169,16 @@ var matButton_component = /*#__PURE__*/Object.freeze({
1133
1169
  class MatTextareaFieldComponent {
1134
1170
  materialConfig = inject(MATERIAL_CONFIG, { optional: true });
1135
1171
  elementRef = inject((ElementRef));
1136
- field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
1137
- key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
1138
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
1139
- placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : []));
1140
- className = input('', ...(ngDevMode ? [{ debugName: "className" }] : []));
1141
- tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : []));
1142
- props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
1143
- meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : []));
1144
- validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : []));
1145
- defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : []));
1172
+ field = input.required(...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
1173
+ key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
1174
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
1175
+ placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
1176
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
1177
+ tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : /* istanbul ignore next */ []));
1178
+ props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : /* istanbul ignore next */ []));
1179
+ meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : /* istanbul ignore next */ []));
1180
+ validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
1181
+ defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : /* istanbul ignore next */ []));
1146
1182
  constructor() {
1147
1183
  setupMetaTracking(this.elementRef, this.meta, { selector: 'textarea' });
1148
1184
  }
@@ -1151,12 +1187,12 @@ class MatTextareaFieldComponent {
1151
1187
  * Used to imperatively sync the readonly attribute since Angular Signal Forms'
1152
1188
  * [field] directive doesn't sync FieldState.readonly() to the DOM.
1153
1189
  */
1154
- textareaRef = viewChild('textareaRef', ...(ngDevMode ? [{ debugName: "textareaRef" }] : []));
1190
+ textareaRef = viewChild('textareaRef', ...(ngDevMode ? [{ debugName: "textareaRef" }] : /* istanbul ignore next */ []));
1155
1191
  /**
1156
1192
  * Computed signal that extracts the readonly state from the field.
1157
1193
  * Used by the effect to reactively sync the readonly attribute to the DOM.
1158
1194
  */
1159
- isReadonly = computed(() => this.field()().readonly(), ...(ngDevMode ? [{ debugName: "isReadonly" }] : []));
1195
+ isReadonly = computed(() => this.field()().readonly(), ...(ngDevMode ? [{ debugName: "isReadonly" }] : /* istanbul ignore next */ []));
1160
1196
  /**
1161
1197
  * Workaround: Angular Signal Forms' [field] directive does NOT sync the readonly
1162
1198
  * attribute to the DOM, even though FieldState.readonly() returns the correct value.
@@ -1184,35 +1220,42 @@ class MatTextareaFieldComponent {
1184
1220
  }
1185
1221
  },
1186
1222
  });
1187
- effectiveAppearance = computed(() => this.props()?.appearance ?? this.materialConfig?.appearance ?? 'outline', ...(ngDevMode ? [{ debugName: "effectiveAppearance" }] : []));
1188
- effectiveSubscriptSizing = computed(() => this.props()?.subscriptSizing ?? this.materialConfig?.subscriptSizing ?? 'dynamic', ...(ngDevMode ? [{ debugName: "effectiveSubscriptSizing" }] : []));
1223
+ effectiveAppearance = computed(() => this.props()?.appearance ?? this.materialConfig?.appearance ?? 'outline', ...(ngDevMode ? [{ debugName: "effectiveAppearance" }] : /* istanbul ignore next */ []));
1224
+ effectiveSubscriptSizing = computed(() => this.props()?.subscriptSizing ?? this.materialConfig?.subscriptSizing ?? 'dynamic', ...(ngDevMode ? [{ debugName: "effectiveSubscriptSizing" }] : /* istanbul ignore next */ []));
1225
+ effectiveFloatLabel = computed(() => this.props()?.floatLabel ?? this.materialConfig?.floatLabel ?? 'auto', ...(ngDevMode ? [{ debugName: "effectiveFloatLabel" }] : /* istanbul ignore next */ []));
1226
+ effectiveHideRequiredMarker = computed(() => this.props()?.hideRequiredMarker ?? this.materialConfig?.hideRequiredMarker ?? false, ...(ngDevMode ? [{ debugName: "effectiveHideRequiredMarker" }] : /* istanbul ignore next */ []));
1189
1227
  resolvedErrors = createResolvedErrorsSignal(this.field, this.validationMessages, this.defaultValidationMessages);
1190
1228
  showErrors = shouldShowErrors(this.field);
1191
- errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : []));
1229
+ errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : /* istanbul ignore next */ []));
1192
1230
  // ─────────────────────────────────────────────────────────────────────────────
1193
1231
  // Accessibility
1194
1232
  // ─────────────────────────────────────────────────────────────────────────────
1195
1233
  /** Unique ID for the hint element, used for aria-describedby */
1196
- hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : []));
1234
+ hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : /* istanbul ignore next */ []));
1197
1235
  /** Base ID for error elements, used for aria-describedby */
1198
- errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : []));
1236
+ errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []));
1199
1237
  /** aria-invalid: true when field is invalid AND touched, false otherwise */
1200
1238
  ariaInvalid = computed(() => {
1201
1239
  const fieldState = this.field()();
1202
1240
  return fieldState.invalid() && fieldState.touched();
1203
- }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : []));
1241
+ }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
1204
1242
  /** aria-required: true if field is required, null otherwise (to remove attribute) */
1205
1243
  ariaRequired = computed(() => {
1206
1244
  return this.field()().required?.() === true ? true : null;
1207
- }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : []));
1245
+ }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : /* istanbul ignore next */ []));
1208
1246
  /** aria-describedby: links to hint and error messages for screen readers */
1209
1247
  ariaDescribedBy = createAriaDescribedBySignal(this.errorsToDisplay, this.errorId, this.hintId, () => !!this.props()?.hint);
1210
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatTextareaFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1211
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MatTextareaFieldComponent, isStandalone: true, selector: "df-mat-textarea", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "attr.data-testid": "key()", "class": "className()", "attr.hidden": "field()().hidden() || null" } }, viewQueries: [{ propertyName: "textareaRef", first: true, predicate: ["textareaRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
1248
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatTextareaFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1249
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MatTextareaFieldComponent, isStandalone: true, selector: "df-mat-textarea", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "attr.data-testid": "key()", "class": "className()", "attr.hidden": "field()().hidden() || null" } }, viewQueries: [{ propertyName: "textareaRef", first: true, predicate: ["textareaRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
1212
1250
  @let f = field();
1213
1251
  @let textareaId = key() + '-textarea';
1214
1252
 
1215
- <mat-form-field [appearance]="effectiveAppearance()" [subscriptSizing]="effectiveSubscriptSizing()">
1253
+ <mat-form-field
1254
+ [appearance]="effectiveAppearance()"
1255
+ [subscriptSizing]="effectiveSubscriptSizing()"
1256
+ [floatLabel]="effectiveFloatLabel()"
1257
+ [hideRequiredMarker]="effectiveHideRequiredMarker()"
1258
+ >
1216
1259
  @if (label()) {
1217
1260
  <mat-label>{{ label() | dynamicText | async }}</mat-label>
1218
1261
  }
@@ -1238,13 +1281,18 @@ class MatTextareaFieldComponent {
1238
1281
  </mat-form-field>
1239
1282
  `, isInline: true, styles: [":host{--df-field-gap: .5rem;--df-label-font-weight: 500;--df-label-color: inherit;--df-hint-color: rgba(0, 0, 0, .6);--df-hint-font-size: .875rem;--df-error-color: #f44336;--df-error-font-size: .875rem;display:block;width:100%}:host([hidden]){display:none!important}.df-mat-field{display:flex;flex-direction:column;gap:var(--df-field-gap);width:100%}.df-mat-label{font-weight:var(--df-label-font-weight);color:var(--df-label-color)}.df-mat-hint{color:var(--df-hint-color);font-size:var(--df-hint-font-size)}.df-mat-error{color:var(--df-error-color);font-size:var(--df-error-font-size)}\n", "mat-form-field{width:100%}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "directive", type: MatError$1, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1240
1283
  }
1241
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatTextareaFieldComponent, decorators: [{
1284
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatTextareaFieldComponent, decorators: [{
1242
1285
  type: Component,
1243
1286
  args: [{ selector: 'df-mat-textarea', imports: [MatFormField, MatLabel, MatInput, MatHint, FormField, MatError$1, DynamicTextPipe, AsyncPipe], template: `
1244
1287
  @let f = field();
1245
1288
  @let textareaId = key() + '-textarea';
1246
1289
 
1247
- <mat-form-field [appearance]="effectiveAppearance()" [subscriptSizing]="effectiveSubscriptSizing()">
1290
+ <mat-form-field
1291
+ [appearance]="effectiveAppearance()"
1292
+ [subscriptSizing]="effectiveSubscriptSizing()"
1293
+ [floatLabel]="effectiveFloatLabel()"
1294
+ [hideRequiredMarker]="effectiveHideRequiredMarker()"
1295
+ >
1248
1296
  @if (label()) {
1249
1297
  <mat-label>{{ label() | dynamicText | async }}</mat-label>
1250
1298
  }
@@ -1284,20 +1332,20 @@ var matTextarea_component = /*#__PURE__*/Object.freeze({
1284
1332
  class MatToggleFieldComponent {
1285
1333
  materialConfig = inject(MATERIAL_CONFIG, { optional: true });
1286
1334
  elementRef = inject((ElementRef));
1287
- field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
1288
- key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
1289
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
1290
- placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : []));
1291
- className = input('', ...(ngDevMode ? [{ debugName: "className" }] : []));
1292
- tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : []));
1293
- props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
1294
- meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : []));
1295
- validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : []));
1296
- defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : []));
1297
- effectiveDisableRipple = computed(() => this.props()?.disableRipple ?? this.materialConfig?.disableRipple ?? false, ...(ngDevMode ? [{ debugName: "effectiveDisableRipple" }] : []));
1335
+ field = input.required(...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
1336
+ key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
1337
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
1338
+ placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
1339
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
1340
+ tabIndex = input(...(ngDevMode ? [undefined, { debugName: "tabIndex" }] : /* istanbul ignore next */ []));
1341
+ props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : /* istanbul ignore next */ []));
1342
+ meta = input(...(ngDevMode ? [undefined, { debugName: "meta" }] : /* istanbul ignore next */ []));
1343
+ validationMessages = input(...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
1344
+ defaultValidationMessages = input(...(ngDevMode ? [undefined, { debugName: "defaultValidationMessages" }] : /* istanbul ignore next */ []));
1345
+ effectiveDisableRipple = computed(() => this.props()?.disableRipple ?? this.materialConfig?.disableRipple ?? false, ...(ngDevMode ? [{ debugName: "effectiveDisableRipple" }] : /* istanbul ignore next */ []));
1298
1346
  resolvedErrors = createResolvedErrorsSignal(this.field, this.validationMessages, this.defaultValidationMessages);
1299
1347
  showErrors = shouldShowErrors(this.field);
1300
- errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : []));
1348
+ errorsToDisplay = computed(() => (this.showErrors() ? this.resolvedErrors() : []), ...(ngDevMode ? [{ debugName: "errorsToDisplay" }] : /* istanbul ignore next */ []));
1301
1349
  constructor() {
1302
1350
  // Apply meta attributes to the internal toggle button
1303
1351
  // Note: mat-slide-toggle uses <button role="switch"> instead of <input type="checkbox">
@@ -1309,18 +1357,18 @@ class MatToggleFieldComponent {
1309
1357
  // Accessibility
1310
1358
  // ─────────────────────────────────────────────────────────────────────────────
1311
1359
  /** Unique ID for the hint element, used for aria-describedby */
1312
- hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : []));
1360
+ hintId = computed(() => `${this.key()}-hint`, ...(ngDevMode ? [{ debugName: "hintId" }] : /* istanbul ignore next */ []));
1313
1361
  /** Base ID for error elements, used for aria-describedby */
1314
- errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : []));
1362
+ errorId = computed(() => `${this.key()}-error`, ...(ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []));
1315
1363
  /** aria-invalid: true when field is invalid AND touched, false otherwise */
1316
1364
  ariaInvalid = computed(() => {
1317
1365
  const fieldState = this.field()();
1318
1366
  return fieldState.invalid() && fieldState.touched();
1319
- }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : []));
1367
+ }, ...(ngDevMode ? [{ debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
1320
1368
  /** aria-required: true if field is required, null otherwise (to remove attribute) */
1321
1369
  ariaRequired = computed(() => {
1322
1370
  return this.field()().required?.() === true ? true : null;
1323
- }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : []));
1371
+ }, ...(ngDevMode ? [{ debugName: "ariaRequired" }] : /* istanbul ignore next */ []));
1324
1372
  /** aria-describedby: links to hint and error messages for screen readers */
1325
1373
  ariaDescribedBy = createAriaDescribedBySignal(this.errorsToDisplay, this.errorId, this.hintId, () => !!this.props()?.hint);
1326
1374
  /**
@@ -1359,8 +1407,8 @@ class MatToggleFieldComponent {
1359
1407
  }
1360
1408
  }
1361
1409
  });
1362
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatToggleFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1363
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MatToggleFieldComponent, isStandalone: true, selector: "df-mat-toggle", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "className()", "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
1410
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatToggleFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1411
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MatToggleFieldComponent, isStandalone: true, selector: "df-mat-toggle", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, defaultValidationMessages: { classPropertyName: "defaultValidationMessages", publicName: "defaultValidationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "className()", "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "field()().hidden() || null" } }, ngImport: i0, template: `
1364
1412
  @let f = field();
1365
1413
  @let toggleId = key() + '-toggle';
1366
1414
 
@@ -1386,7 +1434,7 @@ class MatToggleFieldComponent {
1386
1434
  }
1387
1435
  `, isInline: true, styles: [":host{--df-field-gap: .5rem;--df-label-font-weight: 500;--df-label-color: inherit;--df-hint-color: rgba(0, 0, 0, .6);--df-hint-font-size: .875rem;--df-error-color: #f44336;--df-error-font-size: .875rem;display:block;width:100%}:host([hidden]){display:none!important}.df-mat-field{display:flex;flex-direction:column;gap:var(--df-field-gap);width:100%}.df-mat-label{font-weight:var(--df-label-font-weight);color:var(--df-label-color)}.df-mat-hint{color:var(--df-hint-color);font-size:var(--df-hint-font-size)}.df-mat-error{color:var(--df-error-color);font-size:var(--df-error-font-size)}\n"], dependencies: [{ kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1388
1436
  }
1389
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MatToggleFieldComponent, decorators: [{
1437
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MatToggleFieldComponent, decorators: [{
1390
1438
  type: Component,
1391
1439
  args: [{ selector: 'df-mat-toggle', imports: [MatSlideToggle, FormField, MatError, DynamicTextPipe, AsyncPipe], template: `
1392
1440
  @let f = field();
@@ -1514,6 +1562,13 @@ function buttonFieldMapper(fieldDef) {
1514
1562
  * disabled state resolution based on form validity and options.
1515
1563
  */
1516
1564
 
1565
+ /**
1566
+ * Base definition for button field types that don't use the `field` input.
1567
+ * Button fields render immediately without waiting for form value integration.
1568
+ */
1569
+ const BUTTON_FIELD_TYPES_BASE = {
1570
+ renderReadyWhen: [],
1571
+ };
1517
1572
  /**
1518
1573
  * Material Design field type definitions
1519
1574
  * Follows the FieldTypeDefinition interface for proper registry integration
@@ -1524,107 +1579,126 @@ const MATERIAL_FIELD_TYPES = [
1524
1579
  loadComponent: () => Promise.resolve().then(function () { return matInput_component; }),
1525
1580
  mapper: valueFieldMapper,
1526
1581
  propsToMeta: ['type'],
1582
+ scope: ['text-input', 'numeric'],
1527
1583
  },
1528
1584
  {
1529
1585
  name: MatField.Select,
1530
1586
  loadComponent: () => Promise.resolve().then(function () { return matSelect_component; }),
1531
1587
  mapper: optionsFieldMapper,
1588
+ scope: 'single-select',
1532
1589
  },
1533
1590
  {
1534
1591
  name: MatField.Checkbox,
1535
1592
  loadComponent: () => Promise.resolve().then(function () { return matCheckbox_component; }),
1536
1593
  mapper: checkboxFieldMapper,
1594
+ scope: 'boolean',
1537
1595
  },
1538
1596
  {
1539
1597
  name: MatField.Button,
1540
1598
  loadComponent: () => Promise.resolve().then(function () { return matButton_component; }),
1541
1599
  mapper: buttonFieldMapper,
1542
1600
  valueHandling: 'exclude',
1601
+ ...BUTTON_FIELD_TYPES_BASE,
1543
1602
  },
1544
1603
  {
1545
1604
  name: MatField.Submit,
1546
1605
  loadComponent: () => Promise.resolve().then(function () { return matButton_component; }),
1547
1606
  mapper: submitButtonFieldMapper,
1548
1607
  valueHandling: 'exclude',
1608
+ ...BUTTON_FIELD_TYPES_BASE,
1549
1609
  },
1550
1610
  {
1551
1611
  name: MatField.Next,
1552
1612
  loadComponent: () => Promise.resolve().then(function () { return matButton_component; }),
1553
1613
  mapper: nextButtonFieldMapper,
1554
1614
  valueHandling: 'exclude',
1615
+ ...BUTTON_FIELD_TYPES_BASE,
1555
1616
  },
1556
1617
  {
1557
1618
  name: MatField.Previous,
1558
1619
  loadComponent: () => Promise.resolve().then(function () { return matButton_component; }),
1559
1620
  mapper: previousButtonFieldMapper,
1560
1621
  valueHandling: 'exclude',
1622
+ ...BUTTON_FIELD_TYPES_BASE,
1561
1623
  },
1562
1624
  {
1563
1625
  name: MatField.AddArrayItem,
1564
1626
  loadComponent: () => Promise.resolve().then(function () { return matButton_component; }),
1565
1627
  mapper: addArrayItemButtonMapper,
1566
1628
  valueHandling: 'exclude',
1629
+ ...BUTTON_FIELD_TYPES_BASE,
1567
1630
  },
1568
1631
  {
1569
1632
  name: MatField.PrependArrayItem,
1570
1633
  loadComponent: () => Promise.resolve().then(function () { return matButton_component; }),
1571
1634
  mapper: prependArrayItemButtonMapper,
1572
1635
  valueHandling: 'exclude',
1636
+ ...BUTTON_FIELD_TYPES_BASE,
1573
1637
  },
1574
1638
  {
1575
1639
  name: MatField.InsertArrayItem,
1576
1640
  loadComponent: () => Promise.resolve().then(function () { return matButton_component; }),
1577
1641
  mapper: insertArrayItemButtonMapper,
1578
1642
  valueHandling: 'exclude',
1643
+ ...BUTTON_FIELD_TYPES_BASE,
1579
1644
  },
1580
1645
  {
1581
1646
  name: MatField.RemoveArrayItem,
1582
1647
  loadComponent: () => Promise.resolve().then(function () { return matButton_component; }),
1583
1648
  mapper: removeArrayItemButtonMapper,
1584
1649
  valueHandling: 'exclude',
1650
+ ...BUTTON_FIELD_TYPES_BASE,
1585
1651
  },
1586
1652
  {
1587
1653
  name: MatField.PopArrayItem,
1588
1654
  loadComponent: () => Promise.resolve().then(function () { return matButton_component; }),
1589
1655
  mapper: popArrayItemButtonMapper,
1590
1656
  valueHandling: 'exclude',
1657
+ ...BUTTON_FIELD_TYPES_BASE,
1591
1658
  },
1592
1659
  {
1593
1660
  name: MatField.ShiftArrayItem,
1594
1661
  loadComponent: () => Promise.resolve().then(function () { return matButton_component; }),
1595
1662
  mapper: shiftArrayItemButtonMapper,
1596
1663
  valueHandling: 'exclude',
1664
+ ...BUTTON_FIELD_TYPES_BASE,
1597
1665
  },
1598
1666
  {
1599
1667
  name: MatField.Textarea,
1600
1668
  loadComponent: () => Promise.resolve().then(function () { return matTextarea_component; }),
1601
1669
  mapper: valueFieldMapper,
1602
1670
  propsToMeta: ['rows', 'cols'],
1671
+ scope: 'text-input',
1603
1672
  },
1604
1673
  {
1605
1674
  name: MatField.Radio,
1606
1675
  loadComponent: () => Promise.resolve().then(function () { return matRadio_component; }),
1607
1676
  mapper: optionsFieldMapper,
1677
+ scope: 'single-select',
1608
1678
  },
1609
1679
  {
1610
1680
  name: MatField.MultiCheckbox,
1611
1681
  loadComponent: () => Promise.resolve().then(function () { return matMultiCheckbox_component; }),
1612
1682
  mapper: optionsFieldMapper,
1683
+ scope: 'multi-select',
1613
1684
  },
1614
1685
  {
1615
1686
  name: MatField.Datepicker,
1616
1687
  loadComponent: () => Promise.resolve().then(function () { return matDatepicker_component; }),
1617
1688
  mapper: datepickerFieldMapper,
1689
+ scope: 'date',
1618
1690
  },
1619
1691
  {
1620
1692
  name: MatField.Slider,
1621
1693
  loadComponent: () => Promise.resolve().then(function () { return matSlider_component; }),
1622
1694
  mapper: valueFieldMapper,
1695
+ scope: 'numeric',
1623
1696
  },
1624
1697
  {
1625
1698
  name: MatField.Toggle,
1626
1699
  loadComponent: () => Promise.resolve().then(function () { return matToggle_component; }),
1627
1700
  mapper: checkboxFieldMapper,
1701
+ scope: 'boolean',
1628
1702
  },
1629
1703
  ];
1630
1704
 
@@ -1634,54 +1708,19 @@ const MATERIAL_FIELD_TYPES = [
1634
1708
  * all Material Design field types provided by this library.
1635
1709
  */
1636
1710
 
1637
- /**
1638
- * Configure dynamic forms with Material Design field types.
1639
- * Provides all Material Design field types for use with provideDynamicForm.
1640
- *
1641
- * @param config - Optional global configuration for Material form fields
1642
- *
1643
- * @example
1644
- * ```typescript
1645
- * // Application-level setup
1646
- * import { ApplicationConfig } from '@angular/core';
1647
- * import { provideDynamicForm } from '@ng-forge/dynamic-form';
1648
- * import { withMaterialFields } from '@ng-forge/dynamic-form-material';
1649
- *
1650
- * export const appConfig: ApplicationConfig = {
1651
- * providers: [
1652
- * provideDynamicForm(...withMaterialFields())
1653
- * ]
1654
- * };
1655
- * ```
1656
- *
1657
- * @example
1658
- * ```typescript
1659
- * // With global configuration
1660
- * export const appConfig: ApplicationConfig = {
1661
- * providers: [
1662
- * provideDynamicForm(
1663
- * ...withMaterialFields({
1664
- * appearance: 'fill',
1665
- * subscriptSizing: 'fixed'
1666
- * })
1667
- * )
1668
- * ]
1669
- * };
1670
- * ```
1671
- *
1672
- * @returns Array of field type definitions for Material Design components
1673
- */
1674
1711
  function withMaterialFields(config) {
1675
- const fields = MATERIAL_FIELD_TYPES;
1676
- if (config) {
1677
- fields.__configProviders = [
1678
- {
1679
- provide: MATERIAL_CONFIG,
1680
- useValue: config,
1681
- },
1682
- ];
1712
+ if (!config) {
1713
+ return MATERIAL_FIELD_TYPES;
1683
1714
  }
1684
- return fields;
1715
+ const fieldsWithConfig = [
1716
+ ...MATERIAL_FIELD_TYPES,
1717
+ {
1718
+ ɵkind: 'material-config',
1719
+ ɵproviders: [{ provide: MATERIAL_CONFIG, useValue: config }],
1720
+ },
1721
+ ];
1722
+ // Safe: this preserves all material field definitions and appends exactly one config feature.
1723
+ return fieldsWithConfig;
1685
1724
  }
1686
1725
 
1687
1726
  // Field components