Chart
Des graphiques Recharts aux couleurs du thème, avec une infobulle et une légende qui lisent leurs libellés depuis une seule config, et une navigation au clavier avec anneau de focus visible.
pnpm dlx shadcn@latest add https://hextaui.com/r/chart.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add recharts cnCopiez et collez le code suivant dans votre projet.
components/ui/chart.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Vous construisez les graphiques avec les composants Recharts et n’ajoutez les parties de chart que là où vous en avez besoin. Recharts n’est pas encapsulé : sa propre documentation et ses guides de mise à niveau s’appliquent tels quels.
Un ChartConfig associe chaque clé de données à un libellé, une icône facultative et une couleur. Il reste séparé des données : une même config peut servir plusieurs graphiques.
Donnez à <ChartContainer /> une hauteur, un min-h-* ou un aspect-* pour que le graphique puisse se mesurer au premier rendu. Sans cela, il se rabat sur aspect-video.
Chaque clé de la config devient une variable --color-KEY limitée à son graphique. Pointez-la vers un token du thème, une couleur CSS quelconque, ou donnez-lui des valeurs light et dark distinctes.
Utilisez la variable partout où Recharts attend une couleur : sur les composants, dans vos données ou dans les classes Tailwind.
Le thème fournit cinq tokens de graphique, --chart-1 à --chart-5 : bleu, sarcelle, ambre, violet et rose. Dans cet ordre, les couleurs voisines restent distinctes pour les formes courantes de daltonisme, et chacune a un contraste d’au moins 3:1 avec les arrière-plans clair et sombre. Utilisez-les dans l’ordre et gardez la légende ou les libellés actifs, pour que la couleur ne soit jamais le seul indice.
Les clés invalides dans un nom CSS, comme Mobile users, deviennent --color-Mobile-users.
Graphique en barres
Une grille, un axe, <ChartTooltip /> et <ChartLegend />. Le tooltip et la légende lisent leurs libellés et leurs couleurs dans la config.
Graphique en courbes
indicator="line" associe les touches du tooltip aux lignes qu’elles décrivent.
Barres empilées
Les barres ayant le même stackId s’empilent. Arrondissez uniquement les extrémités extérieures, pour que la pile se lise comme une seule barre.
Barres horizontales
Définissez layout="vertical" sur le graphique et échangez les types d’axe. <LabelList /> affiche chaque valeur au bout de sa barre.
Donut
Chaque part prend sa couleur dans fill des données. nameKey sur le tooltip et la légende recherche dans la config le libellé de chaque part.
Radar
Les grilles et axes polaires reprennent les mêmes traits et libellés atténués que les cartésiens.
Tooltip
Basculez entre les indicateurs dot, line et dashed, et masquez le libellé avec hideLabel. defaultIndex sur <ChartTooltip /> affiche un point dès le premier rendu.
Formatage des valeurs
valueFormatter formate le nombre et conserve l’indicateur et le nom. labelFormatter fait de même pour le libellé. Pour remplacer toute une ligne, utilisez formatter.
Icônes
Une icon dans la config remplace la pastille de couleur dans le tooltip et la légende.
Couleurs claires et sombres
Un objet theme choisit une couleur différente dans chaque thème. Changez le thème du site pour la voir évoluer.
Valeurs négatives
Colorez chaque barre avec <Cell /> et marquez le zéro avec <ReferenceLine />.
Libellés longs
Les noms de séries longs passent à la ligne dans la légende et le tooltip, et les grandes valeurs restent sur une seule ligne à côté.
De droite à gauche
Recharts n’inverse pas les axes tout seul. Définissez reversed sur l’axe x et déplacez l’axe y à droite. Passez locale au tooltip pour afficher les chiffres du lecteur.
Recharts active accessibilityLayer par défaut : le graphique est un seul arrêt de tabulation que l’on parcourt point par point.
| Touche | Action |
|---|---|
| Tab | Donne le focus au graphique et affiche un anneau de focus. |
| ←→ | Déplace le tooltip vers le point suivant ou précédent. Sur un axe inversé, les touches suivent l’écran. |
| Enter | Affiche ou masque le tooltip au point actuel. |
- Pour les lecteurs d’écran, les graphiques sont des images. Nommez chacun avec un titre visible à proximité ou un
aria-labelsur le graphique Recharts, et proposez un tableau lorsque l’on a besoin des valeurs exactes. - Le tooltip et la légende nomment chaque série en texte : le lecteur n’a donc jamais à s’appuyer sur les seules couleurs.
- Avec la réduction des animations, Recharts ignore ses animations d’entrée et le tooltip saute d’un point à l’autre au lieu de glisser.
- Les valeurs du tooltip sont formatées en
en-USsauf si vous passezlocale, pour que le serveur et le navigateur rendent le même texte.
Les parties se placent au-dessus de Recharts. Toutes les props de Recharts continuent de fonctionner sur les composants de graphique que vous placez à l’intérieur.
Fournit la config, écrit les variables de couleur et rend un <ResponsiveContainer /> Recharts autour de son enfant. Accepte toutes les props de <div>.
| Prop | Type | Par défaut |
|---|---|---|
configLibellés, icônes et couleurs de chaque clé de données. | ChartConfig | – |
childrenUn graphique Recharts, comme <BarChart />. | ReactElement | – |
initialDimensionLa taille utilisée avant la mesure du conteneur. | { width: number; height: number } | { width: 320, height: 200 } |
idNomme le graphique dans data-chart. Généré si omis. | string | – |
| Attribut | Description |
|---|---|
data-slot="chart" | Le conteneur. |
data-chart | L’id auquel les variables de couleur sont limitées. |
--color-KEY | Une variable de couleur par clé configurée. |
| Prop | Type | Par défaut |
|---|---|---|
label | ReactNode | – |
iconRemplace la pastille de couleur dans le tooltip et la légende. | ComponentType | – |
colorN’importe quelle couleur ou variable CSS. | string | – |
themeÀ utiliser à la place de color pour une couleur par thème. | { light: string; dark: string } | – |
Le <Tooltip /> de Recharts, avec un glissement plus court entre les points. Accepte toutes les props de tooltip de Recharts.
| Prop | Type | Par défaut |
|---|---|---|
contentEn général <ChartTooltipContent />. | ReactElement | (props) => ReactNode | – |
animationDuration | number | 200 |
animationEasing | string | "ease-out" |
defaultIndexAffiche le tooltip à ce point au premier rendu. | number | – |
| Prop | Type | Par défaut |
|---|---|---|
indicator | "dot" | "line" | "dashed" | "dot" |
hideLabel | boolean | false |
hideIndicator | boolean | false |
labelKeyLa clé de la config ou des données à utiliser pour le libellé. | string | – |
nameKeyLa clé de la config ou des données à utiliser pour chaque nom. | string | – |
valueFormatterFormate chaque valeur et conserve l’indicateur et le nom. | (value, name, item) => ReactNode | – |
labelFormatter | (label, payload) => ReactNode | – |
formatterRemplace chaque ligne. | (value, name, item, index, payload) => ReactNode | – |
localeFormate les valeurs numériques. | Intl.LocalesArgument | "en-US" |
colorUne seule couleur d’indicateur pour toutes les lignes. | string | – |
className | string | – |
labelClassName | string | – |
| Attribut | Description |
|---|---|
data-slot="chart-tooltip" | La boîte. |
data-slot="chart-tooltip-label" | Le libellé. |
data-slot="chart-tooltip-item" | Une ligne par série. |
data-slot="chart-tooltip-indicator" | La pastille de couleur. |
data-indicator | Sur la clé : point, ligne ou tirets. |
--chart-indicator | La couleur de la clé. |
Le <Legend /> de Recharts. Accepte toutes les props de légende de Recharts, et liste les séries dans l’ordre où vous les déclarez plutôt qu’alphabétiquement.
| Prop | Type | Par défaut |
|---|---|---|
contentEn général <ChartLegendContent />. | ReactElement | (props) => ReactNode | – |
itemSorternull conserve l’ordre déclaré. | "value" | "dataKey" | (item) => number | string | null | null |
| Prop | Type | Par défaut |
|---|---|---|
hideIcon | boolean | false |
nameKeyLa clé de la config ou des données à utiliser pour chaque nom. | string | – |
className | string | – |
| Attribut | Description |
|---|---|
data-slot="chart-legend" | La liste. |
data-slot="chart-legend-item" | Une entrée par série. |
data-slot="chart-legend-indicator" | L’échantillon de couleur. |
Retourne { config } dans un <ChartContainer />, pour construire votre propre contenu de tooltip ou de légende.
- AvatarDes photos d’utilisateurs avec initiales en repli, badges de statut et groupes empilés qui se réduisent en compteur.
- BadgeDes libellés de statut avec pastilles colorées, des tags amovibles qui se referment en glissant et des compteurs qui défilent vers leur nouvelle valeur.
- CardUne surface pour regrouper du contenu, avec trois variantes, médias bord à bord, rayons concentriques et liens sur toute la carte.
- Data tableUn tableau pour de vraies données, avec tri, recherche, sélection de lignes, colonnes épinglées, en-tête fixe et pagination.
- ItemUne ligne de média, de texte et d’actions pour les listes, réglages et sélecteurs, avec une surface groupée et une surbrillance de survol qui glisse d’une ligne à l’autre.
- KbdDes keycaps pour les raccourcis qui affichent les bons symboles sur chaque plateforme, se lisent correctement à voix haute et s’enfoncent comme de vraies touches.
Utilisé dans les blocks
Des blocks qui s’appuient sur Chart.
- BillingForfait et utilisation pour un produit d’IA, dans le style de Cursor, Claude et Vercel. Un compteur d’utilisation réparti par modèle qui projette la fin du cycle et prévient avant la fin des crédits, un graphique quotidien explorable, une limite de dépenses avec des alertes prévisualisables sur le compteur, des changements de forfait avec proratisation exacte, un formulaire de carte avec une vraie validation, et des factures téléchargeables en PDF.
- SettingsParamètres pour un produit d’IA, présentés comme dans Cursor et Claude. Une barre latérale pleine avec recherche, groupes et liens externes, des cartes de lignes avec sélecteurs discrets et options imbriquées, un îlot d’enregistrement sombre qui n’apparaît que si quelque chose a changé, ⌘S pour enregistrer, des erreurs de champ issues de vos contrôles ou de votre serveur, et des états de chargement qui épousent la forme du contenu.