in financial-data-analyst/components/ChartRenderer.tsx [33:89]
function BarChartComponent({ data }: { data: ChartData }) {
const dataKey = Object.keys(data.chartConfig)[0];
return (
<Card>
<CardHeader>
<CardTitle className="text-xl">{data.config.title}</CardTitle>
<CardDescription>{data.config.description}</CardDescription>
</CardHeader>
<CardContent>
<ChartContainer config={data.chartConfig}>
<BarChart accessibilityLayer data={data.data}>
<CartesianGrid vertical={false} />
<XAxis
dataKey={data.config.xAxisKey}
tickLine={false}
tickMargin={10}
axisLine={false}
tickFormatter={(value) => {
return value.length > 20
? `${value.substring(0, 17)}...`
: value;
}}
/>
<ChartTooltip
cursor={false}
content={<ChartTooltipContent hideLabel />}
/>
<Bar
dataKey={dataKey}
fill={`var(--color-${dataKey})`}
radius={8}
/>
</BarChart>
</ChartContainer>
</CardContent>
<CardFooter className="flex-col items-start gap-2 text-sm">
{data.config.trend && (
<div className="flex gap-2 font-medium leading-none">
Trending {data.config.trend.direction} by{" "}
{data.config.trend.percentage}% this period{" "}
{data.config.trend.direction === "up" ? (
<TrendingUp className="h-4 w-4" />
) : (
<TrendingDown className="h-4 w-4" />
)}
</div>
)}
{data.config.footer && (
<div className="leading-none text-muted-foreground">
{data.config.footer}
</div>
)}
</CardFooter>
</Card>
);
}