@starterlib/ui 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +44 -32
  2. package/assets/icones/catalogue.json +1 -1
  3. package/fesm2022/starterlib-ui-donnees.mjs +200 -3
  4. package/fesm2022/starterlib-ui-donnees.mjs.map +1 -1
  5. package/fesm2022/starterlib-ui-etats.mjs +1158 -0
  6. package/fesm2022/starterlib-ui-etats.mjs.map +1 -0
  7. package/fesm2022/starterlib-ui-formulaires.mjs +3 -2
  8. package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
  9. package/fesm2022/starterlib-ui-indicateurs.mjs +1013 -0
  10. package/fesm2022/starterlib-ui-indicateurs.mjs.map +1 -0
  11. package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -1
  12. package/fesm2022/starterlib-ui-listes.mjs +5 -2
  13. package/fesm2022/starterlib-ui-listes.mjs.map +1 -1
  14. package/fesm2022/starterlib-ui-messagerie.mjs +2 -2
  15. package/fesm2022/starterlib-ui-messagerie.mjs.map +1 -1
  16. package/fesm2022/starterlib-ui-mise-en-page.mjs +892 -0
  17. package/fesm2022/starterlib-ui-mise-en-page.mjs.map +1 -0
  18. package/fesm2022/starterlib-ui-onglets.mjs.map +1 -1
  19. package/fesm2022/starterlib-ui-parcours.mjs +222 -4
  20. package/fesm2022/starterlib-ui-parcours.mjs.map +1 -1
  21. package/fesm2022/starterlib-ui-saisie.mjs +131 -3
  22. package/fesm2022/starterlib-ui-saisie.mjs.map +1 -1
  23. package/fesm2022/starterlib-ui-surfaces.mjs +2 -1
  24. package/fesm2022/starterlib-ui-surfaces.mjs.map +1 -1
  25. package/fesm2022/starterlib-ui.mjs +3510 -7105
  26. package/fesm2022/starterlib-ui.mjs.map +1 -1
  27. package/package.json +15 -3
  28. package/types/starterlib-ui-donnees.d.ts +95 -1
  29. package/types/starterlib-ui-etats.d.ts +486 -0
  30. package/types/starterlib-ui-formulaires.d.ts +1 -1
  31. package/types/starterlib-ui-indicateurs.d.ts +463 -0
  32. package/types/starterlib-ui-listes.d.ts +2 -1
  33. package/types/starterlib-ui-mise-en-page.d.ts +355 -0
  34. package/types/starterlib-ui-onglets.d.ts +6 -0
  35. package/types/starterlib-ui-parcours.d.ts +123 -3
  36. package/types/starterlib-ui-saisie.d.ts +72 -2
  37. package/types/starterlib-ui-selection.d.ts +3 -2
  38. package/types/starterlib-ui.d.ts +52 -1605
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starterlib/ui",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "Bibliotheque de composants st-* du socle frontal starter, sur CDK et Aria.",
5
5
  "license": "UNLICENSED",
6
6
  "sideEffects": false,
@@ -25,8 +25,8 @@
25
25
  "@angular/forms": "^22.2.0",
26
26
  "@angular/cdk": "^22.2.0",
27
27
  "@angular/aria": "^22.2.0",
28
- "@starterlib/tokens": "^0.9.0",
29
- "@starterlib/util": "^0.9.0"
28
+ "@starterlib/tokens": "^0.10.0",
29
+ "@starterlib/util": "^0.10.0"
30
30
  },
31
31
  "peerDependenciesMeta": {
32
32
  "@angular/cdk": {
@@ -57,10 +57,18 @@
57
57
  "types": "./types/starterlib-ui-donnees.d.ts",
58
58
  "default": "./fesm2022/starterlib-ui-donnees.mjs"
59
59
  },
60
+ "./etats": {
61
+ "types": "./types/starterlib-ui-etats.d.ts",
62
+ "default": "./fesm2022/starterlib-ui-etats.mjs"
63
+ },
60
64
  "./formulaires": {
61
65
  "types": "./types/starterlib-ui-formulaires.d.ts",
62
66
  "default": "./fesm2022/starterlib-ui-formulaires.mjs"
63
67
  },
68
+ "./indicateurs": {
69
+ "types": "./types/starterlib-ui-indicateurs.d.ts",
70
+ "default": "./fesm2022/starterlib-ui-indicateurs.mjs"
71
+ },
64
72
  "./libelles-en": {
65
73
  "types": "./types/starterlib-ui-libelles-en.d.ts",
66
74
  "default": "./fesm2022/starterlib-ui-libelles-en.mjs"
@@ -73,6 +81,10 @@
73
81
  "types": "./types/starterlib-ui-messagerie.d.ts",
74
82
  "default": "./fesm2022/starterlib-ui-messagerie.mjs"
75
83
  },
84
+ "./mise-en-page": {
85
+ "types": "./types/starterlib-ui-mise-en-page.d.ts",
86
+ "default": "./fesm2022/starterlib-ui-mise-en-page.mjs"
87
+ },
76
88
  "./navigation": {
77
89
  "types": "./types/starterlib-ui-navigation.d.ts",
78
90
  "default": "./fesm2022/starterlib-ui-navigation.mjs"
@@ -1,6 +1,7 @@
1
1
  import { AnnonceLocale, Icone, TailleDAvatar, TailleDIconeFixe, TonDAvatar } from "@starterlib/ui";
2
2
  import * as i0 from "@angular/core";
3
- import { Montant, Ton, TonSemantique } from "@starterlib/util";
3
+ import { Ton, TonSemantique } from "@starterlib/util";
4
+ import { Montant } from "@starterlib/util/valeurs";
4
5
  export type TypeMasque = 'iban' | 'carte' | 'telephone' | 'reference';
5
6
  /**
6
7
  * `ligne` : dans le flux d'une phrase ou d'une cellule. `tuile` : la tuile de la planche 2
@@ -1485,5 +1486,98 @@ export declare class StRepartition {
1485
1486
  };
1486
1487
  }, {}, never, never, true, never>;
1487
1488
  }
1489
+ /**
1490
+ * Valeur technique courte et copiable : identifiant de trace, reference
1491
+ * d'operation, code d'erreur. Jamais un secret.
1492
+ *
1493
+ * ⚠️ Le `<code>` est lu par TOUT LE MONDE, technologies d'assistance comprises, precede
1494
+ * de son etiquette (« Code : 7f3a-91c4 ») : la valeur se selectionne au curseur virtuel.
1495
+ * Avant 0.9, un `<code aria-hidden>` doublait une copie masquee, et le curseur virtuel ne
1496
+ * pouvait rien selectionner. `translate="no"` : une reference ne se traduit pas.
1497
+ *
1498
+ * ⚠️ Le bouton de copie porte un nom DISTINCT par valeur : « Copier : <etiquette> », ou
1499
+ * « Copier : <valeur> » sans etiquette. Deux valeurs techniques d'une page ne proposent plus
1500
+ * deux boutons « Copier » ; sans etiquette, « Copier : Code » se repetait a chaque valeur
1501
+ * (revue E7). La valeur est courte par contrat : le nom reste lisible a l'oral.
1502
+ *
1503
+ * ⚠️ La confirmation de copie passe par une petite region vivante interne, et
1504
+ * le NOM DU BOUTON NE CHANGE PAS. Le changer ferait annoncer un autre bouton que
1505
+ * celui que l'utilisateur a sous le doigt.
1506
+ *
1507
+ * ⚠️ Le retour se VOIT aussi (03 §3.20, MV-7) : l'icone passe a la coche, en
1508
+ * `succes`, pendant `rythme.tenue.confirmation`, d'un coup ; un refus laisse un
1509
+ * message visible sous la valeur jusqu'a la tentative suivante. Meme regle que
1510
+ * `st-copy-button`.
1511
+ */
1512
+ export declare class StCode {
1513
+ private readonly document;
1514
+ private readonly libelles;
1515
+ readonly valeur: import("@angular/core").InputSignal<string>;
1516
+ readonly copiable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1517
+ /**
1518
+ * Nature de la valeur (« Identifiant de trace », « Reference de l'operation »), lue avant
1519
+ * elle. `null` : « Code », le mot generique du dictionnaire.
1520
+ */
1521
+ readonly etiquette: import("@angular/core").InputSignal<string | null>;
1522
+ /**
1523
+ * Nom du bouton de copie. `null` : « Copier : <etiquette> » (« Copier : Code » sans etiquette).
1524
+ * Jamais la valeur : un secret (TOTP) devenait le nom du bouton, lu et journalise par les
1525
+ * technologies d'assistance (audit du 2026-09-27, A-11).
1526
+ */
1527
+ readonly libelleCopier: import("@angular/core").InputSignal<string | null>;
1528
+ readonly messageDeConfirmation: import("@angular/core").InputSignal<string | null>;
1529
+ /**
1530
+ * La valeur telle qu'elle s'affiche ET se copie : sans commande de direction, ce qu'on voit est
1531
+ * ce qu'on colle (audit du 2026-09-27, A-2).
1532
+ */
1533
+ protected readonly valeurAffichee: import("@angular/core").Signal<string>;
1534
+ protected readonly etiquetteLue: import("@angular/core").Signal<string>;
1535
+ protected readonly libelleCopierLu: import("@angular/core").Signal<string>;
1536
+ readonly copie: import("@angular/core").OutputEmitterRef<string>;
1537
+ protected readonly annonce: AnnonceLocale;
1538
+ protected readonly copieConfirmee: import("@angular/core").WritableSignal<boolean>;
1539
+ protected readonly copieRefusee: import("@angular/core").WritableSignal<boolean>;
1540
+ protected readonly iconeDeCopie: import("@angular/core").Signal<"iban" | "chargement" | "message" | "devise" | "cle" | "accessibilite" | "appareils" | "arborescence" | "asterisque" | "badge-coche" | "banque" | "batiment" | "bifurcation" | "billets" | "billets-envoi" | "billets-pile" | "boite" | "boite-de-reception" | "bouclier" | "bouclier-alerte" | "bouclier-coche" | "bouclier-coeur" | "bouclier-croix" | "bouclier-moitie" | "bouclier-recherche" | "bouclier-utilisateur" | "boussole" | "bouton-curseur" | "bulle-question" | "cadenas" | "cadenas-horloge" | "cadenas-ouvert" | "cadre-pied" | "cadre-texte" | "calendrier" | "calendrier-evenement" | "calendrier-horloge" | "calendrier-jour" | "calques" | "carte-bancaire" | "carte-bancaire-barre" | "carte-bancaire-cadenas" | "carte-contact" | "carte-identite" | "cartes-empilees" | "case-cochee" | "casse" | "cercle" | "cercle-alerte" | "cercle-chevron-bas" | "cercle-coche" | "cercle-coche-ouvert" | "cercle-croix" | "cercle-info" | "cercle-moins" | "cercle-plus" | "cercle-question" | "certificat" | "chandelier" | "cheque" | "chevron-bas" | "chevron-droite" | "chevron-gauche" | "chevron-haut" | "chevrons-droite" | "chevrons-haut-bas" | "cloche" | "cloche-sonnerie" | "coche" | "code" | "code-qr" | "code-qr-scanner" | "coffre-fort" | "colonnes" | "connexion" | "contraste" | "copie" | "corbeille" | "corbeille-croix" | "courriel" | "crayon" | "croix" | "curseur-clic" | "deconnexion" | "disposition" | "dollar" | "dossier" | "dossier-barre" | "dossier-ouvert" | "double-coche" | "echange" | "eclair" | "empreinte-digitale" | "enregistrer" | "entree" | "envoyer" | "epaisseur-de-trait" | "epingle" | "etoile" | "euro" | "fichier" | "fichier-image" | "fichier-pdf" | "fichier-texte" | "filtre" | "filtre-barre" | "filtre-lignes" | "fleche-bas" | "fleche-bas-gauche" | "fleche-bas-ligne" | "fleche-droite" | "fleche-gauche" | "fleche-haut" | "fleche-haut-droite" | "fleche-haut-ligne" | "fleche-large-haut" | "fleches-gauche-droite" | "flocon" | "flou" | "formes" | "globe" | "graphique-anneau" | "graphique-barres" | "graphique-barres-cadre" | "graphique-camembert" | "graphique-ligne" | "graphique-lignes" | "grille" | "grille-lignes" | "hexagone" | "historique" | "horloge" | "horloge-fleche" | "imprimer" | "interdit" | "jalons" | "jauge" | "lien" | "lien-externe" | "lignes" | "lignes-crayon" | "liste" | "liste-coche" | "liste-controle" | "liste-numerotee" | "luminosite" | "lune" | "maillet" | "maison" | "marque-page" | "menu" | "menu-ouvert" | "minuteur" | "mise-au-point" | "mise-en-page-image" | "moins" | "nuage-barre" | "nuage-televerser" | "octogone-alerte" | "oeil" | "oeil-barre" | "panneau-gauche" | "parametres" | "parapluie" | "parchemin" | "pieces" | "plus" | "pointeur" | "points" | "points-verticaux" | "portefeuille" | "portefeuille-cartes" | "presse-papiers-coche" | "presse-papiers-horloge" | "priorite-haute" | "rafraichir" | "recherche" | "recherche-barre" | "recherche-texte" | "rectangle-points" | "recu" | "redemarrer" | "reglages" | "regle" | "reseau-jauge" | "rotation-arriere" | "routeur" | "sablier" | "sablier-bas" | "sablier-haut" | "sac-argent" | "sans-contact" | "serveur" | "soleil" | "style-de-trait" | "synchro" | "synchro-probleme" | "tableau" | "tableau-de-bord" | "tableau-de-bord-plus" | "tablette" | "tabulation" | "telecharger" | "telephone-mobile" | "televerser" | "tendance-baisse" | "tendance-hausse" | "terminal" | "tirelire" | "triangle-alerte" | "triangle-bas" | "triangle-haut" | "trombone" | "utilisateur" | "utilisateur-crayon" | "utilisateurs" | "wifi" | "wifi-barre">;
1541
+ protected readonly messageDeRefus: import("@angular/core").Signal<string>;
1542
+ private minuterieDeConfirmation;
1543
+ constructor();
1544
+ /**
1545
+ * Le bouton n'apparait que si le navigateur sait copier. Sans presse-papiers,
1546
+ * un bouton qui ne fait rien vaut moins que la selection manuelle, que la
1547
+ * feuille garde possible (`user-select: all`).
1548
+ */
1549
+ protected readonly copiePossible: import("@angular/core").Signal<boolean>;
1550
+ protected auClicDeCopie(): Promise<void>;
1551
+ static ɵfac: i0.ɵɵFactoryDeclaration<StCode, never>;
1552
+ static ɵcmp: i0.ɵɵComponentDeclaration<StCode, "st-code", never, {
1553
+ "valeur": {
1554
+ "alias": "valeur";
1555
+ "required": true;
1556
+ "isSignal": true;
1557
+ };
1558
+ "copiable": {
1559
+ "alias": "copiable";
1560
+ "required": false;
1561
+ "isSignal": true;
1562
+ };
1563
+ "etiquette": {
1564
+ "alias": "etiquette";
1565
+ "required": false;
1566
+ "isSignal": true;
1567
+ };
1568
+ "libelleCopier": {
1569
+ "alias": "libelleCopier";
1570
+ "required": false;
1571
+ "isSignal": true;
1572
+ };
1573
+ "messageDeConfirmation": {
1574
+ "alias": "messageDeConfirmation";
1575
+ "required": false;
1576
+ "isSignal": true;
1577
+ };
1578
+ }, {
1579
+ "copie": "copie";
1580
+ }, never, never, true, never>;
1581
+ }
1488
1582
 
1489
1583
  export {};
@@ -0,0 +1,486 @@
1
+ import * as i0 from "@angular/core";
2
+ import { InjectionToken, Resource, Signal, TemplateRef } from "@angular/core";
3
+ import { ErreurDeBloc } from "@starterlib/ui";
4
+ import { EtatDeBloc } from "@starterlib/util";
5
+ /**
6
+ * Les gabarits des cinq etats, declares DANS `<st-state>`.
7
+ *
8
+ * ⚠️ Pourquoi des directives de contenu plutot que des entrees `TemplateRef` :
9
+ * un `<ng-template>` declare a l'exterieur du composant appartient a
10
+ * l'injecteur de l'endroit ou il est ECRIT, pas de celui qui le rend. Les
11
+ * fournisseurs de `st-state` — dont `REGION_VIVANTE_PARENTE`, qui fait taire
12
+ * les annonces en double — ne l'atteignaient donc pas, et l'erreur etait
13
+ * annoncee deux fois. Passer par le contenu rend la declaration a l'exterieur
14
+ * impossible : le defaut ne peut plus revenir.
15
+ */
16
+ export declare class StSucces<T> {
17
+ readonly gabarit: TemplateRef<{
18
+ $implicit: Exclude<T, undefined>;
19
+ }>;
20
+ /**
21
+ * La ressource n'est lue nulle part : elle porte le TYPE de la valeur, pour
22
+ * que `let-valeur` soit type dans le gabarit au lieu d'etre `unknown`.
23
+ */
24
+ readonly stSucces: import("@angular/core").InputSignal<Resource<T> | undefined>;
25
+ /**
26
+ * `Exclude<T, undefined>` : une ressource sans valeur initiale se type
27
+ * `T | undefined`, mais st-state ne rend ce gabarit QUE lorsqu'une valeur
28
+ * existe. Sans cela, chaque gabarit de succes devrait ecrire `page?.length`
29
+ * pour un cas qui ne se produit pas.
30
+ */
31
+ static ngTemplateContextGuard<T>(_directive: StSucces<T>, _contexte: unknown): _contexte is {
32
+ $implicit: Exclude<T, undefined>;
33
+ };
34
+ static ɵfac: i0.ɵɵFactoryDeclaration<StSucces<any>, never>;
35
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StSucces<any>, "ng-template[stSucces]", never, {
36
+ "stSucces": {
37
+ "alias": "stSucces";
38
+ "required": false;
39
+ "isSignal": true;
40
+ };
41
+ }, {}, never, never, true, never>;
42
+ }
43
+ /**
44
+ * Erreur. Le contexte porte l'erreur DECRITE (`decrireLErreur`) : code machine, variante,
45
+ * rejouabilite, trace ; l'erreur brute reste dans `cause`. Les applications cessent de recopier
46
+ * leur « code de » et leur « est-ce rejouable ».
47
+ */
48
+ export declare class StErreur {
49
+ readonly gabarit: TemplateRef<{
50
+ $implicit: ErreurDeBloc;
51
+ }>;
52
+ static ngTemplateContextGuard(_directive: StErreur, _contexte: unknown): _contexte is {
53
+ $implicit: ErreurDeBloc;
54
+ };
55
+ static ɵfac: i0.ɵɵFactoryDeclaration<StErreur, never>;
56
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StErreur, "ng-template[stErreur]", never, {}, {}, never, never, true, never>;
57
+ }
58
+ export declare class StVide {
59
+ readonly gabarit: TemplateRef<void>;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<StVide, never>;
61
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StVide, "ng-template[stVide]", never, {}, {}, never, never, true, never>;
62
+ }
63
+ export declare class StHorsLigne {
64
+ readonly gabarit: TemplateRef<void>;
65
+ static ɵfac: i0.ɵɵFactoryDeclaration<StHorsLigne, never>;
66
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StHorsLigne, "ng-template[stHorsLigne]", never, {}, {}, never, never, true, never>;
67
+ }
68
+ /** Chargement sur mesure. Sans lui, `st-state` rend sa silhouette par defaut. */
69
+ export declare class StChargement {
70
+ readonly gabarit: TemplateRef<void>;
71
+ static ɵfac: i0.ɵɵFactoryDeclaration<StChargement, never>;
72
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StChargement, "ng-template[stChargement]", never, {}, {}, never, never, true, never>;
73
+ }
74
+ /** Toutes les directives de gabarit, a importer d'un coup. */
75
+ export declare const GABARITS_D_ETAT: readonly [typeof StSucces, typeof StErreur, typeof StVide, typeof StHorsLigne, typeof StChargement];
76
+ /**
77
+ * Les silhouettes de la planche 9 de Claude Design (typologie des squelettes, lot 207) :
78
+ * - `texte` (defaut) : des lignes de texte, la derniere a 60 % ;
79
+ * - `tableau` : rangee d'en-tete courte, puis des rangees de cellules (la troisieme en pastille) ;
80
+ * - `liste` : des rangees disque de 40 px, deux lignes et un montant, en option sous une rangee
81
+ * d'en-tete (`entete`, planche 2) ;
82
+ * - `carte` : en-tete, media 16/9 a pictogramme, pied ;
83
+ * - `formulaire` : des champs (libelle, champ de 44 px, aide sur un champ sur deux) ;
84
+ * - `indicateur` : le bloc d'un indicateur chiffre (libelle et pastille, valeur, deux lignes).
85
+ */
86
+ export type VarianteDeSquelette = 'texte' | 'tableau' | 'liste' | 'carte' | 'formulaire' | 'indicateur';
87
+ /**
88
+ * Silhouette du contenu en cours de chargement.
89
+ *
90
+ * Entierement masque aux technologies d'assistance : c'est `stState` qui
91
+ * annonce le chargement, une fois. Un squelette annonce ligne par ligne
92
+ * noierait le lecteur d'ecran. Pose hors de `st-state`, son conteneur porte
93
+ * `aria-busy="true"` pendant le chargement (recette).
94
+ *
95
+ * Il doit reproduire la BOITE du contenu reel, sinon l'arrivee des donnees
96
+ * fait sauter la mise en page.
97
+ */
98
+ export declare class StSkeleton {
99
+ readonly variante: import("@angular/core").InputSignal<VarianteDeSquelette>;
100
+ /** Lignes de texte, rangees de tableau ou de liste, champs de formulaire. */
101
+ readonly lignes: import("@angular/core").InputSignalWithTransform<number, unknown>;
102
+ readonly colonnes: import("@angular/core").InputSignalWithTransform<number, unknown>;
103
+ readonly anime: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
104
+ /**
105
+ * Pose la silhouette dans un creux (`surfaceConteneurBas`, 16 px de marge, coins de 8 px) :
106
+ * la planche 9 montre ainsi un bloc en attente au milieu d'une carte blanche.
107
+ */
108
+ readonly puits: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
109
+ /**
110
+ * Une rangee d'en-tete au-dessus de la liste : deux blocs de 24 px aux deux bouts (le titre et
111
+ * l'action d'une liste, planche 2). Sans effet hors de la variante `liste`.
112
+ */
113
+ readonly entete: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
114
+ protected readonly avecEntete: import("@angular/core").Signal<boolean>;
115
+ protected readonly enteteDeListe: readonly [32, 20];
116
+ protected readonly indicesDeLigne: import("@angular/core").Signal<number[]>;
117
+ protected readonly indicesDeColonne: import("@angular/core").Signal<number[]>;
118
+ /** Pas des titres de colonne. */
119
+ protected readonly enteteDeTableau: import("@angular/core").Signal<(24 | 32 | 20)[]>;
120
+ /** Pour chaque rangee, le pas de chaque cellule et si elle est une pastille. */
121
+ protected readonly rangeesDeTableau: import("@angular/core").Signal<{
122
+ pas: 24 | 32 | 20 | 28 | 48 | 16 | 40 | 36 | 14;
123
+ pastille: boolean;
124
+ }[][]>;
125
+ protected readonly rangeesDeListe: import("@angular/core").Signal<{
126
+ titre: 28 | 36 | 44;
127
+ sousTitre: 32 | 48 | 40;
128
+ montant: 24 | 20 | 28;
129
+ }[]>;
130
+ protected readonly champsDeFormulaire: import("@angular/core").Signal<{
131
+ libelle: 28 | 36;
132
+ aide: boolean;
133
+ }[]>;
134
+ static ɵfac: i0.ɵɵFactoryDeclaration<StSkeleton, never>;
135
+ static ɵcmp: i0.ɵɵComponentDeclaration<StSkeleton, "st-skeleton", never, {
136
+ "variante": {
137
+ "alias": "variante";
138
+ "required": false;
139
+ "isSignal": true;
140
+ };
141
+ "lignes": {
142
+ "alias": "lignes";
143
+ "required": false;
144
+ "isSignal": true;
145
+ };
146
+ "colonnes": {
147
+ "alias": "colonnes";
148
+ "required": false;
149
+ "isSignal": true;
150
+ };
151
+ "anime": {
152
+ "alias": "anime";
153
+ "required": false;
154
+ "isSignal": true;
155
+ };
156
+ "puits": {
157
+ "alias": "puits";
158
+ "required": false;
159
+ "isSignal": true;
160
+ };
161
+ "entete": {
162
+ "alias": "entete";
163
+ "required": false;
164
+ "isSignal": true;
165
+ };
166
+ }, {}, never, never, true, never>;
167
+ }
168
+ /**
169
+ * Presence du reseau, lue par `st-state` A L'INSTANT OU UNE ERREUR APPARAIT : une erreur survenue
170
+ * hors ligne se dit « hors ligne », pas « une erreur est survenue ». La lecture est figee avec
171
+ * l'erreur : une erreur deja affichee n'est jamais re-etiquetee quand la connectivite bascule.
172
+ *
173
+ * ⚠️ `ui` ne depend pas de `@starterlib/core` (ADR 0003) : c'est l'HOTE qui relie ce jeton a
174
+ * `StConnectivite` du noyau, qui fait d'un statut 0 la source d'autorite et se rouvre a la
175
+ * premiere reponse (lot 165) :
176
+ *
177
+ * ```ts
178
+ * { provide: ST_EN_LIGNE, useFactory: () => inject(StConnectivite).enLigne }
179
+ * ```
180
+ *
181
+ * ⚠️ Relie a `StConnectivite`, le jeton ne change le rendu d'AUCUNE reponse du serveur :
182
+ * l'intercepteur du noyau remet la connectivite en ligne sur toute reponse, avant que l'erreur
183
+ * n'atteigne la ressource. Seul le statut 0 fait alors autorite (predicat `estHorsLigne`). Le
184
+ * defaut, qui suit les evenements `online` / `offline` du navigateur, couvre en plus l'erreur
185
+ * rendue hors ligne sans reseau (un service worker qui repond a la place du serveur).
186
+ */
187
+ export declare const ST_EN_LIGNE: InjectionToken<Signal<boolean>>;
188
+ /** Ce qu'un etat degrade rend quand l'appelant n'a pas fourni son gabarit. */
189
+ type GabaritParDefaut = 'vide' | 'erreur' | 'hors-ligne';
190
+ /**
191
+ * Impose les cinq etats a un bloc qui consomme l'API, et centralise leur
192
+ * annonce.
193
+ *
194
+ * Deux usages. Le plus courant passe la ressource, et l'etat s'en deduit :
195
+ *
196
+ * ```html
197
+ * <st-state [ressource]="operations">
198
+ * <ng-template [stSucces]="operations" let-page>…</ng-template>
199
+ * <ng-template stErreur let-erreur><st-error [code]="erreur.code" … /></ng-template>
200
+ * <ng-template stVide><st-empty … /></ng-template>
201
+ * </st-state>
202
+ * ```
203
+ *
204
+ * L'autre pose `[etat]` a la main, pour un bloc qui ne vient pas d'une
205
+ * ressource — une soumission de formulaire, par exemple.
206
+ *
207
+ * ⚠️ Un RECHARGEMENT garde le contenu affiche, sous une barre de 4 px en tete du bloc
208
+ * (planche 9). Revenir a la silhouette a chaque changement de filtre fait clignoter la
209
+ * page entiere et perd la position de lecture ; seul un chargement SANS valeur retenue
210
+ * (premier appel, ou rejeu apres une erreur) montre la silhouette — jamais l'etat vide.
211
+ *
212
+ * ⚠️ Anti-clignotement, a l'oeil ET a l'oreille : rien avant `rythme.delai.attente`, puis
213
+ * la silhouette au moins `rythme.tenue.affichageMinimal` ; « Chargement en cours » n'est
214
+ * dit que si la silhouette est montree. Un rechargement de plus de
215
+ * `rythme.tenue.rechargementAnnonce` s'annonce une fois (« Actualisation en cours »).
216
+ *
217
+ * ⚠️ L'hote ne porte PAS `role="status"`, contrairement a ce qu'on attendrait :
218
+ * un remplacement de contenu A L'INTERIEUR d'une region vivante fait relire
219
+ * tout le sous-arbre par le lecteur d'ecran a chaque bascule d'etat. Seule une
220
+ * petite zone masquee porte l'annonce, qui tient en quelques mots.
221
+ *
222
+ * ⚠️ `REGION_VIVANTE_PARENTE` ne vaut que pour les etats que st-state ANNONCE (chargement,
223
+ * erreur, vide, hors ligne) : il se tait en succes, et le contenu du gabarit `stSucces` se dit
224
+ * donc lui-meme — une erreur d'action y garde son `role="alert"`, une banniere hors ligne son
225
+ * `role="status"`. Fourni a tout le contenu, le jeton les faisait taire sans que personne ne
226
+ * parle a leur place (revue E8).
227
+ *
228
+ * ⚠️ Un gabarit d'etat degrade oublie rend le gabarit PAR DEFAUT du dictionnaire (« Aucun
229
+ * resultat », « Une erreur est survenue », « Hors connexion ») plutot qu'un bloc vide ; en
230
+ * developpement, un avertissement le signale.
231
+ */
232
+ export declare class StState<T> {
233
+ private readonly libelles;
234
+ private readonly enLigne;
235
+ /** La ressource dont l'etat se deduit. */
236
+ readonly ressource: import("@angular/core").InputSignal<Resource<T> | null>;
237
+ /** Etat pose a la main. Il prime sur la ressource quand les deux existent. */
238
+ readonly etat: import("@angular/core").InputSignal<EtatDeBloc | null>;
239
+ /** Ce qui compte comme « vide » : par defaut, une collection sans element. */
240
+ readonly estVide: import("@angular/core").InputSignal<(valeur: T) => boolean>;
241
+ /**
242
+ * Ce qui compte comme une perte de reseau : par defaut, le statut 0. Une erreur APPARUE
243
+ * pendant que `ST_EN_LIGNE` disait hors ligne en est une aussi, quel que soit ce predicat.
244
+ */
245
+ readonly estHorsLigne: import("@angular/core").InputSignal<(erreur: unknown) => boolean>;
246
+ /** Silhouette par defaut du chargement. `null` : un indicateur tournant. */
247
+ readonly squelette: import("@angular/core").InputSignal<VarianteDeSquelette | null>;
248
+ readonly lignesDeSquelette: import("@angular/core").InputSignalWithTransform<number, unknown>;
249
+ /**
250
+ * Rien n'est montre avant ce delai, en millisecondes (`rythme.delai.attente`). Zero : la
251
+ * silhouette tout de suite, pour un bloc dont on SAIT qu'il sera long (un rapport).
252
+ */
253
+ readonly delaiAvantSilhouette: import("@angular/core").InputSignalWithTransform<number, unknown>;
254
+ /** `null` : les annonces viennent du dictionnaire de l'application. `succes` se tait. */
255
+ readonly annonces: import("@angular/core").InputSignal<Readonly<Partial<Record<EtatDeBloc, string>>> | null>;
256
+ /**
257
+ * Hauteur reservee au bloc, longueur CSS (`'12rem'`, `'240px'`) : la silhouette, puis le contenu,
258
+ * y tiennent sans pousser ce qui suit — aucun decalage de mise en page au passage du chargement
259
+ * au succes (CLS 0, lot 211). Un contenu plus haut agrandit le bloc. `null` : rien de reserve.
260
+ */
261
+ readonly hauteurMinimale: import("@angular/core").InputSignal<string | null>;
262
+ private readonly gabaritSucces;
263
+ private readonly gabaritErreur;
264
+ private readonly gabaritVide;
265
+ private readonly gabaritHorsLigne;
266
+ private readonly gabaritChargement;
267
+ private readonly instantane;
268
+ /**
269
+ * La derniere valeur connue, gardee pendant qu'une autre se charge.
270
+ *
271
+ * ⚠️ Necessaire, et pas seulement confortable : un changement de PARAMETRE
272
+ * n'est pas un `reload`. Angular traite le premier comme une nouvelle
273
+ * requete — statut « loading », valeur videe. Sans cette memoire, changer un
274
+ * filtre ou tourner une page ferait donc disparaitre le tableau, clignoter la
275
+ * page, et perdre la position de lecture. Une erreur, elle, ne garde rien :
276
+ * afficher des donnees perimees sous un message d'erreur serait mentir.
277
+ */
278
+ private readonly valeurRetenue;
279
+ /**
280
+ * La connectivite a l'instant de l'erreur, figee avec elle : recalculee seulement quand une
281
+ * NOUVELLE erreur apparait. Lue en direct, une bascule du reseau re-etiquetait une erreur deja
282
+ * affichee (un 409 devenait « Hors connexion »), et la region polie la re-annoncait.
283
+ */
284
+ private readonly horsLigneALErreur;
285
+ /** Etat deduit de la ressource, valeur retenue comprise. */
286
+ private readonly etatDeLaRessource;
287
+ /**
288
+ * ⚠️ Un succes pose A LA MAIN sur une ressource qui n'a encore rien rendu passerait `undefined`
289
+ * au gabarit de succes, que son type promet defini (`let-page` : A1113) : c'est encore un
290
+ * chargement. Sans ressource, le succes pose a la main se rend tel quel.
291
+ */
292
+ protected readonly etatEffectif: Signal<EtatDeBloc>;
293
+ /**
294
+ * Une valeur est affichee, et une autre arrive — par rappel explicite ou par
295
+ * changement de parametre.
296
+ */
297
+ protected readonly enRechargement: Signal<boolean>;
298
+ /** Une ressource au repos (`idle`) n'attend rien : pas d'`aria-busy` perpetuel. */
299
+ protected readonly enAttente: Signal<boolean>;
300
+ /**
301
+ * La silhouette, une fois le delai anti-clignotement passe, et pour au moins la
302
+ * tenue minimale (`rythme.delai.attente`, `rythme.tenue.affichageMinimal`) : une
303
+ * reponse rapide n'a pas a clignoter, une reponse a 210 ms ne produit pas d'eclair.
304
+ * Le gabarit `stChargement` y est soumis aussi.
305
+ */
306
+ private readonly chargementVisible;
307
+ /** Un rechargement long s'annonce, une fois, passe `rythme.tenue.rechargementAnnonce`. */
308
+ private readonly rechargementLong;
309
+ /**
310
+ * La silhouette, une fois le delai anti-clignotement passe, et TENUE :
311
+ * elle reste le temps de la tenue minimale meme si la reponse arrive avant.
312
+ * ⚠️ Sans condition sur l'etat : exiger aussi « encore en chargement » faisait
313
+ * partir la silhouette des la reponse, et une reponse a 230 ms la montrait 30 ms
314
+ * — l'eclair que la tenue doit eviter (revue E5).
315
+ */
316
+ protected readonly montreLaSilhouette: Signal<boolean>;
317
+ /** Le gabarit `stChargement`, soumis au meme delai et a la meme tenue que la silhouette. */
318
+ protected readonly gabaritDeChargement: Signal<TemplateRef<void> | null>;
319
+ private readonly annoncesLues;
320
+ /**
321
+ * Ce qui se dit : l'etat, sauf le chargement tant que la silhouette n'est pas montree (une
322
+ * reponse a 100 ms ne dit rien), et « Actualisation en cours » pour un rechargement long.
323
+ */
324
+ protected readonly annonce: Signal<string>;
325
+ /**
326
+ * L'injecteur du gabarit de succes : il masque `REGION_VIVANTE_PARENTE`, que les fournisseurs
327
+ * de st-state posent pour les etats qu'il annonce. Le gabarit est declare dans le contenu de
328
+ * st-state : sans ce masque, il voyait le jeton.
329
+ */
330
+ private readonly injecteurDuSucces;
331
+ /** `null` : l'injecteur de declaration du gabarit, sous la region de st-state. */
332
+ protected readonly injecteurDuGabarit: Signal<import("@angular/core").DestroyableInjector | null>;
333
+ /** L'erreur de la ressource, decrite pour le gabarit (`let-erreur` : `ErreurDeBloc`). */
334
+ protected readonly erreurDecrite: Signal<ErreurDeBloc | null>;
335
+ /** Contexte passe au gabarit : la valeur en succes, l'erreur decrite en erreur. */
336
+ protected readonly contexte: Signal<{
337
+ $implicit: unknown;
338
+ }>;
339
+ /** Le gabarit de l'etat courant, ou `null` (silhouette, ou gabarit par defaut). */
340
+ protected readonly gabaritDeLEtat: Signal<TemplateRef<unknown> | null>;
341
+ /** L'etat degrade dont le gabarit manque, rendu par le gabarit du dictionnaire. */
342
+ protected readonly gabaritParDefaut: Signal<GabaritParDefaut | null>;
343
+ /** Les textes des gabarits par defaut : ceux du dictionnaire, jamais une phrase du serveur. */
344
+ protected readonly textesParDefaut: Signal<import("@starterlib/ui").LibellesUi>;
345
+ /**
346
+ * Ce qui est a l'ecran : la silhouette, ou le bloc de l'etat. Suivi pour le fondu
347
+ * d'arrivee, qui ne vaut qu'a la sortie d'un chargement MONTRE.
348
+ */
349
+ private readonly affiche;
350
+ constructor();
351
+ static ɵfac: i0.ɵɵFactoryDeclaration<StState<any>, never>;
352
+ static ɵcmp: i0.ɵɵComponentDeclaration<StState<any>, "st-state", never, {
353
+ "ressource": {
354
+ "alias": "ressource";
355
+ "required": false;
356
+ "isSignal": true;
357
+ };
358
+ "etat": {
359
+ "alias": "etat";
360
+ "required": false;
361
+ "isSignal": true;
362
+ };
363
+ "estVide": {
364
+ "alias": "estVide";
365
+ "required": false;
366
+ "isSignal": true;
367
+ };
368
+ "estHorsLigne": {
369
+ "alias": "estHorsLigne";
370
+ "required": false;
371
+ "isSignal": true;
372
+ };
373
+ "squelette": {
374
+ "alias": "squelette";
375
+ "required": false;
376
+ "isSignal": true;
377
+ };
378
+ "lignesDeSquelette": {
379
+ "alias": "lignesDeSquelette";
380
+ "required": false;
381
+ "isSignal": true;
382
+ };
383
+ "delaiAvantSilhouette": {
384
+ "alias": "delaiAvantSilhouette";
385
+ "required": false;
386
+ "isSignal": true;
387
+ };
388
+ "annonces": {
389
+ "alias": "annonces";
390
+ "required": false;
391
+ "isSignal": true;
392
+ };
393
+ "hauteurMinimale": {
394
+ "alias": "hauteurMinimale";
395
+ "required": false;
396
+ "isSignal": true;
397
+ };
398
+ }, {}, ["gabaritSucces", "gabaritErreur", "gabaritVide", "gabaritHorsLigne", "gabaritChargement"], never, true, never>;
399
+ }
400
+ /** `clair` : surface a liseret primaire. `marque` : ilot sombre de la marque, a halo. */
401
+ export type VarianteDeDemarrage = 'clair' | 'marque';
402
+ /**
403
+ * Ecran de demarrage : ce qu'on voit pendant que l'application se charge, APRES l'amorce statique
404
+ * (`@starterlib/ui/styles/amorce.css`, peinte avant le JavaScript) et avant le premier ecran.
405
+ *
406
+ * ```html
407
+ * <st-splash-screen variante="marque" nom="Banque Exemple" sousTitre="Tresorerie"
408
+ * statut="Synchronisation des ordres" version="Version 0.9.0">
409
+ * <st-icon logo nom="banque" taille="28" />
410
+ * <span surtitre>PORTAIL</span>
411
+ * </st-splash-screen>
412
+ * ```
413
+ *
414
+ * ⚠️ **Aucune retention artificielle** (D25) : l'application le retire des qu'elle est prete. Un
415
+ * ecran de demarrage qui se montre « au moins deux secondes » fait attendre pour rien.
416
+ *
417
+ * ⚠️ **Le statut n'apparait qu'apres `rythme.delai.attente`** (200 ms) : un demarrage rapide ne
418
+ * fait pas clignoter une phrase qu'on n'a pas le temps de lire. Il est lu par une region
419
+ * `status`, presente VIDE des la creation ; sans `statut`, elle lit le libelle par defaut
420
+ * (`chargementEnCours`, masque) : l'attente est un message d'etat (WCAG 4.1.3). L'indicateur et
421
+ * la barre, eux, se taisent (une seule annonce).
422
+ *
423
+ * ⚠️ **Aucun `aria-busy` sur l'ecran** : un sous-arbre `busy` peut etre ignore par les lecteurs
424
+ * d'ecran jusqu'a son retour a `false`, et l'ecran est retire, jamais rendu « pret ». Il ferait
425
+ * taire la region meme qu'il contient.
426
+ *
427
+ * ⚠️ **La version est un texte public** : un numero de version, jamais un numero de construction,
428
+ * une adresse ou un detail d'infrastructure (EA-15).
429
+ *
430
+ * Emplacements : `[logo]` (tuile de 48 px), `[surtitre]` (ligne du haut, micro-libelle de 11 px
431
+ * mis en capitales par le composant, D18, D41), contenu libre sous le statut (une mention),
432
+ * `[pied]` apres la version (12/16 ; un micro-libelle projete y pose ses capitales lui-meme).
433
+ */
434
+ export declare class StSplashScreen {
435
+ private readonly libelles;
436
+ readonly variante: import("@angular/core").InputSignal<VarianteDeDemarrage>;
437
+ /** Nom de l'application ou de l'etablissement. */
438
+ readonly nom: import("@angular/core").InputSignal<string>;
439
+ readonly sousTitre: import("@angular/core").InputSignal<string | null>;
440
+ /** Ce qui se passe (« Synchronisation des ordres ») ; montre apres `rythme.delai.attente`. */
441
+ readonly statut: import("@angular/core").InputSignal<string | null>;
442
+ /** Version publiee (« Version 0.9.0 »), jamais un numero de construction. */
443
+ readonly version: import("@angular/core").InputSignal<string | null>;
444
+ /**
445
+ * Delai avant le statut, en millisecondes : `rythme.delai.attente` par defaut. Zero le montre
446
+ * tout de suite (une vignette de galerie, un test).
447
+ */
448
+ readonly delaiMs: import("@angular/core").InputSignalWithTransform<number, unknown>;
449
+ protected readonly etiquetteLue: import("@angular/core").Signal<string>;
450
+ protected readonly statutVisible: import("@angular/core").Signal<boolean>;
451
+ static ɵfac: i0.ɵɵFactoryDeclaration<StSplashScreen, never>;
452
+ static ɵcmp: i0.ɵɵComponentDeclaration<StSplashScreen, "st-splash-screen", never, {
453
+ "variante": {
454
+ "alias": "variante";
455
+ "required": false;
456
+ "isSignal": true;
457
+ };
458
+ "nom": {
459
+ "alias": "nom";
460
+ "required": true;
461
+ "isSignal": true;
462
+ };
463
+ "sousTitre": {
464
+ "alias": "sousTitre";
465
+ "required": false;
466
+ "isSignal": true;
467
+ };
468
+ "statut": {
469
+ "alias": "statut";
470
+ "required": false;
471
+ "isSignal": true;
472
+ };
473
+ "version": {
474
+ "alias": "version";
475
+ "required": false;
476
+ "isSignal": true;
477
+ };
478
+ "delaiMs": {
479
+ "alias": "delaiMs";
480
+ "required": false;
481
+ "isSignal": true;
482
+ };
483
+ }, {}, never, ["[surtitre]", "[logo]", "*", "[pied]"], true, never>;
484
+ }
485
+
486
+ export {};
@@ -3,7 +3,7 @@ import { AnneesDuCalendrier, ContratDeChamp, ContratDeChampABornes, ControleDeSa
3
3
  import * as i0 from "@angular/core";
4
4
  import { InjectionToken, Provider, Signal } from "@angular/core";
5
5
  import { AnnonceLocale, CatalogueDuPointDEntree, LibellesUi } from "@starterlib/ui";
6
- import { DateIso, FrequenceDeRecurrence, HeureIso, PlageDeDates, Recurrence } from "@starterlib/util";
6
+ import { DateIso, FrequenceDeRecurrence, HeureIso, PlageDeDates, Recurrence } from "@starterlib/util/valeurs";
7
7
  /**
8
8
  * L'envoi d'un formulaire valide. Il rend les refus du serveur, que Signal Forms place sous leur
9
9
  * champ (`fieldTree`) et au recapitulatif, puis efface des que la valeur du champ change ; rien