parent
591b885ae2
commit
b025958cd8
@ -0,0 +1,8 @@ |
||||
.path { |
||||
fill: #354265; |
||||
} |
||||
|
||||
.path:hover { |
||||
fill: #EF839D; |
||||
filter: drop-shadow(3px 3px 2px rgba(0, 0, 0, .7)); |
||||
} |
@ -0,0 +1,63 @@ |
||||
import { Group } from "@visx/group"; |
||||
import Pie, { ProvidedProps } from "@visx/shape/lib/shapes/Pie"; |
||||
import React, { useState } from "react"; |
||||
|
||||
import styles from "./PieChart.module.css"; |
||||
|
||||
interface PieChartProps { |
||||
data: PieChartData[]; |
||||
width: number; |
||||
height: number; |
||||
margin: { |
||||
top: number; |
||||
bottom: number; |
||||
left: number; |
||||
right: number; |
||||
}; |
||||
className?: string; |
||||
} |
||||
|
||||
interface PieChartData { |
||||
category: string; |
||||
value: number; |
||||
} |
||||
|
||||
export function PieChart(props: PieChartProps) { |
||||
return ( |
||||
<svg className={props.className} width={props.width} height={props.height}> |
||||
<Group top={props.margin.top} left={props.margin.left}> |
||||
<Pie |
||||
data={props.data} |
||||
fill="aqua" |
||||
pieValue={(d: PieChartData) => d.value} |
||||
outerRadius={100} |
||||
cornerRadius={3} |
||||
padAngle={0.1} |
||||
> |
||||
{(pie) => <PieSlice {...pie} />} |
||||
</Pie> |
||||
</Group> |
||||
</svg> |
||||
); |
||||
} |
||||
|
||||
// path, arcs, pie
|
||||
type PieSliceProps<PieChartData> = ProvidedProps<PieChartData>; |
||||
|
||||
export function PieSlice(props: PieSliceProps<PieChartData>) { |
||||
return props.arcs.map((arc) => { |
||||
const [centroidX, centroidY] = props.path.centroid(arc); |
||||
const pathArc = props.path(arc); |
||||
|
||||
return ( |
||||
<g key={`arc-${arc.data.category}`}> |
||||
<path d={pathArc} className={styles.path} /> |
||||
<text |
||||
x={centroidX} |
||||
y={centroidY} |
||||
textAnchor="middle" |
||||
>{`${arc.data.value} %`}</text> |
||||
</g> |
||||
); |
||||
}); |
||||
} |
@ -1,10 +1,19 @@ |
||||
import { mockPieData } from "data/mocks"; |
||||
import React from "react"; |
||||
|
||||
import { PieChart } from "@/components/PieChart"; |
||||
|
||||
export default function Home() { |
||||
return ( |
||||
<> |
||||
<h1>Playground</h1> |
||||
<p>Show off your components here!</p> |
||||
<PieChart |
||||
data={mockPieData} |
||||
width={500} |
||||
height={500} |
||||
margin={{ top: 100, left: 100, bottom: 100, right: 100 }} |
||||
/> |
||||
</> |
||||
); |
||||
} |
||||
|
Loading…
Reference in new issue