solid-recharts 0.2.0 → 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 (508) hide show
  1. package/package.json +17 -13
  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 +43 -58
  6. package/src/cartesian/AreaRevealShape.tsx +1 -1
  7. package/src/cartesian/Bar.tsx +98 -78
  8. package/src/cartesian/BarStack.tsx +10 -7
  9. package/src/cartesian/Brush.tsx +20 -16
  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 +17 -21
  14. package/src/cartesian/GraphicalItemClipPath.tsx +1 -1
  15. package/src/cartesian/Line.tsx +51 -66
  16. package/src/cartesian/LineDrawShape.tsx +20 -17
  17. package/src/cartesian/ReferenceArea.tsx +28 -38
  18. package/src/cartesian/ReferenceDot.tsx +27 -37
  19. package/src/cartesian/ReferenceLine.tsx +28 -37
  20. package/src/cartesian/RenderedTicksReporter.tsx +19 -17
  21. package/src/cartesian/Scatter.tsx +27 -39
  22. package/src/cartesian/XAxis.tsx +55 -68
  23. package/src/cartesian/YAxis.tsx +88 -99
  24. package/src/cartesian/ZAxis.tsx +29 -41
  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 +6 -5
  40. package/src/chart/Treemap.tsx +5 -4
  41. package/src/component/ActivePoints.tsx +6 -15
  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 +11 -7
  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 +17 -26
  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 +49 -60
  65. package/src/polar/PolarAngleAxis.tsx +43 -52
  66. package/src/polar/PolarGrid.tsx +5 -5
  67. package/src/polar/PolarRadiusAxis.tsx +42 -50
  68. package/src/polar/Radar.tsx +24 -36
  69. package/src/polar/RadialBar.tsx +23 -41
  70. package/src/shape/Cross.tsx +5 -5
  71. package/src/shape/Curve.tsx +7 -8
  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 +6 -6
  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 +20 -28
  84. package/src/state/SetTooltipEntrySettings.tsx +10 -27
  85. package/src/state/brushSlice.ts +10 -8
  86. package/src/state/cartesianAxisSlice.ts +72 -84
  87. package/src/state/chartDataSlice.ts +29 -23
  88. package/src/state/createCollectionActions.ts +51 -0
  89. package/src/state/createSelector.ts +97 -0
  90. package/src/state/errorBarSlice.ts +22 -16
  91. package/src/state/eventSettingsSlice.ts +11 -9
  92. package/src/state/externalEventsMiddleware.ts +2 -11
  93. package/src/state/graphicalItemsSlice.ts +35 -44
  94. package/src/state/isEventThrottled.ts +12 -0
  95. package/src/state/keyboardEventsMiddleware.ts +2 -8
  96. package/src/state/layoutSlice.ts +29 -17
  97. package/src/state/legendSlice.ts +35 -31
  98. package/src/state/mouseEventsMiddleware.ts +2 -13
  99. package/src/state/optionsSlice.ts +8 -6
  100. package/src/state/patched.ts +19 -0
  101. package/src/state/polarAxisSlice.ts +21 -13
  102. package/src/state/polarOptionsSlice.ts +16 -14
  103. package/src/state/referenceElementsSlice.ts +49 -34
  104. package/src/state/registerInStore.ts +70 -0
  105. package/src/state/renderedTicksSlice.ts +11 -7
  106. package/src/state/rootPropsSlice.ts +16 -14
  107. package/src/state/selectors/areaSelectors.ts +13 -36
  108. package/src/state/selectors/arrayEqualityCheck.ts +32 -7
  109. package/src/state/selectors/axisSelectors.ts +215 -169
  110. package/src/state/selectors/barSelectors.ts +8 -36
  111. package/src/state/selectors/combiners/combineConfiguredScale.ts +1 -1
  112. package/src/state/selectors/combiners/combineRealScaleType.ts +1 -1
  113. package/src/state/selectors/dataSelectors.ts +35 -16
  114. package/src/state/selectors/numberDomainEqualityCheck.ts +16 -8
  115. package/src/state/selectors/selectAxisForGraphicalItem.ts +52 -0
  116. package/src/state/tooltipSlice.ts +135 -86
  117. package/src/state/unregisterOnCleanup.ts +5 -20
  118. package/src/state/zIndexSlice.ts +50 -42
  119. package/src/synchronisation/useChartSynchronisation.tsx +213 -217
  120. package/src/util/ActiveShapeUtils.tsx +2 -9
  121. package/src/util/BarUtils.tsx +30 -23
  122. package/src/util/ChartUtils.ts +69 -25
  123. package/src/util/DirectPortal.tsx +107 -0
  124. package/src/util/FunnelUtils.tsx +1 -1
  125. package/src/util/RadialBarUtils.tsx +4 -3
  126. package/src/util/createCartesianCharts.tsx +1 -1
  127. package/src/util/createPolarCharts.tsx +1 -1
  128. package/src/util/propsAreEqual.ts +3 -33
  129. package/src/util/stacks/stackTypes.ts +1 -1
  130. package/src/util/svgPropertiesAndEvents.ts +1 -1
  131. package/src/util/tooltip/translate.ts +2 -2
  132. package/src/util/types.ts +3 -3
  133. package/src/zIndex/ZIndexLayer.tsx +39 -68
  134. package/src/zIndex/ZIndexPortal.tsx +29 -25
  135. package/src/state/reduxDevtoolsJsonStringifyReplacer.ts +0 -15
  136. package/src/util/axisPropsAreEqual.ts +0 -42
  137. package/src/util/resolveDefaultProps.tsx +0 -8
  138. package/src/util/typedDataKey.ts +0 -8
  139. package/test/_data.ts +0 -408
  140. package/test/animation/AnimationController.typed.spec.ts +0 -53
  141. package/test/animation/AnimationControllerImpl.spec.ts +0 -271
  142. package/test/animation/CSSTransitionAnimate.timing.spec.tsx +0 -473
  143. package/test/animation/JavascriptAnimate.spec.tsx +0 -62
  144. package/test/animation/RechartsAnimation.spec.ts +0 -636
  145. package/test/animation/easing.spec.ts +0 -218
  146. package/test/animation/legacyAnimationLengthChange.spec.tsx +0 -803
  147. package/test/animation/matchBy.spec.ts +0 -467
  148. package/test/animation/mockAnimationController.ts +0 -40
  149. package/test/animation/mockControllerAnimationManager.ts +0 -143
  150. package/test/animation/mockTimeoutController.ts +0 -114
  151. package/test/animation/timeoutController.spec.ts +0 -138
  152. package/test/animation/useAnimationStartSnapshot.spec.ts +0 -147
  153. package/test/animation/util.spec.ts +0 -28
  154. package/test/cartesian/Area.animation.spec.tsx +0 -363
  155. package/test/cartesian/Area.range.spec.tsx +0 -54
  156. package/test/cartesian/Area.spec.tsx +0 -1202
  157. package/test/cartesian/Area.stacked.render.spec.tsx +0 -69
  158. package/test/cartesian/Area.typed.spec.tsx +0 -209
  159. package/test/cartesian/Axis.integration.spec.tsx +0 -158
  160. package/test/cartesian/Bar/Bar.csstransition.spec.tsx +0 -299
  161. package/test/cartesian/Bar/Bar.spec.tsx +0 -2314
  162. package/test/cartesian/Bar/Bar.typed.spec.tsx +0 -192
  163. package/test/cartesian/Bar.animation.spec.tsx +0 -426
  164. package/test/cartesian/Bar.stackDomain.spec.tsx +0 -66
  165. package/test/cartesian/Bar.stacked.render.spec.tsx +0 -53
  166. package/test/cartesian/Bar.truncateByDomain.spec.tsx +0 -237
  167. package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +0 -336
  168. package/test/cartesian/BarStack.spec.tsx +0 -91
  169. package/test/cartesian/Brush.keyboard.spec.tsx +0 -88
  170. package/test/cartesian/Brush.panorama.spec.tsx +0 -41
  171. package/test/cartesian/Brush.props.spec.tsx +0 -63
  172. package/test/cartesian/Brush.render.spec.tsx +0 -117
  173. package/test/cartesian/Brush.spec.tsx +0 -522
  174. package/test/cartesian/Brush.stacked.spec.tsx +0 -221
  175. package/test/cartesian/CartesianAxis.render.spec.tsx +0 -50
  176. package/test/cartesian/CartesianAxis.spec.tsx +0 -396
  177. package/test/cartesian/CartesianGrid.render.spec.tsx +0 -39
  178. package/test/cartesian/CartesianGrid.spec.tsx +0 -2103
  179. package/test/cartesian/ErrorBar.render.spec.tsx +0 -69
  180. package/test/cartesian/ErrorBar.spec.tsx +0 -2414
  181. package/test/cartesian/Funnel.animation.spec.tsx +0 -241
  182. package/test/cartesian/Funnel.spec.tsx +0 -226
  183. package/test/cartesian/Funnel.typed.spec.tsx +0 -221
  184. package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +0 -627
  185. package/test/cartesian/GraphicalItemClipPath.spec.tsx +0 -427
  186. package/test/cartesian/Line.animation.spec.tsx +0 -643
  187. package/test/cartesian/Line.sparseAnimationPath.spec.tsx +0 -98
  188. package/test/cartesian/Line.spec.tsx +0 -471
  189. package/test/cartesian/Line.typed.spec.tsx +0 -152
  190. package/test/cartesian/ReferenceArea.render.spec.tsx +0 -63
  191. package/test/cartesian/ReferenceArea.spec.tsx +0 -663
  192. package/test/cartesian/ReferenceArea.typed.spec.tsx +0 -74
  193. package/test/cartesian/ReferenceDot.render.spec.tsx +0 -55
  194. package/test/cartesian/ReferenceDot.spec.tsx +0 -462
  195. package/test/cartesian/ReferenceDot.typed.spec.tsx +0 -76
  196. package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +0 -184
  197. package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +0 -744
  198. package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +0 -74
  199. package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +0 -399
  200. package/test/cartesian/ReferenceLine.render.spec.tsx +0 -134
  201. package/test/cartesian/Scatter.animation.spec.tsx +0 -381
  202. package/test/cartesian/Scatter.render.spec.tsx +0 -61
  203. package/test/cartesian/Scatter.spec.tsx +0 -406
  204. package/test/cartesian/Scatter.typed.spec.tsx +0 -153
  205. package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +0 -336
  206. package/test/cartesian/XAxis/XAxis.brush.spec.tsx +0 -266
  207. package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +0 -872
  208. package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +0 -86
  209. package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +0 -127
  210. package/test/cartesian/XAxis/XAxis.hide.spec.tsx +0 -106
  211. package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +0 -336
  212. package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +0 -1466
  213. package/test/cartesian/XAxis/XAxis.padding.spec.tsx +0 -758
  214. package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +0 -65
  215. package/test/cartesian/XAxis/XAxis.state.spec.tsx +0 -355
  216. package/test/cartesian/XAxis/XAxis.tick.spec.tsx +0 -493
  217. package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +0 -233
  218. package/test/cartesian/XAxis/XAxis.type.spec.tsx +0 -107
  219. package/test/cartesian/XAxis/XAxis.typed.spec.tsx +0 -102
  220. package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +0 -265
  221. package/test/cartesian/XAxis.tickFormatter.spec.tsx +0 -54
  222. package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +0 -230
  223. package/test/cartesian/YAxis/YAxis.7362.spec.tsx +0 -104
  224. package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +0 -88
  225. package/test/cartesian/YAxis/YAxis.label.spec.tsx +0 -219
  226. package/test/cartesian/YAxis/YAxis.spec.tsx +0 -1595
  227. package/test/cartesian/YAxis/YAxis.tick.spec.tsx +0 -428
  228. package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +0 -54
  229. package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +0 -263
  230. package/test/cartesian/YAxis/YAxis.type.spec.tsx +0 -107
  231. package/test/cartesian/YAxis/YAxis.typed.spec.tsx +0 -102
  232. package/test/cartesian/ZAxis.spec.tsx +0 -300
  233. package/test/cartesian/ZAxis.typed.spec.tsx +0 -33
  234. package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +0 -5
  235. package/test/cartesian/axisLineAndStroke.spec.tsx +0 -72
  236. package/test/cartesian/getCartesianPosition.spec.ts +0 -907
  237. package/test/cartesian/getEquidistantTicks.spec.ts +0 -88
  238. package/test/cartesian/getTicks.spec.ts +0 -378
  239. package/test/cartesian/miscFeatureGaps.spec.tsx +0 -89
  240. package/test/cartesian/useAnimatedLineLength.spec.ts +0 -168
  241. package/test/chart/AccessibilityLayer.spec.tsx +0 -569
  242. package/test/chart/AccessibilityScans.spec.tsx +0 -286
  243. package/test/chart/AreaChart.spec.tsx +0 -409
  244. package/test/chart/AreaChart.stacked.spec.tsx +0 -1407
  245. package/test/chart/AreaChart.typed.spec.tsx +0 -39
  246. package/test/chart/BarChart.spec.tsx +0 -3719
  247. package/test/chart/BarChart.typed.spec.tsx +0 -60
  248. package/test/chart/CategoricalChart.spec.tsx +0 -255
  249. package/test/chart/ComposedChart.spec.tsx +0 -199
  250. package/test/chart/ComposedChart.typed.spec.tsx +0 -39
  251. package/test/chart/FunnelChart.spec.tsx +0 -215
  252. package/test/chart/FunnelChart.typed.spec.tsx +0 -39
  253. package/test/chart/LineChart.multiseries.spec.tsx +0 -50
  254. package/test/chart/LineChart.smoke.spec.tsx +0 -50
  255. package/test/chart/LineChart.spec.tsx +0 -930
  256. package/test/chart/LineChart.typed.spec.tsx +0 -39
  257. package/test/chart/NicheChartTooltip.spec.tsx +0 -81
  258. package/test/chart/PieChart.spec.tsx +0 -793
  259. package/test/chart/PieChart.typed.spec.tsx +0 -39
  260. package/test/chart/RadarChart.spec.tsx +0 -530
  261. package/test/chart/RadarChart.typed.spec.tsx +0 -39
  262. package/test/chart/RadialBarChart.5966.spec.tsx +0 -48
  263. package/test/chart/RadialBarChart.spec.tsx +0 -679
  264. package/test/chart/RadialBarChart.typed.spec.tsx +0 -39
  265. package/test/chart/RechartsWrapper.spec.tsx +0 -83
  266. package/test/chart/Sankey.content.spec.tsx +0 -46
  267. package/test/chart/Sankey.spec.tsx +0 -952
  268. package/test/chart/Sankey.typed.spec.tsx +0 -29
  269. package/test/chart/ScatterChart.spec.tsx +0 -2613
  270. package/test/chart/ScatterChart.typed.spec.tsx +0 -39
  271. package/test/chart/SunburstChart.spec.tsx +0 -146
  272. package/test/chart/Treemap.animation.spec.tsx +0 -52
  273. package/test/chart/Treemap.spec.tsx +0 -1003
  274. package/test/chart/Treemap.typed.spec.tsx +0 -26
  275. package/test/chart/chartEvents.spec.tsx +0 -127
  276. package/test/chart/responsive.spec.tsx +0 -620
  277. package/test/component/Cell.render.spec.tsx +0 -155
  278. package/test/component/Cell.spec.tsx +0 -12
  279. package/test/component/Cursor.spec.tsx +0 -186
  280. package/test/component/DefaultTooltipContent.spec.tsx +0 -102
  281. package/test/component/Label.render.spec.tsx +0 -63
  282. package/test/component/Label.spec.tsx +0 -686
  283. package/test/component/Label.typed.spec.tsx +0 -46
  284. package/test/component/LabelList.spec.tsx +0 -188
  285. package/test/component/Legend.itemSorter.spec.tsx +0 -704
  286. package/test/component/Legend.render.spec.tsx +0 -92
  287. package/test/component/Legend.spec.tsx +0 -2213
  288. package/test/component/Legend.typed.spec.tsx +0 -22
  289. package/test/component/ResponsiveContainer.spec.tsx +0 -523
  290. package/test/component/ResponsiveContainerDataTest.spec.tsx +0 -51
  291. package/test/component/Text.spec.tsx +0 -415
  292. package/test/component/Text.typed.spec.tsx +0 -46
  293. package/test/component/Tooltip/ActiveDot.spec.tsx +0 -370
  294. package/test/component/Tooltip/Tooltip.animation.spec.tsx +0 -209
  295. package/test/component/Tooltip/Tooltip.content.spec.tsx +0 -128
  296. package/test/component/Tooltip/Tooltip.formatter.spec.tsx +0 -152
  297. package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +0 -79
  298. package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +0 -165
  299. package/test/component/Tooltip/Tooltip.offset.spec.tsx +0 -113
  300. package/test/component/Tooltip/Tooltip.state.spec.tsx +0 -74
  301. package/test/component/Tooltip/Tooltip.sync.spec.tsx +0 -639
  302. package/test/component/Tooltip/defaultIndex.spec.tsx +0 -227
  303. package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +0 -138
  304. package/test/component/Tooltip/itemSorter.spec.tsx +0 -2815
  305. package/test/component/Tooltip/tooltipEventType.spec.tsx +0 -344
  306. package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +0 -41
  307. package/test/component/Tooltip/tooltipTestHelpers.tsx +0 -162
  308. package/test/component/Tooltip.defaultIndex.spec.tsx +0 -48
  309. package/test/component/Tooltip.hover.spec.tsx +0 -61
  310. package/test/component/Tooltip.item.spec.tsx +0 -54
  311. package/test/component/Tooltip.keyboard.spec.tsx +0 -51
  312. package/test/component/Tooltip.payload.spec.tsx +0 -1716
  313. package/test/component/Tooltip.touch.spec.tsx +0 -39
  314. package/test/component/Tooltip.visibility.spec.tsx +0 -1889
  315. package/test/component/TooltipBoundingBox.spec.tsx +0 -89
  316. package/test/component/responsiveContainerUtils.spec.ts +0 -205
  317. package/test/container/ClipPath.spec.tsx +0 -602
  318. package/test/container/chartDimensions.spec.tsx +0 -368
  319. package/test/context/chartLayoutContext.spec.tsx +0 -378
  320. package/test/helper/ExpectAxisDomain.tsx +0 -27
  321. package/test/helper/assertNotNull.ts +0 -6
  322. package/test/helper/assertZIndexLayerOrder.ts +0 -19
  323. package/test/helper/createSelectorTestCase.tsx +0 -176
  324. package/test/helper/expectAnimatedPieAngles.ts +0 -100
  325. package/test/helper/expectAnimatedPiePaths.ts +0 -78
  326. package/test/helper/expectAreaCurve.ts +0 -15
  327. package/test/helper/expectAxisTicks.ts +0 -48
  328. package/test/helper/expectBars.ts +0 -54
  329. package/test/helper/expectFunctionReturning.ts +0 -58
  330. package/test/helper/expectLabel.ts +0 -32
  331. package/test/helper/expectLastCalledWith.ts +0 -48
  332. package/test/helper/expectLine.ts +0 -20
  333. package/test/helper/expectPieSectors.ts +0 -80
  334. package/test/helper/expectScale.ts +0 -37
  335. package/test/helper/expectScatterPoints.ts +0 -52
  336. package/test/helper/expectStackGroups.ts +0 -144
  337. package/test/helper/mockAxes.ts +0 -22
  338. package/test/helper/mockGetBoundingClientRect.ts +0 -66
  339. package/test/helper/mockHTMLElementProperty.ts +0 -19
  340. package/test/helper/mockTouchingElement.ts +0 -27
  341. package/test/helper/offsetHelpers.ts +0 -19
  342. package/test/helper/parameterizedTestCases.tsx +0 -99
  343. package/test/helper/produceState.ts +0 -32
  344. package/test/helper/selectorTestHelpers.tsx +0 -63
  345. package/test/helper/trim.spec.ts +0 -35
  346. package/test/helper/trim.ts +0 -11
  347. package/test/hooks/useActiveTooltipDataPoints.spec.tsx +0 -358
  348. package/test/hooks/useAxisDomain.spec.tsx +0 -361
  349. package/test/hooks/useAxisScale.spec.tsx +0 -283
  350. package/test/hooks/useAxisTicks.spec.tsx +0 -130
  351. package/test/hooks/useOffset.spec.tsx +0 -248
  352. package/test/hooks/useTooltipStateHooks.spec.tsx +0 -109
  353. package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +0 -135
  354. package/test/polar/Pie/Pie.spec.tsx +0 -784
  355. package/test/polar/Pie/Pie.typed.spec.tsx +0 -78
  356. package/test/polar/Pie.animation.spec.tsx +0 -529
  357. package/test/polar/PieWithLegend.animation.spec.tsx +0 -142
  358. package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +0 -76
  359. package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +0 -2079
  360. package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +0 -102
  361. package/test/polar/PolarAngleAxis.render.spec.tsx +0 -79
  362. package/test/polar/PolarGrid.render.spec.tsx +0 -75
  363. package/test/polar/PolarGrid.spec.tsx +0 -918
  364. package/test/polar/PolarLegendPerRow.render.spec.tsx +0 -85
  365. package/test/polar/PolarRadiusAxis.events.spec.tsx +0 -65
  366. package/test/polar/PolarRadiusAxis.render.spec.tsx +0 -52
  367. package/test/polar/PolarRadiusAxis.spec.tsx +0 -991
  368. package/test/polar/PolarRadiusAxis.typed.spec.tsx +0 -84
  369. package/test/polar/PolarTooltipLegend.render.spec.tsx +0 -80
  370. package/test/polar/Radar.animation.spec.tsx +0 -570
  371. package/test/polar/Radar.render.spec.tsx +0 -71
  372. package/test/polar/Radar.spec.tsx +0 -265
  373. package/test/polar/Radar.typed.spec.tsx +0 -119
  374. package/test/polar/RadialBar/RadialBar.spec.tsx +0 -1521
  375. package/test/polar/RadialBar/RadialBar.typed.spec.tsx +0 -132
  376. package/test/polar/RadialBar.animation.spec.tsx +0 -375
  377. package/test/polar/RadialBar.render.spec.tsx +0 -66
  378. package/test/polar/RadialBar.stacked.spec.tsx +0 -57
  379. package/test/setup.ts +0 -84
  380. package/test/shape/ActiveShape.spec.tsx +0 -181
  381. package/test/shape/Cross.spec.tsx +0 -60
  382. package/test/shape/Cross.typed.spec.tsx +0 -26
  383. package/test/shape/Curve.spec.tsx +0 -368
  384. package/test/shape/Curve.typed.spec.tsx +0 -69
  385. package/test/shape/Dot.spec.tsx +0 -73
  386. package/test/shape/Dot.typed.spec.tsx +0 -30
  387. package/test/shape/Polygon.spec.tsx +0 -357
  388. package/test/shape/Polygon.typed.spec.tsx +0 -28
  389. package/test/shape/Rectangle.animation.spec.tsx +0 -451
  390. package/test/shape/Rectangle.spec.tsx +0 -68
  391. package/test/shape/Rectangle.typed.spec.tsx +0 -24
  392. package/test/shape/Sector.spec.tsx +0 -76
  393. package/test/shape/Sector.typed.spec.tsx +0 -24
  394. package/test/shape/Symbols.spec.tsx +0 -43
  395. package/test/shape/Symbols.typed.spec.tsx +0 -24
  396. package/test/shape/Trapezoid.spec.tsx +0 -50
  397. package/test/shape/Trapezoid.typed.spec.tsx +0 -24
  398. package/test/shape/__snapshots__/Cross.spec.tsx.snap +0 -62
  399. package/test/shape/__snapshots__/Curve.spec.tsx.snap +0 -460
  400. package/test/shape/__snapshots__/Polygon.spec.tsx.snap +0 -58
  401. package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +0 -117
  402. package/test/shape/__snapshots__/Sector.spec.tsx.snap +0 -71
  403. package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +0 -64
  404. package/test/state/chartDataSlice.spec.ts +0 -53
  405. package/test/state/externalEventsMiddleware.spec.ts +0 -178
  406. package/test/state/graphicalItemsSlice.spec.ts +0 -92
  407. package/test/state/hooks.spec.tsx +0 -68
  408. package/test/state/legendSlice.spec.ts +0 -44
  409. package/test/state/mouseEventsMiddleware.spec.ts +0 -75
  410. package/test/state/optionsSlice.spec.ts +0 -19
  411. package/test/state/reduxDevtoolsJsonStringifyReplacer.spec.ts +0 -25
  412. package/test/state/referenceElementsSlice.spec.ts +0 -84
  413. package/test/state/selectors/areaSelectors.spec.tsx +0 -77
  414. package/test/state/selectors/axisSelectors.spec.tsx +0 -1418
  415. package/test/state/selectors/barStackSelectors.spec.tsx +0 -752
  416. package/test/state/selectors/brushSelectors.spec.tsx +0 -30
  417. package/test/state/selectors/cartesianAxisSlice.spec.ts +0 -96
  418. package/test/state/selectors/combineNiceTicks.spec.ts +0 -207
  419. package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +0 -61
  420. package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +0 -39
  421. package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +0 -56
  422. package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +0 -123
  423. package/test/state/selectors/combiners/combineRealScaleType.spec.ts +0 -80
  424. package/test/state/selectors/containerSelectors.spec.tsx +0 -168
  425. package/test/state/selectors/dataSelectors.spec.tsx +0 -136
  426. package/test/state/selectors/legendSelectors.spec.tsx +0 -113
  427. package/test/state/selectors/lineSelectors.spec.tsx +0 -60
  428. package/test/state/selectors/pieSelectors.spec.tsx +0 -72
  429. package/test/state/selectors/radarSelectors.spec.tsx +0 -496
  430. package/test/state/selectors/rootPropsSelectors.spec.tsx +0 -169
  431. package/test/state/selectors/scatterSelectors.spec.tsx +0 -47
  432. package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +0 -234
  433. package/test/state/selectors/selectAllAxes.spec.tsx +0 -18
  434. package/test/state/selectors/selectAxisDomain.spec.tsx +0 -21
  435. package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +0 -19
  436. package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +0 -22
  437. package/test/state/selectors/selectAxisScale.spec.tsx +0 -91
  438. package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +0 -503
  439. package/test/state/selectors/selectBaseAxis.spec.tsx +0 -56
  440. package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +0 -57
  441. package/test/state/selectors/selectChartOffset.spec.tsx +0 -26
  442. package/test/state/selectors/selectDisplayedData.spec.tsx +0 -282
  443. package/test/state/selectors/selectIsTooltipActive.spec.tsx +0 -231
  444. package/test/state/selectors/selectNumericalDomain.spec.tsx +0 -21
  445. package/test/state/selectors/selectRealScaleType.spec.tsx +0 -19
  446. package/test/state/selectors/selectStackGroups.spec.tsx +0 -322
  447. package/test/state/selectors/selectXAxisPosition.spec.tsx +0 -22
  448. package/test/state/selectors/selectYAxisPosition.spec.tsx +0 -22
  449. package/test/state/selectors/selectors.spec.tsx +0 -1613
  450. package/test/state/throttling.spec.ts +0 -200
  451. package/test/state/zIndexSlice.spec.ts +0 -85
  452. package/test/synchronisation/useChartSynchronisation.spec.tsx +0 -225
  453. package/test/util/BarUtils.spec.ts +0 -39
  454. package/test/util/CartesianUtils/CartesianUtils.spec.ts +0 -261
  455. package/test/util/CartesianUtils/rectWithPoints.spec.ts +0 -48
  456. package/test/util/ChartUtils/ChartUtils.spec.ts +0 -491
  457. package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +0 -136
  458. package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +0 -133
  459. package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +0 -83
  460. package/test/util/ChartUtils/getStackedData.spec.ts +0 -416
  461. package/test/util/ChartUtils/truncateByDomain.spec.ts +0 -70
  462. package/test/util/DataUtils.spec.ts +0 -385
  463. package/test/util/DomUtils.spec.tsx +0 -117
  464. package/test/util/FunnelUtils.spec.tsx +0 -70
  465. package/test/util/Global.spec.ts +0 -11
  466. package/test/util/LRUCache.spec.ts +0 -81
  467. package/test/util/LogUtils.spec.ts +0 -45
  468. package/test/util/PolarUtils.spec.ts +0 -66
  469. package/test/util/ReduceCssCalcPrototype.spec.ts +0 -141
  470. package/test/util/ShallowEqual.spec.ts +0 -102
  471. package/test/util/TickUtils.spec.ts +0 -29
  472. package/test/util/axisPropsAreEqual.spec.ts +0 -93
  473. package/test/util/createChartHelpers.spec.tsx +0 -210
  474. package/test/util/cursor/getCursorPoints.spec.ts +0 -136
  475. package/test/util/cursor/getCursorRectangle.spec.ts +0 -50
  476. package/test/util/cursor/getRadialCursorPoints.spec.ts +0 -36
  477. package/test/util/errorValue.spec.ts +0 -69
  478. package/test/util/getEveryNth.spec.ts +0 -39
  479. package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +0 -51
  480. package/test/util/getRelativeCoordinate.spec.ts +0 -250
  481. package/test/util/getSliced.spec.ts +0 -45
  482. package/test/util/isDomainSpecifiedByUser.spec.ts +0 -207
  483. package/test/util/isWellBehavedNumber.spec.ts +0 -54
  484. package/test/util/payload/getUniqPayload.spec.ts +0 -56
  485. package/test/util/propsAreEqual.spec.ts +0 -75
  486. package/test/util/round.spec.ts +0 -112
  487. package/test/util/scale/arithmetic.spec.ts +0 -61
  488. package/test/util/scale/createCategoricalInverse.spec.ts +0 -84
  489. package/test/util/scale/getNiceTickValues.spec.ts +0 -421
  490. package/test/util/scale/getTickValuesFixedDomain.spec.ts +0 -155
  491. package/test/util/svgPropertiesAndEvents.spec.tsx +0 -206
  492. package/test/util/svgPropertiesNoEvents.spec.tsx +0 -228
  493. package/test/util/tooltip/translate.spec.ts +0 -396
  494. package/test/util/useAnimationId.spec.tsx +0 -59
  495. package/test/util/useElementOffset.spec.tsx +0 -173
  496. package/test/util/usePrefersReducedMotion.spec.ts +0 -54
  497. package/test/util/useUniqueId.spec.ts +0 -99
  498. package/test/utils/diagnostics-allowlist.ts +0 -18
  499. package/test/utils/diagnostics.ts +0 -58
  500. package/test/zIndex/AllZIndexPortals.spec.tsx +0 -83
  501. package/test/zIndex/DefaultZIndexes.spec.ts +0 -80
  502. package/test/zIndex/DynamicZIndex.spec.tsx +0 -102
  503. package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +0 -125
  504. package/test/zIndex/componentZIndex.spec.tsx +0 -255
  505. package/test/zIndex/getZIndexFromUnknown.spec.ts +0 -51
  506. package/test/zIndex/multiChartZIndexIsolation.spec.tsx +0 -90
  507. package/test/zIndex/zIndexSelectors.spec.ts +0 -172
  508. 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 "victory-vendor/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
- });