@mk-kit/ui 0.41.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +4 -4
  2. package/THIRD_PARTY_NOTICES.md +4 -2
  3. package/fesm2022/mk-kit-ui-block-editor.mjs +4 -2
  4. package/fesm2022/mk-kit-ui-block-editor.mjs.map +1 -1
  5. package/fesm2022/mk-kit-ui-checkbox.mjs +4 -2
  6. package/fesm2022/mk-kit-ui-checkbox.mjs.map +1 -1
  7. package/fesm2022/mk-kit-ui-core.mjs +218 -1
  8. package/fesm2022/mk-kit-ui-core.mjs.map +1 -1
  9. package/fesm2022/mk-kit-ui-data.mjs +801 -16
  10. package/fesm2022/mk-kit-ui-data.mjs.map +1 -1
  11. package/fesm2022/mk-kit-ui-datetime.mjs +90 -52
  12. package/fesm2022/mk-kit-ui-datetime.mjs.map +1 -1
  13. package/fesm2022/mk-kit-ui-directives.mjs +395 -2
  14. package/fesm2022/mk-kit-ui-directives.mjs.map +1 -1
  15. package/fesm2022/mk-kit-ui-dnd.mjs +183 -29
  16. package/fesm2022/mk-kit-ui-dnd.mjs.map +1 -1
  17. package/fesm2022/mk-kit-ui-dynamic-form.mjs +149 -2
  18. package/fesm2022/mk-kit-ui-dynamic-form.mjs.map +1 -1
  19. package/fesm2022/mk-kit-ui-feedback.mjs +1 -1
  20. package/fesm2022/mk-kit-ui-feedback.mjs.map +1 -1
  21. package/fesm2022/mk-kit-ui-forms.mjs +331 -81
  22. package/fesm2022/mk-kit-ui-forms.mjs.map +1 -1
  23. package/fesm2022/mk-kit-ui-icon-extended.mjs +425 -0
  24. package/fesm2022/mk-kit-ui-icon-extended.mjs.map +1 -0
  25. package/fesm2022/mk-kit-ui-icon.mjs +296 -459
  26. package/fesm2022/mk-kit-ui-icon.mjs.map +1 -1
  27. package/fesm2022/mk-kit-ui-query-builder.mjs +1 -1
  28. package/fesm2022/mk-kit-ui-query-builder.mjs.map +1 -1
  29. package/fesm2022/mk-kit-ui-rich-text.mjs +4 -2
  30. package/fesm2022/mk-kit-ui-rich-text.mjs.map +1 -1
  31. package/fesm2022/mk-kit-ui-table.mjs +36 -8
  32. package/fesm2022/mk-kit-ui-table.mjs.map +1 -1
  33. package/fesm2022/mk-kit-ui.mjs +1 -0
  34. package/fesm2022/mk-kit-ui.mjs.map +1 -1
  35. package/package.json +5 -1
  36. package/schematics/migrate-primeng/transform.js +4 -1
  37. package/schematics/ng-add/index.js +30 -2
  38. package/schematics/ng-add/schema.json +6 -0
  39. package/styles/mk-kit.css +604 -0
  40. package/types/mk-kit-ui-block-editor.d.ts +2 -0
  41. package/types/mk-kit-ui-checkbox.d.ts +2 -0
  42. package/types/mk-kit-ui-core.d.ts +119 -2
  43. package/types/mk-kit-ui-data.d.ts +359 -3
  44. package/types/mk-kit-ui-datetime.d.ts +41 -19
  45. package/types/mk-kit-ui-directives.d.ts +234 -3
  46. package/types/mk-kit-ui-dnd.d.ts +96 -14
  47. package/types/mk-kit-ui-dynamic-form.d.ts +44 -1
  48. package/types/mk-kit-ui-forms.d.ts +160 -20
  49. package/types/mk-kit-ui-icon-extended.d.ts +83 -0
  50. package/types/mk-kit-ui-icon.d.ts +100 -17
  51. package/types/mk-kit-ui-rich-text.d.ts +2 -0
  52. package/types/mk-kit-ui-table.d.ts +38 -21
  53. package/types/mk-kit-ui.d.ts +1 -0
@@ -1,5 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnDestroy, Signal, ElementRef, TemplateRef, OnInit } from '@angular/core';
3
+ import { Field } from '@angular/forms/signals';
3
4
  import * as _mk_kit_ui_core from '@mk-kit/ui/core';
4
5
  import { MkFieldContext, MkSize, MkVariant, MkTone, MkCodeLanguage, MkPlacement } from '@mk-kit/ui/core';
5
6
  export { MkCodeLanguage, mkHighlight } from '@mk-kit/ui/core';
@@ -29,6 +30,29 @@ export * from '@mk-kit/ui/checkbox';
29
30
  * is touched or dirty, or its form has been submitted; `errorOn` changes that.
30
31
  * `required` and the disabled styling are derived from the control too.
31
32
  *
33
+ * ## Signal Forms
34
+ *
35
+ * The same applies to a control bound with Signal Forms' `[formField]`
36
+ * directive (`@angular/forms/signals`): the field adopts the projected
37
+ * `FormField` binding and reads `touched()` / `dirty()` / `invalid()` /
38
+ * `errors()` / `required()` / `disabled()` from its `FieldState`. Errors
39
+ * written by the schema (`required(p.email)`, `minLength(p.name, 2)`, …) are
40
+ * rendered through the same `validation` i18n table, a `message` supplied to
41
+ * the schema rule wins over the table, and `errorMessages` / `errorOn` work
42
+ * unchanged. Calling `submit()` marks every field touched, so errors surface
43
+ * on a failed submit exactly as with `formControlName`. When the control is
44
+ * not projected (or lives deeper), point the field at it with `[field]`.
45
+ *
46
+ * ```html
47
+ * <mk-form-field label="Email">
48
+ * <input mkInput type="email" [formField]="f.email" />
49
+ * </mk-form-field>
50
+ *
51
+ * <mk-form-field label="Country" [field]="f.country">
52
+ * <mk-select [formField]="f.country" [options]="countries" />
53
+ * </mk-form-field>
54
+ * ```
55
+ *
32
56
  * ```html
33
57
  * <!-- automatic: message + required marker come from the validators -->
34
58
  * <mk-form-field label="Email">
@@ -90,9 +114,24 @@ declare class MkFormField implements MkFieldContext {
90
114
  * `formControl`; the placeholder stays hidden until the label has moved.
91
115
  */
92
116
  readonly labelPosition: _angular_core.InputSignal<"top" | "float">;
117
+ /**
118
+ * Signal Forms field to read state from explicitly (`[field]="f.email"`).
119
+ * Not needed when the projected control carries the `[formField]` binding —
120
+ * the wrapper finds that itself; set it when the control is nested deeper
121
+ * or when the wrapper should follow a field it does not contain.
122
+ */
123
+ readonly field: _angular_core.InputSignal<Field<unknown> | null>;
93
124
  private readonly host;
94
125
  /** The projected control's form binding, when it has one. */
95
126
  private readonly ngControl;
127
+ /** The projected control's Signal Forms `[formField]` binding, when it has one. */
128
+ private readonly signalField;
129
+ /**
130
+ * The Signal Forms field state driving this wrapper — the explicit `field`
131
+ * input first, else the projected `[formField]` binding. `undefined` for a
132
+ * reactive-forms / template-driven control.
133
+ */
134
+ private readonly fieldState;
96
135
  /** A control inside the field has focus. */
97
136
  protected readonly focused: _angular_core.WritableSignal<boolean>;
98
137
  /** Last value read straight from a native control (fallback when no NgControl). */
@@ -136,7 +175,7 @@ declare class MkFormField implements MkFieldContext {
136
175
  */
137
176
  readonly describedBy: _angular_core.Signal<string | null>;
138
177
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkFormField, never>;
139
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkFormField, "mk-form-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "errorOn": { "alias": "errorOn"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; }, {}, ["ngControl"], ["*"], true, never>;
178
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkFormField, "mk-form-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "errorOn": { "alias": "errorOn"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "field": { "alias": "field"; "required": false; "isSignal": true; }; }, {}, ["ngControl", "signalField"], ["*"], true, never>;
140
179
  }
141
180
 
142
181
  /** One field-level error to surface in {@link MkFormErrorSummary}. */
@@ -170,6 +209,24 @@ interface MkFormError {
170
209
  * `formControlName` must be a static attribute (`formControlName="email"`,
171
210
  * the usual form) rather than a binding.
172
211
  *
212
+ * ## Signal Forms
213
+ *
214
+ * Point `field` at a Signal Forms root (`[field]="f"`) instead of `form` and
215
+ * the summary reads `errorSummary()` from the `FieldTree`: one entry per
216
+ * invalid field, keyed by dotted path in `labels` / `errorMessages` like the
217
+ * reactive path. With the default `showOn="submit"` an entry appears once its
218
+ * field is touched — `submit()` marks every field touched, so a failed submit
219
+ * lists them all. Clicking an entry focuses the control bound with
220
+ * `[formField]`. When the summary sits inside the `<form>`, focus also moves
221
+ * to it after the form's `submit` event, as with `ngSubmit`.
222
+ *
223
+ * ```html
224
+ * <form (submit)="save($event)">
225
+ * <mk-form-error-summary [field]="f" [labels]="{ email: 'Email address' }" />
226
+ * …
227
+ * </form>
228
+ * ```
229
+ *
173
230
  * ```html
174
231
  * <!-- automatic -->
175
232
  * <form [formGroup]="form" (ngSubmit)="submit()">
@@ -197,12 +254,17 @@ declare class MkFormErrorSummary {
197
254
  readonly errors: _angular_core.InputSignal<readonly MkFormError[]>;
198
255
  /** Collect errors from this control tree instead of passing them in. */
199
256
  readonly form: _angular_core.InputSignal<AbstractControl<any, any, any> | null>;
257
+ /**
258
+ * Collect errors from this Signal Forms field (usually the root returned by
259
+ * `form()`) instead of `form`. Entries are keyed by dotted path for `labels`.
260
+ */
261
+ readonly field: _angular_core.InputSignal<Field<unknown> | null>;
200
262
  /** Field names for automatic entries, keyed by control path. */
201
263
  readonly labels: _angular_core.InputSignal<Readonly<Record<string, string>>>;
202
264
  /** Per-key wording for automatic entries, as on `mk-form-field`. */
203
265
  readonly errorMessages: _angular_core.InputSignal<Readonly<Record<string, string | ((err: any) => string)>> | null>;
204
266
  /** When automatic entries appear. Defaults to after the form is submitted. */
205
- readonly showOn: _angular_core.InputSignal<"always" | "submit">;
267
+ readonly showOn: _angular_core.InputSignal<"submit" | "always">;
206
268
  /** Heading shown above the list. */
207
269
  readonly summaryTitle: _angular_core.InputSignal<string>;
208
270
  /**
@@ -217,6 +279,12 @@ declare class MkFormErrorSummary {
217
279
  constructor();
218
280
  /** Whether the surrounding form (if any) has been submitted. */
219
281
  private readonly submitted;
282
+ /**
283
+ * Entries collected from `field` (a Signal Forms root), each with the element
284
+ * carrying the field's `[formField]` binding so a click can focus it the way
285
+ * `focusBoundControl()` would.
286
+ */
287
+ private readonly signalEntries;
220
288
  /** Entries collected from `form`, when one is set and they should show. */
221
289
  private readonly autoErrors;
222
290
  /** The entries actually rendered — an explicit `errors` list wins. */
@@ -235,7 +303,7 @@ declare class MkFormErrorSummary {
235
303
  */
236
304
  private fieldIdFor;
237
305
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkFormErrorSummary, never>;
238
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkFormErrorSummary, "mk-form-error-summary", ["mkFormErrorSummary"], { "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "showOn": { "alias": "showOn"; "required": false; "isSignal": true; }; "summaryTitle": { "alias": "summaryTitle"; "required": false; "isSignal": true; }; "autoFocus": { "alias": "autoFocus"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
306
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkFormErrorSummary, "mk-form-error-summary", ["mkFormErrorSummary"], { "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "field": { "alias": "field"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "showOn": { "alias": "showOn"; "required": false; "isSignal": true; }; "summaryTitle": { "alias": "summaryTitle"; "required": false; "isSignal": true; }; "autoFocus": { "alias": "autoFocus"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
239
307
  }
240
308
 
241
309
  /**
@@ -261,6 +329,8 @@ declare class MkFormErrorSummary {
261
329
  */
262
330
  declare class MkInput implements ControlValueAccessor {
263
331
  private readonly field;
332
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
333
+ private readonly fieldTouched;
264
334
  private readonly group;
265
335
  private readonly host;
266
336
  private readonly initialId;
@@ -381,6 +451,8 @@ declare class MkInputGroup {
381
451
  */
382
452
  declare class MkSubmitInput implements ControlValueAccessor {
383
453
  private readonly field;
454
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
455
+ private readonly fieldTouched;
384
456
  /** Localised strings (override globally via `provideMkI18n`). */
385
457
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
386
458
  private readonly inputRef;
@@ -565,6 +637,8 @@ interface MkSelectOption {
565
637
  */
566
638
  declare class MkSelect implements ControlValueAccessor, OnDestroy {
567
639
  private readonly field;
640
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
641
+ private readonly fieldTouched;
568
642
  /** Localised strings (override globally via `provideMkI18n`). */
569
643
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
570
644
  private readonly triggerRef;
@@ -578,6 +652,8 @@ declare class MkSelect implements ControlValueAccessor, OnDestroy {
578
652
  readonly size: _angular_core.InputSignal<MkSize>;
579
653
  /** Force invalid styling + `aria-invalid` when used standalone. */
580
654
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
655
+ /** Mark required (adds `aria-required`). Set by Signal Forms' `[formField]` from the schema. */
656
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
581
657
  /** Disable the control. */
582
658
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
583
659
  /** Two-way selected value. */
@@ -617,7 +693,7 @@ declare class MkSelect implements ControlValueAccessor, OnDestroy {
617
693
  registerOnTouched(fn: () => void): void;
618
694
  setDisabledState(isDisabled: boolean): void;
619
695
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkSelect, never>;
620
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkSelect, "mk-select", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
696
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkSelect, "mk-select", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
621
697
  }
622
698
 
623
699
  /** One row of an `mk-listbox`. */
@@ -665,6 +741,8 @@ type Row = {
665
741
  */
666
742
  declare class MkListbox implements ControlValueAccessor, OnDestroy {
667
743
  private readonly field;
744
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
745
+ private readonly fieldTouched;
668
746
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
669
747
  private readonly listRef;
670
748
  /** The rows to choose from. */
@@ -773,6 +851,8 @@ interface MkCascaderOption {
773
851
  */
774
852
  declare class MkCascader implements ControlValueAccessor, OnDestroy {
775
853
  private readonly field;
854
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
855
+ private readonly fieldTouched;
776
856
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
777
857
  private readonly host;
778
858
  private readonly injector;
@@ -906,6 +986,8 @@ type MkAutocompleteFilterMode = 'contains' | 'startsWith' | 'none';
906
986
  */
907
987
  declare class MkAutocomplete implements ControlValueAccessor {
908
988
  private readonly field;
989
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
990
+ private readonly fieldTouched;
909
991
  /** Localised strings (override globally via `provideMkI18n`). */
910
992
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
911
993
  private readonly announcer;
@@ -923,6 +1005,8 @@ declare class MkAutocomplete implements ControlValueAccessor {
923
1005
  readonly size: _angular_core.InputSignal<MkSize>;
924
1006
  /** Force invalid styling + `aria-invalid` when used standalone. */
925
1007
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
1008
+ /** Mark required (adds `aria-required`). Set by Signal Forms' `[formField]` from the schema. */
1009
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
926
1010
  /** Disable the control. */
927
1011
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
928
1012
  /** How the option list is filtered against the typed text. */
@@ -984,7 +1068,7 @@ declare class MkAutocomplete implements ControlValueAccessor {
984
1068
  registerOnTouched(fn: () => void): void;
985
1069
  setDisabledState(isDisabled: boolean): void;
986
1070
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkAutocomplete, never>;
987
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkAutocomplete, "mk-autocomplete", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "filterMode": { "alias": "filterMode"; "required": false; "isSignal": true; }; "minChars": { "alias": "minChars"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "requireSelection": { "alias": "requireSelection"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "search": "search"; "optionSelected": "optionSelected"; }, never, never, true, never>;
1071
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkAutocomplete, "mk-autocomplete", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "filterMode": { "alias": "filterMode"; "required": false; "isSignal": true; }; "minChars": { "alias": "minChars"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "requireSelection": { "alias": "requireSelection"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "search": "search"; "optionSelected": "optionSelected"; }, never, never, true, never>;
988
1072
  }
989
1073
 
990
1074
  /** How mention suggestions are narrowed against the typed query. */
@@ -1199,6 +1283,8 @@ type MkMultiSelectFilterMode = 'contains' | 'startsWith' | 'none';
1199
1283
  */
1200
1284
  declare class MkMultiSelect implements ControlValueAccessor, Validator {
1201
1285
  private readonly field;
1286
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
1287
+ private readonly fieldTouched;
1202
1288
  private readonly host;
1203
1289
  /** Localised strings (override globally via `provideMkI18n`). */
1204
1290
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
@@ -1214,6 +1300,8 @@ declare class MkMultiSelect implements ControlValueAccessor, Validator {
1214
1300
  readonly size: _angular_core.InputSignal<MkSize>;
1215
1301
  /** Force invalid styling + `aria-invalid` when used standalone. */
1216
1302
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
1303
+ /** Mark required (adds `aria-required`). Set by Signal Forms' `[formField]` from the schema. */
1304
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
1217
1305
  /** Disable the control. */
1218
1306
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1219
1307
  /** How the option list is filtered against the typed text. */
@@ -1305,7 +1393,7 @@ declare class MkMultiSelect implements ControlValueAccessor, Validator {
1305
1393
  validate(control: AbstractControl): ValidationErrors | null;
1306
1394
  registerOnValidatorChange(fn: () => void): void;
1307
1395
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkMultiSelect, never>;
1308
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkMultiSelect, "mk-multi-select", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "filterMode": { "alias": "filterMode"; "required": false; "isSignal": true; }; "minChars": { "alias": "minChars"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "search": "search"; "optionAdded": "optionAdded"; "optionRemoved": "optionRemoved"; }, never, never, true, never>;
1396
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkMultiSelect, "mk-multi-select", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "filterMode": { "alias": "filterMode"; "required": false; "isSignal": true; }; "minChars": { "alias": "minChars"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "search": "search"; "optionAdded": "optionAdded"; "optionRemoved": "optionRemoved"; }, never, never, true, never>;
1309
1397
  }
1310
1398
 
1311
1399
  /**
@@ -1321,6 +1409,8 @@ declare class MkMultiSelect implements ControlValueAccessor, Validator {
1321
1409
  */
1322
1410
  declare class MkTagInput implements ControlValueAccessor, Validator {
1323
1411
  private readonly field;
1412
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
1413
+ private readonly fieldTouched;
1324
1414
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1325
1415
  private readonly announcer;
1326
1416
  private readonly host;
@@ -1343,6 +1433,8 @@ declare class MkTagInput implements ControlValueAccessor, Validator {
1343
1433
  readonly separators: _angular_core.InputSignal<readonly string[]>;
1344
1434
  /** Force invalid styling + `aria-invalid` when used standalone. */
1345
1435
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
1436
+ /** Mark required (adds `aria-required`). Set by Signal Forms' `[formField]` from the schema. */
1437
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
1346
1438
  /** Disable the control. */
1347
1439
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1348
1440
  /** Control size. Ignored when nested in an `mk-form-field`. */
@@ -1395,7 +1487,7 @@ declare class MkTagInput implements ControlValueAccessor, Validator {
1395
1487
  validate(control: AbstractControl): ValidationErrors | null;
1396
1488
  registerOnValidatorChange(fn: () => void): void;
1397
1489
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkTagInput, never>;
1398
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkTagInput, "mk-tag-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "addOnBlur": { "alias": "addOnBlur"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "added": "added"; "removed": "removed"; }, never, never, true, never>;
1490
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkTagInput, "mk-tag-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "addOnBlur": { "alias": "addOnBlur"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "added": "added"; "removed": "removed"; }, never, never, true, never>;
1399
1491
  }
1400
1492
 
1401
1493
  /** A single password rule with its current pass/fail state. */
@@ -1416,6 +1508,8 @@ interface MkPasswordRule {
1416
1508
  */
1417
1509
  declare class MkPasswordInput implements ControlValueAccessor, Validator {
1418
1510
  private readonly field;
1511
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
1512
+ private readonly fieldTouched;
1419
1513
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1420
1514
  private readonly inputRef;
1421
1515
  /** Two-way value. */
@@ -1522,6 +1616,8 @@ type MkTransferSide = 'available' | 'selected';
1522
1616
  declare class MkTransferList implements ControlValueAccessor {
1523
1617
  private readonly host;
1524
1618
  private readonly field;
1619
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
1620
+ private readonly fieldTouched;
1525
1621
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1526
1622
  private readonly announcer;
1527
1623
  private readonly injector;
@@ -1681,10 +1777,12 @@ declare class MkRepeaterEmpty {
1681
1777
  *
1682
1778
  * With `reorderable`, each row gets a drag handle wired through the dnd
1683
1779
  * module's touch-safe handle-based configuration (a swipe on the row body
1684
- * still scrolls the page). Reordering also works by keyboard: focus the
1685
- * handle (or the row) and press Space/Enter to pick up, arrows to move,
1686
- * Space/Enter to drop, Escape to cancel. Each completed reorder is announced
1687
- * via {@link MkLiveAnnouncer}.
1780
+ * still scrolls the page). The handle button is the only control the dnd
1781
+ * layer adds rows stay plain list items, so the inputs and buttons inside
1782
+ * them are never nested in an interactive role. Reordering also works by
1783
+ * keyboard: focus the handle and press Space/Enter to pick up, arrows to
1784
+ * move, Space/Enter to drop, Escape to cancel. Each completed reorder is
1785
+ * announced via {@link MkLiveAnnouncer}.
1688
1786
  *
1689
1787
  * ```html
1690
1788
  * <mk-repeater [(items)]="rows" [min]="1" [max]="10" reorderable
@@ -1783,6 +1881,8 @@ declare class MkRepeater<T = unknown> implements ControlValueAccessor {
1783
1881
  */
1784
1882
  declare class MkTreeSelect implements ControlValueAccessor {
1785
1883
  private readonly field;
1884
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
1885
+ private readonly fieldTouched;
1786
1886
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1787
1887
  private readonly host;
1788
1888
  private readonly injector;
@@ -2098,6 +2198,8 @@ declare class MkCodeEditor implements ControlValueAccessor, OnDestroy {
2098
2198
  protected readonly describedBy: _angular_core.Signal<string | null>;
2099
2199
  /** Parse error for JSON content, or `null` when valid / empty / plaintext. */
2100
2200
  protected readonly jsonError: _angular_core.Signal<string | null>;
2201
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2202
+ private readonly fieldTouched;
2101
2203
  protected readonly isInvalid: _angular_core.Signal<boolean>;
2102
2204
  /** `aria-describedby` merging the field's ids with the JSON error id. */
2103
2205
  protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
@@ -2154,6 +2256,8 @@ declare class MkCodeEditor implements ControlValueAccessor, OnDestroy {
2154
2256
  */
2155
2257
  declare class MkRating implements ControlValueAccessor, Validator {
2156
2258
  private readonly field;
2259
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2260
+ private readonly fieldTouched;
2157
2261
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2158
2262
  /** Number of stars. */
2159
2263
  readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -2220,14 +2324,16 @@ declare class MkRating implements ControlValueAccessor, Validator {
2220
2324
  */
2221
2325
  declare class MkNumberInput implements ControlValueAccessor, Validator {
2222
2326
  private readonly field;
2327
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2328
+ private readonly fieldTouched;
2223
2329
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2224
2330
  private readonly inputRef;
2225
2331
  /** Minimum value. */
2226
2332
  /** Accessible name when the control is used without an `mk-form-field` label. */
2227
2333
  readonly ariaLabel: _angular_core.InputSignal<string>;
2228
- readonly min: _angular_core.InputSignal<number | null>;
2334
+ readonly min: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2229
2335
  /** Maximum value. */
2230
- readonly max: _angular_core.InputSignal<number | null>;
2336
+ readonly max: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2231
2337
  /** Step increment for buttons + Arrow keys. */
2232
2338
  readonly step: _angular_core.InputSignalWithTransform<number, unknown>;
2233
2339
  /** Two-way value. */
@@ -2238,6 +2344,8 @@ declare class MkNumberInput implements ControlValueAccessor, Validator {
2238
2344
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
2239
2345
  /** Force invalid styling when standalone. */
2240
2346
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
2347
+ /** Mark required (adds `aria-required`). Set by Signal Forms' `[formField]` from the schema. */
2348
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
2241
2349
  /** Control size. Ignored inside an `mk-form-field`. */
2242
2350
  readonly size: _angular_core.InputSignal<MkSize>;
2243
2351
  protected readonly inputId: string;
@@ -2272,7 +2380,7 @@ declare class MkNumberInput implements ControlValueAccessor, Validator {
2272
2380
  validate(control: AbstractControl): ValidationErrors | null;
2273
2381
  registerOnValidatorChange(fn: () => void): void;
2274
2382
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkNumberInput, never>;
2275
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkNumberInput, "mk-number-input", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
2383
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkNumberInput, "mk-number-input", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
2276
2384
  }
2277
2385
 
2278
2386
  type MkNumericKeypadMode = 'pin' | 'quantity' | 'amount';
@@ -2312,9 +2420,9 @@ declare class MkNumericKeypad implements ControlValueAccessor, Validator {
2312
2420
  /** PIN length (`pin` mode only). Reaching it emits `submit`. */
2313
2421
  readonly length: _angular_core.InputSignalWithTransform<number, unknown>;
2314
2422
  /** Lower bound reported through the validator (`quantity`/`amount`). */
2315
- readonly min: _angular_core.InputSignal<number | null>;
2423
+ readonly min: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2316
2424
  /** Upper bound reported through the validator (`quantity`/`amount`). */
2317
- readonly max: _angular_core.InputSignal<number | null>;
2425
+ readonly max: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2318
2426
  /** Mask the echo row in `pin` mode. Default `true`. */
2319
2427
  readonly mask: _angular_core.InputSignalWithTransform<boolean, unknown>;
2320
2428
  /** Show the echo row above the keys. Default `true`. */
@@ -2506,6 +2614,8 @@ declare class MkOnScreenKeyboardTrigger {
2506
2614
  */
2507
2615
  declare class MkOtp implements ControlValueAccessor, Validator {
2508
2616
  private readonly field;
2617
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2618
+ private readonly fieldTouched;
2509
2619
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2510
2620
  private readonly cells;
2511
2621
  /** Number of character boxes. */
@@ -2632,6 +2742,8 @@ interface CountryOption {
2632
2742
  */
2633
2743
  declare class MkPhoneInput implements ControlValueAccessor {
2634
2744
  private readonly field;
2745
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2746
+ private readonly fieldTouched;
2635
2747
  /** Localised strings (override globally via `provideMkI18n`). */
2636
2748
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2637
2749
  private readonly triggerRef;
@@ -2773,6 +2885,8 @@ declare function mkPostalCodeValidator(country: string, formats?: readonly MkPos
2773
2885
  */
2774
2886
  declare class MkPostalCodeInput implements ControlValueAccessor, Validator {
2775
2887
  private readonly field;
2888
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2889
+ private readonly fieldTouched;
2776
2890
  /** Localised strings (override globally via `provideMkI18n`). */
2777
2891
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2778
2892
  /** ISO 3166-1 alpha-2 country whose format applies. */
@@ -2865,6 +2979,8 @@ interface LocaleInfo {
2865
2979
  */
2866
2980
  declare class MkCurrencyInput implements ControlValueAccessor, Validator {
2867
2981
  private readonly field;
2982
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2983
+ private readonly fieldTouched;
2868
2984
  /** Localised strings (override globally via `provideMkI18n`). */
2869
2985
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2870
2986
  /** ISO 4217 currency code (`PLN`, `USD`, …). Empty = plain decimal. */
@@ -2876,9 +2992,9 @@ declare class MkCurrencyInput implements ControlValueAccessor, Validator {
2876
2992
  /** Max fraction digits; defaults to the currency's convention (else 2). */
2877
2993
  readonly decimals: _angular_core.InputSignal<number | null>;
2878
2994
  /** Clamp the value to at least this on blur. */
2879
- readonly min: _angular_core.InputSignal<number | null>;
2995
+ readonly min: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2880
2996
  /** Clamp the value to at most this on blur. */
2881
- readonly max: _angular_core.InputSignal<number | null>;
2997
+ readonly max: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2882
2998
  /** Allow a leading minus sign. */
2883
2999
  readonly allowNegative: _angular_core.InputSignalWithTransform<boolean, unknown>;
2884
3000
  /** Control size. Ignored when nested in an `mk-form-field`. */
@@ -2967,6 +3083,8 @@ declare function mkLuhnCheck(digits: string): boolean;
2967
3083
  */
2968
3084
  declare class MkCardNumberInput implements ControlValueAccessor, Validator {
2969
3085
  private readonly field;
3086
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3087
+ private readonly fieldTouched;
2970
3088
  /** Localised strings (override globally via `provideMkI18n`). */
2971
3089
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2972
3090
  /** Show the detected brand as a badge inside the field. */
@@ -3066,6 +3184,8 @@ declare function mkIbanValidator(): ValidatorFn;
3066
3184
  */
3067
3185
  declare class MkIbanInput implements ControlValueAccessor, Validator {
3068
3186
  private readonly field;
3187
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3188
+ private readonly fieldTouched;
3069
3189
  /** Localised strings (override globally via `provideMkI18n`). */
3070
3190
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
3071
3191
  /** Control size. Ignored when nested in an `mk-form-field`. */
@@ -3193,6 +3313,8 @@ declare function mkTaxIdValidator(country: string): ValidatorFn;
3193
3313
  */
3194
3314
  declare class MkTaxIdInput implements ControlValueAccessor, Validator {
3195
3315
  private readonly field;
3316
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3317
+ private readonly fieldTouched;
3196
3318
  /** Localised strings (override globally via `provideMkI18n`). */
3197
3319
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
3198
3320
  /** ISO 3166-1 alpha-2 country whose format applies. */
@@ -3275,6 +3397,8 @@ declare class MkTaxIdInput implements ControlValueAccessor, Validator {
3275
3397
  declare class MkSignaturePad implements ControlValueAccessor, OnDestroy {
3276
3398
  private readonly host;
3277
3399
  private readonly field;
3400
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3401
+ private readonly fieldTouched;
3278
3402
  private readonly isBrowser;
3279
3403
  /** Localised strings (override globally via `provideMkI18n`). */
3280
3404
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
@@ -3420,6 +3544,8 @@ declare class MkButtonToggleGroup implements ControlValueAccessor {
3420
3544
  private readonly host;
3421
3545
  /** Optional surrounding form field — supplies label/hint/error wiring. */
3422
3546
  private readonly field;
3547
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3548
+ private readonly fieldTouched;
3423
3549
  /** Live list of projected toggle items, in DOM order. */
3424
3550
  readonly toggles: _angular_core.Signal<readonly MkButtonToggle[]>;
3425
3551
  /** Allow selecting any number of items (toolbar of `aria-pressed` buttons). */
@@ -3524,6 +3650,8 @@ declare class MkRadio implements OnInit, OnDestroy {
3524
3650
  declare class MkRadioGroup implements ControlValueAccessor, Validator {
3525
3651
  private readonly host;
3526
3652
  private readonly field;
3653
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3654
+ private readonly fieldTouched;
3527
3655
  /** Two-way selected value. */
3528
3656
  readonly value: _angular_core.ModelSignal<unknown>;
3529
3657
  /** Disable the whole group. */
@@ -3595,12 +3723,16 @@ declare class MkRadioGroup implements ControlValueAccessor, Validator {
3595
3723
  */
3596
3724
  declare class MkSwitch implements ControlValueAccessor {
3597
3725
  private readonly field;
3726
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3727
+ private readonly fieldTouched;
3598
3728
  /** Two-way checked (on/off) state. */
3599
3729
  readonly checked: _angular_core.ModelSignal<boolean>;
3600
3730
  /** Disable the control. */
3601
3731
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3602
3732
  /** Force the invalid visual + `aria-invalid` when used standalone. */
3603
3733
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
3734
+ /** Mark required (adds `aria-required`). Set by Signal Forms' `[formField]` from the schema. */
3735
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
3604
3736
  /** Control size. */
3605
3737
  readonly size: _angular_core.InputSignal<MkSize>;
3606
3738
  /** Semantic color tone for the "on" track. */
@@ -3623,7 +3755,7 @@ declare class MkSwitch implements ControlValueAccessor {
3623
3755
  registerOnTouched(fn: () => void): void;
3624
3756
  setDisabledState(isDisabled: boolean): void;
3625
3757
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkSwitch, never>;
3626
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkSwitch, "mk-switch", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, ["*"], true, never>;
3758
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkSwitch, "mk-switch", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, ["*"], true, never>;
3627
3759
  }
3628
3760
 
3629
3761
  /**
@@ -3640,6 +3772,8 @@ declare class MkSwitch implements ControlValueAccessor {
3640
3772
  */
3641
3773
  declare class MkSlider implements ControlValueAccessor, Validator, OnDestroy {
3642
3774
  private readonly field;
3775
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3776
+ private readonly fieldTouched;
3643
3777
  private readonly trackRef;
3644
3778
  private readonly thumbRef;
3645
3779
  /** Minimum value. */
@@ -3652,6 +3786,8 @@ declare class MkSlider implements ControlValueAccessor, Validator, OnDestroy {
3652
3786
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3653
3787
  /** Force the invalid visual + `aria-invalid` when used standalone. */
3654
3788
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
3789
+ /** Mark required (adds `aria-required`). Set by Signal Forms' `[formField]` from the schema. */
3790
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
3655
3791
  /** Control size (track/thumb thickness). */
3656
3792
  readonly size: _angular_core.InputSignal<MkSize>;
3657
3793
  /** Semantic color tone for the filled track + thumb. */
@@ -3705,7 +3841,7 @@ declare class MkSlider implements ControlValueAccessor, Validator, OnDestroy {
3705
3841
  validate(control: AbstractControl): ValidationErrors | null;
3706
3842
  registerOnValidatorChange(fn: () => void): void;
3707
3843
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkSlider, never>;
3708
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkSlider, "mk-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
3844
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkSlider, "mk-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
3709
3845
  }
3710
3846
 
3711
3847
  /**
@@ -3719,6 +3855,8 @@ declare class MkSlider implements ControlValueAccessor, Validator, OnDestroy {
3719
3855
  */
3720
3856
  declare class MkColorPicker implements ControlValueAccessor {
3721
3857
  private readonly field;
3858
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3859
+ private readonly fieldTouched;
3722
3860
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
3723
3861
  private readonly nativeRef;
3724
3862
  /** Two-way hex color value. */
@@ -3778,6 +3916,8 @@ type MkRange = [number, number];
3778
3916
  declare class MkRangeSlider implements ControlValueAccessor, Validator, OnDestroy {
3779
3917
  private readonly host;
3780
3918
  private readonly field;
3919
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3920
+ private readonly fieldTouched;
3781
3921
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
3782
3922
  private readonly trackRef;
3783
3923
  private readonly thumbRefs;