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,114 @@
|
|
|
1
|
+
# Session goal: grow the test suite (and fix what it surfaces)
|
|
2
|
+
|
|
3
|
+
You are continuing a faithful port of **recharts 3.8.1 → SolidJS 2.0** living at
|
|
4
|
+
`/Users/thomas/Downloads/solid-recharts/packages/solid-recharts`. The feature port is ~80%
|
|
5
|
+
complete; **test coverage is the gap** — ~1217 cases vs recharts' ~3658 (~33%). Your job this
|
|
6
|
+
session is to **port reference specs into the Solid suite**, and **fix any real port bugs the
|
|
7
|
+
new tests surface**. Quality over volume: every test must be faithful and must pass for the
|
|
8
|
+
right reason.
|
|
9
|
+
|
|
10
|
+
## The reference
|
|
11
|
+
|
|
12
|
+
recharts 3.8.1 source + tests are checked out at:
|
|
13
|
+
|
|
14
|
+
- `/Users/thomas/Documents/Github/recharts-reference/src`
|
|
15
|
+
- `/Users/thomas/Documents/Github/recharts-reference/test`
|
|
16
|
+
|
|
17
|
+
Port the reference spec's _intent and exact assertions_ (golden numbers, geometry, counts),
|
|
18
|
+
adapting only the React→Solid mechanics.
|
|
19
|
+
|
|
20
|
+
## Non-negotiable conventions (these OVERRIDE defaults)
|
|
21
|
+
|
|
22
|
+
1. **Gate after EVERY change**: `vp check --fix` (lint/format/type — must end at _0 errors_;
|
|
23
|
+
10 warnings is the known steady-state baseline) AND `vp test run` (must stay fully green).
|
|
24
|
+
Do NOT use `npx vitest` — use `vp test run <pattern>`.
|
|
25
|
+
2. **No `any`, no `as`, no non-null `!` in src, no `@ts-expect-error`.** The lint is
|
|
26
|
+
type-aware and WILL catch these (it already caught a bad test this project). Use typed
|
|
27
|
+
coercion / helpers instead.
|
|
28
|
+
3. **Faithful porting.** If a feature is genuinely deferred in the port (check the file's
|
|
29
|
+
header comment), don't assert it — write a _subset_ spec mirroring the existing ported
|
|
30
|
+
specs' style, and note in the spec header which reference assertions you omitted and why.
|
|
31
|
+
If the spec fails because the **port has a real bug or missing-but-claimed feature, FIX the
|
|
32
|
+
port** (faithfully to recharts), don't weaken the test.
|
|
33
|
+
4. **Document deviations** in spec/source header comments (the codebase does this consistently
|
|
34
|
+
— match the surrounding style, comment density, and naming).
|
|
35
|
+
|
|
36
|
+
## Solid 2.0 gotchas that WILL bite (all learned the hard way — see memory)
|
|
37
|
+
|
|
38
|
+
- A global guard in `test/setup.ts` **fails any test on a non-allowlisted Solid diagnostic**
|
|
39
|
+
(STRICT_READ_UNTRACKED etc). Common fixes:
|
|
40
|
+
- Don't read a reactive/accessor value directly in `<Show when={...}>` static children —
|
|
41
|
+
use the accessor-child form `<Show when={obj()}>{(v) => ...}</Show>` with a TRUTHY object
|
|
42
|
+
`when`, OR a plain **ternary** in JSX for a captured non-reactive const (a
|
|
43
|
+
`<Show when={capturedConst}>` still trips STRICT_READ).
|
|
44
|
+
- Bake values into `<For>`-item descriptors; don't render recursive hierarchies via
|
|
45
|
+
components that read reactive `props.*`.
|
|
46
|
+
- **`mouseenter`/`mouseleave` do NOT bubble.** Item handlers live on the wrapping node
|
|
47
|
+
`<Layer>` — `fireEvent.mouseEnter` the Layer `g`, not the inner shape.
|
|
48
|
+
- **Bar item-hover tooltip needs `<Tooltip shared={false}>`** (shared tooltips use the
|
|
49
|
+
axis/mouse path, not item-enter).
|
|
50
|
+
- Solid 2.0 **defers propagation to a flush boundary**: after a sync signal set, a memo read
|
|
51
|
+
in the same tick is stale until `flush()`. Tests call `flush()` after render and after
|
|
52
|
+
`fireEvent`. Use local values (not re-read memos) inside event handlers.
|
|
53
|
+
- Test wrappers: use `props.children`, never destructure `{children}` (breaks the store).
|
|
54
|
+
|
|
55
|
+
## Exact commands
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
cd /Users/thomas/Downloads/solid-recharts/packages/solid-recharts
|
|
59
|
+
vp test run <Name> # run one spec (substring match), e.g. vp test run ChartUtils
|
|
60
|
+
vp test run # full suite (currently 1217 passing / 115 files)
|
|
61
|
+
vp check --fix # the gate (0 errors / 10 warnings = clean)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Prioritized worklist (port in this order — fastest/safest first)
|
|
65
|
+
|
|
66
|
+
**Tier 1 — pure-function specs (no DOM, no flake, highest value).** These pin exact numeric
|
|
67
|
+
behavior of code we already ship but barely test. Reference paths under `…/recharts-reference/test/`:
|
|
68
|
+
|
|
69
|
+
- `util/ChartUtils.spec.tsx`, `util/BarUtils.spec.tsx`, `util/DataUtils.spec.ts` (extend ours)
|
|
70
|
+
- `util/round.spec.ts`, `util/isWellBehavedNumber.spec.ts`, `util/getRelativeCoordinate.spec.ts`
|
|
71
|
+
- `util/ChartUtils/{truncateByDomain,getStackedData,getCateCoordinateOfLine}.spec.*`
|
|
72
|
+
- `util/scale/{getNiceTickValues,arithmetic,createCategoricalInverse}.spec.ts`
|
|
73
|
+
- `util/cursor/{getCursorRectangle,getCursorPoints,getRadialCursorPoints}.spec.ts`
|
|
74
|
+
- `util/payload/getUniqPayload.spec.ts`, `util/tooltip/translate.spec.ts`
|
|
75
|
+
- `util/CartesianUtils/{CartesianUtils,rectWithPoints}.spec.ts`, `util/PolarUtils.spec.ts`
|
|
76
|
+
- `util/resolveDefaultProps.spec.tsx` (NB: our port uses Solid `merge`, not resolveDefaultProps
|
|
77
|
+
— adapt or skip with a note), `util/isDomainSpecifiedByUser.spec.ts`, `util/TickUtils.spec.ts`
|
|
78
|
+
- Also untested port units with NO ref-named spec but clearly testable: `src/util/getSliced.ts`,
|
|
79
|
+
`getEveryNth.ts`, `getActiveCoordinate.ts`, `YAxisUtils.ts`, `getRadiusAndStrokeWidthFromDot.ts`,
|
|
80
|
+
`ReduceCSSCalc.ts` — write fresh unit specs from the port's behavior + reference src.
|
|
81
|
+
|
|
82
|
+
**Tier 2 — state selectors (test through the store; medium effort).**
|
|
83
|
+
`state/selectors/*.spec.tsx` — `dataSelectors`, `axisSelectors`, `legendSelectors`,
|
|
84
|
+
`lineSelectors`, `pieSelectors`, `scatterSelectors`, `radialBarSelectors`, `selectChartOffset`,
|
|
85
|
+
`combiners/combineActiveTooltipIndex`. Use the existing `test/helper/render` + store patterns.
|
|
86
|
+
|
|
87
|
+
**Tier 3 — component/integration specs (deepen behavior).**
|
|
88
|
+
`component/{Text,Label,LabelList,Legend,DefaultTooltipContent,Cursor,ResponsiveContainer}.spec.tsx`,
|
|
89
|
+
`cartesian/{Area,Line,Bar/Bar,Scatter,CartesianAxis,CartesianGrid,ErrorBar,Brush}.spec.tsx`,
|
|
90
|
+
`polar/{Pie/Pie,Radar,RadialBar/RadialBar,PolarGrid,PolarAngleAxis,PolarRadiusAxis}.spec.tsx`,
|
|
91
|
+
`chart/{ComposedChart,RadarChart,ScatterChart,CategoricalChart}.spec.tsx`. These are big in the
|
|
92
|
+
reference — port the parity-critical subset and document omissions (the existing `*.spec.tsx`
|
|
93
|
+
headers show the house style).
|
|
94
|
+
|
|
95
|
+
## Working rhythm
|
|
96
|
+
|
|
97
|
+
1. Pick the next worklist item. Read the reference spec + the port's source.
|
|
98
|
+
2. Port the spec into the mirrored path under `test/` (match existing naming/structure).
|
|
99
|
+
3. `vp test run <Name>`. If it fails: decide — port bug (fix src faithfully) vs deferred feature
|
|
100
|
+
(subset the spec + document). Never weaken a test to hide a real gap.
|
|
101
|
+
4. `vp check --fix`. Confirm 0 errors.
|
|
102
|
+
5. Periodically run the full `vp test run` to catch cross-file regressions.
|
|
103
|
+
6. Update `MEMORY.md` + a memory file when you learn something non-obvious or finish a cluster.
|
|
104
|
+
|
|
105
|
+
## Context to load first
|
|
106
|
+
|
|
107
|
+
Read the memory index at
|
|
108
|
+
`/Users/thomas/.claude/projects/-Users-thomas-Downloads-solid-recharts/memory/MEMORY.md` and the
|
|
109
|
+
files it points to (especially `expectclean-or-diagnostics-silent.md`,
|
|
110
|
+
`solid2-reactivity-timing.md`, `root-config-and-lint.md`, `custom-shape-render-props.md`) — they
|
|
111
|
+
encode the gate, the diagnostic guard, and the reactivity rules above.
|
|
112
|
+
|
|
113
|
+
Start with **Tier 1** and report progress in batches (files ported, tests added, any port bugs
|
|
114
|
+
fixed). Keep the suite green the whole way.
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "solid-recharts",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"sideEffects": false,
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./src/index.ts"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"tiny-invariant": "^1.3.3",
|
|
11
|
+
"victory-vendor": "^37.0.2"
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"axe-core": "^4.12.0",
|
|
15
|
+
"vitest-axe": "^0.1.0",
|
|
16
|
+
"@solid-recharts/testing-library": "0.0.0"
|
|
17
|
+
},
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"@solidjs/web": "^2.0.0-beta.14",
|
|
20
|
+
"solid-js": "^2.0.0-beta.14"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"pretest": "node ../../scripts/verify-reference.mjs",
|
|
24
|
+
"test": "vp test run",
|
|
25
|
+
"test:watch": "vp test",
|
|
26
|
+
"typecheck": "tsc --noEmit"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// Ported from recharts 3.9.0 src/animation/AnimatedItems.tsx.
|
|
2
|
+
//
|
|
3
|
+
// Solid 2.0 port of the reusable array-data animation wrapper shared by all the
|
|
4
|
+
// graphical items (Bar/Scatter/Funnel/Pie/Radar/RadialBar/Area/Line).
|
|
5
|
+
// Deviations from the React reference:
|
|
6
|
+
// - React re-renders to advance frames; here the frame driver is `JavascriptAnimate`,
|
|
7
|
+
// which holds a `t` signal and re-invokes the render-prop child reactively from JSX.
|
|
8
|
+
// - `useRef` → a plain `{ current }` ref object ([[useAnimationStartSnapshot]]).
|
|
9
|
+
// - `useState` → `createSignal`; `useMemo` → `createMemo`.
|
|
10
|
+
// - The animation is driven by the v3.9 engine ([[AnimationHandle]] +
|
|
11
|
+
// [[AnimationController]]) via `JavascriptAnimate`, so a test can inject a
|
|
12
|
+
// deterministic controller through `AnimationControllerProvider`.
|
|
13
|
+
// - A keyed `<Show when={animationId()}>` wraps the driver so a new animation
|
|
14
|
+
// cycle remounts it cleanly (same NO_OWNER-safe shape Bar already used).
|
|
15
|
+
import { createMemo, createSignal, untrack, Show } from "solid-js";
|
|
16
|
+
import type { JSX } from "@solidjs/web";
|
|
17
|
+
import { useAnimationId } from "../util/useAnimationId";
|
|
18
|
+
import { noop } from "../util/DataUtils";
|
|
19
|
+
import { useAnimationStartSnapshot, type MutableRef } from "./useAnimationStartSnapshot";
|
|
20
|
+
import {
|
|
21
|
+
matchAnimationItems,
|
|
22
|
+
matchByIndex,
|
|
23
|
+
type AnimationItem,
|
|
24
|
+
type AnimationMatchByProp,
|
|
25
|
+
} from "./matchBy";
|
|
26
|
+
import type { CartesianLayout, PolarLayout } from "../util/types";
|
|
27
|
+
import type { EasingInput } from "./easing";
|
|
28
|
+
import { JavascriptAnimate } from "./JavascriptAnimate";
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Tracks animation start/end and exposes an `isAnimating` accessor.
|
|
32
|
+
*/
|
|
33
|
+
export function useAnimationCallbacks(
|
|
34
|
+
onAnimationStart?: () => void,
|
|
35
|
+
onAnimationEnd?: () => void,
|
|
36
|
+
): {
|
|
37
|
+
isAnimating: () => boolean;
|
|
38
|
+
handleAnimationStart: () => void;
|
|
39
|
+
handleAnimationEnd: () => void;
|
|
40
|
+
} {
|
|
41
|
+
// ownedWrite: handleAnimationEnd can fire from the driver's effect-cleanup when
|
|
42
|
+
// a mid-animation chart is disposed (route/soft navigation) — a legal teardown.
|
|
43
|
+
const [isAnimating, setIsAnimating] = createSignal(false, { ownedWrite: true });
|
|
44
|
+
|
|
45
|
+
const handleAnimationStart = (): void => {
|
|
46
|
+
onAnimationStart?.();
|
|
47
|
+
setIsAnimating(true);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const handleAnimationEnd = (): void => {
|
|
51
|
+
onAnimationEnd?.();
|
|
52
|
+
setIsAnimating(false);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
return { isAnimating, handleAnimationStart, handleAnimationEnd };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Interpolates tagged animation items at a given normalized time. Receives the
|
|
60
|
+
* matched/added/removed changes and returns the items Recharts will render.
|
|
61
|
+
*
|
|
62
|
+
* @since 3.9
|
|
63
|
+
*/
|
|
64
|
+
export type AnimationInterpolateFn<ItemType, LayoutType extends CartesianLayout | PolarLayout> = (
|
|
65
|
+
items: ReadonlyArray<AnimationItem<ItemType>> | null,
|
|
66
|
+
animationElapsedTime: number,
|
|
67
|
+
layout: LayoutType,
|
|
68
|
+
) => ReadonlyArray<ItemType>;
|
|
69
|
+
|
|
70
|
+
export type AnimatedItemsProps<ItemType, LayoutType extends CartesianLayout | PolarLayout> = {
|
|
71
|
+
/** Opaque input to detect when a new animation should start (changes by reference → new cycle). */
|
|
72
|
+
animationInput: unknown;
|
|
73
|
+
/** Prefix for the generated animation ID. */
|
|
74
|
+
animationIdPrefix: string;
|
|
75
|
+
/** The target items to animate towards. */
|
|
76
|
+
items: ReadonlyArray<ItemType> | undefined;
|
|
77
|
+
/** Ref holding previous items — used to detect first render vs data update. */
|
|
78
|
+
previousItemsRef: MutableRef<ReadonlyArray<ItemType> | null | undefined>;
|
|
79
|
+
/** Whether animation is active. */
|
|
80
|
+
isAnimationActive: boolean | "auto";
|
|
81
|
+
/** Delay in ms before animation begins. */
|
|
82
|
+
animationBegin: number;
|
|
83
|
+
/** Duration of animation in ms. */
|
|
84
|
+
animationDuration: number;
|
|
85
|
+
/** Easing function or named easing. */
|
|
86
|
+
animationEasing: EasingInput;
|
|
87
|
+
/** Called when the animation begins. */
|
|
88
|
+
onAnimationStart?: () => void;
|
|
89
|
+
/** Called when the animation completes. */
|
|
90
|
+
onAnimationEnd?: () => void;
|
|
91
|
+
/** The interpolation function — either the default or user-provided. */
|
|
92
|
+
animationInterpolateFn: AnimationInterpolateFn<ItemType, LayoutType>;
|
|
93
|
+
/** Strategy for matching previous items to next items during animation. */
|
|
94
|
+
animationMatchBy?: AnimationMatchByProp<ItemType>;
|
|
95
|
+
/** Optional guard for committing the previous-items ref. Default: `(t) => t > 0`. */
|
|
96
|
+
shouldUpdatePreviousRef?: (animationElapsedTime: number) => boolean;
|
|
97
|
+
/** Render with interpolated items + animation state. */
|
|
98
|
+
children: (
|
|
99
|
+
items: ReadonlyArray<ItemType>,
|
|
100
|
+
animationElapsedTime: number,
|
|
101
|
+
isEntrance: boolean,
|
|
102
|
+
) => JSX.Element;
|
|
103
|
+
layout: LayoutType;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* A reusable animation wrapper for array-based chart data.
|
|
108
|
+
*
|
|
109
|
+
* @since 3.9
|
|
110
|
+
*/
|
|
111
|
+
export function AnimatedItems<ItemType, LayoutType extends CartesianLayout | PolarLayout>(
|
|
112
|
+
props: AnimatedItemsProps<ItemType, LayoutType>,
|
|
113
|
+
): JSX.Element {
|
|
114
|
+
const animationId = useAnimationId(() => props.animationInput, props.animationIdPrefix);
|
|
115
|
+
const snapshot = useAnimationStartSnapshot<ReadonlyArray<ItemType> | null | undefined>(
|
|
116
|
+
animationId,
|
|
117
|
+
props.previousItemsRef,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const rawPrevItems = createMemo<ReadonlyArray<ItemType> | null>(
|
|
121
|
+
() => snapshot.startValue() ?? null,
|
|
122
|
+
);
|
|
123
|
+
const animationItems = createMemo<ReadonlyArray<AnimationItem<ItemType>> | null>(() =>
|
|
124
|
+
matchAnimationItems(rawPrevItems(), props.items, props.animationMatchBy ?? matchByIndex),
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
<Show when={animationId()} keyed>
|
|
129
|
+
{(keyedAnimationId) => (
|
|
130
|
+
<JavascriptAnimate
|
|
131
|
+
animationId={keyedAnimationId}
|
|
132
|
+
duration={props.animationDuration}
|
|
133
|
+
begin={props.animationBegin}
|
|
134
|
+
easing={props.animationEasing}
|
|
135
|
+
isActive={props.isAnimationActive}
|
|
136
|
+
onAnimationStart={props.onAnimationStart ?? noop}
|
|
137
|
+
onAnimationEnd={props.onAnimationEnd ?? noop}
|
|
138
|
+
>
|
|
139
|
+
{(animationElapsedTime) => {
|
|
140
|
+
const items = props.items;
|
|
141
|
+
// Match upstream's OBSERVABLE `isEntrance`: true only DURING the entrance
|
|
142
|
+
// animation (no prev items AND not yet settled). React's snapshot refreshes
|
|
143
|
+
// the frozen start value at t=1 so its isEntrance flips false on the settled
|
|
144
|
+
// frame; our memo-based snapshot can't, so we encode that result here with
|
|
145
|
+
// `< 1` instead — keeping every consumer (and future ones) in parity without
|
|
146
|
+
// a per-consumer `&& t < 1` guard. (See useAnimationStartSnapshot.)
|
|
147
|
+
const isEntrance = rawPrevItems() == null && animationElapsedTime < 1;
|
|
148
|
+
const stepData =
|
|
149
|
+
items == null
|
|
150
|
+
? items
|
|
151
|
+
: props.animationInterpolateFn(
|
|
152
|
+
animationItems(),
|
|
153
|
+
animationElapsedTime,
|
|
154
|
+
untrack(() => props.layout),
|
|
155
|
+
);
|
|
156
|
+
const canUpdate = props.shouldUpdatePreviousRef
|
|
157
|
+
? props.shouldUpdatePreviousRef(animationElapsedTime)
|
|
158
|
+
: animationElapsedTime > 0;
|
|
159
|
+
snapshot.syncStepValue(stepData, animationElapsedTime, canUpdate);
|
|
160
|
+
if (stepData == null) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
return props.children(stepData, animationElapsedTime, isEntrance);
|
|
164
|
+
}}
|
|
165
|
+
</JavascriptAnimate>
|
|
166
|
+
)}
|
|
167
|
+
</Show>
|
|
168
|
+
);
|
|
169
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Ported from recharts 3.9.0 src/animation/AnimationController.ts. Pure types.
|
|
2
|
+
import type { CancelableTimeout, TimeoutController } from "./timeoutController";
|
|
3
|
+
import type { AnimationHandle } from "./AnimationHandle";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* JavaScript-based animations produce numbers, and CSS transition-based animations produce strings.
|
|
7
|
+
*
|
|
8
|
+
* @since 3.9
|
|
9
|
+
*/
|
|
10
|
+
export type OnAnimationStateUpdate = (newState: number | string) => void;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* AnimationController accepts the animation state machine (= RechartsAnimation) plus a timeout controller,
|
|
14
|
+
* and manages the animation by calling the tick method of the animation state machine at the right time.
|
|
15
|
+
*
|
|
16
|
+
* One controller is only responsible for one animation. Every new animation creates a new controller.
|
|
17
|
+
*
|
|
18
|
+
* @since 3.9
|
|
19
|
+
*/
|
|
20
|
+
export type AnimationController = (
|
|
21
|
+
timeoutController: TimeoutController,
|
|
22
|
+
animationHandle: AnimationHandle,
|
|
23
|
+
listener: OnAnimationStateUpdate,
|
|
24
|
+
) => CancelableTimeout;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Ported from recharts 3.9.0 src/animation/AnimationControllerImpl.ts. Pure logic.
|
|
2
|
+
import type { AnimationController, OnAnimationStateUpdate } from "./AnimationController";
|
|
3
|
+
import type { AnimationHandle } from "./AnimationHandle";
|
|
4
|
+
import type { CancelableTimeout, TimeoutController } from "./timeoutController";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* JavaScript animations require triggering a repaint as soon as possible, so this
|
|
8
|
+
* uses the timeoutController to trigger updates as quickly as the controller allows.
|
|
9
|
+
*
|
|
10
|
+
* JavaScript animation progress is represented as a stream of values; the exact type
|
|
11
|
+
* depends on the animationHandle type. Each consumer maps those values onto a component.
|
|
12
|
+
*/
|
|
13
|
+
export const animationControllerImpl: AnimationController = (
|
|
14
|
+
timeoutController: TimeoutController,
|
|
15
|
+
animationHandle: AnimationHandle,
|
|
16
|
+
listener: OnAnimationStateUpdate,
|
|
17
|
+
): CancelableTimeout => {
|
|
18
|
+
let cancellable: CancelableTimeout | undefined;
|
|
19
|
+
const nextUpdate = (now: number): void => {
|
|
20
|
+
const timeRemaining = animationHandle.tick(now);
|
|
21
|
+
if (animationHandle.getState() === "active") {
|
|
22
|
+
listener(animationHandle.getInterpolated());
|
|
23
|
+
if (animationHandle.getProgress() === 1) {
|
|
24
|
+
animationHandle.complete();
|
|
25
|
+
cancellable = undefined;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
cancellable = timeoutController.setTimeout(nextUpdate, timeRemaining);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
cancellable = timeoutController.setTimeout(nextUpdate, timeRemaining);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
cancellable = timeoutController.setTimeout(nextUpdate, 0);
|
|
35
|
+
|
|
36
|
+
return () => cancellable?.();
|
|
37
|
+
};
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// Ported from recharts 3.9.0 src/animation/AnimationHandle.ts.
|
|
2
|
+
// Pure state machine — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
import { interpolate } from "../util/DataUtils";
|
|
4
|
+
import type { ProgressEasingFn, NamedBezier } from "./easing";
|
|
5
|
+
|
|
6
|
+
const INIT = "init" as const;
|
|
7
|
+
const PENDING = "pending" as const;
|
|
8
|
+
const ACTIVE = "active" as const;
|
|
9
|
+
const COMPLETED = "completed" as const;
|
|
10
|
+
|
|
11
|
+
export type AnimationState = typeof INIT | typeof PENDING | typeof ACTIVE | typeof COMPLETED;
|
|
12
|
+
|
|
13
|
+
type AnimationStateCallback = () => void;
|
|
14
|
+
|
|
15
|
+
function duration(time: number): number {
|
|
16
|
+
return Math.max(0, time);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
abstract class RechartsAnimation<T, E> {
|
|
20
|
+
/**
|
|
21
|
+
* Returns the absolute time after the animationBegin delay has been completed,
|
|
22
|
+
* and when the animationDuration started ticking.
|
|
23
|
+
*/
|
|
24
|
+
public getAnimationStartedTime(): number | undefined {
|
|
25
|
+
return this.animationStartedTime;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Returns the absolute time of when the animation began - now it will wait for {animationBegin} ms before the transition starts
|
|
30
|
+
*/
|
|
31
|
+
public getBeginStartedTime(): number | undefined {
|
|
32
|
+
return this.beginStartedTime;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private readonly onAnimationEnd: undefined | AnimationStateCallback;
|
|
36
|
+
|
|
37
|
+
private progress: number;
|
|
38
|
+
|
|
39
|
+
private animationStartedTime: number | undefined;
|
|
40
|
+
|
|
41
|
+
private beginStartedTime: number | undefined;
|
|
42
|
+
|
|
43
|
+
protected readonly animationDuration: number;
|
|
44
|
+
|
|
45
|
+
private readonly animationBegin: number;
|
|
46
|
+
|
|
47
|
+
private readonly from: T;
|
|
48
|
+
|
|
49
|
+
private readonly to: T;
|
|
50
|
+
|
|
51
|
+
protected readonly easing: E;
|
|
52
|
+
|
|
53
|
+
private readonly animationId: string;
|
|
54
|
+
|
|
55
|
+
constructor(param: {
|
|
56
|
+
animationId: string;
|
|
57
|
+
onAnimationStart: undefined | AnimationStateCallback;
|
|
58
|
+
onAnimationEnd: undefined | AnimationStateCallback;
|
|
59
|
+
animationDuration: number;
|
|
60
|
+
animationBegin: number;
|
|
61
|
+
from: T;
|
|
62
|
+
to: T;
|
|
63
|
+
easing: E;
|
|
64
|
+
}) {
|
|
65
|
+
this.animationId = param.animationId;
|
|
66
|
+
this.onAnimationEnd = param.onAnimationEnd;
|
|
67
|
+
this.animationDuration = duration(param.animationDuration);
|
|
68
|
+
this.animationBegin = duration(param.animationBegin);
|
|
69
|
+
this.progress = 0;
|
|
70
|
+
this.from = param.from;
|
|
71
|
+
this.to = param.to;
|
|
72
|
+
this.easing = param.easing;
|
|
73
|
+
// Mimic what the previous animationManager was doing - call onAnimationStart immediately and synchronously
|
|
74
|
+
param.onAnimationStart?.();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private state: AnimationState = INIT;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Returns the state machine current state
|
|
81
|
+
* - `init`: animation had just been created. It immediately calls `onAnimationStart`
|
|
82
|
+
* - `pending`: animation is now paused for `animationBegin` milliseconds until the transition begins
|
|
83
|
+
* - `active`: animation is transitioning items on screen
|
|
84
|
+
* - `completed`: animation has completed its transition and executed `onAnimationEnd`.
|
|
85
|
+
*/
|
|
86
|
+
public getState(): AnimationState {
|
|
87
|
+
return this.state;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Returns the easing input or function
|
|
92
|
+
*/
|
|
93
|
+
public getEasing(): E {
|
|
94
|
+
return this.easing;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Returns the configuration - the duration of the transition.
|
|
99
|
+
*/
|
|
100
|
+
public getAnimationDuration(): number {
|
|
101
|
+
return this.animationDuration;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Sets the current time of the animation. The animation sets its internal state and progress accordingly.
|
|
106
|
+
* This is current, absolute time; not additive!
|
|
107
|
+
*
|
|
108
|
+
* Returns the (relative) time remaining until the current activity is over — the same number you can
|
|
109
|
+
* put into setTimeout(fn, X) to wait until the next state transition happens.
|
|
110
|
+
*/
|
|
111
|
+
public tick(now: number): number {
|
|
112
|
+
if (this.getState() === INIT) {
|
|
113
|
+
this.state = PENDING;
|
|
114
|
+
this.beginStartedTime = now;
|
|
115
|
+
return this.animationBegin;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (this.getState() === PENDING) {
|
|
119
|
+
if (this.beginStartedTime == null) {
|
|
120
|
+
throw new Error();
|
|
121
|
+
}
|
|
122
|
+
const timeElapsed = now - this.beginStartedTime;
|
|
123
|
+
if (timeElapsed >= this.animationBegin) {
|
|
124
|
+
this.state = ACTIVE;
|
|
125
|
+
this.animationStartedTime = now;
|
|
126
|
+
// The state flipped just now so the elapsed time is zero
|
|
127
|
+
return this.nextAnimationUpdate(0);
|
|
128
|
+
}
|
|
129
|
+
return duration(this.animationBegin - timeElapsed);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (this.getState() === ACTIVE) {
|
|
133
|
+
if (this.animationStartedTime == null) {
|
|
134
|
+
throw new Error();
|
|
135
|
+
}
|
|
136
|
+
const timeElapsed = now - this.animationStartedTime;
|
|
137
|
+
this.setProgress(timeElapsed / this.animationDuration);
|
|
138
|
+
return this.nextAnimationUpdate(timeElapsed);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// state === COMPLETED, nothing interesting is going to happen
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private setProgress(newProgress: number): void {
|
|
146
|
+
this.progress = Math.min(1, Math.max(0, newProgress));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Returns an abstract "progress" which is a number between 0 and 1 showing the distance of transition.
|
|
151
|
+
* - `init`: 0
|
|
152
|
+
* - `pending`: 0
|
|
153
|
+
* - `active`: transitioning between [0, 1] based on the time elapsed
|
|
154
|
+
* - `completed`: 1
|
|
155
|
+
*
|
|
156
|
+
* The progress is hard-capped to [0, 1] to avoid overshooting caused by coarse timers,
|
|
157
|
+
* so the easing function must be applied _after_ this animation state.
|
|
158
|
+
*
|
|
159
|
+
* The progress is linear with time. If you wish for easing, use `getInterpolated()` instead.
|
|
160
|
+
*/
|
|
161
|
+
public getProgress(): number {
|
|
162
|
+
return this.progress;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Completes the animation. A completed animation cannot be manipulated anymore, its progress is set
|
|
167
|
+
* to 1, the tick function is a no-op and getState() always returns 'completed'.
|
|
168
|
+
*/
|
|
169
|
+
public complete(): void {
|
|
170
|
+
this.progress = 1;
|
|
171
|
+
if (this.state === "active") {
|
|
172
|
+
// Do not call callbacks if the animation was interrupted before it even started!
|
|
173
|
+
this.onAnimationEnd?.();
|
|
174
|
+
}
|
|
175
|
+
this.state = COMPLETED;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Returns the starting value of the animation (no progress, easing, or interpolation).
|
|
180
|
+
*/
|
|
181
|
+
public getFrom(): T {
|
|
182
|
+
return this.from;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Returns the end value of the animation (no progress, easing, or interpolation).
|
|
187
|
+
*/
|
|
188
|
+
public getTo(): T {
|
|
189
|
+
return this.to;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Unique identifier of an animation
|
|
194
|
+
*/
|
|
195
|
+
public getAnimationId(): string {
|
|
196
|
+
return this.animationId;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Returns the configuration - the duration of delay between animation initialization and transition.
|
|
201
|
+
*/
|
|
202
|
+
getAnimationBegin(): number {
|
|
203
|
+
return this.animationBegin;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Returns value of the transition at the current time. Details differ by animation type.
|
|
208
|
+
*/
|
|
209
|
+
public abstract getInterpolated(): T;
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Returns the duration of time after which the controller should ask for the next update.
|
|
213
|
+
*/
|
|
214
|
+
protected abstract nextAnimationUpdate(timeElapsed: number): number;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Animation handle representing a Javascript-based animation.
|
|
219
|
+
* This animation requires one render cycle for each frame, and it calls setTimeout as quickly as possible.
|
|
220
|
+
*
|
|
221
|
+
* @since 3.9
|
|
222
|
+
*/
|
|
223
|
+
export class JavascriptAnimation extends RechartsAnimation<number, ProgressEasingFn> {
|
|
224
|
+
protected nextAnimationUpdate(): number {
|
|
225
|
+
/*
|
|
226
|
+
* JavaScript-based animations have to update as soon as possible,
|
|
227
|
+
* so we return 0 here to indicate that the next update should be scheduled immediately.
|
|
228
|
+
*/
|
|
229
|
+
return 0;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Returns value of the animation after its easing function had been applied.
|
|
234
|
+
* This value, unlike getProgress(), can escape the [0..1] range because that is
|
|
235
|
+
* entirely within the easing function's control. Spring typically does this.
|
|
236
|
+
*/
|
|
237
|
+
public getInterpolated(): number {
|
|
238
|
+
return this.easing(interpolate(this.getFrom(), this.getTo(), this.getProgress()));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Animation handle representing a CSS transition.
|
|
244
|
+
* This animation requires only one render, and the actual transition is then handled by the browser.
|
|
245
|
+
*
|
|
246
|
+
* @since 3.9
|
|
247
|
+
*/
|
|
248
|
+
export class CSSTransitionAnimation extends RechartsAnimation<string, NamedBezier> {
|
|
249
|
+
protected nextAnimationUpdate(timeElapsed: number): number {
|
|
250
|
+
/**
|
|
251
|
+
* CSS transitions do not need DOM updates past the initial render
|
|
252
|
+
* so here we just instruct the controller to wait until the animation duration is over.
|
|
253
|
+
*/
|
|
254
|
+
return duration(this.animationDuration - timeElapsed);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Returns the final value of the animation (the `to`).
|
|
259
|
+
*
|
|
260
|
+
* CSS transitions leave both interpolation and easing to the browser,
|
|
261
|
+
* so all we need to do here is return the final state and let the browser handle the rest.
|
|
262
|
+
*/
|
|
263
|
+
public getInterpolated(): string {
|
|
264
|
+
return this.getTo();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Recharts animation state machine handle.
|
|
270
|
+
*
|
|
271
|
+
* @since 3.9
|
|
272
|
+
*/
|
|
273
|
+
export type AnimationHandle = JavascriptAnimation | CSSTransitionAnimation;
|