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,810 @@
1
+ // Ported from recharts 3.9.0 src/cartesian/Area.tsx (commit 7a23854 base).
2
+ //
3
+ // A graphical item reusing the Line/axis spine: it computes points like a Line
4
+ // plus a baseLine, and draws a filled <Curve>.
5
+ // FULLY WIRED: range areas, activeDot, labels, clip, stacks, dots (boolean /
6
+ // props-object / function-form), tooltip + legend registration, and animation
7
+ // — migrated to the v3.9 engine (AnimatedItems + AnimationController). The
8
+ // entrance clip-reveal now lives in AreaRevealShape (the default `shape`); the
9
+ // data-change morph is driven by the AnimatedItems interpolation fn.
10
+ // Solid deviations: `resolveDefaultProps`→`merge`; effect-dispatch
11
+ // registration components → `createEffect` add/replace + `onCleanup` (Line idiom);
12
+ // React `useRef` prev-frame state → plain `{ current }` MutableRef objects driven
13
+ // by AnimatedItems/useAnimationStartSnapshot.
14
+ import { createEffect, createMemo, createSignal, merge, Show } from "solid-js";
15
+ import type { JSX } from "@solidjs/web";
16
+ import { useAppSelector, useAppStore } from "../state/hooks";
17
+ import { AnimatedItems, type AnimationInterpolateFn } from "../animation/AnimatedItems";
18
+ import {
19
+ matchAnimationItems,
20
+ matchByIndex,
21
+ type AnimationItem,
22
+ type AnimationMatchByProp,
23
+ } from "../animation/matchBy";
24
+ import { useAnimationStartSnapshot, type MutableRef } from "../animation/useAnimationStartSnapshot";
25
+ import type { EasingInput } from "../animation/easing";
26
+ import { noop } from "../util/DataUtils";
27
+ import { SetTooltipEntrySettings } from "../state/SetTooltipEntrySettings";
28
+ import { TooltipPayloadConfiguration } from "../state/tooltipSlice";
29
+ import { SetLegendPayload } from "../state/SetLegendPayload";
30
+ import { LegendPayload } from "../component/DefaultLegendContent";
31
+ import type { Formatter } from "../component/DefaultTooltipContent";
32
+ import { DefaultZIndexes } from "../zIndex/DefaultZIndexes";
33
+ import { ZIndexLayer } from "../zIndex/ZIndexLayer";
34
+ import { useIsPanorama } from "../context/PanoramaContext";
35
+ import { useCartesianChartLayout } from "../context/chartLayoutContext";
36
+ import { useUniqueId } from "../util/useUniqueId";
37
+ import { Layer } from "../container/Layer";
38
+ import { type CurveType, type CurveProps, type BaseLineType } from "../shape/Curve";
39
+ import { Shape } from "../util/ActiveShapeUtils";
40
+ import { svgPropertiesAndEvents } from "../util/svgPropertiesAndEvents";
41
+ import { svgPropertiesNoEvents } from "../util/svgPropertiesNoEvents";
42
+ import { Dots, isClipDot } from "../component/Dots";
43
+ import { getRadiusAndStrokeWidthFromDot } from "../util/getRadiusAndStrokeWidthFromDot";
44
+ import { GraphicalItemClipPath, useNeedsClip } from "./GraphicalItemClipPath";
45
+ import { usePlotArea } from "../hooks";
46
+ import {
47
+ type CartesianLabelListEntry,
48
+ CartesianLabelListContextProvider,
49
+ type ImplicitLabelListType,
50
+ LabelListFromLabelProp,
51
+ } from "../component/LabelList";
52
+ import type { ActiveShape, TrapezoidViewBox } from "../util/types";
53
+ import { selectArea } from "../state/selectors/areaSelectors";
54
+ import { AreaSettings } from "../state/types/AreaSettings";
55
+ import { AxisId } from "../state/cartesianAxisSlice";
56
+ import { ChartData } from "../state/chartDataSlice";
57
+ import {
58
+ ActiveDotType,
59
+ AnimationDuration,
60
+ BaseValue,
61
+ CartesianLayout,
62
+ DataKey,
63
+ DotType,
64
+ LegendType,
65
+ NullableCoordinate,
66
+ TickItem,
67
+ TooltipType,
68
+ } from "../util/types";
69
+ import {
70
+ computeActivePointState,
71
+ renderActivePointsLayerFromState,
72
+ } from "../component/ActivePoints";
73
+ import { useActiveTooltipDataPoints } from "../hooks";
74
+ import { selectActiveTooltipIndex } from "../state/selectors/tooltipSelectors";
75
+ import { selectChartName } from "../state/selectors/rootPropsSelectors";
76
+ import { getCateCoordinateOfLine, getTooltipNameProp, getValueByDataKey } from "../util/ChartUtils";
77
+ import { interpolate, isNan, isNullish, isNumber } from "../util/DataUtils";
78
+ import { BaseAxisWithScale } from "../state/selectors/axisSelectors";
79
+ import { StackId } from "../util/ChartUtils";
80
+ import { StackDataPoint } from "../util/stacks/stackTypes";
81
+ import { unregisterOnCleanup } from "../state/unregisterOnCleanup";
82
+ import { AreaRevealShape, type AreaRevealShapeProps } from "./AreaRevealShape";
83
+
84
+ function getLegendItemColor(
85
+ stroke: string | undefined,
86
+ fill: string | undefined,
87
+ ): string | undefined {
88
+ return stroke && stroke !== "none" ? stroke : fill;
89
+ }
90
+
91
+ export interface AreaPointItem extends NullableCoordinate {
92
+ x: number | null;
93
+ y: number | null;
94
+ value?: ReadonlyArray<unknown>;
95
+ payload?: unknown;
96
+ }
97
+
98
+ export type ComputedArea = {
99
+ points: ReadonlyArray<AreaPointItem>;
100
+ baseLine: number | ReadonlyArray<AreaPointItem>;
101
+ isRange: boolean;
102
+ };
103
+
104
+ /**
105
+ * The area's base value (the bottom of the fill). Item value wins over the
106
+ * chart-level value. Deviation: reference reads `scale.domain()` with
107
+ * `@ts-expect-error`; the domain items are coerced with `Number()` (identity for
108
+ * number axes — the normal area case).
109
+ */
110
+ export const getBaseValue = (
111
+ layout: CartesianLayout,
112
+ chartBaseValue: BaseValue | undefined,
113
+ itemBaseValue: BaseValue | undefined,
114
+ xAxis: BaseAxisWithScale,
115
+ yAxis: BaseAxisWithScale,
116
+ ): number => {
117
+ const baseValue: BaseValue | undefined = itemBaseValue ?? chartBaseValue;
118
+
119
+ if (isNumber(baseValue)) {
120
+ return baseValue;
121
+ }
122
+
123
+ const numericAxis = layout === "horizontal" ? yAxis : xAxis;
124
+ const domain = numericAxis.scale.domain();
125
+ const d0 = Number(domain[0]);
126
+ const d1 = Number(domain[1]);
127
+
128
+ if (numericAxis.type === "number") {
129
+ const domainMax = Math.max(d0, d1);
130
+ const domainMin = Math.min(d0, d1);
131
+
132
+ if (baseValue === "dataMin") {
133
+ return domainMin;
134
+ }
135
+ if (baseValue === "dataMax") {
136
+ return domainMax;
137
+ }
138
+
139
+ return domainMax < 0 ? domainMax : Math.max(domainMin, 0);
140
+ }
141
+
142
+ if (baseValue === "dataMin") {
143
+ return d0;
144
+ }
145
+ if (baseValue === "dataMax") {
146
+ return d1;
147
+ }
148
+
149
+ return d0;
150
+ };
151
+
152
+ export function computeArea({
153
+ areaSettings: { dataKey, baseValue: itemBaseValue, connectNulls },
154
+ layout,
155
+ chartBaseValue,
156
+ xAxis,
157
+ yAxis,
158
+ displayedData,
159
+ stackedData,
160
+ dataStartIndex,
161
+ xAxisTicks,
162
+ yAxisTicks,
163
+ bandSize,
164
+ }: {
165
+ areaSettings: AreaSettings;
166
+ layout: CartesianLayout;
167
+ chartBaseValue: BaseValue | undefined;
168
+ xAxis: BaseAxisWithScale;
169
+ yAxis: BaseAxisWithScale;
170
+ displayedData: ChartData;
171
+ stackedData: ReadonlyArray<StackDataPoint> | undefined;
172
+ dataStartIndex: number;
173
+ xAxisTicks: TickItem[];
174
+ yAxisTicks: TickItem[];
175
+ bandSize: number;
176
+ }): ComputedArea {
177
+ const hasStack = stackedData != null && stackedData.length > 0;
178
+ const baseValue = getBaseValue(layout, chartBaseValue, itemBaseValue, xAxis, yAxis);
179
+ const isHorizontalLayout = layout === "horizontal";
180
+
181
+ // Range areas: when the dataKey returns a [low, high] tuple, the band spans
182
+ // those two values (rather than baseValue→value), so `isRange` flips on and the
183
+ // lower bound feeds the per-point baseLine below (recharts computeArea L1034).
184
+ let isRange = false;
185
+ const points: ReadonlyArray<AreaPointItem> = displayedData.map((entry, index): AreaPointItem => {
186
+ let valueAsArray: ReadonlyArray<unknown>;
187
+ if (hasStack) {
188
+ valueAsArray = stackedData?.[dataStartIndex + index] ?? [];
189
+ } else {
190
+ const rawValue = getValueByDataKey(entry, dataKey);
191
+ if (Array.isArray(rawValue)) {
192
+ valueAsArray = rawValue;
193
+ isRange = true;
194
+ } else {
195
+ valueAsArray = [baseValue, rawValue];
196
+ }
197
+ }
198
+ const value1 = valueAsArray[1] ?? null;
199
+ const isBreakPoint =
200
+ value1 == null || (hasStack && !connectNulls && getValueByDataKey(entry, dataKey) == null);
201
+
202
+ if (isHorizontalLayout) {
203
+ return {
204
+ x: getCateCoordinateOfLine({ axis: xAxis, ticks: xAxisTicks, bandSize, entry, index }),
205
+ y: isBreakPoint ? null : (yAxis.scale.map(value1) ?? null),
206
+ value: valueAsArray,
207
+ payload: entry,
208
+ };
209
+ }
210
+ return {
211
+ x: isBreakPoint ? null : (xAxis.scale.map(value1) ?? null),
212
+ y: getCateCoordinateOfLine({ axis: yAxis, ticks: yAxisTicks, bandSize, entry, index }),
213
+ value: valueAsArray,
214
+ payload: entry,
215
+ };
216
+ });
217
+
218
+ // Stacked areas get a per-point baseLine (the lower bound of each stack
219
+ // segment); unstacked areas get a flat numeric baseline.
220
+ let baseLine: number | ReadonlyArray<AreaPointItem>;
221
+ if (hasStack || isRange) {
222
+ baseLine = points.map((entry): AreaPointItem => {
223
+ const low = entry.value != null ? entry.value[0] : null;
224
+ if (isHorizontalLayout) {
225
+ return {
226
+ x: entry.x,
227
+ y: low != null && entry.y != null ? (yAxis.scale.map(low) ?? null) : null,
228
+ payload: entry.payload,
229
+ };
230
+ }
231
+ return {
232
+ x: low != null ? (xAxis.scale.map(low) ?? null) : null,
233
+ y: entry.y,
234
+ payload: entry.payload,
235
+ };
236
+ });
237
+ } else {
238
+ baseLine = (isHorizontalLayout ? yAxis.scale.map(baseValue) : xAxis.scale.map(baseValue)) ?? 0;
239
+ }
240
+
241
+ return { points, baseLine, isRange };
242
+ }
243
+
244
+ // SVG props (incl. event handlers) the Area forwards onto its fill <Curve>, minus
245
+ // the ones Area computes itself or redeclares below.
246
+ type AreaSvgProps = Omit<
247
+ CurveProps,
248
+ | "points"
249
+ | "pathRef"
250
+ | "ref"
251
+ | "layout"
252
+ | "baseLine"
253
+ | "type"
254
+ | "connectNulls"
255
+ | "path"
256
+ | "class"
257
+ | "id"
258
+ | "stroke"
259
+ | "strokeWidth"
260
+ | "fill"
261
+ | "children"
262
+ >;
263
+
264
+ export interface AreaProps extends AreaSvgProps {
265
+ xAxisId?: AxisId;
266
+ yAxisId?: AxisId;
267
+ dataKey?: DataKey<unknown>;
268
+ data?: ChartData;
269
+ /** Series name shown in tooltip/legend; falls back to a string dataKey. */
270
+ name?: string | number;
271
+ /** Unit appended to the value in the tooltip. */
272
+ unit?: string | number;
273
+ /** Tooltip entry type (recharts only supports `'none'`). */
274
+ tooltipType?: TooltipType;
275
+ /** Formats this Area's tooltip value; takes precedence over the Tooltip-level `formatter`. */
276
+ formatter?: Formatter;
277
+ type?: CurveType;
278
+ stroke?: string;
279
+ strokeWidth?: number;
280
+ fill?: string;
281
+ fillOpacity?: number | string;
282
+ /** Forwarded onto the area; recharts accepts the React-style camelCase attr. */
283
+ pointerEvents?: string;
284
+ connectNulls?: boolean;
285
+ baseValue?: BaseValue;
286
+ hide?: boolean;
287
+ /**
288
+ * Dots drawn at each point on the area's top line. boolean / props-object /
289
+ * custom render function (function form). @defaultValue false
290
+ */
291
+ dot?: DotType;
292
+ activeDot?: ActiveDotType;
293
+ /**
294
+ * Labels drawn at each point on the area's top line. boolean / props-object /
295
+ * custom render function (function form). @defaultValue false
296
+ */
297
+ label?: ImplicitLabelListType;
298
+ stackId?: StackId;
299
+ /** Legend icon type. @defaultValue 'line' */
300
+ legendType?: LegendType;
301
+ isAnimationActive?: boolean | "auto";
302
+ animationBegin?: number;
303
+ animationDuration?: AnimationDuration;
304
+ animationEasing?: EasingInput;
305
+ /** Custom per-frame interpolation for the area points (v3.9). */
306
+ animationInterpolateFn?: AnimationInterpolateFn<AreaPointItem, CartesianLayout>;
307
+ /** How prev/next points are matched across data updates (v3.9). @defaultValue matchByIndex */
308
+ animationMatchBy?: AnimationMatchByProp<AreaPointItem>;
309
+ /**
310
+ * Custom area shape (function form / props object). Defaults to AreaRevealShape,
311
+ * the built-in entrance clip-reveal animation. @defaultValue AreaRevealShape
312
+ */
313
+ shape?: ActiveShape<AreaRevealShapeProps, SVGPathElement>;
314
+ /** Fired when the enter/update animation starts. */
315
+ onAnimationStart?: () => void;
316
+ /** Fired when the enter/update animation completes. */
317
+ onAnimationEnd?: () => void;
318
+ /**
319
+ * Z-Index of this component and its children; the higher, the more on top.
320
+ * @defaultValue 100 (DefaultZIndexes.area)
321
+ */
322
+ zIndex?: number;
323
+ id?: string;
324
+ class?: string;
325
+ }
326
+
327
+ // Typed so the `as const` defaults object carries `shape` as `ActiveShape` (not the
328
+ // narrowed component signature) — mirrors Bar's `defaultBarShape`, avoids a cast.
329
+ const defaultAreaShape: ActiveShape<AreaRevealShapeProps, SVGPathElement> = AreaRevealShape;
330
+
331
+ export const areaDefaultProps = {
332
+ activeDot: true,
333
+ connectNulls: false,
334
+ dot: false,
335
+ fill: "#3182bd",
336
+ fillOpacity: 0.6,
337
+ hide: false,
338
+ label: false,
339
+ legendType: "line",
340
+ stroke: "#3182bd",
341
+ strokeWidth: 1,
342
+ xAxisId: 0,
343
+ yAxisId: 0,
344
+ type: "linear",
345
+ isAnimationActive: "auto",
346
+ animationBegin: 0,
347
+ animationDuration: 1500,
348
+ animationEasing: "ease",
349
+ animationMatchBy: matchByIndex,
350
+ // `animationInterpolateFn` intentionally omitted here — it's optional and the
351
+ // consumer falls back to `defaultAreaAnimateItems` (defined below) via `??`.
352
+ shape: defaultAreaShape,
353
+ zIndex: DefaultZIndexes.area,
354
+ } as const;
355
+
356
+ type AreaBaseLine = number | ReadonlyArray<AreaPointItem>;
357
+
358
+ // Default per-frame interpolation for Area points (the `animationInterpolateFn`
359
+ // the new AnimatedItems engine drives). Mirrors recharts 3.9
360
+ // `defaultAreaAnimateItems`: matched points tween between prev/next; added points
361
+ // snap to their final position (the clip-path reveal handles the entrance); removed
362
+ // points are dropped. t=1 returns the target identity so settled renders match.
363
+ const defaultAreaAnimateItems: AnimationInterpolateFn<AreaPointItem, CartesianLayout> = (
364
+ items,
365
+ animationElapsedTime,
366
+ ) => {
367
+ if (items == null) {
368
+ // First render: clip-path animation handles the reveal.
369
+ return [];
370
+ }
371
+ if (animationElapsedTime === 1) {
372
+ return items.flatMap((item) => (item.status === "removed" ? [] : [item.next]));
373
+ }
374
+ return items.flatMap((item): AreaPointItem[] => {
375
+ if (item.status === "matched") {
376
+ return [
377
+ {
378
+ ...item.next,
379
+ x: interpolate(item.prev.x, item.next.x, animationElapsedTime),
380
+ y: interpolate(item.prev.y, item.next.y, animationElapsedTime),
381
+ },
382
+ ];
383
+ }
384
+ if (item.status === "added") {
385
+ // Return the final position without interpolating so the clip-path
386
+ // entrance reveal (AreaRevealShape) can do the initial animation.
387
+ return [item.next];
388
+ }
389
+ // removed: drop
390
+ return [];
391
+ });
392
+ };
393
+
394
+ // The scalar baseLine morphs as a number (NaN/nullish animates toward 0, reference
395
+ // parity). Per-point (array) baseLines flow through the same animationInterpolateFn
396
+ // as the points (see AreaWithAnimation below).
397
+ function interpolateScalarBaseLine(
398
+ baseLine: BaseLineType | undefined,
399
+ prevBaseLine: BaseLineType | undefined,
400
+ animationElapsedTime: number,
401
+ ): BaseLineType {
402
+ if (isNumber(baseLine)) {
403
+ const previousNumberBaseLine = isNumber(prevBaseLine) ? prevBaseLine : undefined;
404
+ return interpolate(previousNumberBaseLine, baseLine, animationElapsedTime);
405
+ }
406
+ if (isNullish(baseLine) || isNan(baseLine)) {
407
+ const previousNumberBaseLine = isNumber(prevBaseLine) ? prevBaseLine : undefined;
408
+ return interpolate(previousNumberBaseLine, 0, animationElapsedTime);
409
+ }
410
+ return baseLine;
411
+ }
412
+
413
+ export const Area = (props: AreaProps): JSX.Element => {
414
+ const store = useAppStore();
415
+ const merged = merge(areaDefaultProps, props);
416
+ const isPanorama = useIsPanorama();
417
+ const layout = useCartesianChartLayout();
418
+ const id = useUniqueId("recharts-area", props.id);
419
+
420
+ let prev: AreaSettings | null = null;
421
+
422
+ createEffect(
423
+ (): AreaSettings => ({
424
+ id,
425
+ type: "area",
426
+ isPanorama,
427
+ data: merged.data,
428
+ dataKey: merged.dataKey ?? "",
429
+ xAxisId: merged.xAxisId,
430
+ yAxisId: merged.yAxisId,
431
+ zAxisId: 0,
432
+ hide: merged.hide,
433
+ // Area has no bar size; the field exists only because AreaSettings shares
434
+ // the MaybeStackedGraphicalItem shape with Bar.
435
+ barSize: undefined,
436
+ stackId: merged.stackId == null ? undefined : String(merged.stackId),
437
+ connectNulls: merged.connectNulls,
438
+ baseValue: merged.baseValue,
439
+ }),
440
+ (settings) => {
441
+ if (store == null) {
442
+ return;
443
+ }
444
+ if (prev === null) {
445
+ store.actions.graphicalItems.addCartesianGraphicalItem(settings);
446
+ } else if (prev !== settings) {
447
+ store.actions.graphicalItems.replaceCartesianGraphicalItem({ prev, next: settings });
448
+ }
449
+ prev = settings;
450
+ },
451
+ );
452
+
453
+ unregisterOnCleanup(() => {
454
+ if (prev && store != null) {
455
+ store.actions.graphicalItems.removeCartesianGraphicalItem(prev);
456
+ prev = null;
457
+ }
458
+ });
459
+
460
+ const area = useAppSelector((state) => selectArea(state, id, isPanorama));
461
+
462
+ // Registers this area's tooltip payload entry (an explicit `name` prop wins,
463
+ // else it falls back to a string dataKey).
464
+ const tooltipConfig = createMemo<TooltipPayloadConfiguration>(() => ({
465
+ dataDefinedOnItem: merged.data,
466
+ getPosition: noop,
467
+ settings: {
468
+ stroke: merged.stroke,
469
+ strokeWidth: merged.strokeWidth,
470
+ fill: merged.fill,
471
+ dataKey: merged.dataKey,
472
+ nameKey: undefined,
473
+ name: getTooltipNameProp(merged.name, merged.dataKey),
474
+ hide: merged.hide,
475
+ type: merged.tooltipType,
476
+ color: getLegendItemColor(merged.stroke, merged.fill),
477
+ unit: merged.unit,
478
+ formatter: merged.formatter,
479
+ graphicalItemId: id,
480
+ },
481
+ }));
482
+
483
+ // Legend payload entry for this area (color = stroke, like recharts' getLegendItemColor).
484
+ // `payload` mirrors recharts' resolved Area props (built explicitly — spreading the
485
+ // Solid merge() proxy would leak a MERGE_SOURCE symbol).
486
+ const legendPayload = createMemo<ReadonlyArray<LegendPayload>>(() => [
487
+ {
488
+ inactive: merged.hide,
489
+ dataKey: merged.dataKey,
490
+ type: merged.legendType,
491
+ color: getLegendItemColor(merged.stroke, merged.fill),
492
+ value: getTooltipNameProp(merged.name, merged.dataKey),
493
+ payload: {
494
+ activeDot: merged.activeDot,
495
+ animationBegin: merged.animationBegin,
496
+ animationDuration: merged.animationDuration,
497
+ animationEasing: merged.animationEasing,
498
+ connectNulls: merged.connectNulls,
499
+ dataKey: merged.dataKey,
500
+ dot: merged.dot,
501
+ fill: merged.fill,
502
+ fillOpacity: merged.fillOpacity,
503
+ hide: merged.hide,
504
+ isAnimationActive: merged.isAnimationActive,
505
+ label: merged.label,
506
+ legendType: merged.legendType,
507
+ name: getTooltipNameProp(merged.name, merged.dataKey),
508
+ stroke: merged.stroke,
509
+ strokeWidth: merged.strokeWidth,
510
+ type: merged.type,
511
+ xAxisId: merged.xAxisId,
512
+ yAxisId: merged.yAxisId,
513
+ zIndex: merged.zIndex,
514
+ },
515
+ },
516
+ ]);
517
+
518
+ const activeTooltipIndex = useAppSelector(selectActiveTooltipIndex);
519
+ const activeDataPoints = useActiveTooltipDataPoints();
520
+ const tooltipActive = createMemo(() => ({
521
+ index: activeTooltipIndex(),
522
+ dataPoints: activeDataPoints(),
523
+ }));
524
+
525
+ // Clip path: recharts wraps the curves in a Layer clipped to the plot area when
526
+ // an axis has allowDataOverflow (needClip); the clipPath id is the area's id.
527
+ const { needClip } = useNeedsClip(merged.xAxisId, merged.yAxisId);
528
+ const plotArea = usePlotArea();
529
+ const curveClipPath = createMemo(() => (needClip() ? `url(#clipPath-${id})` : undefined));
530
+
531
+ // recharts only renders <Area> inside AreaChart / ComposedChart (historical). The
532
+ // item still REGISTERS as a graphical item in any chart; only the curves are gated.
533
+ const chartName = useAppSelector(selectChartName);
534
+ const chartSupportsArea = createMemo(
535
+ () => chartName() === "AreaChart" || chartName() === "ComposedChart",
536
+ );
537
+
538
+ // When dots are NOT clipped to their bounding box (clipDot false), recharts emits
539
+ // a wider `clipPath-dots-` rect (plot area expanded by the dot size); clipDot true
540
+ // reuses the graphical-item clip path.
541
+ const dotsClip = (): { clipDot: boolean; dotSize: number } => {
542
+ const { r, strokeWidth } = getRadiusAndStrokeWidthFromDot(merged.dot ?? false);
543
+ return { clipDot: isClipDot(merged.dot ?? false), dotSize: r * 2 + strokeWidth };
544
+ };
545
+
546
+ // One LabelList entry per data point: a zero-size viewBox at the point's (x, y).
547
+ const labelListEntries = createMemo<ReadonlyArray<CartesianLabelListEntry>>(() => {
548
+ const computed = area();
549
+ if (computed == null) {
550
+ return [];
551
+ }
552
+ return computed.points.map((point): CartesianLabelListEntry => {
553
+ const viewBox: TrapezoidViewBox = {
554
+ x: point.x ?? 0,
555
+ y: point.y ?? 0,
556
+ width: 0,
557
+ lowerWidth: 0,
558
+ upperWidth: 0,
559
+ height: 0,
560
+ };
561
+ return {
562
+ ...viewBox,
563
+ value: point.value,
564
+ payload: point.payload,
565
+ viewBox,
566
+ parentViewBox: undefined,
567
+ fill: undefined,
568
+ };
569
+ });
570
+ });
571
+ // Labels are hidden while the entrance/update animation runs, shown once it ends.
572
+ // ownedWrite: handleAnimationEnd also fires from the driver's effect cleanup when
573
+ // a mid-animation chart is disposed (route/soft navigation) — a legal teardown.
574
+ const [showLabels, setShowLabels] = createSignal(true, { ownedWrite: true });
575
+ const labelContextEntries = createMemo(() => (showLabels() ? labelListEntries() : undefined));
576
+ const handleAnimationStart = (): void => {
577
+ setShowLabels(false);
578
+ props.onAnimationStart?.();
579
+ };
580
+ const handleAnimationEnd = (): void => {
581
+ setShowLabels(true);
582
+ props.onAnimationEnd?.();
583
+ };
584
+
585
+ // Per-frame prev geometry (recharts' previousPointsRef / previousBaselineRef):
586
+ // plain `{ current }` refs (NOT signals) driven by AnimatedItems +
587
+ // useAnimationStartSnapshot — they survive the keyed remount that starts each
588
+ // animation without themselves triggering renders.
589
+ const previousPointsRef: MutableRef<ReadonlyArray<AreaPointItem> | null> = { current: null };
590
+ const previousBaselineRef: MutableRef<AreaBaseLine | undefined> = { current: undefined };
591
+
592
+ const cartesianLayout = (): CartesianLayout =>
593
+ layout() === "vertical" ? "vertical" : "horizontal";
594
+ const interpolateFn = (): AnimationInterpolateFn<AreaPointItem, CartesianLayout> =>
595
+ merged.animationInterpolateFn ?? defaultAreaAnimateItems;
596
+
597
+ // Mirrors recharts' AreaWithAnimation: a separate snapshot tracks the baseLine
598
+ // so an interrupted animation resumes its baseLine from the in-flight value.
599
+ const baseLineSnapshot = useAnimationStartSnapshot<AreaBaseLine | undefined>(
600
+ () => area(),
601
+ previousBaselineRef,
602
+ );
603
+
604
+ // Renders the area shape (default AreaRevealShape, or a custom `shape`) at the
605
+ // given interpolated geometry. recharts' StaticArea: only draws when there is
606
+ // more than one point; the dots render regardless.
607
+ const renderShape = (
608
+ stepPoints: ReadonlyArray<AreaPointItem>,
609
+ stepBaseLine: AreaBaseLine | undefined,
610
+ isRange: boolean,
611
+ animationElapsedTime: number,
612
+ isAnimating: boolean,
613
+ isEntrance: boolean,
614
+ ): JSX.Element => {
615
+ const propsWithEvents = svgPropertiesAndEvents({ ...props });
616
+ const curveProps: AreaRevealShapeProps = {
617
+ ...propsWithEvents,
618
+ id,
619
+ points: stepPoints,
620
+ connectNulls: merged.connectNulls,
621
+ type: merged.type,
622
+ baseLine: stepBaseLine,
623
+ layout: cartesianLayout(),
624
+ stroke: merged.stroke,
625
+ fill: merged.fill,
626
+ fillOpacity: merged.fillOpacity,
627
+ strokeWidth: merged.strokeWidth,
628
+ isRange,
629
+ animationElapsedTime,
630
+ isAnimating,
631
+ isEntrance,
632
+ };
633
+ return (
634
+ <>
635
+ {stepPoints.length > 1 ? (
636
+ <Layer clipPath={curveClipPath()}>
637
+ <Shape<AreaRevealShapeProps, SVGPathElement>
638
+ option={merged.shape}
639
+ DefaultShape={AreaRevealShape}
640
+ shapeProps={curveProps}
641
+ />
642
+ </Layer>
643
+ ) : null}
644
+ <Dots
645
+ points={stepPoints}
646
+ dot={merged.dot ?? false}
647
+ class="recharts-area-dots"
648
+ dotClass="recharts-area-dot"
649
+ dataKey={merged.dataKey}
650
+ needClip={needClip()}
651
+ clipPathId={id}
652
+ baseProps={svgPropertiesNoEvents({
653
+ stroke: merged.stroke,
654
+ strokeWidth: merged.strokeWidth,
655
+ fill: merged.fill,
656
+ fillOpacity: merged.fillOpacity,
657
+ })}
658
+ />
659
+ </>
660
+ );
661
+ };
662
+
663
+ return (
664
+ <>
665
+ <SetTooltipEntrySettings tooltipEntrySettings={tooltipConfig()} />
666
+ <SetLegendPayload id={id} legendPayload={legendPayload()} />
667
+ <Show when={chartSupportsArea() && !merged.hide && area()}>
668
+ {(computed) => (
669
+ // Wrapped in <ZIndexLayer> (default 100) so a `zIndex` prop relayers the
670
+ // whole area (curve + dots + active points) into its portal — recharts
671
+ // wraps the entire `.recharts-area` Layer + ActivePoints in ZIndexLayer.
672
+ <ZIndexLayer zIndex={merged.zIndex}>
673
+ <Layer class={merged.class ? `recharts-area ${merged.class}` : "recharts-area"}>
674
+ <Show when={needClip()}>
675
+ <defs>
676
+ <GraphicalItemClipPath
677
+ clipPathId={id}
678
+ xAxisId={merged.xAxisId}
679
+ yAxisId={merged.yAxisId}
680
+ />
681
+ <Show when={!dotsClip().clipDot && plotArea()}>
682
+ {(pa) => (
683
+ <clipPath id={`clipPath-dots-${id}`}>
684
+ <rect
685
+ x={pa().x - dotsClip().dotSize / 2}
686
+ y={pa().y - dotsClip().dotSize / 2}
687
+ width={pa().width + dotsClip().dotSize}
688
+ height={pa().height + dotsClip().dotSize}
689
+ />
690
+ </clipPath>
691
+ )}
692
+ </Show>
693
+ </defs>
694
+ </Show>
695
+ <CartesianLabelListContextProvider value={labelContextEntries}>
696
+ <AnimatedItems
697
+ animationInput={computed()}
698
+ animationIdPrefix="recharts-area-"
699
+ items={computed().points}
700
+ previousItemsRef={previousPointsRef}
701
+ isAnimationActive={merged.isAnimationActive}
702
+ animationBegin={merged.animationBegin}
703
+ animationDuration={merged.animationDuration}
704
+ animationEasing={merged.animationEasing}
705
+ onAnimationStart={handleAnimationStart}
706
+ onAnimationEnd={handleAnimationEnd}
707
+ animationInterpolateFn={interpolateFn()}
708
+ animationMatchBy={merged.animationMatchBy}
709
+ layout={cartesianLayout()}
710
+ >
711
+ {(stepPoints, animationElapsedTime, isEntrance) => {
712
+ const target = computed();
713
+ const baseLine = target.baseLine;
714
+ const prevBaseLine = baseLineSnapshot.startValue();
715
+ // The baseLine morphs alongside the points. A per-point (array)
716
+ // baseLine flows through the SAME interpolation fn (matched on the
717
+ // same strategy); a scalar baseLine interpolates linearly. t=1
718
+ // returns the target identity; the entrance frame keeps the scalar
719
+ // baseLine fixed (the clip-reveal handles the entrance reveal).
720
+ let stepBaseLine: AreaBaseLine | undefined;
721
+ if (animationElapsedTime === 1) {
722
+ stepBaseLine = baseLine;
723
+ } else if (typeof baseLine !== "number") {
724
+ let baseLineItems: ReadonlyArray<AnimationItem<AreaPointItem>> | null;
725
+ if (typeof prevBaseLine !== "number" && prevBaseLine != null) {
726
+ baseLineItems = matchAnimationItems(
727
+ prevBaseLine,
728
+ baseLine,
729
+ merged.animationMatchBy,
730
+ );
731
+ } else {
732
+ baseLineItems = matchAnimationItems(
733
+ null,
734
+ baseLine,
735
+ merged.animationMatchBy,
736
+ );
737
+ }
738
+ stepBaseLine = interpolateFn()(
739
+ baseLineItems,
740
+ animationElapsedTime,
741
+ cartesianLayout(),
742
+ );
743
+ } else {
744
+ stepBaseLine = isEntrance
745
+ ? baseLine
746
+ : interpolateScalarBaseLine(baseLine, prevBaseLine, animationElapsedTime);
747
+ }
748
+ baseLineSnapshot.syncStepValue(
749
+ stepBaseLine,
750
+ animationElapsedTime,
751
+ animationElapsedTime > 0,
752
+ );
753
+ // recharts' useAnimationStartSnapshot refreshes the frozen
754
+ // start value at t=1, so its `isEntrance` flips false on the
755
+ // settled frame. Our snapshot memo doesn't refresh at t=1, so
756
+ // we mirror the observable result: the settled (t=1) frame is
757
+ // never an entrance (the reveal clip is gone there anyway).
758
+ const effectiveIsEntrance = isEntrance && animationElapsedTime < 1;
759
+ return renderShape(
760
+ stepPoints,
761
+ stepBaseLine,
762
+ target.isRange,
763
+ animationElapsedTime,
764
+ !showLabels() || animationElapsedTime < 1,
765
+ effectiveIsEntrance,
766
+ );
767
+ }}
768
+ </AnimatedItems>
769
+ <LabelListFromLabelProp label={merged.label} />
770
+ </CartesianLabelListContextProvider>
771
+ {(() => {
772
+ const t = tooltipActive();
773
+ const renderActiveLayer = (
774
+ layerPoints: ReadonlyArray<AreaPointItem>,
775
+ ): JSX.Element => {
776
+ const state = computeActivePointState({
777
+ points: layerPoints,
778
+ activeTooltipIndex: t.index,
779
+ activeDataPoints: t.dataPoints,
780
+ activeDot: merged.activeDot,
781
+ mainColor: getLegendItemColor(merged.stroke, merged.fill),
782
+ itemDataKey: merged.dataKey,
783
+ });
784
+ if (state == null) {
785
+ return null;
786
+ }
787
+ return renderActivePointsLayerFromState(state, {
788
+ points: layerPoints,
789
+ activeDot: merged.activeDot,
790
+ mainColor: getLegendItemColor(merged.stroke, merged.fill),
791
+ itemDataKey: merged.dataKey,
792
+ });
793
+ };
794
+ // Range areas activate a dot on BOTH the high edge (points) and the
795
+ // low edge (baseLine) — recharts renders two <ActivePoints>.
796
+ const bl = computed().baseLine;
797
+ return (
798
+ <>
799
+ {renderActiveLayer(computed().points)}
800
+ {computed().isRange && Array.isArray(bl) ? renderActiveLayer(bl) : null}
801
+ </>
802
+ );
803
+ })()}
804
+ </Layer>
805
+ </ZIndexLayer>
806
+ )}
807
+ </Show>
808
+ </>
809
+ );
810
+ };