import React, { useMemo } from 'react'; import { cn, fmt } from '@/lib/utils'; import { AlertCircle, CheckCircle2, Clock, TrendingUp, Settings2, type LucideIcon } from 'lucide-react'; import type { Dollars } from '@/lib/money'; type CardType = 'starting' | 'paid' | 'remaining' | 'overdue'; interface CardDef { label: string; icon: LucideIcon; bar: string; glow: string; borderActive?: string; valueClass: string; activateWhen: (v: number) => boolean; } const CARD_DEFS: Record = { starting: { label: 'Starting', icon: TrendingUp, bar: 'from-slate-400 to-slate-300', glow: '', valueClass: 'text-foreground', activateWhen: () => true, }, paid: { label: 'Total Paid', icon: CheckCircle2, bar: 'from-emerald-500 to-emerald-300', glow: 'shadow-[0_4px_20px_rgba(16,185,129,0.15)]', borderActive: 'border-emerald-400/40', valueClass: 'text-emerald-600 dark:text-emerald-100', activateWhen: (v) => v > 0, }, remaining: { label: 'Remaining', icon: Clock, bar: 'from-blue-400 to-indigo-300', glow: '', valueClass: 'text-foreground', activateWhen: () => true, }, overdue: { label: 'Overdue', icon: AlertCircle, bar: 'from-rose-400 to-orange-300', glow: 'shadow-[0_4px_20px_rgba(251,113,133,0.10)]', borderActive: 'border-rose-400/35', valueClass: 'text-red-500 dark:text-rose-100', activateWhen: (v) => v > 0, }, }; interface SummaryCardProps { type: CardType; value?: Dollars; onEdit?: () => void; hint?: string; } export const SummaryCard = React.memo(function SummaryCard({ type, value, onEdit, hint }: SummaryCardProps) { const def = useMemo(() => CARD_DEFS[type], [type]); const isActive = useMemo(() => def.activateWhen(value || 0), [def, value]); const Icon = useMemo(() => def.icon, [def]); return (

{def.label}

{type === 'starting' && onEdit && ( )}

{fmt(value)}

{hint &&

{hint}

}
); }); SummaryCard.displayName = 'SummaryCard';