DocumentationBarChart
BarChart
A responsive bar chart component built on Recharts for comparing data across categories with multiple visualization options.
Install Dependencies
npx quickcode-ui add BarChartpnpm dlx quickcode-ui add BarChartyarn dlx quickcode-ui add BarChartbunx quickcode-ui add BarChartExamples
Basic
Basic Bar Chart
import { BarChart, Bar, ChartContainer, ChartTooltip, ChartTooltipContent, CartesianGrid, XAxis, YAxis, type ChartConfig } from '@/components/ui/BarChart' const data = [ { "month": "Jan", "desktop": 186 }, { "month": "Feb", "desktop": 305 }, { "month": "Mar", "desktop": 237 }, { "month": "Apr", "desktop": 173 }, { "month": "May", "desktop": 209 }, { "month": "Jun", "desktop": 214 } ] const config: ChartConfig = { desktop: { label: "Desktop", color: "var(--chart-1)", }, } export function BasicBarChart() { return ( <ChartContainer config={config} className="h-[300px]"> <BarChart data={data}> <CartesianGrid strokeDasharray="3 3" stroke="var(--border)" /> <XAxis dataKey="month" stroke="var(--muted-foreground)" /> <YAxis stroke="var(--muted-foreground)" /> <ChartTooltip content={ChartTooltipContent} /> <Bar dataKey="desktop" fill="var(--color-desktop)" radius={4} /> </BarChart> </ChartContainer> ) }
Horizontal
Horizontal Bar Chart
import { BarChart, Bar, ChartContainer, ChartTooltip, ChartTooltipContent, CartesianGrid, XAxis, YAxis, type ChartConfig } from '@/components/ui/BarChart' const data = [ { "month": "Jan", "desktop": 186 }, { "month": "Feb", "desktop": 305 }, { "month": "Mar", "desktop": 237 }, { "month": "Apr", "desktop": 173 }, { "month": "May", "desktop": 209 }, { "month": "Jun", "desktop": 214 } ] const config: ChartConfig = { desktop: { label: "Desktop", color: "var(--chart-1)", }, } export function HorizontalBarChart() { return ( <ChartContainer config={basicConfig} className="h-[300px]"> <BarChart data={basicData} layout="vertical"> <XAxis type="number" stroke="var(--muted-foreground)" /> <YAxis dataKey="month" type="category" stroke="var(--muted-foreground)" /> <ChartTooltip content={ChartTooltipContent} /> <Bar dataKey="desktop" fill="var(--color-desktop)" radius={[0, 4, 4, 0]} /> </BarChart> </ChartContainer> ) }
Multiple
Multiple Bar Chart
import { BarChart, Bar, ChartContainer, ChartTooltip, ChartTooltipContent, CartesianGrid, XAxis, YAxis, type ChartConfig } from '@/components/ui/BarChart' const data = [ { "month": "Jan", "desktop": 186, "mobile": 80 }, { "month": "Feb", "desktop": 305, "mobile": 200 }, { "month": "Mar", "desktop": 237, "mobile": 120 }, { "month": "Apr", "desktop": 173, "mobile": 190 }, { "month": "May", "desktop": 209, "mobile": 130 }, { "month": "Jun", "desktop": 214, "mobile": 140 } ] const config: ChartConfig = { desktop: { label: "Desktop", color: "var(--chart-1)", }, mobile: { label: "Mobile", color: "var(--chart-2)", }, } export function MultipleBarChart() { return ( <ChartContainer config={config} className="h-[300px]"> <BarChart data={data}> <CartesianGrid strokeDasharray="3 3" stroke="var(--border)" /> <XAxis dataKey="month" stroke="var(--muted-foreground)" /> <YAxis stroke="var(--muted-foreground)" /> <ChartTooltip content={ChartTooltipContent} /> <Bar dataKey="desktop" fill="var(--color-desktop)" radius={4} /> <Bar dataKey="mobile" fill="var(--color-mobile)" radius={4} /> </BarChart> </ChartContainer> ) }
Stacked + Legend
Stacked Bar Chart with Legend
Desktop
Mobile
import { BarChart, Bar, ChartContainer, ChartTooltip, ChartTooltipContent, CartesianGrid, XAxis, YAxis, Legend, type ChartConfig } from '@/components/ui/BarChart' import { Monitor, Smartphone } from 'lucide-react' const data = [ { "month": "Jan", "desktop": 186, "mobile": 80 }, { "month": "Feb", "desktop": 305, "mobile": 200 }, { "month": "Mar", "desktop": 237, "mobile": 120 }, { "month": "Apr", "desktop": 173, "mobile": 190 }, { "month": "May", "desktop": 209, "mobile": 130 }, { "month": "Jun", "desktop": 214, "mobile": 140 } ] const config: ChartConfig = { desktop: { label: "Desktop", color: "var(--chart-1)", }, mobile: { label: "Mobile", color: "var(--chart-2)", }, } const CustomLegend = () => { return ( <div className="flex justify-center gap-6 mt-4"> <div className="flex items-center gap-2"> <Monitor className="w-4 h-4" style={{ color: 'var(--chart-1)' }} /> <span className="text-sm text-muted-foreground">Desktop</span> </div> <div className="flex items-center gap-2"> <Smartphone className="w-4 h-4" style={{ color: 'var(--chart-2)' }} /> <span className="text-sm text-muted-foreground">Mobile</span> </div> </div> ) } export function StackedBarChart() { return ( <div className="w-full"> <ChartContainer config={config} className="h-[300px]"> <BarChart data={data}> <CartesianGrid strokeDasharray="3 3" stroke="var(--border)" /> <XAxis dataKey="month" stroke="var(--muted-foreground)" /> <YAxis stroke="var(--muted-foreground)" /> <ChartTooltip content={ChartTooltipContent} /> <Bar dataKey="desktop" stackId="a" fill="var(--color-desktop)" radius={[0, 0, 4, 4]} /> <Bar dataKey="mobile" stackId="a" fill="var(--color-mobile)" radius={[4, 4, 0, 0]} /> </BarChart> </ChartContainer> <CustomLegend /> </div> ) }
Label
Bar Chart with Labels
import { BarChart, Bar, ChartContainer, ChartTooltip, ChartTooltipContent, CartesianGrid, XAxis, YAxis, LabelList, type ChartConfig } from '@/components/ui/BarChart' const data = [ { "month": "Jan", "desktop": 186 }, { "month": "Feb", "desktop": 305 }, { "month": "Mar", "desktop": 237 }, { "month": "Apr", "desktop": 173 }, { "month": "May", "desktop": 209 }, { "month": "Jun", "desktop": 214 } ] const config: ChartConfig = { desktop: { label: "Desktop", color: "var(--chart-1)", }, } export function LabelBarChart() { return ( <ChartContainer config={config} className="h-[300px]"> <BarChart data={data}> <CartesianGrid strokeDasharray="3 3" stroke="var(--border)" /> <XAxis dataKey="month" stroke="var(--muted-foreground)" /> <YAxis stroke="var(--muted-foreground)" /> <ChartTooltip content={ChartTooltipContent} /> <Bar dataKey="desktop" fill="var(--color-desktop)" radius={4}> <LabelList dataKey="desktop" position="top" className="fill-foreground" fontSize={12} /> </Bar> </BarChart> </ChartContainer> ) }
Custom Label
Bar Chart with Custom Labels
import { BarChart, Bar, ChartContainer, ChartTooltip, ChartTooltipContent, CartesianGrid, XAxis, YAxis, LabelList, type ChartConfig } from '@/components/ui/BarChart' const data = [ { "month": "Jan", "desktop": 186 }, { "month": "Feb", "desktop": 305 }, { "month": "Mar", "desktop": 237 }, { "month": "Apr", "desktop": 173 }, { "month": "May", "desktop": 209 }, { "month": "Jun", "desktop": 214 } ] const config: ChartConfig = { desktop: { label: "Desktop", color: "var(--chart-1)", }, } const CustomLabel = (props) => { const { x, y, width, value } = props return ( <text x={x + width / 2} y={y - 5} fill="var(--chart-1)" textAnchor="middle" fontSize={12} fontWeight="bold" > {value}k </text> ) } export function CustomLabelBarChart() { return ( <ChartContainer config={config} className="h-[300px]"> <BarChart data={data}> <CartesianGrid strokeDasharray="3 3" stroke="var(--border)" /> <XAxis dataKey="month" stroke="var(--muted-foreground)" /> <YAxis stroke="var(--muted-foreground)" /> <ChartTooltip content={ChartTooltipContent} /> <Bar dataKey="desktop" fill="var(--color-desktop)" radius={4}> <LabelList content={CustomLabel} /> </Bar> </BarChart> </ChartContainer> ) }
Mixed
Mixed Bar Chart
import { BarChart, Bar, ChartContainer, ChartTooltip, ChartTooltipContent, CartesianGrid, XAxis, YAxis, type ChartConfig } from '@/components/ui/BarChart' const data = [ { "month": "Jan", "desktop": 186, "mobile": 80, "tablet": 120 }, { "month": "Feb", "desktop": 305, "mobile": 200, "tablet": 180 }, { "month": "Mar", "desktop": 237, "mobile": 120, "tablet": 160 }, { "month": "Apr", "desktop": 173, "mobile": 190, "tablet": 140 }, { "month": "May", "desktop": 209, "mobile": 130, "tablet": 200 }, { "month": "Jun", "desktop": 214, "mobile": 140, "tablet": 220 } ] const config: ChartConfig = { desktop: { label: "Desktop", color: "var(--chart-1)", }, mobile: { label: "Mobile", color: "var(--chart-2)", }, tablet: { label: "Tablet", color: "var(--chart-3)", }, } export function MixedBarChart() { return ( <ChartContainer config={config} className="h-[300px]"> <BarChart data={data}> <CartesianGrid strokeDasharray="3 3" stroke="var(--border)" /> <XAxis dataKey="month" stroke="var(--muted-foreground)" /> <YAxis stroke="var(--muted-foreground)" /> <ChartTooltip content={ChartTooltipContent} /> <Bar dataKey="desktop" stackId="stack" fill="var(--color-desktop)" radius={[0, 0, 4, 4]} /> <Bar dataKey="mobile" stackId="stack" fill="var(--color-mobile)" radius={[0, 0, 0, 0]} /> <Bar dataKey="tablet" fill="var(--color-tablet)" radius={4} /> </BarChart> </ChartContainer> ) }
Active
Active Bar Chart
import { BarChart, Bar, ChartContainer, ChartTooltip, ChartTooltipContent, CartesianGrid, XAxis, YAxis, Cell, type ChartConfig } from '@/components/ui/BarChart' const data = [ { "month": "Jan", "desktop": 186, "active": false }, { "month": "Feb", "desktop": 305, "active": true }, { "month": "Mar", "desktop": 237, "active": false }, { "month": "Apr", "desktop": 173, "active": false }, { "month": "May", "desktop": 209, "active": true }, { "month": "Jun", "desktop": 214, "active": false } ] const config: ChartConfig = { desktop: { label: "Desktop", color: "var(--chart-1)", }, } export function ActiveBarChart() { return ( <ChartContainer config={config} className="h-[300px]"> <BarChart data={data}> <CartesianGrid strokeDasharray="3 3" stroke="var(--border)" /> <XAxis dataKey="month" stroke="var(--muted-foreground)" /> <YAxis stroke="var(--muted-foreground)" /> <ChartTooltip content={ChartTooltipContent} /> <Bar dataKey="desktop" radius={4}> {data.map((entry, index) => ( <Cell key={`cell-${index}`} fill={entry.active ? "var(--color-desktop)" : "var(--muted)"} /> ))} </Bar> </BarChart> </ChartContainer> ) }
Negative
Negative Bar Chart
import { BarChart, Bar, ChartContainer, ChartTooltip, ChartTooltipContent, CartesianGrid, XAxis, YAxis, type ChartConfig } from '@/components/ui/BarChart' const data = [ { "month": "Jan", "profit": 50, "loss": -20 }, { "month": "Feb", "profit": 80, "loss": -35 }, { "month": "Mar", "profit": 60, "loss": -15 }, { "month": "Apr", "profit": 90, "loss": -40 }, { "month": "May", "profit": 70, "loss": -25 }, { "month": "Jun", "profit": 100, "loss": -30 } ] const config: ChartConfig = { profit: { label: "Profit", color: "var(--chart-1)", }, loss: { label: "Loss", color: "var(--chart-2)", }, } export function NegativeBarChart() { return ( <ChartContainer config={config} className="h-[300px]"> <BarChart data={data}> <CartesianGrid strokeDasharray="3 3" stroke="var(--border)" /> <XAxis dataKey="month" stroke="var(--muted-foreground)" /> <YAxis stroke="var(--muted-foreground)" /> <ChartTooltip content={ChartTooltipContent} /> <Bar dataKey="profit" fill="var(--color-profit)" radius={4} /> <Bar dataKey="loss" fill="var(--color-loss)" radius={4} /> </BarChart> </ChartContainer> ) }
Props
ChartContainer
| Prop | Type | Default | Description |
|---|---|---|---|
config | ChartConfig | — | Configuration object defining chart colors and labels |
children | ReactElement | — | Chart components to render |
className | string | — | Additional CSS classes |
BarChart
| Prop | Type | Default | Description |
|---|---|---|---|
data | any[] | — | Array of data objects to visualize |
layout | 'horizontal' | 'vertical' | 'horizontal' | Chart orientation |
margin | object | — | Chart margins configuration |
className | string | — | Additional CSS classes |
Bar
| Prop | Type | Default | Description |
|---|---|---|---|
dataKey | string | — | Key from data array to plot |
stackId | string | — | ID for stacking bars together |
fill | string | — | Bar fill color |
radius | number | number[] | — | Bar corner radius |
className | string | — | Additional CSS classes |
Last updated on