@starterlib/ui 0.1.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.
@@ -0,0 +1,669 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, TemplateRef } from '@angular/core';
3
+ import { Montant } from '@starterlib/util';
4
+
5
+ /**
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.
10
+ */
11
+ declare const CHEMIN_DU_SPRITE: InjectionToken<string>;
12
+ /**
13
+ * Marque la presence d'une region vivante possedee par un ancetre, en pratique
14
+ * la directive `stState`.
15
+ *
16
+ * Tout composant susceptible de porter un `role="status"` l'injecte en
17
+ * optionnel et **se tait** s'il en trouve un. Sans cela, un indicateur de
18
+ * chargement annonce dans une region qui annonce deja, et le lecteur d'ecran
19
+ * lit deux fois. Le defaut se voit seulement en usage reel, jamais en revue.
20
+ */
21
+ declare const REGION_VIVANTE_PARENTE: InjectionToken<true>;
22
+ /**
23
+ * Fuseau employe pour rendre les dates. Explicite parce qu'un rendu serveur et
24
+ * un rendu client qui ne s'accordent pas sur le fuseau produisent deux textes
25
+ * differents, et l'hydratation casse. Le SSR est ecarte en version 1, mais la
26
+ * compatibilite reste gardee.
27
+ */
28
+ declare const FUSEAU_PAR_DEFAUT: InjectionToken<string>;
29
+
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
+ type TailleDIcone = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
38
+ type TonDIcone = 'courant' | 'discret' | 'primaire' | 'succes' | 'avertissement' | 'danger';
39
+ /**
40
+ * Icone tiree d'un sprite SVG servi en meme origine.
41
+ *
42
+ * Pourquoi un sprite et une reference externe plutot qu'une insertion : poser
43
+ * du SVG dans le document demanderait `innerHTML`, interdit dans ce depot, et
44
+ * une police d'icones rend un caractere arbitraire aux lecteurs d'ecran quand
45
+ * la police ne charge pas.
46
+ *
47
+ * Une icone est **decorative par defaut**. Regle de tri : si la retirer ne
48
+ * retire aucune information, elle est decorative. Une icone posee a cote d'un
49
+ * texte qui dit la meme chose l'est toujours.
50
+ */
51
+ declare class StIcon {
52
+ 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">;
54
+ readonly taille: _angular_core.InputSignal<TailleDIcone>;
55
+ readonly ton: _angular_core.InputSignal<TonDIcone>;
56
+ /** `null` : l'icone est decorative et reste muette pour les lecteurs. */
57
+ readonly etiquette: _angular_core.InputSignal<string | null>;
58
+ readonly estDecorative: _angular_core.Signal<boolean>;
59
+ readonly reference: _angular_core.Signal<string>;
60
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StIcon, never>;
61
+ 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
+ }
63
+
64
+ /**
65
+ * Noms du sprite, engendres depuis `assets/icones/sprite.svg`.
66
+ *
67
+ * Le type existe pour qu'une faute de frappe echoue a la compilation : une
68
+ * reference `use` vers un identifiant absent ne rend RIEN, sans erreur, et le
69
+ * defaut passe la revue.
70
+ */
71
+ declare const NOMS_DICONE: readonly ["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"];
72
+ type NomDIcone = (typeof NOMS_DICONE)[number];
73
+
74
+ type VarianteDeTexte = 'corps' | 'corps-sm' | 'discret' | 'legende' | 'mono';
75
+ type GraisseDeTexte = 'normale' | 'moyenne' | 'semi';
76
+ /**
77
+ * Bloc de texte de l'echelle typographique.
78
+ *
79
+ * L'hote EST la boite : aucun enveloppeur interne, et jamais
80
+ * `display: contents`, qui retire l'element de l'arbre d'accessibilite dans
81
+ * plusieurs navigateurs.
82
+ */
83
+ declare class StText {
84
+ readonly variante: _angular_core.InputSignal<VarianteDeTexte>;
85
+ readonly graisse: _angular_core.InputSignal<GraisseDeTexte>;
86
+ readonly enLigne: _angular_core.InputSignal<boolean>;
87
+ /**
88
+ * Nombre de lignes au-dela duquel le texte est coupe.
89
+ *
90
+ * ⚠️ A ne jamais employer sur un message d'erreur, un statut ou un libelle
91
+ * d'action : une information tronquee y devient fausse.
92
+ */
93
+ readonly tronquerA: _angular_core.InputSignal<number | null>;
94
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StText, never>;
95
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StText, "st-text", never, { "variante": { "alias": "variante"; "required": false; "isSignal": true; }; "graisse": { "alias": "graisse"; "required": false; "isSignal": true; }; "enLigne": { "alias": "enLigne"; "required": false; "isSignal": true; }; "tronquerA": { "alias": "tronquerA"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
96
+ }
97
+
98
+ type NiveauDeTitre = 1 | 2 | 3 | 4 | 5 | 6;
99
+ type TailleDeTitre = 'lg' | 'xl' | '2xl' | '3xl' | '4xl';
100
+ /**
101
+ * Titre de section.
102
+ *
103
+ * `niveau` decrit la STRUCTURE du document, `taille` son APPARENCE. Les deux
104
+ * sont volontairement dissocies : c'est ce qui empeche de choisir un niveau 4
105
+ * parce qu'on le trouve plus petit, en cassant au passage la table des
106
+ * matieres que les lecteurs d'ecran construisent.
107
+ *
108
+ * L'hote porte `role="heading"` et `aria-level` plutot qu'une bascule sur six
109
+ * balises : cela demanderait six projections de contenu, fragiles, pour un
110
+ * resultat que les lecteurs d'ecran traitent de facon identique.
111
+ */
112
+ declare class StHeading {
113
+ readonly niveau: _angular_core.InputSignal<NiveauDeTitre>;
114
+ readonly taille: _angular_core.InputSignal<TailleDeTitre | null>;
115
+ /** Cible d'un `aria-labelledby` : une region se nomme par son titre. */
116
+ readonly identifiant: _angular_core.InputSignal<string | null>;
117
+ readonly tailleEffective: _angular_core.Signal<TailleDeTitre>;
118
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StHeading, never>;
119
+ 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
+ }
121
+
122
+ type TailleDeSpinner = 'sm' | 'md' | 'lg';
123
+ type TonDeSpinner = 'courant' | 'primaire' | 'inverse';
124
+ /**
125
+ * Indicateur d'activite indeterminee.
126
+ *
127
+ * ⚠️ Deux pieges tenus ici, et aucun des deux ne se voit en revue :
128
+ *
129
+ * 1. Il n'emploie AUCUNE duree de l'echelle de jetons. Sous
130
+ * `prefers-reduced-motion`, `--st-duree-*` passe a zero : un spinner cable
131
+ * dessus se figerait, et l'ecran passerait pour bloque. Il declare sa propre
132
+ * duree et bascule en pulsation d'opacite, qui n'a pas de composante
133
+ * vestibulaire.
134
+ * 2. Il ne s'annonce que s'il n'est PAS deja dans une region vivante. Sinon le
135
+ * lecteur d'ecran annonce deux fois le meme chargement.
136
+ */
137
+ declare class StSpinner {
138
+ private readonly regionParente;
139
+ readonly taille: _angular_core.InputSignal<TailleDeSpinner>;
140
+ readonly ton: _angular_core.InputSignal<TonDeSpinner>;
141
+ readonly etiquette: _angular_core.InputSignal<string>;
142
+ readonly sAnnonce: _angular_core.Signal<boolean>;
143
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSpinner, never>;
144
+ 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
+ }
146
+
147
+ type TonDeProgression = 'primaire' | 'succes' | 'danger';
148
+ /**
149
+ * Barre de progression, determinee ou indeterminee.
150
+ *
151
+ * ⚠️ Elle n'est JAMAIS placee dans une region vivante : `role="progressbar"`
152
+ * avec `aria-valuenow` est deja expose aux technologies d'assistance, et une
153
+ * region vivante par-dessus ferait annoncer chaque pourcent.
154
+ */
155
+ declare class StProgress {
156
+ /** `null` : progression indeterminee. */
157
+ readonly valeur: _angular_core.InputSignal<number | null>;
158
+ readonly max: _angular_core.InputSignal<number>;
159
+ /** Obligatoire : une barre sans nom accessible n'apprend rien. */
160
+ readonly etiquette: _angular_core.InputSignal<string>;
161
+ readonly ton: _angular_core.InputSignal<TonDeProgression>;
162
+ /** Texte lu a la place du pourcentage quand celui-ci n'est pas parlant. */
163
+ readonly texteDeValeur: _angular_core.InputSignal<string | null>;
164
+ readonly estIndeterminee: _angular_core.Signal<boolean>;
165
+ /** 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>;
168
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StProgress, never>;
169
+ 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
+ }
171
+
172
+ type VarianteDeSquelette = 'texte' | 'tableau' | 'carte';
173
+ /**
174
+ * Silhouette du contenu en cours de chargement.
175
+ *
176
+ * Entierement masque aux technologies d'assistance : c'est `stState` qui
177
+ * annonce le chargement, une fois. Un squelette annonce ligne par ligne
178
+ * noierait le lecteur d'ecran.
179
+ *
180
+ * Il doit reproduire la BOITE du contenu reel, sinon l'arrivee des donnees
181
+ * fait sauter la mise en page.
182
+ */
183
+ declare class StSkeleton {
184
+ readonly variante: _angular_core.InputSignal<VarianteDeSquelette>;
185
+ readonly lignes: _angular_core.InputSignal<number>;
186
+ 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[]>;
190
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSkeleton, never>;
191
+ 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
+ }
193
+
194
+ type VarianteDeBouton = 'primaire' | 'secondaire' | 'discret' | 'destructeur';
195
+ type TailleDeBouton = 'sm' | 'md' | 'lg';
196
+ /**
197
+ * Bouton du socle, pose en ATTRIBUT sur un `<button>` natif.
198
+ *
199
+ * ⚠️ Pourquoi pas un element `<st-button>` qui enveloppe un bouton : l'enveloppe
200
+ * casse `type="submit"` (le bouton ne soumet plus le formulaire ancetre),
201
+ * l'attribut `form` ne porte plus, et l'hote devient un second arret de
202
+ * tabulation si quelqu'un lui pose un `tabindex`. Tout fonctionne en
203
+ * demonstration et casse au premier formulaire reel.
204
+ *
205
+ * ⚠️ Pendant le chargement, le bouton porte `aria-disabled` et NON `disabled` :
206
+ * l'attribut natif lui retire le focus, le lecteur d'ecran perd le controle
207
+ * qu'il avait sous le doigt et retombe sur le corps du document. Les clics
208
+ * sont interceptes par le composant.
209
+ */
210
+ declare class StButton {
211
+ readonly variante: _angular_core.InputSignal<VarianteDeBouton>;
212
+ 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>;
216
+ /**
217
+ * Action en cours. Tant qu'il vaut vrai, les clics sont avales : c'est le
218
+ * mecanisme d'anti double soumission. L'appelant doit le lever DES la
219
+ * soumission, pas a l'arrivee de la reponse.
220
+ */
221
+ readonly chargement: _angular_core.InputSignal<boolean>;
222
+ constructor();
223
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StButton, never>;
224
+ 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
+ }
226
+
227
+ type VarianteDeBoutonIcone = 'discret' | 'secondaire' | 'destructeur';
228
+ /**
229
+ * Bouton reduit a une icone, pose en attribut sur un `<button>` natif.
230
+ *
231
+ * L'etiquette est OBLIGATOIRE : une icone seule n'a pas de nom accessible, et
232
+ * `title` n'en tient pas lieu — il n'apparait pas au toucher et n'est pas lu
233
+ * de facon fiable.
234
+ */
235
+ 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">;
237
+ /** Nom accessible du controle. Sans lui, l'icone ne dit rien. */
238
+ readonly etiquette: _angular_core.InputSignal<string>;
239
+ readonly variante: _angular_core.InputSignal<VarianteDeBoutonIcone>;
240
+ 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>;
243
+ 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>;
245
+ }
246
+
247
+ type VarianteDeLien = 'texte' | 'autonome' | 'discret';
248
+ /**
249
+ * Lien, pose en attribut sur un `<a>` natif.
250
+ *
251
+ * ⚠️ Un `<a>` sans `href` est interdit : il n'est ni focalisable ni annonce
252
+ * comme lien. Une action qui ne navigue pas est un bouton.
253
+ *
254
+ * Les liens visites ne sont volontairement PAS distingues : sur une interface
255
+ * bancaire, la couleur de visite laisse fuir l'historique de navigation a
256
+ * quiconque regarde l'ecran.
257
+ */
258
+ declare class StLink {
259
+ readonly variante: _angular_core.InputSignal<VarianteDeLien>;
260
+ /** 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>;
264
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StLink, never>;
265
+ 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
+ }
267
+
268
+ /**
269
+ * Regroupe des actions liees.
270
+ *
271
+ * ⚠️ `role="group"` et NON `role="toolbar"` : une barre d'outils exige un
272
+ * `tabindex` glissant et la navigation par fleches. Annoncer « barre d'outils »
273
+ * sans en fournir le comportement desoriente plus qu'un groupe simple. Le
274
+ * motif complet viendra avec les primitives d'`@angular/aria`.
275
+ */
276
+ declare class StButtonGroup {
277
+ /** Nom du groupe : sans lui, le regroupement n'apprend rien a l'oral. */
278
+ readonly etiquette: _angular_core.InputSignal<string>;
279
+ readonly orientation: _angular_core.InputSignal<"horizontale" | "verticale">;
280
+ /** Boutons jointifs, rayons fusionnes. */
281
+ readonly attache: _angular_core.InputSignal<boolean>;
282
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StButtonGroup, never>;
283
+ 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
+ }
285
+
286
+ /**
287
+ * Valeur technique courte et copiable : identifiant de trace, reference
288
+ * d'operation, code d'erreur.
289
+ *
290
+ * ⚠️ La confirmation de copie passe par une petite region vivante interne, et
291
+ * le LIBELLE DU BOUTON NE CHANGE PAS. Remplacer « Copier » par « Copie » ferait
292
+ * changer le nom accessible du controle que l'utilisateur a sous le doigt :
293
+ * le lecteur d'ecran annonce alors un autre bouton que celui qu'il croyait.
294
+ */
295
+ declare class StCode {
296
+ private readonly document;
297
+ private readonly destruction;
298
+ 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>;
303
+ readonly copie: _angular_core.OutputEmitterRef<string>;
304
+ private readonly confirmation;
305
+ private minuterie;
306
+ readonly texteDeConfirmation: _angular_core.Signal<string>;
307
+ /**
308
+ * Le bouton n'apparait que si le navigateur sait copier. Sans presse-papiers,
309
+ * un bouton qui ne fait rien vaut moins que la selection manuelle, que la
310
+ * feuille garde possible (`user-select: all`).
311
+ */
312
+ readonly copiePossible: _angular_core.Signal<boolean>;
313
+ protected auClicDeCopie(): Promise<void>;
314
+ 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>;
316
+ }
317
+
318
+ type TypeMasque = 'iban' | 'carte' | 'telephone';
319
+ /**
320
+ * Identifiant sensible, masque par defaut.
321
+ *
322
+ * ⚠️ La valeur masquee porte un `aria-label` en toutes lettres (« IBAN se
323
+ * terminant par 2606 ») : plusieurs lecteurs d'ecran epellent une suite de
324
+ * puces caractere par caractere, ce qui est a la fois illisible et interminable.
325
+ *
326
+ * La revelation est un EVENEMENT METIER : elle se journalise cote appelant par
327
+ * la sortie `revelation`. La valeur revelee, elle, ne part jamais dans un
328
+ * journal.
329
+ */
330
+ declare class StMasked {
331
+ private readonly destruction;
332
+ readonly valeur: _angular_core.InputSignal<string>;
333
+ readonly type: _angular_core.InputSignal<TypeMasque>;
334
+ readonly revele: _angular_core.ModelSignal<boolean>;
335
+ readonly revelationAutorisee: _angular_core.InputSignal<boolean>;
336
+ readonly dureeDeRevelationEnSecondes: _angular_core.InputSignal<number>;
337
+ readonly libelleAfficher: _angular_core.InputSignal<string>;
338
+ readonly libelleMasquer: _angular_core.InputSignal<string>;
339
+ readonly revelation: _angular_core.OutputEmitterRef<{
340
+ type: TypeMasque;
341
+ }>;
342
+ private readonly annonce;
343
+ readonly texteDAnnonce: _angular_core.Signal<string>;
344
+ 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>;
349
+ private valeurLisible;
350
+ protected basculer(): void;
351
+ private masquer;
352
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StMasked, never>;
353
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StMasked, "st-masked", never, { "valeur": { "alias": "valeur"; "required": true; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "revele": { "alias": "revele"; "required": false; "isSignal": true; }; "revelationAutorisee": { "alias": "revelationAutorisee"; "required": false; "isSignal": true; }; "dureeDeRevelationEnSecondes": { "alias": "dureeDeRevelationEnSecondes"; "required": false; "isSignal": true; }; "libelleAfficher": { "alias": "libelleAfficher"; "required": false; "isSignal": true; }; "libelleMasquer": { "alias": "libelleMasquer"; "required": false; "isSignal": true; }; }, { "revele": "reveleChange"; "revelation": "revelation"; }, never, never, true, never>;
354
+ }
355
+
356
+ /**
357
+ * Somme d'argent.
358
+ *
359
+ * Le montant entre sous forme d'unites mineures entieres : un nombre a virgule
360
+ * flottante ne represente pas exactement 0,10 EUR, et les erreurs s'accumulent.
361
+ * La conversion n'a lieu qu'a l'instant du rendu.
362
+ *
363
+ * ⚠️ Le signe negatif est TOUJOURS rendu en texte. La couleur ne fait que le
364
+ * renforcer : un daltonien, une impression en noir et blanc ou un theme a fort
365
+ * contraste ne doivent jamais transformer un debit en credit.
366
+ */
367
+ declare class StMoney {
368
+ private readonly locale;
369
+ readonly valeur: _angular_core.InputSignal<Montant>;
370
+ readonly signeExplicite: _angular_core.InputSignal<boolean>;
371
+ readonly sansDevise: _angular_core.InputSignal<boolean>;
372
+ 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>;
375
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StMoney, never>;
376
+ 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
+ }
378
+
379
+ type FormatDeDate = 'court' | 'long' | 'date-heure' | 'heure';
380
+ /**
381
+ * Date rendue dans la locale et le fuseau de l'application.
382
+ *
383
+ * ⚠️ La locale et le fuseau sont EXPLICITES, jamais deduits de l'environnement
384
+ * d'execution. Un rendu serveur et un rendu navigateur qui ne s'accordent pas
385
+ * produisent deux textes differents, et l'hydratation casse. Le rendu serveur
386
+ * est ecarte en version 1, mais la compatibilite reste gardee a cout nul.
387
+ *
388
+ * Le format court garde un nom accessible en toutes lettres : « 12/09/26 » est
389
+ * ambigu a l'oral, et l'ordre jour-mois n'est pas universel.
390
+ */
391
+ declare class StDate {
392
+ private readonly locale;
393
+ private readonly fuseauParDefaut;
394
+ readonly valeur: _angular_core.InputSignal<string | Date>;
395
+ readonly format: _angular_core.InputSignal<FormatDeDate>;
396
+ readonly fuseau: _angular_core.InputSignal<string | null>;
397
+ 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>;
401
+ /** Forme longue, lue par les technologies d'assistance. */
402
+ readonly texteAccessible: _angular_core.Signal<string | null>;
403
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDate, never>;
404
+ 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
+ }
406
+
407
+ /**
408
+ * Temps ecoule, exprime relativement (« il y a 5 minutes »).
409
+ *
410
+ * ⚠️ Ce composant ne doit JAMAIS etre place dans une region vivante : son texte
411
+ * se reecrit tout seul, et une region vivante le ferait annoncer en boucle.
412
+ * Son nom accessible porte la date absolue, qui elle ne bouge pas.
413
+ *
414
+ * La cadence de rafraichissement s'adapte : rafraichir chaque seconde une date
415
+ * vieille de trois jours reveille l'onglet pour rien.
416
+ */
417
+ declare class StRelativeTime {
418
+ private readonly locale;
419
+ private readonly fuseau;
420
+ readonly valeur: _angular_core.InputSignal<string | Date>;
421
+ readonly rafraichir: _angular_core.InputSignal<boolean>;
422
+ /** Au-dela de ce nombre de jours, la date absolue est plus parlante. */
423
+ readonly seuilAbsoluEnJours: _angular_core.InputSignal<number>;
424
+ private readonly destruction;
425
+ private readonly maintenant;
426
+ constructor();
427
+ 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>;
433
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StRelativeTime, never>;
434
+ 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
+ }
436
+
437
+ /**
438
+ * Nombre dans le flux du texte.
439
+ *
440
+ * Distinct de `st-badge`, qui est une pastille superposee a un autre element.
441
+ *
442
+ * ⚠️ Quand la valeur est abregee (« 1,2 k »), le nom accessible porte le nombre
443
+ * COMPLET : l'abreviation est une commodite visuelle, pas une perte
444
+ * d'information pour qui ecoute la page.
445
+ */
446
+ declare class StCount {
447
+ private readonly locale;
448
+ readonly valeur: _angular_core.InputSignal<number>;
449
+ readonly ton: _angular_core.InputSignal<"courant" | "discret">;
450
+ /** `null` : jamais d'abreviation. */
451
+ 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>;
455
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCount, never>;
456
+ 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
+ }
458
+
459
+ type TonDeStatut = 'neutre' | 'info' | 'succes' | 'avertissement' | 'danger';
460
+ /**
461
+ * Pastille de statut.
462
+ *
463
+ * ⚠️ Le libelle ET l'icone sont OBLIGATOIRES, et l'icone doit differer par sa
464
+ * FORME d'un ton a l'autre (coche, triangle, croix, cercle). Un statut porte
465
+ * par la seule couleur est illisible pour une personne daltonienne, a
466
+ * l'impression, et sous un theme a fort contraste.
467
+ *
468
+ * ⚠️ Aucun role ARIA, malgre le nom du composant : `role="status"` en ferait
469
+ * une region vivante, et une liste de vingt lignes ferait annoncer vingt
470
+ * statuts a chaque rendu.
471
+ */
472
+ declare class StStatusPill {
473
+ /** Code machine du statut : sert aux tests et aux selecteurs, jamais a l'affichage. */
474
+ readonly statut: _angular_core.InputSignal<string>;
475
+ /** Texte deja traduit par l'appelant : le socle ne traduit rien. */
476
+ 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>;
479
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StStatusPill, never>;
480
+ 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
+ }
482
+
483
+ type TonDeBadge = 'neutre' | 'primaire' | 'succes' | 'avertissement' | 'danger';
484
+ /**
485
+ * Pastille de comptage superposee a un autre element.
486
+ *
487
+ * ⚠️ Elle est TOUJOURS `aria-hidden`. Un « 5 » flottant, lu hors contexte,
488
+ * n'apprend rien. Le compte doit entrer dans le nom accessible de l'element
489
+ * porteur : « Notifications, 5 non lues », compose par l'appelant.
490
+ *
491
+ * L'element porteur doit declarer la classe `st-badge-ancre`.
492
+ */
493
+ declare class StBadge {
494
+ readonly valeur: _angular_core.InputSignal<string | number | null>;
495
+ readonly max: _angular_core.InputSignal<number>;
496
+ readonly ton: _angular_core.InputSignal<TonDeBadge>;
497
+ /** Point seul, sans chiffre : signale une nouveaute sans la quantifier. */
498
+ readonly point: _angular_core.InputSignal<boolean>;
499
+ readonly texte: _angular_core.Signal<string>;
500
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StBadge, never>;
501
+ 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
+ }
503
+
504
+ /**
505
+ * Etiquette, eventuellement retirable.
506
+ *
507
+ * ⚠️ Le retrait DEPLACE LE FOCUS avant de s'annoncer. Sans cela, le bouton
508
+ * disparait sous le doigt de l'utilisateur clavier, le focus retombe sur le
509
+ * corps du document, et la navigation repart du haut de la page. C'est l'un
510
+ * des defauts d'accessibilite les plus frequents des listes d'etiquettes.
511
+ */
512
+ declare class StTag {
513
+ private readonly element;
514
+ 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>;
518
+ readonly supprime: _angular_core.OutputEmitterRef<void>;
519
+ readonly libelleDeSuppression: _angular_core.Signal<string>;
520
+ protected auRetrait(): void;
521
+ /**
522
+ * Cible, dans l'ordre : le bouton de l'etiquette suivante, celui de la
523
+ * precedente, puis le conteneur s'il est focalisable par script.
524
+ */
525
+ private deplacerLeFocus;
526
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTag, never>;
527
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StTag, "st-tag", never, { "libelle": { "alias": "libelle"; "required": true; "isSignal": true; }; "supprimable": { "alias": "supprimable"; "required": false; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "prefixeDeSuppression": { "alias": "prefixeDeSuppression"; "required": false; "isSignal": true; }; }, { "supprime": "supprime"; }, never, never, true, never>;
528
+ }
529
+
530
+ /**
531
+ * Representation d'une personne.
532
+ *
533
+ * ⚠️ Aucune couleur derivee d'un hachage du nom. Une palette engendree a
534
+ * l'execution n'offre AUCUNE garantie de contraste, ce qui annulerait la
535
+ * verification des paires semantiques : un nom malchanceux produirait un
536
+ * avatar illisible, et aucun test ne le verrait.
537
+ */
538
+ declare class StAvatar {
539
+ readonly nom: _angular_core.InputSignal<string>;
540
+ readonly sourceImage: _angular_core.InputSignal<string | null>;
541
+ readonly taille: _angular_core.InputSignal<"xs" | "sm" | "md" | "lg">;
542
+ readonly forme: _angular_core.InputSignal<"cercle" | "carre">;
543
+ /**
544
+ * `true` quand le nom figure deja a cote de l'avatar, ce qui est le cas
545
+ * courant : l'avatar devient alors decoratif et se tait.
546
+ */
547
+ readonly nomAdjacent: _angular_core.InputSignal<boolean>;
548
+ private readonly imageEchouee;
549
+ readonly afficheLImage: _angular_core.Signal<boolean>;
550
+ readonly initiales: _angular_core.Signal<string>;
551
+ /** Vide quand le nom est deja lisible a cote : eviter la double lecture. */
552
+ readonly texteAlternatif: _angular_core.Signal<string>;
553
+ protected auxEchecsDImage(): void;
554
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StAvatar, never>;
555
+ 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>;
556
+ }
557
+
558
+ /**
559
+ * Etat vide : il n'y a rien a montrer, et ce n'est pas une erreur.
560
+ *
561
+ * Le niveau du titre est fourni par l'APPELANT : un bloc vide place au milieu
562
+ * d'une page ne connait pas sa profondeur dans le document, et un niveau devine
563
+ * casserait la table des matieres que les lecteurs d'ecran construisent.
564
+ */
565
+ declare class StEmpty {
566
+ readonly titre: _angular_core.InputSignal<string>;
567
+ 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">;
569
+ readonly niveauDuTitre: _angular_core.InputSignal<NiveauDeTitre>;
570
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StEmpty, never>;
571
+ 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>;
572
+ }
573
+
574
+ type VarianteDErreur = 'hors-ligne' | 'serveur' | 'client';
575
+ /**
576
+ * Etat d'erreur d'un bloc.
577
+ *
578
+ * ⚠️ `titre` et `message` sont deja TRADUITS par l'appelant. Le socle backend
579
+ * n'emet jamais de phrase destinee a l'utilisateur : il rend un code stable, et
580
+ * la traduction appartient au client. Le `code` est affiche comme donnee
581
+ * technique, jamais comme explication.
582
+ *
583
+ * ⚠️ `role="alert"` seulement hors d'une region vivante existante : c'est le
584
+ * seul etat assertif du systeme, et il ne doit pas doubler l'annonce de
585
+ * `st-state`.
586
+ */
587
+ declare class StError {
588
+ private readonly regionParente;
589
+ readonly variante: _angular_core.InputSignal<VarianteDErreur>;
590
+ /** Code machine stable, tel que rendu par le backend. */
591
+ readonly code: _angular_core.InputSignal<string>;
592
+ readonly titre: _angular_core.InputSignal<string>;
593
+ readonly message: _angular_core.InputSignal<string>;
594
+ readonly traceId: _angular_core.InputSignal<string | null>;
595
+ 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>;
600
+ 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>;
603
+ 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>;
605
+ }
606
+
607
+ /**
608
+ * Banniere de perte de connexion.
609
+ *
610
+ * ⚠️ `role="status"` (poli) et NON `role="alert"`. Une perte de reseau n'est
611
+ * pas actionnable dans la seconde ; une annonce assertive interromprait une
612
+ * saisie en cours. La banniere est persistante, elle sera lue.
613
+ *
614
+ * ⚠️ Aucun bouton de fermeture : l'utilisateur ne peut pas fermer un fait.
615
+ *
616
+ * ⚠️ `sticky` et non `fixed` : a 200 % d'echelle, un element fixe recouvre le
617
+ * contenu qu'il annonce.
618
+ */
619
+ declare class StOfflineBanner {
620
+ readonly message: _angular_core.InputSignal<string>;
621
+ readonly libelleRejeu: _angular_core.InputSignal<string | null>;
622
+ readonly rejeuEnCours: _angular_core.InputSignal<boolean>;
623
+ readonly rejeu: _angular_core.OutputEmitterRef<void>;
624
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StOfflineBanner, never>;
625
+ 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>;
626
+ }
627
+
628
+ /**
629
+ * Impose les cinq etats a un bloc qui consomme l'API, et centralise leur
630
+ * annonce.
631
+ *
632
+ * ⚠️ L'hote ne porte PAS `role="status"`, contrairement a ce qu'on attendrait :
633
+ * un remplacement de contenu A L'INTERIEUR d'une region vivante fait relire
634
+ * 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>;
650
+ /** Silhouette par defaut du chargement. `null` : un indicateur tournant. */
651
+ readonly squelette: _angular_core.InputSignal<VarianteDeSquelette | null>;
652
+ readonly lignesDeSquelette: _angular_core.InputSignal<number>;
653
+ readonly annonces: _angular_core.InputSignal<Readonly<Record<EtatDeBloc, string>>>;
654
+ readonly annonce: _angular_core.Signal<string>;
655
+ /**
656
+ * Les etats degrades n'ont pas de rendu par defaut : afficher un texte
657
+ * generique a la place d'un vrai ecran vide ou d'une vraie erreur donnerait
658
+ * l'illusion que les cinq etats sont traites. Il vaut mieux que le manque se
659
+ * voie, en developpement.
660
+ */
661
+ readonly gabaritDeLEtat: _angular_core.Signal<TemplateRef<unknown> | null>;
662
+ readonly montreLaSilhouetteParDefaut: _angular_core.Signal<boolean>;
663
+ 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>;
666
+ }
667
+
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 };