Finance
Compliance Status Card - Regulatory Compliance
Monitor compliance status and regulatory requirements. Track compliance violations and remediation.
Finance Compliance Status Card
The Finance Compliance Status Card tracks compliance with financial regulations and reporting requirements, ensuring businesses meet their regulatory obligations.
Preview
Installation
npx shadcn@latest add https://vectormotion.vercel.app/registry/finance-compliance-status-card.jsonFinance Compliance Status Card
'use client'import React from 'react';import { ShieldCheck, Check } from 'lucide-react';import { motion } from 'motion/react';import { clsx, type ClassValue } from "clsx"import { twMerge } from "tailwind-merge"import { ResponsiveContainer, RadialBarChart, RadialBar, PolarAngleAxis } from 'recharts';function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs))}interface ComplianceData { name: string; value: number; fill: string;}interface ComplianceStatusCardProps { isInteractive?: boolean; className?: string; title?: string; score?: string; statusLabel?: string; checks?: string[]; data?: ComplianceData[];}const DEFAULT_TITLE = "Compliance";const DEFAULT_SCORE = "95%";const DEFAULT_STATUS_LABEL = "Passing";const DEFAULT_CHECKS = ['SOC2 Type II', 'GDPR Data', 'KYC/AML'];const DEFAULT_DATA: ComplianceData[] = [{ name: 'Compliant', value: 95, fill: '#10b981' }]; // Emeraldexport const ComplianceStatusCard: React.FC<ComplianceStatusCardProps> = ({ isInteractive = true, className = "", title = DEFAULT_TITLE, score = DEFAULT_SCORE, statusLabel = DEFAULT_STATUS_LABEL, checks = DEFAULT_CHECKS, data = DEFAULT_DATA,}) => { const index = 42; return ( <motion.div layoutId={isInteractive ? `card-${index}-${title}` : undefined} transition={{ duration: 0.4, ease: "easeOut" }} className={cn( "relative overflow-hidden rounded-xl border border-border bg-card text-card-foreground p-5 shadow-sm transition-all flex flex-col h-full group", isInteractive ? "cursor-pointer hover:border-primary/50 hover:shadow-md" : "", className )} > <div className="mb-2 flex items-start justify-between relative z-10"> <div> <h3 className="font-semibold text-lg text-foreground"> {title} </h3> <div className="flex items-center gap-2 mt-1"> <span className="text-2xl font-bold text-foreground">{score}</span> <span className="text-xs text-muted-foreground">{statusLabel}</span> </div> </div> <div className="rounded-lg bg-emerald-500/10 p-2 text-emerald-500"> <ShieldCheck className="h-5 w-5" /> </div> </div> <div className="relative z-10 flex-1 min-h-[120px] mb-2 flex items-center justify-center"> <div className="h-[140px] w-full relative"> <ResponsiveContainer width="100%" height="100%"> <RadialBarChart cx="50%" cy="50%" innerRadius="70%" outerRadius="100%" barSize={12} data={data} startAngle={90} endAngle={-270} > <PolarAngleAxis type="number" domain={[0, 100]} angleAxisId={0} tick={false} /> <RadialBar background={{ fill: '#f4f4f5' }} // zinc-100 dataKey="value" cornerRadius={10} /> </RadialBarChart> </ResponsiveContainer> <div className="absolute inset-0 flex flex-col items-center justify-center pointer-events-none"> <span className="text-sm font-bold text-foreground">PASS</span> </div> </div> </div> <div className="space-y-1 relative z-10"> {checks.map((check) => ( <div key={check} className="flex items-center justify-between text-xs py-1 px-2 rounded hover:bg-zinc-50 dark:hover:bg-zinc-800/50 transition-colors"> <span className="text-zinc-600 dark:text-muted-foreground">{check}</span> <Check className="h-3 w-3 text-emerald-500" /> </div> ))} </div> </motion.div> );};Props
Prop
Type