@ktortu/aaa 0.1.0-beta.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +27 -9
  2. package/cdk/styles/tabs.css +100 -21
  3. package/fesm2022/ktortu-aaa-button.mjs +18 -11
  4. package/fesm2022/ktortu-aaa-button.mjs.map +1 -1
  5. package/fesm2022/ktortu-aaa-card.mjs +29 -4
  6. package/fesm2022/ktortu-aaa-card.mjs.map +1 -1
  7. package/fesm2022/ktortu-aaa-cdk.mjs +59 -15
  8. package/fesm2022/ktortu-aaa-cdk.mjs.map +1 -1
  9. package/fesm2022/ktortu-aaa-dialog.mjs +134 -24
  10. package/fesm2022/ktortu-aaa-dialog.mjs.map +1 -1
  11. package/fesm2022/ktortu-aaa-forms.mjs +748 -294
  12. package/fesm2022/ktortu-aaa-forms.mjs.map +1 -1
  13. package/fesm2022/ktortu-aaa-i18n.mjs +139 -0
  14. package/fesm2022/ktortu-aaa-i18n.mjs.map +1 -0
  15. package/fesm2022/ktortu-aaa-menu.mjs +38 -13
  16. package/fesm2022/ktortu-aaa-menu.mjs.map +1 -1
  17. package/fesm2022/ktortu-aaa-snackbar.mjs +465 -0
  18. package/fesm2022/ktortu-aaa-snackbar.mjs.map +1 -0
  19. package/fesm2022/ktortu-aaa-tabs.mjs +319 -42
  20. package/fesm2022/ktortu-aaa-tabs.mjs.map +1 -1
  21. package/fesm2022/ktortu-aaa-tooltip.mjs +3 -2
  22. package/fesm2022/ktortu-aaa-tooltip.mjs.map +1 -1
  23. package/fesm2022/ktortu-aaa.mjs +2 -0
  24. package/fesm2022/ktortu-aaa.mjs.map +1 -1
  25. package/forms/checkbox/checkbox-group.css +0 -8
  26. package/forms/chips/chip-list.css +5 -0
  27. package/forms/radio/radio-group.css +0 -8
  28. package/forms/styles/field-box.css +152 -2
  29. package/forms/styles/field-pending.css +46 -0
  30. package/forms/styles/select-panel.css +4 -0
  31. package/forms/styles/tokens.css +3 -0
  32. package/menu/menu.css +8 -4
  33. package/package.json +9 -1
  34. package/snackbar/snackbar-tokens.css +53 -0
  35. package/snackbar/snackbar.css +175 -0
  36. package/styles/forms.css +1 -0
  37. package/styles/snackbar.css +9 -0
  38. package/styles/styles.css +1 -0
  39. package/types/ktortu-aaa-button.d.ts +22 -8
  40. package/types/ktortu-aaa-card.d.ts +24 -4
  41. package/types/ktortu-aaa-cdk.d.ts +38 -0
  42. package/types/ktortu-aaa-dialog.d.ts +129 -31
  43. package/types/ktortu-aaa-forms.d.ts +503 -160
  44. package/types/ktortu-aaa-i18n.d.ts +77 -0
  45. package/types/ktortu-aaa-menu.d.ts +15 -8
  46. package/types/ktortu-aaa-snackbar.d.ts +275 -0
  47. package/types/ktortu-aaa-tabs.d.ts +130 -13
  48. package/types/ktortu-aaa-tooltip.d.ts +5 -0
  49. package/types/ktortu-aaa.d.ts +2 -0
@@ -1,22 +1,43 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, Signal, TemplateRef, ModelSignal, ElementRef, PipeTransform } from '@angular/core';
2
+ import { InjectionToken, Signal, Provider, TemplateRef, ModelSignal, ElementRef, PipeTransform } from '@angular/core';
3
3
  import * as _angular_forms_signals from '@angular/forms/signals';
4
- import { WithOptionalFieldTree, ValidationError, FormValueControl } from '@angular/forms/signals';
4
+ import { ValidationError, WithOptionalFieldTree, FormValueControl } from '@angular/forms/signals';
5
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';
9
- import { Temporal } from 'temporal-polyfill';
9
+ import * as temporal_polyfill from 'temporal-polyfill';
10
+ import { Temporal as Temporal$1 } from 'temporal-polyfill';
10
11
  export { Temporal as TemporalNamespace } from 'temporal-polyfill';
11
12
 
12
13
  /** État d'un champ pertinent pour décider de l'affichage des erreurs. */
13
14
  interface KtFieldErrorState {
15
+ /** Le champ est-il en erreur de validation. */
14
16
  invalid: boolean;
17
+ /** Le champ a-t-il été visité (blur). */
15
18
  touched: boolean;
19
+ /** Le champ a-t-il été modifié depuis sa valeur initiale. */
16
20
  dirty: boolean;
17
21
  }
18
22
  /** Décide QUAND afficher les erreurs d'un champ (équivalent signal de l'ErrorStateMatcher Material). */
19
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>;
34
+ /** Apparence du chrome de champ. `fill` = label au-dessus (défaut historique) ; `outline` = bordure
35
+ + label flottant qui se loge dans la bordure (transition douce depuis Angular Material « outline »). */
36
+ type KtFieldAppearance = 'fill' | 'outline';
37
+ /** Politique du label flottant (apparence `outline` uniquement). `auto` = flotte au focus / quand le
38
+ champ est rempli ; `always` = toujours flotté, même vide (le placeholder s'affiche alors). Équivaut
39
+ au `floatLabel` d'Angular Material. */
40
+ type KtFloatLabel = 'auto' | 'always';
20
41
  /** Défaut : afficher l'erreur une fois le champ quitté (blur). */
21
42
  declare const defaultKtFieldErrorMatcher: KtFieldErrorMatcher;
22
43
  /** Défauts applicables à tous les champs (surchargeables par champ via les inputs).
@@ -33,20 +54,68 @@ interface KtFieldConfig {
33
54
  hideHintWhenInvalid: boolean;
34
55
  /** Afficher toutes les erreurs au lieu de la première seule. Défaut : `false`. */
35
56
  showAllErrors: boolean;
57
+ /** Message d'erreur d'un `kt-number-field` quand la saisie n'est pas un nombre valide.
58
+ Défaut (anglais neutre) : `'Please enter a valid number.'`. */
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>;
65
+ /** Apparence par défaut de tous les champs (`fill` | `outline`). Défaut : `'fill'`. */
66
+ appearance: KtFieldAppearance;
67
+ /** Politique du label flottant en `outline` (`auto` | `always`). Défaut : `'auto'`. */
68
+ floatLabel: KtFloatLabel;
36
69
  }
37
70
  declare const KT_FIELD_CONFIG: InjectionToken<Partial<KtFieldConfig>>;
71
+ /**
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.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * // app.config.ts — apparence globale
79
+ * providers: [provideKtField({ appearance: 'outline' })]
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.
99
+ */
100
+ declare function provideKtField(config: Partial<KtFieldConfig>): Provider;
38
101
  /** Parent field interface representing shared states for its controls. */
39
102
  interface KtFieldParent {
103
+ /** id de base du champ, posé sur le contrôle (`[id]`). */
40
104
  readonly baseId: Signal<string>;
105
+ /** Valeur de `aria-describedby` à câbler sur le contrôle (ou `null`). */
41
106
  readonly describedBy: Signal<string | null>;
107
+ /** Le champ est-il en erreur (pose `aria-invalid`). */
42
108
  readonly invalid: Signal<boolean>;
109
+ /** Le champ est-il requis (pose `aria-required`). */
43
110
  readonly required: Signal<boolean>;
44
111
  }
45
112
  declare const KT_FIELD: InjectionToken<KtFieldParent>;
46
113
 
47
114
  /** Forme minimale d'une erreur affichable — découple `Field` de Signal Forms. */
48
115
  interface KtFieldError {
116
+ /** Identifiant du type d'erreur (ex. `'required'`, `'email'`). */
49
117
  kind: string;
118
+ /** Message lisible affiché à l'utilisateur (optionnel). */
50
119
  message?: string;
51
120
  }
52
121
  /** Chrome de champ agnostique du système de forms : label + contrôle projeté + hint + erreur,
@@ -75,15 +144,25 @@ declare class KtField implements KtFieldParent {
75
144
  /** Erreurs de validation à afficher sous le contrôle. @default [] */
76
145
  readonly errors: _angular_core.InputSignal<readonly KtFieldError[]>;
77
146
  /** Marque le champ comme invalide (pose `aria-invalid` et conditionne l'affichage des erreurs). @default false */
78
- readonly invalid: _angular_core.InputSignal<boolean>;
147
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
79
148
  /** Affiche l'astérisque requis et pose `aria-required` sur le contrôle. @default false */
80
- readonly required: _angular_core.InputSignal<boolean>;
81
- /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. */
149
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
150
+ /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */
82
151
  readonly fieldId: _angular_core.InputSignal<string | undefined>;
83
- /** Masquer le hint quand l'erreur s'affiche (façon Material). */
84
- readonly hideHintWhenInvalid: _angular_core.InputSignal<boolean>;
85
- /** Afficher toutes les erreurs au lieu de la première seule. */
86
- readonly showAllErrors: _angular_core.InputSignal<boolean>;
152
+ /** Masquer le hint quand l'erreur s'affiche (façon Material). @default KT_FIELD_CONFIG.hideHintWhenInvalid ?? false */
153
+ readonly hideHintWhenInvalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
154
+ /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */
155
+ readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
156
+ /** Apparence du chrome : `fill` (label au-dessus) ou `outline` (bordure + label flottant, façon
157
+ Material). Non fournie ⇒ valeur du `KT_FIELD_CONFIG`, sinon `'fill'`. @default undefined */
158
+ readonly appearance: _angular_core.InputSignal<KtFieldAppearance | undefined>;
159
+ /** Apparence effective : input ?? KT_FIELD_CONFIG.appearance ?? 'fill'. */
160
+ protected readonly resolvedAppearance: _angular_core.Signal<KtFieldAppearance>;
161
+ /** Politique du label flottant (outline) : `auto` (flotte au focus/rempli) ou `always` (toujours
162
+ flotté, même vide). Non fournie ⇒ valeur du `KT_FIELD_CONFIG`, sinon `'auto'`. @default undefined */
163
+ readonly floatLabel: _angular_core.InputSignal<KtFloatLabel | undefined>;
164
+ /** Politique effective : input ?? KT_FIELD_CONFIG.floatLabel ?? 'auto'. */
165
+ protected readonly resolvedFloatLabel: _angular_core.Signal<KtFloatLabel>;
87
166
  private readonly control;
88
167
  private readonly templateTooltip;
89
168
  private readonly projectedTooltip;
@@ -100,99 +179,180 @@ declare class KtField implements KtFieldParent {
100
179
  readonly describedBy: _angular_core.Signal<string | null>;
101
180
  protected onHelpClick(event: MouseEvent): void;
102
181
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtField, never>;
103
- 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; }; }, { "helpClick": "helpClick"; }, ["control", "projectedTooltip"], ["[ktFieldHelp]", "*"], true, never>;
182
+ 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>;
104
183
  }
105
184
 
106
185
  /** Marque le contrôle (natif ou custom) d'un champ pour que `Field` y câble l'a11y
107
- (id, aria-describedby, aria-invalid, aria-required). */
186
+ (id, aria-describedby, aria-invalid, aria-required).
187
+
188
+ @example
189
+ ```html
190
+ <kt-field label="E-mail" [invalid]="invalid()" [errors]="errors()">
191
+ <input ktFieldControl type="email" [(ngModel)]="email" />
192
+ </kt-field>
193
+ ``` */
108
194
  declare class KtFieldControl {
109
195
  private readonly parent;
110
196
  protected readonly id: _angular_core.Signal<string | null>;
111
197
  protected readonly describedBy: _angular_core.Signal<string | null>;
112
198
  protected readonly invalid: _angular_core.Signal<boolean>;
113
199
  protected readonly required: _angular_core.Signal<boolean>;
200
+ /** Élément DOM hôte du contrôle (exposé pour le focus / la mesure par le parent). */
114
201
  readonly element: HTMLElement;
115
202
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtFieldControl, never>;
116
203
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtFieldControl, "[ktFieldControl]", never, {}, {}, never, never, true, never>;
117
204
  }
118
205
 
119
- /** Suggestion d'un champ de saisie (rendu `<datalist>`) : soit la valeur seule, soit un couple
120
- `{ value, label }` `label` est le texte affiché et `value` ce qui est inséré dans le champ.
121
- @template V Type de la valeur du champ (string, number, ou type Temporal selon le champ). */
122
- type KtSuggestion<V> = V | {
123
- value: V;
124
- label?: string;
125
- };
126
- /** Option `<datalist>` normalisée : `value` est la chaîne posée sur l'attribut DOM, `label` le
127
- libellé affiché (ou `null`). */
128
- interface KtDatalistOption {
129
- value: string;
130
- label: string | null;
206
+ /**
207
+ * Lit un param typé d'une `ValidationError` (ex. `min`, `minLength`, `maxLength`, `minDate`…).
208
+ * Les sous-types d'erreur de Signal Forms exposent ces params, mais le type de base `ValidationError`
209
+ * ne les déclare pas : ce helper centralise l'accès pour les fabriques de message, sans `any`.
210
+ *
211
+ * @example
212
+ * ```ts
213
+ * minLength: (e) => `Au moins ${ktErrorParam<number>(e, 'minLength')} caractères.`
214
+ * ```
215
+ */
216
+ declare function ktErrorParam<T>(error: KtResolvableError, key: string): T;
217
+ /**
218
+ * Messages d'erreur **anglais** par défaut de la lib, indexés par `kind`. Couvrent tous les
219
+ * validateurs natifs de Signal Forms (`required`, `email`, `min`, `max`, `minLength`, `maxLength`,
220
+ * `minDate`, `maxDate`, `pattern`). Surchargeables famille par famille via `KT_FIELD_CONFIG.errorMessages`
221
+ * (ou globalement par langue, cf. `provideKtDefaultFR`). Le `numberParseError` reste géré à la source
222
+ * par `kt-number-field` (kind `parse`).
223
+ */
224
+ declare const KT_DEFAULT_FIELD_ERROR_MESSAGES: KtFieldErrorMessages;
225
+ /**
226
+ * Résout le **message par défaut** d'une erreur de validation à partir de son `kind` (et de ses
227
+ * params typés), en fusionnant les défauts anglais embarqués avec les surcharges du `KT_FIELD_CONFIG`.
228
+ *
229
+ * Utilisé par chaque contrôle `kt-*` au moment du rendu, là où la `ValidationError` complète (params)
230
+ * est encore disponible — `kt-field` reste agnostique de Signal Forms. Précédence du texte affiché :
231
+ * `message` du validateur > `KT_FIELD_CONFIG.errorMessages[kind]` > défaut anglais > rien.
232
+ *
233
+ * Injectable racine : un seul résolveur partagé par tous les champs.
234
+ */
235
+ declare class KtFieldErrorResolver {
236
+ private readonly config;
237
+ /** Map effective : défauts anglais + surcharges du `KT_FIELD_CONFIG`, par `kind`. */
238
+ private readonly messages;
239
+ /**
240
+ * Message par défaut d'une erreur (selon son `kind` + params), ou `undefined` si aucun défaut
241
+ * n'est connu pour ce `kind` (l'UI n'affiche alors rien).
242
+ */
243
+ resolve(error: KtResolvableError): string | undefined;
244
+ /**
245
+ * Prépare une liste d'erreurs pour l'affichage : applique la précédence (message du validateur
246
+ * sinon défaut résolu) et **écarte les erreurs au message vide** — suppression explicite via
247
+ * `{ message: '' }`. Le champ reste invalide (rouge / `aria-invalid`), simplement sans texte.
248
+ */
249
+ resolveAll(errors: readonly KtResolvableError[]): KtFieldError[];
250
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtFieldErrorResolver, never>;
251
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<KtFieldErrorResolver>;
131
252
  }
132
253
 
133
254
  /** Base partagée des champs simples (TextField, NumberField) : état FormValueControl,
134
255
  présentation (label/hint/prefix/suffix/clear) et politique d'affichage des erreurs.
135
- La valeur, son parsing et la notion de « vide » sont fournis par la sous-classe. */
256
+ La valeur, son parsing et la notion de « vide » sont fournis par la sous-classe.
257
+
258
+ @example
259
+ ```ts
260
+ // Sous-classement : on fournit value (model concret) + parse/emptyValue/isEmpty.
261
+ @Component({ selector: 'kt-text-field', templateUrl: './text-field.html' })
262
+ export class KtTextField extends KtBaseInputField<string> implements FormValueControl<string> {
263
+ readonly value = model<string>('');
264
+ protected parse(raw: string): string { return raw; }
265
+ protected emptyValue(): string { return ''; }
266
+ protected isEmpty(value: string): boolean { return value.length === 0; }
267
+ }
268
+ ``` */
136
269
  declare abstract class KtBaseInputField<T> {
137
270
  protected readonly config: Partial<_ktortu_aaa_forms.KtFieldConfig> | null;
271
+ private readonly errorResolver;
138
272
  /** Valeur du contrôle — déclarée concrètement par la sous-classe. */
139
273
  abstract value: ModelSignal<T>;
140
274
  /** Marque le champ comme « visité » (déclenche l'affichage des erreurs). Deux-way. @default false */
141
275
  readonly touched: ModelSignal<boolean>;
142
276
  /** Désactive la saisie et le focus. @default false */
143
- readonly disabled: _angular_core.InputSignal<boolean>;
277
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
144
278
  /** Rend le champ en lecture seule (valeur visible, non modifiable). @default false */
145
- readonly readonly: _angular_core.InputSignal<boolean>;
279
+ readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
146
280
  /** Le champ est-il en erreur (état fourni par la validation). @default false */
147
- readonly invalid: _angular_core.InputSignal<boolean>;
281
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
148
282
  /** Marque le champ comme requis (ajoute `aria-required`). @default false */
149
- readonly required: _angular_core.InputSignal<boolean>;
283
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
150
284
  /** Le champ a-t-il été modifié depuis sa valeur initiale. @default false */
151
- readonly dirty: _angular_core.InputSignal<boolean>;
285
+ readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
286
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
287
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
152
288
  /** Liste des erreurs de validation à afficher. @default [] */
153
289
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
154
290
  /** Attribut `name` natif du contrôle. @default '' */
155
291
  readonly name: _angular_core.InputSignal<string>;
156
- /** id imposé pour des sélecteurs de test stables ; sinon auto-généré par Field. */
292
+ /** id imposé pour des sélecteurs de test stables ; sinon auto-généré par Field. @default undefined */
157
293
  readonly id: _angular_core.InputSignal<string | undefined>;
158
- /** Libellé du champ (associé via `<label for>`). */
294
+ /** Libellé du champ (associé via `<label for>`). @default undefined */
159
295
  readonly label: _angular_core.InputSignal<string | undefined>;
160
- /** Texte d'aide affiché sous le champ quand il est valide. */
296
+ /** Texte d'aide affiché sous le champ quand il est valide. @default undefined */
161
297
  readonly hint: _angular_core.InputSignal<string | undefined>;
162
- /** Aide contextuelle riche : texte ou `TemplateRef` projeté dans une infobulle d'aide. */
298
+ /** Aide contextuelle riche : texte ou `TemplateRef` projeté dans une infobulle d'aide. @default undefined */
163
299
  readonly helpText: _angular_core.InputSignal<string | TemplateRef<unknown> | undefined>;
164
300
  /** Libellé accessible du bouton d'aide. @default 'Help' (ou KT_FIELD_CONFIG.helpLabel) */
165
301
  readonly helpLabel: _angular_core.InputSignal<string>;
166
- /** Force la valeur de `aria-describedby` (sinon dérivée de hint/erreur). */
302
+ /** Force la valeur de `aria-describedby` (sinon dérivée de hint/erreur). @default undefined */
167
303
  readonly customDescribedBy: _angular_core.InputSignal<string | undefined>;
168
304
  /** Émis au clic sur le bouton d'aide contextuelle. */
169
305
  readonly helpClick: _angular_core.OutputEmitterRef<MouseEvent>;
170
- /** Texte indicatif affiché dans le champ vide. */
306
+ /** Texte indicatif affiché dans le champ vide. @default undefined */
171
307
  readonly placeholder: _angular_core.InputSignal<string | undefined>;
172
308
  /** Indice d'autoremplissage du navigateur (attribut `autocomplete` natif) ; ex. `'current-password'`,
173
309
  `'new-password'`, `'email'`, `'username'`, `'off'`.
174
310
  @default undefined */
175
311
  readonly autocomplete: _angular_core.InputSignal<AutoFill | undefined>;
176
- /** Nom d'icône Material Symbols affichée en tête de champ. */
312
+ /** Nom d'icône Material Symbols affichée en tête de champ. @default undefined */
177
313
  readonly icon: _angular_core.InputSignal<string | undefined>;
178
314
  /** Affiche un bouton « effacer » quand le champ contient une valeur. @default false */
179
315
  readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
180
- /** Contenu décoratif en tête de champ : texte ou `TemplateRef`. */
316
+ /** Contenu décoratif en tête de champ : texte ou `TemplateRef`. @default undefined */
181
317
  readonly prefix: _angular_core.InputSignal<string | TemplateRef<unknown> | undefined>;
182
- /** Contenu décoratif en fin de champ : texte ou `TemplateRef`. */
318
+ /** Contenu décoratif en fin de champ : texte ou `TemplateRef`. @default undefined */
183
319
  readonly suffix: _angular_core.InputSignal<string | TemplateRef<unknown> | undefined>;
184
320
  /** Libellé i18n du bouton « effacer ». @default 'Clear' (ou KT_FIELD_CONFIG.clearLabel) */
185
321
  readonly clearLabel: _angular_core.InputSignal<string>;
186
- /** Quand afficher l'erreur ; surcharge KT_FIELD_CONFIG et le défaut (`invalid && touched`). */
322
+ /** Quand afficher l'erreur ; surcharge KT_FIELD_CONFIG et le défaut (`invalid && touched`). @default undefined */
187
323
  readonly errorMatcher: _angular_core.InputSignal<KtFieldErrorMatcher | undefined>;
324
+ /** Apparence du chrome (`fill` | `outline`) ; non fournie ⇒ `KT_FIELD_CONFIG.appearance` ?? `'fill'`.
325
+ @default undefined */
326
+ readonly appearance: _angular_core.InputSignal<KtFieldAppearance | undefined>;
327
+ /** Politique du label flottant en outline (`auto` | `always`) ; non fournie ⇒ `KT_FIELD_CONFIG.floatLabel`
328
+ ?? `'auto'`. En `always`, le label reste en haut même vide et le placeholder s'affiche. @default undefined */
329
+ readonly floatLabel: _angular_core.InputSignal<KtFloatLabel | undefined>;
188
330
  protected readonly inputRef: _angular_core.Signal<ElementRef<HTMLInputElement | HTMLTextAreaElement> | undefined>;
189
331
  private readonly matcher;
190
332
  protected readonly showInvalid: _angular_core.Signal<boolean>;
333
+ /** Erreurs prêtes pour `kt-field` : messages par défaut résolus, suppressions (`message: ''`) écartées. */
334
+ protected readonly displayErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
191
335
  protected readonly showClear: _angular_core.Signal<boolean>;
336
+ /** Apparence effective (input ?? config ?? 'fill'). Sert aux templates : forward à `kt-field` et,
337
+ en outline, pose une sentinelle de placeholder pour la détection « rempli » du label flottant. */
338
+ protected readonly outline: _angular_core.Signal<boolean>;
339
+ /** Label toujours flotté en outline (input ?? config ?? 'auto'). */
340
+ protected readonly alwaysFloat: _angular_core.Signal<boolean>;
341
+ /** Valeur de l'attribut `placeholder` natif selon l'apparence :
342
+ - fill : le placeholder tel quel ;
343
+ - outline + always : le vrai placeholder (le label est en haut, pas de chevauchement) ;
344
+ - outline + auto : sentinelle `' '` (le label tient lieu de placeholder ; active `:placeholder-shown`). */
345
+ protected readonly placeholderAttr: _angular_core.Signal<string | null>;
192
346
  protected asTemplate(value: string | TemplateRef<unknown> | undefined): TemplateRef<unknown> | null;
193
347
  protected asText(value: string | TemplateRef<unknown> | undefined): string | null;
194
348
  protected onInput(event: Event): void;
195
349
  protected onKeyDown(event: KeyboardEvent): void;
350
+ /** Focus le contrôle natif (utilisé par Signal Forms `focusBoundControl`). */
351
+ focus(options?: FocusOptions): void;
352
+ /** Ré-aligne le texte affiché sur la valeur courante (utilisé par Signal Forms `reset`). */
353
+ reset(): void;
354
+ /** Représentation texte de la valeur pour l'input natif. Surchargeable par sous-classe. */
355
+ protected displayValue(): string;
196
356
  protected clear(): void;
197
357
  /** Parse la saisie brute en valeur typée. */
198
358
  protected abstract parse(raw: string): T;
@@ -201,9 +361,27 @@ declare abstract class KtBaseInputField<T> {
201
361
  /** La valeur est-elle vide (affichage du bouton d'effacement) ? */
202
362
  protected abstract isEmpty(value: T): boolean;
203
363
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtBaseInputField<any>, never>;
204
- 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; }; }, { "touched": "touchedChange"; "helpClick": "helpClick"; }, never, never, true, never>;
364
+ 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>;
205
365
  }
206
366
 
367
+ /** Suggestion d'un champ de saisie (rendu `<datalist>`) : soit la valeur seule, soit un couple
368
+ `{ value, label }` où `label` est le texte affiché et `value` ce qui est inséré dans le champ.
369
+ @template V Type de la valeur du champ (string, number, ou type Temporal selon le champ). */
370
+ type KtSuggestion<V> = V | {
371
+ value: V;
372
+ label?: string;
373
+ };
374
+ /** Option `<datalist>` normalisée : `value` est la chaîne posée sur l'attribut DOM, `label` le
375
+ libellé affiché (ou `null`). */
376
+ interface KtDatalistOption {
377
+ value: string;
378
+ label: string | null;
379
+ }
380
+ /** Normalise une liste de suggestions en options `<datalist>`. `toValue` sérialise la valeur en
381
+ chaîne attendue par l'input natif (identité pour le texte, `String()` pour les nombres,
382
+ `serialize()` pour les champs Temporal). */
383
+ declare function normalizeKtSuggestions<V>(suggestions: readonly KtSuggestion<V>[] | undefined, toValue: (value: V) => string): readonly KtDatalistOption[];
384
+
207
385
  /**
208
386
  * Champ numérique : valeur `number | null` (champ vide ⇒ `null`, jamais `NaN`), intégré aux
209
387
  * Signal Forms via `FormValueControl`. Hérite de la présentation commune (label/hint/clear/
@@ -231,11 +409,12 @@ declare class KtNumberField extends KtBaseInputField<number | null> implements F
231
409
  private readonly uid;
232
410
  protected readonly datalistId: string;
233
411
  protected readonly hasSuggestions: _angular_core.Signal<boolean>;
234
- protected readonly datalistOptions: _angular_core.Signal<readonly KtDatalistOption[]>;
412
+ protected readonly datalistOptions: _angular_core.Signal<readonly _ktortu_aaa_forms.KtDatalistOption[]>;
235
413
  protected readonly rawValue: _angular_forms_signals.TransformedValueSignal<string>;
236
414
  protected parse(raw: string): number | null;
237
415
  protected onKeyDown(event: KeyboardEvent): void;
238
416
  private adjustValue;
417
+ reset(): void;
239
418
  protected emptyValue(): number | null;
240
419
  protected isEmpty(value: number | null): boolean;
241
420
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtNumberField, never>;
@@ -256,13 +435,20 @@ declare class KtTextArea extends KtBaseInputField<string> implements FormValueCo
256
435
  readonly value: _angular_core.ModelSignal<string>;
257
436
  /** Hauteur initiale (lignes). L'autosize est géré en CSS via `field-sizing: content`. @default 3 */
258
437
  readonly rows: _angular_core.InputSignal<number>;
438
+ /** Plancher de caractères (attribut `minlength` natif ; poussé par le validateur minLength). @default undefined */
439
+ readonly minLength: _angular_core.InputSignal<number | undefined>;
259
440
  /** Plafond de caractères ; poussé par le form (validateur maxLength) ou par le consommateur. @default undefined */
260
441
  readonly maxLength: _angular_core.InputSignal<number | undefined>;
442
+ /** Motifs de validation (contrat Signal Forms). L'attribut natif `pattern` ne prend qu'une regex →
443
+ seule la première est posée. @default [] */
444
+ readonly pattern: _angular_core.InputSignal<readonly RegExp[]>;
445
+ /** Source de la première regex pour l'attribut `pattern` natif (`null` si aucune). */
446
+ protected readonly patternAttr: _angular_core.Signal<string>;
261
447
  protected parse(raw: string): string;
262
448
  protected emptyValue(): string;
263
449
  protected isEmpty(value: string): boolean;
264
450
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtTextArea, never>;
265
- 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>;
451
+ 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; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
266
452
  }
267
453
 
268
454
  /** Types texte dont la valeur reste une string (number/date = composants séparés). */
@@ -281,6 +467,15 @@ declare class KtTextField extends KtBaseInputField<string> implements FormValueC
281
467
  readonly value: _angular_core.ModelSignal<string>;
282
468
  /** Variante HTML du champ (pilote `type` natif et le clavier mobile). @default 'text' */
283
469
  readonly type: _angular_core.InputSignal<KtTextFieldType>;
470
+ /** Plancher de caractères (attribut `minlength` natif ; poussé par le validateur minLength). @default undefined */
471
+ readonly minLength: _angular_core.InputSignal<number | undefined>;
472
+ /** Plafond de caractères (attribut `maxlength` natif ; poussé par le validateur maxLength). @default undefined */
473
+ readonly maxLength: _angular_core.InputSignal<number | undefined>;
474
+ /** Motifs de validation (contrat Signal Forms). L'attribut natif `pattern` ne prend qu'une regex →
475
+ seule la première est posée. @default [] */
476
+ readonly pattern: _angular_core.InputSignal<readonly RegExp[]>;
477
+ /** Source de la première regex pour l'attribut `pattern` natif (`null` si aucune). */
478
+ protected readonly patternAttr: _angular_core.Signal<string>;
284
479
  /** Suggestions d'autocomplétion proposées via un `<datalist>` natif (la saisie reste libre).
285
480
  Valeurs simples (`string[]`) ou couples `{ value, label }` pour distinguer libellé affiché et
286
481
  valeur insérée. @default undefined */
@@ -289,12 +484,12 @@ declare class KtTextField extends KtBaseInputField<string> implements FormValueC
289
484
  private readonly uid;
290
485
  protected readonly datalistId: string;
291
486
  protected readonly hasSuggestions: _angular_core.Signal<boolean>;
292
- protected readonly datalistOptions: _angular_core.Signal<readonly KtDatalistOption[]>;
487
+ protected readonly datalistOptions: _angular_core.Signal<readonly _ktortu_aaa_forms.KtDatalistOption[]>;
293
488
  protected parse(raw: string): string;
294
489
  protected emptyValue(): string;
295
490
  protected isEmpty(value: string): boolean;
296
491
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtTextField, never>;
297
- 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>;
492
+ 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>;
298
493
  }
299
494
 
300
495
  /**
@@ -316,11 +511,13 @@ declare class KtSwitch implements FormValueControl<boolean> {
316
511
  /** Désactive la bascule (non actionnable). @default false */
317
512
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
318
513
  /** Marque la bascule comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */
319
- readonly invalid: _angular_core.InputSignal<boolean>;
514
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
320
515
  /** Affiche l'astérisque requis sur le libellé. @default false */
321
516
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
322
517
  /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */
323
- readonly dirty: _angular_core.InputSignal<boolean>;
518
+ readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
519
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
520
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
324
521
  /** Erreurs de validation à afficher sous la bascule. @default [] */
325
522
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
326
523
  /** Identifiant logique du contrôle (à titre indicatif). @default '' */
@@ -336,7 +533,9 @@ declare class KtSwitch implements FormValueControl<boolean> {
336
533
  /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */
337
534
  readonly errorMatcher: _angular_core.InputSignal<KtFieldErrorMatcher | undefined>;
338
535
  /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */
339
- readonly showAllErrors: _angular_core.InputSignal<boolean>;
536
+ readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
537
+ private readonly switchBtn;
538
+ private readonly errorResolver;
340
539
  private readonly idGen;
341
540
  private readonly uid;
342
541
  protected readonly baseId: _angular_core.Signal<string>;
@@ -345,13 +544,18 @@ declare class KtSwitch implements FormValueControl<boolean> {
345
544
  protected readonly errorId: _angular_core.Signal<string>;
346
545
  private readonly matcher;
347
546
  protected readonly showInvalid: _angular_core.Signal<boolean>;
348
- protected readonly displayedErrors: _angular_core.Signal<readonly WithOptionalFieldTree<ValidationError>[]>;
547
+ /** Erreurs résolues (messages par défaut appliqués, suppressions `message: ''` écartées). */
548
+ protected readonly resolvedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
549
+ protected readonly displayedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
349
550
  protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
350
551
  protected readonly describedBy: _angular_core.Signal<string | null>;
552
+ constructor();
553
+ /** Focus le bouton bascule natif (utilisé par Signal Forms `focusBoundControl`). */
554
+ focus(options?: FocusOptions): void;
351
555
  protected toggle(): void;
352
556
  protected onSpacebar(event: Event): void;
353
557
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtSwitch, never>;
354
- 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>;
558
+ 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>;
355
559
  }
356
560
 
357
561
  /**
@@ -366,9 +570,9 @@ declare class KtSwitch implements FormValueControl<boolean> {
366
570
  * @example
367
571
  * ```html
368
572
  * <kt-checkbox-group label="Centres d'intérêt" [(value)]="interests" required>
369
- * <kt-checkbox [value]="'sport'" label="Sport" />
370
- * <kt-checkbox [value]="'musique'" label="Musique" />
371
- * <kt-checkbox [value]="'cinema'" label="Cinéma" />
573
+ * <kt-checkbox [optionValue]="'sport'" label="Sport" />
574
+ * <kt-checkbox [optionValue]="'musique'" label="Musique" />
575
+ * <kt-checkbox [optionValue]="'cinema'" label="Cinéma" />
372
576
  * </kt-checkbox-group>
373
577
  * ```
374
578
  */
@@ -381,14 +585,18 @@ declare class KtCheckboxGroup<V> implements FormValueControl<V[]> {
381
585
  /** Désactive le groupe entier (hérité par chaque case enfant). @default false */
382
586
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
383
587
  /** Marque le groupe comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */
384
- readonly invalid: _angular_core.InputSignal<boolean>;
588
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
385
589
  /** Affiche l'astérisque requis et `aria-required` sur le groupe. @default false */
386
590
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
387
591
  /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */
388
- readonly dirty: _angular_core.InputSignal<boolean>;
592
+ readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
593
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
594
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
389
595
  /** Erreurs de validation à afficher sous le groupe. @default [] */
390
596
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
391
- /** Attribut `name` partagé (à titre indicatif). @default '' */
597
+ /** Nom logique du groupe, à titre INDICATIF : contrairement à `kt-radio-group` (où `name` est
598
+ propagé aux `<input>` natifs pour le regroupement radio), il n'est PAS répercuté sur les cases
599
+ enfants (les checkboxes n'ont pas besoin d'un `name` partagé). @default '' */
392
600
  readonly name: _angular_core.InputSignal<string>;
393
601
  /** id imposé (sélecteurs de test stables) ; sinon auto-généré, anti-collision. @default undefined */
394
602
  readonly id: _angular_core.InputSignal<string | undefined>;
@@ -401,9 +609,11 @@ declare class KtCheckboxGroup<V> implements FormValueControl<V[]> {
401
609
  /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */
402
610
  readonly errorMatcher: _angular_core.InputSignal<KtFieldErrorMatcher | undefined>;
403
611
  /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */
404
- readonly showAllErrors: _angular_core.InputSignal<boolean>;
612
+ readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
405
613
  /** Égalité des valeurs en mode objet (défaut : identité `===`). */
406
614
  readonly compareWith: _angular_core.InputSignal<((a: V, b: V) => boolean) | undefined>;
615
+ private readonly el;
616
+ private readonly errorResolver;
407
617
  private readonly idGen;
408
618
  private readonly uid;
409
619
  protected readonly baseId: _angular_core.Signal<string>;
@@ -412,16 +622,20 @@ declare class KtCheckboxGroup<V> implements FormValueControl<V[]> {
412
622
  protected readonly errorId: _angular_core.Signal<string>;
413
623
  private readonly matcher;
414
624
  protected readonly showInvalid: _angular_core.Signal<boolean>;
415
- protected readonly displayedErrors: _angular_core.Signal<readonly WithOptionalFieldTree<ValidationError>[]>;
625
+ /** Erreurs résolues (messages par défaut appliqués, suppressions `message: ''` écartées). */
626
+ protected readonly resolvedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
627
+ protected readonly displayedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
416
628
  protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
417
629
  protected readonly describedBy: _angular_core.Signal<string | null>;
418
630
  private readonly comparator;
419
631
  /** La valeur d'option d'un enfant est-elle dans la sélection ? (lu dans le `computed` enfant) */
420
632
  isSelected(optionValue: V): boolean;
633
+ /** Focus la première case activable (utilisé par Signal Forms `focusBoundControl`). */
634
+ focus(options?: FocusOptions): void;
421
635
  /** Ajoute/retire une valeur d'option de la sélection (émis par un enfant au `change` natif). */
422
636
  toggle(optionValue: V, checked: boolean): void;
423
637
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtCheckboxGroup<any>, never>;
424
- 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>;
638
+ 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>;
425
639
  }
426
640
 
427
641
  /**
@@ -432,8 +646,9 @@ declare class KtCheckboxGroup<V> implements FormValueControl<V[]> {
432
646
  * DEUX MODES, selon la présence d'un `kt-checkbox-group` parent :
433
647
  * - Autonome : `value` est l'état coché (`boolean`, two-way), intégré aux Signal Forms via
434
648
  * `FormValueControl<boolean>` (même contrat que `kt-switch`).
435
- * - Dans un groupe : `value` est la VALEUR d'option représentée ; l'état coché dérive de
436
- * l'appartenance au tableau du groupe, et le (dé)cochage met à jour ce tableau.
649
+ * - Dans un groupe : `optionValue` porte la VALEUR d'option représentée ; l'état coché dérive de
650
+ * l'appartenance au tableau du groupe, et le (dé)cochage met à jour ce tableau. `value` est
651
+ * alors ignoré (c'est le groupe qui détient la sélection).
437
652
  *
438
653
  * Libellé : `label` (texte) par défaut ; un contenu projeté le remplace visuellement pour les
439
654
  * rendus riches (carte/option), `ariaLabel` portant alors le nom accessible si besoin.
@@ -445,17 +660,21 @@ declare class KtCheckboxGroup<V> implements FormValueControl<V[]> {
445
660
  *
446
661
  * <!-- Dans un groupe -->
447
662
  * <kt-checkbox-group label="Centres d'intérêt" [(value)]="interests">
448
- * <kt-checkbox [value]="'sport'" label="Sport" />
449
- * <kt-checkbox [value]="'musique'" label="Musique" />
663
+ * <kt-checkbox [optionValue]="'sport'" label="Sport" />
664
+ * <kt-checkbox [optionValue]="'musique'" label="Musique" />
450
665
  * </kt-checkbox-group>
451
666
  * ```
452
667
  */
453
- declare class KtCheckbox<V = boolean> implements FormValueControl<V> {
668
+ declare class KtCheckbox<V = unknown> implements FormValueControl<boolean> {
454
669
  private readonly config;
455
670
  /** Groupe parent optionnel : présent ⇒ la case appartient à un `kt-checkbox-group`. */
456
671
  protected readonly group: KtCheckboxGroup<V> | null;
457
- /** Autonome : état coché (`boolean`, two-way). En groupe : la valeur d'option représentée. */
458
- readonly value: _angular_core.ModelSignal<V>;
672
+ /** État coché (`boolean`, two-way) en mode autonome. Ignoré en mode groupe : c'est alors
673
+ `optionValue` + le tableau du groupe qui font foi. @default false */
674
+ readonly value: _angular_core.ModelSignal<boolean>;
675
+ /** Mode groupe uniquement : valeur d'option contribuée au tableau du `kt-checkbox-group` parent
676
+ quand la case est cochée. Sans effet en mode autonome. @default undefined */
677
+ readonly optionValue: _angular_core.InputSignal<V | undefined>;
459
678
  /** Tri-état visuel (parent d'une arborescence) : propriété DOM `indeterminate`, pas un attribut. */
460
679
  readonly indeterminate: _angular_core.InputSignalWithTransform<boolean, unknown>;
461
680
  /** État « touché » (two-way), généralement piloté par `[formField]`. @default false */
@@ -463,11 +682,13 @@ declare class KtCheckbox<V = boolean> implements FormValueControl<V> {
463
682
  /** Désactive la case (héritable du groupe parent). @default false */
464
683
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
465
684
  /** Marque la case comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */
466
- readonly invalid: _angular_core.InputSignal<boolean>;
685
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
467
686
  /** Affiche l'astérisque requis et `aria-required`. @default false */
468
687
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
469
688
  /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */
470
- readonly dirty: _angular_core.InputSignal<boolean>;
689
+ readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
690
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
691
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
471
692
  /** Erreurs de validation à afficher sous la case. @default [] */
472
693
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
473
694
  /** Attribut `name` du `<input>` natif. @default '' */
@@ -483,8 +704,10 @@ declare class KtCheckbox<V = boolean> implements FormValueControl<V> {
483
704
  /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */
484
705
  readonly errorMatcher: _angular_core.InputSignal<KtFieldErrorMatcher | undefined>;
485
706
  /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */
486
- readonly showAllErrors: _angular_core.InputSignal<boolean>;
707
+ readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
487
708
  private readonly inputEl;
709
+ private readonly el;
710
+ private readonly errorResolver;
488
711
  private readonly idGen;
489
712
  private readonly uid;
490
713
  protected readonly baseId: _angular_core.Signal<string>;
@@ -497,14 +720,18 @@ declare class KtCheckbox<V = boolean> implements FormValueControl<V> {
497
720
  protected readonly isDisabled: _angular_core.Signal<boolean>;
498
721
  private readonly matcher;
499
722
  protected readonly showInvalid: _angular_core.Signal<boolean>;
500
- protected readonly displayedErrors: _angular_core.Signal<readonly WithOptionalFieldTree<ValidationError>[]>;
723
+ /** Erreurs résolues (messages par défaut appliqués, suppressions `message: ''` écartées). */
724
+ protected readonly resolvedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
725
+ protected readonly displayedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
501
726
  protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
502
727
  protected readonly describedBy: _angular_core.Signal<string | null>;
503
728
  constructor();
729
+ /** Focus la case native (utilisé par Signal Forms `focusBoundControl`). */
730
+ focus(options?: FocusOptions): void;
504
731
  protected onChange(event: Event): void;
505
732
  protected onBlur(): void;
506
733
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtCheckbox<any>, never>;
507
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtCheckbox<any>, "kt-checkbox", never, { "value": { "alias": "value"; "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>;
734
+ 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>;
508
735
  }
509
736
 
510
737
  /**
@@ -520,9 +747,9 @@ declare class KtCheckbox<V = boolean> implements FormValueControl<V> {
520
747
  * @example
521
748
  * ```html
522
749
  * <kt-radio-group label="Civilité" [(value)]="civility" required>
523
- * <kt-radio [value]="'mme'" label="Madame" />
524
- * <kt-radio [value]="'m'" label="Monsieur" />
525
- * <kt-radio [value]="'autre'" label="Autre" />
750
+ * <kt-radio [optionValue]="'mme'" label="Madame" />
751
+ * <kt-radio [optionValue]="'m'" label="Monsieur" />
752
+ * <kt-radio [optionValue]="'autre'" label="Autre" />
526
753
  * </kt-radio-group>
527
754
  * ```
528
755
  */
@@ -535,11 +762,13 @@ declare class KtRadioGroup<V> implements FormValueControl<V | null> {
535
762
  /** Désactive le groupe entier (hérité par chaque radio enfant). @default false */
536
763
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
537
764
  /** Marque le groupe comme invalide (combiné à `touched`/`dirty` via l'`errorMatcher`). @default false */
538
- readonly invalid: _angular_core.InputSignal<boolean>;
765
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
539
766
  /** Affiche l'astérisque requis et `aria-required` sur le groupe. @default false */
540
767
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
541
768
  /** État « modifié » (entre dans la logique d'affichage des erreurs). @default false */
542
- readonly dirty: _angular_core.InputSignal<boolean>;
769
+ readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
770
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
771
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
543
772
  /** Erreurs de validation à afficher sous le groupe. @default [] */
544
773
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
545
774
  /** Base du `name` partagé par les radios enfants (sinon auto-généré). @default '' */
@@ -555,9 +784,11 @@ declare class KtRadioGroup<V> implements FormValueControl<V | null> {
555
784
  /** Stratégie décidant quand afficher les erreurs (sinon celle du `KT_FIELD_CONFIG`). @default undefined */
556
785
  readonly errorMatcher: _angular_core.InputSignal<KtFieldErrorMatcher | undefined>;
557
786
  /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */
558
- readonly showAllErrors: _angular_core.InputSignal<boolean>;
787
+ readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
559
788
  /** Égalité des valeurs en mode objet (défaut : identité `===`). Seul rescapé du contrat select. */
560
789
  readonly compareWith: _angular_core.InputSignal<((a: V, b: V) => boolean) | undefined>;
790
+ private readonly el;
791
+ private readonly errorResolver;
561
792
  private readonly idGen;
562
793
  private readonly uid;
563
794
  protected readonly baseId: _angular_core.Signal<string>;
@@ -568,16 +799,21 @@ declare class KtRadioGroup<V> implements FormValueControl<V | null> {
568
799
  protected readonly errorId: _angular_core.Signal<string>;
569
800
  private readonly matcher;
570
801
  protected readonly showInvalid: _angular_core.Signal<boolean>;
571
- protected readonly displayedErrors: _angular_core.Signal<readonly WithOptionalFieldTree<ValidationError>[]>;
802
+ /** Erreurs résolues (messages par défaut appliqués, suppressions `message: ''` écartées). */
803
+ protected readonly resolvedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
804
+ protected readonly displayedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
572
805
  protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
573
806
  protected readonly describedBy: _angular_core.Signal<string | null>;
574
807
  private readonly comparator;
575
- /** Le `value` d'un enfant correspond-il à la sélection courante ? (lu dans le `computed` enfant) */
808
+ /** L'`optionValue` d'un enfant correspond-il à la sélection courante ? (lu dans le `computed` enfant) */
576
809
  isSelected(radioValue: V): boolean;
810
+ /** Focus l'option pertinente (utilisé par Signal Forms `focusBoundControl`) : le radio coché
811
+ s'il existe, sinon le premier radio activable — conforme au roving tabindex natif. */
812
+ focus(options?: FocusOptions): void;
577
813
  /** Commit d'une sélection émis par un enfant au `change` natif. */
578
814
  select(radioValue: V): void;
579
815
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtRadioGroup<any>, never>;
580
- 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>;
816
+ 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>;
581
817
  }
582
818
 
583
819
  /**
@@ -589,15 +825,16 @@ declare class KtRadioGroup<V> implements FormValueControl<V | null> {
589
825
  * @example
590
826
  * ```html
591
827
  * <kt-radio-group label="Civilité" [(value)]="civility">
592
- * <kt-radio [value]="'mme'" label="Madame" />
593
- * <kt-radio [value]="'m'" label="Monsieur" />
828
+ * <kt-radio [optionValue]="'mme'" label="Madame" />
829
+ * <kt-radio [optionValue]="'m'" label="Monsieur" />
594
830
  * </kt-radio-group>
595
831
  * ```
596
832
  */
597
833
  declare class KtRadio<V> {
598
834
  protected readonly group: KtRadioGroup<V>;
599
- /** Valeur d'option représentée par ce radio (sélectionnée ⇒ devient la valeur du groupe). @default (requis) */
600
- readonly value: _angular_core.InputSignal<V>;
835
+ /** Valeur d'option représentée par ce radio (sélectionnée ⇒ devient la valeur du groupe). Nommée
836
+ `optionValue` pour s'aligner sur `kt-checkbox` (où `value` = état coché). @default (requis) */
837
+ readonly optionValue: _angular_core.InputSignal<V>;
601
838
  /** Texte du libellé (remplacé visuellement par un contenu projeté). @default undefined */
602
839
  readonly label: _angular_core.InputSignal<string | undefined>;
603
840
  /** Texte d'aide affiché sous le radio. @default undefined */
@@ -614,9 +851,11 @@ declare class KtRadio<V> {
614
851
  protected readonly hintId: _angular_core.Signal<string>;
615
852
  protected readonly checked: _angular_core.Signal<boolean>;
616
853
  protected readonly isDisabled: _angular_core.Signal<boolean>;
854
+ private readonly el;
855
+ constructor();
617
856
  protected onChange(): void;
618
857
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtRadio<any>, never>;
619
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtRadio<any>, "kt-radio", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
858
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtRadio<any>, "kt-radio", never, { "optionValue": { "alias": "optionValue"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
620
859
  }
621
860
 
622
861
  /** Clé (propriété) OU fonction d'accès, pour dériver une valeur d'un item.
@@ -636,6 +875,7 @@ type KtKeyish<T, R> = keyof T | ((item: T) => R);
636
875
  ou la clé extraite quand `optionValue` est fourni). */
637
876
  declare abstract class KtBaseSelect<T, V = T> {
638
877
  protected readonly fieldConfig: Partial<_ktortu_aaa_forms.KtFieldConfig> | null;
878
+ private readonly errorResolver;
639
879
  protected readonly config: Partial<_ktortu_aaa_forms.KtSelectConfigOptions> | null;
640
880
  protected readonly host: ElementRef<HTMLElement>;
641
881
  private readonly ngZone;
@@ -660,15 +900,17 @@ declare abstract class KtBaseSelect<T, V = T> {
660
900
  /** Le champ a-t-il été visité ? Poussé par `[formField]` ; passe à `true` à la première sélection. @default false */
661
901
  readonly touched: _angular_core.ModelSignal<boolean>;
662
902
  /** Champ désactivé (trigger inerte). Poussé par `[formField]`. @default false */
663
- readonly disabled: _angular_core.InputSignal<boolean>;
903
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
664
904
  /** Champ en lecture seule (sélection figée, valeur affichée). Poussé par `[formField]`. @default false */
665
- readonly readonly: _angular_core.InputSignal<boolean>;
905
+ readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
666
906
  /** Le champ est-il invalide ? Pilote l'affichage des erreurs. Poussé par `[formField]`. @default false */
667
- readonly invalid: _angular_core.InputSignal<boolean>;
907
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
668
908
  /** Champ obligatoire (marqueur visuel/ARIA). Poussé par `[formField]`. @default false */
669
- readonly required: _angular_core.InputSignal<boolean>;
909
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
670
910
  /** Le champ a-t-il été modifié depuis sa valeur initiale ? Poussé par `[formField]`. @default false */
671
- readonly dirty: _angular_core.InputSignal<boolean>;
911
+ readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
912
+ /** Validation asynchrone en cours (poussé par `[field]`) : pose `aria-busy` + `data-pending`. @default false */
913
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
672
914
  /** Erreurs de validation à afficher. Poussé par `[formField]`. @default [] */
673
915
  readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
674
916
  /** Attribut `name` logique du contrôle (à titre indicatif). @default '' */
@@ -689,9 +931,15 @@ declare abstract class KtBaseSelect<T, V = T> {
689
931
  readonly placeholder: _angular_core.InputSignal<string | undefined>;
690
932
  /** Quand afficher l'erreur ; surcharge KT_FIELD_CONFIG et le défaut (`invalid && touched`). @default undefined */
691
933
  readonly errorMatcher: _angular_core.InputSignal<KtFieldErrorMatcher | undefined>;
934
+ /** Apparence du chrome (`fill` | `outline`) ; non fournie ⇒ `KT_FIELD_CONFIG.appearance` ?? `'fill'`.
935
+ @default undefined */
936
+ readonly appearance: _angular_core.InputSignal<KtFieldAppearance | undefined>;
937
+ /** Politique du label flottant en outline (`auto` | `always`) ; non fournie ⇒ `KT_FIELD_CONFIG.floatLabel`
938
+ ?? `'auto'`. @default undefined */
939
+ readonly floatLabel: _angular_core.InputSignal<KtFloatLabel | undefined>;
692
940
  /** Affiche un champ de recherche en tête du popup (desktop) / de la sheet (téléphone).
693
- Pour les listes longues ; le texte tapé ne sert qu'à filtrer (réinitialisé à la fermeture). */
694
- readonly filterable: _angular_core.InputSignal<boolean>;
941
+ Pour les listes longues ; le texte tapé ne sert qu'à filtrer (réinitialisé à la fermeture). @default false */
942
+ readonly filterable: _angular_core.InputSignalWithTransform<boolean, unknown>;
695
943
  /** Placeholder du champ de recherche du popup. Défaut : `KT_SELECT_CONFIG.filterPlaceholder` ou vide. */
696
944
  readonly filterPlaceholder: _angular_core.InputSignal<string | undefined>;
697
945
  /** Libellé accessible du champ de recherche. Défaut : `KT_SELECT_CONFIG.filterLabel` ou « Filter options ». */
@@ -735,10 +983,7 @@ declare abstract class KtBaseSelect<T, V = T> {
735
983
  protected readonly resolvedFilterResultsText: Signal<(count: number) => string>;
736
984
  protected readonly resolvedTruncatedResultsText: Signal<(max: number, total: number) => string>;
737
985
  protected readonly resolvedTruncatedResultsAnnouncement: Signal<(max: number, total: number) => string>;
738
- protected readonly fieldErrors: Signal<{
739
- kind: string;
740
- message: string | undefined;
741
- }[]>;
986
+ protected readonly fieldErrors: Signal<_ktortu_aaa_forms.KtFieldError[]>;
742
987
  private readonly labelAccessor;
743
988
  private readonly valueAccessor;
744
989
  private readonly disabledAccessor;
@@ -782,6 +1027,11 @@ declare abstract class KtBaseSelect<T, V = T> {
782
1027
  re-pousse rien (`listboxValue` n'a pas changé) — on resynchronise le modèle du Listbox
783
1028
  avec les clés sélectionnées actuellement visibles. */
784
1029
  protected resyncListboxSelection(): void;
1030
+ /** Focus le trigger natif (utilisé par Signal Forms `focusBoundControl`). */
1031
+ focus(options?: FocusOptions): void;
1032
+ /** Referme le panneau et vide le filtre (utilisé par Signal Forms `reset`). La sélection du
1033
+ listbox dérive de `value()` (computed) et se resynchronise seule. */
1034
+ reset(): void;
785
1035
  /** Desktop filtrable : le focus DOM vit dans le popup (champ/options) — on le rend au trigger
786
1036
  à la fermeture, sinon il tombe sur `<body>`. (Écran compact : déjà géré par l'effect `compact`.) */
787
1037
  protected refocusTriggerAfterFilterClose(): void;
@@ -791,7 +1041,7 @@ declare abstract class KtBaseSelect<T, V = T> {
791
1041
  protected onDragStart(event: PointerEvent): void;
792
1042
  private animateAndCloseSelect;
793
1043
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtBaseSelect<any, any>, never>;
794
- 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; }; "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>;
1044
+ 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>;
795
1045
  }
796
1046
 
797
1047
  /** Contexte typé reçu par le template d'une option (`ktSelectOption`). */
@@ -863,7 +1113,12 @@ interface KtSelectSelectionChange<T, V = T> {
863
1113
 
864
1114
  @example
865
1115
  ```html
866
- <kt-select [options]="users" optionLabel="name" optionValue="id" [(value)]="selectedId" />
1116
+ <kt-select
1117
+ [options]="users"
1118
+ optionLabel="name"
1119
+ optionValue="id"
1120
+ [(value)]="selectedId"
1121
+ (selectionChange)="onSelectionChange($event)" />
867
1122
  ``` */
868
1123
  declare class KtSelect<T, V = T> extends KtBaseSelect<T, V> implements FormValueControl<V | null> {
869
1124
  /** Valeur sélectionnée (clé extraite, ou objet entier si `optionValue` est omis ; `null` si rien). @default null */
@@ -932,6 +1187,13 @@ interface KtSelectConfigOptions {
932
1187
  truncatedResultsAnnouncement: (max: number, total: number) => string;
933
1188
  }
934
1189
  declare const KT_SELECT_CONFIG: InjectionToken<Partial<KtSelectConfigOptions>>;
1190
+ /**
1191
+ * Source UNIQUE des défauts (anglais neutre) de la config select / multi-select. Constitue le 3e
1192
+ * maillon de la résolution `input() ?? KT_SELECT_CONFIG ?? DEFAULT_KT_SELECT_CONFIG`, jusqu'ici
1193
+ * éparpillé entre `base-select.ts`, `multi-select.ts` et des fonctions locales. Centralisé ici pour
1194
+ * éviter toute dérive et garantir la complétude des traductions (cf. test de complétude i18n).
1195
+ */
1196
+ declare const DEFAULT_KT_SELECT_CONFIG: Required<KtSelectConfigOptions>;
935
1197
 
936
1198
  /** Configure les `kt-select` d'un sous-arbre via DI (équivalent du Context provider de react-select).
937
1199
  Alternative à un provider global de `KT_SELECT_CONFIG` : on pose la directive sur un conteneur et
@@ -945,30 +1207,13 @@ declare const KT_SELECT_CONFIG: InjectionToken<Partial<KtSelectConfigOptions>>;
945
1207
 
946
1208
  La directive EST fournie comme `KT_SELECT_CONFIG` (`useExisting`) : les getters exposent l'objet
947
1209
  bindé sous la forme `Partial<KtSelectConfigOptions>` attendue par le composant. */
948
- declare class KtSelectConfig implements Partial<KtSelectConfigOptions> {
1210
+ declare class KtSelectConfig {
949
1211
  readonly ktSelectConfig: _angular_core.InputSignal<Partial<KtSelectConfigOptions>>;
950
1212
  /** Config héritée du contexte parent (provider global ou directive englobante) : la
951
1213
  directive ne masque que les clés qu'elle définit, le reste continue d'en hériter. */
952
1214
  private readonly parent;
953
- private resolve;
954
- get placeholder(): string | undefined;
955
- get emptyText(): string | undefined;
956
- get closeLabel(): string | undefined;
957
- get closeOnSelect(): boolean | undefined;
958
- get filterPlaceholder(): string | undefined;
959
- get filterLabel(): string | undefined;
960
- get filterResultsText(): ((count: number) => string) | undefined;
961
- get removeItemLabel(): ((itemLabel: string) => string) | undefined;
962
- get selectedItemsLabel(): ((fieldLabel: string | undefined) => string) | undefined;
963
- get selectionSummaryText(): ((count: number) => string) | undefined;
964
- get itemRemovedText(): ((itemLabel: string) => string) | undefined;
965
- get selectionCountText(): ((count: number) => string) | undefined;
966
- get selectAllLabel(): string | undefined;
967
- get clearAllLabel(): string | undefined;
968
- get moreChipsLabel(): ((hiddenCount: number) => string) | undefined;
969
- get lessChipsLabel(): string | undefined;
970
- get truncatedResultsText(): ((max: number, total: number) => string) | undefined;
971
- get truncatedResultsAnnouncement(): ((max: number, total: number) => string) | undefined;
1215
+ /** Résout une clé : valeur bindée sur la directive, sinon valeur héritée du contexte parent. */
1216
+ resolve<K extends keyof KtSelectConfigOptions>(key: K): Partial<KtSelectConfigOptions>[K];
972
1217
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtSelectConfig, never>;
973
1218
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtSelectConfig, "[ktSelectConfig]", never, { "ktSelectConfig": { "alias": "ktSelectConfig"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
974
1219
  }
@@ -1070,7 +1315,12 @@ interface KtMultiSelectSelectionChange<T, V = T> {
1070
1315
  *
1071
1316
  * @example
1072
1317
  * ```html
1073
- * <kt-multi-select [options]="tags" optionLabel="name" optionValue="id" [(value)]="selectedIds" />
1318
+ * <kt-multi-select
1319
+ * [options]="tags"
1320
+ * optionLabel="name"
1321
+ * optionValue="id"
1322
+ * [(value)]="selectedIds"
1323
+ * (selectionChange)="onSelectionChange($event)" />
1074
1324
  * ```
1075
1325
  */
1076
1326
  declare class KtMultiSelect<T, V = T> extends KtBaseSelect<T, V> implements FormValueControl<V[]> {
@@ -1180,7 +1430,11 @@ declare class KtChip {
1180
1430
  /** Émis au clic sur le bouton « retirer » (le parent décide de retirer le chip). */
1181
1431
  readonly remove: _angular_core.OutputEmitterRef<void>;
1182
1432
  private readonly removeBtn;
1183
- /** Focus programmatique du bouton « retirer » (focus management d'`kt-chip-list`). */
1433
+ /**
1434
+ * Focus programmatique du bouton « retirer ». Helper de coordination interne (focus management
1435
+ * d'`kt-chip-list`), non destiné aux consommateurs.
1436
+ * @internal
1437
+ */
1184
1438
  focusRemove(): void;
1185
1439
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtChip, never>;
1186
1440
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtChip, "kt-chip", never, { "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; }, { "remove": "remove"; }, never, ["*"], true, never>;
@@ -1205,6 +1459,7 @@ interface KtChipItemContext<T> {
1205
1459
  </kt-chip-list>
1206
1460
  ``` */
1207
1461
  declare class KtChipItemDef<T> {
1462
+ /** Liste des items rendus par ce template (sert aussi à inférer le type `T` du contexte). */
1208
1463
  readonly ktChipItem: _angular_core.InputSignal<readonly T[]>;
1209
1464
  readonly template: TemplateRef<KtChipItemContext<T>>;
1210
1465
  static ngTemplateContextGuard<T>(_dir: KtChipItemDef<T>, ctx: unknown): ctx is KtChipItemContext<T>;
@@ -1234,6 +1489,7 @@ declare class KtChipList<T> implements ChipTransitionScope {
1234
1489
  private readonly doc;
1235
1490
  private readonly platformId;
1236
1491
  private readonly cdr;
1492
+ private readonly ngZone;
1237
1493
  /** Vrai pendant la View Transition de CETTE liste : les chips (standards via Chip,
1238
1494
  custom via tokens.css) ne portent leur `view-transition-name` que dans cette fenêtre. */
1239
1495
  readonly transitioning: _angular_core.WritableSignal<boolean>;
@@ -1338,8 +1594,8 @@ interface KtChipsConfig {
1338
1594
  declare const KT_CHIPS_CONFIG: InjectionToken<Partial<KtChipsConfig>>;
1339
1595
 
1340
1596
  /** Base partagée des champs Temporal (Date/Time/DateTime/YearMonth).
1341
- Toute la logique commune (parsing tolérant, valeur vide `null`, `displayValue` pour l'input
1342
- natif) vit ici ; chaque sous-classe ne fournit que la construction et la sérialisation propres
1597
+ Toute la logique commune (parsing tolérant, valeur vide `null`, synchronisation de l'input natif)
1598
+ vit ici ; chaque sous-classe ne fournit que la construction et la sérialisation propres
1343
1599
  à son type Temporal (`fromString` / `serialize`).
1344
1600
 
1345
1601
  Contrat abstrait : une sous-classe implémente uniquement le couple
@@ -1349,7 +1605,20 @@ declare const KT_CHIPS_CONFIG: InjectionToken<Partial<KtChipsConfig>>;
1349
1605
  tolérant (saisie partielle/invalide → `null`, jamais d'exception ni de valeur fausse).
1350
1606
 
1351
1607
  @template T Type Temporal porté par le champ (ex. `Temporal.PlainDate`,
1352
- `Temporal.PlainTime`, …). Doit exposer `toString()`. La valeur du champ est `T | null`. */
1608
+ `Temporal.PlainTime`, …). Doit exposer `toString()`. La valeur du champ est `T | null`.
1609
+
1610
+ @example
1611
+ ```ts
1612
+ // Sous-classer : ne fournir que fromString (input natif → T) et serialize (T → input natif).
1613
+ export class KtDateField extends KtBaseTemporalField<Temporal.PlainDate> {
1614
+ protected override fromString(raw: string): Temporal.PlainDate {
1615
+ return Temporal.PlainDate.from(raw);
1616
+ }
1617
+ protected override serialize(value: Temporal.PlainDate): string {
1618
+ return value.toString();
1619
+ }
1620
+ }
1621
+ ``` */
1353
1622
  declare abstract class KtBaseTemporalField<T extends {
1354
1623
  toString(): string;
1355
1624
  }> extends KtBaseInputField<T | null> {
@@ -1360,10 +1629,24 @@ declare abstract class KtBaseTemporalField<T extends {
1360
1629
  /** Sérialise la valeur au format attendu par l'input natif (précision adaptée au type). */
1361
1630
  protected abstract serialize(value: T): string;
1362
1631
  protected parse(raw: string): T | null;
1632
+ protected displayValue(): string;
1633
+ /** Efface AUSSI l'input natif. L'effet de synchro ignore une mise à `null` quand l'input est
1634
+ focalisé (pour ne pas écraser une saisie partielle en cours), or `clear()` focalise justement
1635
+ le champ — sans ce forçage, le bouton « effacer » (et Échap) resterait sans effet sur les
1636
+ champs temporels. */
1637
+ protected clear(): void;
1363
1638
  protected emptyValue(): T | null;
1364
1639
  protected isEmpty(value: T | null): boolean;
1365
- /** Représentation ISO pour l'attribut `[value]` de l'input natif (null champ vide). */
1366
- protected readonly displayValue: _angular_core.Signal<string>;
1640
+ /** Borne minimale autorisée (membre `min` du contrat `FormValueControl`, aussi posé en attribut
1641
+ `min` natif via `serialize`). Non bornée par défaut. @default undefined */
1642
+ readonly min: _angular_core.InputSignal<T | undefined>;
1643
+ /** Borne maximale autorisée (membre `max` du contrat `FormValueControl`, aussi posé en attribut
1644
+ `max` natif via `serialize`). Non bornée par défaut. @default undefined */
1645
+ readonly max: _angular_core.InputSignal<T | undefined>;
1646
+ /** Représentation ISO de `min` pour l'attribut natif (`null` quand non borné). */
1647
+ protected readonly serializedMin: _angular_core.Signal<string | null>;
1648
+ /** Représentation ISO de `max` pour l'attribut natif (`null` quand non borné). */
1649
+ protected readonly serializedMax: _angular_core.Signal<string | null>;
1367
1650
  /** Suggestions proposées via un `<datalist>` natif (le picker date/heure reste disponible).
1368
1651
  Valeurs Temporal simples ou couples `{ value, label }` ; chaque valeur est sérialisée au
1369
1652
  format de l'input via `serialize`. @default undefined */
@@ -1372,11 +1655,64 @@ declare abstract class KtBaseTemporalField<T extends {
1372
1655
  private readonly uid;
1373
1656
  protected readonly datalistId: string;
1374
1657
  protected readonly hasSuggestions: _angular_core.Signal<boolean>;
1375
- protected readonly datalistOptions: _angular_core.Signal<readonly KtDatalistOption[]>;
1658
+ protected readonly datalistOptions: _angular_core.Signal<readonly _ktortu_aaa_forms.KtDatalistOption[]>;
1376
1659
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtBaseTemporalField<any>, never>;
1377
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseTemporalField<any>, never, never, { "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1660
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseTemporalField<any>, never, never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1661
+ }
1662
+
1663
+ /** Précision de saisie/sérialisation des champs Temporal porteurs d'une heure. */
1664
+ type KtTimePrecision = 'minute' | 'second';
1665
+ /** Base des champs Temporal porteurs d'une heure (`Time`, `DateTime`, `Instant`). Ajoute le réglage
1666
+ `precision` qui pilote, d'un seul point, la sérialisation (`smallestUnit` du `toString`) et
1667
+ l'attribut `step` natif de l'input — un input `time`/`datetime-local` n'affiche le sélecteur de
1668
+ secondes que si `step` < 60. Les champs sans heure (`Date`, `YearMonth`) n'héritent pas de cette
1669
+ base. Chaque sous-classe lit `precision()` dans son `serialize`.
1670
+
1671
+ @example
1672
+ ```ts
1673
+ // Sous-classer : lire precision() dans serialize pour piloter smallestUnit.
1674
+ export class KtTimeField extends KtBaseTimeTemporalField<Temporal.PlainTime> {
1675
+ protected override fromString(raw: string): Temporal.PlainTime {
1676
+ return Temporal.PlainTime.from(raw);
1677
+ }
1678
+ protected override serialize(value: Temporal.PlainTime): string {
1679
+ return value.toString({ smallestUnit: this.precision() });
1680
+ }
1681
+ }
1682
+ ``` */
1683
+ declare abstract class KtBaseTimeTemporalField<T extends {
1684
+ toString(): string;
1685
+ }> extends KtBaseTemporalField<T> {
1686
+ /** Précision de l'heure : `'minute'` (secondes masquées) ou `'second'`.
1687
+ @default 'minute' */
1688
+ readonly precision: _angular_core.InputSignal<KtTimePrecision>;
1689
+ /** Attribut `step` natif : `'1'` (seconde) en précision seconde, sinon `null` (pas natif = minute). */
1690
+ protected readonly step: _angular_core.Signal<string | null>;
1691
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtBaseTimeTemporalField<any>, never>;
1692
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseTimeTemporalField<any>, never, never, { "precision": { "alias": "precision"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1378
1693
  }
1379
1694
 
1695
+ /**
1696
+ * Point d'import unique de Temporal pour toute la lib.
1697
+ *
1698
+ * - La **valeur** runtime `Temporal` vient de `globalThis.Temporal` : native sur Chrome/Edge 144+,
1699
+ * Firefox 139+, Node 26+ ; sinon posée par le polyfill chargé dans `main.ts`
1700
+ * (`temporal-polyfill/global`) ou `test-setup.ts`.
1701
+ * - Les **types** (`TemporalNamespace.PlainDate`, …) viennent d'un `import type` (effacé au build
1702
+ * → 0 KB, le polyfill n'est jamais bundlé dans la lib).
1703
+ *
1704
+ * Convention : importer `{ Temporal, type TemporalNamespace }` — `Temporal` pour les appels
1705
+ * (`Temporal.PlainDate.from(...)`), `TemporalNamespace` pour les annotations
1706
+ * (`TemporalNamespace.PlainDate`). Le jour où le natif est garanti partout (Safari inclus), il
1707
+ * suffira de retirer le polyfill de `main.ts` : ce fichier ne change pas.
1708
+ */
1709
+ type TemporalImpl = (typeof temporal_polyfill)['Temporal'];
1710
+ /** Point d'accès `Temporal` de la lib. Proxy à résolution paresseuse : le namespace réel n'est lu
1711
+ qu'au premier accès de propriété (`Temporal.PlainDate`…), jamais à l'import — ce qui supprime la
1712
+ dépendance à l'ordre d'init des modules et fait booter Safari/WebKit tant que le polyfill est
1713
+ importé dans `main.ts`. */
1714
+ declare const Temporal: TemporalImpl;
1715
+
1380
1716
  /** Date civile (jour/mois/année), sans heure ni fuseau — alias de `Temporal.PlainDate`.
1381
1717
  À utiliser pour une date « pure » : naissance, échéance, jour d'un événement.
1382
1718
  *
@@ -1385,22 +1721,22 @@ declare abstract class KtBaseTemporalField<T extends {
1385
1721
  * import { type CalendarDate } from '@ktortu/aaa';
1386
1722
  * ```
1387
1723
  */
1388
- type CalendarDate = Temporal.PlainDate;
1724
+ type CalendarDate = Temporal$1.PlainDate;
1389
1725
  /** Heure « au mur » (heure/minute/seconde), sans date ni fuseau — alias de `Temporal.PlainTime`.
1390
1726
  À utiliser pour une heure isolée : heure d'ouverture, créneau de rendez-vous récurrent. */
1391
- type WallTime = Temporal.PlainTime;
1727
+ type WallTime = Temporal$1.PlainTime;
1392
1728
  /** Date + heure locale, sans fuseau — alias de `Temporal.PlainDateTime`.
1393
1729
  À utiliser quand date et heure comptent mais que le fuseau est implicite/non pertinent
1394
1730
  (heure « au mur » : ne représente pas un instant absolu). */
1395
- type LocalDateTime = Temporal.PlainDateTime;
1731
+ type LocalDateTime = Temporal$1.PlainDateTime;
1396
1732
  /** Instant absolu sur la ligne du temps, en UTC — alias de `Temporal.Instant`.
1397
1733
  À utiliser pour horodater un événement réel (création, mesure) indépendamment du fuseau
1398
1734
  d'affichage ; la conversion en heure locale se fait à la présentation (via `KtClock`). */
1399
- type Timestamp = Temporal.Instant;
1735
+ type Timestamp = Temporal$1.Instant;
1400
1736
  /** Instant + fuseau nommé (IANA) — alias de `Temporal.ZonedDateTime`.
1401
1737
  À utiliser quand le fuseau fait partie de la donnée (ex. « 14h00 à Paris ») et doit être
1402
1738
  conservé, contrairement à `Timestamp` qui ne porte pas de fuseau. */
1403
- type ZonedTimestamp = Temporal.ZonedDateTime;
1739
+ type ZonedTimestamp = Temporal$1.ZonedDateTime;
1404
1740
 
1405
1741
  /** Champ « date sans heure » : valeur = `Temporal.PlainDate`, input natif `type="date"`.
1406
1742
  *
@@ -1409,13 +1745,13 @@ type ZonedTimestamp = Temporal.ZonedDateTime;
1409
1745
  * <kt-date-field label="Date de naissance" [(value)]="birthDate" />
1410
1746
  * ```
1411
1747
  */
1412
- declare class KtDateField extends KtBaseTemporalField<Temporal.PlainDate> implements FormValueControl<Temporal.PlainDate | null> {
1748
+ declare class KtDateField extends KtBaseTemporalField<Temporal$1.PlainDate> implements FormValueControl<Temporal$1.PlainDate | null> {
1413
1749
  /** Valeur du champ : un `Temporal.PlainDate` (date civile sans heure ni fuseau).
1414
1750
  `null` = champ vide.
1415
1751
  @default null */
1416
- value: _angular_core.ModelSignal<Temporal.PlainDate | null>;
1417
- protected fromString(raw: string): Temporal.PlainDate;
1418
- protected serialize(value: Temporal.PlainDate): string;
1752
+ value: _angular_core.ModelSignal<Temporal$1.PlainDate | null>;
1753
+ protected fromString(raw: string): Temporal$1.PlainDate;
1754
+ protected serialize(value: Temporal$1.PlainDate): string;
1419
1755
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtDateField, never>;
1420
1756
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtDateField, "kt-date-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
1421
1757
  }
@@ -1427,13 +1763,13 @@ declare class KtDateField extends KtBaseTemporalField<Temporal.PlainDate> implem
1427
1763
  * <kt-time-field label="Heure de rendez-vous" [(value)]="appointmentTime" />
1428
1764
  * ```
1429
1765
  */
1430
- declare class KtTimeField extends KtBaseTemporalField<Temporal.PlainTime> implements FormValueControl<Temporal.PlainTime | null> {
1766
+ declare class KtTimeField extends KtBaseTimeTemporalField<Temporal$1.PlainTime> implements FormValueControl<Temporal$1.PlainTime | null> {
1431
1767
  /** Valeur du champ : un `Temporal.PlainTime` (heure « au mur », sans date ni fuseau).
1432
1768
  `null` = champ vide.
1433
1769
  @default null */
1434
- value: _angular_core.ModelSignal<Temporal.PlainTime | null>;
1435
- protected fromString(raw: string): Temporal.PlainTime;
1436
- protected serialize(value: Temporal.PlainTime): string;
1770
+ value: _angular_core.ModelSignal<Temporal$1.PlainTime | null>;
1771
+ protected fromString(raw: string): Temporal$1.PlainTime;
1772
+ protected serialize(value: Temporal$1.PlainTime): string;
1437
1773
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtTimeField, never>;
1438
1774
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtTimeField, "kt-time-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
1439
1775
  }
@@ -1446,13 +1782,13 @@ declare class KtTimeField extends KtBaseTemporalField<Temporal.PlainTime> implem
1446
1782
  * <kt-date-time-field label="Début de l'événement" [(value)]="startsAt" />
1447
1783
  * ```
1448
1784
  */
1449
- declare class KtDateTimeField extends KtBaseTemporalField<Temporal.PlainDateTime> implements FormValueControl<Temporal.PlainDateTime | null> {
1785
+ declare class KtDateTimeField extends KtBaseTimeTemporalField<Temporal$1.PlainDateTime> implements FormValueControl<Temporal$1.PlainDateTime | null> {
1450
1786
  /** Valeur du champ : un `Temporal.PlainDateTime` (date + heure « au mur », sans fuseau).
1451
1787
  `null` = champ vide.
1452
1788
  @default null */
1453
- value: _angular_core.ModelSignal<Temporal.PlainDateTime | null>;
1454
- protected fromString(raw: string): Temporal.PlainDateTime;
1455
- protected serialize(value: Temporal.PlainDateTime): string;
1789
+ value: _angular_core.ModelSignal<Temporal$1.PlainDateTime | null>;
1790
+ protected fromString(raw: string): Temporal$1.PlainDateTime;
1791
+ protected serialize(value: Temporal$1.PlainDateTime): string;
1456
1792
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtDateTimeField, never>;
1457
1793
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtDateTimeField, "kt-date-time-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
1458
1794
  }
@@ -1465,13 +1801,13 @@ declare class KtDateTimeField extends KtBaseTemporalField<Temporal.PlainDateTime
1465
1801
  * <kt-year-month-field label="Expiration" [(value)]="cardExpiry" />
1466
1802
  * ```
1467
1803
  */
1468
- declare class KtYearMonthField extends KtBaseTemporalField<Temporal.PlainYearMonth> implements FormValueControl<Temporal.PlainYearMonth | null> {
1804
+ declare class KtYearMonthField extends KtBaseTemporalField<Temporal$1.PlainYearMonth> implements FormValueControl<Temporal$1.PlainYearMonth | null> {
1469
1805
  /** Valeur du champ : un `Temporal.PlainYearMonth` (mois + année, sans jour ni fuseau).
1470
1806
  `null` = champ vide.
1471
1807
  @default null */
1472
- value: _angular_core.ModelSignal<Temporal.PlainYearMonth | null>;
1473
- protected fromString(raw: string): Temporal.PlainYearMonth;
1474
- protected serialize(value: Temporal.PlainYearMonth): string;
1808
+ value: _angular_core.ModelSignal<Temporal$1.PlainYearMonth | null>;
1809
+ protected fromString(raw: string): Temporal$1.PlainYearMonth;
1810
+ protected serialize(value: Temporal$1.PlainYearMonth): string;
1475
1811
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtYearMonthField, never>;
1476
1812
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtYearMonthField, "kt-year-month-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
1477
1813
  }
@@ -1490,20 +1826,20 @@ declare class KtYearMonthField extends KtBaseTemporalField<Temporal.PlainYearMon
1490
1826
  * <kt-instant-field label="Horodatage" [(value)]="recordedAt" />
1491
1827
  * ```
1492
1828
  */
1493
- declare class KtInstantField extends KtBaseTemporalField<Temporal.Instant> implements FormValueControl<Temporal.Instant | null> {
1829
+ declare class KtInstantField extends KtBaseTimeTemporalField<Temporal$1.Instant> implements FormValueControl<Temporal$1.Instant | null> {
1494
1830
  private readonly clock;
1495
1831
  /** Valeur du champ : un `Temporal.Instant` (instant absolu en UTC), saisi/affiché en heure
1496
1832
  locale via `KtClock`. `null` = champ vide.
1497
1833
  @default null */
1498
- value: _angular_core.ModelSignal<Temporal.Instant | null>;
1499
- protected fromString(raw: string): Temporal.Instant;
1500
- protected serialize(value: Temporal.Instant): string;
1834
+ value: _angular_core.ModelSignal<Temporal$1.Instant | null>;
1835
+ protected fromString(raw: string): Temporal$1.Instant;
1836
+ protected serialize(value: Temporal$1.Instant): string;
1501
1837
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtInstantField, never>;
1502
1838
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtInstantField, "kt-instant-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
1503
1839
  }
1504
1840
 
1505
1841
  /** Valeurs Temporal formatables pour l'affichage (toutes exposent `toLocaleString`). */
1506
- type FormattableTemporal = Temporal.PlainDate | Temporal.PlainTime | Temporal.PlainDateTime | Temporal.PlainYearMonth | Temporal.Instant | Temporal.ZonedDateTime;
1842
+ type FormattableTemporal = Temporal$1.PlainDate | Temporal$1.PlainTime | Temporal$1.PlainDateTime | Temporal$1.PlainYearMonth | Temporal$1.Instant | Temporal$1.ZonedDateTime;
1507
1843
  /** Formate une valeur Temporal pour l'affichage selon la locale active.
1508
1844
  `DatePipe` n'accepte pas Temporal (seulement `Date|string|number`) → pipe dédié, basé sur
1509
1845
  `toLocaleString` (interface `Intl.DateTimeFormat`). Cohérent avec la neutralité i18n de la lib
@@ -1524,6 +1860,13 @@ type FormattableTemporal = Temporal.PlainDate | Temporal.PlainTime | Temporal.Pl
1524
1860
  declare class KtTemporalDatePipe implements PipeTransform {
1525
1861
  private readonly locale;
1526
1862
  private readonly clock;
1863
+ /** Formate la valeur Temporal en chaîne localisée via `toLocaleString`.
1864
+ * @param value Valeur Temporal à formater (`Plain*`, `Instant` ou `ZonedDateTime`) ; `null`/`undefined` → chaîne vide.
1865
+ * @param options Options `Intl.DateTimeFormatOptions` transmises telles quelles. Styles globaux :
1866
+ * `dateStyle`/`timeStyle` (`'full' | 'long' | 'medium' | 'short'`). Champs fins :
1867
+ * `weekday`/`era`/`month` (`'long' | 'short' | 'narrow'`), `year`/`day`/`hour`/`minute`/`second`
1868
+ * (`'numeric' | '2-digit'`), `hour12`, `timeZoneName`, `timeZone`, etc. Omis → format par défaut de la locale.
1869
+ * @returns La chaîne formatée selon la locale active (`LOCALE_ID`), ou `''` si la valeur est absente. */
1527
1870
  transform(value: FormattableTemporal | null | undefined, options?: Intl.DateTimeFormatOptions): string;
1528
1871
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtTemporalDatePipe, never>;
1529
1872
  static ɵpipe: _angular_core.ɵɵPipeDeclaration<KtTemporalDatePipe, "temporalDate", true>;
@@ -1539,10 +1882,10 @@ declare class KtClock {
1539
1882
  timeZoneId(): string;
1540
1883
  /** Instant absolu courant, sur la ligne du temps (UTC), indépendant du fuseau.
1541
1884
  @returns L'instant présent en `Temporal.Instant`. */
1542
- now(): Temporal.Instant;
1885
+ now(): Temporal$1.Instant;
1543
1886
  /** Date civile du jour telle qu'observée dans le fuseau local (`timeZoneId()`).
1544
1887
  @returns Le jour courant en `Temporal.PlainDate`. */
1545
- today(): Temporal.PlainDate;
1888
+ today(): Temporal$1.PlainDate;
1546
1889
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtClock, never>;
1547
1890
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<KtClock>;
1548
1891
  }
@@ -1564,11 +1907,11 @@ declare class KtFixedClock extends KtClock {
1564
1907
  * });
1565
1908
  * ```
1566
1909
  */
1567
- constructor(fixedInstant: Temporal.Instant, zone: string);
1910
+ constructor(fixedInstant: Temporal$1.Instant, zone: string);
1568
1911
  timeZoneId(): string;
1569
- now(): Temporal.Instant;
1570
- today(): Temporal.PlainDate;
1912
+ now(): Temporal$1.Instant;
1913
+ today(): Temporal$1.PlainDate;
1571
1914
  }
1572
1915
 
1573
- export { KT_CHIPS_CONFIG, KT_FIELD, KT_FIELD_CONFIG, KT_SELECT_CONFIG, KtBaseTemporalField, 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, defaultKtFieldErrorMatcher };
1574
- export type { CalendarDate, KtChipItemContext, KtChipsConfig, KtFieldConfig, KtFieldError, KtFieldErrorMatcher, KtFieldErrorState, KtFieldParent, KtKeyish, KtMultiSelectChipContext, KtMultiSelectOptionContext, KtMultiSelectSelectionChange, KtMultiSelectTriggerContext, KtSelectConfigOptions, KtSelectOptionContext, KtSelectSelectionChange, KtSelectTriggerContext, KtSuggestion, KtTextFieldType, LocalDateTime, Timestamp, WallTime, ZonedTimestamp };
1916
+ 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, KtRadio, KtRadioGroup, KtSelect, KtSelectConfig, KtSelectOptionDef, KtSelectTriggerDef, KtSwitch, KtTemporalDatePipe, KtTextArea, KtTextField, KtTimeField, KtYearMonthField, Temporal, defaultKtFieldErrorMatcher, ktErrorParam, normalizeKtSuggestions, provideKtField };
1917
+ export type { CalendarDate, KtChipItemContext, KtChipsConfig, KtDatalistOption, KtErrorMessageFactory, KtFieldAppearance, KtFieldConfig, KtFieldError, KtFieldErrorMatcher, KtFieldErrorMessages, KtFieldErrorState, KtFieldParent, KtFloatLabel, KtKeyish, KtMultiSelectChipContext, KtMultiSelectOptionContext, KtMultiSelectSelectionChange, KtMultiSelectTriggerContext, KtResolvableError, KtSelectConfigOptions, KtSelectOptionContext, KtSelectSelectionChange, KtSelectTriggerContext, KtSuggestion, KtTextFieldType, KtTimePrecision, LocalDateTime, Timestamp, WallTime, ZonedTimestamp };