@zevra/ui 0.35.0 → 0.37.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 +306 -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 +84 -59
- 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/react/content.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Contenu
|
|
1
|
+
// Contenu : surfaces, badges et blocs éditoriaux. Sans état, donc sans
|
|
2
2
|
// « use client ».
|
|
3
3
|
|
|
4
4
|
import type { ElementType, HTMLAttributes, ReactNode } from 'react'
|
|
@@ -8,7 +8,7 @@ type Div = Omit<HTMLAttributes<HTMLDivElement>, 'className'>
|
|
|
8
8
|
type Span = Omit<HTMLAttributes<HTMLSpanElement>, 'className'>
|
|
9
9
|
|
|
10
10
|
export interface CardProps extends Div {
|
|
11
|
-
/** Retrait intérieur. Sans, la carte est nue
|
|
11
|
+
/** Retrait intérieur. Sans, la carte est nue : à toi de poser le tien. */
|
|
12
12
|
padding?: 'aucun' | 'normal' | 'large'
|
|
13
13
|
/** Filet coloré : un état porté par la bordure, pas par un fond. */
|
|
14
14
|
etat?: 'ok' | 'err'
|
|
@@ -80,7 +80,7 @@ export interface SrcProps extends Span {
|
|
|
80
80
|
className?: string
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
/** Puce de source
|
|
83
|
+
/** Puce de source : BOSS, Judilibre, KALI. */
|
|
84
84
|
export function Src({ attenue, className, ...reste }: SrcProps) {
|
|
85
85
|
return (
|
|
86
86
|
<span
|
|
@@ -154,7 +154,7 @@ export interface QuoteProps extends Div {
|
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
/** ⚠️ RÈGLE DE CHARTE : jamais de fausse citation. Tant qu'un verbatim client
|
|
157
|
-
* n'a pas été recueilli, ce bloc reste en réserve
|
|
157
|
+
* n'a pas été recueilli, ce bloc reste en réserve : un placeholder crédible
|
|
158
158
|
* finit toujours par partir en production. */
|
|
159
159
|
export function Quote({ auteur, className, children, ...reste }: QuoteProps) {
|
|
160
160
|
return (
|
|
@@ -172,7 +172,7 @@ export interface PriceProps extends Div {
|
|
|
172
172
|
unite?: ReactNode
|
|
173
173
|
/** La mention sous la carte. */
|
|
174
174
|
note?: ReactNode
|
|
175
|
-
/** La formule recommandée
|
|
175
|
+
/** La formule recommandée : bandeau indigo. Trois cartes par page au plus. */
|
|
176
176
|
recommande?: boolean
|
|
177
177
|
className?: string
|
|
178
178
|
children?: ReactNode
|
|
@@ -262,7 +262,7 @@ export interface FaqItemProps
|
|
|
262
262
|
* et la recherche du navigateur (⌘F) l'ouvre toute seule pour montrer ce
|
|
263
263
|
* qu'elle a trouvé.
|
|
264
264
|
*
|
|
265
|
-
* ⚠️ La réponse reste DANS LE DOM quand la question est fermée
|
|
265
|
+
* ⚠️ La réponse reste DANS LE DOM quand la question est fermée : `details`
|
|
266
266
|
* la masque, il ne la retire pas. C'est ce qui permet à une page de porter
|
|
267
267
|
* un balisage `FAQPage` honnête : ce que le moteur lit est bien ce que le
|
|
268
268
|
* visiteur peut ouvrir. Un accordéon qui démonte son contenu annoncerait
|
|
@@ -272,7 +272,7 @@ export interface FaqItemProps
|
|
|
272
272
|
* de `LinkArrow` : recopié à la main, il finit par diverger.
|
|
273
273
|
*
|
|
274
274
|
* `question` accepte un TITRE (`<h3>Ma question</h3>`) : une FAQ de vitrine
|
|
275
|
-
* veut ses questions dans le plan du document
|
|
275
|
+
* veut ses questions dans le plan du document, c'est ce que lisent les
|
|
276
276
|
* moteurs, et ce que parcourt un lecteur d'écran qui saute de titre en
|
|
277
277
|
* titre. Le CSS lui retire ce que le navigateur lui met : le niveau reste
|
|
278
278
|
* au balisage, l'apparence au système. */
|
|
@@ -319,7 +319,7 @@ export interface UiPreviewProps extends Div {
|
|
|
319
319
|
|
|
320
320
|
/** La preuve produit : une question, une réponse, ses sources.
|
|
321
321
|
* ⚠️ RÈGLE DE CHARTE : toujours de VRAIES données réalistes, jamais de
|
|
322
|
-
* lorem
|
|
322
|
+
* lorem, c'est ce bloc qui porte la crédibilité de la page. */
|
|
323
323
|
export function UiPreview({
|
|
324
324
|
question,
|
|
325
325
|
sources,
|
|
@@ -353,7 +353,7 @@ export function Check({ className, ...reste }: Span & { className?: string }) {
|
|
|
353
353
|
}
|
|
354
354
|
|
|
355
355
|
/* ─── Blocs éditoriaux ─────────────────────────────────────────────────
|
|
356
|
-
* HORS
|
|
356
|
+
* HORS RELEVÉ, ajoutés à la demande de la DA (règle de variété du
|
|
357
357
|
* 24/08/2026 : jamais deux blocs de même forme qui se suivent, 80 % de
|
|
358
358
|
* formes différentes par page). Quatre façons de poser du contenu SANS
|
|
359
359
|
* carte, pour que les grilles de cartes redeviennent un choix et non un
|
|
@@ -384,7 +384,7 @@ export function RowsItem({ cle, className, children, ...reste }: RowsItemProps)
|
|
|
384
384
|
}
|
|
385
385
|
|
|
386
386
|
export interface IndexListProps extends Div {
|
|
387
|
-
/** Grille de trois, sans filets
|
|
387
|
+
/** Grille de trois, sans filets : l'espace fait la séparation. */
|
|
388
388
|
cols?: boolean
|
|
389
389
|
className?: string
|
|
390
390
|
}
|
|
@@ -416,14 +416,14 @@ export function IndexItem({ num, className, children, ...reste }: IndexItemProps
|
|
|
416
416
|
)
|
|
417
417
|
}
|
|
418
418
|
|
|
419
|
-
/** Déroulé vertical
|
|
419
|
+
/** Déroulé vertical : la déclinaison verticale de `Steps`, pour les
|
|
420
420
|
* méthodes qui se lisent comme un récit. */
|
|
421
421
|
export function Flow({ className, ...reste }: Div & { className?: string }) {
|
|
422
422
|
return <div className={cx('zv-flow', className)} {...reste} />
|
|
423
423
|
}
|
|
424
424
|
|
|
425
425
|
export interface FlowStepProps extends Div {
|
|
426
|
-
/** Les points reprennent les couleurs des points de méthode
|
|
426
|
+
/** Les points reprennent les couleurs des points de méthode : l'un des
|
|
427
427
|
* trois emplois autorisés du spectre. Sans teinte : iris. */
|
|
428
428
|
teinte?: 'violet' | 'cyan'
|
|
429
429
|
className?: string
|
|
@@ -446,7 +446,7 @@ export interface CalloutProps extends Div {
|
|
|
446
446
|
|
|
447
447
|
/** Encart d'appel sur accent-soft : l'offre transverse qui doit se voir
|
|
448
448
|
* sans crier (remise, renvoi vers une autre page). L'action se passe en
|
|
449
|
-
* enfant
|
|
449
|
+
* enfant : elle se range à droite, et tombe sous le titre sur mobile. */
|
|
450
450
|
export function Callout({ titre, className, children, ...reste }: CalloutProps) {
|
|
451
451
|
return (
|
|
452
452
|
<div className={cx('zv-callout', className)} {...reste}>
|
|
@@ -460,7 +460,7 @@ export interface MediaProps extends Div {
|
|
|
460
460
|
/** Rapport du cadre. Quatre, et pas davantage : un cinquième se demande. */
|
|
461
461
|
ratio?: '16-9' | '4-3' | '1-1' | '3-2'
|
|
462
462
|
/**
|
|
463
|
-
* L'image est CONTENUE au lieu de remplir
|
|
463
|
+
* L'image est CONTENUE au lieu de remplir : un logo, un schéma, une pièce
|
|
464
464
|
* qu'on ne peut pas rogner. Le papier passe alors derrière : il restera du
|
|
465
465
|
* vide, autant qu'il soit choisi.
|
|
466
466
|
*/
|
|
@@ -498,7 +498,7 @@ export interface MediaImgProps
|
|
|
498
498
|
}
|
|
499
499
|
|
|
500
500
|
/**
|
|
501
|
-
* L'image d'un cadre. `alt` est OBLIGATOIRE
|
|
501
|
+
* L'image d'un cadre. `alt` est OBLIGATOIRE, vide pour une image
|
|
502
502
|
* décorative, décrite sinon : c'est un choix, pas un oubli.
|
|
503
503
|
*
|
|
504
504
|
* Un produit qui optimise ses images (next/image) pose la classe
|
|
@@ -537,14 +537,14 @@ export function MediaCoin({ gauche, haut, className, children, ...reste }: Media
|
|
|
537
537
|
}
|
|
538
538
|
|
|
539
539
|
/** Voile de lecture : un titre posé SUR une image n'est lisible qu'au-dessus
|
|
540
|
-
* d'un dégradé. Il ne capte pas le pointeur
|
|
540
|
+
* d'un dégradé. Il ne capte pas le pointeur : le cadre reste cliquable. */
|
|
541
541
|
export function MediaVoile({ className, ...reste }: Span & { className?: string }) {
|
|
542
542
|
return <span aria-hidden="true" className={cx('zv-media__voile', className)} {...reste} />
|
|
543
543
|
}
|
|
544
544
|
|
|
545
545
|
/* ─── Page légale ──────────────────────────────────────────────────────
|
|
546
546
|
* La FORME d'un document contractuel. Le TEXTE vit dans @zevra/legal,
|
|
547
|
-
* versionné et
|
|
547
|
+
* versionné et archivé, ce composant n'en dépend pas : il décrit la forme
|
|
548
548
|
* qu'il sait rendre, et le typage structurel de TypeScript fait le reste.
|
|
549
549
|
* C'est délibéré : le design system ne doit pas dépendre du contenu, sinon
|
|
550
550
|
* une correction de clause deviendrait une livraison de charte. */
|
|
@@ -582,8 +582,8 @@ export interface DocumentLegalRendu {
|
|
|
582
582
|
}
|
|
583
583
|
|
|
584
584
|
/* ⚠️ POURQUOI dangerouslySetInnerHTML EST ACCEPTABLE ICI, ET SEULEMENT ICI.
|
|
585
|
-
* Le texte porte trois balises et trois seulement
|
|
586
|
-
* <a href>
|
|
585
|
+
* Le texte porte trois balises et trois seulement (<strong>, <em>,
|
|
586
|
+
* <a href>) qui ont un sens JURIDIQUE : une clause mise en avant par
|
|
587
587
|
* l'auteur, un renvoi vers un autre contrat. Les retirer appauvrirait le
|
|
588
588
|
* document ; les rendre en texte brut afficherait des chevrons.
|
|
589
589
|
* Ce contenu vient d'un dépôt versionné, JAMAIS d'une saisie utilisateur, et
|
|
@@ -671,7 +671,7 @@ function BlocRendu({ bloc }: { bloc: BlocLegal }) {
|
|
|
671
671
|
|
|
672
672
|
/** Le rendu d'un document contractuel. Le sommaire ne fait PAS partie du
|
|
673
673
|
* composant : il se pose à côté avec `Rail`, dont les ancres sont les `id`
|
|
674
|
-
* de section
|
|
674
|
+
* de section, c'est ce qui permet de le placer en marge sur la vitrine et
|
|
675
675
|
* de l'omettre dans un tunnel d'inscription.
|
|
676
676
|
*
|
|
677
677
|
* ⚠️ Ne jamais tronquer un document contractuel derrière un « voir plus » :
|
|
@@ -736,10 +736,10 @@ export interface PageErreurProps extends Div {
|
|
|
736
736
|
* seul le code s'affiche.
|
|
737
737
|
*
|
|
738
738
|
* ⚠️ EN PROP, et pas en dur : une 404 anglaise de Mémoire affichait
|
|
739
|
-
* « Erreur 404 ». Le composant est censé ne porter aucun texte
|
|
740
|
-
* écrit dans son arbitrage
|
|
739
|
+
* « Erreur 404 ». Le composant est censé ne porter aucun texte, c'est
|
|
740
|
+
* écrit dans son arbitrage, et il en portait quand même. */
|
|
741
741
|
libelle?: string
|
|
742
|
-
/** L'URL du glyphe
|
|
742
|
+
/** L'URL du glyphe : `GLYPHES.memoire` de `@zevra/ui/glyphes`. Sur une
|
|
743
743
|
* page qui n'a plus de contenu, c'est le seul repère qui dise encore où
|
|
744
744
|
* l'on se trouve. */
|
|
745
745
|
glyphe?: string
|
|
@@ -751,14 +751,14 @@ export interface PageErreurProps extends Div {
|
|
|
751
751
|
* ⚠️ Il valait `"Zevra"` en dur jusqu'à la 0.33.0 : sur la 404 de
|
|
752
752
|
* Mémoire, un lecteur d'écran annonçait « Zevra » devant le M de Mémoire,
|
|
753
753
|
* et aucune prop ne permettait de le corriger. Une valeur qu'une app aura
|
|
754
|
-
* légitimement besoin d'ajuster ne se pose pas en dur
|
|
754
|
+
* légitimement besoin d'ajuster ne se pose pas en dur : c'est la règle du
|
|
755
755
|
* dépôt, et celle-ci l'enfreignait. */
|
|
756
756
|
glypheAlt?: string
|
|
757
757
|
/** Le titre. ⚠️ Il dit la panne EN CLAIR : « Page introuvable », pas un
|
|
758
758
|
* jeu de mots. L'esprit vient dans le texte, jamais avant l'information. */
|
|
759
759
|
titre: ReactNode
|
|
760
760
|
/** Les actions : un bouton plein pour la sortie, un fantôme pour le
|
|
761
|
-
* recours. Deux au plus
|
|
761
|
+
* recours. Deux au plus : au-delà, la page d'erreur devient un menu. */
|
|
762
762
|
actions?: ReactNode
|
|
763
763
|
/** La cote de l'incident (`GET /dossier/2019`). Elle donne au visiteur de
|
|
764
764
|
* quoi signaler la panne et au support de quoi la retrouver. */
|
|
@@ -769,12 +769,12 @@ export interface PageErreurProps extends Div {
|
|
|
769
769
|
}
|
|
770
770
|
|
|
771
771
|
/**
|
|
772
|
-
* Une page entière d'erreur
|
|
772
|
+
* Une page entière d'erreur : 404, 403, 410, 500, maintenance.
|
|
773
773
|
*
|
|
774
774
|
* ⚠️ ELLE NE PORTE AUCUN TEXTE PAR DÉFAUT, et c'est délibéré : une
|
|
775
775
|
* plaisanterie câblée dans un design system part dans les sept apps, dans
|
|
776
|
-
* une seule langue, et n'en revient jamais. La copie de référence
|
|
777
|
-
* qui plaisante en vocabulaire juridique
|
|
776
|
+
* une seule langue, et n'en revient jamais. La copie de référence, celle
|
|
777
|
+
* qui plaisante en vocabulaire juridique, vit dans l'exemple du catalogue,
|
|
778
778
|
* là où on la lit avant de la copier.
|
|
779
779
|
*/
|
|
780
780
|
export function PageErreur({
|