UNPKG

@nivo/pie

Version:
1 lines 65.4 kB
{"version":3,"file":"nivo-pie.mjs","sources":["../src/PieLegends.tsx","../src/props.ts","../src/PieTooltip.tsx","../src/hooks.ts","../src/Arcs.tsx","../src/Pie.tsx","../src/ResponsivePie.tsx","../src/PieCanvas.tsx","../src/ResponsivePieCanvas.tsx"],"sourcesContent":["import { BoxLegendSvg } from '@nivo/legends'\nimport { CompletePieSvgProps, DatumId, LegendDatum } from './types'\n\ninterface PieLegendsProps<RawDatum> {\n width: number\n height: number\n legends: CompletePieSvgProps<RawDatum>['legends']\n data: LegendDatum<RawDatum>[]\n toggleSerie: (id: DatumId) => void\n}\n\nexport const PieLegends = <RawDatum,>({\n width,\n height,\n legends,\n data,\n toggleSerie,\n}: PieLegendsProps<RawDatum>) => {\n return (\n <>\n {legends.map((legend, i: number) => (\n <BoxLegendSvg\n key={i}\n {...legend}\n containerWidth={width}\n containerHeight={height}\n data={legend.data ?? data}\n toggleSerie={legend.toggleSerie ? toggleSerie : undefined}\n />\n ))}\n </>\n )\n}\n","import { OrdinalColorScaleConfig } from '@nivo/colors'\nimport { ArcTransitionMode } from '@nivo/arcs'\nimport { PieTooltip } from './PieTooltip'\n\nexport const defaultProps = {\n id: 'id',\n value: 'value',\n sortByValue: false,\n innerRadius: 0,\n padAngle: 0,\n cornerRadius: 0,\n layers: ['arcs', 'arcLinkLabels', 'arcLabels', 'legends'],\n startAngle: 0,\n endAngle: 360,\n fit: true,\n activeInnerRadiusOffset: 0,\n activeOuterRadiusOffset: 0,\n borderWidth: 0,\n borderColor: {\n from: 'color',\n modifiers: [['darker', 1]],\n },\n enableArcLabels: true,\n arcLabel: 'formattedValue',\n arcLabelsSkipAngle: 0,\n arcLabelsSkipRadius: 0,\n arcLabelsRadiusOffset: 0.5,\n arcLabelsTextColor: { theme: 'labels.text.fill' },\n enableArcLinkLabels: true,\n arcLinkLabel: 'id',\n arcLinkLabelsSkipAngle: 0,\n arcLinkLabelsOffset: 0,\n arcLinkLabelsDiagonalLength: 16,\n arcLinkLabelsStraightLength: 24,\n arcLinkLabelsThickness: 1,\n arcLinkLabelsTextOffset: 6,\n arcLinkLabelsTextColor: { theme: 'labels.text.fill' },\n arcLinkLabelsColor: { theme: 'axis.ticks.line.stroke' },\n colors: { scheme: 'nivo' } as unknown as OrdinalColorScaleConfig,\n defs: [],\n fill: [],\n isInteractive: true,\n animate: true,\n motionConfig: 'gentle',\n transitionMode: 'innerRadius' as ArcTransitionMode,\n tooltip: PieTooltip,\n legends: [],\n role: 'img',\n pixelRatio: typeof window !== 'undefined' ? (window.devicePixelRatio ?? 1) : 1,\n}\n","import { BasicTooltip } from '@nivo/tooltip'\nimport { ComputedDatum } from './types'\n\nexport const PieTooltip = <RawDatum,>({ datum }: { datum: ComputedDatum<RawDatum> }) => (\n <BasicTooltip\n id={datum.id}\n value={datum.formattedValue}\n enableChip={true}\n color={datum.color}\n />\n)\n\nexport default PieTooltip\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { pie as d3Pie } from 'd3-shape'\nimport { useArcGenerator, computeArcBoundingBox } from '@nivo/arcs'\nimport {\n degreesToRadians,\n radiansToDegrees,\n useValueFormatter,\n usePropertyAccessor,\n} from '@nivo/core'\nimport { OrdinalColorScaleConfig, useOrdinalColorScale } from '@nivo/colors'\nimport { defaultProps } from './props'\nimport {\n MayHaveLabel,\n CompletePieSvgProps,\n ComputedDatum,\n DatumId,\n PieArc,\n PieCustomLayerProps,\n LegendDatum,\n CommonPieProps,\n} from './types'\n\n/**\n * Format data so that we get a consistent data structure.\n * It will also add the `formattedValue` and `color` property.\n */\nexport const useNormalizedData = <RawDatum extends MayHaveLabel>({\n data,\n id = defaultProps.id,\n value = defaultProps.value,\n valueFormat,\n colors = defaultProps.colors as OrdinalColorScaleConfig<\n Omit<ComputedDatum<RawDatum>, 'arc' | 'color' | 'fill'>\n >,\n}: Pick<CompletePieSvgProps<RawDatum>, 'id' | 'value' | 'valueFormat' | 'colors'> & {\n data: readonly RawDatum[]\n}): Omit<ComputedDatum<RawDatum>, 'arc' | 'fill'>[] => {\n const getId = usePropertyAccessor<RawDatum, DatumId>(id)\n const getValue = usePropertyAccessor<RawDatum, number>(value)\n const formatValue = useValueFormatter<number>(valueFormat)\n\n const getColor = useOrdinalColorScale<Omit<ComputedDatum<RawDatum>, 'arc' | 'color' | 'fill'>>(\n colors,\n 'id'\n )\n\n return useMemo(\n () =>\n data.map(datum => {\n const datumId = getId(datum)\n const datumValue = getValue(datum)\n\n const normalizedDatum: Omit<ComputedDatum<RawDatum>, 'arc' | 'color' | 'fill'> = {\n id: datumId,\n label: datum.label ?? datumId,\n hidden: false,\n value: datumValue,\n formattedValue: formatValue(datumValue),\n data: datum,\n }\n\n return {\n ...normalizedDatum,\n color: getColor(normalizedDatum),\n }\n }),\n [data, getId, getValue, formatValue, getColor]\n )\n}\n\n/**\n * Compute arcs, which don't depend yet on radius.\n */\nexport const usePieArcs = <RawDatum>({\n data,\n startAngle,\n endAngle,\n innerRadius,\n outerRadius,\n padAngle,\n sortByValue,\n activeId,\n activeInnerRadiusOffset,\n activeOuterRadiusOffset,\n hiddenIds,\n forwardLegendData,\n}: {\n data: Omit<ComputedDatum<RawDatum>, 'arc' | 'fill'>[]\n // in degrees\n startAngle: number\n // in degrees\n endAngle: number\n // in pixels\n innerRadius: number\n // in pixels\n outerRadius: number\n padAngle: number\n sortByValue: boolean\n activeId: null | DatumId\n activeInnerRadiusOffset: number\n activeOuterRadiusOffset: number\n hiddenIds: DatumId[]\n forwardLegendData?: CommonPieProps<RawDatum>['forwardLegendData']\n}): {\n dataWithArc: Omit<ComputedDatum<RawDatum>, 'fill'>[]\n legendData: LegendDatum<RawDatum>[]\n} => {\n const pie = useMemo(() => {\n const innerPie = d3Pie<Omit<ComputedDatum<RawDatum>, 'arc' | 'fill'>>()\n .value(d => d.value)\n .startAngle(degreesToRadians(startAngle))\n .endAngle(degreesToRadians(endAngle))\n .padAngle(degreesToRadians(padAngle))\n\n if (!sortByValue) {\n innerPie.sortValues(null)\n }\n\n return innerPie\n }, [startAngle, endAngle, padAngle, sortByValue])\n\n const result = useMemo(() => {\n const hiddenData = data.filter(item => !hiddenIds.includes(item.id))\n const dataWithArc = pie(hiddenData).map(\n (\n arc: Omit<\n PieArc,\n 'angle' | 'angleDeg' | 'innerRadius' | 'outerRadius' | 'thickness'\n > & {\n data: Omit<ComputedDatum<RawDatum>, 'arc' | 'fill'>\n }\n ) => {\n const angle = Math.abs(arc.endAngle - arc.startAngle)\n\n return {\n ...arc.data,\n arc: {\n index: arc.index,\n startAngle: arc.startAngle,\n endAngle: arc.endAngle,\n innerRadius:\n activeId === arc.data.id\n ? innerRadius - activeInnerRadiusOffset\n : innerRadius,\n outerRadius:\n activeId === arc.data.id\n ? outerRadius + activeOuterRadiusOffset\n : outerRadius,\n thickness: outerRadius - innerRadius,\n padAngle: arc.padAngle,\n angle,\n angleDeg: radiansToDegrees(angle),\n },\n }\n }\n )\n const legendData: LegendDatum<RawDatum>[] = data.map(item => ({\n id: item.id,\n label: item.label,\n color: item.color,\n hidden: hiddenIds.includes(item.id),\n data: item,\n }))\n\n return { dataWithArc, legendData }\n }, [\n pie,\n data,\n hiddenIds,\n activeId,\n innerRadius,\n activeInnerRadiusOffset,\n outerRadius,\n activeOuterRadiusOffset,\n ])\n\n // Forward the legends data if `forwardLegendData` is defined.\n const legendData = result.legendData\n const forwardLegendDataRef = useRef(forwardLegendData)\n useEffect(() => {\n if (typeof forwardLegendDataRef.current !== 'function') return\n forwardLegendDataRef.current(legendData)\n }, [forwardLegendDataRef, legendData])\n\n return result\n}\n\n/**\n * Encapsulate the logic for defining/reading the active arc ID,\n * which can be either controlled (handled externally), or uncontrolled\n * (handled internally), we can optionally define a default value when\n * it's uncontrolled.\n */\nconst useActiveId = ({\n activeId: activeIdFromProps,\n onActiveIdChange,\n defaultActiveId = null,\n}: {\n activeId?: DatumId | null\n onActiveIdChange?: (id: DatumId | null) => void\n defaultActiveId?: DatumId | null\n}) => {\n const isControlled = typeof activeIdFromProps != 'undefined'\n\n const [internalActiveId, setInternalActiveId] = useState<DatumId | null>(\n !isControlled ? defaultActiveId : null\n )\n\n const activeId = isControlled ? activeIdFromProps : internalActiveId\n\n const setActiveId = useCallback(\n (id: DatumId | null) => {\n if (onActiveIdChange) {\n onActiveIdChange(id)\n }\n\n if (!isControlled) {\n setInternalActiveId(id)\n }\n },\n [isControlled, onActiveIdChange, setInternalActiveId]\n )\n\n return { activeId, setActiveId }\n}\n\n/**\n * Compute pie layout using explicit radius/innerRadius,\n * expressed in pixels.\n */\nexport const usePie = <RawDatum>({\n data,\n radius,\n innerRadius,\n startAngle = defaultProps.startAngle,\n endAngle = defaultProps.endAngle,\n padAngle = defaultProps.padAngle,\n sortByValue = defaultProps.sortByValue,\n cornerRadius = defaultProps.cornerRadius,\n activeInnerRadiusOffset = defaultProps.activeInnerRadiusOffset,\n activeOuterRadiusOffset = defaultProps.activeOuterRadiusOffset,\n activeId: activeIdFromProps,\n onActiveIdChange,\n defaultActiveId,\n forwardLegendData,\n}: Pick<\n Partial<CompletePieSvgProps<RawDatum>>,\n | 'startAngle'\n | 'endAngle'\n | 'padAngle'\n | 'sortByValue'\n | 'cornerRadius'\n | 'activeInnerRadiusOffset'\n | 'activeOuterRadiusOffset'\n | 'activeId'\n | 'onActiveIdChange'\n | 'defaultActiveId'\n | 'forwardLegendData'\n> & {\n data: Omit<ComputedDatum<RawDatum>, 'arc'>[]\n radius: number\n innerRadius: number\n}) => {\n const { activeId, setActiveId } = useActiveId({\n activeId: activeIdFromProps,\n onActiveIdChange,\n defaultActiveId,\n })\n\n const [hiddenIds, setHiddenIds] = useState<DatumId[]>([])\n const pieArcs = usePieArcs({\n data,\n startAngle,\n endAngle,\n innerRadius,\n outerRadius: radius,\n padAngle,\n sortByValue,\n activeId,\n activeInnerRadiusOffset,\n activeOuterRadiusOffset,\n hiddenIds,\n forwardLegendData,\n })\n\n const toggleSerie = useCallback((id: DatumId) => {\n setHiddenIds(state =>\n state.indexOf(id) > -1 ? state.filter(item => item !== id) : [...state, id]\n )\n }, [])\n\n const arcGenerator = useArcGenerator({ cornerRadius, padAngle: degreesToRadians(padAngle) })\n\n return { ...pieArcs, arcGenerator, setActiveId, toggleSerie }\n}\n\n/**\n * Compute pie layout using a box to find radius/innerRadius,\n * expressed in ratio (0~1), can optionally use the `fit`\n * attribute to find the most space efficient layout.\n *\n * It also returns `centerX`/`centerY` as those can be altered\n * if `fit` is `true`.\n */\nexport const usePieFromBox = <RawDatum>({\n data,\n width,\n height,\n innerRadius: innerRadiusRatio = defaultProps.innerRadius,\n startAngle = defaultProps.startAngle,\n endAngle = defaultProps.endAngle,\n padAngle = defaultProps.padAngle,\n sortByValue = defaultProps.sortByValue,\n cornerRadius = defaultProps.cornerRadius,\n fit = defaultProps.fit,\n activeInnerRadiusOffset = defaultProps.activeInnerRadiusOffset,\n activeOuterRadiusOffset = defaultProps.activeOuterRadiusOffset,\n activeId: activeIdFromProps,\n onActiveIdChange,\n defaultActiveId,\n forwardLegendData,\n}: Pick<\n CompletePieSvgProps<RawDatum>,\n | 'width'\n | 'height'\n | 'innerRadius'\n | 'startAngle'\n | 'endAngle'\n | 'padAngle'\n | 'sortByValue'\n | 'cornerRadius'\n | 'fit'\n | 'activeInnerRadiusOffset'\n | 'activeOuterRadiusOffset'\n> &\n Pick<\n Partial<CompletePieSvgProps<RawDatum>>,\n 'activeId' | 'onActiveIdChange' | 'defaultActiveId' | 'forwardLegendData'\n > & {\n data: Omit<ComputedDatum<RawDatum>, 'arc'>[]\n }) => {\n const { activeId, setActiveId } = useActiveId({\n activeId: activeIdFromProps,\n onActiveIdChange,\n defaultActiveId,\n })\n\n const [hiddenIds, setHiddenIds] = useState<DatumId[]>([])\n const computedProps = useMemo(() => {\n let radius = Math.min(width, height) / 2\n let innerRadius = radius * Math.min(innerRadiusRatio, 1)\n\n let centerX = width / 2\n let centerY = height / 2\n\n let boundingBox\n if (fit) {\n const { points, ...box } = computeArcBoundingBox(\n centerX,\n centerY,\n radius,\n startAngle - 90,\n endAngle - 90\n )\n const ratio = Math.min(width / box.width, height / box.height)\n\n const adjustedBox: {\n width: number\n height: number\n x?: number\n y?: number\n } = {\n width: box.width * ratio,\n height: box.height * ratio,\n }\n adjustedBox.x = (width - adjustedBox.width) / 2\n adjustedBox.y = (height - adjustedBox.height) / 2\n\n centerX = ((centerX - box.x) / box.width) * box.width * ratio + adjustedBox.x\n centerY = ((centerY - box.y) / box.height) * box.height * ratio + adjustedBox.y\n\n boundingBox = { box, ratio, points }\n\n radius = radius * ratio\n innerRadius = innerRadius * ratio\n }\n\n return {\n centerX,\n centerY,\n radius,\n innerRadius,\n debug: boundingBox,\n }\n }, [width, height, innerRadiusRatio, startAngle, endAngle, fit])\n\n const pieArcs = usePieArcs({\n data,\n startAngle,\n endAngle,\n innerRadius: computedProps.innerRadius,\n outerRadius: computedProps.radius,\n padAngle,\n sortByValue,\n activeId,\n activeInnerRadiusOffset,\n activeOuterRadiusOffset,\n hiddenIds,\n forwardLegendData,\n })\n\n const toggleSerie = useCallback((id: DatumId) => {\n setHiddenIds(state =>\n state.indexOf(id) > -1 ? state.filter(item => item !== id) : [...state, id]\n )\n }, [])\n\n const arcGenerator = useArcGenerator({\n cornerRadius,\n padAngle: degreesToRadians(padAngle),\n })\n\n return {\n arcGenerator,\n activeId,\n setActiveId,\n toggleSerie,\n ...pieArcs,\n ...computedProps,\n }\n}\n\n/**\n * Memoize the context to pass to custom layers.\n */\nexport const usePieLayerContext = <RawDatum>({\n dataWithArc,\n arcGenerator,\n centerX,\n centerY,\n radius,\n innerRadius,\n}: PieCustomLayerProps<RawDatum>): PieCustomLayerProps<RawDatum> =>\n useMemo(\n () => ({\n dataWithArc,\n arcGenerator,\n centerX,\n centerY,\n radius,\n innerRadius,\n }),\n [dataWithArc, arcGenerator, centerX, centerY, radius, innerRadius]\n )\n","import { createElement, useMemo } from 'react'\nimport * as React from 'react'\nimport { ArcGenerator, ArcsLayer } from '@nivo/arcs'\nimport { useTooltip } from '@nivo/tooltip'\nimport { ComputedDatum, CompletePieSvgProps } from './types'\n\ninterface ArcsProps<RawDatum> {\n center: [number, number]\n data: ComputedDatum<RawDatum>[]\n arcGenerator: ArcGenerator\n borderWidth: CompletePieSvgProps<RawDatum>['borderWidth']\n borderColor: CompletePieSvgProps<RawDatum>['borderColor']\n isInteractive: CompletePieSvgProps<RawDatum>['isInteractive']\n onClick?: CompletePieSvgProps<RawDatum>['onClick']\n onMouseEnter?: CompletePieSvgProps<RawDatum>['onMouseEnter']\n onMouseMove?: CompletePieSvgProps<RawDatum>['onMouseMove']\n onMouseLeave?: CompletePieSvgProps<RawDatum>['onMouseLeave']\n setActiveId: (id: null | string | number) => void\n tooltip: CompletePieSvgProps<RawDatum>['tooltip']\n transitionMode: CompletePieSvgProps<RawDatum>['transitionMode']\n}\n\nexport const Arcs = <RawDatum,>({\n center,\n data,\n arcGenerator,\n borderWidth,\n borderColor,\n isInteractive,\n onClick,\n onMouseEnter,\n onMouseMove,\n onMouseLeave,\n setActiveId,\n tooltip,\n transitionMode,\n}: ArcsProps<RawDatum>) => {\n const { showTooltipFromEvent, hideTooltip } = useTooltip()\n\n const handleClick = useMemo(() => {\n if (!isInteractive) return undefined\n\n return (datum: ComputedDatum<RawDatum>, event: React.MouseEvent<SVGPathElement>) => {\n onClick?.(datum, event)\n }\n }, [isInteractive, onClick])\n\n const handleMouseEnter = useMemo(() => {\n if (!isInteractive) return undefined\n\n return (datum: ComputedDatum<RawDatum>, event: React.MouseEvent<SVGPathElement>) => {\n showTooltipFromEvent(createElement(tooltip, { datum }), event)\n setActiveId(datum.id)\n onMouseEnter?.(datum, event)\n }\n }, [isInteractive, showTooltipFromEvent, setActiveId, onMouseEnter, tooltip])\n\n const handleMouseMove = useMemo(() => {\n if (!isInteractive) return undefined\n\n return (datum: ComputedDatum<RawDatum>, event: React.MouseEvent<SVGPathElement>) => {\n showTooltipFromEvent(createElement(tooltip, { datum }), event)\n onMouseMove?.(datum, event)\n }\n }, [isInteractive, showTooltipFromEvent, onMouseMove, tooltip])\n\n const handleMouseLeave = useMemo(() => {\n if (!isInteractive) return undefined\n\n return (datum: ComputedDatum<RawDatum>, event: React.MouseEvent<SVGPathElement>) => {\n hideTooltip()\n setActiveId(null)\n onMouseLeave?.(datum, event)\n }\n }, [isInteractive, hideTooltip, setActiveId, onMouseLeave])\n\n return (\n <ArcsLayer<ComputedDatum<RawDatum>>\n center={center}\n data={data}\n arcGenerator={arcGenerator}\n borderWidth={borderWidth}\n borderColor={borderColor}\n transitionMode={transitionMode}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n />\n )\n}\n","import { ReactNode, Fragment, createElement, forwardRef, Ref, ReactElement } from 'react'\nimport {\n // @ts-expect-error no types\n bindDefs,\n useDimensions,\n Container,\n SvgWrapper,\n WithChartRef,\n} from '@nivo/core'\nimport { ArcLabelsLayer, ArcLinkLabelsLayer } from '@nivo/arcs'\nimport { InheritedColorConfig } from '@nivo/colors'\nimport { PieLegends } from './PieLegends'\nimport { useNormalizedData, usePieFromBox, usePieLayerContext } from './hooks'\nimport { ComputedDatum, PieLayer, PieSvgProps, PieLayerId, MayHaveLabel } from './types'\nimport { defaultProps } from './props'\nimport { Arcs } from './Arcs'\n\nconst InnerPie = <RawDatum extends MayHaveLabel>({\n data,\n id = defaultProps.id,\n value = defaultProps.value,\n valueFormat,\n sortByValue = defaultProps.sortByValue,\n layers = defaultProps.layers as PieLayer<RawDatum>[],\n startAngle = defaultProps.startAngle,\n endAngle = defaultProps.endAngle,\n padAngle = defaultProps.padAngle,\n fit = defaultProps.fit,\n innerRadius: innerRadiusRatio = defaultProps.innerRadius,\n cornerRadius = defaultProps.cornerRadius,\n activeInnerRadiusOffset = defaultProps.activeInnerRadiusOffset,\n activeOuterRadiusOffset = defaultProps.activeOuterRadiusOffset,\n width,\n height,\n margin: partialMargin,\n colors = defaultProps.colors,\n borderWidth = defaultProps.borderWidth,\n borderColor = defaultProps.borderColor as InheritedColorConfig<ComputedDatum<RawDatum>>,\n enableArcLabels = defaultProps.enableArcLabels,\n arcLabel = defaultProps.arcLabel,\n arcLabelsSkipAngle = defaultProps.arcLabelsSkipAngle,\n arcLabelsSkipRadius = defaultProps.arcLabelsSkipRadius,\n arcLabelsTextColor = defaultProps.arcLabelsTextColor,\n arcLabelsRadiusOffset = defaultProps.arcLabelsRadiusOffset,\n arcLabelsComponent,\n enableArcLinkLabels = defaultProps.enableArcLinkLabels,\n arcLinkLabel = defaultProps.arcLinkLabel,\n arcLinkLabelsSkipAngle = defaultProps.arcLinkLabelsSkipAngle,\n arcLinkLabelsOffset = defaultProps.arcLinkLabelsOffset,\n arcLinkLabelsDiagonalLength = defaultProps.arcLinkLabelsDiagonalLength,\n arcLinkLabelsStraightLength = defaultProps.arcLinkLabelsStraightLength,\n arcLinkLabelsThickness = defaultProps.arcLinkLabelsThickness,\n arcLinkLabelsTextOffset = defaultProps.arcLinkLabelsTextOffset,\n arcLinkLabelsTextColor = defaultProps.arcLinkLabelsTextColor,\n arcLinkLabelsColor = defaultProps.arcLinkLabelsColor,\n arcLinkLabelComponent,\n defs = defaultProps.defs,\n fill = defaultProps.fill,\n isInteractive = defaultProps.isInteractive,\n onClick,\n onMouseEnter,\n onMouseMove,\n onMouseLeave,\n tooltip = defaultProps.tooltip,\n activeId: activeIdFromProps,\n onActiveIdChange,\n defaultActiveId,\n transitionMode = defaultProps.transitionMode,\n legends = defaultProps.legends,\n forwardLegendData,\n role = defaultProps.role,\n forwardedRef,\n}: PieSvgProps<RawDatum> & {\n forwardedRef: Ref<SVGSVGElement>\n}) => {\n const { outerWidth, outerHeight, margin, innerWidth, innerHeight } = useDimensions(\n width,\n height,\n partialMargin\n )\n\n const normalizedData = useNormalizedData<RawDatum>({\n data,\n id,\n value,\n valueFormat,\n colors,\n })\n\n const {\n dataWithArc,\n legendData,\n arcGenerator,\n centerX,\n centerY,\n radius,\n innerRadius,\n setActiveId,\n toggleSerie,\n } = usePieFromBox<RawDatum>({\n data: normalizedData,\n width: innerWidth,\n height: innerHeight,\n fit,\n innerRadius: innerRadiusRatio,\n startAngle,\n endAngle,\n padAngle,\n sortByValue,\n cornerRadius,\n activeInnerRadiusOffset,\n activeOuterRadiusOffset,\n activeId: activeIdFromProps,\n onActiveIdChange,\n defaultActiveId,\n forwardLegendData,\n })\n\n const boundDefs = bindDefs(defs, dataWithArc, fill)\n\n const layerById: Record<PieLayerId, ReactNode> = {\n arcs: null,\n arcLinkLabels: null,\n arcLabels: null,\n legends: null,\n }\n\n if (layers.includes('arcs')) {\n layerById.arcs = (\n <Arcs<RawDatum>\n key=\"arcs\"\n center={[centerX, centerY]}\n data={dataWithArc}\n arcGenerator={arcGenerator}\n borderWidth={borderWidth}\n borderColor={borderColor}\n isInteractive={isInteractive}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseMove={onMouseMove}\n onMouseLeave={onMouseLeave}\n setActiveId={setActiveId}\n tooltip={tooltip}\n transitionMode={transitionMode}\n />\n )\n }\n\n if (enableArcLinkLabels && layers.includes('arcLinkLabels')) {\n layerById.arcLinkLabels = (\n <ArcLinkLabelsLayer<ComputedDatum<RawDatum>>\n key=\"arcLinkLabels\"\n center={[centerX, centerY]}\n data={dataWithArc}\n label={arcLinkLabel}\n skipAngle={arcLinkLabelsSkipAngle}\n offset={arcLinkLabelsOffset}\n diagonalLength={arcLinkLabelsDiagonalLength}\n straightLength={arcLinkLabelsStraightLength}\n strokeWidth={arcLinkLabelsThickness}\n textOffset={arcLinkLabelsTextOffset}\n textColor={arcLinkLabelsTextColor}\n linkColor={arcLinkLabelsColor}\n component={arcLinkLabelComponent}\n />\n )\n }\n\n if (enableArcLabels && layers.includes('arcLabels')) {\n layerById.arcLabels = (\n <ArcLabelsLayer<ComputedDatum<RawDatum>>\n key=\"arcLabels\"\n center={[centerX, centerY]}\n data={dataWithArc}\n label={arcLabel}\n radiusOffset={arcLabelsRadiusOffset}\n skipAngle={arcLabelsSkipAngle}\n skipRadius={arcLabelsSkipRadius}\n textColor={arcLabelsTextColor}\n transitionMode={transitionMode}\n component={arcLabelsComponent}\n />\n )\n }\n\n if (legends.length > 0 && layers.includes('legends')) {\n layerById.legends = (\n <PieLegends<RawDatum>\n key=\"legends\"\n width={innerWidth}\n height={innerHeight}\n data={legendData}\n legends={legends}\n toggleSerie={toggleSerie}\n />\n )\n }\n\n const layerContext = usePieLayerContext<RawDatum>({\n dataWithArc,\n arcGenerator,\n centerX,\n centerY,\n radius,\n innerRadius,\n })\n\n return (\n <SvgWrapper\n width={outerWidth}\n height={outerHeight}\n margin={margin}\n defs={boundDefs}\n role={role}\n ref={forwardedRef}\n >\n {layers.map((layer, i) => {\n if (layerById[layer as PieLayerId] !== undefined) {\n return layerById[layer as PieLayerId]\n }\n\n if (typeof layer === 'function') {\n return <Fragment key={i}>{createElement(layer, layerContext)}</Fragment>\n }\n\n return null\n })}\n </SvgWrapper>\n )\n}\n\nexport const Pie = forwardRef(\n <RawDatum extends MayHaveLabel>(\n {\n isInteractive = defaultProps.isInteractive,\n animate = defaultProps.animate,\n motionConfig = defaultProps.motionConfig,\n theme,\n renderWrapper,\n ...otherProps\n }: PieSvgProps<RawDatum>,\n ref: Ref<SVGSVGElement>\n ) => (\n <Container\n animate={animate}\n isInteractive={isInteractive}\n motionConfig={motionConfig}\n renderWrapper={renderWrapper}\n theme={theme}\n >\n <InnerPie<RawDatum> isInteractive={isInteractive} {...otherProps} forwardedRef={ref} />\n </Container>\n )\n) as <RawDatum extends MayHaveLabel>(\n props: WithChartRef<PieSvgProps<RawDatum>, SVGSVGElement>\n) => ReactElement\n","import { forwardRef, Ref, ReactElement } from 'react'\nimport { ResponsiveWrapper, ResponsiveProps, WithChartRef } from '@nivo/core'\nimport { Pie } from './Pie'\nimport { PieSvgProps, MayHaveLabel } from './types'\n\nexport const ResponsivePie = forwardRef(\n <RawDatum extends MayHaveLabel>(\n {\n defaultWidth,\n defaultHeight,\n onResize,\n debounceResize,\n ...props\n }: ResponsiveProps<PieSvgProps<RawDatum>>,\n ref: Ref<SVGSVGElement>\n ) => (\n <ResponsiveWrapper\n defaultWidth={defaultWidth}\n defaultHeight={defaultHeight}\n onResize={onResize}\n debounceResize={debounceResize}\n >\n {({ width, height }: { width: number; height: number }) => (\n <Pie<RawDatum> width={width} height={height} {...props} ref={ref} />\n )}\n </ResponsiveWrapper>\n )\n) as <RawDatum extends MayHaveLabel>(\n props: WithChartRef<ResponsiveProps<PieSvgProps<RawDatum>>, SVGSVGElement>\n) => ReactElement\n","import {\n createElement,\n useEffect,\n useMemo,\n useRef,\n MouseEvent,\n forwardRef,\n Ref,\n ReactElement,\n} from 'react'\nimport { getRelativeCursor, useDimensions, Container, WithChartRef, mergeRefs } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { renderLegendToCanvas } from '@nivo/legends'\nimport { useInheritedColor, InheritedColorConfig } from '@nivo/colors'\nimport { useTooltip } from '@nivo/tooltip'\nimport {\n Arc,\n findArcUnderCursor,\n useArcLabels,\n drawCanvasArcLabels,\n useArcLinkLabels,\n drawCanvasArcLinkLabels,\n} from '@nivo/arcs'\nimport { useNormalizedData, usePieFromBox } from './hooks'\nimport { ComputedDatum, PieCanvasProps, MayHaveLabel } from './types'\nimport { defaultProps } from './props'\n\nconst InnerPieCanvas = <RawDatum extends MayHaveLabel>({\n data,\n id = defaultProps.id,\n value = defaultProps.value,\n valueFormat,\n sortByValue = defaultProps.sortByValue,\n startAngle = defaultProps.startAngle,\n endAngle = defaultProps.endAngle,\n padAngle = defaultProps.padAngle,\n fit = defaultProps.fit,\n innerRadius: innerRadiusRatio = defaultProps.innerRadius,\n cornerRadius = defaultProps.cornerRadius,\n activeInnerRadiusOffset = defaultProps.activeInnerRadiusOffset,\n activeOuterRadiusOffset = defaultProps.activeOuterRadiusOffset,\n width,\n height,\n margin: partialMargin,\n pixelRatio = defaultProps.pixelRatio,\n colors = defaultProps.colors,\n borderWidth = defaultProps.borderWidth,\n borderColor = defaultProps.borderColor as InheritedColorConfig<ComputedDatum<RawDatum>>,\n enableArcLabels = defaultProps.enableArcLabels,\n arcLabel = defaultProps.arcLabel,\n arcLabelsSkipAngle = defaultProps.arcLabelsSkipAngle,\n arcLabelsTextColor = defaultProps.arcLabelsTextColor,\n arcLabelsRadiusOffset = defaultProps.arcLabelsRadiusOffset,\n enableArcLinkLabels = defaultProps.enableArcLinkLabels,\n arcLinkLabel = defaultProps.arcLinkLabel,\n arcLinkLabelsSkipAngle = defaultProps.arcLinkLabelsSkipAngle,\n arcLinkLabelsOffset = defaultProps.arcLinkLabelsOffset,\n arcLinkLabelsDiagonalLength = defaultProps.arcLinkLabelsDiagonalLength,\n arcLinkLabelsStraightLength = defaultProps.arcLinkLabelsStraightLength,\n arcLinkLabelsThickness = defaultProps.arcLinkLabelsThickness,\n arcLinkLabelsTextOffset = defaultProps.arcLinkLabelsTextOffset,\n arcLinkLabelsTextColor = defaultProps.arcLinkLabelsTextColor,\n arcLinkLabelsColor = defaultProps.arcLinkLabelsColor,\n isInteractive = defaultProps.isInteractive,\n onClick,\n onMouseMove,\n tooltip = defaultProps.tooltip,\n activeId: activeIdFromProps,\n onActiveIdChange,\n defaultActiveId,\n legends = defaultProps.legends,\n forwardLegendData,\n role,\n forwardedRef,\n}: PieCanvasProps<RawDatum> & {\n forwardedRef: Ref<HTMLCanvasElement>\n}) => {\n const canvasEl = useRef<HTMLCanvasElement | null>(null)\n const theme = useTheme()\n\n const { margin, innerWidth, innerHeight, outerWidth, outerHeight } = useDimensions(\n width,\n height,\n partialMargin\n )\n\n const normalizedData = useNormalizedData<RawDatum>({\n data,\n id,\n value,\n valueFormat,\n colors,\n })\n\n const { dataWithArc, arcGenerator, centerX, centerY, radius, innerRadius, setActiveId } =\n usePieFromBox<RawDatum>({\n data: normalizedData,\n width: innerWidth,\n height: innerHeight,\n fit,\n innerRadius: innerRadiusRatio,\n startAngle,\n endAngle,\n padAngle,\n sortByValue,\n cornerRadius,\n activeInnerRadiusOffset,\n activeOuterRadiusOffset,\n activeId: activeIdFromProps,\n onActiveIdChange,\n defaultActiveId,\n forwardLegendData,\n })\n\n const getBorderColor = useInheritedColor<ComputedDatum<RawDatum>>(borderColor, theme)\n\n const arcLabels = useArcLabels<ComputedDatum<RawDatum>>({\n data: dataWithArc,\n label: arcLabel,\n skipAngle: arcLabelsSkipAngle,\n offset: arcLabelsRadiusOffset,\n textColor: arcLabelsTextColor,\n })\n\n const arcLinkLabels = useArcLinkLabels<ComputedDatum<RawDatum>>({\n data: dataWithArc,\n skipAngle: arcLinkLabelsSkipAngle,\n offset: arcLinkLabelsOffset,\n diagonalLength: arcLinkLabelsDiagonalLength,\n straightLength: arcLinkLabelsStraightLength,\n label: arcLinkLabel,\n linkColor: arcLinkLabelsColor,\n textOffset: arcLinkLabelsTextOffset,\n textColor: arcLinkLabelsTextColor,\n })\n\n useEffect(() => {\n if (!canvasEl.current) return\n\n canvasEl.current.width = outerWidth * pixelRatio\n canvasEl.current.height = outerHeight * pixelRatio\n\n const ctx = canvasEl.current.getContext('2d')!\n\n ctx.scale(pixelRatio, pixelRatio)\n\n ctx.fillStyle = theme.background\n ctx.fillRect(0, 0, outerWidth, outerHeight)\n\n ctx.save()\n ctx.translate(margin.left, margin.top)\n arcGenerator.context(ctx)\n\n ctx.save()\n ctx.translate(centerX, centerY)\n\n dataWithArc.forEach(arc => {\n ctx.beginPath()\n ctx.fillStyle = arc.color\n\n ctx.strokeStyle = getBorderColor(arc)\n ctx.lineWidth = borderWidth\n\n arcGenerator(arc.arc)\n\n ctx.fill()\n\n if (borderWidth > 0) {\n ctx.stroke()\n }\n })\n\n if (enableArcLinkLabels === true) {\n drawCanvasArcLinkLabels<ComputedDatum<RawDatum>>(\n ctx,\n arcLinkLabels,\n theme,\n arcLinkLabelsThickness\n )\n }\n\n if (enableArcLabels === true) {\n drawCanvasArcLabels<ComputedDatum<RawDatum>>(ctx, arcLabels, theme)\n }\n\n // legends assume a box rather than a center,\n // that's why we restore previously saved position here.\n ctx.restore()\n legends.forEach(legend => {\n renderLegendToCanvas(ctx, {\n ...legend,\n data: dataWithArc,\n containerWidth: innerWidth,\n containerHeight: innerHeight,\n theme,\n })\n })\n }, [\n canvasEl,\n innerWidth,\n innerHeight,\n outerWidth,\n outerHeight,\n margin.top,\n margin.left,\n pixelRatio,\n centerX,\n centerY,\n arcGenerator,\n dataWithArc,\n borderWidth,\n getBorderColor,\n enableArcLabels,\n arcLabels,\n enableArcLinkLabels,\n arcLinkLabels,\n arcLinkLabelsThickness,\n legends,\n theme,\n ])\n\n const arcs = useMemo(\n () =>\n dataWithArc.map(datum => ({\n id: datum.id,\n ...datum.arc,\n })),\n [dataWithArc]\n )\n\n const getArcFromMouse = (event: MouseEvent<HTMLCanvasElement>) => {\n if (!canvasEl.current) return null\n\n const [x, y] = getRelativeCursor(canvasEl.current, event)\n\n const hoveredArc = findArcUnderCursor<Arc & { id: string | number }>(\n margin.left + centerX,\n margin.top + centerY,\n radius,\n innerRadius,\n arcs,\n x,\n y\n )\n\n if (!hoveredArc) return null\n\n return dataWithArc.find(datum => datum.id === hoveredArc.id)\n }\n\n const { showTooltipFromEvent, hideTooltip } = useTooltip()\n\n const handleMouseHover = (event: MouseEvent<HTMLCanvasElement>) => {\n const datum = getArcFromMouse(event)\n if (datum) {\n onMouseMove?.(datum, event)\n setActiveId(datum.id)\n showTooltipFromEvent(createElement(tooltip, { datum }), event)\n } else {\n setActiveId(null)\n hideTooltip()\n }\n }\n\n const handleMouseLeave = () => {\n hideTooltip()\n }\n\n const handleClick = (event: MouseEvent<HTMLCanvasElement>) => {\n if (!onClick) return\n\n const arc = getArcFromMouse(event)\n if (arc) {\n onClick(arc, event)\n }\n }\n\n return (\n <canvas\n ref={mergeRefs(canvasEl, forwardedRef)}\n width={outerWidth * pixelRatio}\n height={outerHeight * pixelRatio}\n style={{\n width: outerWidth,\n height: outerHeight,\n cursor: isInteractive ? 'auto' : 'normal',\n }}\n onMouseEnter={isInteractive ? handleMouseHover : undefined}\n onMouseMove={isInteractive ? handleMouseHover : undefined}\n onMouseLeave={isInteractive ? handleMouseLeave : undefined}\n onClick={isInteractive ? handleClick : undefined}\n role={role}\n />\n )\n}\n\nexport const PieCanvas = forwardRef(\n <RawDatum extends MayHaveLabel>(\n {\n isInteractive = defaultProps.isInteractive,\n theme,\n renderWrapper,\n ...otherProps\n }: PieCanvasProps<RawDatum>,\n ref: Ref<HTMLCanvasElement>\n ) => (\n <Container {...{ isInteractive, renderWrapper, theme }}>\n <InnerPieCanvas<RawDatum>\n isInteractive={isInteractive}\n {...otherProps}\n forwardedRef={ref}\n />\n </Container>\n )\n) as <RawDatum extends MayHaveLabel>(\n props: WithChartRef<PieCanvasProps<RawDatum>, HTMLCanvasElement>\n) => ReactElement\n","import { forwardRef, Ref, ReactElement } from 'react'\nimport { ResponsiveWrapper, ResponsiveProps, WithChartRef } from '@nivo/core'\nimport { PieCanvas } from './PieCanvas'\nimport { PieCanvasProps, MayHaveLabel } from './types'\n\nexport const ResponsivePieCanvas = forwardRef(\n <RawDatum extends MayHaveLabel>(\n {\n defaultWidth,\n defaultHeight,\n onResize,\n debounceResize,\n ...props\n }: ResponsiveProps<PieCanvasProps<RawDatum>>,\n ref: Ref<HTMLCanvasElement>\n ) => (\n <ResponsiveWrapper\n defaultWidth={defaultWidth}\n defaultHeight={defaultHeight}\n onResize={onResize}\n debounceResize={debounceResize}\n >\n {({ width, height }: { width: number; height: number }) => (\n <PieCanvas<RawDatum> width={width} height={height} {...props} ref={ref} />\n )}\n </ResponsiveWrapper>\n )\n) as <RawDatum extends MayHaveLabel>(\n props: WithChartRef<ResponsiveProps<PieCanvasProps<RawDatum>>, HTMLCanvasElement>\n) => ReactElement\n"],"names":["PieLegends","_ref","width","height","legends","data","toggleSerie","_jsx","_Fragment","children","map","legend","i","_legend$data","BoxLegendSvg","_extends","containerWidth","containerHeight","undefined","defaultProps","id","value","sortByValue","innerRadius","padAngle","cornerRadius","layers","startAngle","endAngle","fit","activeInnerRadiusOffset","activeOuterRadiusOffset","borderWidth","borderColor","from","modifiers","enableArcLabels","arcLabel","arcLabelsSkipAngle","arcLabelsSkipRadius","arcLabelsRadiusOffset","arcLabelsTextColor","theme","enableArcLinkLabels","arcLinkLabel","arcLinkLabelsSkipAngle","arcLinkLabelsOffset","arcLinkLabelsDiagonalLength","arcLinkLabelsStraightLength","arcLinkLabelsThickness","arcLinkLabelsTextOffset","arcLinkLabelsTextColor","arcLinkLabelsColor","colors","scheme","defs","fill","isInteractive","animate","motionConfig","transitionMode","tooltip","datum","BasicTooltip","formattedValue","enableChip","color","role","pixelRatio","window","_window$devicePixelRa","devicePixelRatio","useNormalizedData","_ref$id","_ref$value","valueFormat","_ref$colors","getId","usePropertyAccessor","getValue","formatValue","useValueFormatter","getColor","useOrdinalColorScale","useMemo","_datum$label","datumId","datumValue","normalizedDatum","label","hidden","usePieArcs","_ref2","outerRadius","activeId","hiddenIds","forwardLegendData","pie","innerPie","d3Pie","d","degreesToRadians","sortValues","result","hiddenData","filter","item","includes","dataWithArc","arc","angle","Math","abs","index","thickness","angleDeg","radiansToDegrees","legendData","forwardLegendDataRef","useRef","useEffect","current","useActiveId","_ref3","activeIdFromProps","onActiveIdChange","_ref3$defaultActiveId","defaultActiveId","isControlled","_useState","useState","internalActiveId","setInternalActiveId","setActiveId","useCallback","usePie","_ref4","radius","_ref4$startAngle","_ref4$endAngle","_ref4$padAngle","_ref4$sortByValue","_ref4$cornerRadius","_ref4$activeInnerRadi","_ref4$activeOuterRadi","_useActiveId","_useState2","setHiddenIds","pieArcs","state","indexOf","concat","arcGenerator","useArcGenerator","usePieFromBox","_ref5","_ref5$innerRadius","innerRadiusRatio","_ref5$startAngle","_ref5$endAngle","_ref5$padAngle","_ref5$sortByValue","_ref5$cornerRadius","_ref5$fit","_ref5$activeInnerRadi","_ref5$activeOuterRadi","_useActiveId2","_useState3","computedProps","boundingBox","min","centerX","centerY","_computeArcBoundingBo","computeArcBoundingBox","points","box","_objectWithoutPropertiesLoose","_excluded","ratio","adjustedBox","x","y","debug","usePieLayerContext","_ref6","Arcs","center","onClick","onMouseEnter","onMouseMove","onMouseLeave","_useTooltip","useTooltip","showTooltipFromEvent","hideTooltip","handleClick","event","handleMouseEnter","createElement","handleMouseMove","handleMouseLeave","ArcsLayer","InnerPie","_ref$sortByValue","_ref$layers","_ref$startAngle","_ref$endAngle","_ref$padAngle","_ref$fit","_ref$innerRadius","_ref$cornerRadius","_ref$activeInnerRadiu","_ref$activeOuterRadiu","partialMargin","margin","_ref$borderWidth","_ref$borderColor","_ref$enableArcLabels","_ref$arcLabel","_ref$arcLabelsSkipAng","_ref$arcLabelsSkipRad","_ref$arcLabelsTextCol","_ref$arcLabelsRadiusO","arcLabelsComponent","_ref$enableArcLinkLab","_ref$arcLinkLabel","_ref$arcLinkLabelsSki","_ref$arcLinkLabelsOff","_ref$arcLinkLabelsDia","_ref$arcLinkLabelsStr","_ref$arcLinkLabelsThi","_ref$arcLinkLabelsTex","_ref$arcLinkLabelsTex2","_ref$arcLinkLabelsCol","arcLinkLabelComponent","_ref$defs","_ref$fill","_ref$isInteractive","_ref$tooltip","_ref$transitionMode","_ref$legends","_ref$role","forwardedRef","_useDimensions","useDimensions","outerWidth","outerHeight","innerWidth","innerHeight","normalizedData","_usePieFromBox","boundDefs","bindDefs","layerById","arcs","arcLinkLabels","arcLabels","ArcLinkLabelsLayer","skipAngle","offset","diagonalLength","straightLength","strokeWidth","textOffset","textColor","linkColor","component","ArcLabelsLayer","radiusOffset","skipRadius","length","layerContext","SvgWrapper","ref","layer","Fragment","Pie","forwardRef","_ref2$isInteractive","_ref2$animate","_ref2$motionConfig","renderWrapper","otherProps","Container","ResponsivePie","defaultWidth","defaultHeight","onResize","debounceResize","props","ResponsiveWrapper","InnerPieCanvas","_ref$pixelRatio","canvasEl","useTheme","getBorderColor","useInheritedColor","useArcLabels","useArcLinkLabels","ctx","getContext","scale","fillStyle","background","fillRect","save","translate","left","top","context","forEach","beginPath","strokeStyle","lineWidth","stroke","drawCanvasArcLinkLabels","drawCanvasArcLabels","restore","renderLegendToCanvas","getArcFromMouse","_getRelativeCursor","getRelativeCursor","hoveredArc","findArcUnderCursor","find","handleMouseHover","mergeRefs","style","cursor","PieCanvas","ResponsivePieCanvas"],"mappings":"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