@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.
Files changed (35) hide show
  1. package/README.md +95 -42
  2. package/fesm2022/starterlib-ui-arbre.mjs +82 -0
  3. package/fesm2022/starterlib-ui-arbre.mjs.map +1 -0
  4. package/fesm2022/starterlib-ui-donnees.mjs +532 -0
  5. package/fesm2022/starterlib-ui-donnees.mjs.map +1 -0
  6. package/fesm2022/starterlib-ui-formulaires.mjs +2 -1
  7. package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
  8. package/fesm2022/starterlib-ui-interactions.mjs +34 -589
  9. package/fesm2022/starterlib-ui-interactions.mjs.map +1 -1
  10. package/fesm2022/starterlib-ui-libelles-en.mjs +142 -0
  11. package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -0
  12. package/fesm2022/starterlib-ui-listes.mjs +671 -0
  13. package/fesm2022/starterlib-ui-listes.mjs.map +1 -0
  14. package/fesm2022/starterlib-ui-navigation.mjs +246 -0
  15. package/fesm2022/starterlib-ui-navigation.mjs.map +1 -0
  16. package/fesm2022/starterlib-ui-onglets.mjs +137 -0
  17. package/fesm2022/starterlib-ui-onglets.mjs.map +1 -0
  18. package/fesm2022/starterlib-ui-saisie.mjs +1632 -0
  19. package/fesm2022/starterlib-ui-saisie.mjs.map +1 -0
  20. package/fesm2022/starterlib-ui-selection.mjs +269 -0
  21. package/fesm2022/starterlib-ui-selection.mjs.map +1 -0
  22. package/fesm2022/starterlib-ui.mjs +105 -2931
  23. package/fesm2022/starterlib-ui.mjs.map +1 -1
  24. package/package.json +35 -3
  25. package/types/starterlib-ui-arbre.d.ts +51 -0
  26. package/types/starterlib-ui-donnees.d.ts +228 -0
  27. package/types/starterlib-ui-formulaires.d.ts +5 -4
  28. package/types/starterlib-ui-interactions.d.ts +4 -316
  29. package/types/starterlib-ui-libelles-en.d.ts +25 -0
  30. package/types/starterlib-ui-listes.d.ts +432 -0
  31. package/types/starterlib-ui-navigation.d.ts +104 -0
  32. package/types/starterlib-ui-onglets.d.ts +89 -0
  33. package/types/starterlib-ui-saisie.d.ts +924 -0
  34. package/types/starterlib-ui-selection.d.ts +112 -0
  35. 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
- ## Quatre points d'entree
18
-
19
- Un composant sort du tronc quand il traine un pair lourd, et seulement alors ;
20
- le point d'entree secondaire ou il va se choisit ensuite par ce qu'il EST pour
21
- qui l'emploie.
22
-
23
- | Point d'entree | Contenu | Ce qu'il traine a l'execution | Gzippe |
24
- | ----------------------------- | ----------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------- |
25
- | `@starterlib/ui` | le tronc : etats, texte, actions, structure, transverses, saisie native, calendrier, listes et tableaux | `@angular/router`, deja exige par `core` | 48,8 Ko |
26
- | `@starterlib/ui/surfaces` | ce qui se pose AU-DESSUS de la page : menu, dialogues, tiroirs, messages ephemeres | `@angular/cdk`, `@angular/aria/menu` | 9,7 Ko |
27
- | `@starterlib/ui/interactions` | ce qui fait PARTIE de la page et traine Aria ou une surface : onglets, navigation laterale, combobox, arbre | `@angular/aria`, qui exige lui-meme `@angular/cdk` | 8,1 Ko |
28
- | `@starterlib/ui/formulaires` | les champs qui LISENT leur saisie : montant, date, plage de dates | le code d'`@angular/forms` (`transformedValue`) | 4,5 Ko |
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, StInput, StSelect } from '@starterlib/ui';
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 { StTabs, StCombobox, StMultiselect } from '@starterlib/ui/interactions';
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. La separation n'a donc pas
39
- pour but le poids, mais le **train de singletons** : une application qui
40
- n'affiche ni menu, ni dialogue, ni onglets ne charge ni le CDK ni Aria, et n'a
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`) : un import de trop dans le tronc echoue avant
51
- la publication.
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 quatre
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 trois autres. Omis de la configuration, chaque remote en embarque sa propre
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
- shared: {
62
- '@starterlib/ui': { singleton: true, strictVersion: true },
63
- '@starterlib/ui/surfaces': { singleton: true, strictVersion: true },
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
- Voir `docs/adr/0003-points-d-entree-decoupes-par-dependance.md`.
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-code`, `st-count`), actions (`st-button`, `st-icon-button`, `st-link`,
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/interactions`** — `st-tabs`, `st-tab-panel`, `stTabContent`, `st-sidenav`,
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
- - **Tronc** — `st-form-field`, `st-input`, `st-textarea`, `st-fieldset`,
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/interactions`** — `st-combobox`, `st-multiselect`.
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` a
172
- l'execution dans le tronc.
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
- - **Tronc** — `st-data-table` (`stCellule`, `stTableauVide`, `stActionsDeTableau`),
186
- `st-sort-header`, `st-pagination`, `st-list` (`stElementDeListe`),
187
- `st-description-list` (`stDescription`), `st-filter-bar`, `st-filter-chip`.
188
- - **`ui/interactions`** — `st-tree`.
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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"}