mirror of
https://github.com/supabase/supabase.git
synced 2026-10-05 09:25:06 +03:00
This PR migrates the whole monorepo to use Tailwind v4: - Removed `@tailwindcss/container-queries` plugin since it's included by default in v4, - Bump all instances of Tailwind to v4. Made minimal changes to the shared config to remove non-supported features (`alpha` mentions), - Migrate all apps to be compatible with v4 configs, - Fix the `typography.css` import in 3 apps, - Add missing rules which were included by default in v3, - Run `pnpm dlx @tailwindcss/upgrade` on all apps, which renames a lot of classes - Rename all misnamed classes according to https://tailwindcss.com/docs/upgrade-guide#renamed-utilities in all apps. --------- Co-authored-by: Jordi Enric <jordi.err@gmail.com>
543 lines
14 KiB
Plaintext
543 lines
14 KiB
Plaintext
---
|
|
title: Chart
|
|
description: Beautiful charts. Built using Recharts. Copy and paste into your apps.
|
|
component: true
|
|
source:
|
|
shadcn: true
|
|
---
|
|
|
|
<ComponentPreview name="chart-bar-interactive" peekCode wide />
|
|
|
|
Introducing **Charts**. A collection of chart components that you can copy and paste into your apps.
|
|
|
|
Charts are designed to look great out of the box. They work well with the other components and are fully customizable to fit your project.
|
|
|
|
[Browse the Charts Library](/charts).
|
|
|
|
## Component
|
|
|
|
We use [Recharts](https://recharts.org/) under the hood.
|
|
|
|
We designed the `chart` component with composition in mind. **You build your charts using Recharts components and only bring in custom components, such as `ChartTootlip`, when and where you need it**.
|
|
|
|
```tsx showLineNumbers /ChartContainer/ /ChartTooltipContent/
|
|
import { Bar, BarChart } from 'recharts'
|
|
|
|
import { ChartContainer, ChartTooltipContent } from '@/components/ui/charts'
|
|
|
|
export function MyChart() {
|
|
return (
|
|
<ChartContainer>
|
|
<BarChart data={data}>
|
|
<Bar dataKey="value" />
|
|
<ChartTooltip content={<ChartTooltipContent />} />
|
|
</BarChart>
|
|
</ChartContainer>
|
|
)
|
|
}
|
|
```
|
|
|
|
We do not wrap Recharts. This means you're not locked into an abstraction. When a new Recharts version is released, you can follow the official upgrade path to upgrade your charts.
|
|
|
|
**The components are yours**.
|
|
|
|
## Installation
|
|
|
|
<Callout className="mt-4">
|
|
|
|
**Note:** If you are trying to use charts with **React 19** or the **Next.js 15**, you will need the [recharts@alpha](https://github.com/recharts/recharts/releases/tag/v2.13.0-alpha.4) release currently.
|
|
|
|
</Callout>
|
|
|
|
Add the following colors to your CSS file in your app.
|
|
|
|
```css
|
|
@layer base {
|
|
:root {
|
|
--chart-1: 12 76% 61%;
|
|
--chart-2: 173 58% 39%;
|
|
--chart-3: 197 37% 24%;
|
|
--chart-4: 43 74% 66%;
|
|
--chart-5: 27 87% 67%;
|
|
}
|
|
|
|
.dark {
|
|
--chart-1: 220 70% 50%;
|
|
--chart-2: 160 60% 45%;
|
|
--chart-3: 30 80% 55%;
|
|
--chart-4: 280 65% 60%;
|
|
--chart-5: 340 75% 55%;
|
|
}
|
|
}
|
|
```
|
|
|
|
## Your First Chart
|
|
|
|
Let's build your first chart. We'll build a bar chart, add a grid, axis, tooltip and legend.
|
|
|
|
<Steps>
|
|
|
|
<Step>Start by defining your data</Step>
|
|
|
|
The following data represents the number of desktop and mobile users for each month.
|
|
|
|
<Callout className="mt-4">
|
|
|
|
**Note:** Your data can be in any shape. You are not limited to the shape of the data below. Use the `dataKey` prop to map your data to the chart.
|
|
|
|
</Callout>
|
|
|
|
```tsx
|
|
const chartData = [
|
|
{ month: 'January', desktop: 186, mobile: 80 },
|
|
{ month: 'February', desktop: 305, mobile: 200 },
|
|
{ month: 'March', desktop: 237, mobile: 120 },
|
|
{ month: 'April', desktop: 73, mobile: 190 },
|
|
{ month: 'May', desktop: 209, mobile: 130 },
|
|
{ month: 'June', desktop: 214, mobile: 140 },
|
|
]
|
|
```
|
|
|
|
<Step>Define your chart config</Step>
|
|
|
|
The chart config holds configuration for the chart. This is where you place human-readable strings, such as labels, icons and color tokens for theming.
|
|
|
|
```tsx
|
|
import { type ChartConfig } from '@/components/ui/chart'
|
|
|
|
const chartConfig = {
|
|
desktop: {
|
|
label: 'Desktop',
|
|
color: '#2563eb',
|
|
},
|
|
mobile: {
|
|
label: 'Mobile',
|
|
color: '#60a5fa',
|
|
},
|
|
} satisfies ChartConfig
|
|
```
|
|
|
|
<Step>Build your chart</Step>
|
|
|
|
You can now build your chart using Recharts components.
|
|
|
|
<Callout className="mt-4 bg-amber-50 border-amber-200 dark:bg-amber-950/50 dark:border-amber-950">
|
|
|
|
**Important:** Remember to set a `min-h-[VALUE]` on the `ChartContainer` component. This is required for the chart be responsive.
|
|
|
|
</Callout>
|
|
|
|
<ComponentSource name="chart-bar-demo" />
|
|
|
|
<ComponentPreview name="chart-bar-demo" className="[&_.preview]:p-4 [&_.preview]:min-h-[250px]" />
|
|
|
|
</Steps>
|
|
|
|
### Add a Grid
|
|
|
|
Let's add a grid to the chart.
|
|
|
|
<Steps>
|
|
|
|
<Step>Import the `CartesianGrid` component.</Step>
|
|
|
|
```tsx /CartesianGrid/
|
|
import { Bar, BarChart, CartesianGrid } from 'recharts'
|
|
```
|
|
|
|
<Step>Add the `CartesianGrid` component to your chart.</Step>
|
|
|
|
```tsx showLineNumbers {3}
|
|
<ChartContainer config={chartConfig} className="min-h-[200px] w-full">
|
|
<BarChart accessibilityLayer data={chartData}>
|
|
<CartesianGrid vertical={false} />
|
|
<Bar dataKey="desktop" fill="var(--color-desktop)" radius={4} />
|
|
<Bar dataKey="mobile" fill="var(--color-mobile)" radius={4} />
|
|
</BarChart>
|
|
</ChartContainer>
|
|
```
|
|
|
|
<ComponentPreview
|
|
name="chart-bar-demo-grid"
|
|
className="[&_.preview]:p-4 [&_.preview]:min-h-[250px]"
|
|
/>
|
|
|
|
</Steps>
|
|
|
|
### Add an Axis
|
|
|
|
To add an x-axis to the chart, we'll use the `XAxis` component.
|
|
|
|
<Steps>
|
|
|
|
<Step>Import the `XAxis` component.</Step>
|
|
|
|
```tsx /XAxis/
|
|
import { Bar, BarChart, CartesianGrid, XAxis } from 'recharts'
|
|
```
|
|
|
|
<Step>Add the `XAxis` component to your chart.</Step>
|
|
|
|
```tsx showLineNumbers {4-10}
|
|
<ChartContainer config={chartConfig} className="h-[200px] w-full">
|
|
<BarChart accessibilityLayer data={chartData}>
|
|
<CartesianGrid vertical={false} />
|
|
<XAxis
|
|
dataKey="month"
|
|
tickLine={false}
|
|
tickMargin={10}
|
|
axisLine={false}
|
|
tickFormatter={(value) => value.slice(0, 3)}
|
|
/>
|
|
<Bar dataKey="desktop" fill="var(--color-desktop)" radius={4} />
|
|
<Bar dataKey="mobile" fill="var(--color-mobile)" radius={4} />
|
|
</BarChart>
|
|
</ChartContainer>
|
|
```
|
|
|
|
<ComponentPreview
|
|
name="chart-bar-demo-axis"
|
|
className="[&_.preview]:p-4 [&_.preview]:min-h-[250px]"
|
|
/>
|
|
|
|
</Steps>
|
|
|
|
### Add Tooltip
|
|
|
|
So far we've only used components from Recharts. They look great out of the box thanks to some customization in the `chart` component.
|
|
|
|
To add a tooltip, we'll use the custom `ChartTooltip` and `ChartTooltipContent` components from `chart`.
|
|
|
|
<Steps>
|
|
|
|
<Step>Import the `ChartTooltip` and `ChartTooltipContent` components.</Step>
|
|
|
|
```tsx
|
|
import { ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
|
|
```
|
|
|
|
<Step>Add the components to your chart.</Step>
|
|
|
|
```tsx showLineNumbers {11}
|
|
<ChartContainer config={chartConfig} className="h-[200px] w-full">
|
|
<BarChart accessibilityLayer data={chartData}>
|
|
<CartesianGrid vertical={false} />
|
|
<XAxis
|
|
dataKey="month"
|
|
tickLine={false}
|
|
tickMargin={10}
|
|
axisLine={false}
|
|
tickFormatter={(value) => value.slice(0, 3)}
|
|
/>
|
|
<ChartTooltip content={<ChartTooltipContent />} />
|
|
<Bar dataKey="desktop" fill="var(--color-desktop)" radius={4} />
|
|
<Bar dataKey="mobile" fill="var(--color-mobile)" radius={4} />
|
|
</BarChart>
|
|
</ChartContainer>
|
|
```
|
|
|
|
<ComponentPreview
|
|
name="chart-bar-demo-tooltip"
|
|
className="[&_.preview]:p-4 [&_.preview]:min-h-[250px]"
|
|
/>
|
|
|
|
Hover to see the tooltips. Easy, right? Two components, and we've got a beautiful tooltip.
|
|
|
|
</Steps>
|
|
|
|
### Add Legend
|
|
|
|
We'll do the same for the legend. We'll use the `ChartLegend` and `ChartLegendContent` components from `chart`.
|
|
|
|
<Steps>
|
|
|
|
<Step>Import the `ChartLegend` and `ChartLegendContent` components.</Step>
|
|
|
|
```tsx
|
|
import { ChartLegend, ChartLegendContent } from '@/components/ui/chart'
|
|
```
|
|
|
|
<Step>Add the components to your chart.</Step>
|
|
|
|
```tsx showLineNumbers {12}
|
|
<ChartContainer config={chartConfig} className="h-[200px] w-full">
|
|
<BarChart accessibilityLayer data={chartData}>
|
|
<CartesianGrid vertical={false} />
|
|
<XAxis
|
|
dataKey="month"
|
|
tickLine={false}
|
|
tickMargin={10}
|
|
axisLine={false}
|
|
tickFormatter={(value) => value.slice(0, 3)}
|
|
/>
|
|
<ChartTooltip content={<ChartTooltipContent />} />
|
|
<ChartLegend content={<ChartLegendContent />} />
|
|
<Bar dataKey="desktop" fill="var(--color-desktop)" radius={4} />
|
|
<Bar dataKey="mobile" fill="var(--color-mobile)" radius={4} />
|
|
</BarChart>
|
|
</ChartContainer>
|
|
```
|
|
|
|
<ComponentPreview
|
|
name="chart-bar-demo-legend"
|
|
className="[&_.preview]:p-4 [&_.preview]:min-h-[250px]"
|
|
/>
|
|
|
|
</Steps>
|
|
|
|
Done. You've built your first chart! What's next?
|
|
|
|
- [Themes and Colors](/docs/components/chart#theming)
|
|
- [Tooltip](/docs/components/chart#tooltip)
|
|
- [Legend](/docs/components/chart#legend)
|
|
|
|
## Chart Config
|
|
|
|
The chart config is where you define the labels, icons and colors for a chart.
|
|
|
|
It is intentionally decoupled from chart data.
|
|
|
|
This allows you to share config and color tokens between charts. It can also works independently for cases where your data or color tokens live remotely or in a different format.
|
|
|
|
```tsx /ChartConfig/
|
|
import { Monitor } from 'lucide-react'
|
|
|
|
import { type ChartConfig } from '@/components/ui/chart'
|
|
|
|
const chartConfig = {
|
|
desktop: {
|
|
label: 'Desktop',
|
|
icon: Monitor,
|
|
// A color like 'hsl(220, 98%, 61%)' or 'var(--color-name)'
|
|
color: '#2563eb',
|
|
// OR a theme object with 'light' and 'dark' keys
|
|
theme: {
|
|
light: '#2563eb',
|
|
dark: '#dc2626',
|
|
},
|
|
},
|
|
} satisfies ChartConfig
|
|
```
|
|
|
|
## Theming
|
|
|
|
Charts has built-in support for theming. You can use css variables (recommended) or color values in any color format, such as hex, hsl or oklch.
|
|
|
|
### CSS Variables
|
|
|
|
<Steps>
|
|
|
|
<Step>Define your colors in your css file</Step>
|
|
|
|
```css {6-7,14-15} title="globals.css"
|
|
@layer base {
|
|
:root {
|
|
--background: 0 0% 100%;
|
|
--foreground: 240 10% 3.9%;
|
|
// ...
|
|
--chart-1: 12 76% 61%;
|
|
--chart-2: 173 58% 39%;
|
|
}
|
|
|
|
.dark: {
|
|
--background: 240 10% 3.9%;
|
|
--foreground: 0 0% 100%;
|
|
// ...
|
|
--chart-1: 220 70% 50%;
|
|
--chart-2: 160 60% 45%;
|
|
}
|
|
}
|
|
```
|
|
|
|
<Step>Add the color to your `chartConfig`</Step>
|
|
|
|
```tsx {4,8}
|
|
const chartConfig = {
|
|
desktop: {
|
|
label: 'Desktop',
|
|
color: 'hsl(var(--chart-1))',
|
|
},
|
|
mobile: {
|
|
label: 'Mobile',
|
|
color: 'hsl(var(--chart-2))',
|
|
},
|
|
} satisfies ChartConfig
|
|
```
|
|
|
|
<Callout className="mt-4">
|
|
|
|
We're wrapping the value in `hsl()` here because we define the colors without color space function.
|
|
|
|
This is not required. You can use full color values, such as hex, hsl or oklch.
|
|
|
|
```css
|
|
--chart-1: oklch(70% 0.227 154.59);
|
|
```
|
|
|
|
```tsx
|
|
color: "var(--chart-1)",
|
|
```
|
|
|
|
</Callout>
|
|
|
|
</Steps>
|
|
|
|
### hex, hsl or oklch
|
|
|
|
You can also define your colors directly in the chart config. Use the color format you prefer.
|
|
|
|
```tsx
|
|
const chartConfig = {
|
|
desktop: {
|
|
label: 'Desktop',
|
|
color: '#2563eb',
|
|
},
|
|
} satisfies ChartConfig
|
|
```
|
|
|
|
### Using Colors
|
|
|
|
To use the theme colors in your chart, reference the colors using the format `var(--color-KEY)`.
|
|
|
|
#### Components
|
|
|
|
```tsx
|
|
<Bar dataKey="desktop" fill="var(--color-desktop)" />
|
|
```
|
|
|
|
#### Chart Data
|
|
|
|
```tsx
|
|
const chartData = [
|
|
{ browser: 'chrome', visitors: 275, fill: 'var(--color-chrome)' },
|
|
{ browser: 'safari', visitors: 200, fill: 'var(--color-safari)' },
|
|
]
|
|
```
|
|
|
|
#### Tailwind
|
|
|
|
```tsx
|
|
<LabelList className="fill-(--color-desktop)" />
|
|
```
|
|
|
|
## Tooltip
|
|
|
|
A chart tooltip contains a label, name, indicator and value. You can use a combination of these to customize your tooltip.
|
|
|
|
<ComponentPreview name="chart-tooltip-demo" className="[&_.preview]:py-0" hideCode />
|
|
|
|
You can turn on/off any of these using the `hideLabel`, `hideIndicator` props and customize the indicator style using the `indicator` prop.
|
|
|
|
Use `labelKey` and `nameKey` to use a custom key for the tooltip label and name.
|
|
|
|
Chart comes with the `<ChartTooltip>` and `<ChartTooltipContent>` components. You can use these two components to add custom tooltips to your chart.
|
|
|
|
```tsx
|
|
import { ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
|
|
```
|
|
|
|
```tsx
|
|
<ChartTooltip content={<ChartTooltipContent />} />
|
|
```
|
|
|
|
### Props
|
|
|
|
Use the following props to customize the tooltip.
|
|
|
|
| Prop | Type | Description |
|
|
| :-------------- | :----------------------- | :------------------------------------------- |
|
|
| `labelKey` | string | The config or data key to use for the label. |
|
|
| `nameKey` | string | The config or data key to use for the name. |
|
|
| `indicator` | `dot` `line` or `dashed` | The indicator style for the tooltip. |
|
|
| `hideLabel` | boolean | Whether to hide the label. |
|
|
| `hideIndicator` | boolean | Whether to hide the indicator. |
|
|
|
|
### Colors
|
|
|
|
Colors are automatically referenced from the chart config.
|
|
|
|
### Custom
|
|
|
|
To use a custom key for tooltip label and names, use the `labelKey` and `nameKey` props.
|
|
|
|
```tsx /browser/
|
|
const chartData = [
|
|
{ browser: 'chrome', visitors: 187, fill: 'var(--color-chrome)' },
|
|
{ browser: 'safari', visitors: 200, fill: 'var(--color-safari)' },
|
|
]
|
|
|
|
const chartConfig = {
|
|
visitors: {
|
|
label: 'Total Visitors',
|
|
},
|
|
chrome: {
|
|
label: 'Chrome',
|
|
color: 'hsl(var(--chart-1))',
|
|
},
|
|
safari: {
|
|
label: 'Safari',
|
|
color: 'hsl(var(--chart-2))',
|
|
},
|
|
} satisfies ChartConfig
|
|
```
|
|
|
|
```tsx
|
|
<ChartTooltip content={<ChartTooltipContent labelKey="visitors" nameKey="browser" />} />
|
|
```
|
|
|
|
This will use `Total Visitors` for label and `Chrome` and `Safari` for the tooltip names.
|
|
|
|
## Legend
|
|
|
|
You can use the custom `<ChartLegend>` and `<ChartLegendContent>` components to add a legend to your chart.
|
|
|
|
```tsx
|
|
import { ChartLegend, ChartLegendContent } from '@/components/ui/chart'
|
|
```
|
|
|
|
```tsx
|
|
<ChartLegend content={<ChartLegendContent />} />
|
|
```
|
|
|
|
### Colors
|
|
|
|
Colors are automatically referenced from the chart config.
|
|
|
|
### Custom
|
|
|
|
To use a custom key for legend names, use the `nameKey` prop.
|
|
|
|
```tsx /browser/
|
|
const chartData = [
|
|
{ browser: 'chrome', visitors: 187, fill: 'var(--color-chrome)' },
|
|
{ browser: 'safari', visitors: 200, fill: 'var(--color-safari)' },
|
|
]
|
|
|
|
const chartConfig = {
|
|
chrome: {
|
|
label: 'Chrome',
|
|
color: 'hsl(var(--chart-1))',
|
|
},
|
|
safari: {
|
|
label: 'Safari',
|
|
color: 'hsl(var(--chart-2))',
|
|
},
|
|
} satisfies ChartConfig
|
|
```
|
|
|
|
```tsx
|
|
<ChartLegend content={<ChartLegendContent nameKey="browser" />} />
|
|
```
|
|
|
|
This will use `Chrome` and `Safari` for the legend names.
|
|
|
|
## Accessibility
|
|
|
|
You can turn on the `accessibilityLayer` prop to add an accessible layer to your chart.
|
|
|
|
This prop adds keyboard access and screen reader support to your charts.
|
|
|
|
```tsx
|
|
<LineChart accessibilityLayer />
|
|
```
|