fintechdarkpatterns / src /app /components /CompliancePanel.tsx
yujisium's picture
Fintech Dark Patterns NLP Detector - full project upload
5752a28 verified
Raw
History Blame Contribute Delete
9.46 kB
import { ComplianceReport } from '../types/analysis';
import { Shield, AlertCircle, CheckCircle2, FileCheck } from 'lucide-react';
import { Progress } from './ui/progress';
import { Card } from './ui/card';
import { Badge } from './ui/badge';
interface CompliancePanelProps {
report: ComplianceReport;
}
export function CompliancePanel({ report }: CompliancePanelProps) {
const getComplianceColor = () => {
if (report.cfpbAlignment >= 80) return 'text-emerald-400';
if (report.cfpbAlignment >= 60) return 'text-amber-400';
if (report.cfpbAlignment >= 45) return 'text-orange-400';
return 'text-rose-400';
};
const getComplianceBg = () => {
if (report.cfpbAlignment >= 80) return 'from-emerald-500/10 via-emerald-500/5 to-transparent border-emerald-500/30';
if (report.cfpbAlignment >= 60) return 'from-amber-500/10 via-amber-500/5 to-transparent border-amber-500/30';
if (report.cfpbAlignment >= 45) return 'from-orange-500/10 via-orange-500/5 to-transparent border-orange-500/30';
return 'from-rose-500/10 via-rose-500/5 to-transparent border-rose-500/30';
};
const getComplianceStatus = () => {
if (report.cfpbAlignment >= 80) return 'Compliant';
if (report.cfpbAlignment >= 60) return 'Needs Improvement';
if (report.cfpbAlignment >= 45) return 'Non-Compliant';
return 'Critically Non-Compliant';
};
const getBadgeVariantClass = () => {
if (report.cfpbAlignment >= 80) return 'bg-emerald-500/10 text-emerald-400 border border-emerald-500/20';
if (report.cfpbAlignment >= 60) return 'bg-amber-500/10 text-amber-400 border border-amber-500/20';
if (report.cfpbAlignment >= 45) return 'bg-orange-500/10 text-orange-400 border border-orange-500/20';
return 'bg-rose-500/10 text-rose-400 border border-rose-500/20';
};
return (
<div className="space-y-6">
{/* Overall Compliance Score */}
<Card className={`p-6 border bg-gradient-to-br ${getComplianceBg()} rounded-2xl relative overflow-hidden`}>
<div className="absolute top-0 right-0 w-32 h-32 bg-white/5 rounded-full blur-3xl pointer-events-none" />
<div className="flex flex-col sm:flex-row items-start sm:items-center gap-4 mb-4 justify-between">
<div className="flex items-center gap-4">
<div className={`p-3 rounded-xl bg-slate-950/20 border border-white/5`}>
<Shield className={`w-8 h-8 ${getComplianceColor()}`} />
</div>
<div>
<h3 className="text-lg font-extrabold text-slate-100">
CFPB Compliance Score: {report.cfpbAlignment}%
</h3>
<p className={`text-xs font-semibold mt-0.5 ${getComplianceColor()}`}>
Status: {getComplianceStatus()}
</p>
</div>
</div>
<Badge className={`${getBadgeVariantClass()} text-xs px-3 py-1 font-bold rounded-lg`}>
{getComplianceStatus()}
</Badge>
</div>
<Progress value={report.cfpbAlignment} className="h-3 bg-slate-900 border border-white/5" />
<p className="text-xs text-slate-400 mt-4 leading-relaxed">
This score reflects alignment with the Consumer Financial Protection Bureau (CFPB) guidelines
against deceptive practices in financial services, calculated by deducting points based on the severity of issues found.
</p>
</Card>
{/* Issues Found */}
{report.issues.length > 0 && (
<Card className="p-6 bg-slate-900/30 border border-border rounded-2xl">
<div className="flex items-center gap-3 mb-4">
<AlertCircle className="w-5 h-5 text-rose-400" />
<h4 className="font-bold text-sm text-slate-200">Compliance Issues Identified</h4>
</div>
<div className="space-y-3">
{report.issues.map((issue, index) => (
<div
key={index}
className="flex items-start gap-3 p-3.5 bg-rose-500/5 border border-rose-500/10 rounded-xl"
>
<div className="w-5 h-5 rounded-md bg-rose-500/20 text-rose-400 border border-rose-500/30 flex items-center justify-center text-xs font-bold shrink-0 mt-0.5">
{index + 1}
</div>
<p className="text-xs text-rose-200/90 leading-relaxed flex-1">{issue}</p>
</div>
))}
</div>
</Card>
)}
{/* Recommendations */}
{report.recommendations.length > 0 && (
<Card className="p-6 bg-slate-900/30 border border-border rounded-2xl">
<div className="flex items-center gap-3 mb-4">
<CheckCircle2 className="w-5 h-5 text-emerald-400" />
<h4 className="font-bold text-sm text-slate-200">Compliance Recommendations</h4>
</div>
<div className="space-y-3">
{report.recommendations.map((recommendation, index) => (
<div
key={index}
className="flex items-start gap-3 p-3.5 bg-emerald-500/5 border border-emerald-500/10 rounded-xl"
>
<div className="w-5 h-5 rounded-md bg-emerald-500/20 text-emerald-400 border border-emerald-500/30 flex items-center justify-center text-xs font-bold shrink-0 mt-0.5">
{index + 1}
</div>
<p className="text-xs text-emerald-200/90 leading-relaxed flex-1">{recommendation}</p>
</div>
))}
</div>
</Card>
)}
{/* CFPB Guidelines Reference */}
<Card className="p-6 bg-slate-900/30 border border-border rounded-2xl">
<div className="flex items-center gap-3 mb-4">
<FileCheck className="w-5 h-5 text-indigo-400" />
<h4 className="font-bold text-sm text-slate-200">CFPB Guidelines Reference</h4>
</div>
<div className="grid sm:grid-cols-2 gap-4">
<div className="bg-slate-950/20 rounded-xl p-4 border border-white/5">
<h5 className="font-bold text-xs text-slate-200 mb-1">Deceptive Practices (12 CFR 1041)</h5>
<p className="text-xs text-slate-400 leading-relaxed">
Prohibits unfair, deceptive, or abusive acts or practices (UDAAP) in connection with
consumer financial products or services.
</p>
</div>
<div className="bg-slate-950/20 rounded-xl p-4 border border-white/5">
<h5 className="font-bold text-xs text-slate-200 mb-1">Truth in Lending Act (TILA)</h5>
<p className="text-xs text-slate-400 leading-relaxed">
Requires clear disclosure of key terms and costs of consumer credit, ensuring
transparency in lending practices.
</p>
</div>
<div className="bg-slate-950/20 rounded-xl p-4 border border-white/5">
<h5 className="font-bold text-xs text-slate-200 mb-1">Electronic Fund Transfer Act (EFTA)</h5>
<p className="text-xs text-slate-400 leading-relaxed">
Protects consumers engaging in electronic fund transfers, requiring clear
disclosure of terms and conditions.
</p>
</div>
<div className="bg-slate-950/20 rounded-xl p-4 border border-white/5">
<h5 className="font-bold text-xs text-slate-200 mb-1">Fair Debt Collection Practices Act</h5>
<p className="text-xs text-slate-400 leading-relaxed">
Prohibits abusive, unfair, or deceptive practices by debt collectors,
including manipulative communication tactics.
</p>
</div>
</div>
</Card>
{/* Action Items */}
<Card className="p-6 bg-indigo-500/5 border border-indigo-500/10 rounded-2xl">
<h4 className="font-bold text-sm text-indigo-300 mb-3">📋 Compliance Action Items</h4>
<ol className="list-decimal list-inside space-y-2 text-xs text-indigo-200/80 leading-relaxed">
<li>Address critical violations immediately to avoid regulatory action</li>
<li>Implement recommended design changes in order of severity</li>
<li>Conduct user testing to validate improved experience</li>
<li>Schedule follow-up compliance audit after changes are made</li>
<li>Document all changes for regulatory review</li>
<li>Train design and product teams on ethical UI principles</li>
</ol>
</Card>
{/* AI Explanation */}
<div className="bg-indigo-500/5 border border-indigo-500/10 rounded-xl p-4">
<h4 className="font-bold text-xs text-indigo-300 mb-2">🤖 XAI Compliance Analysis</h4>
<p className="text-xs text-slate-400 leading-relaxed">
Our compliance engine uses natural language processing to match detected dark patterns
against CFPB regulation text. Each violation is cross-referenced with specific guideline
sections to provide actionable, legally-grounded recommendations. The compliance score
is calculated using a weighted severity model that prioritizes consumer protection.
</p>
</div>
</div>
);
}