@zevra/ui 0.39.1 → 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.
- package/DECISIONS.md +36 -0
- package/dist/clients-data.d.ts +8 -0
- package/dist/clients-data.d.ts.map +1 -0
- package/dist/clients-data.js +16 -0
- package/dist/clients-data.js.map +1 -0
- package/dist/clients.d.ts +49 -0
- package/dist/clients.d.ts.map +1 -0
- package/dist/clients.js +82 -0
- package/dist/clients.js.map +1 -0
- 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/logos/clients/beside-avocats.webp +0 -0
- package/logos/clients/blnk.svg +57 -0
- package/logos/clients/bremens-avocats.webp +0 -0
- package/logos/clients/clesame.webp +0 -0
- package/logos/clients/dairia-avocats.webp +0 -0
- package/logos/clients/index.json +38 -0
- package/logos/clients/karila.svg +35 -0
- package/logos/clients/legal-data-space.svg +1 -0
- package/logos/clients/orange.svg +4 -0
- package/logos/clients/source/beside-avocats.avif +0 -0
- package/logos/clients/source/blnk.svg +57 -0
- package/logos/clients/source/bremens-avocats.webp +0 -0
- package/logos/clients/source/clesame.webp +0 -0
- package/logos/clients/source/dairia-avocats.webp +0 -0
- package/logos/clients/source/karila.svg +35 -0
- package/logos/clients/source/legal-data-space.svg +1 -0
- package/logos/clients/source/orange.svg +4 -0
- package/logos/clients/source/wj-avocats.webp +0 -0
- package/logos/clients/wj-avocats.webp +0 -0
- package/package.json +6 -2
- package/react/clients-data.ts +27 -0
- package/react/clients.tsx +121 -0
- package/react/css-inline.ts +1 -1
- 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
|
+
}
|