@starterlib/ui 0.10.3 → 0.10.4

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.
@@ -1,7 +1,7 @@
1
1
  import { AnnonceLocale, Icone, TailleDAvatar, TailleDIconeFixe, TonDAvatar } from "@starterlib/ui";
2
2
  import * as i0 from "@angular/core";
3
3
  import { Ton, TonSemantique } from "@starterlib/util";
4
- import { Montant } from "@starterlib/util/valeurs";
4
+ import { BlocDeDocument, DocumentStructure, EmphaseDeDocument, LienDeDocument, Montant, MorceauDeTexte } from "@starterlib/util/valeurs";
5
5
  export type TypeMasque = 'iban' | 'carte' | 'telephone' | 'reference';
6
6
  /**
7
7
  * `ligne` : dans le flux d'une phrase ou d'une cellule. `tuile` : la tuile de la planche 2
@@ -1579,5 +1579,67 @@ export declare class StCode {
1579
1579
  "copie": "copie";
1580
1580
  }, never, never, true, never>;
1581
1581
  }
1582
+ /** Un titre de page va de 1 a 6 ; un document en occupe trois, decales. */
1583
+ type NiveauDeTitre = 2 | 3 | 4 | 5;
1584
+ /**
1585
+ * Un document structure (`DocumentStructure` de `@starterlib/util/valeurs`) rendu PAR GABARIT :
1586
+ * aide, mentions legales, confidentialite, declaration d'accessibilite, message de maintenance
1587
+ * (lot 280, N11).
1588
+ *
1589
+ * ```html
1590
+ * <st-document [document]="mentions()" />
1591
+ * ```
1592
+ *
1593
+ * ⚠️ **Aucun HTML, aucun puits DOM.** Chaque noeud a son element dans le gabarit (`@for`,
1594
+ * `@switch`) : titres, paragraphes, listes, `<strong>`, `<em>`, liens. Le texte est interpole,
1595
+ * jamais interprete — `require-trusted-types-for 'script'` n'a rien a refuser, et un catalogue
1596
+ * forge ne peut rien injecter.
1597
+ *
1598
+ * ⚠️ **Des liens internes seulement**, suivis par le routeur : le document ne mene jamais a une
1599
+ * autre origine. `validerLeDocument` (et le schema publie) refuse deja un lien qui n'est pas un
1600
+ * chemin `/...` ; le composant, lui, ne rend qu'un document ainsi valide.
1601
+ *
1602
+ * ⚠️ **Des liens legers.** Un `<a>` natif par lien — `href` prepare par `Location` (la base de
1603
+ * l'application comprise), l'apparence du lien de phrase du socle — et UN ecouteur de clic sur
1604
+ * l'hote, qui confie la navigation au routeur. Un `stLink` et un `routerLink` par lien coutaient
1605
+ * 464 ms pour 2 000 liens au banc (lot 280) : une page d'aide ne doit pas figer l'ecran.
1606
+ *
1607
+ * ⚠️ **Les titres suivent la page.** Un document commence au niveau 2 (sous le `h1` de la page) ;
1608
+ * `niveauDeDepart` le decale quand il vit plus bas (dans une section `h2`, il commence a 3). Un
1609
+ * niveau ne saute jamais.
1610
+ */
1611
+ export declare class StDocument {
1612
+ readonly document: import("@angular/core").InputSignal<DocumentStructure>;
1613
+ /** Le niveau du premier titre du document dans la page : 2 (defaut) ou 3. */
1614
+ readonly niveauDeDepart: import("@angular/core").InputSignal<2 | 3>;
1615
+ private readonly decalage;
1616
+ private readonly routeur;
1617
+ private readonly emplacement;
1618
+ /** L'adresse d'un lien interne, telle que le navigateur l'ouvrira (base de l'application comprise). */
1619
+ protected adresse(chemin: string): string;
1620
+ /**
1621
+ * Un clic sur un lien du document : le routeur navigue, sans recharger. Un clic du milieu ou
1622
+ * avec une touche (nouvel onglet, nouvelle fenetre) reste au navigateur, comme pour `routerLink`.
1623
+ */
1624
+ protected suivre(evenement: MouseEvent): void;
1625
+ protected niveau(bloc: Extract<BlocDeDocument, {
1626
+ type: 'titre';
1627
+ }>): NiveauDeTitre;
1628
+ protected estLien(morceau: MorceauDeTexte): morceau is LienDeDocument;
1629
+ protected estEmphase(morceau: MorceauDeTexte): morceau is EmphaseDeDocument;
1630
+ static ɵfac: i0.ɵɵFactoryDeclaration<StDocument, never>;
1631
+ static ɵcmp: i0.ɵɵComponentDeclaration<StDocument, "st-document", never, {
1632
+ "document": {
1633
+ "alias": "document";
1634
+ "required": true;
1635
+ "isSignal": true;
1636
+ };
1637
+ "niveauDeDepart": {
1638
+ "alias": "niveauDeDepart";
1639
+ "required": false;
1640
+ "isSignal": true;
1641
+ };
1642
+ }, {}, never, never, true, never>;
1643
+ }
1582
1644
 
1583
1645
  export {};
@@ -1,95 +1,164 @@
1
1
  import * as i0 from "@angular/core";
2
+ import { InjectionToken, Provider, Signal } from "@angular/core";
3
+ import { CatalogueDuPointDEntree } from "@starterlib/ui";
4
+ import { StDialog } from "@starterlib/ui/surfaces";
2
5
  /**
3
- * `rail` (lot 176) : RESERVE au rail de 72 px de la planche 6 (D22 : tiroir sous `md`, rail de `md` a
4
- * `xl`, colonne au-dela), que le lot 235 dessine. Le type est fixe des la 0.9 pour que ce lot ne
5
- * change pas une sortie publique (`modeEffectif`) ; d'ici la, le rail se rend en colonne.
6
+ * Les libelles de `@starterlib/ui/navigation` (lot 235) : le catalogue par point d'entree (AD-10,
7
+ * D154), comme ceux de l'arbre et des formulaires. La langue suit celle du dictionnaire du tronc ;
8
+ * le nom du repere de navigation (`navigationPrincipale`), lui, reste au tronc.
9
+ */
10
+ export interface LibellesNavigation {
11
+ /** Le titre visible du tiroir, qui le nomme (« Menu ») : distinct du nom du `<nav>` qu'il contient. */
12
+ readonly menu: string;
13
+ /** La fermeture visible du tiroir, obligatoire au tactile (APG dialog). */
14
+ readonly fermerLeMenu: string;
15
+ }
16
+ export declare const LIBELLES_NAVIGATION_FR: LibellesNavigation;
17
+ export declare const LIBELLES_NAVIGATION_EN: LibellesNavigation;
18
+ /**
19
+ * Les catalogues de la navigation par langue (sous-etiquette primaire : `fr`, `en`). Une
20
+ * application qui ajoute une langue au dictionnaire du tronc ajoute la sienne ici, par
21
+ * `fournirLibellesNavigation({ de: ... })`.
22
+ */
23
+ export declare const ST_LIBELLES_NAVIGATION: InjectionToken<Readonly<Record<string, LibellesNavigation>>>;
24
+ /** Ajoute (ou remplace) des catalogues de la navigation, par langue. */
25
+ export declare function fournirLibellesNavigation(catalogues: Readonly<Record<string, LibellesNavigation>>): Provider;
26
+ /**
27
+ * Le catalogue de la langue du dictionnaire du tronc ; le francais quand la langue n'en a pas, un
28
+ * repli signale en developpement (D-29). A appeler dans un contexte d'injection.
29
+ */
30
+ export declare function libellesDeLaNavigation(): Signal<LibellesNavigation>;
31
+ /**
32
+ * Le catalogue de la navigation ET la langue de son repli (`catalogueDuPointDEntree`) : `lang` de
33
+ * ce qu'il ecrit seul (D-29). A appeler dans un contexte d'injection.
34
+ */
35
+ export declare function catalogueDeLaNavigation(): Signal<CatalogueDuPointDEntree<LibellesNavigation>>;
36
+ /**
37
+ * `auto` suit D22 (planche 6) : tiroir sous `md`, rail de `md` a `xl`, colonne des `xl`.
38
+ * `rail` (lot 235) : une colonne de 72 px (`--st-largeur-rail`) qui ne montre que les icones des
39
+ * liens ; le libelle de chacun parait en infobulle au survol et au focus, et reste son nom.
6
40
  */
7
41
  export type ModeDeNavigation = 'auto' | 'persistant' | 'modal' | 'rail';
42
+ /** Ce que la navigation rend REELLEMENT : `repli` est le tiroir ouvert sans couche. */
43
+ export type DispositionDeNavigation = 'colonne' | 'rail' | 'tiroir' | 'repli';
8
44
  /**
9
- * Navigation laterale : une region a cote du contenu sur grand ecran, un tiroir
10
- * sur petit ecran.
45
+ * Navigation laterale : une colonne a cote du contenu sur grand ecran, un rail d'icones entre
46
+ * `md` et `xl`, un tiroir sur petit ecran (D22).
11
47
  *
12
48
  * ```html
13
49
  * <st-app-shell>
14
- * <button entete stButton [stSidenavToggle]="navigation">Menu</button>
15
- * <st-sidenav navigation #navigation etiquette="Navigation principale">
16
- * <a routerLink="/comptes">Comptes</a>
50
+ * <st-header entete>
51
+ * <button bascule stIconButton icone="menu" etiquette="Menu" [stSidenavToggle]="navigation"></button>
52
+ * <st-lang-switch secondaire … />
53
+ * </st-header>
54
+ * <st-sidenav navigation #navigation>
55
+ * <a stNavLink="/comptes"><st-icon nom="portefeuille" taille="24" />Comptes</a>
56
+ * <st-lang-switch secondaire … />
57
+ * <a pied stNavLink="/deconnexion"><st-icon nom="deconnexion" taille="24" />Se deconnecter</a>
17
58
  * </st-sidenav>
18
59
  * …
19
60
  * </st-app-shell>
20
61
  * ```
21
62
  *
22
- * ⚠️ **Deux modes, jamais confondus.** Persistante, c'est une REGION de la page :
23
- * aucun piege, rien a ouvrir. Modale, c'est un TIROIR, donc un `StDialog` — role,
24
- * piegeage du focus, Echap, retour du focus au bouton — et non une region
25
- * glissee par-dessus la page avec un peu de CSS, qui laisserait le clavier
26
- * parcourir la page cachee dessous.
63
+ * ⚠️ **Des modes jamais confondus.** En colonne et en rail, c'est une REGION de la page : aucun
64
+ * piege, rien a ouvrir ; la colonne est COLLANTE sous l'en-tete et defile en elle-meme. En tiroir,
65
+ * c'est un `StDialog` — role, piegeage du focus, Echap, retour du focus au bouton — nomme par son
66
+ * titre visible « Menu », avec sa fermeture « Fermer le menu » ; le `<nav>` qu'il contient garde
67
+ * son nom. Jamais une region glissee par-dessus la page avec un peu de CSS, qui laisserait le
68
+ * clavier parcourir la page cachee dessous.
69
+ *
70
+ * ⚠️ **Elle porte son propre `<nav>`, et un seul a la fois.** En tiroir, la region en ligne
71
+ * DISPARAIT : laissee en place, elle resterait un repere vide.
27
72
  *
28
- * ⚠️ **Elle porte son propre `<nav>`, et un seul a la fois.** Sur petit ecran,
29
- * la region en ligne DISPARAIT quand le tiroir prend le relais : laissee en
30
- * place, elle resterait un repere de navigation vide, que le lecteur d'ecran
31
- * proposerait sans rien y trouver.
73
+ * ⚠️ **Aucun echec silencieux.** Si le module des surfaces ne se charge pas (hors ligne, cache
74
+ * vide), le tiroir s'ouvre EN LIGNE, sous l'en-tete, sans voile ni piege (`data-mode="repli"`) :
75
+ * un simple depliant, qu'Echap et toute navigation referment.
32
76
  *
33
- * Un lien suivi dans le tiroir le ferme : `StDialog` se ferme a toute navigation
34
- * du routeur.
77
+ * Deux creneaux : `[pied]` en bas de la navigation (deconnexion, aide, version), `[secondaire]`
78
+ * pour les actions que l'en-tete retire sous `md` (langue, theme), reproposees par le tiroir.
79
+ * Un lien suivi dans le tiroir le ferme : `StDialog` se ferme a toute navigation du routeur.
35
80
  */
36
81
  export declare class StSidenav {
37
82
  private readonly injecteur;
38
83
  private readonly libelles;
84
+ /** « Menu » et « Fermer le menu » : le catalogue du point d'entree (D154), et sa langue de repli. */
85
+ protected readonly catalogue: import("@angular/core").Signal<import("@starterlib/ui").CatalogueDuPointDEntree<import("@starterlib/ui/navigation").LibellesNavigation>>;
39
86
  /**
40
- * Nom du repere. `null` : « Navigation principale », du dictionnaire. A
41
- * renseigner des qu'une page compte deux navigations, qui doivent se
42
- * distinguer.
87
+ * Nom du repere de navigation. `null` : « Navigation principale », du dictionnaire. A
88
+ * renseigner des qu'une page compte deux navigations, qui doivent se distinguer. Le tiroir,
89
+ * lui, se nomme toujours « Menu ».
43
90
  */
44
91
  readonly etiquette: import("@angular/core").InputSignal<string | null>;
45
92
  protected readonly etiquetteLue: import("@angular/core").Signal<string>;
46
- /** `auto` : persistante sur grand ecran, tiroir en dessous. */
93
+ /** `auto` : colonne des `xl`, rail de `md` a `xl`, tiroir en dessous (D22). */
47
94
  readonly mode: import("@angular/core").InputSignal<ModeDeNavigation>;
48
- protected readonly identifiant: string;
95
+ /**
96
+ * Identifiant du `<nav>` : celui que le bouton de bascule vise par `aria-controls` (lot 234),
97
+ * present en ligne ou dans le tiroir ouvert. Tiroir ferme, le `<nav>` n'existe pas encore, et
98
+ * `aria-expanded="false"` dit pourquoi.
99
+ */
100
+ readonly identifiant: string;
101
+ protected readonly identifiantDuTitre: string;
102
+ private readonly ecranMoyen;
49
103
  private readonly ecranLarge;
50
104
  /** Mode reellement applique. Lu par le bouton, qui ne s'affiche qu'en tiroir. */
51
105
  readonly modeEffectif: import("@angular/core").Signal<"persistant" | "modal" | "rail">;
52
106
  private readonly ouvertInterne;
53
107
  readonly ouvert: import("@angular/core").Signal<boolean>;
108
+ private readonly repliInterne;
109
+ /** Tiroir ouvert SANS couche : le module des surfaces n'a pas pu etre charge. */
110
+ readonly repli: import("@angular/core").Signal<boolean>;
111
+ /** Ce que la navigation rend, pose en `data-disposition` sur le `<nav>` : la feuille le lit. */
112
+ protected readonly disposition: import("@angular/core").Signal<DispositionDeNavigation>;
54
113
  private readonly chargementDuTiroir;
55
114
  /**
56
115
  * Le module du tiroir se charge encore, passe `rythme.delai.attente` (03 §3.9,
57
- * MV-12). Lu par le bouton de bascule, qui pose `aria-busy` : sans lui,
58
- * l'ouverture differee etait INVISIBLE, et un second clic semblait necessaire.
59
- * Pas d'indicateur dans un bouton-icone de 44 px : le curseur d'attente suffit.
116
+ * MV-12). Lu par le bouton de bascule, qui pose `aria-busy` et le curseur d'attente : sans
117
+ * lui, l'ouverture differee etait INVISIBLE, et un second clic semblait necessaire.
60
118
  */
61
119
  readonly enAttente: import("@angular/core").Signal<boolean>;
62
120
  private readonly gabarit;
63
121
  private reference;
64
122
  private ouvertureEnCours;
123
+ private demande;
65
124
  private detruit;
66
125
  /**
67
126
  * Le service de dialogue, charge a la PREMIERE ouverture et garde ensuite.
68
- * Rend `null` si le composant a ete detruit pendant l'attente.
127
+ * Rend `null` si le composant a ete detruit pendant l'attente ; LEVE si le module ne se charge
128
+ * pas (le repli s'en charge).
69
129
  *
70
130
  * ⚠️ Le specificateur etant dans la carte d'importation de l'application
71
131
  * federee, cet import dynamique resout vers l'INSTANCE PARTAGEE du point
72
132
  * d'entree : le tiroir emploie le meme `StDialog`, le meme recouvrement et la
73
- * meme pile que le reste de l'application. Un import dynamique ne dedouble
74
- * rien ; il decale seulement le moment du telechargement.
133
+ * meme pile que le reste de l'application.
75
134
  *
76
- * ⚠️ **Le controle de destruction est ICI, avant `injecteur.get`, et non chez
77
- * l'appelant.** Un injecteur detruit ne rend pas `undefined` : il LEVE
78
- * (NG0205). Le controle place apres la resolution du service arrivait donc
79
- * trop tard, et une navigation pendant le chargement du module produisait un
80
- * rejet non gere — invisible en developpement, remonte comme erreur
81
- * applicative en production, puisque `basculer()` appelle `ouvrir()` sans
82
- * attendre sa promesse.
135
+ * ⚠️ **Le controle de destruction est ICI, avant `injecteur.get`.** Un injecteur detruit ne rend
136
+ * pas `undefined` : il LEVE (NG0205).
83
137
  */
138
+ /**
139
+ * Le module des surfaces, charge a la demande (ADR 0031, decision 3). Une methode a part : un
140
+ * essai y simule le module injoignable (hors ligne), que le repli doit rattraper.
141
+ */
142
+ protected chargerLesSurfaces(): Promise<{
143
+ readonly StDialog: typeof StDialog;
144
+ }>;
84
145
  private serviceDeDialogue;
85
146
  constructor();
86
147
  /**
87
- * Ouvre le tiroir. Asynchrone depuis la 0.8.0 : le module du dialogue se
88
- * charge a la demande. La promesse est tenue quand le tiroir est a l'ecran —
89
- * un test l'attend, l'appelant ordinaire n'a rien a en faire.
148
+ * Charge le module du tiroir sans rien montrer : le bouton de bascule l'appelle a l'INTENTION
149
+ * (survol, focus, appui), et le clic trouve le module deja la. Sans effet s'il l'est deja ; un
150
+ * echec est rattrape par l'ouverture, qui bascule alors en repli.
151
+ */
152
+ precharger(): void;
153
+ /**
154
+ * Ouvre le tiroir. Asynchrone : le module du dialogue se charge a la demande. La promesse est
155
+ * tenue quand le tiroir est a l'ecran (ou le repli en ligne) — un test l'attend, l'appelant
156
+ * ordinaire n'a rien a en faire. Elle ne rejette jamais.
90
157
  */
91
158
  ouvrir(): Promise<void>;
92
159
  fermer(): void;
160
+ /** Echap et la navigation referment le repli ; le tiroir, lui, a les siens. */
161
+ protected fermerLeRepli(): void;
93
162
  /** Reste synchrone : c'est ce que lit la liaison de clic du bouton. */
94
163
  basculer(): void;
95
164
  static ɵfac: i0.ɵɵFactoryDeclaration<StSidenav, never>;
@@ -104,25 +173,38 @@ export declare class StSidenav {
104
173
  "required": false;
105
174
  "isSignal": true;
106
175
  };
107
- }, {}, never, ["*"], true, never>;
176
+ }, {}, never, ["*", "[secondaire]", "[pied]"], true, never>;
108
177
  }
109
178
  /**
110
179
  * Bouton qui ouvre la navigation en tiroir.
111
180
  *
112
- * ⚠️ **Masque quand la navigation est persistante.** Un bouton « Menu » qui ne
113
- * fait rien, parce que la navigation est deja affichee a cote, est un arret de
114
- * tabulation inutile et une promesse non tenue.
181
+ * ```html
182
+ * <button stIconButton icone="menu" etiquette="Menu" [stSidenavToggle]="navigation"></button>
183
+ * ```
184
+ *
185
+ * ⚠️ **Sur un `<button>` natif, et nulle part ailleurs** (lot 234) : le selecteur
186
+ * est `button[stSidenavToggle]`. Pose sur un `<div>` ou un `<a>`, il ne s'applique
187
+ * pas et le gabarit ne compile plus — un contrat d'hote impose plutot que
188
+ * documente : clavier (Entree, Espace), role et focus viennent du bouton.
189
+ *
190
+ * ⚠️ **Masque quand la navigation n'est pas un tiroir** (colonne, rail). Un bouton
191
+ * « Menu » qui ne fait rien, parce que la navigation est deja affichee a cote, est
192
+ * un arret de tabulation inutile et une promesse non tenue.
115
193
  *
116
194
  * ⚠️ `aria-expanded` suit l'ouverture du tiroir : sans lui, rien ne dit a qui
117
- * n'en voit pas l'effet que le bouton a agi.
195
+ * n'en voit pas l'effet que le bouton a agi. `aria-controls` vise le `<nav>` de
196
+ * la navigation (`StSidenav.identifiant`), present des que le tiroir est ouvert.
197
+ * En repli sans couche (lot 235), ce n'est plus un dialogue : `aria-haspopup` tombe.
118
198
  *
119
- * `aria-busy` pendant le chargement DIFFERE du tiroir, passe le delai d'attente
120
- * (MV-12) : le clic a ete pris, la navigation arrive.
199
+ * **Chargement a l'intention** (lot 235) : survol, focus et appui prechargent le
200
+ * module du tiroir ; le clic le trouve le plus souvent deja la. Sinon, `aria-busy`
201
+ * et le curseur d'attente, passe le delai d'attente (MV-12) : le clic a ete pris,
202
+ * la navigation arrive ; un second clic, pendant ce temps, ne fait rien.
121
203
  */
122
204
  export declare class StSidenavToggle {
123
205
  readonly stSidenavToggle: import("@angular/core").InputSignal<StSidenav>;
124
206
  static ɵfac: i0.ɵɵFactoryDeclaration<StSidenavToggle, never>;
125
- static ɵdir: i0.ɵɵDirectiveDeclaration<StSidenavToggle, "[stSidenavToggle]", never, {
207
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StSidenavToggle, "button[stSidenavToggle]", never, {
126
208
  "stSidenavToggle": {
127
209
  "alias": "stSidenavToggle";
128
210
  "required": true;
@@ -1,5 +1,5 @@
1
1
  import * as i0 from "@angular/core";
2
- import { AnimationCallbackEvent, DestroyRef, EnvironmentProviders, InjectionToken, Provider, Signal } from "@angular/core";
2
+ import { AnimationCallbackEvent, DestroyRef, EnvironmentProviders, InjectionToken, OnInit, Provider, Signal } from "@angular/core";
3
3
  import { ChoixDeTheme, ETATS_DE_BLOC, EtatDeBloc, Langue, MoyenDeCeremonie, Ton, TonSemantique, VarianteDErreur, VarianteDErreur as VarianteDErreur$1, sansCommandesDeDirection } from "@starterlib/util";
4
4
  import { EtatDeDocument, ListesDAdresses, NatureDeRegion, RechercheDAdresses } from "@starterlib/util/valeurs";
5
5
  import * as i1 from "@angular/router";
@@ -2905,9 +2905,10 @@ export declare class StAppShell {
2905
2905
  * que l'hote charge). Des `md`, la ligne ne se replie jamais ; dessous, les actions passent sur
2906
2906
  * une ligne de plus plutot que de deborder (WCAG 1.4.10).
2907
2907
  *
2908
- * ⚠️ `secondaire` (langue, theme) marque ce qui pourra quitter l'en-tete sous `md` quand le
2909
- * tiroir de navigation le reproposera (lot 234). D'ici la, l'attribut ne retire rien : masquer
2910
- * une action sans repli la rendrait inatteignable sur un telephone.
2908
+ * ⚠️ `secondaire` (langue, theme) marque ce qui QUITTE l'en-tete sous `md` (lot 235) : le tiroir
2909
+ * de navigation le repropose, a condition que l'application l'y projette aussi
2910
+ * (`<st-lang-switch secondaire … />` dans `st-sidenav`). Sans ce second exemplaire, l'action
2911
+ * serait inatteignable sur un telephone : ne rien marquer `secondaire` garde tout dans l'en-tete.
2911
2912
  *
2912
2913
  * ```html
2913
2914
  * <st-header>
@@ -2973,15 +2974,18 @@ export declare class StFooter {
2973
2974
  }
2974
2975
  /**
2975
2976
  * Lien de navigation principale, pose en attribut sur un `<a>` natif :
2976
- * `routerLink`, etat actif, icone et pastille, en un seul geste.
2977
+ * `routerLink`, etat courant, icone et pastille, en un seul geste.
2977
2978
  *
2978
2979
  * ```html
2979
2980
  * <st-sidenav navigation>
2980
- * <a stNavLink="/comptes"><st-icon nom="fichier" />Comptes</a>
2981
+ * <a stNavLink="/"><st-icon nom="maison" taille="24" />Accueil</a>
2982
+ * <a stNavLink="/comptes"><st-icon nom="portefeuille" taille="24" />Comptes</a>
2981
2983
  * <a [stNavLink]="['/messages']">
2982
- * Messages<span class="st-vh">, 5 non lus</span>
2984
+ * <st-icon nom="messages" taille="24" />
2985
+ * Messagerie<span class="st-vh">, 5 non lus</span>
2983
2986
  * <st-badge [valeur]="5" />
2984
2987
  * </a>
2988
+ * <a stNavLink="/aide"><st-icon nom="casque" taille="24" />Aide<st-icon fin nom="lien-externe" /></a>
2985
2989
  * </st-sidenav>
2986
2990
  * ```
2987
2991
  *
@@ -2992,32 +2996,60 @@ export declare class StFooter {
2992
2996
  * l'observateur de rupture pour un lien. Et la coquille le PEINT : le second
2993
2997
  * critere de l'ADR 0031 le garde au tronc pour la meme raison.
2994
2998
  *
2995
- * ⚠️ **L'etat actif est porte par `aria-current="page"`**, pose par le routeur,
2999
+ * **Une grille, une colonne d'icone reservee** (lot 234) : l'icone de tete dans
3000
+ * une colonne de 24 px, TOUJOURS reservee — un lien sans icone garde son libelle
3001
+ * aligne sur les autres —, le libelle, puis la pastille (`st-badge`) ou une icone
3002
+ * de fin (`st-icon fin` : `lien-externe`, `chevron-droite`), l'une ou l'autre.
3003
+ * L'ordre du DOM est celui de l'ecran (icone, libelle, fin), quel que soit
3004
+ * l'ordre d'ecriture. Le libelle tient sur UNE ligne et se tronque par une
3005
+ * ellipse : une navigation ne se replie jamais, et le nom accessible, lui, reste
3006
+ * entier.
3007
+ *
3008
+ * ⚠️ **L'etat courant est porte par `aria-current="page"`**, pose par le routeur,
2996
3009
  * et c'est sur lui que la feuille se branche — jamais sur la seule couleur : le
2997
- * lien courant se lit a sa graisse et au marqueur sur son bord de depart, qui
2998
- * survivent au contraste force. La classe `st-nav-link--actif` accompagne, pour
2999
- * qui veut y accrocher un style.
3010
+ * lien courant se lit a sa graisse et au marqueur de 3 px sur son bord de depart,
3011
+ * qui survivent au contraste force (D22 : fond `surface-conteneur-bas`, texte
3012
+ * `texte-primaire` 600, marqueur et icone `primaire`). La classe
3013
+ * `st-nav-link--actif` accompagne, pour qui veut y accrocher un style.
3014
+ *
3015
+ * ⚠️ **Le lien racine est exact par defaut.** `stNavLink="/"` sans
3016
+ * `optionsDActivation` ne s'allume que sur `/` : en inclusion, il serait courant
3017
+ * sur TOUTES les pages. Poser `optionsDActivation` l'emporte toujours.
3000
3018
  *
3001
3019
  * ⚠️ La pastille est `aria-hidden` : le compte qu'elle affiche doit entrer
3002
3020
  * dans le nom du lien, par un texte lisible par lecteur seulement (`.st-vh`),
3003
- * compose par l'appelant.
3021
+ * compose par l'appelant. En developpement, un `st-badge` sans `.st-vh` dans le
3022
+ * lien est signale.
3004
3023
  *
3005
3024
  * Un composant et non une directive, parce qu'il RANGE ce qu'on lui projette :
3006
- * l'icone devant, la pastille derriere, le libelle entre les deux, sans que
3007
- * l'ordre d'ecriture compte.
3008
- */
3009
- export declare class StNavLink {
3025
+ * l'icone devant, la pastille derriere, le libelle entre les deux. Un lien qu'on
3026
+ * ne peut pas suivre ne se rend pas (`@if` cote application) : jamais
3027
+ * `aria-disabled` sur un lien de navigation.
3028
+ */
3029
+ export declare class StNavLink implements OnInit {
3030
+ private readonly lien;
3031
+ private readonly actif;
3032
+ private readonly routeur;
3033
+ /** L'objet d'options de `RouterLinkActive` avant toute liaison : `optionsDActivation` le remplace. */
3034
+ private readonly optionsParDefaut;
3010
3035
  constructor();
3036
+ ngOnInit(): void;
3011
3037
  static ɵfac: i0.ɵɵFactoryDeclaration<StNavLink, never>;
3012
- static ɵcmp: i0.ɵɵComponentDeclaration<StNavLink, "a[stNavLink]", never, {}, {}, never, ["st-icon", "*", "st-badge"], true, [{
3038
+ static ɵcmp: i0.ɵɵComponentDeclaration<StNavLink, "a[stNavLink]", never, {}, {}, never, ["st-icon:not([fin])", "*", "st-badge, st-icon[fin]"], true, [{
3013
3039
  directive: typeof i1.RouterLink;
3014
3040
  inputs: {
3015
3041
  "routerLink": "stNavLink";
3042
+ "target": "target";
3016
3043
  "queryParams": "queryParams";
3017
3044
  "fragment": "fragment";
3018
3045
  "queryParamsHandling": "queryParamsHandling";
3019
- "replaceUrl": "replaceUrl";
3020
3046
  "state": "state";
3047
+ "info": "info";
3048
+ "relativeTo": "relativeTo";
3049
+ "preserveFragment": "preserveFragment";
3050
+ "skipLocationChange": "skipLocationChange";
3051
+ "replaceUrl": "replaceUrl";
3052
+ "browserUrl": "browserUrl";
3021
3053
  };
3022
3054
  outputs: {};
3023
3055
  }, {