@zevra/ui 0.39.0 → 0.40.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 (40) hide show
  1. package/DECISIONS.md +75 -0
  2. package/dist/clients-data.d.ts +8 -0
  3. package/dist/clients-data.d.ts.map +1 -0
  4. package/dist/clients-data.js +16 -0
  5. package/dist/clients-data.js.map +1 -0
  6. package/dist/clients.d.ts +49 -0
  7. package/dist/clients.d.ts.map +1 -0
  8. package/dist/clients.js +82 -0
  9. package/dist/clients.js.map +1 -0
  10. package/dist/css-inline.d.ts.map +1 -1
  11. package/dist/css-inline.js +1 -1
  12. package/dist/css-inline.js.map +1 -1
  13. package/dist/overlays.d.ts.map +1 -1
  14. package/dist/overlays.js +14 -2
  15. package/dist/overlays.js.map +1 -1
  16. package/logos/clients/beside-avocats.webp +0 -0
  17. package/logos/clients/blnk.svg +57 -0
  18. package/logos/clients/bremens-avocats.webp +0 -0
  19. package/logos/clients/clesame.webp +0 -0
  20. package/logos/clients/dairia-avocats.webp +0 -0
  21. package/logos/clients/index.json +38 -0
  22. package/logos/clients/karila.svg +35 -0
  23. package/logos/clients/legal-data-space.svg +1 -0
  24. package/logos/clients/orange.svg +4 -0
  25. package/logos/clients/source/beside-avocats.avif +0 -0
  26. package/logos/clients/source/blnk.svg +57 -0
  27. package/logos/clients/source/bremens-avocats.webp +0 -0
  28. package/logos/clients/source/clesame.webp +0 -0
  29. package/logos/clients/source/dairia-avocats.webp +0 -0
  30. package/logos/clients/source/karila.svg +35 -0
  31. package/logos/clients/source/legal-data-space.svg +1 -0
  32. package/logos/clients/source/orange.svg +4 -0
  33. package/logos/clients/source/wj-avocats.webp +0 -0
  34. package/logos/clients/wj-avocats.webp +0 -0
  35. package/package.json +6 -2
  36. package/react/clients-data.ts +27 -0
  37. package/react/clients.tsx +121 -0
  38. package/react/css-inline.ts +1 -1
  39. package/react/overlays.tsx +15 -2
  40. package/src/layout.css +89 -0
@@ -0,0 +1,121 @@
1
+ // Le bandeau des clients de Zevra : la bande de réassurance que montrent
2
+ // zevra.tech et les produits.
3
+ //
4
+ // ⚠️ ENTRÉE SÉPARÉE (`@zevra/ui/react/clients`) : les logos y sont inlinés
5
+ // (≈ 50 Ko), le barrel React n'en porte pas un octet. Voir
6
+ // scripts/build-clients-data.mjs.
7
+ //
8
+ // UNE SEULE LISTE. Le bandeau vivait en deux copies (ClientLogoBanner.astro
9
+ // sur zevra.tech, ClientLogos.tsx dans MCP Juridique) qui divergeaient à
10
+ // chaque client ajouté : WJ Avocats, entré sur zevra.tech le 14/10/2026,
11
+ // manquait encore à MCP trois jours plus tard. Un client s'ajoute ICI, une
12
+ // fois, et toutes les apps le reçoivent à la mise à jour du paquet.
13
+ //
14
+ // ⚠️ CE SONT LES CLIENTS DE ZEVRA, l'éditeur, tous produits confondus. Le
15
+ // libellé que pose une app ne doit pas les présenter comme clients d'un
16
+ // produit en particulier : charte, jamais de client prêté.
17
+
18
+ import { Fragment, type CSSProperties } from 'react'
19
+ import { cx } from './cx.js'
20
+ import { Kicker, Mono } from './typography.js'
21
+ import { LOGOS_CLIENTS, type ClientId } from './clients-data.js'
22
+
23
+ export type { ClientId }
24
+
25
+ /**
26
+ * Les clients, dans l'ordre d'affichage, avec leur HAUTEUR OPTIQUE.
27
+ *
28
+ * La hauteur n'est pas celle du fichier : elle égalise la SURFACE D'ENCRE
29
+ * affichée (somme de l'alpha du rendu, suréchantillonné ×4 ; cible
30
+ * 1 077 px² à l'unité, mesure de zevra.tech du 25/09/2026). Chaque hauteur
31
+ * est corrigée d'un facteur √(moyenne / encre), avec des exceptions :
32
+ *
33
+ * - Dairia et Karila, marques COMPACTES à traits fins, sont plafonnées :
34
+ * portées à la surface moyenne (69 et 74), elles domineraient leur ligne
35
+ * par la géométrie. Karila est montée de 46 à 60 le 25/09 : elle lisait
36
+ * « en retrait », ses minuscules tombaient à 5,5 px.
37
+ * - Bremens et WJ, mots-marques LONGS (rapports 9 et 5,9), prennent leur
38
+ * surface en largeur. WJ reste à 0,44× l'encre moyenne : à la cible
39
+ * (45), il écraserait sa ligne.
40
+ *
41
+ * Pour ajouter un client : déposer son fichier dans logos/clients/source/
42
+ * (il doit porter sa transparence : le masque ne lit que l'alpha, un JPG
43
+ * sur fond blanc s'afficherait en rectangle plein), lancer
44
+ * scripts/build-clients.py, puis MESURER l'encre plutôt que reprendre la
45
+ * hauteur du fichier, et revoir la coupure `SAUT`.
46
+ */
47
+ export const CLIENTS: ReadonlyArray<{ id: ClientId; nom: string; hauteur: number }> = [
48
+ { id: 'legal-data-space', nom: 'Legal Data Space', hauteur: 35 },
49
+ { id: 'blnk', nom: 'BL NK', hauteur: 25 },
50
+ { id: 'dairia-avocats', nom: 'Dairia Avocats', hauteur: 46 },
51
+ { id: 'clesame', nom: 'Clésame', hauteur: 27 },
52
+ { id: 'karila', nom: 'Cabinet Karila', hauteur: 60 },
53
+ { id: 'beside-avocats', nom: 'Beside Avocats', hauteur: 20 },
54
+ { id: 'bremens-avocats', nom: 'Bremens Avocats', hauteur: 23 },
55
+ { id: 'orange', nom: 'Orange', hauteur: 34 },
56
+ { id: 'wj-avocats', nom: 'WJ Avocats', hauteur: 30 },
57
+ ]
58
+
59
+ /** Au bureau, la rangée casse ici : 5 + 4. Laissée libre, elle casserait
60
+ * selon la largeur avec un orphelin qui se lit comme un accident. L'ordre
61
+ * ci-dessus compose les deux lignes : une marque compacte par ligne
62
+ * (Dairia en haut, Karila en bas), et les longs Bremens et WJ en face des
63
+ * larges du haut, pour que les deux lignes pèsent pareil. */
64
+ const SAUT = 5
65
+
66
+ export interface BandeauClientsProps {
67
+ /** Le kicker au-dessus des logos (« Ils construisent avec nous »). Omis
68
+ * ou vide : la bande sans titre. Le texte vient de l'app, qui tient ses
69
+ * langues. */
70
+ titre?: string
71
+ className?: string
72
+ }
73
+
74
+ /**
75
+ * La bande de logos clients, centrée, en deux lignes au bureau.
76
+ *
77
+ * Les logos ne sont pas affichés, ils sont DÉCOUPÉS : chaque fichier sert de
78
+ * masque à un aplat. Une seule encre au repos (`--ink-2`), l'indigo de
79
+ * l'action au survol (`--accent`), plutôt que neuf chartes concurrentes. La
80
+ * règle « aucune recoloration » protège les logos Zevra ; ceux de tiers,
81
+ * dans une bande de réassurance, suivent la typographie du support.
82
+ *
83
+ * Ne porte ni gouttière ni marge de section : c'est à la page de la placer.
84
+ */
85
+ export function BandeauClients({ titre, className }: BandeauClientsProps) {
86
+ return (
87
+ <div className={cx('zv-clients', className)}>
88
+ {titre ? (
89
+ <Kicker variante="center">
90
+ <Mono>{titre}</Mono>
91
+ </Kicker>
92
+ ) : null}
93
+ <div className="zv-clients__rangee">
94
+ {CLIENTS.map((client, i) => {
95
+ const logo = LOGOS_CLIENTS[client.id]
96
+ return (
97
+ <Fragment key={client.id}>
98
+ {i === SAUT && <span className="zv-clients__saut" aria-hidden="true" />}
99
+ {/* Un seul porteur de l'image, la variable : une balise image en plus
100
+ écrirait chaque data-URI deux fois dans le HTML. Le nom
101
+ passe par role="img". */}
102
+ <span
103
+ className="zv-clients__logo"
104
+ role="img"
105
+ aria-label={client.nom}
106
+ title={client.nom}
107
+ style={
108
+ {
109
+ '--zv-clients-h': client.hauteur,
110
+ '--zv-clients-ratio': logo.ratio,
111
+ '--zv-clients-src': `url("${logo.src}")`,
112
+ } as CSSProperties
113
+ }
114
+ />
115
+ </Fragment>
116
+ )
117
+ })}
118
+ </div>
119
+ </div>
120
+ )
121
+ }