@zevra/ui 0.3.2 → 0.5.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 +25 -0
- package/README.md +83 -11
- package/dist/actions.d.ts +41 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +24 -0
- package/dist/actions.js.map +1 -0
- package/dist/catalogue.d.ts +30 -0
- package/dist/catalogue.d.ts.map +1 -0
- package/dist/catalogue.js +830 -0
- package/dist/catalogue.js.map +1 -0
- package/dist/content.d.ts +135 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +85 -0
- package/dist/content.js.map +1 -0
- package/dist/css-inline.d.ts +11 -0
- package/dist/css-inline.d.ts.map +1 -0
- package/dist/css-inline.js +13 -0
- package/dist/css-inline.js.map +1 -0
- package/dist/cx.d.ts +16 -0
- package/dist/cx.d.ts.map +1 -0
- package/dist/cx.js +20 -0
- package/dist/cx.js.map +1 -0
- package/dist/data.d.ts +136 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +98 -0
- package/dist/data.js.map +1 -0
- package/dist/feedback.d.ts +88 -0
- package/dist/feedback.d.ts.map +1 -0
- package/dist/feedback.js +38 -0
- package/dist/feedback.js.map +1 -0
- package/dist/forms.d.ts +120 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +60 -0
- package/dist/forms.js.map +1 -0
- package/dist/icon-data.d.ts +6 -0
- package/dist/icon-data.d.ts.map +1 -0
- package/dist/icon-data.js +77 -0
- package/dist/icon-data.js.map +1 -0
- package/dist/icon.d.ts +33 -0
- package/dist/icon.d.ts.map +1 -0
- package/dist/icon.js +13 -0
- package/dist/icon.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +166 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +120 -0
- package/dist/layout.js.map +1 -0
- package/dist/navigation.d.ts +150 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +104 -0
- package/dist/navigation.js.map +1 -0
- package/dist/overlays.d.ts +68 -0
- package/dist/overlays.d.ts.map +1 -0
- package/dist/overlays.js +114 -0
- package/dist/overlays.js.map +1 -0
- package/dist/surfaces.d.ts +61 -0
- package/dist/surfaces.d.ts.map +1 -0
- package/dist/surfaces.js +54 -0
- package/dist/surfaces.js.map +1 -0
- package/dist/typography.d.ts +89 -0
- package/dist/typography.d.ts.map +1 -0
- package/dist/typography.js +76 -0
- package/dist/typography.js.map +1 -0
- package/logos/index.json +10 -500
- package/package.json +36 -4
- package/react/actions.tsx +138 -0
- package/react/catalogue.tsx +1644 -0
- package/react/content.tsx +313 -0
- package/react/css-inline.ts +14 -0
- package/react/cx.ts +20 -0
- package/react/data.tsx +300 -0
- package/react/feedback.tsx +229 -0
- package/react/forms.tsx +383 -0
- package/react/icon-data.ts +114 -0
- package/react/icon.tsx +84 -0
- package/react/index.ts +42 -0
- package/react/layout.tsx +347 -0
- package/react/navigation.tsx +329 -0
- package/react/overlays.tsx +237 -0
- package/react/surfaces.tsx +161 -0
- package/react/typography.tsx +220 -0
- package/logos/png/campus-glyph-ink.png +0 -0
- package/logos/png/campus-glyph-white.png +0 -0
- package/logos/png/campus-lockup.png +0 -0
- package/logos/png/lexform-glyph-ink.png +0 -0
- package/logos/png/lexform-glyph-white.png +0 -0
- package/logos/png/lexform-lockup.png +0 -0
- package/logos/png/mcp-glyph-ink.png +0 -0
- package/logos/png/mcp-glyph-white.png +0 -0
- package/logos/png/mcp-lockup.png +0 -0
- package/logos/png/memoire-dark.png +0 -0
- package/logos/png/memoire-glyph-ink.png +0 -0
- package/logos/png/memoire-glyph-white.png +0 -0
- package/logos/png/memoire-lockup.png +0 -0
- package/logos/png/zevra-lockup-ink.png +0 -0
- package/logos/png/zevra-lockup-white.png +0 -0
- package/logos/png/zevra-lockup.png +0 -0
- package/logos/png/zevra-mark-ink.png +0 -0
- package/logos/png/zevra-mark-white.png +0 -0
- package/logos/png/zevra-mark.png +0 -0
- package/logos/svg/campus-glyph-ink.svg +0 -1
- package/logos/svg/campus-glyph-navy.svg +0 -1
- package/logos/svg/campus-glyph-orig.svg +0 -1
- package/logos/svg/campus-glyph-white.svg +0 -1
- package/logos/svg/campus-lockup-ink.svg +0 -1
- package/logos/svg/campus-lockup-navy.svg +0 -1
- package/logos/svg/campus-lockup-orig.svg +0 -1
- package/logos/svg/campus-lockup-white.svg +0 -1
- package/logos/svg/lexform-glyph-ink.svg +0 -1
- package/logos/svg/lexform-glyph-navy.svg +0 -1
- package/logos/svg/lexform-glyph-orig.svg +0 -1
- package/logos/svg/lexform-glyph-white.svg +0 -1
- package/logos/svg/lexform-lockup-ink.svg +0 -1
- package/logos/svg/lexform-lockup-navy.svg +0 -1
- package/logos/svg/lexform-lockup-orig.svg +0 -1
- package/logos/svg/lexform-lockup-white.svg +0 -1
- package/logos/svg/mcp-glyph-ink.svg +0 -1
- package/logos/svg/mcp-glyph-navy.svg +0 -1
- package/logos/svg/mcp-glyph-orig.svg +0 -1
- package/logos/svg/mcp-glyph-white.svg +0 -1
- package/logos/svg/mcp-lockup-ink.svg +0 -1
- package/logos/svg/mcp-lockup-navy.svg +0 -1
- package/logos/svg/mcp-lockup-orig.svg +0 -1
- package/logos/svg/mcp-lockup-white.svg +0 -1
- package/logos/svg/memoire-glyph-ink.svg +0 -1
- package/logos/svg/memoire-glyph-navy.svg +0 -1
- package/logos/svg/memoire-glyph-orig.svg +0 -1
- package/logos/svg/memoire-glyph-white.svg +0 -1
- package/logos/svg/memoire-lockup-ink.svg +0 -1
- package/logos/svg/memoire-lockup-navy.svg +0 -1
- package/logos/svg/memoire-lockup-orig.svg +0 -1
- package/logos/svg/memoire-lockup-white.svg +0 -1
- package/logos/svg/zevra-lockup-ink.svg +0 -1
- package/logos/svg/zevra-lockup-navy.svg +0 -1
- package/logos/svg/zevra-lockup-orig.svg +0 -1
- package/logos/svg/zevra-lockup-white.svg +0 -1
- package/logos/svg/zevra-mark-ink.svg +0 -1
- package/logos/svg/zevra-mark-navy.svg +0 -1
- package/logos/svg/zevra-mark-orig.svg +0 -1
- package/logos/svg/zevra-mark-white.svg +0 -1
package/DECISIONS.md
CHANGED
|
@@ -210,6 +210,31 @@ Aucun jeu d'onglets non plus : une rangée d'onglets se construit avec
|
|
|
210
210
|
`.zv-seg-group` et `.zv-seg`. Un onglet **souligné** reste à faire — il
|
|
211
211
|
suppose d'arbitrer la couleur et l'épaisseur du trait actif.
|
|
212
212
|
|
|
213
|
+
## Les logos, ramenés à cinq
|
|
214
|
+
|
|
215
|
+
Le paquet livrait 40 déclinaisons vectorielles et 24 rendus. Il n'en porte
|
|
216
|
+
plus que **cinq** : les rendus couleur des glyphes Campus, Lexform, MCP,
|
|
217
|
+
Mémoire et de la marque Zevra.
|
|
218
|
+
|
|
219
|
+
Les déclinaisons ont été retirées parce qu'elles ne suivaient plus les
|
|
220
|
+
marques. Le cas de Mémoire le montrait sans discussion : `memoire-glyph-navy`
|
|
221
|
+
et ses quatre lockups portaient encore un logo abandonné — une forme de ruban
|
|
222
|
+
plié — quand `ink`, `white` et `orig` portaient déjà le M actuel. Deux
|
|
223
|
+
marques cohabitaient dans la même galerie, et rien ne disait laquelle était
|
|
224
|
+
la bonne.
|
|
225
|
+
|
|
226
|
+
Ce que cela coûte, et qui reste à refaire :
|
|
227
|
+
|
|
228
|
+
- **les versions monochromes** (encre et blanc), que la charte impose sous
|
|
229
|
+
24 px ;
|
|
230
|
+
- **les lockups** avec wordmark, pour les barres de navigation et les pieds
|
|
231
|
+
de page ;
|
|
232
|
+
- **l'inlinage vectoriel**. Un PNG s'inline en data-URI — l'admin la donne —
|
|
233
|
+
mais c'est 150 ko de texte là où un SVG en faisait 4.
|
|
234
|
+
|
|
235
|
+
Les fichiers retirés restent dans l'historique du dépôt : rien n'est perdu,
|
|
236
|
+
tout est à refaire proprement depuis les marques actuelles.
|
|
237
|
+
|
|
213
238
|
## Écarté du paquet
|
|
214
239
|
|
|
215
240
|
Ce que le relevé recense mais que le paquet ne livre pas, faute d'usage hors
|
package/README.md
CHANGED
|
@@ -50,6 +50,66 @@ unique à 768px reprend les valeurs mobiles du relevé.
|
|
|
50
50
|
Chaque valeur vient des maquettes de la passation. Là où deux planches se
|
|
51
51
|
contredisaient, l'arbitrage est écrit dans [DECISIONS.md](DECISIONS.md).
|
|
52
52
|
|
|
53
|
+
### Les composants React
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pnpm add @zevra/ui react
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
import '@zevra/ui/tokens.css'
|
|
61
|
+
import '@zevra/ui/base.css'
|
|
62
|
+
import '@zevra/ui/forms.css'
|
|
63
|
+
|
|
64
|
+
import { Button, Field, Input } from '@zevra/ui/react'
|
|
65
|
+
|
|
66
|
+
<Field label="ADRESSE E-MAIL" htmlFor="mail" help="Votre adresse professionnelle.">
|
|
67
|
+
<Input id="mail" type="email" />
|
|
68
|
+
</Field>
|
|
69
|
+
<Button>Envoyer</Button>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Ce ne sont **pas** des composants qui embarquent leur style : chacun n'est
|
|
73
|
+
qu'une façade typée et documentée au-dessus des classes `zv-`. Le CSS reste
|
|
74
|
+
la source de vérité, il s'importe à part, et un test
|
|
75
|
+
(`tests/react.test.js`) vérifie que toute classe qu'un composant peut émettre
|
|
76
|
+
existe bien dans un module CSS — c'est ce qui empêche les deux de diverger.
|
|
77
|
+
|
|
78
|
+
**Rendu serveur.** Un seul module est marqué `"use client"` : `overlays`
|
|
79
|
+
(tiroir, modale, notification), les seuls qui aient besoin du navigateur.
|
|
80
|
+
Tout le reste se rend au serveur — dans un composant serveur Next comme dans
|
|
81
|
+
une île Astro à zéro JavaScript. Les composants qui prennent un gestionnaire
|
|
82
|
+
d'événement (`Switch`, `Seg`, `Tabs`…) restent sans état : c'est un composant
|
|
83
|
+
client à toi qui détient l'état et les rend.
|
|
84
|
+
|
|
85
|
+
**Astro.** `@astrojs/react` rend ces composants en HTML statique à la
|
|
86
|
+
compilation, sans JavaScript envoyé, tant qu'aucune directive `client:*` n'est
|
|
87
|
+
posée. Un `<Button>` dans une `.astro` ne coûte donc rien de plus qu'un
|
|
88
|
+
`<button class="zv-btn">` — avec les props typées et la documentation en
|
|
89
|
+
prime. ⚠️ En revanche, un composant `.astro` ne peut pas être passé en enfant
|
|
90
|
+
d'un composant React : ce sens-là ne fonctionne pas.
|
|
91
|
+
|
|
92
|
+
**Les props sont en français**, comme le CSS et les commentaires. Celles qui
|
|
93
|
+
portent une décision de charte sont documentées à l'endroit où on les lit, et
|
|
94
|
+
les avertissements ⚠️ signalent ce qui casse le système si on le contourne —
|
|
95
|
+
pas de simples préférences.
|
|
96
|
+
|
|
97
|
+
**`className` est accepté partout**, mais c'est une sortie de secours, pas un
|
|
98
|
+
usage courant : une classe locale qui repeint un composant du système est une
|
|
99
|
+
divergence qui n'a pas dit son nom.
|
|
100
|
+
|
|
101
|
+
### Le catalogue
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
import { CATALOGUE } from '@zevra/ui/react/catalogue'
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Chaque composant y a un exemple rendu, le code qui le produit, et le résumé de
|
|
108
|
+
ce qu'il fait — et surtout de quand ne pas l'employer. C'est ce que rend la
|
|
109
|
+
page « Design system » de l'admin, et c'est aussi le banc d'essai du test de
|
|
110
|
+
dérive : un composant sans exemple n'est ni documenté ni couvert, et le test
|
|
111
|
+
le refuse.
|
|
112
|
+
|
|
53
113
|
## Deux couches
|
|
54
114
|
|
|
55
115
|
Le paquet en porte deux, et elles ne servent pas au même usage.
|
|
@@ -111,20 +171,29 @@ les deux divergent.
|
|
|
111
171
|
|
|
112
172
|
### Les logos
|
|
113
173
|
|
|
114
|
-
`logos/index.json` décrit les
|
|
115
|
-
|
|
174
|
+
`logos/index.json` décrit les cinq marques : produit, forme, nuance et fond de
|
|
175
|
+
destination.
|
|
176
|
+
|
|
177
|
+
Depuis le 24/08/2026, le paquet ne livre plus que les **rendus couleur** des
|
|
178
|
+
cinq glyphes. Les déclinaisons vectorielles — encre, navy, blanc, et les
|
|
179
|
+
lockups — ont été retirées : elles ne suivaient plus les marques, et celle de
|
|
180
|
+
Mémoire portait encore un logo abandonné.
|
|
116
181
|
|
|
117
182
|
```js
|
|
118
183
|
import index from '@zevra/ui/logos/index.json'
|
|
119
184
|
```
|
|
120
185
|
|
|
121
|
-
Nommage : `<produit>-<forme>-<nuance>.
|
|
122
|
-
`campus-
|
|
123
|
-
`memoire`. Formes : `glyph`, `
|
|
124
|
-
|
|
186
|
+
Nommage : `<produit>-<forme>-<nuance>.png` — par exemple
|
|
187
|
+
`campus-glyph-orig.png`. Produits : `zevra`, `campus`, `lexform`, `mcp`,
|
|
188
|
+
`memoire`. Formes : `glyph`, `mark` (Zevra). Nuance : `orig`.
|
|
189
|
+
|
|
190
|
+
Ce sont des **rendus matriciels de 512 px**. Ils tiennent jusqu'à ~380 px
|
|
191
|
+
d'affichage ; au-delà ils flouteront. Pour les inliner dans un canvas où les
|
|
192
|
+
ressources distantes sont interdites, l'admin en donne la data-URI.
|
|
125
193
|
|
|
126
|
-
|
|
127
|
-
|
|
194
|
+
⚠️ **Ce qui manque, et qu'il faudra refaire** : les versions monochromes
|
|
195
|
+
(encre et blanc) et les lockups avec wordmark. La charte les impose — blanc
|
|
196
|
+
sur navy, mono sous 24 px — mais le paquet ne les porte plus.
|
|
128
197
|
|
|
129
198
|
## Polices
|
|
130
199
|
|
|
@@ -158,7 +227,10 @@ Tiroir et modale s'ouvrent par un état porté sur le conteneur. Deux écritures
|
|
|
158
227
|
panneau resterait ouvert. C'est précisément pour cela que la variante en
|
|
159
228
|
classe existe.
|
|
160
229
|
|
|
161
|
-
Fermer sur Échap relève du gabarit : le CSS ne sait pas le faire.
|
|
230
|
+
Fermer sur Échap relève du gabarit : le CSS ne sait pas le faire. En React,
|
|
231
|
+
`Drawer` et `Modal` (`@zevra/ui/react`) le font déjà, avec le piège de focus,
|
|
232
|
+
la restitution du focus au bouton d'ouverture et le verrou de défilement —
|
|
233
|
+
et le hook `useOverlay` est exporté pour un enrobage maison.
|
|
162
234
|
|
|
163
235
|
## Les règles qui ne se négocient pas
|
|
164
236
|
|
|
@@ -181,8 +253,8 @@ un kicker), la barre de progression, les points de la méthode. Jamais en fond,
|
|
|
181
253
|
jamais en texte.
|
|
182
254
|
|
|
183
255
|
**Les logos ne se retouchent pas** : ni recoloration, ni resaturation, ni
|
|
184
|
-
inclinaison.
|
|
185
|
-
|
|
256
|
+
inclinaison. Zone de protection X/2 ; hauteur de capitale du wordmark
|
|
257
|
+
= 0,30 × glyphe.
|
|
186
258
|
|
|
187
259
|
**Le système est clair par nature.** Une surface sombre se fait avec
|
|
188
260
|
`--manifeste` et `--accent-on-dark`, pas en inversant les neutres : les
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AnchorHTMLAttributes, ButtonHTMLAttributes, HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
/** Variantes de bouton. Une seule pleine par écran — c'est la règle de charte. */
|
|
3
|
+
export type BoutonVariante = 'plein' | 'fantome' | 'encre';
|
|
4
|
+
export interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'> {
|
|
5
|
+
variante?: BoutonVariante;
|
|
6
|
+
/** Hauteur réduite, pour une barre de navigation. */
|
|
7
|
+
compact?: boolean;
|
|
8
|
+
/** Pleine largeur — l'appel à l'action d'un écran mobile. */
|
|
9
|
+
bloc?: boolean;
|
|
10
|
+
/** Échappatoire assumée. À employer pour un ajustement de position, jamais
|
|
11
|
+
* pour redéfinir une couleur ou une taille : c'est par là que les apps
|
|
12
|
+
* recommencent à écrire leur propre charte. */
|
|
13
|
+
className?: string;
|
|
14
|
+
children?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export declare function Button({ variante, compact, bloc, className, type, ...reste }: ButtonProps): import("react").JSX.Element;
|
|
17
|
+
export interface ButtonLinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'className'> {
|
|
18
|
+
variante?: BoutonVariante;
|
|
19
|
+
compact?: boolean;
|
|
20
|
+
bloc?: boolean;
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
/** Le même bouton, mais qui navigue. Un <a> et un <button> ne s'échangent pas :
|
|
24
|
+
* l'un ouvre dans un onglet, se copie et s'indexe, l'autre non. */
|
|
25
|
+
export declare function ButtonLink({ variante, compact, bloc, className, ...reste }: ButtonLinkProps): import("react").JSX.Element;
|
|
26
|
+
export interface ButtonRowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {
|
|
27
|
+
/** Empile les boutons et les étire — la disposition mobile. */
|
|
28
|
+
empile?: boolean;
|
|
29
|
+
className?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function ButtonRow({ empile, className, ...reste }: ButtonRowProps): import("react").JSX.Element;
|
|
32
|
+
export interface LinkArrowProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'className'> {
|
|
33
|
+
/** Sur la bande manifeste, où le lien passe en blanc. */
|
|
34
|
+
surSombre?: boolean;
|
|
35
|
+
className?: string;
|
|
36
|
+
children?: ReactNode;
|
|
37
|
+
}
|
|
38
|
+
/** Lien fléché. La flèche est fournie : elle fait partie du composant, pas du
|
|
39
|
+
* contenu — la recopier à la main a produit trois tracés différents. */
|
|
40
|
+
export declare function LinkArrow({ surSombre, className, children, ...reste }: LinkArrowProps): import("react").JSX.Element;
|
|
41
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../react/actions.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,SAAS,EACV,MAAM,OAAO,CAAA;AAGd,kFAAkF;AAClF,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;AAQ1D,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAClE,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,qDAAqD;IACrD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;oDAEgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,wBAAgB,MAAM,CAAC,EACrB,QAAkB,EAClB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,IAAe,EACf,GAAG,KAAK,EACT,EAAE,WAAW,+BAab;AAED,MAAM,WAAW,eACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAClE,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;oEACoE;AACpE,wBAAgB,UAAU,CAAC,EACzB,QAAkB,EAClB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACT,EAAE,eAAe,+BAYjB;AAED,MAAM,WAAW,cACf,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC;IACzD,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,+BAOxE;AAED,MAAM,WAAW,cACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAClE,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED;yEACyE;AACzE,wBAAgB,SAAS,CAAC,EACxB,SAAS,EACT,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,+BAiBhB"}
|
package/dist/actions.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from './cx.js';
|
|
3
|
+
const VARIANTE_BOUTON = {
|
|
4
|
+
plein: 'zv-btn',
|
|
5
|
+
fantome: 'zv-btn--ghost',
|
|
6
|
+
encre: 'zv-btn--ink',
|
|
7
|
+
};
|
|
8
|
+
export function Button({ variante = 'plein', compact, bloc, className, type = 'button', ...reste }) {
|
|
9
|
+
return (_jsx("button", { type: type, className: cx(VARIANTE_BOUTON[variante], compact && 'zv-btn--sm', bloc && 'zv-btn--block', className), ...reste }));
|
|
10
|
+
}
|
|
11
|
+
/** Le même bouton, mais qui navigue. Un <a> et un <button> ne s'échangent pas :
|
|
12
|
+
* l'un ouvre dans un onglet, se copie et s'indexe, l'autre non. */
|
|
13
|
+
export function ButtonLink({ variante = 'plein', compact, bloc, className, ...reste }) {
|
|
14
|
+
return (_jsx("a", { className: cx(VARIANTE_BOUTON[variante], compact && 'zv-btn--sm', bloc && 'zv-btn--block', className), ...reste }));
|
|
15
|
+
}
|
|
16
|
+
export function ButtonRow({ empile, className, ...reste }) {
|
|
17
|
+
return (_jsx("div", { className: cx('zv-btn-row', empile && 'zv-btn-row--stack', className), ...reste }));
|
|
18
|
+
}
|
|
19
|
+
/** Lien fléché. La flèche est fournie : elle fait partie du composant, pas du
|
|
20
|
+
* contenu — la recopier à la main a produit trois tracés différents. */
|
|
21
|
+
export function LinkArrow({ surSombre, className, children, ...reste }) {
|
|
22
|
+
return (_jsxs("a", { className: cx('zv-link-arrow', surSombre && 'zv-link-arrow--on-dark', className), ...reste, children: [children, _jsxs("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: [_jsx("path", { d: "M5 12h14" }), _jsx("path", { d: "M13 6l6 6-6 6" })] })] }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../react/actions.tsx"],"names":[],"mappings":";AAYA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAK5B,MAAM,eAAe,GAAmC;IACtD,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,eAAe;IACxB,KAAK,EAAE,aAAa;CACrB,CAAA;AAgBD,MAAM,UAAU,MAAM,CAAC,EACrB,QAAQ,GAAG,OAAO,EAClB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,IAAI,GAAG,QAAQ,EACf,GAAG,KAAK,EACI;IACZ,OAAO,CACL,iBACE,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,EAAE,CACX,eAAe,CAAC,QAAQ,CAAC,EACzB,OAAO,IAAI,YAAY,EACvB,IAAI,IAAI,eAAe,EACvB,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAUD;oEACoE;AACpE,MAAM,UAAU,UAAU,CAAC,EACzB,QAAQ,GAAG,OAAO,EAClB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACQ;IAChB,OAAO,CACL,YACE,SAAS,EAAE,EAAE,CACX,eAAe,CAAC,QAAQ,CAAC,EACzB,OAAO,IAAI,YAAY,EACvB,IAAI,IAAI,eAAe,EACvB,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AASD,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAkB;IACvE,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,MAAM,IAAI,mBAAmB,EAAE,SAAS,CAAC,KACjE,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAUD;yEACyE;AACzE,MAAM,UAAU,SAAS,CAAC,EACxB,SAAS,EACT,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACO;IACf,OAAO,CACL,aACE,SAAS,EAAE,EAAE,CACX,eAAe,EACf,SAAS,IAAI,wBAAwB,EACrC,SAAS,CACV,KACG,KAAK,aAER,QAAQ,EACT,eAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,aACzC,eAAM,CAAC,EAAC,UAAU,GAAG,EACrB,eAAM,CAAC,EAAC,eAAe,GAAG,IACtB,IACJ,CACL,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface Exemple {
|
|
3
|
+
/** Identifiant stable — sert d'ancre dans la page de consultation. */
|
|
4
|
+
id: string;
|
|
5
|
+
nom: string;
|
|
6
|
+
/** Ce que le composant fait, et surtout quand NE PAS l'employer. */
|
|
7
|
+
resume: string;
|
|
8
|
+
/** Le code qui produit `rendu`, à copier tel quel. */
|
|
9
|
+
code: string;
|
|
10
|
+
rendu: ReactNode;
|
|
11
|
+
/** Rendu sur la bande manifeste plutôt que sur papier. */
|
|
12
|
+
surSombre?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface GroupeCatalogue {
|
|
15
|
+
id: string;
|
|
16
|
+
nom: string;
|
|
17
|
+
resume: string;
|
|
18
|
+
/** `applicatif` : interfaces internes. `vitrine` : pages publiques.
|
|
19
|
+
* `commun` : les deux. */
|
|
20
|
+
couche: 'commun' | 'applicatif' | 'vitrine';
|
|
21
|
+
/** Le module CSS à charger pour ce groupe. */
|
|
22
|
+
css: string;
|
|
23
|
+
exemples: Exemple[];
|
|
24
|
+
}
|
|
25
|
+
export declare const CATALOGUE: GroupeCatalogue[];
|
|
26
|
+
/** Tous les exemples à plat — pratique pour une recherche ou un test. */
|
|
27
|
+
export declare const EXEMPLES: (Exemple & {
|
|
28
|
+
groupe: string;
|
|
29
|
+
})[];
|
|
30
|
+
//# sourceMappingURL=catalogue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogue.d.ts","sourceRoot":"","sources":["../react/catalogue.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAoChD,MAAM,WAAW,OAAO;IACtB,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAA;IACd,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,SAAS,CAAA;IAChB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd;+BAC2B;IAC3B,MAAM,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAA;IAC3C,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,OAAO,EAAE,CAAA;CACpB;AA0JD,eAAO,MAAM,SAAS,EAAE,eAAe,EA63CtC,CAAA;AAMD,yEAAyE;AACzE,eAAO,MAAM,QAAQ,EAAE,CAAC,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EAEpD,CAAA"}
|