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,767 @@
1
+ // Ported from recharts 3.8.1 src/polar/RadialBar.tsx (commit 7a23854).
2
+ //
3
+ // MINIMAL PORT — registers a RadialBarSettings polar item and renders one sector
4
+ // per data point via <RadialBarSector> (Shape→Sector). `computeRadialBarDataItems`
5
+ // is the pure sector-geometry function, ported faithfully for both the `radial`
6
+ // and `centric` layouts (incl. minPointSize + the background sector field).
7
+ //
8
+ // Solid deviations: `resolveDefaultProps`→`merge`; effect-dispatch registration
9
+ // → `createEffect`/`onCleanup` (addPolarGraphicalItem matched by id); the
10
+ // `@ts-expect-error` unknown-data spread → `toRecord` coercion. The layer class is
11
+ // `recharts-area` (a recharts quirk, kept for parity).
12
+ // Tooltip-entry + legend-payload registration are WIRED (the sectors are the
13
+ // per-item tooltip data; legend is a single entry — per-row legend deferred).
14
+ // Background rendering IS wired: one `.recharts-radial-bar-background-sector` per
15
+ // row with a computed background geometry, in a ZIndexLayer (default barBackground
16
+ // = -50, overridable via a numeric `zIndex` on the background prop); boolean /
17
+ // props-object / function-form backgrounds are all honored.
18
+ // zIndex relayering of the MAIN sectors IS wired too: the item content is wrapped
19
+ // in <ZIndexLayer> (default DefaultZIndexes.bar = 300), matching recharts.
20
+ // Labels ARE wired: a PolarLabelListContext of per-sector polar viewBoxes feeds
21
+ // <LabelListFromLabelProp>, so the implicit `label` prop (true / object / function)
22
+ // renders the curved recharts-radial-bar-label along each sector arc.
23
+ // activeShape IS wired (the active sector renders with activeShape via <Shape>'s
24
+ // `option`); the active index comes from the tooltip state (e.g. Tooltip
25
+ // defaultIndex), since per-sector hover dispatch is still gated on the deferred
26
+ // sector tooltipPosition. The full pointer/touch handler set is forwarded to each
27
+ // sector. The function-form custom `shape` render prop IS wired.
28
+ // STACKS are wired (the selector feeds this item's d3 stack series; sectors render
29
+ // from the truncated [start, end] stack tuple). DEFERRED (documented): animation
30
+ // (final frame), element-form shape, per-sector item-hover dispatch (sectors lack
31
+ // tooltipPosition).
32
+ // Cells ARE wired: a <Cell> child overrides the per-sector fill/stroke/class.
33
+ import { createEffect, createMemo, createSignal, For, merge, Show, untrack } from "solid-js";
34
+ import type { JSX } from "@solidjs/web";
35
+ import { useAppSelector, useAppStore } from "../state/hooks";
36
+ import { useUniqueId } from "../util/useUniqueId";
37
+ import { AnimatedItems, type AnimationInterpolateFn } from "../animation/AnimatedItems";
38
+ import { matchAppend, type AnimationMatchByProp } from "../animation/matchBy";
39
+ import type { MutableRef } from "../animation/useAnimationStartSnapshot";
40
+ import { usePolarChartLayout } from "../context/chartLayoutContext";
41
+ import type { EasingInput } from "../animation/easing";
42
+ import { Layer } from "../container/Layer";
43
+ import { type CellProps, collectCells } from "../component/Cell";
44
+ import {
45
+ type ImplicitLabelListType,
46
+ type PolarLabelListEntry,
47
+ PolarLabelListContextProvider,
48
+ LabelListFromLabelProp,
49
+ } from "../component/LabelList";
50
+ import {
51
+ useMouseClickItemDispatch,
52
+ useMouseEnterItemDispatch,
53
+ useMouseLeaveItemDispatch,
54
+ } from "../context/tooltipContext";
55
+ import { SetTooltipEntrySettings } from "../state/SetTooltipEntrySettings";
56
+ import type { Formatter } from "../component/DefaultTooltipContent";
57
+ import { SetLegendPayload } from "../state/SetLegendPayload";
58
+ import { TooltipPayloadConfiguration } from "../state/tooltipSlice";
59
+ import { SectorProps } from "../shape/Sector";
60
+ import {
61
+ ActiveShape,
62
+ AnimationDuration,
63
+ DataKey,
64
+ LayoutType,
65
+ LegendType,
66
+ PolarLayout,
67
+ PolarViewBoxRequired,
68
+ ShapeAnimationProps,
69
+ TickItem,
70
+ TooltipType,
71
+ } from "../util/types";
72
+ import { TooltipTriggerInfo } from "../context/tooltipContext";
73
+ import { parseCornerRadius, RadialBarSector, RadialBarSectorProps } from "../util/RadialBarUtils";
74
+ import { ZIndexLayer, type ZIndexable } from "../zIndex/ZIndexLayer";
75
+ import { DefaultZIndexes } from "../zIndex/DefaultZIndexes";
76
+ import { getZIndexFromUnknown } from "../zIndex/getZIndexFromUnknown";
77
+ import { svgPropertiesNoEventsFromUnknown } from "../util/svgPropertiesNoEvents";
78
+ import {
79
+ selectRadialBarLegendPayload,
80
+ selectRadialBarSectors,
81
+ } from "../state/selectors/radialBarSelectors";
82
+ import {
83
+ selectActiveTooltipDataKey,
84
+ selectActiveTooltipGraphicalItemId,
85
+ selectActiveTooltipIndex,
86
+ } from "../state/selectors/tooltipSelectors";
87
+ import { RadialBarSettings } from "../state/types/RadialBarSettings";
88
+ import { BaseAxisWithScale } from "../state/selectors/axisSelectors";
89
+ import { ChartData } from "../state/chartDataSlice";
90
+ import { AxisId } from "../state/cartesianAxisSlice";
91
+ import {
92
+ BarPositionPosition,
93
+ getCateCoordinateOfBar,
94
+ getTooltipNameProp,
95
+ getValueByDataKey,
96
+ } from "../util/ChartUtils";
97
+ import { interpolate, isNumber, mathSign } from "../util/DataUtils";
98
+ import type { StackSeries } from "../util/stacks/stackTypes";
99
+ import { unregisterOnCleanup } from "../state/unregisterOnCleanup";
100
+
101
+ export type RadialBarDataItem = SectorProps &
102
+ PolarViewBoxRequired &
103
+ TooltipTriggerInfo &
104
+ // v3.9: while animating, each sector carries the animation state so a custom-shape
105
+ // render prop can react to it (forwarded through RadialBarSector → Shape → shape fn).
106
+ ShapeAnimationProps & {
107
+ value?: unknown;
108
+ payload?: unknown;
109
+ background?: SectorProps;
110
+ };
111
+
112
+ /** Shape/activeShape are what RadialBarUtils consumes; the rest is the component surface. */
113
+ export interface RadialBarProps<DataPointType = Record<string, unknown>, DataValueType = unknown> {
114
+ /**
115
+ * If set a function, the function will be called to render a customized shape.
116
+ * During animations, the function shape also receives `animationElapsedTime`,
117
+ * `isAnimating`, and `isEntrance` (v3.9 {@link ShapeAnimationProps}). By default,
118
+ * renders a sector.
119
+ */
120
+ shape?: ActiveShape<RadialBarSectorProps & ShapeAnimationProps, SVGPathElement>;
121
+ activeShape?: ActiveShape<RadialBarSectorProps, SVGPathElement>;
122
+ angleAxisId?: AxisId;
123
+ radiusAxisId?: AxisId;
124
+ dataKey?: DataKey<DataPointType, DataValueType>;
125
+ stackId?: string | number;
126
+ /** A background sector drawn behind each bar (recharts `background` prop):
127
+ * boolean / props-object (optionally carrying a `zIndex`) / function shape. */
128
+ background?: boolean | (SectorProps & ZIndexable);
129
+ /** Per-sector labels (via the polar LabelList). @defaultValue false */
130
+ label?: ImplicitLabelListType;
131
+ barSize?: number;
132
+ minPointSize?: number;
133
+ maxBarSize?: number;
134
+ cornerRadius?: string | number;
135
+ forceCornerRadius?: boolean;
136
+ cornerIsExternal?: boolean;
137
+ name?: string | number;
138
+ fill?: string;
139
+ fillOpacity?: number | string;
140
+ stroke?: string;
141
+ strokeWidth?: number | string;
142
+ legendType?: LegendType;
143
+ tooltipType?: TooltipType;
144
+ /** Formats this RadialBar's tooltip value; takes precedence over the Tooltip-level `formatter`. */
145
+ formatter?: Formatter;
146
+ hide?: boolean;
147
+ onAnimationStart?: () => void;
148
+ onAnimationEnd?: () => void;
149
+ isAnimationActive?: boolean | "auto";
150
+ animationBegin?: number;
151
+ animationDuration?: AnimationDuration;
152
+ animationEasing?: EasingInput;
153
+ /** Custom per-frame interpolation for the sectors (v3.9). */
154
+ animationInterpolateFn?: AnimationInterpolateFn<RadialBarDataItem, PolarLayout>;
155
+ /** How prev/next sectors are matched across data updates (v3.9). @defaultValue matchAppend */
156
+ animationMatchBy?: AnimationMatchByProp<RadialBarDataItem>;
157
+ /**
158
+ * Z-Index of this component and its children; the higher, the more on top.
159
+ * @defaultValue 300 (DefaultZIndexes.bar)
160
+ */
161
+ zIndex?: number;
162
+ id?: string;
163
+ class?: string;
164
+ /** User pointer handlers, forwarded to each sector's wrapping <Layer>. */
165
+ onMouseEnter?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
166
+ onMouseLeave?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
167
+ onClick?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
168
+ onMouseDown?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
169
+ onMouseUp?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
170
+ onMouseMove?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
171
+ onMouseOver?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
172
+ onMouseOut?: (data: RadialBarDataItem, index: number, event: MouseEvent) => void;
173
+ onTouchStart?: (data: RadialBarDataItem, index: number, event: TouchEvent) => void;
174
+ onTouchMove?: (data: RadialBarDataItem, index: number, event: TouchEvent) => void;
175
+ onTouchEnd?: (data: RadialBarDataItem, index: number, event: TouchEvent) => void;
176
+ /** <Cell> children supplying per-sector fill/stroke/class overrides. */
177
+ children?: JSX.Element;
178
+ }
179
+
180
+ // Default per-frame interpolation for RadialBar sectors (the `animationInterpolateFn`
181
+ // the new AnimatedItems engine drives). Mirrors recharts 3.9
182
+ // `defaultRadialBarAnimateItems`: matched sectors tween startAngle/endAngle between
183
+ // prev/next; added sectors sweep endAngle from startAngle to final; removed sectors
184
+ // drop immediately. t=1 → final (removed dropped).
185
+ const defaultRadialBarAnimateItems: AnimationInterpolateFn<RadialBarDataItem, PolarLayout> = (
186
+ items,
187
+ animationElapsedTime,
188
+ ) => {
189
+ if (items == null) return [];
190
+ if (animationElapsedTime === 1) {
191
+ return items.flatMap((item) => (item.status === "removed" ? [] : [item.next]));
192
+ }
193
+ return items.flatMap((item): RadialBarDataItem[] => {
194
+ if (item.status === "removed") return [];
195
+ if (item.status === "matched") {
196
+ return [
197
+ {
198
+ ...item.next,
199
+ startAngle: interpolate(item.prev.startAngle, item.next.startAngle, animationElapsedTime),
200
+ endAngle: interpolate(item.prev.endAngle, item.next.endAngle, animationElapsedTime),
201
+ },
202
+ ];
203
+ }
204
+ // added
205
+ return [
206
+ {
207
+ ...item.next,
208
+ endAngle: interpolate(item.next.startAngle, item.next.endAngle, animationElapsedTime),
209
+ },
210
+ ];
211
+ });
212
+ };
213
+
214
+ // Background sectors (recharts' RadialBarWithState.renderBackground): one
215
+ // `.recharts-radial-bar-background-sector` per data row that has a computed
216
+ // `background` geometry, rendered in a ZIndexLayer (default barBackground = -50,
217
+ // overridable via a `zIndex` on the background prop). A function/object-form
218
+ // `background` is honored via the sector's `option`.
219
+ function RadialBarBackground(props: {
220
+ sectors: ReadonlyArray<RadialBarDataItem>;
221
+ background: boolean | (SectorProps & ZIndexable);
222
+ cornerRadius: string | number | undefined;
223
+ }): JSX.Element {
224
+ const backgroundFromProps = (): SectorProps | undefined =>
225
+ typeof props.background === "object" && props.background != null ? props.background : undefined;
226
+ // SVG presentation props from the background prop, minus `class` (composed below).
227
+ const backgroundProps = (): Record<string, unknown> => {
228
+ const all = svgPropertiesNoEventsFromUnknown(props.background) ?? {};
229
+ const { class: _bgClass, ...rest } = all;
230
+ return rest;
231
+ };
232
+ const backgroundClass = (): string | undefined => {
233
+ const all = svgPropertiesNoEventsFromUnknown(props.background);
234
+ return typeof all?.class === "string" ? all.class : undefined;
235
+ };
236
+
237
+ // Plain objects of DATA (not JSX) per row that carries a background geometry; the
238
+ // <For> below renders them so the ZIndexLayer Portal subtree stays stable.
239
+ const rows = createMemo<
240
+ ReadonlyArray<RadialBarSectorProps & { option: SectorProps | undefined }>
241
+ >(() =>
242
+ props.sectors.flatMap((entry, i) => {
243
+ const bg = entry.background;
244
+ if (!bg) {
245
+ return [];
246
+ }
247
+ const { value: _value, background: _bg, ...rest } = entry;
248
+ return [
249
+ {
250
+ ...rest,
251
+ fill: "#eee",
252
+ ...bg,
253
+ ...backgroundProps(),
254
+ cornerRadius: parseCornerRadius(props.cornerRadius),
255
+ index: i,
256
+ option: backgroundFromProps(),
257
+ isActive: false,
258
+ class: ["recharts-radial-bar-background-sector", backgroundClass()]
259
+ .filter((c): c is string => typeof c === "string")
260
+ .join(" "),
261
+ },
262
+ ];
263
+ }),
264
+ );
265
+
266
+ return (
267
+ <Show when={rows().length > 0}>
268
+ <ZIndexLayer zIndex={getZIndexFromUnknown(props.background, DefaultZIndexes.barBackground)}>
269
+ <Layer>
270
+ <For each={rows()}>{(row) => <RadialBarSector {...row} />}</For>
271
+ </Layer>
272
+ </ZIndexLayer>
273
+ </Show>
274
+ );
275
+ }
276
+
277
+ // recharts calls truncateByDomain with a @ts-expect-error (the domain can be
278
+ // categorical and the stack tuple isn't a full SeriesPoint); the port mirrors
279
+ // truncateByDomain's clamping inline on the narrowed two-number domain and passes
280
+ // the tuple through untouched otherwise (truncateByDomain does the same).
281
+ function truncateStackedValue(
282
+ stackedValue: { 0: number; 1: number },
283
+ domain: ReadonlyArray<unknown> | null,
284
+ ): ReadonlyArray<unknown> {
285
+ const result: [number, number] = [stackedValue[0], stackedValue[1]];
286
+ if (domain == null || domain.length !== 2 || !isNumber(domain[0]) || !isNumber(domain[1])) {
287
+ return result;
288
+ }
289
+ const minValue = Math.min(domain[0], domain[1]);
290
+ const maxValue = Math.max(domain[0], domain[1]);
291
+ if (!isNumber(result[0]) || result[0] < minValue) {
292
+ result[0] = minValue;
293
+ }
294
+ if (!isNumber(result[1]) || result[1] > maxValue) {
295
+ result[1] = maxValue;
296
+ }
297
+ if (result[0] > maxValue) {
298
+ result[0] = maxValue;
299
+ }
300
+ if (result[1] < minValue) {
301
+ result[1] = minValue;
302
+ }
303
+ return result;
304
+ }
305
+
306
+ export function computeRadialBarDataItems({
307
+ displayedData,
308
+ dataKey,
309
+ baseValue,
310
+ layout,
311
+ radiusAxis,
312
+ radiusAxisTicks,
313
+ bandSize,
314
+ pos,
315
+ angleAxis,
316
+ angleAxisTicks,
317
+ minPointSize,
318
+ cx,
319
+ cy,
320
+ startAngle: rootStartAngle,
321
+ endAngle: rootEndAngle,
322
+ cells,
323
+ stackedData,
324
+ stackedDomain,
325
+ dataStartIndex,
326
+ }: {
327
+ displayedData: ChartData;
328
+ /** This item's d3 stack series when it participates in a stackId group. */
329
+ stackedData: StackSeries | undefined;
330
+ dataStartIndex: number;
331
+ stackedDomain: ReadonlyArray<unknown> | null;
332
+ /** Per-sector <Cell> presentation props, indexed by data position. */
333
+ cells?: ReadonlyArray<CellProps> | undefined;
334
+ dataKey: DataKey<unknown> | undefined;
335
+ // recharts types this `number | unknown` (== `unknown`); the base value can be a
336
+ // number or a categorical value depending on the axis.
337
+ baseValue: unknown;
338
+ layout: LayoutType;
339
+ radiusAxis: BaseAxisWithScale;
340
+ radiusAxisTicks: ReadonlyArray<TickItem> | undefined;
341
+ bandSize: number;
342
+ pos: BarPositionPosition;
343
+ angleAxis: BaseAxisWithScale;
344
+ minPointSize: number;
345
+ cx: number;
346
+ cy: number;
347
+ angleAxisTicks: ReadonlyArray<TickItem> | undefined;
348
+ startAngle: number;
349
+ endAngle: number;
350
+ }): ReadonlyArray<RadialBarDataItem> {
351
+ if (angleAxisTicks == null || radiusAxisTicks == null) {
352
+ return [];
353
+ }
354
+ const angleTicks = angleAxisTicks;
355
+ const radiusTicks = radiusAxisTicks;
356
+
357
+ return displayedData.map((entry: unknown, index: number): RadialBarDataItem => {
358
+ const stackedValue = stackedData?.[dataStartIndex + index];
359
+ const raw: unknown = getValueByDataKey(entry, dataKey);
360
+ const value: ReadonlyArray<unknown> =
361
+ stackedValue != null
362
+ ? truncateStackedValue(stackedValue, stackedDomain)
363
+ : Array.isArray(raw)
364
+ ? raw
365
+ : [baseValue, raw];
366
+
367
+ let innerRadius: number | undefined;
368
+ let outerRadius: number | undefined;
369
+ let startAngle: number | undefined;
370
+ let endAngle: number | undefined;
371
+ let background: SectorProps | undefined;
372
+
373
+ if (layout === "radial") {
374
+ startAngle = angleAxis.scale.map(value[0]) ?? rootStartAngle;
375
+ endAngle = angleAxis.scale.map(value[1]) ?? rootEndAngle;
376
+ innerRadius =
377
+ getCateCoordinateOfBar({
378
+ axis: radiusAxis,
379
+ ticks: radiusTicks,
380
+ bandSize,
381
+ offset: pos.offset,
382
+ entry,
383
+ index,
384
+ }) ?? undefined;
385
+ if (innerRadius != null && endAngle != null && startAngle != null) {
386
+ outerRadius = innerRadius + pos.size;
387
+ const deltaAngle = endAngle - startAngle;
388
+ if (Math.abs(minPointSize) > 0 && Math.abs(deltaAngle) < Math.abs(minPointSize)) {
389
+ const delta =
390
+ mathSign(deltaAngle || minPointSize) * (Math.abs(minPointSize) - Math.abs(deltaAngle));
391
+ endAngle += delta;
392
+ }
393
+ background = {
394
+ cx,
395
+ cy,
396
+ innerRadius,
397
+ outerRadius,
398
+ startAngle: rootStartAngle,
399
+ endAngle: rootEndAngle,
400
+ };
401
+ }
402
+ } else {
403
+ innerRadius = radiusAxis.scale.map(value[0]);
404
+ outerRadius = radiusAxis.scale.map(value[1]);
405
+ startAngle =
406
+ getCateCoordinateOfBar({
407
+ axis: angleAxis,
408
+ ticks: angleTicks,
409
+ bandSize,
410
+ offset: pos.offset,
411
+ entry,
412
+ index,
413
+ }) ?? undefined;
414
+ if (innerRadius != null && outerRadius != null && startAngle != null) {
415
+ endAngle = startAngle + pos.size;
416
+ const deltaRadius = outerRadius - innerRadius;
417
+ if (Math.abs(minPointSize) > 0 && Math.abs(deltaRadius) < Math.abs(minPointSize)) {
418
+ const delta =
419
+ mathSign(deltaRadius || minPointSize) *
420
+ (Math.abs(minPointSize) - Math.abs(deltaRadius));
421
+ outerRadius += delta;
422
+ }
423
+ }
424
+ }
425
+
426
+ // DEVIATION: recharts spreads `...entry` (the raw data row) into the item to
427
+ // carry arbitrary per-row props (e.g. data.fill) behind a @ts-expect-error.
428
+ // The minimal port drops that raw-data spread, but DOES honor <Cell> children:
429
+ // a cell's fill/stroke/class override the component props (per-row data
430
+ // presentation is still deferred). RadialBarDataItem requires numbers
431
+ // (PolarViewBoxRequired); recharts leaves these possibly-undefined and relies
432
+ // on Sector's `?? 0`, so coercing here is behavior-equivalent.
433
+ const cell = cells?.[index];
434
+ const cellClass = typeof cell?.class === "string" ? cell.class : undefined;
435
+ const rowFields =
436
+ typeof entry === "object" && entry != null && !Array.isArray(entry) ? entry : {};
437
+ return {
438
+ ...rowFields,
439
+ ...(background != null ? { background } : {}),
440
+ ...(cell != null ? { fill: cell.fill, stroke: cell.stroke, class: cellClass } : {}),
441
+ payload: entry,
442
+ // recharts: a stacked item reports the [start, end] tuple, a plain one the value.
443
+ value: stackedValue != null ? value : value[1],
444
+ cx,
445
+ cy,
446
+ innerRadius: innerRadius ?? 0,
447
+ outerRadius: outerRadius ?? 0,
448
+ startAngle: startAngle ?? 0,
449
+ endAngle: endAngle ?? 0,
450
+ // Required by PolarViewBoxRequired; recharts gets it via the `any` data
451
+ // spread. Sector ignores it (path uses start/end angles), so false is inert.
452
+ clockWise: false,
453
+ };
454
+ });
455
+ }
456
+
457
+ export const radialBarDefaultProps = {
458
+ angleAxisId: 0,
459
+ radiusAxisId: 0,
460
+ cornerRadius: 0,
461
+ cornerIsExternal: false,
462
+ forceCornerRadius: false,
463
+ hide: false,
464
+ isAnimationActive: "auto",
465
+ animationBegin: 0,
466
+ animationDuration: 1500,
467
+ animationEasing: "ease",
468
+ animationInterpolateFn: defaultRadialBarAnimateItems,
469
+ animationMatchBy: matchAppend,
470
+ legendType: "rect",
471
+ minPointSize: 0,
472
+ label: false,
473
+ zIndex: DefaultZIndexes.bar,
474
+ } as const satisfies Partial<RadialBarProps>;
475
+
476
+ export function RadialBar<DataPointType = Record<string, unknown>, DataValueType = unknown>(
477
+ props: RadialBarProps<DataPointType, DataValueType>,
478
+ ): JSX.Element {
479
+ const store = useAppStore();
480
+ const merged = merge(radialBarDefaultProps, props);
481
+ const id = useUniqueId("recharts-radial-bar", props.id);
482
+
483
+ const settings = (): RadialBarSettings => ({
484
+ id,
485
+ type: "radialBar",
486
+ data: undefined,
487
+ dataKey: merged.dataKey,
488
+ hide: merged.hide,
489
+ angleAxisId: merged.angleAxisId,
490
+ radiusAxisId: merged.radiusAxisId,
491
+ stackId: merged.stackId == null ? undefined : String(merged.stackId),
492
+ barSize: merged.barSize,
493
+ minPointSize: merged.minPointSize,
494
+ maxBarSize: merged.maxBarSize,
495
+ });
496
+
497
+ let prev: RadialBarSettings | null = null;
498
+
499
+ createEffect(
500
+ (): RadialBarSettings => settings(),
501
+ (s) => {
502
+ if (store == null) {
503
+ return;
504
+ }
505
+ if (prev === null) {
506
+ store.actions.graphicalItems.addPolarGraphicalItem(s);
507
+ } else if (prev !== s) {
508
+ store.actions.graphicalItems.replacePolarGraphicalItem({ prev, next: s });
509
+ }
510
+ prev = s;
511
+ },
512
+ );
513
+
514
+ unregisterOnCleanup(() => {
515
+ if (prev && store != null) {
516
+ store.actions.graphicalItems.removePolarGraphicalItem(prev);
517
+ prev = null;
518
+ }
519
+ });
520
+
521
+ // Per-sector <Cell> overrides (collected from children, in data order).
522
+ const cells = collectCells(() => props.children);
523
+ const sectors = useAppSelector((state) =>
524
+ selectRadialBarSectors(state, merged.radiusAxisId, merged.angleAxisId, settings(), cells()),
525
+ );
526
+
527
+ const visibleSectors = (): ReadonlyArray<RadialBarDataItem> | null => {
528
+ const s = sectors();
529
+ return !merged.hide && s != null && s.length > 0 ? s : null;
530
+ };
531
+
532
+ const cornerRadius = (): number | undefined =>
533
+ typeof merged.cornerRadius === "string"
534
+ ? parseInt(merged.cornerRadius, 10)
535
+ : merged.cornerRadius;
536
+
537
+ // recharts uses "recharts-area" as the radial-bar layer class (a quirk).
538
+ const layerClass = (): string =>
539
+ ["recharts-area", merged.class].filter((c): c is string => Boolean(c)).join(" ");
540
+
541
+ // Tooltip entry: the sectors themselves are the per-item data (the searcher
542
+ // resolves the value via dataKey). NOTE: the minimal port drops the raw-data
543
+ // spread, so per-sector value resolution by dataKey is limited until that lands.
544
+ const tooltipConfig = createMemo<TooltipPayloadConfiguration>(() => ({
545
+ dataDefinedOnItem: sectors(),
546
+ getPosition: () => undefined,
547
+ settings: {
548
+ graphicalItemId: id,
549
+ stroke: merged.stroke,
550
+ strokeWidth: merged.strokeWidth,
551
+ fill: merged.fill,
552
+ nameKey: undefined,
553
+ dataKey: merged.dataKey,
554
+ name: getTooltipNameProp(merged.name, merged.dataKey),
555
+ hide: merged.hide,
556
+ type: merged.tooltipType,
557
+ color: merged.fill,
558
+ unit: "",
559
+ formatter: merged.formatter,
560
+ },
561
+ }));
562
+
563
+ // One legend entry per data row (recharts' selectRadialBarLegendPayload) —
564
+ // value/color come from each row's `name`/`fill`.
565
+ const legendPayload = useAppSelector((state) =>
566
+ selectRadialBarLegendPayload(state, merged.legendType),
567
+ );
568
+
569
+ const polarLayout = usePolarChartLayout();
570
+ // Holds the latest visible sectors frame so a re-animation (data change) tweens
571
+ // from where the sectors currently are. Managed by AnimatedItems via
572
+ // useAnimationStartSnapshot.
573
+ const previousSectorsRef: MutableRef<ReadonlyArray<RadialBarDataItem> | null | undefined> = {
574
+ current: null,
575
+ };
576
+ // Labels are hidden while the sectors animate (recharts' showLabels={!isAnimating}).
577
+ // ownedWrite: handleAnimationEnd also fires from the animation effect cleanup when a
578
+ // mid-animation chart is disposed (route/soft navigation) — a legal teardown write.
579
+ const [showLabels, setShowLabels] = createSignal(true, { ownedWrite: true });
580
+ const handleAnimationStart = (): void => {
581
+ props.onAnimationStart?.();
582
+ setShowLabels(false);
583
+ };
584
+ const handleAnimationEnd = (): void => {
585
+ props.onAnimationEnd?.();
586
+ setShowLabels(true);
587
+ };
588
+
589
+ // User pointer handlers are forwarded to each sector's wrapping <Layer>: the
590
+ // mouse handlers wrap into the tooltip-item dispatch (called props-first), and
591
+ // the touch handlers are plain per-sector callbacks. mouseenter does NOT bubble,
592
+ // so the handler must sit on the same element the pointer enters — here the g.
593
+ // Getter args: the hooks read handler/dataKey at event time (fresh, never stale).
594
+ const onItemEnter = useMouseEnterItemDispatch<RadialBarDataItem>(
595
+ () => props.onMouseEnter,
596
+ () => merged.dataKey,
597
+ id,
598
+ );
599
+ const onItemLeave = useMouseLeaveItemDispatch<RadialBarDataItem>(() => props.onMouseLeave);
600
+ const onItemClick = useMouseClickItemDispatch<RadialBarDataItem>(
601
+ () => props.onClick,
602
+ () => merged.dataKey,
603
+ id,
604
+ );
605
+
606
+ // Plain props-first pointer/touch callbacks (no tooltip dispatch — only
607
+ // enter/leave/click drive the active tooltip). Each binds (entry, index).
608
+ const onItemMouse =
609
+ (handler: ((d: RadialBarDataItem, i: number, e: MouseEvent) => void) | undefined) =>
610
+ (entry: RadialBarDataItem, index: number) =>
611
+ (event: MouseEvent): void => {
612
+ handler?.(entry, index, event);
613
+ };
614
+ const onItemMouseDown = onItemMouse(props.onMouseDown);
615
+ const onItemMouseUp = onItemMouse(props.onMouseUp);
616
+ const onItemMouseMove = onItemMouse(props.onMouseMove);
617
+ const onItemMouseOver = onItemMouse(props.onMouseOver);
618
+ const onItemMouseOut = onItemMouse(props.onMouseOut);
619
+
620
+ const onItemTouchStart =
621
+ (entry: RadialBarDataItem, index: number) =>
622
+ (event: TouchEvent): void => {
623
+ props.onTouchStart?.(entry, index, event);
624
+ };
625
+ const onItemTouchMove =
626
+ (entry: RadialBarDataItem, index: number) =>
627
+ (event: TouchEvent): void => {
628
+ props.onTouchMove?.(entry, index, event);
629
+ };
630
+ const onItemTouchEnd =
631
+ (entry: RadialBarDataItem, index: number) =>
632
+ (event: TouchEvent): void => {
633
+ props.onTouchEnd?.(entry, index, event);
634
+ };
635
+
636
+ // Active-sector tracking drives `activeShape` (the hovered sector renders with
637
+ // the activeShape option instead of the regular shape). Matches Pie's pattern.
638
+ const activeIndex = useAppSelector(selectActiveTooltipIndex);
639
+ const activeDataKey = useAppSelector(selectActiveTooltipDataKey);
640
+ const activeGraphicalItemId = useAppSelector(selectActiveTooltipGraphicalItemId);
641
+ const isSectorActive = (index: number): boolean =>
642
+ String(index) === activeIndex() &&
643
+ (activeDataKey() == null || merged.dataKey === activeDataKey()) &&
644
+ (activeGraphicalItemId() == null || activeGraphicalItemId() === id);
645
+ // recharts: `isActive = Boolean(activeShape && activeIndex === String(i))` — the
646
+ // active-shape wrapper (`.recharts-active-shape`) is gated on `activeShape` being
647
+ // truthy, so a falsy `activeShape={false}` never marks a sector active.
648
+ const isSectorActiveShape = (index: number): boolean =>
649
+ Boolean(merged.activeShape) && isSectorActive(index);
650
+ const sectorOption = (index: number): RadialBarProps["shape"] =>
651
+ isSectorActive(index) && merged.activeShape != null ? merged.activeShape : merged.shape;
652
+
653
+ return (
654
+ <>
655
+ <SetTooltipEntrySettings tooltipEntrySettings={tooltipConfig()} />
656
+ <SetLegendPayload id={id} legendPayload={legendPayload() ?? []} />
657
+ <Show when={visibleSectors()}>
658
+ {(secs) => (
659
+ // Wrapped in <ZIndexLayer> (default 300) so a `zIndex` prop relayers the
660
+ // whole radial-bar item into its portal — recharts wraps the entire
661
+ // `.recharts-area` Layer in ZIndexLayer. The background keeps its own
662
+ // nested ZIndexLayer (barBackground = -50), re-portaling below the bars.
663
+ // The stable `.recharts-area` Layer must be the ZIndexLayer's SINGLE DOM
664
+ // child: a Portal whose mount receives multiple dynamic siblings (the
665
+ // background/sectors/labels) directly APPENDS them instead of reconciling
666
+ // (frames accumulate), so — like Pie's `.recharts-pie` — one stable <g>
667
+ // wraps everything (this is also exactly recharts' `.recharts-area` wrap).
668
+ <ZIndexLayer zIndex={merged.zIndex}>
669
+ <Layer class={layerClass()}>
670
+ <PolarLabelListContextProvider
671
+ value={() =>
672
+ showLabels()
673
+ ? secs().map(
674
+ (sector): PolarLabelListEntry => ({
675
+ value: sector.value,
676
+ payload: sector.payload,
677
+ parentViewBox: undefined,
678
+ fill: typeof sector.fill === "string" ? sector.fill : undefined,
679
+ viewBox: {
680
+ cx: sector.cx,
681
+ cy: sector.cy,
682
+ innerRadius: sector.innerRadius,
683
+ outerRadius: sector.outerRadius,
684
+ startAngle: sector.startAngle,
685
+ endAngle: sector.endAngle,
686
+ clockWise: false,
687
+ },
688
+ }),
689
+ )
690
+ : undefined
691
+ }
692
+ >
693
+ <Show when={merged.background}>
694
+ {(bg) => (
695
+ <RadialBarBackground
696
+ sectors={secs()}
697
+ background={bg()}
698
+ cornerRadius={merged.cornerRadius}
699
+ />
700
+ )}
701
+ </Show>
702
+ {/* Sector enter/update animation via the new v3.9 engine: matched sectors
703
+ tween start/end angle from prev to next, added sectors sweep endAngle
704
+ from startAngle to final. isAnimationActive=false → t=1 → final sectors
705
+ → byte-identical to the static render. polarLayout is read untracked for
706
+ the AnimatedItems layout prop (mirrors Pie): the outer Show already gates
707
+ on visible sectors, so the layout is always defined here. */}
708
+ <AnimatedItems
709
+ animationInput={secs()}
710
+ animationIdPrefix="recharts-radialbar-"
711
+ items={secs()}
712
+ previousItemsRef={previousSectorsRef}
713
+ isAnimationActive={merged.isAnimationActive}
714
+ animationBegin={merged.animationBegin}
715
+ animationDuration={merged.animationDuration}
716
+ animationEasing={merged.animationEasing}
717
+ onAnimationStart={handleAnimationStart}
718
+ onAnimationEnd={handleAnimationEnd}
719
+ animationInterpolateFn={merged.animationInterpolateFn}
720
+ animationMatchBy={merged.animationMatchBy}
721
+ layout={untrack(() => polarLayout()) ?? "centric"}
722
+ >
723
+ {(frame, animationElapsedTime, isEntrance) => (
724
+ <Layer class="recharts-radial-bar-sectors">
725
+ <For each={frame}>
726
+ {(entry, i) => (
727
+ <RadialBarSector
728
+ {...entry}
729
+ index={i()}
730
+ isActive={isSectorActiveShape(i())}
731
+ option={sectorOption(i())}
732
+ animationElapsedTime={animationElapsedTime}
733
+ isAnimating={!showLabels() || animationElapsedTime < 1}
734
+ isEntrance={isEntrance}
735
+ class={`recharts-radial-bar-sector ${entry.class ?? ""}`}
736
+ fill={entry.fill ?? merged.fill}
737
+ stroke={entry.stroke ?? merged.stroke}
738
+ strokeWidth={entry.strokeWidth ?? merged.strokeWidth}
739
+ cornerRadius={cornerRadius()}
740
+ forceCornerRadius={merged.forceCornerRadius}
741
+ cornerIsExternal={merged.cornerIsExternal}
742
+ onMouseEnter={onItemEnter(entry, i())}
743
+ onMouseLeave={onItemLeave(entry, i())}
744
+ onClick={onItemClick(entry, i())}
745
+ onMouseDown={onItemMouseDown(entry, i())}
746
+ onMouseUp={onItemMouseUp(entry, i())}
747
+ onMouseMove={onItemMouseMove(entry, i())}
748
+ onMouseOver={onItemMouseOver(entry, i())}
749
+ onMouseOut={onItemMouseOut(entry, i())}
750
+ onTouchStart={onItemTouchStart(entry, i())}
751
+ onTouchMove={onItemTouchMove(entry, i())}
752
+ onTouchEnd={onItemTouchEnd(entry, i())}
753
+ />
754
+ )}
755
+ </For>
756
+ </Layer>
757
+ )}
758
+ </AnimatedItems>
759
+ <LabelListFromLabelProp label={merged.label} />
760
+ </PolarLabelListContextProvider>
761
+ </Layer>
762
+ </ZIndexLayer>
763
+ )}
764
+ </Show>
765
+ </>
766
+ );
767
+ }