memory-agent-demo / src /components /MiniGraph.jsx
dixiebone13-a11y
v2.5: Full rewrite - Vite+React+Tailwind build, all 13 audit fixes
82e6bed
import React, { useMemo } from 'react';
// Fix #10: Memoized graph with computed max
const MiniGraph = React.memo(({ data }) => {
const maxVal = useMemo(() => {
let m = 10;
for (let i = 0; i < data.length; i++) {
if (data[i].baseline > m) m = data[i].baseline;
if (data[i].memory > m) m = data[i].memory;
}
return m;
}, [data]);
if (data.length < 2) {
return (
<div className="h-full w-full flex items-center justify-center text-slate-700 text-xs font-mono">
WAITING FOR DATA...
</div>
);
}
const width = 100;
const height = 100;
const makePath = (key) => {
let points = '';
for (let i = 0; i < data.length; i++) {
const x = (i / (data.length - 1)) * width;
const y = height - (data[i][key] / maxVal) * height;
if (i > 0) points += ' ';
points += `${x},${y}`;
}
return points;
};
return (
<svg viewBox={`0 0 ${width} ${height}`} className="w-full h-full overflow-visible" role="img" aria-label="Throughput comparison graph">
<line x1="0" y1="25" x2="100" y2="25" stroke="#334155" strokeWidth="0.5" strokeDasharray="2" />
<line x1="0" y1="50" x2="100" y2="50" stroke="#334155" strokeWidth="0.5" strokeDasharray="2" />
<line x1="0" y1="75" x2="100" y2="75" stroke="#334155" strokeWidth="0.5" strokeDasharray="2" />
<polyline
points={makePath('baseline')}
fill="none" stroke="#06b6d4" strokeWidth="2"
vectorEffect="non-scaling-stroke"
style={{ filter: 'drop-shadow(0 0 3px rgba(6,182,212,0.8))' }}
/>
<polyline
points={makePath('memory')}
fill="none" stroke="#d946ef" strokeWidth="2"
vectorEffect="non-scaling-stroke"
style={{ filter: 'drop-shadow(0 0 3px rgba(217,70,239,0.8))' }}
/>
</svg>
);
});
MiniGraph.displayName = 'MiniGraph';
export default MiniGraph;