Spaces:
Sleeping
Sleeping
| import { cn } from '@/lib/utils'; | |
| import { LucideIcon } from 'lucide-react'; | |
| interface StatCardProps { | |
| title: string; | |
| value: string | number; | |
| icon: LucideIcon; | |
| trend?: { | |
| value: number; | |
| isPositive: boolean; | |
| }; | |
| className?: string; | |
| iconClassName?: string; | |
| } | |
| export function StatCard({ title, value, icon: Icon, trend, className, iconClassName }: StatCardProps) { | |
| return ( | |
| <div className={cn('stat-card', className)}> | |
| <div className="flex items-start justify-between"> | |
| <div> | |
| <p className="text-sm font-medium text-muted-foreground">{title}</p> | |
| <p className="mt-2 text-3xl font-bold font-display text-foreground">{value}</p> | |
| {trend && ( | |
| <p className={cn( | |
| 'mt-1 text-xs font-medium', | |
| trend.isPositive ? 'text-emerald-600' : 'text-red-600' | |
| )}> | |
| {trend.isPositive ? '↑' : '↓'} {Math.abs(trend.value)}% from last month | |
| </p> | |
| )} | |
| </div> | |
| <div className={cn( | |
| 'rounded-xl p-3', | |
| iconClassName || 'bg-primary/10' | |
| )}> | |
| <Icon className={cn('h-6 w-6', iconClassName ? 'text-current' : 'text-primary')} /> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |