// Radar chart + score bar components function Radar({ data, size = 320, fill = 'var(--k-accent)', compareData = null, compareFill = 'var(--k-indigo)' }) { const cx = size / 2, cy = size / 2; const r = size / 2 - 40; const n = data.length; const angle = (i) => (Math.PI * 2 * i) / n - Math.PI / 2; const pt = (v, i) => [cx + Math.cos(angle(i)) * r * (v / 100), cy + Math.sin(angle(i)) * r * (v / 100)]; const poly = (arr) => arr.map((d, i) => pt(d.value, i).join(',')).join(' '); return ( {[20, 40, 60, 80, 100].map(lv => ( { const [x, y] = [cx + Math.cos(angle(i)) * r * (lv / 100), cy + Math.sin(angle(i)) * r * (lv / 100)]; return `${x},${y}`; }).join(' ')} fill="none" stroke="var(--k-line)" strokeWidth={lv === 100 ? 1 : 0.6} /> ))} {data.map((_, i) => { const [x, y] = [cx + Math.cos(angle(i)) * r, cy + Math.sin(angle(i)) * r]; return ; })} {compareData && ( )} {data.map((d, i) => { const [x, y] = pt(d.value, i); const a = angle(i); const dotR = r * d.value / 100; const labelR = Math.min(Math.max(dotR + 11, 16), r - 6); const lx = cx + Math.cos(a) * labelR; const ly = cy + Math.sin(a) * labelR; return ( {d.value} ); })} {data.map((d, i) => { const lx = cx + Math.cos(angle(i)) * (r + 22); const ly = cy + Math.sin(angle(i)) * (r + 22); return {d.short}; })} ); } function ScoreBar({ value, compare = null, height = 6 }) { return (
{compare !== null && (
)}
); } Object.assign(window, { Radar, ScoreBar });