@starterlib/ui 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +95 -42
- package/fesm2022/starterlib-ui-arbre.mjs +82 -0
- package/fesm2022/starterlib-ui-arbre.mjs.map +1 -0
- package/fesm2022/starterlib-ui-donnees.mjs +532 -0
- package/fesm2022/starterlib-ui-donnees.mjs.map +1 -0
- package/fesm2022/starterlib-ui-formulaires.mjs +2 -1
- package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
- package/fesm2022/starterlib-ui-interactions.mjs +34 -589
- package/fesm2022/starterlib-ui-interactions.mjs.map +1 -1
- package/fesm2022/starterlib-ui-libelles-en.mjs +142 -0
- package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -0
- package/fesm2022/starterlib-ui-listes.mjs +671 -0
- package/fesm2022/starterlib-ui-listes.mjs.map +1 -0
- package/fesm2022/starterlib-ui-navigation.mjs +246 -0
- package/fesm2022/starterlib-ui-navigation.mjs.map +1 -0
- package/fesm2022/starterlib-ui-onglets.mjs +137 -0
- package/fesm2022/starterlib-ui-onglets.mjs.map +1 -0
- package/fesm2022/starterlib-ui-saisie.mjs +1632 -0
- package/fesm2022/starterlib-ui-saisie.mjs.map +1 -0
- package/fesm2022/starterlib-ui-selection.mjs +269 -0
- package/fesm2022/starterlib-ui-selection.mjs.map +1 -0
- package/fesm2022/starterlib-ui.mjs +105 -2931
- package/fesm2022/starterlib-ui.mjs.map +1 -1
- package/package.json +35 -3
- package/types/starterlib-ui-arbre.d.ts +51 -0
- package/types/starterlib-ui-donnees.d.ts +228 -0
- package/types/starterlib-ui-formulaires.d.ts +5 -4
- package/types/starterlib-ui-interactions.d.ts +4 -316
- package/types/starterlib-ui-libelles-en.d.ts +25 -0
- package/types/starterlib-ui-listes.d.ts +432 -0
- package/types/starterlib-ui-navigation.d.ts +104 -0
- package/types/starterlib-ui-onglets.d.ts +89 -0
- package/types/starterlib-ui-saisie.d.ts +924 -0
- package/types/starterlib-ui-selection.d.ts +112 -0
- package/types/starterlib-ui.d.ts +9 -1575
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { TemplateRef } from '@angular/core';
|
|
3
|
+
import * as _starterlib_ui from '@starterlib/ui';
|
|
4
|
+
import { AnnonceLocale } from '@starterlib/ui';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* `pages` : page precedente et suivante, pour un tableau.
|
|
8
|
+
* `suite` : « Afficher plus », pour une liste qui s'allonge.
|
|
9
|
+
*/
|
|
10
|
+
type ModeDePagination = 'pages' | 'suite';
|
|
11
|
+
/** Ce qui peut recevoir le focus apres un changement de page. */
|
|
12
|
+
interface Focalisable {
|
|
13
|
+
focus(options?: FocusOptions): void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Pagination d'une liste par curseur.
|
|
17
|
+
*
|
|
18
|
+
* ```html
|
|
19
|
+
* <st-data-table #tableau … />
|
|
20
|
+
* <st-pagination
|
|
21
|
+
* [numero]="navigation.numeroDePage()"
|
|
22
|
+
* [precedenteDisponible]="navigation.precedenteDisponible()"
|
|
23
|
+
* [suivanteDisponible]="page.value()?.hasMore ?? false"
|
|
24
|
+
* [chargement]="page.isLoading()"
|
|
25
|
+
* [cible]="tableau"
|
|
26
|
+
* (precedente)="navigation.precedente()"
|
|
27
|
+
* (suivante)="navigation.suivante(page.value())"
|
|
28
|
+
* />
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* ⚠️ **Ni total, ni numeros cliquables** : le backend ne compte pas et ne va que
|
|
32
|
+
* vers l'avant (audit de la vague 4, V4-2). « Page 3 » se dit ; « page 3 sur 12 »
|
|
33
|
+
* serait invente.
|
|
34
|
+
*
|
|
35
|
+
* ⚠️ **Boutons indisponibles, jamais desactives** : sur la derniere page, « Page
|
|
36
|
+
* suivante » garde le focus qu'il avait. Desactive, il le perdrait, et le lecteur
|
|
37
|
+
* d'ecran retomberait sur le debut du document.
|
|
38
|
+
*
|
|
39
|
+
* ⚠️ **Apres un changement de page, le focus va a la `cible`** — la legende du
|
|
40
|
+
* tableau — et « Page 2 » s'annonce (UX-13). Sans cela, la personne au clavier
|
|
41
|
+
* reste en bas, sur « Page suivante », sans savoir que le contenu au-dessus a
|
|
42
|
+
* change.
|
|
43
|
+
*/
|
|
44
|
+
declare class StPagination {
|
|
45
|
+
protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
|
|
46
|
+
private readonly injecteur;
|
|
47
|
+
readonly mode: _angular_core.InputSignal<ModeDePagination>;
|
|
48
|
+
/** A partir de 1. */
|
|
49
|
+
readonly numero: _angular_core.InputSignal<number>;
|
|
50
|
+
readonly precedenteDisponible: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
51
|
+
readonly suivanteDisponible: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
52
|
+
readonly chargement: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
53
|
+
/** Nom de la navigation, quand une page en porte plusieurs. */
|
|
54
|
+
readonly etiquette: _angular_core.InputSignal<string | null>;
|
|
55
|
+
/** Tailles proposees ; vide, pas de choix. Plafonnees a 100. */
|
|
56
|
+
readonly taillesDePage: _angular_core.InputSignal<readonly number[]>;
|
|
57
|
+
readonly taille: _angular_core.ModelSignal<number>;
|
|
58
|
+
/** Recoit le focus apres un changement de page. */
|
|
59
|
+
readonly cible: _angular_core.InputSignal<Focalisable | (() => Focalisable | null) | null>;
|
|
60
|
+
readonly precedente: _angular_core.OutputEmitterRef<void>;
|
|
61
|
+
readonly suivante: _angular_core.OutputEmitterRef<void>;
|
|
62
|
+
protected readonly annonce: AnnonceLocale;
|
|
63
|
+
protected readonly tailles: _angular_core.Signal<number[]>;
|
|
64
|
+
protected readonly etiquetteLue: _angular_core.Signal<string>;
|
|
65
|
+
constructor();
|
|
66
|
+
protected surTaille(evenement: Event): void;
|
|
67
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StPagination, never>;
|
|
68
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StPagination, "st-pagination", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "numero": { "alias": "numero"; "required": false; "isSignal": true; }; "precedenteDisponible": { "alias": "precedenteDisponible"; "required": false; "isSignal": true; }; "suivanteDisponible": { "alias": "suivanteDisponible"; "required": false; "isSignal": true; }; "chargement": { "alias": "chargement"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "taillesDePage": { "alias": "taillesDePage"; "required": false; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "cible": { "alias": "cible"; "required": false; "isSignal": true; }; }, { "taille": "tailleChange"; "precedente": "precedente"; "suivante": "suivante"; }, never, never, true, never>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Une paire terme et valeur. `description` nulle : « Non renseigne ». */
|
|
72
|
+
interface ElementDeDescription {
|
|
73
|
+
/** Relie l'element a un gabarit `stDescription`. Par defaut : le terme. */
|
|
74
|
+
readonly cle?: string;
|
|
75
|
+
readonly terme: string;
|
|
76
|
+
readonly description: string | null;
|
|
77
|
+
}
|
|
78
|
+
/** Contexte d'un gabarit de description. */
|
|
79
|
+
interface ContexteDeDescription {
|
|
80
|
+
readonly $implicit: ElementDeDescription;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Valeur riche d'un element : montant, date, valeur masquee.
|
|
84
|
+
*
|
|
85
|
+
* ```html
|
|
86
|
+
* <ng-template stDescription="iban" let-element>
|
|
87
|
+
* <st-masked nature="iban" [valeur]="compte().iban" />
|
|
88
|
+
* </ng-template>
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
declare class StDescription {
|
|
92
|
+
readonly cle: _angular_core.InputSignal<string>;
|
|
93
|
+
readonly gabarit: TemplateRef<ContexteDeDescription>;
|
|
94
|
+
static ngTemplateContextGuard(_directive: StDescription, _contexte: unknown): _contexte is ContexteDeDescription;
|
|
95
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDescription, never>;
|
|
96
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StDescription, "ng-template[stDescription]", never, { "cle": { "alias": "stDescription"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Liste de descriptions : les proprietes d'un objet, sur une page de detail.
|
|
100
|
+
*
|
|
101
|
+
* ```html
|
|
102
|
+
* <st-description-list [elements]="[
|
|
103
|
+
* { terme: 'Reference', description: commande().reference },
|
|
104
|
+
* { cle: 'montant', terme: 'Montant', description: null },
|
|
105
|
+
* ]">
|
|
106
|
+
* <ng-template stDescription="montant"><st-money [valeur]="commande().montant" /></ng-template>
|
|
107
|
+
* </st-description-list>
|
|
108
|
+
* ```
|
|
109
|
+
*
|
|
110
|
+
* ⚠️ **Un vrai `dl`, rendu par le composant.** Le lecteur d'ecran annonce « liste de
|
|
111
|
+
* descriptions, 4 elements » et lit chaque terme avec sa valeur. Ecrits par
|
|
112
|
+
* l'application et projetes, `dt` et `dd` echapperaient aux styles du composant,
|
|
113
|
+
* et un `div` mal place rendrait la liste invalide.
|
|
114
|
+
*
|
|
115
|
+
* ⚠️ **Une valeur absente se dit** : « — » a l'ecran, « Non renseigne » au lecteur
|
|
116
|
+
* d'ecran. Une cellule vide ne distingue pas « aucun » de « pas encore charge ».
|
|
117
|
+
*
|
|
118
|
+
* En colonnes quand la place le permet, empile en dessous : la largeur est celle
|
|
119
|
+
* du CONTENEUR, pas de l'ecran — la meme liste dans une carte etroite s'empile
|
|
120
|
+
* aussi sur un grand ecran (UX-18).
|
|
121
|
+
*/
|
|
122
|
+
declare class StDescriptionList {
|
|
123
|
+
protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
|
|
124
|
+
readonly elements: _angular_core.InputSignal<readonly ElementDeDescription[]>;
|
|
125
|
+
private readonly gabarits;
|
|
126
|
+
protected readonly lignes: _angular_core.Signal<{
|
|
127
|
+
element: ElementDeDescription;
|
|
128
|
+
gabarit: TemplateRef<ContexteDeDescription> | null;
|
|
129
|
+
}[]>;
|
|
130
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDescriptionList, never>;
|
|
131
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StDescriptionList, "st-description-list", never, { "elements": { "alias": "elements"; "required": true; "isSignal": true; }; }, {}, ["gabarits"], never, true, never>;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Contexte d'un gabarit d'element de liste. */
|
|
135
|
+
interface ContexteDElementDeListe<T> {
|
|
136
|
+
readonly $implicit: T;
|
|
137
|
+
readonly indice: number;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Rendu d'un element, type par `[stElementDeListeDe]` :
|
|
141
|
+
*
|
|
142
|
+
* ```html
|
|
143
|
+
* <ng-template stElementDeListe [stElementDeListeDe]="expeditions()" let-expedition>
|
|
144
|
+
* <a [routerLink]="['/expeditions', expedition.id]">{{ expedition.reference }}</a>
|
|
145
|
+
* </ng-template>
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
declare class StElementDeListe<T> {
|
|
149
|
+
/** Sert seulement au typage du contexte ; nom de l'attribut, d'ou l'absence d'alias. */
|
|
150
|
+
readonly stElementDeListeDe: _angular_core.InputSignal<readonly T[] | null | undefined>;
|
|
151
|
+
readonly gabarit: TemplateRef<ContexteDElementDeListe<T>>;
|
|
152
|
+
static ngTemplateContextGuard<T>(_directive: StElementDeListe<T>, _contexte: unknown): _contexte is ContexteDElementDeListe<T>;
|
|
153
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StElementDeListe<any>, never>;
|
|
154
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StElementDeListe<any>, "ng-template[stElementDeListe]", never, { "stElementDeListeDe": { "alias": "stElementDeListeDe"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Liste d'objets : expeditions, notifications, documents. La forme mobile d'un
|
|
158
|
+
* tableau (UX-5).
|
|
159
|
+
*
|
|
160
|
+
* ```html
|
|
161
|
+
* <st-list #liste etiquette="Mes expeditions" [elements]="expeditions()" cle="id">
|
|
162
|
+
* <ng-template stElementDeListe [stElementDeListeDe]="expeditions()" let-expedition>…</ng-template>
|
|
163
|
+
* </st-list>
|
|
164
|
+
* <st-pagination mode="suite" [cible]="liste" … />
|
|
165
|
+
* ```
|
|
166
|
+
*
|
|
167
|
+
* ⚠️ **Un lien DANS l'element, jamais un element cliquable** (UX-3) : le lien a un
|
|
168
|
+
* nom, s'ouvre dans un onglet, et laisse les autres boutons de l'element
|
|
169
|
+
* atteignables.
|
|
170
|
+
*
|
|
171
|
+
* ⚠️ **`focus()` va au premier element AJOUTE** depuis le dernier affichage : apres
|
|
172
|
+
* « Afficher plus », la lecture reprend la ou la liste s'est allongee, et non en
|
|
173
|
+
* tete. Apres un filtre, la liste raccourcit, et le focus va au premier element.
|
|
174
|
+
*
|
|
175
|
+
* `track` par la cle : un rafraichissement garde le focus sur le bon element.
|
|
176
|
+
*/
|
|
177
|
+
declare class StList<T> {
|
|
178
|
+
private readonly element;
|
|
179
|
+
readonly elements: _angular_core.InputSignal<readonly T[]>;
|
|
180
|
+
/** Propriete qui identifie un element. */
|
|
181
|
+
readonly cle: _angular_core.InputSignal<keyof T & string>;
|
|
182
|
+
/** Nom de la liste, lu a l'entree. */
|
|
183
|
+
readonly etiquette: _angular_core.InputSignal<string | null>;
|
|
184
|
+
/** `ol` quand l'ordre a un sens : etapes, classement. */
|
|
185
|
+
readonly ordonnee: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
186
|
+
/** Contenu en cours de remplacement : `aria-busy`. */
|
|
187
|
+
readonly chargement: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
188
|
+
protected readonly gabarit: _angular_core.Signal<StElementDeListe<any> | undefined>;
|
|
189
|
+
private indiceDuPremierAjout;
|
|
190
|
+
protected readonly lignes: _angular_core.Signal<{
|
|
191
|
+
valeur: T;
|
|
192
|
+
indice: number;
|
|
193
|
+
identifiant: string;
|
|
194
|
+
}[]>;
|
|
195
|
+
constructor();
|
|
196
|
+
/** Focus sur le premier element ajoute, ou sur le premier. */
|
|
197
|
+
focus(options?: FocusOptions): void;
|
|
198
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StList<any>, never>;
|
|
199
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StList<any>, "st-list", never, { "elements": { "alias": "elements"; "required": true; "isSignal": true; }; "cle": { "alias": "cle"; "required": true; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "ordonnee": { "alias": "ordonnee"; "required": false; "isSignal": true; }; "chargement": { "alias": "chargement"; "required": false; "isSignal": true; }; }, {}, ["gabarit"], never, true, never>;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
type SensDeTri = 'croissant' | 'decroissant';
|
|
203
|
+
/**
|
|
204
|
+
* Bouton de tri d'une colonne, pose DANS l'en-tete : `<th><button stSortHeader>`.
|
|
205
|
+
*
|
|
206
|
+
* ⚠️ **Le bouton, pas l'en-tete cliquable** : un `th` n'est ni focalisable ni
|
|
207
|
+
* annonce comme actionnable. Et l'etat se porte par `aria-sort` sur le `th`, que
|
|
208
|
+
* `st-data-table` pose sur la SEULE colonne triee (FE-3).
|
|
209
|
+
*
|
|
210
|
+
* ⚠️ **Ne trie rien.** Il dit l'intention ; c'est le serveur qui trie, et le
|
|
211
|
+
* contrat actuel ne le fait pas (audit de la vague 4, V4-3). Trier la page
|
|
212
|
+
* affichee ferait croire a un tri de toute la liste.
|
|
213
|
+
*
|
|
214
|
+
* Une colonne non triee montre deux chevrons, pour se signaler triable sans
|
|
215
|
+
* attendre le survol ; l'icone est decorative, l'etat est lu par `aria-sort`.
|
|
216
|
+
*/
|
|
217
|
+
declare class StSortHeader {
|
|
218
|
+
readonly sens: _angular_core.InputSignal<SensDeTri | null>;
|
|
219
|
+
protected readonly icone: _angular_core.Signal<"menu" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "copie" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "tri" | "triangle-alerte" | "utilisateur">;
|
|
220
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSortHeader, never>;
|
|
221
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSortHeader, "button[stSortHeader]", never, { "sens": { "alias": "sens"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** Une colonne, decrite en donnees. */
|
|
225
|
+
interface ColonneDeTableau {
|
|
226
|
+
/** Identifie la colonne ; par defaut, la propriete affichee. */
|
|
227
|
+
readonly cle: string;
|
|
228
|
+
readonly libelle: string;
|
|
229
|
+
/** `fin` pour les nombres et les montants (UX-4). */
|
|
230
|
+
readonly alignement?: 'debut' | 'fin';
|
|
231
|
+
/** Seulement si le SERVEUR trie sur cette colonne (V4-3). */
|
|
232
|
+
readonly triable?: boolean;
|
|
233
|
+
/** Libelle lu mais non affiche : colonne d'actions. Jamais vide. */
|
|
234
|
+
readonly libelleMasque?: boolean;
|
|
235
|
+
}
|
|
236
|
+
interface TriDeTableau {
|
|
237
|
+
readonly cle: string;
|
|
238
|
+
readonly sens: SensDeTri;
|
|
239
|
+
}
|
|
240
|
+
type DensiteDeTableau = 'confortable' | 'compacte';
|
|
241
|
+
/** Contexte d'un gabarit de cellule. */
|
|
242
|
+
interface ContexteDeCellule<T> {
|
|
243
|
+
readonly $implicit: T;
|
|
244
|
+
readonly colonne: ColonneDeTableau;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Rendu d'une cellule, type par `[stCelluleDe]` :
|
|
248
|
+
*
|
|
249
|
+
* ```html
|
|
250
|
+
* <ng-template stCellule="montant" [stCelluleDe]="lignes()" let-ligne>
|
|
251
|
+
* <st-money [valeur]="ligne.montant" />
|
|
252
|
+
* </ng-template>
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
255
|
+
declare class StCellule<T> {
|
|
256
|
+
readonly cle: _angular_core.InputSignal<string>;
|
|
257
|
+
/** Sert seulement au typage du contexte ; nom de l'attribut, d'ou l'absence d'alias. */
|
|
258
|
+
readonly stCelluleDe: _angular_core.InputSignal<readonly T[] | null | undefined>;
|
|
259
|
+
readonly gabarit: TemplateRef<ContexteDeCellule<T>>;
|
|
260
|
+
static ngTemplateContextGuard<T>(_directive: StCellule<T>, _contexte: unknown): _contexte is ContexteDeCellule<T>;
|
|
261
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StCellule<any>, never>;
|
|
262
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StCellule<any>, "ng-template[stCellule]", never, { "cle": { "alias": "stCellule"; "required": true; "isSignal": true; }; "stCelluleDe": { "alias": "stCelluleDe"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
263
|
+
}
|
|
264
|
+
/** Contenu du tableau vide : un `st-empty`, avec son action. */
|
|
265
|
+
declare class StTableauVide {
|
|
266
|
+
readonly gabarit: TemplateRef<unknown>;
|
|
267
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTableauVide, never>;
|
|
268
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StTableauVide, "ng-template[stTableauVide]", never, {}, {}, never, never, true, never>;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Tableau de donnees, sur un `<table>` NATIF.
|
|
272
|
+
*
|
|
273
|
+
* ```html
|
|
274
|
+
* <st-data-table #tableau legende="Expeditions" [colonnes]="colonnes" [lignes]="lignes()"
|
|
275
|
+
* cle="id" selectionnable [(selection)]="choisies" [chargement]="page.isLoading()">
|
|
276
|
+
* <ng-template stCellule="reference" [stCelluleDe]="lignes()" let-ligne>
|
|
277
|
+
* <a [routerLink]="['/expeditions', ligne.id]">{{ ligne.reference }}</a>
|
|
278
|
+
* </ng-template>
|
|
279
|
+
* <button stButton stActionsDeTableau (click)="exporter()">Exporter</button>
|
|
280
|
+
* </st-data-table>
|
|
281
|
+
* ```
|
|
282
|
+
*
|
|
283
|
+
* ⚠️ **Un tableau, pas une grille** (audit de la vague 4, V4-1). Le lecteur d'ecran
|
|
284
|
+
* sait parcourir un `<table>` de cellule en cellule ; une grille ARIA remplacerait
|
|
285
|
+
* ce parcours par les fleches, et rendrait les liens des cellules plus durs a
|
|
286
|
+
* atteindre. Ni Material, ni `CdkTable` : pas de pair dans le tronc.
|
|
287
|
+
*
|
|
288
|
+
* - **Legende obligatoire** (UX-1), et une colonne d'en-tete de ligne — la premiere
|
|
289
|
+
* par defaut — pour que chaque cellule se lise avec sa ligne (UX-2).
|
|
290
|
+
* - **Zone de defilement nommee** : focalisable quand le tableau deborde (UX-6),
|
|
291
|
+
* colonne figee sans masquer le focus (UX-7), en-tete fige seulement avec
|
|
292
|
+
* `hauteurMax` (UX-8).
|
|
293
|
+
* - **Selection de la PAGE, par cle** (V4-4) : elle ne garde que les lignes encore
|
|
294
|
+
* affichees, et se vide donc au changement de page.
|
|
295
|
+
* - **Tri PILOTE** : le tableau dit la demande et l'annonce, il ne reordonne
|
|
296
|
+
* jamais les lignes (V4-3).
|
|
297
|
+
* - **Chargement** : squelette au premier, lignes gardees et `aria-busy` ensuite
|
|
298
|
+
* (UX-11).
|
|
299
|
+
* - Export, actions de masse : zone `stActionsDeTableau`, et le SERVEUR fait le
|
|
300
|
+
* travail (V4-5, SEC-4, SEC-5).
|
|
301
|
+
*/
|
|
302
|
+
declare class StDataTable<T> {
|
|
303
|
+
protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
|
|
304
|
+
readonly legende: _angular_core.InputSignal<string>;
|
|
305
|
+
/** Lue mais non affichee, quand un titre visible nomme deja le tableau. */
|
|
306
|
+
readonly legendeMasquee: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
307
|
+
readonly colonnes: _angular_core.InputSignal<readonly ColonneDeTableau[]>;
|
|
308
|
+
readonly lignes: _angular_core.InputSignal<readonly T[]>;
|
|
309
|
+
/** Propriete qui identifie une ligne. Jamais l'indice (FE-1). */
|
|
310
|
+
readonly cle: _angular_core.InputSignal<keyof T & string>;
|
|
311
|
+
/** Colonne lue comme en-tete de chaque ligne. Par defaut : la premiere. */
|
|
312
|
+
readonly enTeteDeLigne: _angular_core.InputSignal<string | null>;
|
|
313
|
+
readonly premiereColonneFigee: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
314
|
+
/** Hauteur maximale, `32rem` : l'en-tete se fige, le corps defile. */
|
|
315
|
+
readonly hauteurMax: _angular_core.InputSignal<string | null>;
|
|
316
|
+
readonly densite: _angular_core.InputSignal<DensiteDeTableau>;
|
|
317
|
+
readonly chargement: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
318
|
+
readonly selectionnable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
319
|
+
readonly selection: _angular_core.ModelSignal<readonly string[]>;
|
|
320
|
+
readonly tri: _angular_core.ModelSignal<TriDeTableau | null>;
|
|
321
|
+
/** Texte du tableau vide, sans gabarit `stTableauVide`. */
|
|
322
|
+
readonly texteVide: _angular_core.InputSignal<string | null>;
|
|
323
|
+
private readonly gabarits;
|
|
324
|
+
protected readonly gabaritVide: _angular_core.Signal<StTableauVide | undefined>;
|
|
325
|
+
private readonly zone;
|
|
326
|
+
protected readonly annonce: AnnonceLocale;
|
|
327
|
+
protected readonly deborde: _angular_core.WritableSignal<boolean>;
|
|
328
|
+
protected readonly largeurFigee: _angular_core.WritableSignal<number>;
|
|
329
|
+
protected readonly identifiants: {
|
|
330
|
+
readonly legende: `${string}-legende`;
|
|
331
|
+
readonly selection: `${string}-selection`;
|
|
332
|
+
};
|
|
333
|
+
protected readonly cleDEnTete: _angular_core.Signal<string>;
|
|
334
|
+
protected readonly cellules: _angular_core.Signal<{
|
|
335
|
+
colonne: ColonneDeTableau;
|
|
336
|
+
gabarit: TemplateRef<ContexteDeCellule<any>> | null;
|
|
337
|
+
enTete: boolean;
|
|
338
|
+
}[]>;
|
|
339
|
+
protected readonly rangees: _angular_core.Signal<{
|
|
340
|
+
valeur: T;
|
|
341
|
+
identifiant: string;
|
|
342
|
+
nom: string | null;
|
|
343
|
+
choisie: boolean;
|
|
344
|
+
}[]>;
|
|
345
|
+
protected readonly squelette: _angular_core.Signal<number[]>;
|
|
346
|
+
protected readonly nombreDeColonnes: _angular_core.Signal<number>;
|
|
347
|
+
protected readonly colonnesDeSquelette: _angular_core.Signal<number[]>;
|
|
348
|
+
protected readonly toutesChoisies: _angular_core.Signal<boolean>;
|
|
349
|
+
protected readonly quelquesChoisies: _angular_core.Signal<boolean>;
|
|
350
|
+
constructor();
|
|
351
|
+
/** Amene le focus sur le tableau : sa legende est lue (UX-13). */
|
|
352
|
+
focus(options?: FocusOptions): void;
|
|
353
|
+
protected sensDe(colonne: ColonneDeTableau): SensDeTri | null;
|
|
354
|
+
protected ariaSort(colonne: ColonneDeTableau): string | null;
|
|
355
|
+
protected trier(colonne: ColonneDeTableau): void;
|
|
356
|
+
protected basculerTout(): void;
|
|
357
|
+
protected basculer(identifiant: string): void;
|
|
358
|
+
protected texteDe(ligne: T, colonne: ColonneDeTableau): string | null;
|
|
359
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StDataTable<any>, never>;
|
|
360
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StDataTable<any>, "st-data-table", never, { "legende": { "alias": "legende"; "required": true; "isSignal": true; }; "legendeMasquee": { "alias": "legendeMasquee"; "required": false; "isSignal": true; }; "colonnes": { "alias": "colonnes"; "required": true; "isSignal": true; }; "lignes": { "alias": "lignes"; "required": true; "isSignal": true; }; "cle": { "alias": "cle"; "required": true; "isSignal": true; }; "enTeteDeLigne": { "alias": "enTeteDeLigne"; "required": false; "isSignal": true; }; "premiereColonneFigee": { "alias": "premiereColonneFigee"; "required": false; "isSignal": true; }; "hauteurMax": { "alias": "hauteurMax"; "required": false; "isSignal": true; }; "densite": { "alias": "densite"; "required": false; "isSignal": true; }; "chargement": { "alias": "chargement"; "required": false; "isSignal": true; }; "selectionnable": { "alias": "selectionnable"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "tri": { "alias": "tri"; "required": false; "isSignal": true; }; "texteVide": { "alias": "texteVide"; "required": false; "isSignal": true; }; }, { "selection": "selectionChange"; "tri": "triChange"; }, ["gabarits", "gabaritVide"], ["[stActionsDeTableau]"], true, never>;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Filtre actif, retirable : « Statut : Expediee ✕ ».
|
|
365
|
+
*
|
|
366
|
+
* ```html
|
|
367
|
+
* <button stFilterChip libelle="Statut : Expediee" (click)="retirer('statut')"></button>
|
|
368
|
+
* ```
|
|
369
|
+
*
|
|
370
|
+
* ⚠️ **Toute la puce est le bouton**, et son nom CONTIENT le texte visible —
|
|
371
|
+
* « Retirer le filtre Statut : Expediee » (WCAG 2.5.3) : une commande vocale
|
|
372
|
+
* « cliquer Statut » l'atteint. Une croix seule, a cote d'un texte inerte, serait
|
|
373
|
+
* une cible de quelques pixels sans nom.
|
|
374
|
+
*/
|
|
375
|
+
declare class StFilterChip {
|
|
376
|
+
private readonly libelles;
|
|
377
|
+
readonly libelle: _angular_core.InputSignal<string>;
|
|
378
|
+
protected readonly nom: _angular_core.Signal<string>;
|
|
379
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StFilterChip, never>;
|
|
380
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StFilterChip, "button[stFilterChip]", never, { "libelle": { "alias": "libelle"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/** Un filtre en vigueur, tel qu'il se lit : « Statut : Expediee ». */
|
|
384
|
+
interface FiltreActif {
|
|
385
|
+
readonly cle: string;
|
|
386
|
+
readonly libelle: string;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Barre de filtres : les champs, puis les filtres en vigueur, retirables.
|
|
390
|
+
*
|
|
391
|
+
* ```html
|
|
392
|
+
* <st-filter-bar [filtresActifs]="actifs()" (retrait)="retirer($event)" (effacement)="effacer()">
|
|
393
|
+
* <st-select libelle="Statut" [options]="statuts" [(value)]="statut" />
|
|
394
|
+
* </st-filter-bar>
|
|
395
|
+
* ```
|
|
396
|
+
*
|
|
397
|
+
* Un formulaire NOMME : repere « Filtres » dans la liste des reperes du lecteur
|
|
398
|
+
* d'ecran. Pas un repere `search` : un `st-search-field` pose dedans en porte deja
|
|
399
|
+
* un, et deux reperes imbriques se liraient en double.
|
|
400
|
+
*
|
|
401
|
+
* ⚠️ **Les filtres s'appliquent au changement**, par l'application : Entree dans
|
|
402
|
+
* un champ n'envoie rien, et ne recharge pas la page.
|
|
403
|
+
*
|
|
404
|
+
* ⚠️ **Retirer un filtre rend le focus a la puce suivante**, sinon a la
|
|
405
|
+
* precedente, sinon au formulaire ; « Effacer les filtres » le rend au formulaire
|
|
406
|
+
* (UX-14). Le focus ne tombe jamais sur le document, et le retrait s'annonce.
|
|
407
|
+
*
|
|
408
|
+
* ⚠️ **Dans l'adresse, des valeurs d'enumeration seulement** (SEC-2) : un texte
|
|
409
|
+
* cherche, un nom, un IBAN n'y vont pas. Le composant ne touche pas a l'adresse ;
|
|
410
|
+
* la regle est pour l'application qui le ferait.
|
|
411
|
+
*/
|
|
412
|
+
declare class StFilterBar {
|
|
413
|
+
protected readonly libelles: _angular_core.Signal<_starterlib_ui.LibellesUi>;
|
|
414
|
+
private readonly element;
|
|
415
|
+
private readonly injecteur;
|
|
416
|
+
/** Nom du formulaire. Par defaut : « Filtres ». */
|
|
417
|
+
readonly etiquette: _angular_core.InputSignal<string | null>;
|
|
418
|
+
readonly filtresActifs: _angular_core.InputSignal<readonly FiltreActif[]>;
|
|
419
|
+
readonly retrait: _angular_core.OutputEmitterRef<string>;
|
|
420
|
+
readonly effacement: _angular_core.OutputEmitterRef<void>;
|
|
421
|
+
protected readonly annonce: AnnonceLocale;
|
|
422
|
+
protected readonly identifiantActifs: string;
|
|
423
|
+
protected readonly etiquetteLue: _angular_core.Signal<string>;
|
|
424
|
+
protected retirer(filtre: FiltreActif, indice: number): void;
|
|
425
|
+
protected effacer(): void;
|
|
426
|
+
private apresLeRendu;
|
|
427
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StFilterBar, never>;
|
|
428
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StFilterBar, "st-filter-bar", never, { "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; "filtresActifs": { "alias": "filtresActifs"; "required": false; "isSignal": true; }; }, { "retrait": "retrait"; "effacement": "effacement"; }, never, ["*"], true, never>;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
export { StCellule, StDataTable, StDescription, StDescriptionList, StElementDeListe, StFilterBar, StFilterChip, StList, StPagination, StSortHeader, StTableauVide };
|
|
432
|
+
export type { ColonneDeTableau, ContexteDElementDeListe, ContexteDeCellule, ContexteDeDescription, DensiteDeTableau, ElementDeDescription, FiltreActif, Focalisable, ModeDePagination, SensDeTri, TriDeTableau };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
|
|
3
|
+
type ModeDeNavigation = 'auto' | 'persistant' | 'modal';
|
|
4
|
+
/**
|
|
5
|
+
* Navigation laterale : une region a cote du contenu sur grand ecran, un tiroir
|
|
6
|
+
* sur petit ecran.
|
|
7
|
+
*
|
|
8
|
+
* ```html
|
|
9
|
+
* <st-app-shell>
|
|
10
|
+
* <button entete stButton [stSidenavToggle]="navigation">Menu</button>
|
|
11
|
+
* <st-sidenav navigation #navigation etiquette="Navigation principale">
|
|
12
|
+
* <a routerLink="/comptes">Comptes</a>
|
|
13
|
+
* </st-sidenav>
|
|
14
|
+
* …
|
|
15
|
+
* </st-app-shell>
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* ⚠️ **Deux modes, jamais confondus.** Persistante, c'est une REGION de la page :
|
|
19
|
+
* aucun piege, rien a ouvrir. Modale, c'est un TIROIR, donc un `StDialog` — role,
|
|
20
|
+
* piegeage du focus, Echap, retour du focus au bouton — et non une region
|
|
21
|
+
* glissee par-dessus la page avec un peu de CSS, qui laisserait le clavier
|
|
22
|
+
* parcourir la page cachee dessous.
|
|
23
|
+
*
|
|
24
|
+
* ⚠️ **Elle porte son propre `<nav>`, et un seul a la fois.** Sur petit ecran,
|
|
25
|
+
* la region en ligne DISPARAIT quand le tiroir prend le relais : laissee en
|
|
26
|
+
* place, elle resterait un repere de navigation vide, que le lecteur d'ecran
|
|
27
|
+
* proposerait sans rien y trouver.
|
|
28
|
+
*
|
|
29
|
+
* Un lien suivi dans le tiroir le ferme : `StDialog` se ferme a toute navigation
|
|
30
|
+
* du routeur.
|
|
31
|
+
*/
|
|
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>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Bouton qui ouvre la navigation en tiroir.
|
|
89
|
+
*
|
|
90
|
+
* ⚠️ **Masque quand la navigation est persistante.** Un bouton « Menu » qui ne
|
|
91
|
+
* fait rien, parce que la navigation est deja affichee a cote, est un arret de
|
|
92
|
+
* tabulation inutile et une promesse non tenue.
|
|
93
|
+
*
|
|
94
|
+
* ⚠️ `aria-expanded` suit l'ouverture du tiroir : sans lui, rien ne dit a qui
|
|
95
|
+
* n'en voit pas l'effet que le bouton a agi.
|
|
96
|
+
*/
|
|
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>;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export { StSidenav, StSidenavToggle };
|
|
104
|
+
export type { ModeDeNavigation };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import * as i1 from '@angular/aria/tabs';
|
|
3
|
+
|
|
4
|
+
/** Un onglet, decrit par l'appelant. */
|
|
5
|
+
interface Onglet {
|
|
6
|
+
/** Identifiant stable, qui relie l'onglet a son `st-tab-panel`. */
|
|
7
|
+
readonly valeur: string;
|
|
8
|
+
readonly libelle: string;
|
|
9
|
+
readonly desactive?: boolean;
|
|
10
|
+
}
|
|
11
|
+
type ActivationDOnglet = 'manuelle' | 'automatique';
|
|
12
|
+
type OrientationDOnglets = 'horizontale' | 'verticale';
|
|
13
|
+
/**
|
|
14
|
+
* Onglets, sur les primitives `@angular/aria/tabs`.
|
|
15
|
+
*
|
|
16
|
+
* ```html
|
|
17
|
+
* <st-tabs etiquette="Compte" [onglets]="onglets" [(selection)]="onglet">
|
|
18
|
+
* <st-tab-panel valeur="operations">
|
|
19
|
+
* <ng-template stTabContent><app-operations /></ng-template>
|
|
20
|
+
* </st-tab-panel>
|
|
21
|
+
* <st-tab-panel valeur="virements">
|
|
22
|
+
* <ng-template stTabContent><app-virements /></ng-template>
|
|
23
|
+
* </st-tab-panel>
|
|
24
|
+
* </st-tabs>
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* ⚠️ **La liste d'onglets est rendue par le composant, a partir de donnees**, et
|
|
28
|
+
* non projetee. Les primitives d'Aria relient un onglet a sa liste par
|
|
29
|
+
* INJECTION, et un contenu projete garde l'injecteur de l'endroit ou il est
|
|
30
|
+
* ecrit : c'est la lecon de `st-menu`, ou des elements projetes ne
|
|
31
|
+
* s'enregistraient jamais. Rendue ici, la liste est a coup sur sous la bonne
|
|
32
|
+
* primitive — et ses valeurs peuvent etre dites en francais.
|
|
33
|
+
*
|
|
34
|
+
* Les PANNEAUX, eux, sont projetes : ecrits directement sous `st-tabs`, leur
|
|
35
|
+
* injecteur parent est celui de l'hote, qui porte la primitive `Tabs`.
|
|
36
|
+
*
|
|
37
|
+
* ⚠️ **Activation manuelle par defaut.** En activation automatique, chaque
|
|
38
|
+
* fleche SELECTIONNE l'onglet atteint ; son contenu differe se rend, et charge
|
|
39
|
+
* ses donnees. Parcourir cinq onglets au clavier lancerait cinq requetes pour en
|
|
40
|
+
* lire un. En manuelle, les fleches deplacent le focus et Entree ou Espace
|
|
41
|
+
* selectionne. `automatique` reste le bon choix quand les panneaux sont deja la
|
|
42
|
+
* et s'affichent sans delai.
|
|
43
|
+
*/
|
|
44
|
+
declare class StTabs {
|
|
45
|
+
readonly onglets: _angular_core.InputSignal<readonly Onglet[]>;
|
|
46
|
+
/** Nom accessible de la liste : sans lui, plusieurs listes d'onglets se confondent. */
|
|
47
|
+
readonly etiquette: _angular_core.InputSignal<string>;
|
|
48
|
+
readonly activation: _angular_core.InputSignal<ActivationDOnglet>;
|
|
49
|
+
readonly orientation: _angular_core.InputSignal<OrientationDOnglets>;
|
|
50
|
+
/** Valeur de l'onglet selectionne. `undefined` : le premier onglet disponible. */
|
|
51
|
+
readonly selection: _angular_core.ModelSignal<string | undefined>;
|
|
52
|
+
/**
|
|
53
|
+
* ⚠️ Toujours un onglet selectionne. Le motif ARIA l'exige : une liste sans
|
|
54
|
+
* selection n'affiche aucun panneau, et la page parait vide sans raison.
|
|
55
|
+
*/
|
|
56
|
+
protected readonly selectionEffective: _angular_core.Signal<string | undefined>;
|
|
57
|
+
protected readonly modeAria: _angular_core.Signal<"follow" | "explicit">;
|
|
58
|
+
protected readonly orientationAria: _angular_core.Signal<"vertical" | "horizontal">;
|
|
59
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTabs, never>;
|
|
60
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StTabs, "st-tabs", never, { "onglets": { "alias": "onglets"; "required": true; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": true; "isSignal": true; }; "activation": { "alias": "activation"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; }, { "selection": "selectionChange"; }, never, ["*"], true, [{ directive: typeof i1.Tabs; inputs: {}; outputs: {}; }]>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Panneau d'un onglet, relie par sa `valeur`.
|
|
65
|
+
*
|
|
66
|
+
* ⚠️ La primitive d'Aria ne masque RIEN : elle pose `inert` sur le panneau
|
|
67
|
+
* inactif, ce qui le retire de l'arbre d'accessibilite et du clavier, mais le
|
|
68
|
+
* laisse a l'ecran. Sa documentation le dit en une ligne. Sans le style de ce
|
|
69
|
+
* composant, tous les panneaux s'affichaient empiles, muets et intouchables.
|
|
70
|
+
*/
|
|
71
|
+
declare class StTabPanel {
|
|
72
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTabPanel, never>;
|
|
73
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StTabPanel, "st-tab-panel", never, {}, {}, never, ["*"], true, [{ directive: typeof i1.TabPanel; inputs: { "value": "valeur"; }; outputs: {}; }]>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Contenu differe d'un panneau : rendu a la premiere selection de son onglet.
|
|
78
|
+
*
|
|
79
|
+
* Un ecran a cinq onglets ne charge ainsi que celui qu'on regarde. Voir
|
|
80
|
+
* l'activation manuelle de `st-tabs` : c'est ce qui empeche qu'un simple
|
|
81
|
+
* parcours au clavier les rende tous.
|
|
82
|
+
*/
|
|
83
|
+
declare class StTabContent {
|
|
84
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTabContent, never>;
|
|
85
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StTabContent, "ng-template[stTabContent]", never, {}, {}, never, never, true, [{ directive: typeof i1.TabContent; inputs: {}; outputs: {}; }]>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export { StTabContent, StTabPanel, StTabs };
|
|
89
|
+
export type { ActivationDOnglet, Onglet, OrientationDOnglets };
|