solid-recharts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NEXT_SESSION_PROMPT.md +114 -0
- package/package.json +28 -0
- package/src/animation/AnimatedItems.tsx +169 -0
- package/src/animation/AnimationController.ts +24 -0
- package/src/animation/AnimationControllerImpl.ts +37 -0
- package/src/animation/AnimationHandle.ts +273 -0
- package/src/animation/CSSTransitionAnimate.tsx +142 -0
- package/src/animation/JavascriptAnimate.tsx +107 -0
- package/src/animation/easing.ts +261 -0
- package/src/animation/matchBy.ts +211 -0
- package/src/animation/timeoutController.ts +51 -0
- package/src/animation/useAnimationController.tsx +31 -0
- package/src/animation/useAnimationStartSnapshot.ts +73 -0
- package/src/animation/util.ts +16 -0
- package/src/cartesian/Area.tsx +810 -0
- package/src/cartesian/AreaRevealShape.tsx +250 -0
- package/src/cartesian/Bar.tsx +1216 -0
- package/src/cartesian/BarStack.tsx +148 -0
- package/src/cartesian/Brush.tsx +653 -0
- package/src/cartesian/CartesianAxis.tsx +541 -0
- package/src/cartesian/CartesianGrid.tsx +605 -0
- package/src/cartesian/ErrorBar.tsx +319 -0
- package/src/cartesian/Funnel.tsx +594 -0
- package/src/cartesian/GraphicalItemClipPath.tsx +75 -0
- package/src/cartesian/Line.tsx +742 -0
- package/src/cartesian/LineDrawShape.tsx +190 -0
- package/src/cartesian/ReferenceArea.tsx +275 -0
- package/src/cartesian/ReferenceDot.tsx +286 -0
- package/src/cartesian/ReferenceLine.tsx +414 -0
- package/src/cartesian/RenderedTicksReporter.tsx +49 -0
- package/src/cartesian/Scatter.tsx +741 -0
- package/src/cartesian/XAxis.tsx +293 -0
- package/src/cartesian/YAxis.tsx +333 -0
- package/src/cartesian/ZAxis.tsx +80 -0
- package/src/cartesian/getCartesianPosition.ts +255 -0
- package/src/cartesian/getEquidistantTicks.ts +126 -0
- package/src/cartesian/getTicks.ts +225 -0
- package/src/cartesian/useAnimatedLineLength.ts +84 -0
- package/src/chart/AreaChart.tsx +30 -0
- package/src/chart/BarChart.tsx +27 -0
- package/src/chart/CartesianChart.tsx +91 -0
- package/src/chart/CategoricalChart.tsx +60 -0
- package/src/chart/ComposedChart.tsx +29 -0
- package/src/chart/FunnelChart.tsx +29 -0
- package/src/chart/LineChart.tsx +29 -0
- package/src/chart/PieChart.tsx +41 -0
- package/src/chart/PolarChart.tsx +97 -0
- package/src/chart/RadarChart.tsx +37 -0
- package/src/chart/RadialBarChart.tsx +39 -0
- package/src/chart/RechartsWrapper.tsx +486 -0
- package/src/chart/Sankey.tsx +992 -0
- package/src/chart/ScatterChart.tsx +29 -0
- package/src/chart/SunburstChart.tsx +394 -0
- package/src/chart/Treemap.tsx +874 -0
- package/src/chart/types.ts +37 -0
- package/src/component/ActivePoints.tsx +136 -0
- package/src/component/Cell.tsx +72 -0
- package/src/component/Cursor.tsx +249 -0
- package/src/component/Customized.tsx +8 -0
- package/src/component/DefaultLegendContent.tsx +205 -0
- package/src/component/DefaultTooltipContent.tsx +247 -0
- package/src/component/Dots.tsx +128 -0
- package/src/component/Label.tsx +507 -0
- package/src/component/LabelList.tsx +270 -0
- package/src/component/Legend.tsx +273 -0
- package/src/component/ResponsiveContainer.tsx +397 -0
- package/src/component/Text.tsx +436 -0
- package/src/component/Tooltip.tsx +309 -0
- package/src/component/TooltipBoundingBox.tsx +152 -0
- package/src/component/responsiveContainerUtils.ts +128 -0
- package/src/container/ClipPathProvider.tsx +40 -0
- package/src/container/Layer.tsx +38 -0
- package/src/container/RootSurface.tsx +124 -0
- package/src/container/Surface.tsx +70 -0
- package/src/context/ErrorBarContext.tsx +85 -0
- package/src/context/PanoramaContext.tsx +13 -0
- package/src/context/RegisterGraphicalItemId.tsx +41 -0
- package/src/context/accessibilityContext.tsx +10 -0
- package/src/context/brushUpdateContext.ts +14 -0
- package/src/context/chartDataContext.tsx +79 -0
- package/src/context/chartLayoutContext.tsx +158 -0
- package/src/context/legendPayloadContext.ts +11 -0
- package/src/context/legendPortalContext.ts +11 -0
- package/src/context/tooltipContext.ts +72 -0
- package/src/context/tooltipPortalContext.ts +14 -0
- package/src/context/useTooltipAxis.ts +24 -0
- package/src/hooks.ts +312 -0
- package/src/index.ts +288 -0
- package/src/polar/Pie.tsx +912 -0
- package/src/polar/PolarAngleAxis.tsx +494 -0
- package/src/polar/PolarGrid.tsx +269 -0
- package/src/polar/PolarRadiusAxis.tsx +422 -0
- package/src/polar/Radar.tsx +652 -0
- package/src/polar/RadialBar.tsx +767 -0
- package/src/polar/defaultPolarAngleAxisProps.tsx +33 -0
- package/src/polar/defaultPolarRadiusAxisProps.tsx +28 -0
- package/src/shape/Cross.tsx +83 -0
- package/src/shape/Curve.tsx +335 -0
- package/src/shape/Dot.tsx +49 -0
- package/src/shape/Polygon.tsx +168 -0
- package/src/shape/Rectangle.tsx +301 -0
- package/src/shape/Sector.tsx +304 -0
- package/src/shape/Symbols.tsx +144 -0
- package/src/shape/Trapezoid.tsx +228 -0
- package/src/state/RechartsReduxContext.tsx +8 -0
- package/src/state/RechartsStoreContext.ts +15 -0
- package/src/state/RechartsStoreProvider.tsx +27 -0
- package/src/state/ReportChartProps.tsx +19 -0
- package/src/state/ReportEventSettings.tsx +19 -0
- package/src/state/ReportMainChartProps.tsx +35 -0
- package/src/state/ReportPolarOptions.tsx +28 -0
- package/src/state/SetLegendPayload.ts +50 -0
- package/src/state/SetTooltipEntrySettings.tsx +46 -0
- package/src/state/brushSlice.ts +60 -0
- package/src/state/cartesianAxisSlice.ts +288 -0
- package/src/state/chartDataSlice.ts +115 -0
- package/src/state/errorBarSlice.ts +84 -0
- package/src/state/eventSettingsSlice.ts +41 -0
- package/src/state/externalEventsMiddleware.ts +136 -0
- package/src/state/graphicalItemsSlice.ts +162 -0
- package/src/state/hooks.ts +42 -0
- package/src/state/keyboardEventsMiddleware.ts +213 -0
- package/src/state/layoutSlice.ts +71 -0
- package/src/state/legendSlice.ts +107 -0
- package/src/state/mouseEventsMiddleware.ts +103 -0
- package/src/state/optionsSlice.ts +64 -0
- package/src/state/polarAxisSlice.ts +65 -0
- package/src/state/polarOptionsSlice.ts +54 -0
- package/src/state/reduxDevtoolsJsonStringifyReplacer.ts +15 -0
- package/src/state/referenceElementsSlice.ts +121 -0
- package/src/state/renderedTicksSlice.ts +61 -0
- package/src/state/rootPropsSlice.ts +70 -0
- package/src/state/selectors/areaSelectors.ts +169 -0
- package/src/state/selectors/arrayEqualityCheck.ts +8 -0
- package/src/state/selectors/axisSelectors.ts +2196 -0
- package/src/state/selectors/barSelectors.ts +319 -0
- package/src/state/selectors/barStackSelectors.ts +79 -0
- package/src/state/selectors/brushSelectors.ts +40 -0
- package/src/state/selectors/combiners/combineActiveLabel.ts +21 -0
- package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +93 -0
- package/src/state/selectors/combiners/combineAllBarPositions.ts +131 -0
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +17 -0
- package/src/state/selectors/combiners/combineBarPosition.ts +24 -0
- package/src/state/selectors/combiners/combineBarSizeList.ts +75 -0
- package/src/state/selectors/combiners/combineCheckedDomain.ts +49 -0
- package/src/state/selectors/combiners/combineConfiguredScale.ts +121 -0
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +43 -0
- package/src/state/selectors/combiners/combineDisplayedStackedData.ts +50 -0
- package/src/state/selectors/combiners/combineInverseScaleFunction.ts +17 -0
- package/src/state/selectors/combiners/combineRealScaleType.ts +48 -0
- package/src/state/selectors/combiners/combineStackedData.ts +28 -0
- package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
- package/src/state/selectors/combiners/combineTooltipPayload.ts +203 -0
- package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +45 -0
- package/src/state/selectors/containerSelectors.ts +12 -0
- package/src/state/selectors/dataSelectors.ts +90 -0
- package/src/state/selectors/funnelSelectors.ts +83 -0
- package/src/state/selectors/graphicalItemSelectors.ts +23 -0
- package/src/state/selectors/legendSelectors.ts +29 -0
- package/src/state/selectors/lineSelectors.ts +111 -0
- package/src/state/selectors/numberDomainEqualityCheck.ts +8 -0
- package/src/state/selectors/pickAxisId.ts +6 -0
- package/src/state/selectors/pickAxisType.ts +4 -0
- package/src/state/selectors/pieSelectors.ts +103 -0
- package/src/state/selectors/polarAxisSelectors.ts +202 -0
- package/src/state/selectors/polarGridSelectors.ts +24 -0
- package/src/state/selectors/polarScaleSelectors.ts +149 -0
- package/src/state/selectors/polarSelectors.ts +211 -0
- package/src/state/selectors/radarSelectors.ts +152 -0
- package/src/state/selectors/radialBarSelectors.ts +328 -0
- package/src/state/selectors/rootPropsSelectors.ts +36 -0
- package/src/state/selectors/scatterSelectors.ts +77 -0
- package/src/state/selectors/selectAllAxes.ts +10 -0
- package/src/state/selectors/selectChartOffset.ts +15 -0
- package/src/state/selectors/selectChartOffsetInternal.ts +111 -0
- package/src/state/selectors/selectPlotArea.ts +27 -0
- package/src/state/selectors/selectTooltipAxisId.ts +6 -0
- package/src/state/selectors/selectTooltipAxisType.ts +33 -0
- package/src/state/selectors/selectTooltipEventType.ts +45 -0
- package/src/state/selectors/selectTooltipPayloadSearcher.ts +7 -0
- package/src/state/selectors/selectTooltipSettings.ts +6 -0
- package/src/state/selectors/selectTooltipState.ts +5 -0
- package/src/state/selectors/tooltipSelectors.ts +690 -0
- package/src/state/selectors/touchSelectors.ts +29 -0
- package/src/state/store.ts +167 -0
- package/src/state/tooltipSlice.ts +289 -0
- package/src/state/types/AreaSettings.ts +17 -0
- package/src/state/types/BarSettings.ts +16 -0
- package/src/state/types/LineSettings.ts +12 -0
- package/src/state/types/PieSettings.ts +32 -0
- package/src/state/types/RadarSettings.ts +6 -0
- package/src/state/types/RadialBarSettings.ts +10 -0
- package/src/state/types/ScatterSettings.ts +13 -0
- package/src/state/types/StackedGraphicalItem.ts +33 -0
- package/src/state/unregisterOnCleanup.ts +26 -0
- package/src/state/zIndexSlice.ts +128 -0
- package/src/synchronisation/syncRegistry.ts +131 -0
- package/src/synchronisation/syncSelectors.ts +7 -0
- package/src/synchronisation/types.ts +42 -0
- package/src/synchronisation/useChartSynchronisation.tsx +372 -0
- package/src/types.ts +39 -0
- package/src/util/ActiveShapeUtils.tsx +80 -0
- package/src/util/BarUtils.tsx +74 -0
- package/src/util/CartesianUtils.ts +53 -0
- package/src/util/ChartUtils.ts +696 -0
- package/src/util/Constants.ts +42 -0
- package/src/util/CssPrefixUtils.ts +24 -0
- package/src/util/DOMUtils.ts +141 -0
- package/src/util/DataUtils.ts +205 -0
- package/src/util/FunnelUtils.tsx +37 -0
- package/src/util/Global.ts +15 -0
- package/src/util/IfOverflow.ts +17 -0
- package/src/util/LRUCache.ts +46 -0
- package/src/util/LogUtils.ts +26 -0
- package/src/util/PolarUtils.ts +134 -0
- package/src/util/RadialBarUtils.tsx +35 -0
- package/src/util/ReduceCSSCalc.ts +186 -0
- package/src/util/ShallowEqual.ts +43 -0
- package/src/util/TickUtils.ts +61 -0
- package/src/util/YAxisUtils.ts +49 -0
- package/src/util/adaptEventHandlers.ts +69 -0
- package/src/util/axisPropsAreEqual.ts +42 -0
- package/src/util/collectionUtils.ts +83 -0
- package/src/util/createCartesianCharts.tsx +101 -0
- package/src/util/createEventProxy.ts +24 -0
- package/src/util/createPolarCharts.tsx +86 -0
- package/src/util/cursor/getCursorPoints.ts +48 -0
- package/src/util/cursor/getCursorRectangle.ts +31 -0
- package/src/util/cursor/getRadialCursorPoints.ts +34 -0
- package/src/util/excludeEventProps.ts +172 -0
- package/src/util/getActiveCoordinate.ts +205 -0
- package/src/util/getAxisTypeBasedOnLayout.ts +21 -0
- package/src/util/getEveryNth.ts +30 -0
- package/src/util/getRadiusAndStrokeWidthFromDot.ts +35 -0
- package/src/util/getRelativeCoordinate.ts +84 -0
- package/src/util/getSliced.ts +21 -0
- package/src/util/isDomainSpecifiedByUser.ts +217 -0
- package/src/util/isWellBehavedNumber.ts +10 -0
- package/src/util/objectPath.ts +129 -0
- package/src/util/payload/getUniqPayload.ts +31 -0
- package/src/util/propsAreEqual.ts +137 -0
- package/src/util/resolveDefaultProps.tsx +8 -0
- package/src/util/round.ts +35 -0
- package/src/util/scale/CartesianScaleHelper.ts +72 -0
- package/src/util/scale/CustomScaleDefinition.ts +82 -0
- package/src/util/scale/RechartsScale.ts +131 -0
- package/src/util/scale/createCategoricalInverse.ts +83 -0
- package/src/util/scale/getNiceTickValues.ts +334 -0
- package/src/util/scale/index.ts +3 -0
- package/src/util/scale/util/DecimalLite.ts +194 -0
- package/src/util/scale/util/arithmetic.ts +56 -0
- package/src/util/stacks/getStackSeriesIdentifier.ts +20 -0
- package/src/util/stacks/stackTypes.ts +53 -0
- package/src/util/svgPropertiesAndEvents.ts +84 -0
- package/src/util/svgPropertiesNoEvents.ts +520 -0
- package/src/util/tooltip/translate.ts +179 -0
- package/src/util/typedDataKey.ts +8 -0
- package/src/util/types.ts +724 -0
- package/src/util/useAnimationId.tsx +31 -0
- package/src/util/useElementOffset.ts +164 -0
- package/src/util/useId.ts +20 -0
- package/src/util/usePrefersReducedMotion.ts +44 -0
- package/src/util/useUniqueId.ts +34 -0
- package/src/zIndex/DefaultZIndexes.tsx +87 -0
- package/src/zIndex/ZIndexLayer.tsx +126 -0
- package/src/zIndex/ZIndexPortal.tsx +69 -0
- package/src/zIndex/getZIndexFromUnknown.tsx +17 -0
- package/src/zIndex/zIndexSelectors.ts +46 -0
- package/test/_data.ts +408 -0
- package/test/animation/AnimationController.typed.spec.ts +53 -0
- package/test/animation/AnimationControllerImpl.spec.ts +271 -0
- package/test/animation/CSSTransitionAnimate.timing.spec.tsx +473 -0
- package/test/animation/JavascriptAnimate.spec.tsx +62 -0
- package/test/animation/RechartsAnimation.spec.ts +636 -0
- package/test/animation/easing.spec.ts +218 -0
- package/test/animation/legacyAnimationLengthChange.spec.tsx +803 -0
- package/test/animation/matchBy.spec.ts +467 -0
- package/test/animation/mockAnimationController.ts +40 -0
- package/test/animation/mockControllerAnimationManager.ts +143 -0
- package/test/animation/mockTimeoutController.ts +114 -0
- package/test/animation/timeoutController.spec.ts +138 -0
- package/test/animation/useAnimationStartSnapshot.spec.ts +147 -0
- package/test/animation/util.spec.ts +28 -0
- package/test/cartesian/Area.animation.spec.tsx +363 -0
- package/test/cartesian/Area.range.spec.tsx +54 -0
- package/test/cartesian/Area.spec.tsx +1202 -0
- package/test/cartesian/Area.stacked.render.spec.tsx +69 -0
- package/test/cartesian/Area.typed.spec.tsx +209 -0
- package/test/cartesian/Axis.integration.spec.tsx +158 -0
- package/test/cartesian/Bar/Bar.csstransition.spec.tsx +299 -0
- package/test/cartesian/Bar/Bar.spec.tsx +2314 -0
- package/test/cartesian/Bar/Bar.typed.spec.tsx +192 -0
- package/test/cartesian/Bar.animation.spec.tsx +426 -0
- package/test/cartesian/Bar.stackDomain.spec.tsx +66 -0
- package/test/cartesian/Bar.stacked.render.spec.tsx +53 -0
- package/test/cartesian/Bar.truncateByDomain.spec.tsx +237 -0
- package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +336 -0
- package/test/cartesian/BarStack.spec.tsx +91 -0
- package/test/cartesian/Brush.keyboard.spec.tsx +88 -0
- package/test/cartesian/Brush.panorama.spec.tsx +41 -0
- package/test/cartesian/Brush.props.spec.tsx +63 -0
- package/test/cartesian/Brush.render.spec.tsx +117 -0
- package/test/cartesian/Brush.spec.tsx +522 -0
- package/test/cartesian/Brush.stacked.spec.tsx +221 -0
- package/test/cartesian/CartesianAxis.render.spec.tsx +50 -0
- package/test/cartesian/CartesianAxis.spec.tsx +396 -0
- package/test/cartesian/CartesianGrid.render.spec.tsx +39 -0
- package/test/cartesian/CartesianGrid.spec.tsx +2103 -0
- package/test/cartesian/ErrorBar.render.spec.tsx +69 -0
- package/test/cartesian/ErrorBar.spec.tsx +2414 -0
- package/test/cartesian/Funnel.animation.spec.tsx +241 -0
- package/test/cartesian/Funnel.spec.tsx +226 -0
- package/test/cartesian/Funnel.typed.spec.tsx +221 -0
- package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +627 -0
- package/test/cartesian/GraphicalItemClipPath.spec.tsx +427 -0
- package/test/cartesian/Line.animation.spec.tsx +643 -0
- package/test/cartesian/Line.sparseAnimationPath.spec.tsx +98 -0
- package/test/cartesian/Line.spec.tsx +471 -0
- package/test/cartesian/Line.typed.spec.tsx +152 -0
- package/test/cartesian/ReferenceArea.render.spec.tsx +63 -0
- package/test/cartesian/ReferenceArea.spec.tsx +663 -0
- package/test/cartesian/ReferenceArea.typed.spec.tsx +74 -0
- package/test/cartesian/ReferenceDot.render.spec.tsx +55 -0
- package/test/cartesian/ReferenceDot.spec.tsx +462 -0
- package/test/cartesian/ReferenceDot.typed.spec.tsx +76 -0
- package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +184 -0
- package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +744 -0
- package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +74 -0
- package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +399 -0
- package/test/cartesian/ReferenceLine.render.spec.tsx +134 -0
- package/test/cartesian/Scatter.animation.spec.tsx +381 -0
- package/test/cartesian/Scatter.render.spec.tsx +61 -0
- package/test/cartesian/Scatter.spec.tsx +406 -0
- package/test/cartesian/Scatter.typed.spec.tsx +153 -0
- package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +336 -0
- package/test/cartesian/XAxis/XAxis.brush.spec.tsx +266 -0
- package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +872 -0
- package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +86 -0
- package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +127 -0
- package/test/cartesian/XAxis/XAxis.hide.spec.tsx +106 -0
- package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +336 -0
- package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +1466 -0
- package/test/cartesian/XAxis/XAxis.padding.spec.tsx +758 -0
- package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +65 -0
- package/test/cartesian/XAxis/XAxis.state.spec.tsx +355 -0
- package/test/cartesian/XAxis/XAxis.tick.spec.tsx +493 -0
- package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +233 -0
- package/test/cartesian/XAxis/XAxis.type.spec.tsx +107 -0
- package/test/cartesian/XAxis/XAxis.typed.spec.tsx +102 -0
- package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +265 -0
- package/test/cartesian/XAxis.tickFormatter.spec.tsx +54 -0
- package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +230 -0
- package/test/cartesian/YAxis/YAxis.7362.spec.tsx +104 -0
- package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +88 -0
- package/test/cartesian/YAxis/YAxis.label.spec.tsx +219 -0
- package/test/cartesian/YAxis/YAxis.spec.tsx +1595 -0
- package/test/cartesian/YAxis/YAxis.tick.spec.tsx +428 -0
- package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +54 -0
- package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +263 -0
- package/test/cartesian/YAxis/YAxis.type.spec.tsx +107 -0
- package/test/cartesian/YAxis/YAxis.typed.spec.tsx +102 -0
- package/test/cartesian/ZAxis.spec.tsx +300 -0
- package/test/cartesian/ZAxis.typed.spec.tsx +33 -0
- package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +5 -0
- package/test/cartesian/axisLineAndStroke.spec.tsx +72 -0
- package/test/cartesian/getCartesianPosition.spec.ts +907 -0
- package/test/cartesian/getEquidistantTicks.spec.ts +88 -0
- package/test/cartesian/getTicks.spec.ts +378 -0
- package/test/cartesian/miscFeatureGaps.spec.tsx +89 -0
- package/test/cartesian/useAnimatedLineLength.spec.ts +168 -0
- package/test/chart/AccessibilityLayer.spec.tsx +569 -0
- package/test/chart/AccessibilityScans.spec.tsx +286 -0
- package/test/chart/AreaChart.spec.tsx +409 -0
- package/test/chart/AreaChart.stacked.spec.tsx +1407 -0
- package/test/chart/AreaChart.typed.spec.tsx +39 -0
- package/test/chart/BarChart.spec.tsx +3719 -0
- package/test/chart/BarChart.typed.spec.tsx +60 -0
- package/test/chart/CategoricalChart.spec.tsx +255 -0
- package/test/chart/ComposedChart.spec.tsx +199 -0
- package/test/chart/ComposedChart.typed.spec.tsx +39 -0
- package/test/chart/FunnelChart.spec.tsx +215 -0
- package/test/chart/FunnelChart.typed.spec.tsx +39 -0
- package/test/chart/LineChart.multiseries.spec.tsx +50 -0
- package/test/chart/LineChart.smoke.spec.tsx +50 -0
- package/test/chart/LineChart.spec.tsx +930 -0
- package/test/chart/LineChart.typed.spec.tsx +39 -0
- package/test/chart/NicheChartTooltip.spec.tsx +81 -0
- package/test/chart/PieChart.spec.tsx +793 -0
- package/test/chart/PieChart.typed.spec.tsx +39 -0
- package/test/chart/RadarChart.spec.tsx +530 -0
- package/test/chart/RadarChart.typed.spec.tsx +39 -0
- package/test/chart/RadialBarChart.5966.spec.tsx +48 -0
- package/test/chart/RadialBarChart.spec.tsx +679 -0
- package/test/chart/RadialBarChart.typed.spec.tsx +39 -0
- package/test/chart/RechartsWrapper.spec.tsx +83 -0
- package/test/chart/Sankey.content.spec.tsx +46 -0
- package/test/chart/Sankey.spec.tsx +952 -0
- package/test/chart/Sankey.typed.spec.tsx +29 -0
- package/test/chart/ScatterChart.spec.tsx +2613 -0
- package/test/chart/ScatterChart.typed.spec.tsx +39 -0
- package/test/chart/SunburstChart.spec.tsx +146 -0
- package/test/chart/Treemap.animation.spec.tsx +52 -0
- package/test/chart/Treemap.spec.tsx +1003 -0
- package/test/chart/Treemap.typed.spec.tsx +26 -0
- package/test/chart/chartEvents.spec.tsx +127 -0
- package/test/chart/responsive.spec.tsx +620 -0
- package/test/component/Cell.render.spec.tsx +155 -0
- package/test/component/Cell.spec.tsx +12 -0
- package/test/component/Cursor.spec.tsx +186 -0
- package/test/component/DefaultTooltipContent.spec.tsx +102 -0
- package/test/component/Label.render.spec.tsx +63 -0
- package/test/component/Label.spec.tsx +686 -0
- package/test/component/Label.typed.spec.tsx +46 -0
- package/test/component/LabelList.spec.tsx +188 -0
- package/test/component/Legend.itemSorter.spec.tsx +704 -0
- package/test/component/Legend.render.spec.tsx +92 -0
- package/test/component/Legend.spec.tsx +2213 -0
- package/test/component/Legend.typed.spec.tsx +22 -0
- package/test/component/ResponsiveContainer.spec.tsx +523 -0
- package/test/component/ResponsiveContainerDataTest.spec.tsx +51 -0
- package/test/component/Text.spec.tsx +415 -0
- package/test/component/Text.typed.spec.tsx +46 -0
- package/test/component/Tooltip/ActiveDot.spec.tsx +370 -0
- package/test/component/Tooltip/Tooltip.animation.spec.tsx +209 -0
- package/test/component/Tooltip/Tooltip.content.spec.tsx +128 -0
- package/test/component/Tooltip/Tooltip.formatter.spec.tsx +152 -0
- package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +79 -0
- package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +165 -0
- package/test/component/Tooltip/Tooltip.offset.spec.tsx +113 -0
- package/test/component/Tooltip/Tooltip.state.spec.tsx +74 -0
- package/test/component/Tooltip/Tooltip.sync.spec.tsx +639 -0
- package/test/component/Tooltip/defaultIndex.spec.tsx +227 -0
- package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +138 -0
- package/test/component/Tooltip/itemSorter.spec.tsx +2815 -0
- package/test/component/Tooltip/tooltipEventType.spec.tsx +344 -0
- package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +41 -0
- package/test/component/Tooltip/tooltipTestHelpers.tsx +162 -0
- package/test/component/Tooltip.defaultIndex.spec.tsx +48 -0
- package/test/component/Tooltip.hover.spec.tsx +61 -0
- package/test/component/Tooltip.item.spec.tsx +54 -0
- package/test/component/Tooltip.keyboard.spec.tsx +51 -0
- package/test/component/Tooltip.payload.spec.tsx +1716 -0
- package/test/component/Tooltip.touch.spec.tsx +39 -0
- package/test/component/Tooltip.visibility.spec.tsx +1889 -0
- package/test/component/TooltipBoundingBox.spec.tsx +89 -0
- package/test/component/responsiveContainerUtils.spec.ts +205 -0
- package/test/container/ClipPath.spec.tsx +602 -0
- package/test/container/chartDimensions.spec.tsx +368 -0
- package/test/context/chartLayoutContext.spec.tsx +378 -0
- package/test/helper/ExpectAxisDomain.tsx +27 -0
- package/test/helper/assertNotNull.ts +6 -0
- package/test/helper/assertZIndexLayerOrder.ts +19 -0
- package/test/helper/createSelectorTestCase.tsx +176 -0
- package/test/helper/expectAnimatedPieAngles.ts +100 -0
- package/test/helper/expectAnimatedPiePaths.ts +78 -0
- package/test/helper/expectAreaCurve.ts +15 -0
- package/test/helper/expectAxisTicks.ts +48 -0
- package/test/helper/expectBars.ts +54 -0
- package/test/helper/expectFunctionReturning.ts +58 -0
- package/test/helper/expectLabel.ts +32 -0
- package/test/helper/expectLastCalledWith.ts +48 -0
- package/test/helper/expectLine.ts +20 -0
- package/test/helper/expectPieSectors.ts +80 -0
- package/test/helper/expectScale.ts +37 -0
- package/test/helper/expectScatterPoints.ts +52 -0
- package/test/helper/expectStackGroups.ts +144 -0
- package/test/helper/mockAxes.ts +22 -0
- package/test/helper/mockGetBoundingClientRect.ts +66 -0
- package/test/helper/mockHTMLElementProperty.ts +19 -0
- package/test/helper/mockTouchingElement.ts +27 -0
- package/test/helper/offsetHelpers.ts +19 -0
- package/test/helper/parameterizedTestCases.tsx +99 -0
- package/test/helper/produceState.ts +32 -0
- package/test/helper/render.ts +7 -0
- package/test/helper/selectorTestHelpers.tsx +63 -0
- package/test/helper/trim.spec.ts +35 -0
- package/test/helper/trim.ts +11 -0
- package/test/hooks/useActiveTooltipDataPoints.spec.tsx +358 -0
- package/test/hooks/useAxisDomain.spec.tsx +361 -0
- package/test/hooks/useAxisScale.spec.tsx +283 -0
- package/test/hooks/useAxisTicks.spec.tsx +130 -0
- package/test/hooks/useOffset.spec.tsx +248 -0
- package/test/hooks/useTooltipStateHooks.spec.tsx +109 -0
- package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +135 -0
- package/test/polar/Pie/Pie.spec.tsx +784 -0
- package/test/polar/Pie/Pie.typed.spec.tsx +78 -0
- package/test/polar/Pie.animation.spec.tsx +529 -0
- package/test/polar/PieWithLegend.animation.spec.tsx +142 -0
- package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +76 -0
- package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +2079 -0
- package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +102 -0
- package/test/polar/PolarAngleAxis.render.spec.tsx +79 -0
- package/test/polar/PolarGrid.render.spec.tsx +75 -0
- package/test/polar/PolarGrid.spec.tsx +918 -0
- package/test/polar/PolarLegendPerRow.render.spec.tsx +85 -0
- package/test/polar/PolarRadiusAxis.events.spec.tsx +65 -0
- package/test/polar/PolarRadiusAxis.render.spec.tsx +52 -0
- package/test/polar/PolarRadiusAxis.spec.tsx +991 -0
- package/test/polar/PolarRadiusAxis.typed.spec.tsx +84 -0
- package/test/polar/PolarTooltipLegend.render.spec.tsx +80 -0
- package/test/polar/Radar.animation.spec.tsx +570 -0
- package/test/polar/Radar.render.spec.tsx +71 -0
- package/test/polar/Radar.spec.tsx +265 -0
- package/test/polar/Radar.typed.spec.tsx +119 -0
- package/test/polar/RadialBar/RadialBar.spec.tsx +1521 -0
- package/test/polar/RadialBar/RadialBar.typed.spec.tsx +132 -0
- package/test/polar/RadialBar.animation.spec.tsx +375 -0
- package/test/polar/RadialBar.render.spec.tsx +66 -0
- package/test/polar/RadialBar.stacked.spec.tsx +57 -0
- package/test/setup.ts +84 -0
- package/test/shape/ActiveShape.spec.tsx +181 -0
- package/test/shape/Cross.spec.tsx +60 -0
- package/test/shape/Cross.typed.spec.tsx +26 -0
- package/test/shape/Curve.spec.tsx +368 -0
- package/test/shape/Curve.typed.spec.tsx +69 -0
- package/test/shape/Dot.spec.tsx +73 -0
- package/test/shape/Dot.typed.spec.tsx +30 -0
- package/test/shape/Polygon.spec.tsx +357 -0
- package/test/shape/Polygon.typed.spec.tsx +28 -0
- package/test/shape/Rectangle.animation.spec.tsx +451 -0
- package/test/shape/Rectangle.spec.tsx +68 -0
- package/test/shape/Rectangle.typed.spec.tsx +24 -0
- package/test/shape/Sector.spec.tsx +76 -0
- package/test/shape/Sector.typed.spec.tsx +24 -0
- package/test/shape/Symbols.spec.tsx +43 -0
- package/test/shape/Symbols.typed.spec.tsx +24 -0
- package/test/shape/Trapezoid.spec.tsx +50 -0
- package/test/shape/Trapezoid.typed.spec.tsx +24 -0
- package/test/shape/__snapshots__/Cross.spec.tsx.snap +62 -0
- package/test/shape/__snapshots__/Curve.spec.tsx.snap +460 -0
- package/test/shape/__snapshots__/Polygon.spec.tsx.snap +58 -0
- package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +117 -0
- package/test/shape/__snapshots__/Sector.spec.tsx.snap +71 -0
- package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +64 -0
- package/test/state/chartDataSlice.spec.ts +53 -0
- package/test/state/externalEventsMiddleware.spec.ts +178 -0
- package/test/state/graphicalItemsSlice.spec.ts +92 -0
- package/test/state/hooks.spec.tsx +68 -0
- package/test/state/legendSlice.spec.ts +44 -0
- package/test/state/mouseEventsMiddleware.spec.ts +75 -0
- package/test/state/optionsSlice.spec.ts +19 -0
- package/test/state/reduxDevtoolsJsonStringifyReplacer.spec.ts +25 -0
- package/test/state/referenceElementsSlice.spec.ts +84 -0
- package/test/state/selectors/areaSelectors.spec.tsx +77 -0
- package/test/state/selectors/axisSelectors.spec.tsx +1418 -0
- package/test/state/selectors/barStackSelectors.spec.tsx +752 -0
- package/test/state/selectors/brushSelectors.spec.tsx +30 -0
- package/test/state/selectors/cartesianAxisSlice.spec.ts +96 -0
- package/test/state/selectors/combineNiceTicks.spec.ts +207 -0
- package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +61 -0
- package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +39 -0
- package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +56 -0
- package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +123 -0
- package/test/state/selectors/combiners/combineRealScaleType.spec.ts +80 -0
- package/test/state/selectors/containerSelectors.spec.tsx +168 -0
- package/test/state/selectors/dataSelectors.spec.tsx +136 -0
- package/test/state/selectors/legendSelectors.spec.tsx +113 -0
- package/test/state/selectors/lineSelectors.spec.tsx +60 -0
- package/test/state/selectors/pieSelectors.spec.tsx +72 -0
- package/test/state/selectors/radarSelectors.spec.tsx +496 -0
- package/test/state/selectors/rootPropsSelectors.spec.tsx +169 -0
- package/test/state/selectors/scatterSelectors.spec.tsx +47 -0
- package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +234 -0
- package/test/state/selectors/selectAllAxes.spec.tsx +18 -0
- package/test/state/selectors/selectAxisDomain.spec.tsx +21 -0
- package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +19 -0
- package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +22 -0
- package/test/state/selectors/selectAxisScale.spec.tsx +91 -0
- package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +503 -0
- package/test/state/selectors/selectBaseAxis.spec.tsx +56 -0
- package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +57 -0
- package/test/state/selectors/selectChartOffset.spec.tsx +26 -0
- package/test/state/selectors/selectDisplayedData.spec.tsx +282 -0
- package/test/state/selectors/selectIsTooltipActive.spec.tsx +231 -0
- package/test/state/selectors/selectNumericalDomain.spec.tsx +21 -0
- package/test/state/selectors/selectRealScaleType.spec.tsx +19 -0
- package/test/state/selectors/selectStackGroups.spec.tsx +322 -0
- package/test/state/selectors/selectXAxisPosition.spec.tsx +22 -0
- package/test/state/selectors/selectYAxisPosition.spec.tsx +22 -0
- package/test/state/selectors/selectors.spec.tsx +1613 -0
- package/test/state/throttling.spec.ts +200 -0
- package/test/state/zIndexSlice.spec.ts +85 -0
- package/test/synchronisation/useChartSynchronisation.spec.tsx +225 -0
- package/test/util/BarUtils.spec.ts +39 -0
- package/test/util/CartesianUtils/CartesianUtils.spec.ts +261 -0
- package/test/util/CartesianUtils/rectWithPoints.spec.ts +48 -0
- package/test/util/ChartUtils/ChartUtils.spec.ts +491 -0
- package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +136 -0
- package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +133 -0
- package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +83 -0
- package/test/util/ChartUtils/getStackedData.spec.ts +416 -0
- package/test/util/ChartUtils/truncateByDomain.spec.ts +70 -0
- package/test/util/DataUtils.spec.ts +385 -0
- package/test/util/DomUtils.spec.tsx +117 -0
- package/test/util/FunnelUtils.spec.tsx +70 -0
- package/test/util/Global.spec.ts +11 -0
- package/test/util/LRUCache.spec.ts +81 -0
- package/test/util/LogUtils.spec.ts +45 -0
- package/test/util/PolarUtils.spec.ts +66 -0
- package/test/util/ReduceCssCalcPrototype.spec.ts +141 -0
- package/test/util/ShallowEqual.spec.ts +102 -0
- package/test/util/TickUtils.spec.ts +29 -0
- package/test/util/axisPropsAreEqual.spec.ts +93 -0
- package/test/util/createChartHelpers.spec.tsx +210 -0
- package/test/util/cursor/getCursorPoints.spec.ts +136 -0
- package/test/util/cursor/getCursorRectangle.spec.ts +50 -0
- package/test/util/cursor/getRadialCursorPoints.spec.ts +36 -0
- package/test/util/errorValue.spec.ts +69 -0
- package/test/util/getEveryNth.spec.ts +39 -0
- package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +51 -0
- package/test/util/getRelativeCoordinate.spec.ts +250 -0
- package/test/util/getSliced.spec.ts +45 -0
- package/test/util/isDomainSpecifiedByUser.spec.ts +207 -0
- package/test/util/isWellBehavedNumber.spec.ts +54 -0
- package/test/util/payload/getUniqPayload.spec.ts +56 -0
- package/test/util/propsAreEqual.spec.ts +75 -0
- package/test/util/round.spec.ts +112 -0
- package/test/util/scale/arithmetic.spec.ts +61 -0
- package/test/util/scale/createCategoricalInverse.spec.ts +84 -0
- package/test/util/scale/getNiceTickValues.spec.ts +421 -0
- package/test/util/scale/getTickValuesFixedDomain.spec.ts +155 -0
- package/test/util/svgPropertiesAndEvents.spec.tsx +206 -0
- package/test/util/svgPropertiesNoEvents.spec.tsx +228 -0
- package/test/util/tooltip/translate.spec.ts +396 -0
- package/test/util/useAnimationId.spec.tsx +59 -0
- package/test/util/useElementOffset.spec.tsx +173 -0
- package/test/util/usePrefersReducedMotion.spec.ts +54 -0
- package/test/util/useUniqueId.spec.ts +99 -0
- package/test/utils/diagnostics-allowlist.ts +18 -0
- package/test/utils/diagnostics.ts +58 -0
- package/test/zIndex/AllZIndexPortals.spec.tsx +83 -0
- package/test/zIndex/DefaultZIndexes.spec.ts +80 -0
- package/test/zIndex/DynamicZIndex.spec.tsx +102 -0
- package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +125 -0
- package/test/zIndex/componentZIndex.spec.tsx +255 -0
- package/test/zIndex/getZIndexFromUnknown.spec.ts +51 -0
- package/test/zIndex/multiChartZIndexIsolation.spec.tsx +90 -0
- package/test/zIndex/zIndexSelectors.spec.ts +172 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1,767 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/polar/RadialBar.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// MINIMAL PORT — registers a RadialBarSettings polar item and renders one sector
|
|
4
|
+
// per data point via <RadialBarSector> (Shape→Sector). `computeRadialBarDataItems`
|
|
5
|
+
// is the pure sector-geometry function, ported faithfully for both the `radial`
|
|
6
|
+
// and `centric` layouts (incl. minPointSize + the background sector field).
|
|
7
|
+
//
|
|
8
|
+
// Solid deviations: `resolveDefaultProps`→`merge`; effect-dispatch registration
|
|
9
|
+
// → `createEffect`/`onCleanup` (addPolarGraphicalItem matched by id); the
|
|
10
|
+
// `@ts-expect-error` unknown-data spread → `toRecord` coercion. The layer class is
|
|
11
|
+
// `recharts-area` (a recharts quirk, kept for parity).
|
|
12
|
+
// Tooltip-entry + legend-payload registration are WIRED (the sectors are the
|
|
13
|
+
// per-item tooltip data; legend is a single entry — per-row legend deferred).
|
|
14
|
+
// Background rendering IS wired: one `.recharts-radial-bar-background-sector` per
|
|
15
|
+
// row with a computed background geometry, in a ZIndexLayer (default barBackground
|
|
16
|
+
// = -50, overridable via a numeric `zIndex` on the background prop); boolean /
|
|
17
|
+
// props-object / function-form backgrounds are all honored.
|
|
18
|
+
// zIndex relayering of the MAIN sectors IS wired too: the item content is wrapped
|
|
19
|
+
// in <ZIndexLayer> (default DefaultZIndexes.bar = 300), matching recharts.
|
|
20
|
+
// Labels ARE wired: a PolarLabelListContext of per-sector polar viewBoxes feeds
|
|
21
|
+
// <LabelListFromLabelProp>, so the implicit `label` prop (true / object / function)
|
|
22
|
+
// renders the curved recharts-radial-bar-label along each sector arc.
|
|
23
|
+
// activeShape IS wired (the active sector renders with activeShape via <Shape>'s
|
|
24
|
+
// `option`); the active index comes from the tooltip state (e.g. Tooltip
|
|
25
|
+
// defaultIndex), since per-sector hover dispatch is still gated on the deferred
|
|
26
|
+
// sector tooltipPosition. The full pointer/touch handler set is forwarded to each
|
|
27
|
+
// sector. The function-form custom `shape` render prop IS wired.
|
|
28
|
+
// STACKS are wired (the selector feeds this item's d3 stack series; sectors render
|
|
29
|
+
// from the truncated [start, end] stack tuple). DEFERRED (documented): animation
|
|
30
|
+
// (final frame), element-form shape, per-sector item-hover dispatch (sectors lack
|
|
31
|
+
// tooltipPosition).
|
|
32
|
+
// Cells ARE wired: a <Cell> child overrides the per-sector fill/stroke/class.
|
|
33
|
+
import { createEffect, createMemo, createSignal, For, merge, Show, untrack } from "solid-js";
|
|
34
|
+
import type { JSX } from "@solidjs/web";
|
|
35
|
+
import { useAppSelector, useAppStore } from "../state/hooks";
|
|
36
|
+
import { useUniqueId } from "../util/useUniqueId";
|
|
37
|
+
import { AnimatedItems, type AnimationInterpolateFn } from "../animation/AnimatedItems";
|
|
38
|
+
import { matchAppend, type AnimationMatchByProp } from "../animation/matchBy";
|
|
39
|
+
import type { MutableRef } from "../animation/useAnimationStartSnapshot";
|
|
40
|
+
import { usePolarChartLayout } from "../context/chartLayoutContext";
|
|
41
|
+
import type { EasingInput } from "../animation/easing";
|
|
42
|
+
import { Layer } from "../container/Layer";
|
|
43
|
+
import { type CellProps, collectCells } from "../component/Cell";
|
|
44
|
+
import {
|
|
45
|
+
type ImplicitLabelListType,
|
|
46
|
+
type PolarLabelListEntry,
|
|
47
|
+
PolarLabelListContextProvider,
|
|
48
|
+
LabelListFromLabelProp,
|
|
49
|
+
} from "../component/LabelList";
|
|
50
|
+
import {
|
|
51
|
+
useMouseClickItemDispatch,
|
|
52
|
+
useMouseEnterItemDispatch,
|
|
53
|
+
useMouseLeaveItemDispatch,
|
|
54
|
+
} from "../context/tooltipContext";
|
|
55
|
+
import { SetTooltipEntrySettings } from "../state/SetTooltipEntrySettings";
|
|
56
|
+
import type { Formatter } from "../component/DefaultTooltipContent";
|
|
57
|
+
import { SetLegendPayload } from "../state/SetLegendPayload";
|
|
58
|
+
import { TooltipPayloadConfiguration } from "../state/tooltipSlice";
|
|
59
|
+
import { SectorProps } from "../shape/Sector";
|
|
60
|
+
import {
|
|
61
|
+
ActiveShape,
|
|
62
|
+
AnimationDuration,
|
|
63
|
+
DataKey,
|
|
64
|
+
LayoutType,
|
|
65
|
+
LegendType,
|
|
66
|
+
PolarLayout,
|
|
67
|
+
PolarViewBoxRequired,
|
|
68
|
+
ShapeAnimationProps,
|
|
69
|
+
TickItem,
|
|
70
|
+
TooltipType,
|
|
71
|
+
} from "../util/types";
|
|
72
|
+
import { TooltipTriggerInfo } from "../context/tooltipContext";
|
|
73
|
+
import { parseCornerRadius, RadialBarSector, RadialBarSectorProps } from "../util/RadialBarUtils";
|
|
74
|
+
import { ZIndexLayer, type ZIndexable } from "../zIndex/ZIndexLayer";
|
|
75
|
+
import { DefaultZIndexes } from "../zIndex/DefaultZIndexes";
|
|
76
|
+
import { getZIndexFromUnknown } from "../zIndex/getZIndexFromUnknown";
|
|
77
|
+
import { svgPropertiesNoEventsFromUnknown } from "../util/svgPropertiesNoEvents";
|
|
78
|
+
import {
|
|
79
|
+
selectRadialBarLegendPayload,
|
|
80
|
+
selectRadialBarSectors,
|
|
81
|
+
} from "../state/selectors/radialBarSelectors";
|
|
82
|
+
import {
|
|
83
|
+
selectActiveTooltipDataKey,
|
|
84
|
+
selectActiveTooltipGraphicalItemId,
|
|
85
|
+
selectActiveTooltipIndex,
|
|
86
|
+
} from "../state/selectors/tooltipSelectors";
|
|
87
|
+
import { RadialBarSettings } from "../state/types/RadialBarSettings";
|
|
88
|
+
import { BaseAxisWithScale } from "../state/selectors/axisSelectors";
|
|
89
|
+
import { ChartData } from "../state/chartDataSlice";
|
|
90
|
+
import { AxisId } from "../state/cartesianAxisSlice";
|
|
91
|
+
import {
|
|
92
|
+
BarPositionPosition,
|
|
93
|
+
getCateCoordinateOfBar,
|
|
94
|
+
getTooltipNameProp,
|
|
95
|
+
getValueByDataKey,
|
|
96
|
+
} from "../util/ChartUtils";
|
|
97
|
+
import { interpolate, isNumber, mathSign } from "../util/DataUtils";
|
|
98
|
+
import type { StackSeries } from "../util/stacks/stackTypes";
|
|
99
|
+
import { unregisterOnCleanup } from "../state/unregisterOnCleanup";
|
|
100
|
+
|
|
101
|
+
export type RadialBarDataItem = SectorProps &
|
|
102
|
+
PolarViewBoxRequired &
|
|
103
|
+
TooltipTriggerInfo &
|
|
104
|
+
// v3.9: while animating, each sector carries the animation state so a custom-shape
|
|
105
|
+
// render prop can react to it (forwarded through RadialBarSector → Shape → shape fn).
|
|
106
|
+
ShapeAnimationProps & {
|
|
107
|
+
value?: unknown;
|
|
108
|
+
payload?: unknown;
|
|
109
|
+
background?: SectorProps;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/** Shape/activeShape are what RadialBarUtils consumes; the rest is the component surface. */
|
|
113
|
+
export interface RadialBarProps<DataPointType = Record<string, unknown>, DataValueType = unknown> {
|
|
114
|
+
/**
|
|
115
|
+
* If set a function, the function will be called to render a customized shape.
|
|
116
|
+
* During animations, the function shape also receives `animationElapsedTime`,
|
|
117
|
+
* `isAnimating`, and `isEntrance` (v3.9 {@link ShapeAnimationProps}). By default,
|
|
118
|
+
* renders a sector.
|
|
119
|
+
*/
|
|
120
|
+
shape?: ActiveShape<RadialBarSectorProps & ShapeAnimationProps, SVGPathElement>;
|
|
121
|
+
activeShape?: ActiveShape<RadialBarSectorProps, SVGPathElement>;
|
|
122
|
+
angleAxisId?: AxisId;
|
|
123
|
+
radiusAxisId?: AxisId;
|
|
124
|
+
dataKey?: DataKey<DataPointType, DataValueType>;
|
|
125
|
+
stackId?: string | number;
|
|
126
|
+
/** A background sector drawn behind each bar (recharts `background` prop):
|
|
127
|
+
* boolean / props-object (optionally carrying a `zIndex`) / function shape. */
|
|
128
|
+
background?: boolean | (SectorProps & ZIndexable);
|
|
129
|
+
/** Per-sector labels (via the polar LabelList). @defaultValue false */
|
|
130
|
+
label?: ImplicitLabelListType;
|
|
131
|
+
barSize?: number;
|
|
132
|
+
minPointSize?: number;
|
|
133
|
+
maxBarSize?: number;
|
|
134
|
+
cornerRadius?: string | number;
|
|
135
|
+
forceCornerRadius?: boolean;
|
|
136
|
+
cornerIsExternal?: boolean;
|
|
137
|
+
name?: string | number;
|
|
138
|
+
fill?: string;
|
|
139
|
+
fillOpacity?: number | string;
|
|
140
|
+
stroke?: string;
|
|
141
|
+
strokeWidth?: number | string;
|
|
142
|
+
legendType?: LegendType;
|
|
143
|
+
tooltipType?: TooltipType;
|
|
144
|
+
/** Formats this RadialBar's tooltip value; takes precedence over the Tooltip-level `formatter`. */
|
|
145
|
+
formatter?: Formatter;
|
|
146
|
+
hide?: boolean;
|
|
147
|
+
onAnimationStart?: () => void;
|
|
148
|
+
onAnimationEnd?: () => void;
|
|
149
|
+
isAnimationActive?: boolean | "auto";
|
|
150
|
+
animationBegin?: number;
|
|
151
|
+
animationDuration?: AnimationDuration;
|
|
152
|
+
animationEasing?: EasingInput;
|
|
153
|
+
/** Custom per-frame interpolation for the sectors (v3.9). */
|
|
154
|
+
animationInterpolateFn?: AnimationInterpolateFn<RadialBarDataItem, PolarLayout>;
|
|
155
|
+
/** How prev/next sectors are matched across data updates (v3.9). @defaultValue matchAppend */
|
|
156
|
+
animationMatchBy?: AnimationMatchByProp<RadialBarDataItem>;
|
|
157
|
+
/**
|
|
158
|
+
* Z-Index of this component and its children; the higher, the more on top.
|
|
159
|
+
* @defaultValue 300 (DefaultZIndexes.bar)
|
|
160
|
+
*/
|
|
161
|
+
zIndex?: number;
|
|
162
|
+
id?: string;
|
|
163
|
+
class?: string;
|
|
164
|
+
/** User pointer handlers, forwarded to each sector's wrapping <Layer>. */
|
|
165
|
+
onMouseEnter?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
|
|
166
|
+
onMouseLeave?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
|
|
167
|
+
onClick?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
|
|
168
|
+
onMouseDown?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
|
|
169
|
+
onMouseUp?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
|
|
170
|
+
onMouseMove?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
|
|
171
|
+
onMouseOver?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
|
|
172
|
+
onMouseOut?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
|
|
173
|
+
onTouchStart?: (data: RadialBarDataItem, index: number, event: TouchEvent) => void;
|
|
174
|
+
onTouchMove?: (data: RadialBarDataItem, index: number, event: TouchEvent) => void;
|
|
175
|
+
onTouchEnd?: (data: RadialBarDataItem, index: number, event: TouchEvent) => void;
|
|
176
|
+
/** <Cell> children supplying per-sector fill/stroke/class overrides. */
|
|
177
|
+
children?: JSX.Element;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Default per-frame interpolation for RadialBar sectors (the `animationInterpolateFn`
|
|
181
|
+
// the new AnimatedItems engine drives). Mirrors recharts 3.9
|
|
182
|
+
// `defaultRadialBarAnimateItems`: matched sectors tween startAngle/endAngle between
|
|
183
|
+
// prev/next; added sectors sweep endAngle from startAngle to final; removed sectors
|
|
184
|
+
// drop immediately. t=1 → final (removed dropped).
|
|
185
|
+
const defaultRadialBarAnimateItems: AnimationInterpolateFn<RadialBarDataItem, PolarLayout> = (
|
|
186
|
+
items,
|
|
187
|
+
animationElapsedTime,
|
|
188
|
+
) => {
|
|
189
|
+
if (items == null) return [];
|
|
190
|
+
if (animationElapsedTime === 1) {
|
|
191
|
+
return items.flatMap((item) => (item.status === "removed" ? [] : [item.next]));
|
|
192
|
+
}
|
|
193
|
+
return items.flatMap((item): RadialBarDataItem[] => {
|
|
194
|
+
if (item.status === "removed") return [];
|
|
195
|
+
if (item.status === "matched") {
|
|
196
|
+
return [
|
|
197
|
+
{
|
|
198
|
+
...item.next,
|
|
199
|
+
startAngle: interpolate(item.prev.startAngle, item.next.startAngle, animationElapsedTime),
|
|
200
|
+
endAngle: interpolate(item.prev.endAngle, item.next.endAngle, animationElapsedTime),
|
|
201
|
+
},
|
|
202
|
+
];
|
|
203
|
+
}
|
|
204
|
+
// added
|
|
205
|
+
return [
|
|
206
|
+
{
|
|
207
|
+
...item.next,
|
|
208
|
+
endAngle: interpolate(item.next.startAngle, item.next.endAngle, animationElapsedTime),
|
|
209
|
+
},
|
|
210
|
+
];
|
|
211
|
+
});
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
// Background sectors (recharts' RadialBarWithState.renderBackground): one
|
|
215
|
+
// `.recharts-radial-bar-background-sector` per data row that has a computed
|
|
216
|
+
// `background` geometry, rendered in a ZIndexLayer (default barBackground = -50,
|
|
217
|
+
// overridable via a `zIndex` on the background prop). A function/object-form
|
|
218
|
+
// `background` is honored via the sector's `option`.
|
|
219
|
+
function RadialBarBackground(props: {
|
|
220
|
+
sectors: ReadonlyArray<RadialBarDataItem>;
|
|
221
|
+
background: boolean | (SectorProps & ZIndexable);
|
|
222
|
+
cornerRadius: string | number | undefined;
|
|
223
|
+
}): JSX.Element {
|
|
224
|
+
const backgroundFromProps = (): SectorProps | undefined =>
|
|
225
|
+
typeof props.background === "object" && props.background != null ? props.background : undefined;
|
|
226
|
+
// SVG presentation props from the background prop, minus `class` (composed below).
|
|
227
|
+
const backgroundProps = (): Record<string, unknown> => {
|
|
228
|
+
const all = svgPropertiesNoEventsFromUnknown(props.background) ?? {};
|
|
229
|
+
const { class: _bgClass, ...rest } = all;
|
|
230
|
+
return rest;
|
|
231
|
+
};
|
|
232
|
+
const backgroundClass = (): string | undefined => {
|
|
233
|
+
const all = svgPropertiesNoEventsFromUnknown(props.background);
|
|
234
|
+
return typeof all?.class === "string" ? all.class : undefined;
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// Plain objects of DATA (not JSX) per row that carries a background geometry; the
|
|
238
|
+
// <For> below renders them so the ZIndexLayer Portal subtree stays stable.
|
|
239
|
+
const rows = createMemo<
|
|
240
|
+
ReadonlyArray<RadialBarSectorProps & { option: SectorProps | undefined }>
|
|
241
|
+
>(() =>
|
|
242
|
+
props.sectors.flatMap((entry, i) => {
|
|
243
|
+
const bg = entry.background;
|
|
244
|
+
if (!bg) {
|
|
245
|
+
return [];
|
|
246
|
+
}
|
|
247
|
+
const { value: _value, background: _bg, ...rest } = entry;
|
|
248
|
+
return [
|
|
249
|
+
{
|
|
250
|
+
...rest,
|
|
251
|
+
fill: "#eee",
|
|
252
|
+
...bg,
|
|
253
|
+
...backgroundProps(),
|
|
254
|
+
cornerRadius: parseCornerRadius(props.cornerRadius),
|
|
255
|
+
index: i,
|
|
256
|
+
option: backgroundFromProps(),
|
|
257
|
+
isActive: false,
|
|
258
|
+
class: ["recharts-radial-bar-background-sector", backgroundClass()]
|
|
259
|
+
.filter((c): c is string => typeof c === "string")
|
|
260
|
+
.join(" "),
|
|
261
|
+
},
|
|
262
|
+
];
|
|
263
|
+
}),
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
return (
|
|
267
|
+
<Show when={rows().length > 0}>
|
|
268
|
+
<ZIndexLayer zIndex={getZIndexFromUnknown(props.background, DefaultZIndexes.barBackground)}>
|
|
269
|
+
<Layer>
|
|
270
|
+
<For each={rows()}>{(row) => <RadialBarSector {...row} />}</For>
|
|
271
|
+
</Layer>
|
|
272
|
+
</ZIndexLayer>
|
|
273
|
+
</Show>
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// recharts calls truncateByDomain with a @ts-expect-error (the domain can be
|
|
278
|
+
// categorical and the stack tuple isn't a full SeriesPoint); the port mirrors
|
|
279
|
+
// truncateByDomain's clamping inline on the narrowed two-number domain and passes
|
|
280
|
+
// the tuple through untouched otherwise (truncateByDomain does the same).
|
|
281
|
+
function truncateStackedValue(
|
|
282
|
+
stackedValue: { 0: number; 1: number },
|
|
283
|
+
domain: ReadonlyArray<unknown> | null,
|
|
284
|
+
): ReadonlyArray<unknown> {
|
|
285
|
+
const result: [number, number] = [stackedValue[0], stackedValue[1]];
|
|
286
|
+
if (domain == null || domain.length !== 2 || !isNumber(domain[0]) || !isNumber(domain[1])) {
|
|
287
|
+
return result;
|
|
288
|
+
}
|
|
289
|
+
const minValue = Math.min(domain[0], domain[1]);
|
|
290
|
+
const maxValue = Math.max(domain[0], domain[1]);
|
|
291
|
+
if (!isNumber(result[0]) || result[0] < minValue) {
|
|
292
|
+
result[0] = minValue;
|
|
293
|
+
}
|
|
294
|
+
if (!isNumber(result[1]) || result[1] > maxValue) {
|
|
295
|
+
result[1] = maxValue;
|
|
296
|
+
}
|
|
297
|
+
if (result[0] > maxValue) {
|
|
298
|
+
result[0] = maxValue;
|
|
299
|
+
}
|
|
300
|
+
if (result[1] < minValue) {
|
|
301
|
+
result[1] = minValue;
|
|
302
|
+
}
|
|
303
|
+
return result;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export function computeRadialBarDataItems({
|
|
307
|
+
displayedData,
|
|
308
|
+
dataKey,
|
|
309
|
+
baseValue,
|
|
310
|
+
layout,
|
|
311
|
+
radiusAxis,
|
|
312
|
+
radiusAxisTicks,
|
|
313
|
+
bandSize,
|
|
314
|
+
pos,
|
|
315
|
+
angleAxis,
|
|
316
|
+
angleAxisTicks,
|
|
317
|
+
minPointSize,
|
|
318
|
+
cx,
|
|
319
|
+
cy,
|
|
320
|
+
startAngle: rootStartAngle,
|
|
321
|
+
endAngle: rootEndAngle,
|
|
322
|
+
cells,
|
|
323
|
+
stackedData,
|
|
324
|
+
stackedDomain,
|
|
325
|
+
dataStartIndex,
|
|
326
|
+
}: {
|
|
327
|
+
displayedData: ChartData;
|
|
328
|
+
/** This item's d3 stack series when it participates in a stackId group. */
|
|
329
|
+
stackedData: StackSeries | undefined;
|
|
330
|
+
dataStartIndex: number;
|
|
331
|
+
stackedDomain: ReadonlyArray<unknown> | null;
|
|
332
|
+
/** Per-sector <Cell> presentation props, indexed by data position. */
|
|
333
|
+
cells?: ReadonlyArray<CellProps> | undefined;
|
|
334
|
+
dataKey: DataKey<unknown> | undefined;
|
|
335
|
+
// recharts types this `number | unknown` (== `unknown`); the base value can be a
|
|
336
|
+
// number or a categorical value depending on the axis.
|
|
337
|
+
baseValue: unknown;
|
|
338
|
+
layout: LayoutType;
|
|
339
|
+
radiusAxis: BaseAxisWithScale;
|
|
340
|
+
radiusAxisTicks: ReadonlyArray<TickItem> | undefined;
|
|
341
|
+
bandSize: number;
|
|
342
|
+
pos: BarPositionPosition;
|
|
343
|
+
angleAxis: BaseAxisWithScale;
|
|
344
|
+
minPointSize: number;
|
|
345
|
+
cx: number;
|
|
346
|
+
cy: number;
|
|
347
|
+
angleAxisTicks: ReadonlyArray<TickItem> | undefined;
|
|
348
|
+
startAngle: number;
|
|
349
|
+
endAngle: number;
|
|
350
|
+
}): ReadonlyArray<RadialBarDataItem> {
|
|
351
|
+
if (angleAxisTicks == null || radiusAxisTicks == null) {
|
|
352
|
+
return [];
|
|
353
|
+
}
|
|
354
|
+
const angleTicks = angleAxisTicks;
|
|
355
|
+
const radiusTicks = radiusAxisTicks;
|
|
356
|
+
|
|
357
|
+
return displayedData.map((entry: unknown, index: number): RadialBarDataItem => {
|
|
358
|
+
const stackedValue = stackedData?.[dataStartIndex + index];
|
|
359
|
+
const raw: unknown = getValueByDataKey(entry, dataKey);
|
|
360
|
+
const value: ReadonlyArray<unknown> =
|
|
361
|
+
stackedValue != null
|
|
362
|
+
? truncateStackedValue(stackedValue, stackedDomain)
|
|
363
|
+
: Array.isArray(raw)
|
|
364
|
+
? raw
|
|
365
|
+
: [baseValue, raw];
|
|
366
|
+
|
|
367
|
+
let innerRadius: number | undefined;
|
|
368
|
+
let outerRadius: number | undefined;
|
|
369
|
+
let startAngle: number | undefined;
|
|
370
|
+
let endAngle: number | undefined;
|
|
371
|
+
let background: SectorProps | undefined;
|
|
372
|
+
|
|
373
|
+
if (layout === "radial") {
|
|
374
|
+
startAngle = angleAxis.scale.map(value[0]) ?? rootStartAngle;
|
|
375
|
+
endAngle = angleAxis.scale.map(value[1]) ?? rootEndAngle;
|
|
376
|
+
innerRadius =
|
|
377
|
+
getCateCoordinateOfBar({
|
|
378
|
+
axis: radiusAxis,
|
|
379
|
+
ticks: radiusTicks,
|
|
380
|
+
bandSize,
|
|
381
|
+
offset: pos.offset,
|
|
382
|
+
entry,
|
|
383
|
+
index,
|
|
384
|
+
}) ?? undefined;
|
|
385
|
+
if (innerRadius != null && endAngle != null && startAngle != null) {
|
|
386
|
+
outerRadius = innerRadius + pos.size;
|
|
387
|
+
const deltaAngle = endAngle - startAngle;
|
|
388
|
+
if (Math.abs(minPointSize) > 0 && Math.abs(deltaAngle) < Math.abs(minPointSize)) {
|
|
389
|
+
const delta =
|
|
390
|
+
mathSign(deltaAngle || minPointSize) * (Math.abs(minPointSize) - Math.abs(deltaAngle));
|
|
391
|
+
endAngle += delta;
|
|
392
|
+
}
|
|
393
|
+
background = {
|
|
394
|
+
cx,
|
|
395
|
+
cy,
|
|
396
|
+
innerRadius,
|
|
397
|
+
outerRadius,
|
|
398
|
+
startAngle: rootStartAngle,
|
|
399
|
+
endAngle: rootEndAngle,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
} else {
|
|
403
|
+
innerRadius = radiusAxis.scale.map(value[0]);
|
|
404
|
+
outerRadius = radiusAxis.scale.map(value[1]);
|
|
405
|
+
startAngle =
|
|
406
|
+
getCateCoordinateOfBar({
|
|
407
|
+
axis: angleAxis,
|
|
408
|
+
ticks: angleTicks,
|
|
409
|
+
bandSize,
|
|
410
|
+
offset: pos.offset,
|
|
411
|
+
entry,
|
|
412
|
+
index,
|
|
413
|
+
}) ?? undefined;
|
|
414
|
+
if (innerRadius != null && outerRadius != null && startAngle != null) {
|
|
415
|
+
endAngle = startAngle + pos.size;
|
|
416
|
+
const deltaRadius = outerRadius - innerRadius;
|
|
417
|
+
if (Math.abs(minPointSize) > 0 && Math.abs(deltaRadius) < Math.abs(minPointSize)) {
|
|
418
|
+
const delta =
|
|
419
|
+
mathSign(deltaRadius || minPointSize) *
|
|
420
|
+
(Math.abs(minPointSize) - Math.abs(deltaRadius));
|
|
421
|
+
outerRadius += delta;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// DEVIATION: recharts spreads `...entry` (the raw data row) into the item to
|
|
427
|
+
// carry arbitrary per-row props (e.g. data.fill) behind a @ts-expect-error.
|
|
428
|
+
// The minimal port drops that raw-data spread, but DOES honor <Cell> children:
|
|
429
|
+
// a cell's fill/stroke/class override the component props (per-row data
|
|
430
|
+
// presentation is still deferred). RadialBarDataItem requires numbers
|
|
431
|
+
// (PolarViewBoxRequired); recharts leaves these possibly-undefined and relies
|
|
432
|
+
// on Sector's `?? 0`, so coercing here is behavior-equivalent.
|
|
433
|
+
const cell = cells?.[index];
|
|
434
|
+
const cellClass = typeof cell?.class === "string" ? cell.class : undefined;
|
|
435
|
+
const rowFields =
|
|
436
|
+
typeof entry === "object" && entry != null && !Array.isArray(entry) ? entry : {};
|
|
437
|
+
return {
|
|
438
|
+
...rowFields,
|
|
439
|
+
...(background != null ? { background } : {}),
|
|
440
|
+
...(cell != null ? { fill: cell.fill, stroke: cell.stroke, class: cellClass } : {}),
|
|
441
|
+
payload: entry,
|
|
442
|
+
// recharts: a stacked item reports the [start, end] tuple, a plain one the value.
|
|
443
|
+
value: stackedValue != null ? value : value[1],
|
|
444
|
+
cx,
|
|
445
|
+
cy,
|
|
446
|
+
innerRadius: innerRadius ?? 0,
|
|
447
|
+
outerRadius: outerRadius ?? 0,
|
|
448
|
+
startAngle: startAngle ?? 0,
|
|
449
|
+
endAngle: endAngle ?? 0,
|
|
450
|
+
// Required by PolarViewBoxRequired; recharts gets it via the `any` data
|
|
451
|
+
// spread. Sector ignores it (path uses start/end angles), so false is inert.
|
|
452
|
+
clockWise: false,
|
|
453
|
+
};
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
export const radialBarDefaultProps = {
|
|
458
|
+
angleAxisId: 0,
|
|
459
|
+
radiusAxisId: 0,
|
|
460
|
+
cornerRadius: 0,
|
|
461
|
+
cornerIsExternal: false,
|
|
462
|
+
forceCornerRadius: false,
|
|
463
|
+
hide: false,
|
|
464
|
+
isAnimationActive: "auto",
|
|
465
|
+
animationBegin: 0,
|
|
466
|
+
animationDuration: 1500,
|
|
467
|
+
animationEasing: "ease",
|
|
468
|
+
animationInterpolateFn: defaultRadialBarAnimateItems,
|
|
469
|
+
animationMatchBy: matchAppend,
|
|
470
|
+
legendType: "rect",
|
|
471
|
+
minPointSize: 0,
|
|
472
|
+
label: false,
|
|
473
|
+
zIndex: DefaultZIndexes.bar,
|
|
474
|
+
} as const satisfies Partial<RadialBarProps>;
|
|
475
|
+
|
|
476
|
+
export function RadialBar<DataPointType = Record<string, unknown>, DataValueType = unknown>(
|
|
477
|
+
props: RadialBarProps<DataPointType, DataValueType>,
|
|
478
|
+
): JSX.Element {
|
|
479
|
+
const store = useAppStore();
|
|
480
|
+
const merged = merge(radialBarDefaultProps, props);
|
|
481
|
+
const id = useUniqueId("recharts-radial-bar", props.id);
|
|
482
|
+
|
|
483
|
+
const settings = (): RadialBarSettings => ({
|
|
484
|
+
id,
|
|
485
|
+
type: "radialBar",
|
|
486
|
+
data: undefined,
|
|
487
|
+
dataKey: merged.dataKey,
|
|
488
|
+
hide: merged.hide,
|
|
489
|
+
angleAxisId: merged.angleAxisId,
|
|
490
|
+
radiusAxisId: merged.radiusAxisId,
|
|
491
|
+
stackId: merged.stackId == null ? undefined : String(merged.stackId),
|
|
492
|
+
barSize: merged.barSize,
|
|
493
|
+
minPointSize: merged.minPointSize,
|
|
494
|
+
maxBarSize: merged.maxBarSize,
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
let prev: RadialBarSettings | null = null;
|
|
498
|
+
|
|
499
|
+
createEffect(
|
|
500
|
+
(): RadialBarSettings => settings(),
|
|
501
|
+
(s) => {
|
|
502
|
+
if (store == null) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
if (prev === null) {
|
|
506
|
+
store.actions.graphicalItems.addPolarGraphicalItem(s);
|
|
507
|
+
} else if (prev !== s) {
|
|
508
|
+
store.actions.graphicalItems.replacePolarGraphicalItem({ prev, next: s });
|
|
509
|
+
}
|
|
510
|
+
prev = s;
|
|
511
|
+
},
|
|
512
|
+
);
|
|
513
|
+
|
|
514
|
+
unregisterOnCleanup(() => {
|
|
515
|
+
if (prev && store != null) {
|
|
516
|
+
store.actions.graphicalItems.removePolarGraphicalItem(prev);
|
|
517
|
+
prev = null;
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
// Per-sector <Cell> overrides (collected from children, in data order).
|
|
522
|
+
const cells = collectCells(() => props.children);
|
|
523
|
+
const sectors = useAppSelector((state) =>
|
|
524
|
+
selectRadialBarSectors(state, merged.radiusAxisId, merged.angleAxisId, settings(), cells()),
|
|
525
|
+
);
|
|
526
|
+
|
|
527
|
+
const visibleSectors = (): ReadonlyArray<RadialBarDataItem> | null => {
|
|
528
|
+
const s = sectors();
|
|
529
|
+
return !merged.hide && s != null && s.length > 0 ? s : null;
|
|
530
|
+
};
|
|
531
|
+
|
|
532
|
+
const cornerRadius = (): number | undefined =>
|
|
533
|
+
typeof merged.cornerRadius === "string"
|
|
534
|
+
? parseInt(merged.cornerRadius, 10)
|
|
535
|
+
: merged.cornerRadius;
|
|
536
|
+
|
|
537
|
+
// recharts uses "recharts-area" as the radial-bar layer class (a quirk).
|
|
538
|
+
const layerClass = (): string =>
|
|
539
|
+
["recharts-area", merged.class].filter((c): c is string => Boolean(c)).join(" ");
|
|
540
|
+
|
|
541
|
+
// Tooltip entry: the sectors themselves are the per-item data (the searcher
|
|
542
|
+
// resolves the value via dataKey). NOTE: the minimal port drops the raw-data
|
|
543
|
+
// spread, so per-sector value resolution by dataKey is limited until that lands.
|
|
544
|
+
const tooltipConfig = createMemo<TooltipPayloadConfiguration>(() => ({
|
|
545
|
+
dataDefinedOnItem: sectors(),
|
|
546
|
+
getPosition: () => undefined,
|
|
547
|
+
settings: {
|
|
548
|
+
graphicalItemId: id,
|
|
549
|
+
stroke: merged.stroke,
|
|
550
|
+
strokeWidth: merged.strokeWidth,
|
|
551
|
+
fill: merged.fill,
|
|
552
|
+
nameKey: undefined,
|
|
553
|
+
dataKey: merged.dataKey,
|
|
554
|
+
name: getTooltipNameProp(merged.name, merged.dataKey),
|
|
555
|
+
hide: merged.hide,
|
|
556
|
+
type: merged.tooltipType,
|
|
557
|
+
color: merged.fill,
|
|
558
|
+
unit: "",
|
|
559
|
+
formatter: merged.formatter,
|
|
560
|
+
},
|
|
561
|
+
}));
|
|
562
|
+
|
|
563
|
+
// One legend entry per data row (recharts' selectRadialBarLegendPayload) —
|
|
564
|
+
// value/color come from each row's `name`/`fill`.
|
|
565
|
+
const legendPayload = useAppSelector((state) =>
|
|
566
|
+
selectRadialBarLegendPayload(state, merged.legendType),
|
|
567
|
+
);
|
|
568
|
+
|
|
569
|
+
const polarLayout = usePolarChartLayout();
|
|
570
|
+
// Holds the latest visible sectors frame so a re-animation (data change) tweens
|
|
571
|
+
// from where the sectors currently are. Managed by AnimatedItems via
|
|
572
|
+
// useAnimationStartSnapshot.
|
|
573
|
+
const previousSectorsRef: MutableRef<ReadonlyArray<RadialBarDataItem> | null | undefined> = {
|
|
574
|
+
current: null,
|
|
575
|
+
};
|
|
576
|
+
// Labels are hidden while the sectors animate (recharts' showLabels={!isAnimating}).
|
|
577
|
+
// ownedWrite: handleAnimationEnd also fires from the animation effect cleanup when a
|
|
578
|
+
// mid-animation chart is disposed (route/soft navigation) — a legal teardown write.
|
|
579
|
+
const [showLabels, setShowLabels] = createSignal(true, { ownedWrite: true });
|
|
580
|
+
const handleAnimationStart = (): void => {
|
|
581
|
+
props.onAnimationStart?.();
|
|
582
|
+
setShowLabels(false);
|
|
583
|
+
};
|
|
584
|
+
const handleAnimationEnd = (): void => {
|
|
585
|
+
props.onAnimationEnd?.();
|
|
586
|
+
setShowLabels(true);
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
// User pointer handlers are forwarded to each sector's wrapping <Layer>: the
|
|
590
|
+
// mouse handlers wrap into the tooltip-item dispatch (called props-first), and
|
|
591
|
+
// the touch handlers are plain per-sector callbacks. mouseenter does NOT bubble,
|
|
592
|
+
// so the handler must sit on the same element the pointer enters — here the g.
|
|
593
|
+
// Getter args: the hooks read handler/dataKey at event time (fresh, never stale).
|
|
594
|
+
const onItemEnter = useMouseEnterItemDispatch<RadialBarDataItem>(
|
|
595
|
+
() => props.onMouseEnter,
|
|
596
|
+
() => merged.dataKey,
|
|
597
|
+
id,
|
|
598
|
+
);
|
|
599
|
+
const onItemLeave = useMouseLeaveItemDispatch<RadialBarDataItem>(() => props.onMouseLeave);
|
|
600
|
+
const onItemClick = useMouseClickItemDispatch<RadialBarDataItem>(
|
|
601
|
+
() => props.onClick,
|
|
602
|
+
() => merged.dataKey,
|
|
603
|
+
id,
|
|
604
|
+
);
|
|
605
|
+
|
|
606
|
+
// Plain props-first pointer/touch callbacks (no tooltip dispatch — only
|
|
607
|
+
// enter/leave/click drive the active tooltip). Each binds (entry, index).
|
|
608
|
+
const onItemMouse =
|
|
609
|
+
(handler: ((d: RadialBarDataItem, i: number, e: MouseEvent) => void) | undefined) =>
|
|
610
|
+
(entry: RadialBarDataItem, index: number) =>
|
|
611
|
+
(event: MouseEvent): void => {
|
|
612
|
+
handler?.(entry, index, event);
|
|
613
|
+
};
|
|
614
|
+
const onItemMouseDown = onItemMouse(props.onMouseDown);
|
|
615
|
+
const onItemMouseUp = onItemMouse(props.onMouseUp);
|
|
616
|
+
const onItemMouseMove = onItemMouse(props.onMouseMove);
|
|
617
|
+
const onItemMouseOver = onItemMouse(props.onMouseOver);
|
|
618
|
+
const onItemMouseOut = onItemMouse(props.onMouseOut);
|
|
619
|
+
|
|
620
|
+
const onItemTouchStart =
|
|
621
|
+
(entry: RadialBarDataItem, index: number) =>
|
|
622
|
+
(event: TouchEvent): void => {
|
|
623
|
+
props.onTouchStart?.(entry, index, event);
|
|
624
|
+
};
|
|
625
|
+
const onItemTouchMove =
|
|
626
|
+
(entry: RadialBarDataItem, index: number) =>
|
|
627
|
+
(event: TouchEvent): void => {
|
|
628
|
+
props.onTouchMove?.(entry, index, event);
|
|
629
|
+
};
|
|
630
|
+
const onItemTouchEnd =
|
|
631
|
+
(entry: RadialBarDataItem, index: number) =>
|
|
632
|
+
(event: TouchEvent): void => {
|
|
633
|
+
props.onTouchEnd?.(entry, index, event);
|
|
634
|
+
};
|
|
635
|
+
|
|
636
|
+
// Active-sector tracking drives `activeShape` (the hovered sector renders with
|
|
637
|
+
// the activeShape option instead of the regular shape). Matches Pie's pattern.
|
|
638
|
+
const activeIndex = useAppSelector(selectActiveTooltipIndex);
|
|
639
|
+
const activeDataKey = useAppSelector(selectActiveTooltipDataKey);
|
|
640
|
+
const activeGraphicalItemId = useAppSelector(selectActiveTooltipGraphicalItemId);
|
|
641
|
+
const isSectorActive = (index: number): boolean =>
|
|
642
|
+
String(index) === activeIndex() &&
|
|
643
|
+
(activeDataKey() == null || merged.dataKey === activeDataKey()) &&
|
|
644
|
+
(activeGraphicalItemId() == null || activeGraphicalItemId() === id);
|
|
645
|
+
// recharts: `isActive = Boolean(activeShape && activeIndex === String(i))` — the
|
|
646
|
+
// active-shape wrapper (`.recharts-active-shape`) is gated on `activeShape` being
|
|
647
|
+
// truthy, so a falsy `activeShape={false}` never marks a sector active.
|
|
648
|
+
const isSectorActiveShape = (index: number): boolean =>
|
|
649
|
+
Boolean(merged.activeShape) && isSectorActive(index);
|
|
650
|
+
const sectorOption = (index: number): RadialBarProps["shape"] =>
|
|
651
|
+
isSectorActive(index) && merged.activeShape != null ? merged.activeShape : merged.shape;
|
|
652
|
+
|
|
653
|
+
return (
|
|
654
|
+
<>
|
|
655
|
+
<SetTooltipEntrySettings tooltipEntrySettings={tooltipConfig()} />
|
|
656
|
+
<SetLegendPayload id={id} legendPayload={legendPayload() ?? []} />
|
|
657
|
+
<Show when={visibleSectors()}>
|
|
658
|
+
{(secs) => (
|
|
659
|
+
// Wrapped in <ZIndexLayer> (default 300) so a `zIndex` prop relayers the
|
|
660
|
+
// whole radial-bar item into its portal — recharts wraps the entire
|
|
661
|
+
// `.recharts-area` Layer in ZIndexLayer. The background keeps its own
|
|
662
|
+
// nested ZIndexLayer (barBackground = -50), re-portaling below the bars.
|
|
663
|
+
// The stable `.recharts-area` Layer must be the ZIndexLayer's SINGLE DOM
|
|
664
|
+
// child: a Portal whose mount receives multiple dynamic siblings (the
|
|
665
|
+
// background/sectors/labels) directly APPENDS them instead of reconciling
|
|
666
|
+
// (frames accumulate), so — like Pie's `.recharts-pie` — one stable <g>
|
|
667
|
+
// wraps everything (this is also exactly recharts' `.recharts-area` wrap).
|
|
668
|
+
<ZIndexLayer zIndex={merged.zIndex}>
|
|
669
|
+
<Layer class={layerClass()}>
|
|
670
|
+
<PolarLabelListContextProvider
|
|
671
|
+
value={() =>
|
|
672
|
+
showLabels()
|
|
673
|
+
? secs().map(
|
|
674
|
+
(sector): PolarLabelListEntry => ({
|
|
675
|
+
value: sector.value,
|
|
676
|
+
payload: sector.payload,
|
|
677
|
+
parentViewBox: undefined,
|
|
678
|
+
fill: typeof sector.fill === "string" ? sector.fill : undefined,
|
|
679
|
+
viewBox: {
|
|
680
|
+
cx: sector.cx,
|
|
681
|
+
cy: sector.cy,
|
|
682
|
+
innerRadius: sector.innerRadius,
|
|
683
|
+
outerRadius: sector.outerRadius,
|
|
684
|
+
startAngle: sector.startAngle,
|
|
685
|
+
endAngle: sector.endAngle,
|
|
686
|
+
clockWise: false,
|
|
687
|
+
},
|
|
688
|
+
}),
|
|
689
|
+
)
|
|
690
|
+
: undefined
|
|
691
|
+
}
|
|
692
|
+
>
|
|
693
|
+
<Show when={merged.background}>
|
|
694
|
+
{(bg) => (
|
|
695
|
+
<RadialBarBackground
|
|
696
|
+
sectors={secs()}
|
|
697
|
+
background={bg()}
|
|
698
|
+
cornerRadius={merged.cornerRadius}
|
|
699
|
+
/>
|
|
700
|
+
)}
|
|
701
|
+
</Show>
|
|
702
|
+
{/* Sector enter/update animation via the new v3.9 engine: matched sectors
|
|
703
|
+
tween start/end angle from prev to next, added sectors sweep endAngle
|
|
704
|
+
from startAngle to final. isAnimationActive=false → t=1 → final sectors
|
|
705
|
+
→ byte-identical to the static render. polarLayout is read untracked for
|
|
706
|
+
the AnimatedItems layout prop (mirrors Pie): the outer Show already gates
|
|
707
|
+
on visible sectors, so the layout is always defined here. */}
|
|
708
|
+
<AnimatedItems
|
|
709
|
+
animationInput={secs()}
|
|
710
|
+
animationIdPrefix="recharts-radialbar-"
|
|
711
|
+
items={secs()}
|
|
712
|
+
previousItemsRef={previousSectorsRef}
|
|
713
|
+
isAnimationActive={merged.isAnimationActive}
|
|
714
|
+
animationBegin={merged.animationBegin}
|
|
715
|
+
animationDuration={merged.animationDuration}
|
|
716
|
+
animationEasing={merged.animationEasing}
|
|
717
|
+
onAnimationStart={handleAnimationStart}
|
|
718
|
+
onAnimationEnd={handleAnimationEnd}
|
|
719
|
+
animationInterpolateFn={merged.animationInterpolateFn}
|
|
720
|
+
animationMatchBy={merged.animationMatchBy}
|
|
721
|
+
layout={untrack(() => polarLayout()) ?? "centric"}
|
|
722
|
+
>
|
|
723
|
+
{(frame, animationElapsedTime, isEntrance) => (
|
|
724
|
+
<Layer class="recharts-radial-bar-sectors">
|
|
725
|
+
<For each={frame}>
|
|
726
|
+
{(entry, i) => (
|
|
727
|
+
<RadialBarSector
|
|
728
|
+
{...entry}
|
|
729
|
+
index={i()}
|
|
730
|
+
isActive={isSectorActiveShape(i())}
|
|
731
|
+
option={sectorOption(i())}
|
|
732
|
+
animationElapsedTime={animationElapsedTime}
|
|
733
|
+
isAnimating={!showLabels() || animationElapsedTime < 1}
|
|
734
|
+
isEntrance={isEntrance}
|
|
735
|
+
class={`recharts-radial-bar-sector ${entry.class ?? ""}`}
|
|
736
|
+
fill={entry.fill ?? merged.fill}
|
|
737
|
+
stroke={entry.stroke ?? merged.stroke}
|
|
738
|
+
strokeWidth={entry.strokeWidth ?? merged.strokeWidth}
|
|
739
|
+
cornerRadius={cornerRadius()}
|
|
740
|
+
forceCornerRadius={merged.forceCornerRadius}
|
|
741
|
+
cornerIsExternal={merged.cornerIsExternal}
|
|
742
|
+
onMouseEnter={onItemEnter(entry, i())}
|
|
743
|
+
onMouseLeave={onItemLeave(entry, i())}
|
|
744
|
+
onClick={onItemClick(entry, i())}
|
|
745
|
+
onMouseDown={onItemMouseDown(entry, i())}
|
|
746
|
+
onMouseUp={onItemMouseUp(entry, i())}
|
|
747
|
+
onMouseMove={onItemMouseMove(entry, i())}
|
|
748
|
+
onMouseOver={onItemMouseOver(entry, i())}
|
|
749
|
+
onMouseOut={onItemMouseOut(entry, i())}
|
|
750
|
+
onTouchStart={onItemTouchStart(entry, i())}
|
|
751
|
+
onTouchMove={onItemTouchMove(entry, i())}
|
|
752
|
+
onTouchEnd={onItemTouchEnd(entry, i())}
|
|
753
|
+
/>
|
|
754
|
+
)}
|
|
755
|
+
</For>
|
|
756
|
+
</Layer>
|
|
757
|
+
)}
|
|
758
|
+
</AnimatedItems>
|
|
759
|
+
<LabelListFromLabelProp label={merged.label} />
|
|
760
|
+
</PolarLabelListContextProvider>
|
|
761
|
+
</Layer>
|
|
762
|
+
</ZIndexLayer>
|
|
763
|
+
)}
|
|
764
|
+
</Show>
|
|
765
|
+
</>
|
|
766
|
+
);
|
|
767
|
+
}
|