solid-recharts 1.0.0 → 2.0.0-beta.1

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 (488) hide show
  1. package/package.json +4 -6
  2. package/src/animation/AnimatedItems.tsx +4 -2
  3. package/src/animation/CSSTransitionAnimate.tsx +39 -41
  4. package/src/animation/JavascriptAnimate.tsx +41 -45
  5. package/src/cartesian/Area.tsx +4 -4
  6. package/src/cartesian/AreaRevealShape.tsx +1 -1
  7. package/src/cartesian/Bar.tsx +21 -33
  8. package/src/cartesian/BarStack.tsx +5 -5
  9. package/src/cartesian/Brush.tsx +15 -19
  10. package/src/cartesian/CartesianAxis.tsx +4 -4
  11. package/src/cartesian/CartesianGrid.tsx +5 -5
  12. package/src/cartesian/ErrorBar.tsx +7 -9
  13. package/src/cartesian/Funnel.tsx +3 -3
  14. package/src/cartesian/GraphicalItemClipPath.tsx +1 -1
  15. package/src/cartesian/Line.tsx +16 -18
  16. package/src/cartesian/LineDrawShape.tsx +13 -14
  17. package/src/cartesian/ReferenceArea.tsx +4 -4
  18. package/src/cartesian/ReferenceDot.tsx +4 -4
  19. package/src/cartesian/ReferenceLine.tsx +4 -4
  20. package/src/cartesian/RenderedTicksReporter.tsx +17 -19
  21. package/src/cartesian/Scatter.tsx +3 -3
  22. package/src/cartesian/XAxis.tsx +1 -1
  23. package/src/cartesian/YAxis.tsx +33 -35
  24. package/src/cartesian/ZAxis.tsx +2 -3
  25. package/src/chart/AreaChart.tsx +1 -1
  26. package/src/chart/BarChart.tsx +1 -1
  27. package/src/chart/CartesianChart.tsx +3 -4
  28. package/src/chart/CategoricalChart.tsx +5 -5
  29. package/src/chart/ComposedChart.tsx +1 -1
  30. package/src/chart/FunnelChart.tsx +1 -1
  31. package/src/chart/LineChart.tsx +1 -1
  32. package/src/chart/PieChart.tsx +3 -4
  33. package/src/chart/PolarChart.tsx +3 -4
  34. package/src/chart/RadarChart.tsx +3 -4
  35. package/src/chart/RadialBarChart.tsx +3 -7
  36. package/src/chart/RechartsWrapper.tsx +24 -14
  37. package/src/chart/Sankey.tsx +6 -9
  38. package/src/chart/ScatterChart.tsx +1 -1
  39. package/src/chart/SunburstChart.tsx +4 -5
  40. package/src/chart/Treemap.tsx +4 -5
  41. package/src/component/ActivePoints.tsx +6 -6
  42. package/src/component/Cell.tsx +5 -23
  43. package/src/component/Cursor.tsx +3 -3
  44. package/src/component/DefaultLegendContent.tsx +6 -8
  45. package/src/component/DefaultTooltipContent.tsx +10 -14
  46. package/src/component/Dots.tsx +5 -5
  47. package/src/component/Label.tsx +10 -13
  48. package/src/component/LabelList.tsx +7 -12
  49. package/src/component/Legend.tsx +21 -26
  50. package/src/component/ResponsiveContainer.tsx +49 -52
  51. package/src/component/Text.tsx +5 -5
  52. package/src/component/Tooltip.tsx +18 -21
  53. package/src/component/TooltipBoundingBox.tsx +16 -18
  54. package/src/component/responsiveContainerUtils.ts +1 -1
  55. package/src/container/ClipPathProvider.tsx +3 -3
  56. package/src/container/Layer.tsx +5 -5
  57. package/src/container/RootSurface.tsx +1 -1
  58. package/src/container/Surface.tsx +6 -5
  59. package/src/context/ErrorBarContext.tsx +2 -2
  60. package/src/context/PanoramaContext.tsx +2 -2
  61. package/src/context/RegisterGraphicalItemId.tsx +2 -4
  62. package/src/context/chartDataContext.tsx +23 -26
  63. package/src/context/chartLayoutContext.tsx +12 -16
  64. package/src/polar/Pie.tsx +12 -13
  65. package/src/polar/PolarAngleAxis.tsx +3 -3
  66. package/src/polar/PolarGrid.tsx +5 -5
  67. package/src/polar/PolarRadiusAxis.tsx +3 -3
  68. package/src/polar/Radar.tsx +3 -3
  69. package/src/polar/RadialBar.tsx +3 -3
  70. package/src/shape/Cross.tsx +5 -5
  71. package/src/shape/Curve.tsx +7 -6
  72. package/src/shape/Dot.tsx +4 -4
  73. package/src/shape/Polygon.tsx +5 -5
  74. package/src/shape/Rectangle.tsx +20 -22
  75. package/src/shape/Sector.tsx +5 -5
  76. package/src/shape/Symbols.tsx +5 -5
  77. package/src/shape/Trapezoid.tsx +27 -29
  78. package/src/state/RechartsStoreProvider.tsx +3 -5
  79. package/src/state/ReportChartProps.tsx +6 -8
  80. package/src/state/ReportEventSettings.tsx +6 -8
  81. package/src/state/ReportMainChartProps.tsx +9 -11
  82. package/src/state/ReportPolarOptions.tsx +13 -15
  83. package/src/state/SetLegendPayload.ts +1 -1
  84. package/src/state/SetTooltipEntrySettings.tsx +1 -1
  85. package/src/state/brushSlice.ts +8 -10
  86. package/src/state/cartesianAxisSlice.ts +38 -46
  87. package/src/state/chartDataSlice.ts +23 -29
  88. package/src/state/errorBarSlice.ts +16 -22
  89. package/src/state/eventSettingsSlice.ts +9 -11
  90. package/src/state/graphicalItemsSlice.ts +13 -17
  91. package/src/state/layoutSlice.ts +19 -27
  92. package/src/state/legendSlice.ts +18 -24
  93. package/src/state/optionsSlice.ts +6 -8
  94. package/src/state/polarAxisSlice.ts +13 -21
  95. package/src/state/polarOptionsSlice.ts +14 -16
  96. package/src/state/referenceElementsSlice.ts +19 -25
  97. package/src/state/registerInStore.ts +13 -15
  98. package/src/state/renderedTicksSlice.ts +7 -11
  99. package/src/state/rootPropsSlice.ts +14 -16
  100. package/src/state/tooltipSlice.ts +95 -115
  101. package/src/state/unregisterOnCleanup.ts +20 -5
  102. package/src/state/zIndexSlice.ts +42 -50
  103. package/src/synchronisation/useChartSynchronisation.tsx +217 -213
  104. package/src/util/ActiveShapeUtils.tsx +2 -2
  105. package/src/util/BarUtils.tsx +3 -5
  106. package/src/util/FunnelUtils.tsx +1 -1
  107. package/src/util/RadialBarUtils.tsx +3 -4
  108. package/src/util/createCartesianCharts.tsx +1 -1
  109. package/src/util/createPolarCharts.tsx +1 -1
  110. package/src/util/svgPropertiesAndEvents.ts +1 -1
  111. package/src/util/tooltip/translate.ts +2 -2
  112. package/src/util/types.ts +2 -2
  113. package/src/zIndex/ZIndexLayer.tsx +68 -39
  114. package/src/zIndex/ZIndexPortal.tsx +25 -29
  115. package/test/_data.ts +408 -0
  116. package/test/animation/AnimationController.typed.spec.ts +53 -0
  117. package/test/animation/AnimationControllerImpl.spec.ts +271 -0
  118. package/test/animation/CSSTransitionAnimate.timing.spec.tsx +473 -0
  119. package/test/animation/JavascriptAnimate.spec.tsx +62 -0
  120. package/test/animation/RechartsAnimation.spec.ts +636 -0
  121. package/test/animation/easing.spec.ts +218 -0
  122. package/test/animation/legacyAnimationLengthChange.spec.tsx +803 -0
  123. package/test/animation/matchBy.spec.ts +467 -0
  124. package/test/animation/mockAnimationController.ts +40 -0
  125. package/test/animation/mockControllerAnimationManager.ts +143 -0
  126. package/test/animation/mockTimeoutController.ts +114 -0
  127. package/test/animation/timeoutController.spec.ts +138 -0
  128. package/test/animation/useAnimationStartSnapshot.spec.ts +147 -0
  129. package/test/animation/util.spec.ts +28 -0
  130. package/test/cartesian/Area.animation.spec.tsx +363 -0
  131. package/test/cartesian/Area.range.spec.tsx +54 -0
  132. package/test/cartesian/Area.spec.tsx +1202 -0
  133. package/test/cartesian/Area.stacked.render.spec.tsx +69 -0
  134. package/test/cartesian/Area.typed.spec.tsx +209 -0
  135. package/test/cartesian/Axis.integration.spec.tsx +158 -0
  136. package/test/cartesian/Bar/Bar.csstransition.spec.tsx +299 -0
  137. package/test/cartesian/Bar/Bar.spec.tsx +2314 -0
  138. package/test/cartesian/Bar/Bar.typed.spec.tsx +192 -0
  139. package/test/cartesian/Bar.animation.spec.tsx +426 -0
  140. package/test/cartesian/Bar.stackDomain.spec.tsx +66 -0
  141. package/test/cartesian/Bar.stacked.render.spec.tsx +53 -0
  142. package/test/cartesian/Bar.truncateByDomain.spec.tsx +237 -0
  143. package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +336 -0
  144. package/test/cartesian/BarStack.spec.tsx +91 -0
  145. package/test/cartesian/Brush.keyboard.spec.tsx +88 -0
  146. package/test/cartesian/Brush.panorama.spec.tsx +41 -0
  147. package/test/cartesian/Brush.props.spec.tsx +63 -0
  148. package/test/cartesian/Brush.render.spec.tsx +117 -0
  149. package/test/cartesian/Brush.spec.tsx +522 -0
  150. package/test/cartesian/Brush.stacked.spec.tsx +221 -0
  151. package/test/cartesian/CartesianAxis.render.spec.tsx +50 -0
  152. package/test/cartesian/CartesianAxis.spec.tsx +396 -0
  153. package/test/cartesian/CartesianGrid.render.spec.tsx +39 -0
  154. package/test/cartesian/CartesianGrid.spec.tsx +2103 -0
  155. package/test/cartesian/ErrorBar.render.spec.tsx +69 -0
  156. package/test/cartesian/ErrorBar.spec.tsx +2414 -0
  157. package/test/cartesian/Funnel.animation.spec.tsx +241 -0
  158. package/test/cartesian/Funnel.spec.tsx +226 -0
  159. package/test/cartesian/Funnel.typed.spec.tsx +221 -0
  160. package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +627 -0
  161. package/test/cartesian/GraphicalItemClipPath.spec.tsx +427 -0
  162. package/test/cartesian/Line.animation.spec.tsx +643 -0
  163. package/test/cartesian/Line.sparseAnimationPath.spec.tsx +98 -0
  164. package/test/cartesian/Line.spec.tsx +471 -0
  165. package/test/cartesian/Line.typed.spec.tsx +152 -0
  166. package/test/cartesian/ReferenceArea.render.spec.tsx +63 -0
  167. package/test/cartesian/ReferenceArea.spec.tsx +663 -0
  168. package/test/cartesian/ReferenceArea.typed.spec.tsx +74 -0
  169. package/test/cartesian/ReferenceDot.render.spec.tsx +55 -0
  170. package/test/cartesian/ReferenceDot.spec.tsx +462 -0
  171. package/test/cartesian/ReferenceDot.typed.spec.tsx +76 -0
  172. package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +184 -0
  173. package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +744 -0
  174. package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +74 -0
  175. package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +399 -0
  176. package/test/cartesian/ReferenceLine.render.spec.tsx +134 -0
  177. package/test/cartesian/Scatter.animation.spec.tsx +381 -0
  178. package/test/cartesian/Scatter.render.spec.tsx +61 -0
  179. package/test/cartesian/Scatter.spec.tsx +406 -0
  180. package/test/cartesian/Scatter.typed.spec.tsx +153 -0
  181. package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +336 -0
  182. package/test/cartesian/XAxis/XAxis.brush.spec.tsx +266 -0
  183. package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +872 -0
  184. package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +86 -0
  185. package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +127 -0
  186. package/test/cartesian/XAxis/XAxis.hide.spec.tsx +106 -0
  187. package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +336 -0
  188. package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +1466 -0
  189. package/test/cartesian/XAxis/XAxis.padding.spec.tsx +758 -0
  190. package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +65 -0
  191. package/test/cartesian/XAxis/XAxis.state.spec.tsx +355 -0
  192. package/test/cartesian/XAxis/XAxis.tick.spec.tsx +493 -0
  193. package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +233 -0
  194. package/test/cartesian/XAxis/XAxis.type.spec.tsx +107 -0
  195. package/test/cartesian/XAxis/XAxis.typed.spec.tsx +102 -0
  196. package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +265 -0
  197. package/test/cartesian/XAxis.tickFormatter.spec.tsx +54 -0
  198. package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +230 -0
  199. package/test/cartesian/YAxis/YAxis.7362.spec.tsx +104 -0
  200. package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +88 -0
  201. package/test/cartesian/YAxis/YAxis.label.spec.tsx +219 -0
  202. package/test/cartesian/YAxis/YAxis.spec.tsx +1595 -0
  203. package/test/cartesian/YAxis/YAxis.tick.spec.tsx +428 -0
  204. package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +54 -0
  205. package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +263 -0
  206. package/test/cartesian/YAxis/YAxis.type.spec.tsx +107 -0
  207. package/test/cartesian/YAxis/YAxis.typed.spec.tsx +102 -0
  208. package/test/cartesian/ZAxis.spec.tsx +300 -0
  209. package/test/cartesian/ZAxis.typed.spec.tsx +33 -0
  210. package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +5 -0
  211. package/test/cartesian/axisLineAndStroke.spec.tsx +72 -0
  212. package/test/cartesian/getCartesianPosition.spec.ts +907 -0
  213. package/test/cartesian/getEquidistantTicks.spec.ts +88 -0
  214. package/test/cartesian/getTicks.spec.ts +378 -0
  215. package/test/cartesian/miscFeatureGaps.spec.tsx +89 -0
  216. package/test/cartesian/useAnimatedLineLength.spec.ts +168 -0
  217. package/test/chart/AccessibilityLayer.spec.tsx +569 -0
  218. package/test/chart/AccessibilityScans.spec.tsx +286 -0
  219. package/test/chart/AreaChart.spec.tsx +409 -0
  220. package/test/chart/AreaChart.stacked.spec.tsx +1407 -0
  221. package/test/chart/AreaChart.typed.spec.tsx +39 -0
  222. package/test/chart/BarChart.spec.tsx +3719 -0
  223. package/test/chart/BarChart.typed.spec.tsx +60 -0
  224. package/test/chart/CategoricalChart.spec.tsx +255 -0
  225. package/test/chart/ComposedChart.spec.tsx +199 -0
  226. package/test/chart/ComposedChart.typed.spec.tsx +39 -0
  227. package/test/chart/FunnelChart.spec.tsx +215 -0
  228. package/test/chart/FunnelChart.typed.spec.tsx +39 -0
  229. package/test/chart/LineChart.multiseries.spec.tsx +50 -0
  230. package/test/chart/LineChart.smoke.spec.tsx +50 -0
  231. package/test/chart/LineChart.spec.tsx +930 -0
  232. package/test/chart/LineChart.typed.spec.tsx +39 -0
  233. package/test/chart/NicheChartTooltip.spec.tsx +81 -0
  234. package/test/chart/PieChart.spec.tsx +793 -0
  235. package/test/chart/PieChart.typed.spec.tsx +39 -0
  236. package/test/chart/RadarChart.spec.tsx +530 -0
  237. package/test/chart/RadarChart.typed.spec.tsx +39 -0
  238. package/test/chart/RadialBarChart.5966.spec.tsx +48 -0
  239. package/test/chart/RadialBarChart.spec.tsx +679 -0
  240. package/test/chart/RadialBarChart.typed.spec.tsx +39 -0
  241. package/test/chart/RechartsWrapper.spec.tsx +83 -0
  242. package/test/chart/Sankey.content.spec.tsx +46 -0
  243. package/test/chart/Sankey.spec.tsx +952 -0
  244. package/test/chart/Sankey.typed.spec.tsx +29 -0
  245. package/test/chart/ScatterChart.spec.tsx +2613 -0
  246. package/test/chart/ScatterChart.typed.spec.tsx +39 -0
  247. package/test/chart/SunburstChart.spec.tsx +146 -0
  248. package/test/chart/Treemap.animation.spec.tsx +52 -0
  249. package/test/chart/Treemap.spec.tsx +1003 -0
  250. package/test/chart/Treemap.typed.spec.tsx +26 -0
  251. package/test/chart/chartEvents.spec.tsx +127 -0
  252. package/test/chart/responsive.spec.tsx +620 -0
  253. package/test/component/Cell.render.spec.tsx +155 -0
  254. package/test/component/Cell.spec.tsx +12 -0
  255. package/test/component/Cursor.spec.tsx +186 -0
  256. package/test/component/DefaultTooltipContent.spec.tsx +102 -0
  257. package/test/component/Label.render.spec.tsx +63 -0
  258. package/test/component/Label.spec.tsx +686 -0
  259. package/test/component/Label.typed.spec.tsx +46 -0
  260. package/test/component/LabelList.spec.tsx +188 -0
  261. package/test/component/Legend.itemSorter.spec.tsx +704 -0
  262. package/test/component/Legend.render.spec.tsx +92 -0
  263. package/test/component/Legend.spec.tsx +2213 -0
  264. package/test/component/Legend.typed.spec.tsx +22 -0
  265. package/test/component/ResponsiveContainer.spec.tsx +523 -0
  266. package/test/component/ResponsiveContainerDataTest.spec.tsx +51 -0
  267. package/test/component/Text.spec.tsx +415 -0
  268. package/test/component/Text.typed.spec.tsx +46 -0
  269. package/test/component/Tooltip/ActiveDot.spec.tsx +370 -0
  270. package/test/component/Tooltip/Tooltip.animation.spec.tsx +209 -0
  271. package/test/component/Tooltip/Tooltip.content.spec.tsx +128 -0
  272. package/test/component/Tooltip/Tooltip.formatter.spec.tsx +152 -0
  273. package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +79 -0
  274. package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +165 -0
  275. package/test/component/Tooltip/Tooltip.offset.spec.tsx +113 -0
  276. package/test/component/Tooltip/Tooltip.state.spec.tsx +74 -0
  277. package/test/component/Tooltip/Tooltip.sync.spec.tsx +639 -0
  278. package/test/component/Tooltip/defaultIndex.spec.tsx +227 -0
  279. package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +138 -0
  280. package/test/component/Tooltip/itemSorter.spec.tsx +2815 -0
  281. package/test/component/Tooltip/tooltipEventType.spec.tsx +344 -0
  282. package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +41 -0
  283. package/test/component/Tooltip/tooltipTestHelpers.tsx +162 -0
  284. package/test/component/Tooltip.defaultIndex.spec.tsx +48 -0
  285. package/test/component/Tooltip.hover.spec.tsx +61 -0
  286. package/test/component/Tooltip.item.spec.tsx +54 -0
  287. package/test/component/Tooltip.keyboard.spec.tsx +51 -0
  288. package/test/component/Tooltip.payload.spec.tsx +1716 -0
  289. package/test/component/Tooltip.touch.spec.tsx +39 -0
  290. package/test/component/Tooltip.visibility.spec.tsx +1889 -0
  291. package/test/component/TooltipBoundingBox.spec.tsx +89 -0
  292. package/test/component/responsiveContainerUtils.spec.ts +205 -0
  293. package/test/container/ClipPath.spec.tsx +602 -0
  294. package/test/container/chartDimensions.spec.tsx +368 -0
  295. package/test/context/chartLayoutContext.spec.tsx +378 -0
  296. package/test/helper/ExpectAxisDomain.tsx +27 -0
  297. package/test/helper/assertNotNull.ts +6 -0
  298. package/test/helper/assertZIndexLayerOrder.ts +19 -0
  299. package/test/helper/createSelectorTestCase.tsx +176 -0
  300. package/test/helper/expectAnimatedPieAngles.ts +100 -0
  301. package/test/helper/expectAnimatedPiePaths.ts +78 -0
  302. package/test/helper/expectAreaCurve.ts +15 -0
  303. package/test/helper/expectAxisTicks.ts +48 -0
  304. package/test/helper/expectBars.ts +54 -0
  305. package/test/helper/expectFunctionReturning.ts +58 -0
  306. package/test/helper/expectLabel.ts +32 -0
  307. package/test/helper/expectLastCalledWith.ts +48 -0
  308. package/test/helper/expectLine.ts +20 -0
  309. package/test/helper/expectPieSectors.ts +80 -0
  310. package/test/helper/expectScale.ts +37 -0
  311. package/test/helper/expectScatterPoints.ts +52 -0
  312. package/test/helper/expectStackGroups.ts +144 -0
  313. package/test/helper/mockAxes.ts +22 -0
  314. package/test/helper/mockGetBoundingClientRect.ts +66 -0
  315. package/test/helper/mockHTMLElementProperty.ts +19 -0
  316. package/test/helper/mockTouchingElement.ts +27 -0
  317. package/test/helper/offsetHelpers.ts +19 -0
  318. package/test/helper/parameterizedTestCases.tsx +99 -0
  319. package/test/helper/produceState.ts +32 -0
  320. package/test/helper/selectorTestHelpers.tsx +63 -0
  321. package/test/helper/trim.spec.ts +35 -0
  322. package/test/helper/trim.ts +11 -0
  323. package/test/hooks/useActiveTooltipDataPoints.spec.tsx +358 -0
  324. package/test/hooks/useAxisDomain.spec.tsx +361 -0
  325. package/test/hooks/useAxisScale.spec.tsx +283 -0
  326. package/test/hooks/useAxisTicks.spec.tsx +130 -0
  327. package/test/hooks/useOffset.spec.tsx +248 -0
  328. package/test/hooks/useTooltipStateHooks.spec.tsx +109 -0
  329. package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +135 -0
  330. package/test/polar/Pie/Pie.spec.tsx +784 -0
  331. package/test/polar/Pie/Pie.typed.spec.tsx +78 -0
  332. package/test/polar/Pie.animation.spec.tsx +529 -0
  333. package/test/polar/PieWithLegend.animation.spec.tsx +142 -0
  334. package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +76 -0
  335. package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +2079 -0
  336. package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +102 -0
  337. package/test/polar/PolarAngleAxis.render.spec.tsx +79 -0
  338. package/test/polar/PolarGrid.render.spec.tsx +75 -0
  339. package/test/polar/PolarGrid.spec.tsx +918 -0
  340. package/test/polar/PolarLegendPerRow.render.spec.tsx +85 -0
  341. package/test/polar/PolarRadiusAxis.events.spec.tsx +65 -0
  342. package/test/polar/PolarRadiusAxis.render.spec.tsx +52 -0
  343. package/test/polar/PolarRadiusAxis.spec.tsx +991 -0
  344. package/test/polar/PolarRadiusAxis.typed.spec.tsx +84 -0
  345. package/test/polar/PolarTooltipLegend.render.spec.tsx +80 -0
  346. package/test/polar/Radar.animation.spec.tsx +570 -0
  347. package/test/polar/Radar.render.spec.tsx +71 -0
  348. package/test/polar/Radar.spec.tsx +265 -0
  349. package/test/polar/Radar.typed.spec.tsx +119 -0
  350. package/test/polar/RadialBar/RadialBar.spec.tsx +1521 -0
  351. package/test/polar/RadialBar/RadialBar.typed.spec.tsx +132 -0
  352. package/test/polar/RadialBar.animation.spec.tsx +375 -0
  353. package/test/polar/RadialBar.render.spec.tsx +66 -0
  354. package/test/polar/RadialBar.stacked.spec.tsx +57 -0
  355. package/test/setup.ts +84 -0
  356. package/test/shape/ActiveShape.spec.tsx +181 -0
  357. package/test/shape/Cross.spec.tsx +60 -0
  358. package/test/shape/Cross.typed.spec.tsx +26 -0
  359. package/test/shape/Curve.spec.tsx +368 -0
  360. package/test/shape/Curve.typed.spec.tsx +69 -0
  361. package/test/shape/Dot.spec.tsx +73 -0
  362. package/test/shape/Dot.typed.spec.tsx +30 -0
  363. package/test/shape/Polygon.spec.tsx +357 -0
  364. package/test/shape/Polygon.typed.spec.tsx +28 -0
  365. package/test/shape/Rectangle.animation.spec.tsx +451 -0
  366. package/test/shape/Rectangle.spec.tsx +68 -0
  367. package/test/shape/Rectangle.typed.spec.tsx +24 -0
  368. package/test/shape/Sector.spec.tsx +76 -0
  369. package/test/shape/Sector.typed.spec.tsx +24 -0
  370. package/test/shape/Symbols.spec.tsx +43 -0
  371. package/test/shape/Symbols.typed.spec.tsx +24 -0
  372. package/test/shape/Trapezoid.spec.tsx +50 -0
  373. package/test/shape/Trapezoid.typed.spec.tsx +24 -0
  374. package/test/shape/__snapshots__/Cross.spec.tsx.snap +62 -0
  375. package/test/shape/__snapshots__/Curve.spec.tsx.snap +460 -0
  376. package/test/shape/__snapshots__/Polygon.spec.tsx.snap +58 -0
  377. package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +117 -0
  378. package/test/shape/__snapshots__/Sector.spec.tsx.snap +71 -0
  379. package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +64 -0
  380. package/test/state/chartDataSlice.spec.ts +53 -0
  381. package/test/state/createCollectionActions.spec.ts +87 -0
  382. package/test/state/createSelector.spec.ts +158 -0
  383. package/test/state/externalEventsMiddleware.spec.ts +178 -0
  384. package/test/state/graphicalItemsSlice.spec.ts +92 -0
  385. package/test/state/hooks.spec.tsx +68 -0
  386. package/test/state/legendSlice.spec.ts +44 -0
  387. package/test/state/mouseEventsMiddleware.spec.ts +75 -0
  388. package/test/state/optionsSlice.spec.ts +19 -0
  389. package/test/state/referenceElementsSlice.spec.ts +84 -0
  390. package/test/state/registerInStore.spec.tsx +101 -0
  391. package/test/state/selectors/areaSelectors.spec.tsx +77 -0
  392. package/test/state/selectors/axisSelectors.spec.tsx +1418 -0
  393. package/test/state/selectors/barStackSelectors.spec.tsx +752 -0
  394. package/test/state/selectors/brushSelectors.spec.tsx +30 -0
  395. package/test/state/selectors/cartesianAxisSlice.spec.ts +96 -0
  396. package/test/state/selectors/combineNiceTicks.spec.ts +207 -0
  397. package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +61 -0
  398. package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +39 -0
  399. package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +56 -0
  400. package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +123 -0
  401. package/test/state/selectors/combiners/combineRealScaleType.spec.ts +80 -0
  402. package/test/state/selectors/containerSelectors.spec.tsx +168 -0
  403. package/test/state/selectors/dataSelectors.spec.tsx +136 -0
  404. package/test/state/selectors/legendSelectors.spec.tsx +113 -0
  405. package/test/state/selectors/lineSelectors.spec.tsx +60 -0
  406. package/test/state/selectors/pieSelectors.spec.tsx +72 -0
  407. package/test/state/selectors/radarSelectors.spec.tsx +496 -0
  408. package/test/state/selectors/rootPropsSelectors.spec.tsx +169 -0
  409. package/test/state/selectors/scatterSelectors.spec.tsx +47 -0
  410. package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +234 -0
  411. package/test/state/selectors/selectAllAxes.spec.tsx +18 -0
  412. package/test/state/selectors/selectAxisDomain.spec.tsx +21 -0
  413. package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +19 -0
  414. package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +22 -0
  415. package/test/state/selectors/selectAxisScale.spec.tsx +91 -0
  416. package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +503 -0
  417. package/test/state/selectors/selectBaseAxis.spec.tsx +56 -0
  418. package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +57 -0
  419. package/test/state/selectors/selectChartOffset.spec.tsx +26 -0
  420. package/test/state/selectors/selectDisplayedData.spec.tsx +282 -0
  421. package/test/state/selectors/selectIsTooltipActive.spec.tsx +231 -0
  422. package/test/state/selectors/selectNumericalDomain.spec.tsx +21 -0
  423. package/test/state/selectors/selectRealScaleType.spec.tsx +19 -0
  424. package/test/state/selectors/selectStackGroups.spec.tsx +322 -0
  425. package/test/state/selectors/selectXAxisPosition.spec.tsx +22 -0
  426. package/test/state/selectors/selectYAxisPosition.spec.tsx +22 -0
  427. package/test/state/selectors/selectorMemoization.spec.tsx +136 -0
  428. package/test/state/selectors/selectors.spec.tsx +1613 -0
  429. package/test/state/throttling.spec.ts +200 -0
  430. package/test/state/zIndexSlice.spec.ts +85 -0
  431. package/test/synchronisation/useChartSynchronisation.spec.tsx +225 -0
  432. package/test/util/BarUtils.spec.ts +39 -0
  433. package/test/util/CartesianUtils/CartesianUtils.spec.ts +261 -0
  434. package/test/util/CartesianUtils/rectWithPoints.spec.ts +48 -0
  435. package/test/util/ChartUtils/ChartUtils.spec.ts +491 -0
  436. package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +136 -0
  437. package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +133 -0
  438. package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +97 -0
  439. package/test/util/ChartUtils/getStackedData.spec.ts +416 -0
  440. package/test/util/ChartUtils/truncateByDomain.spec.ts +70 -0
  441. package/test/util/DataUtils.spec.ts +385 -0
  442. package/test/util/DomUtils.spec.tsx +117 -0
  443. package/test/util/FunnelUtils.spec.tsx +70 -0
  444. package/test/util/Global.spec.ts +11 -0
  445. package/test/util/LRUCache.spec.ts +81 -0
  446. package/test/util/LogUtils.spec.ts +45 -0
  447. package/test/util/PolarUtils.spec.ts +66 -0
  448. package/test/util/ReduceCssCalcPrototype.spec.ts +141 -0
  449. package/test/util/ShallowEqual.spec.ts +102 -0
  450. package/test/util/TickUtils.spec.ts +29 -0
  451. package/test/util/createChartHelpers.spec.tsx +210 -0
  452. package/test/util/cursor/getCursorPoints.spec.ts +136 -0
  453. package/test/util/cursor/getCursorRectangle.spec.ts +50 -0
  454. package/test/util/cursor/getRadialCursorPoints.spec.ts +36 -0
  455. package/test/util/errorValue.spec.ts +69 -0
  456. package/test/util/getEveryNth.spec.ts +39 -0
  457. package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +51 -0
  458. package/test/util/getRelativeCoordinate.spec.ts +250 -0
  459. package/test/util/getSliced.spec.ts +45 -0
  460. package/test/util/isDomainSpecifiedByUser.spec.ts +207 -0
  461. package/test/util/isWellBehavedNumber.spec.ts +54 -0
  462. package/test/util/payload/getUniqPayload.spec.ts +56 -0
  463. package/test/util/propsAreEqual.spec.ts +75 -0
  464. package/test/util/round.spec.ts +112 -0
  465. package/test/util/scale/arithmetic.spec.ts +61 -0
  466. package/test/util/scale/createCategoricalInverse.spec.ts +84 -0
  467. package/test/util/scale/getNiceTickValues.spec.ts +421 -0
  468. package/test/util/scale/getTickValuesFixedDomain.spec.ts +155 -0
  469. package/test/util/svgPropertiesAndEvents.spec.tsx +206 -0
  470. package/test/util/svgPropertiesNoEvents.spec.tsx +228 -0
  471. package/test/util/tooltip/translate.spec.ts +396 -0
  472. package/test/util/useAnimationId.spec.tsx +59 -0
  473. package/test/util/useElementOffset.spec.tsx +173 -0
  474. package/test/util/usePrefersReducedMotion.spec.ts +54 -0
  475. package/test/util/useUniqueId.spec.ts +99 -0
  476. package/test/utils/diagnostics-allowlist.ts +18 -0
  477. package/test/utils/diagnostics.ts +58 -0
  478. package/test/zIndex/AllZIndexPortals.spec.tsx +83 -0
  479. package/test/zIndex/DefaultZIndexes.spec.ts +80 -0
  480. package/test/zIndex/DynamicZIndex.spec.tsx +102 -0
  481. package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +125 -0
  482. package/test/zIndex/componentZIndex.spec.tsx +255 -0
  483. package/test/zIndex/getZIndexFromUnknown.spec.ts +51 -0
  484. package/test/zIndex/multiChartZIndexIsolation.spec.tsx +90 -0
  485. package/test/zIndex/zIndexSelectors.spec.ts +172 -0
  486. package/test-results/.last-run.json +4 -0
  487. package/tsconfig.json +11 -0
  488. package/src/util/DirectPortal.tsx +0 -107
@@ -0,0 +1,78 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { Pie, PieChart } from "../../../src";
3
+ import { render } from "@solidjs/testing-library";
4
+
5
+ type ExampleDataPoint = {
6
+ value: number;
7
+ name: string;
8
+ };
9
+
10
+ const data: ReadonlyArray<ExampleDataPoint> = [
11
+ { value: 100, name: "a" },
12
+ { value: 80, name: "b" },
13
+ { value: 60, name: "c" },
14
+ { value: 40, name: "d" },
15
+ { value: 20, name: "e" },
16
+ ];
17
+
18
+ describe("Pie with strong typing", () => {
19
+ describe("with all implicit types", () => {
20
+ it("should render Pie with correct data and correct dataKey", () => {
21
+ const { container } = render(() => (
22
+ <PieChart width={400} height={400}>
23
+ <Pie data={data} dataKey="value" isAnimationActive={false} />
24
+ </PieChart>
25
+ ));
26
+ expect(container.querySelectorAll(".recharts-sector")).toHaveLength(data.length);
27
+ });
28
+
29
+ it("should allow incorrect or non-existent dataKeys in implicit mode", () => {
30
+ render(() => (
31
+ <PieChart width={400} height={400}>
32
+ <Pie data={data} dataKey="name" isAnimationActive={false} />
33
+ <Pie data={data} dataKey="foo" isAnimationActive={false} />
34
+ </PieChart>
35
+ ));
36
+ });
37
+ });
38
+
39
+ describe("with explicit Pie type parameters", () => {
40
+ it("should allow correct dataKey when typed explicitly", () => {
41
+ render(() => (
42
+ <PieChart width={400} height={400}>
43
+ <Pie<ExampleDataPoint> data={data} dataKey="value" isAnimationActive={false} />
44
+ <Pie<ExampleDataPoint>
45
+ data={data}
46
+ dataKey={(entry: ExampleDataPoint) => entry.value}
47
+ isAnimationActive={false}
48
+ />
49
+ </PieChart>
50
+ ));
51
+ });
52
+
53
+ it("should show errors when dataKey does not match explicit typing", () => {
54
+ render(() => (
55
+ <PieChart width={400} height={400}>
56
+ {/* @ts-expect-error TypeScript is correct here - the dataKey does not match and this should be an error */}
57
+ <Pie<ExampleDataPoint, number> data={data} dataKey="name" isAnimationActive={false} />
58
+ <Pie<ExampleDataPoint, number>
59
+ data={data}
60
+ /* @ts-expect-error TypeScript is correct here - the dataKey return type does not match and this should be an error */
61
+ dataKey={(entry: ExampleDataPoint) => entry.name}
62
+ isAnimationActive={false}
63
+ />
64
+ </PieChart>
65
+ ));
66
+ });
67
+ });
68
+ });
69
+
70
+ /*
71
+ * PERMANENT-N/A — vendored `Pie event handlers > getRelativeCoordinate` case.
72
+ * It asserts the handler `event` type is accepted by `getRelativeCoordinate`.
73
+ * In recharts the handler `e` is a React SyntheticEvent whose `currentTarget` is
74
+ * non-null (matching getRelativeCoordinate's `MousePointer`/`TouchPointer`). The
75
+ * Solid port wires native DOM events, whose `currentTarget` is `EventTarget | null`
76
+ * and so is NOT assignable to those pointer types without an unsafe cast (forbidden
77
+ * in src). The event models differ, so there is no faithful Solid equivalent.
78
+ */
@@ -0,0 +1,529 @@
1
+ // Subset port of recharts 3.9.0 test/polar/Pie/Pie.animation.spec.tsx. Proves the
2
+ // wired Pie ENTER animation on the NEW v3.9 engine (AnimatedItems +
3
+ // AnimationController): sectors grow from a collapsed (zero-sweep) state at t=0 to
4
+ // their byte-identical final geometry at t=1, driven deterministically by the
5
+ // MockControllerAnimationManager (injected via AnimationControllerProvider). Pie's
6
+ // default isAnimationActive is "auto" (≈ active).
7
+ //
8
+ // v3.9 GOTCHA: the new JavascriptAnimation state machine calls onAnimationStart
9
+ // SYNCHRONOUSLY in its constructor (on first render), not lazily when the first
10
+ // frame ticks — so `onAnimationStart` is already called once right after render
11
+ // (matching recharts 3.9 Pie.animation.spec).
12
+ import { describe, expect, it, vi } from "vitest";
13
+ import { createSignal, flush, Show } from "solid-js";
14
+ import { render, fireEvent } from "@solidjs/testing-library";
15
+ import { PieChart, Pie } from "../../src";
16
+ import { expectPieSectors } from "../helper/expectPieSectors";
17
+ import { AnimationControllerProvider } from "../../src/animation/useAnimationController";
18
+ import { MockControllerAnimationManager as MockProgressAnimationManager } from "../animation/mockControllerAnimationManager";
19
+ import { expectAnimatedPieAngles } from "../helper/expectAnimatedPieAngles";
20
+ import { expectAnimatedPiePaths } from "../helper/expectAnimatedPiePaths";
21
+ import { PageData } from "../_data";
22
+
23
+ const smallerData = PageData.slice(0, 3);
24
+
25
+ const SECTOR_SELECTOR = ".recharts-pie-sector path.recharts-sector";
26
+
27
+ // Same golden as PieChart.spec (cx 255 = props 250 + margin-left 5).
28
+ const pageDataSectorPaths = [
29
+ "M 455,255 A 200,200,0, 0,0, 267.6184,55.3985 L 255,255 Z",
30
+ "M 267.6184,55.3985 A 200,200,0, 0,0, 79.7896,158.5566 L 255,255 Z",
31
+ "M 79.7896,158.5566 A 200,200,0, 0,0, 93.1078,372.4347 L 255,255 Z",
32
+ "M 93.1078,372.4347 A 200,200,0, 0,0, 217.3458,451.4234 L 255,255 Z",
33
+ "M 217.3458,451.4234 A 200,200,0, 0,0, 406.3627,385.7261 L 255,255 Z",
34
+ "M 406.3627,385.7261 A 200,200,0, 0,0, 455,255.0003 L 255,255 Z",
35
+ ];
36
+
37
+ function trim(s: string | null): string {
38
+ return (s ?? "").replace(/\s+/g, " ").trim();
39
+ }
40
+
41
+ describe("Pie animation", () => {
42
+ it("grows the sectors from collapsed (t=0) to the final geometry (t=1)", async () => {
43
+ const manager = new MockProgressAnimationManager("pie-anim");
44
+ const { container } = render(() => (
45
+ <AnimationControllerProvider value={manager.factory}>
46
+ <PieChart width={500} height={500}>
47
+ <Pie cx={250} cy={250} innerRadius={0} outerRadius={200} data={PageData} dataKey="uv" />
48
+ </PieChart>
49
+ </AnimationControllerProvider>
50
+ ));
51
+ flush();
52
+
53
+ // t=0: every sector has zero sweep (start === end) → no sector path renders.
54
+ expect(container.querySelectorAll(SECTOR_SELECTOR)).toHaveLength(0);
55
+
56
+ // Drive to completion → t=1 → full, byte-identical sectors.
57
+ await manager.completeAnimation();
58
+ flush();
59
+
60
+ const sectors = container.querySelectorAll(SECTOR_SELECTOR);
61
+ expect(sectors).toHaveLength(PageData.length);
62
+ expect([...sectors].map((s) => trim(s.getAttribute("d")))).toEqual(pageDataSectorPaths);
63
+ });
64
+
65
+ it("renders the final frame immediately when isAnimationActive is false", () => {
66
+ const { container } = render(() => (
67
+ <PieChart width={500} height={500}>
68
+ <Pie
69
+ isAnimationActive={false}
70
+ cx={250}
71
+ cy={250}
72
+ innerRadius={0}
73
+ outerRadius={200}
74
+ data={PageData}
75
+ dataKey="uv"
76
+ />
77
+ </PieChart>
78
+ ));
79
+ flush();
80
+
81
+ expect(container.querySelectorAll(SECTOR_SELECTOR)).toHaveLength(PageData.length);
82
+ });
83
+
84
+ describe("with isAnimationActive=false", () => {
85
+ it("should render sectors without animation and not call the animation callbacks", () => {
86
+ const onAnimationStart = vi.fn();
87
+ const onAnimationEnd = vi.fn();
88
+ const { container } = render(() => (
89
+ <PieChart width={100} height={100}>
90
+ <Pie
91
+ data={smallerData}
92
+ dataKey="amt"
93
+ isAnimationActive={false}
94
+ onAnimationStart={onAnimationStart}
95
+ onAnimationEnd={onAnimationEnd}
96
+ />
97
+ </PieChart>
98
+ ));
99
+ flush();
100
+
101
+ expect(container.querySelectorAll(SECTOR_SELECTOR)).toHaveLength(smallerData.length);
102
+ expect(onAnimationStart).not.toHaveBeenCalled();
103
+ expect(onAnimationEnd).not.toHaveBeenCalled();
104
+ });
105
+ });
106
+
107
+ describe("initial animation callbacks", () => {
108
+ it("should call onAnimationStart when the animation begins and onAnimationEnd when it ends", async () => {
109
+ const onAnimationStart = vi.fn();
110
+ const onAnimationEnd = vi.fn();
111
+ const manager = new MockProgressAnimationManager("pie-cb");
112
+ render(() => (
113
+ <AnimationControllerProvider value={manager.factory}>
114
+ <PieChart width={100} height={100}>
115
+ <Pie
116
+ data={smallerData}
117
+ dataKey="amt"
118
+ isAnimationActive
119
+ onAnimationStart={onAnimationStart}
120
+ onAnimationEnd={onAnimationEnd}
121
+ />
122
+ </PieChart>
123
+ </AnimationControllerProvider>
124
+ ));
125
+ flush();
126
+
127
+ // v3.9 engine: JavascriptAnimation calls onAnimationStart synchronously in its
128
+ // constructor (on render), so it has already fired once here.
129
+ expect(onAnimationStart).toHaveBeenCalledTimes(1);
130
+ expect(onAnimationEnd).not.toHaveBeenCalled();
131
+
132
+ await manager.setAnimationProgress(0.1);
133
+ flush();
134
+ expect(onAnimationStart).toHaveBeenCalledTimes(1);
135
+ expect(onAnimationEnd).not.toHaveBeenCalled();
136
+
137
+ await manager.completeAnimation();
138
+ flush();
139
+ expect(onAnimationStart).toHaveBeenCalledTimes(1);
140
+ expect(onAnimationEnd).toHaveBeenCalledTimes(1);
141
+ });
142
+ });
143
+
144
+ describe("initial animation with simple props", () => {
145
+ function renderTestCase(): {
146
+ container: Element;
147
+ animationManager: MockProgressAnimationManager;
148
+ } {
149
+ const manager = new MockProgressAnimationManager("pie-angles");
150
+ const { container } = render(() => (
151
+ <AnimationControllerProvider value={manager.factory}>
152
+ <PieChart width={100} height={100}>
153
+ <Pie data={smallerData} dataKey="amt" isAnimationActive />
154
+ </PieChart>
155
+ </AnimationControllerProvider>
156
+ ));
157
+ flush();
158
+ return { container, animationManager: manager };
159
+ }
160
+
161
+ it("should render sectors with animation", async () => {
162
+ const { container, animationManager } = renderTestCase();
163
+
164
+ const pathDs = await expectAnimatedPiePaths(container, animationManager, 5);
165
+ expect(pathDs).toEqual([
166
+ [
167
+ "M 86,50 A 36,36,0, 0,0, 69.7423,19.8961 L 50,50 Z",
168
+ "M 69.7423,19.8961 A 36,36,0, 0,0, 35.6532,16.9823 L 50,50 Z",
169
+ "M 35.6532,16.9823 A 36,36,0, 0,0, 14.5223,43.8902 L 50,50 Z",
170
+ ],
171
+ [
172
+ "M 86,50 A 36,36,0, 0,0, 49.2784,14.0072 L 50,50 Z",
173
+ "M 49.2784,14.0072 A 36,36,0, 0,0, 14.0289,51.443 L 50,50 Z",
174
+ "M 14.0289,51.443 A 36,36,0, 0,0, 52.1638,85.9349 L 50,50 Z",
175
+ ],
176
+ [
177
+ "M 86,50 A 36,36,0, 0,0, 38.1402,16.0096 L 50,50 Z",
178
+ "M 38.1402,16.0096 A 36,36,0, 0,0, 21.8141,72.3955 L 50,50 Z",
179
+ "M 21.8141,72.3955 A 36,36,0, 0,0, 80.4308,69.2345 L 50,50 Z",
180
+ ],
181
+ [
182
+ "M 86,50 A 36,36,0, 0,0, 33.2853,18.1156 L 50,50 Z",
183
+ "M 33.2853,18.1156 A 36,36,0, 0,0, 29.5212,79.6078 L 50,50 Z",
184
+ "M 29.5212,79.6078 A 36,36,0, 0,0, 85.7312,54.3908 L 50,50 Z",
185
+ ],
186
+ [
187
+ "M 86,50 A 36,36,0, 0,0, 32,18.8231 L 50,50 Z",
188
+ "M 32,18.8231 A 36,36,0, 0,0, 32,81.1769 L 50,50 Z",
189
+ "M 32,81.1769 A 36,36,0, 0,0, 86,50 L 50,50 Z",
190
+ ],
191
+ ]);
192
+ });
193
+
194
+ it("should render sectors with animated angles", async () => {
195
+ const { container, animationManager } = renderTestCase();
196
+
197
+ const angles = await expectAnimatedPieAngles(container, animationManager, 4);
198
+ expect(angles).toEqual([
199
+ [
200
+ { endAngle: 67.2973, startAngle: 0 },
201
+ { endAngle: 134.5946, startAngle: 67.2973 },
202
+ { endAngle: 201.8918, startAngle: 134.5946 },
203
+ ],
204
+ [
205
+ { endAngle: 101.7302, startAngle: 0 },
206
+ { endAngle: 203.4603, startAngle: 101.7302 },
207
+ { endAngle: 305.1906, startAngle: 203.4603 },
208
+ ],
209
+ [
210
+ { endAngle: 116.2289, startAngle: 0 },
211
+ { endAngle: 232.4579, startAngle: 116.2289 },
212
+ { endAngle: 348.6866, startAngle: 232.4579 },
213
+ ],
214
+ [
215
+ { endAngle: 120, startAngle: 0 },
216
+ { endAngle: 240, startAngle: 120 },
217
+ { endAngle: 0, startAngle: 240 },
218
+ ],
219
+ ]);
220
+ });
221
+ });
222
+
223
+ describe("when changing dataKey prop", () => {
224
+ function renderTestCase(): {
225
+ container: Element;
226
+ animationManager: MockProgressAnimationManager;
227
+ changeDataKey: () => void;
228
+ } {
229
+ const manager = new MockProgressAnimationManager("pie-datakey");
230
+ const [dataKey, setDataKey] = createSignal("amt");
231
+ const { container } = render(() => (
232
+ <AnimationControllerProvider value={manager.factory}>
233
+ <PieChart width={100} height={100}>
234
+ <Pie data={smallerData} dataKey={dataKey()} isAnimationActive />
235
+ </PieChart>
236
+ </AnimationControllerProvider>
237
+ ));
238
+ flush();
239
+ const changeDataKey = (): void => {
240
+ setDataKey((prev) => (prev === "amt" ? "pv" : "amt"));
241
+ flush();
242
+ };
243
+ return { container, animationManager: manager, changeDataKey };
244
+ }
245
+
246
+ describe("interaction after initial animation completes", () => {
247
+ it("should animate the pie sector angles", async () => {
248
+ const { container, animationManager, changeDataKey } = renderTestCase();
249
+ // Run the initial ('amt') animation to completion, then switch dataKey.
250
+ await animationManager.completeAnimation();
251
+ flush();
252
+ changeDataKey();
253
+
254
+ const angles = await expectAnimatedPieAngles(container, animationManager, 3);
255
+ expect(angles).toEqual([
256
+ [
257
+ { endAngle: 108.593, startAngle: 0 },
258
+ { endAngle: 280.8398, startAngle: 108.593 },
259
+ { endAngle: 0, startAngle: 280.8398 },
260
+ ],
261
+ [
262
+ { endAngle: 104.2775, startAngle: 0 },
263
+ { endAngle: 296.2907, startAngle: 104.2775 },
264
+ { endAngle: 0, startAngle: 296.2907 },
265
+ ],
266
+ [
267
+ { endAngle: 103.2874, startAngle: 0 },
268
+ { endAngle: 299.835, startAngle: 103.2874 },
269
+ { endAngle: 0, startAngle: 299.835 },
270
+ ],
271
+ ]);
272
+ });
273
+ });
274
+
275
+ describe("interaction in the middle of the initial animation", () => {
276
+ it("should animate the pie sector angles from the intermediate state", async () => {
277
+ const { container, animationManager, changeDataKey } = renderTestCase();
278
+ // Let the initial animation run half way, then switch dataKey.
279
+ await animationManager.setAnimationProgress(0.5);
280
+ flush();
281
+ changeDataKey();
282
+
283
+ const angles = await expectAnimatedPieAngles(container, animationManager, 3);
284
+ expect(angles).toEqual([
285
+ // The Pie is 337/360 rendered when the dataKey changes, and it continues from there
286
+ [
287
+ { endAngle: 101.0656, startAngle: 0 },
288
+ { endAngle: 265.785, startAngle: 101.0656 },
289
+ { endAngle: 337.4176, startAngle: 265.785 },
290
+ ],
291
+ [
292
+ { endAngle: 102.8729, startAngle: 0 },
293
+ { endAngle: 293.4815, startAngle: 102.8729 },
294
+ { endAngle: 355.7862, startAngle: 293.4815 },
295
+ ],
296
+ [
297
+ { endAngle: 103.2874, startAngle: 0 },
298
+ { endAngle: 299.835, startAngle: 103.2874 },
299
+ { endAngle: 0, startAngle: 299.835 },
300
+ ],
301
+ ]);
302
+ });
303
+ });
304
+ });
305
+
306
+ describe("when the Pie has a key prop to force re-animation", () => {
307
+ // Solid has no `key` prop; a keyed <Show> remounts the <Pie> when the dataKey
308
+ // changes, the port equivalent of upstream's `key={dataKey}` remount.
309
+ function renderTestCase(): {
310
+ container: Element;
311
+ animationManager: MockProgressAnimationManager;
312
+ changeDataKey: () => void;
313
+ } {
314
+ const manager = new MockProgressAnimationManager("pie-key");
315
+ const [dataKey, setDataKey] = createSignal("amt");
316
+ const { container } = render(() => (
317
+ <AnimationControllerProvider value={manager.factory}>
318
+ <PieChart width={100} height={100}>
319
+ <Show when={dataKey()} keyed>
320
+ {(key) => <Pie data={smallerData} dataKey={key} isAnimationActive />}
321
+ </Show>
322
+ </PieChart>
323
+ </AnimationControllerProvider>
324
+ ));
325
+ flush();
326
+ const changeDataKey = (): void => {
327
+ setDataKey((prev) => (prev === "amt" ? "pv" : "amt"));
328
+ flush();
329
+ };
330
+ return { container, animationManager: manager, changeDataKey };
331
+ }
332
+
333
+ it("should re-run the initial animation from the beginning", async () => {
334
+ const { container, animationManager, changeDataKey } = renderTestCase();
335
+ await animationManager.completeAnimation();
336
+ flush();
337
+ changeDataKey();
338
+
339
+ // A remount re-runs the ENTER animation, so it starts collapsed (no sectors).
340
+ expectPieSectors(container, []);
341
+
342
+ const angles = await expectAnimatedPieAngles(container, animationManager, 3);
343
+ expect(angles).toEqual([
344
+ [
345
+ { endAngle: 70.4979, startAngle: 0 },
346
+ { endAngle: 204.6496, startAngle: 70.4979 },
347
+ { endAngle: 245.7145, startAngle: 204.6496 },
348
+ ],
349
+ [
350
+ { endAngle: 97.1692, startAngle: 0 },
351
+ { endAngle: 282.0742, startAngle: 97.1692 },
352
+ { endAngle: 338.6753, startAngle: 282.0742 },
353
+ ],
354
+ [
355
+ { endAngle: 103.2874, startAngle: 0 },
356
+ { endAngle: 299.835, startAngle: 103.2874 },
357
+ { endAngle: 0, startAngle: 299.835 },
358
+ ],
359
+ ]);
360
+ });
361
+ });
362
+
363
+ describe("tests that change data array", () => {
364
+ const data1 = smallerData.slice(0, 2);
365
+ const data2 = smallerData;
366
+
367
+ function renderTestCase(): {
368
+ container: Element;
369
+ animationManager: MockProgressAnimationManager;
370
+ changeData: () => void;
371
+ } {
372
+ const manager = new MockProgressAnimationManager("pie-data");
373
+ const [data, setData] = createSignal(data1);
374
+ const { container } = render(() => (
375
+ <AnimationControllerProvider value={manager.factory}>
376
+ <PieChart width={100} height={100}>
377
+ <Pie data={data()} dataKey="amt" isAnimationActive />
378
+ </PieChart>
379
+ </AnimationControllerProvider>
380
+ ));
381
+ flush();
382
+ const changeData = (): void => {
383
+ setData((prev) => (prev === data1 ? data2 : data1));
384
+ flush();
385
+ };
386
+ return { container, animationManager: manager, changeData };
387
+ }
388
+
389
+ describe("interaction after initial animation completes", () => {
390
+ it("should animate from 2 to 3 sectors", async () => {
391
+ const { container, animationManager, changeData } = renderTestCase();
392
+ await animationManager.completeAnimation();
393
+ flush();
394
+ changeData();
395
+
396
+ const angles = await expectAnimatedPieAngles(container, animationManager, 3);
397
+ expect(angles).toEqual([
398
+ [
399
+ { endAngle: 139.0477, startAngle: 0 },
400
+ { endAngle: 278.0953, startAngle: 139.0477 },
401
+ { endAngle: 0.0002, startAngle: 278.0953 },
402
+ ],
403
+ [
404
+ { endAngle: 123.5542, startAngle: 0 },
405
+ { endAngle: 247.1082, startAngle: 123.5542 },
406
+ { endAngle: 0, startAngle: 247.1082 },
407
+ ],
408
+ [
409
+ { endAngle: 120, startAngle: 0 },
410
+ { endAngle: 240, startAngle: 120 },
411
+ { endAngle: 0, startAngle: 240 },
412
+ ],
413
+ ]);
414
+ });
415
+ });
416
+
417
+ describe("interaction in the middle of the initial animation", () => {
418
+ it("should animate from 2 to 3 sectors from the intermediate state", async () => {
419
+ const { container, animationManager, changeData } = renderTestCase();
420
+ await animationManager.setAnimationProgress(0.5);
421
+ flush();
422
+ changeData();
423
+
424
+ const angles = await expectAnimatedPieAngles(container, animationManager, 3);
425
+ expect(angles).toEqual([
426
+ [
427
+ { endAngle: 127.7564, startAngle: 0 },
428
+ { endAngle: 255.5128, startAngle: 127.7564 },
429
+ { endAngle: 337.4176, startAngle: 255.5128 },
430
+ ],
431
+ [
432
+ { endAngle: 121.4473, startAngle: 0 },
433
+ { endAngle: 242.8946, startAngle: 121.4473 },
434
+ { endAngle: 355.7864, startAngle: 242.8946 },
435
+ ],
436
+ [
437
+ { endAngle: 120, startAngle: 0 },
438
+ { endAngle: 240, startAngle: 120 },
439
+ { endAngle: 0, startAngle: 240 },
440
+ ],
441
+ ]);
442
+ });
443
+ });
444
+ });
445
+
446
+ describe("when the pie element hides during the animation", () => {
447
+ // Upstream drives visibility through an in-tree <button> (createSelectorTestCase +
448
+ // button.click). We mirror that exactly: the toggle MUST come from a click inside
449
+ // the render root's reactive owner, not a bare setSignal from test scope — the
450
+ // re-appearing Pie REMOUNTS <AnimatedItems>, which creates fresh effects, and those
451
+ // would be ownerless (NO_OWNER_EFFECT) if the write came from the test body.
452
+ function renderTestCase(): {
453
+ container: Element;
454
+ animationManager: MockProgressAnimationManager;
455
+ toggleVisibility: () => void;
456
+ } {
457
+ const manager = new MockProgressAnimationManager("pie-hide");
458
+ const [isVisible, setIsVisible] = createSignal(true);
459
+ const { container } = render(() => (
460
+ <AnimationControllerProvider value={manager.factory}>
461
+ <button
462
+ type="button"
463
+ data-testid="toggle"
464
+ onClick={() => setIsVisible((prev) => !prev)}
465
+ />
466
+ <PieChart width={100} height={100}>
467
+ <Pie data={smallerData} dataKey="amt" isAnimationActive hide={!isVisible()} />
468
+ </PieChart>
469
+ </AnimationControllerProvider>
470
+ ));
471
+ flush();
472
+ const button = container.querySelector<HTMLButtonElement>('[data-testid="toggle"]');
473
+ if (button == null) {
474
+ throw new Error("Missing toggle button");
475
+ }
476
+ const toggleVisibility = (): void => {
477
+ fireEvent.click(button);
478
+ flush();
479
+ };
480
+ return { container, animationManager: manager, toggleVisibility };
481
+ }
482
+
483
+ it("should not crash when the pie hides during the animation", async () => {
484
+ const { container, animationManager, toggleVisibility } = renderTestCase();
485
+
486
+ await animationManager.setAnimationProgress(0.3);
487
+ flush();
488
+ toggleVisibility();
489
+
490
+ expectPieSectors(container, []);
491
+ });
492
+
493
+ it("should restart the animation from the beginning when the pie appears again", async () => {
494
+ const { container, animationManager, toggleVisibility } = renderTestCase();
495
+
496
+ await animationManager.setAnimationProgress(0.3);
497
+ flush();
498
+ toggleVisibility();
499
+
500
+ expectPieSectors(container, []);
501
+
502
+ toggleVisibility();
503
+
504
+ // On re-appear the ENTER animation restarts from a collapsed state (empty
505
+ // sectors at t=0), NOT resuming the mid-progress frame it was at when hidden.
506
+ // recharts parity: PieImpl drops previousSectorsRef.current while hidden.
507
+ expectPieSectors(container, []);
508
+
509
+ const angles = await expectAnimatedPieAngles(container, animationManager, 3);
510
+ expect(angles).toEqual([
511
+ [
512
+ { endAngle: 81.9049, startAngle: 0 },
513
+ { endAngle: 163.8098, startAngle: 81.9049 },
514
+ { endAngle: 245.7147, startAngle: 163.8098 },
515
+ ],
516
+ [
517
+ { endAngle: 112.8918, startAngle: 0 },
518
+ { endAngle: 225.7836, startAngle: 112.8918 },
519
+ { endAngle: 338.6755, startAngle: 225.7836 },
520
+ ],
521
+ [
522
+ { endAngle: 120, startAngle: 0 },
523
+ { endAngle: 240, startAngle: 120 },
524
+ { endAngle: 0, startAngle: 240 },
525
+ ],
526
+ ]);
527
+ });
528
+ });
529
+ });