@zevra/ui 0.35.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 +264 -208
  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 +62 -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/data.css CHANGED
@@ -1,17 +1,17 @@
1
- /* Zevra UI — données : tableaux, listes, cellules, métadonnées, citations
1
+ /* Zevra UI (données : tableaux, listes, cellules, métadonnées, citations
2
2
  *
3
3
  * CE QUE PORTE LE MODULE
4
4
  * le cadre de tableau et sa grille (.zv-table, .zv-table__head, .zv-row),
5
5
  * les trois registres de cellule, le dégroupage mobile (.zv-unwrap), la
6
6
  * liste sans colonnes, la métadonnée mono, le couple clé-valeur, la
7
7
  * pastille d'initiales, les deux utilitaires de troncature, l'étiquette de
8
- * catégorie, la puce de citation et la vignette de format — et, depuis le
8
+ * catégorie, la puce de citation et la vignette de format) et, depuis le
9
9
  * 25/08/2026 (hors relevé, voir DECISIONS.md) : la rangée dépliante, la
10
10
  * touche de clavier et le code, en ligne comme en bloc.
11
11
  *
12
12
  * DÉPENDANCES
13
- * tokens.css — pour les seules variables qui y sont déclarées ;
14
- * base.css — reset (box-sizing), body, et le :focus-visible global, dont
13
+ * tokens.css, pour les seules variables qui y sont déclarées ;
14
+ * base.css, reset (box-sizing), body, et le :focus-visible global, dont
15
15
  * ce module ne redéfinit ni la couleur ni l'épaisseur.
16
16
  * Ni le reset, ni body, ni :root ne sont reposés ici.
17
17
  *
@@ -19,17 +19,17 @@
19
19
  * la pagination (.zv-pager--foot, navigation.css) : le pied de tableau et
20
20
  * le pied de pagination sont LE MÊME nœud dans la source (un seul
21
21
  * conteneur flex, compteur à gauche, flèches à droite). La version de ce
22
- * module a été supprimée, elle faisait doublon — les emboîter donnait deux
22
+ * module a été supprimée, elle faisait doublon : les emboîter donnait deux
23
23
  * space-between imbriqués et 24px de padding vertical.
24
24
  * Aucun contrôle de formulaire non plus : [disabled] et [aria-invalid]
25
25
  * n'ont pas d'objet ici, ils vivent dans forms.css.
26
26
  *
27
- * ÉCHELLES — comment lire les tailles ci-dessous
27
+ * ÉCHELLES : comment lire les tailles ci-dessous
28
28
  * La source emploie des demi-pixels (9,5 / 10,5 / 11,5) que le paquet ne
29
29
  * nomme pas. Deux rabattements, appliqués systématiquement :
30
- * — registre TEXTE : plancher --app-sm (12px). Les paliers 10,5 et 11,5
30
+ * - registre TEXTE : plancher --app-sm (12px). Les paliers 10,5 et 11,5
31
31
  * relevés y remontent ; c'est une décision, pas un relevé.
32
- * — micro-labels et glyphes (label de colonne, initiales, vignette) :
32
+ * - micro-labels et glyphes (label de colonne, initiales, vignette) :
33
33
  * l'échelle mono (--mono-lg 11 / --mono 10 / --mono-sm 9), employée là
34
34
  * comme MESURE, la famille restant celle que la règle déclare.
35
35
  * ⚠️ Toutes les tailles et tous les interlettrages mono de la source ont
@@ -47,7 +47,7 @@
47
47
  * Le tableau scrolle DANS son cadre : sans ce confinement, une colonne trop
48
48
  * large fait scroller la page entière et le rail de navigation part avec.
49
49
  * Angle vif et sans ombre : un tableau est une surface de travail, pas une
50
- * carte éditoriale. Aucun rayon n'est posé — la valeur par défaut est déjà 0,
50
+ * carte éditoriale. Aucun rayon n'est posé, la valeur par défaut est déjà 0,
51
51
  * il n'y a rien à annuler tant qu'on ne compose pas .zv-table avec .zv-card
52
52
  * (ce que ce module déconseille : ce sont deux intentions différentes). */
53
53
 
@@ -105,14 +105,14 @@
105
105
  * balaye du regard, une colonne qui danse en largeur est illisible.
106
106
  *
107
107
  * Mais tous les tableaux ne portent pas des données. Un contrat en porte qui
108
- * contiennent des CLAUSES — durées de conservation et leur fondement, sous-
108
+ * contiennent des CLAUSES : durées de conservation et leur fondement, sous-
109
109
  * traitants et leurs garanties de transfert. Là, tronquer ne « raccourcit »
110
110
  * pas : ça CACHE le texte, et cacher une clause dans un document contractuel
111
111
  * n'est pas un défaut d'affichage.
112
112
  *
113
113
  * D'où cette variante, et pas un `className` posé par l'app : le CSS du
114
114
  * paquet est hors couche, il bat toute règle layered quelle que soit la
115
- * spécificité — une app Tailwind qui poserait `whitespace-normal` sur une
115
+ * spécificité, une app Tailwind qui poserait `whitespace-normal` sur une
116
116
  * cellule n'obtiendrait RIEN, en silence. La règle du dépôt est que ce qui
117
117
  * doit s'ajuster s'expose en variante ; la voici.
118
118
  *
@@ -153,12 +153,12 @@
153
153
 
154
154
  /* ⚠️ Aucun tri : les intitulés sont inertes, sans indicateur ni gestionnaire.
155
155
  * Rien dans la source ne dit ce que trierait un clic ni comment se marque la
156
- * colonne active — un en-tête triable serait une décision, pas un style. */
156
+ * colonne active : un en-tête triable serait une décision, pas un style. */
157
157
 
158
158
  /* ─── Ligne de données ─────────────────────────────────────────────────
159
159
  * Une seule écriture de balisage pour deux mises en page : grille au-dessus
160
160
  * du seuil, carte empilée en dessous (voir .zv-unwrap et le bloc responsive).
161
- * Aucun zébrage nulle part dans la source — le survol est le seul repère de
161
+ * Aucun zébrage nulle part dans la source : le survol est le seul repère de
162
162
  * ligne, ce qui laisse le fond blanc porter la lecture. */
163
163
 
164
164
  .zv-row {
@@ -175,7 +175,7 @@
175
175
  /* La dernière ligne colle au cadre : son filet doublerait le trait de bordure
176
176
  * et épaissirait le bas du tableau. C'est déjà ce que fait la source côté
177
177
  * bibliothèque et côté import (`last:border-b-0`) ; seul le répertoire garde
178
- * le filet. Le module tranche pour le retrait — ce n'est donc pas une
178
+ * le filet. Le module tranche pour le retrait : ce n'est donc pas une
179
179
  * correction contre la production, c'est l'alignement sur sa majorité. */
180
180
  .zv-row:last-child {
181
181
  border-bottom: 0;
@@ -203,9 +203,9 @@
203
203
  * système qui n'en a que deux (blanc, survol). */
204
204
 
205
205
  /* ─── En-tête triable ──────────────────────────────────────────────────
206
- * ⚠️ HORS RELEVÉ — ajouté le 25/08/2026 avec l'adaptateur TanStack Table.
206
+ * ⚠️ HORS RELEVÉ : ajouté le 25/08/2026 avec l'adaptateur TanStack Table.
207
207
  * Aucun tableau de la production n'est triable ; l'intitulé y est du texte
208
- * inerte. Un en-tête qui trie DOIT être un <button> — c'est la seule façon
208
+ * inerte. Un en-tête qui trie DOIT être un <button> : c'est la seule façon
209
209
  * qu'il soit atteignable au clavier et annoncé comme actionnable.
210
210
  *
211
211
  * `font: inherit` plutôt qu'une police redite : l'en-tête a déjà la sienne
@@ -277,7 +277,7 @@
277
277
  *
278
278
  * ⚠️ CORRECTION DE FOND. La version précédente comptait sur --font-mono pour
279
279
  * aligner les colonnes de chiffres. Dans la source, --font-mono valait
280
- * `ui-monospace, Menlo` — une vraie chasse fixe. Dans CE paquet, --font-mono
280
+ * `ui-monospace, Menlo` : une vraie chasse fixe. Dans CE paquet, --font-mono
281
281
  * vaut « Space Grotesk », une grotesque PROPORTIONNELLE : le 1 y est plus
282
282
  * étroit que le 8, les unités ne tombent pas les unes sous les autres et
283
283
  * l'alignement annoncé n'existe pas.
@@ -285,7 +285,7 @@
285
285
  * Ce qui aligne réellement, c'est font-variant-numeric: tabular-nums : la
286
286
  * fonte sert alors ses chiffres à chasse égale, quelle que soit sa famille.
287
287
  * La famille mono est conservée ici pour le REGISTRE (valeur technique), pas
288
- * pour l'alignement — les deux ne sont plus confondus. */
288
+ * pour l'alignement : les deux ne sont plus confondus. */
289
289
  .zv-cell--num {
290
290
  /* Sans effet dans la grille ; utile sous 768px, où la cellule se retrouve
291
291
  * enfant d'un .zv-unwrap devenu flex et ne doit pas se laisser comprimer. */
@@ -312,7 +312,7 @@
312
312
  color: var(--label);
313
313
  }
314
314
 
315
- /* Même logique pour l'unité en clair — « 42 docs » en carte, « 42 » en
315
+ /* Même logique pour l'unité en clair : « 42 docs » en carte, « 42 » en
316
316
  * tableau. Reste INLINE : elle appartient à la valeur, pas à sa ligne. */
317
317
  .zv-cell__unit {
318
318
  display: none;
@@ -322,7 +322,7 @@
322
322
  * La primitive structurelle du module : un groupe qui rassemble deux ou trois
323
323
  * cellules pour l'empilement mobile, puis s'efface (display: contents) et
324
324
  * rend ses enfants DIRECTEMENT à la grille du tableau. C'est ce qui permet
325
- * d'écrire le balisage une seule fois pour deux mises en page — sans lui, il
325
+ * d'écrire le balisage une seule fois pour deux mises en page : sans lui, il
326
326
  * faudrait dupliquer la rangée et les deux copies divergeraient.
327
327
  *
328
328
  * Quatre enveloppes de ce type dans la source, sur trois écrans indépendants :
@@ -364,7 +364,7 @@
364
364
  * 2 % du blanc de la liste : ce fond est, en pratique, INVISIBLE. Il est
365
365
  * conservé comme rappel discret, mais le signal « quelque chose est en train
366
366
  * de se passer » doit être porté par la jauge (.zv-progress) ou par le
367
- * libellé de la rangée — surtout pas par ce fond. */
367
+ * libellé de la rangée : surtout pas par ce fond. */
368
368
  .zv-list__row--upload {
369
369
  background: var(--panel);
370
370
  }
@@ -389,12 +389,12 @@
389
389
  }
390
390
 
391
391
  /* ⚠️ Aucun état interactif dans la source : ni survol de rangée, ni sélection,
392
- * ni focus. Une liste de fichiers n'y est pas cliquable — si elle le devient,
392
+ * ni focus. Une liste de fichiers n'y est pas cliquable : si elle le devient,
393
393
  * c'est .zv-row qu'il faut employer, pas cette rangée-ci. */
394
394
 
395
395
  /* ─── Métadonnée mono ──────────────────────────────────────────────────
396
396
  * Second registre mono du système, en BAS DE CASSE : taille de fichier, date,
397
- * horodatage, compteur, latence. Ni capitales ni interlettrage — c'est
397
+ * horodatage, compteur, latence. Ni capitales ni interlettrage, c'est
398
398
  * exactement ce qui le distingue de .zv-tag et .zv-mono (capitales,
399
399
  * 0,14–0,2em) : une date ou un nom de fichier passés en capitales espacées
400
400
  * deviennent illisibles et s'alignent mal.
@@ -496,7 +496,7 @@
496
496
  }
497
497
 
498
498
  /* Variante en grille (métadonnées d'une source citée) : deux colonnes des DEUX
499
- * côtés du seuil — ce sont quatre valeurs courtes, les empiler ferait une
499
+ * côtés du seuil, ce sont quatre valeurs courtes, les empiler ferait une
500
500
  * colonne inutilement longue. Le libellé passe au-dessus de la valeur. */
501
501
  .zv-kv--grid {
502
502
  display: grid;
@@ -513,7 +513,7 @@
513
513
  }
514
514
 
515
515
  /* En grille, la clé redevient un label de colonne : capitales, plus petit,
516
- * gris de label — et non plus l'accent de la variante en ligne. */
516
+ * gris de label, et non plus l'accent de la variante en ligne. */
517
517
  .zv-kv--grid .zv-kv__key {
518
518
  display: block;
519
519
  margin-bottom: 2px;
@@ -533,7 +533,7 @@
533
533
  /* ─── Pastille d'initiales ─────────────────────────────────────────────
534
534
  * CARRÉE, jamais ronde : le rond est un usage de réseau social, l'encre et le
535
535
  * papier posent des blocs. La teinte dit la NATURE de l'entité, elle n'est pas
536
- * décorative — la changer, c'est changer le sens.
536
+ * décorative : la changer, c'est changer le sens.
537
537
  *
538
538
  * 9,5px dans la source. Le paquet ne descend sous 12px que sur son échelle
539
539
  * mono : --mono-sm (9px) est employé ici comme MESURE, la pastille restant
@@ -577,12 +577,12 @@
577
577
 
578
578
  /* Règles d'initiales, à respecter côté appelant. Il y en a DEUX, et les
579
579
  * confondre change le rendu :
580
- * — .zv-avatar (26px, entité du répertoire) : préfixes « M. | Me | SARL |
580
+ * - .zv-avatar (26px, entité du répertoire) : préfixes « M. | Me | SARL |
581
581
  * SCI | SA » retirés, découpe sur [espace ou &], AUCUN repli ;
582
- * — .zv-avatar--sm (22px, organisation dans le chrome) : deux mots au plus,
582
+ * - .zv-avatar--sm (22px, organisation dans le chrome) : deux mots au plus,
583
583
  * mots-outils écartés (« cabinet », « étude », « office », « selarl »,
584
584
  * « scp », « et », « de », « du », « des », « la », « le », « les »),
585
- * repli sur « · » quand rien ne sort — sans ce repli, une pastille vide
585
+ * repli sur « · » quand rien ne sort) sans ce repli, une pastille vide
586
586
  * passe pour un défaut d'affichage.
587
587
  * Prescrire la seconde pour la première change les initiales du répertoire. */
588
588
 
@@ -601,7 +601,7 @@
601
601
  white-space: nowrap;
602
602
  }
603
603
 
604
- /* Revenir à la ligne : tout ce qui ne se devine pas coupé — adresses e-mail,
604
+ /* Revenir à la ligne : tout ce qui ne se devine pas coupé, adresses e-mail,
605
605
  * noms de fichiers, jetons, messages d'erreur. Perdre la fin d'un message
606
606
  * d'erreur, c'est perdre l'incident. */
607
607
  .zv-break {
@@ -700,7 +700,7 @@
700
700
  * plusieurs. À trancher, pas à combler au hasard.
701
701
  * ⚠️ En production c'est un <span onClick> : inatteignable au clavier. Le
702
702
  * rendre focusable côté appelant (<button>) suffit à lui donner le contour de
703
- * base.css — c'est la correction à faire, pas un style à ajouter ici.
703
+ * base.css : c'est la correction à faire, pas un style à ajouter ici.
704
704
  * ⚠️ Recoupe .zv-src (components.css : mono capitales, fond blanc, filet
705
705
  * --accent-line, rayon 4px) : même rôle éditorial, aucune valeur commune. La
706
706
  * version applicative est remplie et à angle vif. Fusion ou dédoublement
@@ -709,11 +709,11 @@
709
709
  /* ─── Vignette de format ───────────────────────────────────────────────
710
710
  * ⚠️ HORS CHARTE, ET ASSUMÉ : --fmt-pdf et --fmt-docx sont le rouge Acrobat
711
711
  * et le bleu Word, pas --err ni --accent. Deux relevés indépendants les codent
712
- * à l'identique — c'est une intention (reconnaître le format d'un coup d'œil),
712
+ * à l'identique : c'est une intention (reconnaître le format d'un coup d'œil),
713
713
  * pas une dérive ; tokens.css les déclare et n'en autorise pas d'autre usage.
714
714
  * ⚠️ La source pose 7,5px, sous le plancher du paquet (--mono-sm, 9px).
715
715
  * Rabattu sur ce plancher : la vignette grossit d'un pixel et demi, ce qui
716
- * n'est PAS le relevé — à revoir à l'œil sur une rangée dense. Réservé à deux
716
+ * n'est PAS le relevé, à revoir à l'œil sur une rangée dense. Réservé à deux
717
717
  * ou quatre caractères en capitales, jamais à du texte.
718
718
  * L'interlettrage reste à 0,06em et non aux 0,14em du reste des capitales :
719
719
  * sur quatre caractères dans 30px de large, 0,14em déborde de la vignette.
@@ -724,7 +724,7 @@
724
724
  /* ⚠️ Une vignette posée dans une colonne flex (.zv-list__main) s'étire sur
725
725
  * toute la largeur si on ne l'en empêche pas : elle cesse alors d'être une
726
726
  * vignette et se lit comme une bande de couleur. Même raison que le
727
- * `justify-self: start` de .zv-badge en grille — vu au rendu, pas à la
727
+ * `justify-self: start` de .zv-badge en grille : vu au rendu, pas à la
728
728
  * relecture. */
729
729
  align-self: start;
730
730
  padding: 2px 5px;
@@ -746,7 +746,7 @@
746
746
 
747
747
  /* ─── Rangée dépliante ─────────────────────────────────────────────────
748
748
  * HORS RELEVÉ (25/08/2026, voir DECISIONS.md). La FAQ est le pliage de la
749
- * vitrine ; l'applicatif n'en avait aucun — options avancées, détail d'une
749
+ * vitrine ; l'applicatif n'en avait aucun : options avancées, détail d'une
750
750
  * ligne de journal. Construite sur <details> NATIF : le clavier, l'annonce
751
751
  * et l'état ouvert viennent du navigateur, aucun JavaScript.
752
752
  * Plusieurs rangées se suivent bord à bord : le filet mitoyen tombe. */
@@ -814,7 +814,7 @@
814
814
  /* ─── Touche de clavier ────────────────────────────────────────────────
815
815
  * HORS RELEVÉ (25/08/2026). Une documentation d'interface cite des
816
816
  * raccourcis ; le paquet n'avait rien pour les poser. Le bas de 2 px fait
817
- * le relief de la touche — géométrie, pas ombre de charte, comme l'anneau
817
+ * le relief de la touche : géométrie, pas ombre de charte, comme l'anneau
818
818
  * du radio. */
819
819
 
820
820
  .zv-kbd {
@@ -831,7 +831,7 @@
831
831
  }
832
832
 
833
833
  /* ─── Code ─────────────────────────────────────────────────────────────
834
- * HORS RELEVÉ (25/08/2026, voir DECISIONS.md — c'est l'entrée qui a créé
834
+ * HORS RELEVÉ (25/08/2026, voir DECISIONS.md : c'est l'entrée qui a créé
835
835
  * --font-code). --font-mono (Space Grotesk) est PROPORTIONNELLE : elle
836
836
  * porte le registre des labels, pas l'alignement, et tabular-nums n'aligne
837
837
  * que les chiffres. Du code exige la chasse fixe entière : --font-code, la
@@ -840,7 +840,7 @@
840
840
  * charte n'a pas. Le code se lit à l'encre sur panneau, comme un extrait. */
841
841
 
842
842
  /* En ligne, dans une phrase : `pnpm build`. Taille RELATIVE au texte qui
843
- * l'accueille — le même extrait sert dans un corps 15 et une note 12,5. */
843
+ * l'accueille : le même extrait sert dans un corps 15 et une note 12,5. */
844
844
  .zv-code {
845
845
  padding: 1px 5px;
846
846
  border: 1px solid var(--hairline);
@@ -875,7 +875,7 @@
875
875
  /* ─── Sous 768px ───────────────────────────────────────────────────────
876
876
  * Point de rupture unique de la charte. Les lignes cessent d'être des lignes :
877
877
  * une grille de six colonnes à 375px produit six colonnes illisibles, ou un
878
- * débordement horizontal de la page. Le balisage, lui, ne change pas — c'est
878
+ * débordement horizontal de la page. Le balisage, lui, ne change pas : c'est
879
879
  * .zv-unwrap qui rend l'inversion possible.
880
880
  *
881
881
  * ⚠️ La source coupe à 1024px (lg de Tailwind), pas à 768 : entre les deux,
@@ -903,7 +903,7 @@
903
903
 
904
904
  /* Le groupe redevient une boîte : ses deux ou trois cellules tiennent sur
905
905
  * une même ligne au lieu de s'empiler chacune sur la sienne.
906
- * flex-wrap: wrap n'est pas optionnel — deux des quatre enveloppes de la
906
+ * flex-wrap: wrap n'est pas optionnel : deux des quatre enveloppes de la
907
907
  * source passent à la ligne, et sans lui la rangée taille + date + statut
908
908
  * déborde de la carte à 320px, c'est-à-dire exactement le défaut que le
909
909
  * passage en carte devait supprimer.
@@ -927,7 +927,7 @@
927
927
  * flex, intitulé à gauche et valeur à droite
928
928
  * (tableau-de-bord/page.tsx:120). Sans cela, « TAILLE » vient se coller à
929
929
  * « 2,4 Mo » et les deux se lisent comme un seul mot.
930
- * `:has()` cible les seules cellules qui portent une étiquette — les
930
+ * `:has()` cible les seules cellules qui portent une étiquette : les
931
931
  * autres gardent leur flux. */
932
932
  .zv-cell:has(.zv-cell__label) {
933
933
  display: flex;