@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
package/README.md
CHANGED
|
@@ -14,31 +14,69 @@ des dependances de pair : c'est l'application qui les installe, et elles doivent
|
|
|
14
14
|
etre **identiques dans l'hote et dans chaque remote**. Deux versions du socle
|
|
15
15
|
dans le meme navigateur, ce sont deux jeux de jetons d'injection.
|
|
16
16
|
|
|
17
|
-
##
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
17
|
+
## Onze points d'entree
|
|
18
|
+
|
|
19
|
+
Deux criteres, dans cet ordre.
|
|
20
|
+
|
|
21
|
+
1. **La dependance** (ADR 0003) : un composant sort du tronc quand il traine un
|
|
22
|
+
pair lourd, et le point d'entree ou il va se choisit par ce qu'il EST pour
|
|
23
|
+
qui l'emploie.
|
|
24
|
+
2. **Le moment de peinture** (ADR 0031, 0.8.0) : a dependance egale, ce que
|
|
25
|
+
l'hote ne peint pas sort aussi. Un paquet partage en singleton part ENTIER —
|
|
26
|
+
la federation annule l'elagage —, donc ce que la coquille n'affiche jamais
|
|
27
|
+
lui coute plein tarif au premier ecran, et ne coute RIEN au remote qui
|
|
28
|
+
l'affiche, puisque le tronc y est deja charge.
|
|
29
|
+
|
|
30
|
+
| Point d'entree | Contenu | Pairs lourds importes statiquement |
|
|
31
|
+
| ---------------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------- |
|
|
32
|
+
| `@starterlib/ui` | le TRONC : noyau, icone, texte, actions, etats, retour, indicateurs, structure, transverses, `st-code` | aucun |
|
|
33
|
+
| `@starterlib/ui/saisie` | les champs de formulaire, le calendrier, le televersement | aucun (des TYPES d'`@angular/forms`) |
|
|
34
|
+
| `@starterlib/ui/listes` | liste, liste de description, table de donnees, pagination, tri, filtres | aucun |
|
|
35
|
+
| `@starterlib/ui/donnees` | montant, date, date relative, nombre, valeur masquee, indicateur chiffre | aucun |
|
|
36
|
+
| `@starterlib/ui/libelles-en` | le catalogue anglais | aucun |
|
|
37
|
+
| `@starterlib/ui/surfaces` | ce qui se pose AU-DESSUS de la page : menu, dialogues, tiroirs, messages ephemeres | `@angular/cdk/{a11y,dialog,keycodes,overlay,portal}`, `@angular/aria/menu` |
|
|
38
|
+
| `@starterlib/ui/navigation` | la navigation laterale | `@angular/cdk/layout` — et rien d'autre |
|
|
39
|
+
| `@starterlib/ui/onglets` | les onglets et leurs panneaux | `@angular/aria/tabs` |
|
|
40
|
+
| `@starterlib/ui/selection` | liste deroulante filtrante, choix multiple | `@angular/aria/{combobox,listbox}`, `@angular/cdk/overlay` |
|
|
41
|
+
| `@starterlib/ui/arbre` | l'arborescence | `@angular/aria/tree` |
|
|
42
|
+
| `@starterlib/ui/formulaires` | les champs qui LISENT leur saisie : montant, date, plage de dates | le code d'`@angular/forms` (`transformedValue`) |
|
|
29
43
|
|
|
30
44
|
```ts
|
|
31
|
-
import { StButton,
|
|
45
|
+
import { StButton, StCard, StError } from '@starterlib/ui';
|
|
46
|
+
import { StFormField, StInput, StSelect } from '@starterlib/ui/saisie';
|
|
47
|
+
import { StDataTable, StPagination } from '@starterlib/ui/listes';
|
|
48
|
+
import { StMoney, StDate } from '@starterlib/ui/donnees';
|
|
32
49
|
import { StDialog, StToast } from '@starterlib/ui/surfaces';
|
|
33
|
-
import {
|
|
50
|
+
import { StSidenav } from '@starterlib/ui/navigation';
|
|
51
|
+
import { StTabs } from '@starterlib/ui/onglets';
|
|
52
|
+
import { StCombobox, StMultiselect } from '@starterlib/ui/selection';
|
|
53
|
+
import { StTree } from '@starterlib/ui/arbre';
|
|
34
54
|
import { StAmountField, StDateField } from '@starterlib/ui/formulaires';
|
|
35
55
|
```
|
|
36
56
|
|
|
57
|
+
Les aretes internes admises, et elles seules : `saisie`, `listes`, `donnees`,
|
|
58
|
+
`surfaces`, `navigation` et `arbre` importent le tronc ; `formulaires` et
|
|
59
|
+
`selection` importent en plus `saisie`, parce qu'une liste deroulante et un
|
|
60
|
+
champ de montant sont d'abord des CHAMPS. `navigation` atteint `surfaces` par
|
|
61
|
+
`import()` seulement : le dialogue du tiroir ne pese pas sur le premier rendu.
|
|
62
|
+
|
|
63
|
+
### Ce qui reste des anciens specificateurs
|
|
64
|
+
|
|
65
|
+
`@starterlib/ui/interactions` **survit, deprecie**, comme baril de
|
|
66
|
+
re-exports vers `navigation`, `onglets`, `selection` et `arbre` : un remote
|
|
67
|
+
reste en 0.7.x recoit la MEME CLASSE que l'hote, et la migration se fait
|
|
68
|
+
service par service. ⚠️ Ce qui s'importe du baril pese les quatre familles.
|
|
69
|
+
|
|
70
|
+
Le tronc, lui, **ne re-exporte pas** `saisie`, `listes`, `donnees` ni
|
|
71
|
+
`libelles-en` : ces points d'entree importent le tronc, et un tronc qui les
|
|
72
|
+
re-exporterait fermerait un cycle entre points d'entree que ng-packagr refuse.
|
|
73
|
+
Monter en 0.8.0 demande donc de deplacer ces imports-la, et rien d'autre.
|
|
74
|
+
|
|
37
75
|
⚠️ Un paquet partage en federation **ne s'elague pas** : declare singleton, il
|
|
38
|
-
est charge en entier des qu'un remote le reference.
|
|
39
|
-
|
|
40
|
-
n'affiche ni menu, ni dialogue, ni onglets ne charge ni le CDK
|
|
41
|
-
pas a se redeployer quand ils montent de version.
|
|
76
|
+
est charge en entier des qu'un remote le reference. Le decoupage ne vise donc
|
|
77
|
+
pas l'elagage, mais l'unite de CHARGEMENT — et le **train de singletons** : une
|
|
78
|
+
application qui n'affiche ni menu, ni dialogue, ni onglets ne charge ni le CDK
|
|
79
|
+
ni Aria, et n'a pas a se redeployer quand ils montent de version.
|
|
42
80
|
|
|
43
81
|
`@angular/cdk`, `@angular/aria` et `@angular/forms` sont des pairs
|
|
44
82
|
**optionnels** : le tronc n'en importe que des TYPES. Ils deviennent obligatoires
|
|
@@ -47,27 +85,40 @@ absence se voit alors a la resolution, pas a l'execution. ⚠️ `@angular/aria`
|
|
|
47
85
|
exige `@angular/cdk` a la version EXACTE : les deux montent ensemble.
|
|
48
86
|
|
|
49
87
|
Ce que chaque point d'entree importe a l'execution est verifie sur le paquet
|
|
50
|
-
construit (`pnpm paquets:check`)
|
|
51
|
-
|
|
88
|
+
construit (`pnpm paquets:check`), **au specificateur exact** : `navigation` a
|
|
89
|
+
droit a `@angular/cdk/layout`, et un `@angular/cdk/overlay` qui s'y glisserait
|
|
90
|
+
echoue avant la publication. Une regle non outillee est une opinion.
|
|
52
91
|
|
|
53
|
-
⚠️ **En federation, chaque point d'entree se partage SEPAREMENT.** Ce sont
|
|
92
|
+
⚠️ **En federation, chaque point d'entree se partage SEPAREMENT.** Ce sont onze
|
|
54
93
|
specificateurs de module distincts : partager `@starterlib/ui` ne couvre aucun
|
|
55
|
-
des
|
|
94
|
+
des dix autres. Omis de la configuration, chaque remote en embarque sa propre
|
|
56
95
|
copie — et la regle `singleton: true, strictVersion: true` qui protege le tronc
|
|
57
|
-
ne protege plus rien au-dessus.
|
|
96
|
+
ne protege plus rien au-dessus. Le decoupage achete l'independance de
|
|
97
|
+
CHARGEMENT, jamais celle de VERSION : les onze portent le numero de leur paquet.
|
|
58
98
|
|
|
59
99
|
```js
|
|
60
100
|
// federation.config.mjs de l'hote ET de chaque remote
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
'@starterlib/ui/interactions': { singleton: true, strictVersion: true },
|
|
65
|
-
'@starterlib/ui/formulaires': { singleton: true, strictVersion: true },
|
|
66
|
-
// ...
|
|
67
|
-
}
|
|
101
|
+
import { partageDuSocle } from '@starterlib/core/federation';
|
|
102
|
+
|
|
103
|
+
shared: { ...share({ ...ANGULAR_ET_RXJS, ...partageDuSocle('0.8') }) }
|
|
68
104
|
```
|
|
69
105
|
|
|
70
|
-
|
|
106
|
+
⚠️ **Cette liste ne se recopie plus.** Depuis la 0.8.0 elle est publiee par
|
|
107
|
+
`@starterlib/core/federation` : `partageDuSocle(train)` rend les **seize**
|
|
108
|
+
specificateurs du socle — les onze de `ui`, le baril deprecie, `tokens`, `util`,
|
|
109
|
+
`core` et `core/federation` —, chacun en `singleton: true, strictVersion: true,
|
|
110
|
+
includeSecondaries: false`. La raison n'est pas la commodite : une ligne oubliee
|
|
111
|
+
**n'est pas une erreur de construction**, le specificateur se duplique simplement
|
|
112
|
+
dans le remote, avec son etat. Passer de quatre a douze specificateurs `ui` en
|
|
113
|
+
recopiant aurait multiplie par trois les occasions de cet oubli.
|
|
114
|
+
|
|
115
|
+
⚠️ Partager un point d'entree que personne n'importe coute **zero octet** : il
|
|
116
|
+
n'entre dans aucune carte d'importation. La liste est donc exhaustive sans
|
|
117
|
+
arbitrage — c'est l'IMPORT qui coute, jamais le partage.
|
|
118
|
+
|
|
119
|
+
Voir `docs/adr/0003-points-d-entree-decoupes-par-dependance.md`,
|
|
120
|
+
`docs/adr/0004-le-tronc-est-dimensionne-par-le-premier-ecran-de-l-hote.md`,
|
|
121
|
+
`docs/recettes/federation.md`, et l'ADR 0031 du socle backend.
|
|
71
122
|
|
|
72
123
|
## Configuration — une fois, dans l'hote
|
|
73
124
|
|
|
@@ -140,7 +191,7 @@ de `@starterlib/tokens`. Sans la feuille, tout s'affiche sans style.
|
|
|
140
191
|
Vague 1 : etats (`st-spinner`, `st-skeleton`, `st-empty`, `st-error`,
|
|
141
192
|
`st-offline-banner`, `st-progress`, `st-state`), texte (`st-text`,
|
|
142
193
|
`st-heading`), donnees (`st-money`, `st-date`, `st-relative-time`, `st-masked`,
|
|
143
|
-
`st-
|
|
194
|
+
`st-count` — passes sous `ui/donnees` en 0.8.0 ; `st-code` reste au tronc), actions (`st-button`, `st-icon-button`, `st-link`,
|
|
144
195
|
`st-button-group`), indicateurs (`st-badge`, `st-status-pill`, `st-tag`,
|
|
145
196
|
`st-avatar`), iconographie (`st-icon`). `st-menu` est passe sous `ui/surfaces`.
|
|
146
197
|
|
|
@@ -152,24 +203,25 @@ Vague 2 :
|
|
|
152
203
|
`st-lang-switch`, `st-copy-button`, `st-timer`, `st-logo`).
|
|
153
204
|
- **`ui/surfaces`** — `StDialog` (dialogue, tiroir, feuille inferieure),
|
|
154
205
|
`StConfirmDialog`, `StToast`, `st-idle-warning`, `stTooltip`, `st-popover`.
|
|
155
|
-
- **`ui/
|
|
156
|
-
`stSidenavToggle
|
|
206
|
+
- **`ui/onglets`** — `st-tabs`, `st-tab-panel`, `stTabContent` ; **`ui/navigation`**
|
|
207
|
+
— `st-sidenav`, `stSidenavToggle` (tous trois sous `ui/interactions` avant la
|
|
208
|
+
0.8.0).
|
|
157
209
|
|
|
158
210
|
Vague 3 — la saisie, sur Signal Forms :
|
|
159
211
|
|
|
160
|
-
-
|
|
212
|
+
- **`ui/saisie`** (le tronc avant la 0.8.0) — `st-form-field`, `st-input`, `st-textarea`, `st-fieldset`,
|
|
161
213
|
`st-checkbox`, `st-radio-group`, `st-switch`, `st-error-summary`,
|
|
162
214
|
`st-password-field`, `st-otp-field`, `st-search-field`, `st-iban-field`,
|
|
163
215
|
`st-phone-field`, `st-select` (natif), `st-file-upload`, `st-calendar` ;
|
|
164
216
|
messages d'erreur traduits et fonctions de schema (`erreurIban`,
|
|
165
217
|
`erreurTelephone`, `erreurDate`, `erreurPlageDeDates`, `erreursDeFichiers`).
|
|
166
|
-
- **`ui/
|
|
218
|
+
- **`ui/selection`** — `st-combobox`, `st-multiselect`.
|
|
167
219
|
- **`ui/formulaires`** — `st-amount-field`, `st-date-field`, `st-date-range`.
|
|
168
220
|
|
|
169
221
|
Un champ s'emploie avec un formulaire, par `[formField]`, ou seul, par
|
|
170
222
|
`[(value)]`. Les regles d'un schema sont des fonctions PURES du socle, a brancher
|
|
171
|
-
par `validate` : les fournir toutes faites importerait `@angular/forms`
|
|
172
|
-
l'execution dans
|
|
223
|
+
par `validate` : les fournir toutes faites importerait le code d'`@angular/forms`
|
|
224
|
+
a l'execution dans `ui/saisie`.
|
|
173
225
|
|
|
174
226
|
```ts
|
|
175
227
|
readonly virement = form(this.modele, (chemin) => {
|
|
@@ -182,10 +234,11 @@ readonly virement = form(this.modele, (chemin) => {
|
|
|
182
234
|
Vague 4 — listes et tableaux, au contrat du backend (curseur vers l'avant, sans
|
|
183
235
|
total ni tri serveur) :
|
|
184
236
|
|
|
185
|
-
-
|
|
186
|
-
`st-sort-header`, `st-pagination`,
|
|
187
|
-
`st-
|
|
188
|
-
-
|
|
237
|
+
- **`ui/listes`** (le tronc avant la 0.8.0) — `st-data-table` (`stCellule`,
|
|
238
|
+
`stTableauVide`, `stActionsDeTableau`), `st-sort-header`, `st-pagination`,
|
|
239
|
+
`st-list` (`stElementDeListe`), `st-description-list` (`stDescription`),
|
|
240
|
+
`st-filter-bar`, `st-filter-chip`.
|
|
241
|
+
- **`ui/arbre`** — `st-tree`.
|
|
189
242
|
- **`@starterlib/core`** — `NavigationParCurseur` ; **`@starterlib/util`** —
|
|
190
243
|
`PageParCurseur<T>`.
|
|
191
244
|
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, booleanAttribute, model, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
4
|
+
import { Tree, TreeItem, TreeItemGroup } from '@angular/aria/tree';
|
|
5
|
+
import { StIcon } from '@starterlib/ui';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Arbre de donnees hierarchiques, sur `@angular/aria/tree` : dossiers, plan
|
|
9
|
+
* comptable, organisation.
|
|
10
|
+
*
|
|
11
|
+
* ```html
|
|
12
|
+
* <st-tree etiquette="Plan comptable" [noeuds]="comptes" [(selection)]="compte" [(deplies)]="ouverts" />
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* ⚠️ **Jamais pour la navigation du site** (UX-17) : une navigation est une liste
|
|
16
|
+
* de liens, que le lecteur d'ecran liste et parcourt comme telle. Un arbre se
|
|
17
|
+
* parcourt aux fleches, un element a la fois, et ses elements ne sont pas des
|
|
18
|
+
* liens. Le mode « navigation » de la primitive n'est donc pas expose.
|
|
19
|
+
*
|
|
20
|
+
* ⚠️ **Les noeuds sont rendus par le composant, a partir de donnees** (FE-6) : la
|
|
21
|
+
* primitive relie un element a son arbre par injection, et un contenu projete
|
|
22
|
+
* garde l'injecteur de l'endroit ou il est ecrit — lecon de `st-menu`.
|
|
23
|
+
*
|
|
24
|
+
* Clavier de la primitive : fleches haut et bas entre les elements visibles,
|
|
25
|
+
* droite pour deplier ou entrer, gauche pour replier ou remonter, Debut et Fin,
|
|
26
|
+
* recherche a la frappe ; Espace ou Entree choisit. Selection et depliage sont des
|
|
27
|
+
* listes de VALEURS, lisibles et restaurables par l'application.
|
|
28
|
+
*/
|
|
29
|
+
class StTree {
|
|
30
|
+
/** Nom de l'arbre, lu a l'entree. Obligatoire. */
|
|
31
|
+
etiquette = input.required(/* @ts-ignore */
|
|
32
|
+
...(ngDevMode ? [{ debugName: "etiquette" }] : /* istanbul ignore next */ []));
|
|
33
|
+
noeuds = input.required(/* @ts-ignore */
|
|
34
|
+
...(ngDevMode ? [{ debugName: "noeuds" }] : /* istanbul ignore next */ []));
|
|
35
|
+
multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
36
|
+
selection = model([], /* @ts-ignore */
|
|
37
|
+
...(ngDevMode ? [{ debugName: "selection" }] : /* istanbul ignore next */ []));
|
|
38
|
+
deplies = model([], /* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [{ debugName: "deplies" }] : /* istanbul ignore next */ []));
|
|
40
|
+
/** La primitive attend un tableau modifiable ; le modele est en lecture seule. */
|
|
41
|
+
valeursChoisies = computed(() => [...this.selection()], /* @ts-ignore */
|
|
42
|
+
...(ngDevMode ? [{ debugName: "valeursChoisies" }] : /* istanbul ignore next */ []));
|
|
43
|
+
ensembleDeplie = computed(() => new Set(this.deplies()), /* @ts-ignore */
|
|
44
|
+
...(ngDevMode ? [{ debugName: "ensembleDeplie" }] : /* istanbul ignore next */ []));
|
|
45
|
+
estDeplie(noeud) {
|
|
46
|
+
return this.ensembleDeplie().has(noeud.valeur);
|
|
47
|
+
}
|
|
48
|
+
surDepliage(noeud, deplie) {
|
|
49
|
+
const deplies = this.deplies().filter((valeur) => valeur !== noeud.valeur);
|
|
50
|
+
this.deplies.set(deplie ? [...deplies, noeud.valeur] : deplies);
|
|
51
|
+
}
|
|
52
|
+
surSelection(valeurs) {
|
|
53
|
+
this.selection.set([...valeurs]);
|
|
54
|
+
}
|
|
55
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StTree, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
56
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: StTree, isStandalone: true, selector: "st-tree", inputs: { etiquette: { classPropertyName: "etiquette", publicName: "etiquette", isSignal: true, isRequired: true, transformFunction: null }, noeuds: { classPropertyName: "noeuds", publicName: "noeuds", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, selection: { classPropertyName: "selection", publicName: "selection", isSignal: true, isRequired: false, transformFunction: null }, deplies: { classPropertyName: "deplies", publicName: "deplies", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection: "selectionChange", deplies: "depliesChange" }, host: { classAttribute: "st-tree" }, ngImport: i0, template: "<ul\n #arbre=\"ngTree\"\n class=\"st-tree__racine\"\n ngTree\n selectionMode=\"explicit\"\n [attr.aria-label]=\"etiquette()\"\n [multi]=\"multiple()\"\n [value]=\"valeursChoisies()\"\n (valueChange)=\"surSelection($event)\"\n>\n <ng-container\n *ngTemplateOutlet=\"niveau; context: { noeuds: noeuds(), parent: arbre, niveau: 1 }\"\n />\n</ul>\n\n<ng-template #niveau let-noeuds=\"noeuds\" let-parent=\"parent\" let-profondeur=\"niveau\">\n @for (noeud of noeuds; track noeud.valeur) {\n <li\n #element=\"ngTreeItem\"\n class=\"st-tree__element\"\n ngTreeItem\n [parent]=\"parent\"\n [value]=\"noeud.valeur\"\n [label]=\"noeud.libelle\"\n [disabled]=\"noeud.desactive === true\"\n [expanded]=\"estDeplie(noeud)\"\n [style.--st-arbre-niveau]=\"profondeur\"\n (expandedChange)=\"surDepliage(noeud, $event)\"\n >\n @if (noeud.enfants?.length) {\n <st-icon\n class=\"st-tree__chevron\"\n taille=\"sm\"\n [nom]=\"estDeplie(noeud) ? 'chevron-bas' : 'chevron-droite'\"\n />\n } @else {\n <span class=\"st-tree__espace\"></span>\n }\n <span class=\"st-tree__libelle\">{{ noeud.libelle }}</span>\n <st-icon class=\"st-tree__coche\" nom=\"coche\" taille=\"sm\" />\n </li>\n @if (noeud.enfants?.length) {\n <ul class=\"st-tree__groupe\" role=\"group\">\n <ng-template ngTreeItemGroup [ownedBy]=\"element\" #groupe=\"ngTreeItemGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n niveau;\n context: { noeuds: noeud.enfants, parent: groupe, niveau: profondeur + 1 }\n \"\n />\n </ng-template>\n </ul>\n }\n }\n</ng-template>\n", styles: [".st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}:host([hidden]){display:none!important}:host{display:block}.st-tree__racine,.st-tree__groupe{padding:0;margin:0;list-style:none}.st-tree__element{display:flex;gap:var(--st-espacement-1);align-items:center;min-block-size:var(--st-cible-tactile-min);padding-inline:calc((var(--st-arbre-niveau, 1) - 1) * 1.5rem + var(--st-espacement-2)) var(--st-espacement-2);cursor:pointer;border-radius:var(--st-rayon-sm)}@media(hover:hover){.st-tree__element:hover{background:var(--st-couleur-surface-survol)}}.st-tree__element:focus-visible{outline:2px solid var(--st-couleur-anneau-focus);outline-offset:-2px}.st-tree__element[aria-selected=true]{font-weight:var(--st-graisse-semi);background:var(--st-couleur-primaire-discret)}.st-tree__element[aria-disabled=true]{color:var(--st-couleur-texte-desactive);cursor:not-allowed}.st-tree__chevron,.st-tree__espace{flex:none;inline-size:1rem}.st-tree__coche{margin-inline-start:auto;visibility:hidden}[aria-selected=true]>.st-tree__coche{visibility:visible}.st-tree__groupe:empty{display:none}\n"], dependencies: [{ kind: "directive", type: Tree, selector: "[ngTree]", inputs: ["id", "orientation", "multi", "disabled", "selectionMode", "focusMode", "wrap", "softDisabled", "typeaheadDelay", "tabindex", "value", "nav", "currentType"], outputs: ["valueChange"], exportAs: ["ngTree"] }, { kind: "directive", type: TreeItem, selector: "[ngTreeItem]", inputs: ["id", "value", "parent", "disabled", "selectable", "expanded", "label"], outputs: ["expandedChange"], exportAs: ["ngTreeItem"] }, { kind: "directive", type: TreeItemGroup, selector: "ng-template[ngTreeItemGroup]", inputs: ["ownedBy"], exportAs: ["ngTreeItemGroup"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: StIcon, selector: "st-icon", inputs: ["nom", "sprite", "nomMetier", "taille", "ton", "etiquette"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
57
|
+
}
|
|
58
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StTree, decorators: [{
|
|
59
|
+
type: Component,
|
|
60
|
+
args: [{ selector: 'st-tree', changeDetection: ChangeDetectionStrategy.OnPush, imports: [Tree, TreeItem, TreeItemGroup, NgTemplateOutlet, StIcon], host: { class: 'st-tree' }, template: "<ul\n #arbre=\"ngTree\"\n class=\"st-tree__racine\"\n ngTree\n selectionMode=\"explicit\"\n [attr.aria-label]=\"etiquette()\"\n [multi]=\"multiple()\"\n [value]=\"valeursChoisies()\"\n (valueChange)=\"surSelection($event)\"\n>\n <ng-container\n *ngTemplateOutlet=\"niveau; context: { noeuds: noeuds(), parent: arbre, niveau: 1 }\"\n />\n</ul>\n\n<ng-template #niveau let-noeuds=\"noeuds\" let-parent=\"parent\" let-profondeur=\"niveau\">\n @for (noeud of noeuds; track noeud.valeur) {\n <li\n #element=\"ngTreeItem\"\n class=\"st-tree__element\"\n ngTreeItem\n [parent]=\"parent\"\n [value]=\"noeud.valeur\"\n [label]=\"noeud.libelle\"\n [disabled]=\"noeud.desactive === true\"\n [expanded]=\"estDeplie(noeud)\"\n [style.--st-arbre-niveau]=\"profondeur\"\n (expandedChange)=\"surDepliage(noeud, $event)\"\n >\n @if (noeud.enfants?.length) {\n <st-icon\n class=\"st-tree__chevron\"\n taille=\"sm\"\n [nom]=\"estDeplie(noeud) ? 'chevron-bas' : 'chevron-droite'\"\n />\n } @else {\n <span class=\"st-tree__espace\"></span>\n }\n <span class=\"st-tree__libelle\">{{ noeud.libelle }}</span>\n <st-icon class=\"st-tree__coche\" nom=\"coche\" taille=\"sm\" />\n </li>\n @if (noeud.enfants?.length) {\n <ul class=\"st-tree__groupe\" role=\"group\">\n <ng-template ngTreeItemGroup [ownedBy]=\"element\" #groupe=\"ngTreeItemGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n niveau;\n context: { noeuds: noeud.enfants, parent: groupe, niveau: profondeur + 1 }\n \"\n />\n </ng-template>\n </ul>\n }\n }\n</ng-template>\n", styles: [".st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}:host([hidden]){display:none!important}:host{display:block}.st-tree__racine,.st-tree__groupe{padding:0;margin:0;list-style:none}.st-tree__element{display:flex;gap:var(--st-espacement-1);align-items:center;min-block-size:var(--st-cible-tactile-min);padding-inline:calc((var(--st-arbre-niveau, 1) - 1) * 1.5rem + var(--st-espacement-2)) var(--st-espacement-2);cursor:pointer;border-radius:var(--st-rayon-sm)}@media(hover:hover){.st-tree__element:hover{background:var(--st-couleur-surface-survol)}}.st-tree__element:focus-visible{outline:2px solid var(--st-couleur-anneau-focus);outline-offset:-2px}.st-tree__element[aria-selected=true]{font-weight:var(--st-graisse-semi);background:var(--st-couleur-primaire-discret)}.st-tree__element[aria-disabled=true]{color:var(--st-couleur-texte-desactive);cursor:not-allowed}.st-tree__chevron,.st-tree__espace{flex:none;inline-size:1rem}.st-tree__coche{margin-inline-start:auto;visibility:hidden}[aria-selected=true]>.st-tree__coche{visibility:visible}.st-tree__groupe:empty{display:none}\n"] }]
|
|
61
|
+
}], propDecorators: { etiquette: [{ type: i0.Input, args: [{ isSignal: true, alias: "etiquette", required: true }] }], noeuds: [{ type: i0.Input, args: [{ isSignal: true, alias: "noeuds", required: true }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], selection: [{ type: i0.Input, args: [{ isSignal: true, alias: "selection", required: false }] }, { type: i0.Output, args: ["selectionChange"] }], deplies: [{ type: i0.Input, args: [{ isSignal: true, alias: "deplies", required: false }] }, { type: i0.Output, args: ["depliesChange"] }] } });
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @starterlib/ui/arbre — l'arborescence deroulante.
|
|
65
|
+
*
|
|
66
|
+
* ⚠️ Detache de `@starterlib/ui/interactions` (ADR 0031, decision 2). Pair
|
|
67
|
+
* lourd de ce point d'entree, et le seul : `@angular/aria/tree`.
|
|
68
|
+
*
|
|
69
|
+
* ⚠️ En federation, ce point d'entree se partage SEPAREMENT : c'est un
|
|
70
|
+
* specificateur de module distinct.
|
|
71
|
+
*
|
|
72
|
+
* ```ts
|
|
73
|
+
* import { StTree } from '@starterlib/ui/arbre';
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Generated bundle index. Do not edit.
|
|
79
|
+
*/
|
|
80
|
+
|
|
81
|
+
export { StTree };
|
|
82
|
+
//# sourceMappingURL=starterlib-ui-arbre.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"starterlib-ui-arbre.mjs","sources":["../../../../packages/ui/arbre/src/lib/st-tree.ts","../../../../packages/ui/arbre/src/lib/st-tree.html","../../../../packages/ui/arbre/src/public-api.ts","../../../../packages/ui/arbre/src/starterlib-ui-arbre.ts"],"names":[],"mappings":"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"}
|