@starterlib/ui 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENCES-TIERCES.md +236 -0
  2. package/README.md +101 -47
  3. package/assets/icones/catalogue.json +3296 -0
  4. package/assets/icones/sprite.svg +235 -35
  5. package/fesm2022/starterlib-ui-arbre.mjs +473 -80
  6. package/fesm2022/starterlib-ui-arbre.mjs.map +1 -1
  7. package/fesm2022/starterlib-ui-donnees.mjs +3551 -522
  8. package/fesm2022/starterlib-ui-donnees.mjs.map +1 -1
  9. package/fesm2022/starterlib-ui-formulaires.mjs +3186 -443
  10. package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
  11. package/fesm2022/starterlib-ui-libelles-en.mjs +380 -139
  12. package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -1
  13. package/fesm2022/starterlib-ui-listes.mjs +5354 -658
  14. package/fesm2022/starterlib-ui-listes.mjs.map +1 -1
  15. package/fesm2022/starterlib-ui-messagerie.mjs +737 -0
  16. package/fesm2022/starterlib-ui-messagerie.mjs.map +1 -0
  17. package/fesm2022/starterlib-ui-navigation.mjs +506 -243
  18. package/fesm2022/starterlib-ui-navigation.mjs.map +1 -1
  19. package/fesm2022/starterlib-ui-onglets.mjs +369 -135
  20. package/fesm2022/starterlib-ui-onglets.mjs.map +1 -1
  21. package/fesm2022/starterlib-ui-parcours.mjs +2449 -0
  22. package/fesm2022/starterlib-ui-parcours.mjs.map +1 -0
  23. package/fesm2022/starterlib-ui-qr.mjs +907 -0
  24. package/fesm2022/starterlib-ui-qr.mjs.map +1 -0
  25. package/fesm2022/starterlib-ui-saisie.mjs +8566 -1589
  26. package/fesm2022/starterlib-ui-saisie.mjs.map +1 -1
  27. package/fesm2022/starterlib-ui-selection.mjs +1340 -268
  28. package/fesm2022/starterlib-ui-selection.mjs.map +1 -1
  29. package/fesm2022/starterlib-ui-sens.mjs +59 -0
  30. package/fesm2022/starterlib-ui-sens.mjs.map +1 -0
  31. package/fesm2022/starterlib-ui-surfaces.mjs +5140 -1387
  32. package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
  33. package/fesm2022/starterlib-ui.mjs +10721 -2871
  34. package/fesm2022/starterlib-ui.mjs.map +1 -1
  35. package/package.json +27 -18
  36. package/styles/amorce.css +69 -0
  37. package/styles/couches.css +178 -0
  38. package/types/starterlib-ui-arbre.d.ts +199 -25
  39. package/types/starterlib-ui-donnees.d.ts +1441 -180
  40. package/types/starterlib-ui-formulaires.d.ts +1174 -139
  41. package/types/starterlib-ui-libelles-en.d.ts +3 -23
  42. package/types/starterlib-ui-listes.d.ts +2310 -255
  43. package/types/starterlib-ui-messagerie.d.ts +317 -0
  44. package/types/starterlib-ui-navigation.d.ts +201 -63
  45. package/types/starterlib-ui-onglets.d.ts +172 -43
  46. package/types/starterlib-ui-parcours.d.ts +916 -0
  47. package/types/starterlib-ui-qr.d.ts +105 -0
  48. package/types/starterlib-ui-saisie.d.ts +3431 -549
  49. package/types/starterlib-ui-selection.d.ts +441 -65
  50. package/types/starterlib-ui-sens.d.ts +44 -0
  51. package/types/starterlib-ui-surfaces.d.ts +1899 -510
  52. package/types/starterlib-ui.d.ts +4749 -1115
  53. package/fesm2022/starterlib-ui-interactions.mjs +0 -43
  54. package/fesm2022/starterlib-ui-interactions.mjs.map +0 -1
  55. package/types/starterlib-ui-interactions.d.ts +0 -4
@@ -1,246 +1,509 @@
1
- import { BreakpointObserver } from '@angular/cdk/layout';
2
- import { NgTemplateOutlet } from '@angular/common';
3
- import * as i0 from '@angular/core';
4
- import { inject, Injector, input, computed, signal, viewChild, effect, DestroyRef, ChangeDetectionStrategy, Component, Directive } from '@angular/core';
5
- import { RUPTURES } from '@starterlib/tokens';
6
- import { ST_LIBELLES } from '@starterlib/ui';
7
-
8
- /**
9
- * Au-dela, la navigation tient a cote du contenu. Meme seuil que `st-app-shell`,
10
- * lu dans les jetons : ecrit en dur ici, il avait deja diverge une fois de la
11
- * feuille (F7 du plan de la coquille).
12
- */
1
+ import { BreakpointObserver } from "@angular/cdk/layout";
2
+ import { DOCUMENT, NgTemplateOutlet } from "@angular/common";
3
+ import * as i0 from "@angular/core";
4
+ import { ChangeDetectionStrategy, Component, DestroyRef, Directive, Injector, afterNextRender, booleanAttribute, computed, effect, inject, input, signal, viewChild } from "@angular/core";
5
+ import { RUPTURES } from "@starterlib/tokens";
6
+ import { ST_LIBELLES, ST_LOCALE, StIdentifiants, affichageDiffere } from "@starterlib/ui";
7
+ import { RouterLink, RouterLinkActive } from "@angular/router";
13
8
  const ECRAN_LARGE = RUPTURES.lg.requete;
14
9
  let compteur = 0;
15
- /**
16
- * Navigation laterale : une region a cote du contenu sur grand ecran, un tiroir
17
- * sur petit ecran.
18
- *
19
- * ```html
20
- * <st-app-shell>
21
- * <button entete stButton [stSidenavToggle]="navigation">Menu</button>
22
- * <st-sidenav navigation #navigation etiquette="Navigation principale">
23
- * <a routerLink="/comptes">Comptes</a>
24
- * </st-sidenav>
25
- * …
26
- * </st-app-shell>
27
- * ```
28
- *
29
- * ⚠️ **Deux modes, jamais confondus.** Persistante, c'est une REGION de la page :
30
- * aucun piege, rien a ouvrir. Modale, c'est un TIROIR, donc un `StDialog` — role,
31
- * piegeage du focus, Echap, retour du focus au bouton — et non une region
32
- * glissee par-dessus la page avec un peu de CSS, qui laisserait le clavier
33
- * parcourir la page cachee dessous.
34
- *
35
- * ⚠️ **Elle porte son propre `<nav>`, et un seul a la fois.** Sur petit ecran,
36
- * la region en ligne DISPARAIT quand le tiroir prend le relais : laissee en
37
- * place, elle resterait un repere de navigation vide, que le lecteur d'ecran
38
- * proposerait sans rien y trouver.
39
- *
40
- * Un lien suivi dans le tiroir le ferme : `StDialog` se ferme a toute navigation
41
- * du routeur.
42
- */
43
- class StSidenav {
44
- // Capture a la construction : apres l'attente du module, le contexte
45
- // d'injection n'existe plus, et `inject()` y leverait.
46
- injecteur = inject(Injector);
47
- libelles = inject(ST_LIBELLES);
48
- /**
49
- * Nom du repere. `null` : « Navigation principale », du dictionnaire. A
50
- * renseigner des qu'une page compte deux navigations, qui doivent se
51
- * distinguer.
52
- */
53
- etiquette = input(null, /* @ts-ignore */
54
- ...(ngDevMode ? [{ debugName: "etiquette" }] : /* istanbul ignore next */ []));
55
- etiquetteLue = computed(() => this.etiquette() ?? this.libelles().navigationPrincipale, /* @ts-ignore */
56
- ...(ngDevMode ? [{ debugName: "etiquetteLue" }] : /* istanbul ignore next */ []));
57
- /** `auto` : persistante sur grand ecran, tiroir en dessous. */
58
- mode = input('auto', /* @ts-ignore */
59
- ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
60
- identifiant = `st-sidenav-${(compteur += 1).toString()}`;
61
- ecranLarge = signal(false, /* @ts-ignore */
62
- ...(ngDevMode ? [{ debugName: "ecranLarge" }] : /* istanbul ignore next */ []));
63
- /** Mode reellement applique. Lu par le bouton, qui ne s'affiche qu'en tiroir. */
64
- modeEffectif = computed(() => {
65
- const mode = this.mode();
66
- if (mode !== 'auto')
67
- return mode;
68
- return this.ecranLarge() ? 'persistant' : 'modal';
69
- }, /* @ts-ignore */
70
- ...(ngDevMode ? [{ debugName: "modeEffectif" }] : /* istanbul ignore next */ []));
71
- ouvertInterne = signal(false, /* @ts-ignore */
72
- ...(ngDevMode ? [{ debugName: "ouvertInterne" }] : /* istanbul ignore next */ []));
73
- ouvert = this.ouvertInterne.asReadonly();
74
- // Nomme autrement que la variable `#contenu` du gabarit, qui la masquerait.
75
- gabarit = viewChild.required('contenu', /* @ts-ignore */
76
- ...(ngDevMode ? [{ debugName: "gabarit" }] : /* istanbul ignore next */ []));
77
- reference = null;
78
- // Pose AVANT l'attente du module de surfaces : sans lui, deux clics rapides
79
- // ouvriraient deux tiroirs, `this.reference` etant encore nul pendant le
80
- // chargement.
81
- ouvertureEnCours = false;
82
- // Le composant peut disparaitre PENDANT l'attente — une navigation, un
83
- // `@if` qui bascule. `fermer()` ne suffirait pas : il n'y a encore rien a
84
- // fermer, et le tiroir se poserait apres coup, orphelin.
85
- detruit = false;
86
- /**
87
- * Le service de dialogue, charge a la PREMIERE ouverture et garde ensuite.
88
- * Rend `null` si le composant a ete detruit pendant l'attente.
89
- *
90
- * ⚠️ Le specificateur etant dans la carte d'importation de l'application
91
- * federee, cet import dynamique resout vers l'INSTANCE PARTAGEE du point
92
- * d'entree : le tiroir emploie le meme `StDialog`, le meme recouvrement et la
93
- * meme pile que le reste de l'application. Un import dynamique ne dedouble
94
- * rien ; il decale seulement le moment du telechargement.
95
- *
96
- * ⚠️ **Le controle de destruction est ICI, avant `injecteur.get`, et non chez
97
- * l'appelant.** Un injecteur detruit ne rend pas `undefined` : il LEVE
98
- * (NG0205). Le controle place apres la resolution du service arrivait donc
99
- * trop tard, et une navigation pendant le chargement du module produisait un
100
- * rejet non gere — invisible en developpement, remonte comme erreur
101
- * applicative en production, puisque `basculer()` appelle `ouvrir()` sans
102
- * attendre sa promesse.
103
- */
104
- async serviceDeDialogue() {
105
- const { StDialog: classe } = await import('@starterlib/ui/surfaces');
106
- if (this.detruit)
107
- return null;
108
- return this.injecteur.get(classe);
109
- }
110
- constructor() {
111
- const abonnement = inject(BreakpointObserver)
112
- .observe(ECRAN_LARGE)
113
- .subscribe((etat) => {
114
- this.ecranLarge.set(etat.matches);
115
- });
116
- // Un ecran qui s'elargit pendant que le tiroir est ouvert : la navigation
117
- // redevient une region, et le tiroir n'a plus de raison d'etre.
118
- effect(() => {
119
- if (this.modeEffectif() === 'persistant')
120
- this.fermer();
121
- });
122
- inject(DestroyRef).onDestroy(() => {
123
- this.detruit = true;
124
- abonnement.unsubscribe();
125
- this.fermer();
126
- });
127
- }
128
- /**
129
- * Ouvre le tiroir. Asynchrone depuis la 0.8.0 : le module du dialogue se
130
- * charge a la demande. La promesse est tenue quand le tiroir est a l'ecran —
131
- * un test l'attend, l'appelant ordinaire n'a rien a en faire.
132
- */
133
- async ouvrir() {
134
- if (this.modeEffectif() !== 'modal' || this.reference !== null)
135
- return;
136
- if (this.ouvertureEnCours)
137
- return;
138
- this.ouvertureEnCours = true;
139
- try {
140
- const dialogues = await this.serviceDeDialogue();
141
- // `null` : le composant a disparu pendant l'attente. L'ecran a pu
142
- // s'elargir aussi — ouvrir maintenant poserait un tiroir que plus rien ne
143
- // fermerait.
144
- if (dialogues === null || this.modeEffectif() !== 'modal')
145
- return;
146
- const reference = dialogues.ouvrir(this.gabarit(), {
147
- cote: 'debut',
148
- etiquette: this.etiquetteLue(),
149
- });
150
- this.reference = reference;
151
- this.ouvertInterne.set(true);
152
- void reference.ferme.then(() => {
153
- if (this.reference !== reference)
154
- return;
155
- this.reference = null;
156
- this.ouvertInterne.set(false);
157
- });
158
- }
159
- finally {
160
- this.ouvertureEnCours = false;
161
- }
162
- }
163
- fermer() {
164
- const reference = this.reference;
165
- if (reference === null)
166
- return;
167
- this.reference = null;
168
- this.ouvertInterne.set(false);
169
- reference.fermer();
170
- }
171
- /** Reste synchrone : c'est ce que lit la liaison de clic du bouton. */
172
- basculer() {
173
- if (this.ouvertInterne())
174
- this.fermer();
175
- else
176
- void this.ouvrir();
177
- }
178
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StSidenav, deps: [], target: i0.ɵɵFactoryTarget.Component });
179
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: StSidenav, isStandalone: true, selector: "st-sidenav", inputs: { etiquette: { classPropertyName: "etiquette", publicName: "etiquette", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-mode": "modeEffectif()" }, classAttribute: "st-sidenav" }, viewQueries: [{ propertyName: "gabarit", first: true, predicate: ["contenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #contenu>\n <nav class=\"st-sidenav__navigation\" [attr.id]=\"identifiant\" [attr.aria-label]=\"etiquetteLue()\">\n <ng-content />\n </nav>\n</ng-template>\n\n@if (modeEffectif() === 'persistant') {\n <ng-container [ngTemplateOutlet]=\"contenu\" />\n}\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}:host([data-mode=modal]){display:none}.st-sidenav__navigation{display:flex;flex-direction:column;gap:var(--st-espacement-1);padding:var(--st-espacement-4)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
180
- }
181
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StSidenav, decorators: [{
182
- type: Component,
183
- args: [{ selector: 'st-sidenav', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet], host: {
184
- class: 'st-sidenav',
185
- '[attr.data-mode]': 'modeEffectif()',
186
- }, template: "<ng-template #contenu>\n <nav class=\"st-sidenav__navigation\" [attr.id]=\"identifiant\" [attr.aria-label]=\"etiquetteLue()\">\n <ng-content />\n </nav>\n</ng-template>\n\n@if (modeEffectif() === 'persistant') {\n <ng-container [ngTemplateOutlet]=\"contenu\" />\n}\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}:host([data-mode=modal]){display:none}.st-sidenav__navigation{display:flex;flex-direction:column;gap:var(--st-espacement-1);padding:var(--st-espacement-4)}\n"] }]
187
- }], ctorParameters: () => [], propDecorators: { etiquette: [{ type: i0.Input, args: [{ isSignal: true, alias: "etiquette", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], gabarit: [{ type: i0.ViewChild, args: ['contenu', { isSignal: true }] }] } });
188
-
189
- /**
190
- * Bouton qui ouvre la navigation en tiroir.
191
- *
192
- * ⚠️ **Masque quand la navigation est persistante.** Un bouton « Menu » qui ne
193
- * fait rien, parce que la navigation est deja affichee a cote, est un arret de
194
- * tabulation inutile et une promesse non tenue.
195
- *
196
- * ⚠️ `aria-expanded` suit l'ouverture du tiroir : sans lui, rien ne dit a qui
197
- * n'en voit pas l'effet que le bouton a agi.
198
- */
199
- class StSidenavToggle {
200
- stSidenavToggle = input.required(/* @ts-ignore */
201
- ...(ngDevMode ? [{ debugName: "stSidenavToggle" }] : /* istanbul ignore next */ []));
202
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StSidenavToggle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
203
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: StSidenavToggle, isStandalone: true, selector: "[stSidenavToggle]", inputs: { stSidenavToggle: { classPropertyName: "stSidenavToggle", publicName: "stSidenavToggle", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "aria-haspopup": "dialog" }, listeners: { "click": "stSidenavToggle().basculer()" }, properties: { "attr.aria-expanded": "stSidenavToggle().ouvert()", "attr.hidden": "stSidenavToggle().modeEffectif() === \"modal\" ? null : \"\"" } }, ngImport: i0 });
204
- }
205
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StSidenavToggle, decorators: [{
206
- type: Directive,
207
- args: [{
208
- selector: '[stSidenavToggle]',
209
- host: {
210
- 'aria-haspopup': 'dialog',
211
- '[attr.aria-expanded]': 'stSidenavToggle().ouvert()',
212
- '[attr.hidden]': 'stSidenavToggle().modeEffectif() === "modal" ? null : ""',
213
- '(click)': 'stSidenavToggle().basculer()',
214
- },
215
- }]
216
- }], propDecorators: { stSidenavToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "stSidenavToggle", required: true }] }] } });
217
-
218
- /**
219
- * @starterlib/ui/navigation — la navigation laterale : region a cote du
220
- * contenu sur grand ecran, tiroir sur petit ecran.
221
- *
222
- * ⚠️ Detache de `@starterlib/ui/interactions`, qui agregeait quatre familles
223
- * derriere UN specificateur (ADR 0031, decision 2). La coquille n'y voulait
224
- * que `StSidenav`, qui n'a besoin que d'`@angular/cdk/layout` — un observateur
225
- * de rupture, quelques centaines d'octets —, et payait au passage tout
226
- * `@angular/aria` amene par les onglets, la selection et l'arbre.
227
- *
228
- * Pair lourd de ce point d'entree, et le seul : `@angular/cdk/layout`.
229
- * L'ouverture du tiroir charge `@starterlib/ui/surfaces` A LA DEMANDE : le
230
- * dialogue n'est plus une arete statique du chemin de peinture (ADR 0031,
231
- * decision 3).
232
- *
233
- * ⚠️ En federation, ce point d'entree se partage SEPAREMENT : c'est un
234
- * specificateur de module distinct.
235
- *
236
- * ```ts
237
- * import { StSidenav, StSidenavToggle } from '@starterlib/ui/navigation';
238
- * ```
239
- */
240
-
241
- /**
242
- * Generated bundle index. Do not edit.
243
- */
10
+ var StSidenav = class StSidenav {
11
+ injecteur = inject(Injector);
12
+ libelles = inject(ST_LIBELLES);
13
+ etiquette = input(null, ...ngDevMode ? [{ debugName: "etiquette" }] : /* istanbul ignore next */ []);
14
+ etiquetteLue = computed(() => this.etiquette() ?? this.libelles().navigationPrincipale, ...ngDevMode ? [{ debugName: "etiquetteLue" }] : /* istanbul ignore next */ []);
15
+ mode = input("auto", ...ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []);
16
+ identifiant = `st-sidenav-${(compteur += 1).toString()}`;
17
+ ecranLarge = signal(false, ...ngDevMode ? [{ debugName: "ecranLarge" }] : /* istanbul ignore next */ []);
18
+ modeEffectif = computed(() => {
19
+ const mode = this.mode();
20
+ if (mode !== "auto") return mode;
21
+ return this.ecranLarge() ? "persistant" : "modal";
22
+ }, ...ngDevMode ? [{ debugName: "modeEffectif" }] : /* istanbul ignore next */ []);
23
+ ouvertInterne = signal(false, ...ngDevMode ? [{ debugName: "ouvertInterne" }] : /* istanbul ignore next */ []);
24
+ ouvert = this.ouvertInterne.asReadonly();
25
+ chargementDuTiroir = signal(false, ...ngDevMode ? [{ debugName: "chargementDuTiroir" }] : /* istanbul ignore next */ []);
26
+ enAttente = affichageDiffere(() => this.chargementDuTiroir(), { tenue: 0 });
27
+ gabarit = viewChild.required("contenu", ...ngDevMode ? [{ debugName: "gabarit" }] : /* istanbul ignore next */ []);
28
+ reference = null;
29
+ ouvertureEnCours = false;
30
+ detruit = false;
31
+ async serviceDeDialogue() {
32
+ const { StDialog: classe } = await import("@starterlib/ui/surfaces");
33
+ if (this.detruit) return null;
34
+ return this.injecteur.get(classe);
35
+ }
36
+ constructor() {
37
+ const abonnement = inject(BreakpointObserver).observe(ECRAN_LARGE).subscribe((etat) => {
38
+ this.ecranLarge.set(etat.matches);
39
+ });
40
+ effect(() => {
41
+ if (this.modeEffectif() !== "modal") this.fermer();
42
+ });
43
+ inject(DestroyRef).onDestroy(() => {
44
+ this.detruit = true;
45
+ abonnement.unsubscribe();
46
+ this.fermer();
47
+ });
48
+ }
49
+ async ouvrir() {
50
+ if (this.modeEffectif() !== "modal" || this.reference !== null) return;
51
+ if (this.ouvertureEnCours) return;
52
+ this.ouvertureEnCours = true;
53
+ this.chargementDuTiroir.set(true);
54
+ try {
55
+ const dialogues = await this.serviceDeDialogue();
56
+ if (dialogues === null || this.modeEffectif() !== "modal") return;
57
+ const reference = dialogues.ouvrir(this.gabarit(), {
58
+ cote: "debut",
59
+ etiquette: this.etiquetteLue()
60
+ });
61
+ this.reference = reference;
62
+ this.ouvertInterne.set(true);
63
+ reference.ferme.then(() => {
64
+ if (this.reference !== reference) return;
65
+ this.reference = null;
66
+ this.ouvertInterne.set(false);
67
+ });
68
+ } finally {
69
+ this.ouvertureEnCours = false;
70
+ this.chargementDuTiroir.set(false);
71
+ }
72
+ }
73
+ fermer() {
74
+ const reference = this.reference;
75
+ if (reference === null) return;
76
+ this.reference = null;
77
+ this.ouvertInterne.set(false);
78
+ reference.fermer();
79
+ }
80
+ basculer() {
81
+ if (this.ouvertInterne()) this.fermer();
82
+ else this.ouvrir();
83
+ }
84
+ static ɵfac = i0.ɵɵngDeclareFactory({
85
+ minVersion: "12.0.0",
86
+ version: "22.2.0",
87
+ ngImport: i0,
88
+ type: StSidenav,
89
+ deps: [],
90
+ target: i0.ɵɵFactoryTarget.Component
91
+ });
92
+ static ɵcmp = i0.ɵɵngDeclareComponent({
93
+ minVersion: "17.0.0",
94
+ version: "22.2.0",
95
+ type: StSidenav,
96
+ isStandalone: true,
97
+ selector: "st-sidenav",
98
+ inputs: {
99
+ etiquette: {
100
+ classPropertyName: "etiquette",
101
+ publicName: "etiquette",
102
+ isSignal: true,
103
+ isRequired: false,
104
+ transformFunction: null
105
+ },
106
+ mode: {
107
+ classPropertyName: "mode",
108
+ publicName: "mode",
109
+ isSignal: true,
110
+ isRequired: false,
111
+ transformFunction: null
112
+ }
113
+ },
114
+ host: {
115
+ properties: { "attr.data-mode": "modeEffectif()" },
116
+ classAttribute: "st-sidenav"
117
+ },
118
+ viewQueries: [{
119
+ propertyName: "gabarit",
120
+ first: true,
121
+ predicate: ["contenu"],
122
+ descendants: true,
123
+ isSignal: true
124
+ }],
125
+ ngImport: i0,
126
+ template: "<ng-template #contenu>\n <nav class=\"st-sidenav__navigation\" [attr.id]=\"identifiant\" [attr.aria-label]=\"etiquetteLue()\">\n <ng-content />\n </nav>\n</ng-template>\n\n<!-- En colonne comme en rail (reserve, lot 235), la navigation est une region de la page. -->\n@if (modeEffectif() !== 'modal') {\n <ng-container [ngTemplateOutlet]=\"contenu\" />\n}\n",
127
+ 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}:host([data-mode=modal]){display:none}.st-sidenav__navigation{display:flex;flex-direction:column;gap:var(--st-espacement-1);padding:var(--st-espacement-4)}\n"],
128
+ dependencies: [{
129
+ kind: "directive",
130
+ type: NgTemplateOutlet,
131
+ selector: "[ngTemplateOutlet]",
132
+ inputs: [
133
+ "ngTemplateOutletContext",
134
+ "ngTemplateOutlet",
135
+ "ngTemplateOutletInjector"
136
+ ]
137
+ }],
138
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
139
+ });
140
+ };
141
+ i0.ɵɵngDeclareClassMetadata({
142
+ minVersion: "12.0.0",
143
+ version: "22.2.0",
144
+ ngImport: i0,
145
+ type: StSidenav,
146
+ decorators: [{
147
+ type: Component,
148
+ args: [{
149
+ selector: "st-sidenav",
150
+ changeDetection: ChangeDetectionStrategy.OnPush,
151
+ imports: [NgTemplateOutlet],
152
+ host: {
153
+ class: "st-sidenav",
154
+ "[attr.data-mode]": "modeEffectif()"
155
+ },
156
+ template: "<ng-template #contenu>\n <nav class=\"st-sidenav__navigation\" [attr.id]=\"identifiant\" [attr.aria-label]=\"etiquetteLue()\">\n <ng-content />\n </nav>\n</ng-template>\n\n<!-- En colonne comme en rail (reserve, lot 235), la navigation est une region de la page. -->\n@if (modeEffectif() !== 'modal') {\n <ng-container [ngTemplateOutlet]=\"contenu\" />\n}\n",
157
+ 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}:host([data-mode=modal]){display:none}.st-sidenav__navigation{display:flex;flex-direction:column;gap:var(--st-espacement-1);padding:var(--st-espacement-4)}\n"]
158
+ }]
159
+ }],
160
+ ctorParameters: () => [],
161
+ propDecorators: {
162
+ etiquette: [{
163
+ type: i0.Input,
164
+ args: [{
165
+ isSignal: true,
166
+ alias: "etiquette",
167
+ required: false
168
+ }]
169
+ }],
170
+ mode: [{
171
+ type: i0.Input,
172
+ args: [{
173
+ isSignal: true,
174
+ alias: "mode",
175
+ required: false
176
+ }]
177
+ }],
178
+ gabarit: [{
179
+ type: i0.ViewChild,
180
+ args: ["contenu", { isSignal: true }]
181
+ }]
182
+ }
183
+ });
184
+ var StSidenavToggle = class StSidenavToggle {
185
+ stSidenavToggle = input.required(...ngDevMode ? [{ debugName: "stSidenavToggle" }] : /* istanbul ignore next */ []);
186
+ static ɵfac = i0.ɵɵngDeclareFactory({
187
+ minVersion: "12.0.0",
188
+ version: "22.2.0",
189
+ ngImport: i0,
190
+ type: StSidenavToggle,
191
+ deps: [],
192
+ target: i0.ɵɵFactoryTarget.Directive
193
+ });
194
+ static ɵdir = i0.ɵɵngDeclareDirective({
195
+ minVersion: "17.1.0",
196
+ version: "22.2.0",
197
+ type: StSidenavToggle,
198
+ isStandalone: true,
199
+ selector: "[stSidenavToggle]",
200
+ inputs: { stSidenavToggle: {
201
+ classPropertyName: "stSidenavToggle",
202
+ publicName: "stSidenavToggle",
203
+ isSignal: true,
204
+ isRequired: true,
205
+ transformFunction: null
206
+ } },
207
+ host: {
208
+ attributes: { "aria-haspopup": "dialog" },
209
+ listeners: { "click": "stSidenavToggle().basculer()" },
210
+ properties: {
211
+ "attr.aria-expanded": "stSidenavToggle().ouvert()",
212
+ "attr.aria-busy": "stSidenavToggle().enAttente() ? \"true\" : null",
213
+ "attr.hidden": "stSidenavToggle().modeEffectif() === \"modal\" ? null : \"\""
214
+ }
215
+ },
216
+ ngImport: i0
217
+ });
218
+ };
219
+ i0.ɵɵngDeclareClassMetadata({
220
+ minVersion: "12.0.0",
221
+ version: "22.2.0",
222
+ ngImport: i0,
223
+ type: StSidenavToggle,
224
+ decorators: [{
225
+ type: Directive,
226
+ args: [{
227
+ selector: "[stSidenavToggle]",
228
+ host: {
229
+ "aria-haspopup": "dialog",
230
+ "[attr.aria-expanded]": "stSidenavToggle().ouvert()",
231
+ "[attr.aria-busy]": "stSidenavToggle().enAttente() ? \"true\" : null",
232
+ "[attr.hidden]": "stSidenavToggle().modeEffectif() === \"modal\" ? null : \"\"",
233
+ "(click)": "stSidenavToggle().basculer()"
234
+ }
235
+ }]
236
+ }],
237
+ propDecorators: { stSidenavToggle: [{
238
+ type: i0.Input,
239
+ args: [{
240
+ isSignal: true,
241
+ alias: "stSidenavToggle",
242
+ required: true
243
+ }]
244
+ }] }
245
+ });
246
+ var StNavTabs = class StNavTabs {
247
+ locale = inject(ST_LOCALE);
248
+ formatDesComptes = computed(() => new Intl.NumberFormat(this.locale()), ...ngDevMode ? [{ debugName: "formatDesComptes" }] : /* istanbul ignore next */ []);
249
+ onglets = input.required(...ngDevMode ? [{ debugName: "onglets" }] : /* istanbul ignore next */ []);
250
+ etiquette = input.required(...ngDevMode ? [{ debugName: "etiquette" }] : /* istanbul ignore next */ []);
251
+ compteDe(compte) {
252
+ return this.formatDesComptes().format(compte);
253
+ }
254
+ static ɵfac = i0.ɵɵngDeclareFactory({
255
+ minVersion: "12.0.0",
256
+ version: "22.2.0",
257
+ ngImport: i0,
258
+ type: StNavTabs,
259
+ deps: [],
260
+ target: i0.ɵɵFactoryTarget.Component
261
+ });
262
+ static ɵcmp = i0.ɵɵngDeclareComponent({
263
+ minVersion: "17.0.0",
264
+ version: "22.2.0",
265
+ type: StNavTabs,
266
+ isStandalone: true,
267
+ selector: "st-nav-tabs",
268
+ inputs: {
269
+ onglets: {
270
+ classPropertyName: "onglets",
271
+ publicName: "onglets",
272
+ isSignal: true,
273
+ isRequired: true,
274
+ transformFunction: null
275
+ },
276
+ etiquette: {
277
+ classPropertyName: "etiquette",
278
+ publicName: "etiquette",
279
+ isSignal: true,
280
+ isRequired: true,
281
+ transformFunction: null
282
+ }
283
+ },
284
+ host: { classAttribute: "st-nav-tabs" },
285
+ ngImport: i0,
286
+ template: "<nav class=\"st-nav-tabs__nav\" [attr.aria-label]=\"etiquette()\">\n <!-- `role=\"list\"` : sans puces, Safari ne lit plus une liste comme une liste. -->\n <ul class=\"st-nav-tabs__liste\" role=\"list\">\n @for (onglet of onglets(); track $index) {\n <li class=\"st-nav-tabs__element\">\n <a\n class=\"st-nav-tabs__lien\"\n routerLinkActive=\"st-nav-tabs__lien--actif\"\n ariaCurrentWhenActive=\"page\"\n [routerLink]=\"onglet.lien\"\n [routerLinkActiveOptions]=\"{ exact: onglet.exact ?? false }\"\n >\n <span class=\"st-nav-tabs__libelle\">{{ onglet.libelle }}</span>\n @if (onglet.compte !== undefined && onglet.compte !== null) {\n <!-- Comme st-tabs : le compte entre dans le NOM par un texte lecteur-seul\n (« Documents, 3 ») ; la pastille, collee au libelle, est muette. -->\n <span class=\"st-vh\">, {{ compteDe(onglet.compte) }}</span>\n <span class=\"st-nav-tabs__compte\" aria-hidden=\"true\">{{\n compteDe(onglet.compte)\n }}</span>\n }\n </a>\n </li>\n }\n </ul>\n</nav>\n",
287
+ 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;min-inline-size:0}.st-nav-tabs__liste{display:flex;gap:var(--st-espacement-4);align-items:center;padding:0;margin:0;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scroll-snap-type:x proximity;scroll-padding-inline:var(--st-espacement-4);list-style:none;scrollbar-width:thin;background:linear-gradient(to right,var(--st-couleur-surface) 30%,transparent) left center/var(--st-espacement-10) 100% no-repeat local,linear-gradient(to left,var(--st-couleur-surface) 30%,transparent) right center/var(--st-espacement-10) 100% no-repeat local,radial-gradient(farthest-side at 0 50%,var(--st-couleur-ombre),transparent) left center/var(--st-espacement-3) 100% no-repeat scroll,radial-gradient(farthest-side at 100% 50%,var(--st-couleur-ombre),transparent) right center/var(--st-espacement-3) 100% no-repeat scroll;box-shadow:inset 0 calc(-1 * var(--st-epaisseur-capillaire)) 0 0 var(--st-couleur-bordure)}.st-nav-tabs__element{flex:none}.st-nav-tabs__lien:focus-visible{outline:var(--st-focus-epaisseur) solid var(--st-couleur-anneau-focus);outline-offset:calc(-1 * var(--st-focus-epaisseur))}.st-nav-tabs__lien{font-size:var(--st-taille-sm);line-height:var(--st-interligne-sm);font-weight:var(--st-graisse-moyenne);letter-spacing:var(--st-interlettrage-normal);position:relative;display:flex;gap:var(--st-espacement-1);align-items:center;min-block-size:max(var(--st-hauteur-commande-defaut),var(--st-cible-tactile-min));padding-block:0;padding-inline:var(--st-espacement-4);color:var(--st-couleur-texte-discret);text-decoration:none;white-space:nowrap;scroll-snap-align:start;transition:color var(--st-duree-rapide) var(--st-courbe-standard),background-color var(--st-duree-rapide) var(--st-courbe-standard)}@media(hover:hover){.st-nav-tabs__lien:hover:not([aria-current=page],:active){color:var(--st-couleur-texte);background-color:color-mix(in srgb,var(--st-couleur-surface-conteneur-bas) 70%,transparent);border-start-start-radius:var(--st-rayon-sm);border-start-end-radius:var(--st-rayon-sm)}}.st-nav-tabs__lien:active{color:var(--st-couleur-texte);background-color:var(--st-couleur-surface-active);border-start-start-radius:var(--st-rayon-sm);border-start-end-radius:var(--st-rayon-sm)}.st-nav-tabs__lien[aria-current=page]{font-weight:var(--st-graisse-semi);color:var(--st-couleur-texte-primaire);background-color:var(--st-couleur-surface-conteneur-bas);border-start-start-radius:var(--st-rayon-sm);border-start-end-radius:var(--st-rayon-sm)}.st-nav-tabs__lien[aria-current=page]:after{position:absolute;inset-inline:0;inset-block-end:calc(-1 * var(--st-epaisseur-capillaire));block-size:var(--st-epaisseur-forte);content:\"\";background-color:var(--st-couleur-bordure-selection);forced-color-adjust:none;-webkit-print-color-adjust:exact;print-color-adjust:exact}.st-nav-tabs__compte{margin-inline-start:var(--st-espacement-1-5);padding-block:var(--st-espacement-demi);padding-inline:var(--st-espacement-2);font-size:var(--st-taille-2xs);line-height:var(--st-interligne-2xs);font-weight:var(--st-graisse-semi);font-variant-numeric:var(--st-chiffres-alignes);letter-spacing:var(--st-interlettrage-capitales);color:var(--st-couleur-texte-discret);background-color:var(--st-couleur-surface-enfoncee);border-radius:var(--st-rayon-pleine)}@media(forced-colors:active){.st-nav-tabs__liste{border-block-end:var(--st-epaisseur-capillaire) solid var(--st-couleur-bordure)}.st-nav-tabs__compte{border:var(--st-epaisseur-fine) solid CanvasText}}@media print{.st-nav-tabs__liste{flex-wrap:wrap;overflow:visible;background:none;border-block-end:var(--st-epaisseur-capillaire) solid var(--st-couleur-bordure);box-shadow:none}}\n"],
288
+ dependencies: [{
289
+ kind: "directive",
290
+ type: RouterLink,
291
+ selector: "[routerLink]",
292
+ inputs: [
293
+ "target",
294
+ "queryParams",
295
+ "fragment",
296
+ "queryParamsHandling",
297
+ "state",
298
+ "info",
299
+ "relativeTo",
300
+ "preserveFragment",
301
+ "skipLocationChange",
302
+ "replaceUrl",
303
+ "browserUrl",
304
+ "routerLink"
305
+ ]
306
+ }, {
307
+ kind: "directive",
308
+ type: RouterLinkActive,
309
+ selector: "[routerLinkActive]",
310
+ inputs: [
311
+ "routerLinkActiveOptions",
312
+ "ariaCurrentWhenActive",
313
+ "routerLinkActive"
314
+ ],
315
+ outputs: ["isActiveChange"],
316
+ exportAs: ["routerLinkActive"]
317
+ }],
318
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
319
+ });
320
+ };
321
+ i0.ɵɵngDeclareClassMetadata({
322
+ minVersion: "12.0.0",
323
+ version: "22.2.0",
324
+ ngImport: i0,
325
+ type: StNavTabs,
326
+ decorators: [{
327
+ type: Component,
328
+ args: [{
329
+ selector: "st-nav-tabs",
330
+ changeDetection: ChangeDetectionStrategy.OnPush,
331
+ imports: [RouterLink, RouterLinkActive],
332
+ host: { class: "st-nav-tabs" },
333
+ template: "<nav class=\"st-nav-tabs__nav\" [attr.aria-label]=\"etiquette()\">\n <!-- `role=\"list\"` : sans puces, Safari ne lit plus une liste comme une liste. -->\n <ul class=\"st-nav-tabs__liste\" role=\"list\">\n @for (onglet of onglets(); track $index) {\n <li class=\"st-nav-tabs__element\">\n <a\n class=\"st-nav-tabs__lien\"\n routerLinkActive=\"st-nav-tabs__lien--actif\"\n ariaCurrentWhenActive=\"page\"\n [routerLink]=\"onglet.lien\"\n [routerLinkActiveOptions]=\"{ exact: onglet.exact ?? false }\"\n >\n <span class=\"st-nav-tabs__libelle\">{{ onglet.libelle }}</span>\n @if (onglet.compte !== undefined && onglet.compte !== null) {\n <!-- Comme st-tabs : le compte entre dans le NOM par un texte lecteur-seul\n (« Documents, 3 ») ; la pastille, collee au libelle, est muette. -->\n <span class=\"st-vh\">, {{ compteDe(onglet.compte) }}</span>\n <span class=\"st-nav-tabs__compte\" aria-hidden=\"true\">{{\n compteDe(onglet.compte)\n }}</span>\n }\n </a>\n </li>\n }\n </ul>\n</nav>\n",
334
+ 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;min-inline-size:0}.st-nav-tabs__liste{display:flex;gap:var(--st-espacement-4);align-items:center;padding:0;margin:0;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scroll-snap-type:x proximity;scroll-padding-inline:var(--st-espacement-4);list-style:none;scrollbar-width:thin;background:linear-gradient(to right,var(--st-couleur-surface) 30%,transparent) left center/var(--st-espacement-10) 100% no-repeat local,linear-gradient(to left,var(--st-couleur-surface) 30%,transparent) right center/var(--st-espacement-10) 100% no-repeat local,radial-gradient(farthest-side at 0 50%,var(--st-couleur-ombre),transparent) left center/var(--st-espacement-3) 100% no-repeat scroll,radial-gradient(farthest-side at 100% 50%,var(--st-couleur-ombre),transparent) right center/var(--st-espacement-3) 100% no-repeat scroll;box-shadow:inset 0 calc(-1 * var(--st-epaisseur-capillaire)) 0 0 var(--st-couleur-bordure)}.st-nav-tabs__element{flex:none}.st-nav-tabs__lien:focus-visible{outline:var(--st-focus-epaisseur) solid var(--st-couleur-anneau-focus);outline-offset:calc(-1 * var(--st-focus-epaisseur))}.st-nav-tabs__lien{font-size:var(--st-taille-sm);line-height:var(--st-interligne-sm);font-weight:var(--st-graisse-moyenne);letter-spacing:var(--st-interlettrage-normal);position:relative;display:flex;gap:var(--st-espacement-1);align-items:center;min-block-size:max(var(--st-hauteur-commande-defaut),var(--st-cible-tactile-min));padding-block:0;padding-inline:var(--st-espacement-4);color:var(--st-couleur-texte-discret);text-decoration:none;white-space:nowrap;scroll-snap-align:start;transition:color var(--st-duree-rapide) var(--st-courbe-standard),background-color var(--st-duree-rapide) var(--st-courbe-standard)}@media(hover:hover){.st-nav-tabs__lien:hover:not([aria-current=page],:active){color:var(--st-couleur-texte);background-color:color-mix(in srgb,var(--st-couleur-surface-conteneur-bas) 70%,transparent);border-start-start-radius:var(--st-rayon-sm);border-start-end-radius:var(--st-rayon-sm)}}.st-nav-tabs__lien:active{color:var(--st-couleur-texte);background-color:var(--st-couleur-surface-active);border-start-start-radius:var(--st-rayon-sm);border-start-end-radius:var(--st-rayon-sm)}.st-nav-tabs__lien[aria-current=page]{font-weight:var(--st-graisse-semi);color:var(--st-couleur-texte-primaire);background-color:var(--st-couleur-surface-conteneur-bas);border-start-start-radius:var(--st-rayon-sm);border-start-end-radius:var(--st-rayon-sm)}.st-nav-tabs__lien[aria-current=page]:after{position:absolute;inset-inline:0;inset-block-end:calc(-1 * var(--st-epaisseur-capillaire));block-size:var(--st-epaisseur-forte);content:\"\";background-color:var(--st-couleur-bordure-selection);forced-color-adjust:none;-webkit-print-color-adjust:exact;print-color-adjust:exact}.st-nav-tabs__compte{margin-inline-start:var(--st-espacement-1-5);padding-block:var(--st-espacement-demi);padding-inline:var(--st-espacement-2);font-size:var(--st-taille-2xs);line-height:var(--st-interligne-2xs);font-weight:var(--st-graisse-semi);font-variant-numeric:var(--st-chiffres-alignes);letter-spacing:var(--st-interlettrage-capitales);color:var(--st-couleur-texte-discret);background-color:var(--st-couleur-surface-enfoncee);border-radius:var(--st-rayon-pleine)}@media(forced-colors:active){.st-nav-tabs__liste{border-block-end:var(--st-epaisseur-capillaire) solid var(--st-couleur-bordure)}.st-nav-tabs__compte{border:var(--st-epaisseur-fine) solid CanvasText}}@media print{.st-nav-tabs__liste{flex-wrap:wrap;overflow:visible;background:none;border-block-end:var(--st-epaisseur-capillaire) solid var(--st-couleur-bordure);box-shadow:none}}\n"]
335
+ }]
336
+ }],
337
+ propDecorators: {
338
+ onglets: [{
339
+ type: i0.Input,
340
+ args: [{
341
+ isSignal: true,
342
+ alias: "onglets",
343
+ required: true
344
+ }]
345
+ }],
346
+ etiquette: [{
347
+ type: i0.Input,
348
+ args: [{
349
+ isSignal: true,
350
+ alias: "etiquette",
351
+ required: true
352
+ }]
353
+ }]
354
+ }
355
+ });
356
+ const TITRES = "h1, h2, h3, h4, h5, h6";
357
+ var StPageNav = class StPageNav {
358
+ document = inject(DOCUMENT);
359
+ libelles = inject(ST_LIBELLES);
360
+ entrees = input.required(...ngDevMode ? [{ debugName: "entrees" }] : /* istanbul ignore next */ []);
361
+ etiquette = input(null, ...ngDevMode ? [{ debugName: "etiquette" }] : /* istanbul ignore next */ []);
362
+ collee = input(true, {
363
+ ...ngDevMode ? { debugName: "collee" } : /* istanbul ignore next */ {},
364
+ transform: booleanAttribute
365
+ });
366
+ nom = computed(() => this.etiquette() ?? this.libelles().sommaire, ...ngDevMode ? [{ debugName: "nom" }] : /* istanbul ignore next */ []);
367
+ idDuTitre = inject(StIdentifiants).prochain("st-page-nav");
368
+ courante = signal(null, ...ngDevMode ? [{ debugName: "courante" }] : /* istanbul ignore next */ []);
369
+ constructor() {
370
+ const destruction = inject(DestroyRef);
371
+ let observateur = null;
372
+ const visibles = /* @__PURE__ */ new Set();
373
+ const observer = () => {
374
+ observateur?.disconnect();
375
+ visibles.clear();
376
+ const vue = this.document.defaultView;
377
+ if (vue === null || typeof vue.IntersectionObserver !== "function") return;
378
+ observateur = new vue.IntersectionObserver((changements) => {
379
+ for (const changement of changements) {
380
+ const id = changement.target.id;
381
+ if (changement.isIntersecting) visibles.add(id);
382
+ else visibles.delete(id);
383
+ }
384
+ const premiere = this.entrees().find((entree) => visibles.has(entree.cible));
385
+ if (premiere !== void 0) this.courante.set(premiere.cible);
386
+ }, { rootMargin: "0px 0px -60% 0px" });
387
+ for (const entree of this.entrees()) {
388
+ const cible = this.document.getElementById(entree.cible);
389
+ if (cible !== null) observateur.observe(cible);
390
+ }
391
+ };
392
+ afterNextRender(() => {
393
+ observer();
394
+ });
395
+ effect(() => {
396
+ this.entrees();
397
+ observer();
398
+ });
399
+ destruction.onDestroy(() => {
400
+ observateur?.disconnect();
401
+ });
402
+ }
403
+ aller(evenement, cible) {
404
+ const section = this.document.getElementById(cible);
405
+ if (section === null) return;
406
+ evenement.preventDefault();
407
+ const titre = section.matches(TITRES) ? section : section.querySelector(TITRES) ?? section;
408
+ if (!titre.hasAttribute("tabindex")) titre.setAttribute("tabindex", "-1");
409
+ section.scrollIntoView({ block: "start" });
410
+ titre.focus({ preventScroll: true });
411
+ this.courante.set(cible);
412
+ this.document.defaultView?.history.replaceState(null, "", `#${cible}`);
413
+ }
414
+ static ɵfac = i0.ɵɵngDeclareFactory({
415
+ minVersion: "12.0.0",
416
+ version: "22.2.0",
417
+ ngImport: i0,
418
+ type: StPageNav,
419
+ deps: [],
420
+ target: i0.ɵɵFactoryTarget.Component
421
+ });
422
+ static ɵcmp = i0.ɵɵngDeclareComponent({
423
+ minVersion: "17.0.0",
424
+ version: "22.2.0",
425
+ type: StPageNav,
426
+ isStandalone: true,
427
+ selector: "st-page-nav",
428
+ inputs: {
429
+ entrees: {
430
+ classPropertyName: "entrees",
431
+ publicName: "entrees",
432
+ isSignal: true,
433
+ isRequired: true,
434
+ transformFunction: null
435
+ },
436
+ etiquette: {
437
+ classPropertyName: "etiquette",
438
+ publicName: "etiquette",
439
+ isSignal: true,
440
+ isRequired: false,
441
+ transformFunction: null
442
+ },
443
+ collee: {
444
+ classPropertyName: "collee",
445
+ publicName: "collee",
446
+ isSignal: true,
447
+ isRequired: false,
448
+ transformFunction: null
449
+ }
450
+ },
451
+ host: {
452
+ properties: { "attr.data-collee": "collee() ? \"\" : null" },
453
+ classAttribute: "st-page-nav"
454
+ },
455
+ ngImport: i0,
456
+ template: "<!-- Le titre visible nomme la navigation (relecture du lot 245) : on voit ce qu'est la colonne. -->\n<nav class=\"st-page-nav__nav\" [attr.aria-labelledby]=\"idDuTitre\">\n <p class=\"st-page-nav__titre\" [id]=\"idDuTitre\">{{ nom() }}</p>\n <ol class=\"st-page-nav__liste\" role=\"list\">\n @for (entree of entrees(); track entree.cible) {\n <li class=\"st-page-nav__element\">\n <a\n class=\"st-page-nav__lien\"\n [attr.href]=\"'#' + entree.cible\"\n [attr.aria-current]=\"courante() === entree.cible ? 'location' : null\"\n (click)=\"aller($event, entree.cible)\"\n >{{ entree.libelle }}</a\n >\n </li>\n }\n </ol>\n</nav>\n",
457
+ 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}@media(min-width:64rem){:host([data-collee]){position:sticky;inset-block-start:calc(var(--st-hauteur-entete, 0px) + var(--st-espacement-6));align-self:start}}.st-page-nav__titre{font-size:var(--st-taille-2xs);line-height:var(--st-interligne-2xs);font-weight:var(--st-graisse-semi);letter-spacing:var(--st-interlettrage-capitales);text-transform:uppercase;margin:0 0 var(--st-espacement-2);padding-inline-start:calc(var(--st-espacement-4) + var(--st-epaisseur-fine));color:var(--st-couleur-texte-discret)}.st-page-nav__liste{display:grid;padding:0;margin:0;list-style:none;border-inline-start:var(--st-epaisseur-fine) solid var(--st-couleur-bordure)}.st-page-nav__lien:focus-visible{outline:var(--st-focus-epaisseur) solid var(--st-couleur-anneau-focus);outline-offset:var(--st-focus-decalage);box-shadow:0 0 0 var(--st-focus-lisere) var(--st-couleur-lisere-focus)}.st-page-nav__lien{font-size:var(--st-taille-sm);line-height:var(--st-interligne-sm);font-weight:var(--st-graisse-moyenne);letter-spacing:var(--st-interlettrage-normal);display:flex;align-items:center;min-block-size:var(--st-cible-tactile-min);padding-inline:var(--st-espacement-4) var(--st-espacement-2);margin-inline-start:calc(-1 * var(--st-epaisseur-fine));color:var(--st-couleur-texte-discret);text-decoration:none;border-inline-start:var(--st-epaisseur-forte) solid transparent}@media(hover:hover){.st-page-nav__lien:hover{color:var(--st-couleur-texte);border-inline-start-color:var(--st-couleur-bordure-forte)}}.st-page-nav__lien[aria-current=location]{font-weight:var(--st-graisse-semi);color:var(--st-couleur-texte-primaire);border-inline-start-color:var(--st-couleur-bordure-selection)}@media(forced-colors:active){.st-page-nav__lien[aria-current=location]{border-inline-start-color:Highlight}}\n"],
458
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
459
+ });
460
+ };
461
+ i0.ɵɵngDeclareClassMetadata({
462
+ minVersion: "12.0.0",
463
+ version: "22.2.0",
464
+ ngImport: i0,
465
+ type: StPageNav,
466
+ decorators: [{
467
+ type: Component,
468
+ args: [{
469
+ selector: "st-page-nav",
470
+ changeDetection: ChangeDetectionStrategy.OnPush,
471
+ host: {
472
+ class: "st-page-nav",
473
+ "[attr.data-collee]": "collee() ? \"\" : null"
474
+ },
475
+ template: "<!-- Le titre visible nomme la navigation (relecture du lot 245) : on voit ce qu'est la colonne. -->\n<nav class=\"st-page-nav__nav\" [attr.aria-labelledby]=\"idDuTitre\">\n <p class=\"st-page-nav__titre\" [id]=\"idDuTitre\">{{ nom() }}</p>\n <ol class=\"st-page-nav__liste\" role=\"list\">\n @for (entree of entrees(); track entree.cible) {\n <li class=\"st-page-nav__element\">\n <a\n class=\"st-page-nav__lien\"\n [attr.href]=\"'#' + entree.cible\"\n [attr.aria-current]=\"courante() === entree.cible ? 'location' : null\"\n (click)=\"aller($event, entree.cible)\"\n >{{ entree.libelle }}</a\n >\n </li>\n }\n </ol>\n</nav>\n",
476
+ 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}@media(min-width:64rem){:host([data-collee]){position:sticky;inset-block-start:calc(var(--st-hauteur-entete, 0px) + var(--st-espacement-6));align-self:start}}.st-page-nav__titre{font-size:var(--st-taille-2xs);line-height:var(--st-interligne-2xs);font-weight:var(--st-graisse-semi);letter-spacing:var(--st-interlettrage-capitales);text-transform:uppercase;margin:0 0 var(--st-espacement-2);padding-inline-start:calc(var(--st-espacement-4) + var(--st-epaisseur-fine));color:var(--st-couleur-texte-discret)}.st-page-nav__liste{display:grid;padding:0;margin:0;list-style:none;border-inline-start:var(--st-epaisseur-fine) solid var(--st-couleur-bordure)}.st-page-nav__lien:focus-visible{outline:var(--st-focus-epaisseur) solid var(--st-couleur-anneau-focus);outline-offset:var(--st-focus-decalage);box-shadow:0 0 0 var(--st-focus-lisere) var(--st-couleur-lisere-focus)}.st-page-nav__lien{font-size:var(--st-taille-sm);line-height:var(--st-interligne-sm);font-weight:var(--st-graisse-moyenne);letter-spacing:var(--st-interlettrage-normal);display:flex;align-items:center;min-block-size:var(--st-cible-tactile-min);padding-inline:var(--st-espacement-4) var(--st-espacement-2);margin-inline-start:calc(-1 * var(--st-epaisseur-fine));color:var(--st-couleur-texte-discret);text-decoration:none;border-inline-start:var(--st-epaisseur-forte) solid transparent}@media(hover:hover){.st-page-nav__lien:hover{color:var(--st-couleur-texte);border-inline-start-color:var(--st-couleur-bordure-forte)}}.st-page-nav__lien[aria-current=location]{font-weight:var(--st-graisse-semi);color:var(--st-couleur-texte-primaire);border-inline-start-color:var(--st-couleur-bordure-selection)}@media(forced-colors:active){.st-page-nav__lien[aria-current=location]{border-inline-start-color:Highlight}}\n"]
477
+ }]
478
+ }],
479
+ ctorParameters: () => [],
480
+ propDecorators: {
481
+ entrees: [{
482
+ type: i0.Input,
483
+ args: [{
484
+ isSignal: true,
485
+ alias: "entrees",
486
+ required: true
487
+ }]
488
+ }],
489
+ etiquette: [{
490
+ type: i0.Input,
491
+ args: [{
492
+ isSignal: true,
493
+ alias: "etiquette",
494
+ required: false
495
+ }]
496
+ }],
497
+ collee: [{
498
+ type: i0.Input,
499
+ args: [{
500
+ isSignal: true,
501
+ alias: "collee",
502
+ required: false
503
+ }]
504
+ }]
505
+ }
506
+ });
507
+ export { StNavTabs, StPageNav, StSidenav, StSidenavToggle };
244
508
 
245
- export { StSidenav, StSidenavToggle };
246
- //# sourceMappingURL=starterlib-ui-navigation.mjs.map
509
+ //# sourceMappingURL=starterlib-ui-navigation.mjs.map