@starterlib/ui 0.2.0 → 0.4.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.
- package/README.md +83 -16
- package/assets/icones/sprite.svg +3 -0
- package/fesm2022/starterlib-ui-formulaires.mjs +446 -0
- package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -0
- package/fesm2022/starterlib-ui-interactions.mjs +536 -0
- package/fesm2022/starterlib-ui-interactions.mjs.map +1 -0
- package/fesm2022/starterlib-ui-surfaces.mjs +1106 -11
- package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
- package/fesm2022/starterlib-ui.mjs +2719 -105
- package/fesm2022/starterlib-ui.mjs.map +1 -1
- package/package.json +24 -3
- package/types/starterlib-ui-formulaires.d.ts +198 -0
- package/types/starterlib-ui-interactions.d.ts +269 -0
- package/types/starterlib-ui-surfaces.d.ts +607 -16
- package/types/starterlib-ui.d.ts +1598 -24
package/types/starterlib-ui.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { InjectionToken, Signal, Provider, Resource, TemplateRef } from '@angular/core';
|
|
3
|
-
import { Ton, Montant, TonSemantique, EtatDeBloc } from '@starterlib/util';
|
|
2
|
+
import { InjectionToken, Signal, Provider, DestroyRef, Resource, TemplateRef } from '@angular/core';
|
|
3
|
+
import { Ton, Montant, TonSemantique, DateIso, PlageDeDates, DescriptionDeFichier, ChoixDeTheme, Langue, EtatDeBloc } from '@starterlib/util';
|
|
4
4
|
export { ETATS_DE_BLOC, EtatDeBloc } from '@starterlib/util';
|
|
5
|
+
import { ValidationError, FormValueControl, FormCheckboxControl } from '@angular/forms/signals';
|
|
6
|
+
import * as _starterlib_ui from '@starterlib/ui';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* Les textes que les composants portent eux-memes.
|
|
@@ -31,6 +33,7 @@ interface LibellesUi {
|
|
|
31
33
|
/** Valeur technique copiable. */
|
|
32
34
|
readonly copier: string;
|
|
33
35
|
readonly copieEffectuee: string;
|
|
36
|
+
readonly copieImpossible: string;
|
|
34
37
|
/** Valeur masquee. */
|
|
35
38
|
readonly afficher: string;
|
|
36
39
|
readonly masquer: string;
|
|
@@ -42,6 +45,83 @@ interface LibellesUi {
|
|
|
42
45
|
/** Lien sortant, etiquette de retrait, temps relatif. */
|
|
43
46
|
readonly nouvelleFenetre: string;
|
|
44
47
|
readonly retirer: string;
|
|
48
|
+
/** Structure */
|
|
49
|
+
readonly filDAriane: string;
|
|
50
|
+
readonly allerAuContenu: string;
|
|
51
|
+
readonly navigationPrincipale: string;
|
|
52
|
+
/** Transverses */
|
|
53
|
+
readonly theme: string;
|
|
54
|
+
readonly themeSysteme: string;
|
|
55
|
+
readonly themeClair: string;
|
|
56
|
+
readonly themeSombre: string;
|
|
57
|
+
readonly langue: string;
|
|
58
|
+
readonly reessayerDans: (duree: string) => string;
|
|
59
|
+
readonly reessayerMaintenant: string;
|
|
60
|
+
readonly sessionBientotExpiree: string;
|
|
61
|
+
readonly sessionExpireDans: (duree: string) => string;
|
|
62
|
+
readonly resterConnecte: string;
|
|
63
|
+
readonly seDeconnecter: string;
|
|
64
|
+
/** Saisie */
|
|
65
|
+
readonly obligatoire: string;
|
|
66
|
+
readonly champObligatoire: string;
|
|
67
|
+
readonly valeurInvalide: string;
|
|
68
|
+
readonly adresseInvalide: string;
|
|
69
|
+
readonly formatInvalide: string;
|
|
70
|
+
readonly longueurMinimale: (minimum: number) => string;
|
|
71
|
+
readonly longueurMaximale: (maximum: number) => string;
|
|
72
|
+
readonly valeurMinimale: (minimum: string) => string;
|
|
73
|
+
readonly valeurMaximale: (maximum: string) => string;
|
|
74
|
+
readonly caracteresRestants: (restants: number) => string;
|
|
75
|
+
readonly caracteresEnTrop: (enTrop: number) => string;
|
|
76
|
+
readonly erreursACorriger: (nombre: number) => string;
|
|
77
|
+
readonly afficherLeMotDePasse: string;
|
|
78
|
+
readonly codeAChiffres: (longueur: number) => string;
|
|
79
|
+
readonly ibanInvalide: string;
|
|
80
|
+
readonly telephoneInvalide: string;
|
|
81
|
+
readonly exempleDIban: string;
|
|
82
|
+
readonly rechercher: string;
|
|
83
|
+
readonly fermerLeMessage: string;
|
|
84
|
+
/** Montants */
|
|
85
|
+
readonly montantIllisible: (exemple: string) => string;
|
|
86
|
+
readonly tropDeDecimales: (decimales: number) => string;
|
|
87
|
+
readonly deviseDuMontant: (devise: string) => string;
|
|
88
|
+
/** Dates */
|
|
89
|
+
readonly lettreDuJour: string;
|
|
90
|
+
readonly lettreDuMois: string;
|
|
91
|
+
readonly lettreDeLAnnee: string;
|
|
92
|
+
readonly formatDeDate: (motif: string, exemple: string) => string;
|
|
93
|
+
readonly dateIllisible: (motif: string, exemple: string) => string;
|
|
94
|
+
readonly dateTropTot: (date: string) => string;
|
|
95
|
+
readonly dateTropTard: (date: string) => string;
|
|
96
|
+
readonly finAvantDebut: string;
|
|
97
|
+
readonly dateDeDebut: string;
|
|
98
|
+
readonly dateDeFin: string;
|
|
99
|
+
readonly choisirDansLeCalendrier: (champ: string) => string;
|
|
100
|
+
readonly moisPrecedent: string;
|
|
101
|
+
readonly moisSuivant: string;
|
|
102
|
+
readonly aideDuCalendrier: string;
|
|
103
|
+
/** Listes de choix */
|
|
104
|
+
readonly choisir: string;
|
|
105
|
+
readonly nombreDeResultats: (nombre: number) => string;
|
|
106
|
+
readonly nombreDeSelections: (nombre: number) => string;
|
|
107
|
+
readonly retirerLeChoix: (choix: string) => string;
|
|
108
|
+
readonly afficherLesChoix: (champ: string) => string;
|
|
109
|
+
/** Fichiers */
|
|
110
|
+
readonly choisirDesFichiers: string;
|
|
111
|
+
readonly choisirUnFichier: string;
|
|
112
|
+
readonly ouDeposerIci: string;
|
|
113
|
+
readonly aucunFichier: string;
|
|
114
|
+
readonly nombreDeFichiers: (nombre: number) => string;
|
|
115
|
+
readonly retirerLeFichier: (fichier: string) => string;
|
|
116
|
+
readonly fichierTropVolumineux: (fichier: string, taille: string) => string;
|
|
117
|
+
readonly typeDeFichierRefuse: (fichier: string) => string;
|
|
118
|
+
readonly tropDeFichiers: (nombre: number) => string;
|
|
119
|
+
readonly typesAcceptes: (types: string) => string;
|
|
120
|
+
readonly tailleMaximale: (taille: string) => string;
|
|
121
|
+
/** Dialogues */
|
|
122
|
+
readonly confirmer: string;
|
|
123
|
+
readonly annuler: string;
|
|
124
|
+
readonly recopierPourConfirmer: (texte: string) => string;
|
|
45
125
|
readonly aLInstant: string;
|
|
46
126
|
}
|
|
47
127
|
/**
|
|
@@ -53,6 +133,14 @@ interface LibellesUi {
|
|
|
53
133
|
* sous forme de signal — sinon la moitie de l'interface reste en francais quand
|
|
54
134
|
* l'utilisateur passe a l'anglais, et rien ne le signale.
|
|
55
135
|
*/
|
|
136
|
+
/**
|
|
137
|
+
* ⚠️ Les textes AFFICHES portent leurs accents. La regle « sans accents » du
|
|
138
|
+
* depot vise la documentation et les commentaires, jamais ce que lit la
|
|
139
|
+
* personne qui utilise l'application : « Reessayer » ou « Aucun resultat » sont
|
|
140
|
+
* des fautes a l'ecran, et une synthese vocale les prononce de travers. La 0.2.0
|
|
141
|
+
* les a livres ainsi. Les accents s'ecrivent en sequence d'echappement, comme
|
|
142
|
+
* l'apostrophe typographique, pour garder la source en ASCII.
|
|
143
|
+
*/
|
|
56
144
|
declare const LIBELLES_FR: LibellesUi;
|
|
57
145
|
/** Traduction anglaise du meme dictionnaire. La paire est obligatoire. */
|
|
58
146
|
declare const LIBELLES_EN: LibellesUi;
|
|
@@ -143,6 +231,59 @@ declare const REGION_VIVANTE_PARENTE: InjectionToken<true>;
|
|
|
143
231
|
*/
|
|
144
232
|
declare const FUSEAU_PAR_DEFAUT: InjectionToken<string>;
|
|
145
233
|
|
|
234
|
+
/**
|
|
235
|
+
* Texte d'une petite region vivante propre a un composant.
|
|
236
|
+
*
|
|
237
|
+
* ```ts
|
|
238
|
+
* protected readonly annonce = new AnnonceLocale(inject(DestroyRef));
|
|
239
|
+
* // gabarit : <span class="st-vh" aria-live="polite">{{ annonce.texte() }}</span>
|
|
240
|
+
* ```
|
|
241
|
+
*
|
|
242
|
+
* ⚠️ La region doit exister VIDE dans le gabarit des la creation du composant ;
|
|
243
|
+
* cette classe ne gere que son texte.
|
|
244
|
+
*
|
|
245
|
+
* ⚠️ Nee de deux defauts de `st-code` en 0.2.0 : un `onDestroy` enregistre a
|
|
246
|
+
* chaque clic, et une confirmation identique reposee dans la meme tache — la
|
|
247
|
+
* seconde copie n'etait jamais annoncee.
|
|
248
|
+
*/
|
|
249
|
+
declare class AnnonceLocale {
|
|
250
|
+
private readonly contenu;
|
|
251
|
+
private minuteries;
|
|
252
|
+
readonly texte: _angular_core.Signal<string>;
|
|
253
|
+
constructor(destruction: DestroyRef);
|
|
254
|
+
annoncer(message: string): void;
|
|
255
|
+
private arreter;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** Issue d'une copie. */
|
|
259
|
+
type IssueDeCopie = 'copie' | 'indisponible' | 'refusee';
|
|
260
|
+
/**
|
|
261
|
+
* Ecrit un texte dans le presse-papiers.
|
|
262
|
+
*
|
|
263
|
+
* ⚠️ Trois issues, et non deux. `navigator.clipboard` n'existe qu'en contexte
|
|
264
|
+
* securise (HTTPS, ou `localhost`) : absent, c'est `indisponible`. Present, il
|
|
265
|
+
* peut encore refuser — permission, document sans focus — et c'est `refusee`.
|
|
266
|
+
* Confondre les deux conduit a cacher un bouton qui aurait fonctionne au clic
|
|
267
|
+
* suivant, ou a laisser croire qu'une copie a eu lieu.
|
|
268
|
+
*
|
|
269
|
+
* ⚠️ Ce qui entre dans le presse-papiers en sort difficilement : les
|
|
270
|
+
* gestionnaires d'historique le conservent, et la synchronisation entre
|
|
271
|
+
* appareils le propage. Jamais de secret — mot de passe, jeton, code a usage
|
|
272
|
+
* unique — et une donnee sensible seulement a la demande explicite de la
|
|
273
|
+
* personne.
|
|
274
|
+
*/
|
|
275
|
+
declare function copierDansLePressePapiers(document: Document, texte: string): Promise<IssueDeCopie>;
|
|
276
|
+
/** Vrai si le navigateur expose un presse-papiers ecrivable par script. */
|
|
277
|
+
declare function pressePapiersDisponible(document: Document): boolean;
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Formate une duree en secondes : « 45 s », « 2 min 05 s ».
|
|
281
|
+
*
|
|
282
|
+
* Unites courtes de la langue donnee, par `Intl.NumberFormat` : l'ordre, les
|
|
283
|
+
* espaces et les abreviations suivent la locale, sans table maison.
|
|
284
|
+
*/
|
|
285
|
+
declare function formaterDuree(totalEnSecondes: number, locale: string): string;
|
|
286
|
+
|
|
146
287
|
type TailleDIcone = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
147
288
|
/** Une icone prend n'importe quel ton sauf `inverse`, qui vise un fond plein. */
|
|
148
289
|
type TonDIcone = Exclude<Ton, 'inverse'>;
|
|
@@ -160,7 +301,7 @@ type TonDIcone = Exclude<Ton, 'inverse'>;
|
|
|
160
301
|
*/
|
|
161
302
|
declare class StIcon {
|
|
162
303
|
private readonly cheminDuSprite;
|
|
163
|
-
readonly nom: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "
|
|
304
|
+
readonly nom: _angular_core.InputSignal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "triangle-alerte" | "utilisateur">;
|
|
164
305
|
readonly taille: _angular_core.InputSignal<TailleDIcone>;
|
|
165
306
|
readonly ton: _angular_core.InputSignal<TonDIcone>;
|
|
166
307
|
/** `null` : l'icone est decorative et reste muette pour les lecteurs. */
|
|
@@ -179,7 +320,7 @@ declare class StIcon {
|
|
|
179
320
|
* reference `use` vers un identifiant absent ne rend RIEN, sans erreur, et le
|
|
180
321
|
* defaut passe la revue.
|
|
181
322
|
*/
|
|
182
|
-
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"];
|
|
323
|
+
declare const NOMS_DICONE: readonly ["boite-vide", "calendrier", "cercle", "cercle-coche", "cercle-croix", "cercle-info", "chevron-bas", "chevron-droite", "chevron-gauche", "chevron-haut", "coche", "copie", "corbeille", "croix", "fichier", "hors-ligne", "lien-externe", "menu", "oeil", "oeil-barre", "plus", "rafraichir", "recherche", "serveur", "televerser", "triangle-alerte", "utilisateur"];
|
|
183
324
|
type NomDIcone = (typeof NOMS_DICONE)[number];
|
|
184
325
|
|
|
185
326
|
type VarianteDeTexte = 'corps' | 'corps-sm' | 'discret' | 'legende' | 'mono';
|
|
@@ -336,23 +477,34 @@ declare class StButton {
|
|
|
336
477
|
readonly variante: _angular_core.InputSignal<VarianteDeBouton>;
|
|
337
478
|
readonly taille: _angular_core.InputSignal<TailleDeBouton>;
|
|
338
479
|
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" | "
|
|
340
|
-
readonly iconeApres: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "
|
|
480
|
+
readonly iconeAvant: _angular_core.InputSignal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "triangle-alerte" | "utilisateur" | null>;
|
|
481
|
+
readonly iconeApres: _angular_core.InputSignal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "triangle-alerte" | "utilisateur" | null>;
|
|
341
482
|
/**
|
|
342
483
|
* Action en cours. Tant qu'il vaut vrai, les clics sont avales : c'est le
|
|
343
484
|
* mecanisme d'anti double soumission. L'appelant doit le lever DES la
|
|
344
485
|
* soumission, pas a l'arrivee de la reponse.
|
|
345
486
|
*/
|
|
346
487
|
readonly chargement: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
488
|
+
/**
|
|
489
|
+
* L'action existe mais n'est pas disponible : une condition n'est pas encore
|
|
490
|
+
* remplie.
|
|
491
|
+
*
|
|
492
|
+
* ⚠️ `aria-disabled` et NON l'attribut natif `disabled`, qui retire le bouton
|
|
493
|
+
* de l'ordre de tabulation. Une personne au clavier ne l'atteindrait plus, et
|
|
494
|
+
* ne decouvrirait donc jamais la condition qui le bloque — le bouton aurait
|
|
495
|
+
* simplement disparu de son parcours. Ici il reste atteignable, annonce comme
|
|
496
|
+
* indisponible, et ses clics sont avales.
|
|
497
|
+
*/
|
|
498
|
+
readonly indisponible: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
347
499
|
/**
|
|
348
500
|
* Le ton suit le FOND du bouton, et non le bouton en general : sur une
|
|
349
501
|
* variante posee sur la surface (`secondaire`, qui est le defaut, et
|
|
350
502
|
* `discret`), un indicateur en ton inverse tombait a 1,00:1 — invisible.
|
|
351
503
|
*/
|
|
352
|
-
readonly tonDuChargement: _angular_core.Signal<TonDeSpinner>;
|
|
504
|
+
protected readonly tonDuChargement: _angular_core.Signal<TonDeSpinner>;
|
|
353
505
|
constructor();
|
|
354
506
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StButton, never>;
|
|
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>;
|
|
507
|
+
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; }; "indisponible": { "alias": "indisponible"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
356
508
|
}
|
|
357
509
|
|
|
358
510
|
type VarianteDeBoutonIcone = Extract<VarianteDeBouton, 'discret' | 'secondaire' | 'danger'>;
|
|
@@ -364,7 +516,7 @@ type VarianteDeBoutonIcone = Extract<VarianteDeBouton, 'discret' | 'secondaire'
|
|
|
364
516
|
* de facon fiable.
|
|
365
517
|
*/
|
|
366
518
|
declare class StIconButton {
|
|
367
|
-
readonly icone: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "
|
|
519
|
+
readonly icone: _angular_core.InputSignal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "triangle-alerte" | "utilisateur">;
|
|
368
520
|
/** Nom accessible du controle. Sans lui, l'icone ne dit rien. */
|
|
369
521
|
readonly etiquette: _angular_core.InputSignal<string>;
|
|
370
522
|
readonly variante: _angular_core.InputSignal<VarianteDeBoutonIcone>;
|
|
@@ -437,7 +589,6 @@ declare class StButtonGroup {
|
|
|
437
589
|
*/
|
|
438
590
|
declare class StCode {
|
|
439
591
|
private readonly document;
|
|
440
|
-
private readonly destruction;
|
|
441
592
|
private readonly libelles;
|
|
442
593
|
readonly valeur: _angular_core.InputSignal<string>;
|
|
443
594
|
readonly copiable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
@@ -448,9 +599,7 @@ declare class StCode {
|
|
|
448
599
|
protected readonly etiquetteLue: _angular_core.Signal<string>;
|
|
449
600
|
protected readonly libelleCopierLu: _angular_core.Signal<string>;
|
|
450
601
|
readonly copie: _angular_core.OutputEmitterRef<string>;
|
|
451
|
-
|
|
452
|
-
private minuterie;
|
|
453
|
-
protected readonly texteDeConfirmation: _angular_core.Signal<string>;
|
|
602
|
+
protected readonly annonce: AnnonceLocale;
|
|
454
603
|
/**
|
|
455
604
|
* Le bouton n'apparait que si le navigateur sait copier. Sans presse-papiers,
|
|
456
605
|
* un bouton qui ne fait rien vaut moins que la selection manuelle, que la
|
|
@@ -476,7 +625,6 @@ type TypeMasque = 'iban' | 'carte' | 'telephone';
|
|
|
476
625
|
*/
|
|
477
626
|
declare class StMasked {
|
|
478
627
|
private readonly libelles;
|
|
479
|
-
private readonly destruction;
|
|
480
628
|
readonly valeur: _angular_core.InputSignal<string>;
|
|
481
629
|
readonly type: _angular_core.InputSignal<TypeMasque>;
|
|
482
630
|
readonly revele: _angular_core.ModelSignal<boolean>;
|
|
@@ -488,9 +636,14 @@ declare class StMasked {
|
|
|
488
636
|
readonly revelation: _angular_core.OutputEmitterRef<{
|
|
489
637
|
type: TypeMasque;
|
|
490
638
|
}>;
|
|
491
|
-
|
|
492
|
-
|
|
639
|
+
/**
|
|
640
|
+
* ⚠️ Par `AnnonceLocale`, et non par un signal pose directement. La 0.2.0
|
|
641
|
+
* reposait « Valeur masquee a nouveau » a l'identique : aucune mutation, donc
|
|
642
|
+
* une seconde remise en masque jamais annoncee.
|
|
643
|
+
*/
|
|
644
|
+
protected readonly annonce: AnnonceLocale;
|
|
493
645
|
private minuterie;
|
|
646
|
+
constructor();
|
|
494
647
|
protected readonly valeurMasquee: _angular_core.Signal<string>;
|
|
495
648
|
protected readonly valeurAffichee: _angular_core.Signal<string>;
|
|
496
649
|
/**
|
|
@@ -655,7 +808,7 @@ declare class StStatusPill {
|
|
|
655
808
|
readonly statut: _angular_core.InputSignal<string>;
|
|
656
809
|
/** Texte deja traduit par l'appelant : le socle ne traduit rien. */
|
|
657
810
|
readonly libelle: _angular_core.InputSignal<string>;
|
|
658
|
-
readonly icone: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "
|
|
811
|
+
readonly icone: _angular_core.InputSignal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "triangle-alerte" | "utilisateur">;
|
|
659
812
|
readonly ton: _angular_core.InputSignal<TonSemantique>;
|
|
660
813
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StStatusPill, never>;
|
|
661
814
|
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>;
|
|
@@ -748,7 +901,7 @@ declare class StAvatar {
|
|
|
748
901
|
declare class StEmpty {
|
|
749
902
|
readonly titre: _angular_core.InputSignal<string>;
|
|
750
903
|
readonly description: _angular_core.InputSignal<string | null>;
|
|
751
|
-
readonly icone: _angular_core.InputSignal<"boite-vide" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "
|
|
904
|
+
readonly icone: _angular_core.InputSignal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "triangle-alerte" | "utilisateur">;
|
|
752
905
|
readonly niveauDuTitre: _angular_core.InputSignal<NiveauDeTitre>;
|
|
753
906
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StEmpty, never>;
|
|
754
907
|
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>;
|
|
@@ -786,7 +939,7 @@ declare class StError {
|
|
|
786
939
|
protected readonly libelleRejeuLu: _angular_core.Signal<string>;
|
|
787
940
|
protected readonly etiquetteDeTraceLue: _angular_core.Signal<string>;
|
|
788
941
|
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" | "
|
|
942
|
+
protected readonly icone: _angular_core.Signal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "triangle-alerte" | "utilisateur">;
|
|
790
943
|
protected readonly sAnnonce: _angular_core.Signal<boolean>;
|
|
791
944
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StError, never>;
|
|
792
945
|
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>;
|
|
@@ -813,6 +966,1427 @@ declare class StOfflineBanner {
|
|
|
813
966
|
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>;
|
|
814
967
|
}
|
|
815
968
|
|
|
969
|
+
type ReliefDeCarte = 'plat' | 'pose' | 'flottant';
|
|
970
|
+
type RembourrageDeCarte = 'aucun' | 'sm' | 'md' | 'lg';
|
|
971
|
+
/**
|
|
972
|
+
* Surface qui regroupe un contenu.
|
|
973
|
+
*
|
|
974
|
+
* ⚠️ **Elle n'est jamais cliquable en entier**, et c'est un refus delibere. Une
|
|
975
|
+
* carte munie d'un `(click)` produit, pour qui ecoute la page, UN seul controle
|
|
976
|
+
* dont le nom accessible est tout le texte de la carte — titre, montant, date,
|
|
977
|
+
* mention legale d'un trait. Elle est aussi injoignable au clavier sans
|
|
978
|
+
* `tabindex`, qui la ferait alors annoncer deux fois.
|
|
979
|
+
*
|
|
980
|
+
* Le motif correct : un lien ou un bouton unique DANS la carte, etendu
|
|
981
|
+
* visuellement a toute sa surface par la classe `st-carte__lien-etendu`. Le
|
|
982
|
+
* nom accessible reste celui du lien, le clavier fonctionne sans rien ajouter,
|
|
983
|
+
* et la zone cliquable est la meme.
|
|
984
|
+
*
|
|
985
|
+
* ```html
|
|
986
|
+
* <st-card>
|
|
987
|
+
* <st-heading [niveau]="3">
|
|
988
|
+
* <a class="st-carte__lien-etendu" routerLink="/comptes/12">Compte courant</a>
|
|
989
|
+
* </st-heading>
|
|
990
|
+
* <st-money [montant]="solde" />
|
|
991
|
+
* </st-card>
|
|
992
|
+
* ```
|
|
993
|
+
*/
|
|
994
|
+
declare class StCard {
|
|
995
|
+
readonly relief: _angular_core.InputSignal<ReliefDeCarte>;
|
|
996
|
+
readonly rembourrage: _angular_core.InputSignal<RembourrageDeCarte>;
|
|
997
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCard, never>;
|
|
998
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StCard, "st-card", never, { "relief": { "alias": "relief"; "required": false; "isSignal": true; }; "rembourrage": { "alias": "rembourrage"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
/**
|
|
1002
|
+
* Regroupement de contenu, expose comme REPERE de navigation quand il porte un
|
|
1003
|
+
* nom.
|
|
1004
|
+
*
|
|
1005
|
+
* ⚠️ Le point qui decide de tout : `role="region"` n'est expose comme repere
|
|
1006
|
+
* que s'il a un NOM ACCESSIBLE. Sans nom, la plupart des lecteurs d'ecran
|
|
1007
|
+
* l'ignorent purement et simplement — la balise est la, le repere n'existe pas,
|
|
1008
|
+
* et rien ne le signale. Le composant refuse donc de poser le role quand il ne
|
|
1009
|
+
* peut pas le nommer : une section anonyme reste un simple bloc, ce qu'elle est
|
|
1010
|
+
* reellement.
|
|
1011
|
+
*
|
|
1012
|
+
* Deux facons de la nommer, et la seconde vaut mieux : `titreDe` pointe le
|
|
1013
|
+
* titre deja affiche, ce qui garde un seul texte a traduire et a maintenir.
|
|
1014
|
+
*
|
|
1015
|
+
* ```html
|
|
1016
|
+
* <st-heading [niveau]="2" identifiant="titre-operations">Operations</st-heading>
|
|
1017
|
+
* <st-section titreDe="titre-operations">…</st-section>
|
|
1018
|
+
* ```
|
|
1019
|
+
*/
|
|
1020
|
+
declare class StSection {
|
|
1021
|
+
/** Nom accessible ecrit a la main. A preferer `titreDe` quand un titre existe. */
|
|
1022
|
+
readonly etiquette: _angular_core.InputSignal<string | null>;
|
|
1023
|
+
/** Identifiant du titre qui nomme la section. Prime sur `etiquette`. */
|
|
1024
|
+
readonly titreDe: _angular_core.InputSignal<string | null>;
|
|
1025
|
+
readonly espacement: _angular_core.InputSignal<"sm" | "md" | "lg" | "aucun">;
|
|
1026
|
+
protected readonly estUnRepere: _angular_core.Signal<boolean>;
|
|
1027
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSection, never>;
|
|
1028
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSection, "st-section", never, { "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "titreDe": { "alias": "titreDe"; "required": false; "isSignal": true; }; "espacement": { "alias": "espacement"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
type OrientationDeSeparateur = 'horizontale' | 'verticale';
|
|
1032
|
+
/**
|
|
1033
|
+
* Trait de separation.
|
|
1034
|
+
*
|
|
1035
|
+
* ⚠️ **Decoratif par defaut, et c'est le bon defaut.** Un `<hr>` porte le role
|
|
1036
|
+
* `separator` de facon implicite, que les lecteurs d'ecran annoncent. Sur une
|
|
1037
|
+
* page qui en compte huit — ce qui est courant dans une liste de reglages — la
|
|
1038
|
+
* lecture est ponctuee de huit « separateur » qui n'apprennent rien.
|
|
1039
|
+
*
|
|
1040
|
+
* Le role ne se pose que lorsque le trait porte vraiment du sens : il separe
|
|
1041
|
+
* alors deux GROUPES que rien d'autre ne distingue, comme les sections d'un
|
|
1042
|
+
* menu. Regle de tri : si le retirer ne retire aucune information, il est
|
|
1043
|
+
* decoratif.
|
|
1044
|
+
*/
|
|
1045
|
+
declare class StDivider {
|
|
1046
|
+
readonly orientation: _angular_core.InputSignal<OrientationDeSeparateur>;
|
|
1047
|
+
/** Le trait separe deux groupes distincts, et doit donc etre annonce. */
|
|
1048
|
+
readonly porteurDeSens: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1049
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDivider, never>;
|
|
1050
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StDivider, "st-divider", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "porteurDeSens": { "alias": "porteurDeSens"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/**
|
|
1054
|
+
* Titre de page : le `h1`, et les actions qui lui sont attachees.
|
|
1055
|
+
*
|
|
1056
|
+
* ⚠️ Il rend une **vraie balise `h1`**, la ou `st-heading` porte
|
|
1057
|
+
* `role="heading"` sur son hote. La raison est precise : `StNavigation` de
|
|
1058
|
+
* `@starterlib/core` vise le titre de niveau 1 pour y poser le focus apres une
|
|
1059
|
+
* navigation, et une vraie balise est ce que trouvent aussi les extensions, le
|
|
1060
|
+
* mode lecture et les outils d'audit. Un `h1` par page, jamais deux.
|
|
1061
|
+
*
|
|
1062
|
+
* ⚠️ **Il ne gere PAS le focus**, et ce n'est pas un oubli. Le noyau le fait
|
|
1063
|
+
* deja a chaque changement de route. Deux mecanismes qui deplacent le focus a
|
|
1064
|
+
* la meme milliseconde ne se completent pas : ils se battent, et le gagnant
|
|
1065
|
+
* depend de l'ordre de rendu — donc du hasard.
|
|
1066
|
+
*
|
|
1067
|
+
* ```html
|
|
1068
|
+
* <st-page-title>
|
|
1069
|
+
* Mes operations
|
|
1070
|
+
* <button stButton variante="primaire" actions>Exporter</button>
|
|
1071
|
+
* </st-page-title>
|
|
1072
|
+
* ```
|
|
1073
|
+
*/
|
|
1074
|
+
declare class StPageTitle {
|
|
1075
|
+
/** Texte secondaire sous le titre. Jamais porteur d'information critique. */
|
|
1076
|
+
readonly precision: _angular_core.InputSignal<string | null>;
|
|
1077
|
+
/** Cible d'un `aria-labelledby` : une region se nomme par son titre. */
|
|
1078
|
+
readonly identifiant: _angular_core.InputSignal<string | null>;
|
|
1079
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StPageTitle, never>;
|
|
1080
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StPageTitle, "st-page-title", never, { "precision": { "alias": "precision"; "required": false; "isSignal": true; }; "identifiant": { "alias": "identifiant"; "required": false; "isSignal": true; }; }, {}, never, ["*", "[actions]"], true, never>;
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
/** Un maillon du fil. Sans `lien`, il n'est pas cliquable. */
|
|
1084
|
+
interface MaillonDeFil {
|
|
1085
|
+
readonly libelle: string;
|
|
1086
|
+
/**
|
|
1087
|
+
* Chemin INTERNE de l'application, suivi par le routeur.
|
|
1088
|
+
*
|
|
1089
|
+
* ⚠️ Jamais une adresse externe : un fil d'Ariane decrit ou l'on se trouve
|
|
1090
|
+
* dans CETTE application. Passe par le routeur, un domaine tiers n'est pas
|
|
1091
|
+
* une destination possible.
|
|
1092
|
+
*/
|
|
1093
|
+
readonly lien?: string;
|
|
1094
|
+
}
|
|
1095
|
+
/**
|
|
1096
|
+
* Fil d'Ariane.
|
|
1097
|
+
*
|
|
1098
|
+
* ⚠️ **Le dernier maillon n'est pas un lien.** C'est la page courante : un lien
|
|
1099
|
+
* vers l'endroit ou l'on se trouve deja n'apporte rien, et il ajoute un arret
|
|
1100
|
+
* de tabulation sur chaque page du site. Il porte `aria-current="page"`, qui
|
|
1101
|
+
* est ce que le lecteur d'ecran annonce a sa place.
|
|
1102
|
+
*
|
|
1103
|
+
* ⚠️ **Les separateurs sont poses en `aria-hidden`.** Un chevron ou une barre
|
|
1104
|
+
* oblique laisses dans l'arbre d'accessibilite se lit « barre oblique » entre
|
|
1105
|
+
* chaque maillon : « Accueil barre oblique Comptes barre oblique Operations ».
|
|
1106
|
+
* Les poser en contenu engendre par CSS ne suffit pas — Chrome et Firefox
|
|
1107
|
+
* exposent `content` a l'arbre d'accessibilite.
|
|
1108
|
+
*
|
|
1109
|
+
* ⚠️ La liste est ORDONNEE (`ol`) : l'ordre des maillons est l'information.
|
|
1110
|
+
*
|
|
1111
|
+
* ⚠️ **Les liens passent par le routeur.** La premiere version posait des
|
|
1112
|
+
* `href` bruts : dans une SPA, un clic quittait l'application, repassait par la
|
|
1113
|
+
* coquille du BFF et perdait tout l'etat en memoire — sur le composant de
|
|
1114
|
+
* navigation le plus clique apres le menu.
|
|
1115
|
+
*/
|
|
1116
|
+
declare class StBreadcrumb {
|
|
1117
|
+
private readonly libelles;
|
|
1118
|
+
readonly maillons: _angular_core.InputSignal<readonly MaillonDeFil[]>;
|
|
1119
|
+
/** `null` : le texte vient du dictionnaire de l'application. */
|
|
1120
|
+
readonly etiquette: _angular_core.InputSignal<string | null>;
|
|
1121
|
+
/** Caractere de separation. Muet pour les technologies d'assistance. */
|
|
1122
|
+
readonly separateur: _angular_core.InputSignal<string>;
|
|
1123
|
+
protected readonly etiquetteLue: _angular_core.Signal<string>;
|
|
1124
|
+
/** Le dernier maillon est la page courante, jamais un lien. */
|
|
1125
|
+
protected readonly derniereIndice: _angular_core.Signal<number>;
|
|
1126
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StBreadcrumb, never>;
|
|
1127
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StBreadcrumb, "st-breadcrumb", never, { "maillons": { "alias": "maillons"; "required": true; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "separateur": { "alias": "separateur"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
/** Identifiant par defaut du contenu principal, pose par `st-app-shell`. */
|
|
1131
|
+
declare const IDENTIFIANT_DU_CONTENU_PRINCIPAL = "contenu-principal";
|
|
1132
|
+
/**
|
|
1133
|
+
* Lien d'evitement : aller au contenu sans traverser la navigation.
|
|
1134
|
+
*
|
|
1135
|
+
* WCAG 2.4.1. Sans lui, chaque page impose a qui navigue au clavier de
|
|
1136
|
+
* traverser l'en-tete et tout le menu avant d'atteindre ce qu'il est venu lire —
|
|
1137
|
+
* trente arrets de tabulation, a chaque changement de page.
|
|
1138
|
+
*
|
|
1139
|
+
* ⚠️ **Le focus est pose par script, et la navigation par ancre est annulee.**
|
|
1140
|
+
* Deux raisons, et chacune suffit :
|
|
1141
|
+
*
|
|
1142
|
+
* 1. Un `href="#contenu"` se resout contre `<base href>`. Sous
|
|
1143
|
+
* `/ui/<interface>/`, il vise `/ui/<interface>/#contenu` : un rechargement
|
|
1144
|
+
* complet de la coquille, au lieu d'un saut dans la page.
|
|
1145
|
+
* 2. Suivre une ancre deplace la vue sans toujours deplacer le FOCUS. La
|
|
1146
|
+
* tabulation suivante repart alors du lien d'evitement, et le saut n'a servi
|
|
1147
|
+
* a rien.
|
|
1148
|
+
*
|
|
1149
|
+
* Le `href` reste pose : c'est lui qui fait du lien un lien, pour le lecteur
|
|
1150
|
+
* d'ecran comme pour le clic du milieu.
|
|
1151
|
+
*
|
|
1152
|
+
* ⚠️ Il doit etre le PREMIER element focalisable du document. Le composant ne
|
|
1153
|
+
* peut pas l'imposer ; `st-app-shell` le fait.
|
|
1154
|
+
*/
|
|
1155
|
+
declare class StSkipLink {
|
|
1156
|
+
private readonly document;
|
|
1157
|
+
private readonly libelles;
|
|
1158
|
+
/** Identifiant de l'element a atteindre. */
|
|
1159
|
+
readonly cible: _angular_core.InputSignal<string>;
|
|
1160
|
+
/** `null` : le texte vient du dictionnaire de l'application. */
|
|
1161
|
+
readonly libelle: _angular_core.InputSignal<string | null>;
|
|
1162
|
+
protected readonly libelleLu: _angular_core.Signal<string>;
|
|
1163
|
+
protected readonly ancre: _angular_core.Signal<string>;
|
|
1164
|
+
protected aller(evenement: MouseEvent): void;
|
|
1165
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSkipLink, never>;
|
|
1166
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSkipLink, "st-skip-link", never, { "cible": { "alias": "cible"; "required": false; "isSignal": true; }; "libelle": { "alias": "libelle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
/**
|
|
1170
|
+
* Coquille d'une application : lien d'evitement, en-tete, navigation, contenu
|
|
1171
|
+
* principal, pied de page.
|
|
1172
|
+
*
|
|
1173
|
+
* ```html
|
|
1174
|
+
* <st-app-shell>
|
|
1175
|
+
* <ng-container entete>…</ng-container>
|
|
1176
|
+
* <ng-container navigation>…</ng-container>
|
|
1177
|
+
* <router-outlet />
|
|
1178
|
+
* <ng-container pied>…</ng-container>
|
|
1179
|
+
* </st-app-shell>
|
|
1180
|
+
* ```
|
|
1181
|
+
*
|
|
1182
|
+
* ⚠️ Son role est de garantir les REPERES, et un seul de chaque. Une page qui
|
|
1183
|
+
* compte deux `main` — frequent quand une micro-SPA pose le sien dans celui de
|
|
1184
|
+
* la coquille — prive le lecteur d'ecran du raccourci « aller au contenu
|
|
1185
|
+
* principal » : il ne sait plus lequel viser. Les remotes ne posent donc
|
|
1186
|
+
* jamais de `main`, `header` ni `footer` de premier niveau.
|
|
1187
|
+
*
|
|
1188
|
+
* ⚠️ Le lien d'evitement est rendu EN PREMIER, avant l'en-tete : c'est la seule
|
|
1189
|
+
* place ou il sert. Place apres, il faut deja avoir traverse ce qu'il permet
|
|
1190
|
+
* d'eviter.
|
|
1191
|
+
*
|
|
1192
|
+
* Le contenu principal porte l'identifiant vise par le lien d'evitement.
|
|
1193
|
+
* Le focus de navigation, lui, vise le titre de niveau 1 : voir `StNavigation`
|
|
1194
|
+
* de `@starterlib/core`. Les deux se completent — l'un au chargement d'une
|
|
1195
|
+
* page, l'autre a chaque changement de route.
|
|
1196
|
+
*
|
|
1197
|
+
* ⚠️ La coquille ne pose PAS de `<nav>` autour de la navigation : c'est
|
|
1198
|
+
* `st-sidenav` qui porte ce repere. Pose ici aussi, il s'imbriquerait — le
|
|
1199
|
+
* lecteur d'ecran annoncerait « navigation, navigation » — et resterait vide
|
|
1200
|
+
* sur petit ecran, quand le contenu part dans le tiroir.
|
|
1201
|
+
*/
|
|
1202
|
+
declare class StAppShell {
|
|
1203
|
+
protected readonly identifiantDuContenu = "contenu-principal";
|
|
1204
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StAppShell, never>;
|
|
1205
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StAppShell, "st-app-shell", never, {}, {}, never, ["[entete]", "[navigation]", "*", "[pied]"], true, never>;
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
/**
|
|
1209
|
+
* Contenu de l'en-tete : bouton de navigation, marque, puis actions.
|
|
1210
|
+
*
|
|
1211
|
+
* ```html
|
|
1212
|
+
* <st-app-shell>
|
|
1213
|
+
* <st-header entete>
|
|
1214
|
+
* <button bascule stButton [stSidenavToggle]="navigation">Menu</button>
|
|
1215
|
+
* <a marque routerLink="/"><st-logo nom="Banque Exemple" clair="/logo.svg" /></a>
|
|
1216
|
+
* <st-lang-switch [courante]="langue.courante()" (choisie)="langue.changer($event)" />
|
|
1217
|
+
* <button stButton [stMenuTrigger]="compte">Mon compte</button>
|
|
1218
|
+
* </st-header>
|
|
1219
|
+
* </st-app-shell>
|
|
1220
|
+
* ```
|
|
1221
|
+
*
|
|
1222
|
+
* ⚠️ **Aucun repere pose ici.** Le `header` de `st-app-shell` est deja le
|
|
1223
|
+
* repere « banniere » ; en ajouter un second dans le premier ferait annoncer
|
|
1224
|
+
* deux bannieres.
|
|
1225
|
+
*
|
|
1226
|
+
* ⚠️ **Composition, pas assemblage.** Il ne cree ni menu, ni bascule, ni logo :
|
|
1227
|
+
* il les place. C'est ce qui le garde dans le tronc — importer `st-menu` l'aurait
|
|
1228
|
+
* fait sortir vers un point d'entree secondaire — et qui laisse chaque SPA
|
|
1229
|
+
* choisir ses actions.
|
|
1230
|
+
*
|
|
1231
|
+
* L'ordre du DOM est l'ordre de lecture et de tabulation : bouton de
|
|
1232
|
+
* navigation, marque, actions. Il n'est jamais inverse par le style.
|
|
1233
|
+
*/
|
|
1234
|
+
declare class StHeader {
|
|
1235
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StHeader, never>;
|
|
1236
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StHeader, "st-header", never, {}, {}, never, ["[bascule]", "[marque]", "*"], true, never>;
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
type TonDeBanniere = TonSemantique;
|
|
1240
|
+
/**
|
|
1241
|
+
* Message de page, persistant jusqu'a ce qu'on le ferme.
|
|
1242
|
+
*
|
|
1243
|
+
* Distinct de `st-offline-banner`, qui dit un fait qu'on ne peut pas fermer, et
|
|
1244
|
+
* de `st-error`, qui remplace un contenu au lieu de l'accompagner.
|
|
1245
|
+
*
|
|
1246
|
+
* ⚠️ **Elle est une region vivante, et ce n'est pas redondant au chargement.**
|
|
1247
|
+
* Un lecteur d'ecran annonce les MUTATIONS d'une region qu'il observe deja :
|
|
1248
|
+
* une banniere presente des l'affichage est lue avec la page, une fois, puis
|
|
1249
|
+
* son apparition ulterieure est annoncee. Le meme mecanisme sert les deux cas.
|
|
1250
|
+
*
|
|
1251
|
+
* ⚠️ Le ton `danger` passe en `alert` (assertif) : une operation qui vient
|
|
1252
|
+
* d'echouer doit interrompre. Les autres restent en `status`, sinon une
|
|
1253
|
+
* confirmation couperait la lecture en cours et ferait perdre sa place.
|
|
1254
|
+
*
|
|
1255
|
+
* ⚠️ Comme `st-spinner` et `st-error`, elle se tait dans une region vivante
|
|
1256
|
+
* existante : sans cela, le lecteur annonce deux fois le meme message.
|
|
1257
|
+
*/
|
|
1258
|
+
declare class StBanner {
|
|
1259
|
+
private readonly element;
|
|
1260
|
+
private readonly regionParente;
|
|
1261
|
+
private readonly libelles;
|
|
1262
|
+
readonly ton: _angular_core.InputSignal<TonSemantique>;
|
|
1263
|
+
readonly message: _angular_core.InputSignal<string>;
|
|
1264
|
+
/** Titre court au-dessus du message. Le message seul suffit le plus souvent. */
|
|
1265
|
+
readonly titre: _angular_core.InputSignal<string | null>;
|
|
1266
|
+
readonly fermable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1267
|
+
/** `null` : le texte vient du dictionnaire de l'application. */
|
|
1268
|
+
readonly libelleFermeture: _angular_core.InputSignal<string | null>;
|
|
1269
|
+
readonly ferme: _angular_core.OutputEmitterRef<void>;
|
|
1270
|
+
protected readonly icone: _angular_core.Signal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "triangle-alerte" | "utilisateur">;
|
|
1271
|
+
protected readonly libelleFermetureLu: _angular_core.Signal<string>;
|
|
1272
|
+
protected readonly roleLu: _angular_core.Signal<"status" | "alert" | null>;
|
|
1273
|
+
/**
|
|
1274
|
+
* ⚠️ Le focus est DEPLACE avant l'emission. Sans cela, le bouton disparait
|
|
1275
|
+
* sous le doigt de l'utilisateur clavier, le focus retombe sur le corps du
|
|
1276
|
+
* document, et la navigation repart du haut de la page — le meme defaut que
|
|
1277
|
+
* sur une liste d'etiquettes, et l'un des plus frequents.
|
|
1278
|
+
*/
|
|
1279
|
+
protected fermer(): void;
|
|
1280
|
+
/**
|
|
1281
|
+
* Cible, dans l'ordre : le premier element focalisable qui SUIT la banniere
|
|
1282
|
+
* dans le document, sinon le dernier qui la precede, sinon le conteneur s'il
|
|
1283
|
+
* est focalisable par script.
|
|
1284
|
+
*
|
|
1285
|
+
* ⚠️ L'ordre du DOCUMENT, et non les descendants du voisin. La premiere
|
|
1286
|
+
* version cherchait dans `nextElementSibling` : un bouton pose directement
|
|
1287
|
+
* apres la banniere n'etait pas trouve, puisqu'il n'est pas son propre
|
|
1288
|
+
* descendant, et le focus retombait sur le corps du document.
|
|
1289
|
+
*/
|
|
1290
|
+
private deplacerLeFocus;
|
|
1291
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StBanner, never>;
|
|
1292
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StBanner, "st-banner", never, { "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": true; "isSignal": true; }; "titre": { "alias": "titre"; "required": false; "isSignal": true; }; "fermable": { "alias": "fermable"; "required": false; "isSignal": true; }; "libelleFermeture": { "alias": "libelleFermeture"; "required": false; "isSignal": true; }; }, { "ferme": "ferme"; }, never, ["*"], true, never>;
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
type TonDeMessage = TonSemantique;
|
|
1296
|
+
/**
|
|
1297
|
+
* Message court attache a une zone precise : une aide sous un champ, une
|
|
1298
|
+
* consequence sous un choix, une contrainte au-dessus d'un bouton.
|
|
1299
|
+
*
|
|
1300
|
+
* Distinct de `st-banner`, qui parle de la PAGE et se ferme.
|
|
1301
|
+
*
|
|
1302
|
+
* ⚠️ **Aucun role, aucune region vivante**, et c'est la difference qui compte.
|
|
1303
|
+
* Un message en ligne est lu quand on atteint l'endroit auquel il se rattache ;
|
|
1304
|
+
* en faire une region vivante le ferait annoncer hors contexte, et une
|
|
1305
|
+
* vingtaine de champs produiraient vingt annonces a l'ouverture de l'ecran.
|
|
1306
|
+
*
|
|
1307
|
+
* ⚠️ Pour une erreur de SAISIE, ce composant ne suffit pas : le champ doit
|
|
1308
|
+
* porter `aria-describedby` vers l'identifiant du message, sans quoi le lien
|
|
1309
|
+
* entre les deux n'existe que visuellement. C'est `st-form-field` de la
|
|
1310
|
+
* vague 3 qui posera ce lien.
|
|
1311
|
+
*/
|
|
1312
|
+
declare class StInlineMessage {
|
|
1313
|
+
readonly ton: _angular_core.InputSignal<TonSemantique>;
|
|
1314
|
+
/** Cible d'un `aria-describedby` pose par le champ decrit. */
|
|
1315
|
+
readonly identifiant: _angular_core.InputSignal<string | null>;
|
|
1316
|
+
protected readonly icone: _angular_core.Signal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "triangle-alerte" | "utilisateur">;
|
|
1317
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StInlineMessage, never>;
|
|
1318
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StInlineMessage, "st-inline-message", never, { "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "identifiant": { "alias": "identifiant"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
/**
|
|
1322
|
+
* Forme minimale d'une erreur de validation, telle que Signal Forms la rend :
|
|
1323
|
+
* un genre, et parfois un message.
|
|
1324
|
+
*
|
|
1325
|
+
* Structurelle, pour ne pas importer `@angular/forms` a l'execution (audit de la
|
|
1326
|
+
* vague 3, V3-1). Les proprietes propres a chaque genre — `minLength`, `max`… —
|
|
1327
|
+
* se lisent par leur nom.
|
|
1328
|
+
*/
|
|
1329
|
+
interface ErreurAffichable {
|
|
1330
|
+
readonly kind: string;
|
|
1331
|
+
readonly message?: string;
|
|
1332
|
+
}
|
|
1333
|
+
/**
|
|
1334
|
+
* Le texte d'une erreur, dans la langue courante.
|
|
1335
|
+
*
|
|
1336
|
+
* ⚠️ **Un `message` fourni l'emporte toujours.** Un validateur metier, ou une
|
|
1337
|
+
* erreur du serveur deja traduite, en sait plus que le genre : « IBAN d'un pays
|
|
1338
|
+
* non pris en charge » vaut mieux que « Le format n'est pas valide ».
|
|
1339
|
+
*
|
|
1340
|
+
* ⚠️ **Un genre inconnu rend un message generique, jamais le genre brut.**
|
|
1341
|
+
* Afficher `ibanChecksum` a une personne qui saisit un IBAN, c'est lui montrer le
|
|
1342
|
+
* code source.
|
|
1343
|
+
*
|
|
1344
|
+
* La locale sert aux messages qui citent un format, une date ou une taille : « au
|
|
1345
|
+
* format jj/mm/aaaa » n'est pas « mm/dd/yyyy ».
|
|
1346
|
+
*/
|
|
1347
|
+
declare function messageDErreur(erreur: ErreurAffichable, libelles: LibellesUi, locale?: string): string;
|
|
1348
|
+
/** Le motif a taper dans la langue courante : `jj/mm/aaaa`. */
|
|
1349
|
+
declare function motifLocal(libelles: LibellesUi, locale: string): string;
|
|
1350
|
+
/**
|
|
1351
|
+
* Un jour superieur a 12 : « 31/03/2026 » montre sans ambiguite ou va le jour,
|
|
1352
|
+
* ce que « 01/02/2026 » ne dit pas.
|
|
1353
|
+
*/
|
|
1354
|
+
declare function exempleDeDate(locale: string): string;
|
|
1355
|
+
/**
|
|
1356
|
+
* Erreur d'IBAN, a brancher sur un schema :
|
|
1357
|
+
*
|
|
1358
|
+
* ```ts
|
|
1359
|
+
* validate(chemin.iban, ({ value }) => erreurIban(value()));
|
|
1360
|
+
* ```
|
|
1361
|
+
*
|
|
1362
|
+
* Une fonction pure plutot qu'une regle toute faite : fournir la regle
|
|
1363
|
+
* importerait `validate` d'`@angular/forms` A L'EXECUTION, et le socle ne
|
|
1364
|
+
* l'importe que pour ses types (audit de la vague 3, V3-1).
|
|
1365
|
+
*
|
|
1366
|
+
* ⚠️ Confort de saisie, jamais controle (SEC-5) : le serveur revalide. Un champ
|
|
1367
|
+
* vide n'est pas « invalide » ici — c'est `required` qui le dit, avec le bon
|
|
1368
|
+
* message.
|
|
1369
|
+
*/
|
|
1370
|
+
declare function erreurIban(valeur: string): ErreurAffichable | null;
|
|
1371
|
+
/**
|
|
1372
|
+
* Erreur de FORME d'un numero de telephone : chiffres, `+` de tete facultatif,
|
|
1373
|
+
* de 4 a 15 chiffres — la longueur maximale d'un numero international (E.164).
|
|
1374
|
+
*
|
|
1375
|
+
* ```ts
|
|
1376
|
+
* validate(chemin.telephone, ({ value }) => erreurTelephone(value()));
|
|
1377
|
+
* ```
|
|
1378
|
+
*
|
|
1379
|
+
* ⚠️ Une forme valide ne dit pas que le numero existe : seul le serveur le sait.
|
|
1380
|
+
* Un champ vide n'est pas une erreur de forme : l'obligation est une autre regle.
|
|
1381
|
+
*/
|
|
1382
|
+
declare function erreurTelephone(valeur: string): ErreurAffichable | null;
|
|
1383
|
+
/** Bornes d'une date, en ISO. Absente : pas de borne. */
|
|
1384
|
+
interface BornesDeDate {
|
|
1385
|
+
readonly min?: DateIso | null;
|
|
1386
|
+
readonly max?: DateIso | null;
|
|
1387
|
+
}
|
|
1388
|
+
/**
|
|
1389
|
+
* Erreur de bornes d'une date, a brancher sur un schema :
|
|
1390
|
+
*
|
|
1391
|
+
* ```ts
|
|
1392
|
+
* validate(chemin.naissance, ({ value }) => erreurDate(value(), { max: aujourdHui }));
|
|
1393
|
+
* ```
|
|
1394
|
+
*
|
|
1395
|
+
* Les bornes du schema et celles passees au calendrier doivent etre les memes :
|
|
1396
|
+
* le calendrier grise, le schema refuse une date tapee a la main.
|
|
1397
|
+
*/
|
|
1398
|
+
declare function erreurDate(valeur: DateIso | null, bornes: BornesDeDate): ErreurAffichable | null;
|
|
1399
|
+
/** Une fin anterieure au debut. Une borne manquante n'est pas une erreur de plage. */
|
|
1400
|
+
declare function erreurPlageDeDates(plage: PlageDeDates): ErreurAffichable | null;
|
|
1401
|
+
/** Regles de `st-file-upload`, les memes que ses entrees. */
|
|
1402
|
+
interface ReglesDeFichiers {
|
|
1403
|
+
/** Attribut `accept` : `.pdf, image/*`. */
|
|
1404
|
+
readonly accept?: string;
|
|
1405
|
+
/** En octets. */
|
|
1406
|
+
readonly tailleMax?: number;
|
|
1407
|
+
readonly nombreMax?: number;
|
|
1408
|
+
}
|
|
1409
|
+
/**
|
|
1410
|
+
* Erreurs d'une liste de fichiers, une par fichier refuse, pour dire LEQUEL :
|
|
1411
|
+
*
|
|
1412
|
+
* ```ts
|
|
1413
|
+
* validate(chemin.pieces, ({ value }) => erreursDeFichiers(value(), regles));
|
|
1414
|
+
* ```
|
|
1415
|
+
*
|
|
1416
|
+
* ⚠️ Confort, jamais securite (SEC-5) : le type se deduit de l'extension, et le
|
|
1417
|
+
* serveur relit le contenu.
|
|
1418
|
+
*/
|
|
1419
|
+
declare function erreursDeFichiers(fichiers: readonly DescriptionDeFichier[], regles: ReglesDeFichiers): ErreurAffichable[];
|
|
1420
|
+
/**
|
|
1421
|
+
* Erreurs a afficher par un champ qui LIT sa saisie (`transformedValue`) : celles
|
|
1422
|
+
* du formulaire, plus les erreurs de lecture qu'il ne connait pas encore.
|
|
1423
|
+
*
|
|
1424
|
+
* ⚠️ Relie a un formulaire, un champ recoit ses erreurs de lecture DANS `errors`,
|
|
1425
|
+
* par Signal Forms. Employe seul, par `[(value)]`, il ne les recoit nulle part :
|
|
1426
|
+
* sans cette fusion, « 12,5,3 » s'afficherait sans le moindre message. Une erreur
|
|
1427
|
+
* deja presente — meme genre, meme partie — n'est pas repetee.
|
|
1428
|
+
*/
|
|
1429
|
+
declare function fusionnerErreurs(formulaire: readonly ValidationError.WithOptionalFieldTree[], lecture: readonly ValidationError.WithoutFieldTree[]): readonly ErreurAffichable[];
|
|
1430
|
+
|
|
1431
|
+
/** Elements natifs qui portent la saisie d'un champ du socle. */
|
|
1432
|
+
type ElementDeSaisie = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;
|
|
1433
|
+
/**
|
|
1434
|
+
* Base des champs du socle : le contrat Signal Forms, ecrit une fois — tout sauf
|
|
1435
|
+
* `value`, dont le type depend du champ (texte, montant, date).
|
|
1436
|
+
*
|
|
1437
|
+
* ⚠️ **Une base, et non une copie par champ.** Neuf membres de contrat recopies
|
|
1438
|
+
* dans six composants, c'est six occasions d'en oublier un — et l'oubli ne se
|
|
1439
|
+
* voit pas : un champ sans `touched` n'affiche jamais ses erreurs, un champ sans
|
|
1440
|
+
* reflet de `hidden` ne se masque pas, et rien n'echoue.
|
|
1441
|
+
*
|
|
1442
|
+
* Les noms restent anglais : voir le glossaire, § 8.
|
|
1443
|
+
*
|
|
1444
|
+
* Le gabarit du champ doit nommer son element natif `#champ`, et le brancher sur
|
|
1445
|
+
* `touch` a la perte du focus.
|
|
1446
|
+
*/
|
|
1447
|
+
declare abstract class ContratDeChamp {
|
|
1448
|
+
readonly libelle: _angular_core.InputSignal<string>;
|
|
1449
|
+
readonly aide: _angular_core.InputSignal<string | null>;
|
|
1450
|
+
readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
|
|
1451
|
+
readonly touched: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1452
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1453
|
+
readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1454
|
+
readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1455
|
+
readonly hidden: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1456
|
+
readonly name: _angular_core.InputSignal<string>;
|
|
1457
|
+
readonly touch: _angular_core.OutputEmitterRef<void>;
|
|
1458
|
+
private readonly champ;
|
|
1459
|
+
/** Appele par Signal Forms pour amener le focus sur un champ en erreur. */
|
|
1460
|
+
focus(options?: FocusOptions): void;
|
|
1461
|
+
protected texteSaisi(evenement: Event): string;
|
|
1462
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ContratDeChamp, never>;
|
|
1463
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ContratDeChamp, never, never, { "libelle": { "alias": "libelle"; "required": true; "isSignal": true; }; "aide": { "alias": "aide"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "touch": "touch"; }, never, never, true, never>;
|
|
1464
|
+
}
|
|
1465
|
+
/** Base des champs dont la valeur est le texte saisi. */
|
|
1466
|
+
declare abstract class ControleDeSaisie extends ContratDeChamp implements FormValueControl<string> {
|
|
1467
|
+
readonly value: _angular_core.ModelSignal<string>;
|
|
1468
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ControleDeSaisie, never>;
|
|
1469
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ControleDeSaisie, never, never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
/**
|
|
1473
|
+
* `empilee` : etiquette au-dessus du controle, pour un champ texte.
|
|
1474
|
+
* `case` : controle AVANT son etiquette, pour une case a cocher ou un interrupteur.
|
|
1475
|
+
*/
|
|
1476
|
+
type DispositionDeChamp = 'empilee' | 'case';
|
|
1477
|
+
/**
|
|
1478
|
+
* Etiquette, aide, erreur et controle d'un champ de saisie — et le cablage qui
|
|
1479
|
+
* les relie.
|
|
1480
|
+
*
|
|
1481
|
+
* ⚠️ **Le SEUL endroit ou ce cablage existe** (audit de la vague 3, V3-2). Chaque
|
|
1482
|
+
* champ du socle l'emploie au lieu de refaire identifiants, `aria-describedby` et
|
|
1483
|
+
* `aria-invalid` : c'est precisement le code que l'on croit fini et qui se perd,
|
|
1484
|
+
* un champ specialise a la fois.
|
|
1485
|
+
*
|
|
1486
|
+
* L'ordre visuel suit celui de la lecture : etiquette, aide, erreur, controle.
|
|
1487
|
+
* L'erreur est AU-DESSUS du controle, pour etre vue avant de retaper.
|
|
1488
|
+
*
|
|
1489
|
+
* ⚠️ **L'erreur n'est pas une region vivante.** Annoncee a la perte du focus, elle
|
|
1490
|
+
* couperait la lecture du champ suivant, ou la personne est deja passee. Elle est
|
|
1491
|
+
* reliee au controle, donc lue quand on y revient ; a l'envoi, c'est le
|
|
1492
|
+
* recapitulatif d'erreurs qui prend le focus et les enumere.
|
|
1493
|
+
*/
|
|
1494
|
+
declare class StFormField {
|
|
1495
|
+
private readonly libelles;
|
|
1496
|
+
private readonly locale;
|
|
1497
|
+
private readonly element;
|
|
1498
|
+
/**
|
|
1499
|
+
* ⚠️ OBLIGATOIRE et toujours visible (UX-1). Un texte indicatif ne le remplace
|
|
1500
|
+
* jamais : il disparait a la premiere frappe.
|
|
1501
|
+
*/
|
|
1502
|
+
readonly libelle: _angular_core.InputSignal<string>;
|
|
1503
|
+
/** Aide permanente : format attendu, exemple. Lue apres l'etiquette. */
|
|
1504
|
+
readonly aide: _angular_core.InputSignal<string | null>;
|
|
1505
|
+
/** Texte complementaire tenu a jour par le controle, comme un compteur. */
|
|
1506
|
+
readonly complement: _angular_core.InputSignal<string | null>;
|
|
1507
|
+
readonly erreurs: _angular_core.InputSignal<readonly ErreurAffichable[]>;
|
|
1508
|
+
/**
|
|
1509
|
+
* ⚠️ Faux tant que la personne n'a pas quitte le champ ou tente l'envoi (UX-3) :
|
|
1510
|
+
* un formulaire vierge couvert d'erreurs accuse avant qu'on ait rien fait.
|
|
1511
|
+
*/
|
|
1512
|
+
readonly afficherErreurs: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1513
|
+
readonly obligatoire: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1514
|
+
/**
|
|
1515
|
+
* ⚠️ Change l'ordre VISUEL, jamais celui du document : l'etiquette reste
|
|
1516
|
+
* reliee par `for`, et l'ordre de tabulation ne passe que par le controle.
|
|
1517
|
+
*/
|
|
1518
|
+
readonly disposition: _angular_core.InputSignal<DispositionDeChamp>;
|
|
1519
|
+
/**
|
|
1520
|
+
* Etiquette lue mais non affichee.
|
|
1521
|
+
*
|
|
1522
|
+
* ⚠️ Reservee a la RECHERCHE, ou l'icone, le bouton et la position en tete de
|
|
1523
|
+
* page disent deja le but du champ. Partout ailleurs, une etiquette masquee est
|
|
1524
|
+
* l'etiquette qui manque au moment ou l'on tape (UX-1).
|
|
1525
|
+
*/
|
|
1526
|
+
readonly libelleMasque: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1527
|
+
/** Identifiants du champ, lus par `stControleDeChamp` et par le gabarit. */
|
|
1528
|
+
readonly identifiants: {
|
|
1529
|
+
readonly controle: string;
|
|
1530
|
+
readonly libelle: `${string}-libelle`;
|
|
1531
|
+
readonly aide: `${string}-aide`;
|
|
1532
|
+
readonly complement: `${string}-complement`;
|
|
1533
|
+
readonly erreur: `${string}-erreur`;
|
|
1534
|
+
};
|
|
1535
|
+
protected readonly libelleObligatoire: _angular_core.Signal<string>;
|
|
1536
|
+
/** Messages a afficher, dans la langue courante. Vide tant qu'ils ne doivent pas l'etre. */
|
|
1537
|
+
protected readonly messages: _angular_core.Signal<string[]>;
|
|
1538
|
+
/**
|
|
1539
|
+
* Un clic sur l'etiquette d'un controle non natif n'y mene pas de lui-meme :
|
|
1540
|
+
* on y amene le focus, comme le navigateur le fait pour un champ natif.
|
|
1541
|
+
*/
|
|
1542
|
+
protected focaliserLeControle(): void;
|
|
1543
|
+
/** Lu par le controle pour `aria-invalid`. */
|
|
1544
|
+
readonly enErreur: _angular_core.Signal<boolean>;
|
|
1545
|
+
/**
|
|
1546
|
+
* ⚠️ Seuls les elements PRESENTS sont references : un `aria-describedby` qui
|
|
1547
|
+
* vise un identifiant absent est ignore par certains lecteurs d'ecran — tout
|
|
1548
|
+
* entier, y compris les references valides qui l'accompagnent.
|
|
1549
|
+
*/
|
|
1550
|
+
readonly descriptions: _angular_core.Signal<string | null>;
|
|
1551
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StFormField, never>;
|
|
1552
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StFormField, "st-form-field", never, { "libelle": { "alias": "libelle"; "required": true; "isSignal": true; }; "aide": { "alias": "aide"; "required": false; "isSignal": true; }; "complement": { "alias": "complement"; "required": false; "isSignal": true; }; "erreurs": { "alias": "erreurs"; "required": false; "isSignal": true; }; "afficherErreurs": { "alias": "afficherErreurs"; "required": false; "isSignal": true; }; "obligatoire": { "alias": "obligatoire"; "required": false; "isSignal": true; }; "disposition": { "alias": "disposition"; "required": false; "isSignal": true; }; "libelleMasque": { "alias": "libelleMasque"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
1553
|
+
}
|
|
1554
|
+
/**
|
|
1555
|
+
* Pose sur l'element natif d'un champ le cablage de son `st-form-field` :
|
|
1556
|
+
* identifiant, description, invalidite, obligation.
|
|
1557
|
+
*
|
|
1558
|
+
* ⚠️ `aria-required` et NON l'attribut `required` natif. Le natif declenche la
|
|
1559
|
+
* validation du navigateur a l'envoi : une bulle « Veuillez renseigner ce champ »
|
|
1560
|
+
* dans la langue du NAVIGATEUR, pas dans celle de l'application, et qui double
|
|
1561
|
+
* le message du socle.
|
|
1562
|
+
*/
|
|
1563
|
+
declare class StControleDeChamp {
|
|
1564
|
+
protected readonly champ: StFormField;
|
|
1565
|
+
/**
|
|
1566
|
+
* ⚠️ `label for` n'etiquette que les elements natifs de formulaire. Le
|
|
1567
|
+
* declencheur d'une selection multiple est un `div` de role `combobox` : sans
|
|
1568
|
+
* `aria-labelledby`, il n'aurait aucun nom, et l'etiquette visible ne dirait
|
|
1569
|
+
* rien au lecteur d'ecran.
|
|
1570
|
+
*/
|
|
1571
|
+
protected readonly etiquetable: boolean;
|
|
1572
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StControleDeChamp, never>;
|
|
1573
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StControleDeChamp, "[stControleDeChamp]", never, {}, {}, never, never, true, never>;
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
type TypeDeSaisie = 'text' | 'email' | 'tel' | 'url' | 'search';
|
|
1577
|
+
/**
|
|
1578
|
+
* Champ de saisie d'une ligne, integre a Signal Forms.
|
|
1579
|
+
*
|
|
1580
|
+
* ```html
|
|
1581
|
+
* <st-input libelle="Nom du beneficiaire" autocomplete="name" [formField]="virement.beneficiaire" />
|
|
1582
|
+
* <!-- ou, sans formulaire : -->
|
|
1583
|
+
* <st-input libelle="Reference" [(value)]="reference" />
|
|
1584
|
+
* ```
|
|
1585
|
+
*
|
|
1586
|
+
* ⚠️ **Contrat Signal Forms, noms anglais.** `value`, `errors`, `touched`,
|
|
1587
|
+
* `disabled`… sont cherches PAR LEUR NOM par la directive `[formField]` : les
|
|
1588
|
+
* traduire romprait l'integration sans la moindre erreur (audit de la vague 3,
|
|
1589
|
+
* V3-1). L'import d'`@angular/forms` est un import de TYPE : aucun code n'entre
|
|
1590
|
+
* dans le paquet.
|
|
1591
|
+
*
|
|
1592
|
+
* ⚠️ **Pas d'attribut `maxlength` natif.** Il TRONQUE en silence un texte colle
|
|
1593
|
+
* trop long : la personne croit avoir saisi sa reference entiere, et n'en envoie
|
|
1594
|
+
* que le debut. La limite passe par la validation, qui DIT le depassement.
|
|
1595
|
+
*/
|
|
1596
|
+
declare class StInput extends ControleDeSaisie {
|
|
1597
|
+
readonly type: _angular_core.InputSignal<TypeDeSaisie>;
|
|
1598
|
+
/**
|
|
1599
|
+
* WCAG 1.3.5 : identifie le but du champ, pour le remplissage automatique et les
|
|
1600
|
+
* aides techniques. `null` : laisse le navigateur decider.
|
|
1601
|
+
*/
|
|
1602
|
+
readonly autocomplete: _angular_core.InputSignal<string | null>;
|
|
1603
|
+
/** Clavier virtuel adapte : `numeric`, `decimal`, `email`… */
|
|
1604
|
+
readonly inputmode: _angular_core.InputSignal<string | null>;
|
|
1605
|
+
protected surSaisie(evenement: Event): void;
|
|
1606
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StInput, never>;
|
|
1607
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StInput, "st-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "inputmode": { "alias": "inputmode"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1608
|
+
}
|
|
1609
|
+
|
|
1610
|
+
/**
|
|
1611
|
+
* Zone de texte, integree a Signal Forms, avec compteur quand une longueur
|
|
1612
|
+
* maximale est fixee.
|
|
1613
|
+
*
|
|
1614
|
+
* ⚠️ **Le compteur n'est pas annonce a chaque frappe** : une region vivante qui
|
|
1615
|
+
* change a chaque caractere recouvre ce que la personne tape. Il est RELIE a la
|
|
1616
|
+
* zone — donc lu quand on y revient — et seuls les seuils (20, 10, 0 restants)
|
|
1617
|
+
* et le depassement s'annoncent (UX-11).
|
|
1618
|
+
*
|
|
1619
|
+
* ⚠️ **Pas de `maxlength` natif**, meme raison que `st-input` : un texte colle
|
|
1620
|
+
* serait tronque en silence. Le compteur affiche le depassement, la validation
|
|
1621
|
+
* le refuse.
|
|
1622
|
+
*/
|
|
1623
|
+
declare class StTextarea extends ControleDeSaisie {
|
|
1624
|
+
private readonly libelles;
|
|
1625
|
+
readonly lignes: _angular_core.InputSignal<number>;
|
|
1626
|
+
/** Contrat Signal Forms : la longueur maximale fixee par le schema. */
|
|
1627
|
+
readonly maxLength: _angular_core.InputSignal<number | undefined>;
|
|
1628
|
+
protected readonly annonce: AnnonceLocale;
|
|
1629
|
+
private readonly restants;
|
|
1630
|
+
protected readonly compteur: _angular_core.Signal<string | null>;
|
|
1631
|
+
constructor();
|
|
1632
|
+
protected surSaisie(evenement: Event): void;
|
|
1633
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTextarea, never>;
|
|
1634
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StTextarea, "st-textarea", never, { "lignes": { "alias": "lignes"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1635
|
+
}
|
|
1636
|
+
|
|
1637
|
+
/**
|
|
1638
|
+
* Groupe de controles, nomme par sa QUESTION.
|
|
1639
|
+
*
|
|
1640
|
+
* ⚠️ `fieldset` et `legend` natifs (UX-7). Sans legende, un lecteur d'ecran
|
|
1641
|
+
* annonce « Oui, bouton radio » et « Non, bouton radio » : la reponse, jamais la
|
|
1642
|
+
* question. La legende est lue a l'entree dans le groupe.
|
|
1643
|
+
*
|
|
1644
|
+
* C'est le pendant de `st-form-field` pour un GROUPE : l'aide et l'erreur sont
|
|
1645
|
+
* reliees au `fieldset` par `aria-describedby`, et l'erreur porte sur le groupe
|
|
1646
|
+
* entier — « Choisissez un mode de reglement » — et non sur chaque option.
|
|
1647
|
+
*
|
|
1648
|
+
* ⚠️ L'obligation se dit dans la legende, en texte : `aria-required` n'est pas
|
|
1649
|
+
* valide sur un groupe, et `required` natif ferait parler le navigateur dans sa
|
|
1650
|
+
* propre langue.
|
|
1651
|
+
*/
|
|
1652
|
+
declare class StFieldset {
|
|
1653
|
+
private readonly libelles;
|
|
1654
|
+
private readonly locale;
|
|
1655
|
+
/** La question posee par le groupe. Obligatoire. */
|
|
1656
|
+
readonly legende: _angular_core.InputSignal<string>;
|
|
1657
|
+
readonly aide: _angular_core.InputSignal<string | null>;
|
|
1658
|
+
readonly erreurs: _angular_core.InputSignal<readonly ErreurAffichable[]>;
|
|
1659
|
+
readonly afficherErreurs: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1660
|
+
readonly obligatoire: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1661
|
+
private readonly base;
|
|
1662
|
+
protected readonly identifiantAide: string;
|
|
1663
|
+
protected readonly identifiantErreur: string;
|
|
1664
|
+
protected readonly libelleObligatoire: _angular_core.Signal<string>;
|
|
1665
|
+
protected readonly messages: _angular_core.Signal<string[]>;
|
|
1666
|
+
protected readonly enErreur: _angular_core.Signal<boolean>;
|
|
1667
|
+
protected readonly descriptions: _angular_core.Signal<string | null>;
|
|
1668
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StFieldset, never>;
|
|
1669
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StFieldset, "st-fieldset", never, { "legende": { "alias": "legende"; "required": true; "isSignal": true; }; "aide": { "alias": "aide"; "required": false; "isSignal": true; }; "erreurs": { "alias": "erreurs"; "required": false; "isSignal": true; }; "afficherErreurs": { "alias": "afficherErreurs"; "required": false; "isSignal": true; }; "obligatoire": { "alias": "obligatoire"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
1670
|
+
}
|
|
1671
|
+
|
|
1672
|
+
/**
|
|
1673
|
+
* Case a cocher, integree a Signal Forms.
|
|
1674
|
+
*
|
|
1675
|
+
* ```html
|
|
1676
|
+
* <st-checkbox libelle="J'accepte les conditions generales" [formField]="inscription.conditions" />
|
|
1677
|
+
* ```
|
|
1678
|
+
*
|
|
1679
|
+
* Un element `input type="checkbox"` natif : Espace coche, l'etat est annonce,
|
|
1680
|
+
* et la case suit le reglage de contraste du systeme sans rien ecrire.
|
|
1681
|
+
*
|
|
1682
|
+
* ⚠️ **Pour un choix a envoyer avec un formulaire.** Un reglage qui s'applique
|
|
1683
|
+
* IMMEDIATEMENT est un `st-switch` : la case promet un effet a l'envoi, et
|
|
1684
|
+
* l'interrupteur un effet tout de suite (UX-8).
|
|
1685
|
+
*/
|
|
1686
|
+
declare class StCheckbox implements FormCheckboxControl {
|
|
1687
|
+
readonly libelle: _angular_core.InputSignal<string>;
|
|
1688
|
+
readonly aide: _angular_core.InputSignal<string | null>;
|
|
1689
|
+
/** Contrat Signal Forms. */
|
|
1690
|
+
readonly checked: _angular_core.ModelSignal<boolean>;
|
|
1691
|
+
readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
|
|
1692
|
+
readonly touched: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1693
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1694
|
+
readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1695
|
+
readonly hidden: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1696
|
+
readonly name: _angular_core.InputSignal<string>;
|
|
1697
|
+
readonly touch: _angular_core.OutputEmitterRef<void>;
|
|
1698
|
+
private readonly champ;
|
|
1699
|
+
focus(options?: FocusOptions): void;
|
|
1700
|
+
protected surChangement(evenement: Event): void;
|
|
1701
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCheckbox, never>;
|
|
1702
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StCheckbox, "st-checkbox", never, { "libelle": { "alias": "libelle"; "required": true; "isSignal": true; }; "aide": { "alias": "aide"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touch": "touch"; }, never, never, true, never>;
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
/** Une option du groupe. */
|
|
1706
|
+
interface OptionRadio {
|
|
1707
|
+
readonly valeur: string;
|
|
1708
|
+
readonly libelle: string;
|
|
1709
|
+
/** Precision sous le libelle, reliee a l'option. */
|
|
1710
|
+
readonly aide?: string;
|
|
1711
|
+
readonly desactivee?: boolean;
|
|
1712
|
+
}
|
|
1713
|
+
/**
|
|
1714
|
+
* Groupe de boutons radio, integre a Signal Forms.
|
|
1715
|
+
*
|
|
1716
|
+
* ```html
|
|
1717
|
+
* <st-radio-group legende="Mode de reglement" [options]="modes" [formField]="commande.mode" />
|
|
1718
|
+
* ```
|
|
1719
|
+
*
|
|
1720
|
+
* ⚠️ **De vrais boutons radio natifs** : un seul arret de tabulation pour le
|
|
1721
|
+
* groupe, deplacement aux fleches, « 2 sur 3 » annonce. Les recrire en ARIA,
|
|
1722
|
+
* c'est cent lignes pour obtenir moins bien — meme raison que `st-theme-toggle`.
|
|
1723
|
+
*
|
|
1724
|
+
* ⚠️ **L'erreur porte sur le groupe**, par `st-fieldset`, et non sur chaque option :
|
|
1725
|
+
* « Choisissez un mode de reglement », une fois.
|
|
1726
|
+
*
|
|
1727
|
+
* `touch` n'est emis que lorsque le focus QUITTE le groupe : passer d'une option a
|
|
1728
|
+
* l'autre aux fleches n'est pas une fin de saisie, et l'erreur n'a pas a surgir
|
|
1729
|
+
* pendant qu'on choisit.
|
|
1730
|
+
*/
|
|
1731
|
+
declare class StRadioGroup implements FormValueControl<string> {
|
|
1732
|
+
private readonly element;
|
|
1733
|
+
readonly legende: _angular_core.InputSignal<string>;
|
|
1734
|
+
readonly aide: _angular_core.InputSignal<string | null>;
|
|
1735
|
+
readonly options: _angular_core.InputSignal<readonly OptionRadio[]>;
|
|
1736
|
+
/** Contrat Signal Forms. */
|
|
1737
|
+
readonly value: _angular_core.ModelSignal<string>;
|
|
1738
|
+
readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
|
|
1739
|
+
readonly touched: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1740
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1741
|
+
readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1742
|
+
readonly hidden: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1743
|
+
readonly name: _angular_core.InputSignal<string>;
|
|
1744
|
+
readonly touch: _angular_core.OutputEmitterRef<void>;
|
|
1745
|
+
/** Nom partage par les options : sans lui, chaque radio forme son propre groupe. */
|
|
1746
|
+
private readonly nomParDefaut;
|
|
1747
|
+
protected nomDuGroupe(): string;
|
|
1748
|
+
protected identifiantAide(indice: number): string;
|
|
1749
|
+
/** Focus sur l'option cochee, sinon la premiere disponible : c'est l'arret du groupe. */
|
|
1750
|
+
focus(options?: FocusOptions): void;
|
|
1751
|
+
protected choisir(valeur: string): void;
|
|
1752
|
+
protected aLaSortie(evenement: FocusEvent): void;
|
|
1753
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StRadioGroup, never>;
|
|
1754
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StRadioGroup, "st-radio-group", never, { "legende": { "alias": "legende"; "required": true; "isSignal": true; }; "aide": { "alias": "aide"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
/**
|
|
1758
|
+
* Interrupteur : un reglage qui s'applique IMMEDIATEMENT.
|
|
1759
|
+
*
|
|
1760
|
+
* ```html
|
|
1761
|
+
* <st-switch libelle="Notifications par SMS" [(checked)]="sms" (checkedChange)="enregistrer($event)" />
|
|
1762
|
+
* ```
|
|
1763
|
+
*
|
|
1764
|
+
* ⚠️ **Jamais dans un formulaire a envoyer** (UX-8). Un interrupteur promet que
|
|
1765
|
+
* l'effet a lieu au basculement ; pose au-dessus d'un bouton « Enregistrer », il
|
|
1766
|
+
* ment — la personne croit le reglage applique, quitte la page, et le perd. Pour
|
|
1767
|
+
* un choix envoye plus tard, c'est `st-checkbox`.
|
|
1768
|
+
*
|
|
1769
|
+
* C'est pourquoi il n'affiche aucune erreur de validation : un reglage immediat
|
|
1770
|
+
* ne se valide pas a l'envoi. Un refus du serveur se dit par un message, et
|
|
1771
|
+
* l'interrupteur revient a son etat precedent.
|
|
1772
|
+
*
|
|
1773
|
+
* ⚠️ Une case a cocher native avec `role="switch"` : Espace bascule, l'etiquette
|
|
1774
|
+
* est reliee par `for`, et le lecteur d'ecran annonce « active » ou
|
|
1775
|
+
* « desactive » — mieux qu'un `div` qui imiterait tout cela.
|
|
1776
|
+
*/
|
|
1777
|
+
declare class StSwitch implements FormCheckboxControl {
|
|
1778
|
+
readonly libelle: _angular_core.InputSignal<string>;
|
|
1779
|
+
readonly aide: _angular_core.InputSignal<string | null>;
|
|
1780
|
+
/** Contrat Signal Forms. */
|
|
1781
|
+
readonly checked: _angular_core.ModelSignal<boolean>;
|
|
1782
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1783
|
+
readonly hidden: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1784
|
+
readonly name: _angular_core.InputSignal<string>;
|
|
1785
|
+
readonly touch: _angular_core.OutputEmitterRef<void>;
|
|
1786
|
+
private readonly champ;
|
|
1787
|
+
focus(options?: FocusOptions): void;
|
|
1788
|
+
protected surChangement(evenement: Event): void;
|
|
1789
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSwitch, never>;
|
|
1790
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSwitch, "st-switch", never, { "libelle": { "alias": "libelle"; "required": true; "isSignal": true; }; "aide": { "alias": "aide"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "touch": "touch"; }, never, never, true, never>;
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
/** Une ligne du recapitulatif. */
|
|
1794
|
+
interface LigneDErreur {
|
|
1795
|
+
readonly libelle: string | null;
|
|
1796
|
+
readonly message: string;
|
|
1797
|
+
readonly aller: () => void;
|
|
1798
|
+
}
|
|
1799
|
+
/**
|
|
1800
|
+
* Recapitulatif des erreurs d'un formulaire, a l'envoi.
|
|
1801
|
+
*
|
|
1802
|
+
* ```html
|
|
1803
|
+
* <st-error-summary [erreurs]="tentative() ? virement().errorSummary() : []" />
|
|
1804
|
+
* ```
|
|
1805
|
+
*
|
|
1806
|
+
* ⚠️ **Il prend le focus en apparaissant** (UX-5). Sans lui, une personne au
|
|
1807
|
+
* clavier ou au lecteur d'ecran appuie sur « Envoyer », et rien ne se passe : le
|
|
1808
|
+
* champ refuse est en haut de la page, hors de sa vue, et personne ne le lui dit.
|
|
1809
|
+
*
|
|
1810
|
+
* ⚠️ **Chaque ligne nomme son champ.** « Ce champ est obligatoire. » repete cinq
|
|
1811
|
+
* fois n'apprend rien ; « Nom du beneficiaire : ce champ est obligatoire. », si.
|
|
1812
|
+
* Le libelle est lu sur l'element lie au champ, par Signal Forms — sans registre,
|
|
1813
|
+
* et quel que soit le composant.
|
|
1814
|
+
*
|
|
1815
|
+
* ⚠️ **Une ligne par champ**, la premiere erreur seulement : trois erreurs sur le
|
|
1816
|
+
* meme IBAN font trois lignes pour une seule correction.
|
|
1817
|
+
*
|
|
1818
|
+
* ⚠️ **Une region nommee par son titre.** Un `div` sans role ne PEUT pas porter
|
|
1819
|
+
* `aria-labelledby` : le nom serait ignore, et le focus n'annoncerait rien. En
|
|
1820
|
+
* region, il annonce « 2 erreurs a corriger » a l'arrivee du focus, et se
|
|
1821
|
+
* retrouve dans la liste des reperes.
|
|
1822
|
+
*
|
|
1823
|
+
* Chaque ligne amene le focus sur son champ : c'est le champ, et non la ligne,
|
|
1824
|
+
* qu'il faut corriger. Une erreur rattachee au formulaire entier — un refus du
|
|
1825
|
+
* serveur sur un champ inconnu — s'affiche sans lien.
|
|
1826
|
+
*/
|
|
1827
|
+
declare class StErrorSummary {
|
|
1828
|
+
private readonly libelles;
|
|
1829
|
+
private readonly locale;
|
|
1830
|
+
private readonly element;
|
|
1831
|
+
private readonly injecteur;
|
|
1832
|
+
readonly erreurs: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
|
|
1833
|
+
/** `null` : « N erreurs a corriger », du dictionnaire. */
|
|
1834
|
+
readonly titre: _angular_core.InputSignal<string | null>;
|
|
1835
|
+
/** Unique par instance : deux recapitulatifs sur une page partageraient leur titre. */
|
|
1836
|
+
protected readonly identifiantDuTitre: string;
|
|
1837
|
+
protected readonly lignes: _angular_core.Signal<readonly LigneDErreur[]>;
|
|
1838
|
+
protected readonly titreLu: _angular_core.Signal<string>;
|
|
1839
|
+
constructor();
|
|
1840
|
+
/** A appeler apres un envoi refuse, quand le recapitulatif etait deja visible. */
|
|
1841
|
+
focus(): void;
|
|
1842
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StErrorSummary, never>;
|
|
1843
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StErrorSummary, "st-error-summary", never, { "erreurs": { "alias": "erreurs"; "required": true; "isSignal": true; }; "titre": { "alias": "titre"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1844
|
+
}
|
|
1845
|
+
|
|
1846
|
+
/** `connexion` : un mot de passe existant. `creation` : un nouveau. */
|
|
1847
|
+
type UsageDuMotDePasse = 'connexion' | 'creation';
|
|
1848
|
+
/**
|
|
1849
|
+
* Mot de passe, avec revelation.
|
|
1850
|
+
*
|
|
1851
|
+
* ```html
|
|
1852
|
+
* <st-password-field libelle="Mot de passe" usage="creation" [regles]="regles" [formField]="compte.motDePasse" />
|
|
1853
|
+
* ```
|
|
1854
|
+
*
|
|
1855
|
+
* ⚠️ **`autocomplete` selon l'usage** (SEC-2) : `current-password` a la connexion,
|
|
1856
|
+
* `new-password` a la creation — c'est ce qui fait proposer par le gestionnaire
|
|
1857
|
+
* un mot de passe FORT au bon endroit, et non l'ancien.
|
|
1858
|
+
*
|
|
1859
|
+
* ⚠️ **Le collage n'est jamais bloque** (SEC-1, NIST SP 800-63B) : l'interdire
|
|
1860
|
+
* pousse vers des mots de passe courts, retenus de tete, et casse les
|
|
1861
|
+
* gestionnaires de mots de passe.
|
|
1862
|
+
*
|
|
1863
|
+
* ⚠️ **Revele, il se remasque des que le focus quitte le champ, et a l'envoi du
|
|
1864
|
+
* formulaire** (SEC-4) : un mot de passe laisse en clair reste lisible par-dessus
|
|
1865
|
+
* l'epaule, sur l'ecran suivant comme sur celui-ci. L'envoi par Entree ne fait
|
|
1866
|
+
* pas quitter le champ : d'ou l'ecoute de `submit`, qui remonte jusqu'au document.
|
|
1867
|
+
*
|
|
1868
|
+
* Le bouton de revelation est un bouton bascule : `aria-pressed` porte l'etat, et
|
|
1869
|
+
* l'etiquette ne change PAS — « Masquer le mot de passe, enfonce » se lirait
|
|
1870
|
+
* comme une double negation.
|
|
1871
|
+
*
|
|
1872
|
+
* ⚠️ **Aucun indicateur de « force »**, et c'est un refus. Une estimation faite
|
|
1873
|
+
* dans le navigateur donne « fort » a `Motdepasse1!` : elle rassure a tort. Les
|
|
1874
|
+
* regles sont affichees AVANT la saisie (UX-10), et c'est le serveur qui verifie —
|
|
1875
|
+
* y compris contre les mots de passe deja divulgues, qu'aucune regle locale ne
|
|
1876
|
+
* voit.
|
|
1877
|
+
*/
|
|
1878
|
+
declare class StPasswordField extends ControleDeSaisie {
|
|
1879
|
+
protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
|
|
1880
|
+
private readonly element;
|
|
1881
|
+
readonly usage: _angular_core.InputSignal<UsageDuMotDePasse>;
|
|
1882
|
+
/** Regles affichees avant la saisie, comme aide du champ. */
|
|
1883
|
+
readonly regles: _angular_core.InputSignal<readonly string[]>;
|
|
1884
|
+
protected readonly revele: _angular_core.WritableSignal<boolean>;
|
|
1885
|
+
protected readonly autocomplete: _angular_core.Signal<"current-password" | "new-password">;
|
|
1886
|
+
protected readonly aideLue: _angular_core.Signal<string | null>;
|
|
1887
|
+
protected basculer(): void;
|
|
1888
|
+
protected surSaisie(evenement: Event): void;
|
|
1889
|
+
protected aLEnvoi(evenement: Event): void;
|
|
1890
|
+
protected aLaSortie(evenement: FocusEvent): void;
|
|
1891
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StPasswordField, never>;
|
|
1892
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StPasswordField, "st-password-field", never, { "usage": { "alias": "usage"; "required": false; "isSignal": true; }; "regles": { "alias": "regles"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1893
|
+
}
|
|
1894
|
+
|
|
1895
|
+
/**
|
|
1896
|
+
* Code a usage unique : second facteur, code recu par SMS ou par courriel.
|
|
1897
|
+
*
|
|
1898
|
+
* ⚠️ **UN seul champ, pas six cases** (UX-9). Six champs cassent le collage, le
|
|
1899
|
+
* remplissage automatique du code recu par SMS, et la lecture au lecteur d'ecran,
|
|
1900
|
+
* qui annonce six champs sans nom au lieu d'un seul.
|
|
1901
|
+
*
|
|
1902
|
+
* ⚠️ `autocomplete="one-time-code"` : iOS et Android proposent alors le code recu,
|
|
1903
|
+
* d'un toucher. Clavier numerique par `inputmode`, et NON par `type="number"`,
|
|
1904
|
+
* qui retire les zeros de tete et accepte « 1e5 ».
|
|
1905
|
+
*
|
|
1906
|
+
* ⚠️ **Aucun envoi automatique** a la sixieme saisie : un formulaire qui part de
|
|
1907
|
+
* lui-meme surprend (WCAG 3.2.2), et part aussi avec un code mal colle. Le code
|
|
1908
|
+
* colle est nettoye de ses espaces et tirets — « 123 456 » —, jamais tronque.
|
|
1909
|
+
*/
|
|
1910
|
+
declare class StOtpField extends ControleDeSaisie {
|
|
1911
|
+
private readonly libelles;
|
|
1912
|
+
readonly longueur: _angular_core.InputSignal<number>;
|
|
1913
|
+
protected readonly aideLue: _angular_core.Signal<string>;
|
|
1914
|
+
protected surSaisie(evenement: Event): void;
|
|
1915
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StOtpField, never>;
|
|
1916
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StOtpField, "st-otp-field", never, { "longueur": { "alias": "longueur"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1917
|
+
}
|
|
1918
|
+
|
|
1919
|
+
/**
|
|
1920
|
+
* Champ de recherche : un repere, un champ, un bouton.
|
|
1921
|
+
*
|
|
1922
|
+
* ```html
|
|
1923
|
+
* <st-search-field libelle="Rechercher un beneficiaire" (recherche)="filtrer($event)" />
|
|
1924
|
+
* ```
|
|
1925
|
+
*
|
|
1926
|
+
* ⚠️ **Un repere `search`** : la recherche se retrouve dans la liste des reperes du
|
|
1927
|
+
* lecteur d'ecran, a cote de la navigation et du contenu.
|
|
1928
|
+
*
|
|
1929
|
+
* L'etiquette est lue sans etre affichee — seule exception au socle (UX-1) : la
|
|
1930
|
+
* loupe, le bouton et la position disent deja le but du champ.
|
|
1931
|
+
*
|
|
1932
|
+
* ⚠️ **Jamais dans l'adresse quand le terme est personnel** (SEC-6). Chercher un
|
|
1933
|
+
* nom, un IBAN ou un numero en `?q=` inscrit la donnee dans l'historique, dans les
|
|
1934
|
+
* journaux des intermediaires, et dans l'en-tete `Referer` des pages suivantes.
|
|
1935
|
+
* `recherche` emet le terme : c'est a l'appelant de ne pas le mettre dans l'URL.
|
|
1936
|
+
*/
|
|
1937
|
+
declare class StSearchField extends ControleDeSaisie {
|
|
1938
|
+
protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
|
|
1939
|
+
/** Emis a la validation — Entree ou bouton —, et non a chaque frappe. */
|
|
1940
|
+
readonly recherche: _angular_core.OutputEmitterRef<string>;
|
|
1941
|
+
protected surSaisie(evenement: Event): void;
|
|
1942
|
+
protected lancer(evenement?: Event): void;
|
|
1943
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSearchField, never>;
|
|
1944
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSearchField, "st-search-field", never, {}, { "recherche": "recherche"; }, never, never, true, never>;
|
|
1945
|
+
}
|
|
1946
|
+
|
|
1947
|
+
/**
|
|
1948
|
+
* IBAN. La valeur du modele est NORMALISEE — sans espaces, en majuscules —, et
|
|
1949
|
+
* l'affichage groupe par quatre.
|
|
1950
|
+
*
|
|
1951
|
+
* ```html
|
|
1952
|
+
* <st-iban-field libelle="IBAN du beneficiaire" [formField]="virement.iban" />
|
|
1953
|
+
* <!-- schema : validate(chemin.iban, ({ value }) => erreurIban(value())) -->
|
|
1954
|
+
* ```
|
|
1955
|
+
*
|
|
1956
|
+
* ⚠️ **Le groupement se fait a la sortie du champ, jamais pendant la frappe.**
|
|
1957
|
+
* Reformater a chaque caractere deplace le curseur a la fin : corriger une
|
|
1958
|
+
* erreur au milieu de 27 caracteres devient impossible, chaque frappe renvoyant a
|
|
1959
|
+
* la fin de la ligne.
|
|
1960
|
+
*
|
|
1961
|
+
* ⚠️ **Aucune verification de validite ici** : elle appartient au schema, par
|
|
1962
|
+
* `erreurIban`, pour s'afficher au bon moment et par le bon canal. Et elle reste un
|
|
1963
|
+
* confort (SEC-5) : le serveur revalide.
|
|
1964
|
+
*
|
|
1965
|
+
* `autocapitalize="characters"` et correction orthographique coupee : un IBAN
|
|
1966
|
+
* n'est pas un mot, et une correction automatique le fausserait.
|
|
1967
|
+
*/
|
|
1968
|
+
declare class StIbanField extends ControleDeSaisie {
|
|
1969
|
+
private readonly libelles;
|
|
1970
|
+
private readonly enSaisie;
|
|
1971
|
+
private readonly brut;
|
|
1972
|
+
protected readonly aideLue: _angular_core.Signal<string>;
|
|
1973
|
+
/**
|
|
1974
|
+
* Brut pendant la saisie ; groupe par quatre au repos. Une valeur changee de
|
|
1975
|
+
* l'exterieur pendant la saisie — remise a zero du formulaire — l'emporte sur
|
|
1976
|
+
* le brut, qui ne la represente plus.
|
|
1977
|
+
*/
|
|
1978
|
+
protected readonly affichage: _angular_core.Signal<string>;
|
|
1979
|
+
protected auFocus(): void;
|
|
1980
|
+
protected surSaisie(evenement: Event): void;
|
|
1981
|
+
protected aLaSortie(): void;
|
|
1982
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StIbanField, never>;
|
|
1983
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StIbanField, "st-iban-field", never, {}, {}, never, never, true, never>;
|
|
1984
|
+
}
|
|
1985
|
+
|
|
1986
|
+
/** `tel` : numero complet, indicatif compris. `tel-national` : sans indicatif. */
|
|
1987
|
+
type RemplissageDeTelephone = 'tel' | 'tel-national';
|
|
1988
|
+
/**
|
|
1989
|
+
* Numero de telephone. La valeur du modele ne garde que les chiffres et le `+` de
|
|
1990
|
+
* tete ; la saisie s'affiche telle qu'elle a ete tapee.
|
|
1991
|
+
*
|
|
1992
|
+
* ```html
|
|
1993
|
+
* <st-phone-field libelle="Telephone portable" [formField]="contact.telephone" />
|
|
1994
|
+
* <!-- schema : validate(chemin.telephone, ({ value }) => erreurTelephone(value())) -->
|
|
1995
|
+
* ```
|
|
1996
|
+
*
|
|
1997
|
+
* ⚠️ **Aucun formatage automatique.** Le groupement des chiffres depend du pays,
|
|
1998
|
+
* et reformater pendant la frappe renvoie le curseur en fin de ligne. La saisie
|
|
1999
|
+
* reste celle de la personne, espaces et points compris.
|
|
2000
|
+
*
|
|
2001
|
+
* ⚠️ **Pas de selecteur de pays, pas de verification par pays.** Il faudrait une
|
|
2002
|
+
* table des plans de numerotation, lourde et souvent perimee : c'est au serveur
|
|
2003
|
+
* de dire si le numero existe (SEC-5). `erreurTelephone` ne verifie que la forme.
|
|
2004
|
+
*
|
|
2005
|
+
* `type="tel"`, et jamais `type="number"` : un numero n'est pas une quantite, et le
|
|
2006
|
+
* champ numerique retire le zero de tete et le `+`.
|
|
2007
|
+
*/
|
|
2008
|
+
declare class StPhoneField extends ControleDeSaisie {
|
|
2009
|
+
readonly autocomplete: _angular_core.InputSignal<RemplissageDeTelephone>;
|
|
2010
|
+
private readonly brut;
|
|
2011
|
+
/**
|
|
2012
|
+
* La saisie telle que tapee, tant qu'elle represente encore la valeur ; une
|
|
2013
|
+
* valeur changee de l'exterieur — remise a zero, pre-remplissage — l'emporte.
|
|
2014
|
+
*/
|
|
2015
|
+
protected readonly affichage: _angular_core.Signal<string>;
|
|
2016
|
+
protected surSaisie(evenement: Event): void;
|
|
2017
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StPhoneField, never>;
|
|
2018
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StPhoneField, "st-phone-field", never, { "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2019
|
+
}
|
|
2020
|
+
|
|
2021
|
+
/**
|
|
2022
|
+
* Un choix d'une liste : `st-select`, `st-combobox`, `st-multiselect`.
|
|
2023
|
+
*
|
|
2024
|
+
* La `valeur` part dans le modele, le `libelle` s'affiche : un identifiant
|
|
2025
|
+
* technique ne s'affiche jamais, et un libelle traduit ne s'envoie jamais.
|
|
2026
|
+
*/
|
|
2027
|
+
interface OptionDeListe {
|
|
2028
|
+
readonly valeur: string;
|
|
2029
|
+
readonly libelle: string;
|
|
2030
|
+
readonly desactivee?: boolean;
|
|
2031
|
+
/** Regroupe les options consecutives sous un intitule (`optgroup`). */
|
|
2032
|
+
readonly groupe?: string;
|
|
2033
|
+
}
|
|
2034
|
+
/** Sans accents ni casse : « eleve » trouve « Élève ». */
|
|
2035
|
+
declare function normaliserPourRecherche(texte: string): string;
|
|
2036
|
+
/** Options dont le libelle CONTIENT le texte cherche, sans accents ni casse. */
|
|
2037
|
+
declare function filtrerOptions(options: readonly OptionDeListe[], recherche: string): readonly OptionDeListe[];
|
|
2038
|
+
|
|
2039
|
+
interface BlocDOptions {
|
|
2040
|
+
readonly groupe: string | null;
|
|
2041
|
+
readonly options: readonly OptionDeListe[];
|
|
2042
|
+
}
|
|
2043
|
+
/**
|
|
2044
|
+
* Liste deroulante, sur un `select` NATIF.
|
|
2045
|
+
*
|
|
2046
|
+
* ```html
|
|
2047
|
+
* <st-select libelle="Pays" [options]="pays" autocomplete="country" [formField]="adresse.pays" />
|
|
2048
|
+
* ```
|
|
2049
|
+
*
|
|
2050
|
+
* ⚠️ **Natif, et non une liste ARIA** (FE-4). Le `select` natif ouvre le selecteur
|
|
2051
|
+
* du systeme sur mobile, se remplit automatiquement, se parcourt a la lettre, et
|
|
2052
|
+
* se lit partout. Une liste recomposee en ARIA ne fait jamais mieux sur ces
|
|
2053
|
+
* points ; elle ne se justifie que pour filtrer une longue liste — c'est
|
|
2054
|
+
* `st-combobox` — ou choisir plusieurs valeurs — `st-multiselect`.
|
|
2055
|
+
*
|
|
2056
|
+
* La premiere option, vide, dit « Choisir… » : sans elle, la premiere vraie
|
|
2057
|
+
* option paraitrait choisie alors que personne ne l'a fait. Le modele vaut
|
|
2058
|
+
* alors `''`, que `required` refuse.
|
|
2059
|
+
*
|
|
2060
|
+
* `readonly` n'existe pas sur un `select` : le champ annonce `aria-readonly` et
|
|
2061
|
+
* ignore le changement, plutot que d'etre desactive — un champ desactive sort de
|
|
2062
|
+
* l'ordre de tabulation, et sa valeur ne se lit plus.
|
|
2063
|
+
*/
|
|
2064
|
+
declare class StSelect extends ControleDeSaisie {
|
|
2065
|
+
protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
|
|
2066
|
+
readonly options: _angular_core.InputSignal<readonly OptionDeListe[]>;
|
|
2067
|
+
/** Texte de l'option vide. Par defaut : « Choisir… ». */
|
|
2068
|
+
readonly texteVide: _angular_core.InputSignal<string | null>;
|
|
2069
|
+
/** WCAG 1.3.5 : `country`, `sex`, `honorific-prefix`… */
|
|
2070
|
+
readonly autocomplete: _angular_core.InputSignal<string | null>;
|
|
2071
|
+
/** Options consecutives d'un meme groupe, dans l'ordre fourni. */
|
|
2072
|
+
protected readonly blocs: _angular_core.Signal<readonly BlocDOptions[]>;
|
|
2073
|
+
protected surChoix(evenement: Event): void;
|
|
2074
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSelect, never>;
|
|
2075
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSelect, "st-select", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "texteVide": { "alias": "texteVide"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
interface Jour {
|
|
2079
|
+
readonly date: DateIso;
|
|
2080
|
+
/** Jour d'un mois voisin : cellule vide, la date vit dans son propre mois. */
|
|
2081
|
+
readonly horsDuMois: boolean;
|
|
2082
|
+
readonly numero: string;
|
|
2083
|
+
readonly nom: string;
|
|
2084
|
+
readonly horsBornes: boolean;
|
|
2085
|
+
readonly choisi: boolean;
|
|
2086
|
+
readonly dansLaPlage: boolean;
|
|
2087
|
+
readonly aujourdHui: boolean;
|
|
2088
|
+
}
|
|
2089
|
+
/**
|
|
2090
|
+
* Calendrier d'un mois, pour choisir une date.
|
|
2091
|
+
*
|
|
2092
|
+
* ```html
|
|
2093
|
+
* <st-calendar [selection]="depart()" dateMin="2026-09-17" (choix)="depart.set($event)" />
|
|
2094
|
+
* ```
|
|
2095
|
+
*
|
|
2096
|
+
* ⚠️ **Une aide, jamais la seule voie.** Dans `st-date-field`, le calendrier
|
|
2097
|
+
* complete un champ texte : une date de naissance se tape plus vite qu'elle ne se
|
|
2098
|
+
* cherche mois par mois, et un calendrier reste penible au lecteur d'ecran.
|
|
2099
|
+
*
|
|
2100
|
+
* ⚠️ **Le clavier navigue de DATE en date, pas de cellule en cellule** (decision
|
|
2101
|
+
* D7 de l'audit de la vague 3). Fleche droite le 30 septembre mene au 1er
|
|
2102
|
+
* octobre ; Page suivante change de mois, Maj + Page d'annee ; Debut et Fin vont
|
|
2103
|
+
* aux bords de la semaine de la LOCALE. La grille d'Angular Aria deplace un focus
|
|
2104
|
+
* entre cellules affichees : il aurait fallu la contourner sur chaque touche qui
|
|
2105
|
+
* compte, et elle aurait fait entrer le CDK dans les formulaires.
|
|
2106
|
+
*
|
|
2107
|
+
* Semaine commencant au jour de la locale, noms de jours et de mois dans la
|
|
2108
|
+
* langue courante, « aujourd'hui » dans le fuseau de la personne
|
|
2109
|
+
* (`FUSEAU_PAR_DEFAUT`) et non celui du poste.
|
|
2110
|
+
*/
|
|
2111
|
+
declare class StCalendar {
|
|
2112
|
+
protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
|
|
2113
|
+
private readonly locale;
|
|
2114
|
+
private readonly element;
|
|
2115
|
+
private readonly injecteur;
|
|
2116
|
+
private readonly aujourdHui;
|
|
2117
|
+
readonly selection: _angular_core.InputSignal<string | null>;
|
|
2118
|
+
readonly dateMin: _angular_core.InputSignal<string | null>;
|
|
2119
|
+
readonly dateMax: _angular_core.InputSignal<string | null>;
|
|
2120
|
+
/** Periode a faire ressortir, pour un choix de plage. */
|
|
2121
|
+
readonly plage: _angular_core.InputSignal<PlageDeDates | null>;
|
|
2122
|
+
readonly choix: _angular_core.OutputEmitterRef<string>;
|
|
2123
|
+
/** Echap : le conteneur decide de fermer, et ou rendre le focus. */
|
|
2124
|
+
readonly fermeture: _angular_core.OutputEmitterRef<void>;
|
|
2125
|
+
protected readonly identifiants: {
|
|
2126
|
+
readonly titre: `${string}-titre`;
|
|
2127
|
+
readonly aide: `${string}-aide`;
|
|
2128
|
+
};
|
|
2129
|
+
/** La date qui porte le focus. Suit la selection, bornee. */
|
|
2130
|
+
private readonly active;
|
|
2131
|
+
private readonly premierJour;
|
|
2132
|
+
protected readonly titre: _angular_core.Signal<string>;
|
|
2133
|
+
protected readonly joursDeLaSemaine: _angular_core.Signal<{
|
|
2134
|
+
court: string;
|
|
2135
|
+
long: string;
|
|
2136
|
+
}[]>;
|
|
2137
|
+
protected readonly semaines: _angular_core.Signal<readonly (readonly Jour[])[]>;
|
|
2138
|
+
protected readonly moisPrecedentPossible: _angular_core.Signal<boolean>;
|
|
2139
|
+
protected readonly moisSuivantPossible: _angular_core.Signal<boolean>;
|
|
2140
|
+
protected estActive(date: DateIso): boolean;
|
|
2141
|
+
/** Amene le focus sur la date active. */
|
|
2142
|
+
focus(): void;
|
|
2143
|
+
protected changerDeMois(ecart: number): void;
|
|
2144
|
+
protected choisir(jour: Jour): void;
|
|
2145
|
+
protected surTouche(evenement: KeyboardEvent): void;
|
|
2146
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCalendar, never>;
|
|
2147
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StCalendar, "st-calendar", never, { "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "dateMin": { "alias": "dateMin"; "required": false; "isSignal": true; }; "dateMax": { "alias": "dateMax"; "required": false; "isSignal": true; }; "plage": { "alias": "plage"; "required": false; "isSignal": true; }; }, { "choix": "choix"; "fermeture": "fermeture"; }, never, never, true, never>;
|
|
2148
|
+
}
|
|
2149
|
+
|
|
2150
|
+
/**
|
|
2151
|
+
* Choix de fichiers, sur un `input type="file"` natif.
|
|
2152
|
+
*
|
|
2153
|
+
* ```html
|
|
2154
|
+
* <st-file-upload libelle="Justificatifs" accept=".pdf, image/*" [tailleMax]="5_000_000" multiple
|
|
2155
|
+
* [formField]="dossier.pieces" />
|
|
2156
|
+
* <!-- schema : validate(chemin.pieces, ({ value }) => erreursDeFichiers(value(), regles)) -->
|
|
2157
|
+
* ```
|
|
2158
|
+
*
|
|
2159
|
+
* Le modele est la liste des `File` choisis. L'envoi appartient a l'application,
|
|
2160
|
+
* par `@starterlib/core` : le composant choisit, il ne televerse pas.
|
|
2161
|
+
*
|
|
2162
|
+
* ⚠️ **L'element natif reste la voie principale** (FE-4) : il ouvre le selecteur
|
|
2163
|
+
* du systeme, l'appareil photo sur mobile, et se commande au clavier. Il est
|
|
2164
|
+
* masque visuellement, pas retire : le bouton affiche est son etiquette. Le
|
|
2165
|
+
* depot par glisser est un complement a la souris, jamais la seule voie.
|
|
2166
|
+
*
|
|
2167
|
+
* ⚠️ **Aucun apercu d'image** (SEC-7). Un apercu passe par une adresse `blob:`
|
|
2168
|
+
* que la politique de securite du contenu doit autoriser, et un SVG affiche peut
|
|
2169
|
+
* porter du script. Le nom et la taille suffisent a reconnaitre un fichier.
|
|
2170
|
+
*
|
|
2171
|
+
* ⚠️ **`accept`, `tailleMax` et `nombreMax` sont un confort** (SEC-5) : ils
|
|
2172
|
+
* s'affichent en aide et filtrent le selecteur du systeme, mais la verification
|
|
2173
|
+
* est dans le schema — `erreursDeFichiers` —, et le serveur relit le contenu.
|
|
2174
|
+
*
|
|
2175
|
+
* Chaque changement de la liste s'annonce : « 2 fichiers choisis ». Un fichier
|
|
2176
|
+
* retire rend le focus au bouton de retrait suivant, ou au choix de fichiers : le
|
|
2177
|
+
* focus ne tombe jamais sur le document.
|
|
2178
|
+
*/
|
|
2179
|
+
declare class StFileUpload extends ContratDeChamp implements FormValueControl<readonly File[]> {
|
|
2180
|
+
protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
|
|
2181
|
+
private readonly locale;
|
|
2182
|
+
private readonly element;
|
|
2183
|
+
private readonly injecteur;
|
|
2184
|
+
readonly value: _angular_core.ModelSignal<readonly File[]>;
|
|
2185
|
+
/** Attribut `accept` natif : `.pdf, image/*`. */
|
|
2186
|
+
readonly accept: _angular_core.InputSignal<string>;
|
|
2187
|
+
readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2188
|
+
/** En octets. Affiche en aide ; la verification est dans le schema. */
|
|
2189
|
+
readonly tailleMax: _angular_core.InputSignal<number | null>;
|
|
2190
|
+
protected readonly annonce: AnnonceLocale;
|
|
2191
|
+
protected readonly survol: _angular_core.WritableSignal<boolean>;
|
|
2192
|
+
protected readonly aideLue: _angular_core.Signal<string | null>;
|
|
2193
|
+
protected readonly lignes: _angular_core.Signal<{
|
|
2194
|
+
fichier: File;
|
|
2195
|
+
cle: string;
|
|
2196
|
+
taille: string;
|
|
2197
|
+
}[]>;
|
|
2198
|
+
protected surChoix(evenement: Event): void;
|
|
2199
|
+
protected surSurvol(evenement: DragEvent): void;
|
|
2200
|
+
protected surDepot(evenement: DragEvent): void;
|
|
2201
|
+
protected retirer(indice: number): void;
|
|
2202
|
+
protected aLaSortie(evenement: FocusEvent): void;
|
|
2203
|
+
private ajouter;
|
|
2204
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StFileUpload, never>;
|
|
2205
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StFileUpload, "st-file-upload", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "tailleMax": { "alias": "tailleMax"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
|
|
2206
|
+
}
|
|
2207
|
+
|
|
2208
|
+
/**
|
|
2209
|
+
* Choix du theme : systeme, clair, sombre.
|
|
2210
|
+
*
|
|
2211
|
+
* ⚠️ **Trois etats, donc PAS un interrupteur.** `role="switch"` et
|
|
2212
|
+
* `aria-pressed` sont binaires : poses sur un choix a trois valeurs, ils
|
|
2213
|
+
* annoncent « active » ou « desactive » sans jamais dire lequel des trois est
|
|
2214
|
+
* retenu. Un groupe de boutons radio dit exactement « Sombre, bouton radio,
|
|
2215
|
+
* coche, 3 sur 3 ».
|
|
2216
|
+
*
|
|
2217
|
+
* ⚠️ **Composant de PRESENTATION.** Il n'injecte pas `StTheme` : `ui` ne depend
|
|
2218
|
+
* pas de `@starterlib/core` (ADR 0003). La coquille le relie au noyau :
|
|
2219
|
+
*
|
|
2220
|
+
* ```html
|
|
2221
|
+
* <st-theme-toggle [choix]="theme.choix()" (choisi)="theme.choisir($event)" />
|
|
2222
|
+
* ```
|
|
2223
|
+
*/
|
|
2224
|
+
declare class StThemeToggle {
|
|
2225
|
+
private readonly libelles;
|
|
2226
|
+
readonly choix: _angular_core.InputSignal<ChoixDeTheme>;
|
|
2227
|
+
/** Legende visible. Masquee par defaut, mais toujours lue : elle nomme le groupe. */
|
|
2228
|
+
readonly legendeVisible: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2229
|
+
readonly choisi: _angular_core.OutputEmitterRef<ChoixDeTheme>;
|
|
2230
|
+
/** Unique par instance : deux bascules sur la meme page partageraient leur groupe radio. */
|
|
2231
|
+
protected readonly nom: string;
|
|
2232
|
+
protected readonly legende: _angular_core.Signal<string>;
|
|
2233
|
+
protected readonly options: _angular_core.Signal<{
|
|
2234
|
+
valeur: ChoixDeTheme;
|
|
2235
|
+
libelle: string;
|
|
2236
|
+
}[]>;
|
|
2237
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StThemeToggle, never>;
|
|
2238
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StThemeToggle, "st-theme-toggle", never, { "choix": { "alias": "choix"; "required": true; "isSignal": true; }; "legendeVisible": { "alias": "legendeVisible"; "required": false; "isSignal": true; }; }, { "choisi": "choisi"; }, never, never, true, never>;
|
|
2239
|
+
}
|
|
2240
|
+
|
|
2241
|
+
/**
|
|
2242
|
+
* Choix de la langue de l'interface.
|
|
2243
|
+
*
|
|
2244
|
+
* ⚠️ **Chaque option porte son propre `lang`.** Sans lui, un lecteur d'ecran
|
|
2245
|
+
* regle en francais lit « English » avec une voix francaise, et le mot devient
|
|
2246
|
+
* incomprehensible pour la personne anglophone qui cherchait justement a
|
|
2247
|
+
* l'entendre.
|
|
2248
|
+
*
|
|
2249
|
+
* ⚠️ **Composant de PRESENTATION.** Il n'injecte pas `StLangue` : `ui` ne depend
|
|
2250
|
+
* pas de `@starterlib/core` (ADR 0003). La coquille le relie au noyau :
|
|
2251
|
+
*
|
|
2252
|
+
* ```html
|
|
2253
|
+
* <st-lang-switch [courante]="langue.courante()" (choisie)="langue.changer($event)" />
|
|
2254
|
+
* ```
|
|
2255
|
+
*/
|
|
2256
|
+
declare class StLangSwitch {
|
|
2257
|
+
private readonly libelles;
|
|
2258
|
+
readonly courante: _angular_core.InputSignal<Langue>;
|
|
2259
|
+
readonly langues: _angular_core.InputSignal<readonly Langue[]>;
|
|
2260
|
+
readonly legendeVisible: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2261
|
+
readonly choisie: _angular_core.OutputEmitterRef<Langue>;
|
|
2262
|
+
protected readonly nom: string;
|
|
2263
|
+
protected readonly legende: _angular_core.Signal<string>;
|
|
2264
|
+
protected readonly options: _angular_core.Signal<{
|
|
2265
|
+
code: Langue;
|
|
2266
|
+
endonyme: string;
|
|
2267
|
+
}[]>;
|
|
2268
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StLangSwitch, never>;
|
|
2269
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StLangSwitch, "st-lang-switch", never, { "courante": { "alias": "courante"; "required": true; "isSignal": true; }; "langues": { "alias": "langues"; "required": false; "isSignal": true; }; "legendeVisible": { "alias": "legendeVisible"; "required": false; "isSignal": true; }; }, { "choisie": "choisie"; }, never, never, true, never>;
|
|
2270
|
+
}
|
|
2271
|
+
|
|
2272
|
+
/**
|
|
2273
|
+
* Bouton qui copie une valeur : reference de virement, adresse de depot, lien
|
|
2274
|
+
* de partage.
|
|
2275
|
+
*
|
|
2276
|
+
* ⚠️ **Un element, et non un attribut pose sur un `<button>`.** La confirmation
|
|
2277
|
+
* passe par une region vivante voisine du bouton ; posee DANS le bouton, elle
|
|
2278
|
+
* entrerait dans son nom accessible, qui deviendrait « Copier Copie ».
|
|
2279
|
+
*
|
|
2280
|
+
* ⚠️ **Le libelle du bouton ne change pas** apres la copie, pour la raison que
|
|
2281
|
+
* donne `st-code` : le lecteur d'ecran annoncerait un autre controle que celui
|
|
2282
|
+
* qu'il a sous le doigt.
|
|
2283
|
+
*
|
|
2284
|
+
* ⚠️ **Jamais de secret.** Ce qui entre dans le presse-papiers est conserve par
|
|
2285
|
+
* les gestionnaires d'historique et synchronise entre appareils : ni mot de
|
|
2286
|
+
* passe, ni jeton, ni code a usage unique.
|
|
2287
|
+
*
|
|
2288
|
+
* Sans presse-papiers — hors contexte securise — le bouton n'est pas rendu : un
|
|
2289
|
+
* controle qui ne peut rien faire ne doit pas s'offrir.
|
|
2290
|
+
*/
|
|
2291
|
+
declare class StCopyButton {
|
|
2292
|
+
private readonly document;
|
|
2293
|
+
private readonly libelles;
|
|
2294
|
+
readonly valeur: _angular_core.InputSignal<string>;
|
|
2295
|
+
/**
|
|
2296
|
+
* `null` : le texte vient du dictionnaire de l'application.
|
|
2297
|
+
*
|
|
2298
|
+
* ⚠️ En icone seule, c'est le nom accessible du bouton : il doit dire CE qui
|
|
2299
|
+
* est copie quand la page en offre plusieurs — « Copier l'IBAN » et non
|
|
2300
|
+
* « Copier » repete cinq fois.
|
|
2301
|
+
*/
|
|
2302
|
+
readonly libelle: _angular_core.InputSignal<string | null>;
|
|
2303
|
+
readonly iconeSeule: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2304
|
+
readonly messageDeConfirmation: _angular_core.InputSignal<string | null>;
|
|
2305
|
+
readonly copie: _angular_core.OutputEmitterRef<string>;
|
|
2306
|
+
protected readonly annonce: AnnonceLocale;
|
|
2307
|
+
protected readonly disponible: boolean;
|
|
2308
|
+
protected readonly libelleLu: _angular_core.Signal<string>;
|
|
2309
|
+
protected copier(): Promise<void>;
|
|
2310
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCopyButton, never>;
|
|
2311
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StCopyButton, "st-copy-button", never, { "valeur": { "alias": "valeur"; "required": true; "isSignal": true; }; "libelle": { "alias": "libelle"; "required": false; "isSignal": true; }; "iconeSeule": { "alias": "iconeSeule"; "required": false; "isSignal": true; }; "messageDeConfirmation": { "alias": "messageDeConfirmation"; "required": false; "isSignal": true; }; }, { "copie": "copie"; }, never, never, true, never>;
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2314
|
+
/**
|
|
2315
|
+
* Compte a rebours avant un nouvel essai, pour une reponse `429` et son en-tete
|
|
2316
|
+
* `Retry-After`.
|
|
2317
|
+
*
|
|
2318
|
+
* ```html
|
|
2319
|
+
* @if (erreur.reessayerDans !== null) {
|
|
2320
|
+
* <st-timer [secondes]="erreur.reessayerDans" (termine)="reessayable.set(true)" />
|
|
2321
|
+
* }
|
|
2322
|
+
* ```
|
|
2323
|
+
*
|
|
2324
|
+
* ⚠️ **Il n'annonce PAS chaque seconde.** Une region vivante qui change toutes les
|
|
2325
|
+
* secondes recouvre tout ce que le lecteur d'ecran essaie de dire, et empeche de
|
|
2326
|
+
* lire le formulaire que la personne est justement en train de garder pret. Le
|
|
2327
|
+
* decompte porte `role="timer"`, dont la valeur implicite est
|
|
2328
|
+
* `aria-live="off"` : il se LIT quand on l'atteint. Seule la fin s'annonce.
|
|
2329
|
+
*
|
|
2330
|
+
* ⚠️ **Le temps restant se calcule contre l'horloge, pas en comptant les
|
|
2331
|
+
* battements.** Un onglet en arriere-plan voit ses minuteries ralenties a une par
|
|
2332
|
+
* minute : un compteur decremente a chaque battement afficherait encore
|
|
2333
|
+
* « 45 s » a son retour, bien apres que le serveur a leve la limite.
|
|
2334
|
+
*/
|
|
2335
|
+
declare class StTimer {
|
|
2336
|
+
private readonly libelles;
|
|
2337
|
+
private readonly locale;
|
|
2338
|
+
/** Duree d'attente en secondes, telle que `Retry-After` la donne. */
|
|
2339
|
+
readonly secondes: _angular_core.InputSignal<number>;
|
|
2340
|
+
readonly termine: _angular_core.OutputEmitterRef<void>;
|
|
2341
|
+
protected readonly annonce: AnnonceLocale;
|
|
2342
|
+
private readonly restant;
|
|
2343
|
+
private echeance;
|
|
2344
|
+
private minuterie;
|
|
2345
|
+
protected readonly texte: _angular_core.Signal<string>;
|
|
2346
|
+
constructor();
|
|
2347
|
+
private demarrer;
|
|
2348
|
+
private battre;
|
|
2349
|
+
private arreter;
|
|
2350
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTimer, never>;
|
|
2351
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StTimer, "st-timer", never, { "secondes": { "alias": "secondes"; "required": true; "isSignal": true; }; }, { "termine": "termine"; }, never, never, true, never>;
|
|
2352
|
+
}
|
|
2353
|
+
|
|
2354
|
+
/**
|
|
2355
|
+
* Logo de l'organisation, en variante claire, sombre et monochrome.
|
|
2356
|
+
*
|
|
2357
|
+
* ⚠️ **Le texte alternatif est le NOM de l'organisation, jamais « logo ».** Un
|
|
2358
|
+
* lecteur d'ecran annonce deja « image » : « Logo Banque Exemple » se lit
|
|
2359
|
+
* « image, logo Banque Exemple ». Pose dans un lien vers l'accueil, ce nom
|
|
2360
|
+
* devient celui du lien — il doit donc dire ou il mene.
|
|
2361
|
+
*
|
|
2362
|
+
* ⚠️ **Decoratif quand le nom est ecrit a cote.** Le repeter ferait lire
|
|
2363
|
+
* « Banque Exemple Banque Exemple ».
|
|
2364
|
+
*
|
|
2365
|
+
* La variante suit le theme EFFECTIF pose par `StTheme` sur `<html data-theme>`,
|
|
2366
|
+
* et non `prefers-color-scheme` : une personne qui a choisi le clair sur un
|
|
2367
|
+
* systeme sombre doit voir le logo clair. Sous contraste force, la variante
|
|
2368
|
+
* monochrome prend le relais — un logo en couleurs peut y disparaitre sur le
|
|
2369
|
+
* fond impose.
|
|
2370
|
+
*
|
|
2371
|
+
* Les images viennent de la meme origine : la politique de securite du contenu
|
|
2372
|
+
* n'autorise pas d'autre source d'image sans extension explicite cote BFF.
|
|
2373
|
+
*/
|
|
2374
|
+
declare class StLogo {
|
|
2375
|
+
/** Nom de l'organisation : c'est le texte alternatif. */
|
|
2376
|
+
readonly nom: _angular_core.InputSignal<string>;
|
|
2377
|
+
readonly clair: _angular_core.InputSignal<string>;
|
|
2378
|
+
/** `null` : la variante claire sert aussi sur fond sombre. */
|
|
2379
|
+
readonly sombre: _angular_core.InputSignal<string | null>;
|
|
2380
|
+
/** `null` : aucune variante dediee au contraste force. */
|
|
2381
|
+
readonly monochrome: _angular_core.InputSignal<string | null>;
|
|
2382
|
+
readonly decoratif: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2383
|
+
readonly hauteur: _angular_core.InputSignal<string>;
|
|
2384
|
+
protected readonly texteAlternatif: _angular_core.Signal<string>;
|
|
2385
|
+
protected readonly sourceSombre: _angular_core.Signal<string>;
|
|
2386
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StLogo, never>;
|
|
2387
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StLogo, "st-logo", never, { "nom": { "alias": "nom"; "required": true; "isSignal": true; }; "clair": { "alias": "clair"; "required": true; "isSignal": true; }; "sombre": { "alias": "sombre"; "required": false; "isSignal": true; }; "monochrome": { "alias": "monochrome"; "required": false; "isSignal": true; }; "decoratif": { "alias": "decoratif"; "required": false; "isSignal": true; }; "hauteur": { "alias": "hauteur"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2388
|
+
}
|
|
2389
|
+
|
|
816
2390
|
/**
|
|
817
2391
|
* Impose les cinq etats a un bloc qui consomme l'API, et centralise leur
|
|
818
2392
|
* annonce.
|
|
@@ -871,7 +2445,7 @@ declare class StState<T> {
|
|
|
871
2445
|
private readonly valeurRetenue;
|
|
872
2446
|
/** Etat deduit de la ressource, valeur retenue comprise. */
|
|
873
2447
|
private readonly etatDeLaRessource;
|
|
874
|
-
readonly etatEffectif: _angular_core.Signal<EtatDeBloc>;
|
|
2448
|
+
protected readonly etatEffectif: _angular_core.Signal<EtatDeBloc>;
|
|
875
2449
|
/**
|
|
876
2450
|
* Une valeur est affichee, et une autre arrive — par rappel explicite ou par
|
|
877
2451
|
* changement de parametre.
|
|
@@ -881,7 +2455,7 @@ declare class StState<T> {
|
|
|
881
2455
|
private readonly annoncesLues;
|
|
882
2456
|
protected readonly annonce: _angular_core.Signal<string>;
|
|
883
2457
|
/** Contexte passe au gabarit : la valeur en succes, l'erreur en erreur. */
|
|
884
|
-
readonly contexte: _angular_core.Signal<{
|
|
2458
|
+
protected readonly contexte: _angular_core.Signal<{
|
|
885
2459
|
$implicit: unknown;
|
|
886
2460
|
}>;
|
|
887
2461
|
/**
|
|
@@ -890,7 +2464,7 @@ declare class StState<T> {
|
|
|
890
2464
|
* l'illusion que les cinq etats sont traites. Il vaut mieux que le manque se
|
|
891
2465
|
* voie, en developpement.
|
|
892
2466
|
*/
|
|
893
|
-
readonly gabaritDeLEtat: _angular_core.Signal<TemplateRef<unknown> | null>;
|
|
2467
|
+
protected readonly gabaritDeLEtat: _angular_core.Signal<TemplateRef<unknown> | null>;
|
|
894
2468
|
private readonly chargementVisible;
|
|
895
2469
|
/** La silhouette par defaut, une fois le delai anti-clignotement passe. */
|
|
896
2470
|
protected readonly montreLaSilhouetteParDefaut: _angular_core.Signal<boolean>;
|
|
@@ -962,5 +2536,5 @@ declare class StChargement {
|
|
|
962
2536
|
/** Toutes les directives de gabarit, a importer d'un coup. */
|
|
963
2537
|
declare const GABARITS_D_ETAT: readonly [typeof StSucces, typeof StErreur, typeof StVide, typeof StHorsLigne, typeof StChargement];
|
|
964
2538
|
|
|
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 };
|
|
2539
|
+
export { AnnonceLocale, CHEMIN_DU_SPRITE, ContratDeChamp, ControleDeSaisie, FUSEAU_PAR_DEFAUT, GABARITS_D_ETAT, IDENTIFIANT_DU_CONTENU_PRINCIPAL, LIBELLES_EN, LIBELLES_FR, NOMS_DICONE, REGION_VIVANTE_PARENTE, ST_LIBELLES, ST_LOCALE, StAppShell, StAvatar, StBadge, StBanner, StBreadcrumb, StButton, StButtonGroup, StCalendar, StCard, StChargement, StCheckbox, StCode, StControleDeChamp, StCopyButton, StCount, StDate, StDivider, StEmpty, StErreur, StError, StErrorSummary, StFieldset, StFileUpload, StFormField, StHeader, StHeading, StHorsLigne, StIbanField, StIcon, StIconButton, StInlineMessage, StInput, StLangSwitch, StLink, StLogo, StMasked, StMoney, StOfflineBanner, StOtpField, StPageTitle, StPasswordField, StPhoneField, StProgress, StRadioGroup, StRelativeTime, StSearchField, StSection, StSelect, StSkeleton, StSkipLink, StSpinner, StState, StStatusPill, StSucces, StSwitch, StTag, StText, StTextarea, StThemeToggle, StTimer, StVide, copierDansLePressePapiers, erreurDate, erreurIban, erreurPlageDeDates, erreurTelephone, erreursDeFichiers, exempleDeDate, filtrerOptions, formaterDuree, fournirCheminDuSprite, fusionnerErreurs, messageDErreur, motifLocal, normaliserPourRecherche, pressePapiersDisponible, provideStarterUi };
|
|
2540
|
+
export type { BornesDeDate, ConfigurationUi, DispositionDeChamp, ElementDeSaisie, ErreurAffichable, FormatDeDate, GraisseDeTexte, IssueDeCopie, LibellesUi, MaillonDeFil, NiveauDeTitre, NomDIcone, OptionDeListe, OptionRadio, OrientationDeSeparateur, ReglesDeFichiers, ReliefDeCarte, RembourrageDeCarte, RemplissageDeTelephone, TailleDIcone, TailleDeBouton, TailleDeSpinner, TailleDeTitre, TonDIcone, TonDeBadge, TonDeBanniere, TonDeMessage, TonDeProgression, TonDeSpinner, TonDeStatut, TypeDeSaisie, TypeMasque, UsageDuMotDePasse, VarianteDErreur, VarianteDeBouton, VarianteDeBoutonIcone, VarianteDeLien, VarianteDeSquelette, VarianteDeTexte };
|