@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.
Files changed (55) hide show
  1. package/LICENCES-TIERCES.md +236 -0
  2. package/README.md +163 -56
  3. package/assets/icones/catalogue.json +3296 -0
  4. package/assets/icones/sprite.svg +235 -35
  5. package/fesm2022/starterlib-ui-arbre.mjs +475 -0
  6. package/fesm2022/starterlib-ui-arbre.mjs.map +1 -0
  7. package/fesm2022/starterlib-ui-donnees.mjs +3561 -0
  8. package/fesm2022/starterlib-ui-donnees.mjs.map +1 -0
  9. package/fesm2022/starterlib-ui-formulaires.mjs +3186 -442
  10. package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
  11. package/fesm2022/starterlib-ui-libelles-en.mjs +383 -0
  12. package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -0
  13. package/fesm2022/starterlib-ui-listes.mjs +5367 -0
  14. package/fesm2022/starterlib-ui-listes.mjs.map +1 -0
  15. package/fesm2022/starterlib-ui-messagerie.mjs +737 -0
  16. package/fesm2022/starterlib-ui-messagerie.mjs.map +1 -0
  17. package/fesm2022/starterlib-ui-navigation.mjs +509 -0
  18. package/fesm2022/starterlib-ui-navigation.mjs.map +1 -0
  19. package/fesm2022/starterlib-ui-onglets.mjs +371 -0
  20. package/fesm2022/starterlib-ui-onglets.mjs.map +1 -0
  21. package/fesm2022/starterlib-ui-parcours.mjs +2449 -0
  22. package/fesm2022/starterlib-ui-parcours.mjs.map +1 -0
  23. package/fesm2022/starterlib-ui-qr.mjs +907 -0
  24. package/fesm2022/starterlib-ui-qr.mjs.map +1 -0
  25. package/fesm2022/starterlib-ui-saisie.mjs +8609 -0
  26. package/fesm2022/starterlib-ui-saisie.mjs.map +1 -0
  27. package/fesm2022/starterlib-ui-selection.mjs +1341 -0
  28. package/fesm2022/starterlib-ui-selection.mjs.map +1 -0
  29. package/fesm2022/starterlib-ui-sens.mjs +59 -0
  30. package/fesm2022/starterlib-ui-sens.mjs.map +1 -0
  31. package/fesm2022/starterlib-ui-surfaces.mjs +5140 -1387
  32. package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
  33. package/fesm2022/starterlib-ui.mjs +10729 -5689
  34. package/fesm2022/starterlib-ui.mjs.map +1 -1
  35. package/package.json +58 -17
  36. package/styles/amorce.css +69 -0
  37. package/styles/couches.css +178 -0
  38. package/types/starterlib-ui-arbre.d.ts +225 -0
  39. package/types/starterlib-ui-donnees.d.ts +1489 -0
  40. package/types/starterlib-ui-formulaires.d.ts +1174 -138
  41. package/types/starterlib-ui-libelles-en.d.ts +5 -0
  42. package/types/starterlib-ui-listes.d.ts +2487 -0
  43. package/types/starterlib-ui-messagerie.d.ts +317 -0
  44. package/types/starterlib-ui-navigation.d.ts +242 -0
  45. package/types/starterlib-ui-onglets.d.ts +212 -0
  46. package/types/starterlib-ui-parcours.d.ts +916 -0
  47. package/types/starterlib-ui-qr.d.ts +105 -0
  48. package/types/starterlib-ui-saisie.d.ts +3806 -0
  49. package/types/starterlib-ui-selection.d.ts +488 -0
  50. package/types/starterlib-ui-sens.d.ts +44 -0
  51. package/types/starterlib-ui-surfaces.d.ts +1899 -510
  52. package/types/starterlib-ui.d.ts +4731 -2678
  53. package/fesm2022/starterlib-ui-interactions.mjs +0 -598
  54. package/fesm2022/starterlib-ui-interactions.mjs.map +0 -1
  55. 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 {};