@nivo/radar
Version:
1 lines • 54.4 kB
Source Map (JSON)
{"version":3,"file":"nivo-radar.mjs","sources":["../src/RadarLayer.tsx","../src/RadarGridLabels.tsx","../src/RadarGridLevels.tsx","../src/RadarGrid.tsx","../src/RadarSlice.tsx","../src/RadarSlices.tsx","../src/RadarDots.tsx","../src/defaults.ts","../src/RadarGridLabel.tsx","../src/RadarSliceTooltip.tsx","../src/Radar.tsx","../src/hooks.ts","../src/ResponsiveRadar.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { useSpring, animated } from '@react-spring/web'\nimport { lineRadial, CurveFactory } from 'd3-shape'\nimport { ScaleLinear } from 'd3-scale'\nimport { useMotionConfig, useAnimatedPath } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { useInheritedColor } from '@nivo/colors'\nimport { RadarCommonProps, RadarSvgProps } from './types'\n\ninterface RadarLayerProps<D extends Record<string, unknown>> {\n data: readonly D[]\n item: string\n colorByKey: Record<string | number, string>\n fillByKey: Record<string, string | null>\n radiusScale: ScaleLinear<number, number>\n rotation: number\n angleStep: number\n curveFactory: CurveFactory\n borderWidth: RadarCommonProps<D>['borderWidth']\n borderColor: RadarCommonProps<D>['borderColor']\n fillOpacity: RadarCommonProps<D>['fillOpacity']\n blendMode: RadarCommonProps<D>['blendMode']\n onClick?: RadarSvgProps<D>['onClick']\n}\n\nexport const RadarLayer = <D extends Record<string, unknown>>({\n data,\n item: key,\n colorByKey,\n fillByKey,\n radiusScale,\n rotation,\n angleStep,\n curveFactory,\n borderWidth,\n borderColor,\n fillOpacity,\n blendMode,\n}: RadarLayerProps<D>) => {\n const theme = useTheme()\n const getBorderColor = useInheritedColor(borderColor, theme)\n\n const lineGenerator = useMemo(() => {\n return lineRadial<number>()\n .radius(d => radiusScale(d))\n .angle((_, i) => rotation + i * angleStep)\n .curve(curveFactory)\n }, [radiusScale, rotation, angleStep, curveFactory])\n\n const { animate, config: springConfig } = useMotionConfig()\n const animatedPath = useAnimatedPath(lineGenerator(data.map(d => d[key] as number)) as string)\n const animatedProps = useSpring<{ fill: string; stroke: string }>({\n fill: colorByKey[key],\n stroke: getBorderColor({ key, color: colorByKey[key] }),\n config: springConfig,\n immediate: !animate,\n })\n const fill = fillByKey[key] ?? animatedProps.fill\n\n return (\n <animated.path\n key={key}\n d={animatedPath}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke={animatedProps.stroke}\n strokeWidth={borderWidth}\n style={{ mixBlendMode: blendMode }}\n />\n )\n}\n","import { createElement } from 'react'\nimport { useSprings } from '@react-spring/web'\nimport { useMotionConfig, positionFromAngle, radiansToDegrees } from '@nivo/core'\nimport { GridLabelComponent } from './types'\n\nconst textAnchorFromAngle = (_angle: number) => {\n const angle = radiansToDegrees(_angle) + 90\n\n if (angle <= 10 || angle >= 350 || (angle >= 170 && angle <= 190)) return 'middle' as const\n if (angle > 180) return 'end' as const\n return 'start' as const\n}\n\ninterface RadarGridLabelsProps {\n radius: number\n angles: number[]\n indices: string[]\n label: GridLabelComponent\n labelOffset: number\n}\n\nexport const RadarGridLabels = ({\n radius,\n angles,\n indices,\n label: labelComponent,\n labelOffset,\n}: RadarGridLabelsProps) => {\n const { animate, config: springConfig } = useMotionConfig()\n\n const labels = indices.map((index, i) => {\n const position = positionFromAngle(angles[i], radius + labelOffset)\n const textAnchor = textAnchorFromAngle(angles[i])\n\n return {\n id: index,\n angle: radiansToDegrees(angles[i]),\n anchor: textAnchor,\n ...position,\n }\n })\n\n const springs = useSprings(\n labels.length,\n labels.map(label => ({\n transform: `translate(${label.x}, ${label.y})`,\n config: springConfig,\n immediate: !animate,\n }))\n )\n\n return (\n <>\n {springs.map((animatedProps, index) => {\n const label = labels[index]\n\n return createElement(labelComponent, {\n key: label.id,\n id: label.id,\n anchor: label.anchor,\n angle: label.angle,\n x: label.x,\n y: label.y,\n animated: animatedProps,\n })\n })}\n </>\n )\n}\n","import { memo, SVGProps, useMemo } from 'react'\nimport { lineRadial, curveLinearClosed } from 'd3-shape'\nimport { animated, useSpring, to } from '@react-spring/web'\nimport { useAnimatedPath, useMotionConfig } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { RadarCommonProps } from './types'\n\ninterface RadarGridLevelCircularProps {\n radius: number\n}\n\nconst RadarGridLevelCircular = memo(({ radius }: RadarGridLevelCircularProps) => {\n const theme = useTheme()\n const { animate, config: springConfig } = useMotionConfig()\n\n const animatedProps = useSpring({\n radius,\n config: springConfig,\n immediate: !animate,\n })\n\n return (\n <animated.circle\n fill=\"none\"\n r={to(animatedProps.radius, value => Math.max(value, 0))}\n {...(theme.grid.line as Omit<SVGProps<SVGCircleElement>, 'ref'>)}\n />\n )\n})\n\ninterface RadarGridLevelLinearProps {\n radius: number\n rotation: number\n angleStep: number\n dataLength: number\n}\n\nconst RadarGridLevelLinear = ({\n radius,\n rotation,\n angleStep,\n dataLength,\n}: RadarGridLevelLinearProps) => {\n const theme = useTheme()\n\n const radarLineGenerator = useMemo(\n () =>\n lineRadial<number>()\n .angle(i => rotation + i * angleStep)\n .radius(radius)\n .curve(curveLinearClosed),\n [rotation, angleStep, radius]\n )\n\n const points = Array.from({ length: dataLength }, (_, i) => i)\n const animatedPath = useAnimatedPath(radarLineGenerator(points) as string)\n\n return (\n <animated.path\n fill=\"none\"\n d={animatedPath}\n {...(theme.grid.line as Omit<SVGProps<SVGPathElement>, 'ref'>)}\n />\n )\n}\n\ninterface RadarGridLevelsProps<D extends Record<string, unknown>> {\n shape: RadarCommonProps<D>['gridShape']\n radius: number\n rotation: number\n angleStep: number\n dataLength: number\n}\n\nexport const RadarGridLevels = <D extends Record<string, unknown>>({\n shape,\n ...props\n}: RadarGridLevelsProps<D>) => {\n return shape === 'circular' ? (\n <RadarGridLevelCircular radius={props.radius} />\n ) : (\n <RadarGridLevelLinear {...props} />\n )\n}\n","import { SVGProps, useMemo } from 'react'\nimport { positionFromAngle } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { RadarGridLabels } from './RadarGridLabels'\nimport { RadarGridLevels } from './RadarGridLevels'\nimport { GridLabelComponent, RadarCommonProps } from './types'\n\ninterface RadarGridProps<D extends Record<string, unknown>> {\n indices: string[]\n shape: RadarCommonProps<D>['gridShape']\n radius: number\n levels: number\n rotation: number\n angleStep: number\n label: GridLabelComponent\n labelOffset: number\n}\n\nexport const RadarGrid = <D extends Record<string, unknown>>({\n indices,\n levels,\n shape,\n radius,\n rotation,\n angleStep,\n label,\n labelOffset,\n}: RadarGridProps<D>) => {\n const theme = useTheme()\n const { radii, angles } = useMemo(() => {\n return {\n radii: Array.from({ length: levels })\n .map((_, i) => (radius / levels) * (i + 1))\n .reverse(),\n angles: Array.from({ length: indices.length }).map(\n (_, i) => rotation + i * angleStep - Math.PI / 2\n ),\n }\n }, [indices, levels, radius, rotation, angleStep])\n\n return (\n <>\n {angles.map((angle, i) => {\n const position = positionFromAngle(angle, radius)\n return (\n <line\n key={`axis.${i}`}\n x1={0}\n y1={0}\n x2={position.x}\n y2={position.y}\n {...(theme.grid.line as SVGProps<SVGLineElement>)}\n />\n )\n })}\n {radii.map((radius, i) => (\n <RadarGridLevels<D>\n key={`level.${i}`}\n shape={shape}\n radius={radius}\n rotation={rotation}\n angleStep={angleStep}\n dataLength={indices.length}\n />\n ))}\n <RadarGridLabels\n radius={radius}\n angles={angles}\n indices={indices}\n labelOffset={labelOffset}\n label={label}\n />\n </>\n )\n}\n","import { useMemo, useState, useCallback, createElement, MouseEvent } from 'react'\nimport { Arc } from 'd3-shape'\nimport { positionFromAngle } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { useTooltip } from '@nivo/tooltip'\nimport { RadarCommonProps, RadarDataProps, RadarSliceTooltipDatum, RadarSvgProps } from './types'\n\ninterface RadarSliceProps<D extends Record<string, unknown>> {\n datum: D\n keys: RadarDataProps<D>['keys']\n index: string | number\n formatValue: (value: number, context: string) => string\n colorByKey: Record<string, string>\n startAngle: number\n endAngle: number\n radius: number\n arcGenerator: Arc<void, { startAngle: number; endAngle: number }>\n tooltip: RadarCommonProps<D>['sliceTooltip']\n onClick?: RadarSvgProps<D>['onClick']\n}\n\nexport const RadarSlice = <D extends Record<string, unknown>>({\n datum,\n keys,\n index,\n formatValue,\n colorByKey,\n radius,\n startAngle,\n endAngle,\n arcGenerator,\n tooltip,\n onClick,\n}: RadarSliceProps<D>) => {\n const [isHover, setIsHover] = useState(false)\n const theme = useTheme()\n const { showTooltipFromEvent, hideTooltip } = useTooltip()\n\n const handleClick = useCallback(\n (event: MouseEvent<SVGPathElement>) => onClick?.(datum, event),\n [onClick, datum]\n )\n\n const tooltipData = useMemo(() => {\n const data: RadarSliceTooltipDatum[] = keys.map(key => ({\n color: colorByKey[key],\n id: key,\n value: datum[key] as number,\n formattedValue: formatValue(datum[key] as number, key),\n }))\n data.sort((a, b) => a.value - b.value)\n data.reverse()\n\n return data\n }, [datum, keys, formatValue, colorByKey])\n\n const showItemTooltip = useCallback(\n (event: MouseEvent<SVGPathElement>) => {\n setIsHover(true)\n showTooltipFromEvent(\n createElement(tooltip, {\n index,\n data: tooltipData,\n }),\n event\n )\n },\n [showTooltipFromEvent, tooltip, index, tooltipData]\n )\n\n const hideItemTooltip = useCallback(() => {\n setIsHover(false)\n hideTooltip()\n }, [hideTooltip, setIsHover])\n\n const { path, tipX, tipY } = useMemo(() => {\n const position = positionFromAngle(\n startAngle + (endAngle - startAngle) * 0.5 - Math.PI / 2,\n radius\n )\n\n return {\n path: arcGenerator({ startAngle, endAngle }) as string,\n tipX: position.x,\n tipY: position.y,\n }\n }, [startAngle, endAngle, radius, arcGenerator])\n\n return (\n <>\n {isHover && <line x1={0} y1={0} x2={tipX} y2={tipY} style={theme.crosshair.line} />}\n <path\n d={path}\n fill=\"#F00\"\n fillOpacity={0}\n onMouseEnter={showItemTooltip}\n onMouseMove={showItemTooltip}\n onMouseLeave={hideItemTooltip}\n onClick={handleClick}\n />\n </>\n )\n}\n","import { arc as d3Arc } from 'd3-shape'\nimport { RadarSlice } from './RadarSlice'\nimport { RadarColorMapping, RadarCommonProps, RadarDataProps, RadarSvgProps } from './types'\n\ninterface RadarSlicesProps<D extends Record<string, unknown>> {\n data: RadarDataProps<D>['data']\n keys: RadarDataProps<D>['keys']\n getIndex: (d: D) => string | number\n formatValue: (value: number, context: string) => string\n colorByKey: RadarColorMapping\n radius: number\n rotation: number\n angleStep: number\n tooltip: RadarCommonProps<D>['sliceTooltip']\n onClick?: RadarSvgProps<D>['onClick']\n}\n\nexport const RadarSlices = <D extends Record<string, unknown>>({\n data,\n keys,\n getIndex,\n formatValue,\n colorByKey,\n radius,\n rotation,\n angleStep,\n tooltip,\n onClick,\n}: RadarSlicesProps<D>) => {\n const arc = d3Arc<{ startAngle: number; endAngle: number }>().outerRadius(radius).innerRadius(0)\n\n const halfAngleStep = angleStep * 0.5\n let rootStartAngle = rotation - halfAngleStep\n\n return (\n <>\n {data.map(d => {\n const index = getIndex(d)\n const startAngle = rootStartAngle\n const endAngle = startAngle + angleStep\n\n rootStartAngle += angleStep\n\n return (\n <RadarSlice\n key={index}\n datum={d}\n keys={keys}\n index={index}\n formatValue={formatValue}\n colorByKey={colorByKey}\n startAngle={startAngle}\n endAngle={endAngle}\n radius={radius}\n arcGenerator={arc}\n tooltip={tooltip}\n onClick={onClick}\n />\n )\n })}\n </>\n )\n}\n","import { useMemo } from 'react'\nimport { ScaleLinear } from 'd3-scale'\nimport { positionFromAngle, DotsItem, usePropertyAccessor } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { getInheritedColorGenerator } from '@nivo/colors'\nimport { RadarCommonProps, RadarDataProps, PointProps, PointData, RadarColorMapping } from './types'\n\ninterface RadarDotsProps<D extends Record<string, unknown>> {\n data: RadarDataProps<D>['data']\n keys: RadarDataProps<D>['keys']\n radiusScale: ScaleLinear<number, number>\n getIndex: (d: D) => string\n colorByKey: RadarColorMapping\n rotation: number\n angleStep: number\n symbol?: RadarCommonProps<D>['dotSymbol']\n size: number\n color: RadarCommonProps<D>['dotColor']\n borderWidth: number\n borderColor: RadarCommonProps<D>['dotBorderColor']\n enableLabel: boolean\n label: RadarCommonProps<D>['dotLabel']\n formatValue: (value: number, context: string) => string\n labelYOffset: number\n}\n\nexport const RadarDots = <D extends Record<string, unknown>>({\n data,\n keys,\n getIndex,\n colorByKey,\n radiusScale,\n rotation,\n angleStep,\n symbol,\n size = 6,\n color = { from: 'color' },\n borderWidth = 0,\n borderColor = { from: 'color' },\n enableLabel = false,\n label = 'value',\n formatValue,\n labelYOffset,\n}: RadarDotsProps<D>) => {\n const theme = useTheme()\n const fillColor = getInheritedColorGenerator(color, theme)\n const strokeColor = getInheritedColorGenerator(borderColor, theme)\n const getLabel = usePropertyAccessor<PointData, string | number>(label)\n\n const points: PointProps[] = useMemo(\n () =>\n data.reduce((acc, datum, i) => {\n const index = getIndex(datum)\n keys.forEach(key => {\n const value = datum[key] as number\n\n const pointData: PointData = {\n index,\n key,\n value,\n formattedValue: formatValue(value, key),\n color: colorByKey[key],\n }\n\n acc.push({\n key: `${key}.${index}`,\n label: enableLabel ? getLabel(pointData) : undefined,\n style: {\n fill: fillColor(pointData),\n stroke: strokeColor(pointData),\n ...positionFromAngle(\n rotation + angleStep * i - Math.PI / 2,\n radiusScale(datum[key] as number)\n ),\n },\n data: pointData,\n })\n })\n\n return acc\n }, [] as PointProps[]),\n [\n data,\n keys,\n getIndex,\n colorByKey,\n enableLabel,\n getLabel,\n formatValue,\n fillColor,\n strokeColor,\n rotation,\n angleStep,\n radiusScale,\n ]\n )\n\n return (\n <>\n {points.map(point => (\n <DotsItem\n key={point.key}\n x={point.style.x}\n y={point.style.y}\n symbol={symbol}\n size={size}\n color={point.style.fill}\n borderWidth={borderWidth}\n borderColor={point.style.stroke}\n label={point.label}\n labelYOffset={labelYOffset}\n datum={point.data}\n />\n ))}\n </>\n )\n}\n","import { RadarGridLabel } from './RadarGridLabel'\nimport { RadarSliceTooltip } from './RadarSliceTooltip'\nimport { RadarLayerId } from './types'\n\nexport const svgDefaultProps = {\n layers: ['grid', 'layers', 'slices', 'dots', 'legends'] as RadarLayerId[],\n\n maxValue: 'auto' as const,\n\n rotation: 0,\n\n curve: 'linearClosed' as const,\n\n borderWidth: 2,\n borderColor: { from: 'color' },\n\n gridLevels: 5,\n gridShape: 'circular' as const,\n gridLabelOffset: 16,\n gridLabel: RadarGridLabel,\n\n enableDots: true,\n dotSize: 6,\n dotColor: { from: 'color' },\n dotBorderWidth: 0,\n dotBorderColor: { from: 'color' },\n enableDotLabel: false,\n dotLabel: 'formattedValue',\n dotLabelYOffset: -12,\n\n colors: { scheme: 'nivo' as const },\n fillOpacity: 0.25,\n blendMode: 'normal' as const,\n\n isInteractive: true,\n sliceTooltip: RadarSliceTooltip,\n\n legends: [],\n role: 'img',\n\n animate: true,\n motionConfig: 'gentle' as const,\n\n defs: [],\n fill: [],\n}\n","import { animated } from '@react-spring/web'\nimport { useTheme } from '@nivo/theming'\nimport { Text } from '@nivo/text'\nimport { GridLabelProps } from './types'\n\nexport const RadarGridLabel = ({ id, anchor, animated: animatedProps }: GridLabelProps) => {\n const theme = useTheme()\n\n return (\n <animated.g transform={animatedProps.transform}>\n <Text style={theme.axis.ticks.text} dominantBaseline=\"central\" textAnchor={anchor}>\n {id}\n </Text>\n </animated.g>\n )\n}\n","import { useMemo } from 'react'\nimport { TableTooltip, Chip } from '@nivo/tooltip'\nimport { RadarSliceTooltipProps } from './types'\n\nexport const RadarSliceTooltip = ({ index, data }: RadarSliceTooltipProps) => {\n const rows = useMemo(\n () =>\n data.map(datum => [\n <Chip key={datum.id} color={datum.color} />,\n datum.id,\n datum.formattedValue,\n ]),\n [data]\n )\n\n return <TableTooltip title={<strong>{index}</strong>} rows={rows} />\n}\n","import { ReactNode, Fragment, createElement, forwardRef, Ref, ReactElement } from 'react'\nimport { Container, useDimensions, SvgWrapper, WithChartRef } from '@nivo/core'\nimport { BoxLegendSvg } from '@nivo/legends'\nimport { RadarLayer } from './RadarLayer'\nimport { RadarGrid } from './RadarGrid'\nimport { RadarSlices } from './RadarSlices'\nimport { RadarDots } from './RadarDots'\nimport { svgDefaultProps } from './defaults'\nimport { RadarLayerId, RadarSvgProps } from './types'\nimport { useRadar } from './hooks'\n\ntype InnerRadarProps<D extends Record<string, unknown>> = Omit<\n RadarSvgProps<D>,\n 'animate' | 'motionConfig' | 'renderWrapper' | 'theme'\n> & {\n forwardedRef: Ref<SVGSVGElement>\n}\n\nconst InnerRadar = <D extends Record<string, unknown>>({\n data,\n keys,\n indexBy,\n layers = svgDefaultProps.layers,\n rotation: rotationDegrees = svgDefaultProps.rotation,\n maxValue = svgDefaultProps.maxValue,\n valueFormat,\n curve = svgDefaultProps.curve,\n margin: partialMargin,\n width,\n height,\n borderWidth = svgDefaultProps.borderWidth,\n borderColor = svgDefaultProps.borderColor,\n gridLevels = svgDefaultProps.gridLevels,\n gridShape = svgDefaultProps.gridShape,\n gridLabel = svgDefaultProps.gridLabel,\n gridLabelOffset = svgDefaultProps.gridLabelOffset,\n enableDots = svgDefaultProps.enableDots,\n dotSymbol,\n dotSize = svgDefaultProps.dotSize,\n dotColor = svgDefaultProps.dotColor,\n dotBorderWidth = svgDefaultProps.dotBorderWidth,\n dotBorderColor = svgDefaultProps.dotBorderColor,\n enableDotLabel = svgDefaultProps.enableDotLabel,\n dotLabel = svgDefaultProps.dotLabel,\n dotLabelYOffset = svgDefaultProps.dotLabelYOffset,\n colors = svgDefaultProps.colors,\n fillOpacity = svgDefaultProps.fillOpacity,\n blendMode = svgDefaultProps.blendMode,\n isInteractive = svgDefaultProps.isInteractive,\n sliceTooltip = svgDefaultProps.sliceTooltip,\n legends = svgDefaultProps.legends,\n role,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n defs = svgDefaultProps.defs,\n fill = svgDefaultProps.fill,\n onClick,\n forwardedRef,\n}: InnerRadarProps<D>) => {\n const { margin, innerWidth, innerHeight, outerWidth, outerHeight } = useDimensions(\n width,\n height,\n partialMargin\n )\n\n const {\n getIndex,\n indices,\n formatValue,\n colorByKey,\n fillByKey,\n boundDefs,\n rotation,\n radius,\n radiusScale,\n centerX,\n centerY,\n angleStep,\n curveFactory,\n boundLegends,\n customLayerProps,\n } = useRadar<D>({\n data,\n keys,\n indexBy,\n rotationDegrees,\n maxValue,\n valueFormat,\n curve,\n width: innerWidth,\n height: innerHeight,\n colors,\n legends,\n defs,\n fill,\n })\n\n const layerById: Record<RadarLayerId, ReactNode> = {\n grid: null,\n layers: null,\n slices: null,\n dots: null,\n legends: null,\n }\n\n if (layers.includes('grid')) {\n layerById.grid = (\n <g key=\"grid\" transform={`translate(${centerX}, ${centerY})`}>\n <RadarGrid<D>\n levels={gridLevels}\n shape={gridShape}\n radius={radius}\n rotation={rotation}\n angleStep={angleStep}\n indices={indices}\n label={gridLabel}\n labelOffset={gridLabelOffset}\n />\n </g>\n )\n }\n\n if (layers.includes('layers')) {\n layerById.layers = (\n <g key=\"layers\" transform={`translate(${centerX}, ${centerY})`}>\n {keys.map(key => (\n <RadarLayer<D>\n key={key}\n data={data}\n item={key}\n colorByKey={colorByKey}\n fillByKey={fillByKey}\n radiusScale={radiusScale}\n rotation={rotation}\n angleStep={angleStep}\n curveFactory={curveFactory}\n borderWidth={borderWidth}\n borderColor={borderColor}\n fillOpacity={fillOpacity}\n blendMode={blendMode}\n />\n ))}\n </g>\n )\n }\n\n if (layers.includes('slices') && isInteractive) {\n layerById.slices = (\n <g key=\"slices\" transform={`translate(${centerX}, ${centerY})`}>\n <RadarSlices<D>\n data={data}\n keys={keys}\n getIndex={getIndex}\n formatValue={formatValue}\n colorByKey={colorByKey}\n radius={radius}\n rotation={rotation}\n angleStep={angleStep}\n tooltip={sliceTooltip}\n onClick={onClick}\n />\n </g>\n )\n }\n\n if (layers.includes('dots') && enableDots) {\n layerById.dots = (\n <g key=\"dots\" transform={`translate(${centerX}, ${centerY})`}>\n <RadarDots<D>\n data={data}\n keys={keys}\n getIndex={getIndex}\n radiusScale={radiusScale}\n rotation={rotation}\n angleStep={angleStep}\n symbol={dotSymbol}\n size={dotSize}\n colorByKey={colorByKey}\n color={dotColor}\n borderWidth={dotBorderWidth}\n borderColor={dotBorderColor}\n enableLabel={enableDotLabel}\n label={dotLabel}\n formatValue={formatValue}\n labelYOffset={dotLabelYOffset}\n />\n </g>\n )\n }\n\n if (layers.includes('legends')) {\n layerById.legends = (\n <Fragment key=\"legends\">\n {boundLegends.map((legend, i) => (\n <BoxLegendSvg\n key={i}\n {...legend}\n containerWidth={width}\n containerHeight={height}\n />\n ))}\n </Fragment>\n )\n }\n\n return (\n <SvgWrapper\n defs={boundDefs}\n width={outerWidth}\n height={outerHeight}\n margin={margin}\n role={role}\n ariaLabel={ariaLabel}\n ariaLabelledBy={ariaLabelledBy}\n ariaDescribedBy={ariaDescribedBy}\n ref={forwardedRef}\n >\n {layers.map((layer, i) => {\n if (typeof layer === 'function') {\n return <Fragment key={i}>{createElement(layer, customLayerProps)}</Fragment>\n }\n\n return layerById?.[layer] ?? null\n })}\n </SvgWrapper>\n )\n}\n\nexport const Radar = forwardRef(\n <D extends Record<string, unknown>>(\n {\n isInteractive = svgDefaultProps.isInteractive,\n animate = svgDefaultProps.animate,\n motionConfig = svgDefaultProps.motionConfig,\n theme,\n renderWrapper,\n ...props\n }: RadarSvgProps<D>,\n ref: Ref<SVGSVGElement>\n ) => (\n <Container\n animate={animate}\n isInteractive={isInteractive}\n motionConfig={motionConfig}\n renderWrapper={renderWrapper}\n theme={theme}\n >\n <InnerRadar<D> isInteractive={isInteractive} {...props} forwardedRef={ref} />\n </Container>\n )\n) as <D extends Record<string, unknown>>(\n props: WithChartRef<RadarSvgProps<D>, SVGSVGElement>\n) => ReactElement\n","import { useMemo } from 'react'\nimport { scaleLinear } from 'd3-scale'\nimport {\n // @ts-expect-error no types\n bindDefs,\n useCurveInterpolation,\n usePropertyAccessor,\n useValueFormatter,\n} from '@nivo/core'\nimport { degreesToRadians } from '@nivo/core'\nimport { useOrdinalColorScale } from '@nivo/colors'\nimport { svgDefaultProps } from './defaults'\nimport {\n RadarColorMapping,\n RadarCommonProps,\n RadarDataProps,\n RadarCustomLayerProps,\n RadarSvgProps,\n BoundLegendProps,\n} from './types'\n\nexport const useRadar = <D extends Record<string, unknown>>({\n data,\n keys,\n indexBy,\n rotationDegrees,\n maxValue,\n valueFormat,\n curve,\n width,\n height,\n colors = svgDefaultProps.colors,\n legends,\n defs,\n fill,\n}: {\n data: RadarDataProps<D>['data']\n keys: RadarDataProps<D>['keys']\n indexBy: RadarDataProps<D>['indexBy']\n rotationDegrees: RadarCommonProps<D>['rotation']\n maxValue: RadarCommonProps<D>['maxValue']\n valueFormat?: RadarCommonProps<D>['valueFormat']\n curve: RadarCommonProps<D>['curve']\n width: number\n height: number\n colors: RadarCommonProps<D>['colors']\n legends: RadarCommonProps<D>['legends']\n defs: RadarSvgProps<D>['defs']\n fill: RadarSvgProps<D>['fill']\n}) => {\n const getIndex = usePropertyAccessor<D, string>(indexBy)\n const indices = useMemo(() => data.map(getIndex), [data, getIndex])\n const formatValue = useValueFormatter<number, string>(valueFormat)\n const rotation = degreesToRadians(rotationDegrees)\n\n const getColor = useOrdinalColorScale<{ key: string; index: number }>(colors, 'key')\n const colorByKey: RadarColorMapping = useMemo(\n () =>\n keys.reduce<RadarColorMapping>((mapping, key, index) => {\n mapping[key] = getColor({ key, index })\n return mapping\n }, {}),\n [keys, getColor]\n )\n\n const { boundDefs, fillByKey } = useMemo(() => {\n // expand keys into structure expected by bindDefs\n const keyData = keys.map(k => ({ key: k, color: colorByKey[k], data, fill: null }))\n const boundDefs = bindDefs(defs, keyData, fill)\n const fillByKey = keyData.reduce<Record<string, string | null>>((mapping, keyDatum) => {\n const { key: keyName, fill } = keyDatum\n mapping[keyName] = fill\n return mapping\n }, {})\n\n return { boundDefs, fillByKey }\n }, [keys, data, defs, fill, colorByKey])\n\n const { radius, radiusScale, centerX, centerY, angleStep } = useMemo(() => {\n const allValues: number[] = data.reduce(\n (acc: number[], d) => [...acc, ...keys.map(key => d[key] as number)],\n [] as number[]\n )\n const computedMaxValue = maxValue !== 'auto' ? maxValue : Math.max(...allValues)\n\n const radius = Math.min(width, height) / 2\n const radiusScale = scaleLinear<number, number>()\n .range([0, radius])\n .domain([0, computedMaxValue])\n\n return {\n radius,\n radiusScale,\n centerX: width / 2,\n centerY: height / 2,\n angleStep: (Math.PI * 2) / data.length,\n }\n }, [keys, data, maxValue, width, height])\n\n const curveFactory = useCurveInterpolation(curve)\n\n const customLayerProps: RadarCustomLayerProps<D> = useMemo(\n () => ({\n data,\n keys,\n indices,\n colorByKey,\n centerX,\n centerY,\n radiusScale,\n angleStep,\n }),\n [data, keys, indices, colorByKey, centerX, centerY, radiusScale, angleStep]\n )\n\n const legendData = useMemo(\n () => keys.map(key => ({ id: key, label: key, color: colorByKey[key] })),\n [keys, colorByKey]\n )\n\n const boundLegends: BoundLegendProps[] = useMemo(\n () =>\n legends.map(({ data: customData, ...legend }) => {\n const boundData = customData?.map(cd => {\n const findData = legendData.find(ld => ld.id === cd.id) || {}\n return { ...findData, ...cd }\n })\n return { ...legend, data: boundData || legendData }\n }),\n [legends, legendData]\n )\n\n return {\n getIndex,\n indices,\n formatValue,\n colorByKey,\n fillByKey,\n boundDefs,\n rotation,\n radius,\n radiusScale,\n centerX,\n centerY,\n angleStep,\n curveFactory,\n legendData,\n boundLegends,\n customLayerProps,\n }\n}\n","import { forwardRef, Ref, ReactElement } from 'react'\nimport { ResponsiveWrapper, ResponsiveProps, WithChartRef } from '@nivo/core'\nimport { RadarSvgProps } from './types'\nimport { Radar } from './Radar'\n\nexport const ResponsiveRadar = forwardRef(\n <D extends Record<string, unknown>>(\n {\n defaultWidth,\n defaultHeight,\n onResize,\n debounceResize,\n ...props\n }: ResponsiveProps<RadarSvgProps<D>>,\n ref: Ref<SVGSVGElement>\n ) => (\n <ResponsiveWrapper\n defaultWidth={defaultWidth}\n defaultHeight={defaultHeight}\n onResize={onResize}\n debounceResize={debounceResize}\n >\n {({ width, height }) => <Radar<D> {...props} width={width} height={height} ref={ref} />}\n </ResponsiveWrapper>\n )\n) as <D extends Record<string, unknown>>(\n props: WithChartRef<ResponsiveProps<RadarSvgProps<D>>, SVGSVGElement>\n) => ReactElement\n"],"names":["RadarLayer","_ref","_fillByKey$key","data","key","item","colorByKey","fillByKey","radiusScale","rotation","angleStep","curveFactory","borderWidth","borderColor","fillOpacity","blendMode","theme","useTheme","getBorderColor","useInheritedColor","lineGenerator","useMemo","lineRadial","radius","d","angle","_","i","curve","_useMotionConfig","useMotionConfig","animate","springConfig","config","animatedPath","useAnimatedPath","map","animatedProps","useSpring","fill","stroke","color","immediate","_jsx","animated","path","strokeWidth","style","mixBlendMode","RadarGridLabels","angles","indices","labelComponent","label","labelOffset","labels","index","_angle","position","positionFromAngle","textAnchor","radiansToDegrees","_extends","id","anchor","springs","useSprings","length","transform","x","y","_Fragment","children","createElement","RadarGridLevelCircular","memo","circle","r","to","value","Math","max","grid","line","RadarGridLevelLinear","_ref2","dataLength","radarLineGenerator","curveLinearClosed","points","Array","from","RadarGridLevels","_ref3","shape","props","_objectWithoutPropertiesLoose","_excluded","RadarGrid","levels","_useMemo","radii","reverse","PI","_jsxs","x1","y1","x2","y2","RadarSlice","datum","keys","formatValue","startAngle","endAngle","arcGenerator","tooltip","onClick","_useState","useState","isHover","setIsHover","_useTooltip","useTooltip","showTooltipFromEvent","hideTooltip","handleClick","useCallback","event","tooltipData","formattedValue","sort","a","b","showItemTooltip","hideItemTooltip","tipX","tipY","crosshair","onMouseEnter","onMouseMove","onMouseLeave","RadarSlices","getIndex","arc","d3Arc","outerRadius","innerRadius","rootStartAngle","RadarDots","symbol","_ref$size","size","_ref$color","_ref$borderWidth","_ref$borderColor","_ref$enableLabel","enableLabel","_ref$label","labelYOffset","fillColor","getInheritedColorGenerator","strokeColor","getLabel","usePropertyAccessor","reduce","acc","forEach","pointData","push","undefined","point","DotsItem","svgDefaultProps","layers","maxValue","gridLevels","gridShape","gridLabelOffset","gridLabel","g","Text","axis","ticks","text","dominantBaseline","enableDots","dotSize","dotColor","dotBorderWidth","dotBorderColor","enableDotLabel","dotLabel","dotLabelYOffset","colors","scheme","isInteractive","sliceTooltip","rows","Chip","TableTooltip","title","legends","role","motionConfig","defs","InnerRadar","indexBy","_ref$layers","_ref$rotation","rotationDegrees","_ref$maxValue","valueFormat","_ref$curve","partialMargin","margin","width","height","_ref$gridLevels","_ref$gridShape","_ref$gridLabel","_ref$gridLabelOffset","_ref$enableDots","dotSymbol","_ref$dotSize","_ref$dotColor","_ref$dotBorderWidth","_ref$dotBorderColor","_ref$enableDotLabel","_ref$dotLabel","_ref$dotLabelYOffset","_ref$colors","_ref$fillOpacity","_ref$blendMode","_ref$isInteractive","_ref$sliceTooltip","_ref$legends","ariaLabel","ariaLabelledBy","ariaDescribedBy","_ref$defs","_ref$fill","forwardedRef","_useDimensions","useDimensions","innerWidth","innerHeight","outerWidth","outerHeight","_useRadar","useValueFormatter","degreesToRadians","getColor","useOrdinalColorScale","mapping","keyData","k","boundDefs","bindDefs","keyDatum","keyName","_useMemo2","allValues","concat","computedMaxValue","apply","min","scaleLinear","range","domain","centerX","centerY","useCurveInterpolation","customLayerProps","legendData","boundLegends","customData","legend","boundData","cd","find","ld","useRadar","layerById","slices","dots","includes","Fragment","BoxLegendSvg","containerWidth","containerHeight","SvgWrapper","ref","layer","_layerById$layer","Radar","forwardRef","_ref2$isInteractive","_ref2$animate","_ref2$motionConfig","renderWrapper","Container","ResponsiveRadar","defaultWidth","defaultHeight","onResize","debounceResize","ResponsiveWrapper"],"mappings":"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