@starterlib/ui 0.8.0 → 0.9.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 (55) hide show
  1. package/LICENCES-TIERCES.md +236 -0
  2. package/README.md +101 -47
  3. package/assets/icones/catalogue.json +3296 -0
  4. package/assets/icones/sprite.svg +235 -35
  5. package/fesm2022/starterlib-ui-arbre.mjs +473 -80
  6. package/fesm2022/starterlib-ui-arbre.mjs.map +1 -1
  7. package/fesm2022/starterlib-ui-donnees.mjs +3551 -522
  8. package/fesm2022/starterlib-ui-donnees.mjs.map +1 -1
  9. package/fesm2022/starterlib-ui-formulaires.mjs +3186 -443
  10. package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
  11. package/fesm2022/starterlib-ui-libelles-en.mjs +380 -139
  12. package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -1
  13. package/fesm2022/starterlib-ui-listes.mjs +5354 -658
  14. package/fesm2022/starterlib-ui-listes.mjs.map +1 -1
  15. package/fesm2022/starterlib-ui-messagerie.mjs +737 -0
  16. package/fesm2022/starterlib-ui-messagerie.mjs.map +1 -0
  17. package/fesm2022/starterlib-ui-navigation.mjs +506 -243
  18. package/fesm2022/starterlib-ui-navigation.mjs.map +1 -1
  19. package/fesm2022/starterlib-ui-onglets.mjs +369 -135
  20. package/fesm2022/starterlib-ui-onglets.mjs.map +1 -1
  21. package/fesm2022/starterlib-ui-parcours.mjs +2449 -0
  22. package/fesm2022/starterlib-ui-parcours.mjs.map +1 -0
  23. package/fesm2022/starterlib-ui-qr.mjs +907 -0
  24. package/fesm2022/starterlib-ui-qr.mjs.map +1 -0
  25. package/fesm2022/starterlib-ui-saisie.mjs +8566 -1589
  26. package/fesm2022/starterlib-ui-saisie.mjs.map +1 -1
  27. package/fesm2022/starterlib-ui-selection.mjs +1340 -268
  28. package/fesm2022/starterlib-ui-selection.mjs.map +1 -1
  29. package/fesm2022/starterlib-ui-sens.mjs +59 -0
  30. package/fesm2022/starterlib-ui-sens.mjs.map +1 -0
  31. package/fesm2022/starterlib-ui-surfaces.mjs +5140 -1387
  32. package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
  33. package/fesm2022/starterlib-ui.mjs +10721 -2871
  34. package/fesm2022/starterlib-ui.mjs.map +1 -1
  35. package/package.json +27 -18
  36. package/styles/amorce.css +69 -0
  37. package/styles/couches.css +178 -0
  38. package/types/starterlib-ui-arbre.d.ts +199 -25
  39. package/types/starterlib-ui-donnees.d.ts +1441 -180
  40. package/types/starterlib-ui-formulaires.d.ts +1174 -139
  41. package/types/starterlib-ui-libelles-en.d.ts +3 -23
  42. package/types/starterlib-ui-listes.d.ts +2310 -255
  43. package/types/starterlib-ui-messagerie.d.ts +317 -0
  44. package/types/starterlib-ui-navigation.d.ts +201 -63
  45. package/types/starterlib-ui-onglets.d.ts +172 -43
  46. package/types/starterlib-ui-parcours.d.ts +916 -0
  47. package/types/starterlib-ui-qr.d.ts +105 -0
  48. package/types/starterlib-ui-saisie.d.ts +3431 -549
  49. package/types/starterlib-ui-selection.d.ts +441 -65
  50. package/types/starterlib-ui-sens.d.ts +44 -0
  51. package/types/starterlib-ui-surfaces.d.ts +1899 -510
  52. package/types/starterlib-ui.d.ts +4749 -1115
  53. package/fesm2022/starterlib-ui-interactions.mjs +0 -43
  54. package/fesm2022/starterlib-ui-interactions.mjs.map +0 -1
  55. package/types/starterlib-ui-interactions.d.ts +0 -4
@@ -0,0 +1,317 @@
1
+ import * as i0 from "@angular/core";
2
+ import { InjectionToken, Provider, Signal } from "@angular/core";
3
+ import { AnnonceLocale, CatalogueDuPointDEntree } from "@starterlib/ui";
4
+ /**
5
+ * Le modele d'un fil de messages (lot 266) : ce que l'application affiche, deja lu de son API.
6
+ * Le corps est du TEXTE BRUT : aucun HTML n'entre ni ne sort de la messagerie (SEC-6, X11).
7
+ */
8
+ /** `envoi` : parti, sans reponse encore ; `echec` : refuse ou perdu, a reprendre. */
9
+ export type StatutDeMessage = 'envoi' | 'envoye' | 'lu' | 'echec';
10
+ /** `interne` : une note que seuls les agents voient ; `systeme` : un evenement du dossier. */
11
+ export type NatureDeMessage = 'ordinaire' | 'interne' | 'systeme';
12
+ export interface PieceJointeDeMessage {
13
+ readonly nom: string;
14
+ /** Le type EN CLAIR (« PDF », « JPG »), jamais un type MIME : `st-attachment` le dit tel quel. */
15
+ readonly type: string;
16
+ readonly taille?: number | null;
17
+ /** L'adresse de telechargement, sur l'origine du BFF. */
18
+ readonly lien?: string | null;
19
+ }
20
+ export interface MessageAffiche {
21
+ /** Identite stable : elle suit le message, et la reprise d'un envoi la rend. */
22
+ readonly id: string;
23
+ /** Le nom affiche de l'auteur ; ignore pour un message `systeme`. */
24
+ readonly auteur: string;
25
+ /** Sa fonction (« Conseillere »), jamais un droit technique. */
26
+ readonly precision?: string | null;
27
+ readonly avatar?: string | null;
28
+ /** Un instant, avec son decalage (« 2026-09-12T14:02:00+02:00 »). */
29
+ readonly envoyeLe: string;
30
+ /** Texte brut ; une ligne vide separe deux paragraphes. */
31
+ readonly corps: string;
32
+ /** Le message de la personne connectee. */
33
+ readonly soi?: boolean;
34
+ readonly nature?: NatureDeMessage;
35
+ readonly statut?: StatutDeMessage | null;
36
+ readonly piecesJointes?: readonly PieceJointeDeMessage[];
37
+ }
38
+ /** Ce que le composeur remet a l'application ; la cle d'idempotence est la sienne. */
39
+ export interface EnvoiDeMessage {
40
+ readonly texte: string;
41
+ readonly fichiers: readonly File[];
42
+ }
43
+ /**
44
+ * Les libelles de la messagerie (lot 266) : le PREMIER catalogue par point d'entree (AD-10, D147).
45
+ * Ils se chargent avec `@starterlib/ui/messagerie`, jamais au tronc que l'hote peint au premier
46
+ * ecran ; la langue suit celle du dictionnaire du tronc (`ST_LIBELLES`, sa `locale`).
47
+ */
48
+ export interface LibellesMessagerie {
49
+ readonly afficherLesMessagesPrecedents: string;
50
+ /** Dit une fois, hors du fil, quand des messages plus anciens entrent en tete (D-19). */
51
+ readonly messagesPrecedentsAffiches: (nombre: number) => string;
52
+ /** Le nom d'un message : son auteur et son heure (« Marie Dupont, 12/09 14:02 »). */
53
+ readonly messageDe: (auteur: string, quand: string) => string;
54
+ readonly noteInterne: string;
55
+ readonly envoiEnCours: string;
56
+ readonly envoye: string;
57
+ readonly lu: string;
58
+ readonly echecDeLEnvoi: string;
59
+ readonly reessayer: string;
60
+ /** Le nom du bouton de reprise : il dit QUEL message (« ... du 12/09 14:02 »). */
61
+ readonly reessayerLEnvoiDu: (quand: string) => string;
62
+ readonly piecesJointes: string;
63
+ readonly votreMessage: string;
64
+ readonly joindreDesFichiers: string;
65
+ readonly envoyer: string;
66
+ /** L'aide du composeur : le raccourci d'envoi. */
67
+ readonly raccourciDEnvoi: string;
68
+ }
69
+ export declare const LIBELLES_MESSAGERIE_FR: LibellesMessagerie;
70
+ export declare const LIBELLES_MESSAGERIE_EN: LibellesMessagerie;
71
+ /**
72
+ * Les catalogues de la messagerie par langue (sous-etiquette primaire : `fr`, `en`). Une application
73
+ * qui ajoute une langue au dictionnaire du tronc ajoute la sienne ici, par
74
+ * `fournirLibellesMessagerie({ de: ... })`.
75
+ */
76
+ export declare const ST_LIBELLES_MESSAGERIE: InjectionToken<Readonly<Record<string, LibellesMessagerie>>>;
77
+ /** Ajoute (ou remplace) des catalogues de la messagerie, par langue. */
78
+ export declare function fournirLibellesMessagerie(catalogues: Readonly<Record<string, LibellesMessagerie>>): Provider;
79
+ /**
80
+ * Le catalogue de la langue du dictionnaire du tronc ; le francais quand la langue n'en a pas, un
81
+ * repli signale en developpement (audit du 2026-09-27, D-29). A appeler dans un contexte
82
+ * d'injection.
83
+ */
84
+ export declare function libellesDeLaMessagerie(): Signal<LibellesMessagerie>;
85
+ /**
86
+ * Le catalogue de la messagerie ET la langue de son repli (`catalogueDuPointDEntree`) : `lang` de
87
+ * ce qu'il ecrit seul (audit du 2026-09-27, D-29). A appeler dans un contexte d'injection.
88
+ */
89
+ export declare function catalogueDeLaMessagerie(): Signal<CatalogueDuPointDEntree<LibellesMessagerie>>;
90
+ /**
91
+ * Un message d'un fil (lot 266) : un `article` NOMME par son auteur et son heure (« Marie Dupont,
92
+ * 12/09 14:02 »), l'auteur (`st-person`), l'heure (`time`), le corps en paragraphes, les pieces
93
+ * jointes (`st-attachment`), le statut de l'envoi.
94
+ *
95
+ * - Le corps est du TEXTE BRUT, interpole : « <img onerror> » ou « javascript: » s'affichent tels
96
+ * quels (SEC-6, X11). Une ligne vide separe deux paragraphes ; aucun lien n'est fabrique.
97
+ * - `echec` : un bouton « Reessayer », nomme par le message qu'il reprend (« Reessayer l'envoi du
98
+ * message du 12/09 14:02 ») ; la reprise emet l'identite du message, la cle d'idempotence reste
99
+ * celle de l'application. Pendant l'envoi qu'il relance, le MEME bouton reste, en chargement :
100
+ * il garde le focus ; parti avec l'envoi abouti, le focus va a l'article, jamais au corps de la
101
+ * page (audit UI du 2026-09-27, D-24, modele de `st-file-upload`).
102
+ * - Les statuts ne parlent pas (`aria-live="off"`) : dans le fil vivant, « Envoye » puis « Lu »
103
+ * seraient des insertions lues, pour chaque message. L'echec seul parle (D-19).
104
+ * - `interne` : une note que seuls les agents voient, dite en toutes lettres ; `systeme` : un
105
+ * evenement du dossier, centre, sans auteur.
106
+ * - Catalogue retombe sur le francais : `lang="fr"` sur ce qu'il ecrit seul (statuts, note
107
+ * interne, reprise), jamais sur le corps ni sur l'auteur (audit du 2026-09-27, D-29).
108
+ */
109
+ export declare class StMessage {
110
+ private readonly locale;
111
+ private readonly fuseau;
112
+ private readonly element;
113
+ private readonly document;
114
+ private readonly injecteur;
115
+ private readonly article;
116
+ private readonly catalogue;
117
+ protected readonly libelles: Signal<LibellesMessagerie>;
118
+ /**
119
+ * `fr` quand le catalogue retombe sur le francais, `null` sinon : le `lang` de ce qu'il ecrit
120
+ * seul. Le nom de l'article et la liste des pieces jointes melent le catalogue a des donnees
121
+ * (l'auteur, les fichiers) : ils gardent la langue de la page (D-29).
122
+ */
123
+ protected readonly langueDeRepli: Signal<string | null>;
124
+ readonly message: import("@angular/core").InputSignal<MessageAffiche>;
125
+ /** La reprise d'un envoi en echec : l'identite du message. */
126
+ readonly reessai: import("@angular/core").OutputEmitterRef<string>;
127
+ protected readonly nature: Signal<NatureDeMessage>;
128
+ protected readonly statut: Signal<StatutDeMessage | null>;
129
+ /** La reprise demandee par CE bouton, le temps de l'envoi qu'elle relance (D-24). */
130
+ private readonly repriseDemandee;
131
+ /** « Reessayer » : a l'echec, puis pendant la reprise qu'il a lancee, en chargement. */
132
+ protected readonly repriseVisible: Signal<boolean>;
133
+ constructor();
134
+ private readonly instant;
135
+ /** « 14:02 » : le jour est dit par le fil. */
136
+ protected readonly heure: Signal<string>;
137
+ /** « 12/09 14:02 » : le nom du message et celui de sa reprise disent le jour. */
138
+ protected readonly quand: Signal<string>;
139
+ protected readonly nom: Signal<string>;
140
+ /**
141
+ * Les paragraphes du corps : separes par une ligne vide, les retours simples gardes. Le corps
142
+ * vient de l'autre partie : sans commande de direction, chaque paragraphe isole (`dir="auto"`),
143
+ * un IBAN ou un montant cite ne s'affiche pas retourne (audit du 2026-09-27, A-2).
144
+ */
145
+ protected readonly paragraphes: Signal<string[]>;
146
+ protected readonly pieces: Signal<readonly PieceJointeDeMessage[]>;
147
+ /** Le bouton reste, et tourne, pendant l'envoi qu'il relance (D-24). */
148
+ protected reprendre(): void;
149
+ private formater;
150
+ static ɵfac: i0.ɵɵFactoryDeclaration<StMessage, never>;
151
+ static ɵcmp: i0.ɵɵComponentDeclaration<StMessage, "st-message", never, {
152
+ "message": {
153
+ "alias": "message";
154
+ "required": true;
155
+ "isSignal": true;
156
+ };
157
+ }, {
158
+ "reessai": "reessai";
159
+ }, never, never, true, never>;
160
+ }
161
+ /** Les messages d'un meme jour, dans l'ordre du fil. */
162
+ interface JourDuFil {
163
+ /** `2026-09-12`, dans le fuseau de l'application. */
164
+ readonly jour: string;
165
+ /** « samedi 12 septembre 2026 ». */
166
+ readonly titre: string;
167
+ readonly messages: readonly MessageAffiche[];
168
+ }
169
+ /**
170
+ * Le fil d'une conversation (lot 266) : les messages d'un dossier, groupes par jour.
171
+ *
172
+ * ```html
173
+ * <st-message-thread etiquette="Echanges avec votre conseillere" [messages]="messages()"
174
+ * [precedents]="aDesPrecedents()" (chargerPrecedents)="chargerPlusTot()"
175
+ * (reessai)="renvoyer($event)" />
176
+ * ```
177
+ *
178
+ * - Vivant (defaut) : une region `role="log"` NOMMEE : un message ajoute s'annonce poliment, sans
179
+ * voler le focus. Fige (`fige`, un historique clos) : une liste ordonnee, sans region vivante.
180
+ * - Les jours se separent par leur date longue ; chaque message dit son jour dans son nom.
181
+ * - « Afficher les messages precedents » en tete quand il y en a (`precedents`) ; le chargement
182
+ * appartient a l'application, qui le dit par `chargementDesPrecedents` : le bouton tourne, et le
183
+ * fil reste occupe (`aria-busy`) jusqu'a l'insertion EN TETE, que le `log` lirait sinon comme
184
+ * des messages nouveaux. Leur nombre se dit une fois (« 2 messages precedents affiches ») ; le
185
+ * bouton parti avec les derniers, le focus va au premier message (audit UI du 2026-09-27, D-19).
186
+ * - Catalogue retombe sur le francais : `lang="fr"` sur ce bouton et sur cette annonce, qu'il
187
+ * ecrit seul ; jamais sur le fil, que nomme l'application (audit du 2026-09-27, D-29).
188
+ */
189
+ export declare class StMessageThread {
190
+ private readonly locale;
191
+ private readonly fuseau;
192
+ private readonly element;
193
+ private readonly document;
194
+ private readonly injecteur;
195
+ private readonly catalogue;
196
+ protected readonly libelles: Signal<LibellesMessagerie>;
197
+ /** `fr` quand le catalogue retombe sur le francais, `null` sinon (D-29). */
198
+ protected readonly langueDeRepli: Signal<string | null>;
199
+ /** Le nom du fil, deja traduit (« Echanges avec votre conseillere »). */
200
+ readonly etiquette: import("@angular/core").InputSignal<string>;
201
+ /** Du plus ancien au plus recent. */
202
+ readonly messages: import("@angular/core").InputSignal<readonly MessageAffiche[]>;
203
+ /** Un historique clos : une liste, sans region vivante. */
204
+ readonly fige: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
205
+ /** Des messages plus anciens existent : le bouton de chargement se montre. */
206
+ readonly precedents: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
207
+ /**
208
+ * Des messages plus anciens sont demandes (apres `chargerPrecedents`) : le bouton le dit
209
+ * (`chargement`), et le fil porte `aria-busy` (D-19).
210
+ */
211
+ readonly chargementDesPrecedents: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
212
+ readonly chargerPrecedents: import("@angular/core").OutputEmitterRef<void>;
213
+ /** La reprise d'un envoi en echec : l'identite du message. */
214
+ readonly reessai: import("@angular/core").OutputEmitterRef<string>;
215
+ protected readonly annonce: AnnonceLocale;
216
+ /** Des messages viennent d'entrer EN TETE : le fil reste occupe, le temps d'etre relu. */
217
+ private readonly insertionEnCours;
218
+ protected readonly occupe: Signal<boolean>;
219
+ constructor();
220
+ protected readonly jours: Signal<readonly JourDuFil[]>;
221
+ static ɵfac: i0.ɵɵFactoryDeclaration<StMessageThread, never>;
222
+ static ɵcmp: i0.ɵɵComponentDeclaration<StMessageThread, "st-message-thread", never, {
223
+ "etiquette": {
224
+ "alias": "etiquette";
225
+ "required": true;
226
+ "isSignal": true;
227
+ };
228
+ "messages": {
229
+ "alias": "messages";
230
+ "required": true;
231
+ "isSignal": true;
232
+ };
233
+ "fige": {
234
+ "alias": "fige";
235
+ "required": false;
236
+ "isSignal": true;
237
+ };
238
+ "precedents": {
239
+ "alias": "precedents";
240
+ "required": false;
241
+ "isSignal": true;
242
+ };
243
+ "chargementDesPrecedents": {
244
+ "alias": "chargementDesPrecedents";
245
+ "required": false;
246
+ "isSignal": true;
247
+ };
248
+ }, {
249
+ "chargerPrecedents": "chargerPrecedents";
250
+ "reessai": "reessai";
251
+ }, never, never, true, never>;
252
+ }
253
+ /**
254
+ * Le composeur d'un fil (lot 266) : un texte brut, des pieces jointes, « Envoyer ».
255
+ *
256
+ * ```html
257
+ * <st-message-composer (envoi)="envoyer($event)" [envoiEnCours]="envoi.enCours()" />
258
+ * ```
259
+ *
260
+ * - TEXTE BRUT : l'editeur riche reste ecarte, aucun HTML n'entre ni ne sort (SEC-6).
261
+ * - « Envoyer » est indisponible a vide ; Ctrl+Entree (Cmd+Entree) envoie aussi, depuis le champ.
262
+ * - Le brouillon n'est JAMAIS stocke dans le navigateur (ni `localStorage`, ni `sessionStorage` :
263
+ * garde de lint) ; il vit le temps de l'ecran.
264
+ * - L'envoi remet le texte et les fichiers a l'application, puis vide le composeur : le message
265
+ * entre dans le fil, et c'est la qu'un echec se reprend. La cle d'idempotence est posee par
266
+ * l'application (son intercepteur), jamais ici.
267
+ * - Catalogue retombe sur le francais : `lang="fr"` sur « Envoyer » (audit du 2026-09-27, D-29).
268
+ * L'etiquette et l'aide du champ, ecrites par `st-textarea` avec la zone de saisie, gardent la
269
+ * langue de la page : un `lang` sur la zone ferait passer son correcteur au francais.
270
+ */
271
+ export declare class StMessageComposer {
272
+ private readonly catalogue;
273
+ protected readonly libelles: Signal<LibellesMessagerie>;
274
+ /** `fr` quand le catalogue retombe sur le francais, `null` sinon (D-29). */
275
+ protected readonly langueDeRepli: Signal<string | null>;
276
+ /** Le nom du champ ; defaut : « Votre message ». */
277
+ readonly etiquette: import("@angular/core").InputSignal<string | null>;
278
+ /** Les pieces jointes permises (`accept`) ; vide : aucune. */
279
+ readonly piecesJointes: import("@angular/core").InputSignal<string>;
280
+ readonly tailleMax: import("@angular/core").InputSignal<number | null>;
281
+ /** Un envoi precedent est en cours : « Envoyer » attend. */
282
+ readonly envoiEnCours: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
283
+ readonly envoi: import("@angular/core").OutputEmitterRef<EnvoiDeMessage>;
284
+ protected readonly texte: import("@angular/core").WritableSignal<string>;
285
+ protected readonly fichiers: import("@angular/core").WritableSignal<readonly File[]>;
286
+ protected readonly nom: Signal<string>;
287
+ protected readonly vide: Signal<boolean>;
288
+ protected envoyer(evenement?: Event): void;
289
+ protected auClavier(evenement: KeyboardEvent): void;
290
+ static ɵfac: i0.ɵɵFactoryDeclaration<StMessageComposer, never>;
291
+ static ɵcmp: i0.ɵɵComponentDeclaration<StMessageComposer, "st-message-composer", never, {
292
+ "etiquette": {
293
+ "alias": "etiquette";
294
+ "required": false;
295
+ "isSignal": true;
296
+ };
297
+ "piecesJointes": {
298
+ "alias": "piecesJointes";
299
+ "required": false;
300
+ "isSignal": true;
301
+ };
302
+ "tailleMax": {
303
+ "alias": "tailleMax";
304
+ "required": false;
305
+ "isSignal": true;
306
+ };
307
+ "envoiEnCours": {
308
+ "alias": "envoiEnCours";
309
+ "required": false;
310
+ "isSignal": true;
311
+ };
312
+ }, {
313
+ "envoi": "envoi";
314
+ }, never, never, true, never>;
315
+ }
316
+
317
+ export {};
@@ -1,6 +1,10 @@
1
- import * as _angular_core from '@angular/core';
2
-
3
- type ModeDeNavigation = 'auto' | 'persistant' | 'modal';
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * `rail` (lot 176) : RESERVE au rail de 72 px de la planche 6 (D22 : tiroir sous `md`, rail de `md` a
4
+ * `xl`, colonne au-dela), que le lot 235 dessine. Le type est fixe des la 0.9 pour que ce lot ne
5
+ * change pas une sortie publique (`modeEffectif`) ; d'ici la, le rail se rend en colonne.
6
+ */
7
+ export type ModeDeNavigation = 'auto' | 'persistant' | 'modal' | 'rail';
4
8
  /**
5
9
  * Navigation laterale : une region a cote du contenu sur grand ecran, un tiroir
6
10
  * sur petit ecran.
@@ -29,61 +33,79 @@ type ModeDeNavigation = 'auto' | 'persistant' | 'modal';
29
33
  * Un lien suivi dans le tiroir le ferme : `StDialog` se ferme a toute navigation
30
34
  * du routeur.
31
35
  */
32
- declare class StSidenav {
33
- private readonly injecteur;
34
- private readonly libelles;
35
- /**
36
- * Nom du repere. `null` : « Navigation principale », du dictionnaire. A
37
- * renseigner des qu'une page compte deux navigations, qui doivent se
38
- * distinguer.
39
- */
40
- readonly etiquette: _angular_core.InputSignal<string | null>;
41
- protected readonly etiquetteLue: _angular_core.Signal<string>;
42
- /** `auto` : persistante sur grand ecran, tiroir en dessous. */
43
- readonly mode: _angular_core.InputSignal<ModeDeNavigation>;
44
- readonly identifiant: string;
45
- private readonly ecranLarge;
46
- /** Mode reellement applique. Lu par le bouton, qui ne s'affiche qu'en tiroir. */
47
- readonly modeEffectif: _angular_core.Signal<"persistant" | "modal">;
48
- private readonly ouvertInterne;
49
- readonly ouvert: _angular_core.Signal<boolean>;
50
- private readonly gabarit;
51
- private reference;
52
- private ouvertureEnCours;
53
- private detruit;
54
- /**
55
- * Le service de dialogue, charge a la PREMIERE ouverture et garde ensuite.
56
- * Rend `null` si le composant a ete detruit pendant l'attente.
57
- *
58
- * ⚠️ Le specificateur etant dans la carte d'importation de l'application
59
- * federee, cet import dynamique resout vers l'INSTANCE PARTAGEE du point
60
- * d'entree : le tiroir emploie le meme `StDialog`, le meme recouvrement et la
61
- * meme pile que le reste de l'application. Un import dynamique ne dedouble
62
- * rien ; il decale seulement le moment du telechargement.
63
- *
64
- * ⚠️ **Le controle de destruction est ICI, avant `injecteur.get`, et non chez
65
- * l'appelant.** Un injecteur detruit ne rend pas `undefined` : il LEVE
66
- * (NG0205). Le controle place apres la resolution du service arrivait donc
67
- * trop tard, et une navigation pendant le chargement du module produisait un
68
- * rejet non gere — invisible en developpement, remonte comme erreur
69
- * applicative en production, puisque `basculer()` appelle `ouvrir()` sans
70
- * attendre sa promesse.
71
- */
72
- private serviceDeDialogue;
73
- constructor();
74
- /**
75
- * Ouvre le tiroir. Asynchrone depuis la 0.8.0 : le module du dialogue se
76
- * charge a la demande. La promesse est tenue quand le tiroir est a l'ecran —
77
- * un test l'attend, l'appelant ordinaire n'a rien a en faire.
78
- */
79
- ouvrir(): Promise<void>;
80
- fermer(): void;
81
- /** Reste synchrone : c'est ce que lit la liaison de clic du bouton. */
82
- basculer(): void;
83
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSidenav, never>;
84
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSidenav, "st-sidenav", never, { "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
36
+ export declare class StSidenav {
37
+ private readonly injecteur;
38
+ private readonly libelles;
39
+ /**
40
+ * Nom du repere. `null` : « Navigation principale », du dictionnaire. A
41
+ * renseigner des qu'une page compte deux navigations, qui doivent se
42
+ * distinguer.
43
+ */
44
+ readonly etiquette: import("@angular/core").InputSignal<string | null>;
45
+ protected readonly etiquetteLue: import("@angular/core").Signal<string>;
46
+ /** `auto` : persistante sur grand ecran, tiroir en dessous. */
47
+ readonly mode: import("@angular/core").InputSignal<ModeDeNavigation>;
48
+ protected readonly identifiant: string;
49
+ private readonly ecranLarge;
50
+ /** Mode reellement applique. Lu par le bouton, qui ne s'affiche qu'en tiroir. */
51
+ readonly modeEffectif: import("@angular/core").Signal<"persistant" | "modal" | "rail">;
52
+ private readonly ouvertInterne;
53
+ readonly ouvert: import("@angular/core").Signal<boolean>;
54
+ private readonly chargementDuTiroir;
55
+ /**
56
+ * Le module du tiroir se charge encore, passe `rythme.delai.attente` (03 §3.9,
57
+ * MV-12). Lu par le bouton de bascule, qui pose `aria-busy` : sans lui,
58
+ * l'ouverture differee etait INVISIBLE, et un second clic semblait necessaire.
59
+ * Pas d'indicateur dans un bouton-icone de 44 px : le curseur d'attente suffit.
60
+ */
61
+ readonly enAttente: import("@angular/core").Signal<boolean>;
62
+ private readonly gabarit;
63
+ private reference;
64
+ private ouvertureEnCours;
65
+ private detruit;
66
+ /**
67
+ * Le service de dialogue, charge a la PREMIERE ouverture et garde ensuite.
68
+ * Rend `null` si le composant a ete detruit pendant l'attente.
69
+ *
70
+ * ⚠️ Le specificateur etant dans la carte d'importation de l'application
71
+ * federee, cet import dynamique resout vers l'INSTANCE PARTAGEE du point
72
+ * d'entree : le tiroir emploie le meme `StDialog`, le meme recouvrement et la
73
+ * meme pile que le reste de l'application. Un import dynamique ne dedouble
74
+ * rien ; il decale seulement le moment du telechargement.
75
+ *
76
+ * ⚠️ **Le controle de destruction est ICI, avant `injecteur.get`, et non chez
77
+ * l'appelant.** Un injecteur detruit ne rend pas `undefined` : il LEVE
78
+ * (NG0205). Le controle place apres la resolution du service arrivait donc
79
+ * trop tard, et une navigation pendant le chargement du module produisait un
80
+ * rejet non gere — invisible en developpement, remonte comme erreur
81
+ * applicative en production, puisque `basculer()` appelle `ouvrir()` sans
82
+ * attendre sa promesse.
83
+ */
84
+ private serviceDeDialogue;
85
+ constructor();
86
+ /**
87
+ * Ouvre le tiroir. Asynchrone depuis la 0.8.0 : le module du dialogue se
88
+ * charge a la demande. La promesse est tenue quand le tiroir est a l'ecran —
89
+ * un test l'attend, l'appelant ordinaire n'a rien a en faire.
90
+ */
91
+ ouvrir(): Promise<void>;
92
+ fermer(): void;
93
+ /** Reste synchrone : c'est ce que lit la liaison de clic du bouton. */
94
+ basculer(): void;
95
+ static ɵfac: i0.ɵɵFactoryDeclaration<StSidenav, never>;
96
+ static ɵcmp: i0.ɵɵComponentDeclaration<StSidenav, "st-sidenav", never, {
97
+ "etiquette": {
98
+ "alias": "etiquette";
99
+ "required": false;
100
+ "isSignal": true;
101
+ };
102
+ "mode": {
103
+ "alias": "mode";
104
+ "required": false;
105
+ "isSignal": true;
106
+ };
107
+ }, {}, never, ["*"], true, never>;
85
108
  }
86
-
87
109
  /**
88
110
  * Bouton qui ouvre la navigation en tiroir.
89
111
  *
@@ -93,12 +115,128 @@ declare class StSidenav {
93
115
  *
94
116
  * ⚠️ `aria-expanded` suit l'ouverture du tiroir : sans lui, rien ne dit a qui
95
117
  * n'en voit pas l'effet que le bouton a agi.
118
+ *
119
+ * `aria-busy` pendant le chargement DIFFERE du tiroir, passe le delai d'attente
120
+ * (MV-12) : le clic a ete pris, la navigation arrive.
121
+ */
122
+ export declare class StSidenavToggle {
123
+ readonly stSidenavToggle: import("@angular/core").InputSignal<StSidenav>;
124
+ static ɵfac: i0.ɵɵFactoryDeclaration<StSidenavToggle, never>;
125
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StSidenavToggle, "[stSidenavToggle]", never, {
126
+ "stSidenavToggle": {
127
+ "alias": "stSidenavToggle";
128
+ "required": true;
129
+ "isSignal": true;
130
+ };
131
+ }, {}, never, never, true, never>;
132
+ }
133
+ /** Un onglet de navigation : une ROUTE, son libelle deja traduit, un compte optionnel. */
134
+ export interface OngletDeNavigation {
135
+ readonly libelle: string;
136
+ readonly lien: string | readonly unknown[];
137
+ /** Actif sur la route exacte seulement (un onglet « Vue d'ensemble » a la racine du dossier). */
138
+ readonly exact?: boolean;
139
+ /** Un compte : visible en pastille, lu dans le nom (« Documents, 3 »), comme `st-tabs`. */
140
+ readonly compte?: number | null;
141
+ }
142
+ /**
143
+ * La navigation secondaire d'une page par ROUTES (lot 245) : les sections d'un dossier client
144
+ * (« Vue d'ensemble », « Documents », « Historique »), chacune a son adresse.
145
+ *
146
+ * ```html
147
+ * <st-page-header titre="Dossier 2026-0412">
148
+ * <st-nav-tabs etiquette="Sections du dossier" [onglets]="sections" />
149
+ * </st-page-header>
150
+ * ```
151
+ *
152
+ * - Une `nav` NOMMEE, une liste, des liens : jamais `role="tablist"` (des onglets sans panneaux
153
+ * mentent). Un commutateur de vue sur place est un `st-segmented-control` ; des panneaux sur
154
+ * place, `st-tabs`.
155
+ * - Le lien courant porte `aria-current="page"` (le routeur) : graisse, aplat et marqueur de
156
+ * `st-tabs`, jamais la couleur seule ; sous contraste force, le marqueur reste.
157
+ * - Un compte se voit en pastille et se lit dans le nom (« Documents, 3 »), formate a la locale.
158
+ * - La liste defile horizontalement quand elle deborde, ombres aux bords ; aucun libelle tronque.
159
+ *
160
+ * Dans `ui/navigation` et non au tronc : la coquille ne la peint pas (D144).
161
+ */
162
+ export declare class StNavTabs {
163
+ private readonly locale;
164
+ private readonly formatDesComptes;
165
+ readonly onglets: import("@angular/core").InputSignal<readonly OngletDeNavigation[]>;
166
+ /** Le nom de la navigation (« Sections du dossier »), deja traduit : distinct de la principale. */
167
+ readonly etiquette: import("@angular/core").InputSignal<string>;
168
+ protected compteDe(compte: number): string;
169
+ static ɵfac: i0.ɵɵFactoryDeclaration<StNavTabs, never>;
170
+ static ɵcmp: i0.ɵɵComponentDeclaration<StNavTabs, "st-nav-tabs", never, {
171
+ "onglets": {
172
+ "alias": "onglets";
173
+ "required": true;
174
+ "isSignal": true;
175
+ };
176
+ "etiquette": {
177
+ "alias": "etiquette";
178
+ "required": true;
179
+ "isSignal": true;
180
+ };
181
+ }, {}, never, never, true, never>;
182
+ }
183
+ /** Une entree du sommaire : l'`id` de la section cible, et son libelle deja traduit. */
184
+ export interface EntreeDeSommaire {
185
+ readonly cible: string;
186
+ readonly libelle: string;
187
+ }
188
+ /**
189
+ * Le sommaire d'une longue page (lot 245) : des ancres vers ses sections (conditions generales,
190
+ * aide, mentions). Une `nav` nommee « Sommaire », une liste ordonnee de liens `#id`.
191
+ *
192
+ * ```html
193
+ * <st-page-nav [entrees]="[{ cible: 'frais', libelle: 'Frais' }, { cible: 'resiliation', libelle: 'Resiliation' }]" />
194
+ * ```
195
+ *
196
+ * - Un clic fait defiler jusqu'a la section et Y PORTE LE FOCUS (le titre de la section, rendu
197
+ * focalisable par script) : la personne au clavier continue la ou elle lit. Aucune navigation du
198
+ * routeur ; l'adresse garde l'ancre (`history.replaceState`), pour un lien partage.
199
+ * - La section courante (la premiere visible) porte `aria-current="location"`, vue par un
200
+ * `IntersectionObserver` ; graisse et trait de debut de ligne, jamais la couleur seule.
201
+ * - Un titre visible (« Sommaire », ou `etiquette`) nomme la navigation.
202
+ * - Collee a partir de `lg` (`collee`), a cote du contenu.
96
203
  */
97
- declare class StSidenavToggle {
98
- readonly stSidenavToggle: _angular_core.InputSignal<StSidenav>;
99
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSidenavToggle, never>;
100
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StSidenavToggle, "[stSidenavToggle]", never, { "stSidenavToggle": { "alias": "stSidenavToggle"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
204
+ export declare class StPageNav {
205
+ private readonly document;
206
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui").LibellesUi>;
207
+ readonly entrees: import("@angular/core").InputSignal<readonly EntreeDeSommaire[]>;
208
+ /** Le nom de la navigation ; defaut : « Sommaire ». */
209
+ readonly etiquette: import("@angular/core").InputSignal<string | null>;
210
+ readonly collee: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
211
+ protected readonly nom: import("@angular/core").Signal<string>;
212
+ protected readonly idDuTitre: string;
213
+ /** L'`id` de la section courante : la premiere que l'ecran montre. */
214
+ protected readonly courante: import("@angular/core").WritableSignal<string | null>;
215
+ constructor();
216
+ /**
217
+ * Aller a la section : defiler, porter le focus a son TITRE (une section entiere focalisee se
218
+ * lirait d'un bloc ; la cible elle-meme quand elle est un titre ou n'en contient pas), garder
219
+ * l'ancre dans l'adresse.
220
+ */
221
+ protected aller(evenement: MouseEvent, cible: string): void;
222
+ static ɵfac: i0.ɵɵFactoryDeclaration<StPageNav, never>;
223
+ static ɵcmp: i0.ɵɵComponentDeclaration<StPageNav, "st-page-nav", never, {
224
+ "entrees": {
225
+ "alias": "entrees";
226
+ "required": true;
227
+ "isSignal": true;
228
+ };
229
+ "etiquette": {
230
+ "alias": "etiquette";
231
+ "required": false;
232
+ "isSignal": true;
233
+ };
234
+ "collee": {
235
+ "alias": "collee";
236
+ "required": false;
237
+ "isSignal": true;
238
+ };
239
+ }, {}, never, never, true, never>;
101
240
  }
102
241
 
103
- export { StSidenav, StSidenavToggle };
104
- export type { ModeDeNavigation };
242
+ export {};