@starterlib/ui 0.7.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENCES-TIERCES.md +236 -0
- package/README.md +163 -56
- package/assets/icones/catalogue.json +3296 -0
- package/assets/icones/sprite.svg +235 -35
- package/fesm2022/starterlib-ui-arbre.mjs +475 -0
- package/fesm2022/starterlib-ui-arbre.mjs.map +1 -0
- package/fesm2022/starterlib-ui-donnees.mjs +3561 -0
- package/fesm2022/starterlib-ui-donnees.mjs.map +1 -0
- package/fesm2022/starterlib-ui-formulaires.mjs +3186 -442
- package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
- package/fesm2022/starterlib-ui-libelles-en.mjs +383 -0
- package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -0
- package/fesm2022/starterlib-ui-listes.mjs +5367 -0
- package/fesm2022/starterlib-ui-listes.mjs.map +1 -0
- package/fesm2022/starterlib-ui-messagerie.mjs +737 -0
- package/fesm2022/starterlib-ui-messagerie.mjs.map +1 -0
- package/fesm2022/starterlib-ui-navigation.mjs +509 -0
- package/fesm2022/starterlib-ui-navigation.mjs.map +1 -0
- package/fesm2022/starterlib-ui-onglets.mjs +371 -0
- package/fesm2022/starterlib-ui-onglets.mjs.map +1 -0
- package/fesm2022/starterlib-ui-parcours.mjs +2449 -0
- package/fesm2022/starterlib-ui-parcours.mjs.map +1 -0
- package/fesm2022/starterlib-ui-qr.mjs +907 -0
- package/fesm2022/starterlib-ui-qr.mjs.map +1 -0
- package/fesm2022/starterlib-ui-saisie.mjs +8609 -0
- package/fesm2022/starterlib-ui-saisie.mjs.map +1 -0
- package/fesm2022/starterlib-ui-selection.mjs +1341 -0
- package/fesm2022/starterlib-ui-selection.mjs.map +1 -0
- package/fesm2022/starterlib-ui-sens.mjs +59 -0
- package/fesm2022/starterlib-ui-sens.mjs.map +1 -0
- package/fesm2022/starterlib-ui-surfaces.mjs +5140 -1387
- package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
- package/fesm2022/starterlib-ui.mjs +10729 -5689
- package/fesm2022/starterlib-ui.mjs.map +1 -1
- package/package.json +58 -17
- package/styles/amorce.css +69 -0
- package/styles/couches.css +178 -0
- package/types/starterlib-ui-arbre.d.ts +225 -0
- package/types/starterlib-ui-donnees.d.ts +1489 -0
- package/types/starterlib-ui-formulaires.d.ts +1174 -138
- package/types/starterlib-ui-libelles-en.d.ts +5 -0
- package/types/starterlib-ui-listes.d.ts +2487 -0
- package/types/starterlib-ui-messagerie.d.ts +317 -0
- package/types/starterlib-ui-navigation.d.ts +242 -0
- package/types/starterlib-ui-onglets.d.ts +212 -0
- package/types/starterlib-ui-parcours.d.ts +916 -0
- package/types/starterlib-ui-qr.d.ts +105 -0
- package/types/starterlib-ui-saisie.d.ts +3806 -0
- package/types/starterlib-ui-selection.d.ts +488 -0
- package/types/starterlib-ui-sens.d.ts +44 -0
- package/types/starterlib-ui-surfaces.d.ts +1899 -510
- package/types/starterlib-ui.d.ts +4731 -2678
- package/fesm2022/starterlib-ui-interactions.mjs +0 -598
- package/fesm2022/starterlib-ui-interactions.mjs.map +0 -1
- package/types/starterlib-ui-interactions.d.ts +0 -316
|
@@ -0,0 +1,916 @@
|
|
|
1
|
+
import { ApiError, EtatDeCeremonie, LectureDeCeremonie, MoyenDeCeremonie, TonSemantique } from "@starterlib/util";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import { InjectionToken, Signal } from "@angular/core";
|
|
4
|
+
import { AnnonceLocale, DispositionDActions, EtapeDeParcours, Icone, NiveauDeTitre, OrientationDeParcours } from "@starterlib/ui";
|
|
5
|
+
import { ErreurAffichable } from "@starterlib/ui/saisie";
|
|
6
|
+
/**
|
|
7
|
+
* Un refus du serveur, en banniere, au-dessus de ce qu'il refuse (lot 261) : un virement (plafond,
|
|
8
|
+
* solde), une demande KYC, une connexion. Le patron que chaque formulaire recopiait (`id-refus`).
|
|
9
|
+
*
|
|
10
|
+
* ```html
|
|
11
|
+
* @if (refus(); as erreur) {
|
|
12
|
+
* <st-refusal
|
|
13
|
+
* [erreur]="erreur"
|
|
14
|
+
* [message]="t('erreurs.' + erreur.code, erreur.arguments)"
|
|
15
|
+
* [codeInconnu]="!codesConnus.has(erreur.code)"
|
|
16
|
+
* [rejeuEnCours]="envoiEnCours()"
|
|
17
|
+
* (rejeu)="envoyer()"
|
|
18
|
+
* (rechargement)="recharger()"
|
|
19
|
+
* />
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* - Le MESSAGE est traduit par l'application depuis le CODE stable, jamais la prose du serveur.
|
|
24
|
+
* - Le ton suit la table de `@starterlib/util` (`varianteDErreur`) : un refus (400, 403, 404...) est
|
|
25
|
+
* un `danger` ; ce qui se regle sans rien changer (hors ligne, 429, panne passagere, conflit de
|
|
26
|
+
* version) est un `avertissement`.
|
|
27
|
+
* - Un 429 affiche son decompte (`Retry-After`) ; « Reessayer » reste focalisable et indisponible
|
|
28
|
+
* jusqu'a sa fin, la phrase du decompte pour raison (D39), puis `(attenteTerminee)`.
|
|
29
|
+
* - Un conflit de version (409) offre « Recharger » (`(rechargement)`), jamais « Reessayer » : la
|
|
30
|
+
* meme requete echouerait encore.
|
|
31
|
+
* - `rejeuEnCours` et `rechargementEnCours` : l'application a relance la requete. Le bouton attend
|
|
32
|
+
* (`aria-busy`, indicateur differe) et avale les clics, comme le rejeu de `st-error` : un second
|
|
33
|
+
* clic ne repart pas (audit UI du 2026-09-27, D-7).
|
|
34
|
+
* - `codeInconnu` : l'application n'a pas de message pour ce code ; le code et la trace s'affichent,
|
|
35
|
+
* copiables, pour le support.
|
|
36
|
+
* - Le focus va a la banniere a chaque NOUVEAU refus (une fois) : au clavier, l'envoi qui a echoue
|
|
37
|
+
* se sait. Jamais un toast pour une erreur.
|
|
38
|
+
*
|
|
39
|
+
* ⚠️ **C'est le focus qui annonce, et lui seul** (comme `st-error-summary`). Le composant fournit
|
|
40
|
+
* `REGION_VIVANTE_PARENTE` a sa banniere, qui ne pose alors ni `alert` ni `status` : region vivante
|
|
41
|
+
* ET cible du focus, elle etait lue deux fois, a son apparition puis a l'arrivee du focus (audit
|
|
42
|
+
* UI du 2026-09-27, D-18). En `viewProviders` : les actions que l'application projette gardent leur
|
|
43
|
+
* propre comportement.
|
|
44
|
+
*/
|
|
45
|
+
export declare class StRefusal {
|
|
46
|
+
private readonly injecteur;
|
|
47
|
+
protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
|
|
48
|
+
readonly erreur: import("@angular/core").InputSignal<ApiError>;
|
|
49
|
+
/** Deja traduit par l'application, depuis le code. */
|
|
50
|
+
readonly message: import("@angular/core").InputSignal<string>;
|
|
51
|
+
/** `null` : « Hors connexion » hors ligne, sinon le message seul. */
|
|
52
|
+
readonly titre: import("@angular/core").InputSignal<string | null>;
|
|
53
|
+
/** L'application n'a pas de message pour ce code : le code et la trace, pour le support. */
|
|
54
|
+
readonly codeInconnu: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
55
|
+
/** Le rejeu est parti : son bouton attend et avale les clics. */
|
|
56
|
+
readonly rejeuEnCours: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
57
|
+
/** Le rechargement est parti : son bouton attend et avale les clics. */
|
|
58
|
+
readonly rechargementEnCours: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
59
|
+
readonly rejeu: import("@angular/core").OutputEmitterRef<void>;
|
|
60
|
+
readonly rechargement: import("@angular/core").OutputEmitterRef<void>;
|
|
61
|
+
/** L'attente imposee par un 429 est finie. */
|
|
62
|
+
readonly attenteTerminee: import("@angular/core").OutputEmitterRef<void>;
|
|
63
|
+
private readonly banniere;
|
|
64
|
+
private readonly decompte;
|
|
65
|
+
protected readonly variante: import("@angular/core").Signal<import("@starterlib/util").VarianteDErreur>;
|
|
66
|
+
private readonly rejouableSelonLaTable;
|
|
67
|
+
protected readonly ton: import("@angular/core").Signal<"avertissement" | "danger">;
|
|
68
|
+
protected readonly titreLu: import("@angular/core").Signal<string | null>;
|
|
69
|
+
/** Les secondes d'un 429, quand le serveur les donne. */
|
|
70
|
+
protected readonly attente: import("@angular/core").Signal<number | null>;
|
|
71
|
+
private readonly attenteFinie;
|
|
72
|
+
/** « Reessayer » : un 429 sans attente connue ne le propose pas (on ne sait pas quand). */
|
|
73
|
+
protected readonly rejouable: import("@angular/core").Signal<boolean>;
|
|
74
|
+
protected readonly enAttente: import("@angular/core").Signal<boolean>;
|
|
75
|
+
protected readonly raisonDuRejeu: import("@angular/core").Signal<string | null>;
|
|
76
|
+
constructor();
|
|
77
|
+
protected finDeLAttente(): void;
|
|
78
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StRefusal, never>;
|
|
79
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StRefusal, "st-refusal", never, {
|
|
80
|
+
"erreur": {
|
|
81
|
+
"alias": "erreur";
|
|
82
|
+
"required": true;
|
|
83
|
+
"isSignal": true;
|
|
84
|
+
};
|
|
85
|
+
"message": {
|
|
86
|
+
"alias": "message";
|
|
87
|
+
"required": true;
|
|
88
|
+
"isSignal": true;
|
|
89
|
+
};
|
|
90
|
+
"titre": {
|
|
91
|
+
"alias": "titre";
|
|
92
|
+
"required": false;
|
|
93
|
+
"isSignal": true;
|
|
94
|
+
};
|
|
95
|
+
"codeInconnu": {
|
|
96
|
+
"alias": "codeInconnu";
|
|
97
|
+
"required": false;
|
|
98
|
+
"isSignal": true;
|
|
99
|
+
};
|
|
100
|
+
"rejeuEnCours": {
|
|
101
|
+
"alias": "rejeuEnCours";
|
|
102
|
+
"required": false;
|
|
103
|
+
"isSignal": true;
|
|
104
|
+
};
|
|
105
|
+
"rechargementEnCours": {
|
|
106
|
+
"alias": "rechargementEnCours";
|
|
107
|
+
"required": false;
|
|
108
|
+
"isSignal": true;
|
|
109
|
+
};
|
|
110
|
+
}, {
|
|
111
|
+
"rejeu": "rejeu";
|
|
112
|
+
"rechargement": "rechargement";
|
|
113
|
+
"attenteTerminee": "attenteTerminee";
|
|
114
|
+
}, never, ["[actions]"], true, never>;
|
|
115
|
+
}
|
|
116
|
+
/** Comment s'est fini le parcours. `partiel` : une part executee, une part refusee. */
|
|
117
|
+
export type IssueDeParcours = 'succes' | 'attente' | 'echec' | 'partiel';
|
|
118
|
+
/** `page` : la fin d'un parcours, titre de page ; `compacte` : une issue dans une carte. */
|
|
119
|
+
export type DispositionDIssue = 'page' | 'compacte';
|
|
120
|
+
/**
|
|
121
|
+
* L'issue d'un parcours (lot 261) : virement envoye, dossier depose, demande en attente d'un second
|
|
122
|
+
* signataire, virement refuse. `st-empty` et `st-error` disent l'etat d'un BLOC ; celle-ci dit la
|
|
123
|
+
* fin d'un PARCOURS : son titre, sa reference, ce qui suit et les actions.
|
|
124
|
+
*
|
|
125
|
+
* ```html
|
|
126
|
+
* <st-outcome
|
|
127
|
+
* issue="succes"
|
|
128
|
+
* titre="Virement envoye"
|
|
129
|
+
* precision="Il sera execute le 28 septembre."
|
|
130
|
+
* [reference]="accuse.reference"
|
|
131
|
+
* [horodatage]="accuse.recuLe"
|
|
132
|
+
* >
|
|
133
|
+
* <st-amount-summary recapitulatif legende="Recapitulatif" legendeMasquee [lignes]="lignes" />
|
|
134
|
+
* <a actions stLink routerLink="/operations">Voir mes operations</a>
|
|
135
|
+
* <button actions stButton variante="primaire">Faire un autre virement</button>
|
|
136
|
+
* </st-outcome>
|
|
137
|
+
* ```
|
|
138
|
+
*
|
|
139
|
+
* - L'issue se dit par la FORME de l'icone et par un mot lu avant le titre (« Succes : »,
|
|
140
|
+
* « Erreur : »), jamais par la couleur seule.
|
|
141
|
+
* - En `page`, le titre est le `h1` que vise `StNavigation` a l'arrivee ; jamais `role="alert"`,
|
|
142
|
+
* meme en echec : c'est une page, pas une mutation.
|
|
143
|
+
* - Ordre du document : issue, precision, reference et horodatage, recapitulatif (`[recapitulatif]`),
|
|
144
|
+
* suite (`[suite]`, « Et ensuite ? »), actions (`[actions]`, la principale en dernier).
|
|
145
|
+
* - En `compacte` (planche 8, 8.2) : l'icone et le titre en tete, une etiquette projetee
|
|
146
|
+
* (`[etiquette]`) a la fin de la ligne, puis l'horodatage et un medaillon projete
|
|
147
|
+
* (`[medaillon]`).
|
|
148
|
+
*/
|
|
149
|
+
export declare class StOutcome {
|
|
150
|
+
private readonly libelles;
|
|
151
|
+
readonly issue: import("@angular/core").InputSignal<IssueDeParcours>;
|
|
152
|
+
/** Deja traduit. */
|
|
153
|
+
readonly titre: import("@angular/core").InputSignal<string>;
|
|
154
|
+
readonly precision: import("@angular/core").InputSignal<string | null>;
|
|
155
|
+
/** La reference de l'operation, copiable ; `null` : aucune. */
|
|
156
|
+
readonly reference: import("@angular/core").InputSignal<string | null>;
|
|
157
|
+
/** `null` : « Reference de l'operation ». */
|
|
158
|
+
readonly etiquetteDeReference: import("@angular/core").InputSignal<string | null>;
|
|
159
|
+
/** Un instant ISO (reception, execution, scellement), dit en date et heure. */
|
|
160
|
+
readonly horodatage: import("@angular/core").InputSignal<string | null>;
|
|
161
|
+
/** Ce que l'horodatage date (« Horodatage de scellement ») ; `null` : l'instant seul. */
|
|
162
|
+
readonly etiquetteDHorodatage: import("@angular/core").InputSignal<string | null>;
|
|
163
|
+
/** `1` en page ; le niveau que la page donne a une issue compacte. */
|
|
164
|
+
readonly niveauDuTitre: import("@angular/core").InputSignal<NiveauDeTitre>;
|
|
165
|
+
readonly disposition: import("@angular/core").InputSignal<DispositionDIssue>;
|
|
166
|
+
protected readonly ton: import("@angular/core").Signal<TonSemantique>;
|
|
167
|
+
protected readonly icone: import("@angular/core").Signal<"horloge" | "badge-coche" | "bouclier-coche" | "cercle-alerte" | "cercle-coche" | "cercle-croix" | "cercle-info" | "cercle-question" | "cloche" | "epingle" | "etoile" | "grille" | "marque-page" | "octogone-alerte" | "triangle-alerte">;
|
|
168
|
+
/** Le mot de l'issue, lu avant le titre. */
|
|
169
|
+
protected readonly mot: import("@angular/core").Signal<string>;
|
|
170
|
+
protected readonly etiquetteDeReferenceLue: import("@angular/core").Signal<string>;
|
|
171
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StOutcome, never>;
|
|
172
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StOutcome, "st-outcome", never, {
|
|
173
|
+
"issue": {
|
|
174
|
+
"alias": "issue";
|
|
175
|
+
"required": true;
|
|
176
|
+
"isSignal": true;
|
|
177
|
+
};
|
|
178
|
+
"titre": {
|
|
179
|
+
"alias": "titre";
|
|
180
|
+
"required": true;
|
|
181
|
+
"isSignal": true;
|
|
182
|
+
};
|
|
183
|
+
"precision": {
|
|
184
|
+
"alias": "precision";
|
|
185
|
+
"required": false;
|
|
186
|
+
"isSignal": true;
|
|
187
|
+
};
|
|
188
|
+
"reference": {
|
|
189
|
+
"alias": "reference";
|
|
190
|
+
"required": false;
|
|
191
|
+
"isSignal": true;
|
|
192
|
+
};
|
|
193
|
+
"etiquetteDeReference": {
|
|
194
|
+
"alias": "etiquetteDeReference";
|
|
195
|
+
"required": false;
|
|
196
|
+
"isSignal": true;
|
|
197
|
+
};
|
|
198
|
+
"horodatage": {
|
|
199
|
+
"alias": "horodatage";
|
|
200
|
+
"required": false;
|
|
201
|
+
"isSignal": true;
|
|
202
|
+
};
|
|
203
|
+
"etiquetteDHorodatage": {
|
|
204
|
+
"alias": "etiquetteDHorodatage";
|
|
205
|
+
"required": false;
|
|
206
|
+
"isSignal": true;
|
|
207
|
+
};
|
|
208
|
+
"niveauDuTitre": {
|
|
209
|
+
"alias": "niveauDuTitre";
|
|
210
|
+
"required": false;
|
|
211
|
+
"isSignal": true;
|
|
212
|
+
};
|
|
213
|
+
"disposition": {
|
|
214
|
+
"alias": "disposition";
|
|
215
|
+
"required": false;
|
|
216
|
+
"isSignal": true;
|
|
217
|
+
};
|
|
218
|
+
}, {}, never, ["[etiquette]", "[medaillon]", "[recapitulatif]", "[suite]", "[actions]"], true, never>;
|
|
219
|
+
}
|
|
220
|
+
/** L'etat d'une tache, tel que le serveur le garde. */
|
|
221
|
+
export type StatutDeTache = 'a-faire' | 'en-cours' | 'terminee' | 'refusee' | 'bloquee';
|
|
222
|
+
/** Une tache d'un dossier. Les textes sont deja traduits. */
|
|
223
|
+
export interface TacheDeParcours {
|
|
224
|
+
readonly cle: string;
|
|
225
|
+
readonly titre: string;
|
|
226
|
+
/** Sous le titre, en discret : ce que la tache demande, un delai. */
|
|
227
|
+
readonly precision?: string;
|
|
228
|
+
/** Sa route (`routerLink`) ; absente, un bouton emet `ouverture`. */
|
|
229
|
+
readonly lien?: string | readonly unknown[];
|
|
230
|
+
readonly statut: StatutDeTache;
|
|
231
|
+
/** Le mot du statut (« Termine », « A faire ») : l'application le traduit. */
|
|
232
|
+
readonly libelleDuStatut: string;
|
|
233
|
+
/** Pourquoi une tache `bloquee` ne peut pas commencer : elle le dit, au lieu d'un lien eteint. */
|
|
234
|
+
readonly raison?: string;
|
|
235
|
+
}
|
|
236
|
+
/** Un groupe de taches sous son titre (« Identite », « Justificatifs »). */
|
|
237
|
+
export interface SectionDeTaches {
|
|
238
|
+
readonly titre: string;
|
|
239
|
+
readonly cles: readonly string[];
|
|
240
|
+
}
|
|
241
|
+
interface TacheLue extends TacheDeParcours {
|
|
242
|
+
readonly ton: TonSemantique;
|
|
243
|
+
readonly icone: Icone;
|
|
244
|
+
readonly idDuStatut: string;
|
|
245
|
+
readonly idDeLaPrecision: string | null;
|
|
246
|
+
readonly decritPar: string;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* La liste des taches d'un dossier (lot 262) : ouverture de compte, KYC, conformite d'un dossier.
|
|
250
|
+
* Chaque tache se reprend dans l'ordre que l'on veut ; son statut vient du serveur.
|
|
251
|
+
*
|
|
252
|
+
* ```html
|
|
253
|
+
* <st-task-list etiquette="Votre dossier" [taches]="taches" [sections]="sections" />
|
|
254
|
+
* ```
|
|
255
|
+
*
|
|
256
|
+
* - Une liste NATIVE (« 5 elements »), sous des titres de section si on les donne.
|
|
257
|
+
* - Chaque tache est un LIEN nomme par son titre ; son statut (`st-status-pill`, icone et mot) et
|
|
258
|
+
* sa precision se lisent ensuite, par `aria-describedby`. Le lien couvre la ligne : 44 px.
|
|
259
|
+
* - Une tache `bloquee` n'est PAS un lien (pas meme un lien eteint) : un texte, et sa raison.
|
|
260
|
+
* - Le resume (« 2 taches sur 5 terminees ») n'est pas une region vivante.
|
|
261
|
+
*/
|
|
262
|
+
export declare class StTaskList {
|
|
263
|
+
private readonly libelles;
|
|
264
|
+
private readonly identifiants;
|
|
265
|
+
readonly taches: import("@angular/core").InputSignal<readonly TacheDeParcours[]>;
|
|
266
|
+
/** Le nom de la liste (sans sections) : « Votre dossier ». */
|
|
267
|
+
readonly etiquette: import("@angular/core").InputSignal<string>;
|
|
268
|
+
/** `null` : une seule liste. */
|
|
269
|
+
readonly sections: import("@angular/core").InputSignal<readonly SectionDeTaches[] | null>;
|
|
270
|
+
/** Le niveau des titres de section. */
|
|
271
|
+
readonly niveauDuTitre: import("@angular/core").InputSignal<NiveauDeTitre>;
|
|
272
|
+
/** Le resume « 2 taches sur 5 terminees » en tete. */
|
|
273
|
+
readonly resume: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
274
|
+
/** Une tache sans route : la page l'ouvre (dialogue, action). */
|
|
275
|
+
readonly ouverture: import("@angular/core").OutputEmitterRef<string>;
|
|
276
|
+
private readonly prefixe;
|
|
277
|
+
protected readonly lues: import("@angular/core").Signal<readonly TacheLue[]>;
|
|
278
|
+
protected readonly groupes: import("@angular/core").Signal<{
|
|
279
|
+
titre: string;
|
|
280
|
+
taches: TacheLue[];
|
|
281
|
+
}[] | null>;
|
|
282
|
+
protected readonly texteDuResume: import("@angular/core").Signal<string>;
|
|
283
|
+
protected readonly idDuTitre: (indice: number) => string;
|
|
284
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StTaskList, never>;
|
|
285
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StTaskList, "st-task-list", never, {
|
|
286
|
+
"taches": {
|
|
287
|
+
"alias": "taches";
|
|
288
|
+
"required": true;
|
|
289
|
+
"isSignal": true;
|
|
290
|
+
};
|
|
291
|
+
"etiquette": {
|
|
292
|
+
"alias": "etiquette";
|
|
293
|
+
"required": true;
|
|
294
|
+
"isSignal": true;
|
|
295
|
+
};
|
|
296
|
+
"sections": {
|
|
297
|
+
"alias": "sections";
|
|
298
|
+
"required": false;
|
|
299
|
+
"isSignal": true;
|
|
300
|
+
};
|
|
301
|
+
"niveauDuTitre": {
|
|
302
|
+
"alias": "niveauDuTitre";
|
|
303
|
+
"required": false;
|
|
304
|
+
"isSignal": true;
|
|
305
|
+
};
|
|
306
|
+
"resume": {
|
|
307
|
+
"alias": "resume";
|
|
308
|
+
"required": false;
|
|
309
|
+
"isSignal": true;
|
|
310
|
+
};
|
|
311
|
+
}, {
|
|
312
|
+
"ouverture": "ouverture";
|
|
313
|
+
}, never, never, true, never>;
|
|
314
|
+
}
|
|
315
|
+
/** Ce qu'un `st-wizard` dit a l'etape qu'il projette : ou l'on en est, et le retour. */
|
|
316
|
+
interface AssistantDeParcours {
|
|
317
|
+
/** L'etape en cours, a partir de 1. */
|
|
318
|
+
readonly numero: Signal<number>;
|
|
319
|
+
readonly total: Signal<number>;
|
|
320
|
+
/** Celle du `st-stepper` : horizontal, il se resume sous `md` en « Etape 2 sur 3 : Montant ». */
|
|
321
|
+
readonly orientation: Signal<OrientationDeParcours>;
|
|
322
|
+
/** La route de l'etape precedente ; `null` : un bouton, qui demande le retour. */
|
|
323
|
+
readonly retourVers: Signal<string | readonly unknown[] | null>;
|
|
324
|
+
/** Un retour existe : une route, ou une etape precedente. */
|
|
325
|
+
readonly retourPossible: Signal<boolean>;
|
|
326
|
+
demanderLeRetour(): void;
|
|
327
|
+
}
|
|
328
|
+
declare const ST_ASSISTANT: InjectionToken<AssistantDeParcours>;
|
|
329
|
+
/**
|
|
330
|
+
* Un parcours par etapes (lot 262) : virement en trois etapes, ouverture de compte, enrolement
|
|
331
|
+
* d'un second facteur. Il rend le `st-stepper` (ou l'on en est) et projette l'etape en cours, un
|
|
332
|
+
* `st-wizard-step`.
|
|
333
|
+
*
|
|
334
|
+
* ```html
|
|
335
|
+
* <st-wizard libelle="Virement" [etapes]="etapes" [etape]="1" [retourVers]="['..', 'beneficiaire']">
|
|
336
|
+
* <form [stForm]="montant" [envoyerAvec]="continuer">
|
|
337
|
+
* <st-wizard-step titre="Montant">
|
|
338
|
+
* <st-amount-field libelle="Montant" [formField]="montant.valeur" />
|
|
339
|
+
* </st-wizard-step>
|
|
340
|
+
* </form>
|
|
341
|
+
* </st-wizard>
|
|
342
|
+
* ```
|
|
343
|
+
*
|
|
344
|
+
* ⚠️ **Les etapes restent des ROUTES de l'application** : le composant ne navigue pas (aucun
|
|
345
|
+
* `Router` injecte). La route de chaque etape la rend, et `StNavigation` pose le focus sur son
|
|
346
|
+
* `h1` a l'arrivee. `retourVers` : la route de l'etape precedente ; sans elle, « Retour » est un
|
|
347
|
+
* bouton qui emet `(retour)`, et l'application decide.
|
|
348
|
+
*
|
|
349
|
+
* ⚠️ **La saisie survit au retour** : elle est detenue par l'application, le socle ne detruit
|
|
350
|
+
* rien. La garde `formulaireNonEnregistre` (`@starterlib/core`) sur la route du parcours est un
|
|
351
|
+
* PREALABLE : quitter le parcours en cours de saisie se confirme (A0811).
|
|
352
|
+
*/
|
|
353
|
+
export declare class StWizard implements AssistantDeParcours {
|
|
354
|
+
readonly etapes: import("@angular/core").InputSignal<readonly EtapeDeParcours[]>;
|
|
355
|
+
/** L'indice de l'etape en cours, a partir de zero (celui de `st-stepper`). */
|
|
356
|
+
readonly etape: import("@angular/core").InputSignal<number>;
|
|
357
|
+
/** Le nom visible du parcours (« Virement »). */
|
|
358
|
+
readonly libelle: import("@angular/core").InputSignal<string | null>;
|
|
359
|
+
/** Le nom de la liste des etapes, jamais affiche ; `null` : le libelle. */
|
|
360
|
+
readonly etiquette: import("@angular/core").InputSignal<string | null>;
|
|
361
|
+
readonly orientation: import("@angular/core").InputSignal<OrientationDeParcours>;
|
|
362
|
+
/** La route de l'etape precedente ; `null` : « Retour » emet `(retour)`. */
|
|
363
|
+
readonly retourVers: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
|
|
364
|
+
readonly retour: import("@angular/core").OutputEmitterRef<void>;
|
|
365
|
+
readonly total: import("@angular/core").Signal<number>;
|
|
366
|
+
readonly numero: import("@angular/core").Signal<number>;
|
|
367
|
+
readonly retourPossible: import("@angular/core").Signal<boolean>;
|
|
368
|
+
demanderLeRetour(): void;
|
|
369
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StWizard, never>;
|
|
370
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StWizard, "st-wizard", never, {
|
|
371
|
+
"etapes": {
|
|
372
|
+
"alias": "etapes";
|
|
373
|
+
"required": true;
|
|
374
|
+
"isSignal": true;
|
|
375
|
+
};
|
|
376
|
+
"etape": {
|
|
377
|
+
"alias": "etape";
|
|
378
|
+
"required": true;
|
|
379
|
+
"isSignal": true;
|
|
380
|
+
};
|
|
381
|
+
"libelle": {
|
|
382
|
+
"alias": "libelle";
|
|
383
|
+
"required": false;
|
|
384
|
+
"isSignal": true;
|
|
385
|
+
};
|
|
386
|
+
"etiquette": {
|
|
387
|
+
"alias": "etiquette";
|
|
388
|
+
"required": false;
|
|
389
|
+
"isSignal": true;
|
|
390
|
+
};
|
|
391
|
+
"orientation": {
|
|
392
|
+
"alias": "orientation";
|
|
393
|
+
"required": false;
|
|
394
|
+
"isSignal": true;
|
|
395
|
+
};
|
|
396
|
+
"retourVers": {
|
|
397
|
+
"alias": "retourVers";
|
|
398
|
+
"required": false;
|
|
399
|
+
"isSignal": true;
|
|
400
|
+
};
|
|
401
|
+
}, {
|
|
402
|
+
"retour": "retour";
|
|
403
|
+
}, never, ["*"], true, never>;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Une etape d'un `st-wizard` (lot 262) : son titre, son contenu, ses actions.
|
|
407
|
+
*
|
|
408
|
+
* ```html
|
|
409
|
+
* <st-wizard-step titre="Verification" derniere
|
|
410
|
+
* avertissement="Une fois confirme, le virement ne pourra plus etre annule.">
|
|
411
|
+
* <st-review-list ... />
|
|
412
|
+
* </st-wizard-step>
|
|
413
|
+
* ```
|
|
414
|
+
*
|
|
415
|
+
* - Le titre est le `h1` de la page : « Etape 2 sur 3 : Montant » se LIT (le compte avant le
|
|
416
|
+
* nom), « Etape 2 sur 3 » se voit en surtitre au-dessus de « Montant ».
|
|
417
|
+
* - Les actions (`st-form-actions`) : « Retour » d'abord dans l'ordre du document, puis
|
|
418
|
+
* « Continuer », l'action principale, en `submit` : l'etape vit dans le formulaire de la page.
|
|
419
|
+
* - ⚠️ La derniere etape dit « Confirmer », jamais « Continuer », et son `avertissement` dit ce qui
|
|
420
|
+
* ne pourra plus etre annule (WCAG 3.3.4) ; son absence est signalee en developpement, comme une
|
|
421
|
+
* seconde action principale projetee. L'avertissement DECRIT « Confirmer » (`aria-describedby`) :
|
|
422
|
+
* dit avant le bouton dans l'ordre du document, il etait saute par qui tabule droit dessus (audit
|
|
423
|
+
* UI du 2026-09-27, D-33).
|
|
424
|
+
*/
|
|
425
|
+
export declare class StWizardStep {
|
|
426
|
+
private readonly assistant;
|
|
427
|
+
private readonly element;
|
|
428
|
+
protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
|
|
429
|
+
readonly titre: import("@angular/core").InputSignal<string>;
|
|
430
|
+
/** `1` : l'etape est la page ; un autre niveau pour une etape montree dans une page. */
|
|
431
|
+
readonly niveauDuTitre: import("@angular/core").InputSignal<NiveauDeTitre>;
|
|
432
|
+
/** La derniere etape : « Confirmer », et l'avertissement d'irrevocabilite. */
|
|
433
|
+
readonly derniere: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
434
|
+
/** Ce qui ne pourra plus etre annule, dit avant « Confirmer ». */
|
|
435
|
+
readonly avertissement: import("@angular/core").InputSignal<string | null>;
|
|
436
|
+
/** `null` : « Continuer ». */
|
|
437
|
+
readonly libelleContinuer: import("@angular/core").InputSignal<string | null>;
|
|
438
|
+
readonly chargement: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
439
|
+
readonly indisponible: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
440
|
+
/** `pied` : une rangee a la fin de l'etape ; `collee` : la barre qui suit le defilement. */
|
|
441
|
+
readonly dispositionDesActions: import("@angular/core").InputSignal<DispositionDActions>;
|
|
442
|
+
protected readonly titreLu: import("@angular/core").Signal<string>;
|
|
443
|
+
protected readonly compte: import("@angular/core").Signal<string | null>;
|
|
444
|
+
protected readonly retourVers: import("@angular/core").Signal<string | readonly unknown[] | null>;
|
|
445
|
+
protected readonly orientation: import("@angular/core").Signal<import("@starterlib/ui").OrientationDeParcours | null>;
|
|
446
|
+
protected readonly retourPossible: import("@angular/core").Signal<boolean>;
|
|
447
|
+
protected readonly libelleDeLAction: import("@angular/core").Signal<string>;
|
|
448
|
+
/** L'avertissement d'irrevocabilite est-il montre ? Il decrit alors « Confirmer » (D-33). */
|
|
449
|
+
protected readonly avecAvertissement: import("@angular/core").Signal<boolean>;
|
|
450
|
+
protected readonly idDeLAvertissement: string;
|
|
451
|
+
constructor();
|
|
452
|
+
protected retourner(): void;
|
|
453
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StWizardStep, never>;
|
|
454
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StWizardStep, "st-wizard-step", never, {
|
|
455
|
+
"titre": {
|
|
456
|
+
"alias": "titre";
|
|
457
|
+
"required": true;
|
|
458
|
+
"isSignal": true;
|
|
459
|
+
};
|
|
460
|
+
"niveauDuTitre": {
|
|
461
|
+
"alias": "niveauDuTitre";
|
|
462
|
+
"required": false;
|
|
463
|
+
"isSignal": true;
|
|
464
|
+
};
|
|
465
|
+
"derniere": {
|
|
466
|
+
"alias": "derniere";
|
|
467
|
+
"required": false;
|
|
468
|
+
"isSignal": true;
|
|
469
|
+
};
|
|
470
|
+
"avertissement": {
|
|
471
|
+
"alias": "avertissement";
|
|
472
|
+
"required": false;
|
|
473
|
+
"isSignal": true;
|
|
474
|
+
};
|
|
475
|
+
"libelleContinuer": {
|
|
476
|
+
"alias": "libelleContinuer";
|
|
477
|
+
"required": false;
|
|
478
|
+
"isSignal": true;
|
|
479
|
+
};
|
|
480
|
+
"chargement": {
|
|
481
|
+
"alias": "chargement";
|
|
482
|
+
"required": false;
|
|
483
|
+
"isSignal": true;
|
|
484
|
+
};
|
|
485
|
+
"indisponible": {
|
|
486
|
+
"alias": "indisponible";
|
|
487
|
+
"required": false;
|
|
488
|
+
"isSignal": true;
|
|
489
|
+
};
|
|
490
|
+
"dispositionDesActions": {
|
|
491
|
+
"alias": "dispositionDesActions";
|
|
492
|
+
"required": false;
|
|
493
|
+
"isSignal": true;
|
|
494
|
+
};
|
|
495
|
+
}, {}, never, ["*", "[avantActions]", "[actions]"], true, never>;
|
|
496
|
+
}
|
|
497
|
+
/** Ce que `st-challenge` emet a l'envoi : le moyen, et le code tel que saisi (vide pour une cle). */
|
|
498
|
+
export interface EnvoiDeCeremonie {
|
|
499
|
+
readonly moyen: MoyenDeCeremonie;
|
|
500
|
+
readonly code: string;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* La ceremonie d'un second facteur ou d'une confirmation forte (lot 263) : connexion, virement,
|
|
504
|
+
* ajout de beneficiaire, changement de plafond. Le composant ne fait AUCUN appel reseau :
|
|
505
|
+
* l'application execute la ceremonie et lui dit ou elle en est.
|
|
506
|
+
*
|
|
507
|
+
* ```html
|
|
508
|
+
* <st-challenge
|
|
509
|
+
* titre="Confirmez le virement"
|
|
510
|
+
* description="Saisissez le code recu par SMS au 06 •• •• •• 42."
|
|
511
|
+
* [ceremonie]="ceremonie()"
|
|
512
|
+
* [autresMoyens]="['appareil', 'secours']"
|
|
513
|
+
* [(moyen)]="moyen"
|
|
514
|
+
* renvoyable
|
|
515
|
+
* [renvoiDans]="30"
|
|
516
|
+
* [chargement]="envoiEnCours()"
|
|
517
|
+
* (envoi)="confirmer($event)"
|
|
518
|
+
* (renvoi)="renvoyerLeCode()"
|
|
519
|
+
* >
|
|
520
|
+
* <st-review-list operation [lignes]="recapitulatif()" />
|
|
521
|
+
* </st-challenge>
|
|
522
|
+
* ```
|
|
523
|
+
*
|
|
524
|
+
* - `[operation]` : pour une authentification forte (DSP2), le recapitulatif de ce que l'on
|
|
525
|
+
* confirme (montant, beneficiaire), lu AVANT le champ et decrivant le groupe (lien dynamique).
|
|
526
|
+
* - Selon `moyen` : un `code` (un seul champ, `one-time-code`, jamais envoye a la longueur
|
|
527
|
+
* atteinte, collage jamais bloque), un code de `secours` (espaces et tirets acceptes, jamais
|
|
528
|
+
* tronques), une validation sur l'`appareil` (attente sans annonce par seconde, expiration
|
|
529
|
+
* annoncee), une cle d'acces (`passkey` : le bouton lance la ceremonie, `navigator.credentials`
|
|
530
|
+
* restant dans le geste de la personne, chez l'application).
|
|
531
|
+
* - `ceremonie` : la lecture du serveur (`versEtatDeCeremonie`, `StSession`). Un refus met
|
|
532
|
+
* l'erreur sous le champ, dit les essais restants, annonce, et rend le focus au champ ; un
|
|
533
|
+
* blocage s'affiche en `alert`, champ indisponible jusqu'a la fin du delai. Un NOUVEL objet par
|
|
534
|
+
* reponse : deux refus de suite se disent deux fois. L'annonce ne double jamais le focus : les
|
|
535
|
+
* essais restants decrivent le champ (`decritPar`), et le focus amene au champ lit l'erreur et
|
|
536
|
+
* les essais, sans annonce ; deja sur le champ (Entree), rien n'est relu, et le refus entier
|
|
537
|
+
* s'annonce (audit UI du 2026-09-27, D-20).
|
|
538
|
+
* - Le renvoi d'un code (`renvoyable`) attend `renvoiDans` secondes, 30 par defaut, a l'arrivee et
|
|
539
|
+
* apres chaque renvoi ; `renvoiEnCours` fait attendre son bouton et avale les clics ; un nouveau
|
|
540
|
+
* code demande s'annonce (audit UI du 2026-09-27, D-9).
|
|
541
|
+
* - « Utiliser un autre moyen » est un bouton, present meme en attente.
|
|
542
|
+
* - Dans un dialogue (`StDialog`, role `alertdialog`) : sans `titre`, le titre du dialogue nomme
|
|
543
|
+
* la ceremonie ; « Annuler » (`annulable`) et Echap annulent l'operation, dit en toutes lettres
|
|
544
|
+
* par `libelleDAnnulation`.
|
|
545
|
+
*
|
|
546
|
+
* ⚠️ Jamais dans un `<form>` : le composant porte le sien (un formulaire dans un autre est
|
|
547
|
+
* invalide, et Entree enverrait le mauvais).
|
|
548
|
+
*/
|
|
549
|
+
export declare class StChallenge {
|
|
550
|
+
private readonly injecteur;
|
|
551
|
+
private readonly hote;
|
|
552
|
+
protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
|
|
553
|
+
protected readonly annonce: AnnonceLocale;
|
|
554
|
+
private readonly identifiants;
|
|
555
|
+
protected readonly idDuTitre: string;
|
|
556
|
+
protected readonly idDeLOperation: string;
|
|
557
|
+
protected readonly idDesMoyens: string;
|
|
558
|
+
protected readonly idDesTentatives: string;
|
|
559
|
+
/** Le nom de la ceremonie, deja traduit ; `null` dans un dialogue, que son titre nomme. */
|
|
560
|
+
readonly titre: import("@angular/core").InputSignal<string | null>;
|
|
561
|
+
readonly niveauDuTitre: import("@angular/core").InputSignal<NiveauDeTitre>;
|
|
562
|
+
/** Ce qu'il faut faire, deja traduit (« Saisissez le code recu par SMS »). */
|
|
563
|
+
readonly description: import("@angular/core").InputSignal<string | null>;
|
|
564
|
+
readonly moyen: import("@angular/core").ModelSignal<MoyenDeCeremonie>;
|
|
565
|
+
/** Les AUTRES moyens offerts, sous « Utiliser un autre moyen ». */
|
|
566
|
+
readonly autresMoyens: import("@angular/core").InputSignal<readonly MoyenDeCeremonie[]>;
|
|
567
|
+
/** La lecture du serveur ; `null` : la premiere saisie (ou l'attente, pour `appareil`). */
|
|
568
|
+
readonly ceremonie: import("@angular/core").InputSignal<LectureDeCeremonie | null>;
|
|
569
|
+
readonly longueurDuCode: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
570
|
+
/** Libelle du champ ; defaut : « Code de verification » (ou « Code de secours »). */
|
|
571
|
+
readonly libelleDuCode: import("@angular/core").InputSignal<string | null>;
|
|
572
|
+
readonly aideDuCode: import("@angular/core").InputSignal<string | null>;
|
|
573
|
+
/** Le code peut etre renvoye (SMS, courriel) ; pas un code d'application d'authentification. */
|
|
574
|
+
readonly renvoyable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
575
|
+
/** Secondes avant le prochain renvoi possible ; `null` : 30 pour un code `renvoyable`. */
|
|
576
|
+
readonly renvoiDans: import("@angular/core").InputSignal<number | null>;
|
|
577
|
+
/** Le renvoi (code, ou nouvelle demande a l'appareil) est parti : son bouton attend. */
|
|
578
|
+
readonly renvoiEnCours: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
579
|
+
/** Validite de la demande, en secondes : a son terme, la ceremonie `expire`. */
|
|
580
|
+
readonly expireDans: import("@angular/core").InputSignal<number | null>;
|
|
581
|
+
/** L'envoi, ou la ceremonie de la cle, est en cours. */
|
|
582
|
+
readonly chargement: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
583
|
+
/** « Faire confiance a cet appareil » : a la connexion seulement, jamais pour une operation. */
|
|
584
|
+
readonly proposerAppareilDeConfiance: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
585
|
+
readonly appareilDeConfiance: import("@angular/core").ModelSignal<boolean>;
|
|
586
|
+
readonly annulable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
587
|
+
/** « Annuler le virement » plutot qu'« Annuler » : ce que l'on abandonne, en toutes lettres. */
|
|
588
|
+
readonly libelleDAnnulation: import("@angular/core").InputSignal<string | null>;
|
|
589
|
+
/** L'action principale ; defaut : « Confirmer ». */
|
|
590
|
+
readonly libelleDeLAction: import("@angular/core").InputSignal<string | null>;
|
|
591
|
+
readonly code: import("@angular/core").ModelSignal<string>;
|
|
592
|
+
/**
|
|
593
|
+
* Le focus au champ a l'arrivee (une etape qui apparait sur place : la connexion, un dialogue).
|
|
594
|
+
* Faux sur une route ou `StNavigation` vise deja le titre, et dans une page de demonstration.
|
|
595
|
+
*/
|
|
596
|
+
readonly focusALArrivee: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
597
|
+
readonly envoi: import("@angular/core").OutputEmitterRef<EnvoiDeCeremonie>;
|
|
598
|
+
/** Un nouveau code, une nouvelle demande a l'appareil (non recue, ou expiree). */
|
|
599
|
+
readonly renvoi: import("@angular/core").OutputEmitterRef<void>;
|
|
600
|
+
readonly annulation: import("@angular/core").OutputEmitterRef<void>;
|
|
601
|
+
readonly expiration: import("@angular/core").OutputEmitterRef<void>;
|
|
602
|
+
private readonly champDuCode;
|
|
603
|
+
private readonly champDeSecours;
|
|
604
|
+
private readonly operation;
|
|
605
|
+
/**
|
|
606
|
+
* La lecture qui vaut pour le moyen en cours : quand seul le moyen change, celle du precedent ne
|
|
607
|
+
* s'applique plus (un refus du code ne se montre pas sur le code de secours).
|
|
608
|
+
*/
|
|
609
|
+
private readonly lecture;
|
|
610
|
+
/** L'etat montre : celui du serveur, sauf quand un delai finit ici (expiration, blocage). */
|
|
611
|
+
protected readonly etat: import("@angular/core").WritableSignal<EtatDeCeremonie>;
|
|
612
|
+
protected readonly bloque: import("@angular/core").Signal<boolean>;
|
|
613
|
+
protected readonly expiree: import("@angular/core").Signal<boolean>;
|
|
614
|
+
protected readonly horsService: import("@angular/core").Signal<boolean>;
|
|
615
|
+
protected readonly avecCode: import("@angular/core").Signal<boolean>;
|
|
616
|
+
protected readonly tentativesRestantes: import("@angular/core").Signal<number | null>;
|
|
617
|
+
/**
|
|
618
|
+
* Les essais restants DECRIVENT le champ (`aria-describedby`), lus apres l'aide et avant
|
|
619
|
+
* l'erreur : amene au champ, le focus lit l'erreur et les essais (audit UI du 2026-09-27, D-20).
|
|
620
|
+
* Relies tant qu'ils s'affichent (la meme condition que le gabarit) : un identifiant absent de la
|
|
621
|
+
* page ferait ignorer toute la description par certains lecteurs d'ecran.
|
|
622
|
+
*/
|
|
623
|
+
protected readonly descriptionsDuChamp: import("@angular/core").Signal<readonly string[]>;
|
|
624
|
+
/** Les secondes du blocage, quand le serveur les donne. */
|
|
625
|
+
protected readonly attenteDuBlocage: import("@angular/core").Signal<number | null>;
|
|
626
|
+
protected readonly libelleDuChamp: import("@angular/core").Signal<string>;
|
|
627
|
+
protected readonly libelleDuBouton: import("@angular/core").Signal<string>;
|
|
628
|
+
/**
|
|
629
|
+
* Le delai de renvoi lu : celui de l'application, sinon 30 s pour un code renvoyable (D-9). Le
|
|
630
|
+
* defaut ne vaut que pour le moyen `code`, qui seul porte le bouton de renvoi et son decompte :
|
|
631
|
+
* pose sur l'appareil, il avalerait la nouvelle demande (`demandeNonRecue`) sans rien en dire.
|
|
632
|
+
*/
|
|
633
|
+
protected readonly delaiDeRenvoi: import("@angular/core").Signal<number | null>;
|
|
634
|
+
/**
|
|
635
|
+
* L'instant ou le renvoi redevient possible (`null` : il l'est), relance a chaque renvoi : une
|
|
636
|
+
* meme duree ne change pas l'entree, un nouvel instant si. La phrase du decompte est la raison
|
|
637
|
+
* du bouton indisponible (D39).
|
|
638
|
+
*/
|
|
639
|
+
protected readonly finDuDelaiDeRenvoi: import("@angular/core").WritableSignal<number | null>;
|
|
640
|
+
protected readonly renvoiEnAttente: import("@angular/core").Signal<boolean>;
|
|
641
|
+
/** L'instant ou la demande expire (`null` : sans delai), relance a chaque nouvelle demande. */
|
|
642
|
+
protected readonly finDeValidite: import("@angular/core").WritableSignal<number | null>;
|
|
643
|
+
private readonly decompteDuRenvoi;
|
|
644
|
+
protected readonly raisonDuRenvoi: import("@angular/core").Signal<string | null>;
|
|
645
|
+
protected readonly moyensOuverts: import("@angular/core").WritableSignal<boolean>;
|
|
646
|
+
protected readonly autres: import("@angular/core").Signal<MoyenDeCeremonie[]>;
|
|
647
|
+
/** Un envoi a ete tente : les erreurs de forme se montrent. */
|
|
648
|
+
private readonly tente;
|
|
649
|
+
/** Le code au moment du refus : l'erreur du serveur tombe des qu'il change. */
|
|
650
|
+
private readonly codeAuRefus;
|
|
651
|
+
protected readonly erreurs: import("@angular/core").Signal<readonly ErreurAffichable[]>;
|
|
652
|
+
protected readonly erreursVisibles: import("@angular/core").Signal<boolean>;
|
|
653
|
+
protected readonly avecOperation: import("@angular/core").WritableSignal<boolean>;
|
|
654
|
+
constructor();
|
|
655
|
+
/**
|
|
656
|
+
* Ce qu'un refus dit a voix haute : seulement ce que le focus ne dira pas (audit UI du
|
|
657
|
+
* 2026-09-27, D-20). Amene au champ, le focus lit sa description : l'erreur et les essais
|
|
658
|
+
* restants, relies par `aria-describedby` ; rien a annoncer. Deja sur le champ (envoi par
|
|
659
|
+
* Entree), le focus ne relit rien : le refus entier. Sans champ (appareil, cle d'acces), le refus
|
|
660
|
+
* du moyen, tel qu'il s'affiche ; le code refuse n'y avait pas de sens.
|
|
661
|
+
*/
|
|
662
|
+
private annonceDuRefus;
|
|
663
|
+
protected surEnvoi(evenement: Event): void;
|
|
664
|
+
protected utiliserLaCle(): void;
|
|
665
|
+
protected renvoyer(): void;
|
|
666
|
+
/**
|
|
667
|
+
* Un autre moyen : le bouton choisi disparait avec la liste, et le focus va a ce qui porte le
|
|
668
|
+
* nouveau moyen (son champ, ou son bouton), jamais au corps de la page.
|
|
669
|
+
*/
|
|
670
|
+
protected choisir(moyen: MoyenDeCeremonie): void;
|
|
671
|
+
protected finDuRenvoi(): void;
|
|
672
|
+
protected finDeLaDemande(): void;
|
|
673
|
+
/** Le blocage est leve : un nouvel essai est possible, avec un champ vide. */
|
|
674
|
+
protected finDuBlocage(): void;
|
|
675
|
+
private focaliserLeChamp;
|
|
676
|
+
/** L'element natif du champ (code, ou code de secours) ; `null` pour l'appareil et la cle. */
|
|
677
|
+
private saisieDuCode;
|
|
678
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StChallenge, never>;
|
|
679
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StChallenge, "st-challenge", never, {
|
|
680
|
+
"titre": {
|
|
681
|
+
"alias": "titre";
|
|
682
|
+
"required": false;
|
|
683
|
+
"isSignal": true;
|
|
684
|
+
};
|
|
685
|
+
"niveauDuTitre": {
|
|
686
|
+
"alias": "niveauDuTitre";
|
|
687
|
+
"required": false;
|
|
688
|
+
"isSignal": true;
|
|
689
|
+
};
|
|
690
|
+
"description": {
|
|
691
|
+
"alias": "description";
|
|
692
|
+
"required": false;
|
|
693
|
+
"isSignal": true;
|
|
694
|
+
};
|
|
695
|
+
"moyen": {
|
|
696
|
+
"alias": "moyen";
|
|
697
|
+
"required": false;
|
|
698
|
+
"isSignal": true;
|
|
699
|
+
};
|
|
700
|
+
"autresMoyens": {
|
|
701
|
+
"alias": "autresMoyens";
|
|
702
|
+
"required": false;
|
|
703
|
+
"isSignal": true;
|
|
704
|
+
};
|
|
705
|
+
"ceremonie": {
|
|
706
|
+
"alias": "ceremonie";
|
|
707
|
+
"required": false;
|
|
708
|
+
"isSignal": true;
|
|
709
|
+
};
|
|
710
|
+
"longueurDuCode": {
|
|
711
|
+
"alias": "longueurDuCode";
|
|
712
|
+
"required": false;
|
|
713
|
+
"isSignal": true;
|
|
714
|
+
};
|
|
715
|
+
"libelleDuCode": {
|
|
716
|
+
"alias": "libelleDuCode";
|
|
717
|
+
"required": false;
|
|
718
|
+
"isSignal": true;
|
|
719
|
+
};
|
|
720
|
+
"aideDuCode": {
|
|
721
|
+
"alias": "aideDuCode";
|
|
722
|
+
"required": false;
|
|
723
|
+
"isSignal": true;
|
|
724
|
+
};
|
|
725
|
+
"renvoyable": {
|
|
726
|
+
"alias": "renvoyable";
|
|
727
|
+
"required": false;
|
|
728
|
+
"isSignal": true;
|
|
729
|
+
};
|
|
730
|
+
"renvoiDans": {
|
|
731
|
+
"alias": "renvoiDans";
|
|
732
|
+
"required": false;
|
|
733
|
+
"isSignal": true;
|
|
734
|
+
};
|
|
735
|
+
"renvoiEnCours": {
|
|
736
|
+
"alias": "renvoiEnCours";
|
|
737
|
+
"required": false;
|
|
738
|
+
"isSignal": true;
|
|
739
|
+
};
|
|
740
|
+
"expireDans": {
|
|
741
|
+
"alias": "expireDans";
|
|
742
|
+
"required": false;
|
|
743
|
+
"isSignal": true;
|
|
744
|
+
};
|
|
745
|
+
"chargement": {
|
|
746
|
+
"alias": "chargement";
|
|
747
|
+
"required": false;
|
|
748
|
+
"isSignal": true;
|
|
749
|
+
};
|
|
750
|
+
"proposerAppareilDeConfiance": {
|
|
751
|
+
"alias": "proposerAppareilDeConfiance";
|
|
752
|
+
"required": false;
|
|
753
|
+
"isSignal": true;
|
|
754
|
+
};
|
|
755
|
+
"appareilDeConfiance": {
|
|
756
|
+
"alias": "appareilDeConfiance";
|
|
757
|
+
"required": false;
|
|
758
|
+
"isSignal": true;
|
|
759
|
+
};
|
|
760
|
+
"annulable": {
|
|
761
|
+
"alias": "annulable";
|
|
762
|
+
"required": false;
|
|
763
|
+
"isSignal": true;
|
|
764
|
+
};
|
|
765
|
+
"libelleDAnnulation": {
|
|
766
|
+
"alias": "libelleDAnnulation";
|
|
767
|
+
"required": false;
|
|
768
|
+
"isSignal": true;
|
|
769
|
+
};
|
|
770
|
+
"libelleDeLAction": {
|
|
771
|
+
"alias": "libelleDeLAction";
|
|
772
|
+
"required": false;
|
|
773
|
+
"isSignal": true;
|
|
774
|
+
};
|
|
775
|
+
"code": {
|
|
776
|
+
"alias": "code";
|
|
777
|
+
"required": false;
|
|
778
|
+
"isSignal": true;
|
|
779
|
+
};
|
|
780
|
+
"focusALArrivee": {
|
|
781
|
+
"alias": "focusALArrivee";
|
|
782
|
+
"required": false;
|
|
783
|
+
"isSignal": true;
|
|
784
|
+
};
|
|
785
|
+
}, {
|
|
786
|
+
"moyen": "moyenChange";
|
|
787
|
+
"appareilDeConfiance": "appareilDeConfianceChange";
|
|
788
|
+
"code": "codeChange";
|
|
789
|
+
"envoi": "envoi";
|
|
790
|
+
"renvoi": "renvoi";
|
|
791
|
+
"annulation": "annulation";
|
|
792
|
+
"expiration": "expiration";
|
|
793
|
+
}, never, ["[operation]"], true, never>;
|
|
794
|
+
}
|
|
795
|
+
/**
|
|
796
|
+
* Les codes de secours d'un second facteur (lot 263), montres UNE fois apres leur generation
|
|
797
|
+
* (`POST /api/v1/identity/mfa/recovery-codes`), puis leur compteur.
|
|
798
|
+
*
|
|
799
|
+
* ```html
|
|
800
|
+
* <st-recovery-codes [codes]="codes()" [(confirme)]="enregistres" (confirmation)="suite()" />
|
|
801
|
+
* <!-- ensuite, sur l'ecran de securite du compte : -->
|
|
802
|
+
* <st-recovery-codes [restants]="etat().recoveryCodesRemaining" (regeneration)="regenerer()" />
|
|
803
|
+
* ```
|
|
804
|
+
*
|
|
805
|
+
* - Un avertissement (usage unique, hors ligne, plus jamais affiches), puis la liste ORDONNEE des
|
|
806
|
+
* codes, chacun copiable (`st-code`, « Copier : Code de secours 3 ») ; « Copier tous les
|
|
807
|
+
* codes », « Telecharger » (un fichier texte fabrique ici, jamais stocke) et « Imprimer » (seuls
|
|
808
|
+
* les codes s'impriment).
|
|
809
|
+
* - L'engagement passe par une case nommee (« J'ai enregistre ces codes en lieu sur ») : l'action
|
|
810
|
+
* principale reste indisponible, sa raison dite, tant qu'elle n'est pas cochee.
|
|
811
|
+
* - `restants` : le compteur, et « Generer de nouveaux codes » (`(regeneration)`). Regenerer
|
|
812
|
+
* invalide les anciens : l'application le confirme (`StDialog.confirmer`, ton danger) et
|
|
813
|
+
* redemande l'identite (le service l'exige) AVANT d'appeler le serveur. `regenerationEnCours`
|
|
814
|
+
* fait attendre le bouton et avale les clics : un double clic regenerait deux fois, et le second
|
|
815
|
+
* jeu invalidait le premier sous les yeux de la personne (audit UI du 2026-09-27, D-8).
|
|
816
|
+
* - Le telechargement se dit, fichier nomme (`fichierTelecharge`) : le navigateur ne le dit pas
|
|
817
|
+
* toujours, et rien ne change a l'ecran.
|
|
818
|
+
*
|
|
819
|
+
* ⚠️ **Les codes ne sortent jamais du composant** : aucune sortie ne porte leur valeur, aucune
|
|
820
|
+
* trace ne les ecrit. Le presse-papiers est la seule exception, voulue : le geste qui les range
|
|
821
|
+
* dans un gestionnaire de mots de passe (a l'inverse de `st-copy-button`, qui refuse les secrets).
|
|
822
|
+
*/
|
|
823
|
+
export declare class StRecoveryCodes {
|
|
824
|
+
private readonly document;
|
|
825
|
+
private readonly destruction;
|
|
826
|
+
protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
|
|
827
|
+
protected readonly annonce: AnnonceLocale;
|
|
828
|
+
/** Les codes, tels que le serveur les rend ; affiches une fois, jamais emis. */
|
|
829
|
+
readonly codes: import("@angular/core").InputSignal<readonly string[]>;
|
|
830
|
+
/** Le compteur : les codes encore utilisables ; `null` : la liste des codes. */
|
|
831
|
+
readonly restants: import("@angular/core").InputSignal<number | null>;
|
|
832
|
+
/** La regeneration est partie : le bouton attend, et un second clic ne repart pas. */
|
|
833
|
+
readonly regenerationEnCours: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
834
|
+
/** En tete du fichier telecharge (« Codes de secours de marie@exemple.fr »), deja traduit. */
|
|
835
|
+
readonly enTeteDuFichier: import("@angular/core").InputSignal<string | null>;
|
|
836
|
+
readonly nomDuFichier: import("@angular/core").InputSignal<string>;
|
|
837
|
+
/** L'action principale ; defaut : « Continuer ». */
|
|
838
|
+
readonly libelleDeLAction: import("@angular/core").InputSignal<string | null>;
|
|
839
|
+
readonly confirme: import("@angular/core").ModelSignal<boolean>;
|
|
840
|
+
/** Les codes sont enregistres, la personne poursuit. */
|
|
841
|
+
readonly confirmation: import("@angular/core").OutputEmitterRef<void>;
|
|
842
|
+
/** Sorties SANS la valeur des codes : ce qui a ete fait, jamais ce qui a ete copie. */
|
|
843
|
+
readonly copie: import("@angular/core").OutputEmitterRef<void>;
|
|
844
|
+
readonly telechargement: import("@angular/core").OutputEmitterRef<void>;
|
|
845
|
+
readonly impression: import("@angular/core").OutputEmitterRef<void>;
|
|
846
|
+
readonly regeneration: import("@angular/core").OutputEmitterRef<void>;
|
|
847
|
+
protected readonly tousLesCodes: import("@angular/core").Signal<string>;
|
|
848
|
+
protected readonly raisonDeLAttente: import("@angular/core").Signal<string>;
|
|
849
|
+
/** Le compteur alerte quand il ne reste presque plus de codes. */
|
|
850
|
+
protected readonly tonDuCompteur: import("@angular/core").Signal<"avertissement" | "danger" | "neutre">;
|
|
851
|
+
constructor();
|
|
852
|
+
protected copier(): void;
|
|
853
|
+
/** Garde du double clic : `chargement` avale deja les clics du bouton, la methode aussi. */
|
|
854
|
+
protected regenerer(): void;
|
|
855
|
+
/**
|
|
856
|
+
* Un fichier texte fabrique ici, puis oublie : ni stockage, et une adresse revoquee apres
|
|
857
|
+
* `DELAI_AVANT_REVOCATION`, jamais dans la tache du clic. La minuterie survit a la destruction :
|
|
858
|
+
* annulee, elle laisserait l'adresse vivante jusqu'au depart de la page ; remplacee par une
|
|
859
|
+
* revocation immediate, elle rendrait le defaut qu'elle corrige a l'application qui quitte la
|
|
860
|
+
* vue sur `telechargement`.
|
|
861
|
+
*/
|
|
862
|
+
protected telecharger(): void;
|
|
863
|
+
/**
|
|
864
|
+
* Seuls les codes s'impriment : la page entiere, hors de leur lignee, disparait a l'impression
|
|
865
|
+
* (`data-st-impression-exclusive`, feuille des jetons), le temps du dialogue du navigateur.
|
|
866
|
+
*/
|
|
867
|
+
protected imprimer(): void;
|
|
868
|
+
protected confirmer(): void;
|
|
869
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StRecoveryCodes, never>;
|
|
870
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StRecoveryCodes, "st-recovery-codes", never, {
|
|
871
|
+
"codes": {
|
|
872
|
+
"alias": "codes";
|
|
873
|
+
"required": false;
|
|
874
|
+
"isSignal": true;
|
|
875
|
+
};
|
|
876
|
+
"restants": {
|
|
877
|
+
"alias": "restants";
|
|
878
|
+
"required": false;
|
|
879
|
+
"isSignal": true;
|
|
880
|
+
};
|
|
881
|
+
"regenerationEnCours": {
|
|
882
|
+
"alias": "regenerationEnCours";
|
|
883
|
+
"required": false;
|
|
884
|
+
"isSignal": true;
|
|
885
|
+
};
|
|
886
|
+
"enTeteDuFichier": {
|
|
887
|
+
"alias": "enTeteDuFichier";
|
|
888
|
+
"required": false;
|
|
889
|
+
"isSignal": true;
|
|
890
|
+
};
|
|
891
|
+
"nomDuFichier": {
|
|
892
|
+
"alias": "nomDuFichier";
|
|
893
|
+
"required": false;
|
|
894
|
+
"isSignal": true;
|
|
895
|
+
};
|
|
896
|
+
"libelleDeLAction": {
|
|
897
|
+
"alias": "libelleDeLAction";
|
|
898
|
+
"required": false;
|
|
899
|
+
"isSignal": true;
|
|
900
|
+
};
|
|
901
|
+
"confirme": {
|
|
902
|
+
"alias": "confirme";
|
|
903
|
+
"required": false;
|
|
904
|
+
"isSignal": true;
|
|
905
|
+
};
|
|
906
|
+
}, {
|
|
907
|
+
"confirme": "confirmeChange";
|
|
908
|
+
"confirmation": "confirmation";
|
|
909
|
+
"copie": "copie";
|
|
910
|
+
"telechargement": "telechargement";
|
|
911
|
+
"impression": "impression";
|
|
912
|
+
"regeneration": "regeneration";
|
|
913
|
+
}, never, never, true, never>;
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
export {};
|