@starterlib/ui 0.9.0 → 0.10.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 +44 -32
- package/assets/icones/catalogue.json +1 -1
- package/fesm2022/starterlib-ui-donnees.mjs +200 -3
- package/fesm2022/starterlib-ui-donnees.mjs.map +1 -1
- package/fesm2022/starterlib-ui-etats.mjs +1158 -0
- package/fesm2022/starterlib-ui-etats.mjs.map +1 -0
- package/fesm2022/starterlib-ui-formulaires.mjs +3 -2
- package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
- package/fesm2022/starterlib-ui-indicateurs.mjs +1013 -0
- package/fesm2022/starterlib-ui-indicateurs.mjs.map +1 -0
- package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -1
- package/fesm2022/starterlib-ui-listes.mjs +5 -2
- package/fesm2022/starterlib-ui-listes.mjs.map +1 -1
- package/fesm2022/starterlib-ui-messagerie.mjs +2 -2
- package/fesm2022/starterlib-ui-messagerie.mjs.map +1 -1
- package/fesm2022/starterlib-ui-mise-en-page.mjs +892 -0
- package/fesm2022/starterlib-ui-mise-en-page.mjs.map +1 -0
- package/fesm2022/starterlib-ui-onglets.mjs.map +1 -1
- package/fesm2022/starterlib-ui-parcours.mjs +222 -4
- package/fesm2022/starterlib-ui-parcours.mjs.map +1 -1
- package/fesm2022/starterlib-ui-saisie.mjs +131 -3
- package/fesm2022/starterlib-ui-saisie.mjs.map +1 -1
- package/fesm2022/starterlib-ui-surfaces.mjs +2 -1
- package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
- package/fesm2022/starterlib-ui.mjs +3510 -7105
- package/fesm2022/starterlib-ui.mjs.map +1 -1
- package/package.json +15 -3
- package/types/starterlib-ui-donnees.d.ts +95 -1
- package/types/starterlib-ui-etats.d.ts +486 -0
- package/types/starterlib-ui-formulaires.d.ts +1 -1
- package/types/starterlib-ui-indicateurs.d.ts +463 -0
- package/types/starterlib-ui-listes.d.ts +2 -1
- package/types/starterlib-ui-mise-en-page.d.ts +355 -0
- package/types/starterlib-ui-onglets.d.ts +6 -0
- package/types/starterlib-ui-parcours.d.ts +123 -3
- package/types/starterlib-ui-saisie.d.ts +72 -2
- package/types/starterlib-ui-selection.d.ts +3 -2
- package/types/starterlib-ui.d.ts +52 -1605
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { Icone, TonDIcone } from "@starterlib/ui";
|
|
3
|
+
export type EspacementDeSection = 'aucun' | 'sm' | 'md' | 'lg';
|
|
4
|
+
/**
|
|
5
|
+
* Regroupement de contenu, expose comme REPERE de navigation quand il porte un
|
|
6
|
+
* nom, pose en ATTRIBUT sur une vraie balise `section`.
|
|
7
|
+
*
|
|
8
|
+
* ```html
|
|
9
|
+
* <section stSection titreDe="titre-operations" surtitre="Compte courant">
|
|
10
|
+
* <h2 stHeading titre id="titre-operations">Operations recentes</h2>
|
|
11
|
+
* <button stButton fin type="button">Exporter</button>
|
|
12
|
+
* …
|
|
13
|
+
* </section>
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ Le point qui decide de tout : une region n'est exposee comme repere que si
|
|
17
|
+
* elle a un NOM ACCESSIBLE. Sans nom, la plupart des lecteurs d'ecran
|
|
18
|
+
* l'ignorent — la balise est la, le repere n'existe pas, et rien ne le signale.
|
|
19
|
+
* Une `section` native sans nom reste un simple bloc, ce qu'elle est
|
|
20
|
+
* reellement : son role de region vient de son nom, sans rien poser.
|
|
21
|
+
*
|
|
22
|
+
* Deux facons de la nommer, et la seconde vaut mieux : `titreDe` pointe le
|
|
23
|
+
* titre deja affiche, ce qui garde un seul texte a traduire et a maintenir. On
|
|
24
|
+
* nomme une section quand une personne au lecteur d'ecran voudrait y SAUTER ;
|
|
25
|
+
* au-dela de cinq reperes nommes par page, on regroupe.
|
|
26
|
+
*
|
|
27
|
+
* L'en-tete (planches 11 a 14) est facultatif : surtitre, titre projete
|
|
28
|
+
* (`[titre]`), description, et ce qui se place au bout (`[fin]` : une puce, une
|
|
29
|
+
* action). Sans aucun des quatre, il n'existe pas.
|
|
30
|
+
*/
|
|
31
|
+
export declare class StSection {
|
|
32
|
+
/** Nom accessible ecrit a la main. A preferer `titreDe` quand un titre existe. */
|
|
33
|
+
readonly etiquette: import("@angular/core").InputSignal<string | null>;
|
|
34
|
+
/** Identifiant du titre qui nomme la section. Prime sur `etiquette`. */
|
|
35
|
+
readonly titreDe: import("@angular/core").InputSignal<string | null>;
|
|
36
|
+
/** Marge apres la section : 0, 16, 24 (defaut) ou 32 px. */
|
|
37
|
+
readonly espacement: import("@angular/core").InputSignal<EspacementDeSection>;
|
|
38
|
+
/** Petites capitales au-dessus du titre (planche 11). */
|
|
39
|
+
readonly surtitre: import("@angular/core").InputSignal<string | null>;
|
|
40
|
+
/** Une phrase sous le titre (planches 13 et 14). */
|
|
41
|
+
readonly description: import("@angular/core").InputSignal<string | null>;
|
|
42
|
+
private readonly element;
|
|
43
|
+
/**
|
|
44
|
+
* ⚠️ `aria-labelledby` et `aria-label` sont PARTAGES avec l'appelant
|
|
45
|
+
* (`noyau/attributs-partages`) : le composant ne pose que ce que ses entrees disent, et garde
|
|
46
|
+
* ce que l'appelant a ecrit OU LIE (`[attr.aria-labelledby]="idTitre"`). Une liaison d'hote
|
|
47
|
+
* effacait le nom lie, et la section cessait d'etre un repere sans rien dire (revue E7).
|
|
48
|
+
*/
|
|
49
|
+
private readonly nommeePar;
|
|
50
|
+
private readonly nom;
|
|
51
|
+
constructor();
|
|
52
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StSection, never>;
|
|
53
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StSection, "section[stSection]", never, {
|
|
54
|
+
"etiquette": {
|
|
55
|
+
"alias": "etiquette";
|
|
56
|
+
"required": false;
|
|
57
|
+
"isSignal": true;
|
|
58
|
+
};
|
|
59
|
+
"titreDe": {
|
|
60
|
+
"alias": "titreDe";
|
|
61
|
+
"required": false;
|
|
62
|
+
"isSignal": true;
|
|
63
|
+
};
|
|
64
|
+
"espacement": {
|
|
65
|
+
"alias": "espacement";
|
|
66
|
+
"required": false;
|
|
67
|
+
"isSignal": true;
|
|
68
|
+
};
|
|
69
|
+
"surtitre": {
|
|
70
|
+
"alias": "surtitre";
|
|
71
|
+
"required": false;
|
|
72
|
+
"isSignal": true;
|
|
73
|
+
};
|
|
74
|
+
"description": {
|
|
75
|
+
"alias": "description";
|
|
76
|
+
"required": false;
|
|
77
|
+
"isSignal": true;
|
|
78
|
+
};
|
|
79
|
+
}, {}, never, ["[titre]", "[fin]", "*"], true, never>;
|
|
80
|
+
}
|
|
81
|
+
export type OrientationDeSeparateur = 'horizontale' | 'verticale';
|
|
82
|
+
/**
|
|
83
|
+
* `filet` (defaut) : la bordure decorative #d7dadf ; `tonale` : le trait de la surface du
|
|
84
|
+
* conteneur haut #e3e8f4, pose dans un panneau teinte (planches 10, 11 et 13). Un separateur
|
|
85
|
+
* porteur de sens prend la bordure forte (3,78:1) quelle que soit la variante.
|
|
86
|
+
*/
|
|
87
|
+
export type VarianteDeSeparateur = 'filet' | 'tonale';
|
|
88
|
+
/**
|
|
89
|
+
* Trait de separation.
|
|
90
|
+
*
|
|
91
|
+
* ⚠️ **Decoratif par defaut, et c'est le bon defaut.** Un `<hr>` porte le role
|
|
92
|
+
* `separator` de facon implicite, que les lecteurs d'ecran annoncent. Sur une
|
|
93
|
+
* page qui en compte huit — ce qui est courant dans une liste de reglages — la
|
|
94
|
+
* lecture est ponctuee de huit « separateur » qui n'apprennent rien.
|
|
95
|
+
*
|
|
96
|
+
* Le role ne se pose que lorsque le trait porte vraiment du sens : il separe
|
|
97
|
+
* alors deux GROUPES que rien d'autre ne distingue, comme les sections d'un
|
|
98
|
+
* menu. Regle de tri : si le retirer ne retire aucune information, il est
|
|
99
|
+
* decoratif. Decoratif, il porte `aria-hidden` SEUL : un `role="none"` en plus
|
|
100
|
+
* ne disait rien de plus a un element deja retire de l'arbre.
|
|
101
|
+
*
|
|
102
|
+
* Porteur de sens, il prend la bordure FORTE (3:1, WCAG 1.4.11) : un trait qui
|
|
103
|
+
* separe deux groupes doit se voir. Marges : `--st-separateur-marge` (catalogue).
|
|
104
|
+
*
|
|
105
|
+
* Avec texte (lot 214) : un mot ou une date courte projetes (« ou », « Aujourd'hui ») se centrent
|
|
106
|
+
* entre deux traits, en style `legende` a l'encre attenuee. Le TEXTE est lu a sa place dans le
|
|
107
|
+
* flux ; les traits, dessines par la feuille, ne le sont pas. Ni `separator` (ses enfants sont
|
|
108
|
+
* presentationnels : le mot serait tu), ni `aria-hidden` (il le retirerait). Horizontal seulement.
|
|
109
|
+
*
|
|
110
|
+
* ```html
|
|
111
|
+
* <st-divider>ou</st-divider>
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export declare class StDivider {
|
|
115
|
+
readonly orientation: import("@angular/core").InputSignal<OrientationDeSeparateur>;
|
|
116
|
+
readonly variante: import("@angular/core").InputSignal<VarianteDeSeparateur>;
|
|
117
|
+
/** Le trait separe deux groupes distincts, et doit donc etre annonce. */
|
|
118
|
+
readonly porteurDeSens: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
119
|
+
/** Un texte est-il projete ? Releve au rendu : un contenu projete echappe aux requetes. */
|
|
120
|
+
protected readonly avecTexte: import("@angular/core").WritableSignal<boolean>;
|
|
121
|
+
constructor();
|
|
122
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StDivider, never>;
|
|
123
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StDivider, "st-divider", never, {
|
|
124
|
+
"orientation": {
|
|
125
|
+
"alias": "orientation";
|
|
126
|
+
"required": false;
|
|
127
|
+
"isSignal": true;
|
|
128
|
+
};
|
|
129
|
+
"variante": {
|
|
130
|
+
"alias": "variante";
|
|
131
|
+
"required": false;
|
|
132
|
+
"isSignal": true;
|
|
133
|
+
};
|
|
134
|
+
"porteurDeSens": {
|
|
135
|
+
"alias": "porteurDeSens";
|
|
136
|
+
"required": false;
|
|
137
|
+
"isSignal": true;
|
|
138
|
+
};
|
|
139
|
+
}, {}, never, ["*"], true, never>;
|
|
140
|
+
}
|
|
141
|
+
export type VarianteDeTexte = 'corps' | 'corps-sm' | 'discret' | 'legende' | 'meta' | 'mono';
|
|
142
|
+
export type GraisseDeTexte = 'normale' | 'moyenne' | 'semi';
|
|
143
|
+
/**
|
|
144
|
+
* Bloc de texte de l'echelle typographique.
|
|
145
|
+
*
|
|
146
|
+
* L'hote EST la boite : jamais `display: contents`, qui retire l'element de
|
|
147
|
+
* l'arbre d'accessibilite dans plusieurs navigateurs. Seul un texte `revelable`
|
|
148
|
+
* gagne une zone interieure, parce que son bouton doit rester HORS de la coupe.
|
|
149
|
+
*
|
|
150
|
+
* ```html
|
|
151
|
+
* <st-text variante="meta">Mis a jour il y a 2 min</st-text>
|
|
152
|
+
* <st-text [tronquerA]="3" revelable>{{ conditions }}</st-text>
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export declare class StText {
|
|
156
|
+
readonly variante: import("@angular/core").InputSignal<VarianteDeTexte>;
|
|
157
|
+
readonly graisse: import("@angular/core").InputSignal<GraisseDeTexte>;
|
|
158
|
+
readonly enLigne: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
159
|
+
/**
|
|
160
|
+
* Nombre de lignes au-dela duquel le texte est coupe.
|
|
161
|
+
*
|
|
162
|
+
* ⚠️ A ne jamais employer sur un message d'erreur, un statut, un libelle
|
|
163
|
+
* d'action, un montant ou un nom qui distingue : une information tronquee y
|
|
164
|
+
* devient fausse. Le texte coupe reste lu en entier par un lecteur d'ecran ;
|
|
165
|
+
* l'oeil, lui, n'en voit que le debut, d'ou `revelable`.
|
|
166
|
+
*
|
|
167
|
+
* ⚠️ **Sans `revelable`, un APERCU seulement** : le texte entier doit s'atteindre
|
|
168
|
+
* ailleurs, a l'oeil et au clavier (la ligne est un lien vers le detail, ou le
|
|
169
|
+
* detail est sur la page). Une bulle `title` ne le remplace pas : ni le clavier ni
|
|
170
|
+
* le toucher ne l'ouvrent (WCAG 1.4.10 et 2.1.1 ; audit UI du 2026-09-27, D-34).
|
|
171
|
+
* Partout ailleurs, `revelable`.
|
|
172
|
+
*/
|
|
173
|
+
readonly tronquerA: import("@angular/core").InputSignal<number | null>;
|
|
174
|
+
/**
|
|
175
|
+
* Avec `tronquerA` : un bouton « Afficher la suite » / « Reduire » sous le
|
|
176
|
+
* bloc, SEULEMENT quand le texte deborde reellement de sa coupe (WCAG 1.4.4 et
|
|
177
|
+
* 1.4.10 : ce que la coupe cache doit rester atteignable a l'oeil).
|
|
178
|
+
*/
|
|
179
|
+
readonly revelable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
180
|
+
protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
|
|
181
|
+
protected readonly identifiantDuContenu: string;
|
|
182
|
+
protected readonly ouvert: import("@angular/core").WritableSignal<boolean>;
|
|
183
|
+
protected readonly deborde: import("@angular/core").WritableSignal<boolean>;
|
|
184
|
+
private readonly zone;
|
|
185
|
+
constructor();
|
|
186
|
+
protected basculer(): void;
|
|
187
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StText, never>;
|
|
188
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StText, "st-text", never, {
|
|
189
|
+
"variante": {
|
|
190
|
+
"alias": "variante";
|
|
191
|
+
"required": false;
|
|
192
|
+
"isSignal": true;
|
|
193
|
+
};
|
|
194
|
+
"graisse": {
|
|
195
|
+
"alias": "graisse";
|
|
196
|
+
"required": false;
|
|
197
|
+
"isSignal": true;
|
|
198
|
+
};
|
|
199
|
+
"enLigne": {
|
|
200
|
+
"alias": "enLigne";
|
|
201
|
+
"required": false;
|
|
202
|
+
"isSignal": true;
|
|
203
|
+
};
|
|
204
|
+
"tronquerA": {
|
|
205
|
+
"alias": "tronquerA";
|
|
206
|
+
"required": false;
|
|
207
|
+
"isSignal": true;
|
|
208
|
+
};
|
|
209
|
+
"revelable": {
|
|
210
|
+
"alias": "revelable";
|
|
211
|
+
"required": false;
|
|
212
|
+
"isSignal": true;
|
|
213
|
+
};
|
|
214
|
+
}, {}, never, ["*"], true, never>;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* `ligne` : filet capillaire entre les lignes d'une liste de reglages (le
|
|
218
|
+
* defaut) ; `tuile` : chaque reglage dans sa tuile `surfaceConteneurBas`
|
|
219
|
+
* (regles de la planche 14).
|
|
220
|
+
*/
|
|
221
|
+
export type VarianteDeLigneDeReglage = 'ligne' | 'tuile';
|
|
222
|
+
/**
|
|
223
|
+
* Ligne de reglage : un libelle, une description, et le controle qui les suit.
|
|
224
|
+
*
|
|
225
|
+
* ```html
|
|
226
|
+
* <st-settings-row libelle="Alertes par SMS" description="Un SMS a chaque virement sortant.">
|
|
227
|
+
* <st-switch libelle="Activer" [(checked)]="sms" />
|
|
228
|
+
* </st-settings-row>
|
|
229
|
+
* ```
|
|
230
|
+
*
|
|
231
|
+
* Facultatifs : un carre d'icone de 36 px en tete (`icone`, `ton`), et un
|
|
232
|
+
* complement du libelle sur sa ligne (`[suffixe]`, une puce « STRICT »).
|
|
233
|
+
*
|
|
234
|
+
* ⚠️ **La ligne est un GROUPE nomme et decrit, et non une etiquette.** Le
|
|
235
|
+
* controle projete garde son propre nom — celui de son `libelle`, ou un
|
|
236
|
+
* `aria-label` pour un element natif — et la ligne l'enveloppe d'un
|
|
237
|
+
* `role="group"` relie a son libelle par `aria-labelledby` et a sa description
|
|
238
|
+
* par `aria-describedby`. En entrant dans le groupe, le lecteur d'ecran lit le
|
|
239
|
+
* libelle, puis la description, puis le controle : « Alertes par SMS, groupe,
|
|
240
|
+
* Un SMS a chaque virement sortant, Activer, interrupteur, desactive ». En
|
|
241
|
+
* developpement, un controle projete SANS nom accessible est signale.
|
|
242
|
+
*
|
|
243
|
+
* Pourquoi pas un `label for` : la plupart des controles du socle portent deja
|
|
244
|
+
* leur etiquette, et un controle non natif (un groupe segmente, un declencheur
|
|
245
|
+
* de menu) n'en accepte aucun. Le groupe, lui, marche pour tous, sans que la
|
|
246
|
+
* ligne ait a connaitre ce qu'on lui projette.
|
|
247
|
+
*
|
|
248
|
+
* ⚠️ Un reglage s'applique IMMEDIATEMENT (c'est le sens de `st-switch`) ou
|
|
249
|
+
* s'envoie avec un formulaire : la ligne ne tranche pas, le controle le dit.
|
|
250
|
+
*
|
|
251
|
+
* Une ligne qui NAVIGUE (vers le detail d'un reglage) projette un `a[stLink]`
|
|
252
|
+
* suivi de l'icone `chevron-droite` de taille `sm`, miroitee en RTL.
|
|
253
|
+
*/
|
|
254
|
+
export declare class StSettingsRow {
|
|
255
|
+
/** Texte visible, deja traduit : le socle ne traduit rien. */
|
|
256
|
+
readonly libelle: import("@angular/core").InputSignal<string>;
|
|
257
|
+
/** Ce que le reglage fait, en une phrase. Reliee au groupe par `aria-describedby`. */
|
|
258
|
+
readonly description: import("@angular/core").InputSignal<string | null>;
|
|
259
|
+
readonly variante: import("@angular/core").InputSignal<VarianteDeLigneDeReglage>;
|
|
260
|
+
/** Icone decorative du carre de tete ; `null` : pas de carre. */
|
|
261
|
+
readonly icone: import("@angular/core").InputSignal<Icone | null>;
|
|
262
|
+
/** Ton du glyphe du carre d'icone. */
|
|
263
|
+
readonly ton: import("@angular/core").InputSignal<TonDIcone>;
|
|
264
|
+
/** Identifiants du libelle et de la description, cibles des attributs ARIA. */
|
|
265
|
+
protected readonly identifiants: {
|
|
266
|
+
readonly libelle: `${string}-libelle`;
|
|
267
|
+
readonly description: `${string}-description`;
|
|
268
|
+
};
|
|
269
|
+
constructor();
|
|
270
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StSettingsRow, never>;
|
|
271
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StSettingsRow, "st-settings-row", never, {
|
|
272
|
+
"libelle": {
|
|
273
|
+
"alias": "libelle";
|
|
274
|
+
"required": true;
|
|
275
|
+
"isSignal": true;
|
|
276
|
+
};
|
|
277
|
+
"description": {
|
|
278
|
+
"alias": "description";
|
|
279
|
+
"required": false;
|
|
280
|
+
"isSignal": true;
|
|
281
|
+
};
|
|
282
|
+
"variante": {
|
|
283
|
+
"alias": "variante";
|
|
284
|
+
"required": false;
|
|
285
|
+
"isSignal": true;
|
|
286
|
+
};
|
|
287
|
+
"icone": {
|
|
288
|
+
"alias": "icone";
|
|
289
|
+
"required": false;
|
|
290
|
+
"isSignal": true;
|
|
291
|
+
};
|
|
292
|
+
"ton": {
|
|
293
|
+
"alias": "ton";
|
|
294
|
+
"required": false;
|
|
295
|
+
"isSignal": true;
|
|
296
|
+
};
|
|
297
|
+
}, {}, never, ["[suffixe]", "*"], true, never>;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Regroupe des actions liees.
|
|
301
|
+
*
|
|
302
|
+
* ⚠️ `role="group"` et NON `role="toolbar"` : une barre d'outils exige un
|
|
303
|
+
* `tabindex` glissant et la navigation par fleches. Annoncer « barre d'outils »
|
|
304
|
+
* sans en fournir le comportement desoriente plus qu'un groupe simple. Le
|
|
305
|
+
* motif complet viendra avec les primitives d'`@angular/aria`.
|
|
306
|
+
*
|
|
307
|
+
* `attache` : le groupe marque ses enfants du tronc (`stButton`, `stIconButton`,
|
|
308
|
+
* `stLink`) par leur position, et chaque enfant rend ses coins (`_groupe.scss`) ; un
|
|
309
|
+
* enfant survole ou focalise passe au-dessus de son voisin. Les enfants d'un groupe
|
|
310
|
+
* attache ont la MEME taille (avertissement en developpement), et le groupe passe a la
|
|
311
|
+
* ligne plutot que de deborder (1.4.10). Au-dela de cinq boutons attaches, un
|
|
312
|
+
* `st-segmented-control` ou un `st-select` dit mieux la chose.
|
|
313
|
+
*
|
|
314
|
+
* `plateau` : le groupe pose sur le fond du conteneur, rayon et filet discret (planche 9).
|
|
315
|
+
*/
|
|
316
|
+
export declare class StButtonGroup {
|
|
317
|
+
/** Nom du groupe : sans lui, le regroupement n'apprend rien a l'oral. */
|
|
318
|
+
readonly etiquette: import("@angular/core").InputSignal<string>;
|
|
319
|
+
readonly orientation: import("@angular/core").InputSignal<"horizontale" | "verticale">;
|
|
320
|
+
/** Boutons jointifs : un seul trait entre deux, coins exterieurs seulement. */
|
|
321
|
+
readonly attache: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
322
|
+
/** Le groupe pose sur un plateau (planche 9). */
|
|
323
|
+
readonly plateau: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
324
|
+
private readonly boutons;
|
|
325
|
+
private readonly boutonsIcone;
|
|
326
|
+
private readonly liens;
|
|
327
|
+
private readonly taillesDesBoutons;
|
|
328
|
+
private readonly taillesDesBoutonsIcone;
|
|
329
|
+
constructor();
|
|
330
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StButtonGroup, never>;
|
|
331
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StButtonGroup, "st-button-group", never, {
|
|
332
|
+
"etiquette": {
|
|
333
|
+
"alias": "etiquette";
|
|
334
|
+
"required": true;
|
|
335
|
+
"isSignal": true;
|
|
336
|
+
};
|
|
337
|
+
"orientation": {
|
|
338
|
+
"alias": "orientation";
|
|
339
|
+
"required": false;
|
|
340
|
+
"isSignal": true;
|
|
341
|
+
};
|
|
342
|
+
"attache": {
|
|
343
|
+
"alias": "attache";
|
|
344
|
+
"required": false;
|
|
345
|
+
"isSignal": true;
|
|
346
|
+
};
|
|
347
|
+
"plateau": {
|
|
348
|
+
"alias": "plateau";
|
|
349
|
+
"required": false;
|
|
350
|
+
"isSignal": true;
|
|
351
|
+
};
|
|
352
|
+
}, {}, ["boutons", "boutonsIcone", "liens", "taillesDesBoutons", "taillesDesBoutonsIcone"], ["*"], true, never>;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export {};
|
|
@@ -39,6 +39,12 @@ export type OrientationDOnglets = 'horizontale' | 'verticale';
|
|
|
39
39
|
* </st-tabs>
|
|
40
40
|
* ```
|
|
41
41
|
*
|
|
42
|
+
* ⚠️ **Un `st-tab-panel` par onglet, son contenu dans `stTabContent`** : depuis Angular 22.2,
|
|
43
|
+
* `@angular/aria` signale en developpement un onglet sans panneau et un panneau sans contenu
|
|
44
|
+
* differe (deux avertissements par element). Le contenu direct d'un panneau reste rendu, et
|
|
45
|
+
* masque au repos, mais il est signale ; des vues d'un meme contenu, sans panneau, se disent par
|
|
46
|
+
* `st-segmented-control`.
|
|
47
|
+
*
|
|
42
48
|
* ⚠️ **La liste d'onglets est rendue par le composant, a partir de donnees**, et
|
|
43
49
|
* non projetee. Les primitives d'Aria relient un onglet a sa liste par
|
|
44
50
|
* INJECTION, et un contenu projete garde l'injecteur de l'endroit ou il est
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ApiError, EtatDeCeremonie, LectureDeCeremonie, MoyenDeCeremonie, TonSemantique } from "@starterlib/util";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import { InjectionToken, Signal } from "@angular/core";
|
|
4
|
-
import { AnnonceLocale,
|
|
5
|
-
import { ErreurAffichable } from "@starterlib/ui/saisie";
|
|
4
|
+
import { AnnonceLocale, Icone, NiveauDeTitre } from "@starterlib/ui";
|
|
5
|
+
import { DispositionDActions, ErreurAffichable } from "@starterlib/ui/saisie";
|
|
6
6
|
/**
|
|
7
7
|
* Un refus du serveur, en banniere, au-dessus de ce qu'il refuse (lot 261) : un virement (plafond,
|
|
8
8
|
* solde), une demande KYC, une connexion. Le patron que chaque formulaire recopiait (`id-refus`).
|
|
@@ -312,6 +312,126 @@ export declare class StTaskList {
|
|
|
312
312
|
"ouverture": "ouverture";
|
|
313
313
|
}, never, never, true, never>;
|
|
314
314
|
}
|
|
315
|
+
/** Une etape d'un parcours, decrite par l'appelant. Les textes sont deja traduits. */
|
|
316
|
+
export interface EtapeDeParcours {
|
|
317
|
+
readonly libelle: string;
|
|
318
|
+
/** Precision sous le libelle (« Termine le 28.09 a 14:32 ») ; aucune si absente. */
|
|
319
|
+
readonly description?: string;
|
|
320
|
+
}
|
|
321
|
+
export type EtatDEtape = 'faite' | 'courante' | 'a-venir';
|
|
322
|
+
/** `verticale` : les etapes en colonne, a toutes les largeurs (un assistant a sa marge, lot 262). */
|
|
323
|
+
export type OrientationDeParcours = 'horizontale' | 'verticale';
|
|
324
|
+
/**
|
|
325
|
+
* Parcours par etapes : ou l'on en est, ce qui est fait, ce qui reste.
|
|
326
|
+
*
|
|
327
|
+
* ```html
|
|
328
|
+
* <st-stepper [etapes]="etapes" [etape]="indice()" />
|
|
329
|
+
* ```
|
|
330
|
+
*
|
|
331
|
+
* ⚠️ Une liste ORDONNEE : l'ordre des etapes est l'information, et le lecteur
|
|
332
|
+
* d'ecran annonce « 2 sur 4 » de lui-meme. L'etape courante porte
|
|
333
|
+
* `aria-current="step"`, ce qui est exactement le mot de la specification, et
|
|
334
|
+
* elle est seule a le porter.
|
|
335
|
+
*
|
|
336
|
+
* ⚠️ **L'etat de chaque etape se lit par sa forme ET par un texte**, jamais par
|
|
337
|
+
* la couleur seule : une coche pour ce qui est fait, un numero plein a halo pour
|
|
338
|
+
* l'etape en cours, un numero sur fond discret pour ce qui vient ; et un mot —
|
|
339
|
+
* « en cours », « a venir » dans le surtitre visible, « terminee » lu seulement,
|
|
340
|
+
* la double coche le montrant. Sous contraste force, il ne reste que la forme et
|
|
341
|
+
* le mot.
|
|
342
|
+
*
|
|
343
|
+
* Deux formes, sans transition de l'une a l'autre : la RANGEE (reperes de 40 px
|
|
344
|
+
* relies par des connecteurs de 4 px, surtitre, libelle, description) des que
|
|
345
|
+
* SA BOITE atteint la rupture `md` (requete de conteneur : une carte etroite sur
|
|
346
|
+
* un grand ecran prend la forme compacte), et la forme COMPACTE en dessous (« Etape 3 sur 4 : ... »,
|
|
347
|
+
* pourcentage CALCULE, un segment par etape, precedente et suivante). La forme
|
|
348
|
+
* compacte est une vue : la liste complete reste dans le document, lue
|
|
349
|
+
* seulement, et la vue est masquee aux lecteurs d'ecran pour ne rien dire deux
|
|
350
|
+
* fois. `compacte` l'impose a toutes les largeurs.
|
|
351
|
+
*
|
|
352
|
+
* Il n'est PAS interactif : revenir a une etape est une decision du parcours,
|
|
353
|
+
* qui la rend par un vrai lien ou un vrai bouton dans la page. Un indicateur
|
|
354
|
+
* cliquable promettrait un retour que tous les parcours n'autorisent pas.
|
|
355
|
+
*
|
|
356
|
+
* Le composant ne pose aucune marge externe : l'espace autour de lui appartient
|
|
357
|
+
* a la page.
|
|
358
|
+
*/
|
|
359
|
+
export declare class StStepper {
|
|
360
|
+
private readonly libelles;
|
|
361
|
+
private readonly locale;
|
|
362
|
+
readonly etapes: import("@angular/core").InputSignal<readonly EtapeDeParcours[]>;
|
|
363
|
+
/**
|
|
364
|
+
* Indice de l'etape en cours, a partir de zero. Le nombre d'etapes dit un
|
|
365
|
+
* parcours acheve : toutes faites, aucune courante. Hors de ces bornes,
|
|
366
|
+
* l'indice est ramene a la plus proche, avec un avertissement en developpement.
|
|
367
|
+
*/
|
|
368
|
+
readonly etape: import("@angular/core").InputSignal<number>;
|
|
369
|
+
/**
|
|
370
|
+
* Nom de la liste, jamais affiche. `null` : le `libelle` visible s'il est pose (un voyant lit
|
|
371
|
+
* « Virement », un lecteur d'ecran l'entend aussi), sinon « Etapes », du dictionnaire.
|
|
372
|
+
*/
|
|
373
|
+
readonly etiquette: import("@angular/core").InputSignal<string | null>;
|
|
374
|
+
/** Nom visible du parcours, en surtitre de la forme compacte ; aucun si `null`. */
|
|
375
|
+
readonly libelle: import("@angular/core").InputSignal<string | null>;
|
|
376
|
+
/** Forme compacte a toutes les largeurs, et non sous la seule rupture `md`. */
|
|
377
|
+
readonly compacte: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
378
|
+
/** `verticale` : la liste en colonne a toutes les largeurs ; `compacte` l'emporte. */
|
|
379
|
+
readonly orientation: import("@angular/core").InputSignal<OrientationDeParcours>;
|
|
380
|
+
protected readonly etiquetteLue: import("@angular/core").Signal<string>;
|
|
381
|
+
protected readonly motDeLEtapeFaite: import("@angular/core").Signal<string>;
|
|
382
|
+
/** L'indice borne : une etape hors du parcours ne peut ni tout cocher ni tout vider en silence. */
|
|
383
|
+
private readonly courante;
|
|
384
|
+
protected readonly lignes: import("@angular/core").Signal<{
|
|
385
|
+
libelle: string;
|
|
386
|
+
description: string | null;
|
|
387
|
+
numero: number;
|
|
388
|
+
etat: EtatDEtape;
|
|
389
|
+
surtitre: string;
|
|
390
|
+
relie: boolean;
|
|
391
|
+
}[]>;
|
|
392
|
+
/** Le format de la locale de l'application : « 50 % » en francais, « 50% » en anglais. */
|
|
393
|
+
private readonly formatDuPourcentage;
|
|
394
|
+
/** Resume de la forme compacte : CALCULE sur les etapes faites, jamais recopie. */
|
|
395
|
+
protected readonly resume: import("@angular/core").Signal<{
|
|
396
|
+
titre: string;
|
|
397
|
+
pourcentage: string;
|
|
398
|
+
precedente: string | null;
|
|
399
|
+
suivante: string | null;
|
|
400
|
+
} | null>;
|
|
401
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StStepper, never>;
|
|
402
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StStepper, "st-stepper", never, {
|
|
403
|
+
"etapes": {
|
|
404
|
+
"alias": "etapes";
|
|
405
|
+
"required": true;
|
|
406
|
+
"isSignal": true;
|
|
407
|
+
};
|
|
408
|
+
"etape": {
|
|
409
|
+
"alias": "etape";
|
|
410
|
+
"required": true;
|
|
411
|
+
"isSignal": true;
|
|
412
|
+
};
|
|
413
|
+
"etiquette": {
|
|
414
|
+
"alias": "etiquette";
|
|
415
|
+
"required": false;
|
|
416
|
+
"isSignal": true;
|
|
417
|
+
};
|
|
418
|
+
"libelle": {
|
|
419
|
+
"alias": "libelle";
|
|
420
|
+
"required": false;
|
|
421
|
+
"isSignal": true;
|
|
422
|
+
};
|
|
423
|
+
"compacte": {
|
|
424
|
+
"alias": "compacte";
|
|
425
|
+
"required": false;
|
|
426
|
+
"isSignal": true;
|
|
427
|
+
};
|
|
428
|
+
"orientation": {
|
|
429
|
+
"alias": "orientation";
|
|
430
|
+
"required": false;
|
|
431
|
+
"isSignal": true;
|
|
432
|
+
};
|
|
433
|
+
}, {}, never, never, true, never>;
|
|
434
|
+
}
|
|
315
435
|
/** Ce qu'un `st-wizard` dit a l'etape qu'il projette : ou l'on en est, et le retour. */
|
|
316
436
|
interface AssistantDeParcours {
|
|
317
437
|
/** L'etape en cours, a partir de 1. */
|
|
@@ -442,7 +562,7 @@ export declare class StWizardStep {
|
|
|
442
562
|
protected readonly titreLu: import("@angular/core").Signal<string>;
|
|
443
563
|
protected readonly compte: import("@angular/core").Signal<string | null>;
|
|
444
564
|
protected readonly retourVers: import("@angular/core").Signal<string | readonly unknown[] | null>;
|
|
445
|
-
protected readonly orientation: import("@angular/core").Signal<import("@starterlib/ui").OrientationDeParcours | null>;
|
|
565
|
+
protected readonly orientation: import("@angular/core").Signal<import("@starterlib/ui/parcours").OrientationDeParcours | null>;
|
|
446
566
|
protected readonly retourPossible: import("@angular/core").Signal<boolean>;
|
|
447
567
|
protected readonly libelleDeLAction: import("@angular/core").Signal<string>;
|
|
448
568
|
/** L'avertissement d'irrevocabilite est-il montre ? Il decrit alors « Confirmer » (D-33). */
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { Adresse, DateIso, DescriptionDeFichier, FormatDAdresse, HeureIso, NatureDeRegion, PartieDAdresse, PlageDeDates
|
|
1
|
+
import { Adresse, DateIso, DescriptionDeFichier, FormatDAdresse, HeureIso, NatureDeRegion, PartieDAdresse, PlageDeDates } from "@starterlib/util/valeurs";
|
|
2
2
|
import { DisabledReason, FormCheckboxControl, FormValueControl, ValidationError, WithOptionalFieldTree } from "@angular/forms/signals";
|
|
3
|
-
import { AnnonceLocale,
|
|
3
|
+
import { AnnonceLocale, Icone, LibellesUi } from "@starterlib/ui";
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import { InjectionToken, Signal } from "@angular/core";
|
|
6
|
+
import { sansCommandesDeDirection } from "@starterlib/util";
|
|
7
|
+
import { EtiquetteDeGroupe } from "@starterlib/ui/indicateurs";
|
|
6
8
|
/**
|
|
7
9
|
* Forme minimale d'une erreur de validation, telle que Signal Forms la rend :
|
|
8
10
|
* un genre, et parfois un message.
|
|
@@ -3802,5 +3804,73 @@ export declare class StAddressFieldset extends ContratDeChamp implements FormVal
|
|
|
3802
3804
|
"value": "valueChange";
|
|
3803
3805
|
}, never, ["*"], true, never>;
|
|
3804
3806
|
}
|
|
3807
|
+
/**
|
|
3808
|
+
* `collee` (defaut, planche 3b) : une carte collee au bas de la zone de
|
|
3809
|
+
* defilement, a 16 px du bord. `pied` (planche 13) : une rangee posee a la fin du
|
|
3810
|
+
* formulaire, sans cadre, pour un formulaire qui tient dans l'ecran.
|
|
3811
|
+
*/
|
|
3812
|
+
export type DispositionDActions = 'collee' | 'pied';
|
|
3813
|
+
/**
|
|
3814
|
+
* Barre d'actions d'un formulaire.
|
|
3815
|
+
*
|
|
3816
|
+
* ```html
|
|
3817
|
+
* <form (submit)="envoyer()">
|
|
3818
|
+
* …
|
|
3819
|
+
* <st-form-actions>
|
|
3820
|
+
* <button debut stButton type="button">Annuler</button>
|
|
3821
|
+
* <st-icon aide nom="cercle-alerte-plein" ton="danger" />
|
|
3822
|
+
* <span aide id="aide-envoi">3 erreurs a corriger</span>
|
|
3823
|
+
* <button stButton type="button">Enregistrer le brouillon</button>
|
|
3824
|
+
* <button stButton type="submit" variante="primaire" aria-describedby="aide-envoi">
|
|
3825
|
+
* Valider le virement
|
|
3826
|
+
* </button>
|
|
3827
|
+
* </st-form-actions>
|
|
3828
|
+
* </form>
|
|
3829
|
+
* ```
|
|
3830
|
+
*
|
|
3831
|
+
* ⚠️ **`sticky`, JAMAIS `fixed`.** Un element fixe sort du flux : a 200 %
|
|
3832
|
+
* d'echelle il recouvre les derniers champs, et dans une vue embarquee il se
|
|
3833
|
+
* pose sous la barre du systeme. Collee, la barre reste dans le document —
|
|
3834
|
+
* elle suit le formulaire, cede la place a son pied, et respecte la zone sure
|
|
3835
|
+
* du bas de l'ecran (`env(safe-area-inset-bottom)`).
|
|
3836
|
+
*
|
|
3837
|
+
* ⚠️ **Le focus n'est jamais recouvert** (WCAG 2.4.11). Collee, la barre cache
|
|
3838
|
+
* les derniers champs quand le navigateur y amene un arret de tabulation : elle
|
|
3839
|
+
* MESURE sa hauteur et la pose en `scroll-padding-block-end` sur son conteneur
|
|
3840
|
+
* de defilement, avec le contrat d'hote `--st-form-actions-hauteur` (D13, D16).
|
|
3841
|
+
*
|
|
3842
|
+
* ⚠️ **L'ordre du document est l'ordre visuel.** Rien n'est inverse par le
|
|
3843
|
+
* style : l'action principale s'ecrit en dernier, elle se lit en dernier et se
|
|
3844
|
+
* tabule en dernier. `debut` accueille ce qui part a l'oppose (un retour, une
|
|
3845
|
+
* annulation) et `aide` la raison d'une action indisponible, a relier au bouton
|
|
3846
|
+
* par `aria-describedby`. Dans un conteneur de moins de 480 px, la barre
|
|
3847
|
+
* s'empile, l'action principale en bas, sous le pouce (planche 6).
|
|
3848
|
+
*
|
|
3849
|
+
* `data-collee` dit que la barre FLOTTE sur du contenu qui continue dessous :
|
|
3850
|
+
* son ombre s'epaissit alors (une barre posee a la fin du formulaire garde
|
|
3851
|
+
* l'ombre de la planche 3b).
|
|
3852
|
+
*
|
|
3853
|
+
* Une seule action principale par formulaire, et elle est un vrai
|
|
3854
|
+
* `type="submit"` : Entree dans un champ l'envoie. Deux avertissent en
|
|
3855
|
+
* developpement.
|
|
3856
|
+
*/
|
|
3857
|
+
export declare class StFormActions {
|
|
3858
|
+
readonly disposition: import("@angular/core").InputSignal<DispositionDActions>;
|
|
3859
|
+
protected readonly collee: import("@angular/core").WritableSignal<boolean>;
|
|
3860
|
+
constructor();
|
|
3861
|
+
/**
|
|
3862
|
+
* Observe la barre collee : si elle flotte (`data-collee`) et quelle hauteur
|
|
3863
|
+
* elle recouvre. Rend la fonction qui defait tout.
|
|
3864
|
+
*/
|
|
3865
|
+
private suivreLaBarre;
|
|
3866
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StFormActions, never>;
|
|
3867
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StFormActions, "st-form-actions", never, {
|
|
3868
|
+
"disposition": {
|
|
3869
|
+
"alias": "disposition";
|
|
3870
|
+
"required": false;
|
|
3871
|
+
"isSignal": true;
|
|
3872
|
+
};
|
|
3873
|
+
}, {}, never, ["[debut]", "[aide]", "*"], true, never>;
|
|
3874
|
+
}
|
|
3805
3875
|
|
|
3806
3876
|
export {};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { AnnonceLocale } from "@starterlib/ui";
|
|
2
2
|
import { ContratDeChamp, ControleDeSaisie, OptionDeListe, PresentationDeLibelle } from "@starterlib/ui/saisie";
|
|
3
|
-
import {
|
|
3
|
+
import { sansCommandesDeDirection } from "@starterlib/util";
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import { TemplateRef } from "@angular/core";
|
|
6
6
|
import { FormValueControl } from "@angular/forms/signals";
|
|
7
|
+
import { SuggestionDAdresse } from "@starterlib/util/valeurs";
|
|
7
8
|
/** Contexte du gabarit d'option de `st-combobox`. */
|
|
8
9
|
export interface ContexteDOption {
|
|
9
10
|
/** L'option rendue. */
|
|
@@ -407,7 +408,7 @@ export declare class StAddressSearch {
|
|
|
407
408
|
protected readonly minimum = 3;
|
|
408
409
|
/** Rendue seulement avec une source ET dans un champ d'adresse. */
|
|
409
410
|
protected readonly active: boolean;
|
|
410
|
-
protected readonly attribution: import("@starterlib/util").AttributionDeDonnees | null;
|
|
411
|
+
protected readonly attribution: import("@starterlib/util/valeurs").AttributionDeDonnees | null;
|
|
411
412
|
/** Le texte tape, temporise par `st-combobox`. */
|
|
412
413
|
protected readonly terme: import("@angular/core").WritableSignal<string>;
|
|
413
414
|
/** La suggestion choisie (son identifiant), ou `''`. */
|