@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.
- package/DECISIONS.md +264 -208
- package/README.md +21 -21
- package/demo/app.html +6 -6
- package/demo/index.html +3 -3
- package/dist/actions.d.ts +8 -8
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +1 -1
- package/dist/actions.js.map +1 -1
- package/dist/catalogue.d.ts +2 -2
- package/dist/catalogue.js +67 -67
- package/dist/catalogue.js.map +1 -1
- package/dist/content.d.ts +23 -23
- package/dist/content.d.ts.map +1 -1
- package/dist/content.js +16 -16
- package/dist/content.js.map +1 -1
- package/dist/css-inline.d.ts +1 -1
- package/dist/css-inline.d.ts.map +1 -1
- package/dist/css-inline.js +4 -4
- package/dist/css-inline.js.map +1 -1
- package/dist/data-table.d.ts +1 -1
- package/dist/data.d.ts +7 -7
- package/dist/data.js +5 -5
- package/dist/email-tokens.js +1 -1
- package/dist/email.d.ts +6 -6
- package/dist/email.js +8 -8
- package/dist/email.js.map +1 -1
- package/dist/feedback.d.ts +10 -10
- package/dist/feedback.d.ts.map +1 -1
- package/dist/feedback.js +3 -3
- package/dist/forms.d.ts +12 -12
- package/dist/forms.js +5 -5
- package/dist/glyph-data.d.ts +2 -2
- package/dist/glyph-data.js +3 -3
- package/dist/glyph-urls.js +1 -1
- package/dist/glyphes.d.ts +2 -2
- package/dist/glyphes.js +4 -4
- package/dist/icon-data.d.ts +1 -1
- package/dist/icon-data.js +2 -2
- package/dist/icon.d.ts +5 -5
- package/dist/icon.js +1 -1
- package/dist/index.js +4 -4
- package/dist/layout.d.ts +21 -21
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +15 -15
- package/dist/layout.js.map +1 -1
- package/dist/navigation.d.ts +16 -16
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +9 -9
- package/dist/navigation.js.map +1 -1
- package/dist/overlays.d.ts +6 -6
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +5 -5
- package/dist/select-menu.d.ts +1 -1
- package/dist/select-menu.js +2 -2
- package/dist/surfaces.d.ts +8 -8
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +6 -6
- package/dist/surfaces.js.map +1 -1
- package/dist/typography.d.ts +4 -4
- package/dist/typography.d.ts.map +1 -1
- package/dist/typography.js +3 -3
- package/dist/typography.js.map +1 -1
- package/icons/index.json +1 -1
- package/package.json +2 -2
- package/react/actions.tsx +9 -9
- package/react/catalogue.tsx +68 -68
- package/react/content.tsx +28 -28
- package/react/css-inline.ts +4 -4
- package/react/data-table.tsx +3 -3
- package/react/data.tsx +9 -9
- package/react/email-tokens.ts +1 -1
- package/react/email.ts +10 -10
- package/react/feedback.tsx +12 -12
- package/react/forms.tsx +15 -15
- package/react/glyph-data.ts +3 -3
- package/react/glyph-urls.ts +1 -1
- package/react/glyphes.ts +4 -4
- package/react/icon-data.ts +2 -2
- package/react/icon.tsx +6 -6
- package/react/index.ts +4 -4
- package/react/layout.tsx +22 -22
- package/react/navigation.tsx +18 -18
- package/react/overlays.tsx +9 -9
- package/react/select-menu.tsx +3 -3
- package/react/surfaces.tsx +10 -10
- package/react/typography.tsx +6 -6
- package/src/base.css +10 -10
- package/src/components.css +49 -49
- package/src/data.css +41 -41
- package/src/feedback.css +55 -55
- package/src/fonts.css +2 -2
- package/src/forms.css +50 -50
- package/src/icons.css +10 -10
- package/src/index.css +1 -1
- package/src/layout.css +27 -27
- package/src/motion.css +16 -16
- package/src/motion.js +4 -4
- package/src/nav.js +5 -5
- package/src/navigation.css +62 -62
- package/src/overlays.css +14 -14
- package/src/rail.js +6 -6
- package/src/surfaces.css +11 -11
- package/src/tokens.css +14 -14
- package/tokens/index.js +8 -8
package/src/overlays.css
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/* Zevra UI
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
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
|
|
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é
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
188
|
-
* planche sociale
|
|
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é
|
|
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
|
|
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
|
|
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
|
|
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
|
|
251
|
-
* kicker, display
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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',
|