@zevra/ui 0.26.0 → 0.27.1

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/react/email.ts CHANGED
@@ -23,6 +23,11 @@
23
23
  // stylées.
24
24
 
25
25
  import { COULEURS, POLICES as PILES } from './email-tokens.js'
26
+ // Les URL publiques des glyphes — sept chaînes, aucune image inlinée : un
27
+ // client de messagerie ne résout pas une data-URI (Gmail les bloque), il lui
28
+ // faut une adresse absolue.
29
+ import { LOGOS_PRODUITS } from './glyph-urls.js'
30
+ export { BASE_RESSOURCES, LOGOS_PRODUITS } from './glyph-urls.js'
26
31
 
27
32
  /** ⚠️ Les piles de polices du paquet contiennent des GUILLEMETS DOUBLES
28
33
  * (`"Public Sans", …`), et tout ici s'écrit dans un attribut `style="…"`
@@ -144,6 +149,10 @@ export interface EmailOptions {
144
149
  /** L'URL ABSOLUE du logo — une image d'e-mail ne se résout pas depuis un
145
150
  * chemin relatif, et les data-URI sont bloquées par Gmail. */
146
151
  logo?: { src: string; hauteur?: number }
152
+ /** Raccourci : le glyphe d'un produit Zevra, à son URL publiée avec la
153
+ * planche. Écrase `logo`.
154
+ * ⚠️ Ne dispense PAS de `marque` : une image sur deux est bloquée. */
155
+ produit?: keyof typeof LOGOS_PRODUITS
147
156
  /** Les blocs, concaténés. */
148
157
  contenu: string
149
158
  /** Sous la carte : mentions légales, désinscription. */
@@ -167,12 +176,17 @@ export function email({
167
176
  preheader,
168
177
  marque,
169
178
  logo,
179
+ produit,
170
180
  contenu,
171
181
  pied,
172
182
  lang = 'fr',
173
183
  }: EmailOptions): string {
174
- const enTete = logo
175
- ? `<img src="${echappe(logo.src)}" height="${logo.hauteur ?? 28}" alt="${echappe(marque)}" style="display:block;border:0;height:${logo.hauteur ?? 28}px;width:auto;">`
184
+ const source = produit ? LOGOS_PRODUITS[produit] : logo?.src
185
+ // 34px : la hauteur du logo de la barre de vitrine sous le seuil. Un
186
+ // e-mail se lit surtout au téléphone.
187
+ const hauteur = logo?.hauteur ?? 34
188
+ const enTete = source
189
+ ? `<img src="${echappe(source)}" height="${hauteur}" alt="${echappe(marque)}" style="display:block;border:0;height:${hauteur}px;width:auto;">`
176
190
  : `<span style="font-family:${POLICES.display};font-weight:600;font-size:20px;letter-spacing:-0.02em;color:${COULEURS.ink};">${echappe(marque)}</span>`
177
191
 
178
192
  return `<!doctype html>
@@ -21,6 +21,9 @@ export const GLYPHES: Record<GlypheId, string> = {
21
21
  'zevra': 'data:image/png;base64,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',
22
22
  }
23
23
 
24
+ /** Le mot « Zevra » — le wordmark officiel, tracé, en data-URI. */
25
+ export const MOT_ZEVRA = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NTMuOCAxMDAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iWmV2cmEiPgogIDx0aXRsZT5aZXZyYTwvdGl0bGU+CiAgPCEtLSBMZSBtb3QgWmV2cmEsIHJlbGV2w6kgc3VyIGxlIGxvY2t1cCBkJ29yaWdpbmUuIExhIGhhdXRldXIgZGUgY2FwaXRhbGUKICAgICAgIHZhdXQgMTAwIHVuaXTDqXMgOiB1bmUgaGF1dGV1ciBDU1MgcG9zw6llIHN1ciBjZSBmaWNoaWVyIEVTVCBsYSBjYXBpdGFsZSwKICAgICAgIGNlIHF1aSByZW5kIGxlcyBwcm9wb3J0aW9ucyBkdSBsb2NrdXAgY2FsY3VsYWJsZXMgKHZvaXIgLnp2LWxvY2t1cCkuIC0tPgogIDxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNIDQxMy4zMSAwLjE4IEwgNDEzLjg1IDAuMTggTCA0MTQuMjEgMC4wMCBMIDQxNC43NCAwLjAwIEwgNDE1LjI4IDAuMDAgTCA0MTUuODEgMC4wMCBMIDQxNi4zNSAwLjAwIEwgNDE2Ljg4IDAuMDAgTCA0MTcuNDIgMC4wMCBMIDQxNy45NiAwLjAwIEwgNDE4LjQ5IDAuMDAgTCA0MTkuMDMgMC4wMCBMIDQxOS41NiAwLjAwIEwgNDIwLjEwIDAuMDAgTCA0MjAuNjMgMC4wMCBMIDQyMC45OSAwLjE4IEwgNDIxLjM1IDAuMzYgTCA0MjEuNzEgMC4zNiBMIDQ1My44MCA4MC4yOCBMIDQ0MS44MyA4NS4wNiBMIDQzMi41NyA2MS43NyBMIDQwMi40OSA2MS43NyBMIDM5My4xOSA4NS4wMiBMIDM4MS4yMiA4MC4zMCBaIE0gMC4xOCA4MC44OCBMIDQ4Ljg2IDEzLjIxIEwgNy4zMiAxMi44NSBMIDYuOTYgMTIuMzIgTCA2Ljk2IDExLjQzIEwgNi45NiAxMC41MyBMIDYuOTYgOS42NCBMIDYuOTYgOC43NSBMIDYuOTYgNy44NiBMIDYuOTYgNi45NiBMIDYuOTYgNi4wNyBMIDYuOTYgNS4xOCBMIDYuOTYgNC4yOCBMIDYuOTYgMy4zOSBMIDYuOTYgMi41MCBMIDYuOTYgMS42MSBMIDcuMTQgMC44OSBMIDcuMzIgMC41NCBMIDc0LjA4IDAuMTggTCAxOS41MCA3Ni4wNiBMIDYxLjA2IDc2LjU5IEwgNjEuMjQgNzcuMzEgTCA2MS40MiA3OC4wMiBMIDYxLjQyIDc4LjkxIEwgNjEuNDIgNzkuODEgTCA2MS40MiA4MC43MCBMIDYxLjQyIDgxLjU5IEwgNjEuNDIgODIuNDggTCA2MS40MiA4My4zOCBMIDYxLjQyIDg0LjI3IEwgNjEuNDIgODUuMTYgTCA2MS40MiA4Ni4wNSBMIDYxLjQyIDg2Ljk1IEwgNjEuNDIgODcuODQgTCA2MS4wNiA4OC4zOCBMIDYxLjA2IDg4LjczIEwgMC4zNiA4OC43MyBMIDAuMTggODguMzggTCAwLjAwIDg4LjAyIEwgMC4wMCA4Ny40OCBMIDAuMDAgODYuOTUgTCAwLjAwIDg2LjQxIEwgMC4wMCA4NS44OCBMIDAuMDAgODUuMzQgTCAwLjAwIDg0LjgxIEwgMC4wMCA4NC4yNyBMIDAuMDAgODMuNzMgTCAwLjAwIDgzLjIwIEwgMC4wMCA4Mi42NiBMIDAuMDAgODIuMTMgTCAwLjAwIDgxLjU5IEwgMC4xOCA4MS4yMyBaIE0gOTYuMjMgMC41NCBMIDE1MC41MSAwLjcxIEwgMTUwLjY5IDEuNDMgTCAxNTAuODYgMi4xNCBMIDE1MC44NiAzLjA0IEwgMTUwLjg2IDMuOTMgTCAxNTAuODYgNC44MiBMIDE1MC44NiA1LjcxIEwgMTUwLjg2IDYuNjEgTCAxNTAuODYgNy41MCBMIDE1MC44NiA4LjM5IEwgMTUwLjg2IDkuMjggTCAxNTAuODYgMTAuMTggTCAxNTAuODYgMTEuMDcgTCAxNTAuODYgMTEuOTYgTCAxNTAuNTEgMTIuNTAgTCAxNTAuNTEgMTIuNjggTCAxMDkuMDkgMTMuMzkgTCAxMDguNzMgMTQuODIgTCAxMDguNzMgMTYuMjUgTCAxMDguNzMgMTguMDMgTCAxMDguNzMgMTkuODIgTCAxMDguNzMgMjEuNjAgTCAxMDguNzMgMjMuMzkgTCAxMDguNzMgMjUuMTcgTCAxMDguNzMgMjYuOTYgTCAxMDguNzMgMjguNzQgTCAxMDguNzMgMzAuNTMgTCAxMDguNzMgMzIuMzIgTCAxMDguNzMgMzQuMTAgTCAxMDguNzMgMzUuODkgTCAxMDguOTEgMzcuNDkgTCAxMDkuMDkgMzguMjEgTCAxNDMuMjIgMzguMzkgTCAxNDMuMTEgNTEuMjQgTCAxMDkuMDkgNTEuNDIgTCAxMDguNzMgNTIuODUgTCAxMDguNzMgNTQuNjMgTCAxMDguNzMgNTYuNDIgTCAxMDguNzMgNTguMjAgTCAxMDguNzMgNTkuOTkgTCAxMDguNzMgNjEuNzcgTCAxMDguNzMgNjMuNTYgTCAxMDguNzMgNjUuMzQgTCAxMDguNzMgNjcuMTMgTCAxMDguNzMgNjguOTIgTCAxMDguNzMgNzAuNzAgTCAxMDguNzMgNzIuNDkgTCAxMDguNzMgNzQuMjcgTCAxMDkuMDkgNzUuNzAgTCAxMDkuMDkgNzUuODggTCAxNTAuMTUgNzYuNTkgTCAxNTAuNTEgNzcuMTMgTCAxNTAuODYgNzcuNjYgTCAxNTAuODYgNzguNTYgTCAxNTAuODYgNzkuNDUgTCAxNTAuODYgODAuMzQgTCAxNTAuODYgODEuMjMgTCAxNTAuODYgODIuMTMgTCAxNTAuODYgODMuMDIgTCAxNTAuODYgODMuOTEgTCAxNTAuODYgODQuODEgTCAxNTAuODYgODUuNzAgTCAxNTAuODYgODYuNTkgTCAxNTAuODYgODcuNDggTCAxNTAuNjkgODguMjAgTCAxNTAuNjkgODguMzggTCA5Ni40MSA4OC45MSBMIDk1Ljg3IDgzLjU2IEwgOTUuODcgNzcuMzEgTCA5NS44NyA3MS4wNiBMIDk1Ljg3IDY0LjgxIEwgOTUuODcgNTguNTYgTCA5NS44NyA1Mi4zMSBMIDk1Ljg3IDQ2LjA2IEwgOTUuODcgMzkuODEgTCA5NS44NyAzMy41NyBMIDk1Ljg3IDI3LjMyIEwgOTUuODcgMjEuMDcgTCA5NS44NyAxNC44MiBMIDk1Ljg3IDguNTcgTCA5NS44NyAyLjMyIFogTSAyODcuMjcgMC41NCBMIDI5NS44NCAwLjE4IEwgMzA0Ljc2IDAuMTggTCAzMTMuNjkgMC4xOCBMIDMyMi4yNiAwLjU0IEwgMzI5LjIyIDIuNTAgTCAzMzQuOTQgNS43MSBMIDMzOS41OCAxMC4wMCBMIDM0Mi45NyAxNS41MyBMIDM0NS40NyAyMS45NiBMIDM0NS42NSAzMC4zNSBMIDM0NC4wNCAzNy42NyBMIDM0MC42NSA0My4yMSBMIDMzNi4zNiA0Ny44NSBMIDMzMS4xOSA1MS42MCBMIDMzMC44MyA1MS45NSBMIDM1MS4zNCA3OC43MCBMIDM0MS4yMCA4Ni42MyBMIDMxNS45MyA1NC4yOCBMIDMwMC4xMiA1NC40NSBMIDI5OS43NiA1Ni4wNiBMIDI5OS43NiA1OC4wMiBMIDI5OS43NiA1OS45OSBMIDI5OS43NiA2MS45NSBMIDI5OS43NiA2My45MiBMIDI5OS43NiA2NS44OCBMIDI5OS43NiA2Ny44NCBMIDI5OS43NiA2OS44MSBMIDI5OS43NiA3MS43NyBMIDI5OS43NiA3My43NCBMIDI5OS43NiA3NS43MCBMIDI5OS43NiA3Ny42NiBMIDI5OS43NiA3OS42MyBMIDI5OS43NiA4MS41OSBMIDI5OS40MSA4Mi40OCBMIDI4Ny4yNyA4Mi40OCBMIDI4Ni45MSA3Ni45NSBMIDI4Ni45MSA3MS4wNiBMIDI4Ni45MSA2NS4xNyBMIDI4Ni45MSA1OS4yNyBMIDI4Ni45MSA1My4zOCBMIDI4Ni45MSA0Ny40OSBMIDI4Ni45MSA0MS42MCBMIDI4Ni45MSAzNS43MSBMIDI4Ni45MSAyOS44MiBMIDI4Ni45MSAyMy45MiBMIDI4Ni45MSAxOC4wMyBMIDI4Ni45MSAxMi4xNCBMIDI4Ni45MSA2LjI1IEwgMjg3LjI3IDAuNzEgWiBNIDE4NS43NSA5LjI1IEwgMTk3LjY5IDQuNDMgTCAyMjIuMDIgNjUuMzQgTCAyNDYuMzUgNC40MyBMIDI1OC4yOCA5LjI0IEwgMjIyLjAyIDEwMC4wMCBaIE0gMzAwLjEyIDEzLjU3IEwgMzAyLjgwIDEzLjIxIEwgMzA1LjgzIDEzLjIxIEwgMzA4Ljg3IDEzLjIxIEwgMzExLjkwIDEzLjIxIEwgMzE0Ljk0IDEzLjIxIEwgMzE3Ljk3IDEzLjIxIEwgMzIwLjgzIDEzLjM5IEwgMzIzLjE1IDE0LjEwIEwgMzI1LjQ3IDE0LjgyIEwgMzI3LjI2IDE2LjA3IEwgMzI4Ljg3IDE3LjUwIEwgMzMwLjI5IDE5LjEwIEwgMzMxLjU0IDIwLjg5IEwgMzMyLjQ0IDIzLjAzIEwgMzMyLjYyIDIzLjIxIEwgMzMyLjk3IDI2LjQyIEwgMzMyLjc5IDI5LjgyIEwgMzMxLjkwIDMyLjQ5IEwgMzMwLjgzIDM0Ljk5IEwgMzI5LjIyIDM2Ljk2IEwgMzI3LjI2IDM4LjU2IEwgMzI1LjEyIDM5Ljk5IEwgMzIyLjQ0IDQwLjg5IEwgMzE5LjQwIDQxLjQyIEwgMzE1LjgzIDQxLjQyIEwgMzEyLjI2IDQxLjQyIEwgMzA4LjY5IDQxLjQyIEwgMzA1LjEyIDQxLjQyIEwgMzAxLjU1IDQxLjQyIEwgMzAwLjEyIDQxLjA2IEwgMjk5Ljc2IDM5LjQ2IEwgMjk5Ljc2IDM3LjQ5IEwgMjk5Ljc2IDM1LjUzIEwgMjk5Ljc2IDMzLjU3IEwgMjk5Ljc2IDMxLjYwIEwgMjk5Ljc2IDI5LjY0IEwgMjk5Ljc2IDI3LjY3IEwgMjk5Ljc2IDI1LjcxIEwgMjk5Ljc2IDIzLjc1IEwgMjk5Ljc2IDIxLjc4IEwgMjk5Ljc2IDE5LjgyIEwgMjk5Ljc2IDE3Ljg1IEwgMjk5Ljc2IDE1Ljg5IEwgMjk5Ljk0IDE0LjEwIFogTSA0MTcuNTIgMjQuMTIgTCA0MjcuMzMgNDguNzQgTCA0MDcuNzAgNDguNzQgWiIvPgo8L3N2Zz4K'
26
+
24
27
  /** Le nom lisible de chaque produit, depuis logos/index.json. */
25
28
  export const NOMS_PRODUITS: Record<GlypheId, string> = {
26
29
  'campus': "Campus",
@@ -0,0 +1,16 @@
1
+ // GÉNÉRÉ par scripts/build-glyph-data.mjs — ne pas éditer à la main.
2
+
3
+ /** Où la planche publie les glyphes (staticDirs de .storybook/main.ts). */
4
+ export const BASE_RESSOURCES = 'https://design.zevra.tech'
5
+
6
+ /** L'URL PUBLIQUE de chaque glyphe. Absolue, parce qu'un e-mail ne résout
7
+ * ni un chemin relatif ni une data-URI. */
8
+ export const LOGOS_PRODUITS = {
9
+ 'campus': `${BASE_RESSOURCES}/logos/glyphes/campus.png`,
10
+ 'lexform': `${BASE_RESSOURCES}/logos/glyphes/lexform.png`,
11
+ 'mcp': `${BASE_RESSOURCES}/logos/glyphes/mcp.png`,
12
+ 'memoire': `${BASE_RESSOURCES}/logos/glyphes/memoire.png`,
13
+ 'plume': `${BASE_RESSOURCES}/logos/glyphes/plume.png`,
14
+ 'supernovia': `${BASE_RESSOURCES}/logos/glyphes/supernovia.png`,
15
+ 'zevra': `${BASE_RESSOURCES}/logos/glyphes/zevra.png`,
16
+ } as const
package/react/glyphes.ts CHANGED
@@ -14,10 +14,10 @@
14
14
  // elle n'existe pas encore (retirée le 24/08, à regénérer), et ces glyphes
15
15
  // ne doivent donc pas descendre sous cette taille.
16
16
 
17
- import { GLYPHES, NOMS_PRODUITS, type GlypheId } from './glyph-data.js'
17
+ import { GLYPHES, MOT_ZEVRA, NOMS_PRODUITS, type GlypheId } from './glyph-data.js'
18
18
 
19
19
  export type { GlypheId }
20
- export { GLYPHES, NOMS_PRODUITS }
20
+ export { GLYPHES, MOT_ZEVRA, NOMS_PRODUITS }
21
21
 
22
22
  /** Les sept identifiants, triés. */
23
23
  export const PRODUITS = Object.keys(GLYPHES) as GlypheId[]
package/src/data.css CHANGED
@@ -577,6 +577,9 @@
577
577
 
578
578
  .zv-chip {
579
579
  display: inline-block;
580
+ /* Même défense que .zv-filetype : blockifiée comme enfant flex, une
581
+ * étiquette étirée cesse de se lire comme une étiquette. */
582
+ align-self: start;
580
583
  background: var(--hairline);
581
584
  padding: 3px 9px;
582
585
  font-size: var(--mono);
@@ -674,6 +677,12 @@
674
677
 
675
678
  .zv-filetype {
676
679
  flex: none;
680
+ /* ⚠️ Une vignette posée dans une colonne flex (.zv-list__main) s'étire sur
681
+ * toute la largeur si on ne l'en empêche pas : elle cesse alors d'être une
682
+ * vignette et se lit comme une bande de couleur. Même raison que le
683
+ * `justify-self: start` de .zv-badge en grille — vu au rendu, pas à la
684
+ * relecture. */
685
+ align-self: start;
677
686
  padding: 2px 5px;
678
687
  text-align: center;
679
688
  font-family: var(--font-mono);
package/src/feedback.css CHANGED
@@ -195,6 +195,9 @@
195
195
  /* En cellule de grille, une étiquette étirée sur toute la colonne cesse
196
196
  * de se lire comme une étiquette : elle se cale à gauche sur sa largeur. */
197
197
  justify-self: start;
198
+ /* Et son équivalent en flex : une colonne flex étire ses enfants, et
199
+ * l'étiquette y deviendrait une bande. */
200
+ align-self: start;
198
201
  border: 1px solid;
199
202
  padding: 3px 8px;
200
203
  font-family: var(--font-mono);
package/src/surfaces.css CHANGED
@@ -173,13 +173,39 @@
173
173
  background: radial-gradient(closest-side, rgba(32, 160, 240, 0.5), rgba(32, 160, 240, 0) 70%);
174
174
  }
175
175
 
176
- /* Texte courant sur fond sombre : ni blanc pur, ni le gris du mode clair. */
177
- .zv-band .zv-body,
178
- .zv-band .zv-rule,
176
+ /* ─── Texte sur fond sombre ─────────────────────────────────────────────
177
+ * Ni blanc pur, ni le gris du mode clair.
178
+ *
179
+ * ⚠️ POURQUOI CETTE RÈGLE EXISTE, ET POURQUOI ELLE COUVRE TOUT. Les classes
180
+ * de texte du paquet posent leur PROPRE couleur (.zv-body, .zv-lead,
181
+ * .zv-note et .zv-rule sont en --muted ; .zv-h1 en --ink). Cette couleur
182
+ * l'emporte sur celle héritée de la surface : poser un paragraphe dans un
183
+ * panneau navy donnait du gris de mode clair sur du bleu nuit, et un titre
184
+ * h1 y devenait carrément invisible.
185
+ *
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
189
+ * texte non plus. Corrigé le 27/08/2026 : une seule liste, toutes les
190
+ * surfaces, tous les paliers.
191
+ *
192
+ * Ce qui reste EXPLICITE et ne s'adapte pas tout seul : les labels mono
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
195
+ * décision de rédaction, elle se pose à la main. */
196
+ :is(.zv-band, .zv-panel-navy, .zv-text-on-dark, .zv-social--manifeste)
197
+ :is(.zv-body, .zv-lead, .zv-rule, .zv-note),
179
198
  .zv-text-on-dark {
180
199
  color: #c7cde0;
181
200
  }
182
201
 
202
+ /* Les titres, eux, reprennent le blanc : sur une surface sombre ils portent
203
+ * la même hiérarchie que l'encre sur le papier. */
204
+ :is(.zv-band, .zv-panel-navy, .zv-text-on-dark, .zv-social--manifeste)
205
+ :is(.zv-h1, .zv-h2, .zv-h3, .zv-card-title, .zv-display) {
206
+ color: var(--white);
207
+ }
208
+
183
209
  /* Panneau navy compact (planches de logos). */
184
210
  .zv-panel-navy {
185
211
  background: linear-gradient(135deg, #06063a 0%, #0b0b5e 40%, var(--accent-deep) 100%);