@starterlib/ui 0.10.14 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +140 -33
  2. package/assets/icones/catalogue.json +199 -4
  3. package/assets/icones/sprite.svg +14 -0
  4. package/fesm2022/starterlib-ui-arbre.mjs +25 -25
  5. package/fesm2022/starterlib-ui-arbre.mjs.map +1 -1
  6. package/fesm2022/starterlib-ui-donnees.mjs +760 -274
  7. package/fesm2022/starterlib-ui-donnees.mjs.map +1 -1
  8. package/fesm2022/starterlib-ui-etats.mjs +82 -82
  9. package/fesm2022/starterlib-ui-etats.mjs.map +1 -1
  10. package/fesm2022/starterlib-ui-force.mjs +18 -0
  11. package/fesm2022/starterlib-ui-force.mjs.map +1 -0
  12. package/fesm2022/starterlib-ui-formulaires.mjs +218 -218
  13. package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
  14. package/fesm2022/starterlib-ui-graphiques.mjs +934 -0
  15. package/fesm2022/starterlib-ui-graphiques.mjs.map +1 -0
  16. package/fesm2022/starterlib-ui-indicateurs.mjs +59 -59
  17. package/fesm2022/starterlib-ui-indicateurs.mjs.map +1 -1
  18. package/fesm2022/starterlib-ui-libelles-en.mjs +12 -0
  19. package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -1
  20. package/fesm2022/starterlib-ui-listes.mjs +727 -315
  21. package/fesm2022/starterlib-ui-listes.mjs.map +1 -1
  22. package/fesm2022/starterlib-ui-messagerie.mjs +45 -45
  23. package/fesm2022/starterlib-ui-messagerie.mjs.map +1 -1
  24. package/fesm2022/starterlib-ui-mise-en-page.mjs +46 -46
  25. package/fesm2022/starterlib-ui-mise-en-page.mjs.map +1 -1
  26. package/fesm2022/starterlib-ui-navigation.mjs +201 -42
  27. package/fesm2022/starterlib-ui-navigation.mjs.map +1 -1
  28. package/fesm2022/starterlib-ui-onglets.mjs +20 -20
  29. package/fesm2022/starterlib-ui-onglets.mjs.map +1 -1
  30. package/fesm2022/starterlib-ui-parcours.mjs +632 -168
  31. package/fesm2022/starterlib-ui-parcours.mjs.map +1 -1
  32. package/fesm2022/starterlib-ui-qr.mjs +11 -11
  33. package/fesm2022/starterlib-ui-qr.mjs.map +1 -1
  34. package/fesm2022/starterlib-ui-saisie.mjs +693 -515
  35. package/fesm2022/starterlib-ui-saisie.mjs.map +1 -1
  36. package/fesm2022/starterlib-ui-selection.mjs +64 -64
  37. package/fesm2022/starterlib-ui-selection.mjs.map +1 -1
  38. package/fesm2022/starterlib-ui-sens.mjs +3 -3
  39. package/fesm2022/starterlib-ui-surfaces.mjs +246 -242
  40. package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
  41. package/fesm2022/starterlib-ui-virtuel.mjs +17 -17
  42. package/fesm2022/starterlib-ui-virtuel.mjs.map +1 -1
  43. package/fesm2022/starterlib-ui.mjs +1290 -938
  44. package/fesm2022/starterlib-ui.mjs.map +1 -1
  45. package/package.json +27 -3
  46. package/styles/amorce.css +304 -2
  47. package/types/starterlib-ui-donnees.d.ts +231 -5
  48. package/types/starterlib-ui-force.d.ts +19 -0
  49. package/types/starterlib-ui-graphiques.d.ts +421 -0
  50. package/types/starterlib-ui-indicateurs.d.ts +11 -4
  51. package/types/starterlib-ui-listes.d.ts +230 -13
  52. package/types/starterlib-ui-navigation.d.ts +82 -1
  53. package/types/starterlib-ui-parcours.d.ts +265 -5
  54. package/types/starterlib-ui-saisie.d.ts +142 -11
  55. package/types/starterlib-ui-selection.d.ts +1 -1
  56. package/types/starterlib-ui-surfaces.d.ts +10 -9
  57. package/types/starterlib-ui.d.ts +294 -32
package/styles/amorce.css CHANGED
@@ -14,7 +14,13 @@
14
14
 
15
15
  Elle reprend la mise en page de st-splash-screen (variante clair) : le passage de
16
16
  l'une a l'autre ne fait pas sauter le nom. Les jetons sont lus s'ils sont charges
17
- (starter-tokens.css, AVANT cette feuille), avec des replis systeme sinon. */
17
+ (starter-tokens.css, AVANT cette feuille), avec des replis systeme sinon.
18
+
19
+ Parties FACULTATIVES (0.11.1), celles d'un ecran de demarrage : la tuile du symbole (un
20
+ SVG EN LIGNE de l'hote, jamais une image chargee), le sous-titre de la marque et le pied ;
21
+ le surtitre, la scene (la tuile devant un decor, SVG en ligne de l'hote lui aussi) et la
22
+ pastille du bas de page. La variante `st-amorce--ample` en fait l'ecran de demarrage d'une
23
+ marque qui tient tout l'ecran. Sans elles, l'amorce est celle d'avant. */
18
24
 
19
25
  .st-amorce {
20
26
  position: fixed;
@@ -40,8 +46,29 @@
40
46
  background-color: var(--st-couleur-primaire, CanvasText);
41
47
  }
42
48
 
49
+ /* La tuile du symbole, comme celle de l'ecran de demarrage : 48 px, le symbole a 32. */
50
+ .st-amorce__tuile {
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ inline-size: var(--st-espacement-12, 3rem);
55
+ block-size: var(--st-espacement-12, 3rem);
56
+ margin-block-end: var(--st-espacement-2, 0.5rem);
57
+ color: var(--st-couleur-texte-primaire, CanvasText);
58
+ background-color: var(--st-couleur-surface-conteneur-bas, Canvas);
59
+ border: var(--st-epaisseur-fine, 1px) solid var(--st-couleur-surface-enfoncee, CanvasText);
60
+ border-radius: var(--st-rayon-lg, 0.75rem);
61
+ box-shadow: var(--st-ombre-repos, none);
62
+ }
63
+
64
+ .st-amorce__tuile > svg {
65
+ inline-size: var(--st-espacement-8, 2rem);
66
+ block-size: var(--st-espacement-8, 2rem);
67
+ }
68
+
43
69
  .st-amorce__nom {
44
70
  margin: 0;
71
+ font-family: var(--st-police-titre, inherit);
45
72
  font-size: var(--st-taille-lg, 1.125rem);
46
73
  font-weight: var(--st-graisse-semi, 600);
47
74
  line-height: var(--st-interligne-md, 1.5rem);
@@ -56,10 +83,285 @@
56
83
  color: var(--st-couleur-texte-discret, CanvasText);
57
84
  }
58
85
 
86
+ /* Le sous-titre de la marque, sous le nom : capitales discretes a l'encre primaire. */
87
+ .st-amorce__sous-titre {
88
+ margin: var(--st-espacement-demi, 0.125rem) 0 0;
89
+ font-size: var(--st-taille-2xs, 0.6875rem);
90
+ font-weight: var(--st-graisse-moyenne, 500);
91
+ line-height: var(--st-interligne-2xs, 1rem);
92
+ letter-spacing: var(--st-interlettrage-surtitre, 0.08em);
93
+ color: var(--st-couleur-texte-primaire, CanvasText);
94
+ text-transform: uppercase;
95
+ }
96
+
97
+ /* Le surtitre, au-dessus du symbole : capitales espacees entre deux points d'accent. */
98
+ .st-amorce__surtitre {
99
+ display: flex;
100
+ align-items: center;
101
+ gap: var(--st-espacement-2, 0.5rem);
102
+ margin: 0 0 var(--st-espacement-4, 1rem);
103
+ font-size: var(--st-taille-2xs, 0.6875rem);
104
+ font-weight: var(--st-graisse-moyenne, 500);
105
+ line-height: var(--st-interligne-2xs, 1rem);
106
+ letter-spacing: var(--st-interlettrage-surtitre, 0.1em);
107
+ color: var(--st-couleur-texte-discret, CanvasText);
108
+ text-transform: uppercase;
109
+ }
110
+
111
+ .st-amorce__surtitre::before,
112
+ .st-amorce__surtitre::after {
113
+ inline-size: var(--st-espacement-1-5, 0.375rem);
114
+ block-size: var(--st-espacement-1-5, 0.375rem);
115
+ content: '';
116
+ background-color: var(--st-couleur-accent, CanvasText);
117
+ border-radius: var(--st-rayon-pleine, 50%);
118
+ }
119
+
120
+ /* La scene : la tuile au centre d'un carre de 256 px (288 depuis md en ample), devant le decor
121
+ que l'hote dessine en SVG en ligne (cercles, axes, points), decoratif, a l'encre attenuee. */
122
+ .st-amorce__scene {
123
+ position: relative;
124
+ display: grid;
125
+ place-items: center;
126
+ inline-size: 16rem;
127
+ block-size: 16rem;
128
+ }
129
+
130
+ .st-amorce__scene > .st-amorce__tuile {
131
+ position: relative;
132
+ margin: 0;
133
+ }
134
+
135
+ .st-amorce__decor {
136
+ position: absolute;
137
+ inset: 0;
138
+ inline-size: 100%;
139
+ block-size: 100%;
140
+ color: color-mix(in srgb, var(--st-couleur-primaire-attenue, GrayText) 70%, transparent);
141
+ }
142
+
143
+ /* La pastille du bas de page : un point de succes, puis des mentions courtes (l'hote les
144
+ separe d'un point median tu au lecteur d'ecran). */
145
+ .st-amorce__pastille {
146
+ display: flex;
147
+ flex-wrap: wrap;
148
+ align-items: center;
149
+ justify-content: center;
150
+ gap: var(--st-espacement-1, 0.25rem) var(--st-espacement-2, 0.5rem);
151
+ max-inline-size: 32rem;
152
+ margin: var(--st-espacement-6, 1.5rem) 0 0;
153
+ padding: var(--st-espacement-2, 0.5rem) var(--st-espacement-4, 1rem);
154
+ font-size: var(--st-taille-2xs, 0.6875rem);
155
+ font-weight: var(--st-graisse-moyenne, 500);
156
+ line-height: var(--st-interligne-2xs, 1rem);
157
+ letter-spacing: var(--st-interlettrage-capitales, 0.05em);
158
+ color: var(--st-couleur-texte-discret, CanvasText);
159
+ background-color: color-mix(in srgb, var(--st-couleur-surface, Canvas) 80%, transparent);
160
+ border-radius: var(--st-rayon-lg, 0.75rem);
161
+ box-shadow: var(--st-ombre-repos, none);
162
+ }
163
+
164
+ .st-amorce__pastille::before {
165
+ inline-size: var(--st-espacement-2, 0.5rem);
166
+ block-size: var(--st-espacement-2, 0.5rem);
167
+ content: '';
168
+ background-color: var(--st-couleur-succes, CanvasText);
169
+ border-radius: var(--st-rayon-pleine, 50%);
170
+ }
171
+
172
+ /* Le separateur que l'hote tait au lecteur d'ecran, plus pale que les mentions ; pose a la fin de la
173
+ mention qu'il suit, il ne commence jamais une ligne, et l'ecart de la pastille le suit. */
174
+ .st-amorce__pastille [aria-hidden='true'] {
175
+ margin-inline-start: var(--st-espacement-2, 0.5rem);
176
+ color: var(--st-couleur-texte-desactive, GrayText);
177
+ }
178
+
179
+ /* Ample : l'ecran de demarrage d'une marque qui tient tout l'ecran (recette d'Aplomb du
180
+ 2026-10-07). Fond en degrade et halos, sans liseret ; le bloc central pose sur la pastille,
181
+ l'espace libre au-dessus ; tuile encadree a fond primaire (le symbole de l'hote s'y dessine
182
+ en clair), nom a l'encre primaire la plus profonde, sous-titre en phrase, statut sur un filet
183
+ en degrade. */
184
+ .st-amorce--ample {
185
+ justify-content: flex-start;
186
+ overflow-y: auto;
187
+ padding-block-end: var(--st-espacement-12, 3rem);
188
+ background-color: var(--st-couleur-surface-conteneur-bas, Canvas);
189
+ background-image:
190
+ radial-gradient(
191
+ circle 16rem at 50% 4rem,
192
+ color-mix(in srgb, var(--st-couleur-primaire-attenue, Canvas) 55%, transparent),
193
+ transparent
194
+ ),
195
+ radial-gradient(
196
+ circle 12rem at 50% calc(100% - 12rem),
197
+ color-mix(in srgb, var(--st-couleur-accent, Canvas) 5%, transparent),
198
+ transparent
199
+ ),
200
+ radial-gradient(
201
+ ellipse at top,
202
+ var(--st-couleur-primaire-discret, Canvas),
203
+ var(--st-couleur-surface-conteneur-bas, Canvas) 50%
204
+ );
205
+ }
206
+
207
+ .st-amorce--ample::before {
208
+ display: none;
209
+ }
210
+
211
+ .st-amorce--ample > :first-child {
212
+ margin-block-start: auto;
213
+ }
214
+
215
+ .st-amorce--ample .st-amorce__surtitre {
216
+ margin-block-end: var(--st-espacement-8, 2rem);
217
+ }
218
+
219
+ .st-amorce--ample .st-amorce__tuile {
220
+ inline-size: 9rem;
221
+ block-size: 9rem;
222
+ padding: var(--st-espacement-2, 0.5rem);
223
+ margin-block-end: var(--st-espacement-6, 1.5rem);
224
+ background-color: var(--st-couleur-surface, Canvas);
225
+ border: 0;
226
+ border-radius: var(--st-rayon-lg, 0.75rem);
227
+ box-shadow: var(--st-ombre-flottante, none);
228
+ }
229
+
230
+ .st-amorce--ample .st-amorce__scene {
231
+ margin-block-end: var(--st-espacement-6, 1.5rem);
232
+ }
233
+
234
+ .st-amorce--ample .st-amorce__scene > .st-amorce__tuile {
235
+ margin: 0;
236
+ }
237
+
238
+ /* Le fond primaire de la tuile, du plus profond en haut au primaire en bas, sous de fines
239
+ lignes de balayage ; en sombre, les primaires sont clairs : la tuile garde un bleu profond. */
240
+ .st-amorce--ample .st-amorce__tuile > svg {
241
+ box-sizing: border-box;
242
+ inline-size: 100%;
243
+ block-size: 100%;
244
+ padding: var(--st-espacement-8, 2rem);
245
+ background-image:
246
+ repeating-linear-gradient(
247
+ to bottom,
248
+ color-mix(in srgb, var(--st-couleur-sur-primaire, Canvas) 4%, transparent) 0 0.0625rem,
249
+ transparent 0.0625rem 0.25rem
250
+ ),
251
+ linear-gradient(
252
+ to bottom,
253
+ light-dark(
254
+ var(--st-couleur-primaire-actif, CanvasText),
255
+ var(--st-couleur-primaire-discret, Canvas)
256
+ ),
257
+ light-dark(var(--st-couleur-primaire, CanvasText), var(--st-couleur-primaire-attenue, Canvas))
258
+ );
259
+ border-radius: var(--st-rayon-lg, 0.75rem);
260
+ }
261
+
262
+ .st-amorce--ample .st-amorce__nom {
263
+ font-size: var(--st-taille-3xl, 2rem);
264
+ line-height: var(--st-interligne-3xl, 2.5rem);
265
+ letter-spacing: var(--st-approche-3xl, -0.02em);
266
+ color: light-dark(
267
+ var(--st-couleur-primaire-actif, CanvasText),
268
+ var(--st-couleur-texte-primaire, CanvasText)
269
+ );
270
+ }
271
+
272
+ .st-amorce--ample .st-amorce__sous-titre {
273
+ max-inline-size: 24rem;
274
+ margin-block-start: var(--st-espacement-2, 0.5rem);
275
+ font-size: var(--st-taille-md, 1rem);
276
+ font-weight: var(--st-graisse-normale, 400);
277
+ line-height: 1.625;
278
+ letter-spacing: normal;
279
+ color: var(--st-couleur-texte-discret, CanvasText);
280
+ text-transform: none;
281
+ }
282
+
283
+ /* Le statut, au-dessus d'un filet en degrade de la largeur du bloc : le filet est un ornement
284
+ (rien ne mesure le telechargement avant le JavaScript), jamais une progression. */
285
+ .st-amorce--ample .st-amorce__statut {
286
+ inline-size: min(100%, 20rem);
287
+ margin-block-start: var(--st-espacement-8, 2rem);
288
+ font-size: var(--st-taille-2xs, 0.6875rem);
289
+ font-weight: var(--st-graisse-semi, 600);
290
+ line-height: var(--st-interligne-2xs, 1rem);
291
+ letter-spacing: var(--st-interlettrage-large, 0.02em);
292
+ color: var(--st-couleur-texte-primaire, CanvasText);
293
+ text-align: start;
294
+ }
295
+
296
+ .st-amorce--ample .st-amorce__statut::after {
297
+ display: block;
298
+ block-size: var(--st-espacement-1-5, 0.375rem);
299
+ margin-block-start: var(--st-espacement-2-5, 0.625rem);
300
+ content: '';
301
+ background-image:
302
+ linear-gradient(
303
+ to right,
304
+ transparent 25%,
305
+ color-mix(in srgb, var(--st-couleur-sur-primaire, Canvas) 35%, transparent),
306
+ transparent 75%
307
+ ),
308
+ linear-gradient(
309
+ to right,
310
+ var(--st-couleur-primaire-actif, CanvasText),
311
+ var(--st-couleur-primaire-survol, CanvasText)
312
+ );
313
+ border-radius: var(--st-rayon-pleine, 50rem);
314
+ }
315
+
316
+ .st-amorce--ample .st-amorce__pastille {
317
+ margin-block-start: var(--st-espacement-8, 2rem);
318
+ }
319
+
320
+ /* Depuis md (48rem) : la scene a 288 px et la tuile a 160 px, comme la maquette de bureau. */
321
+ @media (min-width: 48rem) {
322
+ .st-amorce--ample .st-amorce__scene {
323
+ inline-size: 18rem;
324
+ block-size: 18rem;
325
+ }
326
+
327
+ .st-amorce--ample .st-amorce__tuile {
328
+ inline-size: 10rem;
329
+ block-size: 10rem;
330
+ }
331
+ }
332
+
333
+ /* Le pied : une ligne discrete au bas de la page, centree. */
334
+ .st-amorce__pied {
335
+ position: absolute;
336
+ inset: auto var(--st-espacement-4, 1rem) var(--st-espacement-4, 1rem);
337
+ margin: 0;
338
+ font-size: var(--st-taille-xs, 0.75rem);
339
+ line-height: var(--st-interligne-xs, 1rem);
340
+ color: var(--st-couleur-texte-attenue, CanvasText);
341
+ }
342
+
343
+ /* Bureau assez haut : le cadre de la maquette, 85 % de la hauteur centres dans la page, et
344
+ 4,5 rem entre le statut et la pastille. */
345
+ @media (min-width: 48rem) and (min-height: 45rem) {
346
+ .st-amorce--ample {
347
+ padding-block: calc(7.5vh + var(--st-espacement-8, 2rem));
348
+ }
349
+
350
+ .st-amorce--ample .st-amorce__pastille {
351
+ margin-block-start: 4.5rem;
352
+ }
353
+ }
354
+
59
355
  @media (forced-colors: active) {
60
- .st-amorce::before {
356
+ .st-amorce::before,
357
+ .st-amorce__decor {
61
358
  display: none;
62
359
  }
360
+
361
+ /* Le symbole garde son fond : dessine en clair, il disparaitrait sur la toile. */
362
+ .st-amorce--ample .st-amorce__tuile > svg {
363
+ forced-color-adjust: none;
364
+ }
63
365
  }
64
366
 
65
367
  @media print {
@@ -1,5 +1,6 @@
1
- import { AnnonceLocale, Icone, TailleDAvatar, TailleDIconeFixe, TonDAvatar } from "@starterlib/ui";
1
+ import { AnnonceLocale, CatalogueDuPointDEntree, Icone, TailleDAvatar, TailleDIconeFixe, TonDAvatar } from "@starterlib/ui";
2
2
  import * as i0 from "@angular/core";
3
+ import { InjectionToken, Provider, Signal } from "@angular/core";
3
4
  import { Ton, TonSemantique } from "@starterlib/util";
4
5
  import { BlocDeDocument, DocumentStructure, EmphaseDeDocument, LienDeDocument, Montant, MorceauDeTexte } from "@starterlib/util/valeurs";
5
6
  export type TypeMasque = 'iban' | 'carte' | 'telephone' | 'reference';
@@ -195,11 +196,13 @@ export declare class StMasked {
195
196
  export type TailleDeMontant = 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'hero';
196
197
  /**
197
198
  * Couleur choisie par l'appelant : `discret` pour un solde nul ou clos, `primaire` pour la
198
- * ligne choisie d'un tableau, `succes` et `danger` pour un statut de ligne (execute, rejete).
199
+ * ligne choisie d'un tableau, `succes` et `erreur` pour un statut de ligne (execute, rejete) ;
200
+ * `danger` reste pour une ligne a detruire ou une urgence (et pour le rejet ecrit avant le role
201
+ * `erreur`, P08-03, qui en a la couleur par defaut).
199
202
  * ⚠️ Un statut, jamais un sens : un debit n'est pas une erreur (D30). Le sens d'une
200
203
  * VARIATION se dit par `variation`, qui lit `positif` et `negatif`.
201
204
  */
202
- export type TonDeMontant = Extract<Ton, 'neutre' | 'discret' | 'primaire' | 'succes' | 'danger'>;
205
+ export type TonDeMontant = Extract<Ton, 'neutre' | 'discret' | 'primaire' | 'succes' | 'erreur' | 'danger'>;
203
206
  /** `mono` : colonne de chasse fixe des tableaux (planche 4, D19). */
204
207
  export type PoliceDeMontant = 'base' | 'mono';
205
208
  /** `fin` : cellule numerique, les virgules s'alignent en colonne. */
@@ -580,7 +583,7 @@ export type DecimalesDeNombre = number | {
580
583
  readonly max: number;
581
584
  };
582
585
  /** Les tons de `st-money` : un statut choisi par l'appelant, jamais deduit du signe. */
583
- export type TonDeNombre = Extract<Ton, 'neutre' | 'discret' | 'primaire' | 'succes' | 'danger'>;
586
+ export type TonDeNombre = Extract<Ton, 'neutre' | 'discret' | 'primaire' | 'succes' | 'erreur' | 'danger'>;
584
587
  /**
585
588
  * Un nombre qui n'est ni un montant (`st-money`) ni un compte (`st-count`) : un taux, un TAEG, une
586
589
  * quantite decimale, une grandeur avec son unite (lot 256).
@@ -1565,7 +1568,7 @@ export declare class StCode {
1565
1568
  protected readonly annonce: AnnonceLocale;
1566
1569
  protected readonly copieConfirmee: import("@angular/core").WritableSignal<boolean>;
1567
1570
  protected readonly copieRefusee: import("@angular/core").WritableSignal<boolean>;
1568
- protected readonly iconeDeCopie: import("@angular/core").Signal<"iban" | "chargement" | "message" | "devise" | "cle" | "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" | "cheque" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "chevrons-droite" | "chevrons-haut-bas" | "cloche" | "cloche-sonnerie" | "coche" | "code" | "code-qr" | "code-qr-scanner" | "coffre-fort" | "colonnes" | "connexion" | "contraste" | "copie" | "corbeille" | "corbeille-croix" | "courriel" | "crayon" | "croix" | "curseur-clic" | "deconnexion" | "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" | "imprimer" | "interdit" | "jalons" | "jauge" | "lien" | "lien-externe" | "lignes" | "lignes-crayon" | "liste" | "liste-coche" | "liste-controle" | "liste-numerotee" | "luminosite" | "lune" | "maillet" | "maison" | "marque-page" | "menu" | "menu-ouvert" | "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">;
1571
+ protected readonly iconeDeCopie: import("@angular/core").Signal<"iban" | "chargement" | "pause" | "message" | "essai" | "devise" | "cle" | "accessibilite" | "alimentation" | "appareil-photo" | "appareils" | "arborescence" | "asterisque" | "badge-coche" | "balance" | "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" | "cheque" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "chevrons-droite" | "chevrons-haut-bas" | "cible" | "cloche" | "cloche-sonnerie" | "coche" | "code" | "code-qr" | "code-qr-scanner" | "coffre-fort" | "colonnes" | "comparer" | "connexion" | "contraste" | "copie" | "corbeille" | "corbeille-croix" | "courriel" | "crayon" | "croix" | "curseur-clic" | "deconnexion" | "disposition" | "dollar" | "dossier" | "dossier-barre" | "dossier-ouvert" | "double-coche" | "drapeau" | "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" | "imprimer" | "interdit" | "jalons" | "jauge" | "lecture" | "lien" | "lien-externe" | "lignes" | "lignes-crayon" | "liste" | "liste-coche" | "liste-controle" | "liste-numerotee" | "luminosite" | "lune" | "maillet" | "maison" | "marque-page" | "menu" | "menu-ouvert" | "minuteur" | "mise-au-point" | "mise-en-page-image" | "moins" | "nuage-barre" | "nuage-televerser" | "octogone-alerte" | "oeil" | "oeil-barre" | "panneau-gauche" | "parametres" | "parapluie" | "parchemin" | "passerelle" | "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" | "reseau-jauge" | "robot" | "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" | "visage" | "wifi" | "wifi-barre">;
1569
1572
  protected readonly messageDeRefus: import("@angular/core").Signal<string>;
1570
1573
  private minuterieDeConfirmation;
1571
1574
  constructor();
@@ -1669,5 +1672,228 @@ export declare class StDocument {
1669
1672
  };
1670
1673
  }, {}, never, never, true, never>;
1671
1674
  }
1675
+ /** Les bornes de l'opacite : visible sur l'ecran comme a l'impression, jamais au point de gener la lecture. */
1676
+ export declare const OPACITE_DE_FILIGRANE: {
1677
+ readonly min: 0.04;
1678
+ readonly defaut: 0.08;
1679
+ readonly max: 0.2;
1680
+ };
1681
+ /**
1682
+ * Le motif d'une tuile : le texte en diagonale (-30 degres), centre. Une image SVG `data:` (permise
1683
+ * par `img-src 'self' data:`), servie en MASQUE : la couleur est celle du theme (`texte`), lue par la
1684
+ * feuille, et non ecrite dans l'image.
1685
+ */
1686
+ export declare function motifDeFiligrane(texte: string): string;
1687
+ /**
1688
+ * Filigrane (P08-04) : un texte repete en diagonale sur une zone, pour des resultats d'essai ou un
1689
+ * dossier imprimable (« Donnees fictives », « Specimen »). Le texte est fourni par l'application,
1690
+ * deja traduit.
1691
+ *
1692
+ * ```html
1693
+ * <section class="resultats">
1694
+ * <st-watermark texte="Donnees fictives" />
1695
+ * ...
1696
+ * </section>
1697
+ * ```
1698
+ *
1699
+ * - Il COUVRE son conteneur, que l'appelant positionne (`position: relative`), par-dessus son
1700
+ * contenu, a faible opacite (`opacite`, de 0,04 a 0,2 ; 0,08 par defaut) : le texte reste lisible,
1701
+ * a l'ecran comme a l'impression.
1702
+ * - Absent de l'arbre d'accessibilite : aucun noeud de texte (le motif est un masque CSS de l'hote,
1703
+ * `aria-hidden`), ce que la page dit deja en mots (banniere, titre). Il ne capte aucun pointeur.
1704
+ * - Motif SVG en ligne, sans requete ni reference `url(#...)` (que `<base href>` perd sous Safari et
1705
+ * Firefox), et sans attribut `style` statique : la politique de securite du contenu du socle suffit.
1706
+ * - Imprime par defaut (couleurs exactes) ; `[imprime]="false"` le retire du papier.
1707
+ */
1708
+ export declare class StWatermark {
1709
+ /** Le texte repete, deja traduit (« Donnees fictives »). */
1710
+ readonly texte: import("@angular/core").InputSignal<string>;
1711
+ /** Present a l'impression (defaut) ; `false` le retire du papier. */
1712
+ readonly imprime: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1713
+ /** Opacite du texte, ramenee entre 0,04 et 0,2 ; 0,08 par defaut. */
1714
+ readonly opacite: import("@angular/core").InputSignalWithTransform<number, number | `${number}`>;
1715
+ protected readonly motif: import("@angular/core").Signal<string>;
1716
+ protected readonly opaciteLue: import("@angular/core").Signal<number>;
1717
+ static ɵfac: i0.ɵɵFactoryDeclaration<StWatermark, never>;
1718
+ static ɵcmp: i0.ɵɵComponentDeclaration<StWatermark, "st-watermark", never, {
1719
+ "texte": {
1720
+ "alias": "texte";
1721
+ "required": true;
1722
+ "isSignal": true;
1723
+ };
1724
+ "imprime": {
1725
+ "alias": "imprime";
1726
+ "required": false;
1727
+ "isSignal": true;
1728
+ };
1729
+ "opacite": {
1730
+ "alias": "opacite";
1731
+ "required": false;
1732
+ "isSignal": true;
1733
+ };
1734
+ }, {}, never, never, true, never>;
1735
+ }
1736
+ /**
1737
+ * Lu jusqu'au bout (P08-08) : exige la lecture d'un document jusqu'a sa fin SANS exclure le clavier
1738
+ * ni le lecteur d'ecran, ce que ferait un simple detecteur de defilement.
1739
+ *
1740
+ * ```html
1741
+ * <section stLuJusquAuBout #lecture="stLuJusquAuBout" (atteint)="journaliser()">
1742
+ * <st-document [document]="conditions()" />
1743
+ * </section>
1744
+ * <button
1745
+ * stButton
1746
+ * [indisponible]="!lecture.lu()"
1747
+ * [raisonIndisponible]="lecture.lu() ? null : t('lireJusquAuBout')"
1748
+ * >
1749
+ * Accepter
1750
+ * </button>
1751
+ * ```
1752
+ *
1753
+ * - **Une sentinelle focalisable** « Fin du document » (`libelleDeFin` la remplace) suit le
1754
+ * contenu, dans le conteneur : un conteneur qui defile (`overflow: auto`) la cache jusqu'a la fin.
1755
+ * - **Trois voies** : la sentinelle visible a l'ecran (observateur d'intersection, au-dessus de la
1756
+ * barre inferieure et de l'action flottante) ; la tabulation jusqu'a elle ; le lecteur d'ecran,
1757
+ * dont le curseur fait defiler la page jusqu'a elle ou y pose le focus (VoiceOver).
1758
+ * - **Une seule emission** de `atteint` ; `lu()` reste vrai ensuite. Un autre document se lit dans
1759
+ * un autre conteneur (`@for ... track version`).
1760
+ * - **Aucun acces global** : la fenetre est celle du `DOCUMENT` injecte, et rien n'est observe
1761
+ * avant le rendu au navigateur ; un prerendu ne produit aucun effet.
1762
+ *
1763
+ * Pose sur un element du gabarit (`section`, `div`), jamais sur un composant : un element ne porte
1764
+ * qu'un composant. Recette : `docs/recettes/accepter-apres-lecture.md`.
1765
+ */
1766
+ export declare class StLuJusquAuBout {
1767
+ private readonly document;
1768
+ protected readonly catalogue: import("@angular/core").Signal<import("@starterlib/ui").CatalogueDuPointDEntree<import("@starterlib/ui/donnees").LibellesDonnees>>;
1769
+ /** Le texte de la sentinelle, deja traduit ; `null` : « Fin du document ». */
1770
+ readonly libelleDeFin: import("@angular/core").InputSignal<string | null>;
1771
+ /** Emise UNE fois, quand la fin du document est atteinte. */
1772
+ readonly atteint: import("@angular/core").OutputEmitterRef<void>;
1773
+ private readonly etat;
1774
+ /** Vrai des que la fin est atteinte : a lire pour l'indisponibilite du bouton qui suit. */
1775
+ readonly lu: import("@angular/core").Signal<boolean>;
1776
+ protected readonly libelleLu: import("@angular/core").Signal<string>;
1777
+ /** `lang` de la sentinelle quand son texte vient du catalogue de repli (D-29). */
1778
+ protected readonly langueLue: import("@angular/core").Signal<string | null>;
1779
+ private readonly sentinelle;
1780
+ private observateur;
1781
+ private surveillant;
1782
+ constructor();
1783
+ /** La fin est atteinte : une seule emission, et plus rien a observer. */
1784
+ protected atteindre(): void;
1785
+ /**
1786
+ * Observe la sentinelle dans la fenetre, le bas de la fenetre retranche de ce qui le recouvre ;
1787
+ * re-arme quand la coquille change ces hauteurs (attribut `style` de `<html>`).
1788
+ */
1789
+ private observer;
1790
+ private arreter;
1791
+ static ɵfac: i0.ɵɵFactoryDeclaration<StLuJusquAuBout, never>;
1792
+ static ɵcmp: i0.ɵɵComponentDeclaration<StLuJusquAuBout, "[stLuJusquAuBout]", ["stLuJusquAuBout"], {
1793
+ "libelleDeFin": {
1794
+ "alias": "libelleDeFin";
1795
+ "required": false;
1796
+ "isSignal": true;
1797
+ };
1798
+ }, {
1799
+ "atteint": "atteint";
1800
+ }, never, ["*"], true, never>;
1801
+ }
1802
+ /**
1803
+ * La fraicheur d'une donnee dont l'AGE compte (P08-12) : « A jour, il y a 12 s » ou « Perimee
1804
+ * depuis 2 min 05 s », en MOT et en FORME (une coche, un triangle), jamais par la couleur seule.
1805
+ *
1806
+ * ```html
1807
+ * <st-freshness [instant]="positions.lueA()" [seuil]="60" [libelle]="t('positions.titre')"
1808
+ * (perimee)="signaler()" />
1809
+ * ```
1810
+ *
1811
+ * - `instant` : la derniere lecture reussie (`lueA()` d'une `ressourceRafraichie`) ; `seuil` : l'age,
1812
+ * en secondes, au-dela duquel la donnee est perimee, fourni par le serveur ou l'application.
1813
+ * - **L'age se relit chaque seconde, onglet visible seulement** ; a son retour, le texte est juste.
1814
+ * - **Aucune region vivante** : le texte se reecrit chaque seconde, et une region l'annoncerait en
1815
+ * boucle. L'application annonce, elle, ce qui compte (`perimee`).
1816
+ * - **`perimee`** est emise une fois a chaque franchissement du seuil (et des la premiere lecture si
1817
+ * la donnee est deja perimee) ; une donnee rafraichie repasse « a jour ».
1818
+ */
1819
+ export declare class StFreshness {
1820
+ private readonly document;
1821
+ private readonly locale;
1822
+ private readonly fuseau;
1823
+ protected readonly catalogue: import("@angular/core").Signal<import("@starterlib/ui").CatalogueDuPointDEntree<import("@starterlib/ui/donnees").LibellesDonnees>>;
1824
+ /** L'instant de la donnee : `Date`, chaine ISO ou millisecondes. */
1825
+ readonly instant: import("@angular/core").InputSignal<string | number | Date>;
1826
+ /** L'age, en secondes, au-dela duquel la donnee est perimee. */
1827
+ readonly seuil: import("@angular/core").InputSignalWithTransform<number, unknown>;
1828
+ /** Ce qu'est la donnee (« Positions »), deja traduit ; `null` : rien devant l'etat. */
1829
+ readonly libelle: import("@angular/core").InputSignal<string | null>;
1830
+ /** Emise a chaque franchissement du seuil. */
1831
+ readonly perimee: import("@angular/core").OutputEmitterRef<void>;
1832
+ private readonly maintenant;
1833
+ private readonly enMillisecondes;
1834
+ protected readonly estValide: import("@angular/core").Signal<boolean>;
1835
+ /** L'age en secondes, jamais negatif (une horloge du poste en retard sur le serveur). */
1836
+ private readonly age;
1837
+ protected readonly estPerimee: import("@angular/core").Signal<boolean>;
1838
+ protected readonly icone: import("@angular/core").Signal<"iban" | "chargement" | "pause" | "message" | "essai" | "devise" | "cle" | "accessibilite" | "alimentation" | "appareil-photo" | "appareils" | "arborescence" | "asterisque" | "badge-coche" | "balance" | "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" | "cheque" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "chevrons-droite" | "chevrons-haut-bas" | "cible" | "cloche" | "cloche-sonnerie" | "coche" | "code" | "code-qr" | "code-qr-scanner" | "coffre-fort" | "colonnes" | "comparer" | "connexion" | "contraste" | "copie" | "corbeille" | "corbeille-croix" | "courriel" | "crayon" | "croix" | "curseur-clic" | "deconnexion" | "disposition" | "dollar" | "dossier" | "dossier-barre" | "dossier-ouvert" | "double-coche" | "drapeau" | "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" | "imprimer" | "interdit" | "jalons" | "jauge" | "lecture" | "lien" | "lien-externe" | "lignes" | "lignes-crayon" | "liste" | "liste-coche" | "liste-controle" | "liste-numerotee" | "luminosite" | "lune" | "maillet" | "maison" | "marque-page" | "menu" | "menu-ouvert" | "minuteur" | "mise-au-point" | "mise-en-page-image" | "moins" | "nuage-barre" | "nuage-televerser" | "octogone-alerte" | "oeil" | "oeil-barre" | "panneau-gauche" | "parametres" | "parapluie" | "parchemin" | "passerelle" | "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" | "reseau-jauge" | "robot" | "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" | "visage" | "wifi" | "wifi-barre">;
1839
+ protected readonly texte: import("@angular/core").Signal<string>;
1840
+ /** L'instant lisible par la machine (`<time datetime>`). */
1841
+ protected readonly iso: import("@angular/core").Signal<string | null>;
1842
+ constructor();
1843
+ static ɵfac: i0.ɵɵFactoryDeclaration<StFreshness, never>;
1844
+ static ɵcmp: i0.ɵɵComponentDeclaration<StFreshness, "st-freshness", never, {
1845
+ "instant": {
1846
+ "alias": "instant";
1847
+ "required": true;
1848
+ "isSignal": true;
1849
+ };
1850
+ "seuil": {
1851
+ "alias": "seuil";
1852
+ "required": true;
1853
+ "isSignal": true;
1854
+ };
1855
+ "libelle": {
1856
+ "alias": "libelle";
1857
+ "required": false;
1858
+ "isSignal": true;
1859
+ };
1860
+ }, {
1861
+ "perimee": "perimee";
1862
+ }, never, never, true, never>;
1863
+ }
1864
+ /**
1865
+ * Les libelles de `@starterlib/ui/donnees` (P08-08) : le catalogue par point d'entree (AD-10, D154),
1866
+ * comme ceux de la navigation et des formulaires. La langue suit celle du dictionnaire du tronc.
1867
+ */
1868
+ export interface LibellesDonnees {
1869
+ /** La sentinelle de `stLuJusquAuBout`, apres le dernier mot d'un document (« Fin du document »). */
1870
+ readonly finDuDocument: string;
1871
+ /** `st-freshness` a jour, son age relatif en argument (« A jour, il y a 12 s »). */
1872
+ readonly aJour: (age: string) => string;
1873
+ /** `st-freshness` perimee, la duree depuis le seuil en argument (« Perimee depuis 2 min 05 s »). */
1874
+ readonly perimeeDepuis: (duree: string) => string;
1875
+ /** Le nom de la donnee devant son etat, espace finale comprise (« Positions : »). */
1876
+ readonly libelleDeLaDonnee: (libelle: string) => string;
1877
+ }
1878
+ export declare const LIBELLES_DONNEES_FR: LibellesDonnees;
1879
+ export declare const LIBELLES_DONNEES_EN: LibellesDonnees;
1880
+ /**
1881
+ * Les catalogues des donnees par langue (sous-etiquette primaire : `fr`, `en`). Une application qui
1882
+ * ajoute une langue au dictionnaire du tronc ajoute la sienne ici, par
1883
+ * `fournirLibellesDonnees({ de: ... })`.
1884
+ */
1885
+ export declare const ST_LIBELLES_DONNEES: InjectionToken<Readonly<Record<string, LibellesDonnees>>>;
1886
+ /** Ajoute (ou remplace) des catalogues des donnees, par langue. */
1887
+ export declare function fournirLibellesDonnees(catalogues: Readonly<Record<string, LibellesDonnees>>): Provider;
1888
+ /**
1889
+ * Le catalogue de la langue du dictionnaire du tronc ; le francais quand la langue n'en a pas, un
1890
+ * repli signale en developpement (D-29). A appeler dans un contexte d'injection.
1891
+ */
1892
+ export declare function libellesDesDonnees(): Signal<LibellesDonnees>;
1893
+ /**
1894
+ * Le catalogue des donnees ET la langue de son repli (`catalogueDuPointDEntree`) : `lang` de ce
1895
+ * qu'il ecrit seul (D-29). A appeler dans un contexte d'injection.
1896
+ */
1897
+ export declare function catalogueDesDonnees(): Signal<CatalogueDuPointDEntree<LibellesDonnees>>;
1672
1898
 
1673
1899
  export {};
@@ -0,0 +1,19 @@
1
+ import { EstimateurDeForce } from "@starterlib/ui/saisie";
2
+ /** Les dictionnaires de langue que l'estimateur sait ajouter au dictionnaire commun. */
3
+ export type LangueDuDictionnaire = 'fr' | 'en';
4
+ /**
5
+ * Charge l'estimateur zxcvbn-ts (ADR web 0011) : son noyau, le dictionnaire commun et les claviers,
6
+ * puis un dictionnaire par langue demandee. Chaque morceau est un import DYNAMIQUE : l'outil de
7
+ * construction de l'application en fait des fichiers a part, et seuls les dictionnaires demandes se
8
+ * telechargent. Poids mesures (brotli 11, 2026-10-07) : noyau et commun 213 Ko ; avec le francais
9
+ * 471 Ko ; avec l'anglais 755 Ko ; les deux 1 009 Ko.
10
+ *
11
+ * Distance de Levenshtein active : un mot du dictionnaire a une ou deux lettres pres reste un mot du
12
+ * dictionnaire, et la jauge en devient plus prudente (`Motdepasse1!` passe de 2 a 1). Aucun appel
13
+ * reseau : le matcher des mots de passe divulgues (`@zxcvbn-ts/matcher-pwned`) n'est PAS branche,
14
+ * cette verification reste au serveur. Aucune traduction : le retour de la bibliotheque n'est pas
15
+ * montre.
16
+ */
17
+ export declare function chargerEstimateurZxcvbn(langues?: readonly LangueDuDictionnaire[]): Promise<EstimateurDeForce>;
18
+
19
+ export {};