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,35 @@
1
+ // Ported from recharts 3.8.1 src/util/RadialBarUtils.tsx (commit 7a23854).
2
+ // Renders a RadialBar sector through the <Shape> abstraction (default = Sector).
3
+ import { omit } from "solid-js";
4
+ import type { JSX } from "@solidjs/web";
5
+ import { RadialBarDataItem, RadialBarProps } from "../polar/RadialBar";
6
+ import { Sector } from "../shape/Sector";
7
+ import { Shape } from "./ActiveShapeUtils";
8
+
9
+ export const defaultRadialBarShape = Sector;
10
+
11
+ export function parseCornerRadius(cornerRadius: string | number | undefined): number | undefined {
12
+ if (typeof cornerRadius === "string") {
13
+ return parseInt(cornerRadius, 10);
14
+ }
15
+ return cornerRadius;
16
+ }
17
+
18
+ export interface RadialBarSectorProps extends RadialBarDataItem {
19
+ index: number;
20
+ isActive: boolean;
21
+ }
22
+
23
+ type RadialBarSectorComponentProps = RadialBarSectorProps & {
24
+ option: Exclude<RadialBarProps["shape"], undefined> | RadialBarProps["activeShape"];
25
+ };
26
+
27
+ export function RadialBarSector(props: RadialBarSectorComponentProps): JSX.Element {
28
+ return (
29
+ <Shape<RadialBarSectorProps, SVGPathElement>
30
+ option={props.option}
31
+ DefaultShape={defaultRadialBarShape}
32
+ shapeProps={omit(props, "option")}
33
+ />
34
+ );
35
+ }
@@ -0,0 +1,186 @@
1
+ // Ported from recharts 3.8.1 src/util/ReduceCSSCalc.ts (commit 7a23854).
2
+ // Pure CSS-calc parser — no framework surface — so behavior is byte-identical to recharts.
3
+
4
+ import { isNan } from "./DataUtils";
5
+
6
+ const MULTIPLY_OR_DIVIDE_REGEX = /(-?\d+(?:\.\d+)?[a-zA-Z%]*)([*/])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/;
7
+ const ADD_OR_SUBTRACT_REGEX = /(-?\d+(?:\.\d+)?[a-zA-Z%]*)([+-])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/;
8
+ const CSS_LENGTH_UNIT_REGEX = /^(px|cm|vh|vw|em|rem|%|mm|in|pt|pc|ex|ch|vmin|vmax|Q)$/;
9
+ const NUM_SPLIT_REGEX = /(-?\d+(?:\.\d+)?)([a-zA-Z%]+)?/;
10
+
11
+ type SupportedUnits = "cm" | "mm" | "pt" | "pc" | "in" | "Q" | "px";
12
+
13
+ const CONVERSION_RATES: Record<SupportedUnits, number> = {
14
+ cm: 96 / 2.54,
15
+ mm: 96 / 25.4,
16
+ pt: 96 / 72,
17
+ pc: 96 / 6,
18
+ in: 96,
19
+ Q: 96 / (2.54 * 40),
20
+ px: 1,
21
+ };
22
+
23
+ const FIXED_CSS_LENGTH_UNITS: ReadonlyArray<SupportedUnits> = [
24
+ "cm",
25
+ "mm",
26
+ "pt",
27
+ "pc",
28
+ "in",
29
+ "Q",
30
+ "px",
31
+ ];
32
+
33
+ function isSupportedUnit(unit: string): unit is SupportedUnits {
34
+ return FIXED_CSS_LENGTH_UNITS.some((supported) => supported === unit);
35
+ }
36
+
37
+ const STR_NAN = "NaN";
38
+
39
+ function convertToPx(value: number, unit: SupportedUnits): number {
40
+ return value * CONVERSION_RATES[unit];
41
+ }
42
+
43
+ class DecimalCSS {
44
+ static parse(str: string) {
45
+ const [, numStr, unit] = NUM_SPLIT_REGEX.exec(str) ?? [];
46
+
47
+ if (numStr == null) {
48
+ return DecimalCSS.NaN;
49
+ }
50
+
51
+ return new DecimalCSS(parseFloat(numStr), unit ?? "");
52
+ }
53
+
54
+ static NaN = new DecimalCSS(NaN, "");
55
+
56
+ constructor(
57
+ public num: number,
58
+ public unit: string,
59
+ ) {
60
+ // `num`/`unit` are parameter properties (auto-assigned); no explicit assignment needed.
61
+ if (isNan(num)) {
62
+ this.unit = "";
63
+ }
64
+
65
+ if (unit !== "" && !CSS_LENGTH_UNIT_REGEX.test(unit)) {
66
+ this.num = NaN;
67
+ this.unit = "";
68
+ }
69
+
70
+ if (isSupportedUnit(unit)) {
71
+ this.num = convertToPx(num, unit);
72
+ this.unit = "px";
73
+ }
74
+ }
75
+
76
+ add(other: DecimalCSS) {
77
+ if (this.unit !== other.unit) {
78
+ return new DecimalCSS(NaN, "");
79
+ }
80
+
81
+ return new DecimalCSS(this.num + other.num, this.unit);
82
+ }
83
+
84
+ subtract(other: DecimalCSS) {
85
+ if (this.unit !== other.unit) {
86
+ return new DecimalCSS(NaN, "");
87
+ }
88
+
89
+ return new DecimalCSS(this.num - other.num, this.unit);
90
+ }
91
+
92
+ multiply(other: DecimalCSS) {
93
+ if (this.unit !== "" && other.unit !== "" && this.unit !== other.unit) {
94
+ return new DecimalCSS(NaN, "");
95
+ }
96
+
97
+ return new DecimalCSS(this.num * other.num, this.unit || other.unit);
98
+ }
99
+
100
+ divide(other: DecimalCSS) {
101
+ if (this.unit !== "" && other.unit !== "" && this.unit !== other.unit) {
102
+ return new DecimalCSS(NaN, "");
103
+ }
104
+
105
+ return new DecimalCSS(this.num / other.num, this.unit || other.unit);
106
+ }
107
+
108
+ toString() {
109
+ return `${this.num}${this.unit}`;
110
+ }
111
+
112
+ isNaN() {
113
+ return isNan(this.num);
114
+ }
115
+ }
116
+
117
+ function calculateArithmetic(expr: string | undefined): string {
118
+ if (expr == null || expr.includes(STR_NAN)) {
119
+ return STR_NAN;
120
+ }
121
+
122
+ let newExpr = expr;
123
+ while (newExpr.includes("*") || newExpr.includes("/")) {
124
+ const [, leftOperand, operator, rightOperand] = MULTIPLY_OR_DIVIDE_REGEX.exec(newExpr) ?? [];
125
+ const lTs = DecimalCSS.parse(leftOperand ?? "");
126
+ const rTs = DecimalCSS.parse(rightOperand ?? "");
127
+ const result = operator === "*" ? lTs.multiply(rTs) : lTs.divide(rTs);
128
+ if (result.isNaN()) {
129
+ return STR_NAN;
130
+ }
131
+ newExpr = newExpr.replace(MULTIPLY_OR_DIVIDE_REGEX, result.toString());
132
+ }
133
+
134
+ while (newExpr.includes("+") || /.-\d+(?:\.\d+)?/.test(newExpr)) {
135
+ const [, leftOperand, operator, rightOperand] = ADD_OR_SUBTRACT_REGEX.exec(newExpr) ?? [];
136
+ const lTs = DecimalCSS.parse(leftOperand ?? "");
137
+ const rTs = DecimalCSS.parse(rightOperand ?? "");
138
+ const result = operator === "+" ? lTs.add(rTs) : lTs.subtract(rTs);
139
+ if (result.isNaN()) {
140
+ return STR_NAN;
141
+ }
142
+ newExpr = newExpr.replace(ADD_OR_SUBTRACT_REGEX, result.toString());
143
+ }
144
+
145
+ return newExpr;
146
+ }
147
+
148
+ const PARENTHESES_REGEX = /\(([^()]*)\)/;
149
+
150
+ function calculateParentheses(expr: string): string {
151
+ let newExpr = expr;
152
+ let match: ReturnType<typeof RegExp.prototype.exec> | null;
153
+ // eslint-disable-next-line no-cond-assign
154
+ while ((match = PARENTHESES_REGEX.exec(newExpr)) != null) {
155
+ const [, parentheticalExpression] = match;
156
+ newExpr = newExpr.replace(PARENTHESES_REGEX, calculateArithmetic(parentheticalExpression));
157
+ }
158
+
159
+ return newExpr;
160
+ }
161
+
162
+ function evaluateExpression(expression: string): string {
163
+ let newExpr = expression.replace(/\s+/g, "");
164
+ newExpr = calculateParentheses(newExpr);
165
+ newExpr = calculateArithmetic(newExpr);
166
+
167
+ return newExpr;
168
+ }
169
+
170
+ export function safeEvaluateExpression(expression: string): string {
171
+ try {
172
+ return evaluateExpression(expression);
173
+ } catch {
174
+ return STR_NAN;
175
+ }
176
+ }
177
+
178
+ export function reduceCSSCalc(expression: string): string {
179
+ const result = safeEvaluateExpression(expression.slice(5, -1));
180
+
181
+ if (result === STR_NAN) {
182
+ return "";
183
+ }
184
+
185
+ return result;
186
+ }
@@ -0,0 +1,43 @@
1
+ // Reimplements react-redux's `shallowEqual` (react-redux/src/utils/shallowEqual.ts).
2
+ // The reference test imports `shallowEqual` from 'react-redux'; this project has no
3
+ // react-redux, so we provide a local equivalent: Object.is reference/NaN handling,
4
+ // then own-enumerable-key comparison in both directions with Object.is per key.
5
+
6
+ function is(x: unknown, y: unknown): boolean {
7
+ if (x === y) {
8
+ return x !== 0 || y !== 0 || 1 / x === 1 / y;
9
+ }
10
+ return x !== x && y !== y;
11
+ }
12
+
13
+ export function shallowEqual(objA: unknown, objB: unknown): boolean {
14
+ if (is(objA, objB)) {
15
+ return true;
16
+ }
17
+
18
+ if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) {
19
+ return false;
20
+ }
21
+
22
+ const keysA = Object.keys(objA);
23
+ const keysB = Object.keys(objB);
24
+
25
+ if (keysA.length !== keysB.length) {
26
+ return false;
27
+ }
28
+
29
+ for (let i = 0; i < keysA.length; i++) {
30
+ const key = keysA[i];
31
+ if (key === undefined) {
32
+ continue;
33
+ }
34
+ if (
35
+ !Object.prototype.hasOwnProperty.call(objB, key) ||
36
+ !is(Reflect.get(objA, key), Reflect.get(objB, key))
37
+ ) {
38
+ return false;
39
+ }
40
+ }
41
+
42
+ return true;
43
+ }
@@ -0,0 +1,61 @@
1
+ // Ported from recharts 3.8.1 src/util/TickUtils.ts.
2
+ // Pure geometry — no framework surface — so behavior is byte-identical to recharts.
3
+ import { getAngledRectangleWidth } from "./CartesianUtils";
4
+ import { getEveryNth } from "./getEveryNth";
5
+ import { Size, CartesianTickItem, CartesianViewBoxRequired } from "./types";
6
+
7
+ export function getAngledTickWidth(contentSize: Size, unitSize: Size, angle: number | undefined) {
8
+ const size = {
9
+ width: contentSize.width + unitSize.width,
10
+ height: contentSize.height + unitSize.height,
11
+ };
12
+
13
+ return getAngledRectangleWidth(size, angle);
14
+ }
15
+
16
+ export function getTickBoundaries(
17
+ viewBox: CartesianViewBoxRequired,
18
+ sign: number,
19
+ sizeKey: string,
20
+ ) {
21
+ const isWidth = sizeKey === "width";
22
+ const { x, y, width, height } = viewBox;
23
+ if (sign === 1) {
24
+ return {
25
+ start: isWidth ? x : y,
26
+ end: isWidth ? x + width : y + height,
27
+ };
28
+ }
29
+ return {
30
+ start: isWidth ? x + width : y + height,
31
+ end: isWidth ? x : y,
32
+ };
33
+ }
34
+
35
+ export function isVisible(
36
+ sign: number,
37
+ tickPosition: number,
38
+ getSize: () => number,
39
+ start: number,
40
+ end: number,
41
+ ): boolean {
42
+ /* Since getSize() is expensive (it reads the ticks' size from the DOM), we do this check first to avoid calculating
43
+ * the tick's size. */
44
+ if (sign * tickPosition < sign * start || sign * tickPosition > sign * end) {
45
+ return false;
46
+ }
47
+
48
+ const size = getSize();
49
+
50
+ return (
51
+ sign * (tickPosition - (sign * size) / 2 - start) >= 0 &&
52
+ sign * (tickPosition + (sign * size) / 2 - end) <= 0
53
+ );
54
+ }
55
+
56
+ export function getNumberIntervalTicks(
57
+ ticks: ReadonlyArray<CartesianTickItem>,
58
+ interval: number,
59
+ ): ReadonlyArray<CartesianTickItem> | undefined {
60
+ return getEveryNth(ticks, interval + 1);
61
+ }
@@ -0,0 +1,49 @@
1
+ // Ported from recharts 3.8.1 src/util/YAxisUtils.ts (commit 7a23854).
2
+ type IGetBoundingClient = Pick<Element, "getBoundingClientRect">;
3
+
4
+ /**
5
+ * Calculates the width of the Y-axis based on the tick labels and the axis label.
6
+ * @param params.ticks an array-like of tick elements, each with `getBoundingClientRect`
7
+ * @param params.label the axis label element, with `getBoundingClientRect`
8
+ * @param params.labelGapWithTick gap between the label and the tick (default 5)
9
+ * @param params.tickSize length of the tick line (default 0)
10
+ * @param params.tickMargin margin between the tick line and the tick text (default 0)
11
+ * @returns the calculated width of the Y-axis
12
+ */
13
+ export const getCalculatedYAxisWidth = ({
14
+ ticks,
15
+ label,
16
+ labelGapWithTick = 5,
17
+ tickSize = 0,
18
+ tickMargin = 0,
19
+ }: {
20
+ ticks: ArrayLike<IGetBoundingClient> | null;
21
+ label: IGetBoundingClient | null | undefined;
22
+ labelGapWithTick: number | undefined;
23
+ tickSize: number | undefined;
24
+ tickMargin: number | undefined;
25
+ }): number => {
26
+ let maxTickWidth = 0;
27
+ if (ticks) {
28
+ Array.from(ticks).forEach((tickNode: IGetBoundingClient) => {
29
+ if (tickNode) {
30
+ const bbox = tickNode.getBoundingClientRect();
31
+
32
+ if (bbox.width > maxTickWidth) {
33
+ maxTickWidth = bbox.width;
34
+ }
35
+ }
36
+ });
37
+
38
+ const labelWidth = label ? label.getBoundingClientRect().width : 0;
39
+
40
+ const tickWidth = tickSize + tickMargin;
41
+
42
+ const updatedYAxisWidth =
43
+ maxTickWidth + tickWidth + labelWidth + (label ? labelGapWithTick : 0);
44
+
45
+ return Math.round(updatedYAxisWidth);
46
+ }
47
+
48
+ return 0;
49
+ };
@@ -0,0 +1,69 @@
1
+ // Ported from recharts 3.8.1 src/util/types.ts `adaptEventHandlers` (commit 7a23854).
2
+ //
3
+ // recharts wraps each event handler found on a props object so it is invoked with
4
+ // `(props, event)` — the props object first, then the DOM event. Components like
5
+ // Curve spread `adaptEventHandlers(props)` onto their root element so a user's
6
+ // `<Line onClick={fn} />` ends up calling `fn(curveProps, event)`.
7
+ //
8
+ // DEVIATION from recharts: recharts also accepts a React element (via
9
+ // `isValidElement` + `element.props`). Solid has no element-props introspection
10
+ // (a rendered element is a DOM node, not a `{ props }` structure), so the element
11
+ // branch is deferred — mirroring `svgPropertiesAndEventsFromUnknown`, this accepts
12
+ // `unknown` and guards internally. Non-object inputs (function/boolean/null/array)
13
+ // return `null`, exactly as recharts.
14
+ import { isEventKey } from "./excludeEventProps";
15
+
16
+ type EventHandler = (e: Event) => void;
17
+ type RechartsEventHandler = (props: Record<string, unknown>, e: Event) => void;
18
+
19
+ /** Type guard giving an `unknown` value the recharts `(props, event)` call signature. */
20
+ function isRechartsEventHandler(value: unknown): value is RechartsEventHandler {
21
+ return typeof value === "function";
22
+ }
23
+
24
+ /**
25
+ * Returns a record of the event handlers on `input`, each rewrapped to be called
26
+ * with `(props, event)`. Pass `newHandler` to replace every handler with one
27
+ * uniform callback (recharts uses this for synthetic forwarding). Returns `null`
28
+ * for non-object inputs.
29
+ */
30
+ export function adaptEventHandlers(
31
+ input: unknown,
32
+ newHandler?: (e?: Event) => unknown,
33
+ ): Record<string, EventHandler> | null {
34
+ if (input == null || typeof input !== "object" || Array.isArray(input)) {
35
+ return null;
36
+ }
37
+
38
+ const inputProps: Record<string, unknown> = { ...input };
39
+ const out: Record<string, EventHandler> = {};
40
+
41
+ Object.keys(inputProps).forEach((key) => {
42
+ const value = inputProps[key];
43
+ if (isEventKey(key) && isRechartsEventHandler(value)) {
44
+ out[key] = newHandler ?? ((e: Event) => value(inputProps, e));
45
+ }
46
+ });
47
+
48
+ return out;
49
+ }
50
+
51
+ /**
52
+ * Returns the raw (unwrapped) event handlers on `input`. Used by a parent component
53
+ * to forward a user's event props down to a child (e.g. Line → Curve) where the
54
+ * child's own `adaptEventHandlers` performs the props-first wrapping.
55
+ */
56
+ export function pickEventHandlers(input: unknown): Record<string, unknown> {
57
+ if (input == null || typeof input !== "object" || Array.isArray(input)) {
58
+ return {};
59
+ }
60
+ const inputProps: Record<string, unknown> = { ...input };
61
+ const out: Record<string, unknown> = {};
62
+ Object.keys(inputProps).forEach((key) => {
63
+ const value = inputProps[key];
64
+ if (isEventKey(key) && typeof value === "function") {
65
+ out[key] = value;
66
+ }
67
+ });
68
+ return out;
69
+ }
@@ -0,0 +1,42 @@
1
+ // Ported from recharts 3.8.1 src/util/axisPropsAreEqual.ts (commit 7a23854).
2
+ import { AxisRange } from "../state/selectors/axisSelectors";
3
+ import { AxisDomain } from "./types";
4
+ import { propsAreEqual } from "./propsAreEqual";
5
+
6
+ function shortArraysAreEqual(
7
+ arr1: AxisDomain | AxisRange | undefined,
8
+ arr2: AxisDomain | AxisRange | undefined,
9
+ ): boolean {
10
+ if (arr1 === arr2) {
11
+ return true;
12
+ }
13
+
14
+ if (Array.isArray(arr1) && arr1.length === 2 && Array.isArray(arr2) && arr2.length === 2) {
15
+ return arr1[0] === arr2[0] && arr1[1] === arr2[1];
16
+ }
17
+
18
+ return false;
19
+ }
20
+
21
+ export function axisPropsAreEqual<
22
+ T extends Record<string, unknown> & {
23
+ domain?: AxisDomain;
24
+ range?: AxisRange;
25
+ },
26
+ >(prevProps: T, nextProps: T): boolean {
27
+ if (prevProps === nextProps) {
28
+ return true;
29
+ }
30
+ const { domain: prevDomain, range: prevRange, ...prevRest } = prevProps;
31
+ const { domain: nextDomain, range: nextRange, ...nextRest } = nextProps;
32
+
33
+ if (!shortArraysAreEqual(prevDomain, nextDomain)) {
34
+ return false;
35
+ }
36
+
37
+ if (!shortArraysAreEqual(prevRange, nextRange)) {
38
+ return false;
39
+ }
40
+
41
+ return propsAreEqual(prevRest, nextRest);
42
+ }
@@ -0,0 +1,83 @@
1
+ // Replaces es-toolkit core `sortBy` / `uniqBy` / `range` — faithful ports of
2
+ // the es-toolkit implementations (MIT), adapted to this repo's type discipline.
3
+
4
+ /**
5
+ * es-toolkit `compareValues` (ascending): JS relational comparison of the
6
+ * mapped criterion values. Numbers and strings compare natively; mixed pairs
7
+ * fall back to numeric coercion, mirroring the abstract `<`/`>` semantics.
8
+ */
9
+ function compareValues(a: unknown, b: unknown): number {
10
+ if (typeof a === "number" && typeof b === "number") {
11
+ return a < b ? -1 : a > b ? 1 : 0;
12
+ }
13
+ if (typeof a === "string" && typeof b === "string") {
14
+ return a < b ? -1 : a > b ? 1 : 0;
15
+ }
16
+ const an = Number(a);
17
+ const bn = Number(b);
18
+ if (!Number.isNaN(an) && !Number.isNaN(bn)) {
19
+ return an < bn ? -1 : an > bn ? 1 : 0;
20
+ }
21
+ return 0;
22
+ }
23
+
24
+ /**
25
+ * Sorts by the given criteria (object keys or mapper functions), ascending.
26
+ * Stable: ties keep their original order (native sort is stable per ES2019).
27
+ */
28
+ export function sortBy<T extends object>(
29
+ arr: readonly T[],
30
+ criteria: Array<((item: T) => unknown) | keyof T>,
31
+ ): T[] {
32
+ const mapped = arr.map((item) => ({
33
+ item,
34
+ keys: criteria.map((c) => (typeof c === "function" ? c(item) : item[c])),
35
+ }));
36
+ mapped.sort((a, b) => {
37
+ for (let i = 0; i < a.keys.length; i++) {
38
+ const order = compareValues(a.keys[i], b.keys[i]);
39
+ if (order !== 0) {
40
+ return order;
41
+ }
42
+ }
43
+ return 0;
44
+ });
45
+ return mapped.map((m) => m.item);
46
+ }
47
+
48
+ /**
49
+ * Unique elements by mapped key; the FIRST occurrence of each key is kept.
50
+ * Keys compare by Map semantics (SameValueZero).
51
+ */
52
+ export function uniqBy<T, U>(
53
+ arr: readonly T[],
54
+ mapper: (item: T, index: number, array: readonly T[]) => U,
55
+ ): T[] {
56
+ const map = new Map<U, T>();
57
+ let index = 0;
58
+ for (const item of arr) {
59
+ const key = mapper(item, index, arr);
60
+ if (!map.has(key)) {
61
+ map.set(key, item);
62
+ }
63
+ index++;
64
+ }
65
+ return Array.from(map.values());
66
+ }
67
+
68
+ /** Integers from `start` (inclusive) to `end` (exclusive), step 1. */
69
+ export function range(start: number, end?: number, step = 1): number[] {
70
+ if (end == null) {
71
+ end = start;
72
+ start = 0;
73
+ }
74
+ if (!Number.isInteger(step) || step === 0) {
75
+ throw new Error("The step value must be a non-zero integer.");
76
+ }
77
+ const length = Math.max(Math.ceil((end - start) / step), 0);
78
+ const result: number[] = new Array<number>(length);
79
+ for (let i = 0; i < length; i++) {
80
+ result[i] = start + i * step;
81
+ }
82
+ return result;
83
+ }
@@ -0,0 +1,101 @@
1
+ // Ported from recharts 3.8.1 src/util/createCartesianCharts.tsx.
2
+ // Solid-native: React.ComponentType → `(props) => JSX.Element`. The layout
3
+ // binding wrapper spreads the user props then sets `layout` as a static
4
+ // attribute LAST, so the bound layout wins over any passed value; the public
5
+ // type omits `layout` so TS rejects it too.
6
+ import type { JSX } from "@solidjs/web";
7
+ import { AreaChart as OriginalAreaChart } from "../chart/AreaChart";
8
+ import { BarChart as OriginalBarChart } from "../chart/BarChart";
9
+ import { LineChart as OriginalLineChart } from "../chart/LineChart";
10
+ import { ComposedChart as OriginalComposedChart } from "../chart/ComposedChart";
11
+ import { ScatterChart as OriginalScatterChart } from "../chart/ScatterChart";
12
+ import { FunnelChart as OriginalFunnelChart } from "../chart/FunnelChart";
13
+ import type { CartesianChartProps } from "./types";
14
+
15
+ type Component<P> = (props: P) => JSX.Element;
16
+ type ChartComponent<TData> = Component<Omit<CartesianChartProps<TData>, "layout">>;
17
+
18
+ export type TypedHorizontalChartContext<TData, _TCategorical, _TNumerical, TComponents> = {
19
+ AreaChart: ChartComponent<TData>;
20
+ BarChart: ChartComponent<TData>;
21
+ LineChart: ChartComponent<TData>;
22
+ ComposedChart: ChartComponent<TData>;
23
+ ScatterChart: ChartComponent<TData>;
24
+ } & Omit<TComponents, "Funnel" | "FunnelChart">;
25
+
26
+ export type TypedVerticalChartContext<TData, _TCategorical, _TNumerical, TComponents> = {
27
+ AreaChart: ChartComponent<TData>;
28
+ BarChart: ChartComponent<TData>;
29
+ LineChart: ChartComponent<TData>;
30
+ ComposedChart: ChartComponent<TData>;
31
+ ScatterChart: ChartComponent<TData>;
32
+ FunnelChart: ChartComponent<TData>;
33
+ } & TComponents;
34
+
35
+ const createCartesianCharts = <TData,>(
36
+ layout: "horizontal" | "vertical",
37
+ ): {
38
+ AreaChart: ChartComponent<TData>;
39
+ BarChart: ChartComponent<TData>;
40
+ LineChart: ChartComponent<TData>;
41
+ ComposedChart: ChartComponent<TData>;
42
+ ScatterChart: ChartComponent<TData>;
43
+ } => ({
44
+ AreaChart: (props) => <OriginalAreaChart {...props} layout={layout} />,
45
+ BarChart: (props) => <OriginalBarChart {...props} layout={layout} />,
46
+ LineChart: (props) => <OriginalLineChart {...props} layout={layout} />,
47
+ ComposedChart: (props) => <OriginalComposedChart {...props} layout={layout} />,
48
+ ScatterChart: (props) => <OriginalScatterChart {...props} layout={layout} />,
49
+ });
50
+
51
+ export type NoFunnel<T> = "Funnel" extends keyof T
52
+ ? never
53
+ : "FunnelChart" extends keyof T
54
+ ? never
55
+ : T;
56
+
57
+ /**
58
+ * Creates a typed context for horizontal Cartesian charts. Curries the chart
59
+ * definition to statically bind `layout="horizontal"`. Rejects strictly vertical
60
+ * components (`Funnel`, `FunnelChart`) at compile time.
61
+ *
62
+ * @since 3.8
63
+ */
64
+ export function createHorizontalChart<TData, TCategorical = string, TNumerical = number>() {
65
+ return function withComponents<TComponents extends Record<string, unknown>>(
66
+ components: NoFunnel<TComponents>,
67
+ ): TypedHorizontalChartContext<TData, TCategorical, TNumerical, TComponents> {
68
+ // The wrapper-chart map + the caller's components don't structurally match the
69
+ // mapped result type (component identity is preserved at runtime, remapped only
70
+ // at the type level), so the unsound cast is intentional — same as recharts.
71
+ // eslint-disable-next-line typescript/consistent-type-assertions -- runtime identity preserved; type is a remap
72
+ return {
73
+ ...createCartesianCharts<TData>("horizontal"),
74
+ // eslint-disable-next-line typescript/consistent-type-assertions -- NoFunnel<T> narrows to T at runtime
75
+ ...(components as TComponents),
76
+ } as unknown as TypedHorizontalChartContext<TData, TCategorical, TNumerical, TComponents>;
77
+ };
78
+ }
79
+
80
+ /**
81
+ * Creates a typed context for vertical Cartesian charts. Curries the chart
82
+ * definition to statically bind `layout="vertical"`. Natively supports strictly
83
+ * vertical components like `Funnel` and `FunnelChart`.
84
+ *
85
+ * @since 3.8
86
+ */
87
+ export function createVerticalChart<TData, TCategorical = string, TNumerical = number>() {
88
+ return function withComponents<TComponents extends Record<string, unknown>>(
89
+ components: TComponents,
90
+ ): TypedVerticalChartContext<TData, TCategorical, TNumerical, TComponents> {
91
+ const FunnelChart: ChartComponent<TData> = (props) => (
92
+ <OriginalFunnelChart {...props} layout="vertical" />
93
+ );
94
+ // eslint-disable-next-line typescript/consistent-type-assertions -- runtime identity preserved; type is a remap
95
+ return {
96
+ ...createCartesianCharts<TData>("vertical"),
97
+ FunnelChart,
98
+ ...components,
99
+ } as unknown as TypedVerticalChartContext<TData, TCategorical, TNumerical, TComponents>;
100
+ };
101
+ }