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,84 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/getRelativeCoordinate.ts (commit 7a23854).
|
|
2
|
+
// Pure function — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
RelativePointer,
|
|
6
|
+
MousePointer,
|
|
7
|
+
SVGMousePointer,
|
|
8
|
+
SVGTouchPointer,
|
|
9
|
+
TouchPointer,
|
|
10
|
+
} from "./types";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Type guard to check if the pointer event is from an SVG element.
|
|
14
|
+
*/
|
|
15
|
+
function isSvgPointer(
|
|
16
|
+
pointer: MousePointer | TouchPointer,
|
|
17
|
+
): pointer is SVGMousePointer | SVGTouchPointer {
|
|
18
|
+
return "getBBox" in pointer.currentTarget && typeof pointer.currentTarget.getBBox === "function";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Computes relative element coordinates from mouse or touch event.
|
|
23
|
+
*
|
|
24
|
+
* The output coordinates are relative to the top-left corner of the active element (= currentTarget),
|
|
25
|
+
* where the top-left corner is (0, 0).
|
|
26
|
+
* Moving right, the x-coordinate increases, and moving down, the y-coordinate increases.
|
|
27
|
+
*
|
|
28
|
+
* The coordinates are rounded to the nearest integer and account for CSS transform scale.
|
|
29
|
+
* So element that's scaled will return the same coordinates as element that's not scaled.
|
|
30
|
+
*
|
|
31
|
+
* In other words: you zoom in or out, numbers stay the same.
|
|
32
|
+
*
|
|
33
|
+
* This function works with both HTML elements and SVG elements.
|
|
34
|
+
*
|
|
35
|
+
* It works with both Mouse and Touch events.
|
|
36
|
+
* For Touch events, it returns an array of coordinates, one for each touch point.
|
|
37
|
+
* For Mouse events, it returns a single coordinate object.
|
|
38
|
+
*
|
|
39
|
+
* @since 3.8
|
|
40
|
+
* @param event The mouse or touch event from event handlers (works with both HTML and SVG elements)
|
|
41
|
+
* @returns Coordinates relative to the top-left corner of the element. Single object for Mouse events, array of objects for Touch events.
|
|
42
|
+
*/
|
|
43
|
+
export function getRelativeCoordinate(event: MousePointer): RelativePointer;
|
|
44
|
+
export function getRelativeCoordinate(event: TouchPointer): Array<RelativePointer>;
|
|
45
|
+
export function getRelativeCoordinate(
|
|
46
|
+
event: MousePointer | TouchPointer,
|
|
47
|
+
): RelativePointer | Array<RelativePointer> {
|
|
48
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
49
|
+
|
|
50
|
+
let scaleX: number, scaleY: number;
|
|
51
|
+
|
|
52
|
+
if (isSvgPointer(event)) {
|
|
53
|
+
// For SVG elements, use getBBox() to get the intrinsic size in SVG coordinates
|
|
54
|
+
const bbox = event.currentTarget.getBBox();
|
|
55
|
+
scaleX = bbox.width > 0 ? rect.width / bbox.width : 1;
|
|
56
|
+
scaleY = bbox.height > 0 ? rect.height / bbox.height : 1;
|
|
57
|
+
} else {
|
|
58
|
+
// For HTML elements, use offsetWidth/offsetHeight
|
|
59
|
+
const element = event.currentTarget;
|
|
60
|
+
scaleX = element.offsetWidth > 0 ? rect.width / element.offsetWidth : 1;
|
|
61
|
+
scaleY = element.offsetHeight > 0 ? rect.height / element.offsetHeight : 1;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const getCoordinates = (clientX: number, clientY: number): RelativePointer => ({
|
|
65
|
+
/*
|
|
66
|
+
* Here it's important to use:
|
|
67
|
+
* - event.clientX and event.clientY to get the mouse position relative to the viewport, including scroll.
|
|
68
|
+
* - pageX and pageY are not used because they are relative to the whole document, and ignore scroll.
|
|
69
|
+
* - rect.left and rect.top are used to get the position of the chart relative to the viewport.
|
|
70
|
+
* - offsetX and offsetY are not used because they are relative to the offset parent
|
|
71
|
+
* which may or may not be the same as the clientX and clientY, depending on the position of the chart in the DOM
|
|
72
|
+
* and surrounding element styles. CSS position: relative, absolute, fixed, will change the offset parent.
|
|
73
|
+
* - scaleX and scaleY are necessary for when the chart element is scaled using CSS `transform: scale(N)`.
|
|
74
|
+
*/
|
|
75
|
+
relativeX: Math.round((clientX - rect.left) / scaleX),
|
|
76
|
+
relativeY: Math.round((clientY - rect.top) / scaleY),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
if ("touches" in event) {
|
|
80
|
+
return Array.from(event.touches).map((touch) => getCoordinates(touch.clientX, touch.clientY));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return getCoordinates(event.clientX, event.clientY);
|
|
84
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/getSliced.ts (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Deviation: the reference's `Array.isArray(arr)` guard widens the already-typed
|
|
4
|
+
// `ReadonlyArray<T>` to `any[]` (a TS limitation that leaks `any` out of
|
|
5
|
+
// `slice`). A plain `boolean`-returning runtime check (no `arg is any[]`
|
|
6
|
+
// predicate) preserves the same defensive behavior without the widening.
|
|
7
|
+
const isRuntimeArray = (value: unknown): boolean => Array.isArray(value);
|
|
8
|
+
|
|
9
|
+
export function getSliced<T>(
|
|
10
|
+
arr: ReadonlyArray<T>,
|
|
11
|
+
startIndex: number,
|
|
12
|
+
endIndex: number,
|
|
13
|
+
): ReadonlyArray<T> {
|
|
14
|
+
if (!isRuntimeArray(arr)) {
|
|
15
|
+
return arr;
|
|
16
|
+
}
|
|
17
|
+
if (arr && startIndex + endIndex !== 0) {
|
|
18
|
+
return arr.slice(startIndex, endIndex + 1);
|
|
19
|
+
}
|
|
20
|
+
return arr;
|
|
21
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/isDomainSpecifiedByUser.ts (commit 7a23854).
|
|
2
|
+
// Pure util — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
|
|
4
|
+
import { MAX_VALUE_REG, MIN_VALUE_REG } from "./ChartUtils";
|
|
5
|
+
import { isNumber } from "./DataUtils";
|
|
6
|
+
import { AxisDomain, AxisDomainItem, NumberDomain } from "./types";
|
|
7
|
+
import { isWellBehavedNumber } from "./isWellBehavedNumber";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* `Array.isArray` narrows the readonly `AxisDomain` union to `any[]` (a TS
|
|
11
|
+
* limitation), which would leak `any` into the destructured elements. This guard
|
|
12
|
+
* narrows to the well-typed 2-tuple so element types stay `AxisDomainItem`.
|
|
13
|
+
*/
|
|
14
|
+
function isDomainTuple(d: AxisDomain | undefined): d is Readonly<[AxisDomainItem, AxisDomainItem]> {
|
|
15
|
+
return Array.isArray(d) && d.length === 2;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function isWellFormedNumberDomain(v: unknown): v is NumberDomain {
|
|
19
|
+
if (Array.isArray(v) && v.length === 2) {
|
|
20
|
+
// Read as `unknown` (not the `any` Array.isArray yields) and let
|
|
21
|
+
// isWellBehavedNumber narrow each element.
|
|
22
|
+
const min: unknown = v[0];
|
|
23
|
+
const max: unknown = v[1];
|
|
24
|
+
if (isWellBehavedNumber(min) && isWellBehavedNumber(max)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function extendDomain(
|
|
32
|
+
providedDomain: NumberDomain,
|
|
33
|
+
boundaryDomain: NumberDomain,
|
|
34
|
+
allowDataOverflow: boolean,
|
|
35
|
+
): NumberDomain {
|
|
36
|
+
if (allowDataOverflow) {
|
|
37
|
+
// If the data are allowed to overflow - we're fine with whatever user provided
|
|
38
|
+
return providedDomain;
|
|
39
|
+
}
|
|
40
|
+
/*
|
|
41
|
+
* If the data are not allowed to overflow - we need to extend the domain.
|
|
42
|
+
* Means that effectively the user is allowed to make the domain larger
|
|
43
|
+
* but not smaller.
|
|
44
|
+
*/
|
|
45
|
+
return [
|
|
46
|
+
Math.min(providedDomain[0], boundaryDomain[0]),
|
|
47
|
+
Math.max(providedDomain[1], boundaryDomain[1]),
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* So Recharts allows users to provide their own domains,
|
|
53
|
+
* but it also places some expectations on what the domain is.
|
|
54
|
+
* We can improve on the typescript typing, but we also need a runtime test
|
|
55
|
+
to observe that the user-provided domain is well-formed,
|
|
56
|
+
* that is: an array with exactly two numbers.
|
|
57
|
+
*
|
|
58
|
+
* This function does not accept data as an argument.
|
|
59
|
+
* This is to enable a performance optimization - if the domain is there,
|
|
60
|
+
* and we know what it is without traversing all the data,
|
|
61
|
+
* then we don't have to traverse all the data!
|
|
62
|
+
*
|
|
63
|
+
* If the user-provided domain is not well-formed,
|
|
64
|
+
* this function will return undefined - in which case we should traverse the data to calculate the real domain.
|
|
65
|
+
*
|
|
66
|
+
* This function is for parsing the numerical domain only.
|
|
67
|
+
*
|
|
68
|
+
* @param userDomain external prop, user provided, before validation. Can have various shapes: array, function, special magical strings inside too.
|
|
69
|
+
* @param allowDataOverflow boolean, provided by users. If true then the data domain wins
|
|
70
|
+
*
|
|
71
|
+
* @return [min, max] domain if it's well-formed; undefined if the domain is invalid
|
|
72
|
+
*/
|
|
73
|
+
export function numericalDomainSpecifiedWithoutRequiringData(
|
|
74
|
+
userDomain: AxisDomain | undefined,
|
|
75
|
+
allowDataOverflow: boolean,
|
|
76
|
+
) {
|
|
77
|
+
if (!allowDataOverflow) {
|
|
78
|
+
// Cannot compute data overflow if the data is not provided
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
if (typeof userDomain === "function") {
|
|
82
|
+
// The user function expects the data to be provided as an argument
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
if (isDomainTuple(userDomain)) {
|
|
86
|
+
const [providedMin, providedMax] = userDomain;
|
|
87
|
+
let finalMin: string | number | undefined;
|
|
88
|
+
let finalMax: string | number | undefined;
|
|
89
|
+
|
|
90
|
+
if (isWellBehavedNumber(providedMin)) {
|
|
91
|
+
finalMin = providedMin;
|
|
92
|
+
} else if (typeof providedMin === "function") {
|
|
93
|
+
// The user function expects the data to be provided as an argument
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (isWellBehavedNumber(providedMax)) {
|
|
98
|
+
finalMax = providedMax;
|
|
99
|
+
} else if (typeof providedMax === "function") {
|
|
100
|
+
// The user function expects the data to be provided as an argument
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const candidate = [finalMin, finalMax];
|
|
105
|
+
if (isWellFormedNumberDomain(candidate)) {
|
|
106
|
+
return candidate;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* So Recharts allows users to provide their own domains,
|
|
114
|
+
* but it also places some expectations on what the domain is.
|
|
115
|
+
* We can improve on the typescript typing, but we also need a runtime test
|
|
116
|
+
* to observe that the user-provided domain is well-formed,
|
|
117
|
+
* that is: an array with exactly two numbers.
|
|
118
|
+
* If the user-provided domain is not well-formed,
|
|
119
|
+
* this function will return undefined - in which case we should traverse the data to calculate the real domain.
|
|
120
|
+
*
|
|
121
|
+
* This function is for parsing the numerical domain only.
|
|
122
|
+
*
|
|
123
|
+
* You are probably thinking, why does domain need tick count?
|
|
124
|
+
* Well it adjusts the domain based on where the "nice ticks" land, and nice ticks depend on the tick count.
|
|
125
|
+
*
|
|
126
|
+
* @param userDomain external prop, user provided, before validation. Can have various shapes: array, function, special magical strings inside too.
|
|
127
|
+
* @param dataDomain calculated from data. Can be undefined, as an option for performance optimization
|
|
128
|
+
* @param allowDataOverflow provided by users. If true then the data domain wins
|
|
129
|
+
*
|
|
130
|
+
* @return [min, max] domain if it's well-formed; undefined if the domain is invalid
|
|
131
|
+
*/
|
|
132
|
+
export function parseNumericalUserDomain(
|
|
133
|
+
userDomain: AxisDomain | undefined,
|
|
134
|
+
dataDomain: NumberDomain | undefined,
|
|
135
|
+
allowDataOverflow: boolean,
|
|
136
|
+
): NumberDomain | undefined {
|
|
137
|
+
if (!allowDataOverflow && dataDomain == null) {
|
|
138
|
+
// Cannot compute data overflow if the data is not provided
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
if (typeof userDomain === "function" && dataDomain != null) {
|
|
142
|
+
try {
|
|
143
|
+
const result = userDomain(dataDomain, allowDataOverflow);
|
|
144
|
+
if (isWellFormedNumberDomain(result)) {
|
|
145
|
+
return extendDomain(result, dataDomain, allowDataOverflow);
|
|
146
|
+
}
|
|
147
|
+
} catch {
|
|
148
|
+
/* ignore the exception and compute domain from data later */
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (isDomainTuple(userDomain)) {
|
|
152
|
+
const [providedMin, providedMax] = userDomain;
|
|
153
|
+
let finalMin: string | number | undefined;
|
|
154
|
+
let finalMax: string | number | undefined;
|
|
155
|
+
|
|
156
|
+
if (providedMin === "auto") {
|
|
157
|
+
if (dataDomain != null) {
|
|
158
|
+
finalMin = Math.min(...dataDomain);
|
|
159
|
+
}
|
|
160
|
+
} else if (isNumber(providedMin)) {
|
|
161
|
+
finalMin = providedMin;
|
|
162
|
+
} else if (typeof providedMin === "function") {
|
|
163
|
+
try {
|
|
164
|
+
if (dataDomain != null) {
|
|
165
|
+
finalMin = providedMin(dataDomain[0]);
|
|
166
|
+
}
|
|
167
|
+
} catch {
|
|
168
|
+
/* ignore the exception and compute domain from data later */
|
|
169
|
+
}
|
|
170
|
+
} else if (typeof providedMin === "string" && MIN_VALUE_REG.test(providedMin)) {
|
|
171
|
+
const match = MIN_VALUE_REG.exec(providedMin);
|
|
172
|
+
if (match == null || match[1] == null || dataDomain == null) {
|
|
173
|
+
finalMin = undefined;
|
|
174
|
+
} else {
|
|
175
|
+
const value = +match[1];
|
|
176
|
+
finalMin = dataDomain[0] - value;
|
|
177
|
+
}
|
|
178
|
+
} else {
|
|
179
|
+
finalMin = dataDomain?.[0];
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (providedMax === "auto") {
|
|
183
|
+
if (dataDomain != null) {
|
|
184
|
+
finalMax = Math.max(...dataDomain);
|
|
185
|
+
}
|
|
186
|
+
} else if (isNumber(providedMax)) {
|
|
187
|
+
finalMax = providedMax;
|
|
188
|
+
} else if (typeof providedMax === "function") {
|
|
189
|
+
try {
|
|
190
|
+
if (dataDomain != null) {
|
|
191
|
+
finalMax = providedMax(dataDomain[1]);
|
|
192
|
+
}
|
|
193
|
+
} catch {
|
|
194
|
+
/* ignore the exception and compute domain from data later */
|
|
195
|
+
}
|
|
196
|
+
} else if (typeof providedMax === "string" && MAX_VALUE_REG.test(providedMax)) {
|
|
197
|
+
const match = MAX_VALUE_REG.exec(providedMax);
|
|
198
|
+
if (match == null || match[1] == null || dataDomain == null) {
|
|
199
|
+
finalMax = undefined;
|
|
200
|
+
} else {
|
|
201
|
+
const value = +match[1];
|
|
202
|
+
finalMax = dataDomain[1] + value;
|
|
203
|
+
}
|
|
204
|
+
} else {
|
|
205
|
+
finalMax = dataDomain?.[1];
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const candidate = [finalMin, finalMax];
|
|
209
|
+
if (isWellFormedNumberDomain(candidate)) {
|
|
210
|
+
if (dataDomain == null) {
|
|
211
|
+
return candidate;
|
|
212
|
+
}
|
|
213
|
+
return extendDomain(candidate, dataDomain, allowDataOverflow);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/isWellBehavedNumber.ts (commit 7a23854).
|
|
2
|
+
// Pure util — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
|
|
4
|
+
export function isWellBehavedNumber(n: unknown): n is number {
|
|
5
|
+
return Number.isFinite(n);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function isPositiveNumber(n: unknown): n is number {
|
|
9
|
+
return typeof n === "number" && n > 0 && Number.isFinite(n);
|
|
10
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Replaces es-toolkit/compat `get` — the deep-dataKey path engine behind
|
|
2
|
+
// getValueByDataKey (`"nested.obj.children"`, `"arr[1].y"`, numeric keys, …).
|
|
3
|
+
// Faithful port of es-toolkit's get/toPath/toKey/isDeepKey/isUnsafeProperty
|
|
4
|
+
// (MIT), restricted to the string|number paths recharts dataKeys use and
|
|
5
|
+
// adapted to this repo's type discipline (unknown + narrowing, no assertions).
|
|
6
|
+
|
|
7
|
+
const isIndexable = (value: unknown): value is Record<PropertyKey, unknown> =>
|
|
8
|
+
(typeof value === "object" && value !== null) || typeof value === "function";
|
|
9
|
+
|
|
10
|
+
const readKey = (object: unknown, key: string): unknown =>
|
|
11
|
+
isIndexable(object) ? object[key] : undefined;
|
|
12
|
+
|
|
13
|
+
/** lodash `toKey` for numbers: `-0` stringifies to `"-0"`, not `"0"`. */
|
|
14
|
+
const numberToKey = (value: number): string => (Object.is(value, -0) ? "-0" : String(value));
|
|
15
|
+
|
|
16
|
+
const isDeepKey = (key: string): boolean =>
|
|
17
|
+
key.includes(".") || key.includes("[") || key.includes("]");
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* lodash-style path tokenizer: `"a.b[0]['c.d']"` → `["a", "b", "0", "c.d"]`.
|
|
21
|
+
* Handles quoted bracket keys, backslash escapes inside quotes, and a leading
|
|
22
|
+
* dot (which yields a leading empty segment, matching lodash).
|
|
23
|
+
*/
|
|
24
|
+
export function toPath(deepKey: string): string[] {
|
|
25
|
+
const result: string[] = [];
|
|
26
|
+
const length = deepKey.length;
|
|
27
|
+
if (length === 0) {
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
let index = 0;
|
|
31
|
+
let key = "";
|
|
32
|
+
let quoteChar = "";
|
|
33
|
+
let bracket = false;
|
|
34
|
+
if (deepKey.charCodeAt(0) === 46) {
|
|
35
|
+
result.push("");
|
|
36
|
+
index++;
|
|
37
|
+
}
|
|
38
|
+
while (index < length) {
|
|
39
|
+
const char = deepKey[index];
|
|
40
|
+
if (quoteChar) {
|
|
41
|
+
if (char === "\\" && index + 1 < length) {
|
|
42
|
+
index++;
|
|
43
|
+
key += deepKey[index];
|
|
44
|
+
} else if (char === quoteChar) {
|
|
45
|
+
quoteChar = "";
|
|
46
|
+
} else {
|
|
47
|
+
key += char;
|
|
48
|
+
}
|
|
49
|
+
} else if (bracket) {
|
|
50
|
+
if (char === '"' || char === "'") {
|
|
51
|
+
quoteChar = char;
|
|
52
|
+
} else if (char === "]") {
|
|
53
|
+
bracket = false;
|
|
54
|
+
result.push(key);
|
|
55
|
+
key = "";
|
|
56
|
+
} else {
|
|
57
|
+
key += char;
|
|
58
|
+
}
|
|
59
|
+
} else if (char === "[") {
|
|
60
|
+
bracket = true;
|
|
61
|
+
if (key) {
|
|
62
|
+
result.push(key);
|
|
63
|
+
key = "";
|
|
64
|
+
}
|
|
65
|
+
} else if (char === ".") {
|
|
66
|
+
if (key) {
|
|
67
|
+
result.push(key);
|
|
68
|
+
key = "";
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
key += char;
|
|
72
|
+
}
|
|
73
|
+
index++;
|
|
74
|
+
}
|
|
75
|
+
if (key) {
|
|
76
|
+
result.push(key);
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function getWithPath(object: unknown, path: readonly string[], defaultValue: unknown): unknown {
|
|
82
|
+
if (path.length === 0) {
|
|
83
|
+
return defaultValue;
|
|
84
|
+
}
|
|
85
|
+
let current: unknown = object;
|
|
86
|
+
for (let index = 0; index < path.length; index++) {
|
|
87
|
+
if (current == null) {
|
|
88
|
+
return defaultValue;
|
|
89
|
+
}
|
|
90
|
+
const segment = path[index];
|
|
91
|
+
if (segment === undefined || segment === "__proto__") {
|
|
92
|
+
return defaultValue;
|
|
93
|
+
}
|
|
94
|
+
current = readKey(current, segment);
|
|
95
|
+
}
|
|
96
|
+
return current === undefined ? defaultValue : current;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Resolves `path` against `object` — a direct own key wins over path syntax
|
|
101
|
+
* (so a literal `"a.b"` key is found before `"a.b"` is treated as a deep
|
|
102
|
+
* path), exactly like lodash/es-toolkit `get`.
|
|
103
|
+
*
|
|
104
|
+
* The generic overload is a DECLARED-UNSOUND seam (same boundary es-toolkit's
|
|
105
|
+
* `any`-typed `get` provided): a runtime string path can't prove its value's
|
|
106
|
+
* type, so the caller's expected type is taken on faith. The implementation
|
|
107
|
+
* works in honest `unknown`.
|
|
108
|
+
*/
|
|
109
|
+
export function get<T>(object: unknown, path: string | number, defaultValue?: T): T | undefined;
|
|
110
|
+
export function get(object: unknown, path: string | number, defaultValue?: unknown): unknown {
|
|
111
|
+
if (object == null) {
|
|
112
|
+
return defaultValue;
|
|
113
|
+
}
|
|
114
|
+
if (typeof path === "number") {
|
|
115
|
+
const result = readKey(object, numberToKey(path));
|
|
116
|
+
return result === undefined ? defaultValue : result;
|
|
117
|
+
}
|
|
118
|
+
if (path === "__proto__") {
|
|
119
|
+
return defaultValue;
|
|
120
|
+
}
|
|
121
|
+
const direct = readKey(object, path);
|
|
122
|
+
if (direct !== undefined) {
|
|
123
|
+
return direct;
|
|
124
|
+
}
|
|
125
|
+
if (isDeepKey(path)) {
|
|
126
|
+
return getWithPath(object, toPath(path), defaultValue);
|
|
127
|
+
}
|
|
128
|
+
return defaultValue;
|
|
129
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/payload/getUniqPayload.ts (commit 7a23854).
|
|
2
|
+
// Pure util — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
|
|
4
|
+
import { uniqBy } from "../collectionUtils";
|
|
5
|
+
|
|
6
|
+
type UniqueFunc<T> = (entry: T) => unknown;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* This is configuration option that decides how to filter for unique values only:
|
|
10
|
+
*
|
|
11
|
+
* - `false` means "no filter"
|
|
12
|
+
* - `true` means "use recharts default filter"
|
|
13
|
+
* - function means "use return of this function as the default key"
|
|
14
|
+
*/
|
|
15
|
+
export type UniqueOption<T> = boolean | UniqueFunc<T>;
|
|
16
|
+
|
|
17
|
+
export function getUniqPayload<T>(
|
|
18
|
+
payload: ReadonlyArray<T>,
|
|
19
|
+
option: UniqueOption<T> | undefined,
|
|
20
|
+
defaultUniqBy: UniqueFunc<T>,
|
|
21
|
+
): ReadonlyArray<T> {
|
|
22
|
+
if (option === true) {
|
|
23
|
+
return uniqBy(payload, defaultUniqBy);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (typeof option === "function") {
|
|
27
|
+
return uniqBy(payload, option);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return payload;
|
|
31
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/propsAreEqual.ts (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Deviation: recharts imports `shallowEqual` from `react-redux`. A SolidJS port
|
|
4
|
+
// has no react-redux, so we inline an equivalent one-level same-value compare.
|
|
5
|
+
// react-redux's `shallowEqual` is just `Object.is` applied per own-enumerable
|
|
6
|
+
// key (its internal `is` predates and mirrors `Object.is`), so the local
|
|
7
|
+
// version below is behavior-identical — NaN compares equal, +0 and -0 do not.
|
|
8
|
+
//
|
|
9
|
+
// NOTE on relevance: recharts uses `propsAreEqual` only as the `React.memo`
|
|
10
|
+
// comparator on Bar/Area/Line/Scatter/Legend/ReportEventSettings/etc. Solid
|
|
11
|
+
// components do not re-render, so when those units are ported this comparator
|
|
12
|
+
// will most likely be dropped or repurposed. The function itself is pure and
|
|
13
|
+
// spec-tested, so we port it now and revisit its call sites in Tier 2.
|
|
14
|
+
|
|
15
|
+
const propsToShallowCompare = new Set<string>([
|
|
16
|
+
"axisLine",
|
|
17
|
+
"tickLine",
|
|
18
|
+
"activeBar",
|
|
19
|
+
"activeDot",
|
|
20
|
+
"activeLabel",
|
|
21
|
+
"activeShape",
|
|
22
|
+
"allowEscapeViewBox",
|
|
23
|
+
"background",
|
|
24
|
+
"cursor",
|
|
25
|
+
"dot",
|
|
26
|
+
"label",
|
|
27
|
+
"line",
|
|
28
|
+
"margin",
|
|
29
|
+
"padding",
|
|
30
|
+
"position",
|
|
31
|
+
"shape",
|
|
32
|
+
"style",
|
|
33
|
+
"tick",
|
|
34
|
+
"wrapperStyle",
|
|
35
|
+
// radius can be an array of 4 numbers, easy to compare shallowly
|
|
36
|
+
"radius",
|
|
37
|
+
"throttledEvents",
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
41
|
+
return typeof value === "object" && value !== null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* One-level same-value comparison, equivalent to react-redux's `shallowEqual`.
|
|
46
|
+
* Uses `Object.is`, so two NaNs are equal and +0/-0 are not — matching the
|
|
47
|
+
* original.
|
|
48
|
+
*/
|
|
49
|
+
function shallowEqual(objA: unknown, objB: unknown): boolean {
|
|
50
|
+
if (Object.is(objA, objB)) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
if (!isRecord(objA) || !isRecord(objB)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const keysA = Object.keys(objA);
|
|
57
|
+
const keysB = Object.keys(objB);
|
|
58
|
+
if (keysA.length !== keysB.length) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
for (const key of keysA) {
|
|
62
|
+
if (!Object.hasOwn(objB, key) || !Object.is(objA[key], objB[key])) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* When comparing two values, returns true if they are the same value or
|
|
71
|
+
* are both NaN.
|
|
72
|
+
*
|
|
73
|
+
* If we used just a simple triple equals, we would get false negatives for two NaNs
|
|
74
|
+
* which could cause extra re-renders so let's have this instead.
|
|
75
|
+
*
|
|
76
|
+
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Equality_comparisons_and_sameness#same-value-zero_equality
|
|
77
|
+
*
|
|
78
|
+
* @param x first value to compare
|
|
79
|
+
* @param y second value to compare
|
|
80
|
+
* return true if the same, false if different
|
|
81
|
+
*/
|
|
82
|
+
function sameValueZero(x: unknown, y: unknown): boolean {
|
|
83
|
+
if (x == null && y == null) {
|
|
84
|
+
/*
|
|
85
|
+
* treat null and undefined as equal. Internally in Recharts we make no difference between these two
|
|
86
|
+
* so there is no need to re-render.
|
|
87
|
+
*/
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
if (typeof x === "number" && typeof y === "number") {
|
|
91
|
+
// x and y are equal (this is true for -0 and 0) or they are both NaN
|
|
92
|
+
return x === y || (x !== x && y !== y);
|
|
93
|
+
}
|
|
94
|
+
return x === y;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* So usually React would compare only the first level of props using Object.is.
|
|
99
|
+
* However, in our case many props are objects or arrays, and our own docs recommend to do that!
|
|
100
|
+
* Therefore, we need a custom comparison function that does a shallow comparison of each prop value.
|
|
101
|
+
*
|
|
102
|
+
* Because charts can and do receive large props (typically the data array),
|
|
103
|
+
* we only limit this to a subset of known props that are likely to be objects/arrays.
|
|
104
|
+
*
|
|
105
|
+
* @param prevProps
|
|
106
|
+
* @param nextProps
|
|
107
|
+
*/
|
|
108
|
+
export function propsAreEqual<T extends Record<string, unknown>>(
|
|
109
|
+
prevProps: T,
|
|
110
|
+
nextProps: T,
|
|
111
|
+
): boolean {
|
|
112
|
+
const allKeys = new Set<string>([...Object.keys(prevProps), ...Object.keys(nextProps)]);
|
|
113
|
+
for (const key of allKeys) {
|
|
114
|
+
/*
|
|
115
|
+
* If a key is on a special allowlist, go one level deeper
|
|
116
|
+
* and do a shallow comparison of the values.
|
|
117
|
+
*/
|
|
118
|
+
if (propsToShallowCompare.has(key)) {
|
|
119
|
+
if (prevProps[key] == null && nextProps[key] == null) {
|
|
120
|
+
/*
|
|
121
|
+
* treat null and undefined as equal. Internally in Recharts we make no difference between these two
|
|
122
|
+
* so there is no need to re-render.
|
|
123
|
+
*/
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (!shallowEqual(prevProps[key], nextProps[key])) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
/*
|
|
130
|
+
* Otherwise do a simple same-value comparison (with NaN support).
|
|
131
|
+
*/
|
|
132
|
+
} else if (!sameValueZero(prevProps[key], nextProps[key])) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// SKIPPED — intentionally NOT ported to the SolidJS port.
|
|
2
|
+
//
|
|
3
|
+
// Reason: React defaultProps shim — use Solid merge()
|
|
4
|
+
//
|
|
5
|
+
// TODO: do not port this file as-is. The Solid-native port replaces it (see the
|
|
6
|
+
// reason above). If a consumer needs this path, wire it to the Solid equivalent
|
|
7
|
+
// instead. Tracked in scripts/porting-queue.mjs SKIP list and project memory.
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/round.ts (commit 7a23854).
|
|
2
|
+
// Pure math — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
|
|
4
|
+
// if you go lower than 3, wild wild things happen during rendering
|
|
5
|
+
const defaultRoundPrecision = 4;
|
|
6
|
+
|
|
7
|
+
export function round(num: number, roundPrecision: number = defaultRoundPrecision): number {
|
|
8
|
+
const factor = 10 ** roundPrecision;
|
|
9
|
+
const rounded = Math.round(num * factor) / factor;
|
|
10
|
+
if (Object.is(rounded, -0)) {
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
13
|
+
return rounded;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* This function will accept a string template literal and for each
|
|
18
|
+
* variable placeholder, it will round the value to avoid long float numbers in
|
|
19
|
+
* the SVG path which might cause rendering issues in some browsers.
|
|
20
|
+
*/
|
|
21
|
+
export function roundTemplateLiteral(
|
|
22
|
+
strings: TemplateStringsArray,
|
|
23
|
+
...values: ReadonlyArray<number | string>
|
|
24
|
+
): string {
|
|
25
|
+
return strings.reduce((result, string, i) => {
|
|
26
|
+
const value = values[i - 1];
|
|
27
|
+
if (typeof value === "string") {
|
|
28
|
+
return result + value + string;
|
|
29
|
+
}
|
|
30
|
+
if (value !== undefined) {
|
|
31
|
+
return result + round(value) + string;
|
|
32
|
+
}
|
|
33
|
+
return result + string;
|
|
34
|
+
}, "");
|
|
35
|
+
}
|