import React from 'react' | |
import { useTranslation } from 'react-i18next' | |
import { useGraphStore } from '@/stores/graph' | |
import { Card } from '@/components/ui/Card' | |
import { ScrollArea } from '@/components/ui/ScrollArea' | |
interface LegendProps { | |
className?: string | |
} | |
const Legend: React.FC<LegendProps> = ({ className }) => { | |
const { t } = useTranslation() | |
const typeColorMap = useGraphStore.use.typeColorMap() | |
if (!typeColorMap || typeColorMap.size === 0) { | |
return null | |
} | |
return ( | |
<Card className={`p-2 max-w-xs ${className}`}> | |
<h3 className="text-sm font-medium mb-2">{t('graphPanel.legend')}</h3> | |
<ScrollArea className="max-h-80"> | |
<div className="flex flex-col gap-1"> | |
{Array.from(typeColorMap.entries()).map(([type, color]) => ( | |
<div key={type} className="flex items-center gap-2"> | |
<div | |
className="w-4 h-4 rounded-full" | |
style={{ backgroundColor: color }} | |
/> | |
<span className="text-xs truncate" title={type}> | |
{t(`graphPanel.nodeTypes.${type.toLowerCase()}`, type)} | |
</span> | |
</div> | |
))} | |
</div> | |
</ScrollArea> | |
</Card> | |
) | |
} | |
export default Legend | |