@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.
- package/README.md +27 -9
- package/cdk/styles/tabs.css +100 -21
- package/fesm2022/ktortu-aaa-button.mjs +18 -11
- package/fesm2022/ktortu-aaa-button.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-card.mjs +29 -4
- package/fesm2022/ktortu-aaa-card.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-cdk.mjs +59 -15
- package/fesm2022/ktortu-aaa-cdk.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-dialog.mjs +134 -24
- package/fesm2022/ktortu-aaa-dialog.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-forms.mjs +748 -294
- package/fesm2022/ktortu-aaa-forms.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-i18n.mjs +139 -0
- package/fesm2022/ktortu-aaa-i18n.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-menu.mjs +38 -13
- package/fesm2022/ktortu-aaa-menu.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-snackbar.mjs +465 -0
- package/fesm2022/ktortu-aaa-snackbar.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-tabs.mjs +319 -42
- package/fesm2022/ktortu-aaa-tabs.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-tooltip.mjs +3 -2
- package/fesm2022/ktortu-aaa-tooltip.mjs.map +1 -1
- package/fesm2022/ktortu-aaa.mjs +2 -0
- package/fesm2022/ktortu-aaa.mjs.map +1 -1
- package/forms/checkbox/checkbox-group.css +0 -8
- package/forms/chips/chip-list.css +5 -0
- package/forms/radio/radio-group.css +0 -8
- package/forms/styles/field-box.css +152 -2
- package/forms/styles/field-pending.css +46 -0
- package/forms/styles/select-panel.css +4 -0
- package/forms/styles/tokens.css +3 -0
- package/menu/menu.css +8 -4
- package/package.json +9 -1
- package/snackbar/snackbar-tokens.css +53 -0
- package/snackbar/snackbar.css +175 -0
- package/styles/forms.css +1 -0
- package/styles/snackbar.css +9 -0
- package/styles/styles.css +1 -0
- package/types/ktortu-aaa-button.d.ts +22 -8
- package/types/ktortu-aaa-card.d.ts +24 -4
- package/types/ktortu-aaa-cdk.d.ts +38 -0
- package/types/ktortu-aaa-dialog.d.ts +129 -31
- package/types/ktortu-aaa-forms.d.ts +503 -160
- package/types/ktortu-aaa-i18n.d.ts +77 -0
- package/types/ktortu-aaa-menu.d.ts +15 -8
- package/types/ktortu-aaa-snackbar.d.ts +275 -0
- package/types/ktortu-aaa-tabs.d.ts +130 -13
- package/types/ktortu-aaa-tooltip.d.ts +5 -0
- 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 {
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
85
|
-
/** Afficher toutes les erreurs au lieu de la première seule. */
|
|
86
|
-
readonly showAllErrors: _angular_core.
|
|
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
|
-
/**
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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 [
|
|
370
|
-
* <kt-checkbox [
|
|
371
|
-
* <kt-checkbox [
|
|
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.
|
|
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.
|
|
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
|
-
/**
|
|
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.
|
|
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
|
-
|
|
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 : `
|
|
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 [
|
|
449
|
-
* <kt-checkbox [
|
|
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 =
|
|
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
|
-
/**
|
|
458
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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 [
|
|
524
|
-
* <kt-radio [
|
|
525
|
-
* <kt-radio [
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
/**
|
|
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 [
|
|
593
|
-
* <kt-radio [
|
|
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).
|
|
600
|
-
|
|
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, { "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
954
|
-
|
|
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
|
|
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
|
-
/**
|
|
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`,
|
|
1342
|
-
|
|
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
|
-
/**
|
|
1366
|
-
|
|
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
|
|
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
|
|
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
|
|
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 };
|