@starterlib/ui 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENCES-TIERCES.md +236 -0
  2. package/README.md +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 +10737 -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 +166 -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 +4739 -1120
  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,17 +1,24 @@
1
- import * as _angular_core from '@angular/core';
2
- import { TemplateRef } from '@angular/core';
3
- import * as _starterlib_ui from '@starterlib/ui';
4
- import { AnnonceLocale } from '@starterlib/ui';
5
-
1
+ import { AnnonceLocale, CatalogueDuPointDEntree, Icone, LibellesUi, NiveauDeTitre, NomDIcone } from "@starterlib/ui";
2
+ import * as i0 from "@angular/core";
3
+ import { InjectionToken, Provider, Signal, TemplateRef } from "@angular/core";
4
+ import { DateIso, EtatDeDocument, Ton, sansCommandesDeDirection } from "@starterlib/util";
6
5
  /**
7
6
  * `pages` : page precedente et suivante, pour un tableau.
8
7
  * `suite` : « Afficher plus », pour une liste qui s'allonge.
9
8
  */
10
- type ModeDePagination = 'pages' | 'suite';
9
+ export type ModeDePagination = 'pages' | 'suite';
11
10
  /** Ce qui peut recevoir le focus apres un changement de page. */
12
- interface Focalisable {
13
- focus(options?: FocusOptions): void;
11
+ export interface Focalisable {
12
+ focus(options?: FocusOptions): void;
13
+ /**
14
+ * Facultatif : la cible dit la page AVEC ce qu'elle montre, en une annonce (« Page 2 : 20 lignes
15
+ * affichees » de `st-data-table`) ; la pagination ne la dit plus elle-meme (audit UI du
16
+ * 2026-09-27, D-17).
17
+ */
18
+ annoncerLaPage?(page: string): void;
14
19
  }
20
+ /** Le bouton dont le clic a lance le chargement en cours. */
21
+ type SensDePage = 'precedente' | 'suivante';
15
22
  /**
16
23
  * Pagination d'une liste par curseur.
17
24
  *
@@ -29,55 +36,158 @@ interface Focalisable {
29
36
  * ```
30
37
  *
31
38
  * ⚠️ **Ni total, ni numeros cliquables** : le backend ne compte pas et ne va que
32
- * vers l'avant (audit de la vague 4, V4-2). « Page 3 » se dit ; « page 3 sur 12 »
33
- * serait invente.
39
+ * vers l'avant (audit de la vague 4, V4-2). La page courante se montre dans son carre
40
+ * (planche 4) et se lit « Page 3 » ; « page 3 sur 12 » serait invente (EA-17).
34
41
  *
35
- * ⚠️ **Boutons indisponibles, jamais desactives** : sur la derniere page, « Page
36
- * suivante » garde le focus qu'il avait. Desactive, il le perdrait, et le lecteur
37
- * d'ecran retomberait sur le debut du document.
42
+ * ⚠️ **Boutons indisponibles, jamais desactives** : sur la derniere page, « Suivant »
43
+ * garde le focus qu'il avait. Desactive, il le perdrait, et le lecteur d'ecran
44
+ * retomberait sur le debut du document.
38
45
  *
39
46
  * ⚠️ **Apres un changement de page, le focus va a la `cible`** — la legende du
40
47
  * tableau — et « Page 2 » s'annonce (UX-13). Sans cela, la personne au clavier
41
- * reste en bas, sur « Page suivante », sans savoir que le contenu au-dessus a
42
- * change.
43
- */
44
- declare class StPagination {
45
- protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
46
- private readonly injecteur;
47
- readonly mode: _angular_core.InputSignal<ModeDePagination>;
48
- /** A partir de 1. */
49
- readonly numero: _angular_core.InputSignal<number>;
50
- readonly precedenteDisponible: _angular_core.InputSignalWithTransform<boolean, unknown>;
51
- readonly suivanteDisponible: _angular_core.InputSignalWithTransform<boolean, unknown>;
52
- readonly chargement: _angular_core.InputSignalWithTransform<boolean, unknown>;
53
- /** Nom de la navigation, quand une page en porte plusieurs. */
54
- readonly etiquette: _angular_core.InputSignal<string | null>;
55
- /** Tailles proposees ; vide, pas de choix. Plafonnees a 100. */
56
- readonly taillesDePage: _angular_core.InputSignal<readonly number[]>;
57
- readonly taille: _angular_core.ModelSignal<number>;
58
- /** Recoit le focus apres un changement de page. */
59
- readonly cible: _angular_core.InputSignal<Focalisable | (() => Focalisable | null) | null>;
60
- readonly precedente: _angular_core.OutputEmitterRef<void>;
61
- readonly suivante: _angular_core.OutputEmitterRef<void>;
62
- protected readonly annonce: AnnonceLocale;
63
- protected readonly tailles: _angular_core.Signal<number[]>;
64
- protected readonly etiquetteLue: _angular_core.Signal<string>;
65
- constructor();
66
- protected surTaille(evenement: Event): void;
67
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StPagination, never>;
68
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StPagination, "st-pagination", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "numero": { "alias": "numero"; "required": false; "isSignal": true; }; "precedenteDisponible": { "alias": "precedenteDisponible"; "required": false; "isSignal": true; }; "suivanteDisponible": { "alias": "suivanteDisponible"; "required": false; "isSignal": true; }; "chargement": { "alias": "chargement"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "taillesDePage": { "alias": "taillesDePage"; "required": false; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "cible": { "alias": "cible"; "required": false; "isSignal": true; }; }, { "taille": "tailleChange"; "precedente": "precedente"; "suivante": "suivante"; }, never, never, true, never>;
48
+ * reste en bas, sur « Suivant », sans savoir que le contenu au-dessus a change. Une cible qui
49
+ * sait dire la page (`annoncerLaPage`, `st-data-table`) la dit a la fin du chargement AVEC ses
50
+ * lignes : « Page 2 : 20 lignes affichees », une voix pour un geste (audit UI du 2026-09-27, D-17).
51
+ *
52
+ * ⚠️ **Le bouton clique porte le chargement** (D-12) : « Precedent » tourne quand c'est lui qui
53
+ * l'a lance, et l'autre bouton attend, indisponible. Un rechargement venu d'ailleurs (un filtre,
54
+ * un tri) ne fait tourner aucun des deux.
55
+ *
56
+ * ⚠️ **Rien a montrer, aucun repere** : en mode `suite`, sans suite ni choix de taille, l'hote
57
+ * est `hidden` — un repere de navigation vide s'enumere et ne mene a rien (A1162). Apres une
58
+ * page au moins, « Fin de la liste. » le remplace.
59
+ */
60
+ export declare class StPagination {
61
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
62
+ private readonly locale;
63
+ private readonly injecteur;
64
+ readonly mode: import("@angular/core").InputSignal<ModeDePagination>;
65
+ /** A partir de 1. */
66
+ readonly numero: import("@angular/core").InputSignal<number>;
67
+ readonly precedenteDisponible: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
68
+ readonly suivanteDisponible: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
69
+ readonly chargement: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
70
+ /** Nom de la navigation, quand une page en porte plusieurs. */
71
+ readonly etiquette: import("@angular/core").InputSignal<string | null>;
72
+ /** Tailles proposees ; vide, pas de choix. Plafonnees par `TAILLE_DE_PAGE_MAXIMALE`. */
73
+ readonly taillesDePage: import("@angular/core").InputSignal<readonly number[]>;
74
+ /** Bornee de 1 a `TAILLE_DE_PAGE_MAXIMALE` : une taille hors bornes est ramenee et remontee. */
75
+ readonly taille: import("@angular/core").ModelSignal<number>;
76
+ /**
77
+ * Mode `suite` : nombre d'elements que la derniere suite a ajoutes, annonce a la fin du
78
+ * chargement (« 20 elements de plus »). Sans effet quand la `cible` est une `st-list` : elle
79
+ * compte et annonce elle-meme ce qui est arrive (une seule annonce, jamais deux).
80
+ */
81
+ readonly nombreAjoute: import("@angular/core").InputSignal<number | null>;
82
+ /** Recoit le focus apres un changement de page. */
83
+ readonly cible: import("@angular/core").InputSignal<Focalisable | (() => Focalisable | null) | null>;
84
+ readonly precedente: import("@angular/core").OutputEmitterRef<void>;
85
+ readonly suivante: import("@angular/core").OutputEmitterRef<void>;
86
+ protected readonly annonce: AnnonceLocale;
87
+ /**
88
+ * Le sens du dernier clic, le temps de SON chargement : c'est le bouton clique qui tourne, et non
89
+ * toujours « Suivant » (audit UI du 2026-09-27, D-12).
90
+ */
91
+ private readonly sensDemande;
92
+ /** Le bouton qui charge ; `null` : aucun chargement, ou un rechargement venu d'ailleurs. */
93
+ protected readonly enChargement: import("@angular/core").Signal<SensDePage | null>;
94
+ /** Chaque bouton attend, indisponible, sans sa page ou pendant le chargement d'un autre. */
95
+ protected readonly precedenteBloquee: import("@angular/core").Signal<boolean>;
96
+ protected readonly suivanteBloquee: import("@angular/core").Signal<boolean>;
97
+ /** Le numero et les tailles, ecrits dans la locale du socle (audit UI du 2026-09-27, D-27). */
98
+ protected readonly nombres: import("@angular/core").Signal<Intl.NumberFormat>;
99
+ protected readonly tailleBornee: import("@angular/core").Signal<number>;
100
+ /** Les tailles proposees, et la taille courante a sa place si l'appelant l'a omise. */
101
+ protected readonly tailles: import("@angular/core").Signal<number[]>;
102
+ protected readonly etiquetteLue: import("@angular/core").Signal<string>;
103
+ protected readonly finDeListe: import("@angular/core").Signal<boolean>;
104
+ protected readonly vide: import("@angular/core").Signal<boolean>;
105
+ constructor();
106
+ /** Le bouton clique porte le chargement qu'il demande (D-12). */
107
+ protected demander(sens: SensDePage): void;
108
+ protected surTaille(evenement: Event): void;
109
+ private cibleResolue;
110
+ static ɵfac: i0.ɵɵFactoryDeclaration<StPagination, never>;
111
+ static ɵcmp: i0.ɵɵComponentDeclaration<StPagination, "st-pagination", never, {
112
+ "mode": {
113
+ "alias": "mode";
114
+ "required": false;
115
+ "isSignal": true;
116
+ };
117
+ "numero": {
118
+ "alias": "numero";
119
+ "required": false;
120
+ "isSignal": true;
121
+ };
122
+ "precedenteDisponible": {
123
+ "alias": "precedenteDisponible";
124
+ "required": false;
125
+ "isSignal": true;
126
+ };
127
+ "suivanteDisponible": {
128
+ "alias": "suivanteDisponible";
129
+ "required": false;
130
+ "isSignal": true;
131
+ };
132
+ "chargement": {
133
+ "alias": "chargement";
134
+ "required": false;
135
+ "isSignal": true;
136
+ };
137
+ "etiquette": {
138
+ "alias": "etiquette";
139
+ "required": false;
140
+ "isSignal": true;
141
+ };
142
+ "taillesDePage": {
143
+ "alias": "taillesDePage";
144
+ "required": false;
145
+ "isSignal": true;
146
+ };
147
+ "taille": {
148
+ "alias": "taille";
149
+ "required": false;
150
+ "isSignal": true;
151
+ };
152
+ "nombreAjoute": {
153
+ "alias": "nombreAjoute";
154
+ "required": false;
155
+ "isSignal": true;
156
+ };
157
+ "cible": {
158
+ "alias": "cible";
159
+ "required": false;
160
+ "isSignal": true;
161
+ };
162
+ }, {
163
+ "taille": "tailleChange";
164
+ "precedente": "precedente";
165
+ "suivante": "suivante";
166
+ }, never, never, true, never>;
69
167
  }
70
-
168
+ /** Une ligne rendue : l'element, sa cle de suivi UNIQUE, et son gabarit riche s'il en a un. */
169
+ interface LigneDeDescription<E extends ElementDeDescription> {
170
+ readonly element: E;
171
+ readonly cle: string;
172
+ readonly gabarit: TemplateRef<ContexteDeDescription> | null;
173
+ }
174
+ /**
175
+ * Relie chaque element a son gabarit par sa cle (`cle`, a defaut le terme).
176
+ *
177
+ * Deux termes identiques sans `cle` : le suivi par cle et le gabarit riche se confondraient. Le
178
+ * second est rendu, sous une cle rendue unique, et signale en developpement.
179
+ */
180
+ declare function lignesDeDescription<E extends ElementDeDescription>(elements: readonly E[], gabarits: ReadonlyMap<string, TemplateRef<ContexteDeDescription>>, composant: string): LigneDeDescription<E>[];
71
181
  /** Une paire terme et valeur. `description` nulle : « Non renseigne ». */
72
- interface ElementDeDescription {
73
- /** Relie l'element a un gabarit `stDescription`. Par defaut : le terme. */
74
- readonly cle?: string;
75
- readonly terme: string;
76
- readonly description: string | null;
182
+ export interface ElementDeDescription {
183
+ /** Relie l'element a un gabarit `stDescription`. Par defaut : le terme. */
184
+ readonly cle?: string;
185
+ readonly terme: string;
186
+ readonly description: string | null;
77
187
  }
78
188
  /** Contexte d'un gabarit de description. */
79
- interface ContexteDeDescription {
80
- readonly $implicit: ElementDeDescription;
189
+ export interface ContexteDeDescription {
190
+ readonly $implicit: ElementDeDescription;
81
191
  }
82
192
  /**
83
193
  * Valeur riche d'un element : montant, date, valeur masquee.
@@ -88,12 +198,18 @@ interface ContexteDeDescription {
88
198
  * </ng-template>
89
199
  * ```
90
200
  */
91
- declare class StDescription {
92
- readonly cle: _angular_core.InputSignal<string>;
93
- readonly gabarit: TemplateRef<ContexteDeDescription>;
94
- static ngTemplateContextGuard(_directive: StDescription, _contexte: unknown): _contexte is ContexteDeDescription;
95
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDescription, never>;
96
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StDescription, "ng-template[stDescription]", never, { "cle": { "alias": "stDescription"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
201
+ export declare class StDescription {
202
+ readonly cle: import("@angular/core").InputSignal<string>;
203
+ readonly gabarit: TemplateRef<ContexteDeDescription>;
204
+ static ngTemplateContextGuard(_directive: StDescription, _contexte: unknown): _contexte is ContexteDeDescription;
205
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDescription, never>;
206
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StDescription, "ng-template[stDescription]", never, {
207
+ "cle": {
208
+ "alias": "stDescription";
209
+ "required": true;
210
+ "isSignal": true;
211
+ };
212
+ }, {}, never, never, true, never>;
97
213
  }
98
214
  /**
99
215
  * Liste de descriptions : les proprietes d'un objet, sur une page de detail.
@@ -115,26 +231,37 @@ declare class StDescription {
115
231
  * ⚠️ **Une valeur absente se dit** : « — » a l'ecran, « Non renseigne » au lecteur
116
232
  * d'ecran. Une cellule vide ne distingue pas « aucun » de « pas encore charge ».
117
233
  *
118
- * En colonnes quand la place le permet, empile en dessous : la largeur est celle
119
- * du CONTENEUR, pas de l'ecran — la meme liste dans une carte etroite s'empile
120
- * aussi sur un grand ecran (UX-18).
121
- */
122
- declare class StDescriptionList {
123
- protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
124
- readonly elements: _angular_core.InputSignal<readonly ElementDeDescription[]>;
125
- private readonly gabarits;
126
- protected readonly lignes: _angular_core.Signal<{
127
- element: ElementDeDescription;
128
- gabarit: TemplateRef<ContexteDeDescription> | null;
129
- }[]>;
130
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDescriptionList, never>;
131
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StDescriptionList, "st-description-list", never, { "elements": { "alias": "elements"; "required": true; "isSignal": true; }; }, {}, ["gabarits"], never, true, never>;
234
+ * En colonnes quand la place le permet (30 rem de conteneur : terme sur 3 colonnes de 12,
235
+ * planche 4), empile en dessous : la largeur est celle du CONTENEUR, pas de l'ecran — la meme
236
+ * liste dans une carte etroite s'empile aussi sur un grand ecran (UX-18).
237
+ *
238
+ * `track` par la cle STABLE de l'element (`cle`, a defaut le terme) : deux termes identiques
239
+ * exigent une `cle` (avertissement de developpement).
240
+ */
241
+ export declare class StDescriptionList {
242
+ /**
243
+ * Un texte de donnees : sans commande de direction, et isole par son element (`dir="auto"` ou
244
+ * `<bdi>`), il ne reordonne ni lui-meme ni ce qui l'entoure (audit du 2026-09-26, S-1 ; audit
245
+ * etendu du 2026-09-27, A-2).
246
+ */
247
+ protected readonly affichable: typeof sansCommandesDeDirection;
248
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
249
+ readonly elements: import("@angular/core").InputSignal<readonly ElementDeDescription[]>;
250
+ private readonly gabarits;
251
+ protected readonly lignes: import("@angular/core").Signal<LigneDeDescription<ElementDeDescription>[]>;
252
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDescriptionList, never>;
253
+ static ɵcmp: i0.ɵɵComponentDeclaration<StDescriptionList, "st-description-list", never, {
254
+ "elements": {
255
+ "alias": "elements";
256
+ "required": true;
257
+ "isSignal": true;
258
+ };
259
+ }, {}, ["gabarits"], never, true, never>;
132
260
  }
133
-
134
261
  /** Contexte d'un gabarit d'element de liste. */
135
- interface ContexteDElementDeListe<T> {
136
- readonly $implicit: T;
137
- readonly indice: number;
262
+ export interface ContexteDElementDeListe<T> {
263
+ readonly $implicit: T;
264
+ readonly indice: number;
138
265
  }
139
266
  /**
140
267
  * Rendu d'un element, type par `[stElementDeListeDe]` :
@@ -145,13 +272,44 @@ interface ContexteDElementDeListe<T> {
145
272
  * </ng-template>
146
273
  * ```
147
274
  */
148
- declare class StElementDeListe<T> {
149
- /** Sert seulement au typage du contexte ; nom de l'attribut, d'ou l'absence d'alias. */
150
- readonly stElementDeListeDe: _angular_core.InputSignal<readonly T[] | null | undefined>;
151
- readonly gabarit: TemplateRef<ContexteDElementDeListe<T>>;
152
- static ngTemplateContextGuard<T>(_directive: StElementDeListe<T>, _contexte: unknown): _contexte is ContexteDElementDeListe<T>;
153
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StElementDeListe<any>, never>;
154
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StElementDeListe<any>, "ng-template[stElementDeListe]", never, { "stElementDeListeDe": { "alias": "stElementDeListeDe"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
275
+ export declare class StElementDeListe<T> {
276
+ /** Sert seulement au typage du contexte ; nom de l'attribut, d'ou l'absence d'alias. */
277
+ readonly stElementDeListeDe: import("@angular/core").InputSignal<readonly T[] | null | undefined>;
278
+ readonly gabarit: TemplateRef<ContexteDElementDeListe<T>>;
279
+ static ngTemplateContextGuard<T>(_directive: StElementDeListe<T>, _contexte: unknown): _contexte is ContexteDElementDeListe<T>;
280
+ static ɵfac: i0.ɵɵFactoryDeclaration<StElementDeListe<any>, never>;
281
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StElementDeListe<any>, "ng-template[stElementDeListe]", never, {
282
+ "stElementDeListeDe": {
283
+ "alias": "stElementDeListeDe";
284
+ "required": false;
285
+ "isSignal": true;
286
+ };
287
+ }, {}, never, never, true, never>;
288
+ }
289
+ /**
290
+ * Etat vide riche (icone, action) : remplace le texte de `texteVide`.
291
+ *
292
+ * ```html
293
+ * <ng-template stListeVide><st-empty titre="Aucune notification." icone="boite-de-reception" /></ng-template>
294
+ * ```
295
+ */
296
+ export declare class StListeVide {
297
+ readonly gabarit: TemplateRef<unknown>;
298
+ static ɵfac: i0.ɵɵFactoryDeclaration<StListeVide, never>;
299
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StListeVide, "ng-template[stListeVide]", never, {}, {}, never, never, true, never>;
300
+ }
301
+ /** Un element rendu : sa valeur, son rang et son identifiant (la valeur de `cle`). */
302
+ interface LigneDeListe<T> {
303
+ readonly valeur: T;
304
+ readonly indice: number;
305
+ readonly identifiant: string;
306
+ }
307
+ /** Un groupe d'elements qui se suivent (`groupePar`) : son titre, et ses elements dans l'ordre. */
308
+ interface GroupeDeListe<T> {
309
+ readonly cle: string;
310
+ readonly identifiant: string;
311
+ readonly libelle: string;
312
+ readonly lignes: readonly LigneDeListe<T>[];
155
313
  }
156
314
  /**
157
315
  * Liste d'objets : expeditions, notifications, documents. La forme mobile d'un
@@ -168,38 +326,251 @@ declare class StElementDeListe<T> {
168
326
  * nom, s'ouvre dans un onglet, et laisse les autres boutons de l'element
169
327
  * atteignables.
170
328
  *
171
- * ⚠️ **`focus()` va au premier element AJOUTE** depuis le dernier affichage : apres
172
- * « Afficher plus », la lecture reprend la ou la liste s'est allongee, et non en
173
- * tete. Apres un filtre, la liste raccourcit, et le focus va au premier element.
329
+ * ⚠️ **`focus()` va au premier element AJOUTE** depuis le dernier affichage, et dit combien
330
+ * sont arrives (« 20 elements ajoutes ») : apres « Afficher plus », la lecture reprend la ou
331
+ * la liste s'est allongee, et non en tete. Apres un filtre, la liste raccourcit, et le focus va
332
+ * au premier element. Rien d'arrive depuis le dernier `focus()` (derniere suite vide) : le dernier
333
+ * element, au plus pres du bouton quitte, et non la tete de liste. L'anneau suit le clavier (`:focus-visible`) : apres un clic souris sur
334
+ * « Afficher plus », il ne s'allume pas.
335
+ *
336
+ * ⚠️ **Un objet se rend par un gabarit `stElementDeListe`.** Sans gabarit, la valeur de `cle`
337
+ * s'affiche et une erreur de developpement le signale : l'interpolation d'un objet rendait
338
+ * « [object Object] » (A1167).
339
+ *
340
+ * `groupePar` range les elements sous des titres (« Aujourd'hui », « Hier », lot 258) : une liste
341
+ * par groupe, nommee par son titre, dans la liste ; les elements d'un groupe se SUIVENT (l'application
342
+ * trie), et un titre qui revient plus loin ouvre un nouveau groupe. `focus()` suit l'ordre des
343
+ * elements a travers les groupes.
344
+ *
345
+ * Lignes de la densite du tableau (D29 : 52 / 44 / 36, texte 16 / 14 / 12) et memes
346
+ * capillaires ; `cartes` pose les elements en cartes espacees (planche 10, D51).
174
347
  *
175
348
  * `track` par la cle : un rafraichissement garde le focus sur le bon element.
176
349
  */
177
- declare class StList<T> {
178
- private readonly element;
179
- readonly elements: _angular_core.InputSignal<readonly T[]>;
180
- /** Propriete qui identifie un element. */
181
- readonly cle: _angular_core.InputSignal<keyof T & string>;
182
- /** Nom de la liste, lu a l'entree. */
183
- readonly etiquette: _angular_core.InputSignal<string | null>;
184
- /** `ol` quand l'ordre a un sens : etapes, classement. */
185
- readonly ordonnee: _angular_core.InputSignalWithTransform<boolean, unknown>;
186
- /** Contenu en cours de remplacement : `aria-busy`. */
187
- readonly chargement: _angular_core.InputSignalWithTransform<boolean, unknown>;
188
- protected readonly gabarit: _angular_core.Signal<StElementDeListe<any> | undefined>;
189
- private indiceDuPremierAjout;
190
- protected readonly lignes: _angular_core.Signal<{
191
- valeur: T;
192
- indice: number;
193
- identifiant: string;
194
- }[]>;
195
- constructor();
196
- /** Focus sur le premier element ajoute, ou sur le premier. */
197
- focus(options?: FocusOptions): void;
198
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StList<any>, never>;
199
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StList<any>, "st-list", never, { "elements": { "alias": "elements"; "required": true; "isSignal": true; }; "cle": { "alias": "cle"; "required": true; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "ordonnee": { "alias": "ordonnee"; "required": false; "isSignal": true; }; "chargement": { "alias": "chargement"; "required": false; "isSignal": true; }; }, {}, ["gabarit"], never, true, never>;
350
+ export declare class StList<T> {
351
+ private readonly element;
352
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
353
+ readonly elements: import("@angular/core").InputSignal<readonly T[]>;
354
+ /** Propriete qui identifie un element. */
355
+ readonly cle: import("@angular/core").InputSignal<keyof T & string>;
356
+ /** Nom de la liste, lu a l'entree. */
357
+ readonly etiquette: import("@angular/core").InputSignal<string | null>;
358
+ /** `ol` quand l'ordre a un sens : etapes, classement. */
359
+ readonly ordonnee: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
360
+ /** Contenu en cours de remplacement : `aria-busy`. Sans element, un squelette. */
361
+ readonly chargement: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
362
+ /** Nombre d'elements du squelette du premier chargement. */
363
+ readonly lignesAttendues: import("@angular/core").InputSignalWithTransform<number, unknown>;
364
+ /** Texte de la liste vide. Par defaut : « Aucun element. » ; `stListeVide` le remplace. */
365
+ readonly texteVide: import("@angular/core").InputSignal<string | null>;
366
+ /** Elements en cartes espacees, sans capillaires (planche 10). */
367
+ readonly cartes: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
368
+ /** Le titre du groupe d'un element (« Aujourd'hui ») ; `null` : aucun groupe. */
369
+ readonly groupePar: import("@angular/core").InputSignal<((element: T) => string) | null>;
370
+ protected readonly gabarit: import("@angular/core").Signal<StElementDeListe<any> | undefined>;
371
+ protected readonly gabaritVide: import("@angular/core").Signal<StListeVide | undefined>;
372
+ protected readonly annonce: AnnonceLocale;
373
+ private readonly identifiantDeListe;
374
+ /** Indice vise par le prochain `focus()` ; `null` : rien n'a change depuis le precedent. */
375
+ private indiceDuPremierAjout;
376
+ private nombreAjoute;
377
+ private repliSignale;
378
+ protected readonly lignes: import("@angular/core").Signal<readonly LigneDeListe<T>[]>;
379
+ /**
380
+ * Les groupes, par suite d'elements de meme titre ; `null` sans `groupePar`. Le titre est un texte
381
+ * de l'application : sans commande de direction, et isole par le gabarit.
382
+ */
383
+ protected readonly groupes: import("@angular/core").Signal<readonly GroupeDeListe<T>[] | null>;
384
+ protected readonly squelette: import("@angular/core").Signal<boolean>;
385
+ protected readonly vide: import("@angular/core").Signal<boolean>;
386
+ protected readonly texteVideLu: import("@angular/core").Signal<string>;
387
+ constructor();
388
+ /**
389
+ * Focus sur le premier element ajoute, sur le premier apres un remplacement, sur le dernier si
390
+ * rien n'a change depuis le precedent appel ; un ajout s'annonce.
391
+ */
392
+ focus(options?: FocusOptions): void;
393
+ /**
394
+ * Repli sans gabarit : lisible, et signale une fois en developpement. Une donnee : sans commande
395
+ * de direction, et isolee par le gabarit (`<bdi>`, audit UI du 2026-09-27, D-5).
396
+ */
397
+ protected texteDe(valeur: T): string;
398
+ private texteBrutDe;
399
+ static ɵfac: i0.ɵɵFactoryDeclaration<StList<any>, never>;
400
+ static ɵcmp: i0.ɵɵComponentDeclaration<StList<any>, "st-list", never, {
401
+ "elements": {
402
+ "alias": "elements";
403
+ "required": true;
404
+ "isSignal": true;
405
+ };
406
+ "cle": {
407
+ "alias": "cle";
408
+ "required": true;
409
+ "isSignal": true;
410
+ };
411
+ "etiquette": {
412
+ "alias": "etiquette";
413
+ "required": false;
414
+ "isSignal": true;
415
+ };
416
+ "ordonnee": {
417
+ "alias": "ordonnee";
418
+ "required": false;
419
+ "isSignal": true;
420
+ };
421
+ "chargement": {
422
+ "alias": "chargement";
423
+ "required": false;
424
+ "isSignal": true;
425
+ };
426
+ "lignesAttendues": {
427
+ "alias": "lignesAttendues";
428
+ "required": false;
429
+ "isSignal": true;
430
+ };
431
+ "texteVide": {
432
+ "alias": "texteVide";
433
+ "required": false;
434
+ "isSignal": true;
435
+ };
436
+ "cartes": {
437
+ "alias": "cartes";
438
+ "required": false;
439
+ "isSignal": true;
440
+ };
441
+ "groupePar": {
442
+ "alias": "groupePar";
443
+ "required": false;
444
+ "isSignal": true;
445
+ };
446
+ }, {}, ["gabarit", "gabaritVide"], never, true, never>;
200
447
  }
201
-
202
- type SensDeTri = 'croissant' | 'decroissant';
448
+ /**
449
+ * Anatomie d'un element de liste : `[stAvant]` (avatar, tuile d'icone), le titre et sa
450
+ * precision, ce qui les suit (pastille de statut), puis `[stApres]` (montant) au bord de fin, et
451
+ * `[stActions]` hors de tout lien.
452
+ *
453
+ * ```html
454
+ * <st-list-item carte chevron titre="Banque Epsilon SA" meta="28.09.2026 · RTGS" [lien]="['/ordres', 12]">
455
+ * <st-avatar stAvant nom="Banque Epsilon SA" taille="lg" ton="information" />
456
+ * <st-tag libelle="En attente 2FA" ton="information" />
457
+ * <span stApres>…</span>
458
+ * </st-list-item>
459
+ * ```
460
+ *
461
+ * ⚠️ **Jamais tronque** (H10, EA-25) : titre et precision passent a la ligne. Un nom de
462
+ * contrepartie coupe (« Banque Eps… ») ne se distingue plus de son voisin.
463
+ *
464
+ * ⚠️ **Un seul lien par ligne** (UX-3, lot 258) : `lien` fait de la ligne un lien du routeur qui
465
+ * enveloppe titre, precision, suite et fin (son nom les dit tous, dans l'ordre), et dont la zone
466
+ * couvre tout l'element ; la case et `[stActions]` restent HORS du lien, au-dessus de sa zone. Rien
467
+ * d'interactif dans ce qu'il enveloppe. Sans `lien`, `[stTitre]` remplace le titre texte par le
468
+ * lien de l'application. Le chevron ne fait que le dire, il n'est pas une commande.
469
+ *
470
+ * ⚠️ **Non lu** (`nonLu`) : un point au debut de la ligne ET un mot masque avant le titre (« Non
471
+ * lu »), jamais la seule couleur ; sous contraste force, le point prend `Highlight`.
472
+ *
473
+ * `selectionnable` pose une case native avant la ligne, nommee « Selectionner <titre> »
474
+ * (`selectionne`, modele) ; `carte` : la liste en cartes de la planche 10 (D51), fond
475
+ * `surfaceConteneurBas`, 16 px ; `choisi` : le marqueur de 3 px de l'element ouvert a cote
476
+ * (`aria-current`). Un element mesure 44 px au moins (cible au doigt).
477
+ */
478
+ export declare class StListItem {
479
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
480
+ private readonly catalogue;
481
+ /** Titre texte ; `[stTitre]` projete le remplace (un lien). */
482
+ readonly titre: import("@angular/core").InputSignal<string | null>;
483
+ /** Precision sous le titre : date, reference, canal. */
484
+ readonly meta: import("@angular/core").InputSignal<string | null>;
485
+ readonly carte: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
486
+ /** L'element ouvert a cote de la liste (maitre et detail). */
487
+ readonly choisi: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
488
+ /** Chevron de fin : l'element mene a son detail (par son lien). */
489
+ readonly chevron: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
490
+ /** La route du detail : toute la ligne devient UN lien (hors case et `[stActions]`). */
491
+ readonly lien: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
492
+ /** Un element non lu : un point et un mot masque, avant le titre. */
493
+ readonly nonLu: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
494
+ /** Une case avant la ligne, nommee par le titre (« Selectionner <titre> »). */
495
+ readonly selectionnable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
496
+ readonly selectionne: import("@angular/core").ModelSignal<boolean>;
497
+ /**
498
+ * Titre et precision sont des donnees (un nom de contrepartie, une reference) : sans commande de
499
+ * direction, et isoles (`<bdi>`, `dir="auto"`), ils ne reordonnent ni eux-memes ni la ligne
500
+ * (audit UI du 2026-09-27, D-5).
501
+ */
502
+ protected readonly titreAffiche: import("@angular/core").Signal<string>;
503
+ protected readonly metaAffichee: import("@angular/core").Signal<string>;
504
+ /** Le mot masque d'un element non lu, et la langue de son repli (D-29). */
505
+ protected readonly motNonLu: import("@angular/core").Signal<string>;
506
+ protected readonly langue: import("@angular/core").Signal<string | null>;
507
+ /** « Selectionner Banque Epsilon SA » : le texte du tronc, suivi du titre. */
508
+ protected readonly nomDeLaCase: import("@angular/core").Signal<string>;
509
+ constructor();
510
+ protected basculer(evenement: Event): void;
511
+ static ɵfac: i0.ɵɵFactoryDeclaration<StListItem, never>;
512
+ static ɵcmp: i0.ɵɵComponentDeclaration<StListItem, "st-list-item", never, {
513
+ "titre": {
514
+ "alias": "titre";
515
+ "required": false;
516
+ "isSignal": true;
517
+ };
518
+ "meta": {
519
+ "alias": "meta";
520
+ "required": false;
521
+ "isSignal": true;
522
+ };
523
+ "carte": {
524
+ "alias": "carte";
525
+ "required": false;
526
+ "isSignal": true;
527
+ };
528
+ "choisi": {
529
+ "alias": "choisi";
530
+ "required": false;
531
+ "isSignal": true;
532
+ };
533
+ "chevron": {
534
+ "alias": "chevron";
535
+ "required": false;
536
+ "isSignal": true;
537
+ };
538
+ "lien": {
539
+ "alias": "lien";
540
+ "required": false;
541
+ "isSignal": true;
542
+ };
543
+ "nonLu": {
544
+ "alias": "nonLu";
545
+ "required": false;
546
+ "isSignal": true;
547
+ };
548
+ "selectionnable": {
549
+ "alias": "selectionnable";
550
+ "required": false;
551
+ "isSignal": true;
552
+ };
553
+ "selectionne": {
554
+ "alias": "selectionne";
555
+ "required": false;
556
+ "isSignal": true;
557
+ };
558
+ }, {
559
+ "selectionne": "selectionneChange";
560
+ }, never, ["[stActions]", "[stAvant]", "[stTitre]", "*", "[stApres]"], true, never>;
561
+ }
562
+ export type SensDeTri = 'croissant' | 'decroissant';
563
+ /**
564
+ * Etat suivant d'un cycle de tri.
565
+ *
566
+ * `ternaire` (par defaut) : non trie -> croissant -> decroissant -> non trie. Sans le
567
+ * troisieme etat (`ternaire` a faux) : non trie -> croissant -> decroissant -> croissant,
568
+ * jamais de retour au non-trie apres le premier clic.
569
+ *
570
+ * Fonction PURE, exportee pour qu'un futur consommateur (`st-list`, lot 226) partage le
571
+ * meme cycle sans le recopier.
572
+ */
573
+ export declare function prochainSensOuNul(actuel: SensDeTri | null, ternaire?: boolean): SensDeTri | null;
203
574
  /**
204
575
  * Bouton de tri d'une colonne, pose DANS l'en-tete : `<th><button stSortHeader>`.
205
576
  *
@@ -211,37 +582,102 @@ type SensDeTri = 'croissant' | 'decroissant';
211
582
  * contrat actuel ne le fait pas (audit de la vague 4, V4-3). Trier la page
212
583
  * affichee ferait croire a un tri de toute la liste.
213
584
  *
214
- * Une colonne non triee montre deux chevrons, pour se signaler triable sans
215
- * attendre le survol ; l'icone est decorative, l'etat est lu par `aria-sort`.
585
+ * **Cible = toute la cellule** : le bouton REMPLIT son `th`, dans le flux, en
586
+ * s'etendant sur le rembourrage en ligne de la cellule (marges negatives egales a
587
+ * ce rembourrage) et a la hauteur de commande du mode. Survol et appui portent donc
588
+ * sur la cellule entiere, comme la reference (planche 4, D49), jamais sur le seul
589
+ * texte.
590
+ *
591
+ * **Tri ternaire par defaut** (`ternaire`, D29 avenant) : `prochainSensOuNul`
592
+ * calcule le prochain etat et le rend par `sensDemande` ; l'appelant (ici
593
+ * `st-data-table`) decide seul ce que ce prochain etat signifie (modele, aria-sort,
594
+ * annonce) — le bouton ne connait ni le tri courant de la page, ni son libelle.
595
+ *
596
+ * La colonne triee montre une fleche (`fleche-haut`, `fleche-bas`) ; une colonne non
597
+ * triee montre deux chevrons, pour se signaler triable sans attendre le survol.
598
+ * L'icone est decorative, l'etat est lu par `aria-sort` du `th`.
216
599
  */
217
- declare class StSortHeader {
218
- readonly sens: _angular_core.InputSignal<SensDeTri | null>;
219
- protected readonly icone: _angular_core.Signal<"menu" | "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" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "tri" | "triangle-alerte" | "utilisateur">;
220
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSortHeader, never>;
221
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSortHeader, "button[stSortHeader]", never, { "sens": { "alias": "sens"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
600
+ export declare class StSortHeader {
601
+ readonly sens: import("@angular/core").InputSignal<SensDeTri | null>;
602
+ /** `fin` pour aligner le libelle et le chevron a la fin de la cellule (colonnes numeriques). */
603
+ readonly alignement: import("@angular/core").InputSignal<"debut" | "fin">;
604
+ /** Troisieme etat (non trie) atteignable par un clic de plus. Vrai par defaut (D29 avenant). */
605
+ readonly ternaire: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
606
+ /**
607
+ * Prochain etat DEMANDE par la personne ; l'appelant applique et annonce.
608
+ * ⚠️ Volontairement pas `sensChange` : ce n'est PAS un miroir de `sens` (le composant ne
609
+ * connait pas le tri en cours de la page), donc pas un candidat a `model()`.
610
+ */
611
+ readonly sensDemande: import("@angular/core").OutputEmitterRef<SensDeTri | null>;
612
+ protected readonly icone: import("@angular/core").Signal<"code" | "menu" | "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-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-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">;
613
+ protected basculer(): void;
614
+ static ɵfac: i0.ɵɵFactoryDeclaration<StSortHeader, never>;
615
+ static ɵcmp: i0.ɵɵComponentDeclaration<StSortHeader, "button[stSortHeader]", never, {
616
+ "sens": {
617
+ "alias": "sens";
618
+ "required": false;
619
+ "isSignal": true;
620
+ };
621
+ "alignement": {
622
+ "alias": "alignement";
623
+ "required": false;
624
+ "isSignal": true;
625
+ };
626
+ "ternaire": {
627
+ "alias": "ternaire";
628
+ "required": false;
629
+ "isSignal": true;
630
+ };
631
+ }, {
632
+ "sensDemande": "sensDemande";
633
+ }, never, ["*"], true, never>;
222
634
  }
223
-
224
635
  /** Une colonne, decrite en donnees. */
225
- interface ColonneDeTableau {
226
- /** Identifie la colonne ; par defaut, la propriete affichee. */
227
- readonly cle: string;
228
- readonly libelle: string;
229
- /** `fin` pour les nombres et les montants (UX-4). */
230
- readonly alignement?: 'debut' | 'fin';
231
- /** Seulement si le SERVEUR trie sur cette colonne (V4-3). */
232
- readonly triable?: boolean;
233
- /** Libelle lu mais non affiche : colonne d'actions. Jamais vide. */
234
- readonly libelleMasque?: boolean;
235
- }
236
- interface TriDeTableau {
237
- readonly cle: string;
238
- readonly sens: SensDeTri;
239
- }
240
- type DensiteDeTableau = 'confortable' | 'compacte';
636
+ export interface ColonneDeTableau {
637
+ /** Identifie la colonne ; par defaut, la propriete affichee. */
638
+ readonly cle: string;
639
+ readonly libelle: string;
640
+ /** `fin` pour les nombres et les montants (UX-4). */
641
+ readonly alignement?: 'debut' | 'fin';
642
+ /**
643
+ * Seulement si le SERVEUR trie sur cette colonne (V4-3) : le tableau emet `tri`, il ne
644
+ * reordonne rien. Trier la page affichee a cote d'un tableau est refuse par le lint du depot
645
+ * de la librairie (`triLocalInterdit`, constat A1194) ; une SPA n'en herite qu'a la
646
+ * publication de `@starterlib/eslint-config` (S06).
647
+ */
648
+ readonly triable?: boolean;
649
+ /** Libelle lu mais non affiche : colonne d'actions. Jamais vide. */
650
+ readonly libelleMasque?: boolean;
651
+ /** Largeur suggeree, en `ch` (chiffres) ou en `%` du tableau. Sans unite : ignoree. */
652
+ readonly largeur?: string;
653
+ /**
654
+ * Le libelle d'en-tete peut passer a la ligne. Par defaut, un en-tete tient sur une ligne
655
+ * (il fixe alors la largeur minimale de sa colonne) ; une colonne de texte libre le laisse
656
+ * se replier sur deux lignes, comme « Tiers beneficiaire & IBAN » de la planche 4.
657
+ */
658
+ readonly retourALaLigne?: boolean;
659
+ }
660
+ export interface TriDeTableau {
661
+ readonly cle: string;
662
+ readonly sens: SensDeTri;
663
+ }
664
+ /**
665
+ * Ton d'une ligne (planche 4 : ecriture rejetee) : `danger` pose le papier `dangerDiscret` a
666
+ * 40 % sous la ligne. Le texte de la ligne reste l'affaire des gabarits de cellule, et le ton ne
667
+ * dit rien seul : le statut de la ligne l'ecrit en toutes lettres (WCAG 1.4.1).
668
+ */
669
+ export type TonDeLigne = Extract<Ton, 'danger'>;
670
+ /** Ce que le tableau vide dit : rien du tout, ou rien pour ces filtres (UX-12). */
671
+ export type RaisonDuVide = 'aucune-donnee' | 'aucun-resultat';
672
+ /**
673
+ * Densite d'un tableau : un MODE du socle (D10, D29), le meme que celui de la page.
674
+ * Donnee, elle fait du tableau un ilot de densite ; absente, il suit la page.
675
+ */
676
+ export type DensiteDeTableau = 'confortable' | 'dense' | 'compacte';
241
677
  /** Contexte d'un gabarit de cellule. */
242
- interface ContexteDeCellule<T> {
243
- readonly $implicit: T;
244
- readonly colonne: ColonneDeTableau;
678
+ export interface ContexteDeCellule<T> {
679
+ readonly $implicit: T;
680
+ readonly colonne: ColonneDeTableau;
245
681
  }
246
682
  /**
247
683
  * Rendu d'une cellule, type par `[stCelluleDe]` :
@@ -252,20 +688,31 @@ interface ContexteDeCellule<T> {
252
688
  * </ng-template>
253
689
  * ```
254
690
  */
255
- declare class StCellule<T> {
256
- readonly cle: _angular_core.InputSignal<string>;
257
- /** Sert seulement au typage du contexte ; nom de l'attribut, d'ou l'absence d'alias. */
258
- readonly stCelluleDe: _angular_core.InputSignal<readonly T[] | null | undefined>;
259
- readonly gabarit: TemplateRef<ContexteDeCellule<T>>;
260
- static ngTemplateContextGuard<T>(_directive: StCellule<T>, _contexte: unknown): _contexte is ContexteDeCellule<T>;
261
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCellule<any>, never>;
262
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StCellule<any>, "ng-template[stCellule]", never, { "cle": { "alias": "stCellule"; "required": true; "isSignal": true; }; "stCelluleDe": { "alias": "stCelluleDe"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
691
+ export declare class StCellule<T> {
692
+ readonly cle: import("@angular/core").InputSignal<string>;
693
+ /** Sert seulement au typage du contexte ; nom de l'attribut, d'ou l'absence d'alias. */
694
+ readonly stCelluleDe: import("@angular/core").InputSignal<readonly T[] | null | undefined>;
695
+ readonly gabarit: TemplateRef<ContexteDeCellule<T>>;
696
+ static ngTemplateContextGuard<T>(_directive: StCellule<T>, _contexte: unknown): _contexte is ContexteDeCellule<T>;
697
+ static ɵfac: i0.ɵɵFactoryDeclaration<StCellule<any>, never>;
698
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StCellule<any>, "ng-template[stCellule]", never, {
699
+ "cle": {
700
+ "alias": "stCellule";
701
+ "required": true;
702
+ "isSignal": true;
703
+ };
704
+ "stCelluleDe": {
705
+ "alias": "stCelluleDe";
706
+ "required": false;
707
+ "isSignal": true;
708
+ };
709
+ }, {}, never, never, true, never>;
263
710
  }
264
711
  /** Contenu du tableau vide : un `st-empty`, avec son action. */
265
- declare class StTableauVide {
266
- readonly gabarit: TemplateRef<unknown>;
267
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTableauVide, never>;
268
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StTableauVide, "ng-template[stTableauVide]", never, {}, {}, never, never, true, never>;
712
+ export declare class StTableauVide {
713
+ readonly gabarit: TemplateRef<unknown>;
714
+ static ɵfac: i0.ɵɵFactoryDeclaration<StTableauVide, never>;
715
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StTableauVide, "ng-template[stTableauVide]", never, {}, {}, never, never, true, never>;
269
716
  }
270
717
  /**
271
718
  * Tableau de donnees, sur un `<table>` NATIF.
@@ -299,134 +746,1742 @@ declare class StTableauVide {
299
746
  * - Export, actions de masse : zone `stActionsDeTableau`, et le SERVEUR fait le
300
747
  * travail (V4-5, SEC-4, SEC-5).
301
748
  */
302
- declare class StDataTable<T> {
303
- protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
304
- readonly legende: _angular_core.InputSignal<string>;
305
- /** Lue mais non affichee, quand un titre visible nomme deja le tableau. */
306
- readonly legendeMasquee: _angular_core.InputSignalWithTransform<boolean, unknown>;
307
- readonly colonnes: _angular_core.InputSignal<readonly ColonneDeTableau[]>;
308
- readonly lignes: _angular_core.InputSignal<readonly T[]>;
309
- /** Propriete qui identifie une ligne. Jamais l'indice (FE-1). */
310
- readonly cle: _angular_core.InputSignal<keyof T & string>;
311
- /** Colonne lue comme en-tete de chaque ligne. Par defaut : la premiere. */
312
- readonly enTeteDeLigne: _angular_core.InputSignal<string | null>;
313
- readonly premiereColonneFigee: _angular_core.InputSignalWithTransform<boolean, unknown>;
314
- /** Hauteur maximale, `32rem` : l'en-tete se fige, le corps defile. */
315
- readonly hauteurMax: _angular_core.InputSignal<string | null>;
316
- readonly densite: _angular_core.InputSignal<DensiteDeTableau>;
317
- readonly chargement: _angular_core.InputSignalWithTransform<boolean, unknown>;
318
- readonly selectionnable: _angular_core.InputSignalWithTransform<boolean, unknown>;
319
- readonly selection: _angular_core.ModelSignal<readonly string[]>;
320
- readonly tri: _angular_core.ModelSignal<TriDeTableau | null>;
321
- /** Texte du tableau vide, sans gabarit `stTableauVide`. */
322
- readonly texteVide: _angular_core.InputSignal<string | null>;
323
- private readonly gabarits;
324
- protected readonly gabaritVide: _angular_core.Signal<StTableauVide | undefined>;
325
- private readonly zone;
326
- protected readonly annonce: AnnonceLocale;
327
- protected readonly deborde: _angular_core.WritableSignal<boolean>;
328
- protected readonly largeurFigee: _angular_core.WritableSignal<number>;
329
- protected readonly identifiants: {
330
- readonly legende: `${string}-legende`;
331
- readonly selection: `${string}-selection`;
332
- };
333
- protected readonly cleDEnTete: _angular_core.Signal<string>;
334
- protected readonly cellules: _angular_core.Signal<{
335
- colonne: ColonneDeTableau;
336
- gabarit: TemplateRef<ContexteDeCellule<any>> | null;
337
- enTete: boolean;
338
- }[]>;
339
- protected readonly rangees: _angular_core.Signal<{
340
- valeur: T;
341
- identifiant: string;
342
- nom: string | null;
343
- choisie: boolean;
344
- }[]>;
345
- protected readonly squelette: _angular_core.Signal<number[]>;
346
- protected readonly nombreDeColonnes: _angular_core.Signal<number>;
347
- protected readonly colonnesDeSquelette: _angular_core.Signal<number[]>;
348
- protected readonly toutesChoisies: _angular_core.Signal<boolean>;
349
- protected readonly quelquesChoisies: _angular_core.Signal<boolean>;
350
- constructor();
351
- /** Amene le focus sur le tableau : sa legende est lue (UX-13). */
352
- focus(options?: FocusOptions): void;
353
- protected sensDe(colonne: ColonneDeTableau): SensDeTri | null;
354
- protected ariaSort(colonne: ColonneDeTableau): string | null;
355
- protected trier(colonne: ColonneDeTableau): void;
356
- protected basculerTout(): void;
357
- protected basculer(identifiant: string): void;
358
- protected texteDe(ligne: T, colonne: ColonneDeTableau): string | null;
359
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDataTable<any>, never>;
360
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StDataTable<any>, "st-data-table", never, { "legende": { "alias": "legende"; "required": true; "isSignal": true; }; "legendeMasquee": { "alias": "legendeMasquee"; "required": false; "isSignal": true; }; "colonnes": { "alias": "colonnes"; "required": true; "isSignal": true; }; "lignes": { "alias": "lignes"; "required": true; "isSignal": true; }; "cle": { "alias": "cle"; "required": true; "isSignal": true; }; "enTeteDeLigne": { "alias": "enTeteDeLigne"; "required": false; "isSignal": true; }; "premiereColonneFigee": { "alias": "premiereColonneFigee"; "required": false; "isSignal": true; }; "hauteurMax": { "alias": "hauteurMax"; "required": false; "isSignal": true; }; "densite": { "alias": "densite"; "required": false; "isSignal": true; }; "chargement": { "alias": "chargement"; "required": false; "isSignal": true; }; "selectionnable": { "alias": "selectionnable"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "tri": { "alias": "tri"; "required": false; "isSignal": true; }; "texteVide": { "alias": "texteVide"; "required": false; "isSignal": true; }; }, { "selection": "selectionChange"; "tri": "triChange"; }, ["gabarits", "gabaritVide"], ["[stActionsDeTableau]"], true, never>;
749
+ export declare class StDataTable<T> {
750
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
751
+ private readonly locale;
752
+ readonly legende: import("@angular/core").InputSignal<string>;
753
+ /** Lue mais non affichee, quand un titre visible nomme deja le tableau. */
754
+ readonly legendeMasquee: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
755
+ readonly colonnes: import("@angular/core").InputSignal<readonly ColonneDeTableau[]>;
756
+ readonly lignes: import("@angular/core").InputSignal<readonly T[]>;
757
+ /** Propriete qui identifie une ligne. Jamais l'indice (FE-1). */
758
+ readonly cle: import("@angular/core").InputSignal<keyof T & string>;
759
+ /** Colonne lue comme en-tete de chaque ligne. Par defaut : la premiere. */
760
+ readonly enTeteDeLigne: import("@angular/core").InputSignal<string | null>;
761
+ readonly premiereColonneFigee: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
762
+ /** Hauteur maximale, `32rem` : l'en-tete se fige, le corps defile. */
763
+ readonly hauteurMax: import("@angular/core").InputSignal<string | null>;
764
+ /** Ton de chaque ligne, lu dans la ligne ; `null` : aucun. */
765
+ readonly tonDeLigne: import("@angular/core").InputSignal<((ligne: T) => TonDeLigne | null) | null>;
766
+ /**
767
+ * Ligne qu'on peut choisir (planche 4 : une ecriture rejetee ne l'est pas) ; `null` : toutes.
768
+ * Une ligne exclue a une case DESACTIVEE (etat lu, raison dite par la ligne elle-meme), et
769
+ * n'entre ni dans « tout choisir » ni dans une plage Maj+clic.
770
+ */
771
+ readonly ligneChoisissable: import("@angular/core").InputSignal<((ligne: T) => boolean) | null>;
772
+ /** `undefined` (par defaut) : la densite de la page. Donnee : un ilot de densite. */
773
+ readonly densite: import("@angular/core").InputSignal<DensiteDeTableau | undefined>;
774
+ readonly chargement: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
775
+ /**
776
+ * La fin d'un rechargement s'annonce (« 20 lignes affichees », UX-11) ; vrai par defaut. Faux
777
+ * quand un voisin dit deja le resultat du meme geste : une `st-filter-bar` qui porte
778
+ * `nombreDeResultats` et `chargement` dit « Filtre … retire : 12 resultats », et le tableau le
779
+ * redirait (audit UI du 2026-09-27, D-17). Une `st-pagination` n'en a pas besoin : elle dit sa
780
+ * page AVEC ces lignes, en une annonce (`annoncerLaPage`).
781
+ */
782
+ readonly annonceDeRechargement: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
783
+ readonly selectionnable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
784
+ readonly selection: import("@angular/core").ModelSignal<readonly string[]>;
785
+ readonly tri: import("@angular/core").ModelSignal<TriDeTableau | null>;
786
+ /** Troisieme etat du tri (non trie) atteignable en reclicquant. Vrai par defaut (D29 avenant). */
787
+ readonly triTernaire: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
788
+ /** Texte du tableau vide, sans gabarit `stTableauVide`. Prime sur le texte par defaut de `raisonDuVide`. */
789
+ readonly texteVide: import("@angular/core").InputSignal<string | null>;
790
+ /** Rien du tout, ou rien pour les filtres actifs (UX-12) : deux textes, une action differente. */
791
+ readonly raisonDuVide: import("@angular/core").InputSignal<RaisonDuVide>;
792
+ /** Emis quand la personne demande l'effacement depuis le tableau vide `aucun-resultat`. */
793
+ readonly effacement: import("@angular/core").OutputEmitterRef<void>;
794
+ /** Lignes de squelette au premier chargement ; a lier a la taille de page. Plafond 25. */
795
+ readonly lignesAttendues: import("@angular/core").InputSignal<number>;
796
+ private readonly gabarits;
797
+ protected readonly gabaritVide: import("@angular/core").Signal<StTableauVide | undefined>;
798
+ private readonly zone;
799
+ /** Les `st-selection-bar` rattachees : tant qu'il y en a une, le resume visible est a elle. */
800
+ private readonly barresRattachees;
801
+ protected readonly resumeCede: import("@angular/core").Signal<boolean>;
802
+ /** Case « tout » : cible du focus rendu par `deselectionnerTout` (le bouton disparait). */
803
+ private readonly caseTout;
804
+ private readonly legendeDuTableau;
805
+ protected readonly annonce: AnnonceLocale;
806
+ protected readonly deborde: import("@angular/core").WritableSignal<boolean>;
807
+ /** Du contenu cache avant le bord de debut (ou de fin) de la zone : son ombre se montre. */
808
+ protected readonly ombreDebut: import("@angular/core").WritableSignal<boolean>;
809
+ protected readonly ombreFin: import("@angular/core").WritableSignal<boolean>;
810
+ protected readonly largeurFigee: import("@angular/core").WritableSignal<number>;
811
+ /** Largeur REELLE de la colonne des cases : le decalage de la colonne figee qui la suit. */
812
+ protected readonly decalageFigee: import("@angular/core").WritableSignal<number | null>;
813
+ /** Derniere ligne cochee au clavier ou a la souris : point de depart d'un Maj+clic. */
814
+ private derniereLigneChoisie;
815
+ /** Vu au dernier passage de l'effet de chargement, pour ne detecter QUE la transition. */
816
+ private chargementPrecedent;
817
+ protected readonly identifiants: {
818
+ readonly legende: `${string}-legende`;
819
+ readonly selection: `${string}-selection`;
820
+ readonly aideSelection: `${string}-aide-selection`;
821
+ readonly deborde: `${string}-deborde`;
822
+ };
823
+ protected readonly cleDEnTete: import("@angular/core").Signal<string>;
824
+ protected readonly cellules: import("@angular/core").Signal<{
825
+ colonne: ColonneDeTableau;
826
+ gabarit: TemplateRef<ContexteDeCellule<any>> | null;
827
+ enTete: boolean;
828
+ }[]>;
829
+ /** Les nombres sans gabarit, dans la locale du socle (`ST_LOCALE`), comme `st-number`. */
830
+ private readonly nombres;
831
+ protected readonly rangees: import("@angular/core").Signal<{
832
+ valeur: T;
833
+ identifiant: string;
834
+ nom: string | null;
835
+ choisie: boolean;
836
+ ton: "danger" | null;
837
+ choisissable: boolean;
838
+ }[]>;
839
+ /** `lignesAttendues`, borne a `PLAFOND_DE_SQUELETTE` : un squelette trop long pese plus qu'il n'aide. */
840
+ protected readonly nombreDeLignesDeSquelette: import("@angular/core").Signal<number>;
841
+ protected readonly squelette: import("@angular/core").Signal<number[]>;
842
+ protected readonly nombreDeColonnes: import("@angular/core").Signal<number>;
843
+ protected readonly colonnesDeSquelette: import("@angular/core").Signal<number[]>;
844
+ /** Les lignes qu'une case peut choisir : « tout » et les plages ne visent qu'elles. */
845
+ protected readonly rangeesChoisissables: import("@angular/core").Signal<{
846
+ valeur: T;
847
+ identifiant: string;
848
+ nom: string | null;
849
+ choisie: boolean;
850
+ ton: "danger" | null;
851
+ choisissable: boolean;
852
+ }[]>;
853
+ protected readonly toutesChoisies: import("@angular/core").Signal<boolean>;
854
+ protected readonly quelquesChoisies: import("@angular/core").Signal<boolean>;
855
+ constructor();
856
+ /** Amene le focus sur le tableau : sa legende est lue (UX-13). */
857
+ focus(options?: FocusOptions): void;
858
+ /**
859
+ * La page que `st-pagination` vient d'amener, dite AVEC les lignes affichees, en UNE annonce :
860
+ * « Page 2 : 20 lignes affichees » (contrat `Focalisable`, audit UI du 2026-09-27, D-17). Elle
861
+ * remplace l'annonce de fin de rechargement du meme geste, posee dans la meme region ; sans
862
+ * `annonceDeRechargement`, la page seule.
863
+ */
864
+ annoncerLaPage(page: string): void;
865
+ protected sensDe(colonne: ColonneDeTableau): SensDeTri | null;
866
+ protected ariaSort(colonne: ColonneDeTableau): string | null;
867
+ /**
868
+ * `sens` est le prochain etat DEJA CALCULE par `stSortHeader` (`prochainSensOuNul`, ternaire
869
+ * ou non selon `triTernaire`) : ce composant applique et annonce, il ne recalcule rien.
870
+ */
871
+ protected trier(colonne: ColonneDeTableau, sens: SensDeTri | null): void;
872
+ protected basculerTout(): void;
873
+ /**
874
+ * Porte le focus a la legende du tableau (lot 260) : apres « Annuler la selection » de
875
+ * `st-selection-bar`, la barre disparait avec la selection, et le focus reste dans le tableau au
876
+ * lieu de tomber au corps de la page (WCAG 2.4.3).
877
+ *
878
+ * Masquee (`legendeMasquee`), la legende n'a pas de boite ou montrer un anneau : le focus y
879
+ * deviendrait invisible. Il va alors a la zone, nommee par elle et qui porte son anneau force
880
+ * (audit UI du 2026-09-27, D-23).
881
+ */
882
+ focaliserLaLegende(): void;
883
+ /**
884
+ * Une `st-selection-bar` se rattache (contrat `TableauDeSelection`, relecture du lot 260) : le
885
+ * tableau lui CEDE son resume visible, le compte et « Tout deselectionner », que la barre montre
886
+ * et remplace par « Annuler la selection » ; sa region de statut reste, masquee a l'oeil, et
887
+ * parle seule. Rend la fonction qui detache la barre.
888
+ */
889
+ rattacherUneBarre(): () => void;
890
+ /**
891
+ * Deselectionne toute la page, sans la cocher (bouton « Tout deselectionner » de la barre).
892
+ * Le bouton disparait avec la selection (`@if (selection().length > 0)`) : sans ce renvoi,
893
+ * le focus retomberait sur `body` au clavier (WCAG 2.4.3). La case « tout » reste dans le
894
+ * DOM (elle porte aussi l'aide Maj+clic) : c'est une cible de repli sure.
895
+ */
896
+ protected deselectionnerTout(): void;
897
+ /**
898
+ * Maj+clic etend la selection a la plage entre la derniere ligne cochee et celle-ci
899
+ * (aide donnee par `aria-describedby` sur la case « tout », UX de la vague 4).
900
+ *
901
+ * ⚠️ `evenement.preventDefault()` : sans lui, le navigateur bascule DEJA `checked` avant que
902
+ * ce gestionnaire ne s'execute. Quand l'extension de plage laisse une case DEJA cochee cochee
903
+ * (`true` -> `true`), la valeur liee ne change pas et Angular ne reecrit donc pas la propriete
904
+ * DOM — la case reste decochee par le natif seul, en contradiction avec le modele et
905
+ * `role=status` (WCAG 4.1.2). En empechant le natif d'agir, `[checked]` reste la SEULE source
906
+ * de verite : Angular ecrit la propriete a chaque fois que la valeur change reellement.
907
+ */
908
+ protected basculer(identifiant: string, evenement?: Pick<MouseEvent, 'shiftKey' | 'preventDefault'>): void;
909
+ /**
910
+ * Texte affiche d'une cellule sans gabarit : booleen et nombre localises (UX de la vague 4,
911
+ * A1161), un objet ou une `Date` n'a pas de rendu par defaut sense — erreur de DEVELOPPEMENT
912
+ * (le gabarit `stCellule` manque), et en production un texte qui le dit plutot qu'un silence.
913
+ */
914
+ protected texteDe(ligne: T, colonne: ColonneDeTableau): string | null;
915
+ /** Le compte des lignes rendues (UX-11) : « 20 lignes affichees », ou « Aucun resultat ». */
916
+ private texteDesLignes;
917
+ /**
918
+ * Le texte d'une valeur SIMPLE, celui de sa cellule : une chaine sans commande de direction (un
919
+ * libelle d'operation vient souvent d'un tiers, audit A-2), un booleen dit par le dictionnaire,
920
+ * un nombre dans la locale du socle — `ST_LOCALE`, comme `st-number`, et non la langue du
921
+ * dictionnaire (audit UI du 2026-09-27, D-27). `null` : absente, ou un objet.
922
+ */
923
+ private texteSimple;
924
+ /** Vrai quand `texteDe` rend `null` a cause d'un objet, pas d'une valeur simplement absente. */
925
+ protected estIllisible(ligne: T, colonne: ColonneDeTableau): boolean;
926
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDataTable<any>, never>;
927
+ static ɵcmp: i0.ɵɵComponentDeclaration<StDataTable<any>, "st-data-table", never, {
928
+ "legende": {
929
+ "alias": "legende";
930
+ "required": true;
931
+ "isSignal": true;
932
+ };
933
+ "legendeMasquee": {
934
+ "alias": "legendeMasquee";
935
+ "required": false;
936
+ "isSignal": true;
937
+ };
938
+ "colonnes": {
939
+ "alias": "colonnes";
940
+ "required": true;
941
+ "isSignal": true;
942
+ };
943
+ "lignes": {
944
+ "alias": "lignes";
945
+ "required": true;
946
+ "isSignal": true;
947
+ };
948
+ "cle": {
949
+ "alias": "cle";
950
+ "required": true;
951
+ "isSignal": true;
952
+ };
953
+ "enTeteDeLigne": {
954
+ "alias": "enTeteDeLigne";
955
+ "required": false;
956
+ "isSignal": true;
957
+ };
958
+ "premiereColonneFigee": {
959
+ "alias": "premiereColonneFigee";
960
+ "required": false;
961
+ "isSignal": true;
962
+ };
963
+ "hauteurMax": {
964
+ "alias": "hauteurMax";
965
+ "required": false;
966
+ "isSignal": true;
967
+ };
968
+ "tonDeLigne": {
969
+ "alias": "tonDeLigne";
970
+ "required": false;
971
+ "isSignal": true;
972
+ };
973
+ "ligneChoisissable": {
974
+ "alias": "ligneChoisissable";
975
+ "required": false;
976
+ "isSignal": true;
977
+ };
978
+ "densite": {
979
+ "alias": "densite";
980
+ "required": false;
981
+ "isSignal": true;
982
+ };
983
+ "chargement": {
984
+ "alias": "chargement";
985
+ "required": false;
986
+ "isSignal": true;
987
+ };
988
+ "annonceDeRechargement": {
989
+ "alias": "annonceDeRechargement";
990
+ "required": false;
991
+ "isSignal": true;
992
+ };
993
+ "selectionnable": {
994
+ "alias": "selectionnable";
995
+ "required": false;
996
+ "isSignal": true;
997
+ };
998
+ "selection": {
999
+ "alias": "selection";
1000
+ "required": false;
1001
+ "isSignal": true;
1002
+ };
1003
+ "tri": {
1004
+ "alias": "tri";
1005
+ "required": false;
1006
+ "isSignal": true;
1007
+ };
1008
+ "triTernaire": {
1009
+ "alias": "triTernaire";
1010
+ "required": false;
1011
+ "isSignal": true;
1012
+ };
1013
+ "texteVide": {
1014
+ "alias": "texteVide";
1015
+ "required": false;
1016
+ "isSignal": true;
1017
+ };
1018
+ "raisonDuVide": {
1019
+ "alias": "raisonDuVide";
1020
+ "required": false;
1021
+ "isSignal": true;
1022
+ };
1023
+ "lignesAttendues": {
1024
+ "alias": "lignesAttendues";
1025
+ "required": false;
1026
+ "isSignal": true;
1027
+ };
1028
+ }, {
1029
+ "selection": "selectionChange";
1030
+ "tri": "triChange";
1031
+ "effacement": "effacement";
1032
+ }, ["gabarits", "gabaritVide"], ["[stActionsDeTableau]"], true, never>;
1033
+ }
1034
+ /**
1035
+ * Ce que la barre attend d'un tableau : y rendre le focus, et s'y rattacher pour qu'il lui cede
1036
+ * son resume visible. `st-data-table` le fournit ; un contrat plutot que la classe, qu'un tableau
1037
+ * type (`StDataTable<T>`) ne pourrait pas remplir.
1038
+ */
1039
+ export interface TableauDeSelection {
1040
+ focaliserLaLegende(): void;
1041
+ /** Le tableau masque son compte visible et son « Tout deselectionner » ; rend le detachement. */
1042
+ rattacherUneBarre(): () => void;
1043
+ }
1044
+ /**
1045
+ * La barre des actions de masse (lot 260, absorbe `st-bulk-actions`) : elle n'existe que tant
1046
+ * qu'une ligne est choisie, dit le compte, offre « Tout selectionner (N) » et « Annuler la
1047
+ * selection », et porte les actions de l'application.
1048
+ *
1049
+ * ```html
1050
+ * <st-selection-bar [selection]="choisis()" [total]="total()" [tableau]="tableau"
1051
+ * [nommer]="nommer" (toutSelectionner)="toutChoisir()" (annulation)="choisis.set([])">
1052
+ * <button principales stButton type="button" (click)="signer()">
1053
+ * {{ barre.libelleDeConfirmation('Signer') }}
1054
+ * </button>
1055
+ * </st-selection-bar>
1056
+ * ```
1057
+ *
1058
+ * - UNE seule region de statut : avec un `tableau`, c'est la sienne qui annonce le compte ; la
1059
+ * barre le montre, et le tableau lui cede son resume visible (compte et « Tout deselectionner »).
1060
+ * Sans tableau, la barre porte la region, presente vide des le depart.
1061
+ * - Les actions sont nommees avec le nombre, et une confirmation destructrice le dit dans son titre
1062
+ * (SEC-4 de la vague 4) : `libelleDeConfirmation('Supprimer')` rend « Supprimer 3 virements ».
1063
+ * Le serveur verifie chaque identifiant ; l'intercepteur pose la cle d'idempotence.
1064
+ * - « Annuler la selection » rend le focus a la legende du tableau (a sa zone quand la legende est
1065
+ * masquee, audit UI du 2026-09-27, D-23) : la barre disparait avec la selection, et le focus ne
1066
+ * tombe pas au corps de la page.
1067
+ * - Sous `md` (sa largeur), les actions `[secondaires]` laissent la place a `[plus]`, un
1068
+ * `st-menu` fourni par l'application (`ui/listes` n'importe pas `surfaces`) ; sans `[plus]`,
1069
+ * elles restent visibles, repliees a la ligne : aucune action ne disparait.
1070
+ * - Collee (sticky, jamais fixed) en haut de sa zone de defilement.
1071
+ */
1072
+ export declare class StSelectionBar {
1073
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
1074
+ /** Les cles choisies ; vide : la barre ne se montre pas. */
1075
+ readonly selection: import("@angular/core").InputSignal<readonly string[]>;
1076
+ /** Le compte en texte (« 3 virements selectionnes ») ; defaut : « 3 lignes selectionnees ». */
1077
+ readonly texteDuCompte: import("@angular/core").InputSignal<((nombre: number) => string) | null>;
1078
+ /** Ce que la selection designe, avec son nombre (« 3 virements »), pour les actions. */
1079
+ readonly nommer: import("@angular/core").InputSignal<((nombre: number) => string) | null>;
1080
+ /** Le total que la personne peut choisir, pour « Tout selectionner (N) » ; `null` : inconnu. */
1081
+ readonly total: import("@angular/core").InputSignal<number | null>;
1082
+ /** Le tableau dont la legende recoit le focus a l'annulation, et dont la region parle. */
1083
+ readonly tableau: import("@angular/core").InputSignal<TableauDeSelection | null>;
1084
+ readonly collee: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1085
+ readonly toutSelectionner: import("@angular/core").OutputEmitterRef<void>;
1086
+ readonly annulation: import("@angular/core").OutputEmitterRef<void>;
1087
+ protected readonly nombre: import("@angular/core").Signal<number>;
1088
+ protected readonly compte: import("@angular/core").Signal<string>;
1089
+ protected readonly toutChoisir: import("@angular/core").Signal<string | null>;
1090
+ /**
1091
+ * Le nom d'une action sur la selection, et le titre de sa confirmation : le verbe, puis ce qu'il
1092
+ * vise AVEC son nombre (« Supprimer 3 virements »). SEC-4 : une confirmation de masse dit le
1093
+ * nombre.
1094
+ */
1095
+ libelleDeConfirmation(verbe: string): string;
1096
+ constructor();
1097
+ protected annuler(): void;
1098
+ static ɵfac: i0.ɵɵFactoryDeclaration<StSelectionBar, never>;
1099
+ static ɵcmp: i0.ɵɵComponentDeclaration<StSelectionBar, "st-selection-bar", never, {
1100
+ "selection": {
1101
+ "alias": "selection";
1102
+ "required": true;
1103
+ "isSignal": true;
1104
+ };
1105
+ "texteDuCompte": {
1106
+ "alias": "texteDuCompte";
1107
+ "required": false;
1108
+ "isSignal": true;
1109
+ };
1110
+ "nommer": {
1111
+ "alias": "nommer";
1112
+ "required": false;
1113
+ "isSignal": true;
1114
+ };
1115
+ "total": {
1116
+ "alias": "total";
1117
+ "required": false;
1118
+ "isSignal": true;
1119
+ };
1120
+ "tableau": {
1121
+ "alias": "tableau";
1122
+ "required": false;
1123
+ "isSignal": true;
1124
+ };
1125
+ "collee": {
1126
+ "alias": "collee";
1127
+ "required": false;
1128
+ "isSignal": true;
1129
+ };
1130
+ }, {
1131
+ "toutSelectionner": "toutSelectionner";
1132
+ "annulation": "annulation";
1133
+ }, never, ["[principales]", "[secondaires]", "[plus]"], true, never>;
1134
+ }
1135
+ /**
1136
+ * Ou en est un export : `repos` (rien de demande), `preparation` (le service fabrique le
1137
+ * fichier), `pret` (un lien le telecharge), `refuse` (le refus est projete, `[refus]`).
1138
+ */
1139
+ export type EtatDExport = 'repos' | 'preparation' | 'pret' | 'refuse';
1140
+ /** Ce que le service a produit : ou le telecharger, en quel format, de quelle taille. */
1141
+ export interface ResultatDExport {
1142
+ /** L'adresse du fichier, sur l'origine du BFF : un lien ordinaire, la session le porte. */
1143
+ readonly url: string;
1144
+ /** Le format lisible (« CSV », « PDF »). */
1145
+ readonly format: string;
1146
+ /** En octets ; `null` : inconnue. */
1147
+ readonly taille: number | null;
1148
+ /** Le service a atteint son plafond : l'export ne porte pas tout. */
1149
+ readonly tronque: boolean;
1150
+ /** Les lignes exportees, et le total quand le service le connait. */
1151
+ readonly lignes: number;
1152
+ readonly total: number | null;
1153
+ }
1154
+ /**
1155
+ * Le declenchement d'un export (lot 260) : l'export est SERVEUR (audite, plafonne, drapeau
1156
+ * `tronque` ; V4-5, SEC-5). Le composant ne fabrique aucun fichier : il declenche, puis rend
1157
+ * compte.
1158
+ *
1159
+ * ```html
1160
+ * <st-export-action [etat]="export.etat()" [resultat]="export.resultat()" (demande)="exporter()">
1161
+ * <st-refusal refus [erreur]="export.erreur()!" [message]="messageDuRefus()" />
1162
+ * </st-export-action>
1163
+ * ```
1164
+ *
1165
+ * - `preparation` : le bouton porte `aria-busy`, indisponible, et le dit.
1166
+ * - `pret` : un lien explicite, « Telecharger l'export, CSV, 84 Ko », qui recoit le focus a son
1167
+ * arrivee ; « Export pret » s'annonce poliment ; la troncature se dit en mots et en nombres.
1168
+ * - `refuse` : le refus projete (`st-refusal`), jamais un toast.
1169
+ */
1170
+ export declare class StExportAction {
1171
+ private readonly injecteur;
1172
+ private readonly document;
1173
+ private readonly hote;
1174
+ /** La troncature decrit le lien pret (audit du 2026-09-27, D-22). */
1175
+ protected readonly identifiantDeLaTroncature: string;
1176
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
1177
+ private readonly locale;
1178
+ protected readonly annonce: AnnonceLocale;
1179
+ readonly etat: import("@angular/core").InputSignal<EtatDExport>;
1180
+ readonly resultat: import("@angular/core").InputSignal<ResultatDExport | null>;
1181
+ /** Le libelle du bouton ; defaut : « Exporter ». */
1182
+ readonly libelle: import("@angular/core").InputSignal<string | null>;
1183
+ /** La personne demande l'export : l'application appelle le service. */
1184
+ readonly demande: import("@angular/core").OutputEmitterRef<void>;
1185
+ /** Le lien pret : l'element, et non le composant `stLink` que le repere designerait. */
1186
+ private readonly lien;
1187
+ protected readonly libelleDuBouton: import("@angular/core").Signal<string>;
1188
+ /**
1189
+ * L'adresse du lien pret, si elle reste sur l'origine de la page (audit du 2026-09-27, A-9) :
1190
+ * sinon aucun lien n'est pose, et le developpement le dit.
1191
+ */
1192
+ protected readonly adresse: import("@angular/core").Signal<string | null>;
1193
+ protected readonly nomDuLien: import("@angular/core").Signal<string>;
1194
+ protected readonly troncature: import("@angular/core").Signal<string | null>;
1195
+ constructor();
1196
+ static ɵfac: i0.ɵɵFactoryDeclaration<StExportAction, never>;
1197
+ static ɵcmp: i0.ɵɵComponentDeclaration<StExportAction, "st-export-action", never, {
1198
+ "etat": {
1199
+ "alias": "etat";
1200
+ "required": false;
1201
+ "isSignal": true;
1202
+ };
1203
+ "resultat": {
1204
+ "alias": "resultat";
1205
+ "required": false;
1206
+ "isSignal": true;
1207
+ };
1208
+ "libelle": {
1209
+ "alias": "libelle";
1210
+ "required": false;
1211
+ "isSignal": true;
1212
+ };
1213
+ }, {
1214
+ "demande": "demande";
1215
+ }, never, ["[refus]"], true, never>;
361
1216
  }
362
-
363
1217
  /**
364
1218
  * Filtre actif, retirable : « Statut : Expediee ✕ ».
365
1219
  *
366
1220
  * ```html
367
1221
  * <button stFilterChip libelle="Statut : Expediee" (click)="retirer('statut')"></button>
1222
+ * <button stFilterChip libelle="Devise : CHF (Impose)" verrouille></button>
368
1223
  * ```
369
1224
  *
370
1225
  * ⚠️ **Toute la puce est le bouton**, et son nom CONTIENT le texte visible —
371
1226
  * « Retirer le filtre Statut : Expediee » (WCAG 2.5.3) : une commande vocale
372
- * « cliquer Statut » l'atteint. Une croix seule, a cote d'un texte inerte, serait
373
- * une cible de quelques pixels sans nom.
1227
+ * « cliquer Statut » l'atteint. La croix est DESSINEE dans la puce (planche 4) :
1228
+ * une croix seule, a cote d'un texte inerte, serait une cible de quelques pixels sans nom.
1229
+ *
1230
+ * ⚠️ **Verrouillee : `aria-disabled`, jamais `disabled`.** Un filtre impose par le contexte
1231
+ * (devise du compte, perimetre du role) se lit et se focalise, mais ne se retire pas : cadenas
1232
+ * a la place de la croix, nom « Devise : CHF, filtre verrouille », et ses clics sont AVALES
1233
+ * avant tout ecouteur de l'appelant (aucune sortie). Retire du parcours, il disparaitrait
1234
+ * pour qui navigue au clavier sans que la liste des filtres ne dise pourquoi.
1235
+ *
1236
+ * 36 px au pointeur fin (planche 4), 44 au doigt.
374
1237
  */
375
- declare class StFilterChip {
376
- private readonly libelles;
377
- readonly libelle: _angular_core.InputSignal<string>;
378
- protected readonly nom: _angular_core.Signal<string>;
379
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StFilterChip, never>;
380
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StFilterChip, "button[stFilterChip]", never, { "libelle": { "alias": "libelle"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1238
+ export declare class StFilterChip {
1239
+ private readonly libelles;
1240
+ readonly libelle: import("@angular/core").InputSignal<string>;
1241
+ /** Valeur a chasse fixe (compte, reference) : tout le libelle en mono, chiffres alignes. */
1242
+ readonly mono: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1243
+ /** Filtre impose : lu, focalisable, jamais retire. */
1244
+ readonly verrouille: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1245
+ /**
1246
+ * Le libelle compose par l'application porte une donnee (un nom, un IBAN) : sans commande de
1247
+ * direction, a l'ecran (isole, `dir="auto"`) comme dans le nom (audit UI du 2026-09-27, D-5).
1248
+ */
1249
+ protected readonly libelleAffiche: import("@angular/core").Signal<string>;
1250
+ protected readonly nom: import("@angular/core").Signal<string>;
1251
+ constructor();
1252
+ static ɵfac: i0.ɵɵFactoryDeclaration<StFilterChip, never>;
1253
+ static ɵcmp: i0.ɵɵComponentDeclaration<StFilterChip, "button[stFilterChip]", never, {
1254
+ "libelle": {
1255
+ "alias": "libelle";
1256
+ "required": true;
1257
+ "isSignal": true;
1258
+ };
1259
+ "mono": {
1260
+ "alias": "mono";
1261
+ "required": false;
1262
+ "isSignal": true;
1263
+ };
1264
+ "verrouille": {
1265
+ "alias": "verrouille";
1266
+ "required": false;
1267
+ "isSignal": true;
1268
+ };
1269
+ }, {}, never, never, true, never>;
381
1270
  }
382
-
383
1271
  /** Un filtre en vigueur, tel qu'il se lit : « Statut : Expediee ». */
384
- interface FiltreActif {
385
- readonly cle: string;
386
- readonly libelle: string;
1272
+ export interface FiltreActif {
1273
+ readonly cle: string;
1274
+ readonly libelle: string;
1275
+ /** Filtre impose par le contexte : cadenas, jamais retire (ni par sa puce, ni par l'effacement). */
1276
+ readonly verrouille?: boolean;
1277
+ /** Valeur a chasse fixe (compte, reference). */
1278
+ readonly mono?: boolean;
387
1279
  }
388
1280
  /**
389
- * Barre de filtres : les champs, puis les filtres en vigueur, retirables.
1281
+ * `immediat` : les filtres s'appliquent au changement, par l'application ; Entree n'envoie rien.
1282
+ * `soumission` : les champs texte attendent ; Entree et « Appliquer les filtres » emettent
1283
+ * `application`.
1284
+ */
1285
+ export type ModeDeFiltrage = 'immediat' | 'soumission';
1286
+ /**
1287
+ * Barre de filtres : un en-tete (titre, nombre de resultats, « Effacer les filtres »), les
1288
+ * champs, puis les filtres en vigueur, retirables (planche 4, module 4.1).
390
1289
  *
391
1290
  * ```html
392
- * <st-filter-bar [filtresActifs]="actifs()" (retrait)="retirer($event)" (effacement)="effacer()">
1291
+ * <st-filter-bar
1292
+ * etiquette="Criteres de recherche"
1293
+ * [filtresActifs]="actifs()"
1294
+ * [nombreDeResultats]="page.value()?.content.length ?? null"
1295
+ * (retrait)="retirer($event)"
1296
+ * (effacement)="effacer()"
1297
+ * >
393
1298
  * <st-select libelle="Statut" [options]="statuts" [(value)]="statut" />
394
1299
  * </st-filter-bar>
395
1300
  * ```
396
1301
  *
397
- * Un formulaire NOMME : repere « Filtres » dans la liste des reperes du lecteur
398
- * d'ecran. Pas un repere `search` : un `st-search-field` pose dedans en porte deja
399
- * un, et deux reperes imbriques se liraient en double.
400
- *
401
- * ⚠️ **Les filtres s'appliquent au changement**, par l'application : Entree dans
402
- * un champ n'envoie rien, et ne recharge pas la page.
403
- *
404
- * ⚠️ **Retirer un filtre rend le focus a la puce suivante**, sinon a la
405
- * precedente, sinon au formulaire ; « Effacer les filtres » le rend au formulaire
406
- * (UX-14). Le focus ne tombe jamais sur le document, et le retrait s'annonce.
407
- *
408
- * ⚠️ **Dans l'adresse, des valeurs d'enumeration seulement** (SEC-2) : un texte
409
- * cherche, un nom, un IBAN n'y vont pas. Le composant ne touche pas a l'adresse ;
410
- * la regle est pour l'application qui le ferait.
411
- */
412
- declare class StFilterBar {
413
- protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
414
- private readonly element;
415
- private readonly injecteur;
416
- /** Nom du formulaire. Par defaut : « Filtres ». */
417
- readonly etiquette: _angular_core.InputSignal<string | null>;
418
- readonly filtresActifs: _angular_core.InputSignal<readonly FiltreActif[]>;
419
- readonly retrait: _angular_core.OutputEmitterRef<string>;
420
- readonly effacement: _angular_core.OutputEmitterRef<void>;
421
- protected readonly annonce: AnnonceLocale;
422
- protected readonly identifiantActifs: string;
423
- protected readonly etiquetteLue: _angular_core.Signal<string>;
424
- protected retirer(filtre: FiltreActif, indice: number): void;
425
- protected effacer(): void;
426
- private apresLeRendu;
427
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StFilterBar, never>;
428
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StFilterBar, "st-filter-bar", never, { "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "filtresActifs": { "alias": "filtresActifs"; "required": false; "isSignal": true; }; }, { "retrait": "retrait"; "effacement": "effacement"; }, never, ["*"], true, never>;
1302
+ * Un formulaire NOMME par son titre : repere « Filtres » dans la liste des reperes du lecteur
1303
+ * d'ecran. Pas un repere `search` : un `st-search-field` pose dedans en porte deja un, et deux
1304
+ * reperes imbriques se liraient en double.
1305
+ *
1306
+ * ⚠️ **Le focus suit le retrait REEL.** `filtresActifs` appartient a l'application : la barre
1307
+ * emet `retrait(cle)` et attend que la cle ait quitte la liste (rechargement de la page de
1308
+ * resultats compris) avant de rendre le focus a la puce suivante, sinon a la precedente, sinon au
1309
+ * titre (A1160). Focaliser des le rendu suivant visait la puce encore presente, puis le document
1310
+ * quand elle disparaissait. « Effacer les filtres » le rend au titre, un mot lu (UX-14). Si la
1311
+ * personne est allee ailleurs pendant l'attente (un champ, pour taper), le focus y reste : il n'est
1312
+ * rendu que s'il a ete perdu avec la puce, ou s'il est encore sur ce qui a demande le retrait.
1313
+ *
1314
+ * ⚠️ **Un geste, une voix** (audit UI du 2026-09-27, D-17). Le retrait d'une puce, ou l'effacement,
1315
+ * se dit quand ses resultats sont la, AVEC leur nombre : « Filtre Pays : France retire :
1316
+ * 12 resultats », une annonce et non trois. Jusqu'au rendu de ce nombre, sa region se tait
1317
+ * (`aria-busy`). Le nombre n'entre dans la phrase que si la barre a vu le rechargement
1318
+ * (`chargement`) ou le nombre changer : lier les deux. Un `st-data-table` sous la barre prend alors
1319
+ * `[annonceDeRechargement]="false"` : ses « 12 lignes affichees » rediraient le meme resultat.
1320
+ *
1321
+ * ⚠️ **Dans l'adresse, des valeurs d'enumeration seulement** (SEC-2) : un texte cherche, un
1322
+ * nom, un IBAN n'y vont pas. Le composant ne touche pas a l'adresse ; la regle est pour
1323
+ * l'application qui le ferait.
1324
+ */
1325
+ export declare class StFilterBar {
1326
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
1327
+ private readonly injecteur;
1328
+ private readonly document;
1329
+ /** Titre visible et nom du formulaire. Par defaut : « Filtres ». */
1330
+ readonly etiquette: import("@angular/core").InputSignal<string | null>;
1331
+ /** Precision sous le titre. */
1332
+ readonly description: import("@angular/core").InputSignal<string | null>;
1333
+ readonly filtresActifs: import("@angular/core").InputSignal<readonly FiltreActif[]>;
1334
+ readonly mode: import("@angular/core").InputSignal<ModeDeFiltrage>;
1335
+ /** Resultats de la recherche en cours, dits la ou la question se pose. `null` : non affiche. */
1336
+ readonly nombreDeResultats: import("@angular/core").InputSignal<number | null>;
1337
+ /** Resultats en cours de rechargement : `aria-busy`, les puces restent lisibles. */
1338
+ readonly chargement: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1339
+ readonly retrait: import("@angular/core").OutputEmitterRef<string>;
1340
+ readonly effacement: import("@angular/core").OutputEmitterRef<void>;
1341
+ /** Mode `soumission` : Entree dans un champ, ou « Appliquer les filtres ». */
1342
+ readonly application: import("@angular/core").OutputEmitterRef<void>;
1343
+ protected readonly annonce: AnnonceLocale;
1344
+ private readonly identifiant;
1345
+ protected readonly identifiantTitre: string;
1346
+ protected readonly identifiantActifs: string;
1347
+ private readonly titre;
1348
+ private readonly puces;
1349
+ protected readonly etiquetteLue: import("@angular/core").Signal<string>;
1350
+ protected readonly effacables: import("@angular/core").Signal<boolean>;
1351
+ protected readonly texteDesResultats: import("@angular/core").Signal<string | null>;
1352
+ private enAttente;
1353
+ private geste;
1354
+ /** La levee differee de `resultatsEnAttente`, qu'un nouveau geste annule. */
1355
+ private levee;
1356
+ /** Du geste au rendu de ses resultats : la region du nombre se tait (`aria-busy`, D-17). */
1357
+ protected readonly resultatsEnAttente: import("@angular/core").WritableSignal<boolean>;
1358
+ constructor();
1359
+ protected retirer(filtre: FiltreActif, indice: number): void;
1360
+ protected effacer(): void;
1361
+ /** La confirmation du geste attend ses resultats pour se dire avec eux (D-17). */
1362
+ private attendreLesResultats;
1363
+ protected soumettre(evenement: Event): void;
1364
+ static ɵfac: i0.ɵɵFactoryDeclaration<StFilterBar, never>;
1365
+ static ɵcmp: i0.ɵɵComponentDeclaration<StFilterBar, "st-filter-bar", never, {
1366
+ "etiquette": {
1367
+ "alias": "etiquette";
1368
+ "required": false;
1369
+ "isSignal": true;
1370
+ };
1371
+ "description": {
1372
+ "alias": "description";
1373
+ "required": false;
1374
+ "isSignal": true;
1375
+ };
1376
+ "filtresActifs": {
1377
+ "alias": "filtresActifs";
1378
+ "required": false;
1379
+ "isSignal": true;
1380
+ };
1381
+ "mode": {
1382
+ "alias": "mode";
1383
+ "required": false;
1384
+ "isSignal": true;
1385
+ };
1386
+ "nombreDeResultats": {
1387
+ "alias": "nombreDeResultats";
1388
+ "required": false;
1389
+ "isSignal": true;
1390
+ };
1391
+ "chargement": {
1392
+ "alias": "chargement";
1393
+ "required": false;
1394
+ "isSignal": true;
1395
+ };
1396
+ }, {
1397
+ "retrait": "retrait";
1398
+ "effacement": "effacement";
1399
+ "application": "application";
1400
+ }, never, ["*"], true, never>;
1401
+ }
1402
+ /**
1403
+ * Ce qu'un `st-accordion` offre aux `st-disclosure` qu'il projette. Interne au point d'entree : il
1404
+ * n'est pas exporte, et une section hors d'un accordeon ne le trouve pas.
1405
+ *
1406
+ * Des fonctions, fournies par l'accordeon a ses seules sections : la section lit le nom du groupe
1407
+ * exclusif et signale sa bascule, sans que l'accordeon expose rien de plus que son API (D85).
1408
+ */
1409
+ interface ContexteDAccordeon {
1410
+ /** Nom natif du groupe exclusif (`details[name]`, D86), ou `null`. */
1411
+ nomDuGroupe(): string | null;
1412
+ /** Une section vient de basculer (evenement `toggle`) : l'accordeon met son modele a jour. */
1413
+ sectionBasculee(section: StDisclosure): void;
1414
+ }
1415
+ declare const CONTEXTE_D_ACCORDEON: InjectionToken<ContexteDAccordeon>;
1416
+ /**
1417
+ * Section repliable, sur `details` et `summary` natifs (lot 246, ADR 0005 D83 a D87).
1418
+ *
1419
+ * ```html
1420
+ * <st-disclosure libelle="Justificatifs acceptes" resume="3 documents" [niveauDuTitre]="3">
1421
+ * <st-list ... />
1422
+ * </st-disclosure>
1423
+ * ```
1424
+ *
1425
+ * ⚠️ **Le navigateur porte l'etat.** `summary` est un bouton natif : son etat deplie est annonce,
1426
+ * Entree et Espace le basculent, et la recherche dans la page ouvre une section fermee qui contient
1427
+ * le texte cherche (D87). Aucun ARIA n'est ecrit, sauf pour une section indisponible (D84).
1428
+ *
1429
+ * ⚠️ **Le libelle ne change jamais avec l'etat** (« Afficher » puis « Masquer » est l'anti-patron
1430
+ * refuse pour `st-code`) : le chevron tourne, et le lecteur d'ecran dit « replie » ou « deplie ».
1431
+ *
1432
+ * `ouvert` suit l'evenement `toggle` : il dit ce que l'utilisateur voit, qu'il ait clique, tape
1433
+ * au clavier ou cherche dans la page. L'appelant peut aussi l'ecrire.
1434
+ *
1435
+ * ⚠️ **Le titre est DANS le `summary`, et non autour d'un bouton** (patron APG « titre > bouton »
1436
+ * ecarte, audit UI du 2026-09-27, D-32). HTML l'admet (le contenu d'un `summary` peut commencer
1437
+ * par un titre), mais le `summary` est expose en bouton, dont les enfants sont presentationnels
1438
+ * pour une partie des lecteurs d'ecran : selon le couple navigateur et lecteur, le titre peut
1439
+ * manquer a la navigation par titres. Le patron APG le garantirait, au prix de ce que porte le
1440
+ * natif (D83 a D87) : l'etat deplie dit sans ARIA, la recherche dans la page qui ouvre une section
1441
+ * fermee, le groupe exclusif par `name`, l'impression par `::details-content`. Un changement de
1442
+ * structure, a trancher par ADR sur une mesure au banc (lecteurs d'ecran reels), et non un
1443
+ * correctif.
1444
+ *
1445
+ * A l'impression, la section s'ouvre, puis reprend son etat (D87) : un releve imprime ne cache
1446
+ * rien. Aucune animation de hauteur (03 §3.10) : seul le chevron tourne.
1447
+ */
1448
+ export declare class StDisclosure {
1449
+ protected readonly accordeon: ContexteDAccordeon | null;
1450
+ private readonly details;
1451
+ /** Texte visible du declencheur, identique ouvert et ferme. */
1452
+ readonly libelle: import("@angular/core").InputSignal<string>;
1453
+ /** Precision lue apres le libelle (« 3 documents ») ; facultative. */
1454
+ readonly resume: import("@angular/core").InputSignal<string | null>;
1455
+ /** La section est depliee. Suit l'evenement `toggle` ; l'appelant peut l'ecrire. */
1456
+ readonly ouvert: import("@angular/core").ModelSignal<boolean>;
1457
+ /**
1458
+ * Niveau du titre qui porte le libelle, pour une page de contenu (FAQ, conditions) : la section
1459
+ * entre dans le plan de la page. `null` : aucun titre. ⚠️ Titre pose DANS le `summary` : voir la
1460
+ * limite dite plus haut (D-32).
1461
+ */
1462
+ readonly niveauDuTitre: import("@angular/core").InputSignal<NiveauDeTitre | null>;
1463
+ /**
1464
+ * La section existe mais ne s'ouvre pas encore. Son declencheur reste focalisable et dit
1465
+ * pourquoi (`raisonIndisponible`, reliee par `aria-describedby`), comme un bouton indisponible
1466
+ * (D39, D84).
1467
+ */
1468
+ readonly indisponible: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1469
+ readonly raisonIndisponible: import("@angular/core").InputSignal<string | null>;
1470
+ /** Cle de la section dans un `st-accordion` (son modele `ouverts`). */
1471
+ readonly valeur: import("@angular/core").InputSignal<string | null>;
1472
+ protected readonly identifiantDeRaison: string;
1473
+ protected readonly raisonLue: import("@angular/core").Signal<string | null>;
1474
+ /** Etat d'avant l'impression, le temps qu'elle dure. */
1475
+ private avantLImpression;
1476
+ /** Le navigateur a bascule la section : le modele dit ce qui est montre. */
1477
+ protected basculee(): void;
1478
+ /** Une section indisponible ne s'ouvre ni au clic, ni a Entree, ni a Espace. */
1479
+ protected activation(evenement: Event): void;
1480
+ /**
1481
+ * D87 : tout s'imprime ouvert. Le `name` d'un groupe exclusif est retire le temps de
1482
+ * l'impression : sans cela, ouvrir une section fermerait les autres.
1483
+ */
1484
+ protected ouvrirPourLImpression(): void;
1485
+ protected restaurerApresLImpression(): void;
1486
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDisclosure, never>;
1487
+ static ɵcmp: i0.ɵɵComponentDeclaration<StDisclosure, "st-disclosure", never, {
1488
+ "libelle": {
1489
+ "alias": "libelle";
1490
+ "required": true;
1491
+ "isSignal": true;
1492
+ };
1493
+ "resume": {
1494
+ "alias": "resume";
1495
+ "required": false;
1496
+ "isSignal": true;
1497
+ };
1498
+ "ouvert": {
1499
+ "alias": "ouvert";
1500
+ "required": false;
1501
+ "isSignal": true;
1502
+ };
1503
+ "niveauDuTitre": {
1504
+ "alias": "niveauDuTitre";
1505
+ "required": false;
1506
+ "isSignal": true;
1507
+ };
1508
+ "indisponible": {
1509
+ "alias": "indisponible";
1510
+ "required": false;
1511
+ "isSignal": true;
1512
+ };
1513
+ "raisonIndisponible": {
1514
+ "alias": "raisonIndisponible";
1515
+ "required": false;
1516
+ "isSignal": true;
1517
+ };
1518
+ "valeur": {
1519
+ "alias": "valeur";
1520
+ "required": false;
1521
+ "isSignal": true;
1522
+ };
1523
+ }, {
1524
+ "ouvert": "ouvertChange";
1525
+ }, never, ["*"], true, never>;
1526
+ }
1527
+ /**
1528
+ * Groupe de sections repliables : des `st-disclosure` projetees, un filet entre elles (lot 246,
1529
+ * ADR 0005 D83 a D87).
1530
+ *
1531
+ * ```html
1532
+ * <st-accordion toutAfficher [(ouverts)]="sections">
1533
+ * <st-disclosure valeur="frais" libelle="Frais" [niveauDuTitre]="3">...</st-disclosure>
1534
+ * <st-disclosure valeur="plafonds" libelle="Plafonds" [niveauDuTitre]="3">...</st-disclosure>
1535
+ * </st-accordion>
1536
+ * ```
1537
+ *
1538
+ * `ouverts` : les `valeur` des sections ouvertes. Vide au depart, il prend l'etat des sections
1539
+ * (leur `ouvert`) ; fourni, il l'impose. Il suit ensuite chaque bascule, et l'appelant peut
1540
+ * l'ecrire (un lien profond vers une section).
1541
+ *
1542
+ * `exclusif` : une seule section ouverte a la fois, par le `name` natif des `details` ; la ou le
1543
+ * navigateur ne le connait pas (Firefox 129, plancher du socle), l'accordeon ferme lui-meme les
1544
+ * autres (D86).
1545
+ *
1546
+ * `toutAfficher` : un bouton « Tout afficher » au libelle STABLE, dont `aria-expanded` dit si tout
1547
+ * est ouvert ; il ouvre tout, ou replie tout quand tout est deja ouvert (D84). Jamais rendu dans
1548
+ * un accordeon exclusif, qui ne peut pas tout ouvrir.
1549
+ */
1550
+ export declare class StAccordion {
1551
+ private readonly fenetre;
1552
+ private readonly nomNatif;
1553
+ /** Une seule section ouverte a la fois. */
1554
+ readonly exclusif: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1555
+ /** Un bouton « Tout afficher » avant les sections (sans effet si `exclusif`). */
1556
+ readonly toutAfficher: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1557
+ /** Les `valeur` des sections ouvertes, dans l'ordre des sections. */
1558
+ readonly ouverts: import("@angular/core").ModelSignal<readonly string[]>;
1559
+ protected readonly sections: import("@angular/core").Signal<readonly StDisclosure[]>;
1560
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
1561
+ /**
1562
+ * Le `name` natif des `details` (D86). La prise en charge se lit sur le prototype : Firefox 129
1563
+ * ignore l'attribut, et l'accordeon referme alors lui-meme.
1564
+ */
1565
+ private readonly nomPrisEnCharge;
1566
+ protected readonly boutonToutAfficher: import("@angular/core").Signal<boolean>;
1567
+ protected readonly toutEstOuvert: import("@angular/core").Signal<boolean>;
1568
+ /** Ce que l'accordeon a lui-meme ecrit dans `ouverts` : ce n'est pas une demande de l'appelant. */
1569
+ private derniereEcriture;
1570
+ constructor();
1571
+ private sectionBasculee;
1572
+ /** Ouvre tout, ou replie tout quand tout est deja ouvert ; le libelle ne change pas. */
1573
+ protected basculerTout(): void;
1574
+ private clesOuvertes;
1575
+ private ecrire;
1576
+ static ɵfac: i0.ɵɵFactoryDeclaration<StAccordion, never>;
1577
+ static ɵcmp: i0.ɵɵComponentDeclaration<StAccordion, "st-accordion", never, {
1578
+ "exclusif": {
1579
+ "alias": "exclusif";
1580
+ "required": false;
1581
+ "isSignal": true;
1582
+ };
1583
+ "toutAfficher": {
1584
+ "alias": "toutAfficher";
1585
+ "required": false;
1586
+ "isSignal": true;
1587
+ };
1588
+ "ouverts": {
1589
+ "alias": "ouverts";
1590
+ "required": false;
1591
+ "isSignal": true;
1592
+ };
1593
+ }, {
1594
+ "ouverts": "ouvertsChange";
1595
+ }, ["sections"], ["*"], true, never>;
1596
+ }
1597
+ /**
1598
+ * Un fichier stocke, a telecharger : releve, contrat, justificatif.
1599
+ *
1600
+ * ```html
1601
+ * <st-attachment nom="Releve de septembre 2026" type="PDF" [taille]="240000" [lien]="adresse" />
1602
+ * <st-attachment nom="Contrat" type="PDF" [taille]="512000" (telechargement)="telecharger()" />
1603
+ * ```
1604
+ *
1605
+ * ⚠️ **Le nom du lien dit le fichier** (WCAG 2.4.4) : « Releve de septembre 2026 (PDF, 240 ko) »,
1606
+ * a l'ecran comme au lecteur d'ecran — jamais « Telecharger » seul. Le type est un libelle clair
1607
+ * donne par l'application (« PDF »), jamais un type MIME.
1608
+ *
1609
+ * ⚠️ **Un lien si l'adresse est connue, sinon un bouton.** `lien` rend un `a[download]` ; sans
1610
+ * lien, un bouton emet `telechargement` : l'application demande alors une adresse de lecture
1611
+ * COURTE, a chaque clic (SEC-4), et l'ouvre. `nouvelOnglet` ouvre un PDF que le navigateur
1612
+ * affiche, au lieu de le telecharger, et le dit (« nouvelle fenetre »).
1613
+ *
1614
+ * ⚠️ **Le nom s'affiche sans commandes de direction** (`nomAffichable`) et dans un ilot de gauche
1615
+ * a droite : `facture\u202efdp.exe` ne se presente pas en PDF. Aucun apercu, aucun HTML du nom.
1616
+ */
1617
+ export declare class StAttachment {
1618
+ private readonly document;
1619
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
1620
+ private readonly locale;
1621
+ readonly nom: import("@angular/core").InputSignal<string>;
1622
+ /** Le type en clair : « PDF », « CSV », jamais `application/pdf`. */
1623
+ readonly type: import("@angular/core").InputSignal<string>;
1624
+ /** Le poids en octets ; `null` s'il n'est pas connu (et il n'est alors pas dit). */
1625
+ readonly taille: import("@angular/core").InputSignal<number | null>;
1626
+ /** L'adresse du fichier ; `null` : un bouton, et `telechargement`. */
1627
+ readonly lien: import("@angular/core").InputSignal<string | null>;
1628
+ /** Le jour d'ajout, dit apres le nom ; une date qui n'existe pas n'est pas dite. */
1629
+ readonly date: import("@angular/core").InputSignal<string | null>;
1630
+ /** Ouvrir dans un nouvel onglet plutot que telecharger (un PDF que le navigateur affiche). */
1631
+ readonly nouvelOnglet: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1632
+ /**
1633
+ * L'application demande l'adresse du fichier (apres `telechargement`) : le bouton le dit
1634
+ * (`aria-busy`, un anneau) et ne repart pas sur un second clic (audit du 2026-09-26, U-3).
1635
+ */
1636
+ readonly enAttente: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1637
+ /** Sans `lien` : l'application demande l'adresse du fichier, puis l'ouvre. */
1638
+ readonly telechargement: import("@angular/core").OutputEmitterRef<void>;
1639
+ protected demander(): void;
1640
+ protected readonly nomAffiche: import("@angular/core").Signal<string>;
1641
+ protected readonly precision: import("@angular/core").Signal<string>;
1642
+ protected readonly icone: import("@angular/core").Signal<"code" | "menu" | "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-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-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">;
1643
+ /** `2026-02-30` a la forme d'une date : lue telle quelle, elle s'afficherait « 2 mars 2026 ». */
1644
+ protected readonly dateAffichee: import("@angular/core").Signal<string | null>;
1645
+ /**
1646
+ * Le lien pose : seulement s'il reste sur l'origine de la page (`http(s)`, ou `blob:` de la page).
1647
+ * Sinon le document se telecharge par le bouton, qui emet `telechargement` (audit du 2026-09-27,
1648
+ * A-9) : un `data:` ou une autre origine ne se pose jamais sous le nom de confiance du fichier.
1649
+ */
1650
+ protected readonly lienSur: import("@angular/core").Signal<string | null>;
1651
+ constructor();
1652
+ static ɵfac: i0.ɵɵFactoryDeclaration<StAttachment, never>;
1653
+ static ɵcmp: i0.ɵɵComponentDeclaration<StAttachment, "st-attachment", never, {
1654
+ "nom": {
1655
+ "alias": "nom";
1656
+ "required": true;
1657
+ "isSignal": true;
1658
+ };
1659
+ "type": {
1660
+ "alias": "type";
1661
+ "required": true;
1662
+ "isSignal": true;
1663
+ };
1664
+ "taille": {
1665
+ "alias": "taille";
1666
+ "required": false;
1667
+ "isSignal": true;
1668
+ };
1669
+ "lien": {
1670
+ "alias": "lien";
1671
+ "required": false;
1672
+ "isSignal": true;
1673
+ };
1674
+ "date": {
1675
+ "alias": "date";
1676
+ "required": false;
1677
+ "isSignal": true;
1678
+ };
1679
+ "nouvelOnglet": {
1680
+ "alias": "nouvelOnglet";
1681
+ "required": false;
1682
+ "isSignal": true;
1683
+ };
1684
+ "enAttente": {
1685
+ "alias": "enAttente";
1686
+ "required": false;
1687
+ "isSignal": true;
1688
+ };
1689
+ }, {
1690
+ "telechargement": "telechargement";
1691
+ }, never, never, true, never>;
1692
+ }
1693
+ /** Un document stocke, tel qu'une liste le montre : l'application le decrit, rien n'est lu. */
1694
+ export interface DocumentAffiche {
1695
+ /** Identifiant stable : suivi de la ligne, et valeur des sorties. */
1696
+ readonly cle: string;
1697
+ readonly nom: string;
1698
+ /** Le type en clair : « PDF », jamais `application/pdf`. */
1699
+ readonly type: string;
1700
+ readonly etat: EtatDeDocument;
1701
+ /** Le poids en octets. */
1702
+ readonly taille?: number | null;
1703
+ /** Le jour d'ajout. */
1704
+ readonly ajouteLe?: DateIso | null;
1705
+ /** Une adresse directe ; sans elle, `telechargement` emet la cle. */
1706
+ readonly lien?: string | null;
1707
+ /** L'adresse est demandee (apres `telechargement`) : le document le dit, et attend. */
1708
+ readonly enAttente?: boolean;
1709
+ /** Une precision d'usage (« Pour le dossier de pret »). */
1710
+ readonly description?: string | null;
1711
+ /** Le motif d'un refus, dit sous le nom. */
1712
+ readonly raison?: string | null;
1713
+ }
1714
+ type ActionDeDocument = 'voir' | 'deposer' | 'remplacer' | 'supprimer';
1715
+ /**
1716
+ * Documents stockes : releves, justificatifs deposes, pieces d'une reclamation, exports prets.
1717
+ *
1718
+ * ```html
1719
+ * <st-document-list etiquette="Justificatifs du dossier" [documents]="justificatifs()"
1720
+ * remplacable supprimable (telechargement)="ouvrir($event)" (depot)="deposer($event)" />
1721
+ * ```
1722
+ *
1723
+ * ⚠️ **Seul un document sain ou expire se telecharge.** Un document en analyse, refuse (infecte
1724
+ * compris) ou supprime n'a PAS de lien : il n'est pas « desactive », il est absent (CP-7). L'etat se
1725
+ * dit en texte et par une forme d'icone, jamais par la seule couleur.
1726
+ *
1727
+ * ⚠️ **Chaque action nomme son document** : texte court visible (« Remplacer »), nom accessible
1728
+ * « Remplacer <document> » ; cinq boutons « Supprimer » identiques seraient un defaut (WCAG
1729
+ * 2.4.6). Une suppression se confirme par l'application, avec le nom du document
1730
+ * (`st-confirm-dialog`) : la liste ne fait qu'emettre.
1731
+ *
1732
+ * ⚠️ **Le focus ne tombe jamais au corps de la page** (audit UI du 2026-09-27, D-25) : quand un
1733
+ * changement de `documents` retire ce qui avait le focus (« Deposer » d'un document passe en
1734
+ * analyse, « Supprimer » d'un document parti), il revient a la ligne de ce document, sinon a celle
1735
+ * qui a pris sa place — la garde de `st-file-upload`. Chaque changement d'etat se dit, nom compris
1736
+ * (« RIB : Analyse en cours ») ; l'etat de depart, non.
1737
+ *
1738
+ * Le lien et son nom explicite viennent de `st-attachment`. Aucune adresse n'est demandee ici : sans
1739
+ * `lien`, `telechargement` emet la cle, et l'application obtient une adresse COURTE (SEC-4).
1740
+ * `apercevable` ajoute « Voir » a un document sain ou expire : `apercu` emet sa cle, et
1741
+ * l'application l'affiche (une adresse courte, son propre lecteur) ; aucun lecteur ici (lot 258).
1742
+ */
1743
+ export declare class StDocumentList {
1744
+ /**
1745
+ * Un texte de donnees : sans commande de direction, et isole par son element (`dir="auto"` ou
1746
+ * `<bdi>`), il ne reordonne ni lui-meme ni ce qui l'entoure (audit du 2026-09-26, S-1 ; audit
1747
+ * etendu du 2026-09-27, A-2).
1748
+ */
1749
+ protected readonly affichable: typeof sansCommandesDeDirection;
1750
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
1751
+ private readonly locale;
1752
+ private readonly element;
1753
+ private readonly document;
1754
+ private readonly injecteur;
1755
+ readonly documents: import("@angular/core").InputSignal<readonly DocumentAffiche[]>;
1756
+ /** Le nom de la liste (« Justificatifs du dossier »), lu en tete. */
1757
+ readonly etiquette: import("@angular/core").InputSignal<string>;
1758
+ /** Un document depose, hors analyse, se remplace. */
1759
+ readonly remplacable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1760
+ /** Un document depose se supprime (l'application confirme). */
1761
+ readonly supprimable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1762
+ /** Un document a fournir se depose. */
1763
+ readonly deposable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1764
+ /** Un document sain ou expire se voit (« Voir <document> ») : `apercu` emet sa cle. */
1765
+ readonly apercevable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1766
+ readonly telechargement: import("@angular/core").OutputEmitterRef<string>;
1767
+ readonly depot: import("@angular/core").OutputEmitterRef<string>;
1768
+ readonly remplacement: import("@angular/core").OutputEmitterRef<string>;
1769
+ readonly suppression: import("@angular/core").OutputEmitterRef<string>;
1770
+ /** L'application affiche le document (adresse courte, SEC-4) : la cle. */
1771
+ readonly apercu: import("@angular/core").OutputEmitterRef<string>;
1772
+ private readonly catalogue;
1773
+ protected readonly annonce: AnnonceLocale;
1774
+ protected readonly lignes: import("@angular/core").Signal<{
1775
+ cle: string;
1776
+ document: DocumentAffiche;
1777
+ nom: string;
1778
+ iconeDuFichier: "code" | "menu" | "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-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-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";
1779
+ telechargeable: boolean;
1780
+ ton: import("@starterlib/util").TonSemantique;
1781
+ icone: "horloge" | null;
1782
+ actions: ActionDeDocument[];
1783
+ }[]>;
1784
+ constructor();
1785
+ protected texteDe(action: ActionDeDocument): string;
1786
+ /**
1787
+ * « Supprimer RIB » : le texte visible, suivi du nom du document. Le nom commence par le texte
1788
+ * visible (WCAG 2.5.3) : une commande vocale « Supprimer » atteint le bouton.
1789
+ */
1790
+ protected nomDeLAction(action: ActionDeDocument, nom: string): string;
1791
+ protected agir(action: ActionDeDocument, cle: string): void;
1792
+ /**
1793
+ * Le focus est dans une ligne quand les documents changent : si le rendu retire ce qui l'avait,
1794
+ * il revient a la meme ligne, sinon a celle qui a pris sa place (la ligne « liste vide »
1795
+ * comprise). Le focus parti ailleurs entre-temps n'est jamais repris.
1796
+ */
1797
+ private garderLeFocus;
1798
+ /**
1799
+ * Chaque document dont l'etat change se dit, avec son nom (« RIB : Analyse en cours ») ;
1800
+ * plusieurs a la fois, en UNE annonce jointe dans la langue (`Intl.ListFormat`), et non la
1801
+ * derniere seule.
1802
+ */
1803
+ private annoncerLesEtats;
1804
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDocumentList, never>;
1805
+ static ɵcmp: i0.ɵɵComponentDeclaration<StDocumentList, "st-document-list", never, {
1806
+ "documents": {
1807
+ "alias": "documents";
1808
+ "required": true;
1809
+ "isSignal": true;
1810
+ };
1811
+ "etiquette": {
1812
+ "alias": "etiquette";
1813
+ "required": true;
1814
+ "isSignal": true;
1815
+ };
1816
+ "remplacable": {
1817
+ "alias": "remplacable";
1818
+ "required": false;
1819
+ "isSignal": true;
1820
+ };
1821
+ "supprimable": {
1822
+ "alias": "supprimable";
1823
+ "required": false;
1824
+ "isSignal": true;
1825
+ };
1826
+ "deposable": {
1827
+ "alias": "deposable";
1828
+ "required": false;
1829
+ "isSignal": true;
1830
+ };
1831
+ "apercevable": {
1832
+ "alias": "apercevable";
1833
+ "required": false;
1834
+ "isSignal": true;
1835
+ };
1836
+ }, {
1837
+ "telechargement": "telechargement";
1838
+ "depot": "depot";
1839
+ "remplacement": "remplacement";
1840
+ "suppression": "suppression";
1841
+ "apercu": "apercu";
1842
+ }, never, never, true, never>;
1843
+ }
1844
+ /** Une ligne a verifier : le terme, sa valeur, et ou la modifier. */
1845
+ export interface ElementDeVerification extends ElementDeDescription {
1846
+ /**
1847
+ * Une valeur attendue : `description` nulle, elle se dit « A renseigner », en mots et par une
1848
+ * icone, meme quand un gabarit rend la valeur riche.
1849
+ */
1850
+ readonly obligatoire?: boolean;
1851
+ /**
1852
+ * La route de l'etape ou de la page qui modifie la valeur (`'/virement/montant'`). Sans lien,
1853
+ * « Modifier » est un bouton qui emet `modification` : un parcours a une seule route change
1854
+ * d'etape sans naviguer.
1855
+ */
1856
+ readonly lien?: string | null;
1857
+ /** Le champ vise dans cette page : on revient AU champ, pas en haut de l'etape. */
1858
+ readonly fragment?: string | null;
1859
+ /** `false` : une valeur qui ne se modifie pas ici ; la ligne n'a aucune action. */
1860
+ readonly modifiable?: boolean;
1861
+ }
1862
+ /**
1863
+ * Liste de verification : l'etape « Verifier » d'un virement, le recapitulatif d'un dossier avant
1864
+ * envoi, la page « Vos informations » d'un profil. Chaque ligne dit un terme, sa valeur, et mene a
1865
+ * l'endroit qui la modifie.
1866
+ *
1867
+ * ```html
1868
+ * <st-review-list [elements]="[
1869
+ * { cle: 'beneficiaire', terme: 'Beneficiaire', description: nom(), lien: '/virement/qui' },
1870
+ * { cle: 'montant', terme: 'Montant', description: montantEnTexte(), obligatoire: true },
1871
+ * ]" (modification)="allerA($event)">
1872
+ * <ng-template stDescription="montant"><st-money [valeur]="montant()" /></ng-template>
1873
+ * </st-review-list>
1874
+ * ```
1875
+ *
1876
+ * ⚠️ **Chaque « Modifier » nomme son terme** : texte visible « Modifier », nom accessible
1877
+ * « Modifier Montant ». Cinq « Modifier » identiques seraient un defaut (WCAG 2.4.6), et le nom
1878
+ * commence par le texte visible (WCAG 2.5.3) : une commande vocale « Modifier » l'atteint.
1879
+ *
1880
+ * ⚠️ **Une valeur obligatoire manquante se dit** : « A renseigner », en mots et par une icone,
1881
+ * jamais par la seule couleur. Une valeur facultative absente se dit comme dans
1882
+ * `st-description-list`, dont la liste reprend le `dl` et la disposition de conteneur.
1883
+ *
1884
+ * Une valeur riche (montant, IBAN masque) passe par le gabarit `stDescription`. Un element
1885
+ * `obligatoire` garde sa valeur en texte dans `description` : nulle, elle dit l'absence, gabarit
1886
+ * ou non.
1887
+ */
1888
+ /**
1889
+ * Une ligne de la revue : celle de la liste de description, et ce que la revue y ajoute (la valeur
1890
+ * obligatoire manquante, le nom de l'action « Modifier <terme> »). Annotee, elle garde au rapport
1891
+ * d'API le nom de son contexte (audit du 2026-09-27, Q-11).
1892
+ */
1893
+ interface LigneDeRevue extends LigneDeDescription<ElementDeVerification> {
1894
+ readonly manquant: boolean;
1895
+ readonly nomDeLAction: string;
1896
+ }
1897
+ export declare class StReviewList {
1898
+ /**
1899
+ * Une valeur est une donnee : sans commande de direction, et ISOLEE (`<bdi>`) pour qu'un montant
1900
+ * ou un nom ne se lise pas a l'envers de droite a gauche (audit du 2026-09-26, S-1 et U-1).
1901
+ */
1902
+ protected readonly affichable: typeof sansCommandesDeDirection;
1903
+ protected readonly libelles: Signal<import("@starterlib/ui").LibellesUi>;
1904
+ readonly elements: import("@angular/core").InputSignal<readonly ElementDeVerification[]>;
1905
+ /** La cle (a defaut le terme) d'une ligne sans `lien` dont « Modifier » est active. */
1906
+ readonly modification: import("@angular/core").OutputEmitterRef<string>;
1907
+ private readonly gabarits;
1908
+ protected readonly lignes: Signal<readonly LigneDeRevue[]>;
1909
+ protected modifier(element: ElementDeVerification): void;
1910
+ static ɵfac: i0.ɵɵFactoryDeclaration<StReviewList, never>;
1911
+ static ɵcmp: i0.ɵɵComponentDeclaration<StReviewList, "st-review-list", never, {
1912
+ "elements": {
1913
+ "alias": "elements";
1914
+ "required": true;
1915
+ "isSignal": true;
1916
+ };
1917
+ }, {
1918
+ "modification": "modification";
1919
+ }, ["gabarits"], never, true, never>;
1920
+ }
1921
+ /** Contexte du gabarit d'acteur : l'acteur de l'evenement, et l'evenement lui-meme. */
1922
+ export interface ContexteDActeur {
1923
+ /**
1924
+ * L'acteur, son nom sans commande de direction ; `precision` et `sourceImage` a `null` quand
1925
+ * l'evenement ne les donne pas.
1926
+ */
1927
+ readonly $implicit: Required<ActeurDEvenement>;
1928
+ readonly evenement: EvenementDeChronologie;
1929
+ }
1930
+ /**
1931
+ * L'acteur d'un evenement rendu par l'application : une personne (`st-person`, dans
1932
+ * `@starterlib/ui/donnees`, que `@starterlib/ui/listes` n'importe pas), a la place du nom dans la
1933
+ * phrase « par … » du dictionnaire. Un gabarit pour toute la chronologie ; un evenement sans acteur
1934
+ * ne l'appelle pas.
1935
+ *
1936
+ * ```html
1937
+ * <st-timeline etiquette="Journal du dossier" [evenements]="journal()">
1938
+ * <ng-template stActeurDEvenement let-acteur>
1939
+ * <st-person taille="sm" [nom]="acteur.nom" [sourceImage]="acteur.sourceImage" />
1940
+ * </ng-template>
1941
+ * </st-timeline>
1942
+ * ```
1943
+ *
1944
+ * Le nom reste du texte, l'avatar decoratif : c'est la regle de `st-person`.
1945
+ */
1946
+ export declare class StActeurDEvenement {
1947
+ readonly gabarit: TemplateRef<ContexteDActeur>;
1948
+ static ngTemplateContextGuard(_directive: StActeurDEvenement, _contexte: unknown): _contexte is ContexteDActeur;
1949
+ static ɵfac: i0.ɵɵFactoryDeclaration<StActeurDEvenement, never>;
1950
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StActeurDEvenement, "ng-template[stActeurDEvenement]", never, {}, {}, never, never, true, never>;
1951
+ }
1952
+ /** Contexte d'un gabarit de detail. */
1953
+ export interface ContexteDEvenement {
1954
+ readonly $implicit: EvenementDeChronologie;
1955
+ }
1956
+ /**
1957
+ * Detail riche d'un evenement : un avant et apres, une piece jointe, un montant.
1958
+ *
1959
+ * ```html
1960
+ * <ng-template stDetailDEvenement="plafond" let-evenement>
1961
+ * <st-attachment nom="Avenant" type="PDF" [taille]="84000" [lien]="avenant()" />
1962
+ * </ng-template>
1963
+ * ```
1964
+ */
1965
+ export declare class StDetailDEvenement {
1966
+ readonly cle: import("@angular/core").InputSignal<string>;
1967
+ readonly gabarit: TemplateRef<ContexteDEvenement>;
1968
+ static ngTemplateContextGuard(_directive: StDetailDEvenement, _contexte: unknown): _contexte is ContexteDEvenement;
1969
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDetailDEvenement, never>;
1970
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StDetailDEvenement, "ng-template[stDetailDEvenement]", never, {
1971
+ "cle": {
1972
+ "alias": "stDetailDEvenement";
1973
+ "required": true;
1974
+ "isSignal": true;
1975
+ };
1976
+ }, {}, never, never, true, never>;
1977
+ }
1978
+ /** Le ton d'un evenement : un mot lu avant son titre, et la forme de son repere. */
1979
+ export type TonDEvenement = Extract<Ton, 'neutre' | 'information' | 'succes' | 'avertissement' | 'danger'>;
1980
+ export type OrdreDeChronologie = 'recent-d-abord' | 'ancien-d-abord';
1981
+ /**
1982
+ * Qui a agi, quand la chronologie en sait plus que le nom : sa precision (role, service) et sa
1983
+ * photo, que le gabarit `stActeurDEvenement` passe a `st-person`. Sans gabarit, le nom seul.
1984
+ */
1985
+ export interface ActeurDEvenement {
1986
+ readonly nom: string;
1987
+ /** Le role, le service, le matricule : deja traduits. */
1988
+ readonly precision?: string | null;
1989
+ readonly sourceImage?: string | null;
1990
+ }
1991
+ /** Un evenement date : ce qui est arrive, quand, et qui l'a fait. */
1992
+ export interface EvenementDeChronologie {
1993
+ /** Identifiant stable : suivi de la ligne, et cle du gabarit `stDetailDEvenement`. */
1994
+ readonly cle: string;
1995
+ /**
1996
+ * Un instant ISO 8601 (`2026-09-17T07:30:00Z`). Sans decalage, une heure de mur lue dans le
1997
+ * fuseau de l'application ; un jour seul (`2026-09-17`) s'affiche sans heure.
1998
+ */
1999
+ readonly instant: string;
2000
+ readonly titre: string;
2001
+ readonly ton?: TonDEvenement;
2002
+ /** Une forme plus precise que celle du ton : `horloge` pour une attente. */
2003
+ readonly icone?: Icone | null;
2004
+ /** Qui a agi : un nom affiche, un service ; ou une personne, pour `stActeurDEvenement`. */
2005
+ readonly acteur?: string | ActeurDEvenement | null;
2006
+ /** Une precision en texte ; un detail riche passe par le gabarit `stDetailDEvenement`. */
2007
+ readonly description?: string | null;
2008
+ }
2009
+ /** L'acteur d'une ligne, autour du trou de la phrase du dictionnaire (« par … »). */
2010
+ interface ActeurDeLigne {
2011
+ readonly avant: string;
2012
+ readonly apres: string;
2013
+ readonly personne: Required<ActeurDEvenement>;
2014
+ }
2015
+ /**
2016
+ * Une ligne rendue : l'evenement, son instant lu, sa date ecrite, son ton, son gabarit riche et son
2017
+ * acteur autour du trou de la phrase. Annotee, elle garde au rapport d'API le nom de son contexte
2018
+ * (audit du 2026-09-27, Q-11).
2019
+ */
2020
+ interface LigneDeChronologie {
2021
+ readonly evenement: EvenementDeChronologie;
2022
+ readonly instant: number | null;
2023
+ readonly iso: string | null;
2024
+ /** La date et l'heure (« 17 sept. 2026, 09:30 »), ou le jour seul. */
2025
+ readonly date: string | null;
2026
+ /** L'heure seule (« 09:30 »), affichee sous l'en-tete de son jour ; `null` pour un jour seul. */
2027
+ readonly heure: string | null;
2028
+ /** La cle du jour de l'evenement dans le fuseau de l'application (`AAAA-MM-JJ`). */
2029
+ readonly jour: string;
2030
+ readonly ton: TonDEvenement;
2031
+ readonly icone: Icone;
2032
+ readonly prefixe: string | null;
2033
+ readonly gabarit: TemplateRef<ContexteDEvenement> | null;
2034
+ readonly acteur: ActeurDeLigne | null;
2035
+ }
2036
+ /** Un jour de la chronologie (`groupesParJour`) : son en-tete, et ses evenements dans l'ordre. */
2037
+ interface GroupeDeChronologie {
2038
+ readonly cle: string;
2039
+ readonly identifiant: string;
2040
+ /** Le jour ecrit (« jeudi 17 septembre 2026 ») ; « Date inconnue » pour les illisibles. */
2041
+ readonly libelle: string;
2042
+ readonly iso: string | null;
2043
+ readonly lignes: readonly LigneDeChronologie[];
2044
+ }
2045
+ /**
2046
+ * Chronologie : le suivi d'une reclamation, le cycle d'un virement, l'historique d'un dossier,
2047
+ * un journal d'audit. Chaque evenement dit ce qui est arrive, quand, et qui l'a fait.
2048
+ *
2049
+ * ```html
2050
+ * <st-timeline etiquette="Historique du virement" [evenements]="historique()" [niveauDuTitre]="3" />
2051
+ * ```
2052
+ *
2053
+ * ⚠️ **Une liste ordonnee, triee par le composant** (CP-13) : `ordre` dit le sens, le plus recent
2054
+ * d'abord par defaut, et le nom de la liste le dit apres l'etiquette. L'instant ABSOLU est affiche et lu, dans le fuseau de l'application
2055
+ * (« 17 sept. 2026, 09:30 ») : un relatif seul (« il y a 2 h ») ne dit pas quand, et un journal
2056
+ * d'audit doit le dire. Un instant illisible se dit « Date inconnue », en fin de liste.
2057
+ * `relatif` ajoute le relatif en COMPLEMENT, a l'oeil seulement (« (il y a 2 h) ») : muet pour
2058
+ * les lecteurs d'ecran, qui lisent l'absolu, et tu au-dela de sept jours.
2059
+ *
2060
+ * ⚠️ **Le ton se lit** (CP-14) : un mot masque ouvre le titre (« Succes : ») et le repere change
2061
+ * de FORME d'un ton a l'autre, jamais de seule couleur. Le repere et le trait qui relie les
2062
+ * evenements sont decoratifs ; le trait est une bordure, qui reste visible sous `forced-colors`.
2063
+ *
2064
+ * `groupesParJour` range les evenements sous l'en-tete de leur jour, dans le fuseau de
2065
+ * l'application : une liste par jour, nommee par sa date, dans la liste de la chronologie ; sous
2066
+ * son jour, l'evenement n'affiche que l'heure, et lit toujours sa date. `compact` pose le titre et
2067
+ * l'instant sur une ligne, pour un journal de back-office.
2068
+ *
2069
+ * ⚠️ **`focus()` va au premier evenement AJOUTE** depuis le dernier affichage (« Afficher plus »,
2070
+ * `st-pagination` en mode `suite`), la ou il se range dans l'ordre ; au premier apres un
2071
+ * remplacement ; au dernier si rien n'est arrive. Aucune annonce : la pagination dit le nombre.
2072
+ *
2073
+ * Aucune region vivante : un nouvel evenement s'annonce, s'il le faut, par l'application. Un
2074
+ * titre n'entre dans le plan de la page que sur demande (`niveauDuTitre`) : un journal de
2075
+ * cinquante lignes n'y met pas cinquante titres.
2076
+ */
2077
+ export declare class StTimeline {
2078
+ /**
2079
+ * Titre, acteur et description sont des donnees : sans commandes de direction, et isoles, pour
2080
+ * qu'un nom ne reordonne pas la ligne qui l'entoure (audit du 2026-09-26, S-1).
2081
+ */
2082
+ protected readonly affichable: typeof sansCommandesDeDirection;
2083
+ protected readonly libelles: Signal<LibellesUi>;
2084
+ private readonly locale;
2085
+ private readonly fuseau;
2086
+ private readonly element;
2087
+ private readonly document;
2088
+ private readonly identifiant;
2089
+ private readonly catalogue;
2090
+ readonly evenements: import("@angular/core").InputSignal<readonly EvenementDeChronologie[]>;
2091
+ /** Le nom de la liste (« Historique du virement »). */
2092
+ readonly etiquette: import("@angular/core").InputSignal<string>;
2093
+ readonly ordre: import("@angular/core").InputSignal<OrdreDeChronologie>;
2094
+ /** Le niveau des titres d'evenement dans le plan de la page ; `null` : aucun titre. */
2095
+ readonly niveauDuTitre: import("@angular/core").InputSignal<NiveauDeTitre | null>;
2096
+ /** Le relatif en complement de l'absolu (« (il y a 2 h) »), a l'oeil seulement. */
2097
+ readonly relatif: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2098
+ /** Les evenements sous l'en-tete de leur jour. */
2099
+ readonly groupesParJour: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2100
+ /** Titre et instant sur une ligne, reperes de 16 px : un journal de back-office. */
2101
+ readonly compact: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2102
+ /** Evenements en cours de chargement : `aria-busy` ; sans evenement, une silhouette. */
2103
+ readonly chargement: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2104
+ /** Nombre d'evenements de la silhouette du premier chargement. */
2105
+ readonly lignesAttendues: import("@angular/core").InputSignalWithTransform<number, unknown>;
2106
+ /**
2107
+ * Le nom de la liste : l'etiquette, puis l'ordre (« Historique du virement, du plus recent au
2108
+ * plus ancien ») ; un lecteur d'ecran ne devine pas qu'une liste est antichronologique.
2109
+ */
2110
+ protected readonly nom: Signal<string>;
2111
+ private readonly gabarits;
2112
+ protected readonly gabaritDActeur: Signal<StActeurDEvenement | undefined>;
2113
+ /** L'heure de reference du relatif, avancee chaque minute tant que la page est visible. */
2114
+ private readonly maintenant;
2115
+ private readonly rendu;
2116
+ /** La cle de l'evenement vise par le prochain `focus()` ; `null` : le dernier. */
2117
+ private cibleDuFocus;
2118
+ private clesAffichees;
2119
+ protected readonly lignes: Signal<readonly LigneDeChronologie[]>;
2120
+ /**
2121
+ * Les jours, dans l'ordre de leur premier evenement ; chacun ses evenements, dans l'ordre. Un
2122
+ * jour seul (`2026-09-17`) rejoint le jour de meme date, ou qu'il se range.
2123
+ */
2124
+ protected readonly groupes: Signal<readonly GroupeDeChronologie[]>;
2125
+ /** Le relatif de chaque evenement (`relatif`) : « a l'instant », puis minutes, heures, jours. */
2126
+ protected readonly relatifs: Signal<ReadonlyMap<string, string>>;
2127
+ protected readonly squelette: Signal<boolean>;
2128
+ protected readonly rangsAttendus: Signal<number[]>;
2129
+ constructor();
2130
+ /**
2131
+ * Focus sur le premier evenement ajoute depuis le dernier affichage, sur le premier apres un
2132
+ * remplacement, sur le dernier si rien n'est arrive. Aucune annonce : la lecture reprend la ou
2133
+ * la chronologie s'est allongee, et la pagination dit le nombre.
2134
+ */
2135
+ focus(options?: FocusOptions): void;
2136
+ /** Le contexte du gabarit d'acteur d'une ligne. */
2137
+ protected contexteDActeur(ligne: LigneDeChronologie, acteur: ActeurDeLigne): ContexteDActeur;
2138
+ static ɵfac: i0.ɵɵFactoryDeclaration<StTimeline, never>;
2139
+ static ɵcmp: i0.ɵɵComponentDeclaration<StTimeline, "st-timeline", never, {
2140
+ "evenements": {
2141
+ "alias": "evenements";
2142
+ "required": true;
2143
+ "isSignal": true;
2144
+ };
2145
+ "etiquette": {
2146
+ "alias": "etiquette";
2147
+ "required": true;
2148
+ "isSignal": true;
2149
+ };
2150
+ "ordre": {
2151
+ "alias": "ordre";
2152
+ "required": false;
2153
+ "isSignal": true;
2154
+ };
2155
+ "niveauDuTitre": {
2156
+ "alias": "niveauDuTitre";
2157
+ "required": false;
2158
+ "isSignal": true;
2159
+ };
2160
+ "relatif": {
2161
+ "alias": "relatif";
2162
+ "required": false;
2163
+ "isSignal": true;
2164
+ };
2165
+ "groupesParJour": {
2166
+ "alias": "groupesParJour";
2167
+ "required": false;
2168
+ "isSignal": true;
2169
+ };
2170
+ "compact": {
2171
+ "alias": "compact";
2172
+ "required": false;
2173
+ "isSignal": true;
2174
+ };
2175
+ "chargement": {
2176
+ "alias": "chargement";
2177
+ "required": false;
2178
+ "isSignal": true;
2179
+ };
2180
+ "lignesAttendues": {
2181
+ "alias": "lignesAttendues";
2182
+ "required": false;
2183
+ "isSignal": true;
2184
+ };
2185
+ }, {}, ["gabarits", "gabaritDActeur"], never, true, never>;
2186
+ }
2187
+ /**
2188
+ * Ce que `st-value-change` et `st-change-list` partagent (lot 259), interne a
2189
+ * `@starterlib/ui/listes` : la lecture d'une valeur et les mots masques qui l'ouvrent.
2190
+ */
2191
+ /**
2192
+ * Une valeur de changement telle qu'elle se rend : son texte sans commande de direction, ou `null`
2193
+ * quand elle manque (absente, vide ou faite de blancs).
2194
+ */
2195
+ declare function valeurDeChangement(valeur: string | null | undefined): string | null;
2196
+ /** Les mots masques qui ouvrent chaque valeur, et la langue de leur repli (D-29). */
2197
+ interface MotsDeChangement {
2198
+ readonly avant: string;
2199
+ readonly apres: string;
2200
+ readonly langue: string | null;
2201
+ }
2202
+ /**
2203
+ * Les mots masques « Avant : » et « Apres : » : les mots du catalogue des listes, la ponctuation
2204
+ * du tronc (`libelleDeChamp`), et l'espace qui les separe de la valeur lue a leur suite. A appeler
2205
+ * dans un contexte d'injection.
2206
+ */
2207
+ declare function motsDeChangement(): Signal<MotsDeChangement>;
2208
+ /** Une phrase du dictionnaire coupee autour de sa donnee : le texte avant, et celui d'apres. */
2209
+ interface PhraseAutourDuTrou {
2210
+ readonly avant: string;
2211
+ readonly apres: string;
2212
+ }
2213
+ /**
2214
+ * « par Marie Dupont », « Plafond : », coupes autour de la donnee : la phrase garde l'ordre des
2215
+ * mots de sa langue, et la donnee s'isole dans son propre `<bdi>`. Isolee avec toute la phrase, la
2216
+ * donnee y restait un texte ouvert : un nom de droite a gauche entrainait les signes et les
2217
+ * chiffres qui le suivent (audit UI du 2026-09-27, D-4). Ni cle nouvelle au dictionnaire, ni
2218
+ * isolats FSI et PDI glisses dans le texte (ecartes pour les messages, A-3). Interne a
2219
+ * `@starterlib/ui/listes`.
2220
+ */
2221
+ declare function autourDuTrou(phrase: (trou: string) => string): PhraseAutourDuTrou;
2222
+ /** Le cote d'un changement : l'ancienne valeur ou la nouvelle. */
2223
+ export type CoteDeChangement = 'avant' | 'apres';
2224
+ /** Contexte d'un gabarit de valeur : la valeur en texte, son cote et la cle de son changement. */
2225
+ export interface ContexteDeValeurDeChangement {
2226
+ readonly $implicit: string;
2227
+ readonly cote: CoteDeChangement;
2228
+ /** La cle du changement (`st-change-list`) ; vide dans `st-value-change`. */
2229
+ readonly cle: string;
2230
+ }
2231
+ /**
2232
+ * Valeur riche d'un changement : un montant (`st-money`), une date (`st-date`), un etat
2233
+ * (`st-status-pill`), une valeur sensible (`st-masked`). Le gabarit recoit la valeur NON VIDE ; une
2234
+ * valeur absente se dit « Non renseigne » sans lui.
2235
+ *
2236
+ * Dans `st-change-list`, `stValeurDeChangement="plafond"` rend la valeur du changement de cle
2237
+ * `plafond`, et un gabarit sans cle rend toutes les autres ; dans `st-value-change`, la cle est
2238
+ * omise.
2239
+ *
2240
+ * ```html
2241
+ * <!-- enEuros = (centimes: string) => montant(BigInt(centimes), 'EUR') -->
2242
+ * <ng-template stValeurDeChangement="plafond" let-valeur>
2243
+ * <st-money [valeur]="enEuros(valeur)" />
2244
+ * </ng-template>
2245
+ * ```
2246
+ *
2247
+ * ⚠️ Un gabarit plutot qu'une projection : le composant sait qu'une valeur MANQUE, et la dit ;
2248
+ * une projection ne le lui dirait pas. Et `@starterlib/ui/listes` n'importe pas
2249
+ * `@starterlib/ui/donnees` (ADR web 0003) : `st-money` et `st-masked` y entrent par l'application.
2250
+ */
2251
+ export declare class StValeurDeChangement {
2252
+ /** La cle du changement rendu ; vide : toute valeur qui n'a pas de gabarit propre. */
2253
+ readonly cle: import("@angular/core").InputSignal<string>;
2254
+ readonly gabarit: TemplateRef<ContexteDeValeurDeChangement>;
2255
+ static ngTemplateContextGuard(_directive: StValeurDeChangement, _contexte: unknown): _contexte is ContexteDeValeurDeChangement;
2256
+ static ɵfac: i0.ɵɵFactoryDeclaration<StValeurDeChangement, never>;
2257
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StValeurDeChangement, "ng-template[stValeurDeChangement]", never, {
2258
+ "cle": {
2259
+ "alias": "stValeurDeChangement";
2260
+ "required": false;
2261
+ "isSignal": true;
2262
+ };
2263
+ }, {}, never, never, true, never>;
2264
+ }
2265
+ /** Le terme d'un changement, une donnee, et la phrase du tronc autour (« Plafond mensuel : »). */
2266
+ interface TermeDeChangement extends PhraseAutourDuTrou {
2267
+ readonly nom: string;
2268
+ }
2269
+ /**
2270
+ * Un changement de valeur : « Plafond mensuel : 2 000 € → 3 000 € ». Le journal d'audit, la revue
2271
+ * d'une demande de modification (ancienne adresse, nouvelle adresse), la validation a quatre yeux
2272
+ * d'un seul champ ; plusieurs champs passent par `st-change-list`.
2273
+ *
2274
+ * ```html
2275
+ * <st-value-change terme="Plafond mensuel" avant="2 000 €" apres="3 000 €" />
2276
+ * ```
2277
+ *
2278
+ * ⚠️ **`<del>` et `<ins>`, doubles d'un mot masque** : l'ancienne valeur est barree, la nouvelle en
2279
+ * graisse moyenne ; chacune s'ouvre sur « Avant : » ou « Apres : », lus meme par les lecteurs
2280
+ * d'ecran qui taisent `del` et `ins`. La valeur barree garde l'encre discrete (4,5:1) : c'est du
2281
+ * contenu, pas un etat desactive.
2282
+ *
2283
+ * ⚠️ **Une valeur absente se dit** « Non renseigne » (un tiret a l'oeil, comme dans les listes du
2284
+ * socle), hors de `del` et `ins` : rien n'a ete barre ni insere. La fleche est decorative, et se
2285
+ * retourne de droite a gauche ; elle ne quitte jamais la nouvelle valeur a la coupure de ligne.
2286
+ *
2287
+ * Une valeur riche (montant, date, valeur masquee) passe par un gabarit `stValeurDeChangement`.
2288
+ */
2289
+ export declare class StValueChange {
2290
+ protected readonly libelles: Signal<import("@starterlib/ui").LibellesUi>;
2291
+ protected readonly mots: Signal<MotsDeChangement>;
2292
+ /** Ce qui change (« Plafond mensuel ») ; sans terme, les deux valeurs seules (dans un `dd`). */
2293
+ readonly terme: import("@angular/core").InputSignal<string | null>;
2294
+ /** L'ancienne valeur, en texte ; `null` ou vide : aucune (« Non renseigne »). */
2295
+ readonly avant: import("@angular/core").InputSignal<string | null>;
2296
+ /** La nouvelle valeur, en texte ; `null` ou vide : aucune (« Non renseigne »). */
2297
+ readonly apres: import("@angular/core").InputSignal<string | null>;
2298
+ protected readonly gabarit: Signal<StValeurDeChangement | undefined>;
2299
+ protected readonly valeurAvant: Signal<string | null>;
2300
+ protected readonly valeurApres: Signal<string | null>;
2301
+ /** Le terme, une donnee, isole dans la phrase du tronc (« Plafond mensuel : »). */
2302
+ protected readonly phraseDuTerme: Signal<TermeDeChangement | null>;
2303
+ static ɵfac: i0.ɵɵFactoryDeclaration<StValueChange, never>;
2304
+ static ɵcmp: i0.ɵɵComponentDeclaration<StValueChange, "st-value-change", never, {
2305
+ "terme": {
2306
+ "alias": "terme";
2307
+ "required": false;
2308
+ "isSignal": true;
2309
+ };
2310
+ "avant": {
2311
+ "alias": "avant";
2312
+ "required": false;
2313
+ "isSignal": true;
2314
+ };
2315
+ "apres": {
2316
+ "alias": "apres";
2317
+ "required": false;
2318
+ "isSignal": true;
2319
+ };
2320
+ }, {}, ["gabarit"], never, true, never>;
2321
+ }
2322
+ /**
2323
+ * Les libelles propres a `@starterlib/ui/listes` (lot 259) : le catalogue par point d'entree (AD-10,
2324
+ * D147), apres ceux de la messagerie, des formulaires et de l'arbre ; le tronc n'a plus de marge
2325
+ * (D141). La langue suit celle du dictionnaire du tronc. Les libelles des listes livrees avant ce
2326
+ * lot restent au tronc jusqu'a la cloture du train (lot 268).
2327
+ */
2328
+ export interface LibellesListes {
2329
+ /** En-tete de la colonne des champs d'une liste de changements (`st-change-list`). */
2330
+ readonly champ: string;
2331
+ /**
2332
+ * L'ancienne et la nouvelle valeur : en-tetes de `st-change-list`, et mots masques qui ouvrent
2333
+ * chaque valeur (« Avant : »), la ponctuation venant du tronc (`libelleDeChamp`).
2334
+ */
2335
+ readonly avant: string;
2336
+ readonly apres: string;
2337
+ /** La nature d'un changement, dite en mot a cote de son icone. */
2338
+ readonly ajoute: string;
2339
+ readonly modifie: string;
2340
+ readonly supprime: string;
2341
+ readonly inchange: string;
2342
+ /**
2343
+ * Le bouton qui montre les champs inchanges : leur nombre, et le meme deja ecrit a la locale
2344
+ * (« 3 »). Son nom ne change pas quand il est enfonce (APG, bouton bascule).
2345
+ */
2346
+ readonly afficherLesChampsInchanges: (nombre: number, enChiffres: string) => string;
2347
+ /** Une liste de changements ou rien n'a change. */
2348
+ readonly aucuneModification: string;
2349
+ /**
2350
+ * Le nom d'une chronologie (`st-timeline`) : l'etiquette de l'application, puis son ordre, lu a
2351
+ * l'entree de la liste (« Historique du virement, du plus recent au plus ancien »).
2352
+ */
2353
+ readonly chronologieNommee: (etiquette: string, recentDAbord: boolean) => string;
2354
+ /**
2355
+ * L'action qui affiche un document (`st-document-list`, `apercevable`) : texte court visible, le
2356
+ * nom accessible y ajoute le document (« Voir RIB », D127).
2357
+ */
2358
+ readonly voir: string;
2359
+ /** Le mot masque d'un element non lu (`st-list-item`), lu avant son titre. */
2360
+ readonly nonLu: string;
2361
+ }
2362
+ export declare const LIBELLES_LISTES_FR: LibellesListes;
2363
+ export declare const LIBELLES_LISTES_EN: LibellesListes;
2364
+ /**
2365
+ * Les catalogues des listes par langue (sous-etiquette primaire : `fr`, `en`). Une application qui
2366
+ * ajoute une langue au dictionnaire du tronc ajoute la sienne ici, par
2367
+ * `fournirLibellesListes({ de: ... })`.
2368
+ */
2369
+ export declare const ST_LIBELLES_LISTES: InjectionToken<Readonly<Record<string, LibellesListes>>>;
2370
+ /** Ajoute (ou remplace) des catalogues des listes, par langue. */
2371
+ export declare function fournirLibellesListes(catalogues: Readonly<Record<string, LibellesListes>>): Provider;
2372
+ /**
2373
+ * Le catalogue de la langue du dictionnaire du tronc ; le francais quand la langue n'en a pas, un
2374
+ * repli signale en developpement (audit du 2026-09-27, D-29). A appeler dans un contexte
2375
+ * d'injection.
2376
+ */
2377
+ export declare function libellesDesListes(): Signal<LibellesListes>;
2378
+ /**
2379
+ * Le catalogue des listes ET la langue de son repli (`catalogueDuPointDEntree`) : `lang` de ce
2380
+ * qu'il ecrit seul (audit du 2026-09-27, D-29). A appeler dans un contexte d'injection.
2381
+ */
2382
+ export declare function catalogueDesListes(): Signal<CatalogueDuPointDEntree<LibellesListes>>;
2383
+ /** Ce qui est arrive a un champ : `ajoute` (rien avant), `supprime` (rien apres). */
2384
+ export type NatureDeChangement = 'ajoute' | 'modifie' | 'supprime' | 'inchange';
2385
+ /** Un champ d'une demande de modification : son ancienne valeur et la nouvelle, en texte. */
2386
+ export interface Changement {
2387
+ /** Identifiant stable : suivi de la ligne, et cle du gabarit `stValeurDeChangement`. */
2388
+ readonly cle: string;
2389
+ /** Le nom du champ (« Plafond mensuel »), deja traduit. */
2390
+ readonly libelle: string;
2391
+ /** L'ancienne valeur ; `null` ou vide : aucune. */
2392
+ readonly avant: string | null;
2393
+ /** La nouvelle valeur ; `null` ou vide : aucune. */
2394
+ readonly apres: string | null;
2395
+ /**
2396
+ * La nature, quand les valeurs ne peuvent pas la dire : deux formes MASQUEES par le serveur
2397
+ * (« FR76 •••• 0189 ») peuvent etre egales pour deux IBAN differents. Sans elle, deduite des
2398
+ * valeurs.
2399
+ */
2400
+ readonly nature?: NatureDeChangement;
2401
+ }
2402
+ /** Une ligne rendue : son changement, sa nature, ses valeurs lues et son gabarit. */
2403
+ interface LigneDeChangement {
2404
+ readonly changement: Changement;
2405
+ readonly nature: NatureDeChangement;
2406
+ readonly libelle: string;
2407
+ readonly avant: string | null;
2408
+ readonly apres: string | null;
2409
+ /** L'ancienne valeur est-elle barree (`del`), la nouvelle inseree (`ins`) ? */
2410
+ readonly barree: boolean;
2411
+ readonly inseree: boolean;
2412
+ readonly icone: NomDIcone;
2413
+ readonly mot: string;
2414
+ readonly gabarit: TemplateRef<ContexteDeValeurDeChangement> | null;
2415
+ }
2416
+ /**
2417
+ * Les changements d'une demande de modification, champ par champ : ce que le valideur voit AVANT
2418
+ * d'approuver (validation a quatre yeux : plafond, adresse, beneficiaire, mandat), ce qu'un journal
2419
+ * d'audit garde d'une operation.
2420
+ *
2421
+ * ```html
2422
+ * <st-change-list legende="Modifications du bénéficiaire" [changements]="changements()">
2423
+ * <ng-template stValeurDeChangement="iban" let-valeur>
2424
+ * <st-masked type="iban" [valeur]="valeur" [charger]="reveler" />
2425
+ * </ng-template>
2426
+ * </st-change-list>
2427
+ * ```
2428
+ *
2429
+ * ⚠️ **Un tableau natif** : la legende en `caption`, les en-tetes « Champ », « Avant », « Apres »,
2430
+ * le champ en en-tete de ligne ; sous la rupture `sm` du conteneur, chaque ligne s'empile (le
2431
+ * champ, puis l'ancienne valeur, une fleche et la nouvelle), sans mot coupe en lettres.
2432
+ *
2433
+ * ⚠️ **La nature se lit** : un mot et une icone sous le champ (« Modifie », crayon ; « Ajoute »,
2434
+ * plus ; « Supprime », corbeille), jamais une couleur seule ; l'ancienne valeur est barree
2435
+ * (`del`), la nouvelle inseree (`ins`), et chacune s'ouvre sur un mot masque (« Avant : »).
2436
+ *
2437
+ * ⚠️ **Les champs inchanges sont masques par defaut** : un bouton bascule, au nom fixe et
2438
+ * `aria-pressed`, les montre (`afficherInchanges`). Le valideur voit d'abord ce qui change.
2439
+ *
2440
+ * ⚠️ **Une valeur sensible arrive masquee** du serveur et passe par un gabarit qui compose
2441
+ * `st-masked` (`@starterlib/ui/donnees`, que ce point d'entree n'importe pas) ; sa revelation
2442
+ * reste la voie auditee de `st-masked`. Deux formes masquees egales ne prouvent rien : le serveur
2443
+ * dit alors la `nature`.
2444
+ */
2445
+ export declare class StChangeList {
2446
+ protected readonly libelles: Signal<import("@starterlib/ui").LibellesUi>;
2447
+ private readonly locale;
2448
+ private readonly catalogue;
2449
+ protected readonly mots: Signal<MotsDeChangement>;
2450
+ protected readonly textes: Signal<LibellesListes>;
2451
+ /** `lang` de ce que le catalogue ecrit seul, quand il retombe sur le francais (D-29). */
2452
+ protected readonly langue: Signal<string | null>;
2453
+ protected readonly identifiant: string;
2454
+ readonly changements: import("@angular/core").InputSignal<readonly Changement[]>;
2455
+ /** Le nom du tableau, en legende (« Modifications du beneficiaire »). */
2456
+ readonly legende: import("@angular/core").InputSignal<string>;
2457
+ /** Les champs inchanges se montrent ; le bouton bascule le change. */
2458
+ readonly afficherInchanges: import("@angular/core").ModelSignal<boolean>;
2459
+ private readonly gabarits;
2460
+ protected readonly lignes: Signal<readonly LigneDeChangement[]>;
2461
+ protected readonly nombreDInchanges: Signal<number>;
2462
+ protected readonly lignesVisibles: Signal<readonly LigneDeChangement[]>;
2463
+ protected readonly texteDeLaBascule: Signal<string>;
2464
+ protected basculer(): void;
2465
+ static ɵfac: i0.ɵɵFactoryDeclaration<StChangeList, never>;
2466
+ static ɵcmp: i0.ɵɵComponentDeclaration<StChangeList, "st-change-list", never, {
2467
+ "changements": {
2468
+ "alias": "changements";
2469
+ "required": true;
2470
+ "isSignal": true;
2471
+ };
2472
+ "legende": {
2473
+ "alias": "legende";
2474
+ "required": true;
2475
+ "isSignal": true;
2476
+ };
2477
+ "afficherInchanges": {
2478
+ "alias": "afficherInchanges";
2479
+ "required": false;
2480
+ "isSignal": true;
2481
+ };
2482
+ }, {
2483
+ "afficherInchanges": "afficherInchangesChange";
2484
+ }, ["gabarits"], never, true, never>;
429
2485
  }
430
2486
 
431
- export { StCellule, StDataTable, StDescription, StDescriptionList, StElementDeListe, StFilterBar, StFilterChip, StList, StPagination, StSortHeader, StTableauVide };
432
- export type { ColonneDeTableau, ContexteDElementDeListe, ContexteDeCellule, ContexteDeDescription, DensiteDeTableau, ElementDeDescription, FiltreActif, Focalisable, ModeDePagination, SensDeTri, TriDeTableau };
2487
+ export {};