UI logoUIUI Components

Savings Progress

Savings progress pie chart with details

Projected FinishOctober 2024
Monthly Average$1,250
Top ContributorAuto-Transfer
"use client"import { Label, Pie, PieChart } from "recharts"import { Card, CardContent, CardFooter } from "@/components/ui/card"import {    ChartContainer,    ChartTooltip,    ChartTooltipContent,    type ChartConfig,} from "@/components/ui/chart"import { Separator } from "@/components/ui/separator"const chartData = [    { name: "saved", value: 24000, fill: "var(--color-saved)" },    { name: "remaining", value: 6000, fill: "var(--color-remaining)" },]const chartConfig = {    saved: {        label: "Saved",        color: "var(--chart-2)",    },    remaining: {        label: "Remaining",        color: "var(--chart-1)",    },} satisfies ChartConfigexport function SavingsProgress() {    return (        <Card>            <CardContent>                <ChartContainer                    config={chartConfig}                    className="mx-auto aspect-square max-h-[220px]"                >                    <PieChart>                        <ChartTooltip                            cursor={false}                            content={<ChartTooltipContent hideLabel />}                        />                        <Pie                            data={chartData}                            dataKey="value"                            nameKey="name"                            innerRadius={70}                            outerRadius={95}                            strokeWidth={0}                            startAngle={90}                            endAngle={-270}                        >                            <Label                                content={({ viewBox }) => {                                    if (                                        viewBox &&                                        "cx" in viewBox &&                                        "cy" in viewBox                                    ) {                                        return (                                            <text                                                x={viewBox.cx}                                                y={viewBox.cy}                                                textAnchor="middle"                                                dominantBaseline="middle"                                            >                                                <tspan                                                    x={viewBox.cx}                                                    y={(viewBox.cy || 0) - 12}                                                    className="fill-foreground text-2xl font-bold"                                                >                                                    $24,000                                                </tspan>                                                <tspan                                                    x={viewBox.cx}                                                    y={(viewBox.cy || 0) + 12}                                                    className="fill-muted-foreground text-xs"                                                >                                                    80% of $30,000                                                </tspan>                                            </text>                                        )                                    }                                }}                            />                        </Pie>                    </PieChart>                </ChartContainer>            </CardContent>            <CardFooter className="flex-col gap-0">                <div className="flex w-full items-center justify-between py-3">                    <span className="text-sm text-muted-foreground">                        Projected Finish                    </span>                    <span className="text-sm font-semibold">October 2024</span>                </div>                <Separator />                <div className="flex w-full items-center justify-between py-3">                    <span className="text-sm text-muted-foreground">                        Monthly Average                    </span>                    <span className="text-sm font-semibold tabular-nums">                        $1,250                    </span>                </div>                <Separator />                <div className="flex w-full items-center justify-between py-3">                    <span className="text-sm text-muted-foreground">                        Top Contributor                    </span>                    <span className="text-sm font-semibold">Auto-Transfer</span>                </div>            </CardFooter>        </Card>    )}