@starterlib/ui 0.9.1 → 0.10.1

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.
Files changed (36) hide show
  1. package/README.md +44 -32
  2. package/assets/icones/catalogue.json +1 -1
  3. package/fesm2022/starterlib-ui-donnees.mjs +200 -3
  4. package/fesm2022/starterlib-ui-donnees.mjs.map +1 -1
  5. package/fesm2022/starterlib-ui-etats.mjs +1158 -0
  6. package/fesm2022/starterlib-ui-etats.mjs.map +1 -0
  7. package/fesm2022/starterlib-ui-formulaires.mjs +3 -2
  8. package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
  9. package/fesm2022/starterlib-ui-indicateurs.mjs +1013 -0
  10. package/fesm2022/starterlib-ui-indicateurs.mjs.map +1 -0
  11. package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -1
  12. package/fesm2022/starterlib-ui-listes.mjs +5 -2
  13. package/fesm2022/starterlib-ui-listes.mjs.map +1 -1
  14. package/fesm2022/starterlib-ui-messagerie.mjs +2 -2
  15. package/fesm2022/starterlib-ui-messagerie.mjs.map +1 -1
  16. package/fesm2022/starterlib-ui-mise-en-page.mjs +892 -0
  17. package/fesm2022/starterlib-ui-mise-en-page.mjs.map +1 -0
  18. package/fesm2022/starterlib-ui-parcours.mjs +222 -4
  19. package/fesm2022/starterlib-ui-parcours.mjs.map +1 -1
  20. package/fesm2022/starterlib-ui-saisie.mjs +131 -3
  21. package/fesm2022/starterlib-ui-saisie.mjs.map +1 -1
  22. package/fesm2022/starterlib-ui-surfaces.mjs +2 -1
  23. package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
  24. package/fesm2022/starterlib-ui.mjs +3526 -7105
  25. package/fesm2022/starterlib-ui.mjs.map +1 -1
  26. package/package.json +15 -3
  27. package/types/starterlib-ui-donnees.d.ts +95 -1
  28. package/types/starterlib-ui-etats.d.ts +486 -0
  29. package/types/starterlib-ui-formulaires.d.ts +1 -1
  30. package/types/starterlib-ui-indicateurs.d.ts +463 -0
  31. package/types/starterlib-ui-listes.d.ts +2 -1
  32. package/types/starterlib-ui-mise-en-page.d.ts +355 -0
  33. package/types/starterlib-ui-parcours.d.ts +123 -3
  34. package/types/starterlib-ui-saisie.d.ts +72 -2
  35. package/types/starterlib-ui-selection.d.ts +3 -2
  36. package/types/starterlib-ui.d.ts +36 -1604
@@ -0,0 +1,463 @@
1
+ import { Ton, TonSemantique } from "@starterlib/util";
2
+ import { AnnonceLocale, Icone, TailleDIcone } from "@starterlib/ui";
3
+ import * as i0 from "@angular/core";
4
+ import { InjectionToken } from "@angular/core";
5
+ /**
6
+ * ⚠️ `primaire` et non « info » : les deux designaient deja la meme couleur
7
+ * d'accent, et rien ne distinguait un statut « info » d'un statut « primaire »
8
+ * ailleurs dans le socle.
9
+ */
10
+ export type TonDeStatut = TonSemantique;
11
+ /**
12
+ * `md` (defaut) : 24 px, libelle de 11 px, icone de 16 px au trait (planche 2 de Claude Design).
13
+ * `sm` : 18 px, icone de 14 px PLEINE, pour les tableaux denses (a cette taille, un trait ne
14
+ * se lit plus).
15
+ */
16
+ export type TailleDePastille = 'md' | 'sm';
17
+ /**
18
+ * `icone` (defaut) : la forme du statut devant le libelle. `point` : un point fixe de 8 px,
19
+ * reserve au TEMOIN DE LIAISON (« Passerelle active ») ; un statut metier garde sa forme.
20
+ */
21
+ export type VarianteDePastille = 'icone' | 'point';
22
+ /**
23
+ * `capitales` (defaut) : le libelle en capitales de 11 px, a l'interlettrage du micro-libelle
24
+ * (forme de la planche 4, DESIGN.md « label-sm uppercase »). `phrase` : la casse du texte, en
25
+ * 12/16 — 11 px est reserve aux micro-libelles en capitales (ADR 0005 D18, D38).
26
+ */
27
+ export type CasseDePastille = 'phrase' | 'capitales';
28
+ /**
29
+ * Pastille de statut.
30
+ *
31
+ * ⚠️ Le libelle est OBLIGATOIRE, et l'icone differe par sa FORME d'un ton a l'autre (coche,
32
+ * horloge, croix, cercle) : un statut porte par la seule couleur est illisible pour une personne
33
+ * daltonienne, a l'impression, et sous un theme a fort contraste. Sans icone fournie, la forme
34
+ * vient du ton (lot 206) : un appelant ne peut plus l'oublier.
35
+ *
36
+ * ⚠️ Aucun role ARIA, malgre le nom du composant : `role="status"` en ferait
37
+ * une region vivante, et une liste de vingt lignes ferait annoncer vingt
38
+ * statuts a chaque rendu.
39
+ *
40
+ * Rendu de reference : la forme de la planche 4 (icone du ton, filet du ton a 20 %, capitales)
41
+ * a la taille de la planche 2 (24 px, libelle 11/600, icone de 16 au trait), ADR web/starter 0005
42
+ * D23. Les capitales sont le DEFAUT (revue E8) : un libelle de 11 px en casse de phrase est
43
+ * refuse par D18 ; la casse de phrase passe a 12/16.
44
+ */
45
+ export declare class StStatusPill {
46
+ /** Code machine du statut : sert aux tests et aux selecteurs, jamais a l'affichage. */
47
+ readonly statut: import("@angular/core").InputSignal<string>;
48
+ /** Texte deja traduit par l'appelant : le socle ne traduit rien. */
49
+ readonly libelle: import("@angular/core").InputSignal<string>;
50
+ /**
51
+ * `null` : la forme du ton (neutre `cercle`, information et primaire `cercle-info`, succes
52
+ * `cercle-coche`, avertissement `triangle-alerte`, danger `cercle-croix`). Fournie, une forme
53
+ * plus precise : `horloge` (en attente), `octogone-alerte` (bloque), `interdit` (opposition).
54
+ */
55
+ readonly icone: import("@angular/core").InputSignal<Icone | null>;
56
+ readonly ton: import("@angular/core").InputSignal<TonSemantique>;
57
+ readonly taille: import("@angular/core").InputSignal<TailleDePastille>;
58
+ readonly variante: import("@angular/core").InputSignal<VarianteDePastille>;
59
+ readonly casse: import("@angular/core").InputSignal<CasseDePastille>;
60
+ /**
61
+ * L'icone dessinee : celle de l'appelant, ou la forme du ton. En `sm`, le jumeau PLEIN des
62
+ * qu'il existe (a 14 px, un contour ne se lit plus) ; en `md`, le trait, sauf si l'appelant
63
+ * demande lui-meme le plein (`{ nom, variante: 'plein' }`).
64
+ */
65
+ protected readonly iconeDessinee: import("@angular/core").Signal<Icone>;
66
+ protected readonly tailleDIcone: import("@angular/core").Signal<TailleDIcone>;
67
+ static ɵfac: i0.ɵɵFactoryDeclaration<StStatusPill, never>;
68
+ static ɵcmp: i0.ɵɵComponentDeclaration<StStatusPill, "st-status-pill", never, {
69
+ "statut": {
70
+ "alias": "statut";
71
+ "required": true;
72
+ "isSignal": true;
73
+ };
74
+ "libelle": {
75
+ "alias": "libelle";
76
+ "required": true;
77
+ "isSignal": true;
78
+ };
79
+ "icone": {
80
+ "alias": "icone";
81
+ "required": false;
82
+ "isSignal": true;
83
+ };
84
+ "ton": {
85
+ "alias": "ton";
86
+ "required": false;
87
+ "isSignal": true;
88
+ };
89
+ "taille": {
90
+ "alias": "taille";
91
+ "required": false;
92
+ "isSignal": true;
93
+ };
94
+ "variante": {
95
+ "alias": "variante";
96
+ "required": false;
97
+ "isSignal": true;
98
+ };
99
+ "casse": {
100
+ "alias": "casse";
101
+ "required": false;
102
+ "isSignal": true;
103
+ };
104
+ }, {}, never, never, true, never>;
105
+ }
106
+ /**
107
+ * Ou le badge se pose sur son porteur :
108
+ * - `haut-fin` (defaut) : centre sur le coin superieur de fin (droit en francais), a 6 px du bord ;
109
+ * - `haut-debut` : le coin superieur de debut ;
110
+ * - `en-ligne` : dans le flux, apres le libelle (entree de navigation, onglet).
111
+ */
112
+ export type PositionDeBadge = 'haut-fin' | 'haut-debut' | 'en-ligne';
113
+ /**
114
+ * Porteur d'un `st-badge` : la cloche, l'entree de navigation, l'onglet qui compte.
115
+ *
116
+ * ```html
117
+ * <span stBadgeAncre etiquetteDuCompte=", 3 non lues">
118
+ * <st-icon nom="cloche" /> Notifications
119
+ * <st-badge [valeur]="3" />
120
+ * </span>
121
+ * ```
122
+ *
123
+ * ⚠️ Elle remplace la classe `st-badge-ancre` que la 0.8.0 exigeait et qu'aucune feuille ne
124
+ * definissait (A1099) : le badge restait dans le flux, loin de son porteur.
125
+ *
126
+ * Le badge est pose en ABSOLU dans son porteur : il apparait, grandit de « 3 » a « 99+ » et
127
+ * disparait sans jamais deplacer le porteur ni la page (aucun decalage de mise en page). Un seul
128
+ * decalage pour tous les badges : leur CENTRE a 6 px du coin, quelle que soit leur largeur.
129
+ *
130
+ * ⚠️ Le badge est MUET (un « 5 » flottant n'apprend rien) : le compte se dit par
131
+ * `etiquetteDuCompte`, texte masque rendu DANS le porteur, donc dans son nom accessible
132
+ * (« Notifications, 3 non lues »). Un porteur nomme par `aria-label` (un `stIconButton`) ignore
133
+ * son contenu : le compte va alors dans son `etiquette`.
134
+ */
135
+ export declare class StBadgeAncre {
136
+ /** La position du badge ; l'attribut nu vaut `haut-fin`. */
137
+ readonly position: import("@angular/core").InputSignalWithTransform<PositionDeBadge, "" | PositionDeBadge>;
138
+ /** Texte lu du compte (« , 3 non lues »), deja traduit par l'appelant ; `null` : aucun. */
139
+ readonly etiquetteDuCompte: import("@angular/core").InputSignal<string | null>;
140
+ constructor();
141
+ static ɵfac: i0.ɵɵFactoryDeclaration<StBadgeAncre, never>;
142
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StBadgeAncre, "[stBadgeAncre]", never, {
143
+ "position": {
144
+ "alias": "stBadgeAncre";
145
+ "required": false;
146
+ "isSignal": true;
147
+ };
148
+ "etiquetteDuCompte": {
149
+ "alias": "etiquetteDuCompte";
150
+ "required": false;
151
+ "isSignal": true;
152
+ };
153
+ }, {}, never, never, true, never>;
154
+ }
155
+ export type TonDeBadge = TonSemantique;
156
+ /**
157
+ * Pastille de comptage superposee a un autre element (planche 2 de Claude Design, lot 206) :
158
+ * disque de 20 px, gelule qui s'allonge sans changer de hauteur, « 99+ » au-dela du plafond,
159
+ * point de 10 px a lisere de surface.
160
+ *
161
+ * ⚠️ Le chiffre est TOUJOURS muet. Un « 5 » flottant, lu hors contexte,
162
+ * n'apprend rien. Le compte doit entrer dans le nom accessible de l'element
163
+ * porteur : « Notifications, 5 non lues », par `etiquetteDuCompte` de l'ancre
164
+ * (`[stBadgeAncre]`) ou compose par l'appelant.
165
+ *
166
+ * Pose dans un porteur `[stBadgeAncre]`, il s'y superpose ; seul, il reste dans le flux.
167
+ */
168
+ export declare class StBadge {
169
+ protected readonly ancre: StBadgeAncre | null;
170
+ readonly valeur: import("@angular/core").InputSignal<string | number | null>;
171
+ readonly max: import("@angular/core").InputSignalWithTransform<number, unknown>;
172
+ readonly ton: import("@angular/core").InputSignal<TonSemantique>;
173
+ /** Point seul, sans chiffre : signale une nouveaute sans la quantifier. */
174
+ readonly point: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
175
+ protected readonly texte: import("@angular/core").Signal<string>;
176
+ /** Rien a montrer : ni chiffre, ni point. La place reste reservee, rien ne saute. */
177
+ protected readonly vide: import("@angular/core").Signal<boolean>;
178
+ protected readonly etiquetteDuCompte: import("@angular/core").Signal<string | null>;
179
+ static ɵfac: i0.ɵɵFactoryDeclaration<StBadge, never>;
180
+ static ɵcmp: i0.ɵɵComponentDeclaration<StBadge, "st-badge", never, {
181
+ "valeur": {
182
+ "alias": "valeur";
183
+ "required": false;
184
+ "isSignal": true;
185
+ };
186
+ "max": {
187
+ "alias": "max";
188
+ "required": false;
189
+ "isSignal": true;
190
+ };
191
+ "ton": {
192
+ "alias": "ton";
193
+ "required": false;
194
+ "isSignal": true;
195
+ };
196
+ "point": {
197
+ "alias": "point";
198
+ "required": false;
199
+ "isSignal": true;
200
+ };
201
+ }, {}, never, never, true, never>;
202
+ }
203
+ /** Le ton de l'etiquette : papier teinte du ton (`discrete`) ou aplat (`pleine`). */
204
+ export type TonDEtiquette = Exclude<Ton, 'discret' | 'inverse'>;
205
+ /**
206
+ * `md` (defaut) : 22 px, 4 x 10 de marge (planches 10 a 12) ; `sm` : 18 px, 2 x 8 (planches 2,
207
+ * 6 et 8), pour une puce de code ou une legende. Le retrait n'existe qu'en `md`.
208
+ */
209
+ export type TailleDEtiquette = 'md' | 'sm';
210
+ /**
211
+ * `discrete` : texte du ton sur son papier teinte ; `pleine` : texte clair sur l'aplat du ton ;
212
+ * `attenuee` : le papier attenue de la marque, plus soutenu que le discret (surtitre en pastille
213
+ * d'un en-tete, planche 2 ; ADR 0005 D44). Seul le ton `primaire` a un papier attenue : un autre
214
+ * ton garde son papier discret.
215
+ */
216
+ export type VarianteDEtiquette = 'discrete' | 'pleine' | 'attenuee';
217
+ /** `mono` : une puce de code ou de reference, en JetBrains Mono (planches 2, 3 et 9). */
218
+ export type PoliceDEtiquette = 'texte' | 'mono';
219
+ /**
220
+ * `phrase` (defaut) : la casse du texte (une reference de code ne se met pas en capitales), en
221
+ * 12/16 ; `capitales` : le micro-libelle de 11 px. 11 px est reserve aux capitales (ADR 0005 D18,
222
+ * D38 ; revue E8).
223
+ */
224
+ export type CasseDEtiquette = 'phrase' | 'capitales';
225
+ /**
226
+ * Etiquette : une puce non interactive (categorie, reference, legende), eventuellement
227
+ * retirable dans un formulaire. Un filtre actif est un `st-filter-chip`.
228
+ *
229
+ * Rendu de reference : les puces des planches 2 a 16 de Claude Design (lot 206) — libelle
230
+ * 11/600 au micro-interlettrage en capitales, 12/16 en casse de phrase (D18), coins de 4 px (la
231
+ * pilule de quelques planches est un ecart assume), point ou icone de tete, police mono.
232
+ *
233
+ * ⚠️ Le retrait DEPLACE LE FOCUS. Sans cela, le bouton disparait sous le doigt de
234
+ * l'utilisateur clavier, le focus retombe sur le corps du document, et la navigation repart du
235
+ * haut de la page. C'est l'un des defauts d'accessibilite les plus frequents des listes
236
+ * d'etiquettes. Le focus va au bouton de retrait de la prochaine etiquette RETIRABLE, puis de la
237
+ * precedente, jamais a un autre bouton de la page ; a defaut, au groupe, ou au premier ancetre
238
+ * focalisable par script. Seul le MOMENT change avec le groupe (D80) : la liste de
239
+ * `[stGroupeDEtiquettes]` le pose avant l'emission ; `st-tag-group`, dont l'application tient les
240
+ * elements, apres leur retrait reel.
241
+ *
242
+ * ⚠️ Le role `listitem` n'est pose que dans la liste de `[stGroupeDEtiquettes]`, et PARTAGE : hors
243
+ * groupe, le role que l'appelant a ecrit (`<st-tag role="listitem">` dans sa propre liste) reste
244
+ * (revue E8 ; une liaison d'hote l'effacait). Dans le `li` de `st-tag-group`, aucun.
245
+ */
246
+ export declare class StTag {
247
+ private readonly element;
248
+ private readonly libelles;
249
+ private readonly groupe;
250
+ /** Le role du groupe, sauf role ecrit par l'appelant ; hors groupe, le sien. */
251
+ private readonly role;
252
+ readonly libelle: import("@angular/core").InputSignal<string>;
253
+ readonly supprimable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
254
+ readonly ton: import("@angular/core").InputSignal<TonDEtiquette>;
255
+ readonly taille: import("@angular/core").InputSignal<TailleDEtiquette>;
256
+ readonly variante: import("@angular/core").InputSignal<VarianteDEtiquette>;
257
+ readonly police: import("@angular/core").InputSignal<PoliceDEtiquette>;
258
+ readonly casse: import("@angular/core").InputSignal<CasseDEtiquette>;
259
+ /** Un point de 6 px a l'encre du ton, devant le libelle (planches 2, 11 et 12). */
260
+ readonly point: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
261
+ /** Une icone de tete, decorative : le libelle porte le sens. */
262
+ readonly iconeAvant: import("@angular/core").InputSignal<Icone | null>;
263
+ readonly supprime: import("@angular/core").OutputEmitterRef<void>;
264
+ constructor();
265
+ /** Le retrait n'existe qu'en `md` : a 18 px, sa cible tomberait sous 24 px. */
266
+ protected readonly retirable: import("@angular/core").Signal<boolean>;
267
+ /**
268
+ * Le nom du bouton de retrait : `LibellesUi.retirerLEtiquette(libelle)`, qui laisse la langue
269
+ * ordonner les mots (« Paris retire » contre « Remove Paris »).
270
+ */
271
+ protected readonly libelleDeSuppression: import("@angular/core").Signal<string>;
272
+ /**
273
+ * Le libelle est souvent une donnee (une ville, un courriel) : sans commande de direction, et
274
+ * isole (`<bdi>`), il ne reordonne ni l'etiquette ni ce qui l'entoure (audit du 2026-09-26, S-1).
275
+ */
276
+ protected readonly libelleAffiche: import("@angular/core").Signal<string>;
277
+ protected auRetrait(): void;
278
+ /**
279
+ * `Suppr` et `Retour arriere` sur le bouton retirent aussi l'etiquette (APG) : la touche que
280
+ * l'on presse naturellement pour effacer une valeur.
281
+ */
282
+ protected auClavier(evenement: Event): void;
283
+ /**
284
+ * Le bouton de retrait de la prochaine etiquette soeur RETIRABLE (une puce sans retrait, ou un
285
+ * autre element, est sautee), a defaut de la precedente. Seules les etiquettes soeurs comptent :
286
+ * un autre bouton voisin n'est pas la suite de la liste.
287
+ */
288
+ private voisineRetirable;
289
+ /** Hors groupe, a defaut de voisine : le premier ancetre focalisable par script. */
290
+ private ancetreFocalisable;
291
+ static ɵfac: i0.ɵɵFactoryDeclaration<StTag, never>;
292
+ static ɵcmp: i0.ɵɵComponentDeclaration<StTag, "st-tag", never, {
293
+ "libelle": {
294
+ "alias": "libelle";
295
+ "required": true;
296
+ "isSignal": true;
297
+ };
298
+ "supprimable": {
299
+ "alias": "supprimable";
300
+ "required": false;
301
+ "isSignal": true;
302
+ };
303
+ "ton": {
304
+ "alias": "ton";
305
+ "required": false;
306
+ "isSignal": true;
307
+ };
308
+ "taille": {
309
+ "alias": "taille";
310
+ "required": false;
311
+ "isSignal": true;
312
+ };
313
+ "variante": {
314
+ "alias": "variante";
315
+ "required": false;
316
+ "isSignal": true;
317
+ };
318
+ "police": {
319
+ "alias": "police";
320
+ "required": false;
321
+ "isSignal": true;
322
+ };
323
+ "casse": {
324
+ "alias": "casse";
325
+ "required": false;
326
+ "isSignal": true;
327
+ };
328
+ "point": {
329
+ "alias": "point";
330
+ "required": false;
331
+ "isSignal": true;
332
+ };
333
+ "iconeAvant": {
334
+ "alias": "iconeAvant";
335
+ "required": false;
336
+ "isSignal": true;
337
+ };
338
+ }, {
339
+ "supprime": "supprime";
340
+ }, never, never, true, never>;
341
+ }
342
+ /**
343
+ * Groupe d'etiquettes retirables : une liste (`role="list"`, chaque `st-tag` en `listitem`) et
344
+ * UNE region polie qui dit ce qui vient d'etre retire (« Paris retire »).
345
+ *
346
+ * ```html
347
+ * <div stGroupeDEtiquettes etiquette="Villes choisies">
348
+ * @for (ville of villes(); track ville) {
349
+ * <st-tag [libelle]="ville" supprimable (supprime)="retirer(ville)" />
350
+ * }
351
+ * </div>
352
+ * ```
353
+ *
354
+ * ⚠️ La region vit dans le GROUPE, et non dans l'etiquette : l'etiquette retiree quitte le
355
+ * document avant que son annonce n'arrive (`rythme.delai.annonce`), et une region detruite ne
356
+ * dit plus rien. Elle est hors de la liste : une liste ne contient que ses elements.
357
+ *
358
+ * ⚠️ La liste est focalisable par script (`tabindex="-1"`, hors de l'ordre de tabulation) : la
359
+ * DERNIERE etiquette retiree y pose le focus, qui sinon retombait sur le corps du document.
360
+ *
361
+ * Les etiquettes projetees recoivent ces crochets par un jeton (D80, partage avec `st-tag-group`) :
362
+ * chacune y est un `listitem`, et son retrait pose le focus et s'annonce AVANT son emission.
363
+ * Des etiquettes decrites en donnees, que l'application retire elle-meme, vont dans
364
+ * `st-tag-group`.
365
+ */
366
+ export declare class StGroupeDEtiquettes {
367
+ private readonly libelles;
368
+ /** Nom de la liste, lu en y entrant (« Villes choisies ») ; `null` : aucun. */
369
+ readonly etiquette: import("@angular/core").InputSignal<string | null>;
370
+ protected readonly annonce: AnnonceLocale;
371
+ private readonly liste;
372
+ /** Appele par une etiquette du groupe au moment ou elle est retiree. */
373
+ annoncerLeRetrait(libelle: string): void;
374
+ /** Appele par une etiquette retiree qui n'a plus de voisine retirable ou poser le focus. */
375
+ recevoirLeFocus(): void;
376
+ static ɵfac: i0.ɵɵFactoryDeclaration<StGroupeDEtiquettes, never>;
377
+ static ɵcmp: i0.ɵɵComponentDeclaration<StGroupeDEtiquettes, "[stGroupeDEtiquettes]", never, {
378
+ "etiquette": {
379
+ "alias": "etiquette";
380
+ "required": false;
381
+ "isSignal": true;
382
+ };
383
+ }, {}, never, ["*"], true, never>;
384
+ }
385
+ /** Une etiquette du groupe, decrite en donnees. */
386
+ export interface EtiquetteDeGroupe {
387
+ /** Cle stable et unique dans le groupe : c'est elle que `supprime` emet. */
388
+ readonly valeur: string;
389
+ readonly libelle: string;
390
+ readonly ton?: TonDEtiquette;
391
+ /** Offre le bouton de retrait, nomme par `retirerLEtiquette` (« Retirer Paris »). */
392
+ readonly supprimable?: boolean;
393
+ }
394
+ /**
395
+ * Le champ qui contient un `st-tag-group` (`st-tag-input`) : le groupe annonce ses retraits dans
396
+ * la region du champ, la seule du champ (D81), et rend le focus au champ quand plus aucune
397
+ * etiquette retirable ne reste.
398
+ */
399
+ export interface ChampAEtiquettes {
400
+ annoncer(message: string): void;
401
+ recevoirLeFocus(): void;
402
+ }
403
+ export declare const ST_CHAMP_A_ETIQUETTES: InjectionToken<ChampAEtiquettes>;
404
+ /**
405
+ * Groupe d'etiquettes decrites en donnees : une liste nommee, `ul > li > st-tag` (lot 252, ADR
406
+ * 0005 D80).
407
+ *
408
+ * ```html
409
+ * <st-tag-group etiquette="Villes choisies" [elements]="villes()" (supprime)="retirer($event)" />
410
+ * ```
411
+ *
412
+ * La liste est nommee SANS compte : le lecteur d'ecran dit deja le nombre d'elements en y
413
+ * entrant. Des etiquettes projetees vont dans `[stGroupeDEtiquettes]`.
414
+ *
415
+ * ⚠️ **Le focus suit le retrait REEL.** `elements` appartient a l'application : le groupe emet
416
+ * `supprime(valeur)` et attend que la valeur ait quitte la liste (apres un aller-retour serveur
417
+ * compris) pour rendre le focus a l'etiquette retirable suivante, sinon a la precedente, sinon a
418
+ * la liste (focalisable par script) — ou au champ qui contient le groupe. Focaliser a la demande
419
+ * visait une etiquette encore presente, puis le document quand elle disparaissait (A1160). Un
420
+ * focus parti ailleurs pendant l'attente n'est jamais repris. L'annonce (« Paris retire ») part
421
+ * au meme moment : elle dit ce qui a quitte la liste, et non ce qui a ete demande.
422
+ */
423
+ export declare class StTagGroup {
424
+ private readonly libelles;
425
+ private readonly document;
426
+ private readonly injecteur;
427
+ protected readonly champ: ChampAEtiquettes | null;
428
+ /** Nom de la liste, lu en y entrant (« Villes choisies »). */
429
+ readonly etiquette: import("@angular/core").InputSignal<string>;
430
+ /** Les etiquettes, dans l'ordre. */
431
+ readonly elements: import("@angular/core").InputSignal<readonly EtiquetteDeGroupe[]>;
432
+ /** La `valeur` de l'etiquette dont la personne demande le retrait. */
433
+ readonly supprime: import("@angular/core").OutputEmitterRef<string>;
434
+ protected readonly annonce: AnnonceLocale;
435
+ private readonly liste;
436
+ private enAttente;
437
+ constructor();
438
+ protected retirer(element: EtiquetteDeGroupe, indice: number): void;
439
+ private annoncer;
440
+ /**
441
+ * Seulement si le focus a ete perdu avec l'etiquette, ou s'il est encore sur ce qui a demande le
442
+ * retrait : la touche suivante (Espace, Entree) activerait sinon la voisine et retirerait une
443
+ * seconde etiquette.
444
+ */
445
+ private rendreLeFocus;
446
+ static ɵfac: i0.ɵɵFactoryDeclaration<StTagGroup, never>;
447
+ static ɵcmp: i0.ɵɵComponentDeclaration<StTagGroup, "st-tag-group", never, {
448
+ "etiquette": {
449
+ "alias": "etiquette";
450
+ "required": true;
451
+ "isSignal": true;
452
+ };
453
+ "elements": {
454
+ "alias": "elements";
455
+ "required": false;
456
+ "isSignal": true;
457
+ };
458
+ }, {
459
+ "supprime": "supprime";
460
+ }, never, never, true, never>;
461
+ }
462
+
463
+ export {};
@@ -1,7 +1,8 @@
1
1
  import { AnnonceLocale, CatalogueDuPointDEntree, Icone, LibellesUi, NiveauDeTitre, NomDIcone } from "@starterlib/ui";
2
2
  import * as i0 from "@angular/core";
3
3
  import { InjectionToken, Provider, Signal, TemplateRef } from "@angular/core";
4
- import { DateIso, EtatDeDocument, Ton, sansCommandesDeDirection } from "@starterlib/util";
4
+ import { Ton, sansCommandesDeDirection } from "@starterlib/util";
5
+ import { DateIso, EtatDeDocument } from "@starterlib/util/valeurs";
5
6
  /**
6
7
  * `pages` : page precedente et suivante, pour un tableau.
7
8
  * `suite` : « Afficher plus », pour une liste qui s'allonge.