import { ThemeColors, SeverityLevel, EdgeType, BusinessMetrics, } from '../types'; import { severityColors, edgeColors } from '../constants'; import { ScoreCircle, GlassCard, GlassCardContent } from '@aiready/components'; // Legend Item with Toggle function LegendItemWithToggle({ color, label, isGlow = false, isLine = false, colors, isVisible, onToggle, }: { color: string; label: string; isGlow?: boolean; isLine?: boolean; colors: ThemeColors; isVisible: boolean; onToggle: () => void; }) { return ( ); } // Regular Legend Item (non-toggleable) // function LegendItem({ ... }) - removed as it was unused // Toggleable Legend Item interface LegendPanelProps { colors: ThemeColors; visibleSeverities: Set; visibleEdgeTypes: Set; onToggleSeverity: (severity: SeverityLevel) => void; onToggleEdgeType: (edgeType: EdgeType) => void; metadata?: BusinessMetrics; } export function LegendPanel({ colors, visibleSeverities, visibleEdgeTypes, onToggleSeverity, onToggleEdgeType, metadata, }: LegendPanelProps) { // Get visible counts - exclude 'default' (No Issues) from count const visibleSeverityCount = visibleSeverities.size; const totalSeverities = Object.keys(severityColors).length - 1; // -1 for 'default' const visibleEdgeCount = visibleEdgeTypes.size; const totalEdgeTypes = Object.keys(edgeColors).filter( (k) => k !== 'default' && k !== 'reference' ).length; return (
{/* Score Section */} {metadata && metadata.aiReadinessScore !== undefined && (
)} {/* Header */}

Legend

{/* Severity Legend with Toggles */}

Severity

{visibleSeverityCount}/{totalSeverities}
{Object.entries(severityColors) .filter(([key]) => key !== 'default') // Filter out "No Issues" - not useful for visualization .map(([key, color]) => ( onToggleSeverity(key as SeverityLevel)} /> ))}
{/* Connections Legend with Toggles */}

Connections

{visibleEdgeCount}/{totalEdgeTypes}
{Object.entries(edgeColors) .filter(([k]) => k !== 'default' && k !== 'reference') .map(([key, color]) => ( onToggleEdgeType(key as EdgeType)} /> ))}
{/* Node Size Info */}

Node Size

Larger nodes indicate higher{' '} token cost and more issues.

More Impact
{/* Business Impact Section */} {metadata && (metadata.estimatedMonthlyCost || metadata.estimatedDeveloperHours || metadata.aiAcceptanceRate) && (

Business Impact

{metadata.estimatedMonthlyCost !== undefined && (
Monthly Cost {metadata.estimatedMonthlyCost >= 1000 ? `$${(metadata.estimatedMonthlyCost / 1000).toFixed(1)}k` : `$${metadata.estimatedMonthlyCost.toFixed(0)}`}
)} {metadata.estimatedDeveloperHours !== undefined && (
Fix Time {metadata.estimatedDeveloperHours >= 40 ? `${(metadata.estimatedDeveloperHours / 40).toFixed(1)}w` : `${metadata.estimatedDeveloperHours.toFixed(1)}h`}
)} {metadata.aiAcceptanceRate !== undefined && (
AI Accuracy = 0.7 ? '#10b981' : metadata.aiAcceptanceRate >= 0.5 ? '#f59e0b' : '#ef4444', }} > {Math.round(metadata.aiAcceptanceRate * 100)}%
)}
)} {/* Quick Tips */}

💡 Tip: Click and drag nodes to rearrange. Scroll to zoom. Toggle items above to filter.

); }