@starterlib/tokens 0.10.13 → 0.11.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.
package/README.md CHANGED
@@ -151,6 +151,21 @@ moyenne, calcules sur le fichier livre) : la page ne saute pas quand la police
151
151
  arrive. Recette complete, budget et correspondance avec les planches :
152
152
  [docs/recettes/police.md](../../docs/recettes/police.md).
153
153
 
154
+ ### Police de titre, optionnelle
155
+
156
+ Source Serif 4 (SIL OFL 1.1), dans sa PROPRE feuille : les styles `titre-1` a `titre-4` et
157
+ `affichage` lisent `var(--st-police-titre, var(--st-police-base))`, et seule cette feuille declare le
158
+ jeton. Qui ne la charge pas garde ses titres dans la police de base, sans un octet de plus.
159
+
160
+ ```css
161
+ @import '@starterlib/tokens/styles/polices.css';
162
+ @import '@starterlib/tokens/styles/polices-titres.css';
163
+ ```
164
+
165
+ Meme regime que les autres : `font-display: optional`, repli metrise sur Times New Roman et ses
166
+ clones (`Source Serif 4 Repli`), metriques relues sur le fichier livre par `tools/verifier-police.mjs`.
167
+ Ne pas la PRECHARGER sur un ecran anonyme sous seuil : la recette dit quand et comment.
168
+
154
169
  ## Styles typographiques
155
170
 
156
171
  Des styles composites (taille, interligne, graisse, approche, chiffres ; jamais de
@@ -198,6 +213,8 @@ import { themeClair, themeSombre, rapportDeContraste, apca } from '@starterlib/t
198
213
 
199
214
  - `themeClair` et `themeSombre` : les couleurs semantiques, chacune une `CouleurHex`
200
215
  (`#${string}`) : `primaire: 'bleu'` ne compile pas (lot 158) ; `ombres`, `voile`.
216
+ - `aliasDeRole` : les roles dont la valeur par defaut est celle d'un autre (`erreur` vaut
217
+ `danger`, P08-03) ; la feuille les ecrit `var()` de leur cible, le fichier DTCG en reference.
201
218
  - `primitives`, `definitionsDesPrimitives` : les rampes, ENGENDREES en OKLCH
202
219
  (`oklchVersHex`, `hexVersOklch`), jamais recopiees.
203
220
  - `espacement`, `typographie`, `rayon`, `epaisseur`, `largeur`, `hauteurDeCommande`,
@@ -233,9 +250,86 @@ import jetons from '@starterlib/tokens/styles/starter-tokens.tokens.json' with {
233
250
  | `police` | les piles de polices, en listes | `fontFamily` |
234
251
  | `duree` | les durees du mouvement, en ms | `duration` |
235
252
 
236
- Une couleur s'ecrit en sRGB (`colorSpace`, `components` de 0 a 1) avec son `hex` en repli. Les
237
- ombres, les courbes, les cadences et les derogations (contraste renforce, impression, mouvement
238
- reduit) n'y sont pas : ce sont des regles de la feuille, pas des valeurs a recopier ailleurs.
253
+ Une couleur s'ecrit en sRGB (`colorSpace`, `components` de 0 a 1) avec son `hex` en repli ; un role
254
+ alias (`erreur`, `surErreur`, `erreurDiscret`, `surErreurDiscret`) en reference de sa cible,
255
+ `{couleur.clair.danger}`. Les ombres, les courbes, les cadences et les derogations (contraste
256
+ renforce, impression, mouvement reduit) n'y sont pas : ce sont des regles de la feuille, pas des
257
+ valeurs a recopier ailleurs.
258
+
259
+ ## Niveau 2 bis — marque
260
+
261
+ Une application obtient son identite par des **valeurs**, jamais par une feuille ecrite a la main :
262
+ une marque pose, pour chaque theme, la valeur de roles semantiques (`fond`, `surface`,
263
+ `surfaceEnfoncee`, `surfaceSelection`, `bordure`, `bordureForte`, `bordureForteElevee`, `texte`,
264
+ `texteDiscret`, `primaire`, `accent`, les tons de statut, `positif`, `negatif`... : tout nom de
265
+ `JetonsDeCouleur`). Le moteur rejoue sur le theme qui en resulte TOUTES les gardes de la feuille par
266
+ defaut, dans les deux themes : paires de contraste (4,5:1 texte, 3:1 non textuel) au rendu normal et
267
+ sous contraste renforce, focus a deux voies sur chaque surface, ecarts de surface perceptibles,
268
+ jetons exemptes perceptibles. Conforme, il engendre `starter-tokens-<nom>.css`, a charger **apres**
269
+ `starter-tokens.css` ; sinon il refuse, chaque paire fautive nommee.
270
+
271
+ ```json
272
+ {
273
+ "nom": "ma-marque",
274
+ "clair": {
275
+ "fond": "#ffffff",
276
+ "surface": "#ffffff",
277
+ "bordure": "#e1e6ec",
278
+ "bordureForte": "#7b8794"
279
+ },
280
+ "sombre": { "bordureForte": "#5d6982", "bordureForteElevee": "#7e848b" },
281
+ "exemptions": [
282
+ {
283
+ "ecart": ["surface", "fond"],
284
+ "theme": "clair",
285
+ "raison": "Fond = surface = blanc : une carte posee sur le fond se detache par son filet."
286
+ }
287
+ ]
288
+ }
289
+ ```
290
+
291
+ ```bash
292
+ starter-web jetons --marque marque.json # ecrit dist/<spa>/browser/starter-tokens-ma-marque.css
293
+ ```
294
+
295
+ `starter-web verify` (etape `jetons`) rejoue la marque a chaque verification tant qu'un fichier
296
+ `marque.json`, `marque.ts` ou `marque.mjs` est a la racine de la SPA. En TypeScript :
297
+ `defautsDeLaMarque(valeurs)`, `feuilleDeMarque(valeurs)`, `jetonsDtcgDeMarque(valeurs)` et
298
+ `themeDeMarque(valeurs, theme)` dans `@starterlib/tokens/moteur`.
299
+
300
+ Ce qu'une marque **peut** changer : la valeur des roles, et elle seule. Ce qu'elle **ne peut pas**
301
+ changer : la structure (les noms de jetons), les echelles, les rayons et les hauteurs, qui restent des
302
+ reglages de niveau 3 ou des decisions du socle.
303
+
304
+ - **`bordureForteElevee`**, le contour d'un champ pose sur une surface elevee (dialogue, menu,
305
+ popover, conteneur haut), vaut `bordureForte` s'il n'est pas pose ; il est exige a 3:1 sur la
306
+ surface elevee, le conteneur haut et la surface. La feuille de marque fait lire ce role par
307
+ `st-dialog-container`, `st-dialog-content`, `st-menu` et `st-popover` ; sans marque, rien ne change
308
+ (la feuille par defaut ne le declare pas).
309
+ - **`erreur`** (P08-03), avec `surErreur`, `erreurDiscret` et `surErreurDiscret` : la couleur d'une
310
+ faute ou d'un echec (champ invalide, recapitulatif, refus, envoi echoue), distincte de `danger`
311
+ (destruction, urgence). Sans valeur, ils valent ceux de `danger` (dans la marque aussi : une
312
+ marque qui pose `danger` peint l'erreur de son danger) ; poses, ils sont declares et tenus aux
313
+ memes paires que le danger, AA dans les deux themes. La marque d'exemple pose l'erreur a
314
+ l'encre du texte sur papier gris : une faute sans rouge. Recensement des usages et migration :
315
+ [`docs/recettes/erreur-et-danger.md`](../../docs/recettes/erreur-et-danger.md).
316
+ - **`essai`** (P08-04), avec `surEssai`, `essaiDiscret` et `surEssaiDiscret` : l'environnement
317
+ d'essai (donnees fictives), sur la famille violette (`primitives.violet`, teinte 294, chroma
318
+ 0,11 : pas 600 en clair, 300 en sombre, papier 50 et 900). Une marque le pose a sa valeur ; ses
319
+ paires sont celles d'un statut. Aucun composant ne le prend sans demande (recette
320
+ [`docs/recettes/environnement-d-essai.md`](../../docs/recettes/environnement-d-essai.md)).
321
+ - **Exemption** : un ecart de surface sous son seuil (la liste `ecartsDeMarque`, qui ajoute la
322
+ surface sur le fond aux ecarts du socle) s'assume par une raison ecrite (40 caracteres au moins),
323
+ pour un theme ou les deux ; le filet (`bordure`) doit alors etre perceptible sur l'une des deux
324
+ surfaces au moins.
325
+ - **Paires** : une marque peut en exiger de plus (`paires`) et en exclure (`pairesExclues`, raison
326
+ ecrite), a condition que l'exclusion echoue vraiment dans un theme.
327
+ - **Contraste renforce, contraste force, impression** : la feuille de marque reporte les alias du
328
+ socle resolus dans la marque, les couleurs systeme des roles poses, et les derogations d'impression
329
+ (une encre ne fait que foncer).
330
+
331
+ Exemple du socle : `styles/starter-tokens-exemple-blanc.css` (et `exemple-blanc.tokens.json`), fond
332
+ blanc et gris froids, erreur a l'encre du texte, que le banc applique par son reglage « Marque ».
239
333
 
240
334
  ## Niveau 3 — reglages de composant
241
335
 
@@ -291,6 +385,34 @@ verifiees ne garantissent plus rien.
291
385
  ⚠️ **Un reglage ne descend pas sous un plancher d'accessibilite.** Un jour de
292
386
  calendrier reste au-dessus de la cible minimale, quoi qu'on pose.
293
387
 
388
+ ### Reglage d'affichage : `--st-prefixe-de-ton`
389
+
390
+ `masque` (defaut) ou `visible` (P08-03). Le prefixe qui dit le ton d'un message EN MOTS
391
+ (« Erreur : », « Avertissement : ») est toujours lu par les lecteurs d'ecran ; sous `visible`, il
392
+ s'affiche aussi devant le message d'un champ (`st-inline-message`), d'une banniere (`st-banner`)
393
+ et devant chaque ligne du recapitulatif d'erreurs (`st-error-summary`, a la place de la puce) :
394
+ une faute se lit au mot, sans la couleur.
395
+
396
+ ```css
397
+ /* Toute l'application */
398
+ :root {
399
+ --st-prefixe-de-ton: visible;
400
+ }
401
+
402
+ /* Ou le remettre a masque sur une zone (une alerte critique qui porte son propre mot) */
403
+ .alerte-critique {
404
+ --st-prefixe-de-ton: masque;
405
+ }
406
+ ```
407
+
408
+ Comme les reglages ci-dessus, le socle ne le declare jamais. Il ne le lit pas par `var()` : des
409
+ requetes de style, `@container style(--st-prefixe-de-ton: visible)` (feuille des jetons pour la
410
+ classe `.st-prefixe-de-ton`, feuille du recapitulatif pour ses lignes), rendent le prefixe visible la
411
+ ou le reglage s'herite, aussitot pose, sans script. C'est pourquoi il n'est
412
+ pas au catalogue `jetonsDeComposant` (des valeurs lues avec un repli, plafonnees par D8). Requete
413
+ de style : Chrome 111, Safari 18, Firefox 151 (Baseline depuis mai 2026) ; en deca, au plancher du
414
+ socle (Safari 17.5, Firefox 129 a 150), le prefixe reste masque, et lu.
415
+
294
416
  ## Garde de non-derive
295
417
 
296
418
  Le CSS est **engendre**, jamais ecrit a la main — la feuille, les partiels des