@starterlib/ui 0.1.0 → 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,17 +1,133 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, 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
 
5
6
  /**
6
- * Chemin du sprite SVG des icones. Chaque SPA le remplace par son actif
7
- * empreinte (`/assets/icones/sprite.<hash>.svg`) pour beneficier d'un cache
8
- * immuable. Le defaut vise le chemin non empreinte, utilisable en
9
- * developpement.
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>>;
79
+ /**
80
+ * Chemin du sprite SVG des icones, **fourni par l'application**.
81
+ *
82
+ * ⚠️ Aucun defaut, et c'est voulu. Un defaut absolu (`/assets/icones/...`) est
83
+ * faux des que l'interface est servie sous un prefixe (`/ui/<interface>/`), et
84
+ * l'echec est MUET : la reference externe d'un `<use>` qui ne resout pas ne
85
+ * leve rien, toutes les icones restent vides, et la regle « un statut se lit
86
+ * par une icone ET un texte » tombe sans que rien ne le signale. Mieux vaut
87
+ * echouer au demarrage, une fois, avec la marche a suivre.
88
+ *
89
+ * L'actif est publie avec le paquet :
90
+ * `node_modules/@starterlib/ui/assets/icones/sprite.svg`. Chaque SPA le copie
91
+ * dans ses actifs (bloc `assets` de `angular.json`), puis fournit son chemin —
92
+ * de preference empreinte, pour un cache immuable :
93
+ *
94
+ * ```ts
95
+ * { provide: CHEMIN_DU_SPRITE, useValue: '/ui/socle/assets/icones/sprite.svg' }
96
+ * ```
10
97
  */
11
98
  declare const CHEMIN_DU_SPRITE: InjectionToken<string>;
99
+ /**
100
+ * Fournit le chemin du sprite. A poser une fois, dans la configuration de
101
+ * l'application — jamais dans un composant, ou deux branches de l'arbre
102
+ * pourraient viser deux sprites differents.
103
+ */
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[];
12
128
  /**
13
129
  * Marque la presence d'une region vivante possedee par un ancetre, en pratique
14
- * la directive `stState`.
130
+ * le composant `st-state`.
15
131
  *
16
132
  * Tout composant susceptible de porter un `role="status"` l'injecte en
17
133
  * optionnel et **se tait** s'il en trouve un. Sans cela, un indicateur de
@@ -27,15 +143,9 @@ declare const REGION_VIVANTE_PARENTE: InjectionToken<true>;
27
143
  */
28
144
  declare const FUSEAU_PAR_DEFAUT: InjectionToken<string>;
29
145
 
30
- /**
31
- * Les cinq etats que tout bloc consommant l'API doit traiter. Le type les
32
- * enumere pour qu'aucun ne s'oublie : un `switch` non exhaustif ne compile pas.
33
- */
34
- type EtatDeBloc = 'chargement' | 'erreur' | 'vide' | 'hors-ligne' | 'succes';
35
- declare const ETATS_DE_BLOC: readonly EtatDeBloc[];
36
-
37
146
  type TailleDIcone = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
38
- 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'>;
39
149
  /**
40
150
  * Icone tiree d'un sprite SVG servi en meme origine.
41
151
  *
@@ -50,19 +160,20 @@ type TonDIcone = 'courant' | 'discret' | 'primaire' | 'succes' | 'avertissement'
50
160
  */
51
161
  declare class StIcon {
52
162
  private readonly cheminDuSprite;
53
- 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">;
54
164
  readonly taille: _angular_core.InputSignal<TailleDIcone>;
55
165
  readonly ton: _angular_core.InputSignal<TonDIcone>;
56
166
  /** `null` : l'icone est decorative et reste muette pour les lecteurs. */
57
167
  readonly etiquette: _angular_core.InputSignal<string | null>;
58
- readonly estDecorative: _angular_core.Signal<boolean>;
59
- readonly reference: _angular_core.Signal<string>;
168
+ protected readonly estDecorative: _angular_core.Signal<boolean>;
169
+ protected readonly reference: _angular_core.Signal<string>;
60
170
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StIcon, never>;
61
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>;
62
172
  }
63
173
 
64
174
  /**
65
- * Noms du sprite, engendres depuis `assets/icones/sprite.svg`.
175
+ * Noms du sprite, tenus a l'identique de `assets/icones/sprite.svg` par les
176
+ * tests de `st-icon.spec.ts` (dans les deux sens).
66
177
  *
67
178
  * Le type existe pour qu'une faute de frappe echoue a la compilation : une
68
179
  * reference `use` vers un identifiant absent ne rend RIEN, sans erreur, et le
@@ -83,7 +194,7 @@ type GraisseDeTexte = 'normale' | 'moyenne' | 'semi';
83
194
  declare class StText {
84
195
  readonly variante: _angular_core.InputSignal<VarianteDeTexte>;
85
196
  readonly graisse: _angular_core.InputSignal<GraisseDeTexte>;
86
- readonly enLigne: _angular_core.InputSignal<boolean>;
197
+ readonly enLigne: _angular_core.InputSignalWithTransform<boolean, unknown>;
87
198
  /**
88
199
  * Nombre de lignes au-dela duquel le texte est coupe.
89
200
  *
@@ -114,13 +225,13 @@ declare class StHeading {
114
225
  readonly taille: _angular_core.InputSignal<TailleDeTitre | null>;
115
226
  /** Cible d'un `aria-labelledby` : une region se nomme par son titre. */
116
227
  readonly identifiant: _angular_core.InputSignal<string | null>;
117
- readonly tailleEffective: _angular_core.Signal<TailleDeTitre>;
228
+ protected readonly tailleEffective: _angular_core.Signal<TailleDeTitre>;
118
229
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StHeading, never>;
119
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>;
120
231
  }
121
232
 
122
233
  type TailleDeSpinner = 'sm' | 'md' | 'lg';
123
- type TonDeSpinner = 'courant' | 'primaire' | 'inverse';
234
+ type TonDeSpinner = Extract<Ton, 'neutre' | 'primaire' | 'inverse'>;
124
235
  /**
125
236
  * Indicateur d'activite indeterminee.
126
237
  *
@@ -136,15 +247,18 @@ type TonDeSpinner = 'courant' | 'primaire' | 'inverse';
136
247
  */
137
248
  declare class StSpinner {
138
249
  private readonly regionParente;
250
+ private readonly libelles;
139
251
  readonly taille: _angular_core.InputSignal<TailleDeSpinner>;
140
252
  readonly ton: _angular_core.InputSignal<TonDeSpinner>;
141
- readonly etiquette: _angular_core.InputSignal<string>;
142
- 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>;
143
257
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSpinner, never>;
144
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>;
145
259
  }
146
260
 
147
- type TonDeProgression = 'primaire' | 'succes' | 'danger';
261
+ type TonDeProgression = Extract<Ton, 'primaire' | 'succes' | 'danger'>;
148
262
  /**
149
263
  * Barre de progression, determinee ou indeterminee.
150
264
  *
@@ -161,10 +275,10 @@ declare class StProgress {
161
275
  readonly ton: _angular_core.InputSignal<TonDeProgression>;
162
276
  /** Texte lu a la place du pourcentage quand celui-ci n'est pas parlant. */
163
277
  readonly texteDeValeur: _angular_core.InputSignal<string | null>;
164
- readonly estIndeterminee: _angular_core.Signal<boolean>;
278
+ protected readonly estIndeterminee: _angular_core.Signal<boolean>;
165
279
  /** Omis quand la progression est indeterminee : l'annoncer serait faux. */
166
- readonly valeurAnnoncee: _angular_core.Signal<number | null>;
167
- readonly pourcentage: _angular_core.Signal<number>;
280
+ protected readonly valeurAnnoncee: _angular_core.Signal<number | null>;
281
+ protected readonly pourcentage: _angular_core.Signal<number>;
168
282
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StProgress, never>;
169
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>;
170
284
  }
@@ -184,14 +298,20 @@ declare class StSkeleton {
184
298
  readonly variante: _angular_core.InputSignal<VarianteDeSquelette>;
185
299
  readonly lignes: _angular_core.InputSignal<number>;
186
300
  readonly colonnes: _angular_core.InputSignal<number>;
187
- readonly anime: _angular_core.InputSignal<boolean>;
188
- readonly indicesDeLigne: _angular_core.Signal<number[]>;
189
- 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[]>;
190
304
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSkeleton, never>;
191
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>;
192
306
  }
193
307
 
194
- 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';
195
315
  type TailleDeBouton = 'sm' | 'md' | 'lg';
196
316
  /**
197
317
  * Bouton du socle, pose en ATTRIBUT sur un `<button>` natif.
@@ -202,6 +322,11 @@ type TailleDeBouton = 'sm' | 'md' | 'lg';
202
322
  * tabulation si quelqu'un lui pose un `tabindex`. Tout fonctionne en
203
323
  * demonstration et casse au premier formulaire reel.
204
324
  *
325
+ * ⚠️ L'indicateur de chargement est MUET (`aria-hidden`) : pose dans le bouton,
326
+ * son `role="status"` entrait dans le nom accessible, qui devenait « Chargement
327
+ * en cours Valider ». L'annonce de l'action en cours revient a l'annonceur
328
+ * global du noyau, pas au bouton.
329
+ *
205
330
  * ⚠️ Pendant le chargement, le bouton porte `aria-disabled` et NON `disabled` :
206
331
  * l'attribut natif lui retire le focus, le lecteur d'ecran perd le controle
207
332
  * qu'il avait sous le doigt et retombe sur le corps du document. Les clics
@@ -210,21 +335,27 @@ type TailleDeBouton = 'sm' | 'md' | 'lg';
210
335
  declare class StButton {
211
336
  readonly variante: _angular_core.InputSignal<VarianteDeBouton>;
212
337
  readonly taille: _angular_core.InputSignal<TailleDeBouton>;
213
- readonly pleineLargeur: _angular_core.InputSignal<boolean>;
214
- 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>;
215
- 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>;
216
341
  /**
217
342
  * Action en cours. Tant qu'il vaut vrai, les clics sont avales : c'est le
218
343
  * mecanisme d'anti double soumission. L'appelant doit le lever DES la
219
344
  * soumission, pas a l'arrivee de la reponse.
220
345
  */
221
- readonly chargement: _angular_core.InputSignal<boolean>;
346
+ readonly chargement: _angular_core.InputSignalWithTransform<boolean, unknown>;
347
+ /**
348
+ * Le ton suit le FOND du bouton, et non le bouton en general : sur une
349
+ * variante posee sur la surface (`secondaire`, qui est le defaut, et
350
+ * `discret`), un indicateur en ton inverse tombait a 1,00:1 — invisible.
351
+ */
352
+ readonly tonDuChargement: _angular_core.Signal<TonDeSpinner>;
222
353
  constructor();
223
354
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StButton, never>;
224
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>;
225
356
  }
226
357
 
227
- type VarianteDeBoutonIcone = 'discret' | 'secondaire' | 'destructeur';
358
+ type VarianteDeBoutonIcone = Extract<VarianteDeBouton, 'discret' | 'secondaire' | 'danger'>;
228
359
  /**
229
360
  * Bouton reduit a une icone, pose en attribut sur un `<button>` natif.
230
361
  *
@@ -233,15 +364,22 @@ type VarianteDeBoutonIcone = 'discret' | 'secondaire' | 'destructeur';
233
364
  * de facon fiable.
234
365
  */
235
366
  declare class StIconButton {
236
- 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">;
237
368
  /** Nom accessible du controle. Sans lui, l'icone ne dit rien. */
238
369
  readonly etiquette: _angular_core.InputSignal<string>;
239
370
  readonly variante: _angular_core.InputSignal<VarianteDeBoutonIcone>;
240
371
  readonly taille: _angular_core.InputSignal<"sm" | "md">;
241
- /** `null` : le bouton n'est pas a deux etats et n'annonce aucune pression. */
242
- 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>;
243
381
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StIconButton, never>;
244
- 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>;
245
383
  }
246
384
 
247
385
  type VarianteDeLien = 'texte' | 'autonome' | 'discret';
@@ -256,11 +394,16 @@ type VarianteDeLien = 'texte' | 'autonome' | 'discret';
256
394
  * quiconque regarde l'ecran.
257
395
  */
258
396
  declare class StLink {
397
+ private readonly libelles;
259
398
  readonly variante: _angular_core.InputSignal<VarianteDeLien>;
260
399
  /** Ouvre dans un nouvel onglet, et l'annonce dans le nom accessible. */
261
- readonly externe: _angular_core.InputSignal<boolean>;
262
- /** Mention lue par les lecteurs d'ecran quand le lien sort du site. */
263
- 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>;
264
407
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StLink, never>;
265
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>;
266
409
  }
@@ -278,7 +421,7 @@ declare class StButtonGroup {
278
421
  readonly etiquette: _angular_core.InputSignal<string>;
279
422
  readonly orientation: _angular_core.InputSignal<"horizontale" | "verticale">;
280
423
  /** Boutons jointifs, rayons fusionnes. */
281
- readonly attache: _angular_core.InputSignal<boolean>;
424
+ readonly attache: _angular_core.InputSignalWithTransform<boolean, unknown>;
282
425
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StButtonGroup, never>;
283
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>;
284
427
  }
@@ -295,24 +438,28 @@ declare class StButtonGroup {
295
438
  declare class StCode {
296
439
  private readonly document;
297
440
  private readonly destruction;
441
+ private readonly libelles;
298
442
  readonly valeur: _angular_core.InputSignal<string>;
299
- readonly etiquette: _angular_core.InputSignal<string>;
300
- readonly copiable: _angular_core.InputSignal<boolean>;
301
- readonly libelleCopier: _angular_core.InputSignal<string>;
302
- 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>;
303
450
  readonly copie: _angular_core.OutputEmitterRef<string>;
304
451
  private readonly confirmation;
305
452
  private minuterie;
306
- readonly texteDeConfirmation: _angular_core.Signal<string>;
453
+ protected readonly texteDeConfirmation: _angular_core.Signal<string>;
307
454
  /**
308
455
  * Le bouton n'apparait que si le navigateur sait copier. Sans presse-papiers,
309
456
  * un bouton qui ne fait rien vaut moins que la selection manuelle, que la
310
457
  * feuille garde possible (`user-select: all`).
311
458
  */
312
- readonly copiePossible: _angular_core.Signal<boolean>;
459
+ protected readonly copiePossible: _angular_core.Signal<boolean>;
313
460
  protected auClicDeCopie(): Promise<void>;
314
461
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCode, never>;
315
- 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>;
316
463
  }
317
464
 
318
465
  type TypeMasque = 'iban' | 'carte' | 'telephone';
@@ -328,24 +475,31 @@ type TypeMasque = 'iban' | 'carte' | 'telephone';
328
475
  * journal.
329
476
  */
330
477
  declare class StMasked {
478
+ private readonly libelles;
331
479
  private readonly destruction;
332
480
  readonly valeur: _angular_core.InputSignal<string>;
333
481
  readonly type: _angular_core.InputSignal<TypeMasque>;
334
482
  readonly revele: _angular_core.ModelSignal<boolean>;
335
- readonly revelationAutorisee: _angular_core.InputSignal<boolean>;
483
+ readonly revelationAutorisee: _angular_core.InputSignalWithTransform<boolean, unknown>;
336
484
  readonly dureeDeRevelationEnSecondes: _angular_core.InputSignal<number>;
337
- readonly libelleAfficher: _angular_core.InputSignal<string>;
338
- 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>;
339
488
  readonly revelation: _angular_core.OutputEmitterRef<{
340
489
  type: TypeMasque;
341
490
  }>;
342
491
  private readonly annonce;
343
- readonly texteDAnnonce: _angular_core.Signal<string>;
492
+ protected readonly texteDAnnonce: _angular_core.Signal<string>;
344
493
  private minuterie;
345
- readonly valeurMasquee: _angular_core.Signal<string>;
346
- readonly valeurAffichee: _angular_core.Signal<string>;
347
- readonly nomAccessible: _angular_core.Signal<string>;
348
- 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>;
349
503
  private valeurLisible;
350
504
  protected basculer(): void;
351
505
  private masquer;
@@ -367,11 +521,11 @@ declare class StMasked {
367
521
  declare class StMoney {
368
522
  private readonly locale;
369
523
  readonly valeur: _angular_core.InputSignal<Montant>;
370
- readonly signeExplicite: _angular_core.InputSignal<boolean>;
371
- readonly sansDevise: _angular_core.InputSignal<boolean>;
524
+ readonly signeExplicite: _angular_core.InputSignalWithTransform<boolean, unknown>;
525
+ readonly sansDevise: _angular_core.InputSignalWithTransform<boolean, unknown>;
372
526
  readonly taille: _angular_core.InputSignal<"sm" | "md" | "lg" | "xl">;
373
- readonly signe: _angular_core.Signal<"negatif" | "positif" | "nul">;
374
- readonly texte: _angular_core.Signal<string>;
527
+ protected readonly signe: _angular_core.Signal<"negatif" | "positif" | "nul">;
528
+ protected readonly texte: _angular_core.Signal<string>;
375
529
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StMoney, never>;
376
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>;
377
531
  }
@@ -394,12 +548,33 @@ declare class StDate {
394
548
  readonly valeur: _angular_core.InputSignal<string | Date>;
395
549
  readonly format: _angular_core.InputSignal<FormatDeDate>;
396
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;
397
561
  private readonly date;
398
- readonly estValide: _angular_core.Signal<boolean>;
399
- readonly iso: _angular_core.Signal<string | null>;
400
- 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>;
401
576
  /** Forme longue, lue par les technologies d'assistance. */
402
- readonly texteAccessible: _angular_core.Signal<string | null>;
577
+ protected readonly texteAccessible: _angular_core.Signal<string | null>;
403
578
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDate, never>;
404
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>;
405
580
  }
@@ -416,20 +591,21 @@ declare class StDate {
416
591
  */
417
592
  declare class StRelativeTime {
418
593
  private readonly locale;
594
+ private readonly libelles;
419
595
  private readonly fuseau;
420
596
  readonly valeur: _angular_core.InputSignal<string | Date>;
421
- readonly rafraichir: _angular_core.InputSignal<boolean>;
597
+ readonly rafraichir: _angular_core.InputSignalWithTransform<boolean, unknown>;
422
598
  /** Au-dela de ce nombre de jours, la date absolue est plus parlante. */
423
599
  readonly seuilAbsoluEnJours: _angular_core.InputSignal<number>;
424
600
  private readonly destruction;
425
601
  private readonly maintenant;
426
602
  constructor();
427
603
  private dateEnMillisecondes;
428
- readonly estValide: _angular_core.Signal<boolean>;
429
- readonly iso: _angular_core.Signal<string | null>;
430
- readonly depasseLeSeuil: _angular_core.Signal<boolean>;
431
- readonly texte: _angular_core.Signal<string>;
432
- 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>;
433
609
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StRelativeTime, never>;
434
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>;
435
611
  }
@@ -446,17 +622,22 @@ declare class StRelativeTime {
446
622
  declare class StCount {
447
623
  private readonly locale;
448
624
  readonly valeur: _angular_core.InputSignal<number>;
449
- readonly ton: _angular_core.InputSignal<"courant" | "discret">;
625
+ readonly ton: _angular_core.InputSignal<"neutre" | "discret">;
450
626
  /** `null` : jamais d'abreviation. */
451
627
  readonly abregerAuDela: _angular_core.InputSignal<number | null>;
452
- readonly estAbrege: _angular_core.Signal<boolean>;
453
- readonly texteComplet: _angular_core.Signal<string>;
454
- 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>;
455
631
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCount, never>;
456
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>;
457
633
  }
458
634
 
459
- 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;
460
641
  /**
461
642
  * Pastille de statut.
462
643
  *
@@ -474,13 +655,13 @@ declare class StStatusPill {
474
655
  readonly statut: _angular_core.InputSignal<string>;
475
656
  /** Texte deja traduit par l'appelant : le socle ne traduit rien. */
476
657
  readonly libelle: _angular_core.InputSignal<string>;
477
- 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">;
478
- 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>;
479
660
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StStatusPill, never>;
480
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>;
481
662
  }
482
663
 
483
- type TonDeBadge = 'neutre' | 'primaire' | 'succes' | 'avertissement' | 'danger';
664
+ type TonDeBadge = TonSemantique;
484
665
  /**
485
666
  * Pastille de comptage superposee a un autre element.
486
667
  *
@@ -493,10 +674,10 @@ type TonDeBadge = 'neutre' | 'primaire' | 'succes' | 'avertissement' | 'danger';
493
674
  declare class StBadge {
494
675
  readonly valeur: _angular_core.InputSignal<string | number | null>;
495
676
  readonly max: _angular_core.InputSignal<number>;
496
- readonly ton: _angular_core.InputSignal<TonDeBadge>;
677
+ readonly ton: _angular_core.InputSignal<TonSemantique>;
497
678
  /** Point seul, sans chiffre : signale une nouveaute sans la quantifier. */
498
- readonly point: _angular_core.InputSignal<boolean>;
499
- readonly texte: _angular_core.Signal<string>;
679
+ readonly point: _angular_core.InputSignalWithTransform<boolean, unknown>;
680
+ protected readonly texte: _angular_core.Signal<string>;
500
681
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StBadge, never>;
501
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>;
502
683
  }
@@ -511,12 +692,14 @@ declare class StBadge {
511
692
  */
512
693
  declare class StTag {
513
694
  private readonly element;
695
+ private readonly libelles;
514
696
  readonly libelle: _angular_core.InputSignal<string>;
515
- readonly supprimable: _angular_core.InputSignal<boolean>;
516
- readonly ton: _angular_core.InputSignal<"primaire" | "neutre">;
517
- 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>;
518
701
  readonly supprime: _angular_core.OutputEmitterRef<void>;
519
- readonly libelleDeSuppression: _angular_core.Signal<string>;
702
+ protected readonly libelleDeSuppression: _angular_core.Signal<string>;
520
703
  protected auRetrait(): void;
521
704
  /**
522
705
  * Cible, dans l'ordre : le bouton de l'etiquette suivante, celui de la
@@ -544,12 +727,12 @@ declare class StAvatar {
544
727
  * `true` quand le nom figure deja a cote de l'avatar, ce qui est le cas
545
728
  * courant : l'avatar devient alors decoratif et se tait.
546
729
  */
547
- readonly nomAdjacent: _angular_core.InputSignal<boolean>;
730
+ readonly nomAdjacent: _angular_core.InputSignalWithTransform<boolean, unknown>;
548
731
  private readonly imageEchouee;
549
- readonly afficheLImage: _angular_core.Signal<boolean>;
550
- readonly initiales: _angular_core.Signal<string>;
732
+ protected readonly afficheLImage: _angular_core.Signal<boolean>;
733
+ protected readonly initiales: _angular_core.Signal<string>;
551
734
  /** Vide quand le nom est deja lisible a cote : eviter la double lecture. */
552
- readonly texteAlternatif: _angular_core.Signal<string>;
735
+ protected readonly texteAlternatif: _angular_core.Signal<string>;
553
736
  protected auxEchecsDImage(): void;
554
737
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StAvatar, never>;
555
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>;
@@ -565,7 +748,7 @@ declare class StAvatar {
565
748
  declare class StEmpty {
566
749
  readonly titre: _angular_core.InputSignal<string>;
567
750
  readonly description: _angular_core.InputSignal<string | null>;
568
- 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">;
569
752
  readonly niveauDuTitre: _angular_core.InputSignal<NiveauDeTitre>;
570
753
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StEmpty, never>;
571
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>;
@@ -586,6 +769,7 @@ type VarianteDErreur = 'hors-ligne' | 'serveur' | 'client';
586
769
  */
587
770
  declare class StError {
588
771
  private readonly regionParente;
772
+ private readonly libelles;
589
773
  readonly variante: _angular_core.InputSignal<VarianteDErreur>;
590
774
  /** Code machine stable, tel que rendu par le backend. */
591
775
  readonly code: _angular_core.InputSignal<string>;
@@ -593,15 +777,19 @@ declare class StError {
593
777
  readonly message: _angular_core.InputSignal<string>;
594
778
  readonly traceId: _angular_core.InputSignal<string | null>;
595
779
  readonly niveauDuTitre: _angular_core.InputSignal<NiveauDeTitre>;
596
- readonly rejouable: _angular_core.InputSignal<boolean>;
597
- readonly libelleRejeu: _angular_core.InputSignal<string>;
598
- readonly rejeuEnCours: _angular_core.InputSignal<boolean>;
599
- 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>;
600
785
  readonly rejeu: _angular_core.OutputEmitterRef<void>;
601
- 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">;
602
- 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>;
603
791
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StError, never>;
604
- 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>;
605
793
  }
606
794
 
607
795
  /**
@@ -619,7 +807,7 @@ declare class StError {
619
807
  declare class StOfflineBanner {
620
808
  readonly message: _angular_core.InputSignal<string>;
621
809
  readonly libelleRejeu: _angular_core.InputSignal<string | null>;
622
- readonly rejeuEnCours: _angular_core.InputSignal<boolean>;
810
+ readonly rejeuEnCours: _angular_core.InputSignalWithTransform<boolean, unknown>;
623
811
  readonly rejeu: _angular_core.OutputEmitterRef<void>;
624
812
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StOfflineBanner, never>;
625
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>;
@@ -629,29 +817,73 @@ declare class StOfflineBanner {
629
817
  * Impose les cinq etats a un bloc qui consomme l'API, et centralise leur
630
818
  * annonce.
631
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
+ *
632
837
  * ⚠️ L'hote ne porte PAS `role="status"`, contrairement a ce qu'on attendrait :
633
838
  * un remplacement de contenu A L'INTERIEUR d'une region vivante fait relire
634
839
  * tout le sous-arbre par le lecteur d'ecran a chaque bascule d'etat. Seule une
635
- * petite zone masquee porte l'annonce, qui tient en quelques mots. L'hote se
636
- * contente d'`aria-busy`.
637
- *
638
- * Il fournit `REGION_VIVANTE_PARENTE` : les composants qu'il rend (indicateur
639
- * de chargement, erreur) detectent sa presence et se taisent, au lieu
640
- * d'annoncer une deuxieme fois le meme fait.
641
- */
642
- declare class StState {
643
- readonly etat: _angular_core.InputSignal<EtatDeBloc>;
644
- /** Le chemin nominal. Obligatoire : un bloc sans succes n'a pas de raison d'etre. */
645
- readonly succes: _angular_core.InputSignal<TemplateRef<unknown>>;
646
- readonly chargement: _angular_core.InputSignal<TemplateRef<unknown> | null>;
647
- readonly erreur: _angular_core.InputSignal<TemplateRef<unknown> | null>;
648
- readonly vide: _angular_core.InputSignal<TemplateRef<unknown> | null>;
649
- 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>;
650
850
  /** Silhouette par defaut du chargement. `null` : un indicateur tournant. */
651
851
  readonly squelette: _angular_core.InputSignal<VarianteDeSquelette | null>;
652
852
  readonly lignesDeSquelette: _angular_core.InputSignal<number>;
653
- readonly annonces: _angular_core.InputSignal<Readonly<Record<EtatDeBloc, string>>>;
654
- 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
+ }>;
655
887
  /**
656
888
  * Les etats degrades n'ont pas de rendu par defaut : afficher un texte
657
889
  * generique a la place d'un vrai ecran vide ou d'une vraie erreur donnerait
@@ -659,11 +891,76 @@ declare class StState {
659
891
  * voie, en developpement.
660
892
  */
661
893
  readonly gabaritDeLEtat: _angular_core.Signal<TemplateRef<unknown> | null>;
662
- 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();
663
898
  private signalerSiAbsent;
664
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StState, never>;
665
- 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>;
666
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];
667
964
 
668
- 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 };
669
- 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 };