@starterlib/ui 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +95 -42
  2. package/fesm2022/starterlib-ui-arbre.mjs +82 -0
  3. package/fesm2022/starterlib-ui-arbre.mjs.map +1 -0
  4. package/fesm2022/starterlib-ui-donnees.mjs +532 -0
  5. package/fesm2022/starterlib-ui-donnees.mjs.map +1 -0
  6. package/fesm2022/starterlib-ui-formulaires.mjs +2 -1
  7. package/fesm2022/starterlib-ui-formulaires.mjs.map +1 -1
  8. package/fesm2022/starterlib-ui-interactions.mjs +34 -589
  9. package/fesm2022/starterlib-ui-interactions.mjs.map +1 -1
  10. package/fesm2022/starterlib-ui-libelles-en.mjs +142 -0
  11. package/fesm2022/starterlib-ui-libelles-en.mjs.map +1 -0
  12. package/fesm2022/starterlib-ui-listes.mjs +671 -0
  13. package/fesm2022/starterlib-ui-listes.mjs.map +1 -0
  14. package/fesm2022/starterlib-ui-navigation.mjs +246 -0
  15. package/fesm2022/starterlib-ui-navigation.mjs.map +1 -0
  16. package/fesm2022/starterlib-ui-onglets.mjs +137 -0
  17. package/fesm2022/starterlib-ui-onglets.mjs.map +1 -0
  18. package/fesm2022/starterlib-ui-saisie.mjs +1632 -0
  19. package/fesm2022/starterlib-ui-saisie.mjs.map +1 -0
  20. package/fesm2022/starterlib-ui-selection.mjs +269 -0
  21. package/fesm2022/starterlib-ui-selection.mjs.map +1 -0
  22. package/fesm2022/starterlib-ui.mjs +105 -2931
  23. package/fesm2022/starterlib-ui.mjs.map +1 -1
  24. package/package.json +35 -3
  25. package/types/starterlib-ui-arbre.d.ts +51 -0
  26. package/types/starterlib-ui-donnees.d.ts +228 -0
  27. package/types/starterlib-ui-formulaires.d.ts +5 -4
  28. package/types/starterlib-ui-interactions.d.ts +4 -316
  29. package/types/starterlib-ui-libelles-en.d.ts +25 -0
  30. package/types/starterlib-ui-listes.d.ts +432 -0
  31. package/types/starterlib-ui-navigation.d.ts +104 -0
  32. package/types/starterlib-ui-onglets.d.ts +89 -0
  33. package/types/starterlib-ui-saisie.d.ts +924 -0
  34. package/types/starterlib-ui-selection.d.ts +112 -0
  35. package/types/starterlib-ui.d.ts +9 -1575
@@ -0,0 +1,532 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, input, model, booleanAttribute, output, DestroyRef, computed, ChangeDetectionStrategy, Component, signal, afterNextRender } from '@angular/core';
3
+ import { masquerIban, masquerTelephone, masquerCarte, quatreDerniers, formaterIban, formaterMontant } from '@starterlib/util';
4
+ import { ST_LIBELLES, AnnonceLocale, StIconButton, ST_LOCALE, FUSEAU_PAR_DEFAUT, StIcon } from '@starterlib/ui';
5
+
6
+ /**
7
+ * Identifiant sensible, masque par defaut.
8
+ *
9
+ * ⚠️ La valeur masquee porte un `aria-label` en toutes lettres (« IBAN se
10
+ * terminant par 2606 ») : plusieurs lecteurs d'ecran epellent une suite de
11
+ * puces caractere par caractere, ce qui est a la fois illisible et interminable.
12
+ *
13
+ * La revelation est un EVENEMENT METIER : elle se journalise cote appelant par
14
+ * la sortie `revelation`. La valeur revelee, elle, ne part jamais dans un
15
+ * journal.
16
+ */
17
+ class StMasked {
18
+ libelles = inject(ST_LIBELLES);
19
+ valeur = input.required(/* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "valeur" }] : /* istanbul ignore next */ []));
21
+ type = input('iban', /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
23
+ revele = model(false, /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "revele" }] : /* istanbul ignore next */ []));
25
+ revelationAutorisee = input(false, { ...(ngDevMode ? { debugName: "revelationAutorisee" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
26
+ dureeDeRevelationEnSecondes = input(30, /* @ts-ignore */
27
+ ...(ngDevMode ? [{ debugName: "dureeDeRevelationEnSecondes" }] : /* istanbul ignore next */ []));
28
+ /** `null` : les textes viennent du dictionnaire de l'application. */
29
+ libelleAfficher = input(null, /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "libelleAfficher" }] : /* istanbul ignore next */ []));
31
+ libelleMasquer = input(null, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "libelleMasquer" }] : /* istanbul ignore next */ []));
33
+ revelation = output();
34
+ /**
35
+ * ⚠️ Par `AnnonceLocale`, et non par un signal pose directement. La 0.2.0
36
+ * reposait « Valeur masquee a nouveau » a l'identique : aucune mutation, donc
37
+ * une seconde remise en masque jamais annoncee.
38
+ */
39
+ annonce = new AnnonceLocale(inject(DestroyRef));
40
+ minuterie = null;
41
+ constructor() {
42
+ // Enregistre UNE fois. La 0.2.0 l'enregistrait a chaque revelation, et
43
+ // chaque clic empilait un rappel de plus.
44
+ inject(DestroyRef).onDestroy(() => {
45
+ if (this.minuterie !== null)
46
+ clearTimeout(this.minuterie);
47
+ });
48
+ }
49
+ valeurMasquee = computed(() => {
50
+ const valeur = this.valeur();
51
+ switch (this.type()) {
52
+ case 'carte':
53
+ return masquerCarte(valeur);
54
+ case 'telephone':
55
+ return masquerTelephone(valeur);
56
+ default:
57
+ return masquerIban(valeur);
58
+ }
59
+ }, /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "valeurMasquee" }] : /* istanbul ignore next */ []));
61
+ valeurAffichee = computed(() => this.revele() ? this.valeurLisible() : this.valeurMasquee(), /* @ts-ignore */
62
+ ...(ngDevMode ? [{ debugName: "valeurAffichee" }] : /* istanbul ignore next */ []));
63
+ /**
64
+ * La nature et la tournure viennent du dictionnaire : l'ordre des mots change
65
+ * d'une langue a l'autre, « IBAN se terminant par 2606 » contre « IBAN ending
66
+ * in 2606 ». Une chaine a trous ne suffirait pas.
67
+ */
68
+ nomAccessible = computed(() => {
69
+ const libelles = this.libelles();
70
+ const nature = {
71
+ iban: libelles.natureIban,
72
+ carte: libelles.natureCarte,
73
+ telephone: libelles.natureTelephone,
74
+ }[this.type()];
75
+ if (this.revele())
76
+ return `${nature} ${this.valeurLisible()}`;
77
+ return libelles.seTerminantPar(nature, quatreDerniers(this.valeur()));
78
+ }, /* @ts-ignore */
79
+ ...(ngDevMode ? [{ debugName: "nomAccessible" }] : /* istanbul ignore next */ []));
80
+ libelleDuBouton = computed(() => this.revele()
81
+ ? (this.libelleMasquer() ?? this.libelles().masquer)
82
+ : (this.libelleAfficher() ?? this.libelles().afficher), /* @ts-ignore */
83
+ ...(ngDevMode ? [{ debugName: "libelleDuBouton" }] : /* istanbul ignore next */ []));
84
+ valeurLisible() {
85
+ return this.type() === 'iban' ? formaterIban(this.valeur()) : this.valeur();
86
+ }
87
+ basculer() {
88
+ if (this.revele()) {
89
+ this.masquer();
90
+ return;
91
+ }
92
+ this.revele.set(true);
93
+ this.revelation.emit({ type: this.type() });
94
+ // Re-masquage automatique : une valeur revelee puis oubliee a l'ecran est
95
+ // lisible par quiconque passe derriere.
96
+ if (this.minuterie !== null)
97
+ clearTimeout(this.minuterie);
98
+ this.minuterie = setTimeout(() => {
99
+ this.masquer();
100
+ }, this.dureeDeRevelationEnSecondes() * 1000);
101
+ }
102
+ masquer() {
103
+ if (this.minuterie !== null) {
104
+ clearTimeout(this.minuterie);
105
+ this.minuterie = null;
106
+ }
107
+ if (!this.revele())
108
+ return;
109
+ this.revele.set(false);
110
+ this.annonce.annoncer(this.libelles().valeurMasqueeANouveau);
111
+ }
112
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StMasked, deps: [], target: i0.ɵɵFactoryTarget.Component });
113
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: StMasked, isStandalone: true, selector: "st-masked", inputs: { valeur: { classPropertyName: "valeur", publicName: "valeur", isSignal: true, isRequired: true, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, revele: { classPropertyName: "revele", publicName: "revele", isSignal: true, isRequired: false, transformFunction: null }, revelationAutorisee: { classPropertyName: "revelationAutorisee", publicName: "revelationAutorisee", isSignal: true, isRequired: false, transformFunction: null }, dureeDeRevelationEnSecondes: { classPropertyName: "dureeDeRevelationEnSecondes", publicName: "dureeDeRevelationEnSecondes", isSignal: true, isRequired: false, transformFunction: null }, libelleAfficher: { classPropertyName: "libelleAfficher", publicName: "libelleAfficher", isSignal: true, isRequired: false, transformFunction: null }, libelleMasquer: { classPropertyName: "libelleMasquer", publicName: "libelleMasquer", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { revele: "reveleChange", revelation: "revelation" }, host: { properties: { "attr.data-type": "type()" }, classAttribute: "st-masked" }, ngImport: i0, template: "<span class=\"st-masked__valeur\" aria-hidden=\"true\">{{ valeurAffichee() }}</span>\n<span class=\"st-vh\">{{ nomAccessible() }}</span>\n\n@if (revelationAutorisee()) {\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content --\n Le contenu vient du gabarit de stIconButton. Le nom accessible est\n impose par le type (`etiquette` est requis) et verifie par axe. -->\n <button\n stIconButton\n type=\"button\"\n taille=\"sm\"\n [icone]=\"revele() ? 'oeil-barre' : 'oeil'\"\n [etiquette]=\"libelleDuBouton()\"\n [enfonce]=\"revele()\"\n (click)=\"basculer()\"\n ></button>\n}\n\n<span class=\"st-vh\" aria-live=\"polite\">{{ annonce.texte() }}</span>\n", styles: [":host([hidden]){display:none!important}:host{display:inline-flex;gap:var(--st-espacement-2);align-items:center}.st-masked__valeur{font-family:var(--st-police-mono);color:var(--st-couleur-texte);letter-spacing:.02em}.st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "component", type: StIconButton, selector: "button[stIconButton]", inputs: ["icone", "etiquette", "variante", "taille", "enfonce"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
114
+ }
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StMasked, decorators: [{
116
+ type: Component,
117
+ args: [{ selector: 'st-masked', changeDetection: ChangeDetectionStrategy.OnPush, imports: [StIconButton], host: { class: 'st-masked', '[attr.data-type]': 'type()' }, template: "<span class=\"st-masked__valeur\" aria-hidden=\"true\">{{ valeurAffichee() }}</span>\n<span class=\"st-vh\">{{ nomAccessible() }}</span>\n\n@if (revelationAutorisee()) {\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content --\n Le contenu vient du gabarit de stIconButton. Le nom accessible est\n impose par le type (`etiquette` est requis) et verifie par axe. -->\n <button\n stIconButton\n type=\"button\"\n taille=\"sm\"\n [icone]=\"revele() ? 'oeil-barre' : 'oeil'\"\n [etiquette]=\"libelleDuBouton()\"\n [enfonce]=\"revele()\"\n (click)=\"basculer()\"\n ></button>\n}\n\n<span class=\"st-vh\" aria-live=\"polite\">{{ annonce.texte() }}</span>\n", styles: [":host([hidden]){display:none!important}:host{display:inline-flex;gap:var(--st-espacement-2);align-items:center}.st-masked__valeur{font-family:var(--st-police-mono);color:var(--st-couleur-texte);letter-spacing:.02em}.st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"] }]
118
+ }], ctorParameters: () => [], propDecorators: { valeur: [{ type: i0.Input, args: [{ isSignal: true, alias: "valeur", required: true }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], revele: [{ type: i0.Input, args: [{ isSignal: true, alias: "revele", required: false }] }, { type: i0.Output, args: ["reveleChange"] }], revelationAutorisee: [{ type: i0.Input, args: [{ isSignal: true, alias: "revelationAutorisee", required: false }] }], dureeDeRevelationEnSecondes: [{ type: i0.Input, args: [{ isSignal: true, alias: "dureeDeRevelationEnSecondes", required: false }] }], libelleAfficher: [{ type: i0.Input, args: [{ isSignal: true, alias: "libelleAfficher", required: false }] }], libelleMasquer: [{ type: i0.Input, args: [{ isSignal: true, alias: "libelleMasquer", required: false }] }], revelation: [{ type: i0.Output, args: ["revelation"] }] } });
119
+
120
+ /**
121
+ * Somme d'argent.
122
+ *
123
+ * Le montant entre sous forme d'unites mineures entieres : un nombre a virgule
124
+ * flottante ne represente pas exactement 0,10 EUR, et les erreurs s'accumulent.
125
+ * La conversion n'a lieu qu'a l'instant du rendu.
126
+ *
127
+ * ⚠️ Le signe negatif est TOUJOURS rendu en texte. La couleur ne fait que le
128
+ * renforcer : un daltonien, une impression en noir et blanc ou un theme a fort
129
+ * contraste ne doivent jamais transformer un debit en credit.
130
+ */
131
+ class StMoney {
132
+ locale = inject(ST_LOCALE);
133
+ valeur = input.required(/* @ts-ignore */
134
+ ...(ngDevMode ? [{ debugName: "valeur" }] : /* istanbul ignore next */ []));
135
+ signeExplicite = input(false, { ...(ngDevMode ? { debugName: "signeExplicite" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
136
+ sansDevise = input(false, { ...(ngDevMode ? { debugName: "sansDevise" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
137
+ taille = input('md', /* @ts-ignore */
138
+ ...(ngDevMode ? [{ debugName: "taille" }] : /* istanbul ignore next */ []));
139
+ signe = computed(() => {
140
+ const unites = this.valeur().unitesMineures;
141
+ if (unites < 0n)
142
+ return 'negatif';
143
+ if (unites > 0n)
144
+ return 'positif';
145
+ return 'nul';
146
+ }, /* @ts-ignore */
147
+ ...(ngDevMode ? [{ debugName: "signe" }] : /* istanbul ignore next */ []));
148
+ texte = computed(() => formaterMontant(this.valeur(), {
149
+ locale: this.locale(),
150
+ signeExplicite: this.signeExplicite(),
151
+ sansDevise: this.sansDevise(),
152
+ }), /* @ts-ignore */
153
+ ...(ngDevMode ? [{ debugName: "texte" }] : /* istanbul ignore next */ []));
154
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StMoney, deps: [], target: i0.ɵɵFactoryTarget.Component });
155
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: StMoney, isStandalone: true, selector: "st-money", inputs: { valeur: { classPropertyName: "valeur", publicName: "valeur", isSignal: true, isRequired: true, transformFunction: null }, signeExplicite: { classPropertyName: "signeExplicite", publicName: "signeExplicite", isSignal: true, isRequired: false, transformFunction: null }, sansDevise: { classPropertyName: "sansDevise", publicName: "sansDevise", isSignal: true, isRequired: false, transformFunction: null }, taille: { classPropertyName: "taille", publicName: "taille", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-taille": "taille()", "attr.data-signe": "signe()" }, classAttribute: "st-money" }, ngImport: i0, template: "{{ texte() }}\n", styles: [".st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}:host([hidden]){display:none!important}:host{font-variant-numeric:tabular-nums;font-weight:var(--st-graisse-moyenne);color:var(--st-couleur-texte);white-space:nowrap}:host([data-signe=negatif]){color:var(--st-couleur-danger)}:host([data-taille=sm]){font-size:var(--st-taille-sm)}:host([data-taille=lg]){font-size:var(--st-taille-lg)}:host([data-taille=xl]){font-size:var(--st-taille-xl)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
156
+ }
157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StMoney, decorators: [{
158
+ type: Component,
159
+ args: [{ selector: 'st-money', changeDetection: ChangeDetectionStrategy.OnPush, host: {
160
+ class: 'st-money',
161
+ '[attr.data-taille]': 'taille()',
162
+ '[attr.data-signe]': 'signe()',
163
+ }, template: "{{ texte() }}\n", styles: [".st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}:host([hidden]){display:none!important}:host{font-variant-numeric:tabular-nums;font-weight:var(--st-graisse-moyenne);color:var(--st-couleur-texte);white-space:nowrap}:host([data-signe=negatif]){color:var(--st-couleur-danger)}:host([data-taille=sm]){font-size:var(--st-taille-sm)}:host([data-taille=lg]){font-size:var(--st-taille-lg)}:host([data-taille=xl]){font-size:var(--st-taille-xl)}\n"] }]
164
+ }], propDecorators: { valeur: [{ type: i0.Input, args: [{ isSignal: true, alias: "valeur", required: true }] }], signeExplicite: [{ type: i0.Input, args: [{ isSignal: true, alias: "signeExplicite", required: false }] }], sansDevise: [{ type: i0.Input, args: [{ isSignal: true, alias: "sansDevise", required: false }] }], taille: [{ type: i0.Input, args: [{ isSignal: true, alias: "taille", required: false }] }] } });
165
+
166
+ const OPTIONS = {
167
+ court: { day: '2-digit', month: '2-digit', year: 'numeric' },
168
+ long: { day: 'numeric', month: 'long', year: 'numeric' },
169
+ 'date-heure': {
170
+ day: '2-digit',
171
+ month: '2-digit',
172
+ year: 'numeric',
173
+ hour: '2-digit',
174
+ minute: '2-digit',
175
+ },
176
+ heure: { hour: '2-digit', minute: '2-digit' },
177
+ };
178
+ /**
179
+ * Date rendue dans la locale et le fuseau de l'application.
180
+ *
181
+ * ⚠️ La locale et le fuseau sont EXPLICITES, jamais deduits de l'environnement
182
+ * d'execution. Un rendu serveur et un rendu navigateur qui ne s'accordent pas
183
+ * produisent deux textes differents, et l'hydratation casse. Le rendu serveur
184
+ * est ecarte en version 1, mais la compatibilite reste gardee a cout nul.
185
+ *
186
+ * Le format court garde un nom accessible en toutes lettres : « 12/09/26 » est
187
+ * ambigu a l'oral, et l'ordre jour-mois n'est pas universel.
188
+ */
189
+ class StDate {
190
+ locale = inject(ST_LOCALE);
191
+ fuseauParDefaut = inject(FUSEAU_PAR_DEFAUT);
192
+ valeur = input.required(/* @ts-ignore */
193
+ ...(ngDevMode ? [{ debugName: "valeur" }] : /* istanbul ignore next */ []));
194
+ format = input('court', /* @ts-ignore */
195
+ ...(ngDevMode ? [{ debugName: "format" }] : /* istanbul ignore next */ []));
196
+ fuseau = input(null, /* @ts-ignore */
197
+ ...(ngDevMode ? [{ debugName: "fuseau" }] : /* istanbul ignore next */ []));
198
+ /**
199
+ * Une DATE DE CALENDRIER (`2026-09-12`) n'est pas un instant : une date de
200
+ * naissance, une echeance ou un jour de valeur n'ont pas d'heure, et ne
201
+ * doivent pas changer de jour selon le fuseau de qui les regarde.
202
+ *
203
+ * ⚠️ Le piege est dans la norme : `new Date('2026-09-12')` vaut minuit UTC,
204
+ * donc le 11 septembre partout a l'ouest de Greenwich. Une echeance affichee
205
+ * la veille est un defaut que personne ne voit depuis l'Europe.
206
+ */
207
+ estDateDeCalendrier = computed(() => {
208
+ const valeur = this.valeur();
209
+ return typeof valeur === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(valeur);
210
+ }, /* @ts-ignore */
211
+ ...(ngDevMode ? [{ debugName: "estDateDeCalendrier" }] : /* istanbul ignore next */ []));
212
+ date = computed(() => {
213
+ const valeur = this.valeur();
214
+ return valeur instanceof Date ? valeur : new Date(valeur);
215
+ }, /* @ts-ignore */
216
+ ...(ngDevMode ? [{ debugName: "date" }] : /* istanbul ignore next */ []));
217
+ estValide = computed(() => !Number.isNaN(this.date().getTime()), /* @ts-ignore */
218
+ ...(ngDevMode ? [{ debugName: "estValide" }] : /* istanbul ignore next */ []));
219
+ /**
220
+ * Le fuseau de rendu. Pour une date de calendrier, c'est UTC : la valeur a
221
+ * ete construite a minuit UTC, la relire en UTC rend donc le jour ecrit.
222
+ */
223
+ fuseauDeRendu = computed(() => this.estDateDeCalendrier() ? 'UTC' : (this.fuseau() ?? this.fuseauParDefaut), /* @ts-ignore */
224
+ ...(ngDevMode ? [{ debugName: "fuseauDeRendu" }] : /* istanbul ignore next */ []));
225
+ /**
226
+ * Une date de calendrier porte `2026-09-12`, sans heure ni decalage : c'est
227
+ * la forme que la norme HTML attend, et la seule qui ne mente pas.
228
+ */
229
+ iso = computed(() => {
230
+ if (!this.estValide())
231
+ return null;
232
+ if (this.estDateDeCalendrier())
233
+ return this.date().toISOString().slice(0, 10);
234
+ return this.date().toISOString();
235
+ }, /* @ts-ignore */
236
+ ...(ngDevMode ? [{ debugName: "iso" }] : /* istanbul ignore next */ []));
237
+ /** Une date sans heure ne peut pas en afficher une. */
238
+ optionsDeFormat = computed(() => {
239
+ const options = OPTIONS[this.format()];
240
+ if (!this.estDateDeCalendrier())
241
+ return options;
242
+ // Le format « heure » n'a aucun sens ici : il ne resterait rien a afficher.
243
+ if (this.format() === 'heure')
244
+ return OPTIONS.court;
245
+ const sansHeure = { ...options };
246
+ delete sansHeure.hour;
247
+ delete sansHeure.minute;
248
+ return sansHeure;
249
+ }, /* @ts-ignore */
250
+ ...(ngDevMode ? [{ debugName: "optionsDeFormat" }] : /* istanbul ignore next */ []));
251
+ texte = computed(() => {
252
+ if (!this.estValide())
253
+ return '';
254
+ return new Intl.DateTimeFormat(this.locale(), {
255
+ ...this.optionsDeFormat(),
256
+ timeZone: this.fuseauDeRendu(),
257
+ }).format(this.date());
258
+ }, /* @ts-ignore */
259
+ ...(ngDevMode ? [{ debugName: "texte" }] : /* istanbul ignore next */ []));
260
+ /** Forme longue, lue par les technologies d'assistance. */
261
+ texteAccessible = computed(() => {
262
+ if (!this.estValide())
263
+ return '';
264
+ if (this.format() === 'court') {
265
+ return new Intl.DateTimeFormat(this.locale(), {
266
+ ...OPTIONS.long,
267
+ timeZone: this.fuseauDeRendu(),
268
+ }).format(this.date());
269
+ }
270
+ return null;
271
+ }, /* @ts-ignore */
272
+ ...(ngDevMode ? [{ debugName: "texteAccessible" }] : /* istanbul ignore next */ []));
273
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StDate, deps: [], target: i0.ɵɵFactoryTarget.Component });
274
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: StDate, isStandalone: true, selector: "st-date", inputs: { valeur: { classPropertyName: "valeur", publicName: "valeur", isSignal: true, isRequired: true, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, fuseau: { classPropertyName: "fuseau", publicName: "fuseau", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "st-date" }, ngImport: i0, template: "@if (estValide()) {\n <time [attr.datetime]=\"iso()\" aria-hidden=\"true\">{{ texte() }}</time>\n @if (texteAccessible(); as lu) {\n <!-- Rien quand le format affiche se lit deja : un noeud vide ferait\n croire a un texte de remplacement absent. -->\n <span class=\"st-vh\">{{ lu }}</span>\n }\n}\n", styles: [":host([hidden]){display:none!important}:host{font-variant-numeric:tabular-nums;color:var(--st-couleur-texte);white-space:nowrap}.st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
275
+ }
276
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StDate, decorators: [{
277
+ type: Component,
278
+ args: [{ selector: 'st-date', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'st-date' }, template: "@if (estValide()) {\n <time [attr.datetime]=\"iso()\" aria-hidden=\"true\">{{ texte() }}</time>\n @if (texteAccessible(); as lu) {\n <!-- Rien quand le format affiche se lit deja : un noeud vide ferait\n croire a un texte de remplacement absent. -->\n <span class=\"st-vh\">{{ lu }}</span>\n }\n}\n", styles: [":host([hidden]){display:none!important}:host{font-variant-numeric:tabular-nums;color:var(--st-couleur-texte);white-space:nowrap}.st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"] }]
279
+ }], propDecorators: { valeur: [{ type: i0.Input, args: [{ isSignal: true, alias: "valeur", required: true }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], fuseau: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuseau", required: false }] }] } });
280
+
281
+ const MINUTE = 60_000;
282
+ const HEURE = 60 * MINUTE;
283
+ const JOUR = 24 * HEURE;
284
+ /**
285
+ * Temps ecoule, exprime relativement (« il y a 5 minutes »).
286
+ *
287
+ * ⚠️ Ce composant ne doit JAMAIS etre place dans une region vivante : son texte
288
+ * se reecrit tout seul, et une region vivante le ferait annoncer en boucle.
289
+ * Son nom accessible porte la date absolue, qui elle ne bouge pas.
290
+ *
291
+ * La cadence de rafraichissement s'adapte : rafraichir chaque seconde une date
292
+ * vieille de trois jours reveille l'onglet pour rien.
293
+ */
294
+ class StRelativeTime {
295
+ locale = inject(ST_LOCALE);
296
+ libelles = inject(ST_LIBELLES);
297
+ fuseau = inject(FUSEAU_PAR_DEFAUT);
298
+ valeur = input.required(/* @ts-ignore */
299
+ ...(ngDevMode ? [{ debugName: "valeur" }] : /* istanbul ignore next */ []));
300
+ rafraichir = input(true, { ...(ngDevMode ? { debugName: "rafraichir" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
301
+ /** Au-dela de ce nombre de jours, la date absolue est plus parlante. */
302
+ seuilAbsoluEnJours = input(7, /* @ts-ignore */
303
+ ...(ngDevMode ? [{ debugName: "seuilAbsoluEnJours" }] : /* istanbul ignore next */ []));
304
+ destruction = inject(DestroyRef);
305
+ maintenant = signal(Date.now(), /* @ts-ignore */
306
+ ...(ngDevMode ? [{ debugName: "maintenant" }] : /* istanbul ignore next */ []));
307
+ constructor() {
308
+ // `afterNextRender` : aucune minuterie ne demarre a la construction, ce qui
309
+ // garde le composant compatible avec un rendu serveur.
310
+ afterNextRender(() => {
311
+ if (!this.rafraichir())
312
+ return;
313
+ let minuterie;
314
+ const planifier = () => {
315
+ const ecart = Math.abs(Date.now() - this.dateEnMillisecondes());
316
+ // Sous une minute, la valeur bouge vite ; au-dela, une fois par minute
317
+ // suffit et l'onglet se rendort.
318
+ const cadence = ecart < MINUTE ? 10_000 : MINUTE;
319
+ minuterie = setTimeout(() => {
320
+ this.maintenant.set(Date.now());
321
+ planifier();
322
+ }, cadence);
323
+ };
324
+ planifier();
325
+ this.destruction.onDestroy(() => {
326
+ clearTimeout(minuterie);
327
+ });
328
+ });
329
+ }
330
+ dateEnMillisecondes() {
331
+ const valeur = this.valeur();
332
+ return (valeur instanceof Date ? valeur : new Date(valeur)).getTime();
333
+ }
334
+ estValide = computed(() => !Number.isNaN(this.dateEnMillisecondes()), /* @ts-ignore */
335
+ ...(ngDevMode ? [{ debugName: "estValide" }] : /* istanbul ignore next */ []));
336
+ iso = computed(() => this.estValide() ? new Date(this.dateEnMillisecondes()).toISOString() : null, /* @ts-ignore */
337
+ ...(ngDevMode ? [{ debugName: "iso" }] : /* istanbul ignore next */ []));
338
+ depasseLeSeuil = computed(() => {
339
+ const ecart = Math.abs(this.maintenant() - this.dateEnMillisecondes());
340
+ return ecart > this.seuilAbsoluEnJours() * JOUR;
341
+ }, /* @ts-ignore */
342
+ ...(ngDevMode ? [{ debugName: "depasseLeSeuil" }] : /* istanbul ignore next */ []));
343
+ texte = computed(() => {
344
+ if (!this.estValide())
345
+ return '';
346
+ const cible = this.dateEnMillisecondes();
347
+ if (this.depasseLeSeuil()) {
348
+ return new Intl.DateTimeFormat(this.locale(), {
349
+ day: 'numeric',
350
+ month: 'long',
351
+ year: 'numeric',
352
+ timeZone: this.fuseau,
353
+ }).format(new Date(cible));
354
+ }
355
+ const ecart = cible - this.maintenant();
356
+ const absolu = Math.abs(ecart);
357
+ // Sous dix secondes, « il y a 0 seconde » est plus deroutant qu'utile.
358
+ if (absolu < 10_000)
359
+ return this.libelles().aLInstant;
360
+ const format = new Intl.RelativeTimeFormat(this.locale(), { numeric: 'auto' });
361
+ if (absolu < MINUTE)
362
+ return format.format(Math.round(ecart / 1000), 'second');
363
+ if (absolu < HEURE)
364
+ return format.format(Math.round(ecart / MINUTE), 'minute');
365
+ if (absolu < JOUR)
366
+ return format.format(Math.round(ecart / HEURE), 'hour');
367
+ return format.format(Math.round(ecart / JOUR), 'day');
368
+ }, /* @ts-ignore */
369
+ ...(ngDevMode ? [{ debugName: "texte" }] : /* istanbul ignore next */ []));
370
+ texteAccessible = computed(() => {
371
+ if (!this.estValide())
372
+ return '';
373
+ return new Intl.DateTimeFormat(this.locale(), {
374
+ day: 'numeric',
375
+ month: 'long',
376
+ year: 'numeric',
377
+ hour: '2-digit',
378
+ minute: '2-digit',
379
+ timeZone: this.fuseau,
380
+ }).format(new Date(this.dateEnMillisecondes()));
381
+ }, /* @ts-ignore */
382
+ ...(ngDevMode ? [{ debugName: "texteAccessible" }] : /* istanbul ignore next */ []));
383
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StRelativeTime, deps: [], target: i0.ɵɵFactoryTarget.Component });
384
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: StRelativeTime, isStandalone: true, selector: "st-relative-time", inputs: { valeur: { classPropertyName: "valeur", publicName: "valeur", isSignal: true, isRequired: true, transformFunction: null }, rafraichir: { classPropertyName: "rafraichir", publicName: "rafraichir", isSignal: true, isRequired: false, transformFunction: null }, seuilAbsoluEnJours: { classPropertyName: "seuilAbsoluEnJours", publicName: "seuilAbsoluEnJours", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "st-relative-time" }, ngImport: i0, template: "@if (estValide()) {\n <time [attr.datetime]=\"iso()\" aria-hidden=\"true\">{{ texte() }}</time>\n @if (texteAccessible(); as lu) {\n <!-- Rien quand le format affiche se lit deja : un noeud vide ferait\n croire a un texte de remplacement absent. -->\n <span class=\"st-vh\">{{ lu }}</span>\n }\n}\n", styles: [":host([hidden]){display:none!important}:host{font-size:var(--st-taille-sm);color:var(--st-couleur-texte-discret)}.st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
385
+ }
386
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StRelativeTime, decorators: [{
387
+ type: Component,
388
+ args: [{ selector: 'st-relative-time', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'st-relative-time' }, template: "@if (estValide()) {\n <time [attr.datetime]=\"iso()\" aria-hidden=\"true\">{{ texte() }}</time>\n @if (texteAccessible(); as lu) {\n <!-- Rien quand le format affiche se lit deja : un noeud vide ferait\n croire a un texte de remplacement absent. -->\n <span class=\"st-vh\">{{ lu }}</span>\n }\n}\n", styles: [":host([hidden]){display:none!important}:host{font-size:var(--st-taille-sm);color:var(--st-couleur-texte-discret)}.st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"] }]
389
+ }], ctorParameters: () => [], propDecorators: { valeur: [{ type: i0.Input, args: [{ isSignal: true, alias: "valeur", required: true }] }], rafraichir: [{ type: i0.Input, args: [{ isSignal: true, alias: "rafraichir", required: false }] }], seuilAbsoluEnJours: [{ type: i0.Input, args: [{ isSignal: true, alias: "seuilAbsoluEnJours", required: false }] }] } });
390
+
391
+ /**
392
+ * Nombre dans le flux du texte.
393
+ *
394
+ * Distinct de `st-badge`, qui est une pastille superposee a un autre element.
395
+ *
396
+ * ⚠️ Quand la valeur est abregee (« 1,2 k »), le nom accessible porte le nombre
397
+ * COMPLET : l'abreviation est une commodite visuelle, pas une perte
398
+ * d'information pour qui ecoute la page.
399
+ */
400
+ class StCount {
401
+ locale = inject(ST_LOCALE);
402
+ valeur = input.required(/* @ts-ignore */
403
+ ...(ngDevMode ? [{ debugName: "valeur" }] : /* istanbul ignore next */ []));
404
+ ton = input('neutre', /* @ts-ignore */
405
+ ...(ngDevMode ? [{ debugName: "ton" }] : /* istanbul ignore next */ []));
406
+ /** `null` : jamais d'abreviation. */
407
+ abregerAuDela = input(1000, /* @ts-ignore */
408
+ ...(ngDevMode ? [{ debugName: "abregerAuDela" }] : /* istanbul ignore next */ []));
409
+ estAbrege = computed(() => {
410
+ const seuil = this.abregerAuDela();
411
+ return seuil !== null && Math.abs(this.valeur()) >= seuil;
412
+ }, /* @ts-ignore */
413
+ ...(ngDevMode ? [{ debugName: "estAbrege" }] : /* istanbul ignore next */ []));
414
+ texteComplet = computed(() => new Intl.NumberFormat(this.locale()).format(this.valeur()), /* @ts-ignore */
415
+ ...(ngDevMode ? [{ debugName: "texteComplet" }] : /* istanbul ignore next */ []));
416
+ texte = computed(() => {
417
+ if (!this.estAbrege())
418
+ return this.texteComplet();
419
+ return new Intl.NumberFormat(this.locale(), {
420
+ notation: 'compact',
421
+ maximumFractionDigits: 1,
422
+ }).format(this.valeur());
423
+ }, /* @ts-ignore */
424
+ ...(ngDevMode ? [{ debugName: "texte" }] : /* istanbul ignore next */ []));
425
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StCount, deps: [], target: i0.ɵɵFactoryTarget.Component });
426
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: StCount, isStandalone: true, selector: "st-count", inputs: { valeur: { classPropertyName: "valeur", publicName: "valeur", isSignal: true, isRequired: true, transformFunction: null }, ton: { classPropertyName: "ton", publicName: "ton", isSignal: true, isRequired: false, transformFunction: null }, abregerAuDela: { classPropertyName: "abregerAuDela", publicName: "abregerAuDela", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-ton": "ton()" }, classAttribute: "st-count" }, ngImport: i0, template: "<span aria-hidden=\"true\">{{ texte() }}</span>\n\n@if (estAbrege()) {\n <!-- Abrege a l'ecran, entier a l'oral : \u00AB 1,2 k \u00BB ne se lit pas. -->\n <span class=\"st-vh\">{{ texteComplet() }}</span>\n}\n", styles: [":host([hidden]){display:none!important}:host{font-variant-numeric:tabular-nums;font-weight:var(--st-graisse-moyenne);color:var(--st-couleur-texte);white-space:nowrap}:host([data-ton=discret]){color:var(--st-couleur-texte-discret)}.st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
427
+ }
428
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StCount, decorators: [{
429
+ type: Component,
430
+ args: [{ selector: 'st-count', changeDetection: ChangeDetectionStrategy.OnPush, host: {
431
+ class: 'st-count',
432
+ '[attr.data-ton]': 'ton()',
433
+ }, template: "<span aria-hidden=\"true\">{{ texte() }}</span>\n\n@if (estAbrege()) {\n <!-- Abrege a l'ecran, entier a l'oral : \u00AB 1,2 k \u00BB ne se lit pas. -->\n <span class=\"st-vh\">{{ texteComplet() }}</span>\n}\n", styles: [":host([hidden]){display:none!important}:host{font-variant-numeric:tabular-nums;font-weight:var(--st-graisse-moyenne);color:var(--st-couleur-texte);white-space:nowrap}:host([data-ton=discret]){color:var(--st-couleur-texte-discret)}.st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"] }]
434
+ }], propDecorators: { valeur: [{ type: i0.Input, args: [{ isSignal: true, alias: "valeur", required: true }] }], ton: [{ type: i0.Input, args: [{ isSignal: true, alias: "ton", required: false }] }], abregerAuDela: [{ type: i0.Input, args: [{ isSignal: true, alias: "abregerAuDela", required: false }] }] } });
435
+
436
+ /**
437
+ * ⚠️ Une forme par sens, et non une couleur : un chevron vers le haut, un vers
438
+ * le bas, un point pour ce qui ne bouge pas. Sous contraste force ou a
439
+ * l'impression, il ne reste que la forme et le texte.
440
+ */
441
+ const ICONE_DE_TENDANCE = {
442
+ hausse: 'chevron-haut',
443
+ baisse: 'chevron-bas',
444
+ stable: 'cercle',
445
+ };
446
+ /**
447
+ * Indicateur chiffre : un libelle, une valeur, et sa tendance.
448
+ *
449
+ * ```html
450
+ * <st-stat libelle="Solde disponible" [tendance]="{ sens: 'hausse', texte: '+2,4 % sur un mois', ton: 'succes' }">
451
+ * <st-money [valeur]="solde" />
452
+ * </st-stat>
453
+ * ```
454
+ *
455
+ * La valeur est PROJETEE : c'est `st-money`, `st-count` ou `st-date` qui la
456
+ * formate dans la langue courante, et le socle n'a pas a redire comment.
457
+ *
458
+ * ⚠️ **La tendance se lit par un texte ET une icone, jamais par la couleur
459
+ * seule.** Le texte de l'appelant porte deja le signe ; l'icone porte le sens ;
460
+ * et un mot lisible par lecteur seulement — « en hausse », « en baisse »,
461
+ * « stable » — precede le texte, parce qu'un lecteur d'ecran ne lit pas un
462
+ * chevron.
463
+ *
464
+ * Le libelle vient AVANT la valeur dans le document, comme dans une phrase :
465
+ * « Solde disponible, 1 234,50 € ». A l'ecran, il se pose au-dessus, en petit.
466
+ */
467
+ class StStat {
468
+ libelles = inject(ST_LIBELLES);
469
+ /** Texte visible, deja traduit. */
470
+ libelle = input.required(/* @ts-ignore */
471
+ ...(ngDevMode ? [{ debugName: "libelle" }] : /* istanbul ignore next */ []));
472
+ tendance = input(null, /* @ts-ignore */
473
+ ...(ngDevMode ? [{ debugName: "tendance" }] : /* istanbul ignore next */ []));
474
+ /** Precision sous la valeur : la periode, la source. Jamais une information critique. */
475
+ precision = input(null, /* @ts-ignore */
476
+ ...(ngDevMode ? [{ debugName: "precision" }] : /* istanbul ignore next */ []));
477
+ icone = computed(() => {
478
+ const tendance = this.tendance();
479
+ return tendance === null ? null : ICONE_DE_TENDANCE[tendance.sens];
480
+ }, /* @ts-ignore */
481
+ ...(ngDevMode ? [{ debugName: "icone" }] : /* istanbul ignore next */ []));
482
+ tonDeTendance = computed(() => this.tendance()?.ton ?? 'neutre', /* @ts-ignore */
483
+ ...(ngDevMode ? [{ debugName: "tonDeTendance" }] : /* istanbul ignore next */ []));
484
+ sensLu = computed(() => {
485
+ const tendance = this.tendance();
486
+ if (tendance === null)
487
+ return '';
488
+ const libelles = this.libelles();
489
+ if (tendance.sens === 'hausse')
490
+ return libelles.tendanceEnHausse;
491
+ if (tendance.sens === 'baisse')
492
+ return libelles.tendanceEnBaisse;
493
+ return libelles.tendanceStable;
494
+ }, /* @ts-ignore */
495
+ ...(ngDevMode ? [{ debugName: "sensLu" }] : /* istanbul ignore next */ []));
496
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StStat, deps: [], target: i0.ɵɵFactoryTarget.Component });
497
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: StStat, isStandalone: true, selector: "st-stat", inputs: { libelle: { classPropertyName: "libelle", publicName: "libelle", isSignal: true, isRequired: true, transformFunction: null }, tendance: { classPropertyName: "tendance", publicName: "tendance", isSignal: true, isRequired: false, transformFunction: null }, precision: { classPropertyName: "precision", publicName: "precision", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "st-stat" }, ngImport: i0, template: "<span class=\"st-stat__libelle\">{{ libelle() }}</span>\n<span class=\"st-stat__valeur\"><ng-content /></span>\n@if (tendance(); as tendance) {\n <span class=\"st-stat__tendance\" [attr.data-ton]=\"tonDeTendance()\">\n @if (icone(); as nom) {\n <st-icon [nom]=\"nom\" taille=\"sm\" />\n }\n <span class=\"st-vh\">{{ sensLu() }}, </span>{{ tendance.texte }}\n </span>\n}\n@if (precision(); as texte) {\n <span class=\"st-stat__precision\">{{ texte }}</span>\n}\n", styles: [":host([hidden]){display:none!important}:host{display:flex;flex-direction:column;gap:var(--st-espacement-1);min-inline-size:0}.st-stat__libelle{font-size:var(--st-taille-sm);color:var(--st-couleur-texte-discret)}.st-stat__valeur{font-size:var(--st-taille-2xl);font-weight:var(--st-graisse-semi);line-height:var(--st-interligne-serre);color:var(--st-couleur-texte);overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.st-stat__tendance{display:inline-flex;gap:var(--st-espacement-1);align-items:center;font-size:var(--st-taille-sm);color:var(--st-couleur-texte)}.st-stat__tendance[data-ton=discret]{color:var(--st-couleur-texte-discret)}.st-stat__tendance[data-ton=primaire]{color:var(--st-couleur-primaire)}.st-stat__tendance[data-ton=succes]{color:var(--st-couleur-succes)}.st-stat__tendance[data-ton=avertissement]{color:var(--st-couleur-avertissement)}.st-stat__tendance[data-ton=danger]{color:var(--st-couleur-danger)}.st-stat__precision{font-size:var(--st-taille-xs);color:var(--st-couleur-texte-discret)}.st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "component", type: StIcon, selector: "st-icon", inputs: ["nom", "sprite", "nomMetier", "taille", "ton", "etiquette"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
498
+ }
499
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StStat, decorators: [{
500
+ type: Component,
501
+ args: [{ selector: 'st-stat', changeDetection: ChangeDetectionStrategy.OnPush, imports: [StIcon], host: { class: 'st-stat' }, template: "<span class=\"st-stat__libelle\">{{ libelle() }}</span>\n<span class=\"st-stat__valeur\"><ng-content /></span>\n@if (tendance(); as tendance) {\n <span class=\"st-stat__tendance\" [attr.data-ton]=\"tonDeTendance()\">\n @if (icone(); as nom) {\n <st-icon [nom]=\"nom\" taille=\"sm\" />\n }\n <span class=\"st-vh\">{{ sensLu() }}, </span>{{ tendance.texte }}\n </span>\n}\n@if (precision(); as texte) {\n <span class=\"st-stat__precision\">{{ texte }}</span>\n}\n", styles: [":host([hidden]){display:none!important}:host{display:flex;flex-direction:column;gap:var(--st-espacement-1);min-inline-size:0}.st-stat__libelle{font-size:var(--st-taille-sm);color:var(--st-couleur-texte-discret)}.st-stat__valeur{font-size:var(--st-taille-2xl);font-weight:var(--st-graisse-semi);line-height:var(--st-interligne-serre);color:var(--st-couleur-texte);overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.st-stat__tendance{display:inline-flex;gap:var(--st-espacement-1);align-items:center;font-size:var(--st-taille-sm);color:var(--st-couleur-texte)}.st-stat__tendance[data-ton=discret]{color:var(--st-couleur-texte-discret)}.st-stat__tendance[data-ton=primaire]{color:var(--st-couleur-primaire)}.st-stat__tendance[data-ton=succes]{color:var(--st-couleur-succes)}.st-stat__tendance[data-ton=avertissement]{color:var(--st-couleur-avertissement)}.st-stat__tendance[data-ton=danger]{color:var(--st-couleur-danger)}.st-stat__precision{font-size:var(--st-taille-xs);color:var(--st-couleur-texte-discret)}.st-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}\n"] }]
502
+ }], propDecorators: { libelle: [{ type: i0.Input, args: [{ isSignal: true, alias: "libelle", required: true }] }], tendance: [{ type: i0.Input, args: [{ isSignal: true, alias: "tendance", required: false }] }], precision: [{ type: i0.Input, args: [{ isSignal: true, alias: "precision", required: false }] }] } });
503
+
504
+ /**
505
+ * @starterlib/ui/donnees — les valeurs TYPEES rendues a l'ecran : montant,
506
+ * date, date relative, nombre, valeur masquee, indicateur chiffre.
507
+ *
508
+ * ⚠️ Un point d'entree separe pour une raison de MOMENT, et non de dependance
509
+ * (ADR 0031, decision 2) : ces composants portent chacun un formateur
510
+ * `Intl.*` et leur part des libelles, et la coquille de l'hote n'en peint
511
+ * aucun.
512
+ *
513
+ * ⚠️ `st-code` N'EST PAS ici : il reste au tronc parce que
514
+ * `etats/st-error.ts` l'importe pour afficher un identifiant de trace, et
515
+ * qu'un tronc qui importerait un point d'entree secondaire serait refuse par
516
+ * ng-packagr (dependance circulaire entre points d'entree). La frontiere de
517
+ * rangement cede devant la frontiere de construction.
518
+ *
519
+ * ⚠️ En federation, ce point d'entree se partage SEPAREMENT de
520
+ * `@starterlib/ui` : c'est un specificateur de module distinct.
521
+ *
522
+ * ```ts
523
+ * import { StMoney, StDate } from '@starterlib/ui/donnees';
524
+ * ```
525
+ */
526
+
527
+ /**
528
+ * Generated bundle index. Do not edit.
529
+ */
530
+
531
+ export { StCount, StDate, StMasked, StMoney, StRelativeTime, StStat };
532
+ //# sourceMappingURL=starterlib-ui-donnees.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starterlib-ui-donnees.mjs","sources":["../../../../packages/ui/donnees/src/lib/st-masked.ts","../../../../packages/ui/donnees/src/lib/st-masked.html","../../../../packages/ui/donnees/src/lib/st-money.ts","../../../../packages/ui/donnees/src/lib/st-money.html","../../../../packages/ui/donnees/src/lib/st-date.ts","../../../../packages/ui/donnees/src/lib/st-date.html","../../../../packages/ui/donnees/src/lib/st-relative-time.ts","../../../../packages/ui/donnees/src/lib/st-relative-time.html","../../../../packages/ui/donnees/src/lib/st-count.ts","../../../../packages/ui/donnees/src/lib/st-count.html","../../../../packages/ui/donnees/src/lib/st-stat.ts","../../../../packages/ui/donnees/src/lib/st-stat.html","../../../../packages/ui/donnees/src/public-api.ts","../../../../packages/ui/donnees/src/starterlib-ui-donnees.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, model, input, signal, computed, ChangeDetectionStrategy, Component, ElementRef, Injector, viewChild, afterNextRender } from '@angular/core';
3
3
  import { transformedValue } from '@angular/forms/signals';
4
- import { ContratDeChamp, ST_LIBELLES, ST_LOCALE, fusionnerErreurs, StFormField, StControleDeChamp, StCalendar, motifLocal, exempleDeDate, StIconButton, messageDErreur, StFieldset } from '@starterlib/ui';
4
+ import { ST_LIBELLES, ST_LOCALE, StIconButton } from '@starterlib/ui';
5
+ import { ContratDeChamp, fusionnerErreurs, StFormField, StControleDeChamp, StCalendar, motifLocal, exempleDeDate, messageDErreur, StFieldset } from '@starterlib/ui/saisie';
5
6
  import { lireMontant, decimalesDe, formaterMontant, montant, lireDate, formaterDateSaisie } from '@starterlib/util';
6
7
 
7
8
  /**