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,406 @@
1
+ // Port of recharts 3.8.1 test/cartesian/Scatter.spec.tsx (commit 7a23854) — the
2
+ // behavioral subset whose features the Solid Scatter implements: symbol geometry,
3
+ // custom component, empty data, function-form `shape`, the function-form `line`
4
+ // connector, the explicit-id DOM element + clipPath, implicit `fill` read from the
5
+ // data array, and Tooltip-payload selector integration.
6
+ //
7
+ // PERMANENT-N/A (NOT ported):
8
+ // - element-form `shape`/`line` ReactElement cases (no React.isValidElement /
9
+ // cloneElement in Solid; function form IS ported);
10
+ // - mouse-over/-out + touch event-prop snapshots (Scatter exposes only
11
+ // onClick/onMouseEnter/onMouseLeave — recharts' onMouseOver/onMouseOut/
12
+ // onTouchMove/onTouchEnd pass-through props are not part of the Solid surface);
13
+ // - the <Customized>/render-count state-integration case (Customized +
14
+ // toHaveBeenCalledTimes — no Customized, render-count coupling out of scope).
15
+ import { describe, expect, it, test, vi } from "vitest";
16
+ import { flush } from "solid-js";
17
+ import { Scatter, ScatterChart, ScatterProps, Tooltip, XAxis, YAxis, ZAxis } from "../../src";
18
+ import { assertNotNull } from "../helper/assertNotNull";
19
+ import { expectScatterPoints } from "../helper/expectScatterPoints";
20
+ import { createSelectorTestCase } from "../helper/createSelectorTestCase";
21
+ import { expectLastCalledWith } from "../helper/expectLastCalledWith";
22
+ import { fireEvent, render } from "@solidjs/testing-library";
23
+ import { dataWithSpecialNameAndFillProperties, PageData } from "../_data";
24
+ import { selectTooltipPayload } from "../../src/state/selectors/tooltipSelectors";
25
+ import { selectActiveTooltipPayload } from "../../src/state/selectors/tooltipSelectors";
26
+
27
+ describe("<Scatter />", () => {
28
+ const data = [
29
+ { cx: 10, cy: 50, size: 64, payload: { x: 12, y: 23, z: 78 } },
30
+ { cx: 50, cy: 50, size: 64, payload: { x: 12, y: 23, z: 78 } },
31
+ { cx: 90, cy: 50, size: 64, payload: { x: 12, y: 23, z: 78 } },
32
+ { cx: 130, cy: 50, size: 64, payload: { x: 12, y: 23, z: 78 } },
33
+ { cx: 170, cy: 50, size: 64, payload: { x: 12, y: 23, z: 78 } },
34
+ ];
35
+
36
+ test("Render symbols in a simple Scatter", () => {
37
+ const { container } = render(() => (
38
+ <ScatterChart width={500} height={500}>
39
+ <Scatter data={data} dataKey="cx" />
40
+ </ScatterChart>
41
+ ));
42
+
43
+ expectScatterPoints(container, [
44
+ {
45
+ cx: "54",
46
+ cy: "467.77777777777777",
47
+ d: "M0,0",
48
+ height: "9.0270333367641",
49
+ transform: "translate(54, 467.77777777777777)",
50
+ width: "9.0270333367641",
51
+ },
52
+ {
53
+ cx: "152",
54
+ cy: "358.8888888888889",
55
+ d: "M0,0",
56
+ height: "9.0270333367641",
57
+ transform: "translate(152, 358.8888888888889)",
58
+ width: "9.0270333367641",
59
+ },
60
+ {
61
+ cx: "250",
62
+ cy: "250",
63
+ d: "M0,0",
64
+ height: "9.0270333367641",
65
+ transform: "translate(250, 250)",
66
+ width: "9.0270333367641",
67
+ },
68
+ {
69
+ cx: "348",
70
+ cy: "141.11111111111111",
71
+ d: "M0,0",
72
+ height: "9.0270333367641",
73
+ transform: "translate(348, 141.11111111111111)",
74
+ width: "9.0270333367641",
75
+ },
76
+ {
77
+ cx: "446",
78
+ cy: "32.222222222222236",
79
+ d: "M0,0",
80
+ height: "9.0270333367641",
81
+ transform: "translate(446, 32.222222222222236)",
82
+ width: "9.0270333367641",
83
+ },
84
+ ]);
85
+ });
86
+
87
+ test("Can render in custom component", () => {
88
+ const CustomScatter = (props: ScatterProps) => {
89
+ return <Scatter {...props} />;
90
+ };
91
+
92
+ const { container } = render(() => (
93
+ <ScatterChart width={500} height={500}>
94
+ <CustomScatter data={[]} />
95
+ </ScatterChart>
96
+ ));
97
+
98
+ expectScatterPoints(container, []);
99
+ });
100
+
101
+ test("Don't render any symbols when data is empty", () => {
102
+ const { container } = render(() => (
103
+ <ScatterChart width={500} height={500}>
104
+ <Scatter data={[]} />
105
+ </ScatterChart>
106
+ ));
107
+
108
+ expectScatterPoints(container, []);
109
+ });
110
+
111
+ test("Render customized symbols when shape is set to be a function", () => {
112
+ const renderCustomizedShape = ({ cx, cy }: { cx?: number; cy?: number }) => (
113
+ <circle cx={cx} cy={cy} r={5} class="customized-shape" />
114
+ );
115
+ const { container } = render(() => (
116
+ <ScatterChart width={500} height={500}>
117
+ <Scatter
118
+ isAnimationActive={false}
119
+ shape={renderCustomizedShape}
120
+ data={data}
121
+ dataKey="size"
122
+ />
123
+ </ScatterChart>
124
+ ));
125
+
126
+ expect(container.querySelectorAll(".customized-shape")).toHaveLength(data.length);
127
+ });
128
+
129
+ test("Render customized line when line is set to be a function", () => {
130
+ const renderCustomizedLine = () => <path d="M0,0L200,200" class="customized-line" />;
131
+ const { container } = render(() => (
132
+ <ScatterChart width={500} height={500}>
133
+ <Scatter isAnimationActive={false} line={renderCustomizedLine} data={data} dataKey="size" />
134
+ </ScatterChart>
135
+ ));
136
+
137
+ expect(container.querySelectorAll(".customized-line")).toHaveLength(1);
138
+ });
139
+
140
+ test("mouse enter or mouse leave a symbol", () => {
141
+ const onClick = vi.fn();
142
+ const onMouseEnter = vi.fn();
143
+ const onMouseLeave = vi.fn();
144
+
145
+ const { container } = render(() => (
146
+ <ScatterChart width={500} height={500}>
147
+ <Scatter
148
+ isAnimationActive={false}
149
+ data={data}
150
+ dataKey="cx"
151
+ onClick={onClick}
152
+ onMouseEnter={onMouseEnter}
153
+ onMouseLeave={onMouseLeave}
154
+ />
155
+ </ScatterChart>
156
+ ));
157
+ // recharts binds the handlers on the symbol via React synthetic delegation; the
158
+ // Solid port binds them on the wrapping `.recharts-scatter-symbol` Layer <g>. Since
159
+ // mouseEnter/mouseLeave do not bubble in the DOM, fire on that carrier element (the
160
+ // 5th symbol's <g>) — harness-only swap of the queried element.
161
+ const symbol = container.querySelectorAll(".recharts-scatter-symbol")[4];
162
+ assertNotNull(symbol);
163
+ fireEvent.mouseEnter(symbol);
164
+ expect(onMouseEnter).toHaveBeenCalled();
165
+ fireEvent.mouseLeave(symbol);
166
+ expect(onMouseLeave).toHaveBeenCalled();
167
+ fireEvent.click(symbol);
168
+ expect(onClick).toHaveBeenCalled();
169
+ });
170
+
171
+ it("should implicitly read `fill` property from the data array but not `name`", () => {
172
+ const view = render(() => (
173
+ <ScatterChart width={500} height={500} data={dataWithSpecialNameAndFillProperties}>
174
+ <Scatter dataKey="value" />
175
+ </ScatterChart>
176
+ ));
177
+ const { container } = view;
178
+ expect.soft(view.queryByText("name1")).not.toBeInTheDocument();
179
+ expect.soft(view.queryByText("name2")).not.toBeInTheDocument();
180
+ expect.soft(view.queryByText("name3")).not.toBeInTheDocument();
181
+ expect.soft(view.queryByText("name4")).not.toBeInTheDocument();
182
+ expect.soft(container.querySelector('[fill="fill1"]')).toBeInTheDocument();
183
+ expect.soft(container.querySelector('[fill="fill2"]')).toBeInTheDocument();
184
+ expect.soft(container.querySelector('[fill="fill3"]')).toBeInTheDocument();
185
+ expect.soft(container.querySelector('[fill="fill4"]')).toBeInTheDocument();
186
+ });
187
+
188
+ describe("with explicit ID prop", () => {
189
+ const renderTestCase = createSelectorTestCase((props) => (
190
+ <ScatterChart width={500} height={500}>
191
+ <Scatter isAnimationActive={false} data={data} dataKey="cx" id="test-scatter-id" />
192
+ <XAxis allowDataOverflow />
193
+ {props.children}
194
+ </ScatterChart>
195
+ ));
196
+
197
+ it("should pass id prop to an element in the DOM", () => {
198
+ const { container } = renderTestCase();
199
+
200
+ const scatter = container.querySelector("#test-scatter-id");
201
+ assertNotNull(scatter);
202
+ expect(scatter.tagName).toBe("g");
203
+ expect(scatter.classList.value).toBe("recharts-layer recharts-scatter");
204
+ });
205
+
206
+ it("should set the ID on the clipPath, if it needs clipping", () => {
207
+ const { container } = renderTestCase();
208
+
209
+ const clipPath = container.querySelector("#clipPath-test-scatter-id");
210
+ assertNotNull(clipPath);
211
+ expect(clipPath.tagName).toBe("clipPath");
212
+ });
213
+ });
214
+
215
+ describe("events", () => {
216
+ // recharts uses userEvent.click; the established Solid harness convention swaps
217
+ // userEvent → fireEvent.click (the dispatch hook fires (data, index, event)).
218
+ it("should fire onClick event when clicking on a scatter point", () => {
219
+ const handleClick = vi.fn();
220
+ const { container } = render(() => (
221
+ <ScatterChart width={500} height={500}>
222
+ <Scatter data={data} dataKey="cx" onClick={handleClick} />
223
+ </ScatterChart>
224
+ ));
225
+
226
+ const scatterPoints = container.querySelectorAll(".recharts-symbols");
227
+ const firstPoint = scatterPoints[0];
228
+ assertNotNull(firstPoint);
229
+ fireEvent.click(firstPoint);
230
+ expect(handleClick).toHaveBeenCalledTimes(1);
231
+ expectLastCalledWith(
232
+ handleClick,
233
+ {
234
+ cx: 54,
235
+ cy: 467.77777777777777,
236
+ height: 9.0270333367641,
237
+ node: { x: 10, y: 10, z: "-" },
238
+ payload: {
239
+ cx: 10,
240
+ cy: 50,
241
+ payload: { x: 12, y: 23, z: 78 },
242
+ size: 64,
243
+ },
244
+ size: 0,
245
+ tooltipPayload: [
246
+ {
247
+ dataKey: "cx",
248
+ name: undefined,
249
+ payload: {
250
+ cx: 10,
251
+ cy: 50,
252
+ payload: { x: 12, y: 23, z: 78 },
253
+ size: 64,
254
+ },
255
+ type: undefined,
256
+ unit: "",
257
+ value: 10,
258
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
259
+ },
260
+ {
261
+ dataKey: "cx",
262
+ name: undefined,
263
+ payload: {
264
+ cx: 10,
265
+ cy: 50,
266
+ payload: { x: 12, y: 23, z: 78 },
267
+ size: 64,
268
+ },
269
+ type: undefined,
270
+ unit: "",
271
+ value: 10,
272
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
273
+ },
274
+ ],
275
+ tooltipPosition: { x: 54, y: 467.77777777777777 },
276
+ width: 9.0270333367641,
277
+ x: 49.48648333161795,
278
+ y: 463.2642611093957,
279
+ },
280
+ 0,
281
+ expect.any(Object),
282
+ );
283
+ });
284
+ });
285
+
286
+ describe("Tooltip integration", () => {
287
+ const renderTestCase = createSelectorTestCase((props) => (
288
+ <ScatterChart width={100} height={100}>
289
+ <Scatter isAnimationActive={false} data={PageData} />
290
+ <XAxis dataKey="uv" />
291
+ <YAxis dataKey="pv" />
292
+ {props.children}
293
+ </ScatterChart>
294
+ ));
295
+
296
+ it("should return tooltip payload", () => {
297
+ const { spy } = renderTestCase((state) => selectTooltipPayload(state, "axis", "hover", "0"));
298
+ expectLastCalledWith(spy, [
299
+ {
300
+ color: undefined,
301
+ dataKey: "uv",
302
+ fill: undefined,
303
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
304
+ hide: false,
305
+ name: "uv",
306
+ nameKey: undefined,
307
+ payload: {
308
+ amt: 2400,
309
+ name: "Page A",
310
+ pv: 2400,
311
+ uv: 400,
312
+ },
313
+ stroke: undefined,
314
+ strokeWidth: undefined,
315
+ type: undefined,
316
+ unit: "",
317
+ value: 400,
318
+ },
319
+ {
320
+ color: undefined,
321
+ dataKey: "pv",
322
+ fill: undefined,
323
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
324
+ hide: false,
325
+ name: "pv",
326
+ nameKey: undefined,
327
+ payload: {
328
+ amt: 2400,
329
+ name: "Page A",
330
+ pv: 2400,
331
+ uv: 400,
332
+ },
333
+ stroke: undefined,
334
+ strokeWidth: undefined,
335
+ type: undefined,
336
+ unit: "",
337
+ value: 2400,
338
+ },
339
+ ]);
340
+ });
341
+
342
+ describe("Multiple Scatter components tooltip filtering", () => {
343
+ /**
344
+ * https://github.com/recharts/recharts/pull/6537
345
+ * https://github.com/recharts/recharts/issues/6075
346
+ */
347
+ it("should only show tooltip data from the hovered Scatter component", () => {
348
+ const data01 = [
349
+ { x: 10, y: 20, z: 30 },
350
+ { x: 20, y: 30, z: 40 },
351
+ ];
352
+ const data02 = [
353
+ { x: 15, y: 25, z: 35 },
354
+ { x: 25, y: 35, z: 45 },
355
+ ];
356
+
357
+ const renderTooltipTestCase = createSelectorTestCase((props) => (
358
+ <ScatterChart width={400} height={400}>
359
+ <XAxis dataKey="x" type="number" allowDecimals={false} />
360
+ <YAxis dataKey="y" type="number" allowDecimals={false} />
361
+ <ZAxis dataKey="z" type="number" range={[64, 144]} />
362
+ <Tooltip cursor={false} />
363
+ <Scatter name="A school" data={data01} fill="#8884d8" />
364
+ <Scatter name="B school" data={data02} fill="#82ca9d" />
365
+ {props.children}
366
+ </ScatterChart>
367
+ ));
368
+
369
+ const { container, spy } = renderTooltipTestCase(selectActiveTooltipPayload);
370
+
371
+ const scatterPoints = container.querySelectorAll(".recharts-scatter-symbol");
372
+ fireEvent.mouseEnter(scatterPoints[0]!);
373
+ flush();
374
+
375
+ const payloadFromFirstScatter = spy.mock.calls.at(-1)?.[0];
376
+ assertNotNull(payloadFromFirstScatter);
377
+ expect(payloadFromFirstScatter).toEqual(
378
+ expect.arrayContaining([
379
+ expect.objectContaining({ payload: expect.objectContaining(data01[0]) }),
380
+ ]),
381
+ );
382
+ expect(payloadFromFirstScatter).not.toEqual(
383
+ expect.arrayContaining([
384
+ expect.objectContaining({ payload: expect.objectContaining(data02[0]) }),
385
+ ]),
386
+ );
387
+
388
+ fireEvent.mouseEnter(scatterPoints[2]!);
389
+ flush();
390
+
391
+ const payloadFromSecondScatter = spy.mock.calls.at(-1)?.[0];
392
+ assertNotNull(payloadFromSecondScatter);
393
+ expect(payloadFromSecondScatter).toEqual(
394
+ expect.arrayContaining([
395
+ expect.objectContaining({ payload: expect.objectContaining(data02[0]) }),
396
+ ]),
397
+ );
398
+ expect(payloadFromSecondScatter).not.toEqual(
399
+ expect.arrayContaining([
400
+ expect.objectContaining({ payload: expect.objectContaining(data01[0]) }),
401
+ ]),
402
+ );
403
+ });
404
+ });
405
+ });
406
+ });
@@ -0,0 +1,153 @@
1
+ // Ported from recharts 3.8.1 test/cartesian/Scatter.typed.spec.tsx.
2
+ //
3
+ // A `.typed` spec: each case compiles+renders, and "should NOT allow" cases sit
4
+ // on a line tsc genuinely rejects (// @ts-expect-error). Correctness is enforced
5
+ // by `pnpm --filter solid-recharts typecheck` (tsc --noEmit over test/).
6
+ //
7
+ // SOLID DIVERGENCES from the React reference (golden-anchored to the Solid type
8
+ // surface in src/cartesian/Scatter.tsx):
9
+ // 1. `ScatterProps.dataKey` is `DataKey<unknown>` (NON-generic) and `Scatter`
10
+ // is a plain function component (not generic). So:
11
+ // - string dataKeys ("value"/"name"/"foo") always compile (string|number);
12
+ // - a dataKey FUNCTION with an IMPLICIT param gets `entry: unknown`, so
13
+ // accessing any property is a tsc error → those reference "should allow"
14
+ // cases flip to @ts-expect-error here (provenance: Solid `unknown` param);
15
+ // - a dataKey function with an EXPLICITLY annotated param compiles.
16
+ // The reference's "with explicit Scatter type parameters" describe block
17
+ // (`Scatter<ExampleDataPoint, number>`) cannot be ported — Scatter takes 0
18
+ // type arguments in Solid. See `blocked` in the agent report.
19
+ // 2. The event-handler block's `getRelativeCoordinate(e)` relies on the React
20
+ // handler giving a recharts `MousePointer`; the Solid handler `event` is a
21
+ // plain DOM `MouseEvent` (not a `MousePointer`), and Solid `ScatterProps`
22
+ // only exposes onClick/onMouseEnter/onMouseLeave. Ported as a reduced
23
+ // compile-only handler case; full getRelativeCoordinate parity is blocked.
24
+ import { describe, expect, it } from "vitest";
25
+ import { Scatter, ScatterChart } from "../../src";
26
+ import type { ScatterPointItem } from "../../src/cartesian/Scatter";
27
+ import { render } from "@solidjs/testing-library";
28
+
29
+ type ExampleDataPoint = {
30
+ x: number;
31
+ y: number;
32
+ value: number;
33
+ name: string;
34
+ };
35
+
36
+ const data: ReadonlyArray<ExampleDataPoint> = [
37
+ { x: 10, y: 50, value: 100, name: "a" },
38
+ { x: 50, y: 50, value: 100, name: "b" },
39
+ { x: 90, y: 50, value: 100, name: "c" },
40
+ { x: 130, y: 50, value: 100, name: "d" },
41
+ { x: 170, y: 50, value: 100, name: "e" },
42
+ ];
43
+
44
+ describe("Scatter with strong typing", () => {
45
+ describe("with all implicit types", () => {
46
+ it("should render Scatter with correct data and correct dataKey", () => {
47
+ const { container } = render(() => (
48
+ <ScatterChart data={data} width={400} height={400}>
49
+ <Scatter dataKey="value" isAnimationActive={false} />
50
+ </ScatterChart>
51
+ ));
52
+ expect(container.querySelectorAll(".recharts-scatter-symbol")).toHaveLength(data.length);
53
+ });
54
+
55
+ it("should allow using incorrect type dataKey", () => {
56
+ render(() => (
57
+ <ScatterChart data={data} width={400} height={400}>
58
+ <Scatter dataKey="name" isAnimationActive={false} />
59
+ </ScatterChart>
60
+ ));
61
+ });
62
+
63
+ it("should allow using non-existent dataKey", () => {
64
+ render(() => (
65
+ <ScatterChart data={data} width={400} height={400}>
66
+ <Scatter dataKey="foo" isAnimationActive={false} />
67
+ </ScatterChart>
68
+ ));
69
+ });
70
+
71
+ it("should require an explicit param annotation on a dataKey function (reference allows implicit)", () => {
72
+ render(() => (
73
+ <ScatterChart data={data} width={400} height={400}>
74
+ {/* Reference: "should allow using dataKey function that returns wrong value".
75
+ Solid: the implicit param is `unknown`, so `.name` is a tsc error. */}
76
+ {/* @ts-expect-error Solid dataKey function param is `unknown` (DataKey<unknown>) */}
77
+ <Scatter dataKey={(entry) => entry.name} isAnimationActive={false} />
78
+ </ScatterChart>
79
+ ));
80
+ });
81
+
82
+ it("should reject accessing a non-existent property on an implicit dataKey param", () => {
83
+ render(() => (
84
+ <ScatterChart data={data} width={400} height={400}>
85
+ {/* Reference: "should allow ... accesses non-existent property".
86
+ Solid: implicit param is `unknown` → tsc error. */}
87
+ {/* @ts-expect-error Solid dataKey function param is `unknown` (DataKey<unknown>) */}
88
+ <Scatter dataKey={(entry) => entry.foo} isAnimationActive={false} />
89
+ </ScatterChart>
90
+ ));
91
+ });
92
+
93
+ it("should allow a dataKey function with an explicitly annotated param", () => {
94
+ render(() => (
95
+ <ScatterChart data={data} width={400} height={400}>
96
+ <Scatter dataKey={(entry: ExampleDataPoint) => entry.value} isAnimationActive={false} />
97
+ </ScatterChart>
98
+ ));
99
+ });
100
+
101
+ it("should allow when Scatter data is matching Scatter dataKey as string", () => {
102
+ const { container } = render(() => (
103
+ <ScatterChart width={400} height={400}>
104
+ <Scatter data={data} dataKey="value" isAnimationActive={false} />
105
+ </ScatterChart>
106
+ ));
107
+ expect(container.querySelectorAll(".recharts-scatter-symbol")).toHaveLength(data.length);
108
+ });
109
+
110
+ it("should allow when Scatter data is matching Scatter dataKey as function (explicit param)", () => {
111
+ const { container } = render(() => (
112
+ <ScatterChart width={400} height={400}>
113
+ <Scatter
114
+ data={data}
115
+ dataKey={(entry: ExampleDataPoint) => entry.value}
116
+ isAnimationActive={false}
117
+ />
118
+ </ScatterChart>
119
+ ));
120
+ expect(container.querySelectorAll(".recharts-scatter-symbol")).toHaveLength(data.length);
121
+ });
122
+
123
+ it("should allow when Scatter data is not matching Scatter dataKey", () => {
124
+ render(() => (
125
+ <ScatterChart width={400} height={400}>
126
+ <Scatter data={data} dataKey="foo" isAnimationActive={false} />
127
+ {/* Reference flags `entry => entry.foo` here. In Solid the same line is a
128
+ tsc error, but because the implicit param is `unknown` (not because of
129
+ a data/dataKey mismatch — Scatter is non-generic). */}
130
+ {/* @ts-expect-error Solid dataKey function param is `unknown` (DataKey<unknown>) */}
131
+ <Scatter data={data} dataKey={(entry) => entry.foo} isAnimationActive={false} />
132
+ </ScatterChart>
133
+ ));
134
+ });
135
+ });
136
+ });
137
+
138
+ describe("Scatter event handlers", () => {
139
+ it("should allow typed mouse event handlers (data, index, event)", () => {
140
+ const { container } = render(() => (
141
+ <ScatterChart data={data} width={100} height={100}>
142
+ <Scatter
143
+ dataKey="value"
144
+ isAnimationActive={false}
145
+ onClick={(_data: ScatterPointItem, _i: number, _e: MouseEvent) => {}}
146
+ onMouseEnter={(_data: ScatterPointItem, _i: number, _e: MouseEvent) => {}}
147
+ onMouseLeave={(_data: ScatterPointItem, _i: number, _e: MouseEvent) => {}}
148
+ />
149
+ </ScatterChart>
150
+ ));
151
+ expect(container.querySelectorAll(".recharts-scatter-symbol")).toHaveLength(data.length);
152
+ });
153
+ });