@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/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, 121 icônes
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 121 icônes du
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 };