42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
|
|
import { TrendingUp, TrendingDown, Users, ShoppingCart, DollarSign, CreditCard, LucideIcon } from "lucide-react"
|
|
import type { MetricCard as MetricCardType } from "@/types/dashboard"
|
|
|
|
const iconMap: Record<string, LucideIcon> = {
|
|
Users,
|
|
ShoppingCart,
|
|
DollarSign,
|
|
CreditCard,
|
|
}
|
|
|
|
export function MetricCard({ title, value, change, changeLabel, icon }: MetricCardType) {
|
|
const isPositive = change >= 0
|
|
const Icon = iconMap[icon]
|
|
|
|
return (
|
|
<Card>
|
|
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-0">
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
{Icon && <Icon className="h-4 w-4 text-muted-foreground" />}
|
|
{title}
|
|
</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<div className="text-3xl font-bold pb-1">{value}</div>
|
|
<div className="flex items-center text-xs text-muted-foreground mt-1">
|
|
{isPositive ? (
|
|
<TrendingUp className="mr-1 h-4 w-4 text-green-500" />
|
|
) : (
|
|
<TrendingDown className="mr-1 h-4 w-4 text-red-500" />
|
|
)}
|
|
<span className={isPositive ? "text-green-500" : "text-red-500"}>
|
|
{isPositive ? "+" : ""}
|
|
{change}%
|
|
</span>
|
|
<span className="ml-1">{changeLabel}</span>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
)
|
|
}
|