@mk-kit/ui 0.42.0 → 0.44.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 (57) hide show
  1. package/README.md +5 -3
  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 +136 -1
  8. package/fesm2022/mk-kit-ui-core.mjs.map +1 -1
  9. package/fesm2022/mk-kit-ui-data.mjs +438 -8
  10. package/fesm2022/mk-kit-ui-data.mjs.map +1 -1
  11. package/fesm2022/mk-kit-ui-datetime.mjs +88 -50
  12. package/fesm2022/mk-kit-ui-datetime.mjs.map +1 -1
  13. package/fesm2022/mk-kit-ui-directives.mjs +27 -8
  14. package/fesm2022/mk-kit-ui-directives.mjs.map +1 -1
  15. package/fesm2022/mk-kit-ui-dnd.mjs +43 -8
  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 +326 -78
  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-media.mjs +1 -1
  28. package/fesm2022/mk-kit-ui-media.mjs.map +1 -1
  29. package/fesm2022/mk-kit-ui-query-builder.mjs +1 -1
  30. package/fesm2022/mk-kit-ui-query-builder.mjs.map +1 -1
  31. package/fesm2022/mk-kit-ui-rich-text.mjs +4 -2
  32. package/fesm2022/mk-kit-ui-rich-text.mjs.map +1 -1
  33. package/fesm2022/mk-kit-ui-table.mjs +668 -24
  34. package/fesm2022/mk-kit-ui-table.mjs.map +1 -1
  35. package/fesm2022/mk-kit-ui-testing.mjs +54 -0
  36. package/fesm2022/mk-kit-ui-testing.mjs.map +1 -1
  37. package/fesm2022/mk-kit-ui.mjs +1 -0
  38. package/fesm2022/mk-kit-ui.mjs.map +1 -1
  39. package/package.json +5 -1
  40. package/schematics/migrate-primeng/transform.js +4 -1
  41. package/schematics/ng-add/index.js +30 -2
  42. package/schematics/ng-add/schema.json +6 -0
  43. package/types/mk-kit-ui-block-editor.d.ts +2 -0
  44. package/types/mk-kit-ui-checkbox.d.ts +2 -0
  45. package/types/mk-kit-ui-core.d.ts +82 -2
  46. package/types/mk-kit-ui-data.d.ts +203 -2
  47. package/types/mk-kit-ui-datetime.d.ts +41 -19
  48. package/types/mk-kit-ui-directives.d.ts +12 -6
  49. package/types/mk-kit-ui-dnd.d.ts +32 -4
  50. package/types/mk-kit-ui-dynamic-form.d.ts +44 -1
  51. package/types/mk-kit-ui-forms.d.ts +154 -16
  52. package/types/mk-kit-ui-icon-extended.d.ts +83 -0
  53. package/types/mk-kit-ui-icon.d.ts +100 -17
  54. package/types/mk-kit-ui-rich-text.d.ts +2 -0
  55. package/types/mk-kit-ui-table.d.ts +234 -25
  56. package/types/mk-kit-ui-testing.d.ts +16 -0
  57. 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;
@@ -1785,6 +1881,8 @@ declare class MkRepeater<T = unknown> implements ControlValueAccessor {
1785
1881
  */
1786
1882
  declare class MkTreeSelect implements ControlValueAccessor {
1787
1883
  private readonly field;
1884
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
1885
+ private readonly fieldTouched;
1788
1886
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1789
1887
  private readonly host;
1790
1888
  private readonly injector;
@@ -2100,6 +2198,8 @@ declare class MkCodeEditor implements ControlValueAccessor, OnDestroy {
2100
2198
  protected readonly describedBy: _angular_core.Signal<string | null>;
2101
2199
  /** Parse error for JSON content, or `null` when valid / empty / plaintext. */
2102
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;
2103
2203
  protected readonly isInvalid: _angular_core.Signal<boolean>;
2104
2204
  /** `aria-describedby` merging the field's ids with the JSON error id. */
2105
2205
  protected readonly ariaDescribedBy: _angular_core.Signal<string | null>;
@@ -2156,6 +2256,8 @@ declare class MkCodeEditor implements ControlValueAccessor, OnDestroy {
2156
2256
  */
2157
2257
  declare class MkRating implements ControlValueAccessor, Validator {
2158
2258
  private readonly field;
2259
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2260
+ private readonly fieldTouched;
2159
2261
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2160
2262
  /** Number of stars. */
2161
2263
  readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -2222,14 +2324,16 @@ declare class MkRating implements ControlValueAccessor, Validator {
2222
2324
  */
2223
2325
  declare class MkNumberInput implements ControlValueAccessor, Validator {
2224
2326
  private readonly field;
2327
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2328
+ private readonly fieldTouched;
2225
2329
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2226
2330
  private readonly inputRef;
2227
2331
  /** Minimum value. */
2228
2332
  /** Accessible name when the control is used without an `mk-form-field` label. */
2229
2333
  readonly ariaLabel: _angular_core.InputSignal<string>;
2230
- readonly min: _angular_core.InputSignal<number | null>;
2334
+ readonly min: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2231
2335
  /** Maximum value. */
2232
- readonly max: _angular_core.InputSignal<number | null>;
2336
+ readonly max: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2233
2337
  /** Step increment for buttons + Arrow keys. */
2234
2338
  readonly step: _angular_core.InputSignalWithTransform<number, unknown>;
2235
2339
  /** Two-way value. */
@@ -2240,6 +2344,8 @@ declare class MkNumberInput implements ControlValueAccessor, Validator {
2240
2344
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
2241
2345
  /** Force invalid styling when standalone. */
2242
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>;
2243
2349
  /** Control size. Ignored inside an `mk-form-field`. */
2244
2350
  readonly size: _angular_core.InputSignal<MkSize>;
2245
2351
  protected readonly inputId: string;
@@ -2274,7 +2380,7 @@ declare class MkNumberInput implements ControlValueAccessor, Validator {
2274
2380
  validate(control: AbstractControl): ValidationErrors | null;
2275
2381
  registerOnValidatorChange(fn: () => void): void;
2276
2382
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkNumberInput, never>;
2277
- 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>;
2278
2384
  }
2279
2385
 
2280
2386
  type MkNumericKeypadMode = 'pin' | 'quantity' | 'amount';
@@ -2314,9 +2420,9 @@ declare class MkNumericKeypad implements ControlValueAccessor, Validator {
2314
2420
  /** PIN length (`pin` mode only). Reaching it emits `submit`. */
2315
2421
  readonly length: _angular_core.InputSignalWithTransform<number, unknown>;
2316
2422
  /** Lower bound reported through the validator (`quantity`/`amount`). */
2317
- readonly min: _angular_core.InputSignal<number | null>;
2423
+ readonly min: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2318
2424
  /** Upper bound reported through the validator (`quantity`/`amount`). */
2319
- readonly max: _angular_core.InputSignal<number | null>;
2425
+ readonly max: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2320
2426
  /** Mask the echo row in `pin` mode. Default `true`. */
2321
2427
  readonly mask: _angular_core.InputSignalWithTransform<boolean, unknown>;
2322
2428
  /** Show the echo row above the keys. Default `true`. */
@@ -2508,6 +2614,8 @@ declare class MkOnScreenKeyboardTrigger {
2508
2614
  */
2509
2615
  declare class MkOtp implements ControlValueAccessor, Validator {
2510
2616
  private readonly field;
2617
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2618
+ private readonly fieldTouched;
2511
2619
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2512
2620
  private readonly cells;
2513
2621
  /** Number of character boxes. */
@@ -2634,6 +2742,8 @@ interface CountryOption {
2634
2742
  */
2635
2743
  declare class MkPhoneInput implements ControlValueAccessor {
2636
2744
  private readonly field;
2745
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2746
+ private readonly fieldTouched;
2637
2747
  /** Localised strings (override globally via `provideMkI18n`). */
2638
2748
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2639
2749
  private readonly triggerRef;
@@ -2775,6 +2885,8 @@ declare function mkPostalCodeValidator(country: string, formats?: readonly MkPos
2775
2885
  */
2776
2886
  declare class MkPostalCodeInput implements ControlValueAccessor, Validator {
2777
2887
  private readonly field;
2888
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2889
+ private readonly fieldTouched;
2778
2890
  /** Localised strings (override globally via `provideMkI18n`). */
2779
2891
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2780
2892
  /** ISO 3166-1 alpha-2 country whose format applies. */
@@ -2867,6 +2979,8 @@ interface LocaleInfo {
2867
2979
  */
2868
2980
  declare class MkCurrencyInput implements ControlValueAccessor, Validator {
2869
2981
  private readonly field;
2982
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
2983
+ private readonly fieldTouched;
2870
2984
  /** Localised strings (override globally via `provideMkI18n`). */
2871
2985
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2872
2986
  /** ISO 4217 currency code (`PLN`, `USD`, …). Empty = plain decimal. */
@@ -2878,9 +2992,9 @@ declare class MkCurrencyInput implements ControlValueAccessor, Validator {
2878
2992
  /** Max fraction digits; defaults to the currency's convention (else 2). */
2879
2993
  readonly decimals: _angular_core.InputSignal<number | null>;
2880
2994
  /** Clamp the value to at least this on blur. */
2881
- readonly min: _angular_core.InputSignal<number | null>;
2995
+ readonly min: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2882
2996
  /** Clamp the value to at most this on blur. */
2883
- readonly max: _angular_core.InputSignal<number | null>;
2997
+ readonly max: _angular_core.InputSignalWithTransform<number | null, number | null | undefined>;
2884
2998
  /** Allow a leading minus sign. */
2885
2999
  readonly allowNegative: _angular_core.InputSignalWithTransform<boolean, unknown>;
2886
3000
  /** Control size. Ignored when nested in an `mk-form-field`. */
@@ -2969,6 +3083,8 @@ declare function mkLuhnCheck(digits: string): boolean;
2969
3083
  */
2970
3084
  declare class MkCardNumberInput implements ControlValueAccessor, Validator {
2971
3085
  private readonly field;
3086
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3087
+ private readonly fieldTouched;
2972
3088
  /** Localised strings (override globally via `provideMkI18n`). */
2973
3089
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2974
3090
  /** Show the detected brand as a badge inside the field. */
@@ -3068,6 +3184,8 @@ declare function mkIbanValidator(): ValidatorFn;
3068
3184
  */
3069
3185
  declare class MkIbanInput implements ControlValueAccessor, Validator {
3070
3186
  private readonly field;
3187
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3188
+ private readonly fieldTouched;
3071
3189
  /** Localised strings (override globally via `provideMkI18n`). */
3072
3190
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
3073
3191
  /** Control size. Ignored when nested in an `mk-form-field`. */
@@ -3195,6 +3313,8 @@ declare function mkTaxIdValidator(country: string): ValidatorFn;
3195
3313
  */
3196
3314
  declare class MkTaxIdInput implements ControlValueAccessor, Validator {
3197
3315
  private readonly field;
3316
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3317
+ private readonly fieldTouched;
3198
3318
  /** Localised strings (override globally via `provideMkI18n`). */
3199
3319
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
3200
3320
  /** ISO 3166-1 alpha-2 country whose format applies. */
@@ -3277,6 +3397,8 @@ declare class MkTaxIdInput implements ControlValueAccessor, Validator {
3277
3397
  declare class MkSignaturePad implements ControlValueAccessor, OnDestroy {
3278
3398
  private readonly host;
3279
3399
  private readonly field;
3400
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3401
+ private readonly fieldTouched;
3280
3402
  private readonly isBrowser;
3281
3403
  /** Localised strings (override globally via `provideMkI18n`). */
3282
3404
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
@@ -3422,6 +3544,8 @@ declare class MkButtonToggleGroup implements ControlValueAccessor {
3422
3544
  private readonly host;
3423
3545
  /** Optional surrounding form field — supplies label/hint/error wiring. */
3424
3546
  private readonly field;
3547
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3548
+ private readonly fieldTouched;
3425
3549
  /** Live list of projected toggle items, in DOM order. */
3426
3550
  readonly toggles: _angular_core.Signal<readonly MkButtonToggle[]>;
3427
3551
  /** Allow selecting any number of items (toolbar of `aria-pressed` buttons). */
@@ -3526,6 +3650,8 @@ declare class MkRadio implements OnInit, OnDestroy {
3526
3650
  declare class MkRadioGroup implements ControlValueAccessor, Validator {
3527
3651
  private readonly host;
3528
3652
  private readonly field;
3653
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3654
+ private readonly fieldTouched;
3529
3655
  /** Two-way selected value. */
3530
3656
  readonly value: _angular_core.ModelSignal<unknown>;
3531
3657
  /** Disable the whole group. */
@@ -3597,12 +3723,16 @@ declare class MkRadioGroup implements ControlValueAccessor, Validator {
3597
3723
  */
3598
3724
  declare class MkSwitch implements ControlValueAccessor {
3599
3725
  private readonly field;
3726
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3727
+ private readonly fieldTouched;
3600
3728
  /** Two-way checked (on/off) state. */
3601
3729
  readonly checked: _angular_core.ModelSignal<boolean>;
3602
3730
  /** Disable the control. */
3603
3731
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3604
3732
  /** Force the invalid visual + `aria-invalid` when used standalone. */
3605
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>;
3606
3736
  /** Control size. */
3607
3737
  readonly size: _angular_core.InputSignal<MkSize>;
3608
3738
  /** Semantic color tone for the "on" track. */
@@ -3625,7 +3755,7 @@ declare class MkSwitch implements ControlValueAccessor {
3625
3755
  registerOnTouched(fn: () => void): void;
3626
3756
  setDisabledState(isDisabled: boolean): void;
3627
3757
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkSwitch, never>;
3628
- 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>;
3629
3759
  }
3630
3760
 
3631
3761
  /**
@@ -3642,6 +3772,8 @@ declare class MkSwitch implements ControlValueAccessor {
3642
3772
  */
3643
3773
  declare class MkSlider implements ControlValueAccessor, Validator, OnDestroy {
3644
3774
  private readonly field;
3775
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3776
+ private readonly fieldTouched;
3645
3777
  private readonly trackRef;
3646
3778
  private readonly thumbRef;
3647
3779
  /** Minimum value. */
@@ -3654,6 +3786,8 @@ declare class MkSlider implements ControlValueAccessor, Validator, OnDestroy {
3654
3786
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3655
3787
  /** Force the invalid visual + `aria-invalid` when used standalone. */
3656
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>;
3657
3791
  /** Control size (track/thumb thickness). */
3658
3792
  readonly size: _angular_core.InputSignal<MkSize>;
3659
3793
  /** Semantic color tone for the filled track + thumb. */
@@ -3707,7 +3841,7 @@ declare class MkSlider implements ControlValueAccessor, Validator, OnDestroy {
3707
3841
  validate(control: AbstractControl): ValidationErrors | null;
3708
3842
  registerOnValidatorChange(fn: () => void): void;
3709
3843
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkSlider, never>;
3710
- 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>;
3711
3845
  }
3712
3846
 
3713
3847
  /**
@@ -3721,6 +3855,8 @@ declare class MkSlider implements ControlValueAccessor, Validator, OnDestroy {
3721
3855
  */
3722
3856
  declare class MkColorPicker implements ControlValueAccessor {
3723
3857
  private readonly field;
3858
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3859
+ private readonly fieldTouched;
3724
3860
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
3725
3861
  private readonly nativeRef;
3726
3862
  /** Two-way hex color value. */
@@ -3780,6 +3916,8 @@ type MkRange = [number, number];
3780
3916
  declare class MkRangeSlider implements ControlValueAccessor, Validator, OnDestroy {
3781
3917
  private readonly host;
3782
3918
  private readonly field;
3919
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3920
+ private readonly fieldTouched;
3783
3921
  protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
3784
3922
  private readonly trackRef;
3785
3923
  private readonly thumbRefs;