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.
Files changed (639) hide show
  1. package/NEXT_SESSION_PROMPT.md +114 -0
  2. package/package.json +28 -0
  3. package/src/animation/AnimatedItems.tsx +169 -0
  4. package/src/animation/AnimationController.ts +24 -0
  5. package/src/animation/AnimationControllerImpl.ts +37 -0
  6. package/src/animation/AnimationHandle.ts +273 -0
  7. package/src/animation/CSSTransitionAnimate.tsx +142 -0
  8. package/src/animation/JavascriptAnimate.tsx +107 -0
  9. package/src/animation/easing.ts +261 -0
  10. package/src/animation/matchBy.ts +211 -0
  11. package/src/animation/timeoutController.ts +51 -0
  12. package/src/animation/useAnimationController.tsx +31 -0
  13. package/src/animation/useAnimationStartSnapshot.ts +73 -0
  14. package/src/animation/util.ts +16 -0
  15. package/src/cartesian/Area.tsx +810 -0
  16. package/src/cartesian/AreaRevealShape.tsx +250 -0
  17. package/src/cartesian/Bar.tsx +1216 -0
  18. package/src/cartesian/BarStack.tsx +148 -0
  19. package/src/cartesian/Brush.tsx +653 -0
  20. package/src/cartesian/CartesianAxis.tsx +541 -0
  21. package/src/cartesian/CartesianGrid.tsx +605 -0
  22. package/src/cartesian/ErrorBar.tsx +319 -0
  23. package/src/cartesian/Funnel.tsx +594 -0
  24. package/src/cartesian/GraphicalItemClipPath.tsx +75 -0
  25. package/src/cartesian/Line.tsx +742 -0
  26. package/src/cartesian/LineDrawShape.tsx +190 -0
  27. package/src/cartesian/ReferenceArea.tsx +275 -0
  28. package/src/cartesian/ReferenceDot.tsx +286 -0
  29. package/src/cartesian/ReferenceLine.tsx +414 -0
  30. package/src/cartesian/RenderedTicksReporter.tsx +49 -0
  31. package/src/cartesian/Scatter.tsx +741 -0
  32. package/src/cartesian/XAxis.tsx +293 -0
  33. package/src/cartesian/YAxis.tsx +333 -0
  34. package/src/cartesian/ZAxis.tsx +80 -0
  35. package/src/cartesian/getCartesianPosition.ts +255 -0
  36. package/src/cartesian/getEquidistantTicks.ts +126 -0
  37. package/src/cartesian/getTicks.ts +225 -0
  38. package/src/cartesian/useAnimatedLineLength.ts +84 -0
  39. package/src/chart/AreaChart.tsx +30 -0
  40. package/src/chart/BarChart.tsx +27 -0
  41. package/src/chart/CartesianChart.tsx +91 -0
  42. package/src/chart/CategoricalChart.tsx +60 -0
  43. package/src/chart/ComposedChart.tsx +29 -0
  44. package/src/chart/FunnelChart.tsx +29 -0
  45. package/src/chart/LineChart.tsx +29 -0
  46. package/src/chart/PieChart.tsx +41 -0
  47. package/src/chart/PolarChart.tsx +97 -0
  48. package/src/chart/RadarChart.tsx +37 -0
  49. package/src/chart/RadialBarChart.tsx +39 -0
  50. package/src/chart/RechartsWrapper.tsx +486 -0
  51. package/src/chart/Sankey.tsx +992 -0
  52. package/src/chart/ScatterChart.tsx +29 -0
  53. package/src/chart/SunburstChart.tsx +394 -0
  54. package/src/chart/Treemap.tsx +874 -0
  55. package/src/chart/types.ts +37 -0
  56. package/src/component/ActivePoints.tsx +136 -0
  57. package/src/component/Cell.tsx +72 -0
  58. package/src/component/Cursor.tsx +249 -0
  59. package/src/component/Customized.tsx +8 -0
  60. package/src/component/DefaultLegendContent.tsx +205 -0
  61. package/src/component/DefaultTooltipContent.tsx +247 -0
  62. package/src/component/Dots.tsx +128 -0
  63. package/src/component/Label.tsx +507 -0
  64. package/src/component/LabelList.tsx +270 -0
  65. package/src/component/Legend.tsx +273 -0
  66. package/src/component/ResponsiveContainer.tsx +397 -0
  67. package/src/component/Text.tsx +436 -0
  68. package/src/component/Tooltip.tsx +309 -0
  69. package/src/component/TooltipBoundingBox.tsx +152 -0
  70. package/src/component/responsiveContainerUtils.ts +128 -0
  71. package/src/container/ClipPathProvider.tsx +40 -0
  72. package/src/container/Layer.tsx +38 -0
  73. package/src/container/RootSurface.tsx +124 -0
  74. package/src/container/Surface.tsx +70 -0
  75. package/src/context/ErrorBarContext.tsx +85 -0
  76. package/src/context/PanoramaContext.tsx +13 -0
  77. package/src/context/RegisterGraphicalItemId.tsx +41 -0
  78. package/src/context/accessibilityContext.tsx +10 -0
  79. package/src/context/brushUpdateContext.ts +14 -0
  80. package/src/context/chartDataContext.tsx +79 -0
  81. package/src/context/chartLayoutContext.tsx +158 -0
  82. package/src/context/legendPayloadContext.ts +11 -0
  83. package/src/context/legendPortalContext.ts +11 -0
  84. package/src/context/tooltipContext.ts +72 -0
  85. package/src/context/tooltipPortalContext.ts +14 -0
  86. package/src/context/useTooltipAxis.ts +24 -0
  87. package/src/hooks.ts +312 -0
  88. package/src/index.ts +288 -0
  89. package/src/polar/Pie.tsx +912 -0
  90. package/src/polar/PolarAngleAxis.tsx +494 -0
  91. package/src/polar/PolarGrid.tsx +269 -0
  92. package/src/polar/PolarRadiusAxis.tsx +422 -0
  93. package/src/polar/Radar.tsx +652 -0
  94. package/src/polar/RadialBar.tsx +767 -0
  95. package/src/polar/defaultPolarAngleAxisProps.tsx +33 -0
  96. package/src/polar/defaultPolarRadiusAxisProps.tsx +28 -0
  97. package/src/shape/Cross.tsx +83 -0
  98. package/src/shape/Curve.tsx +335 -0
  99. package/src/shape/Dot.tsx +49 -0
  100. package/src/shape/Polygon.tsx +168 -0
  101. package/src/shape/Rectangle.tsx +301 -0
  102. package/src/shape/Sector.tsx +304 -0
  103. package/src/shape/Symbols.tsx +144 -0
  104. package/src/shape/Trapezoid.tsx +228 -0
  105. package/src/state/RechartsReduxContext.tsx +8 -0
  106. package/src/state/RechartsStoreContext.ts +15 -0
  107. package/src/state/RechartsStoreProvider.tsx +27 -0
  108. package/src/state/ReportChartProps.tsx +19 -0
  109. package/src/state/ReportEventSettings.tsx +19 -0
  110. package/src/state/ReportMainChartProps.tsx +35 -0
  111. package/src/state/ReportPolarOptions.tsx +28 -0
  112. package/src/state/SetLegendPayload.ts +50 -0
  113. package/src/state/SetTooltipEntrySettings.tsx +46 -0
  114. package/src/state/brushSlice.ts +60 -0
  115. package/src/state/cartesianAxisSlice.ts +288 -0
  116. package/src/state/chartDataSlice.ts +115 -0
  117. package/src/state/errorBarSlice.ts +84 -0
  118. package/src/state/eventSettingsSlice.ts +41 -0
  119. package/src/state/externalEventsMiddleware.ts +136 -0
  120. package/src/state/graphicalItemsSlice.ts +162 -0
  121. package/src/state/hooks.ts +42 -0
  122. package/src/state/keyboardEventsMiddleware.ts +213 -0
  123. package/src/state/layoutSlice.ts +71 -0
  124. package/src/state/legendSlice.ts +107 -0
  125. package/src/state/mouseEventsMiddleware.ts +103 -0
  126. package/src/state/optionsSlice.ts +64 -0
  127. package/src/state/polarAxisSlice.ts +65 -0
  128. package/src/state/polarOptionsSlice.ts +54 -0
  129. package/src/state/reduxDevtoolsJsonStringifyReplacer.ts +15 -0
  130. package/src/state/referenceElementsSlice.ts +121 -0
  131. package/src/state/renderedTicksSlice.ts +61 -0
  132. package/src/state/rootPropsSlice.ts +70 -0
  133. package/src/state/selectors/areaSelectors.ts +169 -0
  134. package/src/state/selectors/arrayEqualityCheck.ts +8 -0
  135. package/src/state/selectors/axisSelectors.ts +2196 -0
  136. package/src/state/selectors/barSelectors.ts +319 -0
  137. package/src/state/selectors/barStackSelectors.ts +79 -0
  138. package/src/state/selectors/brushSelectors.ts +40 -0
  139. package/src/state/selectors/combiners/combineActiveLabel.ts +21 -0
  140. package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +93 -0
  141. package/src/state/selectors/combiners/combineAllBarPositions.ts +131 -0
  142. package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +17 -0
  143. package/src/state/selectors/combiners/combineBarPosition.ts +24 -0
  144. package/src/state/selectors/combiners/combineBarSizeList.ts +75 -0
  145. package/src/state/selectors/combiners/combineCheckedDomain.ts +49 -0
  146. package/src/state/selectors/combiners/combineConfiguredScale.ts +121 -0
  147. package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +43 -0
  148. package/src/state/selectors/combiners/combineDisplayedStackedData.ts +50 -0
  149. package/src/state/selectors/combiners/combineInverseScaleFunction.ts +17 -0
  150. package/src/state/selectors/combiners/combineRealScaleType.ts +48 -0
  151. package/src/state/selectors/combiners/combineStackedData.ts +28 -0
  152. package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
  153. package/src/state/selectors/combiners/combineTooltipPayload.ts +203 -0
  154. package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +45 -0
  155. package/src/state/selectors/containerSelectors.ts +12 -0
  156. package/src/state/selectors/dataSelectors.ts +90 -0
  157. package/src/state/selectors/funnelSelectors.ts +83 -0
  158. package/src/state/selectors/graphicalItemSelectors.ts +23 -0
  159. package/src/state/selectors/legendSelectors.ts +29 -0
  160. package/src/state/selectors/lineSelectors.ts +111 -0
  161. package/src/state/selectors/numberDomainEqualityCheck.ts +8 -0
  162. package/src/state/selectors/pickAxisId.ts +6 -0
  163. package/src/state/selectors/pickAxisType.ts +4 -0
  164. package/src/state/selectors/pieSelectors.ts +103 -0
  165. package/src/state/selectors/polarAxisSelectors.ts +202 -0
  166. package/src/state/selectors/polarGridSelectors.ts +24 -0
  167. package/src/state/selectors/polarScaleSelectors.ts +149 -0
  168. package/src/state/selectors/polarSelectors.ts +211 -0
  169. package/src/state/selectors/radarSelectors.ts +152 -0
  170. package/src/state/selectors/radialBarSelectors.ts +328 -0
  171. package/src/state/selectors/rootPropsSelectors.ts +36 -0
  172. package/src/state/selectors/scatterSelectors.ts +77 -0
  173. package/src/state/selectors/selectAllAxes.ts +10 -0
  174. package/src/state/selectors/selectChartOffset.ts +15 -0
  175. package/src/state/selectors/selectChartOffsetInternal.ts +111 -0
  176. package/src/state/selectors/selectPlotArea.ts +27 -0
  177. package/src/state/selectors/selectTooltipAxisId.ts +6 -0
  178. package/src/state/selectors/selectTooltipAxisType.ts +33 -0
  179. package/src/state/selectors/selectTooltipEventType.ts +45 -0
  180. package/src/state/selectors/selectTooltipPayloadSearcher.ts +7 -0
  181. package/src/state/selectors/selectTooltipSettings.ts +6 -0
  182. package/src/state/selectors/selectTooltipState.ts +5 -0
  183. package/src/state/selectors/tooltipSelectors.ts +690 -0
  184. package/src/state/selectors/touchSelectors.ts +29 -0
  185. package/src/state/store.ts +167 -0
  186. package/src/state/tooltipSlice.ts +289 -0
  187. package/src/state/types/AreaSettings.ts +17 -0
  188. package/src/state/types/BarSettings.ts +16 -0
  189. package/src/state/types/LineSettings.ts +12 -0
  190. package/src/state/types/PieSettings.ts +32 -0
  191. package/src/state/types/RadarSettings.ts +6 -0
  192. package/src/state/types/RadialBarSettings.ts +10 -0
  193. package/src/state/types/ScatterSettings.ts +13 -0
  194. package/src/state/types/StackedGraphicalItem.ts +33 -0
  195. package/src/state/unregisterOnCleanup.ts +26 -0
  196. package/src/state/zIndexSlice.ts +128 -0
  197. package/src/synchronisation/syncRegistry.ts +131 -0
  198. package/src/synchronisation/syncSelectors.ts +7 -0
  199. package/src/synchronisation/types.ts +42 -0
  200. package/src/synchronisation/useChartSynchronisation.tsx +372 -0
  201. package/src/types.ts +39 -0
  202. package/src/util/ActiveShapeUtils.tsx +80 -0
  203. package/src/util/BarUtils.tsx +74 -0
  204. package/src/util/CartesianUtils.ts +53 -0
  205. package/src/util/ChartUtils.ts +696 -0
  206. package/src/util/Constants.ts +42 -0
  207. package/src/util/CssPrefixUtils.ts +24 -0
  208. package/src/util/DOMUtils.ts +141 -0
  209. package/src/util/DataUtils.ts +205 -0
  210. package/src/util/FunnelUtils.tsx +37 -0
  211. package/src/util/Global.ts +15 -0
  212. package/src/util/IfOverflow.ts +17 -0
  213. package/src/util/LRUCache.ts +46 -0
  214. package/src/util/LogUtils.ts +26 -0
  215. package/src/util/PolarUtils.ts +134 -0
  216. package/src/util/RadialBarUtils.tsx +35 -0
  217. package/src/util/ReduceCSSCalc.ts +186 -0
  218. package/src/util/ShallowEqual.ts +43 -0
  219. package/src/util/TickUtils.ts +61 -0
  220. package/src/util/YAxisUtils.ts +49 -0
  221. package/src/util/adaptEventHandlers.ts +69 -0
  222. package/src/util/axisPropsAreEqual.ts +42 -0
  223. package/src/util/collectionUtils.ts +83 -0
  224. package/src/util/createCartesianCharts.tsx +101 -0
  225. package/src/util/createEventProxy.ts +24 -0
  226. package/src/util/createPolarCharts.tsx +86 -0
  227. package/src/util/cursor/getCursorPoints.ts +48 -0
  228. package/src/util/cursor/getCursorRectangle.ts +31 -0
  229. package/src/util/cursor/getRadialCursorPoints.ts +34 -0
  230. package/src/util/excludeEventProps.ts +172 -0
  231. package/src/util/getActiveCoordinate.ts +205 -0
  232. package/src/util/getAxisTypeBasedOnLayout.ts +21 -0
  233. package/src/util/getEveryNth.ts +30 -0
  234. package/src/util/getRadiusAndStrokeWidthFromDot.ts +35 -0
  235. package/src/util/getRelativeCoordinate.ts +84 -0
  236. package/src/util/getSliced.ts +21 -0
  237. package/src/util/isDomainSpecifiedByUser.ts +217 -0
  238. package/src/util/isWellBehavedNumber.ts +10 -0
  239. package/src/util/objectPath.ts +129 -0
  240. package/src/util/payload/getUniqPayload.ts +31 -0
  241. package/src/util/propsAreEqual.ts +137 -0
  242. package/src/util/resolveDefaultProps.tsx +8 -0
  243. package/src/util/round.ts +35 -0
  244. package/src/util/scale/CartesianScaleHelper.ts +72 -0
  245. package/src/util/scale/CustomScaleDefinition.ts +82 -0
  246. package/src/util/scale/RechartsScale.ts +131 -0
  247. package/src/util/scale/createCategoricalInverse.ts +83 -0
  248. package/src/util/scale/getNiceTickValues.ts +334 -0
  249. package/src/util/scale/index.ts +3 -0
  250. package/src/util/scale/util/DecimalLite.ts +194 -0
  251. package/src/util/scale/util/arithmetic.ts +56 -0
  252. package/src/util/stacks/getStackSeriesIdentifier.ts +20 -0
  253. package/src/util/stacks/stackTypes.ts +53 -0
  254. package/src/util/svgPropertiesAndEvents.ts +84 -0
  255. package/src/util/svgPropertiesNoEvents.ts +520 -0
  256. package/src/util/tooltip/translate.ts +179 -0
  257. package/src/util/typedDataKey.ts +8 -0
  258. package/src/util/types.ts +724 -0
  259. package/src/util/useAnimationId.tsx +31 -0
  260. package/src/util/useElementOffset.ts +164 -0
  261. package/src/util/useId.ts +20 -0
  262. package/src/util/usePrefersReducedMotion.ts +44 -0
  263. package/src/util/useUniqueId.ts +34 -0
  264. package/src/zIndex/DefaultZIndexes.tsx +87 -0
  265. package/src/zIndex/ZIndexLayer.tsx +126 -0
  266. package/src/zIndex/ZIndexPortal.tsx +69 -0
  267. package/src/zIndex/getZIndexFromUnknown.tsx +17 -0
  268. package/src/zIndex/zIndexSelectors.ts +46 -0
  269. package/test/_data.ts +408 -0
  270. package/test/animation/AnimationController.typed.spec.ts +53 -0
  271. package/test/animation/AnimationControllerImpl.spec.ts +271 -0
  272. package/test/animation/CSSTransitionAnimate.timing.spec.tsx +473 -0
  273. package/test/animation/JavascriptAnimate.spec.tsx +62 -0
  274. package/test/animation/RechartsAnimation.spec.ts +636 -0
  275. package/test/animation/easing.spec.ts +218 -0
  276. package/test/animation/legacyAnimationLengthChange.spec.tsx +803 -0
  277. package/test/animation/matchBy.spec.ts +467 -0
  278. package/test/animation/mockAnimationController.ts +40 -0
  279. package/test/animation/mockControllerAnimationManager.ts +143 -0
  280. package/test/animation/mockTimeoutController.ts +114 -0
  281. package/test/animation/timeoutController.spec.ts +138 -0
  282. package/test/animation/useAnimationStartSnapshot.spec.ts +147 -0
  283. package/test/animation/util.spec.ts +28 -0
  284. package/test/cartesian/Area.animation.spec.tsx +363 -0
  285. package/test/cartesian/Area.range.spec.tsx +54 -0
  286. package/test/cartesian/Area.spec.tsx +1202 -0
  287. package/test/cartesian/Area.stacked.render.spec.tsx +69 -0
  288. package/test/cartesian/Area.typed.spec.tsx +209 -0
  289. package/test/cartesian/Axis.integration.spec.tsx +158 -0
  290. package/test/cartesian/Bar/Bar.csstransition.spec.tsx +299 -0
  291. package/test/cartesian/Bar/Bar.spec.tsx +2314 -0
  292. package/test/cartesian/Bar/Bar.typed.spec.tsx +192 -0
  293. package/test/cartesian/Bar.animation.spec.tsx +426 -0
  294. package/test/cartesian/Bar.stackDomain.spec.tsx +66 -0
  295. package/test/cartesian/Bar.stacked.render.spec.tsx +53 -0
  296. package/test/cartesian/Bar.truncateByDomain.spec.tsx +237 -0
  297. package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +336 -0
  298. package/test/cartesian/BarStack.spec.tsx +91 -0
  299. package/test/cartesian/Brush.keyboard.spec.tsx +88 -0
  300. package/test/cartesian/Brush.panorama.spec.tsx +41 -0
  301. package/test/cartesian/Brush.props.spec.tsx +63 -0
  302. package/test/cartesian/Brush.render.spec.tsx +117 -0
  303. package/test/cartesian/Brush.spec.tsx +522 -0
  304. package/test/cartesian/Brush.stacked.spec.tsx +221 -0
  305. package/test/cartesian/CartesianAxis.render.spec.tsx +50 -0
  306. package/test/cartesian/CartesianAxis.spec.tsx +396 -0
  307. package/test/cartesian/CartesianGrid.render.spec.tsx +39 -0
  308. package/test/cartesian/CartesianGrid.spec.tsx +2103 -0
  309. package/test/cartesian/ErrorBar.render.spec.tsx +69 -0
  310. package/test/cartesian/ErrorBar.spec.tsx +2414 -0
  311. package/test/cartesian/Funnel.animation.spec.tsx +241 -0
  312. package/test/cartesian/Funnel.spec.tsx +226 -0
  313. package/test/cartesian/Funnel.typed.spec.tsx +221 -0
  314. package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +627 -0
  315. package/test/cartesian/GraphicalItemClipPath.spec.tsx +427 -0
  316. package/test/cartesian/Line.animation.spec.tsx +643 -0
  317. package/test/cartesian/Line.sparseAnimationPath.spec.tsx +98 -0
  318. package/test/cartesian/Line.spec.tsx +471 -0
  319. package/test/cartesian/Line.typed.spec.tsx +152 -0
  320. package/test/cartesian/ReferenceArea.render.spec.tsx +63 -0
  321. package/test/cartesian/ReferenceArea.spec.tsx +663 -0
  322. package/test/cartesian/ReferenceArea.typed.spec.tsx +74 -0
  323. package/test/cartesian/ReferenceDot.render.spec.tsx +55 -0
  324. package/test/cartesian/ReferenceDot.spec.tsx +462 -0
  325. package/test/cartesian/ReferenceDot.typed.spec.tsx +76 -0
  326. package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +184 -0
  327. package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +744 -0
  328. package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +74 -0
  329. package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +399 -0
  330. package/test/cartesian/ReferenceLine.render.spec.tsx +134 -0
  331. package/test/cartesian/Scatter.animation.spec.tsx +381 -0
  332. package/test/cartesian/Scatter.render.spec.tsx +61 -0
  333. package/test/cartesian/Scatter.spec.tsx +406 -0
  334. package/test/cartesian/Scatter.typed.spec.tsx +153 -0
  335. package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +336 -0
  336. package/test/cartesian/XAxis/XAxis.brush.spec.tsx +266 -0
  337. package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +872 -0
  338. package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +86 -0
  339. package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +127 -0
  340. package/test/cartesian/XAxis/XAxis.hide.spec.tsx +106 -0
  341. package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +336 -0
  342. package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +1466 -0
  343. package/test/cartesian/XAxis/XAxis.padding.spec.tsx +758 -0
  344. package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +65 -0
  345. package/test/cartesian/XAxis/XAxis.state.spec.tsx +355 -0
  346. package/test/cartesian/XAxis/XAxis.tick.spec.tsx +493 -0
  347. package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +233 -0
  348. package/test/cartesian/XAxis/XAxis.type.spec.tsx +107 -0
  349. package/test/cartesian/XAxis/XAxis.typed.spec.tsx +102 -0
  350. package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +265 -0
  351. package/test/cartesian/XAxis.tickFormatter.spec.tsx +54 -0
  352. package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +230 -0
  353. package/test/cartesian/YAxis/YAxis.7362.spec.tsx +104 -0
  354. package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +88 -0
  355. package/test/cartesian/YAxis/YAxis.label.spec.tsx +219 -0
  356. package/test/cartesian/YAxis/YAxis.spec.tsx +1595 -0
  357. package/test/cartesian/YAxis/YAxis.tick.spec.tsx +428 -0
  358. package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +54 -0
  359. package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +263 -0
  360. package/test/cartesian/YAxis/YAxis.type.spec.tsx +107 -0
  361. package/test/cartesian/YAxis/YAxis.typed.spec.tsx +102 -0
  362. package/test/cartesian/ZAxis.spec.tsx +300 -0
  363. package/test/cartesian/ZAxis.typed.spec.tsx +33 -0
  364. package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +5 -0
  365. package/test/cartesian/axisLineAndStroke.spec.tsx +72 -0
  366. package/test/cartesian/getCartesianPosition.spec.ts +907 -0
  367. package/test/cartesian/getEquidistantTicks.spec.ts +88 -0
  368. package/test/cartesian/getTicks.spec.ts +378 -0
  369. package/test/cartesian/miscFeatureGaps.spec.tsx +89 -0
  370. package/test/cartesian/useAnimatedLineLength.spec.ts +168 -0
  371. package/test/chart/AccessibilityLayer.spec.tsx +569 -0
  372. package/test/chart/AccessibilityScans.spec.tsx +286 -0
  373. package/test/chart/AreaChart.spec.tsx +409 -0
  374. package/test/chart/AreaChart.stacked.spec.tsx +1407 -0
  375. package/test/chart/AreaChart.typed.spec.tsx +39 -0
  376. package/test/chart/BarChart.spec.tsx +3719 -0
  377. package/test/chart/BarChart.typed.spec.tsx +60 -0
  378. package/test/chart/CategoricalChart.spec.tsx +255 -0
  379. package/test/chart/ComposedChart.spec.tsx +199 -0
  380. package/test/chart/ComposedChart.typed.spec.tsx +39 -0
  381. package/test/chart/FunnelChart.spec.tsx +215 -0
  382. package/test/chart/FunnelChart.typed.spec.tsx +39 -0
  383. package/test/chart/LineChart.multiseries.spec.tsx +50 -0
  384. package/test/chart/LineChart.smoke.spec.tsx +50 -0
  385. package/test/chart/LineChart.spec.tsx +930 -0
  386. package/test/chart/LineChart.typed.spec.tsx +39 -0
  387. package/test/chart/NicheChartTooltip.spec.tsx +81 -0
  388. package/test/chart/PieChart.spec.tsx +793 -0
  389. package/test/chart/PieChart.typed.spec.tsx +39 -0
  390. package/test/chart/RadarChart.spec.tsx +530 -0
  391. package/test/chart/RadarChart.typed.spec.tsx +39 -0
  392. package/test/chart/RadialBarChart.5966.spec.tsx +48 -0
  393. package/test/chart/RadialBarChart.spec.tsx +679 -0
  394. package/test/chart/RadialBarChart.typed.spec.tsx +39 -0
  395. package/test/chart/RechartsWrapper.spec.tsx +83 -0
  396. package/test/chart/Sankey.content.spec.tsx +46 -0
  397. package/test/chart/Sankey.spec.tsx +952 -0
  398. package/test/chart/Sankey.typed.spec.tsx +29 -0
  399. package/test/chart/ScatterChart.spec.tsx +2613 -0
  400. package/test/chart/ScatterChart.typed.spec.tsx +39 -0
  401. package/test/chart/SunburstChart.spec.tsx +146 -0
  402. package/test/chart/Treemap.animation.spec.tsx +52 -0
  403. package/test/chart/Treemap.spec.tsx +1003 -0
  404. package/test/chart/Treemap.typed.spec.tsx +26 -0
  405. package/test/chart/chartEvents.spec.tsx +127 -0
  406. package/test/chart/responsive.spec.tsx +620 -0
  407. package/test/component/Cell.render.spec.tsx +155 -0
  408. package/test/component/Cell.spec.tsx +12 -0
  409. package/test/component/Cursor.spec.tsx +186 -0
  410. package/test/component/DefaultTooltipContent.spec.tsx +102 -0
  411. package/test/component/Label.render.spec.tsx +63 -0
  412. package/test/component/Label.spec.tsx +686 -0
  413. package/test/component/Label.typed.spec.tsx +46 -0
  414. package/test/component/LabelList.spec.tsx +188 -0
  415. package/test/component/Legend.itemSorter.spec.tsx +704 -0
  416. package/test/component/Legend.render.spec.tsx +92 -0
  417. package/test/component/Legend.spec.tsx +2213 -0
  418. package/test/component/Legend.typed.spec.tsx +22 -0
  419. package/test/component/ResponsiveContainer.spec.tsx +523 -0
  420. package/test/component/ResponsiveContainerDataTest.spec.tsx +51 -0
  421. package/test/component/Text.spec.tsx +415 -0
  422. package/test/component/Text.typed.spec.tsx +46 -0
  423. package/test/component/Tooltip/ActiveDot.spec.tsx +370 -0
  424. package/test/component/Tooltip/Tooltip.animation.spec.tsx +209 -0
  425. package/test/component/Tooltip/Tooltip.content.spec.tsx +128 -0
  426. package/test/component/Tooltip/Tooltip.formatter.spec.tsx +152 -0
  427. package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +79 -0
  428. package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +165 -0
  429. package/test/component/Tooltip/Tooltip.offset.spec.tsx +113 -0
  430. package/test/component/Tooltip/Tooltip.state.spec.tsx +74 -0
  431. package/test/component/Tooltip/Tooltip.sync.spec.tsx +639 -0
  432. package/test/component/Tooltip/defaultIndex.spec.tsx +227 -0
  433. package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +138 -0
  434. package/test/component/Tooltip/itemSorter.spec.tsx +2815 -0
  435. package/test/component/Tooltip/tooltipEventType.spec.tsx +344 -0
  436. package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +41 -0
  437. package/test/component/Tooltip/tooltipTestHelpers.tsx +162 -0
  438. package/test/component/Tooltip.defaultIndex.spec.tsx +48 -0
  439. package/test/component/Tooltip.hover.spec.tsx +61 -0
  440. package/test/component/Tooltip.item.spec.tsx +54 -0
  441. package/test/component/Tooltip.keyboard.spec.tsx +51 -0
  442. package/test/component/Tooltip.payload.spec.tsx +1716 -0
  443. package/test/component/Tooltip.touch.spec.tsx +39 -0
  444. package/test/component/Tooltip.visibility.spec.tsx +1889 -0
  445. package/test/component/TooltipBoundingBox.spec.tsx +89 -0
  446. package/test/component/responsiveContainerUtils.spec.ts +205 -0
  447. package/test/container/ClipPath.spec.tsx +602 -0
  448. package/test/container/chartDimensions.spec.tsx +368 -0
  449. package/test/context/chartLayoutContext.spec.tsx +378 -0
  450. package/test/helper/ExpectAxisDomain.tsx +27 -0
  451. package/test/helper/assertNotNull.ts +6 -0
  452. package/test/helper/assertZIndexLayerOrder.ts +19 -0
  453. package/test/helper/createSelectorTestCase.tsx +176 -0
  454. package/test/helper/expectAnimatedPieAngles.ts +100 -0
  455. package/test/helper/expectAnimatedPiePaths.ts +78 -0
  456. package/test/helper/expectAreaCurve.ts +15 -0
  457. package/test/helper/expectAxisTicks.ts +48 -0
  458. package/test/helper/expectBars.ts +54 -0
  459. package/test/helper/expectFunctionReturning.ts +58 -0
  460. package/test/helper/expectLabel.ts +32 -0
  461. package/test/helper/expectLastCalledWith.ts +48 -0
  462. package/test/helper/expectLine.ts +20 -0
  463. package/test/helper/expectPieSectors.ts +80 -0
  464. package/test/helper/expectScale.ts +37 -0
  465. package/test/helper/expectScatterPoints.ts +52 -0
  466. package/test/helper/expectStackGroups.ts +144 -0
  467. package/test/helper/mockAxes.ts +22 -0
  468. package/test/helper/mockGetBoundingClientRect.ts +66 -0
  469. package/test/helper/mockHTMLElementProperty.ts +19 -0
  470. package/test/helper/mockTouchingElement.ts +27 -0
  471. package/test/helper/offsetHelpers.ts +19 -0
  472. package/test/helper/parameterizedTestCases.tsx +99 -0
  473. package/test/helper/produceState.ts +32 -0
  474. package/test/helper/render.ts +7 -0
  475. package/test/helper/selectorTestHelpers.tsx +63 -0
  476. package/test/helper/trim.spec.ts +35 -0
  477. package/test/helper/trim.ts +11 -0
  478. package/test/hooks/useActiveTooltipDataPoints.spec.tsx +358 -0
  479. package/test/hooks/useAxisDomain.spec.tsx +361 -0
  480. package/test/hooks/useAxisScale.spec.tsx +283 -0
  481. package/test/hooks/useAxisTicks.spec.tsx +130 -0
  482. package/test/hooks/useOffset.spec.tsx +248 -0
  483. package/test/hooks/useTooltipStateHooks.spec.tsx +109 -0
  484. package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +135 -0
  485. package/test/polar/Pie/Pie.spec.tsx +784 -0
  486. package/test/polar/Pie/Pie.typed.spec.tsx +78 -0
  487. package/test/polar/Pie.animation.spec.tsx +529 -0
  488. package/test/polar/PieWithLegend.animation.spec.tsx +142 -0
  489. package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +76 -0
  490. package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +2079 -0
  491. package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +102 -0
  492. package/test/polar/PolarAngleAxis.render.spec.tsx +79 -0
  493. package/test/polar/PolarGrid.render.spec.tsx +75 -0
  494. package/test/polar/PolarGrid.spec.tsx +918 -0
  495. package/test/polar/PolarLegendPerRow.render.spec.tsx +85 -0
  496. package/test/polar/PolarRadiusAxis.events.spec.tsx +65 -0
  497. package/test/polar/PolarRadiusAxis.render.spec.tsx +52 -0
  498. package/test/polar/PolarRadiusAxis.spec.tsx +991 -0
  499. package/test/polar/PolarRadiusAxis.typed.spec.tsx +84 -0
  500. package/test/polar/PolarTooltipLegend.render.spec.tsx +80 -0
  501. package/test/polar/Radar.animation.spec.tsx +570 -0
  502. package/test/polar/Radar.render.spec.tsx +71 -0
  503. package/test/polar/Radar.spec.tsx +265 -0
  504. package/test/polar/Radar.typed.spec.tsx +119 -0
  505. package/test/polar/RadialBar/RadialBar.spec.tsx +1521 -0
  506. package/test/polar/RadialBar/RadialBar.typed.spec.tsx +132 -0
  507. package/test/polar/RadialBar.animation.spec.tsx +375 -0
  508. package/test/polar/RadialBar.render.spec.tsx +66 -0
  509. package/test/polar/RadialBar.stacked.spec.tsx +57 -0
  510. package/test/setup.ts +84 -0
  511. package/test/shape/ActiveShape.spec.tsx +181 -0
  512. package/test/shape/Cross.spec.tsx +60 -0
  513. package/test/shape/Cross.typed.spec.tsx +26 -0
  514. package/test/shape/Curve.spec.tsx +368 -0
  515. package/test/shape/Curve.typed.spec.tsx +69 -0
  516. package/test/shape/Dot.spec.tsx +73 -0
  517. package/test/shape/Dot.typed.spec.tsx +30 -0
  518. package/test/shape/Polygon.spec.tsx +357 -0
  519. package/test/shape/Polygon.typed.spec.tsx +28 -0
  520. package/test/shape/Rectangle.animation.spec.tsx +451 -0
  521. package/test/shape/Rectangle.spec.tsx +68 -0
  522. package/test/shape/Rectangle.typed.spec.tsx +24 -0
  523. package/test/shape/Sector.spec.tsx +76 -0
  524. package/test/shape/Sector.typed.spec.tsx +24 -0
  525. package/test/shape/Symbols.spec.tsx +43 -0
  526. package/test/shape/Symbols.typed.spec.tsx +24 -0
  527. package/test/shape/Trapezoid.spec.tsx +50 -0
  528. package/test/shape/Trapezoid.typed.spec.tsx +24 -0
  529. package/test/shape/__snapshots__/Cross.spec.tsx.snap +62 -0
  530. package/test/shape/__snapshots__/Curve.spec.tsx.snap +460 -0
  531. package/test/shape/__snapshots__/Polygon.spec.tsx.snap +58 -0
  532. package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +117 -0
  533. package/test/shape/__snapshots__/Sector.spec.tsx.snap +71 -0
  534. package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +64 -0
  535. package/test/state/chartDataSlice.spec.ts +53 -0
  536. package/test/state/externalEventsMiddleware.spec.ts +178 -0
  537. package/test/state/graphicalItemsSlice.spec.ts +92 -0
  538. package/test/state/hooks.spec.tsx +68 -0
  539. package/test/state/legendSlice.spec.ts +44 -0
  540. package/test/state/mouseEventsMiddleware.spec.ts +75 -0
  541. package/test/state/optionsSlice.spec.ts +19 -0
  542. package/test/state/reduxDevtoolsJsonStringifyReplacer.spec.ts +25 -0
  543. package/test/state/referenceElementsSlice.spec.ts +84 -0
  544. package/test/state/selectors/areaSelectors.spec.tsx +77 -0
  545. package/test/state/selectors/axisSelectors.spec.tsx +1418 -0
  546. package/test/state/selectors/barStackSelectors.spec.tsx +752 -0
  547. package/test/state/selectors/brushSelectors.spec.tsx +30 -0
  548. package/test/state/selectors/cartesianAxisSlice.spec.ts +96 -0
  549. package/test/state/selectors/combineNiceTicks.spec.ts +207 -0
  550. package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +61 -0
  551. package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +39 -0
  552. package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +56 -0
  553. package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +123 -0
  554. package/test/state/selectors/combiners/combineRealScaleType.spec.ts +80 -0
  555. package/test/state/selectors/containerSelectors.spec.tsx +168 -0
  556. package/test/state/selectors/dataSelectors.spec.tsx +136 -0
  557. package/test/state/selectors/legendSelectors.spec.tsx +113 -0
  558. package/test/state/selectors/lineSelectors.spec.tsx +60 -0
  559. package/test/state/selectors/pieSelectors.spec.tsx +72 -0
  560. package/test/state/selectors/radarSelectors.spec.tsx +496 -0
  561. package/test/state/selectors/rootPropsSelectors.spec.tsx +169 -0
  562. package/test/state/selectors/scatterSelectors.spec.tsx +47 -0
  563. package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +234 -0
  564. package/test/state/selectors/selectAllAxes.spec.tsx +18 -0
  565. package/test/state/selectors/selectAxisDomain.spec.tsx +21 -0
  566. package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +19 -0
  567. package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +22 -0
  568. package/test/state/selectors/selectAxisScale.spec.tsx +91 -0
  569. package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +503 -0
  570. package/test/state/selectors/selectBaseAxis.spec.tsx +56 -0
  571. package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +57 -0
  572. package/test/state/selectors/selectChartOffset.spec.tsx +26 -0
  573. package/test/state/selectors/selectDisplayedData.spec.tsx +282 -0
  574. package/test/state/selectors/selectIsTooltipActive.spec.tsx +231 -0
  575. package/test/state/selectors/selectNumericalDomain.spec.tsx +21 -0
  576. package/test/state/selectors/selectRealScaleType.spec.tsx +19 -0
  577. package/test/state/selectors/selectStackGroups.spec.tsx +322 -0
  578. package/test/state/selectors/selectXAxisPosition.spec.tsx +22 -0
  579. package/test/state/selectors/selectYAxisPosition.spec.tsx +22 -0
  580. package/test/state/selectors/selectors.spec.tsx +1613 -0
  581. package/test/state/throttling.spec.ts +200 -0
  582. package/test/state/zIndexSlice.spec.ts +85 -0
  583. package/test/synchronisation/useChartSynchronisation.spec.tsx +225 -0
  584. package/test/util/BarUtils.spec.ts +39 -0
  585. package/test/util/CartesianUtils/CartesianUtils.spec.ts +261 -0
  586. package/test/util/CartesianUtils/rectWithPoints.spec.ts +48 -0
  587. package/test/util/ChartUtils/ChartUtils.spec.ts +491 -0
  588. package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +136 -0
  589. package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +133 -0
  590. package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +83 -0
  591. package/test/util/ChartUtils/getStackedData.spec.ts +416 -0
  592. package/test/util/ChartUtils/truncateByDomain.spec.ts +70 -0
  593. package/test/util/DataUtils.spec.ts +385 -0
  594. package/test/util/DomUtils.spec.tsx +117 -0
  595. package/test/util/FunnelUtils.spec.tsx +70 -0
  596. package/test/util/Global.spec.ts +11 -0
  597. package/test/util/LRUCache.spec.ts +81 -0
  598. package/test/util/LogUtils.spec.ts +45 -0
  599. package/test/util/PolarUtils.spec.ts +66 -0
  600. package/test/util/ReduceCssCalcPrototype.spec.ts +141 -0
  601. package/test/util/ShallowEqual.spec.ts +102 -0
  602. package/test/util/TickUtils.spec.ts +29 -0
  603. package/test/util/axisPropsAreEqual.spec.ts +93 -0
  604. package/test/util/createChartHelpers.spec.tsx +210 -0
  605. package/test/util/cursor/getCursorPoints.spec.ts +136 -0
  606. package/test/util/cursor/getCursorRectangle.spec.ts +50 -0
  607. package/test/util/cursor/getRadialCursorPoints.spec.ts +36 -0
  608. package/test/util/errorValue.spec.ts +69 -0
  609. package/test/util/getEveryNth.spec.ts +39 -0
  610. package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +51 -0
  611. package/test/util/getRelativeCoordinate.spec.ts +250 -0
  612. package/test/util/getSliced.spec.ts +45 -0
  613. package/test/util/isDomainSpecifiedByUser.spec.ts +207 -0
  614. package/test/util/isWellBehavedNumber.spec.ts +54 -0
  615. package/test/util/payload/getUniqPayload.spec.ts +56 -0
  616. package/test/util/propsAreEqual.spec.ts +75 -0
  617. package/test/util/round.spec.ts +112 -0
  618. package/test/util/scale/arithmetic.spec.ts +61 -0
  619. package/test/util/scale/createCategoricalInverse.spec.ts +84 -0
  620. package/test/util/scale/getNiceTickValues.spec.ts +421 -0
  621. package/test/util/scale/getTickValuesFixedDomain.spec.ts +155 -0
  622. package/test/util/svgPropertiesAndEvents.spec.tsx +206 -0
  623. package/test/util/svgPropertiesNoEvents.spec.tsx +228 -0
  624. package/test/util/tooltip/translate.spec.ts +396 -0
  625. package/test/util/useAnimationId.spec.tsx +59 -0
  626. package/test/util/useElementOffset.spec.tsx +173 -0
  627. package/test/util/usePrefersReducedMotion.spec.ts +54 -0
  628. package/test/util/useUniqueId.spec.ts +99 -0
  629. package/test/utils/diagnostics-allowlist.ts +18 -0
  630. package/test/utils/diagnostics.ts +58 -0
  631. package/test/zIndex/AllZIndexPortals.spec.tsx +83 -0
  632. package/test/zIndex/DefaultZIndexes.spec.ts +80 -0
  633. package/test/zIndex/DynamicZIndex.spec.tsx +102 -0
  634. package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +125 -0
  635. package/test/zIndex/componentZIndex.spec.tsx +255 -0
  636. package/test/zIndex/getZIndexFromUnknown.spec.ts +51 -0
  637. package/test/zIndex/multiChartZIndexIsolation.spec.tsx +90 -0
  638. package/test/zIndex/zIndexSelectors.spec.ts +172 -0
  639. 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;