"use client"; import type { LucideIcon } from "lucide-react"; import { Area, AreaChart, ResponsiveContainer } from "recharts"; import { GlassCard } from "@/components/glass/card"; import { useMounted } from "@/lib/hooks/use-mounted"; import { cn } from "@/lib/utils"; interface StatCardProps { label: string; value: number | string; icon: LucideIcon; variant?: "default" | "danger" | "success"; sparklineData?: { value: number }[]; formatter?: (v: number) => string; } export function StatCard({ label, value, icon: Icon, variant = "default", sparklineData, formatter = (v) => (typeof v === "number" ? v.toLocaleString() : v), }: StatCardProps) { const mounted = useMounted(); const accentColor = { default: "var(--color-primary)", danger: "var(--color-destructive)", success: "oklch(0.6 0.18 160)", }[variant]; const bgAccent = { default: "bg-primary/10 text-primary", danger: "bg-destructive/10 text-destructive", success: "bg-emerald-500/10 text-emerald-500", }[variant]; const numValue = typeof value === "number" ? value : Number(value); return (
{formatter(numValue)}
{label}
{/* Sparkline background */} {sparklineData && sparklineData.length > 0 && mounted && (
)}
); }