@zevra/ui 0.16.0 → 0.20.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 (70) hide show
  1. package/DECISIONS.md +279 -0
  2. package/dist/catalogue.d.ts.map +1 -1
  3. package/dist/catalogue.js +76 -2
  4. package/dist/catalogue.js.map +1 -1
  5. package/dist/content.d.ts +103 -0
  6. package/dist/content.d.ts.map +1 -1
  7. package/dist/content.js +80 -0
  8. package/dist/content.js.map +1 -1
  9. package/dist/css-inline.d.ts.map +1 -1
  10. package/dist/css-inline.js +1 -1
  11. package/dist/css-inline.js.map +1 -1
  12. package/dist/forms.d.ts +22 -0
  13. package/dist/forms.d.ts.map +1 -1
  14. package/dist/forms.js +18 -0
  15. package/dist/forms.js.map +1 -1
  16. package/dist/icon-data.d.ts +1 -1
  17. package/dist/icon-data.d.ts.map +1 -1
  18. package/dist/icon-data.js +30 -0
  19. package/dist/icon-data.js.map +1 -1
  20. package/dist/layout.d.ts +11 -5
  21. package/dist/layout.d.ts.map +1 -1
  22. package/dist/layout.js.map +1 -1
  23. package/dist/typography.d.ts +8 -3
  24. package/dist/typography.d.ts.map +1 -1
  25. package/dist/typography.js +6 -0
  26. package/dist/typography.js.map +1 -1
  27. package/icons/index.json +90 -0
  28. package/icons/sprite.svg +15 -0
  29. package/logos/favicon/campus/apple-touch-icon.png +0 -0
  30. package/logos/favicon/campus/favicon.ico +0 -0
  31. package/logos/favicon/campus/icon-192.png +0 -0
  32. package/logos/favicon/campus/icon-512.png +0 -0
  33. package/logos/favicon/lexform/apple-touch-icon.png +0 -0
  34. package/logos/favicon/lexform/favicon.ico +0 -0
  35. package/logos/favicon/lexform/icon-192.png +0 -0
  36. package/logos/favicon/lexform/icon-512.png +0 -0
  37. package/logos/favicon/mcp/apple-touch-icon.png +0 -0
  38. package/logos/favicon/mcp/favicon.ico +0 -0
  39. package/logos/favicon/mcp/icon-192.png +0 -0
  40. package/logos/favicon/mcp/icon-512.png +0 -0
  41. package/logos/favicon/memoire/apple-touch-icon.png +0 -0
  42. package/logos/favicon/memoire/favicon.ico +0 -0
  43. package/logos/favicon/memoire/icon-192.png +0 -0
  44. package/logos/favicon/memoire/icon-512.png +0 -0
  45. package/logos/favicon/plume/apple-touch-icon.png +0 -0
  46. package/logos/favicon/plume/favicon.ico +0 -0
  47. package/logos/favicon/plume/icon-192.png +0 -0
  48. package/logos/favicon/plume/icon-512.png +0 -0
  49. package/logos/favicon/supernovia/apple-touch-icon.png +0 -0
  50. package/logos/favicon/supernovia/favicon.ico +0 -0
  51. package/logos/favicon/supernovia/icon-192.png +0 -0
  52. package/logos/favicon/supernovia/icon-512.png +0 -0
  53. package/logos/favicon/zevra/apple-touch-icon.png +0 -0
  54. package/logos/favicon/zevra/favicon.ico +0 -0
  55. package/logos/favicon/zevra/icon-192.png +0 -0
  56. package/logos/favicon/zevra/icon-512.png +0 -0
  57. package/package.json +1 -1
  58. package/react/catalogue.tsx +109 -3
  59. package/react/content.tsx +272 -1
  60. package/react/css-inline.ts +1 -1
  61. package/react/forms.tsx +53 -0
  62. package/react/icon-data.ts +45 -0
  63. package/react/layout.tsx +11 -4
  64. package/react/typography.tsx +13 -3
  65. package/src/base.css +7 -0
  66. package/src/components.css +294 -8
  67. package/src/forms.css +65 -2
  68. package/src/icons.css +20 -0
  69. package/src/layout.css +16 -1
  70. package/src/navigation.css +20 -0
package/src/forms.css CHANGED
@@ -1001,9 +1001,15 @@
1001
1001
  min-height: var(--tap);
1002
1002
  }
1003
1003
 
1004
- .zv-input--bare {
1004
+ /* Le champ nu et celui d'un cadre à affixe. 16px et non --app-lg (14px) :
1005
+ * la règle des 16px ci-dessus vaut pour TOUT champ qu'on saisit au doigt,
1006
+ * et ces deux-là — le composeur, le sous-domaine d'organisation — sont
1007
+ * parmi les plus saisis d'une application. Sous 16, Safari iOS zoome à la
1008
+ * mise au point et décale la page. */
1009
+ .zv-input--bare,
1010
+ .zv-affix .zv-input--bare {
1005
1011
  min-height: var(--tap);
1006
- font-size: var(--app-lg);
1012
+ font-size: 16px;
1007
1013
  }
1008
1014
 
1009
1015
  /* Le cadre passe pleine largeur. Il n'est PAS figé (`flex: none`) : le
@@ -1015,8 +1021,11 @@
1015
1021
  flex: 0 1 auto;
1016
1022
  }
1017
1023
 
1024
+ /* Le champ de recherche n'était visé par aucune des deux règles : il
1025
+ * gardait --app (13px), donc il zoomait lui aussi. */
1018
1026
  .zv-search__input {
1019
1027
  padding-block: 12px;
1028
+ font-size: 16px;
1020
1029
  }
1021
1030
 
1022
1031
  /* Le déclencheur peut passer à la ligne : sa valeur courante est un nom de
@@ -1075,3 +1084,57 @@
1075
1084
  color: var(--accent);
1076
1085
  }
1077
1086
  }
1087
+
1088
+ /* ─── Champ mot de passe ────────────────────────────────────────────────
1089
+ * HORS RELEVÉ (27/08/2026, 0.18.0). Aucune des planches ne montre d'écran de
1090
+ * connexion, et le système n'avait donc rien pour ce champ — alors que tous
1091
+ * les produits en ont un, et que la saisie masquée est le seul endroit de
1092
+ * l'interface où l'on tape sans voir ce qu'on écrit.
1093
+ *
1094
+ * Bâti sur `.zv-affix` plutôt qu'en cadre parallèle : le champ nu, le cadre
1095
+ * qui l'entoure et son anneau de mise au point sont déjà là.
1096
+ *
1097
+ * ⚠️ Le bouton est un vrai <button type="button"> : posé sur un <span>, il
1098
+ * n'est ni atteignable au clavier ni annoncé, et il envoie le formulaire dès
1099
+ * qu'on oublie le type. Son libellé change avec l'état — « Afficher » /
1100
+ * « Masquer » — parce qu'une icône seule ne dit pas ce qui va se passer. */
1101
+
1102
+ .zv-affix__btn {
1103
+ display: inline-flex;
1104
+ align-items: center;
1105
+ justify-content: center;
1106
+ flex: none;
1107
+ /* Cible tactile obtenue par la taille, pas par du remplissage : un bouton
1108
+ * de 16 px entouré de marge reste un bouton de 16 px pour le doigt. */
1109
+ width: 32px;
1110
+ height: 32px;
1111
+ margin-right: -6px;
1112
+ padding: 0;
1113
+ border: 0;
1114
+ border-radius: 0;
1115
+ background: none;
1116
+ color: var(--muted);
1117
+ cursor: pointer;
1118
+ transition: color 140ms cubic-bezier(0.2, 0.7, 0.2, 1);
1119
+ }
1120
+
1121
+ .zv-affix__btn:hover {
1122
+ color: var(--ink);
1123
+ }
1124
+
1125
+ .zv-affix__btn[aria-pressed='true'] {
1126
+ color: var(--accent);
1127
+ }
1128
+
1129
+ /* Le contour déborderait du cadre à affixe, qui le rogne. On le rentre. */
1130
+ .zv-affix__btn:focus-visible {
1131
+ outline-offset: -2px;
1132
+ }
1133
+
1134
+ /* Les gestionnaires de mot de passe des navigateurs posent leur propre œil
1135
+ * dans le champ : deux boutons côte à côte pour la même chose. On masque le
1136
+ * leur, le nôtre étant accessible et cohérent avec la charte. */
1137
+ .zv-affix input[type='password']::-ms-reveal,
1138
+ .zv-affix input[type='password']::-ms-clear {
1139
+ display: none;
1140
+ }
package/src/icons.css CHANGED
@@ -81,6 +81,26 @@
81
81
  color: var(--ink);
82
82
  }
83
83
 
84
+ /* Désactivé. C'était la SEULE classe interactive du module sans cet état :
85
+ * .zv-btn, .zv-chrome-btn, .zv-menu__item, .zv-pager__arrow, .zv-range et
86
+ * les champs en ont tous un. Sans lui, un bouton fermé se rendait comme un
87
+ * bouton actif — curseur main compris — et s'allumait au survol comme s'il
88
+ * allait agir.
89
+ * ⚠️ Le survol est neutralisé EXPLICITEMENT : `:hover` s'applique encore à
90
+ * un bouton désactivé, et l'application ne peut pas le rattraper depuis une
91
+ * couche d'utilitaires — ce module n'est pas layered. */
92
+ .zv-icon-btn[disabled],
93
+ .zv-icon-btn[aria-disabled='true'] {
94
+ opacity: 0.5;
95
+ cursor: not-allowed;
96
+ }
97
+
98
+ .zv-icon-btn[disabled]:hover,
99
+ .zv-icon-btn[aria-disabled='true']:hover {
100
+ background: transparent;
101
+ color: var(--muted);
102
+ }
103
+
84
104
  /* Icône décorative posée à côté d'un libellé qui la nomme déjà : elle est
85
105
  * atténuée pour que le mot reste le point d'entrée du regard. */
86
106
  .zv-icon--quiet {
package/src/layout.css CHANGED
@@ -400,8 +400,23 @@
400
400
  color-mix(in srgb, var(--paper) 92%, transparent),
401
401
  color-mix(in srgb, var(--paper) 0%, transparent)
402
402
  );
403
- backdrop-filter: blur(6px);
403
+ /* ⚠️ LE PRÉFIXÉ D'ABORD. Lightning CSS — le compilateur de Tailwind v4,
404
+ * donc celui de toutes nos applications Next — SUPPRIME `backdrop-filter`
405
+ * non préfixé quand il précède la forme `-webkit-`. Or Firefox ne connaît
406
+ * QUE la forme non préfixée : la barre y perdait son flou. Reproduit avec
407
+ * la chaîne exacte des apps, dans les deux ordres. L'ordre est donc une
408
+ * contrainte, pas un style.
409
+ *
410
+ * Le voile, lui, reste en `color-mix` : le compilateur le traite
411
+ * CORRECTEMENT — il émet un repli opaque puis la vraie valeur sous
412
+ * `@supports`, ce qu'on lit dans les bundles livrés. Une note antérieure
413
+ * affirmait qu'il le « réduisait » ; elle prenait le repli pour le
414
+ * résultat. Ne pas « corriger » vers `rgb(from …)` : cette syntaxe sort du
415
+ * compilateur NUE, sans repli, et un navigateur qui l'ignore n'a alors
416
+ * plus AUCUN fond sous une barre fixe — 3,5 % d'usage qui voyaient le
417
+ * voile correctement et ne verraient plus rien. */
404
418
  -webkit-backdrop-filter: blur(6px);
419
+ backdrop-filter: blur(6px);
405
420
  }
406
421
 
407
422
  .zv-header:has(> .zv-nav) {
@@ -832,6 +832,15 @@
832
832
  * Sous ce seuil, tout ce qui se touche fait au moins --tap. */
833
833
 
834
834
  @media (max-width: 767px) {
835
+
836
+ /* Le fil ENTIER est un seul lien, et il n'avait aucune hauteur de cible :
837
+ * à 11px de texte il passe sous le minimum tactile. On déploie la cible
838
+ * sans toucher au corps. */
839
+ .zv-crumbs {
840
+ display: inline-flex;
841
+ align-items: center;
842
+ min-height: var(--tap);
843
+ }
835
844
  /* 224px de colonne à côté du contenu sur un écran de 375px ne laisse rien à
836
845
  * lire : la colonne cède la place au couple barre + tiroir. */
837
846
  .zv-sidebar {
@@ -982,6 +991,17 @@
982
991
  padding: 8px;
983
992
  }
984
993
 
994
+ /* La cible tactile, que le padding seul ne donne pas : un chevron de dix
995
+ * pixels entouré de huit reste sous --tap. `.zv-pager__step` la portait
996
+ * déjà ; ses deux voisines l'attendaient. */
997
+ .zv-pager__arrow,
998
+ .zv-pager__rank {
999
+ display: inline-flex;
1000
+ align-items: center;
1001
+ justify-content: center;
1002
+ min-height: var(--tap);
1003
+ }
1004
+
985
1005
  .zv-pager__rank {
986
1006
  padding-block: 8px;
987
1007
  }