@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.
- package/DECISIONS.md +279 -0
- package/dist/catalogue.d.ts.map +1 -1
- package/dist/catalogue.js +76 -2
- package/dist/catalogue.js.map +1 -1
- package/dist/content.d.ts +103 -0
- package/dist/content.d.ts.map +1 -1
- package/dist/content.js +80 -0
- package/dist/content.js.map +1 -1
- package/dist/css-inline.d.ts.map +1 -1
- package/dist/css-inline.js +1 -1
- package/dist/css-inline.js.map +1 -1
- package/dist/forms.d.ts +22 -0
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +18 -0
- package/dist/forms.js.map +1 -1
- package/dist/icon-data.d.ts +1 -1
- package/dist/icon-data.d.ts.map +1 -1
- package/dist/icon-data.js +30 -0
- package/dist/icon-data.js.map +1 -1
- package/dist/layout.d.ts +11 -5
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js.map +1 -1
- package/dist/typography.d.ts +8 -3
- package/dist/typography.d.ts.map +1 -1
- package/dist/typography.js +6 -0
- package/dist/typography.js.map +1 -1
- package/icons/index.json +90 -0
- package/icons/sprite.svg +15 -0
- package/logos/favicon/campus/apple-touch-icon.png +0 -0
- package/logos/favicon/campus/favicon.ico +0 -0
- package/logos/favicon/campus/icon-192.png +0 -0
- package/logos/favicon/campus/icon-512.png +0 -0
- package/logos/favicon/lexform/apple-touch-icon.png +0 -0
- package/logos/favicon/lexform/favicon.ico +0 -0
- package/logos/favicon/lexform/icon-192.png +0 -0
- package/logos/favicon/lexform/icon-512.png +0 -0
- package/logos/favicon/mcp/apple-touch-icon.png +0 -0
- package/logos/favicon/mcp/favicon.ico +0 -0
- package/logos/favicon/mcp/icon-192.png +0 -0
- package/logos/favicon/mcp/icon-512.png +0 -0
- package/logos/favicon/memoire/apple-touch-icon.png +0 -0
- package/logos/favicon/memoire/favicon.ico +0 -0
- package/logos/favicon/memoire/icon-192.png +0 -0
- package/logos/favicon/memoire/icon-512.png +0 -0
- package/logos/favicon/plume/apple-touch-icon.png +0 -0
- package/logos/favicon/plume/favicon.ico +0 -0
- package/logos/favicon/plume/icon-192.png +0 -0
- package/logos/favicon/plume/icon-512.png +0 -0
- package/logos/favicon/supernovia/apple-touch-icon.png +0 -0
- package/logos/favicon/supernovia/favicon.ico +0 -0
- package/logos/favicon/supernovia/icon-192.png +0 -0
- package/logos/favicon/supernovia/icon-512.png +0 -0
- package/logos/favicon/zevra/apple-touch-icon.png +0 -0
- package/logos/favicon/zevra/favicon.ico +0 -0
- package/logos/favicon/zevra/icon-192.png +0 -0
- package/logos/favicon/zevra/icon-512.png +0 -0
- package/package.json +1 -1
- package/react/catalogue.tsx +109 -3
- package/react/content.tsx +272 -1
- package/react/css-inline.ts +1 -1
- package/react/forms.tsx +53 -0
- package/react/icon-data.ts +45 -0
- package/react/layout.tsx +11 -4
- package/react/typography.tsx +13 -3
- package/src/base.css +7 -0
- package/src/components.css +294 -8
- package/src/forms.css +65 -2
- package/src/icons.css +20 -0
- package/src/layout.css +16 -1
- 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
|
-
.
|
|
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:
|
|
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
|
-
|
|
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) {
|
package/src/navigation.css
CHANGED
|
@@ -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
|
}
|