solid-recharts 0.2.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/package.json +13 -11
  2. package/src/animation/AnimatedItems.tsx +2 -4
  3. package/src/animation/CSSTransitionAnimate.tsx +41 -39
  4. package/src/animation/JavascriptAnimate.tsx +45 -41
  5. package/src/cartesian/Area.tsx +4 -4
  6. package/src/cartesian/AreaRevealShape.tsx +1 -1
  7. package/src/cartesian/Bar.tsx +33 -21
  8. package/src/cartesian/BarStack.tsx +5 -5
  9. package/src/cartesian/Brush.tsx +19 -15
  10. package/src/cartesian/CartesianAxis.tsx +4 -4
  11. package/src/cartesian/CartesianGrid.tsx +5 -5
  12. package/src/cartesian/ErrorBar.tsx +9 -7
  13. package/src/cartesian/Funnel.tsx +3 -3
  14. package/src/cartesian/GraphicalItemClipPath.tsx +1 -1
  15. package/src/cartesian/Line.tsx +18 -16
  16. package/src/cartesian/LineDrawShape.tsx +14 -13
  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 +19 -17
  21. package/src/cartesian/Scatter.tsx +3 -3
  22. package/src/cartesian/XAxis.tsx +1 -1
  23. package/src/cartesian/YAxis.tsx +35 -33
  24. package/src/cartesian/ZAxis.tsx +3 -2
  25. package/src/chart/AreaChart.tsx +1 -1
  26. package/src/chart/BarChart.tsx +1 -1
  27. package/src/chart/CartesianChart.tsx +4 -3
  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 +4 -3
  33. package/src/chart/PolarChart.tsx +4 -3
  34. package/src/chart/RadarChart.tsx +4 -3
  35. package/src/chart/RadialBarChart.tsx +7 -3
  36. package/src/chart/RechartsWrapper.tsx +14 -24
  37. package/src/chart/Sankey.tsx +9 -6
  38. package/src/chart/ScatterChart.tsx +1 -1
  39. package/src/chart/SunburstChart.tsx +5 -4
  40. package/src/chart/Treemap.tsx +5 -4
  41. package/src/component/ActivePoints.tsx +6 -6
  42. package/src/component/Cell.tsx +23 -5
  43. package/src/component/Cursor.tsx +3 -3
  44. package/src/component/DefaultLegendContent.tsx +8 -6
  45. package/src/component/DefaultTooltipContent.tsx +14 -10
  46. package/src/component/Dots.tsx +5 -5
  47. package/src/component/Label.tsx +13 -10
  48. package/src/component/LabelList.tsx +12 -7
  49. package/src/component/Legend.tsx +26 -21
  50. package/src/component/ResponsiveContainer.tsx +52 -49
  51. package/src/component/Text.tsx +5 -5
  52. package/src/component/Tooltip.tsx +21 -18
  53. package/src/component/TooltipBoundingBox.tsx +18 -16
  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 +5 -6
  59. package/src/context/ErrorBarContext.tsx +2 -2
  60. package/src/context/PanoramaContext.tsx +2 -2
  61. package/src/context/RegisterGraphicalItemId.tsx +4 -2
  62. package/src/context/chartDataContext.tsx +26 -23
  63. package/src/context/chartLayoutContext.tsx +16 -12
  64. package/src/polar/Pie.tsx +13 -12
  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 +6 -7
  72. package/src/shape/Dot.tsx +4 -4
  73. package/src/shape/Polygon.tsx +5 -5
  74. package/src/shape/Rectangle.tsx +22 -20
  75. package/src/shape/Sector.tsx +5 -5
  76. package/src/shape/Symbols.tsx +5 -5
  77. package/src/shape/Trapezoid.tsx +29 -27
  78. package/src/state/RechartsStoreProvider.tsx +5 -3
  79. package/src/state/ReportChartProps.tsx +8 -6
  80. package/src/state/ReportEventSettings.tsx +8 -6
  81. package/src/state/ReportMainChartProps.tsx +11 -9
  82. package/src/state/ReportPolarOptions.tsx +15 -13
  83. package/src/state/SetLegendPayload.ts +1 -1
  84. package/src/state/SetTooltipEntrySettings.tsx +1 -1
  85. package/src/state/brushSlice.ts +10 -8
  86. package/src/state/cartesianAxisSlice.ts +46 -38
  87. package/src/state/chartDataSlice.ts +29 -23
  88. package/src/state/errorBarSlice.ts +22 -16
  89. package/src/state/eventSettingsSlice.ts +11 -9
  90. package/src/state/graphicalItemsSlice.ts +17 -13
  91. package/src/state/layoutSlice.ts +27 -19
  92. package/src/state/legendSlice.ts +24 -18
  93. package/src/state/optionsSlice.ts +8 -6
  94. package/src/state/polarAxisSlice.ts +21 -13
  95. package/src/state/polarOptionsSlice.ts +16 -14
  96. package/src/state/referenceElementsSlice.ts +25 -19
  97. package/src/state/registerInStore.ts +15 -13
  98. package/src/state/renderedTicksSlice.ts +11 -7
  99. package/src/state/rootPropsSlice.ts +16 -14
  100. package/src/state/tooltipSlice.ts +115 -95
  101. package/src/state/unregisterOnCleanup.ts +5 -20
  102. package/src/state/zIndexSlice.ts +50 -42
  103. package/src/synchronisation/useChartSynchronisation.tsx +213 -217
  104. package/src/util/ActiveShapeUtils.tsx +2 -2
  105. package/src/util/BarUtils.tsx +5 -3
  106. package/src/util/DirectPortal.tsx +107 -0
  107. package/src/util/FunnelUtils.tsx +1 -1
  108. package/src/util/RadialBarUtils.tsx +4 -3
  109. package/src/util/createCartesianCharts.tsx +1 -1
  110. package/src/util/createPolarCharts.tsx +1 -1
  111. package/src/util/svgPropertiesAndEvents.ts +1 -1
  112. package/src/util/tooltip/translate.ts +2 -2
  113. package/src/util/types.ts +2 -2
  114. package/src/zIndex/ZIndexLayer.tsx +39 -68
  115. package/src/zIndex/ZIndexPortal.tsx +29 -25
  116. package/test/_data.ts +0 -408
  117. package/test/animation/AnimationController.typed.spec.ts +0 -53
  118. package/test/animation/AnimationControllerImpl.spec.ts +0 -271
  119. package/test/animation/CSSTransitionAnimate.timing.spec.tsx +0 -473
  120. package/test/animation/JavascriptAnimate.spec.tsx +0 -62
  121. package/test/animation/RechartsAnimation.spec.ts +0 -636
  122. package/test/animation/easing.spec.ts +0 -218
  123. package/test/animation/legacyAnimationLengthChange.spec.tsx +0 -803
  124. package/test/animation/matchBy.spec.ts +0 -467
  125. package/test/animation/mockAnimationController.ts +0 -40
  126. package/test/animation/mockControllerAnimationManager.ts +0 -143
  127. package/test/animation/mockTimeoutController.ts +0 -114
  128. package/test/animation/timeoutController.spec.ts +0 -138
  129. package/test/animation/useAnimationStartSnapshot.spec.ts +0 -147
  130. package/test/animation/util.spec.ts +0 -28
  131. package/test/cartesian/Area.animation.spec.tsx +0 -363
  132. package/test/cartesian/Area.range.spec.tsx +0 -54
  133. package/test/cartesian/Area.spec.tsx +0 -1202
  134. package/test/cartesian/Area.stacked.render.spec.tsx +0 -69
  135. package/test/cartesian/Area.typed.spec.tsx +0 -209
  136. package/test/cartesian/Axis.integration.spec.tsx +0 -158
  137. package/test/cartesian/Bar/Bar.csstransition.spec.tsx +0 -299
  138. package/test/cartesian/Bar/Bar.spec.tsx +0 -2314
  139. package/test/cartesian/Bar/Bar.typed.spec.tsx +0 -192
  140. package/test/cartesian/Bar.animation.spec.tsx +0 -426
  141. package/test/cartesian/Bar.stackDomain.spec.tsx +0 -66
  142. package/test/cartesian/Bar.stacked.render.spec.tsx +0 -53
  143. package/test/cartesian/Bar.truncateByDomain.spec.tsx +0 -237
  144. package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +0 -336
  145. package/test/cartesian/BarStack.spec.tsx +0 -91
  146. package/test/cartesian/Brush.keyboard.spec.tsx +0 -88
  147. package/test/cartesian/Brush.panorama.spec.tsx +0 -41
  148. package/test/cartesian/Brush.props.spec.tsx +0 -63
  149. package/test/cartesian/Brush.render.spec.tsx +0 -117
  150. package/test/cartesian/Brush.spec.tsx +0 -522
  151. package/test/cartesian/Brush.stacked.spec.tsx +0 -221
  152. package/test/cartesian/CartesianAxis.render.spec.tsx +0 -50
  153. package/test/cartesian/CartesianAxis.spec.tsx +0 -396
  154. package/test/cartesian/CartesianGrid.render.spec.tsx +0 -39
  155. package/test/cartesian/CartesianGrid.spec.tsx +0 -2103
  156. package/test/cartesian/ErrorBar.render.spec.tsx +0 -69
  157. package/test/cartesian/ErrorBar.spec.tsx +0 -2414
  158. package/test/cartesian/Funnel.animation.spec.tsx +0 -241
  159. package/test/cartesian/Funnel.spec.tsx +0 -226
  160. package/test/cartesian/Funnel.typed.spec.tsx +0 -221
  161. package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +0 -627
  162. package/test/cartesian/GraphicalItemClipPath.spec.tsx +0 -427
  163. package/test/cartesian/Line.animation.spec.tsx +0 -643
  164. package/test/cartesian/Line.sparseAnimationPath.spec.tsx +0 -98
  165. package/test/cartesian/Line.spec.tsx +0 -471
  166. package/test/cartesian/Line.typed.spec.tsx +0 -152
  167. package/test/cartesian/ReferenceArea.render.spec.tsx +0 -63
  168. package/test/cartesian/ReferenceArea.spec.tsx +0 -663
  169. package/test/cartesian/ReferenceArea.typed.spec.tsx +0 -74
  170. package/test/cartesian/ReferenceDot.render.spec.tsx +0 -55
  171. package/test/cartesian/ReferenceDot.spec.tsx +0 -462
  172. package/test/cartesian/ReferenceDot.typed.spec.tsx +0 -76
  173. package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +0 -184
  174. package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +0 -744
  175. package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +0 -74
  176. package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +0 -399
  177. package/test/cartesian/ReferenceLine.render.spec.tsx +0 -134
  178. package/test/cartesian/Scatter.animation.spec.tsx +0 -381
  179. package/test/cartesian/Scatter.render.spec.tsx +0 -61
  180. package/test/cartesian/Scatter.spec.tsx +0 -406
  181. package/test/cartesian/Scatter.typed.spec.tsx +0 -153
  182. package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +0 -336
  183. package/test/cartesian/XAxis/XAxis.brush.spec.tsx +0 -266
  184. package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +0 -872
  185. package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +0 -86
  186. package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +0 -127
  187. package/test/cartesian/XAxis/XAxis.hide.spec.tsx +0 -106
  188. package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +0 -336
  189. package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +0 -1466
  190. package/test/cartesian/XAxis/XAxis.padding.spec.tsx +0 -758
  191. package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +0 -65
  192. package/test/cartesian/XAxis/XAxis.state.spec.tsx +0 -355
  193. package/test/cartesian/XAxis/XAxis.tick.spec.tsx +0 -493
  194. package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +0 -233
  195. package/test/cartesian/XAxis/XAxis.type.spec.tsx +0 -107
  196. package/test/cartesian/XAxis/XAxis.typed.spec.tsx +0 -102
  197. package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +0 -265
  198. package/test/cartesian/XAxis.tickFormatter.spec.tsx +0 -54
  199. package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +0 -230
  200. package/test/cartesian/YAxis/YAxis.7362.spec.tsx +0 -104
  201. package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +0 -88
  202. package/test/cartesian/YAxis/YAxis.label.spec.tsx +0 -219
  203. package/test/cartesian/YAxis/YAxis.spec.tsx +0 -1595
  204. package/test/cartesian/YAxis/YAxis.tick.spec.tsx +0 -428
  205. package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +0 -54
  206. package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +0 -263
  207. package/test/cartesian/YAxis/YAxis.type.spec.tsx +0 -107
  208. package/test/cartesian/YAxis/YAxis.typed.spec.tsx +0 -102
  209. package/test/cartesian/ZAxis.spec.tsx +0 -300
  210. package/test/cartesian/ZAxis.typed.spec.tsx +0 -33
  211. package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +0 -5
  212. package/test/cartesian/axisLineAndStroke.spec.tsx +0 -72
  213. package/test/cartesian/getCartesianPosition.spec.ts +0 -907
  214. package/test/cartesian/getEquidistantTicks.spec.ts +0 -88
  215. package/test/cartesian/getTicks.spec.ts +0 -378
  216. package/test/cartesian/miscFeatureGaps.spec.tsx +0 -89
  217. package/test/cartesian/useAnimatedLineLength.spec.ts +0 -168
  218. package/test/chart/AccessibilityLayer.spec.tsx +0 -569
  219. package/test/chart/AccessibilityScans.spec.tsx +0 -286
  220. package/test/chart/AreaChart.spec.tsx +0 -409
  221. package/test/chart/AreaChart.stacked.spec.tsx +0 -1407
  222. package/test/chart/AreaChart.typed.spec.tsx +0 -39
  223. package/test/chart/BarChart.spec.tsx +0 -3719
  224. package/test/chart/BarChart.typed.spec.tsx +0 -60
  225. package/test/chart/CategoricalChart.spec.tsx +0 -255
  226. package/test/chart/ComposedChart.spec.tsx +0 -199
  227. package/test/chart/ComposedChart.typed.spec.tsx +0 -39
  228. package/test/chart/FunnelChart.spec.tsx +0 -215
  229. package/test/chart/FunnelChart.typed.spec.tsx +0 -39
  230. package/test/chart/LineChart.multiseries.spec.tsx +0 -50
  231. package/test/chart/LineChart.smoke.spec.tsx +0 -50
  232. package/test/chart/LineChart.spec.tsx +0 -930
  233. package/test/chart/LineChart.typed.spec.tsx +0 -39
  234. package/test/chart/NicheChartTooltip.spec.tsx +0 -81
  235. package/test/chart/PieChart.spec.tsx +0 -793
  236. package/test/chart/PieChart.typed.spec.tsx +0 -39
  237. package/test/chart/RadarChart.spec.tsx +0 -530
  238. package/test/chart/RadarChart.typed.spec.tsx +0 -39
  239. package/test/chart/RadialBarChart.5966.spec.tsx +0 -48
  240. package/test/chart/RadialBarChart.spec.tsx +0 -679
  241. package/test/chart/RadialBarChart.typed.spec.tsx +0 -39
  242. package/test/chart/RechartsWrapper.spec.tsx +0 -83
  243. package/test/chart/Sankey.content.spec.tsx +0 -46
  244. package/test/chart/Sankey.spec.tsx +0 -952
  245. package/test/chart/Sankey.typed.spec.tsx +0 -29
  246. package/test/chart/ScatterChart.spec.tsx +0 -2613
  247. package/test/chart/ScatterChart.typed.spec.tsx +0 -39
  248. package/test/chart/SunburstChart.spec.tsx +0 -146
  249. package/test/chart/Treemap.animation.spec.tsx +0 -52
  250. package/test/chart/Treemap.spec.tsx +0 -1003
  251. package/test/chart/Treemap.typed.spec.tsx +0 -26
  252. package/test/chart/chartEvents.spec.tsx +0 -127
  253. package/test/chart/responsive.spec.tsx +0 -620
  254. package/test/component/Cell.render.spec.tsx +0 -155
  255. package/test/component/Cell.spec.tsx +0 -12
  256. package/test/component/Cursor.spec.tsx +0 -186
  257. package/test/component/DefaultTooltipContent.spec.tsx +0 -102
  258. package/test/component/Label.render.spec.tsx +0 -63
  259. package/test/component/Label.spec.tsx +0 -686
  260. package/test/component/Label.typed.spec.tsx +0 -46
  261. package/test/component/LabelList.spec.tsx +0 -188
  262. package/test/component/Legend.itemSorter.spec.tsx +0 -704
  263. package/test/component/Legend.render.spec.tsx +0 -92
  264. package/test/component/Legend.spec.tsx +0 -2213
  265. package/test/component/Legend.typed.spec.tsx +0 -22
  266. package/test/component/ResponsiveContainer.spec.tsx +0 -523
  267. package/test/component/ResponsiveContainerDataTest.spec.tsx +0 -51
  268. package/test/component/Text.spec.tsx +0 -415
  269. package/test/component/Text.typed.spec.tsx +0 -46
  270. package/test/component/Tooltip/ActiveDot.spec.tsx +0 -370
  271. package/test/component/Tooltip/Tooltip.animation.spec.tsx +0 -209
  272. package/test/component/Tooltip/Tooltip.content.spec.tsx +0 -128
  273. package/test/component/Tooltip/Tooltip.formatter.spec.tsx +0 -152
  274. package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +0 -79
  275. package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +0 -165
  276. package/test/component/Tooltip/Tooltip.offset.spec.tsx +0 -113
  277. package/test/component/Tooltip/Tooltip.state.spec.tsx +0 -74
  278. package/test/component/Tooltip/Tooltip.sync.spec.tsx +0 -639
  279. package/test/component/Tooltip/defaultIndex.spec.tsx +0 -227
  280. package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +0 -138
  281. package/test/component/Tooltip/itemSorter.spec.tsx +0 -2815
  282. package/test/component/Tooltip/tooltipEventType.spec.tsx +0 -344
  283. package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +0 -41
  284. package/test/component/Tooltip/tooltipTestHelpers.tsx +0 -162
  285. package/test/component/Tooltip.defaultIndex.spec.tsx +0 -48
  286. package/test/component/Tooltip.hover.spec.tsx +0 -61
  287. package/test/component/Tooltip.item.spec.tsx +0 -54
  288. package/test/component/Tooltip.keyboard.spec.tsx +0 -51
  289. package/test/component/Tooltip.payload.spec.tsx +0 -1716
  290. package/test/component/Tooltip.touch.spec.tsx +0 -39
  291. package/test/component/Tooltip.visibility.spec.tsx +0 -1889
  292. package/test/component/TooltipBoundingBox.spec.tsx +0 -89
  293. package/test/component/responsiveContainerUtils.spec.ts +0 -205
  294. package/test/container/ClipPath.spec.tsx +0 -602
  295. package/test/container/chartDimensions.spec.tsx +0 -368
  296. package/test/context/chartLayoutContext.spec.tsx +0 -378
  297. package/test/helper/ExpectAxisDomain.tsx +0 -27
  298. package/test/helper/assertNotNull.ts +0 -6
  299. package/test/helper/assertZIndexLayerOrder.ts +0 -19
  300. package/test/helper/createSelectorTestCase.tsx +0 -176
  301. package/test/helper/expectAnimatedPieAngles.ts +0 -100
  302. package/test/helper/expectAnimatedPiePaths.ts +0 -78
  303. package/test/helper/expectAreaCurve.ts +0 -15
  304. package/test/helper/expectAxisTicks.ts +0 -48
  305. package/test/helper/expectBars.ts +0 -54
  306. package/test/helper/expectFunctionReturning.ts +0 -58
  307. package/test/helper/expectLabel.ts +0 -32
  308. package/test/helper/expectLastCalledWith.ts +0 -48
  309. package/test/helper/expectLine.ts +0 -20
  310. package/test/helper/expectPieSectors.ts +0 -80
  311. package/test/helper/expectScale.ts +0 -37
  312. package/test/helper/expectScatterPoints.ts +0 -52
  313. package/test/helper/expectStackGroups.ts +0 -144
  314. package/test/helper/mockAxes.ts +0 -22
  315. package/test/helper/mockGetBoundingClientRect.ts +0 -66
  316. package/test/helper/mockHTMLElementProperty.ts +0 -19
  317. package/test/helper/mockTouchingElement.ts +0 -27
  318. package/test/helper/offsetHelpers.ts +0 -19
  319. package/test/helper/parameterizedTestCases.tsx +0 -99
  320. package/test/helper/produceState.ts +0 -32
  321. package/test/helper/selectorTestHelpers.tsx +0 -63
  322. package/test/helper/trim.spec.ts +0 -35
  323. package/test/helper/trim.ts +0 -11
  324. package/test/hooks/useActiveTooltipDataPoints.spec.tsx +0 -358
  325. package/test/hooks/useAxisDomain.spec.tsx +0 -361
  326. package/test/hooks/useAxisScale.spec.tsx +0 -283
  327. package/test/hooks/useAxisTicks.spec.tsx +0 -130
  328. package/test/hooks/useOffset.spec.tsx +0 -248
  329. package/test/hooks/useTooltipStateHooks.spec.tsx +0 -109
  330. package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +0 -135
  331. package/test/polar/Pie/Pie.spec.tsx +0 -784
  332. package/test/polar/Pie/Pie.typed.spec.tsx +0 -78
  333. package/test/polar/Pie.animation.spec.tsx +0 -529
  334. package/test/polar/PieWithLegend.animation.spec.tsx +0 -142
  335. package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +0 -76
  336. package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +0 -2079
  337. package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +0 -102
  338. package/test/polar/PolarAngleAxis.render.spec.tsx +0 -79
  339. package/test/polar/PolarGrid.render.spec.tsx +0 -75
  340. package/test/polar/PolarGrid.spec.tsx +0 -918
  341. package/test/polar/PolarLegendPerRow.render.spec.tsx +0 -85
  342. package/test/polar/PolarRadiusAxis.events.spec.tsx +0 -65
  343. package/test/polar/PolarRadiusAxis.render.spec.tsx +0 -52
  344. package/test/polar/PolarRadiusAxis.spec.tsx +0 -991
  345. package/test/polar/PolarRadiusAxis.typed.spec.tsx +0 -84
  346. package/test/polar/PolarTooltipLegend.render.spec.tsx +0 -80
  347. package/test/polar/Radar.animation.spec.tsx +0 -570
  348. package/test/polar/Radar.render.spec.tsx +0 -71
  349. package/test/polar/Radar.spec.tsx +0 -265
  350. package/test/polar/Radar.typed.spec.tsx +0 -119
  351. package/test/polar/RadialBar/RadialBar.spec.tsx +0 -1521
  352. package/test/polar/RadialBar/RadialBar.typed.spec.tsx +0 -132
  353. package/test/polar/RadialBar.animation.spec.tsx +0 -375
  354. package/test/polar/RadialBar.render.spec.tsx +0 -66
  355. package/test/polar/RadialBar.stacked.spec.tsx +0 -57
  356. package/test/setup.ts +0 -84
  357. package/test/shape/ActiveShape.spec.tsx +0 -181
  358. package/test/shape/Cross.spec.tsx +0 -60
  359. package/test/shape/Cross.typed.spec.tsx +0 -26
  360. package/test/shape/Curve.spec.tsx +0 -368
  361. package/test/shape/Curve.typed.spec.tsx +0 -69
  362. package/test/shape/Dot.spec.tsx +0 -73
  363. package/test/shape/Dot.typed.spec.tsx +0 -30
  364. package/test/shape/Polygon.spec.tsx +0 -357
  365. package/test/shape/Polygon.typed.spec.tsx +0 -28
  366. package/test/shape/Rectangle.animation.spec.tsx +0 -451
  367. package/test/shape/Rectangle.spec.tsx +0 -68
  368. package/test/shape/Rectangle.typed.spec.tsx +0 -24
  369. package/test/shape/Sector.spec.tsx +0 -76
  370. package/test/shape/Sector.typed.spec.tsx +0 -24
  371. package/test/shape/Symbols.spec.tsx +0 -43
  372. package/test/shape/Symbols.typed.spec.tsx +0 -24
  373. package/test/shape/Trapezoid.spec.tsx +0 -50
  374. package/test/shape/Trapezoid.typed.spec.tsx +0 -24
  375. package/test/shape/__snapshots__/Cross.spec.tsx.snap +0 -62
  376. package/test/shape/__snapshots__/Curve.spec.tsx.snap +0 -460
  377. package/test/shape/__snapshots__/Polygon.spec.tsx.snap +0 -58
  378. package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +0 -117
  379. package/test/shape/__snapshots__/Sector.spec.tsx.snap +0 -71
  380. package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +0 -64
  381. package/test/state/chartDataSlice.spec.ts +0 -53
  382. package/test/state/createCollectionActions.spec.ts +0 -87
  383. package/test/state/createSelector.spec.ts +0 -158
  384. package/test/state/externalEventsMiddleware.spec.ts +0 -178
  385. package/test/state/graphicalItemsSlice.spec.ts +0 -92
  386. package/test/state/hooks.spec.tsx +0 -68
  387. package/test/state/legendSlice.spec.ts +0 -44
  388. package/test/state/mouseEventsMiddleware.spec.ts +0 -75
  389. package/test/state/optionsSlice.spec.ts +0 -19
  390. package/test/state/referenceElementsSlice.spec.ts +0 -84
  391. package/test/state/registerInStore.spec.tsx +0 -101
  392. package/test/state/selectors/areaSelectors.spec.tsx +0 -77
  393. package/test/state/selectors/axisSelectors.spec.tsx +0 -1418
  394. package/test/state/selectors/barStackSelectors.spec.tsx +0 -752
  395. package/test/state/selectors/brushSelectors.spec.tsx +0 -30
  396. package/test/state/selectors/cartesianAxisSlice.spec.ts +0 -96
  397. package/test/state/selectors/combineNiceTicks.spec.ts +0 -207
  398. package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +0 -61
  399. package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +0 -39
  400. package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +0 -56
  401. package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +0 -123
  402. package/test/state/selectors/combiners/combineRealScaleType.spec.ts +0 -80
  403. package/test/state/selectors/containerSelectors.spec.tsx +0 -168
  404. package/test/state/selectors/dataSelectors.spec.tsx +0 -136
  405. package/test/state/selectors/legendSelectors.spec.tsx +0 -113
  406. package/test/state/selectors/lineSelectors.spec.tsx +0 -60
  407. package/test/state/selectors/pieSelectors.spec.tsx +0 -72
  408. package/test/state/selectors/radarSelectors.spec.tsx +0 -496
  409. package/test/state/selectors/rootPropsSelectors.spec.tsx +0 -169
  410. package/test/state/selectors/scatterSelectors.spec.tsx +0 -47
  411. package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +0 -234
  412. package/test/state/selectors/selectAllAxes.spec.tsx +0 -18
  413. package/test/state/selectors/selectAxisDomain.spec.tsx +0 -21
  414. package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +0 -19
  415. package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +0 -22
  416. package/test/state/selectors/selectAxisScale.spec.tsx +0 -91
  417. package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +0 -503
  418. package/test/state/selectors/selectBaseAxis.spec.tsx +0 -56
  419. package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +0 -57
  420. package/test/state/selectors/selectChartOffset.spec.tsx +0 -26
  421. package/test/state/selectors/selectDisplayedData.spec.tsx +0 -282
  422. package/test/state/selectors/selectIsTooltipActive.spec.tsx +0 -231
  423. package/test/state/selectors/selectNumericalDomain.spec.tsx +0 -21
  424. package/test/state/selectors/selectRealScaleType.spec.tsx +0 -19
  425. package/test/state/selectors/selectStackGroups.spec.tsx +0 -322
  426. package/test/state/selectors/selectXAxisPosition.spec.tsx +0 -22
  427. package/test/state/selectors/selectYAxisPosition.spec.tsx +0 -22
  428. package/test/state/selectors/selectorMemoization.spec.tsx +0 -136
  429. package/test/state/selectors/selectors.spec.tsx +0 -1613
  430. package/test/state/throttling.spec.ts +0 -200
  431. package/test/state/zIndexSlice.spec.ts +0 -85
  432. package/test/synchronisation/useChartSynchronisation.spec.tsx +0 -225
  433. package/test/util/BarUtils.spec.ts +0 -39
  434. package/test/util/CartesianUtils/CartesianUtils.spec.ts +0 -261
  435. package/test/util/CartesianUtils/rectWithPoints.spec.ts +0 -48
  436. package/test/util/ChartUtils/ChartUtils.spec.ts +0 -491
  437. package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +0 -136
  438. package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +0 -133
  439. package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +0 -97
  440. package/test/util/ChartUtils/getStackedData.spec.ts +0 -416
  441. package/test/util/ChartUtils/truncateByDomain.spec.ts +0 -70
  442. package/test/util/DataUtils.spec.ts +0 -385
  443. package/test/util/DomUtils.spec.tsx +0 -117
  444. package/test/util/FunnelUtils.spec.tsx +0 -70
  445. package/test/util/Global.spec.ts +0 -11
  446. package/test/util/LRUCache.spec.ts +0 -81
  447. package/test/util/LogUtils.spec.ts +0 -45
  448. package/test/util/PolarUtils.spec.ts +0 -66
  449. package/test/util/ReduceCssCalcPrototype.spec.ts +0 -141
  450. package/test/util/ShallowEqual.spec.ts +0 -102
  451. package/test/util/TickUtils.spec.ts +0 -29
  452. package/test/util/createChartHelpers.spec.tsx +0 -210
  453. package/test/util/cursor/getCursorPoints.spec.ts +0 -136
  454. package/test/util/cursor/getCursorRectangle.spec.ts +0 -50
  455. package/test/util/cursor/getRadialCursorPoints.spec.ts +0 -36
  456. package/test/util/errorValue.spec.ts +0 -69
  457. package/test/util/getEveryNth.spec.ts +0 -39
  458. package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +0 -51
  459. package/test/util/getRelativeCoordinate.spec.ts +0 -250
  460. package/test/util/getSliced.spec.ts +0 -45
  461. package/test/util/isDomainSpecifiedByUser.spec.ts +0 -207
  462. package/test/util/isWellBehavedNumber.spec.ts +0 -54
  463. package/test/util/payload/getUniqPayload.spec.ts +0 -56
  464. package/test/util/propsAreEqual.spec.ts +0 -75
  465. package/test/util/round.spec.ts +0 -112
  466. package/test/util/scale/arithmetic.spec.ts +0 -61
  467. package/test/util/scale/createCategoricalInverse.spec.ts +0 -84
  468. package/test/util/scale/getNiceTickValues.spec.ts +0 -421
  469. package/test/util/scale/getTickValuesFixedDomain.spec.ts +0 -155
  470. package/test/util/svgPropertiesAndEvents.spec.tsx +0 -206
  471. package/test/util/svgPropertiesNoEvents.spec.tsx +0 -228
  472. package/test/util/tooltip/translate.spec.ts +0 -396
  473. package/test/util/useAnimationId.spec.tsx +0 -59
  474. package/test/util/useElementOffset.spec.tsx +0 -173
  475. package/test/util/usePrefersReducedMotion.spec.ts +0 -54
  476. package/test/util/useUniqueId.spec.ts +0 -99
  477. package/test/utils/diagnostics-allowlist.ts +0 -18
  478. package/test/utils/diagnostics.ts +0 -58
  479. package/test/zIndex/AllZIndexPortals.spec.tsx +0 -83
  480. package/test/zIndex/DefaultZIndexes.spec.ts +0 -80
  481. package/test/zIndex/DynamicZIndex.spec.tsx +0 -102
  482. package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +0 -125
  483. package/test/zIndex/componentZIndex.spec.tsx +0 -255
  484. package/test/zIndex/getZIndexFromUnknown.spec.ts +0 -51
  485. package/test/zIndex/multiChartZIndexIsolation.spec.tsx +0 -90
  486. package/test/zIndex/zIndexSelectors.spec.ts +0 -172
  487. package/test-results/.last-run.json +0 -4
  488. package/tsconfig.json +0 -11
@@ -1,627 +0,0 @@
1
- // Ported from recharts 3.8.1 test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx.
2
- //
3
- // These tests investigate why categorical (scalePoint) and numerical (scaleLinear)
4
- // axes compute different pixel positions for the same data points when data slides.
5
- //
6
- // Tier-A (pure d3-scale) cases are byte-identical — they only exercise victory-vendor
7
- // d3-scale and so are golden-anchored to d3.
8
- //
9
- // Tier-B (real LineChart) cases port the selector-spy harness: React useState + an
10
- // `act(button.click())` data slide becomes a Solid `data` signal flipped on click,
11
- // and the selectLinePoints accessor is spied through createSelectorTestCase. The
12
- // last spy call holds the current points. `p.payload` is `unknown` in our port
13
- // (recharts erases it via `any`), so a runtime guard reads `name`/`x` — no `as`.
14
- import { describe, it, expect, beforeEach } from "vitest";
15
- import { scaleLinear, scalePoint } from "d3-scale";
16
- import { createSignal, flush } from "solid-js";
17
- import type { JSX } from "@solidjs/web";
18
- import { fireEvent } from "@solidjs/testing-library";
19
- import { Line, LineChart, XAxis, YAxis } from "../../src";
20
- import { createSelectorTestCase } from "../helper/createSelectorTestCase";
21
- import { mockGetBoundingClientRect } from "../helper/mockGetBoundingClientRect";
22
- import { selectLinePoints } from "../../src/state/selectors/lineSelectors";
23
- import type { LinePointItem } from "../../src/cartesian/Line";
24
- import { assertNotNull } from "../helper/assertNotNull";
25
-
26
- // Runtime guards (not casts) that read the named fields off the erased payload.
27
- function payloadName(p: LinePointItem): string | undefined {
28
- const payload = p.payload;
29
- if (payload != null && typeof payload === "object" && "name" in payload) {
30
- const name = (payload as { name: unknown }).name;
31
- return typeof name === "string" ? name : undefined;
32
- }
33
- return undefined;
34
- }
35
-
36
- function payloadX(p: LinePointItem): number | undefined {
37
- const payload = p.payload;
38
- if (payload != null && typeof payload === "object" && "x" in payload) {
39
- const x = (payload as { x: unknown }).x;
40
- return typeof x === "number" ? x : undefined;
41
- }
42
- return undefined;
43
- }
44
-
45
- describe("Scale behavior: categorical vs numerical point positions during data sliding", () => {
46
- describe("d3 scalePoint (categorical) behavior", () => {
47
- const RANGE: [number, number] = [0, 500];
48
-
49
- it("distributes categories evenly across the range", () => {
50
- const scale = scalePoint<string>().domain(["A", "B", "C", "D", "E", "F"]).range(RANGE);
51
-
52
- expect(scale("A")).toBe(0);
53
- expect(scale("B")).toBe(100);
54
- expect(scale("C")).toBe(200);
55
- expect(scale("D")).toBe(300);
56
- expect(scale("E")).toBe(400);
57
- expect(scale("F")).toBe(500);
58
- });
59
-
60
- it("redistributes ALL points when domain changes from [A..F] to [B..G]", () => {
61
- const before = scalePoint<string>().domain(["A", "B", "C", "D", "E", "F"]).range(RANGE);
62
- const after = scalePoint<string>().domain(["B", "C", "D", "E", "F", "G"]).range(RANGE);
63
-
64
- // Every surviving point gets a completely new position
65
- // B: was at 100, now at 0 — shifted by -100
66
- expect(before("B")).toBe(100);
67
- expect(after("B")).toBe(0);
68
-
69
- // C: was at 200, now at 100 — shifted by -100
70
- expect(before("C")).toBe(200);
71
- expect(after("C")).toBe(100);
72
-
73
- // F: was at 500, now at 400 — shifted by -100
74
- expect(before("F")).toBe(500);
75
- expect(after("F")).toBe(400);
76
-
77
- // The removed point A is no longer in the domain
78
- expect(after("A")).toBeUndefined();
79
-
80
- // The new point G gets the last position
81
- expect(after("G")).toBe(500);
82
- });
83
-
84
- it("the shift is consistent because the same number of categories fill the same range", () => {
85
- const before = scalePoint<string>().domain(["A", "B", "C", "D", "E", "F"]).range(RANGE);
86
- const after = scalePoint<string>().domain(["B", "C", "D", "E", "F", "G"]).range(RANGE);
87
-
88
- // When removing one item from start and adding one to end (same count),
89
- // the spacing stays constant: 500 / 5 = 100
90
- const spacingBefore = before("B")! - before("A")!;
91
- const spacingAfter = after("C")! - after("B")!;
92
- expect(spacingBefore).toBe(100);
93
- expect(spacingAfter).toBe(100);
94
-
95
- // Every surviving point shifts by exactly one spacing unit
96
- for (const label of ["B", "C", "D", "E", "F"]) {
97
- const shift = before(label)! - after(label)!;
98
- expect(shift).toBe(100);
99
- }
100
- });
101
-
102
- it("returns undefined for values not in the domain — animation must extrapolate", () => {
103
- const after = scalePoint<string>().domain(["B", "C", "D", "E", "F", "G"]).range(RANGE);
104
- // The removed point A cannot be positioned by the new scale
105
- // The animation system must guess where to animate it to
106
- expect(after("A")).toBeUndefined();
107
- });
108
-
109
- it("has different spacing when the count changes", () => {
110
- // If we go from 6 items to 5 items, the spacing changes
111
- const before = scalePoint<string>().domain(["A", "B", "C", "D", "E", "F"]).range(RANGE);
112
- const after = scalePoint<string>().domain(["B", "C", "D", "E", "F"]).range(RANGE);
113
-
114
- const spacingBefore = before("B")! - before("A")!;
115
- const spacingAfter = after("C")! - after("B")!;
116
-
117
- expect(spacingBefore).toBe(100); // 500 / 5
118
- expect(spacingAfter).toBe(125); // 500 / 4
119
-
120
- // Surviving points shift by different amounts!
121
- const shiftB = before("B")! - after("B")!;
122
- const shiftF = before("F")! - after("F")!;
123
- expect(shiftB).toBe(100); // 100 → 0
124
- expect(shiftF).toBe(0); // 500 → 500
125
-
126
- // B and F have different shifts — this makes animation non-uniform
127
- expect(shiftB).not.toBe(shiftF);
128
- });
129
- });
130
-
131
- describe("d3 scaleLinear (numerical) behavior", () => {
132
- const RANGE: [number, number] = [0, 500];
133
-
134
- it("maps values proportionally across the range", () => {
135
- const scale = scaleLinear().domain([1, 6]).range(RANGE);
136
-
137
- expect(scale(1)).toBe(0);
138
- expect(scale(2)).toBe(100);
139
- expect(scale(3)).toBe(200);
140
- expect(scale(4)).toBe(300);
141
- expect(scale(5)).toBe(400);
142
- expect(scale(6)).toBe(500);
143
- });
144
-
145
- it("repositions points proportionally when domain slides from [1,6] to [2,7]", () => {
146
- const before = scaleLinear().domain([1, 6]).range(RANGE);
147
- const after = scaleLinear().domain([2, 7]).range(RANGE);
148
-
149
- // Point 2: was at (2-1)/(6-1) * 500 = 100, now at (2-2)/(7-2) * 500 = 0
150
- expect(before(2)).toBe(100);
151
- expect(after(2)).toBe(0);
152
-
153
- // Point 6: was at (6-1)/(6-1) * 500 = 500, now at (6-2)/(7-2) * 500 = 400
154
- expect(before(6)).toBe(500);
155
- expect(after(6)).toBe(400);
156
-
157
- // Every surviving point shifts by exactly 100 (same as categorical with equal count)
158
- for (const val of [2, 3, 4, 5, 6]) {
159
- const shift = before(val) - after(val);
160
- expect(shift).toBe(100);
161
- }
162
- });
163
-
164
- it("can compute positions for values OUTSIDE the domain (extrapolation)", () => {
165
- const after = scaleLinear().domain([2, 7]).range(RANGE);
166
-
167
- // The removed point 1 is below the domain minimum
168
- // scaleLinear extrapolates: (1-2)/(7-2) * 500 = -100
169
- expect(after(1)).toBe(-100);
170
-
171
- // The new point 7 is at the domain maximum
172
- expect(after(7)).toBe(500);
173
- });
174
-
175
- it("extrapolation means removed points animate to just outside the left edge", () => {
176
- const before = scaleLinear().domain([1, 6]).range(RANGE);
177
- const after = scaleLinear().domain([2, 7]).range(RANGE);
178
-
179
- // Point 1's position in the old scale was at 0 (left edge)
180
- expect(before(1)).toBe(0);
181
-
182
- // In the new scale, point 1 would be at -100 (just past the left edge)
183
- expect(after(1)).toBe(-100);
184
-
185
- // This is exactly one spacing unit past the left edge,
186
- // which creates a smooth sliding-off animation
187
- const spacing = after(3) - after(2);
188
- expect(spacing).toBe(100);
189
- expect(after(1)).toBe(after(2) - spacing);
190
- });
191
-
192
- it("new points entering from the right also land at a natural position", () => {
193
- const before = scaleLinear().domain([1, 6]).range(RANGE);
194
- const after = scaleLinear().domain([2, 7]).range(RANGE);
195
-
196
- // Point 7 in the OLD scale would be at (7-1)/(6-1) * 500 = 600
197
- expect(before(7)).toBe(600);
198
-
199
- // In the new scale, point 7 is at 500 (right edge)
200
- expect(after(7)).toBe(500);
201
-
202
- // So animating from before(7)=600 to after(7)=500 means
203
- // the point enters from just past the right edge — smooth!
204
- });
205
-
206
- it("has the SAME spacing when count changes (unlike scalePoint)", () => {
207
- // Even if we go from 6 values to 5, the spacing per unit stays constant
208
- // because it's determined by domain range / pixel range, not by item count
209
- const before = scaleLinear().domain([1, 6]).range(RANGE);
210
- const after = scaleLinear().domain([2, 6]).range(RANGE);
211
-
212
- const spacingBefore = before(2) - before(1);
213
- const spacingAfter = after(3) - after(2);
214
-
215
- expect(spacingBefore).toBe(100); // 500 / 5
216
- expect(spacingAfter).toBe(125); // 500 / 4
217
-
218
- // Spacing changes because the domain range changed (was 5, now 4)
219
- // but the key difference is: scaleLinear CAN position the removed value
220
- expect(after(1)).toBe(-125);
221
- });
222
- });
223
-
224
- describe("key difference for animation: extrapolation capability", () => {
225
- const RANGE: [number, number] = [0, 500];
226
-
227
- it("scalePoint returns undefined for removed items — animation system must invent a position", () => {
228
- const oldScale = scalePoint<string>().domain(["A", "B", "C", "D", "E", "F"]).range(RANGE);
229
- const newScale = scalePoint<string>().domain(["B", "C", "D", "E", "F", "G"]).range(RANGE);
230
-
231
- // A was at position 0 in the old scale
232
- expect(oldScale("A")).toBe(0);
233
- // A cannot be positioned in the new scale
234
- expect(newScale("A")).toBeUndefined();
235
- });
236
-
237
- it("scaleLinear can position any value including removed ones — natural animation", () => {
238
- const oldScale = scaleLinear().domain([1, 6]).range(RANGE);
239
- const newScale = scaleLinear().domain([2, 7]).range(RANGE);
240
-
241
- // Point 1 was at position 0
242
- expect(oldScale(1)).toBe(0);
243
- // Point 1 can STILL be positioned in the new scale: it's at -100
244
- expect(newScale(1)).toBe(-100);
245
-
246
- // Similarly, point 7 in the old scale is at 600 (past the right edge)
247
- expect(oldScale(7)).toBe(600);
248
- // And in the new scale it's at 500 (right edge)
249
- expect(newScale(7)).toBe(500);
250
- });
251
- });
252
-
253
- describe("in a real LineChart: selectLinePoints with categorical XAxis", () => {
254
- beforeEach(() => {
255
- mockGetBoundingClientRect({ width: 500, height: 300 });
256
- });
257
-
258
- const dataWindow1 = [
259
- { name: "A", value: 10 },
260
- { name: "B", value: 20 },
261
- { name: "C", value: 30 },
262
- { name: "D", value: 40 },
263
- { name: "E", value: 50 },
264
- { name: "F", value: 60 },
265
- ];
266
-
267
- const dataWindow2 = [
268
- { name: "B", value: 20 },
269
- { name: "C", value: 30 },
270
- { name: "D", value: 40 },
271
- { name: "E", value: 50 },
272
- { name: "F", value: 60 },
273
- { name: "G", value: 70 },
274
- ];
275
-
276
- it("should redistribute all x positions when data slides with categorical axis", () => {
277
- const [data, setData] = createSignal(dataWindow1);
278
- const DataSlidingChart = (props: { children: JSX.Element }): JSX.Element => (
279
- <>
280
- <button type="button" onClick={() => setData(dataWindow2)}>
281
- Slide
282
- </button>
283
- <LineChart width={500} height={300} data={data()}>
284
- <XAxis dataKey="name" />
285
- <YAxis />
286
- <Line isAnimationActive={false} dataKey="value" id="line" />
287
- {props.children}
288
- </LineChart>
289
- </>
290
- );
291
-
292
- const renderTestCase = createSelectorTestCase(DataSlidingChart);
293
- const { container, spy } = renderTestCase((state) =>
294
- selectLinePoints(state, 0, 0, false, "line"),
295
- );
296
-
297
- // Get positions before slide
298
- const beforePoints: ReadonlyArray<LinePointItem> | undefined =
299
- spy.mock.calls[spy.mock.calls.length - 1]?.[0];
300
- assertNotNull(beforePoints);
301
- expect(beforePoints).toHaveLength(6);
302
-
303
- const beforeXPositions = beforePoints.map((p) => ({ name: payloadName(p), x: p.x }));
304
-
305
- // Slide the data
306
- const button = container.querySelector("button")!;
307
- fireEvent.click(button);
308
- flush();
309
-
310
- const afterPoints: ReadonlyArray<LinePointItem> | undefined =
311
- spy.mock.calls[spy.mock.calls.length - 1]?.[0];
312
- assertNotNull(afterPoints);
313
- expect(afterPoints).toHaveLength(6);
314
-
315
- const afterXPositions = afterPoints.map((p) => ({ name: payloadName(p), x: p.x }));
316
-
317
- // Key observation: B's x position changes from its "before" position
318
- const beforeB = beforeXPositions.find((p) => p.name === "B")!;
319
- const afterB = afterXPositions.find((p) => p.name === "B")!;
320
- expect(beforeB.x).not.toBe(afterB.x);
321
-
322
- // B was at position index 1 (of 6), now at position index 0 (of 6)
323
- // With scalePoint, all positions redistribute
324
- // B moves from where "B" was to where "A" used to be (approximately)
325
- expect(afterB.x).toBeLessThan(beforeB.x!);
326
-
327
- // Similarly for F: was at position 5 (of 6), now at position 4 (of 6)
328
- const beforeF = beforeXPositions.find((p) => p.name === "F")!;
329
- const afterF = afterXPositions.find((p) => p.name === "F")!;
330
- expect(afterF.x).toBeLessThan(beforeF.x!);
331
-
332
- // The shift for each surviving point should be equal (same spacing, same count)
333
- const shiftB = beforeB.x! - afterB.x!;
334
- const shiftF = beforeF.x! - afterF.x!;
335
- expect(shiftB).toBeCloseTo(shiftF, 1);
336
-
337
- // Point A is no longer in the data at all — animation must extrapolate its exit position
338
- expect(afterXPositions.find((p) => p.name === "A")).toBeUndefined();
339
- });
340
- });
341
-
342
- describe("in a real LineChart: selectLinePoints with numerical XAxis", () => {
343
- beforeEach(() => {
344
- mockGetBoundingClientRect({ width: 500, height: 300 });
345
- });
346
-
347
- const dataWindow1 = [
348
- { x: 1, value: 10 },
349
- { x: 2, value: 20 },
350
- { x: 3, value: 30 },
351
- { x: 4, value: 40 },
352
- { x: 5, value: 50 },
353
- { x: 6, value: 60 },
354
- ];
355
-
356
- const dataWindow2 = [
357
- { x: 2, value: 20 },
358
- { x: 3, value: 30 },
359
- { x: 4, value: 40 },
360
- { x: 5, value: 50 },
361
- { x: 6, value: 60 },
362
- { x: 7, value: 70 },
363
- ];
364
-
365
- it("should compute positions based on numeric values with linear scale", () => {
366
- const [data, setData] = createSignal(dataWindow1);
367
- const DataSlidingChart = (props: { children: JSX.Element }): JSX.Element => (
368
- <>
369
- <button type="button" onClick={() => setData(dataWindow2)}>
370
- Slide
371
- </button>
372
- <LineChart width={500} height={300} data={data()}>
373
- <XAxis dataKey="x" type="number" domain={["dataMin", "dataMax"]} />
374
- <YAxis />
375
- <Line isAnimationActive={false} dataKey="value" id="line" />
376
- {props.children}
377
- </LineChart>
378
- </>
379
- );
380
-
381
- const renderTestCase = createSelectorTestCase(DataSlidingChart);
382
- const { container, spy } = renderTestCase((state) =>
383
- selectLinePoints(state, 0, 0, false, "line"),
384
- );
385
-
386
- const beforePoints: ReadonlyArray<LinePointItem> | undefined =
387
- spy.mock.calls[spy.mock.calls.length - 1]?.[0];
388
- assertNotNull(beforePoints);
389
- expect(beforePoints).toHaveLength(6);
390
-
391
- const beforeXPositions = beforePoints.map((p) => ({ x: payloadX(p), px: p.x }));
392
-
393
- // Slide the data
394
- const button = container.querySelector("button")!;
395
- fireEvent.click(button);
396
- flush();
397
-
398
- const afterPoints: ReadonlyArray<LinePointItem> | undefined =
399
- spy.mock.calls[spy.mock.calls.length - 1]?.[0];
400
- assertNotNull(afterPoints);
401
- expect(afterPoints).toHaveLength(6);
402
-
403
- const afterXPositions = afterPoints.map((p) => ({ x: payloadX(p), px: p.x }));
404
-
405
- // Key observation: positions shift proportionally
406
- const beforeP2 = beforeXPositions.find((p) => p.x === 2)!;
407
- const afterP2 = afterXPositions.find((p) => p.x === 2)!;
408
-
409
- // Point 2 moves left because the domain shifted from [1,6] to [2,7]
410
- expect(afterP2.px).toBeLessThan(beforeP2.px!);
411
-
412
- // All surviving points should shift by the same amount
413
- const shifts = [2, 3, 4, 5, 6].map((val) => {
414
- const before = beforeXPositions.find((p) => p.x === val)!;
415
- const after = afterXPositions.find((p) => p.x === val)!;
416
- return before.px! - after.px!;
417
- });
418
-
419
- // All shifts should be equal (linear scale preserves uniform shift)
420
- for (const shift of shifts) {
421
- expect(shift).toBeCloseTo(shifts[0]!, 1);
422
- }
423
-
424
- // The new point (x=7) is at the right edge of the plot
425
- const p7 = afterXPositions.find((p) => p.x === 7)!;
426
- const p6 = afterXPositions.find((p) => p.x === 6)!;
427
- const spacing = p7.px! - p6.px!;
428
- expect(spacing).toBeGreaterThan(0);
429
- });
430
-
431
- it("should position the leftmost point at the left edge of plot area after slide", () => {
432
- const [data, setData] = createSignal(dataWindow1);
433
- const DataSlidingChart = (props: { children: JSX.Element }): JSX.Element => (
434
- <>
435
- <button type="button" onClick={() => setData(dataWindow2)}>
436
- Slide
437
- </button>
438
- <LineChart width={500} height={300} data={data()}>
439
- <XAxis dataKey="x" type="number" domain={["dataMin", "dataMax"]} />
440
- <YAxis />
441
- <Line isAnimationActive={false} dataKey="value" id="line" />
442
- {props.children}
443
- </LineChart>
444
- </>
445
- );
446
-
447
- const renderTestCase = createSelectorTestCase(DataSlidingChart);
448
- const { container, spy } = renderTestCase((state) =>
449
- selectLinePoints(state, 0, 0, false, "line"),
450
- );
451
-
452
- const beforePoints: ReadonlyArray<LinePointItem> | undefined =
453
- spy.mock.calls[spy.mock.calls.length - 1]?.[0];
454
- assertNotNull(beforePoints);
455
- // Point 1 (leftmost) should be at the left edge
456
- const p1Before = beforePoints.find((p) => payloadX(p) === 1)!;
457
- // Point 6 (rightmost) should be at the right edge
458
- const p6Before = beforePoints.find((p) => payloadX(p) === 6)!;
459
-
460
- const button = container.querySelector("button")!;
461
- fireEvent.click(button);
462
- flush();
463
-
464
- const afterPoints: ReadonlyArray<LinePointItem> | undefined =
465
- spy.mock.calls[spy.mock.calls.length - 1]?.[0];
466
- assertNotNull(afterPoints);
467
- // Point 2 (now leftmost) should be at the left edge
468
- const p2After = afterPoints.find((p) => payloadX(p) === 2)!;
469
- // Point 7 (now rightmost) should be at the right edge
470
- const p7After = afterPoints.find((p) => payloadX(p) === 7)!;
471
-
472
- // With domain=['dataMin','dataMax'], the leftmost is always at the same x
473
- // and the rightmost is always at the same x
474
- expect(p2After.x).toBe(p1Before.x);
475
- expect(p7After.x).toBe(p6Before.x);
476
- });
477
- });
478
-
479
- describe("comparing shifts: categorical vs numerical during identical data slide", () => {
480
- beforeEach(() => {
481
- mockGetBoundingClientRect({ width: 500, height: 300 });
482
- });
483
-
484
- it("both axis types produce the same shift magnitude when item count stays constant", () => {
485
- // Categorical
486
- const catChart = (props: { children: JSX.Element }): JSX.Element => (
487
- <LineChart
488
- width={500}
489
- height={300}
490
- data={[
491
- { name: "A", value: 10 },
492
- { name: "B", value: 20 },
493
- { name: "C", value: 30 },
494
- ]}
495
- >
496
- <XAxis dataKey="name" />
497
- <Line isAnimationActive={false} dataKey="value" id="line" />
498
- {props.children}
499
- </LineChart>
500
- );
501
- const catRender = createSelectorTestCase(catChart);
502
- const { spy: catSpy } = catRender((state) => selectLinePoints(state, 0, 0, false, "line"));
503
- const catPoints: ReadonlyArray<LinePointItem> | undefined =
504
- catSpy.mock.calls[catSpy.mock.calls.length - 1]?.[0];
505
- assertNotNull(catPoints);
506
-
507
- // Numerical
508
- const numChart = (props: { children: JSX.Element }): JSX.Element => (
509
- <LineChart
510
- width={500}
511
- height={300}
512
- data={[
513
- { x: 1, value: 10 },
514
- { x: 2, value: 20 },
515
- { x: 3, value: 30 },
516
- ]}
517
- >
518
- <XAxis dataKey="x" type="number" domain={["dataMin", "dataMax"]} />
519
- <Line isAnimationActive={false} dataKey="value" id="line" />
520
- {props.children}
521
- </LineChart>
522
- );
523
- const numRender = createSelectorTestCase(numChart);
524
- const { spy: numSpy } = numRender((state) => selectLinePoints(state, 0, 0, false, "line"));
525
- const numPoints: ReadonlyArray<LinePointItem> | undefined =
526
- numSpy.mock.calls[numSpy.mock.calls.length - 1]?.[0];
527
- assertNotNull(numPoints);
528
-
529
- // Both should have same number of points
530
- expect(catPoints).toHaveLength(3);
531
- expect(numPoints).toHaveLength(3);
532
-
533
- // Both should use the same range, so the first and last point positions
534
- // should be similar (they both map to the edges of the plot area)
535
- const catSpacing = catPoints[1]!.x! - catPoints[0]!.x!;
536
- const numSpacing = numPoints[1]!.x! - numPoints[0]!.x!;
537
-
538
- // Both spacings should be equal because both have the same number of points
539
- // across the same plot width
540
- expect(catSpacing).toBeCloseTo(numSpacing, 0);
541
- });
542
- });
543
-
544
- describe("animation implications: what defaultLineAnimateItems must handle", () => {
545
- it("with scalePoint: removed item has no position in new frame, must be computed from shift", () => {
546
- const RANGE: [number, number] = [0, 500];
547
- const before = scalePoint<string>().domain(["A", "B", "C", "D", "E", "F"]).range(RANGE);
548
- const after = scalePoint<string>().domain(["B", "C", "D", "E", "F", "G"]).range(RANGE);
549
-
550
- // Simulate what defaultLineAnimateItems does:
551
- // 1. Match surviving points: B→B, C→C, D→D, E→E, F→F
552
- const matchedPairs = ["B", "C", "D", "E", "F"].map((label) => ({
553
- label,
554
- prevX: before(label)!,
555
- nextX: after(label)!,
556
- }));
557
-
558
- // 2. Compute average shift
559
- const shifts = matchedPairs.map((p) => p.nextX - p.prevX);
560
- const avgShift = shifts.reduce((a, b) => a + b, 0) / shifts.length;
561
- expect(avgShift).toBe(-100); // all points shifted left by 100
562
-
563
- // 3. For removed item A: animate from prev position to prev position + shift
564
- const removedPrevX = before("A")!;
565
- expect(removedPrevX).toBe(0);
566
- const removedExitX = removedPrevX + avgShift;
567
- expect(removedExitX).toBe(-100); // slides off the left edge — correct!
568
-
569
- // 4. For new item G: animate from next position - shift to next position
570
- const newNextX = after("G")!;
571
- expect(newNextX).toBe(500);
572
- const newEntryX = newNextX - avgShift;
573
- expect(newEntryX).toBe(600); // enters from past the right edge — correct!
574
- });
575
-
576
- it("with scaleLinear: the scale itself handles extrapolation", () => {
577
- const RANGE: [number, number] = [0, 500];
578
- const before = scaleLinear().domain([1, 6]).range(RANGE);
579
- const after = scaleLinear().domain([2, 7]).range(RANGE);
580
-
581
- // The matched pairs work the same way
582
- const matchedPairs = [2, 3, 4, 5, 6].map((val) => ({
583
- val,
584
- prevX: before(val),
585
- nextX: after(val),
586
- }));
587
-
588
- const shifts = matchedPairs.map((p) => p.nextX - p.prevX);
589
- const avgShift = shifts.reduce((a, b) => a + b, 0) / shifts.length;
590
- expect(avgShift).toBe(-100);
591
-
592
- // For removed item 1: our animation computes prev + shift = 0 + (-100) = -100
593
- const removedExitX = before(1) + avgShift;
594
- expect(removedExitX).toBe(-100);
595
-
596
- // But scaleLinear can also extrapolate directly: after(1) = -100
597
- expect(after(1)).toBe(-100);
598
- });
599
-
600
- it("both approaches produce the same exit/entry positions when count stays constant", () => {
601
- const RANGE: [number, number] = [0, 500];
602
-
603
- // scalePoint approach
604
- const catBefore = scalePoint<string>().domain(["A", "B", "C", "D", "E", "F"]).range(RANGE);
605
- const catAfter = scalePoint<string>().domain(["B", "C", "D", "E", "F", "G"]).range(RANGE);
606
- const catShift = catAfter("B")! - catBefore("B")!;
607
- const catRemovedExit = catBefore("A")! + catShift;
608
- const catNewEntry = catAfter("G")! - catShift;
609
-
610
- // scaleLinear approach
611
- const numBefore = scaleLinear().domain([1, 6]).range(RANGE);
612
- const numAfter = scaleLinear().domain([2, 7]).range(RANGE);
613
- const numShift = numAfter(2) - numBefore(2);
614
- const numRemovedExit = numBefore(1) + numShift;
615
- const numNewEntry = numAfter(7) - numShift;
616
-
617
- // All the same!
618
- expect(catShift).toBe(numShift);
619
- expect(catRemovedExit).toBe(numRemovedExit);
620
- expect(catNewEntry).toBe(numNewEntry);
621
-
622
- // Both produce: exit at -100, entry from 600
623
- expect(catRemovedExit).toBe(-100);
624
- expect(catNewEntry).toBe(600);
625
- });
626
- });
627
- });