@ktortu/aaa 0.9.0 → 0.9.2

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 (54) hide show
  1. package/README.md +5 -3
  2. package/fesm2022/ktortu-aaa-button.mjs +10 -2
  3. package/fesm2022/ktortu-aaa-button.mjs.map +1 -1
  4. package/fesm2022/ktortu-aaa-card.mjs +14 -5
  5. package/fesm2022/ktortu-aaa-card.mjs.map +1 -1
  6. package/fesm2022/ktortu-aaa-cdk.mjs +50 -2
  7. package/fesm2022/ktortu-aaa-cdk.mjs.map +1 -1
  8. package/fesm2022/ktortu-aaa-dialog.mjs +80 -39
  9. package/fesm2022/ktortu-aaa-dialog.mjs.map +1 -1
  10. package/fesm2022/ktortu-aaa-disclosure.mjs +201 -0
  11. package/fesm2022/ktortu-aaa-disclosure.mjs.map +1 -0
  12. package/fesm2022/ktortu-aaa-forms.mjs +525 -149
  13. package/fesm2022/ktortu-aaa-forms.mjs.map +1 -1
  14. package/fesm2022/ktortu-aaa-i18n.mjs +27 -2
  15. package/fesm2022/ktortu-aaa-i18n.mjs.map +1 -1
  16. package/fesm2022/ktortu-aaa-menu.mjs.map +1 -1
  17. package/fesm2022/ktortu-aaa-progress-bar.mjs +91 -0
  18. package/fesm2022/ktortu-aaa-progress-bar.mjs.map +1 -0
  19. package/fesm2022/ktortu-aaa-snackbar.mjs +478 -0
  20. package/fesm2022/ktortu-aaa-snackbar.mjs.map +1 -0
  21. package/fesm2022/ktortu-aaa-tabs.mjs.map +1 -1
  22. package/fesm2022/ktortu-aaa-tooltip.mjs +20 -30
  23. package/fesm2022/ktortu-aaa-tooltip.mjs.map +1 -1
  24. package/fesm2022/ktortu-aaa.mjs +2 -0
  25. package/fesm2022/ktortu-aaa.mjs.map +1 -1
  26. package/forms/checkbox/checkbox-group.css +0 -8
  27. package/forms/chips/chip-list.css +5 -0
  28. package/forms/field/field.css +16 -0
  29. package/forms/radio/radio-group.css +1 -9
  30. package/forms/styles/field-box.css +14 -6
  31. package/forms/styles/field-pending.css +46 -0
  32. package/forms/styles/select-panel.css +4 -0
  33. package/package.json +13 -1
  34. package/progress-bar/progress-bar.css +127 -0
  35. package/snackbar/snackbar-tokens.css +53 -0
  36. package/snackbar/snackbar.css +175 -0
  37. package/styles/disclosure.css +6 -0
  38. package/styles/forms.css +1 -0
  39. package/styles/progress-bar.css +5 -0
  40. package/styles/snackbar.css +9 -0
  41. package/styles/styles.css +3 -0
  42. package/themes/theme-cyberpunk.css +11 -0
  43. package/tooltip/tooltip.css +1 -1
  44. package/types/ktortu-aaa-button.d.ts +2 -0
  45. package/types/ktortu-aaa-card.d.ts +3 -0
  46. package/types/ktortu-aaa-cdk.d.ts +27 -1
  47. package/types/ktortu-aaa-dialog.d.ts +89 -34
  48. package/types/ktortu-aaa-disclosure.d.ts +112 -0
  49. package/types/ktortu-aaa-forms.d.ts +238 -30
  50. package/types/ktortu-aaa-i18n.d.ts +3 -0
  51. package/types/ktortu-aaa-progress-bar.d.ts +27 -0
  52. package/types/ktortu-aaa-snackbar.d.ts +218 -0
  53. package/types/ktortu-aaa-tooltip.d.ts +0 -1
  54. package/types/ktortu-aaa.d.ts +2 -0
@@ -1,8 +1,8 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { InjectionToken, Signal, Provider, TemplateRef, ModelSignal, ElementRef, PipeTransform } from '@angular/core';
3
- import * as _ktortu_aaa_forms from '@ktortu/aaa/forms';
4
3
  import * as _angular_forms_signals from '@angular/forms/signals';
5
- import { WithOptionalFieldTree, ValidationError, FormValueControl } from '@angular/forms/signals';
4
+ import { ValidationError, WithOptionalFieldTree, FormValueControl } from '@angular/forms/signals';
5
+ import * as _ktortu_aaa_forms from '@ktortu/aaa/forms';
6
6
  import { Listbox } from '@angular/aria/listbox';
7
7
  import { Combobox } from '@angular/aria/combobox';
8
8
  import { KtViewport } from '@ktortu/aaa/cdk';
@@ -21,6 +21,16 @@ interface KtFieldErrorState {
21
21
  }
22
22
  /** Décide QUAND afficher les erreurs d'un champ (équivalent signal de l'ErrorStateMatcher Material). */
23
23
  type KtFieldErrorMatcher = (state: KtFieldErrorState) => boolean;
24
+ /** Erreur à résoudre en message : la `ValidationError` de Signal Forms. Selon le `kind`, ses
25
+ sous-types portent des params typés (`min`, `max`, `minLength`, `maxLength`, `minDate`,
26
+ `maxDate`, `pattern`…) lisibles via {@link ktErrorParam}. */
27
+ type KtResolvableError = ValidationError;
28
+ /** Fabrique de message par défaut pour un `kind` : reçoit l'erreur complète (params accessibles). */
29
+ type KtErrorMessageFactory = (error: KtResolvableError) => string;
30
+ /** Messages d'erreur par défaut indexés par `kind`. Valeur statique (kinds sans param : `required`,
31
+ `email`) ou fabrique (kinds paramétrés : `min`, `minLength`…). Une chaîne vide (`''`) supprime
32
+ l'affichage du message — le champ reste invalide, mais sans texte (cf. récap d'erreurs externe). */
33
+ type KtFieldErrorMessages = Record<string, string | KtErrorMessageFactory>;
24
34
  /** Apparence du chrome de champ. `fill` = label au-dessus (défaut historique) ; `outline` = bordure
25
35
  + label flottant qui se loge dans la bordure (transition douce depuis Angular Material « outline »). */
26
36
  type KtFieldAppearance = 'fill' | 'outline';
@@ -47,6 +57,11 @@ interface KtFieldConfig {
47
57
  /** Message d'erreur d'un `kt-number-field` quand la saisie n'est pas un nombre valide.
48
58
  Défaut (anglais neutre) : `'Please enter a valid number.'`. */
49
59
  numberParseError: string;
60
+ /** Messages d'erreur par défaut indexés par `kind` (`required`, `email`, `min`, `minLength`…),
61
+ fusionnés par-dessus les défauts anglais embarqués (cf. `KT_DEFAULT_FIELD_ERROR_MESSAGES`).
62
+ Un message explicite passé au validateur Signal Forms (`{ message }`) reste prioritaire ; une
63
+ valeur `''` supprime le texte d'un `kind`. Défaut : `{}` (on garde les défauts anglais). */
64
+ errorMessages: Partial<KtFieldErrorMessages>;
50
65
  /** Apparence par défaut de tous les champs (`fill` | `outline`). Défaut : `'fill'`. */
51
66
  appearance: KtFieldAppearance;
52
67
  /** Politique du label flottant en `outline` (`auto` | `always`). Défaut : `'auto'`. */
@@ -54,15 +69,33 @@ interface KtFieldConfig {
54
69
  }
55
70
  declare const KT_FIELD_CONFIG: InjectionToken<Partial<KtFieldConfig>>;
56
71
  /**
57
- * Fournit des défauts de champ (apparence, libellés, matcher d'erreurs…) pour un sous-arbre ou
58
- * l'application entière. Idéal pour une transition globale — ex. tout passer en `outline` façon
59
- * Material en un seul provider.
72
+ * Fournit des défauts de champ (apparence, libellés, matcher d'erreurs, messages d'erreur par
73
+ * défaut…) pour un sous-arbre ou l'application entière. Idéal pour une transition globale — ex. tout
74
+ * passer en `outline` façon Material en un seul provider.
60
75
  *
61
76
  * @example
62
77
  * ```ts
63
- * // app.config.ts
78
+ * // app.config.ts — apparence globale
64
79
  * providers: [provideKtField({ appearance: 'outline' })]
65
80
  * ```
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * // Surcharger des messages d'erreur par défaut (fusionnés par-dessus les défauts anglais).
85
+ * // Une fabrique reçoit l'erreur complète : ses params typés sont lisibles via `ktErrorParam`.
86
+ * providers: [
87
+ * provideKtField({
88
+ * errorMessages: {
89
+ * required: 'Champ obligatoire.',
90
+ * minLength: (e) => `Au moins ${ktErrorParam<number>(e, 'minLength')} caractères.`,
91
+ * pattern: '', // '' supprime le texte de ce kind : champ rouge, sans message
92
+ * },
93
+ * }),
94
+ * ]
95
+ * ```
96
+ *
97
+ * @remarks Pour passer toute la lib en français d'un coup (libellés + messages d'erreur), préférez
98
+ * `provideKtDefaultFR()` (paquet `@ktortu/aaa/i18n`), qui fournit déjà un dictionnaire complet.
66
99
  */
67
100
  declare function provideKtField(config: Partial<KtFieldConfig>): Provider;
68
101
  /** Parent field interface representing shared states for its controls. */
@@ -131,22 +164,23 @@ declare class KtField implements KtFieldParent {
131
164
  /** Politique effective : input ?? KT_FIELD_CONFIG.floatLabel ?? 'auto'. */
132
165
  protected readonly resolvedFloatLabel: _angular_core.Signal<KtFloatLabel>;
133
166
  private readonly control;
134
- private readonly templateTooltip;
135
- private readonly projectedTooltip;
136
- private readonly activeTooltip;
137
167
  private readonly idGen;
138
168
  private readonly uid;
139
169
  readonly baseId: _angular_core.Signal<string>;
140
170
  protected readonly labelId: _angular_core.Signal<string>;
141
171
  protected readonly hintId: _angular_core.Signal<string>;
142
172
  protected readonly errorId: _angular_core.Signal<string>;
173
+ protected readonly helpId: _angular_core.Signal<string>;
174
+ protected readonly helpTemplate: _angular_core.Signal<TemplateRef<unknown> | null>;
175
+ protected readonly helpString: _angular_core.Signal<string | null>;
176
+ protected readonly hasHelp: _angular_core.Signal<boolean>;
143
177
  protected readonly hasError: _angular_core.Signal<boolean>;
144
178
  protected readonly showHint: _angular_core.Signal<boolean>;
145
179
  protected readonly displayedErrors: _angular_core.Signal<readonly KtFieldError[]>;
146
180
  readonly describedBy: _angular_core.Signal<string | null>;
147
181
  protected onHelpClick(event: MouseEvent): void;
148
182
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtField, never>;
149
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtField, "kt-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "fieldId": { "alias": "fieldId"; "required": false; "isSignal": true; }; "hideHintWhenInvalid": { "alias": "hideHintWhenInvalid"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; }, { "helpClick": "helpClick"; }, ["control", "projectedTooltip"], ["[ktFieldHelp]", "*"], true, never>;
183
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtField, "kt-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "fieldId": { "alias": "fieldId"; "required": false; "isSignal": true; }; "hideHintWhenInvalid": { "alias": "hideHintWhenInvalid"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; }, { "helpClick": "helpClick"; }, ["control"], ["[ktFieldHelp]", "*"], true, never>;
150
184
  }
151
185
 
152
186
  /** Marque le contrôle (natif ou custom) d'un champ pour que `Field` y câble l'a11y
@@ -170,6 +204,54 @@ declare class KtFieldControl {
170
204
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtFieldControl, "[ktFieldControl]", never, {}, {}, never, never, true, never>;
171
205
  }
172
206
 
207
+ /**
208
+ * Lit un param typé d'une `ValidationError` (ex. `min`, `minLength`, `maxLength`, `minDate`…).
209
+ * Les sous-types d'erreur de Signal Forms exposent ces params, mais le type de base `ValidationError`
210
+ * ne les déclare pas : ce helper centralise l'accès pour les fabriques de message, sans `any`.
211
+ *
212
+ * @example
213
+ * ```ts
214
+ * minLength: (e) => `Au moins ${ktErrorParam<number>(e, 'minLength')} caractères.`
215
+ * ```
216
+ */
217
+ declare function ktErrorParam<T>(error: KtResolvableError, key: string): T;
218
+ /**
219
+ * Messages d'erreur **anglais** par défaut de la lib, indexés par `kind`. Couvrent tous les
220
+ * validateurs natifs de Signal Forms (`required`, `email`, `min`, `max`, `minLength`, `maxLength`,
221
+ * `minDate`, `maxDate`, `pattern`). Surchargeables famille par famille via `KT_FIELD_CONFIG.errorMessages`
222
+ * (ou globalement par langue, cf. `provideKtDefaultFR`). Le `numberParseError` reste géré à la source
223
+ * par `kt-number-field` (kind `parse`).
224
+ */
225
+ declare const KT_DEFAULT_FIELD_ERROR_MESSAGES: KtFieldErrorMessages;
226
+ /**
227
+ * Résout le **message par défaut** d'une erreur de validation à partir de son `kind` (et de ses
228
+ * params typés), en fusionnant les défauts anglais embarqués avec les surcharges du `KT_FIELD_CONFIG`.
229
+ *
230
+ * Utilisé par chaque contrôle `kt-*` au moment du rendu, là où la `ValidationError` complète (params)
231
+ * est encore disponible — `kt-field` reste agnostique de Signal Forms. Précédence du texte affiché :
232
+ * `message` du validateur > `KT_FIELD_CONFIG.errorMessages[kind]` > défaut anglais > rien.
233
+ *
234
+ * Injectable racine : un seul résolveur partagé par tous les champs.
235
+ */
236
+ declare class KtFieldErrorResolver {
237
+ private readonly config;
238
+ /** Map effective : défauts anglais + surcharges du `KT_FIELD_CONFIG`, par `kind`. */
239
+ private readonly messages;
240
+ /**
241
+ * Message par défaut d'une erreur (selon son `kind` + params), ou `undefined` si aucun défaut
242
+ * n'est connu pour ce `kind` (l'UI n'affiche alors rien).
243
+ */
244
+ resolve(error: KtResolvableError): string | undefined;
245
+ /**
246
+ * Prépare une liste d'erreurs pour l'affichage : applique la précédence (message du validateur
247
+ * sinon défaut résolu) et **écarte les erreurs au message vide** — suppression explicite via
248
+ * `{ message: '' }`. Le champ reste invalide (rouge / `aria-invalid`), simplement sans texte.
249
+ */
250
+ resolveAll(errors: readonly KtResolvableError[]): KtFieldError[];
251
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtFieldErrorResolver, never>;
252
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<KtFieldErrorResolver>;
253
+ }
254
+
173
255
  /** Base partagée des champs simples (TextField, NumberField) : état FormValueControl,
174
256
  présentation (label/hint/prefix/suffix/clear) et politique d'affichage des erreurs.
175
257
  La valeur, son parsing et la notion de « vide » sont fournis par la sous-classe.
@@ -187,6 +269,7 @@ declare class KtFieldControl {
187
269
  ``` */
188
270
  declare abstract class KtBaseInputField<T> {
189
271
  protected readonly config: Partial<_ktortu_aaa_forms.KtFieldConfig> | null;
272
+ private readonly errorResolver;
190
273
  /** Valeur du contrôle — déclarée concrètement par la sous-classe. */
191
274
  abstract value: ModelSignal<T>;
192
275
  /** Marque le champ comme « visité » (déclenche l'affichage des erreurs). Deux-way. @default false */
@@ -201,6 +284,8 @@ declare abstract class KtBaseInputField<T> {
201
284
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
202
285
  /** Le champ a-t-il été modifié depuis sa valeur initiale. @default false */
203
286
  readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
287
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
288
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
204
289
  /** Liste des erreurs de validation à afficher. @default [] */
205
290
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
206
291
  /** Attribut `name` natif du contrôle. @default '' */
@@ -246,6 +331,8 @@ declare abstract class KtBaseInputField<T> {
246
331
  protected readonly inputRef: _angular_core.Signal<ElementRef<HTMLInputElement | HTMLTextAreaElement> | undefined>;
247
332
  private readonly matcher;
248
333
  protected readonly showInvalid: _angular_core.Signal<boolean>;
334
+ /** Erreurs prêtes pour `kt-field` : messages par défaut résolus, suppressions (`message: ''`) écartées. */
335
+ protected readonly displayErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
249
336
  protected readonly showClear: _angular_core.Signal<boolean>;
250
337
  /** Apparence effective (input ?? config ?? 'fill'). Sert aux templates : forward à `kt-field` et,
251
338
  en outline, pose une sentinelle de placeholder pour la détection « rempli » du label flottant. */
@@ -261,6 +348,12 @@ declare abstract class KtBaseInputField<T> {
261
348
  protected asText(value: string | TemplateRef<unknown> | undefined): string | null;
262
349
  protected onInput(event: Event): void;
263
350
  protected onKeyDown(event: KeyboardEvent): void;
351
+ /** Focus le contrôle natif (utilisé par Signal Forms `focusBoundControl`). */
352
+ focus(options?: FocusOptions): void;
353
+ /** Ré-aligne le texte affiché sur la valeur courante (utilisé par Signal Forms `reset`). */
354
+ reset(): void;
355
+ /** Représentation texte de la valeur pour l'input natif. Surchargeable par sous-classe. */
356
+ protected displayValue(): string;
264
357
  protected clear(): void;
265
358
  /** Parse la saisie brute en valeur typée. */
266
359
  protected abstract parse(raw: string): T;
@@ -269,7 +362,7 @@ declare abstract class KtBaseInputField<T> {
269
362
  /** La valeur est-elle vide (affichage du bouton d'effacement) ? */
270
363
  protected abstract isEmpty(value: T): boolean;
271
364
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtBaseInputField<any>, never>;
272
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseInputField<any>, never, never, { "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "helpClick": "helpClick"; }, never, never, true, never>;
365
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseInputField<any>, never, never, { "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "helpClick": "helpClick"; }, never, never, true, never>;
273
366
  }
274
367
 
275
368
  /** Suggestion d'un champ de saisie (rendu `<datalist>`) : soit la valeur seule, soit un couple
@@ -322,6 +415,7 @@ declare class KtNumberField extends KtBaseInputField<number | null> implements F
322
415
  protected parse(raw: string): number | null;
323
416
  protected onKeyDown(event: KeyboardEvent): void;
324
417
  private adjustValue;
418
+ reset(): void;
325
419
  protected emptyValue(): number | null;
326
420
  protected isEmpty(value: number | null): boolean;
327
421
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtNumberField, never>;
@@ -342,13 +436,15 @@ declare class KtTextArea extends KtBaseInputField<string> implements FormValueCo
342
436
  readonly value: _angular_core.ModelSignal<string>;
343
437
  /** Hauteur initiale (lignes). L'autosize est géré en CSS via `field-sizing: content`. @default 3 */
344
438
  readonly rows: _angular_core.InputSignal<number>;
439
+ /** Plancher de caractères (attribut `minlength` natif ; poussé par le validateur minLength). @default undefined */
440
+ readonly minLength: _angular_core.InputSignal<number | undefined>;
345
441
  /** Plafond de caractères ; poussé par le form (validateur maxLength) ou par le consommateur. @default undefined */
346
442
  readonly maxLength: _angular_core.InputSignal<number | undefined>;
347
443
  protected parse(raw: string): string;
348
444
  protected emptyValue(): string;
349
445
  protected isEmpty(value: string): boolean;
350
446
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtTextArea, never>;
351
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtTextArea, "kt-text-area", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
447
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtTextArea, "kt-text-area", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
352
448
  }
353
449
 
354
450
  /** Types texte dont la valeur reste une string (number/date = composants séparés). */
@@ -367,6 +463,15 @@ declare class KtTextField extends KtBaseInputField<string> implements FormValueC
367
463
  readonly value: _angular_core.ModelSignal<string>;
368
464
  /** Variante HTML du champ (pilote `type` natif et le clavier mobile). @default 'text' */
369
465
  readonly type: _angular_core.InputSignal<KtTextFieldType>;
466
+ /** Plancher de caractères (attribut `minlength` natif ; poussé par le validateur minLength). @default undefined */
467
+ readonly minLength: _angular_core.InputSignal<number | undefined>;
468
+ /** Plafond de caractères (attribut `maxlength` natif ; poussé par le validateur maxLength). @default undefined */
469
+ readonly maxLength: _angular_core.InputSignal<number | undefined>;
470
+ /** Motifs de validation (contrat Signal Forms). L'attribut natif `pattern` ne prend qu'une regex →
471
+ seule la première est posée. @default [] */
472
+ readonly pattern: _angular_core.InputSignal<readonly RegExp[]>;
473
+ /** Source de la première regex pour l'attribut `pattern` natif (`null` si aucune). */
474
+ protected readonly patternAttr: _angular_core.Signal<string>;
370
475
  /** Suggestions d'autocomplétion proposées via un `<datalist>` natif (la saisie reste libre).
371
476
  Valeurs simples (`string[]`) ou couples `{ value, label }` pour distinguer libellé affiché et
372
477
  valeur insérée. @default undefined */
@@ -380,7 +485,49 @@ declare class KtTextField extends KtBaseInputField<string> implements FormValueC
380
485
  protected emptyValue(): string;
381
486
  protected isEmpty(value: string): boolean;
382
487
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtTextField, never>;
383
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtTextField, "kt-text-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
488
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtTextField, "kt-text-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
489
+ }
490
+
491
+ type KtPasswordAutocomplete = 'current-password' | 'new-password' | 'off';
492
+ /**
493
+ * Champ mot de passe (valeur `string`) intégré aux Signal Forms via `FormValueControl`.
494
+ * Inclut un bouton pour masquer/afficher la saisie en clair de manière accessible.
495
+ *
496
+ * @example
497
+ * ```html
498
+ * <kt-password-field label="Mot de passe" [(value)]="password" required />
499
+ * ```
500
+ */
501
+ declare class KtPasswordField extends KtBaseInputField<string> implements FormValueControl<string> {
502
+ /** Valeur saisie (two-way). @default '' */
503
+ readonly value: _angular_core.ModelSignal<string>;
504
+ /** Plancher de caractères (attribut `minlength` natif ; poussé par le validateur minLength). @default undefined */
505
+ readonly minLength: _angular_core.InputSignal<number | undefined>;
506
+ /** Plafond de caractères (attribut `maxlength` natif ; poussé par le validateur maxLength). @default undefined */
507
+ readonly maxLength: _angular_core.InputSignal<number | undefined>;
508
+ /** Motifs de validation. @default [] */
509
+ readonly pattern: _angular_core.InputSignal<readonly RegExp[]>;
510
+ /** Source de la première regex pour l'attribut `pattern` natif (`null` si aucune). */
511
+ protected readonly patternAttr: _angular_core.Signal<string>;
512
+ /** Indice d'autoremplissage effectif (par défaut 'current-password'). */
513
+ protected readonly resolvedAutocomplete: _angular_core.Signal<AutoFill>;
514
+ /** État de visibilité du mot de passe en clair. @default false */
515
+ protected readonly isPasswordVisible: _angular_core.WritableSignal<boolean>;
516
+ /** Type natif de l'input selon l'état de visibilité. */
517
+ protected readonly inputType: _angular_core.Signal<"text" | "password">;
518
+ private readonly idGen;
519
+ private readonly uid;
520
+ protected readonly inputId: _angular_core.Signal<string>;
521
+ protected parse(raw: string): string;
522
+ protected emptyValue(): string;
523
+ protected isEmpty(value: string): boolean;
524
+ /**
525
+ * Bascule l'état de visibilité du mot de passe.
526
+ * Utilise preventDefault() pour empêcher l'input de perdre le focus.
527
+ */
528
+ protected toggleVisibility(event: MouseEvent): void;
529
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtPasswordField, never>;
530
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtPasswordField, "kt-password-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
384
531
  }
385
532
 
386
533
  /**
@@ -407,6 +554,8 @@ declare class KtSwitch implements FormValueControl<boolean> {
407
554
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
408
555
  /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */
409
556
  readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
557
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
558
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
410
559
  /** Erreurs de validation à afficher sous la bascule. @default [] */
411
560
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
412
561
  /** Identifiant logique du contrôle (à titre indicatif). @default '' */
@@ -423,6 +572,8 @@ declare class KtSwitch implements FormValueControl<boolean> {
423
572
  readonly errorMatcher: _angular_core.InputSignal<KtFieldErrorMatcher | undefined>;
424
573
  /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */
425
574
  readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
575
+ private readonly switchBtn;
576
+ private readonly errorResolver;
426
577
  private readonly idGen;
427
578
  private readonly uid;
428
579
  protected readonly baseId: _angular_core.Signal<string>;
@@ -431,14 +582,18 @@ declare class KtSwitch implements FormValueControl<boolean> {
431
582
  protected readonly errorId: _angular_core.Signal<string>;
432
583
  private readonly matcher;
433
584
  protected readonly showInvalid: _angular_core.Signal<boolean>;
434
- protected readonly displayedErrors: _angular_core.Signal<readonly WithOptionalFieldTree<ValidationError>[]>;
585
+ /** Erreurs résolues (messages par défaut appliqués, suppressions `message: ''` écartées). */
586
+ protected readonly resolvedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
587
+ protected readonly displayedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
435
588
  protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
436
589
  protected readonly describedBy: _angular_core.Signal<string | null>;
437
590
  constructor();
591
+ /** Focus le bouton bascule natif (utilisé par Signal Forms `focusBoundControl`). */
592
+ focus(options?: FocusOptions): void;
438
593
  protected toggle(): void;
439
594
  protected onSpacebar(event: Event): void;
440
595
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtSwitch, never>;
441
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtSwitch, "kt-switch", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "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; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
596
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtSwitch, "kt-switch", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "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; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
442
597
  }
443
598
 
444
599
  /**
@@ -473,6 +628,8 @@ declare class KtCheckboxGroup<V> implements FormValueControl<V[]> {
473
628
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
474
629
  /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */
475
630
  readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
631
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
632
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
476
633
  /** Erreurs de validation à afficher sous le groupe. @default [] */
477
634
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
478
635
  /** Nom logique du groupe, à titre INDICATIF : contrairement à `kt-radio-group` (où `name` est
@@ -493,6 +650,8 @@ declare class KtCheckboxGroup<V> implements FormValueControl<V[]> {
493
650
  readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
494
651
  /** Égalité des valeurs en mode objet (défaut : identité `===`). */
495
652
  readonly compareWith: _angular_core.InputSignal<((a: V, b: V) => boolean) | undefined>;
653
+ private readonly el;
654
+ private readonly errorResolver;
496
655
  private readonly idGen;
497
656
  private readonly uid;
498
657
  protected readonly baseId: _angular_core.Signal<string>;
@@ -501,16 +660,20 @@ declare class KtCheckboxGroup<V> implements FormValueControl<V[]> {
501
660
  protected readonly errorId: _angular_core.Signal<string>;
502
661
  private readonly matcher;
503
662
  protected readonly showInvalid: _angular_core.Signal<boolean>;
504
- protected readonly displayedErrors: _angular_core.Signal<readonly WithOptionalFieldTree<ValidationError>[]>;
663
+ /** Erreurs résolues (messages par défaut appliqués, suppressions `message: ''` écartées). */
664
+ protected readonly resolvedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
665
+ protected readonly displayedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
505
666
  protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
506
667
  protected readonly describedBy: _angular_core.Signal<string | null>;
507
668
  private readonly comparator;
508
669
  /** La valeur d'option d'un enfant est-elle dans la sélection ? (lu dans le `computed` enfant) */
509
670
  isSelected(optionValue: V): boolean;
671
+ /** Focus la première case activable (utilisé par Signal Forms `focusBoundControl`). */
672
+ focus(options?: FocusOptions): void;
510
673
  /** Ajoute/retire une valeur d'option de la sélection (émis par un enfant au `change` natif). */
511
674
  toggle(optionValue: V, checked: boolean): void;
512
675
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtCheckboxGroup<any>, never>;
513
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtCheckboxGroup<any>, "kt-checkbox-group", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "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; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, ["*"], true, never>;
676
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtCheckboxGroup<any>, "kt-checkbox-group", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "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; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, ["*"], true, never>;
514
677
  }
515
678
 
516
679
  /**
@@ -562,6 +725,8 @@ declare class KtCheckbox<V = unknown> implements FormValueControl<boolean> {
562
725
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
563
726
  /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */
564
727
  readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
728
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
729
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
565
730
  /** Erreurs de validation à afficher sous la case. @default [] */
566
731
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
567
732
  /** Attribut `name` du `<input>` natif. @default '' */
@@ -580,6 +745,9 @@ declare class KtCheckbox<V = unknown> implements FormValueControl<boolean> {
580
745
  readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
581
746
  private readonly inputEl;
582
747
  private readonly el;
748
+ private readonly errorResolver;
749
+ private readonly auditEnabled;
750
+ private isDestroyed;
583
751
  private readonly idGen;
584
752
  private readonly uid;
585
753
  protected readonly baseId: _angular_core.Signal<string>;
@@ -592,14 +760,18 @@ declare class KtCheckbox<V = unknown> implements FormValueControl<boolean> {
592
760
  protected readonly isDisabled: _angular_core.Signal<boolean>;
593
761
  private readonly matcher;
594
762
  protected readonly showInvalid: _angular_core.Signal<boolean>;
595
- protected readonly displayedErrors: _angular_core.Signal<readonly WithOptionalFieldTree<ValidationError>[]>;
763
+ /** Erreurs résolues (messages par défaut appliqués, suppressions `message: ''` écartées). */
764
+ protected readonly resolvedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
765
+ protected readonly displayedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
596
766
  protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
597
767
  protected readonly describedBy: _angular_core.Signal<string | null>;
598
768
  constructor();
769
+ /** Focus la case native (utilisé par Signal Forms `focusBoundControl`). */
770
+ focus(options?: FocusOptions): void;
599
771
  protected onChange(event: Event): void;
600
772
  protected onBlur(): void;
601
773
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtCheckbox<any>, never>;
602
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtCheckbox<any>, "kt-checkbox", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "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; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, ["*"], true, never>;
774
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtCheckbox<any>, "kt-checkbox", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "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; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, ["*"], true, never>;
603
775
  }
604
776
 
605
777
  /**
@@ -635,6 +807,8 @@ declare class KtRadioGroup<V> implements FormValueControl<V | null> {
635
807
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
636
808
  /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */
637
809
  readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
810
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
811
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
638
812
  /** Erreurs de validation à afficher sous le groupe. @default [] */
639
813
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
640
814
  /** Base du `name` partagé par les radios enfants (sinon auto-généré). @default '' */
@@ -653,6 +827,8 @@ declare class KtRadioGroup<V> implements FormValueControl<V | null> {
653
827
  readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
654
828
  /** Égalité des valeurs en mode objet (défaut : identité `===`). Seul rescapé du contrat select. */
655
829
  readonly compareWith: _angular_core.InputSignal<((a: V, b: V) => boolean) | undefined>;
830
+ private readonly el;
831
+ private readonly errorResolver;
656
832
  private readonly idGen;
657
833
  private readonly uid;
658
834
  protected readonly baseId: _angular_core.Signal<string>;
@@ -663,16 +839,21 @@ declare class KtRadioGroup<V> implements FormValueControl<V | null> {
663
839
  protected readonly errorId: _angular_core.Signal<string>;
664
840
  private readonly matcher;
665
841
  protected readonly showInvalid: _angular_core.Signal<boolean>;
666
- protected readonly displayedErrors: _angular_core.Signal<readonly WithOptionalFieldTree<ValidationError>[]>;
842
+ /** Erreurs résolues (messages par défaut appliqués, suppressions `message: ''` écartées). */
843
+ protected readonly resolvedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
844
+ protected readonly displayedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
667
845
  protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
668
846
  protected readonly describedBy: _angular_core.Signal<string | null>;
669
847
  private readonly comparator;
670
848
  /** L'`optionValue` d'un enfant correspond-il à la sélection courante ? (lu dans le `computed` enfant) */
671
849
  isSelected(radioValue: V): boolean;
850
+ /** Focus l'option pertinente (utilisé par Signal Forms `focusBoundControl`) : le radio coché
851
+ s'il existe, sinon le premier radio activable — conforme au roving tabindex natif. */
852
+ focus(options?: FocusOptions): void;
672
853
  /** Commit d'une sélection émis par un enfant au `change` natif. */
673
854
  select(radioValue: V): void;
674
855
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtRadioGroup<any>, never>;
675
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtRadioGroup<any>, "kt-radio-group", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "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; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, ["*"], true, never>;
856
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtRadioGroup<any>, "kt-radio-group", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "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; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, ["*"], true, never>;
676
857
  }
677
858
 
678
859
  /**
@@ -734,13 +915,18 @@ type KtKeyish<T, R> = keyof T | ((item: T) => R);
734
915
  ou la clé extraite quand `optionValue` est fourni). */
735
916
  declare abstract class KtBaseSelect<T, V = T> {
736
917
  protected readonly fieldConfig: Partial<_ktortu_aaa_forms.KtFieldConfig> | null;
918
+ private readonly errorResolver;
737
919
  protected readonly config: Partial<_ktortu_aaa_forms.KtSelectConfigOptions> | null;
738
920
  protected readonly host: ElementRef<HTMLElement>;
739
- private readonly ngZone;
740
921
  protected readonly doc: Document;
741
922
  private readonly platformId;
742
923
  private readonly destroyRef;
924
+ private readonly bodyScrollLock;
743
925
  private wasExpanded;
926
+ private scrollLocked;
927
+ /** Pose/relâche le verrou de scroll du fond de façon idempotente (n'agit qu'à la transition),
928
+ via le compteur partagé `KtBodyScrollLock` — deux sheets ouvertes ne se désynchronisent pas. */
929
+ private setBodyScrollLock;
744
930
  /** Liste des options affichées (source de vérité du contrôle). */
745
931
  readonly options: _angular_core.InputSignal<readonly T[]>;
746
932
  /** Libellé affiché d'une option : clé OU fonction. Défaut : `label`/`name`, sinon `String(option)`. */
@@ -767,6 +953,8 @@ declare abstract class KtBaseSelect<T, V = T> {
767
953
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
768
954
  /** Le champ a-t-il été modifié depuis sa valeur initiale ? Poussé par `[formField]`. @default false */
769
955
  readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
956
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
957
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
770
958
  /** Erreurs de validation à afficher. Poussé par `[formField]`. @default [] */
771
959
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
772
960
  /** Attribut `name` logique du contrôle (à titre indicatif). @default '' */
@@ -839,10 +1027,7 @@ declare abstract class KtBaseSelect<T, V = T> {
839
1027
  protected readonly resolvedFilterResultsText: Signal<(count: number) => string>;
840
1028
  protected readonly resolvedTruncatedResultsText: Signal<(max: number, total: number) => string>;
841
1029
  protected readonly resolvedTruncatedResultsAnnouncement: Signal<(max: number, total: number) => string>;
842
- protected readonly fieldErrors: Signal<{
843
- kind: string;
844
- message: string | undefined;
845
- }[]>;
1030
+ protected readonly fieldErrors: Signal<_ktortu_aaa_forms.KtFieldError[]>;
846
1031
  private readonly labelAccessor;
847
1032
  private readonly valueAccessor;
848
1033
  private readonly disabledAccessor;
@@ -886,6 +1071,11 @@ declare abstract class KtBaseSelect<T, V = T> {
886
1071
  re-pousse rien (`listboxValue` n'a pas changé) — on resynchronise le modèle du Listbox
887
1072
  avec les clés sélectionnées actuellement visibles. */
888
1073
  protected resyncListboxSelection(): void;
1074
+ /** Focus le trigger natif (utilisé par Signal Forms `focusBoundControl`). */
1075
+ focus(options?: FocusOptions): void;
1076
+ /** Referme le panneau et vide le filtre (utilisé par Signal Forms `reset`). La sélection du
1077
+ listbox dérive de `value()` (computed) et se resynchronise seule. */
1078
+ reset(): void;
889
1079
  /** Desktop filtrable : le focus DOM vit dans le popup (champ/options) — on le rend au trigger
890
1080
  à la fermeture, sinon il tombe sur `<body>`. (Écran compact : déjà géré par l'effect `compact`.) */
891
1081
  protected refocusTriggerAfterFilterClose(): void;
@@ -895,7 +1085,7 @@ declare abstract class KtBaseSelect<T, V = T> {
895
1085
  protected onDragStart(event: PointerEvent): void;
896
1086
  private animateAndCloseSelect;
897
1087
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtBaseSelect<any, any>, never>;
898
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseSelect<any, any>, never, never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "optionDisabled": { "alias": "optionDisabled"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "filterable": { "alias": "filterable"; "required": false; "isSignal": true; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; "isSignal": true; }; "filterLabel": { "alias": "filterLabel"; "required": false; "isSignal": true; }; "filterFn": { "alias": "filterFn"; "required": false; "isSignal": true; }; "maxVisibleOptions": { "alias": "maxVisibleOptions"; "required": false; "isSignal": true; }; "truncatedResultsText": { "alias": "truncatedResultsText"; "required": false; "isSignal": true; }; "truncatedResultsAnnouncement": { "alias": "truncatedResultsAnnouncement"; "required": false; "isSignal": true; }; }, { "helpClick": "helpClick"; "touched": "touchedChange"; }, never, never, true, never>;
1088
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseSelect<any, any>, never, never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "optionDisabled": { "alias": "optionDisabled"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "filterable": { "alias": "filterable"; "required": false; "isSignal": true; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; "isSignal": true; }; "filterLabel": { "alias": "filterLabel"; "required": false; "isSignal": true; }; "filterFn": { "alias": "filterFn"; "required": false; "isSignal": true; }; "maxVisibleOptions": { "alias": "maxVisibleOptions"; "required": false; "isSignal": true; }; "truncatedResultsText": { "alias": "truncatedResultsText"; "required": false; "isSignal": true; }; "truncatedResultsAnnouncement": { "alias": "truncatedResultsAnnouncement"; "required": false; "isSignal": true; }; }, { "helpClick": "helpClick"; "touched": "touchedChange"; }, never, never, true, never>;
899
1089
  }
900
1090
 
901
1091
  /** Contexte typé reçu par le template d'une option (`ktSelectOption`). */
@@ -1343,7 +1533,6 @@ declare class KtChipList<T> implements ChipTransitionScope {
1343
1533
  private readonly doc;
1344
1534
  private readonly platformId;
1345
1535
  private readonly cdr;
1346
- private readonly ngZone;
1347
1536
  /** Vrai pendant la View Transition de CETTE liste : les chips (standards via Chip,
1348
1537
  custom via tokens.css) ne portent leur `view-transition-name` que dans cette fenêtre. */
1349
1538
  readonly transitioning: _angular_core.WritableSignal<boolean>;
@@ -1383,6 +1572,13 @@ declare class KtChipList<T> implements ChipTransitionScope {
1383
1572
  }>;
1384
1573
  protected readonly itemDef: _angular_core.Signal<KtChipItemDef<any> | undefined>;
1385
1574
  private readonly chips;
1575
+ private static readonly CHIP_FOCUSABLES;
1576
+ private static readonly ROVING_FOCUSABLES;
1577
+ private query;
1578
+ /** Index de l'unique focusable portant `tabindex="0"` : point d'entrée clavier UNIQUE dans la
1579
+ liste (pattern composite WAI-ARIA). Les flèches/Home/End le déplacent ; un focus direct
1580
+ (souris) le resynchronise via `onFocusin`. */
1581
+ protected readonly activeIndex: _angular_core.WritableSignal<number>;
1386
1582
  protected readonly resolvedListLabel: _angular_core.Signal<string>;
1387
1583
  private readonly resolvedRemoveItemLabel;
1388
1584
  private readonly resolvedItemRemovedText;
@@ -1423,6 +1619,8 @@ declare class KtChipList<T> implements ChipTransitionScope {
1423
1619
  /** Déplie/replie ; au dépliage, focus sur le premier chip nouvellement révélé. */
1424
1620
  protected toggleExpanded(): void;
1425
1621
  protected onKeydown(event: KeyboardEvent): void;
1622
+ /** Resynchronise le point de tabulation unique sur l'élément réellement focusé (souris/voix). */
1623
+ protected onFocusin(event: FocusEvent): void;
1426
1624
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtChipList<any>, never>;
1427
1625
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtChipList<any>, "kt-chip-list", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "itemLabel": { "alias": "itemLabel"; "required": false; "isSignal": true; }; "itemKey": { "alias": "itemKey"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "maxVisible": { "alias": "maxVisible"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "removeItemLabel": { "alias": "removeItemLabel"; "required": false; "isSignal": true; }; "itemRemovedText": { "alias": "itemRemovedText"; "required": false; "isSignal": true; }; "moreLabel": { "alias": "moreLabel"; "required": false; "isSignal": true; }; "lessLabel": { "alias": "lessLabel"; "required": false; "isSignal": true; }; "chipTemplate": { "alias": "chipTemplate"; "required": false; "isSignal": true; }; "emptyFocusTarget": { "alias": "emptyFocusTarget"; "required": false; "isSignal": true; }; }, { "removed": "removed"; }, ["itemDef"], never, true, never>;
1428
1626
  }
@@ -1483,6 +1681,12 @@ declare abstract class KtBaseTemporalField<T extends {
1483
1681
  /** Sérialise la valeur au format attendu par l'input natif (précision adaptée au type). */
1484
1682
  protected abstract serialize(value: T): string;
1485
1683
  protected parse(raw: string): T | null;
1684
+ protected displayValue(): string;
1685
+ /** Efface AUSSI l'input natif. L'effet de synchro ignore une mise à `null` quand l'input est
1686
+ focalisé (pour ne pas écraser une saisie partielle en cours), or `clear()` focalise justement
1687
+ le champ — sans ce forçage, le bouton « effacer » (et Échap) resterait sans effet sur les
1688
+ champs temporels. */
1689
+ protected clear(): void;
1486
1690
  protected emptyValue(): T | null;
1487
1691
  protected isEmpty(value: T | null): boolean;
1488
1692
  /** Borne minimale autorisée (membre `min` du contrat `FormValueControl`, aussi posé en attribut
@@ -1555,6 +1759,10 @@ declare abstract class KtBaseTimeTemporalField<T extends {
1555
1759
  * suffira de retirer le polyfill de `main.ts` : ce fichier ne change pas.
1556
1760
  */
1557
1761
  type TemporalImpl = (typeof temporal_polyfill)['Temporal'];
1762
+ /** Point d'accès `Temporal` de la lib. Proxy à résolution paresseuse : le namespace réel n'est lu
1763
+ qu'au premier accès de propriété (`Temporal.PlainDate`…), jamais à l'import — ce qui supprime la
1764
+ dépendance à l'ordre d'init des modules et fait booter Safari/WebKit tant que le polyfill est
1765
+ importé dans `main.ts`. */
1558
1766
  declare const Temporal: TemporalImpl;
1559
1767
 
1560
1768
  /** Date civile (jour/mois/année), sans heure ni fuseau — alias de `Temporal.PlainDate`.
@@ -1757,5 +1965,5 @@ declare class KtFixedClock extends KtClock {
1757
1965
  today(): Temporal$1.PlainDate;
1758
1966
  }
1759
1967
 
1760
- export { DEFAULT_KT_SELECT_CONFIG, KT_CHIPS_CONFIG, KT_FIELD, KT_FIELD_CONFIG, KT_SELECT_CONFIG, KtBaseInputField, KtBaseSelect, KtBaseTemporalField, KtBaseTimeTemporalField, KtCheckbox, KtCheckboxGroup, KtChip, KtChipItemDef, KtChipList, KtClock, KtDateField, KtDateTimeField, KtField, KtFieldControl, KtFixedClock, KtInstantField, KtMultiSelect, KtMultiSelectChipDef, KtMultiSelectOptionDef, KtMultiSelectTriggerDef, KtNumberField, KtRadio, KtRadioGroup, KtSelect, KtSelectConfig, KtSelectOptionDef, KtSelectTriggerDef, KtSwitch, KtTemporalDatePipe, KtTextArea, KtTextField, KtTimeField, KtYearMonthField, Temporal, defaultKtFieldErrorMatcher, normalizeKtSuggestions, provideKtField };
1761
- export type { CalendarDate, KtChipItemContext, KtChipsConfig, KtDatalistOption, KtFieldAppearance, KtFieldConfig, KtFieldError, KtFieldErrorMatcher, KtFieldErrorState, KtFieldParent, KtFloatLabel, KtKeyish, KtMultiSelectChipContext, KtMultiSelectOptionContext, KtMultiSelectSelectionChange, KtMultiSelectTriggerContext, KtSelectConfigOptions, KtSelectOptionContext, KtSelectSelectionChange, KtSelectTriggerContext, KtSuggestion, KtTextFieldType, KtTimePrecision, LocalDateTime, Timestamp, WallTime, ZonedTimestamp };
1968
+ export { DEFAULT_KT_SELECT_CONFIG, KT_CHIPS_CONFIG, KT_DEFAULT_FIELD_ERROR_MESSAGES, KT_FIELD, KT_FIELD_CONFIG, KT_SELECT_CONFIG, KtBaseInputField, KtBaseSelect, KtBaseTemporalField, KtBaseTimeTemporalField, KtCheckbox, KtCheckboxGroup, KtChip, KtChipItemDef, KtChipList, KtClock, KtDateField, KtDateTimeField, KtField, KtFieldControl, KtFieldErrorResolver, KtFixedClock, KtInstantField, KtMultiSelect, KtMultiSelectChipDef, KtMultiSelectOptionDef, KtMultiSelectTriggerDef, KtNumberField, KtPasswordField, KtRadio, KtRadioGroup, KtSelect, KtSelectConfig, KtSelectOptionDef, KtSelectTriggerDef, KtSwitch, KtTemporalDatePipe, KtTextArea, KtTextField, KtTimeField, KtYearMonthField, Temporal, defaultKtFieldErrorMatcher, ktErrorParam, normalizeKtSuggestions, provideKtField };
1969
+ export type { CalendarDate, KtChipItemContext, KtChipsConfig, KtDatalistOption, KtErrorMessageFactory, KtFieldAppearance, KtFieldConfig, KtFieldError, KtFieldErrorMatcher, KtFieldErrorMessages, KtFieldErrorState, KtFieldParent, KtFloatLabel, KtKeyish, KtMultiSelectChipContext, KtMultiSelectOptionContext, KtMultiSelectSelectionChange, KtMultiSelectTriggerContext, KtPasswordAutocomplete, KtResolvableError, KtSelectConfigOptions, KtSelectOptionContext, KtSelectSelectionChange, KtSelectTriggerContext, KtSuggestion, KtTextFieldType, KtTimePrecision, LocalDateTime, Timestamp, WallTime, ZonedTimestamp };