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,142 @@
|
|
|
1
|
+
// Ported from recharts 3.9.0 src/animation/CSSTransitionAnimate.tsx.
|
|
2
|
+
//
|
|
3
|
+
// Solid 2.0 port of the CSS-transition render-prop driver, on the v3.9 engine
|
|
4
|
+
// (CSSTransitionAnimation handle + injectable AnimationController). Deviations:
|
|
5
|
+
// - `resolveDefaultProps` → per-prop `?? default` accessors.
|
|
6
|
+
// - `useState` → `createSignal`; the `initialized` `useRef` → a `createSignal`
|
|
7
|
+
// flipped in the start effect and read reactively in the render memo.
|
|
8
|
+
// - `usePrefersReducedMotion()` returns an Accessor → call it.
|
|
9
|
+
// - the `useEffect` → two-arg `createEffect(compute, apply)`; cleanup returned
|
|
10
|
+
// from the apply phase.
|
|
11
|
+
// - `return children(style)` → a reactive `<>{props.children(styleObject())}</>`.
|
|
12
|
+
// - the children style is a `Record<string, string | undefined>`: the dynamic
|
|
13
|
+
// `[attributeName]` key can't be typed against Solid's stricter `JSX.CSSProperties`,
|
|
14
|
+
// so consumers read the known keys (e.g. `transform`/`transition`) into their style.
|
|
15
|
+
import { createEffect, createMemo, createSignal, untrack } from "solid-js";
|
|
16
|
+
import type { JSX } from "@solidjs/web";
|
|
17
|
+
import { noop } from "../util/DataUtils";
|
|
18
|
+
import { getTransitionVal } from "./util";
|
|
19
|
+
import { Global } from "../util/Global";
|
|
20
|
+
import { usePrefersReducedMotion } from "../util/usePrefersReducedMotion";
|
|
21
|
+
import { CSSTransitionAnimation } from "./AnimationHandle";
|
|
22
|
+
import type { EasingInput, NamedBezier } from "./easing";
|
|
23
|
+
import { RequestAnimationFrameTimeoutController } from "./timeoutController";
|
|
24
|
+
import type { AnimationController } from "./AnimationController";
|
|
25
|
+
import { useAnimationController } from "./useAnimationController";
|
|
26
|
+
|
|
27
|
+
/** The style object handed to the render-prop child (dynamic `[attributeName]` key). */
|
|
28
|
+
export type CSSTransitionStyle = Record<string, string | undefined>;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A CSS transition can only use a named/cubic-bezier easing — `spring` and custom
|
|
32
|
+
* function easings have no CSS equivalent, so they fall back to `ease`.
|
|
33
|
+
*/
|
|
34
|
+
export function extractCssEasing(easingInput: EasingInput): NamedBezier {
|
|
35
|
+
if (easingInput === "spring" || typeof easingInput !== "string") {
|
|
36
|
+
return "ease";
|
|
37
|
+
}
|
|
38
|
+
return easingInput;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface CSSTransitionAnimateProps {
|
|
42
|
+
animationId: string;
|
|
43
|
+
animationController?: AnimationController;
|
|
44
|
+
duration?: number;
|
|
45
|
+
begin?: number;
|
|
46
|
+
easing?: EasingInput;
|
|
47
|
+
isActive?: boolean | "auto";
|
|
48
|
+
canBegin?: boolean;
|
|
49
|
+
from: string;
|
|
50
|
+
to: string;
|
|
51
|
+
attributeName: string;
|
|
52
|
+
onAnimationStart?: () => void;
|
|
53
|
+
onAnimationEnd?: () => void;
|
|
54
|
+
children: (style: CSSTransitionStyle) => JSX.Element;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function CSSTransitionAnimate(props: CSSTransitionAnimateProps): JSX.Element {
|
|
58
|
+
const duration = (): number => props.duration ?? 1000;
|
|
59
|
+
const easing = (): NamedBezier => extractCssEasing(props.easing ?? "ease");
|
|
60
|
+
const begin = (): number => props.begin ?? 0;
|
|
61
|
+
const canBegin = (): boolean => props.canBegin ?? true;
|
|
62
|
+
const isActiveProp = (): boolean | "auto" => props.isActive ?? true;
|
|
63
|
+
const onAnimationStartProp = (): (() => void) => props.onAnimationStart ?? noop;
|
|
64
|
+
const onAnimationEnd = (): (() => void) => props.onAnimationEnd ?? noop;
|
|
65
|
+
|
|
66
|
+
const prefersReducedMotion = usePrefersReducedMotion();
|
|
67
|
+
|
|
68
|
+
const isActive = (): boolean => {
|
|
69
|
+
const active = isActiveProp();
|
|
70
|
+
return active === "auto" ? !Global.isSsr && !prefersReducedMotion() : active;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const animationController = useAnimationController(props.animationController);
|
|
74
|
+
|
|
75
|
+
const [style, setStyle] = createSignal<string>(
|
|
76
|
+
untrack(() => (isActive() ? props.from : props.to)),
|
|
77
|
+
);
|
|
78
|
+
const [initialized, setInitialized] = createSignal(false);
|
|
79
|
+
|
|
80
|
+
// Start (and clean up) the animation when its inputs change. `onStart` closes over
|
|
81
|
+
// the already-read `deps.from` (reading props.from when the controller invokes it
|
|
82
|
+
// later would be an untracked read).
|
|
83
|
+
createEffect(
|
|
84
|
+
() => ({
|
|
85
|
+
active: isActive(),
|
|
86
|
+
canBegin: canBegin(),
|
|
87
|
+
duration: duration(),
|
|
88
|
+
easing: easing(),
|
|
89
|
+
begin: begin(),
|
|
90
|
+
from: props.from,
|
|
91
|
+
to: props.to,
|
|
92
|
+
animationId: props.animationId,
|
|
93
|
+
attributeName: props.attributeName,
|
|
94
|
+
onStart: onAnimationStartProp(),
|
|
95
|
+
onEnd: onAnimationEnd(),
|
|
96
|
+
controller: animationController,
|
|
97
|
+
}),
|
|
98
|
+
(deps) => {
|
|
99
|
+
if (!deps.active || !deps.canBegin) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
setInitialized(true);
|
|
103
|
+
const onStart = (): void => {
|
|
104
|
+
setStyle(deps.from);
|
|
105
|
+
deps.onStart();
|
|
106
|
+
};
|
|
107
|
+
const timeoutController = new RequestAnimationFrameTimeoutController();
|
|
108
|
+
const animation = new CSSTransitionAnimation({
|
|
109
|
+
animationId: deps.animationId + deps.attributeName,
|
|
110
|
+
easing: deps.easing,
|
|
111
|
+
animationDuration: deps.duration,
|
|
112
|
+
animationBegin: deps.begin,
|
|
113
|
+
onAnimationStart: onStart,
|
|
114
|
+
onAnimationEnd: deps.onEnd,
|
|
115
|
+
from: deps.from,
|
|
116
|
+
to: deps.to,
|
|
117
|
+
});
|
|
118
|
+
return deps.controller(timeoutController, animation, (next) => setStyle(String(next)));
|
|
119
|
+
},
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
// All reactive reads live in this memo (a tracking scope); the JSX insert below
|
|
123
|
+
// re-invokes the render-prop child whenever the resolved style changes.
|
|
124
|
+
const styleObject = createMemo<CSSTransitionStyle>(() => {
|
|
125
|
+
if (!isActive()) {
|
|
126
|
+
// isActive=false: render the final style immediately, no transition.
|
|
127
|
+
return { [props.attributeName]: props.to };
|
|
128
|
+
}
|
|
129
|
+
if (!canBegin()) {
|
|
130
|
+
return { [props.attributeName]: props.from };
|
|
131
|
+
}
|
|
132
|
+
if (initialized()) {
|
|
133
|
+
return {
|
|
134
|
+
transition: getTransitionVal([props.attributeName], duration(), easing()),
|
|
135
|
+
[props.attributeName]: style(),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return { [props.attributeName]: props.from };
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
return <>{props.children(styleObject())}</>;
|
|
142
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// Ported from recharts 3.9.0 src/animation/JavascriptAnimate.tsx.
|
|
2
|
+
//
|
|
3
|
+
// Solid 2.0 port of the JavaScript render-prop animation driver, on the v3.9 engine
|
|
4
|
+
// (JavascriptAnimation handle + injectable AnimationController). Deviations:
|
|
5
|
+
// - `resolveDefaultProps` → per-prop `?? default` accessors.
|
|
6
|
+
// - `useState` → `createSignal`; the two `useEffect`s → two-arg
|
|
7
|
+
// `createEffect(compute, apply)`; the start effect returns its cleanup.
|
|
8
|
+
// - `usePrefersReducedMotion()` returns an Accessor → call it.
|
|
9
|
+
// - `return children(Number(style))` → a reactive `{props.children(...)}` so the
|
|
10
|
+
// function child re-runs each frame (Solid components run once).
|
|
11
|
+
// This is the same driver `AnimatedItems` uses; standalone consumers are the shape
|
|
12
|
+
// update-tweens (`Rectangle`, `Trapezoid`).
|
|
13
|
+
import { createSignal, createEffect, untrack } from "solid-js";
|
|
14
|
+
import type { JSX } from "@solidjs/web";
|
|
15
|
+
import { noop } from "../util/DataUtils";
|
|
16
|
+
import { createEasingFunction, type EasingInput } from "./easing";
|
|
17
|
+
import { Global } from "../util/Global";
|
|
18
|
+
import { usePrefersReducedMotion } from "../util/usePrefersReducedMotion";
|
|
19
|
+
import { JavascriptAnimation } from "./AnimationHandle";
|
|
20
|
+
import { RequestAnimationFrameTimeoutController } from "./timeoutController";
|
|
21
|
+
import type { AnimationController } from "./AnimationController";
|
|
22
|
+
import { useAnimationController } from "./useAnimationController";
|
|
23
|
+
|
|
24
|
+
interface JavascriptAnimateProps {
|
|
25
|
+
animationId: string;
|
|
26
|
+
animationController?: AnimationController;
|
|
27
|
+
duration?: number;
|
|
28
|
+
begin?: number;
|
|
29
|
+
easing?: EasingInput;
|
|
30
|
+
isActive?: boolean | "auto";
|
|
31
|
+
canBegin?: boolean;
|
|
32
|
+
onAnimationStart?: () => void;
|
|
33
|
+
onAnimationEnd?: () => void;
|
|
34
|
+
children: (time: number) => JSX.Element;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const from = 0;
|
|
38
|
+
const to = 1;
|
|
39
|
+
|
|
40
|
+
export function JavascriptAnimate(props: JavascriptAnimateProps): JSX.Element {
|
|
41
|
+
const duration = (): number => props.duration ?? 1000;
|
|
42
|
+
const easing = (): EasingInput => props.easing ?? "ease";
|
|
43
|
+
const begin = (): number => props.begin ?? 0;
|
|
44
|
+
const canBegin = (): boolean => props.canBegin ?? true;
|
|
45
|
+
const isActiveProp = (): boolean | "auto" => props.isActive ?? true;
|
|
46
|
+
const onAnimationStart = (): (() => void) => props.onAnimationStart ?? noop;
|
|
47
|
+
const onAnimationEnd = (): (() => void) => props.onAnimationEnd ?? noop;
|
|
48
|
+
|
|
49
|
+
const prefersReducedMotion = usePrefersReducedMotion();
|
|
50
|
+
|
|
51
|
+
const isActive = (): boolean => {
|
|
52
|
+
const active = isActiveProp();
|
|
53
|
+
return active === "auto" ? !Global.isSsr && !prefersReducedMotion() : active;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const animationController = useAnimationController(props.animationController);
|
|
57
|
+
|
|
58
|
+
const [style, setStyle] = createSignal<number | string>(untrack(() => (isActive() ? from : to)));
|
|
59
|
+
|
|
60
|
+
// When the animation is not active, jump straight to the final state.
|
|
61
|
+
createEffect(
|
|
62
|
+
() => isActive(),
|
|
63
|
+
(active) => {
|
|
64
|
+
if (!active) {
|
|
65
|
+
setStyle(to);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
// Start (and clean up) the animation when its inputs change.
|
|
71
|
+
createEffect(
|
|
72
|
+
() => ({
|
|
73
|
+
active: isActive(),
|
|
74
|
+
canBegin: canBegin(),
|
|
75
|
+
duration: duration(),
|
|
76
|
+
easing: easing(),
|
|
77
|
+
begin: begin(),
|
|
78
|
+
animationId: props.animationId,
|
|
79
|
+
onAnimationStart: onAnimationStart(),
|
|
80
|
+
onAnimationEnd: onAnimationEnd(),
|
|
81
|
+
controller: animationController,
|
|
82
|
+
}),
|
|
83
|
+
(deps) => {
|
|
84
|
+
if (!deps.active || !deps.canBegin) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
const easingFunction = createEasingFunction(deps.easing);
|
|
88
|
+
if (easingFunction == null) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
const timeoutController = new RequestAnimationFrameTimeoutController();
|
|
92
|
+
const animation = new JavascriptAnimation({
|
|
93
|
+
animationId: deps.animationId,
|
|
94
|
+
easing: easingFunction,
|
|
95
|
+
animationDuration: deps.duration,
|
|
96
|
+
animationBegin: deps.begin,
|
|
97
|
+
onAnimationStart: deps.onAnimationStart,
|
|
98
|
+
onAnimationEnd: deps.onAnimationEnd,
|
|
99
|
+
from,
|
|
100
|
+
to,
|
|
101
|
+
});
|
|
102
|
+
return deps.controller(timeoutController, animation, setStyle);
|
|
103
|
+
},
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
return <>{props.children(Number(style()))}</>;
|
|
107
|
+
}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/animation/easing.ts (commit 7a23854).
|
|
2
|
+
// Pure math — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
// Deviations from the reference are limited to satisfying this repo's type
|
|
4
|
+
// discipline (no `as` / no non-null `!`); `as const` is retained where it
|
|
5
|
+
// brands the stepper/bezier discriminant.
|
|
6
|
+
|
|
7
|
+
export const ACCURACY = 1e-4;
|
|
8
|
+
|
|
9
|
+
const cubicBezierFactor = (c1: number, c2: number): number[] => [
|
|
10
|
+
0,
|
|
11
|
+
3 * c1,
|
|
12
|
+
3 * c2 - 6 * c1,
|
|
13
|
+
3 * c1 - 3 * c2 + 1,
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
const evaluatePolynomial = (params: ReadonlyArray<number>, t: number): number =>
|
|
17
|
+
params.map((param, i) => param * t ** i).reduce((pre, curr) => pre + curr);
|
|
18
|
+
|
|
19
|
+
const cubicBezier = (c1: number, c2: number) => (t: number) => {
|
|
20
|
+
const params = cubicBezierFactor(c1, c2);
|
|
21
|
+
|
|
22
|
+
return evaluatePolynomial(params, t);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const derivativeCubicBezier = (c1: number, c2: number) => (t: number) => {
|
|
26
|
+
const params = cubicBezierFactor(c1, c2);
|
|
27
|
+
const newParams = [...params.map((param, i) => param * i).slice(1), 0];
|
|
28
|
+
|
|
29
|
+
return evaluatePolynomial(newParams, t);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type CubicBezierTemplate = `cubic-bezier(${number},${number},${number},${number})`;
|
|
33
|
+
|
|
34
|
+
export type NamedBezier =
|
|
35
|
+
| "linear"
|
|
36
|
+
| "ease"
|
|
37
|
+
| "ease-in"
|
|
38
|
+
| "ease-out"
|
|
39
|
+
| "ease-in-out"
|
|
40
|
+
| CubicBezierTemplate;
|
|
41
|
+
|
|
42
|
+
type BezierInput = [NamedBezier] | [number, number, number, number];
|
|
43
|
+
|
|
44
|
+
export type BezierEasingFunction = {
|
|
45
|
+
isStepper: false;
|
|
46
|
+
(t: number): number;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const parseCubicBezier = (easing: string): [number, number, number, number] | null => {
|
|
50
|
+
const easingParts = easing.split("(");
|
|
51
|
+
if (easingParts.length !== 2 || easingParts[0] !== "cubic-bezier") {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const numbers = easingParts[1]?.split(")")[0]?.split(",");
|
|
55
|
+
if (numbers == null || numbers.length !== 4) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const [x1, y1, x2, y2] = numbers.map((x: string) => parseFloat(x));
|
|
59
|
+
// `noUncheckedIndexedAccess` keeps the tuple elements possibly-undefined even
|
|
60
|
+
// after the length check, so narrow explicitly instead of asserting.
|
|
61
|
+
if (x1 === undefined || y1 === undefined || x2 === undefined || y2 === undefined) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return [x1, y1, x2, y2];
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const getBezierCoordinates = (...args: BezierInput): [number, number, number, number] => {
|
|
68
|
+
if (args.length === 1) {
|
|
69
|
+
switch (args[0]) {
|
|
70
|
+
case "linear":
|
|
71
|
+
return [0.0, 0.0, 1.0, 1.0];
|
|
72
|
+
case "ease":
|
|
73
|
+
return [0.25, 0.1, 0.25, 1.0];
|
|
74
|
+
case "ease-in":
|
|
75
|
+
return [0.42, 0.0, 1.0, 1.0];
|
|
76
|
+
case "ease-out":
|
|
77
|
+
return [0.42, 0.0, 0.58, 1.0];
|
|
78
|
+
case "ease-in-out":
|
|
79
|
+
return [0.0, 0.0, 0.58, 1.0];
|
|
80
|
+
default: {
|
|
81
|
+
const easing = parseCubicBezier(args[0]);
|
|
82
|
+
if (easing) {
|
|
83
|
+
return easing;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (args.length === 4) {
|
|
90
|
+
return args;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Fallback for invalid inputs. The previous implementation was buggy and would lead to NaN.
|
|
94
|
+
// Returning linear easing is a safe default.
|
|
95
|
+
return [0.0, 0.0, 1.0, 1.0];
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const createBezierEasing = (
|
|
99
|
+
x1: number,
|
|
100
|
+
y1: number,
|
|
101
|
+
x2: number,
|
|
102
|
+
y2: number,
|
|
103
|
+
): BezierEasingFunction => {
|
|
104
|
+
const curveX = cubicBezier(x1, x2);
|
|
105
|
+
const curveY = cubicBezier(y1, y2);
|
|
106
|
+
const derCurveX = derivativeCubicBezier(x1, x2);
|
|
107
|
+
const rangeValue = (value: number): number => {
|
|
108
|
+
if (value > 1) {
|
|
109
|
+
return 1;
|
|
110
|
+
}
|
|
111
|
+
if (value < 0) {
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return value;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const bezier = (_t: number) => {
|
|
119
|
+
const t = _t > 1 ? 1 : _t;
|
|
120
|
+
let x = t;
|
|
121
|
+
|
|
122
|
+
for (let i = 0; i < 8; ++i) {
|
|
123
|
+
const evalT = curveX(x) - t;
|
|
124
|
+
const derVal = derCurveX(x);
|
|
125
|
+
|
|
126
|
+
if (Math.abs(evalT - t) < ACCURACY || derVal < ACCURACY) {
|
|
127
|
+
return curveY(x);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
x = rangeValue(x - evalT / derVal);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return curveY(x);
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
bezier.isStepper = false as const;
|
|
137
|
+
|
|
138
|
+
return bezier;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// calculate cubic-bezier using Newton's method
|
|
142
|
+
export const configBezier = (...args: BezierInput): BezierEasingFunction => {
|
|
143
|
+
return createBezierEasing(...getBezierCoordinates(...args));
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
type SpringInput = {
|
|
147
|
+
/**
|
|
148
|
+
* The stiffness coefficient of the spring.
|
|
149
|
+
* Higher values create a more forceful, faster pull towards the target.
|
|
150
|
+
*/
|
|
151
|
+
stiff?: number;
|
|
152
|
+
/**
|
|
153
|
+
* The damping coefficient (friction/resistance).
|
|
154
|
+
* Higher values reduce bounciness and stop oscillation sooner. Lower values create more bounce.
|
|
155
|
+
*/
|
|
156
|
+
damping?: number;
|
|
157
|
+
/**
|
|
158
|
+
* The physics simulation time step in milliseconds.
|
|
159
|
+
* Determines the granularity of the baked frames. 16.67ms roughly equals a 60fps frame delta.
|
|
160
|
+
*/
|
|
161
|
+
dt?: number;
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Creates a performance-optimized, progress-based spring easing function.
|
|
166
|
+
* It pre-calculates ("bakes") spring physics frames upfront based on a fixed duration,
|
|
167
|
+
* then returns a pure, lightweight function mapping progress (0 to 1) to the animated position.
|
|
168
|
+
* This approach is ideal for low-power devices because it removes heavy physics math from the frame loop.
|
|
169
|
+
*/
|
|
170
|
+
export const createSpringEasing = (config: SpringInput = {}): ProgressEasingFn => {
|
|
171
|
+
const { stiff = 100, damping = 8, dt = 16.67 } = config;
|
|
172
|
+
const destX = 1;
|
|
173
|
+
|
|
174
|
+
const positions: number[] = [0];
|
|
175
|
+
let currX = 0;
|
|
176
|
+
let currV = 0;
|
|
177
|
+
|
|
178
|
+
// Safety valve to prevent accidental infinite loops if physics config is extreme
|
|
179
|
+
const maxIterations = 10000;
|
|
180
|
+
let iterations = 0;
|
|
181
|
+
|
|
182
|
+
// 1. Run the simulation until the spring completely stops moving
|
|
183
|
+
while (iterations < maxIterations) {
|
|
184
|
+
const FSpring = -(currX - destX) * stiff;
|
|
185
|
+
const FDamping = currV * damping;
|
|
186
|
+
|
|
187
|
+
currV += ((FSpring - FDamping) * dt) / 1000;
|
|
188
|
+
currX += (currV * dt) / 1000;
|
|
189
|
+
|
|
190
|
+
positions.push(currX);
|
|
191
|
+
|
|
192
|
+
// Stop only when position is essentially at 1.0 AND bounce velocity has died down
|
|
193
|
+
if (Math.abs(currX - destX) < ACCURACY && Math.abs(currV) < ACCURACY) {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
iterations++;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Force the absolute final element to be exactly 1.0 for a perfect finish
|
|
200
|
+
positions[positions.length - 1] = destX;
|
|
201
|
+
const maxIndex = positions.length - 1;
|
|
202
|
+
|
|
203
|
+
// 2. The ultra-smooth runtime function mapping your 0..1 progress
|
|
204
|
+
return (t: number): number => {
|
|
205
|
+
if (t <= 0) return 0;
|
|
206
|
+
if (t >= 1) return destX;
|
|
207
|
+
|
|
208
|
+
// Scale t (0..1) proportionally across our entire pre-calculated array
|
|
209
|
+
const exactFrame = t * maxIndex;
|
|
210
|
+
const index = Math.floor(exactFrame);
|
|
211
|
+
const fraction = exactFrame - index;
|
|
212
|
+
|
|
213
|
+
// Blend between the two closest frames
|
|
214
|
+
return (
|
|
215
|
+
(positions[index] ?? 0) + ((positions[index + 1] ?? 0) - (positions[index] ?? 0)) * fraction
|
|
216
|
+
);
|
|
217
|
+
};
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* The unified easing-function shape (v3.9): maps progress `t` to an eased value.
|
|
222
|
+
* `ProgressEasingFn` is the canonical name; `EasingFunction` is kept as an alias for
|
|
223
|
+
* callers that reference it.
|
|
224
|
+
*/
|
|
225
|
+
export type ProgressEasingFn = (t: number) => number;
|
|
226
|
+
export type EasingFunction = ProgressEasingFn;
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* @inline
|
|
230
|
+
*/
|
|
231
|
+
export type EasingInput = NamedBezier | "spring" | EasingFunction;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* The v3.9 easing resolver. Resolves an {@link EasingInput} to a {@link ProgressEasingFn}:
|
|
235
|
+
* named beziers, `cubic-bezier(...)`, `'spring'` via baked physics, or a passed-through
|
|
236
|
+
* `(t) => number`. Returns `null` for unrecognized input.
|
|
237
|
+
*/
|
|
238
|
+
export const createEasingFunction = (easing: EasingInput): ProgressEasingFn | null => {
|
|
239
|
+
if (typeof easing === "string") {
|
|
240
|
+
switch (easing) {
|
|
241
|
+
case "ease":
|
|
242
|
+
case "ease-in-out":
|
|
243
|
+
case "ease-out":
|
|
244
|
+
case "ease-in":
|
|
245
|
+
case "linear":
|
|
246
|
+
return configBezier(easing);
|
|
247
|
+
case "spring":
|
|
248
|
+
return createSpringEasing();
|
|
249
|
+
default:
|
|
250
|
+
if (easing.split("(")[0] === "cubic-bezier") {
|
|
251
|
+
return configBezier(easing);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (typeof easing === "function") {
|
|
257
|
+
return easing;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return null;
|
|
261
|
+
};
|