@zevra/ui 0.34.0 → 0.36.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 (104) hide show
  1. package/DECISIONS.md +293 -203
  2. package/README.md +21 -21
  3. package/demo/app.html +6 -6
  4. package/demo/index.html +3 -3
  5. package/dist/actions.d.ts +8 -8
  6. package/dist/actions.d.ts.map +1 -1
  7. package/dist/actions.js +1 -1
  8. package/dist/actions.js.map +1 -1
  9. package/dist/catalogue.d.ts +2 -2
  10. package/dist/catalogue.js +67 -67
  11. package/dist/catalogue.js.map +1 -1
  12. package/dist/content.d.ts +23 -23
  13. package/dist/content.d.ts.map +1 -1
  14. package/dist/content.js +16 -16
  15. package/dist/content.js.map +1 -1
  16. package/dist/css-inline.d.ts +1 -1
  17. package/dist/css-inline.d.ts.map +1 -1
  18. package/dist/css-inline.js +4 -4
  19. package/dist/css-inline.js.map +1 -1
  20. package/dist/data-table.d.ts +1 -1
  21. package/dist/data.d.ts +7 -7
  22. package/dist/data.js +5 -5
  23. package/dist/email-tokens.js +1 -1
  24. package/dist/email.d.ts +6 -6
  25. package/dist/email.js +8 -8
  26. package/dist/email.js.map +1 -1
  27. package/dist/feedback.d.ts +10 -10
  28. package/dist/feedback.d.ts.map +1 -1
  29. package/dist/feedback.js +3 -3
  30. package/dist/forms.d.ts +12 -12
  31. package/dist/forms.js +5 -5
  32. package/dist/glyph-data.d.ts +2 -2
  33. package/dist/glyph-data.js +3 -3
  34. package/dist/glyph-urls.js +1 -1
  35. package/dist/glyphes.d.ts +2 -2
  36. package/dist/glyphes.js +4 -4
  37. package/dist/icon-data.d.ts +1 -1
  38. package/dist/icon-data.js +2 -2
  39. package/dist/icon.d.ts +5 -5
  40. package/dist/icon.js +1 -1
  41. package/dist/index.js +4 -4
  42. package/dist/layout.d.ts +21 -21
  43. package/dist/layout.d.ts.map +1 -1
  44. package/dist/layout.js +15 -15
  45. package/dist/layout.js.map +1 -1
  46. package/dist/navigation.d.ts +16 -16
  47. package/dist/navigation.d.ts.map +1 -1
  48. package/dist/navigation.js +9 -9
  49. package/dist/navigation.js.map +1 -1
  50. package/dist/overlays.d.ts +6 -6
  51. package/dist/overlays.d.ts.map +1 -1
  52. package/dist/overlays.js +5 -5
  53. package/dist/select-menu.d.ts +1 -1
  54. package/dist/select-menu.js +2 -2
  55. package/dist/surfaces.d.ts +8 -8
  56. package/dist/surfaces.d.ts.map +1 -1
  57. package/dist/surfaces.js +6 -6
  58. package/dist/surfaces.js.map +1 -1
  59. package/dist/typography.d.ts +4 -4
  60. package/dist/typography.d.ts.map +1 -1
  61. package/dist/typography.js +3 -3
  62. package/dist/typography.js.map +1 -1
  63. package/icons/index.json +1 -1
  64. package/package.json +2 -2
  65. package/react/actions.tsx +9 -9
  66. package/react/catalogue.tsx +68 -68
  67. package/react/content.tsx +28 -28
  68. package/react/css-inline.ts +4 -4
  69. package/react/data-table.tsx +3 -3
  70. package/react/data.tsx +9 -9
  71. package/react/email-tokens.ts +1 -1
  72. package/react/email.ts +10 -10
  73. package/react/feedback.tsx +12 -12
  74. package/react/forms.tsx +15 -15
  75. package/react/glyph-data.ts +3 -3
  76. package/react/glyph-urls.ts +1 -1
  77. package/react/glyphes.ts +4 -4
  78. package/react/icon-data.ts +2 -2
  79. package/react/icon.tsx +6 -6
  80. package/react/index.ts +4 -4
  81. package/react/layout.tsx +22 -22
  82. package/react/navigation.tsx +18 -18
  83. package/react/overlays.tsx +9 -9
  84. package/react/select-menu.tsx +3 -3
  85. package/react/surfaces.tsx +10 -10
  86. package/react/typography.tsx +6 -6
  87. package/src/base.css +10 -10
  88. package/src/components.css +49 -49
  89. package/src/data.css +41 -41
  90. package/src/feedback.css +55 -55
  91. package/src/fonts.css +2 -2
  92. package/src/forms.css +50 -50
  93. package/src/icons.css +10 -10
  94. package/src/index.css +1 -1
  95. package/src/layout.css +27 -27
  96. package/src/motion.css +16 -16
  97. package/src/motion.js +4 -4
  98. package/src/nav.js +5 -5
  99. package/src/navigation.css +93 -62
  100. package/src/overlays.css +14 -14
  101. package/src/rail.js +6 -6
  102. package/src/surfaces.css +11 -11
  103. package/src/tokens.css +14 -14
  104. package/tokens/index.js +8 -8
package/src/overlays.css CHANGED
@@ -1,11 +1,11 @@
1
- /* Zevra UI — enrobages : voile, tiroir, modale, notification
1
+ /* Zevra UI, enrobages : voile, tiroir, modale, notification
2
2
  * Dépend de tokens.css et base.css.
3
3
  *
4
4
  * Ce module est COMMUN aux deux couches. Une page vitrine a besoin d'un
5
5
  * tiroir pour son menu mobile ; une application en a besoin pour sa
6
6
  * navigation. Les laisser dans navigation.css obligeait une landing à
7
7
  * charger la barre latérale, la pagination et les tableaux pour obtenir un
8
- * bouton burger — c'est ce qui a motivé cette séparation.
8
+ * bouton burger : c'est ce qui a motivé cette séparation.
9
9
  *
10
10
  * Tout ce qui vit ici se pose PAR-DESSUS la page et lui vole le regard. D'où
11
11
  * une règle commune : rien ne s'ouvre sans un moyen évident d'en sortir, et
@@ -15,7 +15,7 @@
15
15
  * Empilement, dans l'ordre : voile 60, tiroir 80, modale 90, notification 100.
16
16
  * Les couches inférieures (2, 5, 40, 50) sont dans layout.css.
17
17
  *
18
- * OUVERTURE — deux écritures équivalentes, au choix du gabarit :
18
+ * OUVERTURE, deux écritures équivalentes, au choix du gabarit :
19
19
  *
20
20
  * <div class="zv-drawer" data-open> en HTML, en Astro
21
21
  * <div class="zv-drawer zv-drawer--open"> en React, en Vue
@@ -24,14 +24,14 @@
24
24
  * attribut booléen y demande `{...(ouvert ? {'data-open': ''} : {})}`, là où
25
25
  * une classe conditionnelle est le geste habituel. Ne PAS employer
26
26
  * `data-open={ouvert}` en React : il rend `data-open="false"`, que le
27
- * sélecteur d'attribut considère comme présent — le panneau resterait
27
+ * sélecteur d'attribut considère comme présent, le panneau resterait
28
28
  * ouvert.
29
29
  */
30
30
 
31
31
  /* ─── Voile ─────────────────────────────────────────────────────────────
32
32
  * Toujours l'encre de charte diluée, jamais un noir pur : la page est
33
33
  * bleutée, un gris neutre y ferait un trou sale. Le voile n'existe que sous
34
- * le seuil (cf. bloc mobile) — au-dessus, tiroir et feuille sont des colonnes,
34
+ * le seuil (cf. bloc mobile) : au-dessus, tiroir et feuille sont des colonnes,
35
35
  * elles n'occultent rien. */
36
36
 
37
37
  .zv-scrim {
@@ -45,7 +45,7 @@
45
45
  /* ─── Tiroir de navigation ──────────────────────────────────────────────*/
46
46
 
47
47
  /* Tiroir ou modale ouverts : la page derrière ne défile plus. `:has()` est
48
- * le seul chemin CSS pour verrouiller le body depuis un état descendant —
48
+ * le seul chemin CSS pour verrouiller le body depuis un état descendant :
49
49
  * sans lui, la molette fait défiler le fond sous le voile et le panneau
50
50
  * semble dériver. */
51
51
  html:has(.zv-drawer[data-open]),
@@ -78,7 +78,7 @@ html:has(.zv-modal--open) {
78
78
  * Et il redescend au sol : son z-index de 60 est la couche qu'il occupe
79
79
  * quand il est SEUL sur la page. À l'intérieur d'un enrobage, qui ouvre son
80
80
  * propre contexte d'empilement, ce 60 l'emportait sur le panneau et voilait
81
- * le tiroir par-dessus — il paraissait délavé, derrière son propre écran. */
81
+ * le tiroir par-dessus : il paraissait délavé, derrière son propre écran. */
82
82
  .zv-drawer .zv-scrim {
83
83
  z-index: 0;
84
84
  opacity: 0;
@@ -123,12 +123,12 @@ html:has(.zv-modal--open) {
123
123
  }
124
124
 
125
125
  /* ⚠️ TENSION ASSUMÉE, à arbitrer. Les deux courbes ci-dessus sont celles du
126
- * relevé — voile en cubic-bezier(.4,0,.2,1), panneau en ease-out, même durée.
126
+ * relevé : voile en cubic-bezier(.4,0,.2,1), panneau en ease-out, même durée.
127
127
  * Leur asymétrie ne se voit pas, elle s'entend : le panneau arrive avant que
128
128
  * le voile ait fini de se poser. Elles ne sont donc PAS la courbe unique
129
129
  * --zv-easing que motion.css impose à la vitrine. Défendable (motion.css régit
130
130
  * neuf animations de page, pas le chrome applicatif), mais c'est une divergence
131
- * écrite ici plutôt qu'une variable empruntée en silence — d'autant que ce
131
+ * écrite ici plutôt qu'une variable empruntée en silence : d'autant que ce
132
132
  * module doit rester utilisable sans motion.css.
133
133
  * La coupure prefers-reduced-motion est déjà globale dans base.css : ne pas la
134
134
  * reposer ici, elle neutralise ces deux transitions comme les autres. */
@@ -146,7 +146,7 @@ html:has(.zv-modal--open) {
146
146
  * · à l'ouverture, `body { overflow: hidden }` RESTAURÉ à sa valeur
147
147
  * précédente à la fermeture, jamais remis à '' aveuglément : c'est ce qui
148
148
  * évite de casser une page qui gérait déjà son propre défilement ;
149
- * · l'état ouvert mémorise la ROUTE d'ouverture, pas un booléen — changer de
149
+ * · l'état ouvert mémorise la ROUTE d'ouverture, pas un booléen, changer de
150
150
  * page referme alors le tiroir sans effet ni rendu en cascade. Le
151
151
  * composant a donc besoin de la route courante, pas d'une prop `open`.
152
152
  * ⚠️ MANQUE en production, à combler côté composant : piège de focus dans le
@@ -154,7 +154,7 @@ html:has(.zv-modal--open) {
154
154
 
155
155
 
156
156
  /* ─── Modale ────────────────────────────────────────────────────────────
157
- * ⚠️ HORS RELEVÉ. Aucune modale dans les sources de Mémoire — l'application
157
+ * ⚠️ HORS RELEVÉ. Aucune modale dans les sources de Mémoire : l'application
158
158
  * n'en emploie pas. Celle-ci est DÉRIVÉE de la carte et du tiroir, sans
159
159
  * introduire une seule valeur nouvelle : elle réemploie --r-card,
160
160
  * --shadow-panel et le voile ci-dessus.
@@ -187,7 +187,7 @@ html:has(.zv-modal--open) {
187
187
  *
188
188
  * .zv-scrim est masqué par défaut et ne s'affiche que sous le seuil : c'est
189
189
  * juste pour le tiroir, qui n'existe qu'en mobile. La modale, elle, existe
190
- * partout — sans cette règle, elle s'ouvrait en desktop sans rien occulter.
190
+ * partout : sans cette règle, elle s'ouvrait en desktop sans rien occulter.
191
191
  * Le z-index revient à 0 pour la même raison que sur le tiroir. */
192
192
  .zv-modal .zv-scrim {
193
193
  z-index: 0;
@@ -250,7 +250,7 @@ html:has(.zv-modal--open) {
250
250
  }
251
251
 
252
252
  /* Modale destructive : le filet haut porte l'avertissement, pas un fond
253
- * rouge — une surface d'alerte pleine rendrait le texte pénible à lire. */
253
+ * rouge, une surface d'alerte pleine rendrait le texte pénible à lire. */
254
254
  .zv-modal--danger .zv-modal__panel {
255
255
  border-top: 3px solid var(--err);
256
256
  }
@@ -262,7 +262,7 @@ html:has(.zv-modal--open) {
262
262
  *
263
263
  * Elle ne remplace PAS .zv-alert : une erreur de formulaire se dit à côté du
264
264
  * champ, jamais dans un coin qui disparaît. Réserver ce composant à ce qui
265
- * est vrai après coup — « copié », « enregistré », « envoyé ». */
265
+ * est vrai après coup : « copié », « enregistré », « envoyé ». */
266
266
 
267
267
  .zv-toasts {
268
268
  position: fixed;
package/src/rail.js CHANGED
@@ -1,8 +1,8 @@
1
- /* Zevra UI — rail.js : le rail de lecture suit la section en cours.
1
+ /* Zevra UI, rail.js : le rail de lecture suit la section en cours.
2
2
  *
3
3
  * Rôle exact, et rien d'autre : poser `.zv-rail__item--on` et
4
4
  * `aria-current` sur l'entrée dont la section est à l'écran. La navigation
5
- * elle-même est du HTML — chaque entrée est une ancre, et elle fonctionne
5
+ * elle-même est du HTML : chaque entrée est une ancre, et elle fonctionne
6
6
  * sans ce module.
7
7
  *
8
8
  * Le contrat, en un attribut :
@@ -12,25 +12,25 @@
12
12
  * Rien à déclarer d'autre : l'ordre des entrées, leurs cibles et leur
13
13
  * nombre se lisent dans le balisage. Un rail dont une ancre ne résout pas
14
14
  * garde l'entrée cliquable et l'ignore au suivi, plutôt que de décaler
15
- * tout le reste — c'est le décalage silencieux qui coûte cher.
15
+ * tout le reste : c'est le décalage silencieux qui coûte cher.
16
16
  *
17
17
  * ─── Pourquoi pas un IntersectionObserver ───────────────────────────────
18
18
  * Parce que les ancres d'un rail sont souvent des points MATÉRIELS de 1px
19
19
  * posés en tête de section. Réduit à sa bande centrale, l'observateur ne
20
- * les voit traverser que pendant quelques images — un défilement rapide
20
+ * les voit traverser que pendant quelques images : un défilement rapide
21
21
  * saute la bande entière et l'entrée ne s'allume jamais. On lit donc la
22
22
  * position : l'entrée courante est la DERNIÈRE dont l'ancre a passé la
23
23
  * ligne de lecture. C'est déterministe, quelle que soit la vitesse.
24
24
  *
25
25
  * S'importe une fois par page : `import '@zevra/ui/rail.js'`. Sans lui, le
26
- * rail navigue mais ne suit pas — dégradation douce, pas de page cassée.
26
+ * rail navigue mais ne suit pas : dégradation douce, pas de page cassée.
27
27
  */
28
28
  (() => {
29
29
  if (typeof document === 'undefined') return
30
30
  /* ⚠️ Le drapeau d'armement ne doit JAMAIS reprendre le nom de l'attribut
31
31
  * qui désigne un rail. Il s'appelait `data-zv-rail`, comme le composant :
32
32
  * posé sur <html>, il faisait de la PAGE ENTIÈRE un rail. Sur une page
33
- * sans rail — la seule où ça se voit —, `a[href^="#"]` ramassait alors
33
+ * sans rail, la seule où ça se voit, `a[href^="#"]` ramassait alors
34
34
  * tous les liens d'ancre, boutons compris, et le premier d'entre eux
35
35
  * recevait `.zv-rail__item--on` : un appel à l'action en indigo sur fond
36
36
  * indigo, illisible. Constaté sur /bootcamp. */
package/src/surfaces.css CHANGED
@@ -1,4 +1,4 @@
1
- /* Zevra UI — surfaces : halos, sols quadrillés, voiles, bandeau manifeste —
1
+ /* Zevra UI (surfaces : halos, sols quadrillés, voiles, bandeau manifeste)
2
2
  * et, depuis le 25/08/2026 (hors relevé, voir DECISIONS.md), les formats
3
3
  * sociaux. Dépend de tokens.css. Indépendant des autres modules.
4
4
  *
@@ -7,7 +7,7 @@
7
7
  * en absolu derrière le contenu, ne captent jamais le pointeur, et n'ont
8
8
  * pas à être lues par un lecteur d'écran (les poser en aria-hidden) ; elles
9
9
  * supposent un parent `position: relative; overflow: hidden`.
10
- * ⚠️ Les formats sociaux, eux, sont du CONTENU — une planche d'export qui
10
+ * ⚠️ Les formats sociaux, eux, sont du CONTENU, une planche d'export qui
11
11
  * porte un texte : jamais d'aria-hidden sur eux.
12
12
  */
13
13
 
@@ -138,7 +138,7 @@
138
138
  z-index: 1;
139
139
  }
140
140
 
141
- /* L'emphase de base.css pose --ink sur les strong de zv-body/zv-lead — sur
141
+ /* L'emphase de base.css pose --ink sur les strong de zv-body/zv-lead : sur
142
142
  * le navy du manifeste, cette encre disparaît dans le fond. Dans la bande,
143
143
  * l'emphase hérite de la couleur ambiante (blanc), et seule la graisse la
144
144
  * distingue. */
@@ -184,14 +184,14 @@
184
184
  * h1 y devenait carrément invisible.
185
185
  *
186
186
  * La règle ne visait que `.zv-band` et deux classes. Les autres surfaces
187
- * sombres du système — le panneau navy, l'enveloppe .zv-text-on-dark, la
188
- * planche sociale — n'étaient pas couvertes, et les trois autres paliers de
187
+ * sombres du système (le panneau navy, l'enveloppe .zv-text-on-dark, la
188
+ * planche sociale) n'étaient pas couvertes, et les trois autres paliers de
189
189
  * texte non plus. Corrigé le 27/08/2026 : une seule liste, toutes les
190
190
  * surfaces, tous les paliers.
191
191
  *
192
192
  * Ce qui reste EXPLICITE et ne s'adapte pas tout seul : les labels mono
193
193
  * (`Mono ton="on-dark"`) et la mise en valeur (`Em surSombre`). Ceux-là
194
- * changent de RÔLE sur fond sombre, pas seulement de clarté — c'est une
194
+ * changent de RÔLE sur fond sombre, pas seulement de clarté : c'est une
195
195
  * décision de rédaction, elle se pose à la main. */
196
196
  :is(.zv-band, .zv-panel-navy, .zv-text-on-dark, .zv-social--manifeste)
197
197
  :is(.zv-body, .zv-lead, .zv-rule, .zv-note),
@@ -215,7 +215,7 @@
215
215
  }
216
216
 
217
217
  /* ─── Glyphes ───────────────────────────────────────────────────────────
218
- * Les glyphes produit se posent toujours avec leur ombre portée — c'est
218
+ * Les glyphes produit se posent toujours avec leur ombre portée : c'est
219
219
  * elle qui les décolle du papier. Jamais de recoloration ni d'inclinaison. */
220
220
 
221
221
  .zv-glyph {
@@ -241,14 +241,14 @@
241
241
 
242
242
  /* ─── Formats sociaux ───────────────────────────────────────────────────
243
243
  * HORS RELEVÉ (25/08/2026, voir DECISIONS.md). Trois planches d'EXPORT aux
244
- * dimensions des réseaux — paysage 1200×630 (OpenGraph, lien LinkedIn),
244
+ * dimensions des réseaux : paysage 1200×630 (OpenGraph, lien LinkedIn),
245
245
  * carré 1080×1080 (post), story 1080×1920. FIGÉES en pixels, hors du point
246
246
  * de rupture : ce sont des planches qu'on CAPTURE, pas des pages qu'on
247
- * publie en HTML — la seule dérogation du paquet à l'interdit des largeurs
247
+ * publie en HTML, la seule dérogation du paquet à l'interdit des largeurs
248
248
  * fixes, et elle est là pour ça.
249
249
  *
250
- * Elles composent les pièces existantes — bande par --manifeste, halo, sol,
251
- * kicker, display — et portent un pied wordmark + adresse. La règle
250
+ * Elles composent les pièces existantes (bande par --manifeste, halo, sol,
251
+ * kicker, display) et portent un pied wordmark + adresse. La règle
252
252
  * « jamais de faux contenu » s'y applique au premier chef : un visuel
253
253
  * social EST une publication. */
254
254
 
package/src/tokens.css CHANGED
@@ -1,4 +1,4 @@
1
- /* Zevra — Design tokens « Encre & Papier »
1
+ /* Zevra, Design tokens « Encre & Papier »
2
2
  * Source : passation DA du 23/08/2026 (canvas Claude Design « Zevra DA Encre
3
3
  * et Papier »). Ce fichier est la SOURCE DE VÉRITÉ des valeurs de marque :
4
4
  * toute app doit lire ces variables plutôt que recopier un hexadécimal.
@@ -11,7 +11,7 @@
11
11
  :root {
12
12
  /* Largeur de page. Le relevé de la passation a été fait sur une trame de
13
13
  * 1440 : au-delà, les enveloppes (zv-gutter et variantes) se centrent au
14
- * lieu de s'étirer — un hero qui colle au bord gauche d'un écran de
14
+ * lieu de s'étirer, un hero qui colle au bord gauche d'un écran de
15
15
  * 2 560 px ne raconte plus une page, il raconte un débordement. */
16
16
  --page-max: 1440px;
17
17
 
@@ -19,7 +19,7 @@
19
19
  --ink: #0b1020;
20
20
  /* Niveau intermédiaire, entre l'encre et le gris : titre de colonne,
21
21
  * valeur de cellule, segment de fil d'Ariane. L'interface applicative en a
22
- * besoin, la vitrine non — d'où son absence des premières planches.
22
+ * besoin, la vitrine non : d'où son absence des premières planches.
23
23
  * Contraste 7,05 sur papier : conforme AA sur texte normal. */
24
24
  --ink-2: #4a5468;
25
25
  --muted: #5a637a;
@@ -46,11 +46,11 @@
46
46
  --lavande: #b8a8f8;
47
47
  --spectre: linear-gradient(90deg, #8a3af8, #2f6ef8 55%, #14c2f8);
48
48
 
49
- /* Fond sombre (bande manifeste) — dégradé type logo */
49
+ /* Fond sombre (bande manifeste) : dégradé type logo */
50
50
  --manifeste: linear-gradient(135deg, #06063a 0%, #0b0b5e 28%, #1e1b8c 55%, #3d36d6 80%, #2080f0 100%);
51
51
  --accent-on-dark: #a5b4fc;
52
52
 
53
- /* États — trois familles symétriques : le ton plein (texte, icône), le
53
+ /* États, trois familles symétriques : le ton plein (texte, icône), le
54
54
  * fond atténué (bandeau d'alerte) et le filet (bordure de carte).
55
55
  * Relevés dans l'application Mémoire, où ils servent déjà en production. */
56
56
  --ok: #1c6b4a;
@@ -61,19 +61,19 @@
61
61
  --warn-line: #ebdcb4;
62
62
  /* L'ambre plein est trop clair pour du texte sur fond atténué : il lui
63
63
  * faut une déclinaison sombre. --ok et --err, eux, sont déjà assez
64
- * contrastés pour servir de couleur de texte — d'où l'asymétrie. */
64
+ * contrastés pour servir de couleur de texte : d'où l'asymétrie. */
65
65
  --warn-ink: #8a6d1e;
66
66
  --err: #b5202c;
67
67
  --err-soft: #fdece9;
68
68
  --err-line: #efc9cd;
69
69
 
70
- /* Typo — Google Fonts : Outfit (display), Public Sans (texte), Space Grotesk (labels) */
70
+ /* Typo, Google Fonts : Outfit (display), Public Sans (texte), Space Grotesk (labels) */
71
71
  --font-display: "Outfit", "Helvetica Neue", Arial, sans-serif; /* titres 200-400 */
72
72
  --font-text: "Public Sans", "Helvetica Neue", Arial, sans-serif; /* 400/600 */
73
73
  --font-mono: "Space Grotesk", "Menlo", monospace; /* labels caps, 0.18-0.2em */
74
74
  /* Chasse fixe RÉELLE, pour le code seulement. --font-mono (Space Grotesk)
75
75
  * est proportionnelle : elle porte le REGISTRE des labels, pas
76
- * l'alignement — du code exige la chasse fixe entière, que tabular-nums
76
+ * l'alignement, du code exige la chasse fixe entière, que tabular-nums
77
77
  * ne donne qu'aux chiffres. Pile système, aucune fonte chargée.
78
78
  * HORS RELEVÉ (25/08/2026), voir DECISIONS.md « Bloc de code ». */
79
79
  --font-code: ui-monospace, "SF Mono", "Menlo", "Consolas", monospace;
@@ -86,22 +86,22 @@
86
86
  --lead: 18px;
87
87
  --body: 15px;
88
88
 
89
- /* Rayons — ARBITRÉS À ZÉRO le 25/08/2026.
89
+ /* Rayons : ARBITRÉS À ZÉRO le 25/08/2026.
90
90
  *
91
91
  * La DA a tranché sur pièces : « très carré, ça fait pro et inspire
92
92
  * confiance » ; le rond disait « flexible, jovial », qui n'est pas ce que
93
93
  * vend Zevra. Le relevé donnait 5/3/10/16px, hérités d'un état antérieur
94
- * de la charte — et déjà contredits sur place, puisque les champs de
94
+ * de la charte : et déjà contredits sur place, puisque les champs de
95
95
  * saisie, les étiquettes et les pastilles d'initiales étaient à angle vif
96
96
  * depuis le premier jour. Les quatre tokens s'alignent sur eux.
97
97
  *
98
98
  * ⚠️ Les tokens RESTENT, à zéro : ils nomment quatre intentions
99
99
  * distinctes (action, pastille, panneau flottant, carte). Le jour où la DA
100
- * veut rendre de la rondeur à l'une d'elles, c'est une ligne ici — pas une
100
+ * veut rendre de la rondeur à l'une d'elles, c'est une ligne ici : pas une
101
101
  * chasse aux `border-radius` dans douze fichiers.
102
102
  *
103
103
  * ⚠️ Ce qui n'est PAS concerné : le rond de forme, qui porte du sens et
104
- * non du style — pastille d'état, bouton d'interrupteur, radio, halo. Ils
104
+ * non du style, pastille d'état, bouton d'interrupteur, radio, halo. Ils
105
105
  * écrivent leur `border-radius` en clair, sans passer par un token. */
106
106
  --r-btn: 0;
107
107
  --r-pill: 0;
@@ -130,7 +130,7 @@
130
130
  --app: 13px; /* texte courant : cellule, carte, champ de saisie */
131
131
  --app-sm: 12px; /* mention secondaire : statut, aide, note de contexte */
132
132
 
133
- /* Titres applicatifs — au-dessus, --card-title (24px) fait le titre de page */
133
+ /* Titres applicatifs : au-dessus, --card-title (24px) fait le titre de page */
134
134
  --app-h2: 20px; /* titre de fiche, d'état vide, d'interstice */
135
135
  --app-h3: 16px; /* titre de panneau latéral, de feuille de source */
136
136
 
@@ -143,7 +143,7 @@
143
143
  --tap: 40px; /* cible tactile minimale, sous le point de rupture */
144
144
  --topbar-h: 52px; /* hauteur de la barre supérieure applicative */
145
145
 
146
- /* Ombre de menu déroulant — la seule surface qui flotte au-dessus du
146
+ /* Ombre de menu déroulant : la seule surface qui flotte au-dessus du
147
147
  * contenu sans être une carte ; ni --shadow-card ni --shadow-panel ne
148
148
  * conviennent, l'une est trop plate, l'autre trop théâtrale. */
149
149
  --shadow-menu: 0 8px 24px rgba(11, 16, 32, 0.1);
package/tokens/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Zevra — tokens de la DA « Encre & Papier », en JavaScript.
2
+ * Zevra : tokens de la DA « Encre & Papier », en JavaScript.
3
3
  *
4
4
  * ⚠️ MIROIR de src/tokens.css, pas une seconde source. Le CSS fait foi pour
5
5
  * tout ce qui s'affiche ; cet export existe pour les usages où l'on ne peut
@@ -22,13 +22,13 @@ export const couleurs = {
22
22
  panel: '#fbfcfe',
23
23
  white: '#ffffff',
24
24
 
25
- // Indigo — l'action
25
+ // Indigo : l'action
26
26
  accentDeep: '#1e1b8c',
27
27
  accent: '#2a2aa8',
28
28
  accentLine: '#c9d6f5',
29
29
  accentSoft: '#eaf1ff',
30
30
 
31
- // Spectre produit — usage restreint (filets, progression, points)
31
+ // Spectre produit : usage restreint (filets, progression, points)
32
32
  violet: '#8a3af8',
33
33
  iris: '#5848f8',
34
34
  bleu: '#2f6ef8',
@@ -49,7 +49,7 @@ export const couleurs = {
49
49
  err: '#b5202c',
50
50
  errSoft: '#fdece9',
51
51
  errLine: '#efc9cd',
52
- // Couleurs de format de fichier — hors charte, voir tokens.css.
52
+ // Couleurs de format de fichier : hors charte, voir tokens.css.
53
53
  fmtPdf: '#c4362b',
54
54
  fmtDocx: '#2a5ba8',
55
55
  }
@@ -72,7 +72,7 @@ export const polices = {
72
72
  display: '"Outfit", "Helvetica Neue", Arial, sans-serif',
73
73
  texte: '"Public Sans", "Helvetica Neue", Arial, sans-serif',
74
74
  mono: '"Space Grotesk", "Menlo", monospace',
75
- // Chasse fixe réelle, pour le code seulement — voir tokens.css.
75
+ // Chasse fixe réelle, pour le code seulement : voir tokens.css.
76
76
  code: 'ui-monospace, "SF Mono", "Menlo", "Consolas", monospace',
77
77
  }
78
78
 
@@ -83,7 +83,7 @@ export const tailles = {
83
83
  cardTitle: '24px',
84
84
  lead: '18px',
85
85
  body: '15px',
86
- // Échelle applicative — plus serrée que la vitrine, voir tokens.css.
86
+ // Échelle applicative : plus serrée que la vitrine, voir tokens.css.
87
87
  appLg: '14px',
88
88
  app: '13px',
89
89
  appSm: '12px',
@@ -103,11 +103,11 @@ export const mesures = {
103
103
  pageMax: '1440px',
104
104
  }
105
105
 
106
- /** Rayons — À ZÉRO depuis l'arbitrage DA du 25/08/2026 (« très carré, ça
106
+ /** Rayons : À ZÉRO depuis l'arbitrage DA du 25/08/2026 (« très carré, ça
107
107
  * fait pro et inspire confiance »). Les quatre clés restent : elles nomment
108
108
  * quatre intentions distinctes, et rendre de la rondeur à l'une d'elles
109
109
  * doit rester une ligne à changer, pas une chasse dans douze fichiers.
110
- * Le rond de FORME — pastille d'état, bouton d'interrupteur, radio, halo —
110
+ * Le rond de FORME (pastille d'état, bouton d'interrupteur, radio, halo)
111
111
  * ne passe pas par ici : il porte du sens, pas du style. */
112
112
  export const rayons = {
113
113
  btn: '0',