@starterlib/ui 0.1.1 → 0.2.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.
@@ -1,7 +1,81 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, Provider, TemplateRef } from '@angular/core';
3
- import { Montant } from '@starterlib/util';
2
+ import { InjectionToken, Signal, Provider, Resource, TemplateRef } from '@angular/core';
3
+ import { Ton, Montant, TonSemantique, EtatDeBloc } from '@starterlib/util';
4
+ export { ETATS_DE_BLOC, EtatDeBloc } from '@starterlib/util';
4
5
 
6
+ /**
7
+ * Les textes que les composants portent eux-memes.
8
+ *
9
+ * ⚠️ Ce ne sont pas « les textes de l'application » : le socle ne connait aucun
10
+ * ecran. Ce sont les quelques mots qu'un composant doit dire sans que
11
+ * l'appelant ait a les fournir a chaque usage — le nom d'un bouton de copie,
12
+ * l'annonce d'un chargement, la mention d'une ouverture dans une autre fenetre.
13
+ * Tout le reste est un `input` de l'appelant.
14
+ *
15
+ * Les entrees a trou sont des FONCTIONS, et non des gabarits a interpoler :
16
+ * l'ordre des mots change d'une langue a l'autre (« IBAN se terminant par
17
+ * 2606 » contre « IBAN ending in 2606 »), et une fonction laisse la langue
18
+ * decider, sans inventer un mini-langage de gabarit dans la librairie.
19
+ */
20
+ interface LibellesUi {
21
+ /** Indicateur d'activite, et etat de chargement d'un bloc. */
22
+ readonly chargementEnCours: string;
23
+ readonly erreurSurvenue: string;
24
+ readonly aucunResultat: string;
25
+ readonly horsConnexion: string;
26
+ /** Erreur : action de rejeu, et etiquette de l'identifiant technique. */
27
+ readonly reessayer: string;
28
+ readonly identifiantDeTrace: string;
29
+ /** Etiquette du code machine affiche a cote du message. */
30
+ readonly codeTechnique: string;
31
+ /** Valeur technique copiable. */
32
+ readonly copier: string;
33
+ readonly copieEffectuee: string;
34
+ /** Valeur masquee. */
35
+ readonly afficher: string;
36
+ readonly masquer: string;
37
+ readonly valeurMasqueeANouveau: string;
38
+ readonly natureIban: string;
39
+ readonly natureCarte: string;
40
+ readonly natureTelephone: string;
41
+ readonly seTerminantPar: (nature: string, quatreDerniers: string) => string;
42
+ /** Lien sortant, etiquette de retrait, temps relatif. */
43
+ readonly nouvelleFenetre: string;
44
+ readonly retirer: string;
45
+ readonly aLInstant: string;
46
+ }
47
+ /**
48
+ * Defaut francais, identique mot pour mot aux textes ecrits en dur jusqu'a la
49
+ * 0.1.1 : une application qui ne fournit rien ne change pas de comportement.
50
+ *
51
+ * Il existe pour que le socle reste utilisable sans i18n, pas pour dispenser
52
+ * d'en avoir une. Une application bilingue DOIT fournir son propre dictionnaire
53
+ * sous forme de signal — sinon la moitie de l'interface reste en francais quand
54
+ * l'utilisateur passe a l'anglais, et rien ne le signale.
55
+ */
56
+ declare const LIBELLES_FR: LibellesUi;
57
+ /** Traduction anglaise du meme dictionnaire. La paire est obligatoire. */
58
+ declare const LIBELLES_EN: LibellesUi;
59
+
60
+ /**
61
+ * Locale de formatage des montants, des dates et des nombres, **sous forme de
62
+ * signal**.
63
+ *
64
+ * ⚠️ Pourquoi pas `LOCALE_ID` : il est fige au demarrage de l'application. Or
65
+ * l'ADR 0014 du backend exige de changer de langue SANS recharger — la coquille
66
+ * detient la langue, et tout doit basculer d'un coup. Un composant qui lit
67
+ * `LOCALE_ID` continuerait d'afficher « 1 234,50 € » dans une interface passee
68
+ * a l'anglais.
69
+ *
70
+ * Le defaut lit `LOCALE_ID` : une application qui ne fournit rien garde le
71
+ * comportement d'avant, simplement sans pouvoir changer de langue a chaud.
72
+ */
73
+ declare const ST_LOCALE: InjectionToken<Signal<string>>;
74
+ /**
75
+ * Textes portes par les composants eux-memes, sous forme de signal pour la
76
+ * meme raison que la locale.
77
+ */
78
+ declare const ST_LIBELLES: InjectionToken<Signal<LibellesUi>>;
5
79
  /**
6
80
  * Chemin du sprite SVG des icones, **fourni par l'application**.
7
81
  *
@@ -28,6 +102,29 @@ declare const CHEMIN_DU_SPRITE: InjectionToken<string>;
28
102
  * pourraient viser deux sprites differents.
29
103
  */
30
104
  declare function fournirCheminDuSprite(chemin: string): Provider;
105
+ /** Ce que l'application fournit a `@starterlib/ui`, et rien d'autre. */
106
+ interface ConfigurationUi {
107
+ /** Obligatoire : voir `CHEMIN_DU_SPRITE`. */
108
+ readonly cheminDuSprite: string;
109
+ /**
110
+ * Locale de formatage. Un signal quand la langue change a l'execution, ce
111
+ * qui est le cas des que la coquille porte un selecteur de langue.
112
+ */
113
+ readonly locale?: Signal<string> | string;
114
+ /** Textes portes par les composants. Un signal, pour la meme raison. */
115
+ readonly libelles?: Signal<LibellesUi> | LibellesUi;
116
+ /** Fuseau de rendu des dates. Vient de la personne connectee, pas du poste. */
117
+ readonly fuseau?: string;
118
+ }
119
+ /**
120
+ * Configure `@starterlib/ui` pour toute l'application.
121
+ *
122
+ * ⚠️ A appeler dans l'HOTE uniquement. Dans un assemblage federe, un remote qui
123
+ * la rappellerait poserait un second jeu de valeurs dans son injecteur de
124
+ * route : deux locales, deux dictionnaires, et la moitie de l'ecran resterait
125
+ * dans l'ancienne langue apres une bascule.
126
+ */
127
+ declare function provideStarterUi(configuration: ConfigurationUi): Provider[];
31
128
  /**
32
129
  * Marque la presence d'une region vivante possedee par un ancetre, en pratique
33
130
  * le composant `st-state`.
@@ -46,15 +143,9 @@ declare const REGION_VIVANTE_PARENTE: InjectionToken<true>;
46
143
  */
47
144
  declare const FUSEAU_PAR_DEFAUT: InjectionToken<string>;
48
145
 
49
- /**
50
- * Les cinq etats que tout bloc consommant l'API doit traiter. Le type les
51
- * enumere pour qu'aucun ne s'oublie : un `switch` non exhaustif ne compile pas.
52
- */
53
- type EtatDeBloc = 'chargement' | 'erreur' | 'vide' | 'hors-ligne' | 'succes';
54
- declare const ETATS_DE_BLOC: readonly EtatDeBloc[];
55
-
56
146
  type TailleDIcone = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
57
- type TonDIcone = 'courant' | 'discret' | 'primaire' | 'succes' | 'avertissement' | 'danger';
147
+ /** Une icone prend n'importe quel ton sauf `inverse`, qui vise un fond plein. */
148
+ type TonDIcone = Exclude<Ton, 'inverse'>;
58
149
  /**
59
150
  * Icone tiree d'un sprite SVG servi en meme origine.
60
151
  *
@@ -69,13 +160,13 @@ type TonDIcone = 'courant' | 'discret' | 'primaire' | 'succes' | 'avertissement'
69
160
  */
70
161
  declare class StIcon {
71
162
  private readonly cheminDuSprite;
72
- readonly nom: _angular_core.InputSignal<"hors-ligne" | "boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur">;
163
+ readonly nom: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur">;
73
164
  readonly taille: _angular_core.InputSignal<TailleDIcone>;
74
165
  readonly ton: _angular_core.InputSignal<TonDIcone>;
75
166
  /** `null` : l'icone est decorative et reste muette pour les lecteurs. */
76
167
  readonly etiquette: _angular_core.InputSignal<string | null>;
77
- readonly estDecorative: _angular_core.Signal<boolean>;
78
- readonly reference: _angular_core.Signal<string>;
168
+ protected readonly estDecorative: _angular_core.Signal<boolean>;
169
+ protected readonly reference: _angular_core.Signal<string>;
79
170
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StIcon, never>;
80
171
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StIcon, "st-icon", never, { "nom": { "alias": "nom"; "required": true; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
81
172
  }
@@ -103,7 +194,7 @@ type GraisseDeTexte = 'normale' | 'moyenne' | 'semi';
103
194
  declare class StText {
104
195
  readonly variante: _angular_core.InputSignal<VarianteDeTexte>;
105
196
  readonly graisse: _angular_core.InputSignal<GraisseDeTexte>;
106
- readonly enLigne: _angular_core.InputSignal<boolean>;
197
+ readonly enLigne: _angular_core.InputSignalWithTransform<boolean, unknown>;
107
198
  /**
108
199
  * Nombre de lignes au-dela duquel le texte est coupe.
109
200
  *
@@ -134,13 +225,13 @@ declare class StHeading {
134
225
  readonly taille: _angular_core.InputSignal<TailleDeTitre | null>;
135
226
  /** Cible d'un `aria-labelledby` : une region se nomme par son titre. */
136
227
  readonly identifiant: _angular_core.InputSignal<string | null>;
137
- readonly tailleEffective: _angular_core.Signal<TailleDeTitre>;
228
+ protected readonly tailleEffective: _angular_core.Signal<TailleDeTitre>;
138
229
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StHeading, never>;
139
230
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StHeading, "st-heading", never, { "niveau": { "alias": "niveau"; "required": true; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "identifiant": { "alias": "identifiant"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
140
231
  }
141
232
 
142
233
  type TailleDeSpinner = 'sm' | 'md' | 'lg';
143
- type TonDeSpinner = 'courant' | 'primaire' | 'inverse';
234
+ type TonDeSpinner = Extract<Ton, 'neutre' | 'primaire' | 'inverse'>;
144
235
  /**
145
236
  * Indicateur d'activite indeterminee.
146
237
  *
@@ -156,15 +247,18 @@ type TonDeSpinner = 'courant' | 'primaire' | 'inverse';
156
247
  */
157
248
  declare class StSpinner {
158
249
  private readonly regionParente;
250
+ private readonly libelles;
159
251
  readonly taille: _angular_core.InputSignal<TailleDeSpinner>;
160
252
  readonly ton: _angular_core.InputSignal<TonDeSpinner>;
161
- readonly etiquette: _angular_core.InputSignal<string>;
162
- readonly sAnnonce: _angular_core.Signal<boolean>;
253
+ /** `null` : le texte vient du dictionnaire de l'application. */
254
+ readonly etiquette: _angular_core.InputSignal<string | null>;
255
+ protected readonly etiquetteLue: _angular_core.Signal<string>;
256
+ protected readonly sAnnonce: _angular_core.Signal<boolean>;
163
257
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSpinner, never>;
164
258
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSpinner, "st-spinner", never, { "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
165
259
  }
166
260
 
167
- type TonDeProgression = 'primaire' | 'succes' | 'danger';
261
+ type TonDeProgression = Extract<Ton, 'primaire' | 'succes' | 'danger'>;
168
262
  /**
169
263
  * Barre de progression, determinee ou indeterminee.
170
264
  *
@@ -181,10 +275,10 @@ declare class StProgress {
181
275
  readonly ton: _angular_core.InputSignal<TonDeProgression>;
182
276
  /** Texte lu a la place du pourcentage quand celui-ci n'est pas parlant. */
183
277
  readonly texteDeValeur: _angular_core.InputSignal<string | null>;
184
- readonly estIndeterminee: _angular_core.Signal<boolean>;
278
+ protected readonly estIndeterminee: _angular_core.Signal<boolean>;
185
279
  /** Omis quand la progression est indeterminee : l'annoncer serait faux. */
186
- readonly valeurAnnoncee: _angular_core.Signal<number | null>;
187
- readonly pourcentage: _angular_core.Signal<number>;
280
+ protected readonly valeurAnnoncee: _angular_core.Signal<number | null>;
281
+ protected readonly pourcentage: _angular_core.Signal<number>;
188
282
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StProgress, never>;
189
283
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StProgress, "st-progress", never, { "valeur": { "alias": "valeur"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": true; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "texteDeValeur": { "alias": "texteDeValeur"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
190
284
  }
@@ -204,14 +298,20 @@ declare class StSkeleton {
204
298
  readonly variante: _angular_core.InputSignal<VarianteDeSquelette>;
205
299
  readonly lignes: _angular_core.InputSignal<number>;
206
300
  readonly colonnes: _angular_core.InputSignal<number>;
207
- readonly anime: _angular_core.InputSignal<boolean>;
208
- readonly indicesDeLigne: _angular_core.Signal<number[]>;
209
- readonly indicesDeColonne: _angular_core.Signal<number[]>;
301
+ readonly anime: _angular_core.InputSignalWithTransform<boolean, unknown>;
302
+ protected readonly indicesDeLigne: _angular_core.Signal<number[]>;
303
+ protected readonly indicesDeColonne: _angular_core.Signal<number[]>;
210
304
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSkeleton, never>;
211
305
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSkeleton, "st-skeleton", never, { "variante": { "alias": "variante"; "required": false; "isSignal": true; }; "lignes": { "alias": "lignes"; "required": false; "isSignal": true; }; "colonnes": { "alias": "colonnes"; "required": false; "isSignal": true; }; "anime": { "alias": "anime"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
212
306
  }
213
307
 
214
- type VarianteDeBouton = 'primaire' | 'secondaire' | 'discret' | 'destructeur';
308
+ /**
309
+ * ⚠️ Une variante dit quel FOND le bouton prend, pas ce qu'il signifie ; c'est
310
+ * un axe distinct du ton, et il le reste. Mais son quatrieme membre s'appelle
311
+ * `danger` comme partout ailleurs : il n'y a aucune raison qu'un bouton rouge
312
+ * et une pastille rouge portent deux mots differents.
313
+ */
314
+ type VarianteDeBouton = 'primaire' | 'secondaire' | 'discret' | 'danger';
215
315
  type TailleDeBouton = 'sm' | 'md' | 'lg';
216
316
  /**
217
317
  * Bouton du socle, pose en ATTRIBUT sur un `<button>` natif.
@@ -235,15 +335,15 @@ type TailleDeBouton = 'sm' | 'md' | 'lg';
235
335
  declare class StButton {
236
336
  readonly variante: _angular_core.InputSignal<VarianteDeBouton>;
237
337
  readonly taille: _angular_core.InputSignal<TailleDeBouton>;
238
- readonly pleineLargeur: _angular_core.InputSignal<boolean>;
239
- readonly iconeAvant: _angular_core.InputSignal<"hors-ligne" | "boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur" | null>;
240
- readonly iconeApres: _angular_core.InputSignal<"hors-ligne" | "boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur" | null>;
338
+ readonly pleineLargeur: _angular_core.InputSignalWithTransform<boolean, unknown>;
339
+ readonly iconeAvant: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur" | null>;
340
+ readonly iconeApres: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur" | null>;
241
341
  /**
242
342
  * Action en cours. Tant qu'il vaut vrai, les clics sont avales : c'est le
243
343
  * mecanisme d'anti double soumission. L'appelant doit le lever DES la
244
344
  * soumission, pas a l'arrivee de la reponse.
245
345
  */
246
- readonly chargement: _angular_core.InputSignal<boolean>;
346
+ readonly chargement: _angular_core.InputSignalWithTransform<boolean, unknown>;
247
347
  /**
248
348
  * Le ton suit le FOND du bouton, et non le bouton en general : sur une
249
349
  * variante posee sur la surface (`secondaire`, qui est le defaut, et
@@ -255,7 +355,7 @@ declare class StButton {
255
355
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StButton, "button[stButton]", never, { "variante": { "alias": "variante"; "required": false; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "pleineLargeur": { "alias": "pleineLargeur"; "required": false; "isSignal": true; }; "iconeAvant": { "alias": "iconeAvant"; "required": false; "isSignal": true; }; "iconeApres": { "alias": "iconeApres"; "required": false; "isSignal": true; }; "chargement": { "alias": "chargement"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
256
356
  }
257
357
 
258
- type VarianteDeBoutonIcone = 'discret' | 'secondaire' | 'destructeur';
358
+ type VarianteDeBoutonIcone = Extract<VarianteDeBouton, 'discret' | 'secondaire' | 'danger'>;
259
359
  /**
260
360
  * Bouton reduit a une icone, pose en attribut sur un `<button>` natif.
261
361
  *
@@ -264,15 +364,22 @@ type VarianteDeBoutonIcone = 'discret' | 'secondaire' | 'destructeur';
264
364
  * de facon fiable.
265
365
  */
266
366
  declare class StIconButton {
267
- readonly icone: _angular_core.InputSignal<"hors-ligne" | "boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur">;
367
+ readonly icone: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur">;
268
368
  /** Nom accessible du controle. Sans lui, l'icone ne dit rien. */
269
369
  readonly etiquette: _angular_core.InputSignal<string>;
270
370
  readonly variante: _angular_core.InputSignal<VarianteDeBoutonIcone>;
271
371
  readonly taille: _angular_core.InputSignal<"sm" | "md">;
272
- /** `null` : le bouton n'est pas a deux etats et n'annonce aucune pression. */
273
- readonly enfonce: _angular_core.ModelSignal<boolean | null>;
372
+ /**
373
+ * `null` : le bouton n'est pas a deux etats et n'annonce aucune pression.
374
+ *
375
+ * ⚠️ Une ENTREE, et non un `model`. Le composant ne bascule rien de lui-meme :
376
+ * l'etat enfonce reflete une donnee que l'appelant detient. En `model`,
377
+ * `[(enfonce)]` compilait et ne remontait jamais — une liaison bidirectionnelle
378
+ * muette est pire qu'absente, puisqu'elle se relit comme fonctionnelle.
379
+ */
380
+ readonly enfonce: _angular_core.InputSignal<boolean | null>;
274
381
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StIconButton, never>;
275
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StIconButton, "button[stIconButton]", never, { "icone": { "alias": "icone"; "required": true; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": true; "isSignal": true; }; "variante": { "alias": "variante"; "required": false; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "enfonce": { "alias": "enfonce"; "required": false; "isSignal": true; }; }, { "enfonce": "enfonceChange"; }, never, never, true, never>;
382
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StIconButton, "button[stIconButton]", never, { "icone": { "alias": "icone"; "required": true; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": true; "isSignal": true; }; "variante": { "alias": "variante"; "required": false; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "enfonce": { "alias": "enfonce"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
276
383
  }
277
384
 
278
385
  type VarianteDeLien = 'texte' | 'autonome' | 'discret';
@@ -287,11 +394,16 @@ type VarianteDeLien = 'texte' | 'autonome' | 'discret';
287
394
  * quiconque regarde l'ecran.
288
395
  */
289
396
  declare class StLink {
397
+ private readonly libelles;
290
398
  readonly variante: _angular_core.InputSignal<VarianteDeLien>;
291
399
  /** Ouvre dans un nouvel onglet, et l'annonce dans le nom accessible. */
292
- readonly externe: _angular_core.InputSignal<boolean>;
293
- /** Mention lue par les lecteurs d'ecran quand le lien sort du site. */
294
- readonly mentionExterne: _angular_core.InputSignal<string>;
400
+ readonly externe: _angular_core.InputSignalWithTransform<boolean, unknown>;
401
+ /**
402
+ * Mention lue par les lecteurs d'ecran quand le lien sort du site.
403
+ * `null` : le texte vient du dictionnaire de l'application.
404
+ */
405
+ readonly mentionExterne: _angular_core.InputSignal<string | null>;
406
+ protected readonly mentionExterneLue: _angular_core.Signal<string>;
295
407
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StLink, never>;
296
408
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StLink, "a[stLink]", never, { "variante": { "alias": "variante"; "required": false; "isSignal": true; }; "externe": { "alias": "externe"; "required": false; "isSignal": true; }; "mentionExterne": { "alias": "mentionExterne"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
297
409
  }
@@ -309,7 +421,7 @@ declare class StButtonGroup {
309
421
  readonly etiquette: _angular_core.InputSignal<string>;
310
422
  readonly orientation: _angular_core.InputSignal<"horizontale" | "verticale">;
311
423
  /** Boutons jointifs, rayons fusionnes. */
312
- readonly attache: _angular_core.InputSignal<boolean>;
424
+ readonly attache: _angular_core.InputSignalWithTransform<boolean, unknown>;
313
425
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StButtonGroup, never>;
314
426
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StButtonGroup, "st-button-group", never, { "etiquette": { "alias": "etiquette"; "required": true; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "attache": { "alias": "attache"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
315
427
  }
@@ -326,24 +438,28 @@ declare class StButtonGroup {
326
438
  declare class StCode {
327
439
  private readonly document;
328
440
  private readonly destruction;
441
+ private readonly libelles;
329
442
  readonly valeur: _angular_core.InputSignal<string>;
330
- readonly etiquette: _angular_core.InputSignal<string>;
331
- readonly copiable: _angular_core.InputSignal<boolean>;
332
- readonly libelleCopier: _angular_core.InputSignal<string>;
333
- readonly messageDeConfirmation: _angular_core.InputSignal<string>;
443
+ readonly copiable: _angular_core.InputSignalWithTransform<boolean, unknown>;
444
+ /** `null` : les textes viennent du dictionnaire de l'application. */
445
+ readonly etiquette: _angular_core.InputSignal<string | null>;
446
+ readonly libelleCopier: _angular_core.InputSignal<string | null>;
447
+ readonly messageDeConfirmation: _angular_core.InputSignal<string | null>;
448
+ protected readonly etiquetteLue: _angular_core.Signal<string>;
449
+ protected readonly libelleCopierLu: _angular_core.Signal<string>;
334
450
  readonly copie: _angular_core.OutputEmitterRef<string>;
335
451
  private readonly confirmation;
336
452
  private minuterie;
337
- readonly texteDeConfirmation: _angular_core.Signal<string>;
453
+ protected readonly texteDeConfirmation: _angular_core.Signal<string>;
338
454
  /**
339
455
  * Le bouton n'apparait que si le navigateur sait copier. Sans presse-papiers,
340
456
  * un bouton qui ne fait rien vaut moins que la selection manuelle, que la
341
457
  * feuille garde possible (`user-select: all`).
342
458
  */
343
- readonly copiePossible: _angular_core.Signal<boolean>;
459
+ protected readonly copiePossible: _angular_core.Signal<boolean>;
344
460
  protected auClicDeCopie(): Promise<void>;
345
461
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCode, never>;
346
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StCode, "st-code", never, { "valeur": { "alias": "valeur"; "required": true; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "copiable": { "alias": "copiable"; "required": false; "isSignal": true; }; "libelleCopier": { "alias": "libelleCopier"; "required": false; "isSignal": true; }; "messageDeConfirmation": { "alias": "messageDeConfirmation"; "required": false; "isSignal": true; }; }, { "copie": "copie"; }, never, never, true, never>;
462
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StCode, "st-code", never, { "valeur": { "alias": "valeur"; "required": true; "isSignal": true; }; "copiable": { "alias": "copiable"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "libelleCopier": { "alias": "libelleCopier"; "required": false; "isSignal": true; }; "messageDeConfirmation": { "alias": "messageDeConfirmation"; "required": false; "isSignal": true; }; }, { "copie": "copie"; }, never, never, true, never>;
347
463
  }
348
464
 
349
465
  type TypeMasque = 'iban' | 'carte' | 'telephone';
@@ -359,24 +475,31 @@ type TypeMasque = 'iban' | 'carte' | 'telephone';
359
475
  * journal.
360
476
  */
361
477
  declare class StMasked {
478
+ private readonly libelles;
362
479
  private readonly destruction;
363
480
  readonly valeur: _angular_core.InputSignal<string>;
364
481
  readonly type: _angular_core.InputSignal<TypeMasque>;
365
482
  readonly revele: _angular_core.ModelSignal<boolean>;
366
- readonly revelationAutorisee: _angular_core.InputSignal<boolean>;
483
+ readonly revelationAutorisee: _angular_core.InputSignalWithTransform<boolean, unknown>;
367
484
  readonly dureeDeRevelationEnSecondes: _angular_core.InputSignal<number>;
368
- readonly libelleAfficher: _angular_core.InputSignal<string>;
369
- readonly libelleMasquer: _angular_core.InputSignal<string>;
485
+ /** `null` : les textes viennent du dictionnaire de l'application. */
486
+ readonly libelleAfficher: _angular_core.InputSignal<string | null>;
487
+ readonly libelleMasquer: _angular_core.InputSignal<string | null>;
370
488
  readonly revelation: _angular_core.OutputEmitterRef<{
371
489
  type: TypeMasque;
372
490
  }>;
373
491
  private readonly annonce;
374
- readonly texteDAnnonce: _angular_core.Signal<string>;
492
+ protected readonly texteDAnnonce: _angular_core.Signal<string>;
375
493
  private minuterie;
376
- readonly valeurMasquee: _angular_core.Signal<string>;
377
- readonly valeurAffichee: _angular_core.Signal<string>;
378
- readonly nomAccessible: _angular_core.Signal<string>;
379
- readonly libelleDuBouton: _angular_core.Signal<string>;
494
+ protected readonly valeurMasquee: _angular_core.Signal<string>;
495
+ protected readonly valeurAffichee: _angular_core.Signal<string>;
496
+ /**
497
+ * La nature et la tournure viennent du dictionnaire : l'ordre des mots change
498
+ * d'une langue a l'autre, « IBAN se terminant par 2606 » contre « IBAN ending
499
+ * in 2606 ». Une chaine a trous ne suffirait pas.
500
+ */
501
+ protected readonly nomAccessible: _angular_core.Signal<string>;
502
+ protected readonly libelleDuBouton: _angular_core.Signal<string>;
380
503
  private valeurLisible;
381
504
  protected basculer(): void;
382
505
  private masquer;
@@ -398,11 +521,11 @@ declare class StMasked {
398
521
  declare class StMoney {
399
522
  private readonly locale;
400
523
  readonly valeur: _angular_core.InputSignal<Montant>;
401
- readonly signeExplicite: _angular_core.InputSignal<boolean>;
402
- readonly sansDevise: _angular_core.InputSignal<boolean>;
524
+ readonly signeExplicite: _angular_core.InputSignalWithTransform<boolean, unknown>;
525
+ readonly sansDevise: _angular_core.InputSignalWithTransform<boolean, unknown>;
403
526
  readonly taille: _angular_core.InputSignal<"sm" | "md" | "lg" | "xl">;
404
- readonly signe: _angular_core.Signal<"negatif" | "positif" | "nul">;
405
- readonly texte: _angular_core.Signal<string>;
527
+ protected readonly signe: _angular_core.Signal<"negatif" | "positif" | "nul">;
528
+ protected readonly texte: _angular_core.Signal<string>;
406
529
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StMoney, never>;
407
530
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StMoney, "st-money", never, { "valeur": { "alias": "valeur"; "required": true; "isSignal": true; }; "signeExplicite": { "alias": "signeExplicite"; "required": false; "isSignal": true; }; "sansDevise": { "alias": "sansDevise"; "required": false; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
408
531
  }
@@ -425,12 +548,33 @@ declare class StDate {
425
548
  readonly valeur: _angular_core.InputSignal<string | Date>;
426
549
  readonly format: _angular_core.InputSignal<FormatDeDate>;
427
550
  readonly fuseau: _angular_core.InputSignal<string | null>;
551
+ /**
552
+ * Une DATE DE CALENDRIER (`2026-09-12`) n'est pas un instant : une date de
553
+ * naissance, une echeance ou un jour de valeur n'ont pas d'heure, et ne
554
+ * doivent pas changer de jour selon le fuseau de qui les regarde.
555
+ *
556
+ * ⚠️ Le piege est dans la norme : `new Date('2026-09-12')` vaut minuit UTC,
557
+ * donc le 11 septembre partout a l'ouest de Greenwich. Une echeance affichee
558
+ * la veille est un defaut que personne ne voit depuis l'Europe.
559
+ */
560
+ private readonly estDateDeCalendrier;
428
561
  private readonly date;
429
- readonly estValide: _angular_core.Signal<boolean>;
430
- readonly iso: _angular_core.Signal<string | null>;
431
- readonly texte: _angular_core.Signal<string>;
562
+ protected readonly estValide: _angular_core.Signal<boolean>;
563
+ /**
564
+ * Le fuseau de rendu. Pour une date de calendrier, c'est UTC : la valeur a
565
+ * ete construite a minuit UTC, la relire en UTC rend donc le jour ecrit.
566
+ */
567
+ private readonly fuseauDeRendu;
568
+ /**
569
+ * Une date de calendrier porte `2026-09-12`, sans heure ni decalage : c'est
570
+ * la forme que la norme HTML attend, et la seule qui ne mente pas.
571
+ */
572
+ protected readonly iso: _angular_core.Signal<string | null>;
573
+ /** Une date sans heure ne peut pas en afficher une. */
574
+ private readonly optionsDeFormat;
575
+ protected readonly texte: _angular_core.Signal<string>;
432
576
  /** Forme longue, lue par les technologies d'assistance. */
433
- readonly texteAccessible: _angular_core.Signal<string | null>;
577
+ protected readonly texteAccessible: _angular_core.Signal<string | null>;
434
578
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDate, never>;
435
579
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StDate, "st-date", never, { "valeur": { "alias": "valeur"; "required": true; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "fuseau": { "alias": "fuseau"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
436
580
  }
@@ -447,20 +591,21 @@ declare class StDate {
447
591
  */
448
592
  declare class StRelativeTime {
449
593
  private readonly locale;
594
+ private readonly libelles;
450
595
  private readonly fuseau;
451
596
  readonly valeur: _angular_core.InputSignal<string | Date>;
452
- readonly rafraichir: _angular_core.InputSignal<boolean>;
597
+ readonly rafraichir: _angular_core.InputSignalWithTransform<boolean, unknown>;
453
598
  /** Au-dela de ce nombre de jours, la date absolue est plus parlante. */
454
599
  readonly seuilAbsoluEnJours: _angular_core.InputSignal<number>;
455
600
  private readonly destruction;
456
601
  private readonly maintenant;
457
602
  constructor();
458
603
  private dateEnMillisecondes;
459
- readonly estValide: _angular_core.Signal<boolean>;
460
- readonly iso: _angular_core.Signal<string | null>;
461
- readonly depasseLeSeuil: _angular_core.Signal<boolean>;
462
- readonly texte: _angular_core.Signal<string>;
463
- readonly texteAccessible: _angular_core.Signal<string>;
604
+ protected readonly estValide: _angular_core.Signal<boolean>;
605
+ protected readonly iso: _angular_core.Signal<string | null>;
606
+ protected readonly depasseLeSeuil: _angular_core.Signal<boolean>;
607
+ protected readonly texte: _angular_core.Signal<string>;
608
+ protected readonly texteAccessible: _angular_core.Signal<string>;
464
609
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StRelativeTime, never>;
465
610
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StRelativeTime, "st-relative-time", never, { "valeur": { "alias": "valeur"; "required": true; "isSignal": true; }; "rafraichir": { "alias": "rafraichir"; "required": false; "isSignal": true; }; "seuilAbsoluEnJours": { "alias": "seuilAbsoluEnJours"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
466
611
  }
@@ -477,17 +622,22 @@ declare class StRelativeTime {
477
622
  declare class StCount {
478
623
  private readonly locale;
479
624
  readonly valeur: _angular_core.InputSignal<number>;
480
- readonly ton: _angular_core.InputSignal<"courant" | "discret">;
625
+ readonly ton: _angular_core.InputSignal<"neutre" | "discret">;
481
626
  /** `null` : jamais d'abreviation. */
482
627
  readonly abregerAuDela: _angular_core.InputSignal<number | null>;
483
- readonly estAbrege: _angular_core.Signal<boolean>;
484
- readonly texteComplet: _angular_core.Signal<string>;
485
- readonly texte: _angular_core.Signal<string>;
628
+ protected readonly estAbrege: _angular_core.Signal<boolean>;
629
+ protected readonly texteComplet: _angular_core.Signal<string>;
630
+ protected readonly texte: _angular_core.Signal<string>;
486
631
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCount, never>;
487
632
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StCount, "st-count", never, { "valeur": { "alias": "valeur"; "required": true; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "abregerAuDela": { "alias": "abregerAuDela"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
488
633
  }
489
634
 
490
- type TonDeStatut = 'neutre' | 'info' | 'succes' | 'avertissement' | 'danger';
635
+ /**
636
+ * ⚠️ `primaire` et non « info » : les deux designaient deja la meme couleur
637
+ * d'accent, et rien ne distinguait un statut « info » d'un statut « primaire »
638
+ * ailleurs dans le socle.
639
+ */
640
+ type TonDeStatut = TonSemantique;
491
641
  /**
492
642
  * Pastille de statut.
493
643
  *
@@ -505,13 +655,13 @@ declare class StStatusPill {
505
655
  readonly statut: _angular_core.InputSignal<string>;
506
656
  /** Texte deja traduit par l'appelant : le socle ne traduit rien. */
507
657
  readonly libelle: _angular_core.InputSignal<string>;
508
- readonly icone: _angular_core.InputSignal<"hors-ligne" | "boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur">;
509
- readonly ton: _angular_core.InputSignal<TonDeStatut>;
658
+ readonly icone: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur">;
659
+ readonly ton: _angular_core.InputSignal<TonSemantique>;
510
660
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StStatusPill, never>;
511
661
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StStatusPill, "st-status-pill", never, { "statut": { "alias": "statut"; "required": true; "isSignal": true; }; "libelle": { "alias": "libelle"; "required": true; "isSignal": true; }; "icone": { "alias": "icone"; "required": true; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
512
662
  }
513
663
 
514
- type TonDeBadge = 'neutre' | 'primaire' | 'succes' | 'avertissement' | 'danger';
664
+ type TonDeBadge = TonSemantique;
515
665
  /**
516
666
  * Pastille de comptage superposee a un autre element.
517
667
  *
@@ -524,10 +674,10 @@ type TonDeBadge = 'neutre' | 'primaire' | 'succes' | 'avertissement' | 'danger';
524
674
  declare class StBadge {
525
675
  readonly valeur: _angular_core.InputSignal<string | number | null>;
526
676
  readonly max: _angular_core.InputSignal<number>;
527
- readonly ton: _angular_core.InputSignal<TonDeBadge>;
677
+ readonly ton: _angular_core.InputSignal<TonSemantique>;
528
678
  /** Point seul, sans chiffre : signale une nouveaute sans la quantifier. */
529
- readonly point: _angular_core.InputSignal<boolean>;
530
- readonly texte: _angular_core.Signal<string>;
679
+ readonly point: _angular_core.InputSignalWithTransform<boolean, unknown>;
680
+ protected readonly texte: _angular_core.Signal<string>;
531
681
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StBadge, never>;
532
682
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StBadge, "st-badge", never, { "valeur": { "alias": "valeur"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "point": { "alias": "point"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
533
683
  }
@@ -542,12 +692,14 @@ declare class StBadge {
542
692
  */
543
693
  declare class StTag {
544
694
  private readonly element;
695
+ private readonly libelles;
545
696
  readonly libelle: _angular_core.InputSignal<string>;
546
- readonly supprimable: _angular_core.InputSignal<boolean>;
547
- readonly ton: _angular_core.InputSignal<"primaire" | "neutre">;
548
- readonly prefixeDeSuppression: _angular_core.InputSignal<string>;
697
+ readonly supprimable: _angular_core.InputSignalWithTransform<boolean, unknown>;
698
+ readonly ton: _angular_core.InputSignal<"neutre" | "primaire">;
699
+ /** `null` : le texte vient du dictionnaire de l'application. */
700
+ readonly prefixeDeSuppression: _angular_core.InputSignal<string | null>;
549
701
  readonly supprime: _angular_core.OutputEmitterRef<void>;
550
- readonly libelleDeSuppression: _angular_core.Signal<string>;
702
+ protected readonly libelleDeSuppression: _angular_core.Signal<string>;
551
703
  protected auRetrait(): void;
552
704
  /**
553
705
  * Cible, dans l'ordre : le bouton de l'etiquette suivante, celui de la
@@ -575,12 +727,12 @@ declare class StAvatar {
575
727
  * `true` quand le nom figure deja a cote de l'avatar, ce qui est le cas
576
728
  * courant : l'avatar devient alors decoratif et se tait.
577
729
  */
578
- readonly nomAdjacent: _angular_core.InputSignal<boolean>;
730
+ readonly nomAdjacent: _angular_core.InputSignalWithTransform<boolean, unknown>;
579
731
  private readonly imageEchouee;
580
- readonly afficheLImage: _angular_core.Signal<boolean>;
581
- readonly initiales: _angular_core.Signal<string>;
732
+ protected readonly afficheLImage: _angular_core.Signal<boolean>;
733
+ protected readonly initiales: _angular_core.Signal<string>;
582
734
  /** Vide quand le nom est deja lisible a cote : eviter la double lecture. */
583
- readonly texteAlternatif: _angular_core.Signal<string>;
735
+ protected readonly texteAlternatif: _angular_core.Signal<string>;
584
736
  protected auxEchecsDImage(): void;
585
737
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StAvatar, never>;
586
738
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StAvatar, "st-avatar", never, { "nom": { "alias": "nom"; "required": true; "isSignal": true; }; "sourceImage": { "alias": "sourceImage"; "required": false; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "forme": { "alias": "forme"; "required": false; "isSignal": true; }; "nomAdjacent": { "alias": "nomAdjacent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -596,7 +748,7 @@ declare class StAvatar {
596
748
  declare class StEmpty {
597
749
  readonly titre: _angular_core.InputSignal<string>;
598
750
  readonly description: _angular_core.InputSignal<string | null>;
599
- readonly icone: _angular_core.InputSignal<"hors-ligne" | "boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur">;
751
+ readonly icone: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur">;
600
752
  readonly niveauDuTitre: _angular_core.InputSignal<NiveauDeTitre>;
601
753
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StEmpty, never>;
602
754
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StEmpty, "st-empty", never, { "titre": { "alias": "titre"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icone": { "alias": "icone"; "required": false; "isSignal": true; }; "niveauDuTitre": { "alias": "niveauDuTitre"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
@@ -617,6 +769,7 @@ type VarianteDErreur = 'hors-ligne' | 'serveur' | 'client';
617
769
  */
618
770
  declare class StError {
619
771
  private readonly regionParente;
772
+ private readonly libelles;
620
773
  readonly variante: _angular_core.InputSignal<VarianteDErreur>;
621
774
  /** Code machine stable, tel que rendu par le backend. */
622
775
  readonly code: _angular_core.InputSignal<string>;
@@ -624,15 +777,19 @@ declare class StError {
624
777
  readonly message: _angular_core.InputSignal<string>;
625
778
  readonly traceId: _angular_core.InputSignal<string | null>;
626
779
  readonly niveauDuTitre: _angular_core.InputSignal<NiveauDeTitre>;
627
- readonly rejouable: _angular_core.InputSignal<boolean>;
628
- readonly libelleRejeu: _angular_core.InputSignal<string>;
629
- readonly rejeuEnCours: _angular_core.InputSignal<boolean>;
630
- readonly etiquetteDeTrace: _angular_core.InputSignal<string>;
780
+ readonly rejouable: _angular_core.InputSignalWithTransform<boolean, unknown>;
781
+ readonly rejeuEnCours: _angular_core.InputSignalWithTransform<boolean, unknown>;
782
+ /** `null` : les textes viennent du dictionnaire de l'application. */
783
+ readonly libelleRejeu: _angular_core.InputSignal<string | null>;
784
+ readonly etiquetteDeTrace: _angular_core.InputSignal<string | null>;
631
785
  readonly rejeu: _angular_core.OutputEmitterRef<void>;
632
- readonly icone: _angular_core.Signal<"hors-ligne" | "boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur">;
633
- readonly sAnnonce: _angular_core.Signal<boolean>;
786
+ protected readonly libelleRejeuLu: _angular_core.Signal<string>;
787
+ protected readonly etiquetteDeTraceLue: _angular_core.Signal<string>;
788
+ protected readonly etiquetteDuCode: _angular_core.Signal<string>;
789
+ protected readonly icone: _angular_core.Signal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "triangle-alerte" | "utilisateur">;
790
+ protected readonly sAnnonce: _angular_core.Signal<boolean>;
634
791
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StError, never>;
635
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StError, "st-error", never, { "variante": { "alias": "variante"; "required": false; "isSignal": true; }; "code": { "alias": "code"; "required": true; "isSignal": true; }; "titre": { "alias": "titre"; "required": true; "isSignal": true; }; "message": { "alias": "message"; "required": true; "isSignal": true; }; "traceId": { "alias": "traceId"; "required": false; "isSignal": true; }; "niveauDuTitre": { "alias": "niveauDuTitre"; "required": false; "isSignal": true; }; "rejouable": { "alias": "rejouable"; "required": false; "isSignal": true; }; "libelleRejeu": { "alias": "libelleRejeu"; "required": false; "isSignal": true; }; "rejeuEnCours": { "alias": "rejeuEnCours"; "required": false; "isSignal": true; }; "etiquetteDeTrace": { "alias": "etiquetteDeTrace"; "required": false; "isSignal": true; }; }, { "rejeu": "rejeu"; }, never, never, true, never>;
792
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StError, "st-error", never, { "variante": { "alias": "variante"; "required": false; "isSignal": true; }; "code": { "alias": "code"; "required": true; "isSignal": true; }; "titre": { "alias": "titre"; "required": true; "isSignal": true; }; "message": { "alias": "message"; "required": true; "isSignal": true; }; "traceId": { "alias": "traceId"; "required": false; "isSignal": true; }; "niveauDuTitre": { "alias": "niveauDuTitre"; "required": false; "isSignal": true; }; "rejouable": { "alias": "rejouable"; "required": false; "isSignal": true; }; "rejeuEnCours": { "alias": "rejeuEnCours"; "required": false; "isSignal": true; }; "libelleRejeu": { "alias": "libelleRejeu"; "required": false; "isSignal": true; }; "etiquetteDeTrace": { "alias": "etiquetteDeTrace"; "required": false; "isSignal": true; }; }, { "rejeu": "rejeu"; }, never, never, true, never>;
636
793
  }
637
794
 
638
795
  /**
@@ -650,7 +807,7 @@ declare class StError {
650
807
  declare class StOfflineBanner {
651
808
  readonly message: _angular_core.InputSignal<string>;
652
809
  readonly libelleRejeu: _angular_core.InputSignal<string | null>;
653
- readonly rejeuEnCours: _angular_core.InputSignal<boolean>;
810
+ readonly rejeuEnCours: _angular_core.InputSignalWithTransform<boolean, unknown>;
654
811
  readonly rejeu: _angular_core.OutputEmitterRef<void>;
655
812
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StOfflineBanner, never>;
656
813
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StOfflineBanner, "st-offline-banner", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "libelleRejeu": { "alias": "libelleRejeu"; "required": false; "isSignal": true; }; "rejeuEnCours": { "alias": "rejeuEnCours"; "required": false; "isSignal": true; }; }, { "rejeu": "rejeu"; }, never, never, true, never>;
@@ -660,29 +817,73 @@ declare class StOfflineBanner {
660
817
  * Impose les cinq etats a un bloc qui consomme l'API, et centralise leur
661
818
  * annonce.
662
819
  *
820
+ * Deux usages. Le plus courant passe la ressource, et l'etat s'en deduit :
821
+ *
822
+ * ```html
823
+ * <st-state [ressource]="operations">
824
+ * <ng-template [stSucces]="operations" let-page>…</ng-template>
825
+ * <ng-template stErreur let-erreur><st-error … /></ng-template>
826
+ * <ng-template stVide><st-empty … /></ng-template>
827
+ * </st-state>
828
+ * ```
829
+ *
830
+ * L'autre pose `[etat]` a la main, pour un bloc qui ne vient pas d'une
831
+ * ressource — une soumission de formulaire, par exemple.
832
+ *
833
+ * ⚠️ Un RECHARGEMENT garde le contenu affiche. Revenir a la silhouette a chaque
834
+ * changement de filtre fait clignoter la page entiere et perd la position de
835
+ * lecture ; seul le premier chargement n'a rien a montrer.
836
+ *
663
837
  * ⚠️ L'hote ne porte PAS `role="status"`, contrairement a ce qu'on attendrait :
664
838
  * un remplacement de contenu A L'INTERIEUR d'une region vivante fait relire
665
839
  * tout le sous-arbre par le lecteur d'ecran a chaque bascule d'etat. Seule une
666
- * petite zone masquee porte l'annonce, qui tient en quelques mots. L'hote se
667
- * contente d'`aria-busy`.
668
- *
669
- * Il fournit `REGION_VIVANTE_PARENTE` : les composants qu'il rend (indicateur
670
- * de chargement, erreur) detectent sa presence et se taisent, au lieu
671
- * d'annoncer une deuxieme fois le meme fait.
672
- */
673
- declare class StState {
674
- readonly etat: _angular_core.InputSignal<EtatDeBloc>;
675
- /** Le chemin nominal. Obligatoire : un bloc sans succes n'a pas de raison d'etre. */
676
- readonly succes: _angular_core.InputSignal<TemplateRef<unknown>>;
677
- readonly chargement: _angular_core.InputSignal<TemplateRef<unknown> | null>;
678
- readonly erreur: _angular_core.InputSignal<TemplateRef<unknown> | null>;
679
- readonly vide: _angular_core.InputSignal<TemplateRef<unknown> | null>;
680
- readonly horsLigne: _angular_core.InputSignal<TemplateRef<unknown> | null>;
840
+ * petite zone masquee porte l'annonce, qui tient en quelques mots.
841
+ */
842
+ declare class StState<T> {
843
+ private readonly libelles;
844
+ /** La ressource dont l'etat se deduit. */
845
+ readonly ressource: _angular_core.InputSignal<Resource<T> | null>;
846
+ /** Etat pose a la main. Il prime sur la ressource quand les deux existent. */
847
+ readonly etat: _angular_core.InputSignal<EtatDeBloc | null>;
848
+ /** Ce qui compte comme « vide » : par defaut, une collection sans element. */
849
+ readonly estVide: _angular_core.InputSignal<(valeur: T) => boolean>;
681
850
  /** Silhouette par defaut du chargement. `null` : un indicateur tournant. */
682
851
  readonly squelette: _angular_core.InputSignal<VarianteDeSquelette | null>;
683
852
  readonly lignesDeSquelette: _angular_core.InputSignal<number>;
684
- readonly annonces: _angular_core.InputSignal<Readonly<Record<EtatDeBloc, string>>>;
685
- readonly annonce: _angular_core.Signal<string>;
853
+ /** `null` : les annonces viennent du dictionnaire de l'application. */
854
+ readonly annonces: _angular_core.InputSignal<Readonly<Record<EtatDeBloc, string>> | null>;
855
+ private readonly gabaritSucces;
856
+ private readonly gabaritErreur;
857
+ private readonly gabaritVide;
858
+ private readonly gabaritHorsLigne;
859
+ private readonly gabaritChargement;
860
+ private readonly instantane;
861
+ /**
862
+ * La derniere valeur connue, gardee pendant qu'une autre se charge.
863
+ *
864
+ * ⚠️ Necessaire, et pas seulement confortable : un changement de PARAMETRE
865
+ * n'est pas un `reload`. Angular traite le premier comme une nouvelle
866
+ * requete — statut « loading », valeur videe. Sans cette memoire, changer un
867
+ * filtre ou tourner une page ferait donc disparaitre le tableau, clignoter la
868
+ * page, et perdre la position de lecture. Une erreur, elle, ne garde rien :
869
+ * afficher des donnees perimees sous un message d'erreur serait mentir.
870
+ */
871
+ private readonly valeurRetenue;
872
+ /** Etat deduit de la ressource, valeur retenue comprise. */
873
+ private readonly etatDeLaRessource;
874
+ readonly etatEffectif: _angular_core.Signal<EtatDeBloc>;
875
+ /**
876
+ * Une valeur est affichee, et une autre arrive — par rappel explicite ou par
877
+ * changement de parametre.
878
+ */
879
+ protected readonly enRechargement: _angular_core.Signal<boolean>;
880
+ protected readonly enAttente: _angular_core.Signal<boolean>;
881
+ private readonly annoncesLues;
882
+ protected readonly annonce: _angular_core.Signal<string>;
883
+ /** Contexte passe au gabarit : la valeur en succes, l'erreur en erreur. */
884
+ readonly contexte: _angular_core.Signal<{
885
+ $implicit: unknown;
886
+ }>;
686
887
  /**
687
888
  * Les etats degrades n'ont pas de rendu par defaut : afficher un texte
688
889
  * generique a la place d'un vrai ecran vide ou d'une vraie erreur donnerait
@@ -690,11 +891,76 @@ declare class StState {
690
891
  * voie, en developpement.
691
892
  */
692
893
  readonly gabaritDeLEtat: _angular_core.Signal<TemplateRef<unknown> | null>;
693
- readonly montreLaSilhouetteParDefaut: _angular_core.Signal<boolean>;
894
+ private readonly chargementVisible;
895
+ /** La silhouette par defaut, une fois le delai anti-clignotement passe. */
896
+ protected readonly montreLaSilhouetteParDefaut: _angular_core.Signal<boolean>;
897
+ constructor();
694
898
  private signalerSiAbsent;
695
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StState, never>;
696
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StState, "st-state", never, { "etat": { "alias": "etat"; "required": true; "isSignal": true; }; "succes": { "alias": "succes"; "required": true; "isSignal": true; }; "chargement": { "alias": "chargement"; "required": false; "isSignal": true; }; "erreur": { "alias": "erreur"; "required": false; "isSignal": true; }; "vide": { "alias": "vide"; "required": false; "isSignal": true; }; "horsLigne": { "alias": "horsLigne"; "required": false; "isSignal": true; }; "squelette": { "alias": "squelette"; "required": false; "isSignal": true; }; "lignesDeSquelette": { "alias": "lignesDeSquelette"; "required": false; "isSignal": true; }; "annonces": { "alias": "annonces"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
899
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StState<any>, never>;
900
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StState<any>, "st-state", never, { "ressource": { "alias": "ressource"; "required": false; "isSignal": true; }; "etat": { "alias": "etat"; "required": false; "isSignal": true; }; "estVide": { "alias": "estVide"; "required": false; "isSignal": true; }; "squelette": { "alias": "squelette"; "required": false; "isSignal": true; }; "lignesDeSquelette": { "alias": "lignesDeSquelette"; "required": false; "isSignal": true; }; "annonces": { "alias": "annonces"; "required": false; "isSignal": true; }; }, {}, ["gabaritSucces", "gabaritErreur", "gabaritVide", "gabaritHorsLigne", "gabaritChargement"], never, true, never>;
901
+ }
902
+
903
+ /**
904
+ * Les gabarits des cinq etats, declares DANS `<st-state>`.
905
+ *
906
+ * ⚠️ Pourquoi des directives de contenu plutot que des entrees `TemplateRef` :
907
+ * un `<ng-template>` declare a l'exterieur du composant appartient a
908
+ * l'injecteur de l'endroit ou il est ECRIT, pas de celui qui le rend. Les
909
+ * fournisseurs de `st-state` — dont `REGION_VIVANTE_PARENTE`, qui fait taire
910
+ * les annonces en double — ne l'atteignaient donc pas, et l'erreur etait
911
+ * annoncee deux fois. Passer par le contenu rend la declaration a l'exterieur
912
+ * impossible : le defaut ne peut plus revenir.
913
+ */
914
+ declare class StSucces<T> {
915
+ readonly gabarit: TemplateRef<{
916
+ $implicit: Exclude<T, undefined>;
917
+ }>;
918
+ /**
919
+ * La ressource n'est lue nulle part : elle porte le TYPE de la valeur, pour
920
+ * que `let-valeur` soit type dans le gabarit au lieu d'etre `unknown`.
921
+ */
922
+ readonly stSucces: _angular_core.InputSignal<Resource<T> | undefined>;
923
+ /**
924
+ * `Exclude<T, undefined>` : une ressource sans valeur initiale se type
925
+ * `T | undefined`, mais st-state ne rend ce gabarit QUE lorsqu'une valeur
926
+ * existe. Sans cela, chaque gabarit de succes devrait ecrire `page?.length`
927
+ * pour un cas qui ne se produit pas.
928
+ */
929
+ static ngTemplateContextGuard<T>(_directive: StSucces<T>, _contexte: unknown): _contexte is {
930
+ $implicit: Exclude<T, undefined>;
931
+ };
932
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSucces<any>, never>;
933
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StSucces<any>, "ng-template[stSucces]", never, { "stSucces": { "alias": "stSucces"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
934
+ }
935
+ /** Erreur. Le contexte porte l'erreur elle-meme, pour l'afficher ou la traduire. */
936
+ declare class StErreur {
937
+ readonly gabarit: TemplateRef<{
938
+ $implicit: unknown;
939
+ }>;
940
+ static ngTemplateContextGuard(_directive: StErreur, _contexte: unknown): _contexte is {
941
+ $implicit: unknown;
942
+ };
943
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StErreur, never>;
944
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StErreur, "ng-template[stErreur]", never, {}, {}, never, never, true, never>;
945
+ }
946
+ declare class StVide {
947
+ readonly gabarit: TemplateRef<void>;
948
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StVide, never>;
949
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StVide, "ng-template[stVide]", never, {}, {}, never, never, true, never>;
950
+ }
951
+ declare class StHorsLigne {
952
+ readonly gabarit: TemplateRef<void>;
953
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StHorsLigne, never>;
954
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StHorsLigne, "ng-template[stHorsLigne]", never, {}, {}, never, never, true, never>;
955
+ }
956
+ /** Chargement sur mesure. Sans lui, `st-state` rend sa silhouette par defaut. */
957
+ declare class StChargement {
958
+ readonly gabarit: TemplateRef<void>;
959
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StChargement, never>;
960
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StChargement, "ng-template[stChargement]", never, {}, {}, never, never, true, never>;
697
961
  }
962
+ /** Toutes les directives de gabarit, a importer d'un coup. */
963
+ declare const GABARITS_D_ETAT: readonly [typeof StSucces, typeof StErreur, typeof StVide, typeof StHorsLigne, typeof StChargement];
698
964
 
699
- export { CHEMIN_DU_SPRITE, ETATS_DE_BLOC, FUSEAU_PAR_DEFAUT, NOMS_DICONE, REGION_VIVANTE_PARENTE, StAvatar, StBadge, StButton, StButtonGroup, StCode, StCount, StDate, StEmpty, StError, StHeading, StIcon, StIconButton, StLink, StMasked, StMoney, StOfflineBanner, StProgress, StRelativeTime, StSkeleton, StSpinner, StState, StStatusPill, StTag, StText, fournirCheminDuSprite };
700
- export type { EtatDeBloc, FormatDeDate, GraisseDeTexte, NiveauDeTitre, NomDIcone, TailleDIcone, TailleDeBouton, TailleDeSpinner, TailleDeTitre, TonDIcone, TonDeBadge, TonDeProgression, TonDeSpinner, TonDeStatut, TypeMasque, VarianteDErreur, VarianteDeBouton, VarianteDeBoutonIcone, VarianteDeLien, VarianteDeSquelette, VarianteDeTexte };
965
+ export { CHEMIN_DU_SPRITE, FUSEAU_PAR_DEFAUT, GABARITS_D_ETAT, LIBELLES_EN, LIBELLES_FR, NOMS_DICONE, REGION_VIVANTE_PARENTE, ST_LIBELLES, ST_LOCALE, StAvatar, StBadge, StButton, StButtonGroup, StChargement, StCode, StCount, StDate, StEmpty, StErreur, StError, StHeading, StHorsLigne, StIcon, StIconButton, StLink, StMasked, StMoney, StOfflineBanner, StProgress, StRelativeTime, StSkeleton, StSpinner, StState, StStatusPill, StSucces, StTag, StText, StVide, fournirCheminDuSprite, provideStarterUi };
966
+ export type { ConfigurationUi, FormatDeDate, GraisseDeTexte, LibellesUi, NiveauDeTitre, NomDIcone, TailleDIcone, TailleDeBouton, TailleDeSpinner, TailleDeTitre, TonDIcone, TonDeBadge, TonDeProgression, TonDeSpinner, TonDeStatut, TypeMasque, VarianteDErreur, VarianteDeBouton, VarianteDeBoutonIcone, VarianteDeLien, VarianteDeSquelette, VarianteDeTexte };