import React, { forwardRef } from "react"; import { BaseComponentProps } from "../../types"; import { Card, CardContent } from "../ui/Card"; export interface StatsCardProps extends BaseComponentProps { title: string; value: string | number; subtitle?: string; trend?: { value: number; label?: string; isPositive?: boolean; }; icon?: React.ReactNode; variant?: "default" | "success" | "warning" | "danger"; loading?: boolean; } export const StatsCard = forwardRef( ( { className = "", title, value, subtitle, trend, icon, variant = "default", loading = false, ...props }, ref ) => { const getVariantClasses = () => { switch (variant) { case "success": return "border-green-200 bg-green-50 dark:border-green-800 dark:bg-green-950"; case "warning": return "border-yellow-200 bg-yellow-50 dark:border-yellow-800 dark:bg-yellow-950"; case "danger": return "border-red-200 bg-red-50 dark:border-red-800 dark:bg-red-950"; default: return ""; } }; const getTrendColor = () => { if (!trend) return ""; return trend.isPositive ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"; }; const getTrendIcon = () => { if (!trend) return null; return trend.isPositive ? ( ) : ( ); }; if (loading) { return (
); } return (

{title}

{icon &&
{icon}
}

{value}

{subtitle && (

{subtitle}

)} {trend && (
{getTrendIcon()} {Math.abs(trend.value)}% {trend.label && ( ({trend.label}) )}
)}
); } ); StatsCard.displayName = "StatsCard";