@starterlib/ui 0.7.2 → 0.9.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/LICENCES-TIERCES.md +236 -0
- package/README.md +163 -56
- package/assets/icones/catalogue.json +3296 -0
- package/assets/icones/sprite.svg +235 -35
- package/fesm2022/starterlib-ui-arbre.mjs +475 -0
- package/fesm2022/starterlib-ui-arbre.mjs.map +1 -0
- package/fesm2022/starterlib-ui-donnees.mjs +3561 -0
- package/fesm2022/starterlib-ui-donnees.mjs.map +1 -0
- package/fesm2022/starterlib-ui-formulaires.mjs +3186 -442
- package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
- package/fesm2022/starterlib-ui-libelles-en.mjs +383 -0
- package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -0
- package/fesm2022/starterlib-ui-listes.mjs +5367 -0
- package/fesm2022/starterlib-ui-listes.mjs.map +1 -0
- package/fesm2022/starterlib-ui-messagerie.mjs +737 -0
- package/fesm2022/starterlib-ui-messagerie.mjs.map +1 -0
- package/fesm2022/starterlib-ui-navigation.mjs +509 -0
- package/fesm2022/starterlib-ui-navigation.mjs.map +1 -0
- package/fesm2022/starterlib-ui-onglets.mjs +371 -0
- package/fesm2022/starterlib-ui-onglets.mjs.map +1 -0
- package/fesm2022/starterlib-ui-parcours.mjs +2449 -0
- package/fesm2022/starterlib-ui-parcours.mjs.map +1 -0
- package/fesm2022/starterlib-ui-qr.mjs +907 -0
- package/fesm2022/starterlib-ui-qr.mjs.map +1 -0
- package/fesm2022/starterlib-ui-saisie.mjs +8609 -0
- package/fesm2022/starterlib-ui-saisie.mjs.map +1 -0
- package/fesm2022/starterlib-ui-selection.mjs +1341 -0
- package/fesm2022/starterlib-ui-selection.mjs.map +1 -0
- package/fesm2022/starterlib-ui-sens.mjs +59 -0
- package/fesm2022/starterlib-ui-sens.mjs.map +1 -0
- package/fesm2022/starterlib-ui-surfaces.mjs +5140 -1387
- package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
- package/fesm2022/starterlib-ui.mjs +10729 -5689
- package/fesm2022/starterlib-ui.mjs.map +1 -1
- package/package.json +58 -17
- package/styles/amorce.css +69 -0
- package/styles/couches.css +178 -0
- package/types/starterlib-ui-arbre.d.ts +225 -0
- package/types/starterlib-ui-donnees.d.ts +1489 -0
- package/types/starterlib-ui-formulaires.d.ts +1174 -138
- package/types/starterlib-ui-libelles-en.d.ts +5 -0
- package/types/starterlib-ui-listes.d.ts +2487 -0
- package/types/starterlib-ui-messagerie.d.ts +317 -0
- package/types/starterlib-ui-navigation.d.ts +242 -0
- package/types/starterlib-ui-onglets.d.ts +212 -0
- package/types/starterlib-ui-parcours.d.ts +916 -0
- package/types/starterlib-ui-qr.d.ts +105 -0
- package/types/starterlib-ui-saisie.d.ts +3806 -0
- package/types/starterlib-ui-selection.d.ts +488 -0
- package/types/starterlib-ui-sens.d.ts +44 -0
- package/types/starterlib-ui-surfaces.d.ts +1899 -510
- package/types/starterlib-ui.d.ts +4731 -2678
- package/fesm2022/starterlib-ui-interactions.mjs +0 -598
- package/fesm2022/starterlib-ui-interactions.mjs.map +0 -1
- package/types/starterlib-ui-interactions.d.ts +0 -316
|
@@ -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 {};
|
|
@@ -0,0 +1,242 @@
|
|
|
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';
|
|
8
|
+
/**
|
|
9
|
+
* Navigation laterale : une region a cote du contenu sur grand ecran, un tiroir
|
|
10
|
+
* sur petit ecran.
|
|
11
|
+
*
|
|
12
|
+
* ```html
|
|
13
|
+
* <st-app-shell>
|
|
14
|
+
* <button entete stButton [stSidenavToggle]="navigation">Menu</button>
|
|
15
|
+
* <st-sidenav navigation #navigation etiquette="Navigation principale">
|
|
16
|
+
* <a routerLink="/comptes">Comptes</a>
|
|
17
|
+
* </st-sidenav>
|
|
18
|
+
* …
|
|
19
|
+
* </st-app-shell>
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* ⚠️ **Deux modes, jamais confondus.** Persistante, c'est une REGION de la page :
|
|
23
|
+
* aucun piege, rien a ouvrir. Modale, c'est un TIROIR, donc un `StDialog` — role,
|
|
24
|
+
* piegeage du focus, Echap, retour du focus au bouton — et non une region
|
|
25
|
+
* glissee par-dessus la page avec un peu de CSS, qui laisserait le clavier
|
|
26
|
+
* parcourir la page cachee dessous.
|
|
27
|
+
*
|
|
28
|
+
* ⚠️ **Elle porte son propre `<nav>`, et un seul a la fois.** Sur petit ecran,
|
|
29
|
+
* la region en ligne DISPARAIT quand le tiroir prend le relais : laissee en
|
|
30
|
+
* place, elle resterait un repere de navigation vide, que le lecteur d'ecran
|
|
31
|
+
* proposerait sans rien y trouver.
|
|
32
|
+
*
|
|
33
|
+
* Un lien suivi dans le tiroir le ferme : `StDialog` se ferme a toute navigation
|
|
34
|
+
* du routeur.
|
|
35
|
+
*/
|
|
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>;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Bouton qui ouvre la navigation en tiroir.
|
|
111
|
+
*
|
|
112
|
+
* ⚠️ **Masque quand la navigation est persistante.** Un bouton « Menu » qui ne
|
|
113
|
+
* fait rien, parce que la navigation est deja affichee a cote, est un arret de
|
|
114
|
+
* tabulation inutile et une promesse non tenue.
|
|
115
|
+
*
|
|
116
|
+
* ⚠️ `aria-expanded` suit l'ouverture du tiroir : sans lui, rien ne dit a qui
|
|
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.
|
|
203
|
+
*/
|
|
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>;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export {};
|