@cyrilld/zestds 0.1.0 → 1.0.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/README.md +1156 -48
- package/dist/cursors.cjs +2 -1
- package/dist/cursors.cjs.map +1 -1
- package/dist/cursors.d.cts +0 -1
- package/dist/cursors.d.ts +0 -1
- package/dist/cursors.js +2 -1
- package/dist/cursors.js.map +1 -1
- package/dist/flags.cjs +2 -1
- package/dist/flags.cjs.map +1 -1
- package/dist/flags.d.cts +1 -2
- package/dist/flags.d.ts +1 -2
- package/dist/flags.js +2 -1
- package/dist/flags.js.map +1 -1
- package/dist/index.cjs +704 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1498 -5
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +665 -6
- package/dist/index.d.ts +665 -6
- package/dist/index.js +684 -7
- package/dist/index.js.map +1 -1
- package/package.json +12 -4
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { SVGProps } from 'react';
|
|
2
|
+
import { SVGProps, ButtonHTMLAttributes, ReactNode, HTMLAttributes, MouseEvent, ReactElement, InputHTMLAttributes } from 'react';
|
|
3
3
|
|
|
4
4
|
declare const Home01: {
|
|
5
5
|
(props: SVGProps<SVGSVGElement>): react.JSX.Element;
|
|
@@ -409,6 +409,14 @@ declare const Inbox01: {
|
|
|
409
409
|
(props: SVGProps<SVGSVGElement>): react.JSX.Element;
|
|
410
410
|
displayName: string;
|
|
411
411
|
};
|
|
412
|
+
declare const MessageAlertSquare01: {
|
|
413
|
+
(props: SVGProps<SVGSVGElement>): react.JSX.Element;
|
|
414
|
+
displayName: string;
|
|
415
|
+
};
|
|
416
|
+
declare const MessageAlertSquare02: {
|
|
417
|
+
(props: SVGProps<SVGSVGElement>): react.JSX.Element;
|
|
418
|
+
displayName: string;
|
|
419
|
+
};
|
|
412
420
|
declare const Circle: {
|
|
413
421
|
(props: SVGProps<SVGSVGElement>): react.JSX.Element;
|
|
414
422
|
displayName: string;
|
|
@@ -486,6 +494,659 @@ declare const ChevronUp: {
|
|
|
486
494
|
displayName: string;
|
|
487
495
|
};
|
|
488
496
|
|
|
497
|
+
type ButtonSize = "xs" | "sm" | "md" | "lg" | "xl";
|
|
498
|
+
/**
|
|
499
|
+
* Les onze hiérarchies, en une liste PLATE.
|
|
500
|
+
*
|
|
501
|
+
* Le Figma les range en deux cadres — `Buttons/Button` en donne sept,
|
|
502
|
+
* `Buttons/Button destructive` en donne quatre — mais « destructif » n'est pas
|
|
503
|
+
* un axe orthogonal : la famille destructive ne reprend que quatre des sept.
|
|
504
|
+
* Il n'existe ni `secondary-white` destructif, ni `tertiary-gray` destructif.
|
|
505
|
+
*
|
|
506
|
+
* Une propriété booléenne `destructive` rendrait donc exprimables quatre
|
|
507
|
+
* combinaisons que personne n'a dessinées, et le composant devrait choisir
|
|
508
|
+
* quoi peindre pour chacune. Une liste plate rend l'impossible inexprimable :
|
|
509
|
+
* c'est le typage qui refuse, pas une valeur par défaut qui rattrape.
|
|
510
|
+
*/
|
|
511
|
+
type ButtonHierarchy = "primary" | "secondary-gray" | "secondary-white" | "tertiary-color" | "tertiary-gray" | "link-color" | "link-gray" | "primary-destructive" | "secondary-destructive" | "tertiary-destructive" | "link-destructive";
|
|
512
|
+
interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
513
|
+
/** `xs` 32 px · `sm` 36 · `md` 40 · `lg` 44 · `xl` 48. */
|
|
514
|
+
size?: ButtonSize;
|
|
515
|
+
hierarchy?: ButtonHierarchy;
|
|
516
|
+
/** L'icône avant le libellé. En chargement, elle cède la place au spinner. */
|
|
517
|
+
iconLeading?: ReactNode;
|
|
518
|
+
/** L'icône après le libellé. En chargement, le Figma la retire. */
|
|
519
|
+
iconTrailing?: ReactNode;
|
|
520
|
+
/**
|
|
521
|
+
* En cours d'envoi. Le bouton reste ATTEIGNABLE au clavier — voir plus bas
|
|
522
|
+
* pourquoi ce n'est pas un `disabled`.
|
|
523
|
+
*/
|
|
524
|
+
loading?: boolean;
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Le bouton de Zest.
|
|
528
|
+
*
|
|
529
|
+
* ------------------------------------------------------------------------
|
|
530
|
+
* « ICÔNE SEULE » N'EST PAS UNE PROPRIÉTÉ
|
|
531
|
+
* ------------------------------------------------------------------------
|
|
532
|
+
* Le Figma en fait une variante (`Icon only=True/False`), mais un composant
|
|
533
|
+
* qui accepterait à la fois `iconOnly` et un libellé aurait un état
|
|
534
|
+
* contradictoire à arbitrer. Ici la forme se DÉDUIT de l'absence de libellé :
|
|
535
|
+
* pas d'enfants, donc un carré. Il n'y a rien à tenir cohérent.
|
|
536
|
+
*
|
|
537
|
+
* ------------------------------------------------------------------------
|
|
538
|
+
* LE CHARGEMENT N'EST PAS UN `disabled`, ET C'EST DÉLIBÉRÉ
|
|
539
|
+
* ------------------------------------------------------------------------
|
|
540
|
+
* Un `disabled` sort l'élément de l'ordre de tabulation. Le focus est donc
|
|
541
|
+
* perdu à l'instant où l'on presse « Envoyer », et il retombe sur le `body` :
|
|
542
|
+
* un utilisateur au clavier se retrouve en haut du document, sans savoir où il
|
|
543
|
+
* était. On pose donc `aria-disabled` — qui annonce l'indisponibilité sans
|
|
544
|
+
* retirer la pièce — et l'activation est bloquée en avalant le clic. Presser
|
|
545
|
+
* Entrée ou Espace sur un bouton déclenche un clic, donc les deux chemins
|
|
546
|
+
* passent par le même garde.
|
|
547
|
+
*/
|
|
548
|
+
declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAttributes<HTMLButtonElement>>;
|
|
549
|
+
|
|
550
|
+
type CloseButtonSize = "sm" | "md" | "lg";
|
|
551
|
+
interface CloseButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
552
|
+
/** `sm` 36 px · `md` 40 · `lg` 44. La croix de `lg` fait 24 px, les deux autres 20. */
|
|
553
|
+
size?: CloseButtonSize;
|
|
554
|
+
/** Posé sur une photo ou un aplat sombre : croix blanche, survol en voile blanc. */
|
|
555
|
+
onDark?: boolean;
|
|
556
|
+
/**
|
|
557
|
+
* Le nom annoncé. « Fermer » par défaut, parce qu'un bouton dont le seul
|
|
558
|
+
* contenu est un dessin n'a AUCUN nom accessible et s'annonce « bouton ».
|
|
559
|
+
* À préciser quand la page en contient plusieurs — « Fermer la modale »,
|
|
560
|
+
* « Masquer la bannière ».
|
|
561
|
+
*/
|
|
562
|
+
label?: string;
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* La croix de fermeture — voir l'en-tête de `CloseButton.css` pour les deux
|
|
566
|
+
* endroits où le relevé s'écarte du Figma, et pourquoi.
|
|
567
|
+
*
|
|
568
|
+
* Elle ne prend pas d'icône en propriété : c'est une croix, et une croix de
|
|
569
|
+
* fermeture qui accepterait un autre dessin ne serait plus un bouton de
|
|
570
|
+
* fermeture mais le `UtilityButton`, qui existe pour ça juste à côté.
|
|
571
|
+
*/
|
|
572
|
+
declare const CloseButton: react.ForwardRefExoticComponent<CloseButtonProps & react.RefAttributes<HTMLButtonElement>>;
|
|
573
|
+
|
|
574
|
+
type UtilityButtonSize = "xs" | "sm";
|
|
575
|
+
type UtilityButtonHierarchy = "secondary" | "tertiary";
|
|
576
|
+
interface UtilityButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
577
|
+
/** `xs` 28 px (icône 16) · `sm` 32 px (icône 20). Le 28 n'existe nulle part ailleurs. */
|
|
578
|
+
size?: UtilityButtonSize;
|
|
579
|
+
hierarchy?: UtilityButtonHierarchy;
|
|
580
|
+
/** Le dessin. Obligatoire : ce bouton n'est fait que de ça. */
|
|
581
|
+
icon: ReactNode;
|
|
582
|
+
/**
|
|
583
|
+
* Le nom annoncé. Obligatoire, et sans valeur par défaut : contrairement
|
|
584
|
+
* à la croix de fermeture, on ne peut pas deviner ce que fait un bouton
|
|
585
|
+
* dont l'icône change à chaque emploi. Le rendre facultatif produirait des
|
|
586
|
+
* boutons parfaitement dessinés et annoncés « bouton ».
|
|
587
|
+
*/
|
|
588
|
+
label: string;
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Le bouton utilitaire — voir l'en-tête de `UtilityButton.css`, notamment pour
|
|
592
|
+
* la bordure que le Figma peint sur la mauvaise collection.
|
|
593
|
+
*
|
|
594
|
+
* Il n'a pas d'état de chargement : le Figma ne lui en dessine pas, et une
|
|
595
|
+
* barre d'outils n'est pas l'endroit où l'on attend la fin d'un envoi.
|
|
596
|
+
*/
|
|
597
|
+
declare const UtilityButton: react.ForwardRefExoticComponent<UtilityButtonProps & react.RefAttributes<HTMLButtonElement>>;
|
|
598
|
+
|
|
599
|
+
type SpinnerSize = "sm" | "md";
|
|
600
|
+
interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {
|
|
601
|
+
/** 20 px (`sm`) ou 24 px (`md`) — les deux seules tailles du Figma. */
|
|
602
|
+
size?: SpinnerSize;
|
|
603
|
+
/**
|
|
604
|
+
* Le texte annoncé aux lecteurs d'écran.
|
|
605
|
+
*
|
|
606
|
+
* Vide par défaut, et c'est voulu : dans un bouton, c'est le bouton qui
|
|
607
|
+
* porte `aria-busy` et son propre libellé (« Envoi… »). Un spinner qui
|
|
608
|
+
* annoncerait « Chargement » en plus ferait entendre l'information deux
|
|
609
|
+
* fois. Ne le remplir que pour un spinner POSÉ SEUL sur une page.
|
|
610
|
+
*/
|
|
611
|
+
label?: string;
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* L'indicateur de chargement — voir l'en-tête de `Spinner.css` pour ce qui est
|
|
615
|
+
* relevé et ce qui est construit.
|
|
616
|
+
*
|
|
617
|
+
* Le Figma le range sous `Buttons/`, mais il n'est pas un bouton : il est
|
|
618
|
+
* exporté à part parce qu'un chargement ne se produit pas qu'à l'intérieur
|
|
619
|
+
* d'une commande.
|
|
620
|
+
*/
|
|
621
|
+
declare const Spinner: react.ForwardRefExoticComponent<SpinnerProps & react.RefAttributes<HTMLSpanElement>>;
|
|
622
|
+
|
|
623
|
+
type BadgeSize = "sm" | "md" | "lg";
|
|
624
|
+
/**
|
|
625
|
+
* Les trois habillages du cadre `Badge` (3869:2612).
|
|
626
|
+
*
|
|
627
|
+
* `pill` et `badge` sont deux fonds DOUX qui ne diffèrent que par leur rayon —
|
|
628
|
+
* plein contre 6 px — et par 2 px de padding. `modern` est un fond blanc bordé,
|
|
629
|
+
* où la couleur ne vit que dans les PIÈCES : son fond, sa bordure et son
|
|
630
|
+
* libellé sont les mêmes pour les treize couleurs.
|
|
631
|
+
*
|
|
632
|
+
* Le Figma les nomme `Pill color`, `Badge color` et `Badge modern`. Le mot
|
|
633
|
+
* « color » y distingue les deux premiers du troisième ; il ne dit rien de
|
|
634
|
+
* plus, et il ne survit donc pas à la traduction.
|
|
635
|
+
*/
|
|
636
|
+
type BadgeType = "pill" | "badge" | "modern";
|
|
637
|
+
/**
|
|
638
|
+
* Les treize couleurs, nommées avec les mots du THÈME et non ceux du Figma.
|
|
639
|
+
*
|
|
640
|
+
* Le cadre les étiquette en français — `Bleu horizon`, `Vert tilleul`,
|
|
641
|
+
* `Jaune` — alors que le thème les déclare `utility-horizon`, `utility-lime`
|
|
642
|
+
* et `utility-yellow` depuis le portage. Employer les étiquettes du Figma
|
|
643
|
+
* obligerait à traduire à chaque aller-retour entre une classe CSS et un
|
|
644
|
+
* jeton ; la page « Badges » affiche les deux vocabulaires côte à côte, et
|
|
645
|
+
* c'est le seul endroit où la correspondance a besoin d'être visible.
|
|
646
|
+
*
|
|
647
|
+
* ⚠️ DEUX NEUTRES, ET C'EST LE FIGMA QUI EN OFFRE DEUX. `navy` est le neutre
|
|
648
|
+
* de Zest — celui des textes et des bordures — et `gray` celui de la livraison
|
|
649
|
+
* de référence. Les deux badges se ressemblent beaucoup. Voir « En attente »
|
|
650
|
+
* dans le README : ce doublon est vraisemblablement une migration inachevée,
|
|
651
|
+
* mais ce n'est pas au composant de le trancher.
|
|
652
|
+
*/
|
|
653
|
+
type BadgeColor = "brand" | "gray" | "navy" | "error" | "warning" | "success" | "horizon" | "lime" | "turquoise" | "violet" | "fuschia" | "rose" | "yellow";
|
|
654
|
+
/**
|
|
655
|
+
* ------------------------------------------------------------------------
|
|
656
|
+
* POURQUOI QUATRE EMPLACEMENTS ET NON UN AXE À CINQ VALEURS
|
|
657
|
+
* ------------------------------------------------------------------------
|
|
658
|
+
* Le Figma range le point, la croix, l'icône de tête et l'icône de fin sur UN
|
|
659
|
+
* axe `Icon` à cinq valeurs, donc mutuellement exclusives. Ce composant en
|
|
660
|
+
* fait quatre propriétés indépendantes, et l'écart est délibéré.
|
|
661
|
+
*
|
|
662
|
+
* Un jeu de variantes Figma ne sait pas exprimer « deux emplacements
|
|
663
|
+
* optionnels » : il faudrait multiplier les variantes par quatre pour couvrir
|
|
664
|
+
* les combinaisons. L'exclusivité est donc une contrainte de l'OUTIL, pas une
|
|
665
|
+
* règle du produit — et un badge qui porte à la fois un point d'état et une
|
|
666
|
+
* croix de retrait est une pièce d'interface courante.
|
|
667
|
+
*
|
|
668
|
+
* C'est l'inverse du choix fait sur `Button`, dont les onze hiérarchies sont
|
|
669
|
+
* une liste plate : là, un booléen `destructive` aurait rendu exprimables
|
|
670
|
+
* quatre combinaisons de COULEUR que personne n'a dessinées et que le
|
|
671
|
+
* composant aurait dû inventer. Ici, rien à inventer : chaque emplacement
|
|
672
|
+
* porte sa propre géométrie, relevée, et les combiner ne demande aucune valeur
|
|
673
|
+
* nouvelle.
|
|
674
|
+
*/
|
|
675
|
+
interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, "color"> {
|
|
676
|
+
/** `sm` 22 px · `md` 24 · `lg` 28. Seul `sm` descend le texte à 12 px. */
|
|
677
|
+
size?: BadgeSize;
|
|
678
|
+
type?: BadgeType;
|
|
679
|
+
color?: BadgeColor;
|
|
680
|
+
/** Le point d'état, 8 px dans les trois tailles. */
|
|
681
|
+
dot?: boolean;
|
|
682
|
+
/** L'icône avant le libellé, rendue dans une boîte de 12 px. */
|
|
683
|
+
iconLeading?: ReactNode;
|
|
684
|
+
/** L'icône après le libellé, rendue dans une boîte de 12 px. */
|
|
685
|
+
iconTrailing?: ReactNode;
|
|
686
|
+
/**
|
|
687
|
+
* La croix de retrait. Sa présence est ce qui la dessine : il n'y a pas de
|
|
688
|
+
* propriété `closable` à tenir d'accord avec elle.
|
|
689
|
+
*/
|
|
690
|
+
onClose?: (evenement: MouseEvent<HTMLButtonElement>) => void;
|
|
691
|
+
/**
|
|
692
|
+
* Le nom accessible de la croix. À défaut, il est composé du libellé quand
|
|
693
|
+
* celui-ci est du texte — « Retirer Terminé » — parce qu'une page qui
|
|
694
|
+
* affiche huit badges affiche huit croix, et que huit commandes qui
|
|
695
|
+
* s'annoncent toutes « Retirer » ne se distinguent pas au clavier.
|
|
696
|
+
*/
|
|
697
|
+
closeLabel?: string;
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Le badge de Zest.
|
|
701
|
+
*
|
|
702
|
+
* Relevé sur trois cadres du Figma le 2026-09-10 : `Badge` (3869:2612),
|
|
703
|
+
* `_Dot` (3874:1192) et `_Badge close X` (3869:4461).
|
|
704
|
+
*
|
|
705
|
+
* ------------------------------------------------------------------------
|
|
706
|
+
* IL N'Y A PAS DE BADGE EN APLAT
|
|
707
|
+
* ------------------------------------------------------------------------
|
|
708
|
+
* Les trois habillages sont deux fonds doux et un fond blanc. Aucun ne pose de
|
|
709
|
+
* texte blanc sur une couleur saturée, donc `bg-success-solid` et
|
|
710
|
+
* `bg-warning-solid` — les deux jetons sous l'AA qui « bloquaient » les badges
|
|
711
|
+
* depuis le 2026-09-09 — ne sont employés par aucun d'eux. La décision reste à
|
|
712
|
+
* prendre, elle ne concerne pas ce composant.
|
|
713
|
+
*
|
|
714
|
+
* ------------------------------------------------------------------------
|
|
715
|
+
* CE QUI N'EST PAS UN RELEVÉ
|
|
716
|
+
* ------------------------------------------------------------------------
|
|
717
|
+
* ⚠️ L'ÉTAT DE FOCUS DE LA CROIX EST UN AJOUT. Le cadre `_Badge close X` ne
|
|
718
|
+
* dessine que `Default` et `Hover`. Une commande sans focus visible ne
|
|
719
|
+
* s'emploie pas au clavier : l'anneau reprend la recette du `CloseButton`.
|
|
720
|
+
*/
|
|
721
|
+
declare const Badge: react.ForwardRefExoticComponent<BadgeProps & react.RefAttributes<HTMLSpanElement>>;
|
|
722
|
+
|
|
723
|
+
/** 24, 32, 40, 48, 56 et 64 px. Six tailles, six paliers typographiques. */
|
|
724
|
+
type AvatarSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
|
|
725
|
+
/** Les trois tailles que le groupe et le bouton d'ajout dessinent. */
|
|
726
|
+
type AvatarGroupSize = "xs" | "sm" | "md";
|
|
727
|
+
/**
|
|
728
|
+
* Les trois statuts du cadre `Status icon` (3881:5020).
|
|
729
|
+
*
|
|
730
|
+
* ⚠️ `sensitive-comment` N'EST PAS UN STATUT DE PRÉSENCE, contrairement aux
|
|
731
|
+
* deux autres. C'est une ALERTE : elle signale que des commentaires jugés
|
|
732
|
+
* sensibles ont été détectés dans les réponses écrites de la personne. Le
|
|
733
|
+
* Figma l'étiquette « Com. sensible », abrégé pour tenir dans un nom de
|
|
734
|
+
* variante ; le nom complet est « commentaire sensible ».
|
|
735
|
+
*
|
|
736
|
+
* ⚠️ ET SON DESSIN NE SUIT PAS CELUI DES DEUX AUTRES. Son disque remplit tout
|
|
737
|
+
* le cadre de 16 px au lieu de s'y inscrire à 12,5 % comme « en ligne » et
|
|
738
|
+
* « hors ligne », donc il paraît plus gros quand les trois voisinent. Relevé
|
|
739
|
+
* tel quel — les maquettes font foi — et signalé dans la page.
|
|
740
|
+
*/
|
|
741
|
+
type AvatarStatus = "online" | "offline" | "sensitive-comment";
|
|
742
|
+
interface AvatarProps extends Omit<HTMLAttributes<HTMLSpanElement>, "color"> {
|
|
743
|
+
/** `xs` 24 px · `sm` 32 · `md` 40 · `lg` 48 · `xl` 56 · `2xl` 64. */
|
|
744
|
+
size?: AvatarSize;
|
|
745
|
+
/** La photo. Premier de l'ordre de priorité. */
|
|
746
|
+
src?: string;
|
|
747
|
+
/**
|
|
748
|
+
* Le texte de remplacement de la photo.
|
|
749
|
+
*
|
|
750
|
+
* ⚠️ N'Y METTEZ PAS LE NOM DE LA PERSONNE si le nom est déjà écrit à côté
|
|
751
|
+
* de l'avatar : un lecteur d'écran l'annoncerait deux fois. Une chaîne
|
|
752
|
+
* vide est la bonne réponse dans ce cas, et c'est le défaut.
|
|
753
|
+
*/
|
|
754
|
+
alt?: string;
|
|
755
|
+
/**
|
|
756
|
+
* Le texte de la pastille — les initiales. Deuxième de l'ordre de
|
|
757
|
+
* priorité, employé quand il n'y a pas de photo.
|
|
758
|
+
*
|
|
759
|
+
* C'est aussi ce qui porte le « +5 » d'un groupe : la pastille est la même
|
|
760
|
+
* pièce, et lui donner deux noms l'aurait dédoublée.
|
|
761
|
+
*/
|
|
762
|
+
initials?: string;
|
|
763
|
+
/**
|
|
764
|
+
* Le masque de l'anonyme. Il GAGNE sur la photo et sur les initiales, et
|
|
765
|
+
* il interdit le point de statut — voir l'en-tête de la feuille.
|
|
766
|
+
*/
|
|
767
|
+
anonymous?: boolean;
|
|
768
|
+
/** L'anneau blanc bordé, avec son ombre. */
|
|
769
|
+
border?: boolean;
|
|
770
|
+
status?: AvatarStatus;
|
|
771
|
+
/** Le nom accessible du statut. À défaut, celui de `NOM_DU_STATUT`. */
|
|
772
|
+
statusLabel?: string;
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* L'avatar de Zest.
|
|
776
|
+
*
|
|
777
|
+
* Relevé le 2026-09-10 sur cinq cadres du Figma. Le contenu se DÉDUIT de ce
|
|
778
|
+
* qu'on donne, dans l'ordre arbitré par l'équipe produit — photo, puis
|
|
779
|
+
* initiales, puis picto — et l'anonyme passe devant tout.
|
|
780
|
+
*
|
|
781
|
+
* ⚠️ UNE PHOTO QUI NE CHARGE PAS RETOMBE DANS LE MÊME ORDRE. Ce n'est pas dans
|
|
782
|
+
* le Figma, qui ne dessine pas d'états d'erreur : c'est la même règle produit
|
|
783
|
+
* appliquée à l'exécution. Une URL morte donnait sinon un rond vide, et un
|
|
784
|
+
* rond vide ne dit rien — alors que les initiales, elles, disent qui c'est.
|
|
785
|
+
*/
|
|
786
|
+
declare const Avatar: react.ForwardRefExoticComponent<AvatarProps & react.RefAttributes<HTMLSpanElement>>;
|
|
787
|
+
interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {
|
|
788
|
+
/** `xs` 24 px · `sm` 32 · `md` 40. Le Figma n'en dessine pas d'autres. */
|
|
789
|
+
size?: AvatarGroupSize;
|
|
790
|
+
/**
|
|
791
|
+
* Combien d'avatars avant la pastille « +N ». Au-delà, les suivants sont
|
|
792
|
+
* comptés et non dessinés.
|
|
793
|
+
*/
|
|
794
|
+
max?: number;
|
|
795
|
+
/**
|
|
796
|
+
* Sa présence dessine le bouton d'ajout. Il n'y a pas de propriété
|
|
797
|
+
* `addButton` à tenir d'accord avec elle.
|
|
798
|
+
*/
|
|
799
|
+
onAdd?: (evenement: MouseEvent<HTMLButtonElement>) => void;
|
|
800
|
+
/** Le nom accessible du bouton d'ajout. */
|
|
801
|
+
addLabel?: string;
|
|
802
|
+
/** Les avatars. La taille du groupe leur est imposée. */
|
|
803
|
+
children?: ReactNode;
|
|
804
|
+
}
|
|
805
|
+
/**
|
|
806
|
+
* Plusieurs avatars qui se chevauchent.
|
|
807
|
+
*
|
|
808
|
+
* ⚠️ IL IMPOSE SA TAILLE À SES ENFANTS, et c'est nécessaire : le
|
|
809
|
+
* chevauchement est un nombre de pixels — −4, −8, −12 — et non une proportion.
|
|
810
|
+
* Un avatar `lg` glissé dans un groupe `xs` se chevaucherait de 4 px sur 48,
|
|
811
|
+
* soit presque rien, et la pile se lirait comme une file. L'imposition passe
|
|
812
|
+
* par `cloneElement` : voir le commentaire du rendu, où une première version
|
|
813
|
+
* la croyait faite en CSS alors qu'elle ne l'était pas.
|
|
814
|
+
*/
|
|
815
|
+
declare const AvatarGroup: react.ForwardRefExoticComponent<AvatarGroupProps & react.RefAttributes<HTMLDivElement>>;
|
|
816
|
+
/** `sm` 32 px · `md` 40 · `lg` 48. Trois tailles, trois paliers de texte. */
|
|
817
|
+
type AvatarLabelGroupSize = "sm" | "md" | "lg";
|
|
818
|
+
interface AvatarLabelGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, "color"> {
|
|
819
|
+
size?: AvatarLabelGroupSize;
|
|
820
|
+
/** Le nom, en semibold. */
|
|
821
|
+
name: string;
|
|
822
|
+
/** L'adresse ou la fonction, en regular, sous le nom. */
|
|
823
|
+
supportingText?: string;
|
|
824
|
+
src?: string;
|
|
825
|
+
initials?: string;
|
|
826
|
+
anonymous?: boolean;
|
|
827
|
+
status?: AvatarStatus;
|
|
828
|
+
statusLabel?: string;
|
|
829
|
+
}
|
|
830
|
+
/**
|
|
831
|
+
* Un avatar, un nom, et une ligne de soutien.
|
|
832
|
+
*
|
|
833
|
+
* ⚠️ SON AVATAR PORTE LA BORDURE, et ce n'est pas au choix : les trois
|
|
834
|
+
* spécimens du cadre `Avatar label group` sont dessinés en `Border=True`. Un
|
|
835
|
+
* avatar nu à côté d'un nom se lirait comme une autre pièce.
|
|
836
|
+
*
|
|
837
|
+
* ⚠️ LE `alt` DE L'AVATAR EST VIDE, DÉLIBÉRÉMENT. Le nom est écrit juste à
|
|
838
|
+
* côté : le répéter dans l'image le ferait annoncer deux fois de suite. C'est
|
|
839
|
+
* la règle que la page « Avatars » énonce depuis le portage.
|
|
840
|
+
*/
|
|
841
|
+
declare const AvatarLabelGroup: react.ForwardRefExoticComponent<AvatarLabelGroupProps & react.RefAttributes<HTMLDivElement>>;
|
|
842
|
+
|
|
843
|
+
/**
|
|
844
|
+
* Le masque de l'avatar anonyme — relevé le 2026-09-10 sur le cadre `Avatar`
|
|
845
|
+
* du Figma, variante `Anonymous=True` (3881:8349, tracé 3881:8394).
|
|
846
|
+
*
|
|
847
|
+
* ⚠️ IL N'EST PAS DANS LE CATALOGUE DES ICÔNES, ET C'EST VOULU. Les 135 icônes
|
|
848
|
+
* sont générées depuis la page « Icônes » du Figma ; ce loup-là n'y est pas —
|
|
849
|
+
* il vit dans le composant Avatar, dessiné à ses proportions. Son cadre fait
|
|
850
|
+
* 40 × 19, soit toute la largeur de l'avatar pour 47,5 % de sa hauteur, et il
|
|
851
|
+
* ne se lit pas à 24 × 24 comme une icône du catalogue.
|
|
852
|
+
*
|
|
853
|
+
* ⚠️ IL EST PEINT EN `currentColor`, alors que le Figma le fixe à
|
|
854
|
+
* `Bleu marine/100`. C'est l'enveloppe `.zds-avatar__mask` qui pose cette
|
|
855
|
+
* couleur, par `--zds-color-avatar-mask` : le tracé, lui, suit son parent, ce
|
|
856
|
+
* qui laisse un anonyme se poser sur un fond sombre le jour où il le faudra.
|
|
857
|
+
*
|
|
858
|
+
* `aria-hidden` : ce dessin ne s'annonce pas. C'est le `alt` de l'avatar qui
|
|
859
|
+
* porte le sens, et « masque de carnaval » n'aiderait personne à comprendre
|
|
860
|
+
* qu'une réponse est anonymisée.
|
|
861
|
+
*/
|
|
862
|
+
declare const AvatarMask: (props: SVGProps<SVGSVGElement>) => react.JSX.Element;
|
|
863
|
+
|
|
864
|
+
/**
|
|
865
|
+
* L'info-bulle.
|
|
866
|
+
*
|
|
867
|
+
* Relevée sur deux cadres du Figma le 2026-09-10 : `Tooltip` (3266:935, 14
|
|
868
|
+
* symboles) pour la bulle, `Help icon` (3266:1096, 28 symboles) pour le
|
|
869
|
+
* composite à icône d'aide.
|
|
870
|
+
*
|
|
871
|
+
* ⚠️ LE PLACEMENT EST CHOISI PAR LE DÉVELOPPEUR, ET IL N'Y A AUCUNE BASCULE
|
|
872
|
+
* AUTOMATIQUE. Arbitrage du lead dev front, le 2026-09-10 : pas de bibliothèque
|
|
873
|
+
* de positionnement. Le composant offre les six placements que la maquette
|
|
874
|
+
* dessine, en CSS ; c'est l'appelant qui en choisit un.
|
|
875
|
+
*
|
|
876
|
+
* La conséquence est à connaître avant de s'en servir : **une info-bulle placée
|
|
877
|
+
* près du bord de l'écran en sortira.** Rien ne la retournera. C'est le prix de
|
|
878
|
+
* zéro dépendance d'exécution, et il est assumé — la page de documentation
|
|
879
|
+
* énonce les trois cas où il faut changer de placement.
|
|
880
|
+
*
|
|
881
|
+
* ⚠️ UNE DÉCISION EN A ANNULÉ UNE DE LA VEILLE, ET LE DÉTOUR A SERVI. Une
|
|
882
|
+
* première version passait par `react-aria-components`, déjà employée en
|
|
883
|
+
* production sur les projets Zest. Le lead dev front a tranché autrement. Ce
|
|
884
|
+
* qu'on garde du détour, ce sont ses MESURES : le recouvrement de la flèche, le
|
|
885
|
+
* retrait de 12 px sur les placements décalés et l'écart de 4 px au déclencheur
|
|
886
|
+
* ont été relevés dans un vrai navigateur, et ils sont reproduits ici à
|
|
887
|
+
* l'identique. Trois défauts disparaissent en même temps que la bibliothèque —
|
|
888
|
+
* son style en ligne qui écrasait nos rotations, l'instabilité des bulles
|
|
889
|
+
* forcées ouvertes dans une page longue, et l'impossibilité de tester une bulle
|
|
890
|
+
* « froide » sous jsdom.
|
|
891
|
+
*
|
|
892
|
+
* ⚠️ LES DEUX CADRES DÉCRIVENT LES MÊMES SEPT CHOSES, NOMMÉES À L'ENVERS. La
|
|
893
|
+
* bulle classe ses variantes par la position de sa FLÈCHE (« Bottom center »,
|
|
894
|
+
* « Bottom left », « Left »…) ; le composite les classe par la position de la
|
|
895
|
+
* BULLE (« Top arrow », « Top right », « Left »…). Les sept valeurs se
|
|
896
|
+
* correspondent une à une, et « Top right » — bulle en haut à droite — porte
|
|
897
|
+
* une flèche en bas à GAUCHE. L'API expose la position de la BULLE, parce que
|
|
898
|
+
* c'est ce qu'un développeur choisit ; la flèche en découle.
|
|
899
|
+
*
|
|
900
|
+
* ⚠️ LE DÉCLENCHEUR N'EST PAS ENVELOPPÉ DANS UN BOUTON. Un seul élément est
|
|
901
|
+
* ajouté : une ANCRE, qui sert de repère de position à la bulle et n'entre pas
|
|
902
|
+
* dans l'ordre de tabulation. La tentation était d'envelopper dans un bouton —
|
|
903
|
+
* c'est ce que fait l'implémentation en production des produits Zest, et ça y a
|
|
904
|
+
* créé six arrêts de tabulation MORTS : six boutons focusables sans action.
|
|
905
|
+
*
|
|
906
|
+
* ⚠️ LE DÉLAI DE 300 MS N'EST PAS UN CHOIX D'HUMEUR. C'est celui du composant
|
|
907
|
+
* en production, et il existe pour que la souris puisse TRAVERSER un élément
|
|
908
|
+
* sans en déclencher la bulle. Sans délai, un survol de passage allume et
|
|
909
|
+
* éteint des bulles sur tout le trajet du curseur.
|
|
910
|
+
*/
|
|
911
|
+
/** Où va la BULLE, pas où va la flèche. Les six positions du Figma. */
|
|
912
|
+
type TooltipPlacement = "top" | "top-left" | "top-right" | "bottom" | "left" | "right";
|
|
913
|
+
interface TooltipProps {
|
|
914
|
+
/** La première ligne, en gras. C'est le seul contenu obligatoire. */
|
|
915
|
+
title: ReactNode;
|
|
916
|
+
/**
|
|
917
|
+
* La ligne d'explication, en dessous.
|
|
918
|
+
*
|
|
919
|
+
* ⚠️ ELLE CHANGE LA GÉOMÉTRIE DE LA BULLE, pas seulement son contenu :
|
|
920
|
+
* sans elle la bulle se colle au texte et son padding vertical tombe à
|
|
921
|
+
* 8 px ; avec elle, elle se cale à 320 px de large et passe à 12 px. Deux
|
|
922
|
+
* anatomies relevées séparément, pas une interpolation.
|
|
923
|
+
*/
|
|
924
|
+
supportingText?: ReactNode;
|
|
925
|
+
/** La flèche. Absente par défaut, comme dans la maquette. */
|
|
926
|
+
arrow?: boolean;
|
|
927
|
+
/**
|
|
928
|
+
* Où va la bulle.
|
|
929
|
+
*
|
|
930
|
+
* ⚠️ C'EST UN CHOIX, PAS UNE PRÉFÉRENCE. Rien ne la retournera si elle ne
|
|
931
|
+
* tient pas : elle sortira de l'écran. Voir les trois cas de la page de
|
|
932
|
+
* documentation.
|
|
933
|
+
*/
|
|
934
|
+
placement?: TooltipPlacement;
|
|
935
|
+
/** Le délai avant apparition, en millisecondes. */
|
|
936
|
+
delay?: number;
|
|
937
|
+
/** Le délai avant disparition. */
|
|
938
|
+
closeDelay?: number;
|
|
939
|
+
/** Ne rien montrer du tout, sans avoir à retirer l'enveloppe. */
|
|
940
|
+
isDisabled?: boolean;
|
|
941
|
+
/**
|
|
942
|
+
* Forcer l'ouverture, en pilotant l'état depuis l'extérieur.
|
|
943
|
+
*
|
|
944
|
+
* Sert d'abord aux planches de documentation — une info-bulle au repos ne
|
|
945
|
+
* montre rien — et, en produit, à afficher une aide sans attendre un geste.
|
|
946
|
+
*/
|
|
947
|
+
isOpen?: boolean;
|
|
948
|
+
/** Ouverte au premier rendu, puis libre de se fermer. */
|
|
949
|
+
defaultOpen?: boolean;
|
|
950
|
+
onOpenChange?: (ouverte: boolean) => void;
|
|
951
|
+
/**
|
|
952
|
+
* Le déclencheur : UN élément.
|
|
953
|
+
*
|
|
954
|
+
* ⚠️ UN SEUL, ET LE TYPE L'IMPOSE PLUTÔT QUE DE L'ESPÉRER. Le composant
|
|
955
|
+
* POSE ses gestionnaires et, au besoin, son `tabIndex` sur cet élément —
|
|
956
|
+
* il ne l'enveloppe pas. Il lui faut donc exactement un élément : deux
|
|
957
|
+
* enfants, ou du texte nu, n'auraient rien à quoi s'accrocher.
|
|
958
|
+
*/
|
|
959
|
+
children: ReactElement;
|
|
960
|
+
}
|
|
961
|
+
declare const Tooltip: ({ title, supportingText, arrow, placement, delay, closeDelay, isDisabled, isOpen, defaultOpen, onOpenChange, children, }: TooltipProps) => react.JSX.Element;
|
|
962
|
+
interface HelpTooltipProps extends Omit<TooltipProps, "children"> {
|
|
963
|
+
/**
|
|
964
|
+
* Ce que la personne entend, et ce n'est PAS le titre de la bulle.
|
|
965
|
+
*
|
|
966
|
+
* ⚠️ UNE INFO-BULLE NE REMPLACE PAS UN NOM ACCESSIBLE. Elle apparaît au
|
|
967
|
+
* survol et au focus, mais l'icône reste un bouton sans texte : sans
|
|
968
|
+
* libellé, un lecteur d'écran annonce « bouton », point. Le titre de la
|
|
969
|
+
* bulle est une DESCRIPTION ; ceci est le NOM.
|
|
970
|
+
*/
|
|
971
|
+
label?: string;
|
|
972
|
+
}
|
|
973
|
+
/**
|
|
974
|
+
* L'icône d'aide qui porte sa bulle.
|
|
975
|
+
*
|
|
976
|
+
* ⚠️ LE CURSEUR DE SOURIS DESSINÉ DANS LES SYMBOLES EST UN ARTIFICE DE
|
|
977
|
+
* MAQUETTE, PAS UNE PIÈCE DU COMPOSANT. Les quatorze symboles `Open=True` du
|
|
978
|
+
* cadre portent une flèche de souris à côté de l'icône, pour montrer que la
|
|
979
|
+
* bulle vient d'un survol. La coder dessinerait un curseur en plus de celui du
|
|
980
|
+
* système.
|
|
981
|
+
*
|
|
982
|
+
* C'est un vrai `<button type="button">` : l'aide se déclenche au survol ET au
|
|
983
|
+
* clavier, et un élément non interactif ne recevrait jamais le second.
|
|
984
|
+
*/
|
|
985
|
+
declare const HelpTooltip: react.ForwardRefExoticComponent<HelpTooltipProps & react.RefAttributes<HTMLButtonElement>>;
|
|
986
|
+
|
|
987
|
+
/** La hauteur totale du dessin, relevée. */
|
|
988
|
+
declare const HAUTEUR_FLECHE = 8.51471;
|
|
989
|
+
/** Ce qui en DÉPASSE de la bulle. La différence passe dessous. */
|
|
990
|
+
declare const DEBORD_FLECHE = 6;
|
|
991
|
+
/** La largeur de la base. */
|
|
992
|
+
declare const LARGEUR_FLECHE = 16;
|
|
993
|
+
declare const TooltipArrow: (props: SVGProps<SVGSVGElement>) => react.JSX.Element;
|
|
994
|
+
|
|
995
|
+
/**
|
|
996
|
+
* La case à cocher, et le bouton radio.
|
|
997
|
+
*
|
|
998
|
+
* Relevés sur `_Checkbox base` (3891:11902, 40 symboles) et `Checkbox`
|
|
999
|
+
* (3891:11629, 74 symboles), le 2026-09-10.
|
|
1000
|
+
*
|
|
1001
|
+
* ⚠️ LES DEUX FORMES SONT UN SEUL ATOME DANS LE FIGMA, ET DEUX EXPORTS ICI. Le
|
|
1002
|
+
* cadre en fait un axe `Type` — même boîte, mêmes quatre états, même anneau de
|
|
1003
|
+
* focus, seules la forme et la marque changent. Les deux composants partagent
|
|
1004
|
+
* donc leur habillage et ne diffèrent que par ce que le Figma fait différer.
|
|
1005
|
+
* Deux jeux de règles auraient divergé au premier correctif.
|
|
1006
|
+
*
|
|
1007
|
+
* ⚠️ L'ÉLÉMENT EST UN VRAI `<input>`, PAS UN `<div>` QUI Y RESSEMBLE. Il porte
|
|
1008
|
+
* `appearance: none` et se laisse habiller, mais il garde tout ce qu'un `div`
|
|
1009
|
+
* n'a pas : le clavier, la participation au formulaire, le groupement des
|
|
1010
|
+
* radios par `name`, et — le plus utile ici — les pseudo-classes natives
|
|
1011
|
+
* `:checked`, `:disabled`, `:focus-visible` et `:indeterminate`.
|
|
1012
|
+
*
|
|
1013
|
+
* ⚠️ LA MARQUE EST UN FRÈRE, PAS UN ENFANT, PARCE QU'UN `<input>` N'EN PREND
|
|
1014
|
+
* PAS. Elle est posée en absolu par-dessus, avec `pointer-events: none` pour
|
|
1015
|
+
* que le clic atteigne l'input dessous. L'autre voie serait d'inliner le SVG en
|
|
1016
|
+
* `background-image` dans la feuille : ce serait un TROISIÈME exemplaire du
|
|
1017
|
+
* tracé, après le catalogue et la page — et le jour où le Figma corrige la
|
|
1018
|
+
* coche, celui-là ne suivrait pas.
|
|
1019
|
+
*
|
|
1020
|
+
* ⚠️ LE LIBELLÉ EST LIÉ PAR `htmlFor`, IL N'ENVELOPPE PAS. Un `<label>` qui
|
|
1021
|
+
* enveloppe le contrôle ET le texte d'aide ferait du texte d'aide une partie du
|
|
1022
|
+
* NOM accessible : un lecteur d'écran annoncerait « Se souvenir de moi.
|
|
1023
|
+
* Enregistrer mes informations de connexion pour la prochaine fois, case à
|
|
1024
|
+
* cocher », d'un bloc. Le libellé est le nom, l'aide est une DESCRIPTION —
|
|
1025
|
+
* `aria-describedby`. Conséquence assumée : cliquer le libellé bascule la case,
|
|
1026
|
+
* cliquer l'aide ne fait rien.
|
|
1027
|
+
*/
|
|
1028
|
+
/** Les deux tailles du Figma. `sm` fait 16 px, `md` 20. */
|
|
1029
|
+
type CheckboxSize = "sm" | "md";
|
|
1030
|
+
interface BaseProps$1 extends Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "type"> {
|
|
1031
|
+
size?: CheckboxSize;
|
|
1032
|
+
/** Le libellé. C'est lui qui donne son nom accessible au contrôle. */
|
|
1033
|
+
label?: ReactNode;
|
|
1034
|
+
/**
|
|
1035
|
+
* La ligne d'explication, sous le libellé.
|
|
1036
|
+
*
|
|
1037
|
+
* ⚠️ ELLE CHANGE LA GÉOMÉTRIE DE LA LIGNE, pas seulement son contenu : le
|
|
1038
|
+
* Figma en fait une propriété booléenne à part de `Text`, donc « libellé
|
|
1039
|
+
* seul » et « libellé plus aide » sont deux dessins.
|
|
1040
|
+
*/
|
|
1041
|
+
hint?: ReactNode;
|
|
1042
|
+
}
|
|
1043
|
+
interface CheckboxProps extends BaseProps$1 {
|
|
1044
|
+
/**
|
|
1045
|
+
* Ni cochée ni décochée : la case représente un ensemble partiellement
|
|
1046
|
+
* sélectionné.
|
|
1047
|
+
*
|
|
1048
|
+
* ⚠️ ELLE NE S'OBTIENT QU'EN JAVASCRIPT, et c'est ce qui la distingue des
|
|
1049
|
+
* trois autres sélecteurs. Il n'existe aucun attribut HTML `indeterminate` :
|
|
1050
|
+
* c'est une propriété du nœud DOM. React ne la pose donc pas, et le
|
|
1051
|
+
* composant l'écrit lui-même sur la ref à chaque rendu.
|
|
1052
|
+
*
|
|
1053
|
+
* ⚠️ ET ELLE EST INDÉPENDANTE DE `checked`, contrairement à ce que le Figma
|
|
1054
|
+
* laisse croire. Le cadre ne dessine `Indeterminate=True` qu'avec
|
|
1055
|
+
* `Checked=True` — 24 symboles sur 40 — mais HTML les traite comme deux
|
|
1056
|
+
* choses séparées, et c'est HTML qui gagne : une case indéterminée montre
|
|
1057
|
+
* son tiret qu'elle soit cochée ou non. Aligner le composant sur le dessin
|
|
1058
|
+
* obligerait à cocher une case pour la rendre indéterminée, ce qui est
|
|
1059
|
+
* exactement le contraire de son sens.
|
|
1060
|
+
*/
|
|
1061
|
+
indeterminate?: boolean;
|
|
1062
|
+
}
|
|
1063
|
+
interface RadioProps extends BaseProps$1 {
|
|
1064
|
+
/**
|
|
1065
|
+
* Le groupe auquel ce radio appartient.
|
|
1066
|
+
*
|
|
1067
|
+
* ⚠️ SANS LUI, UN RADIO NE SE DÉSÉLECTIONNE JAMAIS. C'est `name` qui lie
|
|
1068
|
+
* les boutons entre eux ; seul, un radio se coche et reste coché à vie —
|
|
1069
|
+
* un défaut qui ne se voit qu'en essayant le second bouton du groupe.
|
|
1070
|
+
*/
|
|
1071
|
+
name: string;
|
|
1072
|
+
}
|
|
1073
|
+
declare const Checkbox: react.ForwardRefExoticComponent<CheckboxProps & react.RefAttributes<HTMLInputElement>>;
|
|
1074
|
+
/**
|
|
1075
|
+
* Le bouton radio.
|
|
1076
|
+
*
|
|
1077
|
+
* ⚠️ IL N'A PAS D'ÉTAT INDÉTERMINÉ, et ce n'est pas un oubli : un radio ne
|
|
1078
|
+
* représente jamais un ensemble partiel, il représente un choix parmi
|
|
1079
|
+
* plusieurs. Le Figma ne lui en dessine aucun non plus — 16 symboles contre 24
|
|
1080
|
+
* pour la case.
|
|
1081
|
+
*
|
|
1082
|
+
* ⚠️ ET SA MARQUE EST UN DISQUE, PAS UNE ICÔNE. La case emprunte `check` et
|
|
1083
|
+
* `minus` au catalogue ; le radio n'a rien à emprunter, son point est une forme
|
|
1084
|
+
* pleine que la feuille dessine.
|
|
1085
|
+
*/
|
|
1086
|
+
declare const Radio: react.ForwardRefExoticComponent<RadioProps & react.RefAttributes<HTMLInputElement>>;
|
|
1087
|
+
|
|
1088
|
+
/**
|
|
1089
|
+
* L'interrupteur.
|
|
1090
|
+
*
|
|
1091
|
+
* Relevé sur `_Toggle base` (3896:1480, 32 symboles) et `Toggle` (3896:1553,
|
|
1092
|
+
* 64 symboles), le 2026-09-11.
|
|
1093
|
+
*
|
|
1094
|
+
* ⚠️ UN INTERRUPTEUR N'EST PAS UNE CASE À COCHER, ET CE N'EST PAS UNE NUANCE DE
|
|
1095
|
+
* VOCABULAIRE. Il applique son effet TOUT DE SUITE : il n'y a rien à valider
|
|
1096
|
+
* derrière lui. Une case à cocher déclare une intention que le bouton du
|
|
1097
|
+
* formulaire exécutera. Les deux se ressemblent à l'écran et ne se remplacent
|
|
1098
|
+
* jamais — d'où deux composants, et non une variante de l'autre.
|
|
1099
|
+
*
|
|
1100
|
+
* ⚠️ L'ÉLÉMENT EST UN VRAI `<input type="checkbox">`, COMME LA CASE À COCHER,
|
|
1101
|
+
* ET IL PORTE `role="switch"`. L'input garde le clavier, la participation au
|
|
1102
|
+
* formulaire et les pseudo-classes natives `:checked`, `:disabled` et
|
|
1103
|
+
* `:focus-visible` ; le rôle change ce qu'un lecteur d'écran ANNONCE — « activé
|
|
1104
|
+
* / désactivé » au lieu de « coché / décoché ». Sans lui, deux contrôles qui ne
|
|
1105
|
+
* font pas la même chose s'annoncent pareil.
|
|
1106
|
+
*
|
|
1107
|
+
* ⚠️ LE BOUTON EST UN FRÈRE, PAS UN ENFANT, parce qu'un `<input>` n'en prend
|
|
1108
|
+
* pas. Il est posé en absolu par-dessus la piste, avec `pointer-events: none`
|
|
1109
|
+
* pour que le clic atteigne l'input dessous. Même montage que la marque de la
|
|
1110
|
+
* case à cocher.
|
|
1111
|
+
*
|
|
1112
|
+
* ⚠️ LE DÉPLACEMENT DU BOUTON VAUT EXACTEMENT SA PROPRE LARGEUR, dans les
|
|
1113
|
+
* quatre combinaisons taille × type. C'est une coïncidence du relevé, pas une
|
|
1114
|
+
* règle de dessin — mais elle est vérifiée : 36−2−2−16, 44−2−2−20, 32−16 et
|
|
1115
|
+
* 40−20 donnent 16, 20, 16 et 20, soit la taille du bouton à chaque fois. D'où
|
|
1116
|
+
* un seul `translateX(100%)` plutôt que quatre décalages à tenir d'accord.
|
|
1117
|
+
*
|
|
1118
|
+
* ⚠️ LE LIBELLÉ EST LIÉ PAR `htmlFor`, IL N'ENVELOPPE PAS — même raison que sur
|
|
1119
|
+
* la case à cocher : un `<label>` qui envelopperait le contrôle ET l'aide ferait
|
|
1120
|
+
* de l'aide une partie du NOM accessible, annoncée d'un bloc à chaque rencontre.
|
|
1121
|
+
* Le libellé est le nom, l'aide est une DESCRIPTION (`aria-describedby`).
|
|
1122
|
+
*/
|
|
1123
|
+
/** Les deux tailles du Figma. La piste fait 36 × 20 en `sm`, 44 × 24 en `md`. */
|
|
1124
|
+
type ToggleSize = "sm" | "md";
|
|
1125
|
+
/**
|
|
1126
|
+
* Les deux dessins du Figma.
|
|
1127
|
+
*
|
|
1128
|
+
* `default` : le bouton est en retrait de 2 px dans sa piste, sans bordure, et
|
|
1129
|
+
* porte l'ombre la plus marquée. `slim` : la piste est plus basse, le bouton la
|
|
1130
|
+
* remplit d'un bord à l'autre et porte une bordure — c'est elle qui le détache,
|
|
1131
|
+
* là où l'autre compte sur son ombre.
|
|
1132
|
+
*/
|
|
1133
|
+
type ToggleType = "default" | "slim";
|
|
1134
|
+
interface ToggleProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "type"> {
|
|
1135
|
+
size?: ToggleSize;
|
|
1136
|
+
type?: ToggleType;
|
|
1137
|
+
/** Le libellé. C'est lui qui donne son nom accessible au contrôle. */
|
|
1138
|
+
label?: ReactNode;
|
|
1139
|
+
/**
|
|
1140
|
+
* La ligne d'explication, sous le libellé.
|
|
1141
|
+
*
|
|
1142
|
+
* ⚠️ ELLE CHANGE LA GÉOMÉTRIE DE LA LIGNE, pas seulement son contenu : le
|
|
1143
|
+
* Figma en fait une propriété à part de `Text`, donc « libellé seul » et
|
|
1144
|
+
* « libellé plus aide » sont deux dessins.
|
|
1145
|
+
*/
|
|
1146
|
+
hint?: ReactNode;
|
|
1147
|
+
}
|
|
1148
|
+
declare const Toggle: react.ForwardRefExoticComponent<ToggleProps & react.RefAttributes<HTMLInputElement>>;
|
|
1149
|
+
|
|
489
1150
|
/**
|
|
490
1151
|
* Le catalogue des icônes de type de fichier — LA source unique.
|
|
491
1152
|
*
|
|
@@ -562,13 +1223,12 @@ interface ZestFileIcon {
|
|
|
562
1223
|
svg: Record<FileIconVariante, string>;
|
|
563
1224
|
}
|
|
564
1225
|
declare const ZEST_FILE_ICONS: ZestFileIcon[];
|
|
565
|
-
/** Retrouve une icône de fichier par son nom. */
|
|
566
1226
|
declare const findFileIcon: (name: string) => ZestFileIcon | undefined;
|
|
567
1227
|
|
|
568
1228
|
/**
|
|
569
1229
|
* Les icônes de type de fichier, en composants.
|
|
570
1230
|
*
|
|
571
|
-
* ⚠️ ÉCRIT À LA MAIN, contrairement à `icons/index.tsx`. Là-bas,
|
|
1231
|
+
* ⚠️ ÉCRIT À LA MAIN, contrairement à `icons/index.tsx`. Là-bas, 135 icônes
|
|
572
1232
|
* monochromes justifiaient un composant par dessin ; ici les dessins sont
|
|
573
1233
|
* polychromes et se choisissent le plus souvent À L'EXÉCUTION, depuis
|
|
574
1234
|
* l'extension d'un fichier téléversé. Un composant par type obligerait à écrire
|
|
@@ -595,7 +1255,7 @@ interface FileIconProps extends Omit<SVGProps<SVGSVGElement>, "name"> {
|
|
|
595
1255
|
* écrit à côté — « rapport-q3.pdf » — et l'annoncer ferait entendre « PDF »
|
|
596
1256
|
* deux fois. L'écran qui la poserait seule doit porter le libellé lui-même.
|
|
597
1257
|
*
|
|
598
|
-
* ⚠️ ET ELLE NE SUIT PAS LA COULEUR DU TEXTE, contrairement aux
|
|
1258
|
+
* ⚠️ ET ELLE NE SUIT PAS LA COULEUR DU TEXTE, contrairement aux 135 icônes du
|
|
599
1259
|
* design system. Ses teintes sont dans le dessin, citées en jetons : un PDF est
|
|
600
1260
|
* rouge et un tableur vert parce que c'est une convention de reconnaissance.
|
|
601
1261
|
*/
|
|
@@ -914,7 +1574,6 @@ declare const STYLES_A_REVOIR: {
|
|
|
914
1574
|
name: string;
|
|
915
1575
|
pourquoi: string;
|
|
916
1576
|
}[];
|
|
917
|
-
/** Retrouve une icône par son nom Figma. */
|
|
918
1577
|
declare const findIcon: (name: string) => ZestIcon | undefined;
|
|
919
1578
|
|
|
920
|
-
export { AlertCircle01, AlertCircle02, AlertTriangle01, AlertTriangle02, ArrowDown, ArrowDownLeft, ArrowDownRight, ArrowLeft, ArrowNarrowDown, ArrowNarrowDownLeft, ArrowNarrowDownRight, ArrowNarrowLeft, ArrowNarrowRight, ArrowNarrowUp, ArrowNarrowUpLeft, ArrowNarrowUpRight, ArrowRight, BarChartSquare02, Bell01, BellOff01, Bookmark01, Building07, Calendar, CalendarPlus01, Check, CheckCircle01, CheckCircle02, CheckDone01, ChevronDown, ChevronDownDouble, ChevronLeft, ChevronLeftDouble, ChevronRight, ChevronRightDouble, ChevronUp, ChevronUpDouble, Circle, Clock, DotsVertical, Download01, Edit01, Edit02, Eye01, Eye02, EyeOff, FeatureActionPlan, FeatureAlignmentMap, FeatureCheckin, FeatureCockpit, FeatureEngageo, FeatureFeedback, FeatureIdea, FeatureIntercom01, FeatureIntercom02, FeatureKeydriver, FeatureMood01, FeatureMood02, FeatureObjective, FeatureProject, FeatureResume, FeatureSkill, FeatureSurvey01, FeatureSurvey02, FileAudio, FileCsv, FileDoc, FileDocument, FileDocx, FileEmpty, FileEps, FileFolder, FileGif, FileIcon, type FileIconFamille, type FileIconProps, type FileIconVariante, FileImage, FileImg, FileJpeg, FileJpg, FilePdf, FilePdfSimple, FilePng, FilePpt, FilePptx, FileSpreadsheet, FileSvg, FileTiff, FileTxt, FileVideo01, FileVideo02, FileWebp, FileXls, FileXlsx, FilterFunnel01, FilterFunnel02, Flag01, Heart01, Heart02, HelpCircle01, HelpCircle02, Home01, Home02, Inbox01, InfoCircle01, InfoCircle02, LOGO_BOITES, LOGO_ECART, Link01, LinkBroken01, Lock01, Lock02, LockUnlocked01, LockUnlocked02, LogOut01, type LogoVariante, Mail01, Mail02, Menu01, MessageBubble01, MessageBubble02, MessageChatSquare, Minus, MinusCircle, ModuleLead, ModuleListen, ModulePerform, ModuleShare, Plus, PlusCircle01, PlusCircle02, RefreshCw01, STYLES_A_REVOIR, Search01, Send01, Settings01, Settings02, Share01, Share02, Share03, SlashCircle01, SlashDivider, SmartOrg, Star01, Target05, ThumbsDown, ThumbsUp, Tick, Tool01, Trash01, Trash02, Upload01, User01, Users01, XCircle, XClose, ZEST_FILE_ICONS, ZEST_ICONS, ZEST_ICONS_EN_CONFLIT, ZEST_LOGO, ZestAiLogo, type ZestFileIcon, type ZestIcon, ZestLogo, ZestLogomark, type ZestPath, ZestWordmark, findFileIcon, findIcon };
|
|
1579
|
+
export { AlertCircle01, AlertCircle02, AlertTriangle01, AlertTriangle02, ArrowDown, ArrowDownLeft, ArrowDownRight, ArrowLeft, ArrowNarrowDown, ArrowNarrowDownLeft, ArrowNarrowDownRight, ArrowNarrowLeft, ArrowNarrowRight, ArrowNarrowUp, ArrowNarrowUpLeft, ArrowNarrowUpRight, ArrowRight, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarGroupSize, AvatarLabelGroup, type AvatarLabelGroupProps, type AvatarLabelGroupSize, AvatarMask, type AvatarProps, type AvatarSize, type AvatarStatus, Badge, type BadgeColor, type BadgeProps, type BadgeSize, type BadgeType, BarChartSquare02, Bell01, BellOff01, Bookmark01, Building07, Button, type ButtonHierarchy, type ButtonProps, type ButtonSize, Calendar, CalendarPlus01, Check, CheckCircle01, CheckCircle02, CheckDone01, Checkbox, type CheckboxProps, type CheckboxSize, ChevronDown, ChevronDownDouble, ChevronLeft, ChevronLeftDouble, ChevronRight, ChevronRightDouble, ChevronUp, ChevronUpDouble, Circle, Clock, CloseButton, type CloseButtonProps, type CloseButtonSize, DEBORD_FLECHE, DotsVertical, Download01, Edit01, Edit02, Eye01, Eye02, EyeOff, FeatureActionPlan, FeatureAlignmentMap, FeatureCheckin, FeatureCockpit, FeatureEngageo, FeatureFeedback, FeatureIdea, FeatureIntercom01, FeatureIntercom02, FeatureKeydriver, FeatureMood01, FeatureMood02, FeatureObjective, FeatureProject, FeatureResume, FeatureSkill, FeatureSurvey01, FeatureSurvey02, FileAudio, FileCsv, FileDoc, FileDocument, FileDocx, FileEmpty, FileEps, FileFolder, FileGif, FileIcon, type FileIconFamille, type FileIconProps, type FileIconVariante, FileImage, FileImg, FileJpeg, FileJpg, FilePdf, FilePdfSimple, FilePng, FilePpt, FilePptx, FileSpreadsheet, FileSvg, FileTiff, FileTxt, FileVideo01, FileVideo02, FileWebp, FileXls, FileXlsx, FilterFunnel01, FilterFunnel02, Flag01, HAUTEUR_FLECHE, Heart01, Heart02, HelpCircle01, HelpCircle02, HelpTooltip, type HelpTooltipProps, Home01, Home02, Inbox01, InfoCircle01, InfoCircle02, LARGEUR_FLECHE, LOGO_BOITES, LOGO_ECART, Link01, LinkBroken01, Lock01, Lock02, LockUnlocked01, LockUnlocked02, LogOut01, type LogoVariante, Mail01, Mail02, Menu01, MessageAlertSquare01, MessageAlertSquare02, MessageBubble01, MessageBubble02, MessageChatSquare, Minus, MinusCircle, ModuleLead, ModuleListen, ModulePerform, ModuleShare, Plus, PlusCircle01, PlusCircle02, Radio, type RadioProps, RefreshCw01, STYLES_A_REVOIR, Search01, Send01, Settings01, Settings02, Share01, Share02, Share03, SlashCircle01, SlashDivider, SmartOrg, Spinner, type SpinnerProps, type SpinnerSize, Star01, Target05, ThumbsDown, ThumbsUp, Tick, Toggle, type ToggleProps, type ToggleSize, type ToggleType, Tool01, Tooltip, TooltipArrow, type TooltipPlacement, type TooltipProps, Trash01, Trash02, Upload01, User01, Users01, UtilityButton, type UtilityButtonHierarchy, type UtilityButtonProps, type UtilityButtonSize, XCircle, XClose, ZEST_FILE_ICONS, ZEST_ICONS, ZEST_ICONS_EN_CONFLIT, ZEST_LOGO, ZestAiLogo, type ZestFileIcon, type ZestIcon, ZestLogo, ZestLogomark, type ZestPath, ZestWordmark, findFileIcon, findIcon };
|