in financial-data-analyst/components/ChartRenderer.tsx [310:389]
function AreaChartComponent({
data,
stacked,
}: {
data: ChartData;
stacked?: boolean;
}) {
return (
<Card>
<CardHeader>
<CardTitle className="text-xl">{data.config.title}</CardTitle>
<CardDescription>{data.config.description}</CardDescription>
</CardHeader>
<CardContent>
<ChartContainer config={data.chartConfig}>
<AreaChart
accessibilityLayer
data={data.data}
margin={{
left: 12,
right: 12,
}}
>
<CartesianGrid vertical={false} />
<XAxis
dataKey={data.config.xAxisKey}
tickLine={false}
axisLine={false}
tickMargin={8}
tickFormatter={(value) => {
return value.length > 20
? `${value.substring(0, 17)}...`
: value;
}}
/>
<ChartTooltip
cursor={false}
content={
<ChartTooltipContent indicator={stacked ? "dot" : "line"} />
}
/>
{Object.keys(data.chartConfig).map((key) => (
<Area
key={key}
type="natural"
dataKey={key}
fill={`var(--color-${key})`}
fillOpacity={0.4}
stroke={`var(--color-${key})`}
stackId={stacked ? "a" : undefined}
/>
))}
</AreaChart>
</ChartContainer>
</CardContent>
<CardFooter>
<div className="flex w-full items-start gap-2 text-sm">
<div className="grid gap-2">
{data.config.trend && (
<div className="flex items-center 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>
)}
</div>
</div>
</CardFooter>
</Card>
);
}