@starterlib/ui 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENCES-TIERCES.md +236 -0
  2. package/README.md +101 -47
  3. package/assets/icones/catalogue.json +3296 -0
  4. package/assets/icones/sprite.svg +235 -35
  5. package/fesm2022/starterlib-ui-arbre.mjs +473 -80
  6. package/fesm2022/starterlib-ui-arbre.mjs.map +1 -1
  7. package/fesm2022/starterlib-ui-donnees.mjs +3551 -522
  8. package/fesm2022/starterlib-ui-donnees.mjs.map +1 -1
  9. package/fesm2022/starterlib-ui-formulaires.mjs +3186 -443
  10. package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
  11. package/fesm2022/starterlib-ui-libelles-en.mjs +380 -139
  12. package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -1
  13. package/fesm2022/starterlib-ui-listes.mjs +5354 -658
  14. package/fesm2022/starterlib-ui-listes.mjs.map +1 -1
  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 +506 -243
  18. package/fesm2022/starterlib-ui-navigation.mjs.map +1 -1
  19. package/fesm2022/starterlib-ui-onglets.mjs +369 -135
  20. package/fesm2022/starterlib-ui-onglets.mjs.map +1 -1
  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 +8566 -1589
  26. package/fesm2022/starterlib-ui-saisie.mjs.map +1 -1
  27. package/fesm2022/starterlib-ui-selection.mjs +1340 -268
  28. package/fesm2022/starterlib-ui-selection.mjs.map +1 -1
  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 +10721 -2871
  34. package/fesm2022/starterlib-ui.mjs.map +1 -1
  35. package/package.json +27 -18
  36. package/styles/amorce.css +69 -0
  37. package/styles/couches.css +178 -0
  38. package/types/starterlib-ui-arbre.d.ts +199 -25
  39. package/types/starterlib-ui-donnees.d.ts +1441 -180
  40. package/types/starterlib-ui-formulaires.d.ts +1174 -139
  41. package/types/starterlib-ui-libelles-en.d.ts +3 -23
  42. package/types/starterlib-ui-listes.d.ts +2310 -255
  43. package/types/starterlib-ui-messagerie.d.ts +317 -0
  44. package/types/starterlib-ui-navigation.d.ts +201 -63
  45. package/types/starterlib-ui-onglets.d.ts +172 -43
  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 +3431 -549
  49. package/types/starterlib-ui-selection.d.ts +441 -65
  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 +4749 -1115
  53. package/fesm2022/starterlib-ui-interactions.mjs +0 -43
  54. package/fesm2022/starterlib-ui-interactions.mjs.map +0 -1
  55. package/types/starterlib-ui-interactions.d.ts +0 -4
@@ -1,76 +1,174 @@
1
- import * as _angular_core from '@angular/core';
2
- import { InjectionToken, Type, TemplateRef, Signal } from '@angular/core';
3
- import * as i1 from '@angular/aria/menu';
4
- import { Ton, TonSemantique } from '@starterlib/util';
5
- import { NomDIcone, AnnonceLocale } from '@starterlib/ui';
6
- import { CdkDialogContainer } from '@angular/cdk/dialog';
7
- export { DIALOG_DATA as DONNEES_DE_DIALOGUE } from '@angular/cdk/dialog';
8
-
9
- type AlignementDeMenu = 'debut' | 'fin';
1
+ import * as i0 from "@angular/core";
2
+ import { InjectionToken, OnInit, Signal, TemplateRef, Type } from "@angular/core";
3
+ import * as i1 from "@angular/aria/menu";
4
+ import { Ton, TonSemantique, sansCommandesDeDirection, texteDUneLigne } from "@starterlib/util";
5
+ import { AnnonceLocale, Icone, NomDIcone, TailleDeBouton, VarianteDeBouton } from "@starterlib/ui";
6
+ import { CdkDialogContainer, DIALOG_DATA, DialogConfig } from "@angular/cdk/dialog";
7
+ export type AlignementDeMenu = 'debut' | 'fin';
8
+ /**
9
+ * `detachee` (defaut du socle) : le menu flotte a 4 px de son declencheur, rayon et filet
10
+ * complets. `collee` (planche 5, module 5.4) : le menu prolonge son declencheur, sans ecart, au
11
+ * moins aussi large que lui ; les coins qui se touchent sont carres, des deux cotes.
12
+ */
13
+ export type AccrocheDeMenu = 'detachee' | 'collee';
14
+ /**
15
+ * L'element focalise a l'ouverture : le premier (clic, Entree, Espace, Fleche bas) ou le dernier
16
+ * (Fleche haut).
17
+ */
18
+ export type EntreeFocaliseeALOuverture = 'premier' | 'dernier';
10
19
  /**
11
20
  * Menu d'actions. Le declencheur le designe, comme chez Material :
12
21
  *
13
22
  * ```html
14
- * <button stMenuTrigger [menu]="compte" stButton>Actions</button>
23
+ * <button stButton [stMenuTrigger]="compte">Actions</button>
15
24
  *
16
25
  * <st-menu #compte etiquette="Compte" (selection)="agir($event)">
17
26
  * <button stMenuItem valeur="profil">Mon profil</button>
18
- * <button stMenuItem valeur="quitter" ton="destructeur">Se deconnecter</button>
27
+ * <hr stMenuSeparator />
28
+ * <button stMenuItem valeur="quitter" ton="danger">Se deconnecter</button>
19
29
  * </st-menu>
20
30
  * ```
21
31
  *
32
+ * Motif APG « menu button », tenu de bout en bout (lot 231) :
33
+ *
34
+ * - a l'ouverture, le focus va au PREMIER element (clic, Entree, Espace, Fleche bas) ou au
35
+ * DERNIER (Fleche haut), jamais au conteneur : le lecteur d'ecran annonce l'element, et la
36
+ * fleche suivante atteint le deuxieme ;
37
+ * - Echap ferme et rend le focus au declencheur ; la selection aussi ;
38
+ * - Tab ferme : le focus revient au declencheur et la tabulation repart de lui (le menu vit en
39
+ * fin de document, dans la couche : sans cela, Tab sortait de la page) ;
40
+ * - un focus pose ailleurs (clic, script) ferme SANS reprendre le focus ;
41
+ * - un second clic sur le declencheur ferme (garde de `CoucheAncree`) ;
42
+ * - le declencheur porte `aria-controls` vers l'identifiant du menu.
43
+ *
22
44
  * ⚠️ Pourquoi le declencheur est DEHORS et les elements DEDANS. La primitive
23
45
  * `Menu` d'`@angular/aria` relie ses elements au menu par injection, et un
24
46
  * contenu projete garde l'injecteur de l'endroit ou il est ECRIT — jamais celui
25
47
  * qui le rend. Les elements doivent donc etre ecrits a l'interieur de l'element
26
48
  * qui porte le menu, sans quoi ils ne s'y enregistrent pas : le clavier ne
27
49
  * bouge plus, et rien ne le signale. Le declencheur, lui, n'a rien a faire dans
28
- * un `role="menu"`, qui ne contient que des elements de menu.
29
- *
30
- * Le clavier vient d'Aria, le placement du CDK. Le socle n'ecrit ni l'un ni
31
- * l'autre : deux motifs longs, que l'on croit finis avant de les avoir
32
- * eprouves au lecteur d'ecran ou au bord de l'ecran.
50
+ * un `role="menu"`, qui ne contient que des elements de menu et des separateurs.
33
51
  *
34
52
  * ⚠️ A l'ouverture, l'element est DEPLACE dans la couche d'overlay
35
53
  * (`DomPortal`), il n'est pas recree : ses liaisons, son etat et son injecteur
36
54
  * survivent au passage, ce qu'un gabarit reconstruit perdrait.
37
55
  */
38
- declare class StMenu {
39
- private readonly element;
40
- private readonly overlay;
41
- private readonly aria;
42
- /** Nom du menu pour les technologies d'assistance. */
43
- readonly etiquette: _angular_core.InputSignal<string>;
44
- readonly alignement: _angular_core.InputSignal<AlignementDeMenu>;
45
- private readonly ouvertInterne;
46
- readonly ouvert: _angular_core.Signal<boolean>;
47
- private couche;
48
- private declencheur;
49
- constructor();
50
- ouvrirDepuis(declencheur: HTMLElement): void;
51
- /**
52
- * Ferme, et rend le focus au declencheur : sans cela, le focus retombe sur le
53
- * corps du document, et la navigation clavier reprend en haut de page.
54
- */
55
- fermer(options?: {
56
- readonly rendreLeFocus?: boolean;
57
- }): void;
58
- basculerDepuis(declencheur: HTMLElement): void;
59
- protected auClavier(evenement: KeyboardEvent): void;
60
- private detruireLaCouche;
61
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StMenu, never>;
62
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StMenu, "st-menu", never, { "etiquette": { "alias": "etiquette"; "required": true; "isSignal": true; }; "alignement": { "alias": "alignement"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof i1.Menu; inputs: { "wrap": "wrap"; "typeaheadDelay": "typeaheadDelay"; "disabled": "disabled"; }; outputs: { "itemSelected": "selection"; }; }]>;
63
- }
64
-
56
+ export declare class StMenu {
57
+ private readonly element;
58
+ private readonly aria;
59
+ private readonly couche;
60
+ /** Nom du menu pour les technologies d'assistance. */
61
+ readonly etiquette: import("@angular/core").InputSignal<string>;
62
+ readonly alignement: import("@angular/core").InputSignal<AlignementDeMenu>;
63
+ /** `detachee` (defaut) ou `collee` au declencheur (planche 5). */
64
+ readonly accroche: import("@angular/core").InputSignal<AccrocheDeMenu>;
65
+ private readonly ouvertInterne;
66
+ readonly ouvert: import("@angular/core").Signal<boolean>;
67
+ private declencheur;
68
+ /**
69
+ * Vrai quand CE menu a pose `data-accroche-menu` sur son declencheur (ouvert par script depuis
70
+ * un element sans `stMenuTrigger`) : il ne retire a la fermeture que ce qu'il a pose. Sous
71
+ * `stMenuTrigger`, la marque est permanente (D53) et appartient a la directive.
72
+ */
73
+ private accrochePosee;
74
+ /**
75
+ * Garde du survol apres une ouverture AU CLAVIER : `attente` jusqu'au premier survol, puis la
76
+ * position du pointeur a ce moment-la. Un menu qui s'ouvre sous un pointeur immobile recoit un
77
+ * `mouseover` (Chromium le rejoue apres la mise en page), et la primitive y deplace le focus :
78
+ * la fleche haut ouvrait sur le dernier element, et le focus sautait au premier. Seul un
79
+ * pointeur qui BOUGE rend la main au survol.
80
+ */
81
+ private gardeDuSurvol;
82
+ constructor();
83
+ /** Identifiant du menu (celui de la primitive), que le declencheur pose en `aria-controls`. */
84
+ identifiant(): string;
85
+ /**
86
+ * Ouvre depuis `declencheur`, le focus sur le premier ou le dernier element. `parClavier` :
87
+ * ouvert par une touche (fleches, Entree, Espace) ; le survol d'un pointeur immobile ne deplace
88
+ * alors pas le focus.
89
+ */
90
+ ouvrirDepuis(declencheur: HTMLElement, focus?: EntreeFocaliseeALOuverture, parClavier?: boolean): void;
91
+ /**
92
+ * Ferme, et rend le focus au declencheur : sans cela, le focus retombe sur le
93
+ * corps du document, et la navigation clavier reprend en haut de page.
94
+ *
95
+ * ⚠️ Le focus est rendu A LA DEMANDE, pas a la fin du fondu (03 §2.6 c) : au
96
+ * clavier, on ne fait pas attendre 120 ms. La couche, elle, part en fondu et
97
+ * n'est detachee qu'a la fin de sa transition — dans la meme tache quand la
98
+ * duree vaut zero. Un focus que la personne a pose ailleurs n'est jamais repris.
99
+ */
100
+ fermer(options?: {
101
+ readonly rendreLeFocus?: boolean;
102
+ }): void;
103
+ basculerDepuis(declencheur: HTMLElement, parClavier?: boolean): void;
104
+ protected auClavier(evenement: KeyboardEvent): void;
105
+ private filtrerLeSurvol;
106
+ /** Un `pointermove` a des coordonnees differentes de la garde : le pointeur a VRAIMENT bouge. */
107
+ private libererLaGardeAuMouvement;
108
+ /** Un focus pose HORS du menu et hors du declencheur ferme, sans le reprendre. */
109
+ protected aLaPerteDuFocus(evenement: FocusEvent): void;
110
+ /** Accroche collee : le declencheur retrouve ses coins en meme temps que le menu se ferme. */
111
+ private oublierLeDeclencheur;
112
+ static ɵfac: i0.ɵɵFactoryDeclaration<StMenu, never>;
113
+ static ɵcmp: i0.ɵɵComponentDeclaration<StMenu, "st-menu", never, {
114
+ "etiquette": {
115
+ "alias": "etiquette";
116
+ "required": true;
117
+ "isSignal": true;
118
+ };
119
+ "alignement": {
120
+ "alias": "alignement";
121
+ "required": false;
122
+ "isSignal": true;
123
+ };
124
+ "accroche": {
125
+ "alias": "accroche";
126
+ "required": false;
127
+ "isSignal": true;
128
+ };
129
+ }, {}, never, ["*"], true, [{
130
+ directive: typeof i1.Menu;
131
+ inputs: {
132
+ "wrap": "wrap";
133
+ "typeaheadDelay": "typeaheadDelay";
134
+ "disabled": "indisponible";
135
+ };
136
+ outputs: {
137
+ "itemSelected": "selection";
138
+ };
139
+ }]>;
140
+ }
65
141
  /**
66
142
  * ⚠️ `danger` et non « destructeur » : c'est le meme rouge, la meme intention,
67
143
  * et l'appelant ne doit pas avoir a se souvenir que le menu, LUI, a son mot.
144
+ *
145
+ * `danger-discret` (lot 265, EA-234) : la SORTIE (« Se deconnecter » du menu de compte), sur le
146
+ * papier danger discret des le repos ; pas une destruction, donc sans confirmation.
147
+ */
148
+ export type TonDElementDeMenu = Extract<Ton, 'neutre' | 'danger'> | 'danger-discret';
149
+ /**
150
+ * Entree a etat : `case` (menuitemcheckbox, independante) ou `radio` (menuitemradio, une parmi
151
+ * ses voisines). Sans choix, l'entree est une action (`menuitem`).
152
+ *
153
+ * ⚠️ `radio` est RESERVE a un vrai groupe exclusif (au moins deux entrees `radio` voisines, une
154
+ * seule cochee a la fois) : ARIA definit `menuitemradio` comme membre d'un ensemble. Un reglage
155
+ * a bascule seul (« Afficher les archives », coche ou non) est un `case`, jamais un `radio` isole
156
+ * (revue E12).
68
157
  */
69
- type TonDElementDeMenu = Extract<Ton, 'neutre' | 'danger'>;
158
+ export type ChoixDElementDeMenu = 'case' | 'radio';
70
159
  /**
71
160
  * Element de menu, pose en ATTRIBUT sur un `<button>` natif — meme raison que
72
161
  * `st-button` : une enveloppe casserait le comportement natif du bouton.
73
162
  *
163
+ * ```html
164
+ * <button stMenuItem valeur="dupliquer" icone="copie">Dupliquer</button>
165
+ * <button stMenuItem valeur="xml" icone="telecharger" choix="radio" coche>
166
+ * Exporter <span suffixe>XML</span>
167
+ * </button>
168
+ * <hr stMenuSeparator />
169
+ * <button stMenuItem valeur="annuler" icone="corbeille" ton="danger">Annuler</button>
170
+ * ```
171
+ *
74
172
  * Le clavier (fleches, Debut, Fin, saisie au vol, indice de tabulation
75
173
  * glissant) vient de la primitive `MenuItem` d'`@angular/aria`, composee en
76
174
  * directive d'hote. Le socle n'en reecrit aucune part : ces motifs sont longs a
@@ -80,96 +178,493 @@ type TonDElementDeMenu = Extract<Ton, 'neutre' | 'danger'>;
80
178
  * defaut : c'est elle que `st-menu` emet a la selection. Un menu dont les
81
179
  * elements n'ont pas d'identite stable oblige l'appelant a distinguer ses
82
180
  * actions par leur libelle, donc par leur traduction.
181
+ *
182
+ * ⚠️ `choix` et non `type` : `type="button"` est l'attribut NATIF du bouton, qu'une entree
183
+ * nommee `type` aurait capture.
184
+ *
185
+ * `[suffixe]` : un complement court en fin de ligne (format, raccourci), en chasse fixe et en
186
+ * capitales ; il fait partie du nom accessible de l'entree.
83
187
  */
84
- declare class StMenuItem {
85
- readonly icone: _angular_core.InputSignal<"boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "tri" | "triangle-alerte" | "utilisateur" | null>;
86
- readonly ton: _angular_core.InputSignal<TonDElementDeMenu>;
87
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StMenuItem, never>;
88
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StMenuItem, "button[stMenuItem]", never, { "icone": { "alias": "icone"; "required": false; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof i1.MenuItem; inputs: { "value": "valeur"; "disabled": "desactive"; "role": "role"; }; outputs: {}; }]>;
188
+ export declare class StMenuItem {
189
+ private readonly aria;
190
+ readonly icone: import("@angular/core").InputSignal<Icone | null>;
191
+ readonly ton: import("@angular/core").InputSignal<TonDElementDeMenu>;
192
+ /** Entree a etat (case ou radio) ; `null` : une action. */
193
+ readonly choix: import("@angular/core").InputSignal<ChoixDElementDeMenu | null>;
194
+ /** Etat d'une entree `choix` : `aria-checked`, et le rendu choisi (fond, graisse, icone). */
195
+ readonly coche: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
196
+ /**
197
+ * ⚠️ Pose APRES la liaison de la primitive (celle de l'hote l'emporte) : sans `choix`, le role
198
+ * reste celui que la primitive tient, jamais `null`, qui retirerait l'attribut.
199
+ */
200
+ protected readonly roleLu: import("@angular/core").Signal<"menuitemcheckbox" | "menuitemradio" | "menuitem">;
201
+ protected readonly cocheLu: import("@angular/core").Signal<string | null>;
202
+ static ɵfac: i0.ɵɵFactoryDeclaration<StMenuItem, never>;
203
+ static ɵcmp: i0.ɵɵComponentDeclaration<StMenuItem, "button[stMenuItem]", never, {
204
+ "icone": {
205
+ "alias": "icone";
206
+ "required": false;
207
+ "isSignal": true;
208
+ };
209
+ "ton": {
210
+ "alias": "ton";
211
+ "required": false;
212
+ "isSignal": true;
213
+ };
214
+ "choix": {
215
+ "alias": "choix";
216
+ "required": false;
217
+ "isSignal": true;
218
+ };
219
+ "coche": {
220
+ "alias": "coche";
221
+ "required": false;
222
+ "isSignal": true;
223
+ };
224
+ }, {}, never, ["*", "[suffixe]"], true, [{
225
+ directive: typeof i1.MenuItem;
226
+ inputs: {
227
+ "value": "valeur";
228
+ "disabled": "desactive";
229
+ "role": "role";
230
+ };
231
+ outputs: {};
232
+ }]>;
89
233
  }
90
-
91
234
  /**
92
235
  * Controle qui ouvre un menu. Il le DESIGNE, il ne le contient pas :
93
236
  *
94
237
  * ```html
95
- * <button stMenuTrigger [menu]="compte" stButton>Actions</button>
238
+ * <button stButton [stMenuTrigger]="compte">Actions</button>
96
239
  * <st-menu #compte etiquette="Compte">…</st-menu>
97
240
  * ```
98
241
  *
242
+ * Meme convention de designation que `[stPopoverTrigger]="couche"` (lot 228) : le menu se
243
+ * passe a l'attribut lui-meme, et il est requis.
244
+ *
245
+ * Le declencheur porte `aria-haspopup="menu"`, `aria-expanded` et `aria-controls` (l'identifiant
246
+ * du menu) ; la fleche bas ouvre sur le premier element, la fleche haut sur le dernier.
247
+ *
248
+ * ⚠️ `type="button"` est FORCE sur un `<button>` : dans un formulaire, un declencheur sans type
249
+ * est un bouton d'envoi, et ouvrir un menu soumettait le formulaire.
250
+ *
99
251
  * ⚠️ Le type de `menu` est importe en TYPE seulement : `st-menu` n'a pas besoin
100
252
  * de cette directive, et l'importer dans les deux sens formerait un cycle.
101
253
  */
102
- declare class StMenuTrigger {
103
- private readonly element;
104
- readonly menu: _angular_core.InputSignal<StMenu>;
105
- protected basculer(): void;
106
- protected auClavier(evenement: KeyboardEvent): void;
107
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StMenuTrigger, never>;
108
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StMenuTrigger, "[stMenuTrigger]", never, { "menu": { "alias": "menu"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
254
+ export declare class StMenuTrigger {
255
+ private readonly element;
256
+ /**
257
+ * ⚠️ Pose `type="button"` UNE FOIS, imperativement, jamais par `[attr.type]` : une liaison
258
+ * d'attribut hote part d'un etat non initialise et vaut `null` hors `<button>`, or Angular
259
+ * appelle `removeAttribute` des le premier passage pour une liaison a `null` — un
260
+ * `<input type="button">` perdait son `type` (redevenait un champ texte), et un
261
+ * `<button type="submit">` ecrit par l'auteur voyait son type ecrase en silence. On ne pose
262
+ * donc rien hors `<button>`, et jamais par-dessus un type deja explicite.
263
+ */
264
+ constructor();
265
+ /** Le menu ouvert par ce controle : `[stMenuTrigger]="menu"`. */
266
+ readonly stMenuTrigger: import("@angular/core").InputSignal<StMenu>;
267
+ /** Le menu designe. */
268
+ protected readonly cible: import("@angular/core").Signal<StMenu>;
269
+ /**
270
+ * D53 : le declencheur d'un menu COLLE garde sa disposition (libelle au debut, fleche en fin de
271
+ * ligne, largeur du panneau) ferme comme ouvert : la marque est posee EN PERMANENCE, jamais le
272
+ * temps de l'ouverture seulement, sans quoi le bouton changeait de forme au clic. Le cote
273
+ * (`data-menu-cote`, coins et fleche retournee) reste pose par le menu, ouvert seulement.
274
+ */
275
+ protected readonly accrocheLue: import("@angular/core").Signal<"collee" | null>;
276
+ /**
277
+ * Vrai quand l'element est indisponible, natif (`:disabled`) ou logiciel (`aria-disabled`,
278
+ * pose par `stButton indisponible`). Aucun de ses evenements n'ouvre alors le menu : le clic
279
+ * est deja avale par la garde de `stButton`, mais les fleches (ci-dessous) ne passaient pas
280
+ * par elle et ouvraient quand meme le menu au clavier.
281
+ */
282
+ private estIndisponible;
283
+ /** `detail === 0` : un clic produit par Entree ou Espace, donc une ouverture au clavier. */
284
+ protected basculer(evenement: MouseEvent): void;
285
+ /**
286
+ * Fleche bas : ouvre sur le PREMIER element ; fleche haut : sur le DERNIER (APG « menu
287
+ * button »). Entree et Espace passent par le clic natif du bouton, qui ouvre sur le premier.
288
+ */
289
+ protected auClavier(evenement: KeyboardEvent): void;
290
+ static ɵfac: i0.ɵɵFactoryDeclaration<StMenuTrigger, never>;
291
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StMenuTrigger, "[stMenuTrigger]", never, {
292
+ "stMenuTrigger": {
293
+ "alias": "stMenuTrigger";
294
+ "required": true;
295
+ "isSignal": true;
296
+ };
297
+ }, {}, never, never, true, never>;
298
+ }
299
+ /**
300
+ * Separateur d'un menu, pose sur un `<hr>` natif : son role `separator` est IMPLICITE, et c'est
301
+ * l'un des deux enfants qu'un `role="menu"` admet (avec les elements de menu). Il ne prend pas le
302
+ * focus et la primitive d'Aria ne le compte pas : les fleches le sautent.
303
+ *
304
+ * ```html
305
+ * <button stMenuItem valeur="imprimer" icone="imprimer">Imprimer</button>
306
+ * <hr stMenuSeparator />
307
+ * <button stMenuItem valeur="annuler" icone="corbeille" ton="danger">Annuler</button>
308
+ * ```
309
+ *
310
+ * R13 : l'entree `danger` vient en dernier, apres un separateur ; jamais plus de huit entrees
311
+ * sans separateur.
312
+ */
313
+ export declare class StMenuSeparator {
314
+ static ɵfac: i0.ɵɵFactoryDeclaration<StMenuSeparator, never>;
315
+ static ɵcmp: i0.ɵɵComponentDeclaration<StMenuSeparator, "hr[stMenuSeparator]", never, {}, {}, never, never, true, never>;
316
+ }
317
+ /** Les fonds d'un bouton scinde : ceux que le bouton-icone du chevron sait aussi prendre. */
318
+ export type VarianteDeBoutonScinde = Extract<VarianteDeBouton, 'primaire' | 'secondaire' | 'tonale'>;
319
+ /** Les tailles communes au bouton et au bouton-icone : un groupe attache n'en melange pas deux. */
320
+ export type TailleDeBoutonScinde = Extract<TailleDeBouton, 'sm' | 'md'>;
321
+ /**
322
+ * Le bouton scinde (lot 265) : une action directe et, colle a elle, le menu de ses variantes
323
+ * (« Enregistrer », et « Enregistrer et fermer », « Enregistrer comme modele »).
324
+ *
325
+ * ```html
326
+ * <st-split-button libelle="Enregistrer" type="submit" [menu]="variantes" (action)="…" />
327
+ * <st-menu #variantes etiquette="Autres enregistrements" alignement="fin" (selection)="…">
328
+ * <button stMenuItem valeur="fermer">Enregistrer et fermer</button>
329
+ * </st-menu>
330
+ * ```
331
+ *
332
+ * - DEUX boutons distincts dans un `st-button-group` attache : l'action (qui peut envoyer son
333
+ * formulaire), puis le chevron, un bouton de menu APG nomme « Plus d'options pour Enregistrer »
334
+ * (`aria-haspopup`, `aria-expanded`, `aria-controls` par `[stMenuTrigger]`). Deux arrets de
335
+ * tabulation, deux anneaux de focus entiers : le focalise passe au-dessus de son voisin.
336
+ * - Chargement et indisponibilite gagnent les deux : pendant l'envoi, le chevron se tait aussi.
337
+ * - Le menu est ecrit a cote par l'application, comme pour tout `[stMenuTrigger]`.
338
+ */
339
+ export declare class StSplitButton {
340
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
341
+ /** Le libelle de l'action, deja traduit : visible, il nomme le groupe et le second bouton. */
342
+ readonly libelle: import("@angular/core").InputSignal<string>;
343
+ /** Le menu des variantes de l'action. */
344
+ readonly menu: import("@angular/core").InputSignal<StMenu>;
345
+ readonly variante: import("@angular/core").InputSignal<VarianteDeBoutonScinde>;
346
+ readonly taille: import("@angular/core").InputSignal<TailleDeBoutonScinde>;
347
+ /** `submit` : l'action envoie son formulaire ; le chevron reste un `button`. */
348
+ readonly type: import("@angular/core").InputSignal<"submit" | "button">;
349
+ readonly iconeAvant: import("@angular/core").InputSignal<Icone | null>;
350
+ /** Le nom du chevron ; defaut : « Plus d'options pour {libelle} ». */
351
+ readonly etiquetteDuMenu: import("@angular/core").InputSignal<string | null>;
352
+ readonly chargement: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
353
+ readonly indisponible: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
354
+ /** Le clic de l'action (un `submit` envoie aussi son formulaire). */
355
+ readonly action: import("@angular/core").OutputEmitterRef<MouseEvent>;
356
+ protected readonly nomDuMenu: import("@angular/core").Signal<string>;
357
+ static ɵfac: i0.ɵɵFactoryDeclaration<StSplitButton, never>;
358
+ static ɵcmp: i0.ɵɵComponentDeclaration<StSplitButton, "st-split-button", never, {
359
+ "libelle": {
360
+ "alias": "libelle";
361
+ "required": true;
362
+ "isSignal": true;
363
+ };
364
+ "menu": {
365
+ "alias": "menu";
366
+ "required": true;
367
+ "isSignal": true;
368
+ };
369
+ "variante": {
370
+ "alias": "variante";
371
+ "required": false;
372
+ "isSignal": true;
373
+ };
374
+ "taille": {
375
+ "alias": "taille";
376
+ "required": false;
377
+ "isSignal": true;
378
+ };
379
+ "type": {
380
+ "alias": "type";
381
+ "required": false;
382
+ "isSignal": true;
383
+ };
384
+ "iconeAvant": {
385
+ "alias": "iconeAvant";
386
+ "required": false;
387
+ "isSignal": true;
388
+ };
389
+ "etiquetteDuMenu": {
390
+ "alias": "etiquetteDuMenu";
391
+ "required": false;
392
+ "isSignal": true;
393
+ };
394
+ "chargement": {
395
+ "alias": "chargement";
396
+ "required": false;
397
+ "isSignal": true;
398
+ };
399
+ "indisponible": {
400
+ "alias": "indisponible";
401
+ "required": false;
402
+ "isSignal": true;
403
+ };
404
+ }, {
405
+ "action": "action";
406
+ }, never, never, true, never>;
407
+ }
408
+ /** Une entree du menu de compte : sa valeur (emise a la selection), son libelle traduit. */
409
+ export interface ElementDeMenuDeCompte {
410
+ readonly valeur: string;
411
+ readonly libelle: string;
412
+ readonly icone?: Icone | null;
413
+ }
414
+ /**
415
+ * Le menu de compte (lot 265), qui remplace « avatar + Se deconnecter » ecrits en clair dans
416
+ * l'en-tete : profil, preferences, securite, puis la deconnexion.
417
+ *
418
+ * ```html
419
+ * <st-user-menu [nom]="nom()" fonction="Superviseur reseau" [elements]="entrees"
420
+ * (selection)="naviguer($event)" (deconnexion)="session.deconnecter()" />
421
+ * ```
422
+ *
423
+ * - PRESENTATION PURE : il n'injecte pas `@starterlib/core` (ADR 0003) ; la session, la navigation
424
+ * et la deconnexion appartiennent a l'application, qui recoit `selection` et `deconnexion`.
425
+ * - Le declencheur est un bouton de menu APG nomme « Compte de {nom} » (le nom visible y est
426
+ * contenu, WCAG 2.5.3) : l'avatar, le nom (masque sous `md`), un chevron qui pivote a
427
+ * l'ouverture.
428
+ * - L'en-tete du panneau (avatar, nom, fonction, courriel) n'est pas une entree : muet dans le
429
+ * menu, il le DECRIT (`aria-describedby`). Les entrees sont des `stMenuItem` ; la deconnexion
430
+ * vient en dernier, apres un separateur, en danger discret (EA-234) : une sortie, pas une
431
+ * destruction, donc sans confirmation.
432
+ */
433
+ export declare class StUserMenu {
434
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
435
+ protected readonly deconnecter = "st-user-menu:deconnexion";
436
+ /** Prenom et nom tels qu'affiches. */
437
+ readonly nom: import("@angular/core").InputSignal<string>;
438
+ /** La fonction ou le role metier (« Superviseur reseau ») ; jamais un droit technique. */
439
+ readonly fonction: import("@angular/core").InputSignal<string | null>;
440
+ readonly courriel: import("@angular/core").InputSignal<string | null>;
441
+ /** La photo ; sans elle, les initiales. */
442
+ readonly image: import("@angular/core").InputSignal<string | null>;
443
+ readonly elements: import("@angular/core").InputSignal<readonly ElementDeMenuDeCompte[]>;
444
+ /** La valeur de l'entree choisie. */
445
+ readonly selection: import("@angular/core").OutputEmitterRef<string>;
446
+ readonly deconnexion: import("@angular/core").OutputEmitterRef<void>;
447
+ /**
448
+ * Nom, fonction et courriel sont des donnees : sans commande de direction, et isoles par leur
449
+ * element dans le gabarit, le courriel de gauche a droite. Le nom l'est partout, jusque dans le
450
+ * nom du compte (l'elision lit sa premiere lettre) et les initiales des avatars (audit UI du
451
+ * 2026-09-27, D-5).
452
+ */
453
+ protected readonly affichable: typeof sansCommandesDeDirection;
454
+ protected readonly nomAffiche: import("@angular/core").Signal<string>;
455
+ protected readonly nomDuCompte: import("@angular/core").Signal<string>;
456
+ protected readonly idDeLEntete: string;
457
+ protected choisir(valeur: unknown): void;
458
+ static ɵfac: i0.ɵɵFactoryDeclaration<StUserMenu, never>;
459
+ static ɵcmp: i0.ɵɵComponentDeclaration<StUserMenu, "st-user-menu", never, {
460
+ "nom": {
461
+ "alias": "nom";
462
+ "required": true;
463
+ "isSignal": true;
464
+ };
465
+ "fonction": {
466
+ "alias": "fonction";
467
+ "required": false;
468
+ "isSignal": true;
469
+ };
470
+ "courriel": {
471
+ "alias": "courriel";
472
+ "required": false;
473
+ "isSignal": true;
474
+ };
475
+ "image": {
476
+ "alias": "image";
477
+ "required": false;
478
+ "isSignal": true;
479
+ };
480
+ "elements": {
481
+ "alias": "elements";
482
+ "required": false;
483
+ "isSignal": true;
484
+ };
485
+ }, {
486
+ "selection": "selection";
487
+ "deconnexion": "deconnexion";
488
+ }, never, never, true, never>;
109
489
  }
110
-
111
490
  /** Une action secondaire, decrite par l'appelant. Le libelle est deja traduit. */
112
- interface ActionDeBarre {
113
- /** Identite stable, emise a l'activation : jamais le libelle, donc jamais la traduction. */
114
- readonly valeur: string;
115
- readonly libelle: string;
116
- readonly icone?: NomDIcone;
117
- readonly ton?: TonDElementDeMenu;
118
- readonly desactive?: boolean;
491
+ export interface ActionDeBarre {
492
+ /** Identite stable, emise a l'activation : jamais le libelle, donc jamais la traduction. */
493
+ readonly valeur: string;
494
+ readonly libelle: string;
495
+ readonly icone?: Icone;
496
+ readonly ton?: TonDElementDeMenu;
497
+ readonly desactive?: boolean;
498
+ /**
499
+ * L'action est en cours (un export qui se prepare) : leve par l'appelant DES l'activation,
500
+ * baisse a la reponse. En bouton, l'etat de chargement de `stButton` (indicateur differe,
501
+ * `aria-busy`, clics avales : aucune seconde activation) ; dans « Plus d'actions », l'entree est
502
+ * indisponible le temps de l'action, un element de menu n'ayant pas d'indicateur. Comme pour
503
+ * `stButton`, l'annonce de l'attente revient a l'application (audit UI du 2026-09-27, D-11).
504
+ */
505
+ readonly enCours?: boolean;
506
+ }
507
+ /** Taille des boutons secondaires : 44 (defaut, suit la densite), 36 ou 32 px. */
508
+ export type TailleDeBarre = Extract<TailleDeBouton, 'md' | 'sm' | 'xs'>;
509
+ /** Une entree du menu « Plus d'actions » ; `separee` : un separateur la precede (R13). */
510
+ interface EntreeDeBarre {
511
+ readonly action: ActionDeBarre;
512
+ readonly separee: boolean;
119
513
  }
120
514
  /**
121
- * Barre d'actions d'une page ou d'une section : UNE action principale,
122
- * projetee, et des actions secondaires qui se replient sous la rupture `md`.
515
+ * Barre d'actions d'une page ou d'une section : des actions secondaires, decrites, et UNE action
516
+ * principale, projetee, qui ferme la ligne.
123
517
  *
124
518
  * ```html
125
- * <st-toolbar [secondaires]="actions" (action)="agir($event)">
126
- * <button stButton variante="primaire" principale (click)="creer()">Nouveau virement</button>
519
+ * <st-toolbar etiquette="Beneficiaires" [secondaires]="actions" (action)="agir($event)">
520
+ * <button stButton variante="primaire" stToolbarPrincipale (click)="creer()">
521
+ * Ajouter un beneficiaire
522
+ * </button>
127
523
  * </st-toolbar>
128
524
  * ```
129
525
  *
526
+ * Motif APG « toolbar » (lot 231) : `role="toolbar"` nomme par `etiquette`, UN SEUL arret de
527
+ * tabulation (indice glissant), Fleches gauche et droite (inversees de droite a gauche), Debut et
528
+ * Fin. La fleche bas sur « Plus d'actions » ouvre son menu, sur le premier element.
529
+ *
130
530
  * ⚠️ **Pourquoi les secondaires sont des DONNEES** et non des boutons projetes :
131
- * sous `md`, elles vivent dans un `st-menu` « Plus », dont les elements doivent
531
+ * sous `md`, elles vivent dans un `st-menu` « Plus d'actions », dont les elements doivent
132
532
  * etre ecrits sous l'element qui porte le menu — un contenu projete garde
133
533
  * l'injecteur de l'endroit ou il est ecrit, et ne s'y enregistrerait pas. La
134
- * barre rend donc les deux formes elle-meme, boutons et elements de menu, et
135
- * n'en montre qu'une a la fois : l'autre est hors de l'arbre d'accessibilite.
136
- * Elle emet la `valeur` de l'action activee, quelle que soit la forme.
534
+ * barre rend donc la forme de la rupture, boutons ou elements de menu, jamais les deux : une
535
+ * action n'existe qu'une fois dans l'arbre d'accessibilite. Elle emet la `valeur` de l'action
536
+ * activee, quelle que soit la forme.
137
537
  *
138
- * ⚠️ **Une seule action principale.** Deux boutons pleins cote a cote ne disent
139
- * plus lequel est attendu ; en developpement, la barre le signale. L'action
140
- * principale est projetee, et non decrite : elle est souvent un `type="submit"`
141
- * relie a un formulaire, ce qu'une donnee ne saurait dire.
538
+ * ⚠️ **Un seul bouton plein par barre.** Quand une principale est projetee, une action
539
+ * `ton: 'danger'` n'est jamais un bouton plein a cote d'elle : elle vit dans « Plus d'actions »,
540
+ * derniere, apres un separateur. Sans principale (barre d'une selection), elle est rendue en
541
+ * bouton `danger`. En developpement, la barre signale deux pleins (primaire ou danger) et un
542
+ * bouton projete sans `principale`, qui ne serait pas rendu.
142
543
  *
143
544
  * Elle vit dans `ui/surfaces` parce qu'elle importe `st-menu`, donc le CDK :
144
545
  * c'est la meme raison qui en a fait sortir `st-header`.
145
546
  */
146
- declare class StToolbar {
147
- private readonly libelles;
148
- readonly secondaires: _angular_core.InputSignal<readonly ActionDeBarre[]>;
149
- /** Texte du declencheur replie. `null` : « Plus », du dictionnaire. */
150
- readonly libellePlus: _angular_core.InputSignal<string | null>;
151
- /** Emise avec la `valeur` de l'action secondaire activee. */
152
- readonly action: _angular_core.OutputEmitterRef<string>;
153
- protected readonly libellePlusLu: _angular_core.Signal<string>;
154
- protected readonly etiquetteDuMenu: _angular_core.Signal<string>;
155
- private readonly boutonsProjetes;
156
- constructor();
157
- protected declencher(action: ActionDeBarre): void;
158
- protected surSelection(valeur: unknown): void;
159
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StToolbar, never>;
160
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StToolbar, "st-toolbar", never, { "secondaires": { "alias": "secondaires"; "required": false; "isSignal": true; }; "libellePlus": { "alias": "libellePlus"; "required": false; "isSignal": true; }; }, { "action": "action"; }, ["boutonsProjetes"], ["[principale]"], true, never>;
161
- }
162
-
547
+ export declare class StToolbar {
548
+ private readonly libelles;
549
+ private readonly hote;
550
+ /** Nom de la barre pour les technologies d'assistance (« Actions des beneficiaires »). */
551
+ readonly etiquette: import("@angular/core").InputSignal<string>;
552
+ readonly secondaires: import("@angular/core").InputSignal<readonly ActionDeBarre[]>;
553
+ /** Nom du bouton « Plus d'actions ». `null` : celui du dictionnaire. */
554
+ readonly libellePlus: import("@angular/core").InputSignal<string | null>;
555
+ /** Taille des boutons secondaires : 44 px par defaut, 36 ou 32 (barres des planches 13 et 14). */
556
+ readonly taille: import("@angular/core").InputSignal<TailleDeBarre>;
557
+ /** Emise avec la `valeur` de l'action secondaire activee. */
558
+ readonly action: import("@angular/core").OutputEmitterRef<string>;
559
+ protected readonly libellePlusLu: import("@angular/core").Signal<string>;
560
+ /** Forme large (boutons) a partir de la rupture `md`, etroite (menu) en dessous. */
561
+ private readonly large;
562
+ /** Le menu « Plus d'actions », s'il est rendu (forme etroite ou danger seul en forme large). */
563
+ private readonly menuPlus;
564
+ private readonly boutonsProjetes;
565
+ private readonly elementsProjetes;
566
+ private readonly marques;
567
+ private readonly aPrincipale;
568
+ /** Les secondaires en boutons (forme large) ; la regle du plein unique en retire le danger. */
569
+ protected readonly boutons: import("@angular/core").Signal<readonly ActionDeBarre[]>;
570
+ /** Les entrees du menu : tout en forme etroite, le danger seul en forme large a principale. */
571
+ protected readonly entrees: import("@angular/core").Signal<readonly EntreeDeBarre[]>;
572
+ /** L'arret de tabulation unique de la barre. */
573
+ private actif;
574
+ constructor();
575
+ protected varianteDe(action: ActionDeBarre): VarianteDeBouton;
576
+ protected declencher(action: ActionDeBarre): void;
577
+ protected surSelection(valeur: unknown): void;
578
+ protected auFocus(evenement: FocusEvent): void;
579
+ protected auClavier(evenement: KeyboardEvent): void;
580
+ /**
581
+ * Le sens d'ecriture HERITE, comme `st-calendar`, sans style calcule ni mise en page : `:dir()`
582
+ * resout `dir="auto"`. L'attribut `dir` le plus proche, lu tel quel, prenait « auto » pour de
583
+ * gauche a droite, et les fleches restaient a l'endroit sous un ancetre de droite a gauche (audit
584
+ * UI du 2026-09-27, D-6). Il ne sert plus qu'au moteur qui ne connait pas `:dir()`.
585
+ */
586
+ private ecritDeDroiteAGauche;
587
+ /** Les elements de la ligne, dans l'ordre du document ; le menu ferme n'en fait pas partie. */
588
+ private arrets;
589
+ /**
590
+ * Le menu ouvert dont le focus est tombe sur le corps du document (son element focalise a
591
+ * disparu du DOM au dernier rendu) ferme sans esperer le reprendre : la personne l'a de toute
592
+ * facon deja perdu.
593
+ */
594
+ private fermerLeMenuSiOrphelin;
595
+ private glisser;
596
+ private avertir;
597
+ static ɵfac: i0.ɵɵFactoryDeclaration<StToolbar, never>;
598
+ static ɵcmp: i0.ɵɵComponentDeclaration<StToolbar, "st-toolbar", never, {
599
+ "etiquette": {
600
+ "alias": "etiquette";
601
+ "required": true;
602
+ "isSignal": true;
603
+ };
604
+ "secondaires": {
605
+ "alias": "secondaires";
606
+ "required": false;
607
+ "isSignal": true;
608
+ };
609
+ "libellePlus": {
610
+ "alias": "libellePlus";
611
+ "required": false;
612
+ "isSignal": true;
613
+ };
614
+ "taille": {
615
+ "alias": "taille";
616
+ "required": false;
617
+ "isSignal": true;
618
+ };
619
+ }, {
620
+ "action": "action";
621
+ }, ["boutonsProjetes", "elementsProjetes", "marques"], ["[principale], [stToolbarPrincipale]"], true, never>;
622
+ }
623
+ /**
624
+ * Marque l'action PRINCIPALE projetee dans `st-toolbar` : elle ferme la ligne, apres les
625
+ * secondaires et le « Plus d'actions ». L'attribut nu `principale` reste lu ; la directive le dit
626
+ * au type, et a l'editeur. La projection se decide sur l'attribut ECRIT dans le gabarit (l'un ou
627
+ * l'autre), jamais sur un attribut pose par une directive.
628
+ *
629
+ * ```html
630
+ * <st-toolbar etiquette="Beneficiaires" [secondaires]="actions">
631
+ * <button stButton variante="primaire" stToolbarPrincipale>Ajouter un beneficiaire</button>
632
+ * </st-toolbar>
633
+ * ```
634
+ */
635
+ export declare class StToolbarPrincipale {
636
+ static ɵfac: i0.ɵɵFactoryDeclaration<StToolbarPrincipale, never>;
637
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StToolbarPrincipale, "[stToolbarPrincipale]", never, {}, {}, never, never, true, never>;
638
+ }
163
639
  /**
164
640
  * Identifiant du titre du dialogue, decide a l'ouverture et fourni au contenu.
165
641
  *
166
- * ⚠️ Il est engendre par le service et non par le composant de titre : c'est la
167
- * configuration du dialogue qui doit porter `aria-labelledby`, et elle est
168
- * figee a l'ouverture. Un identifiant decide plus tard arriverait apres que le
169
- * conteneur a lu sa configuration, et le dialogue s'ouvrirait sans nom.
642
+ * Le CDK (22) fournit l'injecteur du dialogue au composant ouvert COMME au gabarit
643
+ * (`_attachDialogContent` construit le `TemplatePortal` avec cet injecteur) : un `st-dialog-title`
644
+ * y recoit donc cet identifiant dans les deux cas, et n'en forge un que hors d'un dialogue ouvert
645
+ * par `StDialog` (vitrine).
646
+ *
647
+ * Depuis le lot 229, le NOM du dialogue ne depend pas de ce jeton : le conteneur lit l'identifiant
648
+ * du titre REELLEMENT rendu dans son DOM, et ne pose `aria-labelledby` que s'il existe. Un dialogue
649
+ * sans titre ne porte donc plus de `aria-labelledby` pendant (A1204).
170
650
  */
171
- declare const IDENTIFIANT_DU_TITRE: InjectionToken<string>;
172
-
651
+ export declare const IDENTIFIANT_DU_TITRE: InjectionToken<string>;
652
+ /** Ce qu'un dialogue ouvert par `StDialog` dit a son contenu. */
653
+ export interface ContexteDeDialogue {
654
+ /**
655
+ * La croix standard de `st-dialog-title` est-elle offerte ? Faux pour un `alertdialog`, qui
656
+ * exige une REPONSE, et sous `fermetureInterdite`, ou seules les actions ferment (ADR 0005
657
+ * D54). Ne gouverne QUE cette croix : une action `[stDialogClose]` reste toujours visible.
658
+ */
659
+ readonly fermable: boolean;
660
+ }
661
+ /**
662
+ * Contexte du dialogue, fourni par `StDialog` a chaque ouverture. Absent hors d'un dialogue (une
663
+ * vitrine de galerie) : la croix de `st-dialog-title` n'y apparait que si on la demande.
664
+ */
665
+ export declare const CONTEXTE_DE_DIALOGUE: InjectionToken<ContexteDeDialogue>;
666
+ /** Ton d'une confirmation : `danger` pour ce qui detruit, `primaire` sinon. */
667
+ export type TonDeConfirmation = Extract<TonSemantique, 'primaire' | 'danger'>;
173
668
  /**
174
669
  * Ce que l'appelant decrit pour obtenir une confirmation.
175
670
  *
@@ -179,124 +674,233 @@ declare const IDENTIFIANT_DU_TITRE: InjectionToken<string>;
179
674
  * changement d'IBAN — merite une re-authentification par second facteur, que le
180
675
  * backend sait deja demander.
181
676
  */
182
- interface DemandeDeConfirmation {
183
- readonly titre: string;
184
- readonly message: string;
185
- readonly libelleConfirmation?: string;
186
- readonly libelleAnnulation?: string;
187
- /** L'action detruit quelque chose : le bouton passe en `danger`. */
188
- readonly destructeur?: boolean;
189
- /**
190
- * Texte que la personne doit recopier pour confirmer.
191
- *
192
- * ⚠️ A reserver a l'irreversible. Ce n'est pas une ceinture de securite de
193
- * plus : c'est le seul moyen de rompre l'automatisme de qui clique « Oui »
194
- * sans lire, et son cout — une saisie — n'est justifie que la ou l'erreur ne
195
- * se repare pas.
196
- */
197
- readonly saisieDeConfirmation?: string;
198
- }
199
- /**
200
- * Dialogue de confirmation.
677
+ export interface DemandeDeConfirmation {
678
+ /** Une question fermee : « Revoquer cet appareil ? ». */
679
+ readonly titre: string;
680
+ /**
681
+ * Ce qui sera perdu, en une ou deux phrases. C'est la DESCRIPTION du dialogue : le lecteur
682
+ * d'ecran la lit apres le titre, avant les boutons. La valeur a recopier y est mise en valeur
683
+ * la ou le message la nomme (guillemets compris).
684
+ */
685
+ readonly message: string;
686
+ /** Repete le verbe de l'action (« Supprimer », « Revoquer ») ; defaut « Confirmer ». */
687
+ readonly libelleConfirmation?: string;
688
+ readonly libelleAnnulation?: string;
689
+ /**
690
+ * `danger` : l'action detruit quelque chose. Bouton `danger`, icone d'intention
691
+ * `triangle-alerte` et surtitre dans la couleur du danger, fond inerte. Defaut : `primaire`.
692
+ */
693
+ readonly ton?: TonDeConfirmation;
694
+ /** Icone du titre. Defaut : `triangle-alerte` sous `danger`, aucune sinon ; `null` la retire. */
695
+ readonly icone?: NomDIcone | null;
696
+ /** Surtitre sous le titre (reference, portee), en capitales dans la couleur du ton. */
697
+ readonly sousTitre?: string;
698
+ /** Icone du bouton de confirmation (`corbeille-croix` pour une suppression). */
699
+ readonly iconeConfirmation?: NomDIcone;
700
+ /**
701
+ * Croix standard dans l'en-tete : elle vaut « Annuler ». Defaut : vrai.
702
+ *
703
+ * ⚠️ Sans effet sous `ton: 'danger'` OU avec `saisieDeConfirmation` : la
704
+ * confirmation est alors un `alertdialog`, qui n'a jamais de croix (ADR 0005 D54 et D68) ; Echap y
705
+ * vaut « Annuler », jamais la confirmation.
706
+ */
707
+ readonly fermable?: boolean;
708
+ /**
709
+ * Texte que la personne doit recopier pour confirmer. Le dialogue devient un `alertdialog`,
710
+ * sans croix (D54) : « Annuler » et Echap sont ses seules sorties sans confirmation.
711
+ *
712
+ * ⚠️ A reserver a l'irreversible. Ce n'est pas une ceinture de securite de
713
+ * plus : c'est le seul moyen de rompre l'automatisme de qui clique « Oui »
714
+ * sans lire, et son cout — une saisie — n'est justifie que la ou l'erreur ne
715
+ * se repare pas. Un nom court, jamais un IBAN complet (SEC-3).
716
+ */
717
+ readonly saisieDeConfirmation?: string;
718
+ }
719
+ /** Un morceau de texte : la valeur mise en valeur, ou ce qui l'entoure. */
720
+ interface Morceau {
721
+ readonly texte: string;
722
+ readonly valeur: boolean;
723
+ }
724
+ /**
725
+ * Dialogue de confirmation, ouvert par `StDialog.confirmer(demande)` (planche 5, dialogue A).
201
726
  *
202
727
  * ⚠️ **Le bouton de confirmation n'est jamais celui qui recoit le focus.** Le
203
- * dialogue entier le recoit (voir `StDialog`), et le premier arret de
204
- * tabulation est l'annulation. Un dialogue destructeur dont le bouton dangereux
205
- * est deja focalise se valide par une seule touche Entree — c'est-a-dire par le
206
- * geste que la personne etait en train de faire quand il s'est ouvert.
207
- */
208
- declare class StConfirmDialog {
209
- private readonly reference;
210
- private readonly libelles;
211
- protected readonly demande: DemandeDeConfirmation;
212
- protected readonly saisie: _angular_core.WritableSignal<string>;
213
- /** Unique par instance : deux confirmations empilees dupliqueraient un identifiant fixe. */
214
- protected readonly identifiantDeSaisie: string;
215
- protected readonly ton: _angular_core.Signal<TonSemantique>;
216
- protected readonly libelleConfirmation: _angular_core.Signal<string>;
217
- protected readonly libelleAnnulation: _angular_core.Signal<string>;
218
- protected readonly libelleRecopie: _angular_core.Signal<string>;
219
- /**
220
- * ⚠️ La comparaison ignore la casse et les espaces de bord, mais RIEN
221
- * d'autre. Exiger la casse exacte transforme une confirmation en jeu
222
- * d'adresse, et pousse a copier-coller — ce qui annule precisement l'effet
223
- * recherche.
224
- */
225
- protected readonly confirmationPossible: _angular_core.Signal<boolean>;
226
- protected auChangement(evenement: Event): void;
227
- protected confirmer(): void;
228
- protected annuler(): void;
229
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StConfirmDialog, never>;
230
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StConfirmDialog, "st-confirm-dialog", never, {}, {}, never, never, true, never>;
231
- }
232
-
728
+ * dialogue entier le recoit (voir `StDialog`), et le premier arret de tabulation est la croix
729
+ * (quand elle est rendue : jamais sur un `alertdialog`, D54), puis le champ de recopie s'il
730
+ * existe, puis l'annulation. Un dialogue
731
+ * destructeur dont le bouton dangereux est deja focalise se valide par une seule touche Entree —
732
+ * c'est-a-dire par le geste que la personne etait en train de faire quand il s'est ouvert.
733
+ *
734
+ * ⚠️ **La recopie parle.** Entree dans le champ confirme si la recopie correspond ; sinon le
735
+ * champ passe `aria-invalid`, un message d'erreur relie apparait sous lui, une region d'alerte
736
+ * l'annonce (le champ garde le focus : rien n'est relu sans ca), et le focus y reste. Le bouton
737
+ * indisponible dit pourquoi (`raisonIndisponible`) : jamais un bouton muet.
738
+ */
739
+ export declare class StConfirmDialog {
740
+ /** La valeur mise en valeur s'affiche comme elle se recopie : sur une ligne, sans invisible. */
741
+ protected readonly uneLigne: typeof texteDUneLigne;
742
+ private readonly reference;
743
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
744
+ private readonly identifiants;
745
+ protected readonly demande: DemandeDeConfirmation;
746
+ protected readonly saisie: import("@angular/core").WritableSignal<string>;
747
+ /** Une validation a ete tentee (Entree dans le champ) : l'erreur peut se montrer. */
748
+ private readonly tentative;
749
+ /**
750
+ * Annonce l'echec d'une recopie a chaque tentative (alerte assertive) : le message d'erreur
751
+ * n'a ni role ni region vivante (`st-inline-message` sans `annonce`, reserve a un message qui
752
+ * apparait APRES un formulaire), et le focus reste dans le champ deja focalise — ni l'un ni
753
+ * l'autre changement n'est donc relu par NVDA ou JAWS sans cette region dediee. `AnnonceLocale`
754
+ * vide puis remplit, ce qui fait relire une seconde tentative identique.
755
+ */
756
+ protected readonly erreurAnnoncee: AnnonceLocale;
757
+ /**
758
+ * Identifiant du message, que `StDialog.confirmer` relie par `aria-describedby` : il le passe
759
+ * dans les donnees (champ interne) ; un dialogue ouvert autrement en forge un.
760
+ */
761
+ protected readonly identifiantDuMessage: string;
762
+ /** Uniques par instance : deux confirmations empilees dupliqueraient un identifiant fixe. */
763
+ protected readonly identifiantDeSaisie: string;
764
+ protected readonly identifiantDeLAide: string;
765
+ protected readonly identifiantDeLErreur: string;
766
+ protected readonly ton: import("@angular/core").Signal<TonDeConfirmation>;
767
+ /** Ton de l'en-tete : `danger` le met en forme « ton » ; sinon un titre simple ou a tuile. */
768
+ protected readonly tonDuTitre: import("@angular/core").Signal<TonSemantique>;
769
+ protected readonly icone: import("@angular/core").Signal<"accessibilite" | "appareils" | "arborescence" | "asterisque" | "badge-coche" | "banque" | "batiment" | "bifurcation" | "billets" | "billets-envoi" | "billets-pile" | "boite" | "boite-de-reception" | "bouclier" | "bouclier-alerte" | "bouclier-coche" | "bouclier-coeur" | "bouclier-croix" | "bouclier-moitie" | "bouclier-recherche" | "bouclier-utilisateur" | "boussole" | "bouton-curseur" | "bulle-question" | "cadenas" | "cadenas-horloge" | "cadenas-ouvert" | "cadre-pied" | "cadre-texte" | "calendrier" | "calendrier-evenement" | "calendrier-horloge" | "calendrier-jour" | "calques" | "carte-bancaire" | "carte-bancaire-barre" | "carte-bancaire-cadenas" | "carte-contact" | "carte-identite" | "cartes-empilees" | "case-cochee" | "casse" | "cercle" | "cercle-alerte" | "cercle-chevron-bas" | "cercle-coche" | "cercle-coche-ouvert" | "cercle-croix" | "cercle-info" | "cercle-moins" | "cercle-plus" | "cercle-question" | "certificat" | "chandelier" | "chargement" | "cheque" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "chevrons-droite" | "chevrons-haut-bas" | "cle" | "cloche" | "cloche-sonnerie" | "coche" | "code" | "code-qr" | "code-qr-scanner" | "coffre-fort" | "colonnes" | "connexion" | "contraste" | "copie" | "corbeille" | "corbeille-croix" | "courriel" | "crayon" | "croix" | "curseur-clic" | "deconnexion" | "devise" | "disposition" | "dollar" | "dossier" | "dossier-barre" | "dossier-ouvert" | "double-coche" | "echange" | "eclair" | "empreinte-digitale" | "enregistrer" | "entree" | "envoyer" | "epaisseur-de-trait" | "epingle" | "etoile" | "euro" | "fichier" | "fichier-image" | "fichier-pdf" | "fichier-texte" | "filtre" | "filtre-barre" | "filtre-lignes" | "fleche-bas" | "fleche-bas-gauche" | "fleche-bas-ligne" | "fleche-droite" | "fleche-gauche" | "fleche-haut" | "fleche-haut-droite" | "fleche-haut-ligne" | "fleche-large-haut" | "fleches-gauche-droite" | "flocon" | "flou" | "formes" | "globe" | "graphique-anneau" | "graphique-barres" | "graphique-barres-cadre" | "graphique-camembert" | "graphique-ligne" | "graphique-lignes" | "grille" | "grille-lignes" | "hexagone" | "historique" | "horloge" | "horloge-fleche" | "iban" | "imprimer" | "interdit" | "jalons" | "jauge" | "lien" | "lien-externe" | "lignes" | "lignes-crayon" | "liste" | "liste-coche" | "liste-controle" | "liste-numerotee" | "luminosite" | "lune" | "maillet" | "maison" | "marque-page" | "menu" | "menu-ouvert" | "message" | "minuteur" | "mise-au-point" | "mise-en-page-image" | "moins" | "nuage-barre" | "nuage-televerser" | "octogone-alerte" | "oeil" | "oeil-barre" | "panneau-gauche" | "parametres" | "parapluie" | "parchemin" | "pieces" | "plus" | "pointeur" | "points" | "points-verticaux" | "portefeuille" | "portefeuille-cartes" | "presse-papiers-coche" | "presse-papiers-horloge" | "priorite-haute" | "rafraichir" | "recherche" | "recherche-barre" | "recherche-texte" | "rectangle-points" | "recu" | "redemarrer" | "reglages" | "regle" | "reseau-jauge" | "rotation-arriere" | "routeur" | "sablier" | "sablier-bas" | "sablier-haut" | "sac-argent" | "sans-contact" | "serveur" | "soleil" | "style-de-trait" | "synchro" | "synchro-probleme" | "tableau" | "tableau-de-bord" | "tableau-de-bord-plus" | "tablette" | "tabulation" | "telecharger" | "telephone-mobile" | "televerser" | "tendance-baisse" | "tendance-hausse" | "terminal" | "tirelire" | "triangle-alerte" | "triangle-bas" | "triangle-haut" | "trombone" | "utilisateur" | "utilisateur-crayon" | "utilisateurs" | "wifi" | "wifi-barre" | null>;
770
+ protected readonly libelleConfirmation: import("@angular/core").Signal<string>;
771
+ protected readonly libelleAnnulation: import("@angular/core").Signal<string>;
772
+ protected readonly libelleRecopie: import("@angular/core").Signal<string>;
773
+ /** Le message, la valeur a recopier mise en valeur la ou il la nomme. */
774
+ protected readonly morceauxDuMessage: import("@angular/core").Signal<readonly Morceau[]>;
775
+ /** L'etiquette du champ, la valeur a recopier dans sa propre boite (chasse fixe). */
776
+ protected readonly morceauxDeLEtiquette: import("@angular/core").Signal<readonly Morceau[]>;
777
+ /**
778
+ * ⚠️ La comparaison ignore la casse et les espaces de bord, mais RIEN
779
+ * d'autre. Exiger la casse exacte transforme une confirmation en jeu
780
+ * d'adresse, et pousse a copier-coller — ce qui annule precisement l'effet
781
+ * recherche. L'aide sous le champ le dit.
782
+ *
783
+ * ⚠️ Normalisee en NFC puis comparee avec `toLowerCase()` (jamais `toLocaleLowerCase()` sans
784
+ * argument) : une valeur composee en NFD (claviers macOS, certains IME) doit correspondre a la
785
+ * meme valeur affichee en NFC, et le repli sur la locale par defaut du NAVIGATEUR ferait echouer
786
+ * une recopie exacte sous une locale a regle de casse particuliere (le i turc, par exemple).
787
+ */
788
+ protected readonly confirmationPossible: import("@angular/core").Signal<boolean>;
789
+ /** La recopie correspond : la coche de succes s'affiche dans le champ. */
790
+ protected readonly correspond: import("@angular/core").Signal<boolean>;
791
+ /** Erreur montree apres une tentative, tant que la recopie ne correspond pas. */
792
+ protected readonly invalide: import("@angular/core").Signal<boolean>;
793
+ protected readonly descriptionDuChamp: import("@angular/core").Signal<string>;
794
+ protected auChangement(evenement: Event): void;
795
+ /** Entree dans le champ : confirme si la recopie correspond, sinon le dit et garde le focus. */
796
+ protected valider(evenement: Event): void;
797
+ protected confirmer(): void;
798
+ protected annuler(): void;
799
+ static ɵfac: i0.ɵɵFactoryDeclaration<StConfirmDialog, never>;
800
+ static ɵcmp: i0.ɵɵComponentDeclaration<StConfirmDialog, "st-confirm-dialog", never, {}, {}, never, never, true, never>;
801
+ }
233
802
  /** Ce que l'appelant regle a l'ouverture. */
234
- interface OptionsDeDialogue<D = unknown> {
235
- /** Donnees passees au composant, lisibles par `DONNEES_DE_DIALOGUE`. */
236
- readonly donnees?: D;
237
- /**
238
- * Nom accessible quand le dialogue n'affiche pas de `st-dialog-title`.
239
- * Inutile — et ignore — des qu'un titre est present.
240
- */
241
- readonly etiquette?: string;
242
- /**
243
- * Interdit Echap et le clic sur le fond.
244
- *
245
- * ⚠️ A reserver aux dialogues qui perdraient du travail en se fermant. Un
246
- * dialogue qu'on ne peut pas fermer au clavier est une impasse pour qui
247
- * n'utilise pas la souris ; la fermeture doit alors exister ailleurs, en
248
- * toutes lettres.
249
- */
250
- readonly fermetureInterdite?: boolean;
251
- /**
252
- * Ignore le clic sur le fond, mais laisse Echap fermer.
253
- *
254
- * ⚠️ La distinction compte, et le CDK ne la fait pas : son `disableClose`
255
- * bloque les DEUX. Or le clic hors du panneau est le geste le plus facile a
256
- * faire par megarde, tandis qu'Echap est un choix delibere — et, sur une
257
- * confirmation, il vaut ANNULER, ce qui est sans danger. Bloquer Echap ne
258
- * protege rien et prive le clavier de sa sortie.
259
- */
260
- readonly fondInerte?: boolean;
261
- /**
262
- * `alertdialog` pour ce qui exige une reponse immediate : une session qui
263
- * expire, une perte imminente. Le lecteur d'ecran l'annonce avec plus
264
- * d'insistance qu'un dialogue ordinaire — a ne pas galvauder.
265
- */
266
- readonly role?: 'dialog' | 'alertdialog';
267
- /**
268
- * Selecteur de l'element qui recoit le focus a l'ouverture, a la place du
269
- * dialogue lui-meme.
270
- *
271
- * ⚠️ Pour un `alertdialog`, le motif ARIA veut le focus sur l'action la MOINS
272
- * destructrice : « Rester connecte », jamais « Se deconnecter ». Une touche
273
- * Entree reflexe ne doit rien detruire.
274
- */
275
- readonly focusInitial?: string;
276
- /** Identifiant du texte qui DECRIT le dialogue, lu a l'ouverture apres son nom. */
277
- readonly descriptionDe?: string;
278
- readonly largeur?: string;
279
- readonly classe?: string;
280
- /**
281
- * Ancre le panneau sur un bord : c'est le TIROIR.
282
- *
283
- * ⚠️ Un tiroir modal EST un dialogue — meme role, meme piegeage du focus,
284
- * meme Echap. Seule sa geometrie change. Lui donner son propre service
285
- * dupliquerait toute la machinerie d'accessibilite pour une difference de
286
- * position, et la copie finirait par deriver de l'original.
287
- *
288
- * `debut` et `fin` suivent le sens d'ecriture ; `bas` donne la feuille
289
- * inferieure, qui est la forme utile sur telephone.
290
- */
291
- readonly cote?: CoteDuTiroir;
803
+ export interface OptionsDeDialogue<D = unknown> {
804
+ /** Donnees passees au composant, lisibles par `DONNEES_DE_DIALOGUE`. */
805
+ readonly donnees?: D;
806
+ /**
807
+ * Nom accessible quand le dialogue n'affiche pas de `st-dialog-title`, ou tant que son titre
808
+ * n'a pas de texte (titre differe ou lie a des donnees en chargement). Des qu'un titre au texte
809
+ * non vide est rendu, le titre visible l'emporte.
810
+ */
811
+ readonly etiquette?: string;
812
+ /**
813
+ * Retire la croix, Echap, le clic sur le fond ET la fermeture par navigation (routeur comme
814
+ * historique) : seules les actions du dialogue le ferment (ADR 0005 D54).
815
+ *
816
+ * ⚠️ A reserver aux dialogues qui perdraient du travail en se fermant. Un
817
+ * dialogue qu'on ne peut pas fermer au clavier est une impasse pour qui
818
+ * n'utilise pas la souris ; la fermeture doit alors exister ailleurs, en
819
+ * toutes lettres : une action `[stDialogClose]`, toujours visible.
820
+ */
821
+ readonly fermetureInterdite?: boolean;
822
+ /**
823
+ * Ignore le clic sur le fond, mais laisse Echap fermer.
824
+ *
825
+ * ⚠️ La distinction compte, et le CDK ne la fait pas : son `disableClose`
826
+ * bloque les DEUX. Or le clic hors du panneau est le geste le plus facile a
827
+ * faire par megarde, tandis qu'Echap est un choix delibere — et, sur une
828
+ * confirmation, il vaut ANNULER, ce qui est sans danger. Bloquer Echap ne
829
+ * protege rien et prive le clavier de sa sortie.
830
+ */
831
+ readonly fondInerte?: boolean;
832
+ /**
833
+ * `alertdialog` pour ce qui exige une reponse immediate : une session qui
834
+ * expire, une perte imminente. Le lecteur d'ecran l'annonce avec plus
835
+ * d'insistance qu'un dialogue ordinaire — a ne pas galvauder.
836
+ */
837
+ readonly role?: 'dialog' | 'alertdialog';
838
+ /**
839
+ * Offre la croix standard de `st-dialog-title`. Defaut : vrai. Ne gouverne QUE cette croix :
840
+ * une action `[stDialogClose]` reste toujours visible (ADR 0005 D54).
841
+ *
842
+ * ⚠️ Sans effet sur un `alertdialog` ni sous `fermetureInterdite`, qui n'ont JAMAIS de croix
843
+ * (D54) : le premier exige une reponse, et Echap y rend l'issue non destructive ; le second ne
844
+ * se ferme que par ses actions. `fermable: true` y est ignore (avertissement en developpement).
845
+ * Faux : le dialogue se ferme par ses actions (et Echap).
846
+ */
847
+ readonly fermable?: boolean;
848
+ /**
849
+ * Largeur d'un dialogue centre, par les jetons (D2) : `sm` 24rem (confirmation), `md` 32rem
850
+ * (defaut, formulaire court), `lg` 48rem (tableau, comparaison). Sous 480 px, toutes prennent
851
+ * `100vw - 32 px`. Sans effet sur un tiroir ; `largeur` reste la derogation libre.
852
+ */
853
+ readonly taille?: TailleDeDialogue;
854
+ /**
855
+ * Garde le dialogue ouvert a une navigation, du routeur comme de l'historique. Defaut : vrai
856
+ * pour un `alertdialog`, faux sinon.
857
+ *
858
+ * ⚠️ Un `alertdialog` exige une REPONSE. Le fermer a une navigation le resolvait sans resultat,
859
+ * et l'avertissement d'inactivite prenait ce silence pour « Rester connecte » : une redirection
860
+ * programmee prolongeait la session sans personne devant l'ecran (A1199, A1216).
861
+ */
862
+ readonly survitALaNavigation?: boolean;
863
+ /**
864
+ * Selecteur de l'element qui recoit le focus a l'ouverture, a la place du
865
+ * dialogue lui-meme.
866
+ *
867
+ * ⚠️ Pour un `alertdialog`, le motif ARIA veut le focus sur l'action la MOINS
868
+ * destructrice : « Rester connecte », jamais « Se deconnecter ». Une touche
869
+ * Entree reflexe ne doit rien detruire.
870
+ */
871
+ readonly focusInitial?: string;
872
+ /** Identifiant du texte qui DECRIT le dialogue, lu a l'ouverture apres son nom. */
873
+ readonly descriptionDe?: string;
874
+ /**
875
+ * Largeur imposee du panneau. Absente : celle de la feuille des couches
876
+ * (`@starterlib/ui/styles/couches.css`) — celle de `taille` pour un dialogue (32rem par
877
+ * defaut), 28rem pour un tiroir lateral, toute la largeur pour une feuille inferieure, sans
878
+ * jamais depasser l'ecran. Honoree dans les trois cas (A1214).
879
+ */
880
+ readonly largeur?: string;
881
+ readonly classe?: string;
882
+ /**
883
+ * Ancre le panneau sur un bord : c'est le TIROIR.
884
+ *
885
+ * ⚠️ Un tiroir modal EST un dialogue — meme role, meme piegeage du focus,
886
+ * meme Echap. Seule sa geometrie change. Lui donner son propre service
887
+ * dupliquerait toute la machinerie d'accessibilite pour une difference de
888
+ * position, et la copie finirait par deriver de l'original.
889
+ *
890
+ * `debut` et `fin` suivent le sens d'ecriture ; `bas` donne la feuille
891
+ * inferieure, qui est la forme utile sur telephone.
892
+ */
893
+ readonly cote?: CoteDuTiroir;
292
894
  }
895
+ /** Largeur d'un dialogue centre (jetons `--st-largeur-dialogue-*`). */
896
+ export type TailleDeDialogue = 'sm' | 'md' | 'lg';
293
897
  /** Bord auquel un tiroir s'ancre. Logique, donc juste aussi en ecriture droite a gauche. */
294
- type CoteDuTiroir = 'debut' | 'fin' | 'bas';
898
+ export type CoteDuTiroir = 'debut' | 'fin' | 'bas';
295
899
  /** Reference sur un dialogue ouvert. */
296
- interface ReferenceDeDialogue<R> {
297
- /** Resout a la fermeture. `undefined` quand le dialogue est simplement quitte. */
298
- readonly ferme: Promise<R | undefined>;
299
- fermer(resultat?: R): void;
900
+ export interface ReferenceDeDialogue<R> {
901
+ /** Resout a la fermeture. `undefined` quand le dialogue est simplement quitte. */
902
+ readonly ferme: Promise<R | undefined>;
903
+ fermer(resultat?: R): void;
300
904
  }
301
905
  /**
302
906
  * Ouvre des dialogues modaux.
@@ -308,45 +912,68 @@ interface ReferenceDeDialogue<R> {
308
912
  * Le socle n'en reecrit aucune part.
309
913
  *
310
914
  * Ce qu'il ajoute au CDK : le focus sur le dialogue, `aria-modal`, un fond inerte
311
- * qui laisse Echap fermer, et la fermeture a toute navigation du routeur.
312
- */
313
- declare class StDialog {
314
- private readonly cdk;
315
- private readonly overlay;
316
- /** Une fonction de fermeture par dialogue ouvert : c'est tout ce qu'il faut garder. */
317
- private readonly ouverts;
318
- constructor();
319
- /**
320
- * Ouvre un composant, ou un GABARIT.
321
- *
322
- * Un gabarit sert quand le contenu vit deja dans le composant appelant — un
323
- * tiroir de navigation qui deplace ses propres liens sur petit ecran. ⚠️ Son
324
- * injecteur reste celui de l'endroit ou il est ECRIT : un `st-dialog-title`
325
- * pose dedans ne recoit pas l'identifiant de titre, et le dialogue se nomme
326
- * alors par `etiquette`.
327
- */
328
- ouvrir<R = unknown, D = unknown>(composant: Type<unknown> | TemplateRef<unknown>, options?: OptionsDeDialogue<D>): ReferenceDeDialogue<R>;
329
- /**
330
- * ⚠️ Un tiroir occupe toute la hauteur du bord ou il s'ancre, et une feuille
331
- * inferieure toute la largeur. Sans cela, le panneau flotte au milieu et ne
332
- * se lit plus comme un tiroir.
333
- */
334
- private geometrie;
335
- private classes;
336
- /**
337
- * Demande une confirmation, et rend `true` seulement si elle est donnee.
338
- *
339
- * ⚠️ La fermeture par Echap ou par le fond rend `false` : quitter n'est pas
340
- * confirmer. C'est pourquoi la valeur est comparee explicitement plutot que
341
- * testee pour sa veracite — `undefined` doit valoir non.
342
- */
343
- confirmer(demande: DemandeDeConfirmation): Promise<boolean>;
344
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDialog, never>;
345
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<any>;
346
- }
347
-
348
- /**
349
- * Le panneau du dialogue : sa surface, son arrondi, son ombre.
915
+ * qui laisse Echap fermer, la croix standard (`fermable`), et la fermeture a toute navigation
916
+ * ABOUTIE du routeur — sauf pour un `alertdialog`, qui attend sa reponse
917
+ * (`survitALaNavigation`), et un dialogue `fermetureInterdite`.
918
+ *
919
+ * Mouvement (03 §3.5, lot 196) : le voile (`st-voile`, feuille des couches) et le
920
+ * panneau arrivent en fondu, le panneau monte de `--st-deplacement-moyen` ; un
921
+ * tiroir glisse depuis son bord. A la fermeture, panneau et voile partent
922
+ * ENSEMBLE en fondu, et la couche n'est detachee qu'a la fin de la transition —
923
+ * ou dans la meme tache quand la duree vaut zero (mouvement reduit, gel). Une
924
+ * fermeture par NAVIGATION est immediate : la page change dessous, un fondu la
925
+ * retarderait.
926
+ *
927
+ * ⚠️ Le focus revient au declencheur au DETACHEMENT, et non a la demande : tant que
928
+ * la couche est la, le CDK garde le reste de la page en `aria-hidden`, et un focus
929
+ * pose dans une region masquee n'est pas annonce. L'attente est bornee par la
930
+ * duree de sortie (120 ms), nulle sous mouvement reduit.
931
+ */
932
+ export declare class StDialog {
933
+ private readonly cdk;
934
+ private readonly overlay;
935
+ /** Identifiants prefixes par l'APP_ID (lot 228) : deux applications dans la page n'ont plus le meme titre. */
936
+ private readonly identifiants;
937
+ /** Une fonction de fermeture par dialogue ouvert : c'est tout ce qu'il faut garder. */
938
+ private readonly ouverts;
939
+ constructor();
940
+ /**
941
+ * Ouvre un composant, ou un GABARIT.
942
+ *
943
+ * Un gabarit sert quand le contenu vit deja dans le composant appelant — un
944
+ * tiroir de navigation qui deplace ses propres liens sur petit ecran. Un
945
+ * `st-dialog-title` pose dedans le nomme (le conteneur lit son identifiant dans le DOM) ;
946
+ * sans titre, `etiquette` est OBLIGATOIRE : un dialogue encore sans nom une fois l'application
947
+ * stable est signale en developpement (`console.error`).
948
+ *
949
+ * ⚠️ Un titre DIFFERE (donnees chargees, `@defer`) ou encore vide exige aussi `etiquette` : le
950
+ * lecteur d'ecran annonce le nom au focus d'ouverture et ne le relit pas. `etiquette` nomme le
951
+ * dialogue a cet instant, puis le titre la remplace des qu'il porte un texte ; sans elle, un nom
952
+ * arrive apres le focus est averti en developpement (`console.warn`).
953
+ */
954
+ ouvrir<R = unknown, D = unknown>(composant: Type<unknown> | TemplateRef<unknown>, options?: OptionsDeDialogue<D>): ReferenceDeDialogue<R>;
955
+ /**
956
+ * ⚠️ Un tiroir occupe toute la hauteur du bord ou il s'ancre, et une feuille
957
+ * inferieure toute la largeur. Sans cela, le panneau flotte au milieu et ne
958
+ * se lit plus comme un tiroir.
959
+ */
960
+ private geometrie;
961
+ private classes;
962
+ /**
963
+ * Demande une confirmation, et rend `true` seulement si elle est donnee.
964
+ *
965
+ * ⚠️ La fermeture par Echap ou par le fond rend `false` : quitter n'est pas
966
+ * confirmer. C'est pourquoi la valeur est comparee explicitement plutot que
967
+ * testee pour sa veracite — `undefined` doit valoir non.
968
+ */
969
+ confirmer(demande: DemandeDeConfirmation): Promise<boolean>;
970
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDialog, never>;
971
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
972
+ }
973
+ /** Forme du panneau : dialogue centre, tiroir lateral, feuille inferieure. */
974
+ export type FormeDuPanneauDeDialogue = 'dialogue' | 'tiroir' | 'feuille';
975
+ /**
976
+ * Le panneau du dialogue : sa surface, son filet, son arrondi, son ombre.
350
977
  *
351
978
  * ⚠️ Pourquoi ce composant existe. `CdkDialogContainer` n'a **aucune
352
979
  * apparence** : c'est voulu de la part du CDK, qui ne decide d'aucun style. Le
@@ -360,29 +987,141 @@ declare class StDialog {
360
987
  * l'oubli ne se verrait qu'a l'ecran. Ici, l'apparence voyage avec le
361
988
  * composant.
362
989
  *
990
+ * Nom accessible (lot 229, A1204 et revue) : `aria-labelledby` vise le titre REELLEMENT rendu
991
+ * dans le panneau (`st-dialog-title`), jamais un identifiant pendant ; sans titre, `aria-label`
992
+ * porte `etiquette`. Le titre l'emporte, comme `OptionsDeDialogue.etiquette` le dit. Les
993
+ * attributs viennent de la `DialogConfig` PUBLIQUE injectee, plus du `_config` interne du CDK.
994
+ *
995
+ * ⚠️ Le nom est ECRIT sur l'hote dans la phase `write` de chaque rendu, et non par une liaison
996
+ * d'hote nourrie d'un signal : le CDK pose le focus d'ouverture dans un `afterNextRender` de phase
997
+ * `mixedReadWrite`, qui suit `write` et precede `read` dans le MEME rendu. Lu en `read` puis lie,
998
+ * le nom n'arrivait qu'au rendu suivant, le focus deja pose : le lecteur d'ecran annoncait
999
+ * « dialogue », sans nom, et ne le relisait pas.
1000
+ *
1001
+ * Le titre ne nomme que s'il porte un TEXTE : un titre lie a des donnees encore absentes rendrait
1002
+ * un nom vide au focus d'ouverture ; `etiquette` nomme alors le dialogue jusqu'a l'arrivee du
1003
+ * texte (revue 2 du lot 229).
1004
+ *
1005
+ * Controles de developpement, une fois l'application stable (titre differe par `@defer`, une
1006
+ * requete ou une macro-tache compris) : un dialogue au nom encore vide est signale
1007
+ * (`console.error`) ; un nom arrive APRES le focus d'ouverture est averti (`console.warn` : le
1008
+ * lecteur d'ecran a annonce « dialogue » sans nom et ne relit pas ; poser `etiquette`) ; un
1009
+ * dialogue au fond inerte (`fermetureInterdite`, `fondInerte`) sans aucune sortie visible (ni
1010
+ * `[stDialogClose]`, croix comprise, ni bouton dans `st-dialog-actions`) est signale
1011
+ * (`console.error`) : c'est une impasse (WCAG 2.1.2).
1012
+ *
363
1013
  * L'encapsulation reste EMULEE : seuls l'hote et le panneau qui l'enveloppe
364
1014
  * sont styles, par `:host` et `:host-context()`. Aucun contenu projete n'est
365
1015
  * vise, donc rien ne justifie de rendre ces styles globaux.
366
1016
  */
367
- declare class StDialogContainer extends CdkDialogContainer {
368
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDialogContainer, never>;
369
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StDialogContainer, "st-dialog-container", never, {}, {}, never, never, true, never>;
1017
+ export declare class StDialogContainer extends CdkDialogContainer {
1018
+ protected readonly configuration: DialogConfig<unknown, unknown, import("@angular/cdk/dialog").DialogContainer>;
1019
+ protected readonly forme: FormeDuPanneauDeDialogue;
1020
+ constructor();
1021
+ /**
1022
+ * Controles de developpement, APRES stabilisation : un titre differe (donnees chargees, `@defer`,
1023
+ * macro-tache) n'est pas un nom absent. Attendre la stabilite, une macro-tache, puis la stabilite
1024
+ * a nouveau couvre ce qui s'enregistre comme tache en attente (requetes, `@defer`, rendus
1025
+ * planifies) et ce qu'une macro-tache immediate declenche. `console.error` et non une exception :
1026
+ * un `ErrorHandler` strict ne doit pas faire d'un nom tardif un echec d'application.
1027
+ *
1028
+ * ⚠️ Chaque attente est COURUE contre la destruction : une tache en attente qui ne finit jamais
1029
+ * (flux SSE, sondage long) laissait `whenStable()` pendant, et la fermeture retenue garder
1030
+ * l'hote detache et tout son contenu (revue 2 du lot 229).
1031
+ */
1032
+ private controlerEnDeveloppement;
1033
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDialogContainer, never>;
1034
+ static ɵcmp: i0.ɵɵComponentDeclaration<StDialogContainer, "st-dialog-container", never, {}, {}, never, never, true, never>;
370
1035
  }
371
-
1036
+ /** Niveau du titre : 2 par defaut, la page dessous a deja son `h1`. */
1037
+ export type NiveauDeTitreDeDialogue = 2 | 3 | 4;
1038
+ /**
1039
+ * Forme de l'en-tete, deduite des entrees (planche 5) :
1040
+ * - `simple` : titre seul (et sous-titre discret) ;
1041
+ * - `tuile` : `icone` dans une tuile de 36 px, sous-titre discret, filet PERMANENT sous l'en-tete ;
1042
+ * - `ton` : `ton` autre que `neutre` : icone de ton nue, surtitre en capitales dans la couleur du
1043
+ * ton, sans filet (dialogue de confirmation).
1044
+ */
1045
+ export type FormeDEnteteDeDialogue = 'simple' | 'tuile' | 'ton';
372
1046
  /**
373
- * Titre du dialogue. Il porte l'identifiant que la configuration a designe en
374
- * `aria-labelledby` : c'est lui qui NOMME le dialogue.
1047
+ * En-tete du dialogue : son titre, qui NOMME le dialogue, et la croix standard.
1048
+ *
1049
+ * ```html
1050
+ * <st-dialog-title icone="utilisateur-crayon" sousTitre="Mandat ISO-20022">
1051
+ * Modifier le beneficiaire
1052
+ * </st-dialog-title>
1053
+ * <st-dialog-title ton="danger" icone="triangle-alerte" sousTitre="Action definitive">
1054
+ * Revoquer l'acces a ce terminal ?
1055
+ * </st-dialog-title>
1056
+ * ```
1057
+ *
1058
+ * ⚠️ Un `h2` par defaut et non un `h1` : le dialogue s'ouvre par-dessus une page qui a deja son
1059
+ * titre de niveau 1, et deux `h1` cassent la table des matieres des lecteurs d'ecran. `niveau`
1060
+ * le change pour un dialogue pose dans une section plus profonde.
375
1061
  *
376
- * ⚠️ Un `h2` et non un `h1` : le dialogue s'ouvre par-dessus une page qui a
377
- * deja son titre de niveau 1, et deux `h1` cassent la table des matieres que
378
- * les lecteurs d'ecran construisent.
1062
+ * L'identifiant du titre est celui que `StDialog` fournit (composant comme gabarit : le CDK leur
1063
+ * donne l'injecteur du dialogue), a defaut un identifiant forge ici (vitrine) : le conteneur le lit
1064
+ * dans son DOM pour poser `aria-labelledby` (lot 229, A1204).
1065
+ *
1066
+ * La croix (`fermeture`) : `button[stIconButton][stDialogClose]` de 44 px, glyphe de 20 qui
1067
+ * affleure la marge du texte. Par defaut, elle suit le dialogue : presente s'il est `fermable`,
1068
+ * absente d'un `alertdialog` et d'un dialogue `fermetureInterdite` (ADR 0005 D54), qui ne la
1069
+ * rendent JAMAIS, meme demandee. Hors d'un dialogue (vitrine), elle n'apparait que sur
1070
+ * `[fermeture]="true"`. L'emplacement `[fermeture]` recoit une fermeture propre au lieu de la
1071
+ * croix (poser alors `[fermeture]="false"`).
379
1072
  */
380
- declare class StDialogTitle {
381
- protected readonly identifiant: string | null;
382
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDialogTitle, never>;
383
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StDialogTitle, "st-dialog-title", never, {}, {}, never, ["*"], true, never>;
1073
+ export declare class StDialogTitle {
1074
+ private readonly contexte;
1075
+ private readonly dansUnDialogue;
1076
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
1077
+ protected readonly identifiant: string;
1078
+ /** Icone de l'en-tete : en tuile, ou nue dans la couleur du `ton`. */
1079
+ readonly icone: import("@angular/core").InputSignal<"accessibilite" | "appareils" | "arborescence" | "asterisque" | "badge-coche" | "banque" | "batiment" | "bifurcation" | "billets" | "billets-envoi" | "billets-pile" | "boite" | "boite-de-reception" | "bouclier" | "bouclier-alerte" | "bouclier-coche" | "bouclier-coeur" | "bouclier-croix" | "bouclier-moitie" | "bouclier-recherche" | "bouclier-utilisateur" | "boussole" | "bouton-curseur" | "bulle-question" | "cadenas" | "cadenas-horloge" | "cadenas-ouvert" | "cadre-pied" | "cadre-texte" | "calendrier" | "calendrier-evenement" | "calendrier-horloge" | "calendrier-jour" | "calques" | "carte-bancaire" | "carte-bancaire-barre" | "carte-bancaire-cadenas" | "carte-contact" | "carte-identite" | "cartes-empilees" | "case-cochee" | "casse" | "cercle" | "cercle-alerte" | "cercle-chevron-bas" | "cercle-coche" | "cercle-coche-ouvert" | "cercle-croix" | "cercle-info" | "cercle-moins" | "cercle-plus" | "cercle-question" | "certificat" | "chandelier" | "chargement" | "cheque" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "chevrons-droite" | "chevrons-haut-bas" | "cle" | "cloche" | "cloche-sonnerie" | "coche" | "code" | "code-qr" | "code-qr-scanner" | "coffre-fort" | "colonnes" | "connexion" | "contraste" | "copie" | "corbeille" | "corbeille-croix" | "courriel" | "crayon" | "croix" | "curseur-clic" | "deconnexion" | "devise" | "disposition" | "dollar" | "dossier" | "dossier-barre" | "dossier-ouvert" | "double-coche" | "echange" | "eclair" | "empreinte-digitale" | "enregistrer" | "entree" | "envoyer" | "epaisseur-de-trait" | "epingle" | "etoile" | "euro" | "fichier" | "fichier-image" | "fichier-pdf" | "fichier-texte" | "filtre" | "filtre-barre" | "filtre-lignes" | "fleche-bas" | "fleche-bas-gauche" | "fleche-bas-ligne" | "fleche-droite" | "fleche-gauche" | "fleche-haut" | "fleche-haut-droite" | "fleche-haut-ligne" | "fleche-large-haut" | "fleches-gauche-droite" | "flocon" | "flou" | "formes" | "globe" | "graphique-anneau" | "graphique-barres" | "graphique-barres-cadre" | "graphique-camembert" | "graphique-ligne" | "graphique-lignes" | "grille" | "grille-lignes" | "hexagone" | "historique" | "horloge" | "horloge-fleche" | "iban" | "imprimer" | "interdit" | "jalons" | "jauge" | "lien" | "lien-externe" | "lignes" | "lignes-crayon" | "liste" | "liste-coche" | "liste-controle" | "liste-numerotee" | "luminosite" | "lune" | "maillet" | "maison" | "marque-page" | "menu" | "menu-ouvert" | "message" | "minuteur" | "mise-au-point" | "mise-en-page-image" | "moins" | "nuage-barre" | "nuage-televerser" | "octogone-alerte" | "oeil" | "oeil-barre" | "panneau-gauche" | "parametres" | "parapluie" | "parchemin" | "pieces" | "plus" | "pointeur" | "points" | "points-verticaux" | "portefeuille" | "portefeuille-cartes" | "presse-papiers-coche" | "presse-papiers-horloge" | "priorite-haute" | "rafraichir" | "recherche" | "recherche-barre" | "recherche-texte" | "rectangle-points" | "recu" | "redemarrer" | "reglages" | "regle" | "reseau-jauge" | "rotation-arriere" | "routeur" | "sablier" | "sablier-bas" | "sablier-haut" | "sac-argent" | "sans-contact" | "serveur" | "soleil" | "style-de-trait" | "synchro" | "synchro-probleme" | "tableau" | "tableau-de-bord" | "tableau-de-bord-plus" | "tablette" | "tabulation" | "telecharger" | "telephone-mobile" | "televerser" | "tendance-baisse" | "tendance-hausse" | "terminal" | "tirelire" | "triangle-alerte" | "triangle-bas" | "triangle-haut" | "trombone" | "utilisateur" | "utilisateur-crayon" | "utilisateurs" | "wifi" | "wifi-barre" | null>;
1080
+ /** Ton de l'en-tete (confirmation, alerte) : icone et surtitre dans sa couleur. */
1081
+ readonly ton: import("@angular/core").InputSignal<TonSemantique>;
1082
+ /** Ligne sous le titre : reference, contexte. En capitales sous un `ton`. */
1083
+ readonly sousTitre: import("@angular/core").InputSignal<string | null>;
1084
+ readonly niveau: import("@angular/core").InputSignal<NiveauDeTitreDeDialogue>;
1085
+ /**
1086
+ * Croix standard ; `undefined` : celle du dialogue (`fermable`), absente hors dialogue. Un
1087
+ * attribut nu (`fermeture`) vaut vrai, comme toute entree booleenne du socle (audit du
1088
+ * 2026-09-27, Q-16).
1089
+ */
1090
+ readonly fermeture: import("@angular/core").InputSignalWithTransform<boolean | undefined, unknown>;
1091
+ protected readonly forme: import("@angular/core").Signal<FormeDEnteteDeDialogue>;
1092
+ /** Sous un `ton` sans icone ecrite, l'icone du ton (table unique du socle). */
1093
+ protected readonly iconeRendue: import("@angular/core").Signal<"accessibilite" | "appareils" | "arborescence" | "asterisque" | "badge-coche" | "banque" | "batiment" | "bifurcation" | "billets" | "billets-envoi" | "billets-pile" | "boite" | "boite-de-reception" | "bouclier" | "bouclier-alerte" | "bouclier-coche" | "bouclier-coeur" | "bouclier-croix" | "bouclier-moitie" | "bouclier-recherche" | "bouclier-utilisateur" | "boussole" | "bouton-curseur" | "bulle-question" | "cadenas" | "cadenas-horloge" | "cadenas-ouvert" | "cadre-pied" | "cadre-texte" | "calendrier" | "calendrier-evenement" | "calendrier-horloge" | "calendrier-jour" | "calques" | "carte-bancaire" | "carte-bancaire-barre" | "carte-bancaire-cadenas" | "carte-contact" | "carte-identite" | "cartes-empilees" | "case-cochee" | "casse" | "cercle" | "cercle-alerte" | "cercle-chevron-bas" | "cercle-coche" | "cercle-coche-ouvert" | "cercle-croix" | "cercle-info" | "cercle-moins" | "cercle-plus" | "cercle-question" | "certificat" | "chandelier" | "chargement" | "cheque" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "chevrons-droite" | "chevrons-haut-bas" | "cle" | "cloche" | "cloche-sonnerie" | "coche" | "code" | "code-qr" | "code-qr-scanner" | "coffre-fort" | "colonnes" | "connexion" | "contraste" | "copie" | "corbeille" | "corbeille-croix" | "courriel" | "crayon" | "croix" | "curseur-clic" | "deconnexion" | "devise" | "disposition" | "dollar" | "dossier" | "dossier-barre" | "dossier-ouvert" | "double-coche" | "echange" | "eclair" | "empreinte-digitale" | "enregistrer" | "entree" | "envoyer" | "epaisseur-de-trait" | "epingle" | "etoile" | "euro" | "fichier" | "fichier-image" | "fichier-pdf" | "fichier-texte" | "filtre" | "filtre-barre" | "filtre-lignes" | "fleche-bas" | "fleche-bas-gauche" | "fleche-bas-ligne" | "fleche-droite" | "fleche-gauche" | "fleche-haut" | "fleche-haut-droite" | "fleche-haut-ligne" | "fleche-large-haut" | "fleches-gauche-droite" | "flocon" | "flou" | "formes" | "globe" | "graphique-anneau" | "graphique-barres" | "graphique-barres-cadre" | "graphique-camembert" | "graphique-ligne" | "graphique-lignes" | "grille" | "grille-lignes" | "hexagone" | "historique" | "horloge" | "horloge-fleche" | "iban" | "imprimer" | "interdit" | "jalons" | "jauge" | "lien" | "lien-externe" | "lignes" | "lignes-crayon" | "liste" | "liste-coche" | "liste-controle" | "liste-numerotee" | "luminosite" | "lune" | "maillet" | "maison" | "marque-page" | "menu" | "menu-ouvert" | "message" | "minuteur" | "mise-au-point" | "mise-en-page-image" | "moins" | "nuage-barre" | "nuage-televerser" | "octogone-alerte" | "oeil" | "oeil-barre" | "panneau-gauche" | "parametres" | "parapluie" | "parchemin" | "pieces" | "plus" | "pointeur" | "points" | "points-verticaux" | "portefeuille" | "portefeuille-cartes" | "presse-papiers-coche" | "presse-papiers-horloge" | "priorite-haute" | "rafraichir" | "recherche" | "recherche-barre" | "recherche-texte" | "rectangle-points" | "recu" | "redemarrer" | "reglages" | "regle" | "reseau-jauge" | "rotation-arriere" | "routeur" | "sablier" | "sablier-bas" | "sablier-haut" | "sac-argent" | "sans-contact" | "serveur" | "soleil" | "style-de-trait" | "synchro" | "synchro-probleme" | "tableau" | "tableau-de-bord" | "tableau-de-bord-plus" | "tablette" | "tabulation" | "telecharger" | "telephone-mobile" | "televerser" | "tendance-baisse" | "tendance-hausse" | "terminal" | "tirelire" | "triangle-alerte" | "triangle-bas" | "triangle-haut" | "trombone" | "utilisateur" | "utilisateur-crayon" | "utilisateurs" | "wifi" | "wifi-barre" | null>;
1094
+ protected readonly tonDeLIcone: import("@angular/core").Signal<TonSemantique>;
1095
+ protected readonly croix: import("@angular/core").Signal<boolean>;
1096
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDialogTitle, never>;
1097
+ static ɵcmp: i0.ɵɵComponentDeclaration<StDialogTitle, "st-dialog-title", never, {
1098
+ "icone": {
1099
+ "alias": "icone";
1100
+ "required": false;
1101
+ "isSignal": true;
1102
+ };
1103
+ "ton": {
1104
+ "alias": "ton";
1105
+ "required": false;
1106
+ "isSignal": true;
1107
+ };
1108
+ "sousTitre": {
1109
+ "alias": "sousTitre";
1110
+ "required": false;
1111
+ "isSignal": true;
1112
+ };
1113
+ "niveau": {
1114
+ "alias": "niveau";
1115
+ "required": false;
1116
+ "isSignal": true;
1117
+ };
1118
+ "fermeture": {
1119
+ "alias": "fermeture";
1120
+ "required": false;
1121
+ "isSignal": true;
1122
+ };
1123
+ }, {}, never, ["*", "[fermeture]"], true, never>;
384
1124
  }
385
-
386
1125
  /**
387
1126
  * Corps du dialogue, defilant quand il deborde.
388
1127
  *
@@ -391,70 +1130,149 @@ declare class StDialogTitle {
391
1130
  * l'ecran est le defaut classique, et il ne se voit qu'a 200 % d'echelle ou sur
392
1131
  * un ecran bas.
393
1132
  *
394
- * ⚠️ **Focalisable seulement quand il defile.** Une zone defilante sans
1133
+ * Sa hauteur DERIVE du panneau (lot 229, A1443) : il prend la place que le titre et les actions
1134
+ * laissent (`flex: 1 1 auto`), le panneau portant la hauteur maximale (dialogue centre :
1135
+ * `100dvh - 48 px` ; tiroir : pleine hauteur). L'ancien plafond de `60vh` laissait un tiroir a
1136
+ * moitie vide sous ses actions.
1137
+ *
1138
+ * ⚠️ **Focalisable et nomme seulement quand il defile.** Une zone defilante sans
395
1139
  * controle doit recevoir le focus, sinon le clavier ne peut pas la faire
396
- * defiler — le texte d'une condition generale, par exemple. Mais la premiere
1140
+ * defiler — le texte d'une condition generale, par exemple ; elle devient alors une
1141
+ * `region` nommee, pour que le lecteur d'ecran dise ou le focus s'est pose. Mais la premiere
397
1142
  * version posait `tabindex="0"` sans condition : sur un dialogue court, la zone
398
1143
  * de texte devenait le premier arret de tabulation, AVANT le bouton
399
1144
  * d'annulation, contrairement a ce que `StConfirmDialog` affirmait.
1145
+ *
1146
+ * Rembourrage `md` : 16 / 24 sous un en-tete simple ou de ton, 24 sous un en-tete a filet
1147
+ * permanent (forme `tuile`), comme la planche 5.
1148
+ *
1149
+ * Quand il defile, deux filets capillaires l'encadrent (planche 5) : deux elements a part, hors
1150
+ * de la zone qui defile, comme les sentinelles de la planche. `data-defile-haut` et
1151
+ * `data-defile-bas`, sur l'hote, disent s'il reste du contenu au-dessus ou au-dessous (lisibles
1152
+ * par une feuille d'application). La zone qui defile est `.st-dialog-content__corps`.
400
1153
  */
401
- declare class StDialogContent {
402
- /** `aucun` pour un contenu qui gere ses propres marges, comme un tableau. */
403
- readonly rembourrage: _angular_core.InputSignal<"aucun" | "md">;
404
- protected readonly defilante: _angular_core.WritableSignal<boolean>;
405
- constructor();
406
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDialogContent, never>;
407
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StDialogContent, "st-dialog-content", never, { "rembourrage": { "alias": "rembourrage"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1154
+ export declare class StDialogContent {
1155
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
1156
+ /** `aucun` pour un contenu qui gere ses propres marges, comme un tableau. */
1157
+ readonly rembourrage: import("@angular/core").InputSignal<"md" | "aucun">;
1158
+ protected readonly defilante: import("@angular/core").WritableSignal<boolean>;
1159
+ protected readonly resteAuDessus: import("@angular/core").WritableSignal<boolean>;
1160
+ protected readonly resteAuDessous: import("@angular/core").WritableSignal<boolean>;
1161
+ /** Precede d'un en-tete a filet permanent (forme `tuile`) : le corps y respire de 24 px. */
1162
+ protected readonly apresUnFilet: import("@angular/core").WritableSignal<boolean>;
1163
+ private readonly corps;
1164
+ constructor();
1165
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDialogContent, never>;
1166
+ static ɵcmp: i0.ɵɵComponentDeclaration<StDialogContent, "st-dialog-content", never, {
1167
+ "rembourrage": {
1168
+ "alias": "rembourrage";
1169
+ "required": false;
1170
+ "isSignal": true;
1171
+ };
1172
+ }, {}, never, ["*"], true, never>;
408
1173
  }
409
-
410
1174
  /**
411
- * Barre d'actions du dialogue.
1175
+ * Barre d'actions du dialogue : pied teinte a filet permanent (planche 5), actions a la fin.
412
1176
  *
413
1177
  * ⚠️ L'action de confirmation est a DROITE et l'annulation a gauche, dans cet
414
1178
  * ordre dans le DOM : l'ordre de tabulation doit suivre l'ordre visuel, sinon
415
1179
  * le clavier et la souris ne donnent pas le meme parcours. Inverser
416
- * visuellement par `row-reverse` casserait cette correspondance.
1180
+ * visuellement par `row-reverse` casserait cette correspondance. Une action
1181
+ * primaire ou destructrice posee EN PREMIER parmi plusieurs avertit en developpement.
1182
+ *
1183
+ * Sous `sm` (480 px), les actions s'empilent en pleine largeur, dans l'ordre du DOM : la
1184
+ * confirmation en bas, sous le pouce.
1185
+ */
1186
+ export declare class StDialogActions {
1187
+ readonly alignement: import("@angular/core").InputSignal<"debut" | "fin" | "entre">;
1188
+ constructor();
1189
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDialogActions, never>;
1190
+ static ɵcmp: i0.ɵɵComponentDeclaration<StDialogActions, "st-dialog-actions", never, {
1191
+ "alignement": {
1192
+ "alias": "alignement";
1193
+ "required": false;
1194
+ "isSignal": true;
1195
+ };
1196
+ }, {}, never, ["*"], true, never>;
1197
+ }
1198
+ /**
1199
+ * Ferme le dialogue qui le contient avec un resultat : une ACTION (« Annuler », « Rester
1200
+ * connecte »), ou la croix standard posee a la main dans un gabarit sans `st-dialog-title`.
1201
+ *
1202
+ * ```html
1203
+ * <button stButton variante="secondaire" [stDialogClose]="false">Annuler</button>
1204
+ * <button stIconButton stDialogClose icone="croix" etiquette="Fermer"></button>
1205
+ * ```
1206
+ *
1207
+ * - `type="button"` FORCE : dans un formulaire, un bouton sans type soumet, et la fermeture
1208
+ * enverrait le formulaire qu'elle devait abandonner.
1209
+ * - La valeur de l'attribut est le RESULTAT de la fermeture ; ecrit nu (`stDialogClose`), il n'y en
1210
+ * a pas (`undefined`, comme Echap).
1211
+ * - JAMAIS masque (ADR 0005 D54) : `fermable` ne gouverne que la croix de `st-dialog-title`. Un
1212
+ * `alertdialog` ou un dialogue `fermetureInterdite` ne se ferme QUE par ses actions : les masquer
1213
+ * laissait un dialogue sans reponse possible (revue du lot 229). Poser une croix a la main dans
1214
+ * un dialogue qui exige une reponse est une decision de l'appelant.
1215
+ * - Le focus revient au declencheur par le CDK (`restoreFocus`), comme pour toute fermeture.
1216
+ *
1217
+ * Hors d'un dialogue (vitrine de galerie), le clic ne fait rien : il n'y a rien a fermer.
417
1218
  */
418
- declare class StDialogActions {
419
- readonly alignement: _angular_core.InputSignal<"debut" | "fin" | "entre">;
420
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDialogActions, never>;
421
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StDialogActions, "st-dialog-actions", never, { "alignement": { "alias": "alignement"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1219
+ export declare class StDialogClose {
1220
+ private readonly reference;
1221
+ /** Resultat rendu a l'appelant ; une chaine vide (attribut nu) vaut « aucun resultat ». */
1222
+ readonly stDialogClose: import("@angular/core").InputSignal<unknown>;
1223
+ protected fermer(): void;
1224
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDialogClose, never>;
1225
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StDialogClose, "button[stDialogClose]", never, {
1226
+ "stDialogClose": {
1227
+ "alias": "stDialogClose";
1228
+ "required": false;
1229
+ "isSignal": true;
1230
+ };
1231
+ }, {}, never, never, true, never>;
422
1232
  }
423
-
424
1233
  /** Action offerte dans le message, comme « Annuler ». */
425
- interface ActionDeToast {
426
- readonly libelle: string;
427
- readonly faire: () => void;
1234
+ export interface ActionDeToast {
1235
+ readonly libelle: string;
1236
+ readonly faire: () => void;
428
1237
  }
429
1238
  /** Ce que l'appelant demande a afficher. */
430
- interface DemandeDeToast {
431
- /**
432
- * ⚠️ Aucune donnee personnelle complete : un message reste a l'ecran le temps
433
- * qu'il faut pour etre lu — et lu par-dessus l'epaule. Un IBAN, un numero de
434
- * carte ou de telephone s'y ecrivent masques, comme le fait `st-masked`.
435
- */
436
- readonly message: string;
437
- readonly ton?: TonSemantique;
438
- /**
439
- * ⚠️ Un message porteur d'action ne disparait PAS tout seul. WCAG 2.2.1 :
440
- * un contenu qui s'efface sur minuterie doit pouvoir etre prolonge ou
441
- * desactive. Un « Annuler » qui s'evanouit en quatre secondes est inutilisable
442
- * pour qui lit lentement, navigue au clavier ou emploie un lecteur d'ecran —
443
- * et c'est precisement la personne a qui l'annulation sert le plus.
444
- */
445
- readonly action?: ActionDeToast;
446
- /**
447
- * Duree d'affichage en millisecondes. Ignoree des qu'une action est fournie.
448
- * `null` : le message reste jusqu'a sa fermeture.
449
- */
450
- readonly dureeMs?: number | null;
1239
+ export interface DemandeDeToast {
1240
+ /**
1241
+ * ⚠️ Aucune donnee personnelle complete : un message reste a l'ecran le temps
1242
+ * qu'il faut pour etre lu — et lu par-dessus l'epaule. Un IBAN, un numero de
1243
+ * carte ou de telephone s'y ecrivent masques, comme le fait `st-masked`.
1244
+ */
1245
+ readonly message: string;
1246
+ /**
1247
+ * Titre court, en gras au-dessus du message (planche 5). Optionnel : une confirmation tient
1248
+ * souvent en une phrase, et un titre qui la repete n'apporte rien.
1249
+ */
1250
+ readonly titre?: string;
1251
+ /**
1252
+ * `primaire` est accepte et rendu comme `information`. `danger` reste a l'ecran jusqu'a sa
1253
+ * fermeture, sauf `dureeMs` explicite : une erreur doit etre lue.
1254
+ */
1255
+ readonly ton?: TonSemantique;
1256
+ /**
1257
+ * ⚠️ Un message porteur d'action ne disparait PAS tout seul. WCAG 2.2.1 :
1258
+ * un contenu qui s'efface sur minuterie doit pouvoir etre prolonge ou
1259
+ * desactive. Un « Annuler » qui s'evanouit en quatre secondes est inutilisable
1260
+ * pour qui lit lentement, navigue au clavier ou emploie un lecteur d'ecran —
1261
+ * et c'est precisement la personne a qui l'annulation sert le plus.
1262
+ */
1263
+ readonly action?: ActionDeToast;
1264
+ /**
1265
+ * Duree d'affichage en millisecondes. Ignoree des qu'une action est fournie.
1266
+ * `null` : le message reste jusqu'a sa fermeture, par un bouton « Ignorer ». Absente :
1267
+ * `rythme.tenue.toast`, sauf pour `danger`, persistant par defaut.
1268
+ */
1269
+ readonly dureeMs?: number | null;
451
1270
  }
452
1271
  /** Un message affiche, tel que le conteneur le connait. */
453
- interface Toast extends DemandeDeToast {
454
- readonly identifiant: number;
455
- readonly ton: TonSemantique;
1272
+ export interface Toast extends DemandeDeToast {
1273
+ readonly identifiant: number;
1274
+ readonly ton: TonSemantique;
456
1275
  }
457
-
458
1276
  /**
459
1277
  * Messages ephemeres.
460
1278
  *
@@ -462,14 +1280,24 @@ interface Toast extends DemandeDeToast {
462
1280
  * const messages = inject(StToast);
463
1281
  * messages.montrer({ message: 'Virement enregistre', ton: 'succes' });
464
1282
  * messages.montrer({
465
- * message: 'Beneficiaire supprime',
1283
+ * titre: 'Beneficiaire supprime',
1284
+ * message: 'Il ne recevra plus de virement.',
466
1285
  * action: { libelle: 'Annuler', faire: () => this.retablir() },
467
1286
  * });
468
1287
  * ```
469
1288
  *
470
- * ⚠️ **Un seul conteneur pour toute l'application**, cree a la premiere
471
- * demande. Deux piles superposees se recouvrent, et la seconde masque la
472
- * premiere sans que rien ne le signale.
1289
+ * ⚠️ **Une seule pile pour toute l'application**, creee a la premiere demande, et
1290
+ * par ce service seulement : la pile n'est pas un composant public. Deux piles
1291
+ * superposees se recouvrent, et doublent les regions vivantes.
1292
+ *
1293
+ * ⚠️ **Au-dessus de tout, toujours.** La pile vit dans son PROPRE hote, enfant de
1294
+ * `<body>`, porteur de `popover="manual"` et montre par `showPopover()` : la couche
1295
+ * superieure du navigateur. Les volets du CDK y vivent aussi, et le dernier montre
1296
+ * passe devant : chaque volet ajoute ensuite (un dialogue ouvert apres un message)
1297
+ * fait remonter la pile au sommet. Un message porteur d'action reste donc cliquable
1298
+ * sous un dialogue, et ses regions vivantes ne recoivent pas l'`aria-hidden` que le
1299
+ * dialogue du CDK pose sur le reste de la page (il epargne les porteurs de
1300
+ * `popover`). Sans `popover`, repli : `position: fixed` au plan des notifications.
473
1301
  *
474
1302
  * ⚠️ **A n'employer que pour ce qui peut etre manque.** Un message ephemere
475
1303
  * n'est pas une facon d'annoncer une erreur : si l'information compte, elle
@@ -477,85 +1305,127 @@ interface Toast extends DemandeDeToast {
477
1305
  * champ. La regle de tri : si la personne qui n'a pas vu le message est
478
1306
  * penalisee, ce n'est pas un toast.
479
1307
  */
480
- declare class StToast {
481
- private readonly overlay;
482
- private couche;
483
- private conteneur;
484
- constructor();
485
- /** Affiche un message. Rend son identifiant, pour pouvoir le retirer. */
486
- montrer(demande: DemandeDeToast): number;
487
- retirer(identifiant: number): void;
488
- private pile;
489
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StToast, never>;
490
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<any>;
491
- }
492
-
493
- /**
494
- * Pile des messages ephemeres. Un seul exemplaire, pose par `StToast`.
495
- *
496
- * ⚠️ **Les messages visibles ne portent AUCUN role.** L'annonce passe par deux
497
- * regions vivantes permanentes, creees vides avec le conteneur. La premiere
498
- * version posait `role="status"` sur chaque message insere avec son texte :
499
- * c'est la sequence que les lecteurs d'ecran n'annoncent pas de facon fiable,
500
- * puisqu'ils rapportent les CHANGEMENTS d'une region deja observee. Les
501
- * confirmations — le cas courant — risquaient le silence.
502
- *
503
- * ⚠️ Il ne prend JAMAIS le focus. Un message qui s'affiche pendant une saisie
504
- * et vole le curseur fait perdre la frappe en cours.
505
- */
506
- declare class StToastContainer {
507
- private readonly libelles;
508
- private readonly pile;
509
- private readonly minuteries;
510
- private readonly minuteriesDAnnonce;
511
- private compteur;
512
- protected readonly messages: _angular_core.Signal<readonly Toast[]>;
513
- protected readonly annoncePolie: _angular_core.WritableSignal<string>;
514
- protected readonly annonceAssertive: _angular_core.WritableSignal<string>;
515
- protected readonly libelleFermeture: _angular_core.Signal<string>;
516
- constructor();
517
- ajouter(demande: DemandeDeToast): number;
518
- retirer(identifiant: number): void;
519
- /**
520
- * ⚠️ La minuterie s'arrete au survol ET au focus. Sans la seconde, une
521
- * personne qui atteint le bouton au clavier le voit disparaitre sous son
522
- * doigt ; sans la premiere, celle qui lit lentement n'a aucun moyen de
523
- * retenir le message.
524
- */
525
- protected suspendre(identifiant: number): void;
526
- protected reprendre(identifiant: number): void;
527
- protected agir(toast: Toast): void;
528
- protected iconeDe(toast: Toast): NomDIcone;
529
- /**
530
- * ⚠️ Un message porteur d'action n'est JAMAIS evince. La premiere version
531
- * gardait les trois plus recents sans distinction : trois confirmations
532
- * successives faisaient disparaitre un « Annuler » en silence — exactement ce
533
- * que WCAG 2.2.1 interdit, et ce que le modele promettait d'eviter.
534
- *
535
- * Les plus anciens messages sans action partent d'abord. S'il ne reste que des
536
- * messages porteurs d'action, la borne cede : mieux vaut une pile haute qu'une
537
- * annulation perdue.
538
- */
539
- private borner;
540
- private annoncer;
541
- /**
542
- * Un message porteur d'action ne s'efface pas seul : voir `DemandeDeToast`,
543
- * et WCAG 2.2.1.
544
- */
545
- private programmer;
546
- private arreterLaMinuterie;
547
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StToastContainer, never>;
548
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StToastContainer, "st-toast-container", never, {}, {}, never, never, true, never>;
549
- }
550
-
1308
+ export declare class StToast {
1309
+ private readonly document;
1310
+ private readonly application;
1311
+ private readonly injecteur;
1312
+ private readonly volets;
1313
+ private conteneur;
1314
+ private observateur;
1315
+ private retirerLeSuiviDesPopovers;
1316
+ constructor();
1317
+ /** Affiche un message. Rend son identifiant, pour pouvoir le retirer. */
1318
+ montrer(demande: DemandeDeToast): number;
1319
+ retirer(identifiant: number): void;
1320
+ /**
1321
+ * Place le focus sur le message le plus recent (raccourci F6, bouton « Notifications » de la
1322
+ * coquille). Rend `false` quand il n'y a aucun message.
1323
+ */
1324
+ focaliser(): boolean;
1325
+ private pile;
1326
+ /** Remet la pile au sommet de la couche superieure : le dernier montre passe devant. */
1327
+ private remonter;
1328
+ /**
1329
+ * Chaque volet ajoute au conteneur du CDK (dialogue, menu, infobulle) se montre APRES la pile
1330
+ * dans la couche superieure : la pile remonte derriere lui. L'observateur rappelle apres la
1331
+ * tache qui a montre le volet, donc apres son `showPopover()`. Un volet RETIRE (dialogue ferme)
1332
+ * rappelle aussi : `data-dialogue-ouvert` doit retomber quand plus aucun n'est modal. Un popover
1333
+ * montre ailleurs dans la page la fait remonter de meme (lot 233, reste).
1334
+ */
1335
+ private suivreLesVolets;
1336
+ static ɵfac: i0.ɵɵFactoryDeclaration<StToast, never>;
1337
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
1338
+ }
1339
+ /**
1340
+ * Comment un message se ferme : la croix (message temporise, ou porteur d'action), ou un bouton
1341
+ * « Ignorer » en texte (message persistant sans action, planche 5).
1342
+ */
1343
+ export type FermetureDeToast = 'croix' | 'ignorer';
1344
+ /**
1345
+ * UN message ephemere, tel que la pile le dessine : barre de ton de 3 px au bord de depart, icone
1346
+ * pleine de 20 px alignee sur la premiere ligne, titre optionnel, message, action en texte et
1347
+ * fermeture (planche 5, module 5.4).
1348
+ *
1349
+ * ⚠️ **Piece de rendu, pas un moyen d'afficher un message.** En application, un message passe par
1350
+ * `StToast.montrer()` : c'est la pile qui l'annonce (regions vivantes permanentes), le temporise,
1351
+ * le borne et rend le focus a sa fermeture. Pose seul dans une page, ce composant n'annonce rien
1352
+ * et ne part jamais. Il est public pour qu'une vitrine (banc, documentation) le montre en place.
1353
+ *
1354
+ * Il ne porte AUCUN role : voir `StToast`.
1355
+ */
1356
+ export declare class StToastMessage {
1357
+ private readonly libelles;
1358
+ readonly ton: import("@angular/core").InputSignal<TonSemantique>;
1359
+ readonly titre: import("@angular/core").InputSignal<string | null | undefined>;
1360
+ readonly message: import("@angular/core").InputSignal<string>;
1361
+ /** Libelle de l'action (un verbe : « Annuler », « Consulter ») ; absent : aucune action. */
1362
+ readonly libelleDAction: import("@angular/core").InputSignal<string | null | undefined>;
1363
+ readonly fermeture: import("@angular/core").InputSignal<FermetureDeToast>;
1364
+ /** L'action a ete activee. */
1365
+ readonly action: import("@angular/core").OutputEmitterRef<void>;
1366
+ /** La croix ou « Ignorer » a ete activee. */
1367
+ readonly retrait: import("@angular/core").OutputEmitterRef<void>;
1368
+ /** `primaire` se dessine comme `information` (brief 13). */
1369
+ protected readonly tonRendu: import("@angular/core").Signal<"neutre" | "information" | "succes" | "avertissement" | "danger">;
1370
+ /** Icone pleine au ton ; le neutre garde le contour, sans couleur de statut. */
1371
+ protected readonly icone: import("@angular/core").Signal<Icone>;
1372
+ protected readonly libelleFermeture: import("@angular/core").Signal<string>;
1373
+ protected readonly libelleIgnorer: import("@angular/core").Signal<string>;
1374
+ static ɵfac: i0.ɵɵFactoryDeclaration<StToastMessage, never>;
1375
+ static ɵcmp: i0.ɵɵComponentDeclaration<StToastMessage, "st-toast-message", never, {
1376
+ "ton": {
1377
+ "alias": "ton";
1378
+ "required": false;
1379
+ "isSignal": true;
1380
+ };
1381
+ "titre": {
1382
+ "alias": "titre";
1383
+ "required": false;
1384
+ "isSignal": true;
1385
+ };
1386
+ "message": {
1387
+ "alias": "message";
1388
+ "required": true;
1389
+ "isSignal": true;
1390
+ };
1391
+ "libelleDAction": {
1392
+ "alias": "libelleDAction";
1393
+ "required": false;
1394
+ "isSignal": true;
1395
+ };
1396
+ "fermeture": {
1397
+ "alias": "fermeture";
1398
+ "required": false;
1399
+ "isSignal": true;
1400
+ };
1401
+ }, {
1402
+ "action": "action";
1403
+ "retrait": "retrait";
1404
+ }, never, never, true, never>;
1405
+ }
551
1406
  /** Reponse donnee a l'avertissement. */
552
- type ReponseDInactivite = 'prolonger' | 'deconnecter';
1407
+ export type ReponseDInactivite = 'prolonger' | 'deconnecter';
1408
+ /**
1409
+ * Seuils ou le temps restant s'annonce, en secondes : 60 et 30 en region polie, 10 en alerte.
1410
+ *
1411
+ * ⚠️ JAMAIS a chaque seconde : une region qui change toutes les secondes recouvre tout ce que
1412
+ * le lecteur d'ecran dit, y compris les deux boutons que la personne cherche justement a atteindre.
1413
+ */
1414
+ export declare const SEUILS_D_ANNONCE_PAR_DEFAUT: readonly number[];
1415
+ /** Un seuil a cette valeur ou en dessous s'annonce en ALERTE (`role="alert"`), plus en polie. */
1416
+ export declare const SEUIL_D_ALERTE = 10;
553
1417
  /** Ce que l'avertissement passe a son panneau. */
554
- interface DonneesDInactivite {
555
- readonly restant: Signal<number>;
556
- readonly identifiantDeDescription: string;
1418
+ export interface DonneesDInactivite {
1419
+ readonly restant: Signal<number>;
1420
+ readonly identifiantDeDescription: string;
1421
+ /**
1422
+ * Duree totale de l'avertissement, en secondes : la jauge se lit `restant / duree`. Absente,
1423
+ * le premier `restant` recu (la jauge part pleine).
1424
+ */
1425
+ readonly duree?: number;
1426
+ /** Seuils d'annonce ; defaut `SEUILS_D_ANNONCE_PAR_DEFAUT`. */
1427
+ readonly seuils?: readonly number[];
557
1428
  }
558
-
559
1429
  /**
560
1430
  * Avertissement avant fermeture de session pour inactivite.
561
1431
  *
@@ -579,42 +1449,110 @@ interface DonneesDInactivite {
579
1449
  * ⚠️ **Le clic a cote ne prolonge rien**, pour la raison que donne `StInactivite`
580
1450
  * du noyau : le dialogue disparaitrait sans que la session ait ete prolongee cote
581
1451
  * serveur. Il faut repondre. Echap, geste delibere, vaut « Rester connecte ».
1452
+ *
1453
+ * ⚠️ **Une fermeture SUBIE ne prolonge rien non plus** (A1199, A1216). Une navigation du
1454
+ * routeur fermait l'alerte sans reponse, et ce silence valait « Rester connecte » : une
1455
+ * redirection programmee prolongeait la session sans personne devant l'ecran. L'alerte survit
1456
+ * desormais a la navigation (`survitALaNavigation`), et toute fermeture sans reponse la rouvre
1457
+ * tant que le decompte court, sans rien emettre.
582
1458
  */
583
- declare class StIdleWarning {
584
- private readonly dialogues;
585
- /** `null` : aucun avertissement en cours. */
586
- readonly secondesRestantes: _angular_core.InputSignal<number | null>;
587
- readonly prolonge: _angular_core.OutputEmitterRef<void>;
588
- readonly deconnecte: _angular_core.OutputEmitterRef<void>;
589
- private readonly restant;
590
- private reference;
591
- private readonly identifiantDeDescription;
592
- constructor();
593
- private ouvrir;
594
- private fermerSansReponse;
595
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StIdleWarning, never>;
596
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StIdleWarning, "st-idle-warning", never, { "secondesRestantes": { "alias": "secondesRestantes"; "required": false; "isSignal": true; }; }, { "prolonge": "prolonge"; "deconnecte": "deconnecte"; }, never, never, true, never>;
597
- }
598
-
599
- /** Contenu du dialogue d'avertissement. Ouvert par `st-idle-warning`, jamais directement. */
600
- declare class StIdleWarningPanel {
601
- private readonly reference;
602
- private readonly libelles;
603
- private readonly locale;
604
- protected readonly donnees: DonneesDInactivite;
605
- protected readonly annonce: AnnonceLocale;
606
- protected readonly titre: _angular_core.Signal<string>;
607
- protected readonly message: _angular_core.Signal<string>;
608
- protected readonly libelleRester: _angular_core.Signal<string>;
609
- protected readonly libelleDeconnecter: _angular_core.Signal<string>;
610
- constructor();
611
- protected rester(): void;
612
- protected deconnecter(): void;
613
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StIdleWarningPanel, never>;
614
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StIdleWarningPanel, "st-idle-warning-panel", never, {}, {}, never, never, true, never>;
615
- }
616
-
617
- type PositionDInfobulle = 'haut' | 'bas';
1459
+ export declare class StIdleWarning {
1460
+ private readonly dialogues;
1461
+ /** `null` : aucun avertissement en cours. */
1462
+ readonly secondesRestantes: import("@angular/core").InputSignal<number | null>;
1463
+ /**
1464
+ * Duree totale de l'avertissement, en secondes : la jauge du panneau se lit
1465
+ * `secondesRestantes / duree`. `null` : la premiere valeur recue (la jauge part pleine).
1466
+ */
1467
+ readonly duree: import("@angular/core").InputSignal<number | null>;
1468
+ /** Seuils ou le temps restant s'annonce (defaut 60 et 30 s en polie, 10 s en alerte). */
1469
+ readonly seuils: import("@angular/core").InputSignal<readonly number[]>;
1470
+ readonly prolonge: import("@angular/core").OutputEmitterRef<void>;
1471
+ readonly deconnecte: import("@angular/core").OutputEmitterRef<void>;
1472
+ private readonly restant;
1473
+ private reference;
1474
+ private readonly identifiantDeDescription;
1475
+ constructor();
1476
+ private ouvrir;
1477
+ private fermerSansReponse;
1478
+ static ɵfac: i0.ɵɵFactoryDeclaration<StIdleWarning, never>;
1479
+ static ɵcmp: i0.ɵɵComponentDeclaration<StIdleWarning, "st-idle-warning", never, {
1480
+ "secondesRestantes": {
1481
+ "alias": "secondesRestantes";
1482
+ "required": false;
1483
+ "isSignal": true;
1484
+ };
1485
+ "duree": {
1486
+ "alias": "duree";
1487
+ "required": false;
1488
+ "isSignal": true;
1489
+ };
1490
+ "seuils": {
1491
+ "alias": "seuils";
1492
+ "required": false;
1493
+ "isSignal": true;
1494
+ };
1495
+ }, {
1496
+ "prolonge": "prolonge";
1497
+ "deconnecte": "deconnecte";
1498
+ }, never, never, true, never>;
1499
+ }
1500
+ /**
1501
+ * Contenu du dialogue d'avertissement (planche 5, dialogue B). Ouvert par `st-idle-warning`,
1502
+ * jamais directement.
1503
+ *
1504
+ * Anatomie : en-tete de ton `avertissement` (sablier, surtitre « Inactivite detectee », sans
1505
+ * croix), message qui DECRIT l'alerte et dit la duree, bloc minuteur (duree `role="timer"`
1506
+ * nommee par sa legende, jauge `st-progress` avertissement), actions aux deux bouts.
1507
+ *
1508
+ * ⚠️ Rien ne pulse, rien ne s'anime par seconde (EA-13) : sous 10 s, rien ne change a l'ecran ;
1509
+ * c'est l'annonce ASSERTIVE qui porte l'escalade. La duree est en chiffres tabulaires : ni la
1510
+ * phrase ni le bloc ne tremblent pendant le decompte.
1511
+ *
1512
+ * ⚠️ Echap est traite ICI, en reponse explicite « Rester connecte » : le dialogue s'ouvre avec
1513
+ * `fermetureInterdite`, et toute autre fermeture (sans reponse) est une fermeture SUBIE, que
1514
+ * `st-idle-warning` ne prend jamais pour une prolongation.
1515
+ */
1516
+ export declare class StIdleWarningPanel {
1517
+ private readonly reference;
1518
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
1519
+ private readonly locale;
1520
+ protected readonly donnees: DonneesDInactivite;
1521
+ /** Seuils de 60 et 30 s : region polie. */
1522
+ protected readonly annonce: AnnonceLocale;
1523
+ /** Seuil de 10 s : region d'alerte (assertive). */
1524
+ protected readonly alerte: AnnonceLocale;
1525
+ protected readonly identifiantDeLegende: string;
1526
+ /** Duree totale : donnee, ou le premier `restant` recu. */
1527
+ private readonly duree;
1528
+ protected readonly restant: import("@angular/core").Signal<number>;
1529
+ /** La duree dite en toutes lettres (« 1 min 30 s ») : description et annonces. */
1530
+ protected readonly dureeLue: import("@angular/core").Signal<string>;
1531
+ /** Deux chiffres au moins, sans separateur de milliers, dans les chiffres de la locale. */
1532
+ private readonly deuxChiffres;
1533
+ /** La duree du bloc minuteur (« 01:30 »). */
1534
+ protected readonly dureeAffichee: import("@angular/core").Signal<string>;
1535
+ protected readonly jauge: import("@angular/core").Signal<number>;
1536
+ protected readonly maximum: number;
1537
+ protected readonly phrase: import("@angular/core").Signal<string>;
1538
+ /**
1539
+ * Le seuil que la derniere valeur vient de franchir, ou `null` : la valeur precedente vit dans
1540
+ * le signal lie, plus dans la fermeture d'un effet. A l'ouverture, rien n'est franchi : le
1541
+ * dialogue d'alerte est deja lu avec sa description.
1542
+ */
1543
+ private readonly franchi;
1544
+ constructor();
1545
+ protected rester(): void;
1546
+ protected deconnecter(): void;
1547
+ static ɵfac: i0.ɵɵFactoryDeclaration<StIdleWarningPanel, never>;
1548
+ static ɵcmp: i0.ɵɵComponentDeclaration<StIdleWarningPanel, "st-idle-warning-panel", never, {}, {}, never, never, true, never>;
1549
+ }
1550
+ /**
1551
+ * Cote du declencheur ou la bulle se pose d'abord : `haut` (defaut), `bas`, ou a cote dans le
1552
+ * sens d'ecriture (`debut`, `fin`). Le cote oppose sert de repli quand la place manque ; le cote
1553
+ * REEL est pose en `data-cote` sur la bulle, qui y oriente sa fleche.
1554
+ */
1555
+ export type PositionDInfobulle = 'haut' | 'bas' | 'debut' | 'fin';
618
1556
  /**
619
1557
  * Infobulle : un complement de texte, au survol ET au focus.
620
1558
  *
@@ -635,117 +1573,568 @@ type PositionDInfobulle = 'haut' | 'bas';
635
1573
  * vers un element absent au moment ou le focus arrive : le lecteur d'ecran,
636
1574
  * qui calcule la description a cet instant, ne lirait rien.
637
1575
  *
1576
+ * ⚠️ **Un hote FOCALISABLE.** Sans focus, la bulle n'existe pas au clavier : un `<span stTooltip>`
1577
+ * ou un `<button disabled>` avertit en developpement. Une action indisponible s'ecrit
1578
+ * `indisponible` (`aria-disabled`, D39) : elle reste focalisable, et sa bulle s'ouvre.
1579
+ *
638
1580
  * ⚠️ **Jamais d'information exclusive, jamais de contenu interactif.** Sur un
639
1581
  * ecran tactile, il n'y a ni survol ni focus visible : l'infobulle n'existe pas.
640
1582
  * Ce qu'elle dit doit pouvoir manquer. Un lien ou un bouton dedans serait
641
1583
  * inatteignable — c'est un `st-popover` qu'il faut alors.
1584
+ *
1585
+ * Rythme (03 §3.4, P8) : au survol, `rythme.delai.survol` avant d'apparaitre —
1586
+ * balayer une barre d'outils ne fait pas clignoter chaque bulle — ; au depart du
1587
+ * pointeur, `rythme.delai.grace` pour rejoindre la bulle. Au focus, sans delai.
1588
+ * Apparition et disparition en fondu seul : une bulle qui se deplacerait
1589
+ * de 4 px ne se verrait pas bouger, seulement trembler.
642
1590
  */
643
- declare class StTooltip {
644
- private readonly element;
645
- private readonly overlay;
646
- private readonly descripteur;
647
- private readonly document;
648
- readonly stTooltip: _angular_core.InputSignal<string>;
649
- readonly positionDInfobulle: _angular_core.InputSignal<PositionDInfobulle>;
650
- private couche;
651
- private minuterie;
652
- private description;
653
- private readonly echap;
654
- constructor();
655
- protected auSurvol(): void;
656
- protected auDepartDuPointeur(): void;
657
- afficher(): void;
658
- masquer(): void;
659
- private programmer;
660
- private annulerLaMinuterie;
661
- private retirerLaDescription;
662
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTooltip, never>;
663
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StTooltip, "[stTooltip]", never, { "stTooltip": { "alias": "stTooltip"; "required": true; "isSignal": true; }; "positionDInfobulle": { "alias": "positionDInfobulle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
664
- }
665
-
1591
+ export declare class StTooltip {
1592
+ private readonly element;
1593
+ private readonly couche;
1594
+ private readonly descripteur;
1595
+ private readonly visibles;
1596
+ readonly stTooltip: import("@angular/core").InputSignal<string>;
1597
+ readonly positionDInfobulle: import("@angular/core").InputSignal<PositionDInfobulle>;
1598
+ /** Icone decorative optionnelle, avant le texte de la bulle (planche 5 : `badge-coche`). */
1599
+ readonly iconeDInfobulle: import("@angular/core").InputSignal<"accessibilite" | "appareils" | "arborescence" | "asterisque" | "badge-coche" | "banque" | "batiment" | "bifurcation" | "billets" | "billets-envoi" | "billets-pile" | "boite" | "boite-de-reception" | "bouclier" | "bouclier-alerte" | "bouclier-coche" | "bouclier-coeur" | "bouclier-croix" | "bouclier-moitie" | "bouclier-recherche" | "bouclier-utilisateur" | "boussole" | "bouton-curseur" | "bulle-question" | "cadenas" | "cadenas-horloge" | "cadenas-ouvert" | "cadre-pied" | "cadre-texte" | "calendrier" | "calendrier-evenement" | "calendrier-horloge" | "calendrier-jour" | "calques" | "carte-bancaire" | "carte-bancaire-barre" | "carte-bancaire-cadenas" | "carte-contact" | "carte-identite" | "cartes-empilees" | "case-cochee" | "casse" | "cercle" | "cercle-alerte" | "cercle-chevron-bas" | "cercle-coche" | "cercle-coche-ouvert" | "cercle-croix" | "cercle-info" | "cercle-moins" | "cercle-plus" | "cercle-question" | "certificat" | "chandelier" | "chargement" | "cheque" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "chevrons-droite" | "chevrons-haut-bas" | "cle" | "cloche" | "cloche-sonnerie" | "coche" | "code" | "code-qr" | "code-qr-scanner" | "coffre-fort" | "colonnes" | "connexion" | "contraste" | "copie" | "corbeille" | "corbeille-croix" | "courriel" | "crayon" | "croix" | "curseur-clic" | "deconnexion" | "devise" | "disposition" | "dollar" | "dossier" | "dossier-barre" | "dossier-ouvert" | "double-coche" | "echange" | "eclair" | "empreinte-digitale" | "enregistrer" | "entree" | "envoyer" | "epaisseur-de-trait" | "epingle" | "etoile" | "euro" | "fichier" | "fichier-image" | "fichier-pdf" | "fichier-texte" | "filtre" | "filtre-barre" | "filtre-lignes" | "fleche-bas" | "fleche-bas-gauche" | "fleche-bas-ligne" | "fleche-droite" | "fleche-gauche" | "fleche-haut" | "fleche-haut-droite" | "fleche-haut-ligne" | "fleche-large-haut" | "fleches-gauche-droite" | "flocon" | "flou" | "formes" | "globe" | "graphique-anneau" | "graphique-barres" | "graphique-barres-cadre" | "graphique-camembert" | "graphique-ligne" | "graphique-lignes" | "grille" | "grille-lignes" | "hexagone" | "historique" | "horloge" | "horloge-fleche" | "iban" | "imprimer" | "interdit" | "jalons" | "jauge" | "lien" | "lien-externe" | "lignes" | "lignes-crayon" | "liste" | "liste-coche" | "liste-controle" | "liste-numerotee" | "luminosite" | "lune" | "maillet" | "maison" | "marque-page" | "menu" | "menu-ouvert" | "message" | "minuteur" | "mise-au-point" | "mise-en-page-image" | "moins" | "nuage-barre" | "nuage-televerser" | "octogone-alerte" | "oeil" | "oeil-barre" | "panneau-gauche" | "parametres" | "parapluie" | "parchemin" | "pieces" | "plus" | "pointeur" | "points" | "points-verticaux" | "portefeuille" | "portefeuille-cartes" | "presse-papiers-coche" | "presse-papiers-horloge" | "priorite-haute" | "rafraichir" | "recherche" | "recherche-barre" | "recherche-texte" | "rectangle-points" | "recu" | "redemarrer" | "reglages" | "regle" | "reseau-jauge" | "rotation-arriere" | "routeur" | "sablier" | "sablier-bas" | "sablier-haut" | "sac-argent" | "sans-contact" | "serveur" | "soleil" | "style-de-trait" | "synchro" | "synchro-probleme" | "tableau" | "tableau-de-bord" | "tableau-de-bord-plus" | "tablette" | "tabulation" | "telecharger" | "telephone-mobile" | "televerser" | "tendance-baisse" | "tendance-hausse" | "terminal" | "tirelire" | "triangle-alerte" | "triangle-bas" | "triangle-haut" | "trombone" | "utilisateur" | "utilisateur-crayon" | "utilisateurs" | "wifi" | "wifi-barre" | null>;
1600
+ private minuterie;
1601
+ private description;
1602
+ constructor();
1603
+ protected auSurvol(): void;
1604
+ protected auDepartDuPointeur(): void;
1605
+ /** L'hote garde le focus, ou le pointeur est encore sur l'hote ou sur la bulle elle-meme. */
1606
+ private encoreRequise;
1607
+ /**
1608
+ * Perte de focus de l'hote : WCAG 1.4.13, persistante (revue E12, BASSE). Sans cette garde, Tab
1609
+ * hors de l'hote masquait la bulle meme si le pointeur la survolait encore (ou l'hote).
1610
+ */
1611
+ protected auPerteDuFocus(): void;
1612
+ afficher(): void;
1613
+ masquer(): void;
1614
+ private programmer;
1615
+ private annulerLaMinuterie;
1616
+ private retirerLaDescription;
1617
+ static ɵfac: i0.ɵɵFactoryDeclaration<StTooltip, never>;
1618
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StTooltip, "[stTooltip]", never, {
1619
+ "stTooltip": {
1620
+ "alias": "stTooltip";
1621
+ "required": true;
1622
+ "isSignal": true;
1623
+ };
1624
+ "positionDInfobulle": {
1625
+ "alias": "positionDInfobulle";
1626
+ "required": false;
1627
+ "isSignal": true;
1628
+ };
1629
+ "iconeDInfobulle": {
1630
+ "alias": "iconeDInfobulle";
1631
+ "required": false;
1632
+ "isSignal": true;
1633
+ };
1634
+ }, {}, never, never, true, never>;
1635
+ }
666
1636
  /**
667
1637
  * Bulle visible d'une infobulle. Posee par `stTooltip`, jamais directement.
668
1638
  *
1639
+ * Surface INVERSE du socle (planche 5, module 5.6) : rayon des surfaces, filet clair a 40 %,
1640
+ * texte centre en 12/16 moyen (D41 : 11 px est reserve aux capitales), icone decorative
1641
+ * optionnelle, et fleche carree de 12 px tournee vers le declencheur, orientee par le `data-cote`
1642
+ * que la couche pose (cote REEL, repli compris). Sans `data-cote` (bulle hors couche), pas de
1643
+ * fleche.
1644
+ *
669
1645
  * ⚠️ Muette (`aria-hidden`) : le texte est deja lu comme DESCRIPTION du
670
1646
  * declencheur, par un noeud persistant. L'exposer aussi ici le ferait lire deux
671
1647
  * fois.
672
1648
  */
673
- declare class StTooltipPanel {
674
- readonly texte: _angular_core.InputSignal<string>;
675
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTooltipPanel, never>;
676
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StTooltipPanel, "st-tooltip-panel", never, { "texte": { "alias": "texte"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1649
+ export declare class StTooltipPanel {
1650
+ readonly texte: import("@angular/core").InputSignal<string>;
1651
+ /** Icone decorative avant le texte (18 px, couleur du texte). */
1652
+ readonly icone: import("@angular/core").InputSignal<"accessibilite" | "appareils" | "arborescence" | "asterisque" | "badge-coche" | "banque" | "batiment" | "bifurcation" | "billets" | "billets-envoi" | "billets-pile" | "boite" | "boite-de-reception" | "bouclier" | "bouclier-alerte" | "bouclier-coche" | "bouclier-coeur" | "bouclier-croix" | "bouclier-moitie" | "bouclier-recherche" | "bouclier-utilisateur" | "boussole" | "bouton-curseur" | "bulle-question" | "cadenas" | "cadenas-horloge" | "cadenas-ouvert" | "cadre-pied" | "cadre-texte" | "calendrier" | "calendrier-evenement" | "calendrier-horloge" | "calendrier-jour" | "calques" | "carte-bancaire" | "carte-bancaire-barre" | "carte-bancaire-cadenas" | "carte-contact" | "carte-identite" | "cartes-empilees" | "case-cochee" | "casse" | "cercle" | "cercle-alerte" | "cercle-chevron-bas" | "cercle-coche" | "cercle-coche-ouvert" | "cercle-croix" | "cercle-info" | "cercle-moins" | "cercle-plus" | "cercle-question" | "certificat" | "chandelier" | "chargement" | "cheque" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "chevrons-droite" | "chevrons-haut-bas" | "cle" | "cloche" | "cloche-sonnerie" | "coche" | "code" | "code-qr" | "code-qr-scanner" | "coffre-fort" | "colonnes" | "connexion" | "contraste" | "copie" | "corbeille" | "corbeille-croix" | "courriel" | "crayon" | "croix" | "curseur-clic" | "deconnexion" | "devise" | "disposition" | "dollar" | "dossier" | "dossier-barre" | "dossier-ouvert" | "double-coche" | "echange" | "eclair" | "empreinte-digitale" | "enregistrer" | "entree" | "envoyer" | "epaisseur-de-trait" | "epingle" | "etoile" | "euro" | "fichier" | "fichier-image" | "fichier-pdf" | "fichier-texte" | "filtre" | "filtre-barre" | "filtre-lignes" | "fleche-bas" | "fleche-bas-gauche" | "fleche-bas-ligne" | "fleche-droite" | "fleche-gauche" | "fleche-haut" | "fleche-haut-droite" | "fleche-haut-ligne" | "fleche-large-haut" | "fleches-gauche-droite" | "flocon" | "flou" | "formes" | "globe" | "graphique-anneau" | "graphique-barres" | "graphique-barres-cadre" | "graphique-camembert" | "graphique-ligne" | "graphique-lignes" | "grille" | "grille-lignes" | "hexagone" | "historique" | "horloge" | "horloge-fleche" | "iban" | "imprimer" | "interdit" | "jalons" | "jauge" | "lien" | "lien-externe" | "lignes" | "lignes-crayon" | "liste" | "liste-coche" | "liste-controle" | "liste-numerotee" | "luminosite" | "lune" | "maillet" | "maison" | "marque-page" | "menu" | "menu-ouvert" | "message" | "minuteur" | "mise-au-point" | "mise-en-page-image" | "moins" | "nuage-barre" | "nuage-televerser" | "octogone-alerte" | "oeil" | "oeil-barre" | "panneau-gauche" | "parametres" | "parapluie" | "parchemin" | "pieces" | "plus" | "pointeur" | "points" | "points-verticaux" | "portefeuille" | "portefeuille-cartes" | "presse-papiers-coche" | "presse-papiers-horloge" | "priorite-haute" | "rafraichir" | "recherche" | "recherche-barre" | "recherche-texte" | "rectangle-points" | "recu" | "redemarrer" | "reglages" | "regle" | "reseau-jauge" | "rotation-arriere" | "routeur" | "sablier" | "sablier-bas" | "sablier-haut" | "sac-argent" | "sans-contact" | "serveur" | "soleil" | "style-de-trait" | "synchro" | "synchro-probleme" | "tableau" | "tableau-de-bord" | "tableau-de-bord-plus" | "tablette" | "tabulation" | "telecharger" | "telephone-mobile" | "televerser" | "tendance-baisse" | "tendance-hausse" | "terminal" | "tirelire" | "triangle-alerte" | "triangle-bas" | "triangle-haut" | "trombone" | "utilisateur" | "utilisateur-crayon" | "utilisateurs" | "wifi" | "wifi-barre" | null>;
1653
+ static ɵfac: i0.ɵɵFactoryDeclaration<StTooltipPanel, never>;
1654
+ static ɵcmp: i0.ɵɵComponentDeclaration<StTooltipPanel, "st-tooltip-panel", never, {
1655
+ "texte": {
1656
+ "alias": "texte";
1657
+ "required": true;
1658
+ "isSignal": true;
1659
+ };
1660
+ "icone": {
1661
+ "alias": "icone";
1662
+ "required": false;
1663
+ "isSignal": true;
1664
+ };
1665
+ }, {}, never, never, true, never>;
677
1666
  }
678
-
679
- type AlignementDePopover = 'debut' | 'fin';
1667
+ export type AlignementDePopover = 'debut' | 'fin';
680
1668
  /**
681
1669
  * Couche NON modale attachee a un declencheur : filtres rapides, detail d'une
682
1670
  * ligne, petit formulaire.
683
1671
  *
684
1672
  * ```html
685
1673
  * <button stButton [stPopoverTrigger]="filtres">Filtres</button>
686
- * <st-popover #filtres etiquette="Filtres des operations">…</st-popover>
1674
+ * <st-popover #filtres titre="Filtres des operations">…</st-popover>
687
1675
  * ```
688
1676
  *
689
1677
  * Distinct de l'infobulle, qui ne contient que du texte, et du dialogue, qui
690
1678
  * piege le focus et met la page en retrait.
691
1679
  *
692
- * ⚠️ **Non modale, donc aucun piege.** La tabulation peut en sortir, et la page
693
- * reste utilisable. Mais une couche que le focus a quittee flotterait sans lien
694
- * avec ce qu'on fait : elle se ferme quand le focus part ailleurs que sur elle
695
- * ou son declencheur.
1680
+ * Nom : `titre` (visible, relie par `aria-labelledby`) ou `etiquette` (`aria-label`, invisible).
1681
+ * L'un des deux est exige ; sans nom, la couche s'annonce « dialogue » et rien d'autre.
696
1682
  *
697
- * ⚠️ **Deux fermetures, deux destinations du focus.** Echap rend le focus au
698
- * declencheur : la personne n'a rien choisi d'autre. Un clic a l'exterieur le
699
- * laisse la ou il a ete pose : le lui reprendre annulerait ce clic.
1683
+ * Ce qu'elle tient (lot 232) :
1684
+ *
1685
+ * - a l'ouverture, le focus ENTRE : sur le premier arret de tabulation (`InteractivityChecker`,
1686
+ * un controle `aria-disabled="true"` passe son tour), sinon sur la couche elle-meme ;
1687
+ * - Echap ferme et rend le focus au declencheur ;
1688
+ * - Tab apres le dernier arret, ou Maj+Tab avant le premier, ferme : la couche vit en fin de
1689
+ * document, et la tabulation repart du DECLENCHEUR, dans l'ordre de la page ;
1690
+ * - un focus pose ailleurs (clic, script) ferme SANS le reprendre ; un clic exterieur aussi ;
1691
+ * - un second clic sur le declencheur ferme (garde de `CoucheAncree`) ;
1692
+ * - une navigation du routeur ABOUTIE ferme (`NavigationEnd`, apres les gardes) : plus de couche
1693
+ * fantome sur un ecran qui change ; un declencheur emporte hors de la vue par le defilement
1694
+ * ferme aussi.
1695
+ *
1696
+ * ⚠️ **Non modale, donc aucun piege** : la page reste utilisable autour, sans voile.
1697
+ *
1698
+ * `fermable` (lot 265) : un bouton « Fermer » visible dans l'en-tete, pour qui n'a ni Echap ni clic
1699
+ * exterieur evident (au toucher). `feuilleSousMd` : sous la rupture `md` de la fenetre, la couche
1700
+ * s'ouvre en feuille inferieure, pleine largeur au bas de l'ecran, toujours sans voile.
700
1701
  *
701
1702
  * Meme structure que `st-menu` : le declencheur DESIGNE la couche, et l'element
702
1703
  * est DEPLACE dans la couche d'overlay a l'ouverture, avec ses liaisons et son
703
1704
  * etat.
704
1705
  */
705
- declare class StPopover {
706
- private readonly element;
707
- private readonly overlay;
708
- /** Nom accessible : sans lui, la couche s'annonce « dialogue » et rien d'autre. */
709
- readonly etiquette: _angular_core.InputSignal<string>;
710
- readonly alignement: _angular_core.InputSignal<AlignementDePopover>;
711
- readonly identifiant: string;
712
- private readonly ouvertInterne;
713
- readonly ouvert: _angular_core.Signal<boolean>;
714
- private couche;
715
- private declencheur;
716
- constructor();
717
- basculerDepuis(declencheur: HTMLElement): void;
718
- ouvrirDepuis(declencheur: HTMLElement): void;
719
- fermer(options?: {
720
- readonly rendreLeFocus?: boolean;
721
- }): void;
722
- protected auClavier(evenement: KeyboardEvent): void;
723
- /**
724
- * ⚠️ L'element actif est lu APRES la transition de focus, et non dans
725
- * `relatedTarget`. Ce dernier est vide quand le focus part vers un element
726
- * sans focus, et n'est pas renseigne partout ; pendant la transition elle-meme,
727
- * l'element actif est encore le corps du document.
728
- */
729
- protected aLaPerteDuFocus(): void;
730
- private detruireLaCouche;
731
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StPopover, never>;
732
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StPopover, "st-popover", never, { "etiquette": { "alias": "etiquette"; "required": true; "isSignal": true; }; "alignement": { "alias": "alignement"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
733
- }
734
-
735
- /**
736
- * Declencheur d'un `st-popover`.
737
- *
738
- * ⚠️ `aria-controls` vise la couche meme fermee : le lien entre les deux existe
739
- * pour les technologies d'assistance avant l'ouverture, et `aria-expanded` dit
740
- * son etat.
741
- */
742
- declare class StPopoverTrigger {
743
- private readonly element;
744
- readonly stPopoverTrigger: _angular_core.InputSignal<StPopover>;
745
- protected basculer(): void;
746
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StPopoverTrigger, never>;
747
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StPopoverTrigger, "[stPopoverTrigger]", never, { "stPopoverTrigger": { "alias": "stPopoverTrigger"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
748
- }
749
-
750
- export { IDENTIFIANT_DU_TITRE, StConfirmDialog, StDialog, StDialogActions, StDialogContainer, StDialogContent, StDialogTitle, StIdleWarning, StIdleWarningPanel, StMenu, StMenuItem, StMenuTrigger, StPopover, StPopoverTrigger, StToast, StToastContainer, StToolbar, StTooltip, StTooltipPanel };
751
- export type { ActionDeBarre, ActionDeToast, AlignementDeMenu, AlignementDePopover, CoteDuTiroir, DemandeDeConfirmation, DemandeDeToast, DonneesDInactivite, OptionsDeDialogue, PositionDInfobulle, ReferenceDeDialogue, ReponseDInactivite, Toast, TonDElementDeMenu };
1706
+ export declare class StPopover implements OnInit {
1707
+ private readonly element;
1708
+ private readonly couche;
1709
+ private readonly verificateur;
1710
+ private readonly defilements;
1711
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
1712
+ /** Nom accessible invisible (`aria-label`), quand la couche n'a pas de `titre`. */
1713
+ readonly etiquette: import("@angular/core").InputSignal<string | undefined>;
1714
+ /**
1715
+ * Titre visible, en `libelle` discret, qui NOMME la couche (`aria-labelledby`) : un paragraphe
1716
+ * et non un titre de section, pour ne pas casser la hierarchie de la page.
1717
+ */
1718
+ readonly titre: import("@angular/core").InputSignal<string | null>;
1719
+ /** Identifiant(s) d'un texte qui DECRIT la couche (`aria-describedby`). */
1720
+ readonly descriptionDe: import("@angular/core").InputSignal<string | null>;
1721
+ readonly alignement: import("@angular/core").InputSignal<AlignementDePopover>;
1722
+ /** Un bouton « Fermer » visible dans l'en-tete (lot 265) ; il rend le focus au declencheur. */
1723
+ readonly fermable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1724
+ /**
1725
+ * Sous la rupture `md` de la FENETRE, une feuille inferieure (lot 265) plutot qu'une bulle
1726
+ * accrochee : decide a l'ouverture, par la largeur et non par le pointeur.
1727
+ */
1728
+ readonly feuilleSousMd: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1729
+ protected readonly id: string;
1730
+ protected readonly idDuTitre: string;
1731
+ protected readonly titreAffiche: import("@angular/core").Signal<string | null>;
1732
+ private readonly ouvertInterne;
1733
+ readonly ouvert: import("@angular/core").Signal<boolean>;
1734
+ private declencheur;
1735
+ private defilement;
1736
+ private repli;
1737
+ /**
1738
+ * Dernier geste de la personne pendant l'ouverture (pointeur ou clavier), lu par le repli de la
1739
+ * perte de focus : un focus tombe sur le corps du document apres un CLIC n'est jamais repris.
1740
+ */
1741
+ private dernierGeste;
1742
+ private ecouteDesGestes;
1743
+ constructor();
1744
+ ngOnInit(): void;
1745
+ /** Identifiant de la couche, que le declencheur pose en `aria-controls` avant meme l'ouverture. */
1746
+ identifiant(): string;
1747
+ basculerDepuis(declencheur: HTMLElement): void;
1748
+ ouvrirDepuis(declencheur: HTMLElement): void;
1749
+ /**
1750
+ * Ferme. Le focus est rendu au declencheur A LA DEMANDE (Echap), sans attendre le fondu, et
1751
+ * seulement s'il est encore dans la couche : un focus pose ailleurs n'est jamais repris.
1752
+ */
1753
+ fermer(options?: {
1754
+ readonly rendreLeFocus?: boolean;
1755
+ }): void;
1756
+ /**
1757
+ * Revient a l'etat ferme, sans toucher a la couche : pour `fermer`, et quand le CDK a detache la
1758
+ * couche de lui-meme (`auDetachement`) — le declencheur ne dit plus « ouvert » pour une couche
1759
+ * partie.
1760
+ */
1761
+ private oublierLOuverture;
1762
+ /**
1763
+ * Revue de la reprise (MOYENNE) : le CDK ne rapporte le clic exterieur qu'au `click`, alors que le
1764
+ * focus part vers le corps du document des le `mousedown`. Un clic tenu quelques millisecondes
1765
+ * sur une zone non focalisable laissait le repli de `aLaPerteDuFocus` fermer AVANT, en rendant le
1766
+ * focus au declencheur : un focus vole a un clic. Le dernier geste dit si la sortie vient du
1767
+ * pointeur ou du clavier. En capture sur le document, retire a la fermeture.
1768
+ */
1769
+ private ecouterLesGestes;
1770
+ protected auClavier(evenement: KeyboardEvent): void;
1771
+ /**
1772
+ * Tab apres le dernier arret, Maj+Tab avant le premier : la couche est en FIN de document, et la
1773
+ * tabulation native sortait de la page (ou sautait au dernier element de la page). Le focus
1774
+ * repart du declencheur, rendu AVANT l'action par defaut : Tab va a l'element qui le SUIT dans
1775
+ * la page ; Maj+Tab s'arrete sur lui.
1776
+ *
1777
+ * Revue E12 (fidelite/comportement, MOYENNE) : le focus tombe sur l'HOTE (`tabindex=-1`) des
1778
+ * qu'un clic atterrit sur une zone non focalisable de la couche (titre, padding, texte) — ou
1779
+ * quand tous les arrets sont `aria-disabled` (D39 : ce sont quand meme des arrets, mais jamais le
1780
+ * focus initial). Un Tab depuis l'hote fermait alors la couche au lieu d'ENTRER dans ses
1781
+ * controles. On n'y ferme plus que sur Maj+Tab (symetrique du bord de debut) ou quand il n'y a
1782
+ * aucun arret ; un Tab simple y entre, sur le premier.
1783
+ */
1784
+ private tabulation;
1785
+ /**
1786
+ * Vrai quand la tabulation native partie de `actif` s'arrete encore dans la couche : un arret
1787
+ * apres lui (Tab) ou avant lui (Maj+Tab) dans l'ordre du document, selon la regle des groupes
1788
+ * radio (`arretDepuis`). Faux au bord : la couche se ferme et la tabulation repart du declencheur.
1789
+ */
1790
+ private arretVoisin;
1791
+ /**
1792
+ * Un focus pose HORS de la couche et hors du declencheur ferme, sans le reprendre.
1793
+ * `relatedTarget` d'abord ; vide (focus parti vers un element non focalisable, fenetre quittee),
1794
+ * l'element actif est lu apres la transition, en repli.
1795
+ */
1796
+ protected aLaPerteDuFocus(evenement: FocusEvent): void;
1797
+ /**
1798
+ * Revue E12 (comportement, HAUTE) : un `st-menu` (ou toute autre couche) ouvert depuis un
1799
+ * controle du popover vit dans un AUTRE `.cdk-overlay-pane` ; le focus qui y part ne quitte pas
1800
+ * le popover. `CoucheAncree.contient` le sait par ORIGINE (le declencheur de la sous-couche est
1801
+ * dans notre panneau), et la sous-couche se ferme AVEC le popover, quel que soit le chemin
1802
+ * (Echap, defilement, navigation, detachement par le CDK).
1803
+ */
1804
+ private fermerSiHors;
1805
+ /**
1806
+ * Arrets de tabulation de la couche, dans l'ordre du document. Le verificateur du CDK dit ce qui
1807
+ * est focalisable et tabulable ; la visibilite n'est pas exigee (un controle de la couche est
1808
+ * visible des qu'elle l'est, et jsdom ne mesure rien), un sous-arbre `hidden` ou `inert` est
1809
+ * ecarte. Un controle `aria-disabled="true"` reste un arret (D39), mais pas un focus initial.
1810
+ *
1811
+ * ⚠️ Revue E12 (fidelite, BASSE, REPORTEE) : `ignoreVisibility: true` compte aussi un controle
1812
+ * masque par `display: none` ailleurs qu'un `[hidden]`/`[inert]` (un `<details>` ferme, une
1813
+ * couche imbriquee fermee) comme un arret. Le corriger sans casser jsdom (qui ne mesure aucune
1814
+ * boite) demande un repli de visibilite injectable ; suit dans un lot dedie plutot qu'ici.
1815
+ */
1816
+ private arrets;
1817
+ /**
1818
+ * Un declencheur que le defilement emporte hors de la vue ferme la couche : elle resterait
1819
+ * seule, accrochee a rien de visible.
1820
+ *
1821
+ * ⚠️ Revue E12 (fidelite, BASSE, REPORTEE) : `ScrollDispatcher.ancestorScrolled` n'entend que la
1822
+ * fenetre et les conteneurs enregistres `cdkScrollable` ; aucun composant du socle ne pose cette
1823
+ * directive aujourd'hui (corps de dialogue defilant, enveloppe de tableau), donc un popover ouvert
1824
+ * depuis l'un d'eux ne suit pas son declencheur au defilement. Ecouter `scroll` en capture sur le
1825
+ * document reglerait le cas general, mais change la gestion de l'abonnement ET son essai (jsdom ne
1826
+ * mesure aucune boite pour `horsDeVue`) : suit dans un lot dedie plutot qu'ici.
1827
+ */
1828
+ private suivreLeDefilement;
1829
+ /** Vrai sous la rupture `md` ; sans `matchMedia` (rendu serveur, jsdom), jamais. */
1830
+ private fenetreEtroite;
1831
+ private horsDeVue;
1832
+ private oublierLeDefilement;
1833
+ private annulerLeRepli;
1834
+ static ɵfac: i0.ɵɵFactoryDeclaration<StPopover, never>;
1835
+ static ɵcmp: i0.ɵɵComponentDeclaration<StPopover, "st-popover", never, {
1836
+ "etiquette": {
1837
+ "alias": "etiquette";
1838
+ "required": false;
1839
+ "isSignal": true;
1840
+ };
1841
+ "titre": {
1842
+ "alias": "titre";
1843
+ "required": false;
1844
+ "isSignal": true;
1845
+ };
1846
+ "descriptionDe": {
1847
+ "alias": "descriptionDe";
1848
+ "required": false;
1849
+ "isSignal": true;
1850
+ };
1851
+ "alignement": {
1852
+ "alias": "alignement";
1853
+ "required": false;
1854
+ "isSignal": true;
1855
+ };
1856
+ "fermable": {
1857
+ "alias": "fermable";
1858
+ "required": false;
1859
+ "isSignal": true;
1860
+ };
1861
+ "feuilleSousMd": {
1862
+ "alias": "feuilleSousMd";
1863
+ "required": false;
1864
+ "isSignal": true;
1865
+ };
1866
+ }, {}, never, ["*"], true, never>;
1867
+ }
1868
+ /**
1869
+ * Declencheur d'un `st-popover`, symetrique de `[stMenuTrigger]` :
1870
+ *
1871
+ * ```html
1872
+ * <button stButton [stPopoverTrigger]="filtres" iconeApres="triangle-bas">Filtres</button>
1873
+ * <st-popover #filtres titre="Filtres des operations">…</st-popover>
1874
+ * ```
1875
+ *
1876
+ * Il porte `aria-haspopup="dialog"`, `aria-expanded`, `aria-controls` (l'identifiant de la
1877
+ * couche, meme fermee : le lien existe pour les technologies d'assistance avant l'ouverture) et
1878
+ * `data-ouvert` pour son etat enfonce. Le clic (Entree, Espace) bascule ; la fleche bas ouvre,
1879
+ * comme sur un declencheur de menu.
1880
+ *
1881
+ * ⚠️ `type="button"` est FORCE sur un `<button>` sans type : dans un formulaire, un declencheur
1882
+ * sans type est un bouton d'envoi, et ouvrir des filtres soumettait le formulaire. Pose une fois,
1883
+ * jamais par-dessus un type explicite (meme raison que `[stMenuTrigger]`).
1884
+ */
1885
+ export declare class StPopoverTrigger {
1886
+ private readonly element;
1887
+ readonly stPopoverTrigger: import("@angular/core").InputSignal<StPopover>;
1888
+ constructor();
1889
+ /**
1890
+ * Revue E12 (fidelite, MOYENNE) : sans cette garde, la fleche bas ouvrait quand meme sur un
1891
+ * declencheur indisponible (`aria-disabled`, ou un `<button>` sans `stButton` dont la garde de
1892
+ * clic n'existe pas). `[stMenuTrigger]` la porte deja (`estIndisponible`) ; meme symetrie ici.
1893
+ */
1894
+ private estIndisponible;
1895
+ protected basculer(): void;
1896
+ /** Fleche bas : ouvre (le focus entre dans la couche), comme `[stMenuTrigger]`. */
1897
+ protected auClavier(evenement: KeyboardEvent): void;
1898
+ static ɵfac: i0.ɵɵFactoryDeclaration<StPopoverTrigger, never>;
1899
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StPopoverTrigger, "[stPopoverTrigger]", never, {
1900
+ "stPopoverTrigger": {
1901
+ "alias": "stPopoverTrigger";
1902
+ "required": true;
1903
+ "isSignal": true;
1904
+ };
1905
+ }, {}, never, never, true, never>;
1906
+ }
1907
+ /**
1908
+ * Le fond du bouton « Confirmer » d'une confirmation legere : JAMAIS un danger. Une action
1909
+ * destructrice ou irreversible passe par `StDialog.confirmer` (le dialogue, ses recopies et son
1910
+ * nombre), pas par une bulle qu'un clic distrait accepte.
1911
+ */
1912
+ export type VarianteDeConfirmationLegere = Extract<VarianteDeBouton, 'primaire' | 'secondaire' | 'tonale'>;
1913
+ /**
1914
+ * La confirmation legere (lot 265) : une question posee a cote du bouton, pour une action
1915
+ * REVERSIBLE qu'un « Annuler » de message ephemere ne saurait defaire (retirer un filtre
1916
+ * enregistre, abandonner un brouillon).
1917
+ *
1918
+ * ```html
1919
+ * <button stButton variante="discret" [stPopconfirm]="'Retirer ce filtre ?'"
1920
+ * libelleConfirmer="Retirer" (confirme)="retirer()">Retirer</button>
1921
+ * ```
1922
+ *
1923
+ * - Un `st-popover` non modal nomme par la question ; le focus va d'abord a « Annuler » (le geste
1924
+ * sur est le premier), Echap annule et rend le focus au declencheur.
1925
+ * - Jamais de variante danger (`VarianteDeConfirmationLegere`) : le destructeur passe par le
1926
+ * dialogue, `StDialog.confirmer`.
1927
+ * - `aria-haspopup="dialog"` et `aria-expanded` sur le declencheur ; `aria-controls` des la
1928
+ * premiere ouverture ; la fleche bas ouvre aussi, comme `[stPopoverTrigger]`.
1929
+ */
1930
+ export declare class StPopconfirm {
1931
+ private readonly element;
1932
+ private readonly vue;
1933
+ /** La question, deja traduite (« Retirer ce filtre ? ») : elle nomme la couche. */
1934
+ readonly stPopconfirm: import("@angular/core").InputSignal<string>;
1935
+ readonly precision: import("@angular/core").InputSignal<string | null>;
1936
+ /** Defaut : « Confirmer ». */
1937
+ readonly libelleConfirmer: import("@angular/core").InputSignal<string | null>;
1938
+ /** Defaut : « Annuler ». */
1939
+ readonly libelleAnnuler: import("@angular/core").InputSignal<string | null>;
1940
+ readonly varianteDeConfirmation: import("@angular/core").InputSignal<VarianteDeConfirmationLegere>;
1941
+ readonly confirme: import("@angular/core").OutputEmitterRef<void>;
1942
+ readonly annule: import("@angular/core").OutputEmitterRef<void>;
1943
+ private readonly panneau;
1944
+ protected readonly ouvert: import("@angular/core").Signal<boolean>;
1945
+ protected readonly controle: import("@angular/core").WritableSignal<string | null>;
1946
+ constructor();
1947
+ protected basculer(): void;
1948
+ /** Fleche bas : ouvre (le focus entre dans la couche), comme `[stPopoverTrigger]`. */
1949
+ protected auClavier(evenement: KeyboardEvent): void;
1950
+ private estIndisponible;
1951
+ /** Le panneau, cree a la premiere ouverture, a cote du declencheur. */
1952
+ private creerLePanneau;
1953
+ static ɵfac: i0.ɵɵFactoryDeclaration<StPopconfirm, never>;
1954
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StPopconfirm, "[stPopconfirm]", never, {
1955
+ "stPopconfirm": {
1956
+ "alias": "stPopconfirm";
1957
+ "required": true;
1958
+ "isSignal": true;
1959
+ };
1960
+ "precision": {
1961
+ "alias": "precision";
1962
+ "required": false;
1963
+ "isSignal": true;
1964
+ };
1965
+ "libelleConfirmer": {
1966
+ "alias": "libelleConfirmer";
1967
+ "required": false;
1968
+ "isSignal": true;
1969
+ };
1970
+ "libelleAnnuler": {
1971
+ "alias": "libelleAnnuler";
1972
+ "required": false;
1973
+ "isSignal": true;
1974
+ };
1975
+ "varianteDeConfirmation": {
1976
+ "alias": "varianteDeConfirmation";
1977
+ "required": false;
1978
+ "isSignal": true;
1979
+ };
1980
+ }, {
1981
+ "confirme": "confirme";
1982
+ "annule": "annule";
1983
+ }, never, never, true, never>;
1984
+ }
1985
+ /**
1986
+ * L'aide contextuelle (lot 265) : un bouton « ? » qui ouvre une couche d'explication, pour un
1987
+ * terme (BIC, TAEG, plafond glissant) que l'aide courte d'un champ ne suffit pas a dire.
1988
+ *
1989
+ * ```html
1990
+ * <st-form-field libelle="BIC">
1991
+ * <st-help-button stAide sujet="BIC">
1992
+ * Le code d'identification de la banque du beneficiaire, 8 ou 11 caracteres.
1993
+ * </st-help-button>
1994
+ * <input stInput … />
1995
+ * </st-form-field>
1996
+ * ```
1997
+ *
1998
+ * - Un bouton natif (clavier, toucher) nomme « Aide : BIC » ; `aria-expanded` et `aria-controls`
1999
+ * par `[stPopoverTrigger]`. Jamais une infobulle : elle ne vit ni au toucher ni sans survol, et ne
2000
+ * porte que du texte court.
2001
+ * - La couche est un `st-popover` NON MODAL, nomme par son titre, decrit par son contenu, avec un
2002
+ * bouton « Fermer » visible ; Echap et « Fermer » rendent le focus au bouton (WCAG 1.4.13).
2003
+ * - Sous la rupture `md` de la fenetre, la meme couche s'ouvre en feuille inferieure.
2004
+ * - Une seule aide ouverte a la fois : ouvrir la suivante emporte le focus, et la precedente se
2005
+ * ferme avec lui.
2006
+ * - Le contenu n'est PAS relie au champ par `aria-describedby` : l'aide courte reste celle du
2007
+ * champ ; celle-ci est demandee.
2008
+ */
2009
+ export declare class StHelpButton {
2010
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
2011
+ /** Ce que l'aide explique, deja traduit : il entre dans le nom du bouton (« Aide : BIC »). */
2012
+ readonly sujet: import("@angular/core").InputSignal<string>;
2013
+ /** Le titre de la couche, qui la nomme ; defaut : le sujet. */
2014
+ readonly titre: import("@angular/core").InputSignal<string | null>;
2015
+ readonly alignement: import("@angular/core").InputSignal<AlignementDePopover>;
2016
+ /** Emis a chaque ouverture : l'application peut mesurer l'usage de l'aide. */
2017
+ readonly ouverture: import("@angular/core").OutputEmitterRef<void>;
2018
+ protected readonly nom: import("@angular/core").Signal<string>;
2019
+ protected readonly titreAffiche: import("@angular/core").Signal<string>;
2020
+ protected readonly idDuContenu: string;
2021
+ private readonly couche;
2022
+ constructor();
2023
+ static ɵfac: i0.ɵɵFactoryDeclaration<StHelpButton, never>;
2024
+ static ɵcmp: i0.ɵɵComponentDeclaration<StHelpButton, "st-help-button", never, {
2025
+ "sujet": {
2026
+ "alias": "sujet";
2027
+ "required": true;
2028
+ "isSignal": true;
2029
+ };
2030
+ "titre": {
2031
+ "alias": "titre";
2032
+ "required": false;
2033
+ "isSignal": true;
2034
+ };
2035
+ "alignement": {
2036
+ "alias": "alignement";
2037
+ "required": false;
2038
+ "isSignal": true;
2039
+ };
2040
+ }, {
2041
+ "ouverture": "ouverture";
2042
+ }, never, ["*"], true, never>;
2043
+ }
2044
+ /**
2045
+ * Voile de chargement pose SUR un conteneur (greffe 228b, planche 9 « verre depoli ») : le
2046
+ * contenu reste en place, attenue et intouchable, une carte dit ce qui se passe.
2047
+ *
2048
+ * ```html
2049
+ * <st-loading-overlay [actif]="signature.isLoading()" titre="Signature en cours" icone="cadenas" flou>
2050
+ * <app-solde />
2051
+ * <div progression>…<st-progress [valeur]="68" etiquette="Chiffrement" /></div>
2052
+ * <div reassurance><st-icon nom="cercle-coche" /> Execution garantie sans doublon</div>
2053
+ * </st-loading-overlay>
2054
+ * ```
2055
+ *
2056
+ * Ce qu'il tient :
2057
+ *
2058
+ * - **le contenu est `inert` et `aria-busy`** tant que le voile est pose : ni clic, ni Tab, ni
2059
+ * lecteur d'ecran n'y entrent (le focus est IMPOSSIBLE sous le voile, pas seulement masque) ;
2060
+ * - **le focus ne se perd pas** : s'il etait dans le contenu a la pose, il passe sur la carte ; a
2061
+ * la levee, il revient ou il etait (si l'element existe encore et que personne ne l'a deplace) ;
2062
+ * - **l'annonce** passe par l'indicateur (`st-spinner`, region `status` qui dit le titre apres
2063
+ * `rythme.delai.annonce`) : la carte ne double pas l'annonce ;
2064
+ * - **le flou est opt-in** (`flou`, D25) et retombe sur un voile OPAQUE quand il ne peut pas
2065
+ * tenir : navigateur sans `backdrop-filter`, `prefers-reduced-transparency`, contraste force.
2066
+ * Jamais de filtre en transition : seule l'opacite du voile arrive en fondu.
2067
+ *
2068
+ * ⚠️ Rien de sensible dessous : un flou de 12 px se lit encore en partie (montants, noms). Un
2069
+ * contenu qui ne doit pas etre vu pendant l'attente ne se voile pas, il se retire.
2070
+ *
2071
+ * L'hote est le conteneur (`position: relative`) : sa mise en page (carte, colonne, hauteur)
2072
+ * appartient a l'appelant, qui la pose par une classe.
2073
+ */
2074
+ export declare class StLoadingOverlay {
2075
+ private readonly document;
2076
+ private readonly injecteur;
2077
+ private readonly identifiants;
2078
+ private readonly hote;
2079
+ /**
2080
+ * Identifiants du titre et de la precision : la carte (`role="group"`) les cite en
2081
+ * `aria-labelledby`/`aria-describedby` pour porter un nom court et unique. Sans eux, la carte
2082
+ * focalisee (generic, tabindex=-1) tirait son nom de tout son contenu — titre, progression et
2083
+ * reassurance lus en double avec l'annonce polie du `st-spinner`.
2084
+ */
2085
+ protected readonly idTitre: string;
2086
+ protected readonly idPrecision: string;
2087
+ /** Pose le voile. */
2088
+ readonly actif: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2089
+ /** Ce qui se passe, en une phrase : titre de la carte et annonce de l'indicateur. */
2090
+ readonly titre: import("@angular/core").InputSignal<string>;
2091
+ /** Precision sous le titre (etape, duree attendue). */
2092
+ readonly sousTitre: import("@angular/core").InputSignal<string | null>;
2093
+ /** Glyphe immobile au centre de l'indicateur (le cadenas d'une operation scellee). */
2094
+ readonly icone: import("@angular/core").InputSignal<Icone | null>;
2095
+ /**
2096
+ * Floute le contenu sous le voile (verre depoli, D25). Opt-in : le voile simple suffit
2097
+ * partout ailleurs, et le flou coute a chaque image composee.
2098
+ */
2099
+ readonly flou: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2100
+ private readonly contenu;
2101
+ private readonly carte;
2102
+ /** L'element qui avait le focus dans le contenu a la pose du voile. */
2103
+ private focusAvantLeVoile;
2104
+ constructor();
2105
+ /**
2106
+ * ⚠️ Lu AVANT le rendu qui pose `inert` : apres, le navigateur a deja retire le focus du
2107
+ * contenu, et on ne saurait plus d'ou il venait.
2108
+ */
2109
+ private aLaPose;
2110
+ private aLaLevee;
2111
+ static ɵfac: i0.ɵɵFactoryDeclaration<StLoadingOverlay, never>;
2112
+ static ɵcmp: i0.ɵɵComponentDeclaration<StLoadingOverlay, "st-loading-overlay", never, {
2113
+ "actif": {
2114
+ "alias": "actif";
2115
+ "required": false;
2116
+ "isSignal": true;
2117
+ };
2118
+ "titre": {
2119
+ "alias": "titre";
2120
+ "required": true;
2121
+ "isSignal": true;
2122
+ };
2123
+ "sousTitre": {
2124
+ "alias": "sousTitre";
2125
+ "required": false;
2126
+ "isSignal": true;
2127
+ };
2128
+ "icone": {
2129
+ "alias": "icone";
2130
+ "required": false;
2131
+ "isSignal": true;
2132
+ };
2133
+ "flou": {
2134
+ "alias": "flou";
2135
+ "required": false;
2136
+ "isSignal": true;
2137
+ };
2138
+ }, {}, never, ["*", "[progression]", "[reassurance]"], true, never>;
2139
+ }
2140
+ export { DIALOG_DATA as DONNEES_DE_DIALOGUE };