From ba1be9573ef20d6424ae987257a1c727c47d4b53 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Tue, 6 Oct 2026 20:46:31 +0300 Subject: Initial setup for website rewrite --- old_stuff/src/components/RadarChart.astro | 132 ++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 old_stuff/src/components/RadarChart.astro (limited to 'old_stuff/src/components/RadarChart.astro') diff --git a/old_stuff/src/components/RadarChart.astro b/old_stuff/src/components/RadarChart.astro new file mode 100644 index 0000000..0a3d434 --- /dev/null +++ b/old_stuff/src/components/RadarChart.astro @@ -0,0 +1,132 @@ +--- +import "@styles/terminal.css" + +interface Entry { + name: string; + weight: number; +} + +interface Props { + max: number + data: Entry[]; +} + +const { max, data } = Astro.props + +const chartPadding = 100; +const chartSize = 400; +const chartCenter = chartSize / 2; + +const chartData = data ;// .sort((a, b) => b.weight - a.weight).slice(0, data.length); +const pointPadding = 0; +const rings = [...Array(6).keys()]; + +const getX = (angle: number, value: number) => + Math.cos(angle - Math.PI / 2) * value; +const getY = (angle: number, value: number) => + Math.sin(angle - Math.PI / 2) * value; + +const axes = chartData.map((_, index) => { + const angle = (Math.PI * 2 * index) / chartData.length; + const x = getX(angle, chartSize / 2); + const y = getY(angle, chartSize / 2); + const points = [ + [0, 0], + [x, y], + ] + .map((point) => point[0] + "," + point[1]) + .join(" "); + return { + points: points, + }; +}); + +const properties = chartData.map((item, index) => { + const { name, weight: total } = item; + const clamp = Number(total / (max + pointPadding)); + const angle = (Math.PI * 2 * index) / chartData.length; + const x = getX(angle, (clamp * chartSize) / 2); + const y = getY(angle, (clamp * chartSize) / 2); + return { name: name, total: total, x: x, y: y }; +}); + +const shape = + properties.reduce((items, item, index) => { + const { x, y } = item; + const string = `${index === 0 ? "M" : "L"}${x},${y}`; + return items + string; + }, "") + "z"; + +const strokeColor = "stroke-[var(--alt)]"; +const shapeClass = "stroke-[var(--primary)] fill-[#7ed4fb]/50"; + +--- +
+ + + { + rings.map((_, index) => { + return ( + + ); + }) + } + { + axes.map((axis) => { + const { points } = axis; + return ( + + ); + }) + } + + { + properties.map((property, index) => { + const length = 1.1; + const angle = (Math.PI * 2) * index / chartData.length; + const maxX = getX(angle, (length * chartSize) / 2); + const maxY = getY(angle, (length * chartSize) / 2); + let textAngle = (angle * (180 / Math.PI)) + if (90 < textAngle && textAngle < 270) { + textAngle += 180 + } + return ( + + + {property.name} + + + ); + }) + } + + +
-- cgit v1.3.1