solid-recharts 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (639) hide show
  1. package/NEXT_SESSION_PROMPT.md +114 -0
  2. package/package.json +28 -0
  3. package/src/animation/AnimatedItems.tsx +169 -0
  4. package/src/animation/AnimationController.ts +24 -0
  5. package/src/animation/AnimationControllerImpl.ts +37 -0
  6. package/src/animation/AnimationHandle.ts +273 -0
  7. package/src/animation/CSSTransitionAnimate.tsx +142 -0
  8. package/src/animation/JavascriptAnimate.tsx +107 -0
  9. package/src/animation/easing.ts +261 -0
  10. package/src/animation/matchBy.ts +211 -0
  11. package/src/animation/timeoutController.ts +51 -0
  12. package/src/animation/useAnimationController.tsx +31 -0
  13. package/src/animation/useAnimationStartSnapshot.ts +73 -0
  14. package/src/animation/util.ts +16 -0
  15. package/src/cartesian/Area.tsx +810 -0
  16. package/src/cartesian/AreaRevealShape.tsx +250 -0
  17. package/src/cartesian/Bar.tsx +1216 -0
  18. package/src/cartesian/BarStack.tsx +148 -0
  19. package/src/cartesian/Brush.tsx +653 -0
  20. package/src/cartesian/CartesianAxis.tsx +541 -0
  21. package/src/cartesian/CartesianGrid.tsx +605 -0
  22. package/src/cartesian/ErrorBar.tsx +319 -0
  23. package/src/cartesian/Funnel.tsx +594 -0
  24. package/src/cartesian/GraphicalItemClipPath.tsx +75 -0
  25. package/src/cartesian/Line.tsx +742 -0
  26. package/src/cartesian/LineDrawShape.tsx +190 -0
  27. package/src/cartesian/ReferenceArea.tsx +275 -0
  28. package/src/cartesian/ReferenceDot.tsx +286 -0
  29. package/src/cartesian/ReferenceLine.tsx +414 -0
  30. package/src/cartesian/RenderedTicksReporter.tsx +49 -0
  31. package/src/cartesian/Scatter.tsx +741 -0
  32. package/src/cartesian/XAxis.tsx +293 -0
  33. package/src/cartesian/YAxis.tsx +333 -0
  34. package/src/cartesian/ZAxis.tsx +80 -0
  35. package/src/cartesian/getCartesianPosition.ts +255 -0
  36. package/src/cartesian/getEquidistantTicks.ts +126 -0
  37. package/src/cartesian/getTicks.ts +225 -0
  38. package/src/cartesian/useAnimatedLineLength.ts +84 -0
  39. package/src/chart/AreaChart.tsx +30 -0
  40. package/src/chart/BarChart.tsx +27 -0
  41. package/src/chart/CartesianChart.tsx +91 -0
  42. package/src/chart/CategoricalChart.tsx +60 -0
  43. package/src/chart/ComposedChart.tsx +29 -0
  44. package/src/chart/FunnelChart.tsx +29 -0
  45. package/src/chart/LineChart.tsx +29 -0
  46. package/src/chart/PieChart.tsx +41 -0
  47. package/src/chart/PolarChart.tsx +97 -0
  48. package/src/chart/RadarChart.tsx +37 -0
  49. package/src/chart/RadialBarChart.tsx +39 -0
  50. package/src/chart/RechartsWrapper.tsx +486 -0
  51. package/src/chart/Sankey.tsx +992 -0
  52. package/src/chart/ScatterChart.tsx +29 -0
  53. package/src/chart/SunburstChart.tsx +394 -0
  54. package/src/chart/Treemap.tsx +874 -0
  55. package/src/chart/types.ts +37 -0
  56. package/src/component/ActivePoints.tsx +136 -0
  57. package/src/component/Cell.tsx +72 -0
  58. package/src/component/Cursor.tsx +249 -0
  59. package/src/component/Customized.tsx +8 -0
  60. package/src/component/DefaultLegendContent.tsx +205 -0
  61. package/src/component/DefaultTooltipContent.tsx +247 -0
  62. package/src/component/Dots.tsx +128 -0
  63. package/src/component/Label.tsx +507 -0
  64. package/src/component/LabelList.tsx +270 -0
  65. package/src/component/Legend.tsx +273 -0
  66. package/src/component/ResponsiveContainer.tsx +397 -0
  67. package/src/component/Text.tsx +436 -0
  68. package/src/component/Tooltip.tsx +309 -0
  69. package/src/component/TooltipBoundingBox.tsx +152 -0
  70. package/src/component/responsiveContainerUtils.ts +128 -0
  71. package/src/container/ClipPathProvider.tsx +40 -0
  72. package/src/container/Layer.tsx +38 -0
  73. package/src/container/RootSurface.tsx +124 -0
  74. package/src/container/Surface.tsx +70 -0
  75. package/src/context/ErrorBarContext.tsx +85 -0
  76. package/src/context/PanoramaContext.tsx +13 -0
  77. package/src/context/RegisterGraphicalItemId.tsx +41 -0
  78. package/src/context/accessibilityContext.tsx +10 -0
  79. package/src/context/brushUpdateContext.ts +14 -0
  80. package/src/context/chartDataContext.tsx +79 -0
  81. package/src/context/chartLayoutContext.tsx +158 -0
  82. package/src/context/legendPayloadContext.ts +11 -0
  83. package/src/context/legendPortalContext.ts +11 -0
  84. package/src/context/tooltipContext.ts +72 -0
  85. package/src/context/tooltipPortalContext.ts +14 -0
  86. package/src/context/useTooltipAxis.ts +24 -0
  87. package/src/hooks.ts +312 -0
  88. package/src/index.ts +288 -0
  89. package/src/polar/Pie.tsx +912 -0
  90. package/src/polar/PolarAngleAxis.tsx +494 -0
  91. package/src/polar/PolarGrid.tsx +269 -0
  92. package/src/polar/PolarRadiusAxis.tsx +422 -0
  93. package/src/polar/Radar.tsx +652 -0
  94. package/src/polar/RadialBar.tsx +767 -0
  95. package/src/polar/defaultPolarAngleAxisProps.tsx +33 -0
  96. package/src/polar/defaultPolarRadiusAxisProps.tsx +28 -0
  97. package/src/shape/Cross.tsx +83 -0
  98. package/src/shape/Curve.tsx +335 -0
  99. package/src/shape/Dot.tsx +49 -0
  100. package/src/shape/Polygon.tsx +168 -0
  101. package/src/shape/Rectangle.tsx +301 -0
  102. package/src/shape/Sector.tsx +304 -0
  103. package/src/shape/Symbols.tsx +144 -0
  104. package/src/shape/Trapezoid.tsx +228 -0
  105. package/src/state/RechartsReduxContext.tsx +8 -0
  106. package/src/state/RechartsStoreContext.ts +15 -0
  107. package/src/state/RechartsStoreProvider.tsx +27 -0
  108. package/src/state/ReportChartProps.tsx +19 -0
  109. package/src/state/ReportEventSettings.tsx +19 -0
  110. package/src/state/ReportMainChartProps.tsx +35 -0
  111. package/src/state/ReportPolarOptions.tsx +28 -0
  112. package/src/state/SetLegendPayload.ts +50 -0
  113. package/src/state/SetTooltipEntrySettings.tsx +46 -0
  114. package/src/state/brushSlice.ts +60 -0
  115. package/src/state/cartesianAxisSlice.ts +288 -0
  116. package/src/state/chartDataSlice.ts +115 -0
  117. package/src/state/errorBarSlice.ts +84 -0
  118. package/src/state/eventSettingsSlice.ts +41 -0
  119. package/src/state/externalEventsMiddleware.ts +136 -0
  120. package/src/state/graphicalItemsSlice.ts +162 -0
  121. package/src/state/hooks.ts +42 -0
  122. package/src/state/keyboardEventsMiddleware.ts +213 -0
  123. package/src/state/layoutSlice.ts +71 -0
  124. package/src/state/legendSlice.ts +107 -0
  125. package/src/state/mouseEventsMiddleware.ts +103 -0
  126. package/src/state/optionsSlice.ts +64 -0
  127. package/src/state/polarAxisSlice.ts +65 -0
  128. package/src/state/polarOptionsSlice.ts +54 -0
  129. package/src/state/reduxDevtoolsJsonStringifyReplacer.ts +15 -0
  130. package/src/state/referenceElementsSlice.ts +121 -0
  131. package/src/state/renderedTicksSlice.ts +61 -0
  132. package/src/state/rootPropsSlice.ts +70 -0
  133. package/src/state/selectors/areaSelectors.ts +169 -0
  134. package/src/state/selectors/arrayEqualityCheck.ts +8 -0
  135. package/src/state/selectors/axisSelectors.ts +2196 -0
  136. package/src/state/selectors/barSelectors.ts +319 -0
  137. package/src/state/selectors/barStackSelectors.ts +79 -0
  138. package/src/state/selectors/brushSelectors.ts +40 -0
  139. package/src/state/selectors/combiners/combineActiveLabel.ts +21 -0
  140. package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +93 -0
  141. package/src/state/selectors/combiners/combineAllBarPositions.ts +131 -0
  142. package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +17 -0
  143. package/src/state/selectors/combiners/combineBarPosition.ts +24 -0
  144. package/src/state/selectors/combiners/combineBarSizeList.ts +75 -0
  145. package/src/state/selectors/combiners/combineCheckedDomain.ts +49 -0
  146. package/src/state/selectors/combiners/combineConfiguredScale.ts +121 -0
  147. package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +43 -0
  148. package/src/state/selectors/combiners/combineDisplayedStackedData.ts +50 -0
  149. package/src/state/selectors/combiners/combineInverseScaleFunction.ts +17 -0
  150. package/src/state/selectors/combiners/combineRealScaleType.ts +48 -0
  151. package/src/state/selectors/combiners/combineStackedData.ts +28 -0
  152. package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
  153. package/src/state/selectors/combiners/combineTooltipPayload.ts +203 -0
  154. package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +45 -0
  155. package/src/state/selectors/containerSelectors.ts +12 -0
  156. package/src/state/selectors/dataSelectors.ts +90 -0
  157. package/src/state/selectors/funnelSelectors.ts +83 -0
  158. package/src/state/selectors/graphicalItemSelectors.ts +23 -0
  159. package/src/state/selectors/legendSelectors.ts +29 -0
  160. package/src/state/selectors/lineSelectors.ts +111 -0
  161. package/src/state/selectors/numberDomainEqualityCheck.ts +8 -0
  162. package/src/state/selectors/pickAxisId.ts +6 -0
  163. package/src/state/selectors/pickAxisType.ts +4 -0
  164. package/src/state/selectors/pieSelectors.ts +103 -0
  165. package/src/state/selectors/polarAxisSelectors.ts +202 -0
  166. package/src/state/selectors/polarGridSelectors.ts +24 -0
  167. package/src/state/selectors/polarScaleSelectors.ts +149 -0
  168. package/src/state/selectors/polarSelectors.ts +211 -0
  169. package/src/state/selectors/radarSelectors.ts +152 -0
  170. package/src/state/selectors/radialBarSelectors.ts +328 -0
  171. package/src/state/selectors/rootPropsSelectors.ts +36 -0
  172. package/src/state/selectors/scatterSelectors.ts +77 -0
  173. package/src/state/selectors/selectAllAxes.ts +10 -0
  174. package/src/state/selectors/selectChartOffset.ts +15 -0
  175. package/src/state/selectors/selectChartOffsetInternal.ts +111 -0
  176. package/src/state/selectors/selectPlotArea.ts +27 -0
  177. package/src/state/selectors/selectTooltipAxisId.ts +6 -0
  178. package/src/state/selectors/selectTooltipAxisType.ts +33 -0
  179. package/src/state/selectors/selectTooltipEventType.ts +45 -0
  180. package/src/state/selectors/selectTooltipPayloadSearcher.ts +7 -0
  181. package/src/state/selectors/selectTooltipSettings.ts +6 -0
  182. package/src/state/selectors/selectTooltipState.ts +5 -0
  183. package/src/state/selectors/tooltipSelectors.ts +690 -0
  184. package/src/state/selectors/touchSelectors.ts +29 -0
  185. package/src/state/store.ts +167 -0
  186. package/src/state/tooltipSlice.ts +289 -0
  187. package/src/state/types/AreaSettings.ts +17 -0
  188. package/src/state/types/BarSettings.ts +16 -0
  189. package/src/state/types/LineSettings.ts +12 -0
  190. package/src/state/types/PieSettings.ts +32 -0
  191. package/src/state/types/RadarSettings.ts +6 -0
  192. package/src/state/types/RadialBarSettings.ts +10 -0
  193. package/src/state/types/ScatterSettings.ts +13 -0
  194. package/src/state/types/StackedGraphicalItem.ts +33 -0
  195. package/src/state/unregisterOnCleanup.ts +26 -0
  196. package/src/state/zIndexSlice.ts +128 -0
  197. package/src/synchronisation/syncRegistry.ts +131 -0
  198. package/src/synchronisation/syncSelectors.ts +7 -0
  199. package/src/synchronisation/types.ts +42 -0
  200. package/src/synchronisation/useChartSynchronisation.tsx +372 -0
  201. package/src/types.ts +39 -0
  202. package/src/util/ActiveShapeUtils.tsx +80 -0
  203. package/src/util/BarUtils.tsx +74 -0
  204. package/src/util/CartesianUtils.ts +53 -0
  205. package/src/util/ChartUtils.ts +696 -0
  206. package/src/util/Constants.ts +42 -0
  207. package/src/util/CssPrefixUtils.ts +24 -0
  208. package/src/util/DOMUtils.ts +141 -0
  209. package/src/util/DataUtils.ts +205 -0
  210. package/src/util/FunnelUtils.tsx +37 -0
  211. package/src/util/Global.ts +15 -0
  212. package/src/util/IfOverflow.ts +17 -0
  213. package/src/util/LRUCache.ts +46 -0
  214. package/src/util/LogUtils.ts +26 -0
  215. package/src/util/PolarUtils.ts +134 -0
  216. package/src/util/RadialBarUtils.tsx +35 -0
  217. package/src/util/ReduceCSSCalc.ts +186 -0
  218. package/src/util/ShallowEqual.ts +43 -0
  219. package/src/util/TickUtils.ts +61 -0
  220. package/src/util/YAxisUtils.ts +49 -0
  221. package/src/util/adaptEventHandlers.ts +69 -0
  222. package/src/util/axisPropsAreEqual.ts +42 -0
  223. package/src/util/collectionUtils.ts +83 -0
  224. package/src/util/createCartesianCharts.tsx +101 -0
  225. package/src/util/createEventProxy.ts +24 -0
  226. package/src/util/createPolarCharts.tsx +86 -0
  227. package/src/util/cursor/getCursorPoints.ts +48 -0
  228. package/src/util/cursor/getCursorRectangle.ts +31 -0
  229. package/src/util/cursor/getRadialCursorPoints.ts +34 -0
  230. package/src/util/excludeEventProps.ts +172 -0
  231. package/src/util/getActiveCoordinate.ts +205 -0
  232. package/src/util/getAxisTypeBasedOnLayout.ts +21 -0
  233. package/src/util/getEveryNth.ts +30 -0
  234. package/src/util/getRadiusAndStrokeWidthFromDot.ts +35 -0
  235. package/src/util/getRelativeCoordinate.ts +84 -0
  236. package/src/util/getSliced.ts +21 -0
  237. package/src/util/isDomainSpecifiedByUser.ts +217 -0
  238. package/src/util/isWellBehavedNumber.ts +10 -0
  239. package/src/util/objectPath.ts +129 -0
  240. package/src/util/payload/getUniqPayload.ts +31 -0
  241. package/src/util/propsAreEqual.ts +137 -0
  242. package/src/util/resolveDefaultProps.tsx +8 -0
  243. package/src/util/round.ts +35 -0
  244. package/src/util/scale/CartesianScaleHelper.ts +72 -0
  245. package/src/util/scale/CustomScaleDefinition.ts +82 -0
  246. package/src/util/scale/RechartsScale.ts +131 -0
  247. package/src/util/scale/createCategoricalInverse.ts +83 -0
  248. package/src/util/scale/getNiceTickValues.ts +334 -0
  249. package/src/util/scale/index.ts +3 -0
  250. package/src/util/scale/util/DecimalLite.ts +194 -0
  251. package/src/util/scale/util/arithmetic.ts +56 -0
  252. package/src/util/stacks/getStackSeriesIdentifier.ts +20 -0
  253. package/src/util/stacks/stackTypes.ts +53 -0
  254. package/src/util/svgPropertiesAndEvents.ts +84 -0
  255. package/src/util/svgPropertiesNoEvents.ts +520 -0
  256. package/src/util/tooltip/translate.ts +179 -0
  257. package/src/util/typedDataKey.ts +8 -0
  258. package/src/util/types.ts +724 -0
  259. package/src/util/useAnimationId.tsx +31 -0
  260. package/src/util/useElementOffset.ts +164 -0
  261. package/src/util/useId.ts +20 -0
  262. package/src/util/usePrefersReducedMotion.ts +44 -0
  263. package/src/util/useUniqueId.ts +34 -0
  264. package/src/zIndex/DefaultZIndexes.tsx +87 -0
  265. package/src/zIndex/ZIndexLayer.tsx +126 -0
  266. package/src/zIndex/ZIndexPortal.tsx +69 -0
  267. package/src/zIndex/getZIndexFromUnknown.tsx +17 -0
  268. package/src/zIndex/zIndexSelectors.ts +46 -0
  269. package/test/_data.ts +408 -0
  270. package/test/animation/AnimationController.typed.spec.ts +53 -0
  271. package/test/animation/AnimationControllerImpl.spec.ts +271 -0
  272. package/test/animation/CSSTransitionAnimate.timing.spec.tsx +473 -0
  273. package/test/animation/JavascriptAnimate.spec.tsx +62 -0
  274. package/test/animation/RechartsAnimation.spec.ts +636 -0
  275. package/test/animation/easing.spec.ts +218 -0
  276. package/test/animation/legacyAnimationLengthChange.spec.tsx +803 -0
  277. package/test/animation/matchBy.spec.ts +467 -0
  278. package/test/animation/mockAnimationController.ts +40 -0
  279. package/test/animation/mockControllerAnimationManager.ts +143 -0
  280. package/test/animation/mockTimeoutController.ts +114 -0
  281. package/test/animation/timeoutController.spec.ts +138 -0
  282. package/test/animation/useAnimationStartSnapshot.spec.ts +147 -0
  283. package/test/animation/util.spec.ts +28 -0
  284. package/test/cartesian/Area.animation.spec.tsx +363 -0
  285. package/test/cartesian/Area.range.spec.tsx +54 -0
  286. package/test/cartesian/Area.spec.tsx +1202 -0
  287. package/test/cartesian/Area.stacked.render.spec.tsx +69 -0
  288. package/test/cartesian/Area.typed.spec.tsx +209 -0
  289. package/test/cartesian/Axis.integration.spec.tsx +158 -0
  290. package/test/cartesian/Bar/Bar.csstransition.spec.tsx +299 -0
  291. package/test/cartesian/Bar/Bar.spec.tsx +2314 -0
  292. package/test/cartesian/Bar/Bar.typed.spec.tsx +192 -0
  293. package/test/cartesian/Bar.animation.spec.tsx +426 -0
  294. package/test/cartesian/Bar.stackDomain.spec.tsx +66 -0
  295. package/test/cartesian/Bar.stacked.render.spec.tsx +53 -0
  296. package/test/cartesian/Bar.truncateByDomain.spec.tsx +237 -0
  297. package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +336 -0
  298. package/test/cartesian/BarStack.spec.tsx +91 -0
  299. package/test/cartesian/Brush.keyboard.spec.tsx +88 -0
  300. package/test/cartesian/Brush.panorama.spec.tsx +41 -0
  301. package/test/cartesian/Brush.props.spec.tsx +63 -0
  302. package/test/cartesian/Brush.render.spec.tsx +117 -0
  303. package/test/cartesian/Brush.spec.tsx +522 -0
  304. package/test/cartesian/Brush.stacked.spec.tsx +221 -0
  305. package/test/cartesian/CartesianAxis.render.spec.tsx +50 -0
  306. package/test/cartesian/CartesianAxis.spec.tsx +396 -0
  307. package/test/cartesian/CartesianGrid.render.spec.tsx +39 -0
  308. package/test/cartesian/CartesianGrid.spec.tsx +2103 -0
  309. package/test/cartesian/ErrorBar.render.spec.tsx +69 -0
  310. package/test/cartesian/ErrorBar.spec.tsx +2414 -0
  311. package/test/cartesian/Funnel.animation.spec.tsx +241 -0
  312. package/test/cartesian/Funnel.spec.tsx +226 -0
  313. package/test/cartesian/Funnel.typed.spec.tsx +221 -0
  314. package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +627 -0
  315. package/test/cartesian/GraphicalItemClipPath.spec.tsx +427 -0
  316. package/test/cartesian/Line.animation.spec.tsx +643 -0
  317. package/test/cartesian/Line.sparseAnimationPath.spec.tsx +98 -0
  318. package/test/cartesian/Line.spec.tsx +471 -0
  319. package/test/cartesian/Line.typed.spec.tsx +152 -0
  320. package/test/cartesian/ReferenceArea.render.spec.tsx +63 -0
  321. package/test/cartesian/ReferenceArea.spec.tsx +663 -0
  322. package/test/cartesian/ReferenceArea.typed.spec.tsx +74 -0
  323. package/test/cartesian/ReferenceDot.render.spec.tsx +55 -0
  324. package/test/cartesian/ReferenceDot.spec.tsx +462 -0
  325. package/test/cartesian/ReferenceDot.typed.spec.tsx +76 -0
  326. package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +184 -0
  327. package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +744 -0
  328. package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +74 -0
  329. package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +399 -0
  330. package/test/cartesian/ReferenceLine.render.spec.tsx +134 -0
  331. package/test/cartesian/Scatter.animation.spec.tsx +381 -0
  332. package/test/cartesian/Scatter.render.spec.tsx +61 -0
  333. package/test/cartesian/Scatter.spec.tsx +406 -0
  334. package/test/cartesian/Scatter.typed.spec.tsx +153 -0
  335. package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +336 -0
  336. package/test/cartesian/XAxis/XAxis.brush.spec.tsx +266 -0
  337. package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +872 -0
  338. package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +86 -0
  339. package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +127 -0
  340. package/test/cartesian/XAxis/XAxis.hide.spec.tsx +106 -0
  341. package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +336 -0
  342. package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +1466 -0
  343. package/test/cartesian/XAxis/XAxis.padding.spec.tsx +758 -0
  344. package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +65 -0
  345. package/test/cartesian/XAxis/XAxis.state.spec.tsx +355 -0
  346. package/test/cartesian/XAxis/XAxis.tick.spec.tsx +493 -0
  347. package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +233 -0
  348. package/test/cartesian/XAxis/XAxis.type.spec.tsx +107 -0
  349. package/test/cartesian/XAxis/XAxis.typed.spec.tsx +102 -0
  350. package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +265 -0
  351. package/test/cartesian/XAxis.tickFormatter.spec.tsx +54 -0
  352. package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +230 -0
  353. package/test/cartesian/YAxis/YAxis.7362.spec.tsx +104 -0
  354. package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +88 -0
  355. package/test/cartesian/YAxis/YAxis.label.spec.tsx +219 -0
  356. package/test/cartesian/YAxis/YAxis.spec.tsx +1595 -0
  357. package/test/cartesian/YAxis/YAxis.tick.spec.tsx +428 -0
  358. package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +54 -0
  359. package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +263 -0
  360. package/test/cartesian/YAxis/YAxis.type.spec.tsx +107 -0
  361. package/test/cartesian/YAxis/YAxis.typed.spec.tsx +102 -0
  362. package/test/cartesian/ZAxis.spec.tsx +300 -0
  363. package/test/cartesian/ZAxis.typed.spec.tsx +33 -0
  364. package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +5 -0
  365. package/test/cartesian/axisLineAndStroke.spec.tsx +72 -0
  366. package/test/cartesian/getCartesianPosition.spec.ts +907 -0
  367. package/test/cartesian/getEquidistantTicks.spec.ts +88 -0
  368. package/test/cartesian/getTicks.spec.ts +378 -0
  369. package/test/cartesian/miscFeatureGaps.spec.tsx +89 -0
  370. package/test/cartesian/useAnimatedLineLength.spec.ts +168 -0
  371. package/test/chart/AccessibilityLayer.spec.tsx +569 -0
  372. package/test/chart/AccessibilityScans.spec.tsx +286 -0
  373. package/test/chart/AreaChart.spec.tsx +409 -0
  374. package/test/chart/AreaChart.stacked.spec.tsx +1407 -0
  375. package/test/chart/AreaChart.typed.spec.tsx +39 -0
  376. package/test/chart/BarChart.spec.tsx +3719 -0
  377. package/test/chart/BarChart.typed.spec.tsx +60 -0
  378. package/test/chart/CategoricalChart.spec.tsx +255 -0
  379. package/test/chart/ComposedChart.spec.tsx +199 -0
  380. package/test/chart/ComposedChart.typed.spec.tsx +39 -0
  381. package/test/chart/FunnelChart.spec.tsx +215 -0
  382. package/test/chart/FunnelChart.typed.spec.tsx +39 -0
  383. package/test/chart/LineChart.multiseries.spec.tsx +50 -0
  384. package/test/chart/LineChart.smoke.spec.tsx +50 -0
  385. package/test/chart/LineChart.spec.tsx +930 -0
  386. package/test/chart/LineChart.typed.spec.tsx +39 -0
  387. package/test/chart/NicheChartTooltip.spec.tsx +81 -0
  388. package/test/chart/PieChart.spec.tsx +793 -0
  389. package/test/chart/PieChart.typed.spec.tsx +39 -0
  390. package/test/chart/RadarChart.spec.tsx +530 -0
  391. package/test/chart/RadarChart.typed.spec.tsx +39 -0
  392. package/test/chart/RadialBarChart.5966.spec.tsx +48 -0
  393. package/test/chart/RadialBarChart.spec.tsx +679 -0
  394. package/test/chart/RadialBarChart.typed.spec.tsx +39 -0
  395. package/test/chart/RechartsWrapper.spec.tsx +83 -0
  396. package/test/chart/Sankey.content.spec.tsx +46 -0
  397. package/test/chart/Sankey.spec.tsx +952 -0
  398. package/test/chart/Sankey.typed.spec.tsx +29 -0
  399. package/test/chart/ScatterChart.spec.tsx +2613 -0
  400. package/test/chart/ScatterChart.typed.spec.tsx +39 -0
  401. package/test/chart/SunburstChart.spec.tsx +146 -0
  402. package/test/chart/Treemap.animation.spec.tsx +52 -0
  403. package/test/chart/Treemap.spec.tsx +1003 -0
  404. package/test/chart/Treemap.typed.spec.tsx +26 -0
  405. package/test/chart/chartEvents.spec.tsx +127 -0
  406. package/test/chart/responsive.spec.tsx +620 -0
  407. package/test/component/Cell.render.spec.tsx +155 -0
  408. package/test/component/Cell.spec.tsx +12 -0
  409. package/test/component/Cursor.spec.tsx +186 -0
  410. package/test/component/DefaultTooltipContent.spec.tsx +102 -0
  411. package/test/component/Label.render.spec.tsx +63 -0
  412. package/test/component/Label.spec.tsx +686 -0
  413. package/test/component/Label.typed.spec.tsx +46 -0
  414. package/test/component/LabelList.spec.tsx +188 -0
  415. package/test/component/Legend.itemSorter.spec.tsx +704 -0
  416. package/test/component/Legend.render.spec.tsx +92 -0
  417. package/test/component/Legend.spec.tsx +2213 -0
  418. package/test/component/Legend.typed.spec.tsx +22 -0
  419. package/test/component/ResponsiveContainer.spec.tsx +523 -0
  420. package/test/component/ResponsiveContainerDataTest.spec.tsx +51 -0
  421. package/test/component/Text.spec.tsx +415 -0
  422. package/test/component/Text.typed.spec.tsx +46 -0
  423. package/test/component/Tooltip/ActiveDot.spec.tsx +370 -0
  424. package/test/component/Tooltip/Tooltip.animation.spec.tsx +209 -0
  425. package/test/component/Tooltip/Tooltip.content.spec.tsx +128 -0
  426. package/test/component/Tooltip/Tooltip.formatter.spec.tsx +152 -0
  427. package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +79 -0
  428. package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +165 -0
  429. package/test/component/Tooltip/Tooltip.offset.spec.tsx +113 -0
  430. package/test/component/Tooltip/Tooltip.state.spec.tsx +74 -0
  431. package/test/component/Tooltip/Tooltip.sync.spec.tsx +639 -0
  432. package/test/component/Tooltip/defaultIndex.spec.tsx +227 -0
  433. package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +138 -0
  434. package/test/component/Tooltip/itemSorter.spec.tsx +2815 -0
  435. package/test/component/Tooltip/tooltipEventType.spec.tsx +344 -0
  436. package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +41 -0
  437. package/test/component/Tooltip/tooltipTestHelpers.tsx +162 -0
  438. package/test/component/Tooltip.defaultIndex.spec.tsx +48 -0
  439. package/test/component/Tooltip.hover.spec.tsx +61 -0
  440. package/test/component/Tooltip.item.spec.tsx +54 -0
  441. package/test/component/Tooltip.keyboard.spec.tsx +51 -0
  442. package/test/component/Tooltip.payload.spec.tsx +1716 -0
  443. package/test/component/Tooltip.touch.spec.tsx +39 -0
  444. package/test/component/Tooltip.visibility.spec.tsx +1889 -0
  445. package/test/component/TooltipBoundingBox.spec.tsx +89 -0
  446. package/test/component/responsiveContainerUtils.spec.ts +205 -0
  447. package/test/container/ClipPath.spec.tsx +602 -0
  448. package/test/container/chartDimensions.spec.tsx +368 -0
  449. package/test/context/chartLayoutContext.spec.tsx +378 -0
  450. package/test/helper/ExpectAxisDomain.tsx +27 -0
  451. package/test/helper/assertNotNull.ts +6 -0
  452. package/test/helper/assertZIndexLayerOrder.ts +19 -0
  453. package/test/helper/createSelectorTestCase.tsx +176 -0
  454. package/test/helper/expectAnimatedPieAngles.ts +100 -0
  455. package/test/helper/expectAnimatedPiePaths.ts +78 -0
  456. package/test/helper/expectAreaCurve.ts +15 -0
  457. package/test/helper/expectAxisTicks.ts +48 -0
  458. package/test/helper/expectBars.ts +54 -0
  459. package/test/helper/expectFunctionReturning.ts +58 -0
  460. package/test/helper/expectLabel.ts +32 -0
  461. package/test/helper/expectLastCalledWith.ts +48 -0
  462. package/test/helper/expectLine.ts +20 -0
  463. package/test/helper/expectPieSectors.ts +80 -0
  464. package/test/helper/expectScale.ts +37 -0
  465. package/test/helper/expectScatterPoints.ts +52 -0
  466. package/test/helper/expectStackGroups.ts +144 -0
  467. package/test/helper/mockAxes.ts +22 -0
  468. package/test/helper/mockGetBoundingClientRect.ts +66 -0
  469. package/test/helper/mockHTMLElementProperty.ts +19 -0
  470. package/test/helper/mockTouchingElement.ts +27 -0
  471. package/test/helper/offsetHelpers.ts +19 -0
  472. package/test/helper/parameterizedTestCases.tsx +99 -0
  473. package/test/helper/produceState.ts +32 -0
  474. package/test/helper/render.ts +7 -0
  475. package/test/helper/selectorTestHelpers.tsx +63 -0
  476. package/test/helper/trim.spec.ts +35 -0
  477. package/test/helper/trim.ts +11 -0
  478. package/test/hooks/useActiveTooltipDataPoints.spec.tsx +358 -0
  479. package/test/hooks/useAxisDomain.spec.tsx +361 -0
  480. package/test/hooks/useAxisScale.spec.tsx +283 -0
  481. package/test/hooks/useAxisTicks.spec.tsx +130 -0
  482. package/test/hooks/useOffset.spec.tsx +248 -0
  483. package/test/hooks/useTooltipStateHooks.spec.tsx +109 -0
  484. package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +135 -0
  485. package/test/polar/Pie/Pie.spec.tsx +784 -0
  486. package/test/polar/Pie/Pie.typed.spec.tsx +78 -0
  487. package/test/polar/Pie.animation.spec.tsx +529 -0
  488. package/test/polar/PieWithLegend.animation.spec.tsx +142 -0
  489. package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +76 -0
  490. package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +2079 -0
  491. package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +102 -0
  492. package/test/polar/PolarAngleAxis.render.spec.tsx +79 -0
  493. package/test/polar/PolarGrid.render.spec.tsx +75 -0
  494. package/test/polar/PolarGrid.spec.tsx +918 -0
  495. package/test/polar/PolarLegendPerRow.render.spec.tsx +85 -0
  496. package/test/polar/PolarRadiusAxis.events.spec.tsx +65 -0
  497. package/test/polar/PolarRadiusAxis.render.spec.tsx +52 -0
  498. package/test/polar/PolarRadiusAxis.spec.tsx +991 -0
  499. package/test/polar/PolarRadiusAxis.typed.spec.tsx +84 -0
  500. package/test/polar/PolarTooltipLegend.render.spec.tsx +80 -0
  501. package/test/polar/Radar.animation.spec.tsx +570 -0
  502. package/test/polar/Radar.render.spec.tsx +71 -0
  503. package/test/polar/Radar.spec.tsx +265 -0
  504. package/test/polar/Radar.typed.spec.tsx +119 -0
  505. package/test/polar/RadialBar/RadialBar.spec.tsx +1521 -0
  506. package/test/polar/RadialBar/RadialBar.typed.spec.tsx +132 -0
  507. package/test/polar/RadialBar.animation.spec.tsx +375 -0
  508. package/test/polar/RadialBar.render.spec.tsx +66 -0
  509. package/test/polar/RadialBar.stacked.spec.tsx +57 -0
  510. package/test/setup.ts +84 -0
  511. package/test/shape/ActiveShape.spec.tsx +181 -0
  512. package/test/shape/Cross.spec.tsx +60 -0
  513. package/test/shape/Cross.typed.spec.tsx +26 -0
  514. package/test/shape/Curve.spec.tsx +368 -0
  515. package/test/shape/Curve.typed.spec.tsx +69 -0
  516. package/test/shape/Dot.spec.tsx +73 -0
  517. package/test/shape/Dot.typed.spec.tsx +30 -0
  518. package/test/shape/Polygon.spec.tsx +357 -0
  519. package/test/shape/Polygon.typed.spec.tsx +28 -0
  520. package/test/shape/Rectangle.animation.spec.tsx +451 -0
  521. package/test/shape/Rectangle.spec.tsx +68 -0
  522. package/test/shape/Rectangle.typed.spec.tsx +24 -0
  523. package/test/shape/Sector.spec.tsx +76 -0
  524. package/test/shape/Sector.typed.spec.tsx +24 -0
  525. package/test/shape/Symbols.spec.tsx +43 -0
  526. package/test/shape/Symbols.typed.spec.tsx +24 -0
  527. package/test/shape/Trapezoid.spec.tsx +50 -0
  528. package/test/shape/Trapezoid.typed.spec.tsx +24 -0
  529. package/test/shape/__snapshots__/Cross.spec.tsx.snap +62 -0
  530. package/test/shape/__snapshots__/Curve.spec.tsx.snap +460 -0
  531. package/test/shape/__snapshots__/Polygon.spec.tsx.snap +58 -0
  532. package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +117 -0
  533. package/test/shape/__snapshots__/Sector.spec.tsx.snap +71 -0
  534. package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +64 -0
  535. package/test/state/chartDataSlice.spec.ts +53 -0
  536. package/test/state/externalEventsMiddleware.spec.ts +178 -0
  537. package/test/state/graphicalItemsSlice.spec.ts +92 -0
  538. package/test/state/hooks.spec.tsx +68 -0
  539. package/test/state/legendSlice.spec.ts +44 -0
  540. package/test/state/mouseEventsMiddleware.spec.ts +75 -0
  541. package/test/state/optionsSlice.spec.ts +19 -0
  542. package/test/state/reduxDevtoolsJsonStringifyReplacer.spec.ts +25 -0
  543. package/test/state/referenceElementsSlice.spec.ts +84 -0
  544. package/test/state/selectors/areaSelectors.spec.tsx +77 -0
  545. package/test/state/selectors/axisSelectors.spec.tsx +1418 -0
  546. package/test/state/selectors/barStackSelectors.spec.tsx +752 -0
  547. package/test/state/selectors/brushSelectors.spec.tsx +30 -0
  548. package/test/state/selectors/cartesianAxisSlice.spec.ts +96 -0
  549. package/test/state/selectors/combineNiceTicks.spec.ts +207 -0
  550. package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +61 -0
  551. package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +39 -0
  552. package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +56 -0
  553. package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +123 -0
  554. package/test/state/selectors/combiners/combineRealScaleType.spec.ts +80 -0
  555. package/test/state/selectors/containerSelectors.spec.tsx +168 -0
  556. package/test/state/selectors/dataSelectors.spec.tsx +136 -0
  557. package/test/state/selectors/legendSelectors.spec.tsx +113 -0
  558. package/test/state/selectors/lineSelectors.spec.tsx +60 -0
  559. package/test/state/selectors/pieSelectors.spec.tsx +72 -0
  560. package/test/state/selectors/radarSelectors.spec.tsx +496 -0
  561. package/test/state/selectors/rootPropsSelectors.spec.tsx +169 -0
  562. package/test/state/selectors/scatterSelectors.spec.tsx +47 -0
  563. package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +234 -0
  564. package/test/state/selectors/selectAllAxes.spec.tsx +18 -0
  565. package/test/state/selectors/selectAxisDomain.spec.tsx +21 -0
  566. package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +19 -0
  567. package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +22 -0
  568. package/test/state/selectors/selectAxisScale.spec.tsx +91 -0
  569. package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +503 -0
  570. package/test/state/selectors/selectBaseAxis.spec.tsx +56 -0
  571. package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +57 -0
  572. package/test/state/selectors/selectChartOffset.spec.tsx +26 -0
  573. package/test/state/selectors/selectDisplayedData.spec.tsx +282 -0
  574. package/test/state/selectors/selectIsTooltipActive.spec.tsx +231 -0
  575. package/test/state/selectors/selectNumericalDomain.spec.tsx +21 -0
  576. package/test/state/selectors/selectRealScaleType.spec.tsx +19 -0
  577. package/test/state/selectors/selectStackGroups.spec.tsx +322 -0
  578. package/test/state/selectors/selectXAxisPosition.spec.tsx +22 -0
  579. package/test/state/selectors/selectYAxisPosition.spec.tsx +22 -0
  580. package/test/state/selectors/selectors.spec.tsx +1613 -0
  581. package/test/state/throttling.spec.ts +200 -0
  582. package/test/state/zIndexSlice.spec.ts +85 -0
  583. package/test/synchronisation/useChartSynchronisation.spec.tsx +225 -0
  584. package/test/util/BarUtils.spec.ts +39 -0
  585. package/test/util/CartesianUtils/CartesianUtils.spec.ts +261 -0
  586. package/test/util/CartesianUtils/rectWithPoints.spec.ts +48 -0
  587. package/test/util/ChartUtils/ChartUtils.spec.ts +491 -0
  588. package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +136 -0
  589. package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +133 -0
  590. package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +83 -0
  591. package/test/util/ChartUtils/getStackedData.spec.ts +416 -0
  592. package/test/util/ChartUtils/truncateByDomain.spec.ts +70 -0
  593. package/test/util/DataUtils.spec.ts +385 -0
  594. package/test/util/DomUtils.spec.tsx +117 -0
  595. package/test/util/FunnelUtils.spec.tsx +70 -0
  596. package/test/util/Global.spec.ts +11 -0
  597. package/test/util/LRUCache.spec.ts +81 -0
  598. package/test/util/LogUtils.spec.ts +45 -0
  599. package/test/util/PolarUtils.spec.ts +66 -0
  600. package/test/util/ReduceCssCalcPrototype.spec.ts +141 -0
  601. package/test/util/ShallowEqual.spec.ts +102 -0
  602. package/test/util/TickUtils.spec.ts +29 -0
  603. package/test/util/axisPropsAreEqual.spec.ts +93 -0
  604. package/test/util/createChartHelpers.spec.tsx +210 -0
  605. package/test/util/cursor/getCursorPoints.spec.ts +136 -0
  606. package/test/util/cursor/getCursorRectangle.spec.ts +50 -0
  607. package/test/util/cursor/getRadialCursorPoints.spec.ts +36 -0
  608. package/test/util/errorValue.spec.ts +69 -0
  609. package/test/util/getEveryNth.spec.ts +39 -0
  610. package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +51 -0
  611. package/test/util/getRelativeCoordinate.spec.ts +250 -0
  612. package/test/util/getSliced.spec.ts +45 -0
  613. package/test/util/isDomainSpecifiedByUser.spec.ts +207 -0
  614. package/test/util/isWellBehavedNumber.spec.ts +54 -0
  615. package/test/util/payload/getUniqPayload.spec.ts +56 -0
  616. package/test/util/propsAreEqual.spec.ts +75 -0
  617. package/test/util/round.spec.ts +112 -0
  618. package/test/util/scale/arithmetic.spec.ts +61 -0
  619. package/test/util/scale/createCategoricalInverse.spec.ts +84 -0
  620. package/test/util/scale/getNiceTickValues.spec.ts +421 -0
  621. package/test/util/scale/getTickValuesFixedDomain.spec.ts +155 -0
  622. package/test/util/svgPropertiesAndEvents.spec.tsx +206 -0
  623. package/test/util/svgPropertiesNoEvents.spec.tsx +228 -0
  624. package/test/util/tooltip/translate.spec.ts +396 -0
  625. package/test/util/useAnimationId.spec.tsx +59 -0
  626. package/test/util/useElementOffset.spec.tsx +173 -0
  627. package/test/util/usePrefersReducedMotion.spec.ts +54 -0
  628. package/test/util/useUniqueId.spec.ts +99 -0
  629. package/test/utils/diagnostics-allowlist.ts +18 -0
  630. package/test/utils/diagnostics.ts +58 -0
  631. package/test/zIndex/AllZIndexPortals.spec.tsx +83 -0
  632. package/test/zIndex/DefaultZIndexes.spec.ts +80 -0
  633. package/test/zIndex/DynamicZIndex.spec.tsx +102 -0
  634. package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +125 -0
  635. package/test/zIndex/componentZIndex.spec.tsx +255 -0
  636. package/test/zIndex/getZIndexFromUnknown.spec.ts +51 -0
  637. package/test/zIndex/multiChartZIndexIsolation.spec.tsx +90 -0
  638. package/test/zIndex/zIndexSelectors.spec.ts +172 -0
  639. package/tsconfig.json +11 -0
@@ -0,0 +1,72 @@
1
+ // Ported from recharts 3.8.1 src/util/scale/CartesianScaleHelper.ts (commit 7a23854).
2
+ import { BandPosition, RechartsScale } from "./RechartsScale";
3
+ import { CategoricalDomainItem, Coordinate, NullableCoordinate } from "../types";
4
+
5
+ export interface CartesianScaleHelper<
6
+ XDomain extends CategoricalDomainItem = CategoricalDomainItem,
7
+ YDomain extends CategoricalDomainItem = CategoricalDomainItem,
8
+ > {
9
+ map(value: { x: XDomain; y: YDomain }, { position }: { position: BandPosition }): Coordinate;
10
+
11
+ mapWithFallback(
12
+ value: { x?: XDomain | null | undefined; y?: YDomain | null | undefined },
13
+ { position, fallback }: { position?: BandPosition; fallback: "rangeMin" | "rangeMax" },
14
+ ): Coordinate;
15
+
16
+ isInRange({ x, y }: Partial<NullableCoordinate>): boolean;
17
+ }
18
+
19
+ /**
20
+ * Groups X and Y scale functions together and provides helper methods.
21
+ */
22
+ export class CartesianScaleHelperImpl<
23
+ XDomain extends CategoricalDomainItem = CategoricalDomainItem,
24
+ YDomain extends CategoricalDomainItem = CategoricalDomainItem,
25
+ > implements CartesianScaleHelper<XDomain, YDomain> {
26
+ private xAxisScale: RechartsScale<XDomain>;
27
+
28
+ private yAxisScale: RechartsScale<YDomain>;
29
+
30
+ constructor({ x, y }: { x: RechartsScale<XDomain>; y: RechartsScale<YDomain> }) {
31
+ this.xAxisScale = x;
32
+ this.yAxisScale = y;
33
+ }
34
+
35
+ map(value: { x: XDomain; y: YDomain }, { position }: { position: BandPosition }): Coordinate {
36
+ return {
37
+ x: this.xAxisScale.map(value.x, { position }) ?? 0,
38
+ y: this.yAxisScale.map(value.y, { position }) ?? 0,
39
+ };
40
+ }
41
+
42
+ mapWithFallback(
43
+ value: { x?: XDomain | null | undefined; y?: YDomain | null | undefined },
44
+ { position, fallback }: { position?: BandPosition; fallback: "rangeMin" | "rangeMax" },
45
+ ): Coordinate {
46
+ let fallbackY: number, fallbackX: number;
47
+ if (fallback === "rangeMin") {
48
+ fallbackY = this.yAxisScale.rangeMin();
49
+ } else if (fallback === "rangeMax") {
50
+ fallbackY = this.yAxisScale.rangeMax();
51
+ } else {
52
+ fallbackY = 0;
53
+ }
54
+ if (fallback === "rangeMin") {
55
+ fallbackX = this.xAxisScale.rangeMin();
56
+ } else if (fallback === "rangeMax") {
57
+ fallbackX = this.xAxisScale.rangeMax();
58
+ } else {
59
+ fallbackX = 0;
60
+ }
61
+ return {
62
+ x: this.xAxisScale.map(value.x, { position }) ?? fallbackX,
63
+ y: this.yAxisScale.map(value.y, { position }) ?? fallbackY,
64
+ };
65
+ }
66
+
67
+ isInRange({ x, y }: Partial<NullableCoordinate>): boolean {
68
+ const xInRange = x == null || this.xAxisScale.isInRange(x);
69
+ const yInRange = y == null || this.yAxisScale.isInRange(y);
70
+ return xInRange && yInRange;
71
+ }
72
+ }
@@ -0,0 +1,82 @@
1
+ // Ported from recharts 3.8.1 src/util/scale/CustomScaleDefinition.ts (commit 7a23854).
2
+ import { CategoricalDomainItem } from "../types";
3
+
4
+ /**
5
+ * A subset of d3-scale. This is the external representation;
6
+ * This is the type that we expect from `axis.scale` props, if users want to provide custom scales.
7
+ *
8
+ * The actual d3 scales have many more methods, but we don't need them all.
9
+ * Specifically we want to avoid all the setters
10
+ * - immutable API is preferred in Recharts and mutating state will lead to hard-to-debug issues.
11
+ *
12
+ * @see {@link ScaleType} and {@link RechartsScaleType} for string shortcuts that you can use instead of this interface.
13
+ */
14
+ export interface CustomScaleDefinition<
15
+ Domain extends CategoricalDomainItem = CategoricalDomainItem,
16
+ > {
17
+ /**
18
+ * Returns the scale's current domain.
19
+ * The domain could be:
20
+ * - in categorical scales: an array of strings or categories
21
+ * - in continuous scales: tuple of two numbers: [min, max]
22
+ */
23
+ domain(): ReadonlyArray<Domain>;
24
+
25
+ /**
26
+ * Sets the domain of the scale.
27
+ */
28
+ domain(newDomain: ReadonlyArray<Domain>): this;
29
+
30
+ /**
31
+ * Returns the scale's current range.
32
+ */
33
+ range(): ReadonlyArray<number>;
34
+
35
+ /**
36
+ * Sets the range of the scale.
37
+ */
38
+ range(newRange: ReadonlyArray<number>): this;
39
+
40
+ /**
41
+ * Returns an exact copy of this scale. Changes to this scale will not affect the returned scale, and vice versa.
42
+ * We use this method in Recharts to ensure immutability - changes to the scale outside should not affect the internal state,
43
+ * as they won't trigger re-renders in React.
44
+ */
45
+ copy(): CustomScaleDefinition<Domain>;
46
+
47
+ /**
48
+ * Returns width of each band.
49
+ * Most scales are not banded, so this method is optional.
50
+ * Banded scales (like scaleBand from d3-scale) will implement this method.
51
+ */
52
+ bandwidth?: () => number;
53
+ /**
54
+ * Quantitative (continuous) scales provide a ticks method that returns representative values from the scale's domain.
55
+ * Ordinal and band scales do not have this method.
56
+ *
57
+ * An optional count argument requests more or fewer ticks.
58
+ * The number of ticks returned, however, is not necessarily equal to the requested count.
59
+ *
60
+ * @see {@link https://d3js.org/d3-scale/linear#linear_ticks}
61
+ * @see {@link https://observablehq.com/@d3/scale-ticks}
62
+ *
63
+ * @param count number of ticks
64
+ */
65
+ ticks?: (count: number | undefined) => ReadonlyArray<number>;
66
+
67
+ /**
68
+ * Given an arbitrary input, returns the corresponding point derived from the output range if the input is in the scale's domain.
69
+ * If the input is not included in the domain, returns undefined.
70
+ *
71
+ * @param input
72
+ */
73
+ (input: Domain): number | undefined;
74
+
75
+ /**
76
+ * Given a value from the range, returns the corresponding value from the domain.
77
+ *
78
+ * This method is optional, as not all scales provide an inverse mapping.
79
+ * Linear and time scales typically do, while band and ordinal scales may not.
80
+ */
81
+ invert?(value: number): Domain | undefined;
82
+ }
@@ -0,0 +1,131 @@
1
+ // Ported from recharts 3.8.1 src/util/scale/RechartsScale.ts (commit 7a23854).
2
+ import { CustomScaleDefinition } from "./CustomScaleDefinition";
3
+ import { CategoricalDomainItem } from "../types";
4
+
5
+ /**
6
+ * This is internal representation of scale used in Recharts.
7
+ * Users will provide CustomScaleDefinition or a string, which we will parse into RechartsScale.
8
+ * Most importantly, RechartsScale is fully immutable - there are no setters that mutate the scale in place.
9
+ * This is important for React integration - if the scale changes, we want to trigger re-renders.
10
+ * Mutating the scale in place would not trigger re-renders, leading to stale UI.
11
+ */
12
+ export interface RechartsScale<Domain extends CategoricalDomainItem = CategoricalDomainItem> {
13
+ /**
14
+ * Returns the scale's current domain.
15
+ * The domain could be:
16
+ * - in categorical scales: an array of strings or categories
17
+ * - in continuous scales: tuple of two numbers: [min, max]
18
+ */
19
+ domain(): ReadonlyArray<Domain>;
20
+
21
+ /**
22
+ * Returns the scale's current range.
23
+ *
24
+ * This should be a readonly tuple of two numbers: [min, max]
25
+ * and so a better type would be `readonly [number, number]` but again - breaking changes,
26
+ * so let's keep that for 4.0.
27
+ */
28
+ range(): ReadonlyArray<number>;
29
+
30
+ /**
31
+ * Returns the minimum value from the range.
32
+ */
33
+ rangeMin(): number;
34
+
35
+ /**
36
+ * Returns the maximum value from the range.
37
+ */
38
+ rangeMax(): number;
39
+
40
+ /**
41
+ * Returns true if the given value is within the scale's range.
42
+ * @param value
43
+ */
44
+ isInRange(value: number): boolean;
45
+
46
+ /**
47
+ * Returns width of each band.
48
+ * Most scales are not banded, so this method is optional.
49
+ * Banded scales (like scaleBand from d3-scale) will implement this method.
50
+ */
51
+ bandwidth?: () => number;
52
+ /**
53
+ * Quantitative (continuous) scales provide a ticks method that returns representative values from the scale's domain.
54
+ * Ordinal and band scales do not have this method.
55
+ *
56
+ * An optional count argument requests more or fewer ticks.
57
+ * The number of ticks returned, however, is not necessarily equal to the requested count.
58
+ *
59
+ * @see {@link https://d3js.org/d3-scale/linear#linear_ticks}
60
+ * @see {@link https://observablehq.com/@d3/scale-ticks}
61
+ *
62
+ * @param count number of ticks
63
+ */
64
+ ticks?: (count: number | undefined) => ReadonlyArray<number>;
65
+
66
+ /**
67
+ * Given an arbitrary input, returns the corresponding point derived from the output range if the input is in the scale's domain.
68
+ * If the input is not included in the domain, returns undefined.
69
+ */
70
+ map(input: unknown, options?: { position?: BandPosition }): number | undefined;
71
+ }
72
+
73
+ /**
74
+ * Position within a band for banded scales.
75
+ * In scales that are not banded, this parameter is ignored.
76
+ *
77
+ * @inline
78
+ */
79
+ export type BandPosition = "start" | "middle" | "end";
80
+
81
+ export function rechartsScaleFactory<Domain extends CategoricalDomainItem = CategoricalDomainItem>(
82
+ d3Scale: CustomScaleDefinition<Domain>,
83
+ ): RechartsScale<Domain>;
84
+ export function rechartsScaleFactory<Domain extends CategoricalDomainItem = CategoricalDomainItem>(
85
+ d3Scale: CustomScaleDefinition<Domain> | undefined,
86
+ ): RechartsScale<Domain> | undefined;
87
+ export function rechartsScaleFactory<Domain extends CategoricalDomainItem = CategoricalDomainItem>(
88
+ d3Scale: CustomScaleDefinition<Domain> | undefined,
89
+ ): RechartsScale<Domain> | undefined {
90
+ if (d3Scale == null) {
91
+ return undefined;
92
+ }
93
+ const ticksFn = d3Scale.ticks;
94
+ const bandwidthFn = d3Scale.bandwidth;
95
+ const d3Range: ReadonlyArray<number> = d3Scale.range();
96
+ const range: [number, number] = [Math.min(...d3Range), Math.max(...d3Range)];
97
+ return {
98
+ domain: () => d3Scale.domain(),
99
+ range: () => range,
100
+ rangeMin: () => range[0],
101
+ rangeMax: () => range[1],
102
+ isInRange(value: number): boolean {
103
+ const first = range[0];
104
+ const last = range[1];
105
+ return first <= last ? value >= first && value <= last : value >= last && value <= first;
106
+ },
107
+ bandwidth: bandwidthFn ? () => bandwidthFn.call(d3Scale) : undefined,
108
+ ticks: ticksFn ? (count: number | undefined) => ticksFn.call(d3Scale, count) : undefined,
109
+ map: (input: Domain, options?: { position?: BandPosition }) => {
110
+ let baseValue = d3Scale(input);
111
+ if (baseValue == null) {
112
+ return undefined;
113
+ }
114
+ if (d3Scale.bandwidth && options?.position) {
115
+ const bandWidth = d3Scale.bandwidth();
116
+ switch (options.position) {
117
+ case "middle":
118
+ baseValue += bandWidth / 2;
119
+ break;
120
+ case "end":
121
+ baseValue += bandWidth;
122
+ break;
123
+ default:
124
+ // 'start' requires no adjustment
125
+ break;
126
+ }
127
+ }
128
+ return baseValue;
129
+ },
130
+ };
131
+ }
@@ -0,0 +1,83 @@
1
+ // Ported from recharts 3.8.1 src/util/scale/createCategoricalInverse.ts (commit 7a23854).
2
+ //
3
+ // Solid/type deviations from reference (no behavior change):
4
+ // - `bisect` reads indices into `?? 0` locals instead of non-null `!` (our
5
+ // tsconfig enables noUncheckedIndexedAccess; the `?? 0` never fires for the
6
+ // in-bounds accesses the algorithm makes).
7
+ // - `allDataPointsOnAxis` is typed `ReadonlyArray<CategoricalDomainItem>` (the
8
+ // scale's actual input type) rather than `unknown[]`, which lets `scale(d)`
9
+ // typecheck and drops the reference's `@ts-expect-error`.
10
+ import { InverseScaleFunction } from "../../hooks";
11
+ import { CategoricalDomainItem } from "../types";
12
+ import { CustomScaleDefinition } from "./CustomScaleDefinition";
13
+
14
+ /**
15
+ * Binary search to find the index where x would fit in array a.
16
+ * Works for arrays that are sorted both ascending and descending.
17
+ *
18
+ * Unlike d3.bisect, this implementation handles both ascending and descending arrays.
19
+ *
20
+ * @param haystack Sorted array of numbers
21
+ * @param needle Number to find the insertion index for
22
+ * @returns Index where x would fit in array a
23
+ */
24
+ export function bisect(haystack: ReadonlyArray<number>, needle: number): number {
25
+ let lo = 0;
26
+ let hi = haystack.length;
27
+ const first = haystack[0] ?? 0;
28
+ const last = haystack[haystack.length - 1] ?? 0;
29
+ const ascending = first < last;
30
+
31
+ while (lo < hi) {
32
+ const mid = Math.floor((lo + hi) / 2);
33
+ const midVal = haystack[mid] ?? 0;
34
+ if (ascending ? midVal < needle : midVal > needle) {
35
+ lo = mid + 1;
36
+ } else {
37
+ hi = mid;
38
+ }
39
+ }
40
+ return lo;
41
+ }
42
+
43
+ /**
44
+ * Computes an inverse scale function for categorical/ordinal scales.
45
+ * Uses bisect to find the closest domain value for a given pixel coordinate.
46
+ */
47
+ export function createCategoricalInverse(
48
+ scale: CustomScaleDefinition | undefined,
49
+ allDataPointsOnAxis?: ReadonlyArray<CategoricalDomainItem>,
50
+ ): InverseScaleFunction | undefined {
51
+ if (!scale) {
52
+ return undefined;
53
+ }
54
+ const domain = allDataPointsOnAxis ?? scale.domain();
55
+ // Build an array of pixel positions for each domain value.
56
+ const pixelPositions: number[] = domain.map((d) => scale(d) ?? 0);
57
+ const range = scale.range();
58
+
59
+ if (domain.length === 0 || range.length < 2) {
60
+ return undefined;
61
+ }
62
+
63
+ return (pixelValue: number): unknown => {
64
+ // Find the closest domain value using bisect
65
+ const index = bisect(pixelPositions, pixelValue);
66
+
67
+ // Clamp to valid range
68
+ if (index <= 0) {
69
+ return domain[0];
70
+ }
71
+ if (index >= domain.length) {
72
+ return domain[domain.length - 1];
73
+ }
74
+
75
+ // Check which neighbor is closer
76
+ const leftPixel = pixelPositions[index - 1] ?? 0;
77
+ const rightPixel = pixelPositions[index] ?? 0;
78
+ if (Math.abs(pixelValue - leftPixel) <= Math.abs(pixelValue - rightPixel)) {
79
+ return domain[index - 1];
80
+ }
81
+ return domain[index];
82
+ };
83
+ }
@@ -0,0 +1,334 @@
1
+ // Ported from recharts 3.8.1 src/util/scale/getNiceTickValues.ts (commit 7a23854).
2
+ // Pure math — no framework surface — so behavior is byte-identical to recharts.
3
+ /**
4
+ * @fileOverview calculate tick values of scale
5
+ * @author xile611, arcthur
6
+ * @date 2015-09-17
7
+ */
8
+ import Decimal from "./util/DecimalLite";
9
+ import { getDigitCount, rangeStep } from "./util/arithmetic";
10
+ import { NumberDomain } from "../types";
11
+ import { NiceTicksAlgorithm } from "../../state/cartesianAxisSlice";
12
+
13
+ /**
14
+ * Calculate a interval of a minimum value and a maximum value
15
+ *
16
+ * @param {Number} min The minimum value
17
+ * @param {Number} max The maximum value
18
+ * @return {Array} An interval
19
+ */
20
+ export const getValidInterval = ([min, max]: [number, number]): [number, number] => {
21
+ let [validMin, validMax] = [min, max];
22
+
23
+ // exchange
24
+ if (min > max) {
25
+ [validMin, validMax] = [max, min];
26
+ }
27
+
28
+ return [validMin, validMax];
29
+ };
30
+
31
+ /**
32
+ * Calculate the step which is easy to understand between ticks, like 10, 20, 25
33
+ *
34
+ * @param roughStep The rough step calculated by dividing the difference by the tickCount
35
+ * @param allowDecimals Allow the ticks to be decimals or not
36
+ * @param correctionFactor A correction factor
37
+ * @return The step which is easy to understand between two ticks
38
+ */
39
+ export const getAdaptiveStep = (
40
+ roughStep: Decimal,
41
+ allowDecimals: boolean,
42
+ correctionFactor: number,
43
+ ) => {
44
+ if (roughStep.lte(0)) {
45
+ return new Decimal(0);
46
+ }
47
+
48
+ const digitCount = getDigitCount(roughStep.toNumber());
49
+ // The ratio between the rough step and the smallest number which has a bigger
50
+ // order of magnitudes than the rough step
51
+ const digitCountValue = new Decimal(10).pow(digitCount);
52
+ const stepRatio = roughStep.div(digitCountValue);
53
+ // When an integer and a float multiplied, the accuracy of result may be wrong
54
+ const stepRatioScale = digitCount !== 1 ? 0.05 : 0.1;
55
+ const amendStepRatio = new Decimal(Math.ceil(stepRatio.div(stepRatioScale).toNumber()))
56
+ .add(correctionFactor)
57
+ .mul(stepRatioScale);
58
+
59
+ const formatStep = amendStepRatio.mul(digitCountValue);
60
+
61
+ return allowDecimals
62
+ ? new Decimal(formatStep.toNumber())
63
+ : new Decimal(Math.ceil(formatStep.toNumber()));
64
+ };
65
+
66
+ type StepFunction = (
67
+ roughStep: Decimal,
68
+ allowDecimals: boolean,
69
+ correctionFactor: number,
70
+ ) => Decimal;
71
+
72
+ /**
73
+ * The snap125 step algorithm snaps to nice numbers (1, 2, 2.5, 5) at each
74
+ * order of magnitude, producing human-friendly tick intervals like
75
+ * 0, 5, 10, 15, 20 instead of 0, 4, 8, 12, 16.
76
+ *
77
+ * This is opt-in and can be enabled via the `niceTicks` prop on axis components.
78
+ *
79
+ * @param roughStep The rough step calculated by dividing the difference by the tickCount
80
+ * @param allowDecimals Allow the ticks to be decimals or not
81
+ * @param correctionFactor A correction factor
82
+ * @return The step which is easy to understand between two ticks
83
+ */
84
+ export const getSnap125Step: StepFunction = (
85
+ roughStep: Decimal,
86
+ allowDecimals: boolean,
87
+ correctionFactor: number,
88
+ ) => {
89
+ if (roughStep.lte(0)) {
90
+ return new Decimal(0);
91
+ }
92
+
93
+ const NICE_STEPS = [1, 2, 2.5, 5];
94
+
95
+ const roughNum = roughStep.toNumber();
96
+ const exponent = Math.floor(new Decimal(roughNum).abs().log(10).toNumber());
97
+ let magnitude = new Decimal(10).pow(exponent);
98
+
99
+ // normalized is in the range [1, 10)
100
+ const normalized = roughStep.div(magnitude).toNumber();
101
+
102
+ // Find the smallest nice step >= normalized (ceiling)
103
+ let niceIdx = NICE_STEPS.findIndex((s) => s >= normalized - 1e-10);
104
+ if (niceIdx === -1) {
105
+ // normalized > 5 (e.g. 7.3), move to next order of magnitude
106
+ magnitude = magnitude.mul(10);
107
+ niceIdx = 0;
108
+ }
109
+
110
+ // Apply correction factor by stepping through the nice number sequence
111
+ niceIdx += correctionFactor;
112
+ if (niceIdx >= NICE_STEPS.length) {
113
+ const extraMag = Math.floor(niceIdx / NICE_STEPS.length);
114
+ niceIdx %= NICE_STEPS.length;
115
+ magnitude = magnitude.mul(new Decimal(10).pow(extraMag));
116
+ }
117
+
118
+ const niceStep = NICE_STEPS[niceIdx] ?? 1;
119
+ const formatStep = new Decimal(niceStep).mul(magnitude);
120
+
121
+ return allowDecimals ? formatStep : new Decimal(Math.ceil(formatStep.toNumber()));
122
+ };
123
+
124
+ /**
125
+ * calculate the ticks when the minimum value equals to the maximum value
126
+ *
127
+ * @param value The minimum value which is also the maximum value
128
+ * @param tickCount The count of ticks
129
+ * @param allowDecimals Allow the ticks to be decimals or not
130
+ * @return array of ticks
131
+ */
132
+ export const getTickOfSingleValue = (
133
+ value: number,
134
+ tickCount: number,
135
+ allowDecimals: boolean,
136
+ ): Array<number> => {
137
+ let step: Decimal = new Decimal(1);
138
+ // calculate the middle value of ticks
139
+ let middle = new Decimal(value);
140
+
141
+ if (!middle.isint() && allowDecimals) {
142
+ const absVal = Math.abs(value);
143
+
144
+ if (absVal < 1) {
145
+ // The step should be a float number when the difference is smaller than 1
146
+ step = new Decimal(10).pow(getDigitCount(value) - 1);
147
+
148
+ middle = new Decimal(Math.floor(middle.div(step).toNumber())).mul(step);
149
+ } else if (absVal > 1) {
150
+ // Return the maximum integer which is smaller than 'value' when 'value' is greater than 1
151
+ middle = new Decimal(Math.floor(value));
152
+ }
153
+ } else if (value === 0) {
154
+ middle = new Decimal(Math.floor((tickCount - 1) / 2));
155
+ } else if (!allowDecimals) {
156
+ middle = new Decimal(Math.floor(value));
157
+ }
158
+
159
+ const middleIndex = Math.floor((tickCount - 1) / 2);
160
+ const ticks: Array<number> = [];
161
+
162
+ for (let i = 0; i < tickCount; i++) {
163
+ ticks.push(middle.add(new Decimal(i - middleIndex).mul(step)).toNumber());
164
+ }
165
+
166
+ return ticks;
167
+ };
168
+
169
+ /**
170
+ * Calculate the step
171
+ *
172
+ * @param min The minimum value of an interval
173
+ * @param max The maximum value of an interval
174
+ * @param tickCount The count of ticks
175
+ * @param allowDecimals Allow the ticks to be decimals or not
176
+ * @param correctionFactor A correction factor
177
+ * @return The step, minimum value of ticks, maximum value of ticks
178
+ */
179
+ export const calculateStep = (
180
+ min: number,
181
+ max: number,
182
+ tickCount: number,
183
+ allowDecimals: boolean,
184
+ correctionFactor: number = 0,
185
+ stepFn: StepFunction = getAdaptiveStep,
186
+ ): {
187
+ step: Decimal;
188
+ tickMin: Decimal;
189
+ tickMax: Decimal;
190
+ } => {
191
+ // dirty hack (for recharts' test)
192
+ if (!Number.isFinite((max - min) / (tickCount - 1))) {
193
+ return {
194
+ step: new Decimal(0),
195
+ tickMin: new Decimal(0),
196
+ tickMax: new Decimal(0),
197
+ };
198
+ }
199
+
200
+ // The step which is easy to understand between two ticks
201
+ const step = stepFn(
202
+ new Decimal(max).sub(min).div(tickCount - 1),
203
+ allowDecimals,
204
+ correctionFactor,
205
+ );
206
+
207
+ // A medial value of ticks
208
+ let middle;
209
+
210
+ // When 0 is inside the interval, 0 should be a tick
211
+ if (min <= 0 && max >= 0) {
212
+ middle = new Decimal(0);
213
+ } else {
214
+ // calculate the middle value
215
+ middle = new Decimal(min).add(max).div(2);
216
+ // minus modulo value
217
+ middle = middle.sub(new Decimal(middle).mod(step));
218
+ }
219
+
220
+ let belowCount = Math.ceil(middle.sub(min).div(step).toNumber());
221
+ let upCount = Math.ceil(new Decimal(max).sub(middle).div(step).toNumber());
222
+ const scaleCount = belowCount + upCount + 1;
223
+
224
+ if (scaleCount > tickCount) {
225
+ // When more ticks need to cover the interval, step should be bigger.
226
+ return calculateStep(min, max, tickCount, allowDecimals, correctionFactor + 1, stepFn);
227
+ }
228
+ if (scaleCount < tickCount) {
229
+ // When less ticks can cover the interval, we should add some additional ticks
230
+ upCount = max > 0 ? upCount + (tickCount - scaleCount) : upCount;
231
+ belowCount = max > 0 ? belowCount : belowCount + (tickCount - scaleCount);
232
+ }
233
+
234
+ return {
235
+ step,
236
+ tickMin: middle.sub(new Decimal(belowCount).mul(step)),
237
+ tickMax: middle.add(new Decimal(upCount).mul(step)),
238
+ };
239
+ };
240
+
241
+ /**
242
+ * Calculate the ticks of an interval. Ticks can appear outside the interval
243
+ * if it makes them more rounded and nice.
244
+ *
245
+ * @param tuple of [min,max] min: The minimum value, max: The maximum value
246
+ * @param tickCount The count of ticks
247
+ * @param allowDecimals Allow the ticks to be decimals or not
248
+ * @param niceTicksMode The algorithm to use for calculating nice ticks.
249
+ * @return array of ticks
250
+ */
251
+ export const getNiceTickValues = (
252
+ [min, max]: NumberDomain,
253
+ tickCount = 6,
254
+ allowDecimals = true,
255
+ niceTicksMode: NiceTicksAlgorithm = "auto",
256
+ ): number[] => {
257
+ // More than two ticks should be return
258
+ const count = Math.max(tickCount, 2);
259
+ const [cormin, cormax] = getValidInterval([min, max]);
260
+
261
+ if (cormin === -Infinity || cormax === Infinity) {
262
+ const values: Array<number> =
263
+ cormax === Infinity
264
+ ? [cormin, ...Array<number>(tickCount - 1).fill(Infinity)]
265
+ : [...Array<number>(tickCount - 1).fill(-Infinity), cormax];
266
+
267
+ return min > max ? values.reverse() : values;
268
+ }
269
+
270
+ if (cormin === cormax) {
271
+ return getTickOfSingleValue(cormin, tickCount, allowDecimals);
272
+ }
273
+
274
+ const stepFn = niceTicksMode === "snap125" ? getSnap125Step : getAdaptiveStep;
275
+
276
+ // Get the step between two ticks
277
+ const { step, tickMin, tickMax } = calculateStep(cormin, cormax, count, allowDecimals, 0, stepFn);
278
+
279
+ const values = rangeStep(tickMin, tickMax.add(new Decimal(0.1).mul(step)), step);
280
+
281
+ return min > max ? values.reverse() : values;
282
+ };
283
+
284
+ /**
285
+ * Calculate the ticks of an interval.
286
+ * Ticks will be constrained to the interval [min, max] even if it makes them less rounded and nice.
287
+ *
288
+ * @param tuple of [min,max] min: The minimum value, max: The maximum value
289
+ * @param tickCount The count of ticks. This function may return less than tickCount ticks if the interval is too small.
290
+ * @param allowDecimals Allow the ticks to be decimals or not
291
+ * @param niceTicksMode The algorithm to use for calculating nice ticks. See {@link NiceTicksAlgorithm}.
292
+ * @return array of ticks
293
+ */
294
+ export const getTickValuesFixedDomain = (
295
+ [min, max]: NumberDomain,
296
+ tickCount: number,
297
+ allowDecimals = true,
298
+ niceTicksMode: NiceTicksAlgorithm = "auto",
299
+ ) => {
300
+ // More than two ticks should be return
301
+ const [cormin, cormax] = getValidInterval([min, max]);
302
+
303
+ if (cormin === -Infinity || cormax === Infinity) {
304
+ return [min, max];
305
+ }
306
+
307
+ if (cormin === cormax) {
308
+ return [cormin];
309
+ }
310
+
311
+ const stepFn = niceTicksMode === "snap125" ? getSnap125Step : getAdaptiveStep;
312
+ const count = Math.max(tickCount, 2);
313
+ const step = stepFn(new Decimal(cormax).sub(cormin).div(count - 1), allowDecimals, 0);
314
+ let values = [...rangeStep(new Decimal(cormin), new Decimal(cormax), step), cormax];
315
+
316
+ if (allowDecimals === false) {
317
+ /*
318
+ * allowDecimals is false means that we want to have integer ticks.
319
+ * The step is guaranteed to be an integer in the code above which is great start
320
+ * but when the first step is not an integer, it will start stepping from a decimal value anyway.
321
+ * So we need to round all the values to integers after the fact.
322
+ * The domain boundary (cormax) is appended after the rangeStep values. When
323
+ * cormax rounds down to the same integer as the last rangeStep value, we end up
324
+ * with a duplicate trailing tick. Remove it.
325
+ */
326
+ values = values.map((value) => Math.round(value));
327
+ const last = values.length - 1;
328
+ if (last > 0 && values[last] === values[last - 1]) {
329
+ values = values.slice(0, last);
330
+ }
331
+ }
332
+
333
+ return min > max ? values.reverse() : values;
334
+ };