@starterlib/ui 0.6.0 → 0.7.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.
@@ -2,6 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { InjectionToken, Signal, Provider, DestroyRef, TemplateRef, Resource } from '@angular/core';
3
3
  import { Ton, Montant, TonSemantique, DateIso, PlageDeDates, DescriptionDeFichier, ChoixDeTheme, Langue, EtatDeBloc } from '@starterlib/util';
4
4
  export { ETATS_DE_BLOC, EtatDeBloc } from '@starterlib/util';
5
+ import * as i1 from '@angular/router';
5
6
  import { ValidationError, FormValueControl, FormCheckboxControl } from '@angular/forms/signals';
6
7
  import * as _starterlib_ui from '@starterlib/ui';
7
8
 
@@ -49,6 +50,22 @@ interface LibellesUi {
49
50
  readonly filDAriane: string;
50
51
  readonly allerAuContenu: string;
51
52
  readonly navigationPrincipale: string;
53
+ /** Nom du repere de navigation du pied de page. */
54
+ readonly liensDuPied: string;
55
+ /** Barre de progression d'une navigation entre pages. */
56
+ readonly chargement: string;
57
+ /** Barre d'actions : texte du declencheur replie, et nom de son menu. */
58
+ readonly plus: string;
59
+ readonly plusDActions: string;
60
+ /** Parcours par etapes : nom de la liste, et etat de chaque etape. */
61
+ readonly etapes: string;
62
+ readonly etapeTerminee: string;
63
+ readonly etapeEnCours: string;
64
+ readonly etapeAVenir: string;
65
+ /** Tendance d'un indicateur chiffre, lue avant le texte de l'appelant. */
66
+ readonly tendanceEnHausse: string;
67
+ readonly tendanceEnBaisse: string;
68
+ readonly tendanceStable: string;
52
69
  /** Transverses */
53
70
  readonly theme: string;
54
71
  readonly themeSysteme: string;
@@ -322,19 +339,45 @@ type TonDIcone = Exclude<Ton, 'inverse'>;
322
339
  * Une icone est **decorative par defaut**. Regle de tri : si la retirer ne
323
340
  * retire aucune information, elle est decorative. Une icone posee a cote d'un
324
341
  * texte qui dit la meme chose l'est toujours.
342
+ *
343
+ * **Deux sprites, deux entrees.** Sans `sprite`, l'icone vient du sprite du
344
+ * socle (`CHEMIN_DU_SPRITE`, fourni par la coquille), et `nom` est contraint au
345
+ * type `NomDIcone` : une faute de frappe echoue a la compilation. Avec `sprite`
346
+ * — le chemin ABSOLU et hache que le manifeste d'un remote annonce —, l'icone
347
+ * est METIER : `nomMetier` accepte n'importe quel identifiant du sprite donne.
348
+ *
349
+ * ```html
350
+ * <st-icon nom="coche" />
351
+ * <st-icon [sprite]="manifeste.sprite" nomMetier="virement-instantane" />
352
+ * ```
353
+ *
354
+ * ⚠️ Un `nomMetier` sans `sprite` est refuse : le sprite du socle ne le
355
+ * contient pas, et une reference `use` qui ne resout pas ne rend RIEN, sans
356
+ * erreur. Mieux vaut echouer au rendu, une fois, avec la marche a suivre.
325
357
  */
326
358
  declare class StIcon {
327
359
  private readonly cheminDuSprite;
328
- readonly nom: _angular_core.InputSignal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "tri" | "triangle-alerte" | "utilisateur">;
360
+ /** Nom d'un symbole du sprite du socle. Obligatoire sans `sprite`. */
361
+ readonly nom: _angular_core.InputSignal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "tri" | "triangle-alerte" | "utilisateur" | null>;
362
+ /**
363
+ * Chemin absolu d'un sprite METIER, hache, tel que le manifeste du remote le
364
+ * fournit. Jamais un chemin nu comme `/assets/icones/metier.svg` : le cache
365
+ * d'un an sur empreinte servirait l'ancien sprite apres un deploiement.
366
+ */
367
+ readonly sprite: _angular_core.InputSignal<string | null>;
368
+ /** Nom d'un symbole du sprite METIER. Hors du type ferme du socle, et l'exige. */
369
+ readonly nomMetier: _angular_core.InputSignal<string | null>;
329
370
  readonly taille: _angular_core.InputSignal<TailleDIcone>;
330
371
  readonly ton: _angular_core.InputSignal<TonDIcone>;
331
372
  /** `null` : l'icone est decorative et reste muette pour les lecteurs. */
332
373
  readonly etiquette: _angular_core.InputSignal<string | null>;
333
374
  protected readonly estDecorative: _angular_core.Signal<boolean>;
375
+ /** Seul le sprite du socle a des chevrons a miroiter : un sprite metier dessine les siens. */
334
376
  protected readonly directionnelle: _angular_core.Signal<boolean>;
335
377
  protected readonly reference: _angular_core.Signal<string>;
378
+ private nomDuSocle;
336
379
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StIcon, never>;
337
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StIcon, "st-icon", never, { "nom": { "alias": "nom"; "required": true; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
380
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StIcon, "st-icon", never, { "nom": { "alias": "nom"; "required": false; "isSignal": true; }; "sprite": { "alias": "sprite"; "required": false; "isSignal": true; }; "nomMetier": { "alias": "nomMetier"; "required": false; "isSignal": true; }; "taille": { "alias": "taille"; "required": false; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
338
381
  }
339
382
 
340
383
  /**
@@ -425,6 +468,8 @@ declare class StSpinner {
425
468
  }
426
469
 
427
470
  type TonDeProgression = Extract<Ton, 'primaire' | 'succes' | 'danger'>;
471
+ /** `fine` : un trait de l'echelle des epaisseurs, pour une barre posee sous un en-tete. */
472
+ type EpaisseurDeProgression = 'normale' | 'fine';
428
473
  /**
429
474
  * Barre de progression, determinee ou indeterminee.
430
475
  *
@@ -439,6 +484,7 @@ declare class StProgress {
439
484
  /** Obligatoire : une barre sans nom accessible n'apprend rien. */
440
485
  readonly etiquette: _angular_core.InputSignal<string>;
441
486
  readonly ton: _angular_core.InputSignal<TonDeProgression>;
487
+ readonly epaisseur: _angular_core.InputSignal<EpaisseurDeProgression>;
442
488
  /** Texte lu a la place du pourcentage quand celui-ci n'est pas parlant. */
443
489
  readonly texteDeValeur: _angular_core.InputSignal<string | null>;
444
490
  protected readonly estIndeterminee: _angular_core.Signal<boolean>;
@@ -446,7 +492,7 @@ declare class StProgress {
446
492
  protected readonly valeurAnnoncee: _angular_core.Signal<number | null>;
447
493
  protected readonly pourcentage: _angular_core.Signal<number>;
448
494
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StProgress, never>;
449
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StProgress, "st-progress", never, { "valeur": { "alias": "valeur"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": true; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "texteDeValeur": { "alias": "texteDeValeur"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
495
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StProgress, "st-progress", never, { "valeur": { "alias": "valeur"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": true; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "epaisseur": { "alias": "epaisseur"; "required": false; "isSignal": true; }; "texteDeValeur": { "alias": "texteDeValeur"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
450
496
  }
451
497
 
452
498
  type VarianteDeSquelette = 'texte' | 'tableau' | 'carte';
@@ -603,6 +649,40 @@ declare class StButtonGroup {
603
649
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StButtonGroup, "st-button-group", never, { "etiquette": { "alias": "etiquette"; "required": true; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "attache": { "alias": "attache"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
604
650
  }
605
651
 
652
+ /**
653
+ * Barre d'actions d'un formulaire, collee en BAS de la zone de defilement.
654
+ *
655
+ * ```html
656
+ * <form (submit)="envoyer()">
657
+ * …
658
+ * <st-form-actions>
659
+ * <a debut stLink routerLink="..">Annuler</a>
660
+ * <button stButton type="button">Enregistrer le brouillon</button>
661
+ * <button stButton type="submit" variante="primaire">Valider le virement</button>
662
+ * </st-form-actions>
663
+ * </form>
664
+ * ```
665
+ *
666
+ * ⚠️ **`sticky`, JAMAIS `fixed`.** Un element fixe sort du flux : a 200 %
667
+ * d'echelle il recouvre les derniers champs, et dans une vue embarquee il se
668
+ * pose sous la barre du systeme. Collee, la barre reste dans le document —
669
+ * elle suit le formulaire, cede la place a son pied, et respecte la zone sure
670
+ * du bas de l'ecran (`env(safe-area-inset-bottom)`).
671
+ *
672
+ * ⚠️ **L'ordre du document est l'ordre visuel.** Rien n'est inverse par le
673
+ * style : l'action principale s'ecrit en dernier, elle se lit en dernier et se
674
+ * tabule en dernier — la ou la personne arrive apres avoir relu ses champs.
675
+ * L'emplacement `debut` accueille ce qui part a l'oppose (un retour, une
676
+ * annulation), et vient en premier dans les deux ordres.
677
+ *
678
+ * Une seule action principale par formulaire, et elle est un vrai
679
+ * `type="submit"` : Entree dans un champ l'envoie.
680
+ */
681
+ declare class StFormActions {
682
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StFormActions, never>;
683
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StFormActions, "st-form-actions", never, {}, {}, never, ["[debut]", "*"], true, never>;
684
+ }
685
+
606
686
  /**
607
687
  * Valeur technique courte et copiable : identifiant de trace, reference
608
688
  * d'operation, code d'erreur.
@@ -810,6 +890,54 @@ declare class StCount {
810
890
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StCount, "st-count", never, { "valeur": { "alias": "valeur"; "required": true; "isSignal": true; }; "ton": { "alias": "ton"; "required": false; "isSignal": true; }; "abregerAuDela": { "alias": "abregerAuDela"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
811
891
  }
812
892
 
893
+ type SensDeTendance = 'hausse' | 'baisse' | 'stable';
894
+ /** La tendance d'un indicateur, decrite par l'appelant. Le texte est deja traduit. */
895
+ interface TendanceDeStat {
896
+ readonly sens: SensDeTendance;
897
+ /** Ce qui s'affiche a cote de la fleche : « +2,4 % sur un mois ». */
898
+ readonly texte: string;
899
+ /**
900
+ * ⚠️ Choisi par l'appelant, et non deduit du sens : une hausse des frais est
901
+ * un `danger`, une hausse de l'epargne un `succes`. Le socle ne sait pas
902
+ * lequel des deux il affiche.
903
+ */
904
+ readonly ton?: TonSemantique;
905
+ }
906
+ /**
907
+ * Indicateur chiffre : un libelle, une valeur, et sa tendance.
908
+ *
909
+ * ```html
910
+ * <st-stat libelle="Solde disponible" [tendance]="{ sens: 'hausse', texte: '+2,4 % sur un mois', ton: 'succes' }">
911
+ * <st-money [valeur]="solde" />
912
+ * </st-stat>
913
+ * ```
914
+ *
915
+ * La valeur est PROJETEE : c'est `st-money`, `st-count` ou `st-date` qui la
916
+ * formate dans la langue courante, et le socle n'a pas a redire comment.
917
+ *
918
+ * ⚠️ **La tendance se lit par un texte ET une icone, jamais par la couleur
919
+ * seule.** Le texte de l'appelant porte deja le signe ; l'icone porte le sens ;
920
+ * et un mot lisible par lecteur seulement — « en hausse », « en baisse »,
921
+ * « stable » — precede le texte, parce qu'un lecteur d'ecran ne lit pas un
922
+ * chevron.
923
+ *
924
+ * Le libelle vient AVANT la valeur dans le document, comme dans une phrase :
925
+ * « Solde disponible, 1 234,50 € ». A l'ecran, il se pose au-dessus, en petit.
926
+ */
927
+ declare class StStat {
928
+ private readonly libelles;
929
+ /** Texte visible, deja traduit. */
930
+ readonly libelle: _angular_core.InputSignal<string>;
931
+ readonly tendance: _angular_core.InputSignal<TendanceDeStat | null>;
932
+ /** Precision sous la valeur : la periode, la source. Jamais une information critique. */
933
+ readonly precision: _angular_core.InputSignal<string | null>;
934
+ protected readonly icone: _angular_core.Signal<"copie" | "boite-vide" | "calendrier" | "cercle" | "cercle-coche" | "cercle-croix" | "cercle-info" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "coche" | "corbeille" | "croix" | "fichier" | "hors-ligne" | "lien-externe" | "menu" | "oeil" | "oeil-barre" | "plus" | "rafraichir" | "recherche" | "serveur" | "televerser" | "tri" | "triangle-alerte" | "utilisateur" | null>;
935
+ protected readonly tonDeTendance: _angular_core.Signal<TonSemantique>;
936
+ protected readonly sensLu: _angular_core.Signal<string>;
937
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StStat, never>;
938
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StStat, "st-stat", never, { "libelle": { "alias": "libelle"; "required": true; "isSignal": true; }; "tendance": { "alias": "tendance"; "required": false; "isSignal": true; }; "precision": { "alias": "precision"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
939
+ }
940
+
813
941
  /**
814
942
  * ⚠️ `primaire` et non « info » : les deux designaient deja la meme couleur
815
943
  * d'accent, et rien ne distinguait un statut « info » d'un statut « primaire »
@@ -1192,15 +1320,21 @@ declare class StSkipLink {
1192
1320
  }
1193
1321
 
1194
1322
  /**
1195
- * Coquille d'une application : lien d'evitement, en-tete, navigation, contenu
1196
- * principal, pied de page.
1323
+ * Propriete posee sur `<html>` avec la hauteur mesuree de l'en-tete collant.
1324
+ * La feuille de `@starterlib/tokens` la lit dans `scroll-padding-block-start`.
1325
+ */
1326
+ declare const PROPRIETE_HAUTEUR_ENTETE = "--st-hauteur-entete";
1327
+ /**
1328
+ * Coquille d'une application : lien d'evitement, en-tete, bannieres globales,
1329
+ * navigation, contenu principal, pied de page.
1197
1330
  *
1198
1331
  * ```html
1199
1332
  * <st-app-shell>
1200
- * <ng-container entete>…</ng-container>
1201
- * <ng-container navigation>…</ng-container>
1333
+ * <st-header entete>…</st-header>
1334
+ * <st-offline-banner bannieres … />
1335
+ * <st-sidenav navigation>…</st-sidenav>
1202
1336
  * <router-outlet />
1203
- * <ng-container pied>…</ng-container>
1337
+ * <st-footer pied>…</st-footer>
1204
1338
  * </st-app-shell>
1205
1339
  * ```
1206
1340
  *
@@ -1223,11 +1357,28 @@ declare class StSkipLink {
1223
1357
  * `st-sidenav` qui porte ce repere. Pose ici aussi, il s'imbriquerait — le
1224
1358
  * lecteur d'ecran annoncerait « navigation, navigation » — et resterait vide
1225
1359
  * sur petit ecran, quand le contenu part dans le tiroir.
1360
+ *
1361
+ * ⚠️ **L'en-tete est collant, et la coquille en MESURE la hauteur** (WCAG
1362
+ * 2.4.11). Un element collant recouvre ce que le navigateur fait defiler vers
1363
+ * lui : sans decalage, chaque arret de tabulation qui remonte se cache SOUS
1364
+ * l'en-tete. La hauteur n'est pas connue d'avance — elle change avec le zoom,
1365
+ * la taille de police, le repli des actions — d'ou un `ResizeObserver`, qui
1366
+ * pose `--st-hauteur-entete` sur `<html>` ; la feuille de jetons la lit dans
1367
+ * `scroll-padding-block-start`. Sans navigateur (rendu serveur, jsdom), rien
1368
+ * n'est mesure et le repli de la feuille vaut zero.
1369
+ *
1370
+ * L'emplacement `bannieres` est un conteneur sans role, entre l'en-tete et le
1371
+ * corps : chaque banniere porte sa propre region vivante. Jamais `fixed`.
1226
1372
  */
1227
1373
  declare class StAppShell {
1374
+ private readonly document;
1375
+ private readonly entete;
1376
+ private observateur;
1228
1377
  protected readonly identifiantDuContenu = "contenu-principal";
1378
+ constructor();
1379
+ private mesurerLEntete;
1229
1380
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StAppShell, never>;
1230
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StAppShell, "st-app-shell", never, {}, {}, never, ["[entete]", "[navigation]", "*", "[pied]"], true, never>;
1381
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StAppShell, "st-app-shell", never, {}, {}, never, ["[entete]", "[bannieres]", "[navigation]", "*", "[pied]"], true, never>;
1231
1382
  }
1232
1383
 
1233
1384
  /**
@@ -1261,6 +1412,286 @@ declare class StHeader {
1261
1412
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StHeader, "st-header", never, {}, {}, never, ["[bascule]", "[marque]", "*"], true, never>;
1262
1413
  }
1263
1414
 
1415
+ /**
1416
+ * Contenu du pied de page : mentions, version, statut.
1417
+ *
1418
+ * ```html
1419
+ * <st-app-shell>
1420
+ * …
1421
+ * <st-footer pied>
1422
+ * <a mentions stLink routerLink="/mentions">Mentions legales</a>
1423
+ * <a mentions stLink routerLink="/aide">Aide</a>
1424
+ * <span version>Version 1.4.2</span>
1425
+ * <st-status-pill statut="ok" libelle="Services disponibles" icone="cercle-coche" ton="succes" />
1426
+ * </st-footer>
1427
+ * </st-app-shell>
1428
+ * ```
1429
+ *
1430
+ * ⚠️ **Aucun repere `contentinfo` ici** : le `footer` de `st-app-shell` le porte
1431
+ * deja, et un second en ferait annoncer deux. Ce composant est le CONTENU du
1432
+ * pied. Ses mentions, elles, forment un repere de navigation nomme — c'est ce
1433
+ * qui permet a un lecteur d'ecran de sauter directement aux liens du pied, et
1434
+ * de les distinguer de la navigation principale.
1435
+ *
1436
+ * ⚠️ L'aide se pose ICI, dans les mentions, et au meme endroit sur le gabarit
1437
+ * pleine page : WCAG 3.2.6 exige qu'un mecanisme d'aide garde sa place d'une
1438
+ * page a l'autre.
1439
+ *
1440
+ * ⚠️ La `version` est un texte affiche : jamais un secret de construction, ni
1441
+ * une empreinte de commit qui dirait a un attaquant exactement quel code tourne.
1442
+ * Le numero de version publie suffit au support.
1443
+ *
1444
+ * Le statut est un `st-status-pill` projete, reconnu a son ELEMENT : `statut`
1445
+ * est le nom d'une de ses entrees, et un attribut nu du meme nom lui passerait
1446
+ * une chaine vide. Icone et texte, jamais la couleur seule ; un autre element
1447
+ * prend sa place par `ngProjectAs="st-status-pill"`.
1448
+ */
1449
+ declare class StFooter {
1450
+ private readonly libelles;
1451
+ /** Nom du repere des mentions. `null` : le texte vient du dictionnaire. */
1452
+ readonly etiquette: _angular_core.InputSignal<string | null>;
1453
+ protected readonly etiquetteLue: _angular_core.Signal<string>;
1454
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StFooter, never>;
1455
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StFooter, "st-footer", never, { "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; }, {}, never, ["[mentions]", "[version]", "st-status-pill"], true, never>;
1456
+ }
1457
+
1458
+ /**
1459
+ * Lien de navigation principale, pose en attribut sur un `<a>` natif :
1460
+ * `routerLink`, etat actif, icone et pastille, en un seul geste.
1461
+ *
1462
+ * ```html
1463
+ * <st-sidenav navigation>
1464
+ * <a stNavLink="/comptes"><st-icon nom="fichier" />Comptes</a>
1465
+ * <a [stNavLink]="['/messages']">
1466
+ * Messages<span class="st-vh">, 5 non lus</span>
1467
+ * <st-badge [valeur]="5" />
1468
+ * </a>
1469
+ * </st-sidenav>
1470
+ * ```
1471
+ *
1472
+ * **Ou il vit, et pourquoi.** Dans le tronc, a cote de `st-breadcrumb` et non
1473
+ * dans `ui/interactions` avec `st-sidenav` : les points d'entree se decoupent
1474
+ * par pair lourd, et ce lien n'en traine aucun — `@angular/router` est deja
1475
+ * exige par le tronc. Une SPA qui rend sa navigation sans tiroir n'a pas a
1476
+ * charger Aria pour un lien.
1477
+ *
1478
+ * ⚠️ **L'etat actif est porte par `aria-current="page"`**, pose par le routeur,
1479
+ * et c'est sur lui que la feuille se branche — jamais sur la seule couleur : le
1480
+ * lien courant se lit a sa graisse et au marqueur sur son bord de depart, qui
1481
+ * survivent au contraste force. La classe `st-nav-link--actif` accompagne, pour
1482
+ * qui veut y accrocher un style.
1483
+ *
1484
+ * ⚠️ La pastille est `aria-hidden` : le compte qu'elle affiche doit entrer
1485
+ * dans le nom du lien, par un texte lisible par lecteur seulement (`.st-vh`),
1486
+ * compose par l'appelant.
1487
+ *
1488
+ * Un composant et non une directive, parce qu'il RANGE ce qu'on lui projette :
1489
+ * l'icone devant, la pastille derriere, le libelle entre les deux, sans que
1490
+ * l'ordre d'ecriture compte.
1491
+ */
1492
+ declare class StNavLink {
1493
+ constructor();
1494
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StNavLink, never>;
1495
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StNavLink, "a[stNavLink]", never, {}, {}, never, ["st-icon", "*", "st-badge"], true, [{ directive: typeof i1.RouterLink; inputs: { "routerLink": "stNavLink"; "queryParams": "queryParams"; "fragment": "fragment"; "queryParamsHandling": "queryParamsHandling"; "replaceUrl": "replaceUrl"; "state": "state"; }; outputs: {}; }, { directive: typeof i1.RouterLinkActive; inputs: { "routerLinkActiveOptions": "optionsDActivation"; }; outputs: {}; }]>;
1496
+ }
1497
+
1498
+ /**
1499
+ * En-tete de page : fil d'Ariane, titre de niveau 1, actions, onglets.
1500
+ * Premier enfant de la page d'un remote.
1501
+ *
1502
+ * ```html
1503
+ * <st-page-header precision="Trente derniers jours">
1504
+ * <st-breadcrumb [maillons]="maillons" />
1505
+ * Mes operations
1506
+ * <button stButton variante="primaire" actions>Exporter</button>
1507
+ * <st-tabs etiquette="Vue" [onglets]="onglets" [(selection)]="vue" />
1508
+ * </st-page-header>
1509
+ * ```
1510
+ *
1511
+ * ⚠️ Le fil et les onglets se reconnaissent a leur ELEMENT (`st-breadcrumb`,
1512
+ * `st-tabs`), pas a un attribut : `onglets` est deja le nom d'une entree de
1513
+ * `st-tabs`, et un attribut nu du meme nom lui passerait une chaine vide. Un
1514
+ * autre element prend leur place par `ngProjectAs="st-tabs"`.
1515
+ *
1516
+ * ⚠️ **Un seul `h1` par page, et c'est lui.** `StNavigation` de
1517
+ * `@starterlib/core` y pose le focus apres chaque changement de route — son
1518
+ * selecteur par defaut vise `h1, [role="heading"][aria-level="1"]` —, et le
1519
+ * lecteur d'ecran lit alors la phrase qui dit ou l'on vient d'arriver. Une
1520
+ * page qui titre ailleurs perd ce focus en silence (F14 du plan de la
1521
+ * coquille) ; une page qui titre deux fois le rend ambigu.
1522
+ *
1523
+ * ⚠️ Le fil d'Ariane vient AVANT le titre dans l'ordre du document, comme dans
1524
+ * la lecture : on sait d'ou l'on vient avant de lire ou l'on est. Les onglets
1525
+ * viennent apres : ils decoupent le contenu de la page, pas son identite.
1526
+ *
1527
+ * Il ne rend rien lui-meme d'autre que `st-page-title` : le fil, les actions et
1528
+ * les onglets sont ceux de la page, projetes.
1529
+ */
1530
+ declare class StPageHeader {
1531
+ /** Texte secondaire sous le titre. Jamais porteur d'information critique. */
1532
+ readonly precision: _angular_core.InputSignal<string | null>;
1533
+ /** Cible d'un `aria-labelledby` : une region se nomme par son titre. */
1534
+ readonly identifiant: _angular_core.InputSignal<string | null>;
1535
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StPageHeader, never>;
1536
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StPageHeader, "st-page-header", never, { "precision": { "alias": "precision"; "required": false; "isSignal": true; }; "identifiant": { "alias": "identifiant"; "required": false; "isSignal": true; }; }, {}, never, ["st-breadcrumb", "*", "[actions]", "st-tabs"], true, never>;
1537
+ }
1538
+
1539
+ /**
1540
+ * Barre fine de progression d'une navigation, sous l'en-tete.
1541
+ *
1542
+ * ```html
1543
+ * <st-header entete>…</st-header>
1544
+ * <st-route-progress entete [actif]="navigation.enCours()" />
1545
+ * ```
1546
+ *
1547
+ * ⚠️ **Rien avant `delaiMs`** (200 ms par defaut). Une navigation qui aboutit
1548
+ * en 80 ms n'a pas a clignoter : la barre apparaitrait et disparaitrait avant
1549
+ * d'etre lue, et l'oeil retiendrait un scintillement a chaque clic. Passe le
1550
+ * delai, elle reste jusqu'a la fin, meme si celle-ci survient juste apres.
1551
+ *
1552
+ * ⚠️ **Aucun `aria-busy` sur `main`**, et ce n'est pas un oubli : `aria-busy`
1553
+ * fait TAIRE les mises a jour de la region qu'il marque, y compris les annonces
1554
+ * de la page qui arrive. La barre est un `progressbar` indetermine et nomme :
1555
+ * c'est ce qu'un lecteur d'ecran trouve s'il la cherche, sans etre interrompu.
1556
+ *
1557
+ * Elle n'occupe aucune hauteur : posee en absolu sous son hote, elle ne fait
1558
+ * pas sauter la page en apparaissant.
1559
+ */
1560
+ declare class StRouteProgress {
1561
+ private readonly libelles;
1562
+ /** Vrai entre le debut et la fin d'une navigation. */
1563
+ readonly actif: _angular_core.InputSignalWithTransform<boolean, unknown>;
1564
+ /** Delai avant d'afficher quoi que ce soit. Zero : tout de suite. */
1565
+ readonly delaiMs: _angular_core.InputSignal<number>;
1566
+ /** `null` : « Chargement », du dictionnaire. */
1567
+ readonly etiquette: _angular_core.InputSignal<string | null>;
1568
+ protected readonly etiquetteLue: _angular_core.Signal<string>;
1569
+ private readonly visibleInterne;
1570
+ protected readonly visible: _angular_core.Signal<boolean>;
1571
+ constructor();
1572
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StRouteProgress, never>;
1573
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StRouteProgress, "st-route-progress", never, { "actif": { "alias": "actif"; "required": false; "isSignal": true; }; "delaiMs": { "alias": "delaiMs"; "required": false; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1574
+ }
1575
+
1576
+ /**
1577
+ * Gabarit pleine page : connexion, mot de passe oublie, mode embarque.
1578
+ *
1579
+ * ```html
1580
+ * <st-auth-shell>
1581
+ * <st-logo entete nom="Banque Exemple" clair="/ui/socle/assets/logo.svg" />
1582
+ * <st-lang-switch entete … />
1583
+ * <st-theme-toggle entete … />
1584
+ * <st-banner banniere ton="neutre" [message]="motifDeRedirection()" />
1585
+ * <router-outlet />
1586
+ * <a pied stLink routerLink="/mentions">Mentions legales</a>
1587
+ * <a pied stLink routerLink="/aide">Aide</a>
1588
+ * </st-auth-shell>
1589
+ * ```
1590
+ *
1591
+ * Ce que `st-app-shell` a, et qu'il n'a PAS, volontairement : ni navigation
1592
+ * laterale (rien a naviguer avant d'etre connecte), ni avertissement
1593
+ * d'inactivite (pas de session a fermer), ni messages ephemeres (rien ne se
1594
+ * passe en arriere-plan). Ce qu'il garde : le lien d'evitement — une page de
1595
+ * connexion se traverse aussi au clavier —, un `main` etroit centre a la
1596
+ * mesure de lecture, et les trois reperes, une fois chacun.
1597
+ *
1598
+ * ⚠️ **L'aide au meme endroit que dans l'application** (WCAG 3.2.6) : dans le
1599
+ * pied, comme dans `st-footer`. Une personne qui a trouve l'aide en bas de page
1600
+ * une fois doit la retrouver la, connectee ou non.
1601
+ *
1602
+ * L'emplacement `banniere`, en tete du `main`, recoit le MOTIF d'arrivee :
1603
+ * session expiree, fermee ailleurs, mot de passe reinitialise. Un `st-banner`
1604
+ * neutre y suffit ; jamais un message ephemere, qui serait manque.
1605
+ */
1606
+ declare class StAuthShell {
1607
+ protected readonly identifiantDuContenu = "contenu-principal";
1608
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StAuthShell, never>;
1609
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StAuthShell, "st-auth-shell", never, {}, {}, never, ["[entete]", "[banniere]", "*", "[pied]"], true, never>;
1610
+ }
1611
+
1612
+ /** Une etape d'un parcours, decrite par l'appelant. Le texte est deja traduit. */
1613
+ interface EtapeDeParcours {
1614
+ readonly libelle: string;
1615
+ }
1616
+ type EtatDEtape = 'faite' | 'courante' | 'a-venir';
1617
+ /**
1618
+ * Parcours par etapes : ou l'on en est, ce qui est fait, ce qui reste.
1619
+ *
1620
+ * ```html
1621
+ * <st-stepper [etapes]="etapes" [etape]="indice()" />
1622
+ * ```
1623
+ *
1624
+ * ⚠️ Une liste ORDONNEE : l'ordre des etapes est l'information, et le lecteur
1625
+ * d'ecran annonce « 2 sur 4 » de lui-meme. L'etape courante porte
1626
+ * `aria-current="step"`, ce qui est exactement le mot de la specification.
1627
+ *
1628
+ * ⚠️ **L'etat de chaque etape se lit par sa forme ET par un texte**, jamais par
1629
+ * la couleur seule : une coche pour ce qui est fait, un numero plein pour
1630
+ * l'etape en cours, un numero cercle pour ce qui vient ; et un mot lisible par
1631
+ * lecteur seulement — « terminee », « en cours », « a venir » — apres chaque
1632
+ * libelle. Sous contraste force, il ne reste que la forme et le mot.
1633
+ *
1634
+ * Il n'est PAS interactif : revenir a une etape est une decision du parcours,
1635
+ * qui la rend par un vrai lien ou un vrai bouton dans la page. Un indicateur
1636
+ * cliquable promettrait un retour que tous les parcours n'autorisent pas.
1637
+ */
1638
+ declare class StStepper {
1639
+ private readonly libelles;
1640
+ readonly etapes: _angular_core.InputSignal<readonly EtapeDeParcours[]>;
1641
+ /** Indice de l'etape en cours, a partir de zero. */
1642
+ readonly etape: _angular_core.InputSignal<number>;
1643
+ /** Nom de la liste. `null` : « Etapes », du dictionnaire. */
1644
+ readonly etiquette: _angular_core.InputSignal<string | null>;
1645
+ protected readonly etiquetteLue: _angular_core.Signal<string>;
1646
+ protected readonly lignes: _angular_core.Signal<{
1647
+ libelle: string;
1648
+ numero: number;
1649
+ etat: EtatDEtape;
1650
+ texteDEtat: string;
1651
+ }[]>;
1652
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StStepper, never>;
1653
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StStepper, "st-stepper", never, { "etapes": { "alias": "etapes"; "required": true; "isSignal": true; }; "etape": { "alias": "etape"; "required": true; "isSignal": true; }; "etiquette": { "alias": "etiquette"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1654
+ }
1655
+
1656
+ /**
1657
+ * Ligne de reglage : un libelle, une description, et le controle qui les suit.
1658
+ *
1659
+ * ```html
1660
+ * <st-settings-row libelle="Alertes par SMS" description="Un SMS a chaque virement sortant.">
1661
+ * <st-switch libelle="Activer" [(checked)]="sms" />
1662
+ * </st-settings-row>
1663
+ * ```
1664
+ *
1665
+ * ⚠️ **La ligne est un GROUPE nomme et decrit, et non une etiquette.** Le
1666
+ * controle projete garde son propre nom — celui de son `libelle`, ou un
1667
+ * `aria-label` pour un element natif — et la ligne l'enveloppe d'un
1668
+ * `role="group"` relie a son libelle par `aria-labelledby` et a sa description
1669
+ * par `aria-describedby`. En entrant dans le groupe, le lecteur d'ecran lit le
1670
+ * libelle, puis la description, puis le controle : « Alertes par SMS, groupe,
1671
+ * Un SMS a chaque virement sortant, Activer, interrupteur, desactive ».
1672
+ *
1673
+ * Pourquoi pas un `label for` : la plupart des controles du socle portent deja
1674
+ * leur etiquette, et un controle non natif (un groupe segmente, un declencheur
1675
+ * de menu) n'en accepte aucun. Le groupe, lui, marche pour tous, sans que la
1676
+ * ligne ait a connaitre ce qu'on lui projette.
1677
+ *
1678
+ * ⚠️ Un reglage s'applique IMMEDIATEMENT (c'est le sens de `st-switch`) ou
1679
+ * s'envoie avec un formulaire : la ligne ne tranche pas, le controle le dit.
1680
+ */
1681
+ declare class StSettingsRow {
1682
+ /** Texte visible, deja traduit : le socle ne traduit rien. */
1683
+ readonly libelle: _angular_core.InputSignal<string>;
1684
+ /** Ce que le reglage fait, en une phrase. Reliee au groupe par `aria-describedby`. */
1685
+ readonly description: _angular_core.InputSignal<string | null>;
1686
+ /** Identifiants du libelle et de la description, cibles des attributs ARIA. */
1687
+ readonly identifiants: {
1688
+ readonly libelle: `${string}-libelle`;
1689
+ readonly description: `${string}-description`;
1690
+ };
1691
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSettingsRow, never>;
1692
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSettingsRow, "st-settings-row", never, { "libelle": { "alias": "libelle"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1693
+ }
1694
+
1264
1695
  type TonDeBanniere = TonSemantique;
1265
1696
  /**
1266
1697
  * Message de page, persistant jusqu'a ce qu'on le ferme.
@@ -3015,5 +3446,5 @@ declare class StChargement {
3015
3446
  /** Toutes les directives de gabarit, a importer d'un coup. */
3016
3447
  declare const GABARITS_D_ETAT: readonly [typeof StSucces, typeof StErreur, typeof StVide, typeof StHorsLigne, typeof StChargement];
3017
3448
 
3018
- export { AnnonceLocale, CHEMIN_DU_SPRITE, ContratDeChamp, ControleDeSaisie, FUSEAU_PAR_DEFAUT, GABARITS_D_ETAT, IDENTIFIANT_DU_CONTENU_PRINCIPAL, LIBELLES_EN, LIBELLES_FR, NOMS_DICONE, REGION_VIVANTE_PARENTE, ST_LIBELLES, ST_LOCALE, StAppShell, StAvatar, StBadge, StBanner, StBreadcrumb, StButton, StButtonGroup, StCalendar, StCard, StCellule, StChargement, StCheckbox, StCode, StControleDeChamp, StCopyButton, StCount, StDataTable, StDate, StDescription, StDescriptionList, StDivider, StElementDeListe, StEmpty, StErreur, StError, StErrorSummary, StFieldset, StFileUpload, StFilterBar, StFilterChip, StFormField, StHeader, StHeading, StHorsLigne, StIbanField, StIcon, StIconButton, StInlineMessage, StInput, StLangSwitch, StLink, StList, StLogo, StMasked, StMoney, StOfflineBanner, StOtpField, StPageTitle, StPagination, StPasswordField, StPhoneField, StProgress, StRadioGroup, StRelativeTime, StSearchField, StSection, StSelect, StSkeleton, StSkipLink, StSortHeader, StSpinner, StState, StStatusPill, StSucces, StSwitch, StTableauVide, StTag, StText, StTextarea, StThemeToggle, StTimer, StVide, cleDeFichier, copierDansLePressePapiers, erreurDate, erreurIban, erreurPlageDeDates, erreurTelephone, erreursDeFichiers, exempleDeDate, filtrerOptions, formaterDuree, fournirCheminDuSprite, fusionnerErreurs, messageDErreur, motifLocal, normaliserPourRecherche, pressePapiersDisponible, provideStarterUi };
3019
- export type { BornesDeDate, ColonneDeTableau, ConfigurationUi, ContexteDElementDeListe, ContexteDeCellule, ContexteDeDescription, DensiteDeTableau, DispositionDeChamp, ElementDeDescription, ElementDeSaisie, ErreurAffichable, EtatDeTeleversementAffiche, FiltreActif, Focalisable, FormatDeDate, GraisseDeTexte, IssueDeCopie, LibellesUi, MaillonDeFil, ModeDePagination, NiveauDeTitre, NomDIcone, OptionDeListe, OptionRadio, OrientationDeSeparateur, ReglesDeFichiers, ReliefDeCarte, RembourrageDeCarte, RemplissageDeTelephone, SensDeTri, TailleDIcone, TailleDeBouton, TailleDeSpinner, TailleDeTitre, TonDIcone, TonDeBadge, TonDeBanniere, TonDeMessage, TonDeProgression, TonDeSpinner, TonDeStatut, TriDeTableau, TypeDeSaisie, TypeMasque, UsageDuMotDePasse, VarianteDErreur, VarianteDeBouton, VarianteDeBoutonIcone, VarianteDeLien, VarianteDeSquelette, VarianteDeTexte };
3449
+ export { AnnonceLocale, CHEMIN_DU_SPRITE, ContratDeChamp, ControleDeSaisie, FUSEAU_PAR_DEFAUT, GABARITS_D_ETAT, IDENTIFIANT_DU_CONTENU_PRINCIPAL, LIBELLES_EN, LIBELLES_FR, NOMS_DICONE, PROPRIETE_HAUTEUR_ENTETE, REGION_VIVANTE_PARENTE, ST_LIBELLES, ST_LOCALE, StAppShell, StAuthShell, StAvatar, StBadge, StBanner, StBreadcrumb, StButton, StButtonGroup, StCalendar, StCard, StCellule, StChargement, StCheckbox, StCode, StControleDeChamp, StCopyButton, StCount, StDataTable, StDate, StDescription, StDescriptionList, StDivider, StElementDeListe, StEmpty, StErreur, StError, StErrorSummary, StFieldset, StFileUpload, StFilterBar, StFilterChip, StFooter, StFormActions, StFormField, StHeader, StHeading, StHorsLigne, StIbanField, StIcon, StIconButton, StInlineMessage, StInput, StLangSwitch, StLink, StList, StLogo, StMasked, StMoney, StNavLink, StOfflineBanner, StOtpField, StPageHeader, StPageTitle, StPagination, StPasswordField, StPhoneField, StProgress, StRadioGroup, StRelativeTime, StRouteProgress, StSearchField, StSection, StSelect, StSettingsRow, StSkeleton, StSkipLink, StSortHeader, StSpinner, StStat, StState, StStatusPill, StStepper, StSucces, StSwitch, StTableauVide, StTag, StText, StTextarea, StThemeToggle, StTimer, StVide, cleDeFichier, copierDansLePressePapiers, erreurDate, erreurIban, erreurPlageDeDates, erreurTelephone, erreursDeFichiers, exempleDeDate, filtrerOptions, formaterDuree, fournirCheminDuSprite, fusionnerErreurs, messageDErreur, motifLocal, normaliserPourRecherche, pressePapiersDisponible, provideStarterUi };
3450
+ export type { BornesDeDate, ColonneDeTableau, ConfigurationUi, ContexteDElementDeListe, ContexteDeCellule, ContexteDeDescription, DensiteDeTableau, DispositionDeChamp, ElementDeDescription, ElementDeSaisie, EpaisseurDeProgression, ErreurAffichable, EtapeDeParcours, EtatDEtape, EtatDeTeleversementAffiche, FiltreActif, Focalisable, FormatDeDate, GraisseDeTexte, IssueDeCopie, LibellesUi, MaillonDeFil, ModeDePagination, NiveauDeTitre, NomDIcone, OptionDeListe, OptionRadio, OrientationDeSeparateur, ReglesDeFichiers, ReliefDeCarte, RembourrageDeCarte, RemplissageDeTelephone, SensDeTendance, SensDeTri, TailleDIcone, TailleDeBouton, TailleDeSpinner, TailleDeTitre, TendanceDeStat, TonDIcone, TonDeBadge, TonDeBanniere, TonDeMessage, TonDeProgression, TonDeSpinner, TonDeStatut, TriDeTableau, TypeDeSaisie, TypeMasque, UsageDuMotDePasse, VarianteDErreur, VarianteDeBouton, VarianteDeBoutonIcone, VarianteDeLien, VarianteDeSquelette, VarianteDeTexte };