@solidports/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 (306) hide show
  1. package/LICENSE +22 -0
  2. package/NOTICE +19 -0
  3. package/README.md +102 -0
  4. package/dist/dev.js +28564 -0
  5. package/dist/index.d.ts +7859 -0
  6. package/dist/index.js +28546 -0
  7. package/package.json +98 -0
  8. package/src/animation/AnimatedItems.tsx +183 -0
  9. package/src/animation/AnimationController.ts +33 -0
  10. package/src/animation/AnimationControllerImpl.ts +36 -0
  11. package/src/animation/AnimationHandle.ts +307 -0
  12. package/src/animation/CSSTransitionAnimate.tsx +170 -0
  13. package/src/animation/JavascriptAnimate.tsx +119 -0
  14. package/src/animation/easing.ts +221 -0
  15. package/src/animation/matchBy.ts +164 -0
  16. package/src/animation/timeoutController.ts +70 -0
  17. package/src/animation/useAnimationController.tsx +34 -0
  18. package/src/animation/useAnimationStartSnapshot.ts +118 -0
  19. package/src/animation/util.ts +41 -0
  20. package/src/cartesian/Area.tsx +915 -0
  21. package/src/cartesian/AreaRevealShape.tsx +190 -0
  22. package/src/cartesian/Bar.tsx +1369 -0
  23. package/src/cartesian/BarStack.tsx +152 -0
  24. package/src/cartesian/Brush.tsx +951 -0
  25. package/src/cartesian/CartesianAxis.tsx +722 -0
  26. package/src/cartesian/CartesianGrid.tsx +711 -0
  27. package/src/cartesian/ErrorBar.tsx +361 -0
  28. package/src/cartesian/Funnel.tsx +803 -0
  29. package/src/cartesian/GraphicalItemClipPath.tsx +67 -0
  30. package/src/cartesian/Line.tsx +863 -0
  31. package/src/cartesian/LineDrawShape.tsx +89 -0
  32. package/src/cartesian/ReferenceArea.tsx +331 -0
  33. package/src/cartesian/ReferenceDot.tsx +304 -0
  34. package/src/cartesian/ReferenceLine.tsx +474 -0
  35. package/src/cartesian/Scatter.tsx +888 -0
  36. package/src/cartesian/XAxis.tsx +433 -0
  37. package/src/cartesian/YAxis.tsx +443 -0
  38. package/src/cartesian/ZAxis.tsx +155 -0
  39. package/src/cartesian/cartesianPositionToCSSTranslate.tsx +29 -0
  40. package/src/cartesian/cartesianViewBoxToTrapezoid.tsx +21 -0
  41. package/src/cartesian/getCartesianPosition.tsx +267 -0
  42. package/src/cartesian/getEquidistantTicks.ts +144 -0
  43. package/src/cartesian/getTicks.ts +225 -0
  44. package/src/cartesian/isOutsidePosition.ts +15 -0
  45. package/src/cartesian/useAnimatedLineLength.ts +54 -0
  46. package/src/chart/AreaChart.tsx +29 -0
  47. package/src/chart/BarChart.tsx +29 -0
  48. package/src/chart/CartesianChart.tsx +131 -0
  49. package/src/chart/CategoricalChart.tsx +94 -0
  50. package/src/chart/ComposedChart.tsx +29 -0
  51. package/src/chart/FunnelChart.tsx +29 -0
  52. package/src/chart/LineChart.tsx +29 -0
  53. package/src/chart/PieChart.tsx +50 -0
  54. package/src/chart/PolarChart.tsx +164 -0
  55. package/src/chart/RadarChart.tsx +70 -0
  56. package/src/chart/RadialBarChart.tsx +46 -0
  57. package/src/chart/RechartsWrapper.tsx +551 -0
  58. package/src/chart/Sankey.tsx +1534 -0
  59. package/src/chart/ScatterChart.tsx +29 -0
  60. package/src/chart/SunburstChart.tsx +504 -0
  61. package/src/chart/Treemap.tsx +1223 -0
  62. package/src/chart/createInitialRootProps.ts +24 -0
  63. package/src/chart/types.ts +53 -0
  64. package/src/component/ActivePoints.tsx +144 -0
  65. package/src/component/Cell.tsx +37 -0
  66. package/src/component/Cursor.tsx +185 -0
  67. package/src/component/Customized.tsx +50 -0
  68. package/src/component/DefaultLegendContent.tsx +348 -0
  69. package/src/component/DefaultTooltipContent.tsx +224 -0
  70. package/src/component/Dots.tsx +157 -0
  71. package/src/component/Label.tsx +636 -0
  72. package/src/component/LabelList.tsx +375 -0
  73. package/src/component/Legend.tsx +512 -0
  74. package/src/component/ResponsiveContainer.tsx +348 -0
  75. package/src/component/Text.tsx +541 -0
  76. package/src/component/Tooltip.tsx +470 -0
  77. package/src/component/TooltipBoundingBox.tsx +146 -0
  78. package/src/component/responsiveContainerUtils.ts +134 -0
  79. package/src/container/ClipPathProvider.tsx +51 -0
  80. package/src/container/Layer.tsx +38 -0
  81. package/src/container/RootSurface.tsx +120 -0
  82. package/src/container/Surface.tsx +61 -0
  83. package/src/context/CellsContext.tsx +54 -0
  84. package/src/context/ErrorBarContext.tsx +146 -0
  85. package/src/context/GraphicalItemChildrenScope.tsx +18 -0
  86. package/src/context/PanoramaContext.tsx +9 -0
  87. package/src/context/RegisterGraphicalItemId.tsx +30 -0
  88. package/src/context/accessibilityContext.tsx +6 -0
  89. package/src/context/brushUpdateContext.tsx +9 -0
  90. package/src/context/chartDataContext.tsx +97 -0
  91. package/src/context/chartLayoutContext.tsx +201 -0
  92. package/src/context/legendPayloadContext.tsx +20 -0
  93. package/src/context/legendPortalContext.tsx +12 -0
  94. package/src/context/tooltipContext.tsx +89 -0
  95. package/src/context/tooltipPortalContext.tsx +12 -0
  96. package/src/context/useTooltipAxis.ts +22 -0
  97. package/src/hooks.ts +476 -0
  98. package/src/index.ts +280 -0
  99. package/src/polar/Pie.tsx +1360 -0
  100. package/src/polar/PolarAngleAxis.tsx +616 -0
  101. package/src/polar/PolarGrid.tsx +312 -0
  102. package/src/polar/PolarRadiusAxis.tsx +547 -0
  103. package/src/polar/Radar.tsx +734 -0
  104. package/src/polar/RadialBar.tsx +917 -0
  105. package/src/polar/defaultPolarAngleAxisProps.tsx +27 -0
  106. package/src/polar/defaultPolarRadiusAxisProps.tsx +25 -0
  107. package/src/shape/Cross.tsx +89 -0
  108. package/src/shape/Curve.tsx +343 -0
  109. package/src/shape/Dot.tsx +70 -0
  110. package/src/shape/Polygon.tsx +195 -0
  111. package/src/shape/Rectangle.tsx +470 -0
  112. package/src/shape/Sector.tsx +347 -0
  113. package/src/shape/Symbols.tsx +139 -0
  114. package/src/shape/Trapezoid.tsx +280 -0
  115. package/src/state/RechartsStateContext.tsx +12 -0
  116. package/src/state/RechartsStateProvider.tsx +87 -0
  117. package/src/state/RechartsStoreContext.tsx +25 -0
  118. package/src/state/RechartsStoreProvider.tsx +35 -0
  119. package/src/state/ReportChartProps.tsx +40 -0
  120. package/src/state/ReportEventSettings.tsx +30 -0
  121. package/src/state/ReportMainChartProps.tsx +61 -0
  122. package/src/state/ReportPolarOptions.tsx +35 -0
  123. package/src/state/SetGraphicalItem.ts +79 -0
  124. package/src/state/SetLegendPayload.ts +134 -0
  125. package/src/state/SetTooltipEntrySettings.tsx +72 -0
  126. package/src/state/actions.ts +464 -0
  127. package/src/state/brushSlice.ts +13 -0
  128. package/src/state/cartesianAxisSlice.ts +141 -0
  129. package/src/state/chartDataSlice.ts +50 -0
  130. package/src/state/chartState.ts +297 -0
  131. package/src/state/errorBarSlice.ts +29 -0
  132. package/src/state/eventSettingsSlice.ts +8 -0
  133. package/src/state/events.ts +76 -0
  134. package/src/state/externalEventsMiddleware.ts +255 -0
  135. package/src/state/graphicalItemsSlice.ts +74 -0
  136. package/src/state/hooks/useChartSelectors.tsx +45 -0
  137. package/src/state/keyboardEventsMiddleware.ts +228 -0
  138. package/src/state/layoutSlice.ts +21 -0
  139. package/src/state/legendSlice.ts +57 -0
  140. package/src/state/mouseEventsMiddleware.ts +185 -0
  141. package/src/state/optionsSlice.ts +47 -0
  142. package/src/state/polarAxisSlice.ts +10 -0
  143. package/src/state/polarOptionsSlice.ts +12 -0
  144. package/src/state/rawData.ts +26 -0
  145. package/src/state/referenceElementsSlice.ts +40 -0
  146. package/src/state/renderedTicksSlice.ts +15 -0
  147. package/src/state/rootPropsSlice.ts +47 -0
  148. package/src/state/selectors/areaSelectors.ts +240 -0
  149. package/src/state/selectors/arrayEqualityCheck.ts +29 -0
  150. package/src/state/selectors/axisSelectors.ts +2157 -0
  151. package/src/state/selectors/barSelectors.ts +310 -0
  152. package/src/state/selectors/barStackSelectors.ts +77 -0
  153. package/src/state/selectors/brushSelectors.ts +33 -0
  154. package/src/state/selectors/chartSelector.ts +185 -0
  155. package/src/state/selectors/combiners/combineActiveLabel.ts +16 -0
  156. package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +95 -0
  157. package/src/state/selectors/combiners/combineAllBarPositions.ts +122 -0
  158. package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +16 -0
  159. package/src/state/selectors/combiners/combineBarPosition.ts +23 -0
  160. package/src/state/selectors/combiners/combineBarSizeList.ts +80 -0
  161. package/src/state/selectors/combiners/combineCheckedDomain.ts +48 -0
  162. package/src/state/selectors/combiners/combineConfiguredScale.ts +111 -0
  163. package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +45 -0
  164. package/src/state/selectors/combiners/combineDisplayedStackedData.ts +50 -0
  165. package/src/state/selectors/combiners/combineInverseScaleFunction.ts +16 -0
  166. package/src/state/selectors/combiners/combineRealScaleType.ts +44 -0
  167. package/src/state/selectors/combiners/combineStackedData.ts +27 -0
  168. package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
  169. package/src/state/selectors/combiners/combineTooltipPayload.ts +205 -0
  170. package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +58 -0
  171. package/src/state/selectors/containerSelectors.ts +12 -0
  172. package/src/state/selectors/dataSelectors.ts +88 -0
  173. package/src/state/selectors/funnelSelectors.ts +75 -0
  174. package/src/state/selectors/graphicalItemSelectors.ts +30 -0
  175. package/src/state/selectors/legendSelectors.ts +29 -0
  176. package/src/state/selectors/lineSelectors.ts +134 -0
  177. package/src/state/selectors/numberDomainEqualityCheck.ts +14 -0
  178. package/src/state/selectors/pickAxisId.ts +5 -0
  179. package/src/state/selectors/pickAxisType.ts +3 -0
  180. package/src/state/selectors/pieSelectors.ts +97 -0
  181. package/src/state/selectors/polarAxisSelectors.ts +201 -0
  182. package/src/state/selectors/polarGridSelectors.ts +28 -0
  183. package/src/state/selectors/polarScaleSelectors.ts +133 -0
  184. package/src/state/selectors/polarSelectors.ts +219 -0
  185. package/src/state/selectors/radarSelectors.ts +191 -0
  186. package/src/state/selectors/radialBarSelectors.ts +435 -0
  187. package/src/state/selectors/rootPropsSelectors.ts +25 -0
  188. package/src/state/selectors/scatterSelectors.ts +96 -0
  189. package/src/state/selectors/selectActivePropsFromChartPointer.ts +26 -0
  190. package/src/state/selectors/selectAllAxes.ts +17 -0
  191. package/src/state/selectors/selectChartOffset.ts +16 -0
  192. package/src/state/selectors/selectChartOffsetInternal.ts +136 -0
  193. package/src/state/selectors/selectLegendArea.ts +20 -0
  194. package/src/state/selectors/selectPlotArea.ts +22 -0
  195. package/src/state/selectors/selectTooltipAxisId.ts +7 -0
  196. package/src/state/selectors/selectTooltipAxisType.ts +32 -0
  197. package/src/state/selectors/selectTooltipEventType.ts +48 -0
  198. package/src/state/selectors/selectTooltipPayloadSearcher.ts +6 -0
  199. package/src/state/selectors/selectTooltipSettings.ts +39 -0
  200. package/src/state/selectors/selectTooltipState.ts +8 -0
  201. package/src/state/selectors/selectors.ts +271 -0
  202. package/src/state/selectors/tooltipSelectors.ts +578 -0
  203. package/src/state/selectors/touchSelectors.ts +31 -0
  204. package/src/state/store.ts +29 -0
  205. package/src/state/storeIdentity.ts +9 -0
  206. package/src/state/teardownWrite.ts +10 -0
  207. package/src/state/tooltipInteraction.ts +23 -0
  208. package/src/state/tooltipSlice.ts +334 -0
  209. package/src/state/touchEventsMiddleware.ts +214 -0
  210. package/src/state/types/AnimationSettings.ts +20 -0
  211. package/src/state/types/AreaSettings.ts +14 -0
  212. package/src/state/types/BarSettings.ts +15 -0
  213. package/src/state/types/LineSettings.ts +9 -0
  214. package/src/state/types/PieSettings.ts +34 -0
  215. package/src/state/types/RadarSettings.ts +5 -0
  216. package/src/state/types/RadialBarSettings.ts +10 -0
  217. package/src/state/types/ScatterSettings.ts +12 -0
  218. package/src/state/types/StackedGraphicalItem.ts +34 -0
  219. package/src/state/useChartState.ts +17 -0
  220. package/src/state/zIndexSlice.ts +39 -0
  221. package/src/synchronisation/syncSelectors.ts +7 -0
  222. package/src/synchronisation/types.ts +44 -0
  223. package/src/synchronisation/useChartSynchronisation.tsx +404 -0
  224. package/src/theme/RechartsTheme.ts +16 -0
  225. package/src/theme/RechartsThemeContext.ts +19 -0
  226. package/src/theme/darkTheme.ts +13 -0
  227. package/src/theme/graphicalItemIdentity.ts +70 -0
  228. package/src/theme/legacyTheme.ts +17 -0
  229. package/src/theme/lightTheme.ts +13 -0
  230. package/src/types.ts +54 -0
  231. package/src/util/ActiveShapeUtils.tsx +162 -0
  232. package/src/util/BarUtils.tsx +62 -0
  233. package/src/util/BarePortal.tsx +50 -0
  234. package/src/util/CamelCaseSVGAttrs.ts +34 -0
  235. package/src/util/CartesianUtils.ts +48 -0
  236. package/src/util/ChartUtils.ts +802 -0
  237. package/src/util/Constants.ts +42 -0
  238. package/src/util/CssPrefixUtils.ts +20 -0
  239. package/src/util/DOMUtils.ts +129 -0
  240. package/src/util/DataUtils.ts +216 -0
  241. package/src/util/Events.ts +16 -0
  242. package/src/util/FunnelUtils.tsx +15 -0
  243. package/src/util/Global.ts +12 -0
  244. package/src/util/IfOverflow.ts +15 -0
  245. package/src/util/LRUCache.ts +41 -0
  246. package/src/util/LogUtils.ts +22 -0
  247. package/src/util/PolarUtils.ts +132 -0
  248. package/src/util/RadialBarUtils.tsx +24 -0
  249. package/src/util/ReactUtils.ts +95 -0
  250. package/src/util/ReduceCSSCalc.ts +187 -0
  251. package/src/util/ScatterUtils.tsx +52 -0
  252. package/src/util/ShapeElementProps.tsx +87 -0
  253. package/src/util/TickUtils.ts +60 -0
  254. package/src/util/XAxisUtils.ts +48 -0
  255. package/src/util/YAxisUtils.ts +48 -0
  256. package/src/util/axisPropsAreEqual.ts +48 -0
  257. package/src/util/createCartesianCharts.tsx +150 -0
  258. package/src/util/createEventProxy.ts +20 -0
  259. package/src/util/createPolarCharts.tsx +112 -0
  260. package/src/util/cursor/getCursorPoints.ts +46 -0
  261. package/src/util/cursor/getCursorRectangle.ts +28 -0
  262. package/src/util/cursor/getRadialCursorPoints.ts +32 -0
  263. package/src/util/excludeEventProps.ts +171 -0
  264. package/src/util/getActiveCoordinate.ts +213 -0
  265. package/src/util/getAxisTypeBasedOnLayout.ts +21 -0
  266. package/src/util/getClassNameFromUnknown.ts +6 -0
  267. package/src/util/getEveryNth.ts +27 -0
  268. package/src/util/getRadiusAndStrokeWidthFromDot.ts +35 -0
  269. package/src/util/getRelativeCoordinate.ts +80 -0
  270. package/src/util/getSliced.ts +13 -0
  271. package/src/util/hoverDedupe.ts +41 -0
  272. package/src/util/isDomainSpecifiedByUser.ts +219 -0
  273. package/src/util/isWellBehavedNumber.ts +7 -0
  274. package/src/util/pathTotalLength.ts +25 -0
  275. package/src/util/payload/getUniqPayload.ts +28 -0
  276. package/src/util/propsAreEqual.ts +121 -0
  277. package/src/util/resolveDefaultProps.ts +161 -0
  278. package/src/util/round.ts +32 -0
  279. package/src/util/scale/CartesianScaleHelper.ts +72 -0
  280. package/src/util/scale/CustomScaleDefinition.ts +81 -0
  281. package/src/util/scale/RechartsScale.ts +130 -0
  282. package/src/util/scale/createCategoricalInverse.ts +72 -0
  283. package/src/util/scale/getNiceTickValues.ts +311 -0
  284. package/src/util/scale/index.ts +2 -0
  285. package/src/util/scale/util/arithmetic.ts +54 -0
  286. package/src/util/solid-1-compat.ts +310 -0
  287. package/src/util/solidJsxCamelAugment.d.ts +84 -0
  288. package/src/util/stacks/getStackSeriesIdentifier.ts +21 -0
  289. package/src/util/stacks/stackTypes.ts +60 -0
  290. package/src/util/structurallyEqual.ts +31 -0
  291. package/src/util/svgPropertiesAndEvents.ts +53 -0
  292. package/src/util/svgPropertiesNoEvents.ts +571 -0
  293. package/src/util/tooltip/translate.ts +171 -0
  294. package/src/util/typedDataKey.ts +48 -0
  295. package/src/util/types.ts +1560 -0
  296. package/src/util/useAnimationId.ts +31 -0
  297. package/src/util/useElementOffset.ts +110 -0
  298. package/src/util/useId.ts +8 -0
  299. package/src/util/usePrefersReducedMotion.ts +48 -0
  300. package/src/util/useReportScale.ts +24 -0
  301. package/src/util/useUniqueId.ts +30 -0
  302. package/src/zIndex/DefaultZIndexes.ts +84 -0
  303. package/src/zIndex/ZIndexLayer.tsx +121 -0
  304. package/src/zIndex/ZIndexPortal.tsx +79 -0
  305. package/src/zIndex/getZIndexFromUnknown.ts +14 -0
  306. package/src/zIndex/zIndexSelectors.ts +48 -0
@@ -0,0 +1,547 @@
1
+ /* eslint-disable import/no-cycle, sort-keys */
2
+ import type { AxisTick } from "../util/types"
3
+ import type { JSX } from '@solidjs/web';
4
+ import { createMemo, Show, useContext, createEffect } from 'solid-js';
5
+ import maxBy from "es-toolkit/compat/maxBy"
6
+ import minBy from "es-toolkit/compat/minBy"
7
+ import { clsx } from "clsx"
8
+ import { cloneJsxNodeWithProps, isJsxNode } from "../util/ReactUtils"
9
+ import { Text } from "../component/Text"
10
+ import { PolarLabelContextProvider, PolarLabelFromLabelProp } from "../component/Label"
11
+ import { Layer } from "../container/Layer"
12
+ import { polarToCartesian } from "../util/PolarUtils"
13
+ import {
14
+ adaptEventsOfChild,
15
+ RenderableAxisProps,
16
+ Coordinate,
17
+ PolarViewBoxRequired,
18
+ PresentationAttributesAdaptChildEvent,
19
+ TickItem,
20
+ AxisDomain,
21
+ ScaleType,
22
+ AxisDomainTypeInput,
23
+ EvaluatedAxisDomainType,
24
+ TickProp,
25
+ BaseTickContentProps,
26
+ } from "../util/types"
27
+ import type { RadiusAxisSettings } from "../state/polarAxisSlice"
28
+ import { useChartStore } from "../state/RechartsStoreContext"
29
+ import { RechartsStateContext } from "../state/RechartsStateContext"
30
+ import { selectPolarAxisScale, selectPolarAxisTicks } from "../state/selectors/polarScaleSelectors"
31
+ import { selectPolarViewBox } from "../state/selectors/polarAxisSelectors"
32
+ import { defaultPolarRadiusAxisProps } from "./defaultPolarRadiusAxisProps"
33
+ import {
34
+ svgPropertiesNoEvents,
35
+ svgPropertiesNoEventsFromUnknown,
36
+ } from "../util/svgPropertiesNoEvents"
37
+ import { RequiresDefaultProps, resolveDefaultProps } from "../util/resolveDefaultProps"
38
+ import { ZIndexable, ZIndexLayer } from "../zIndex/ZIndexLayer"
39
+ import { RechartsScale } from "../util/scale/RechartsScale"
40
+ import { CustomScaleDefinition } from "../util/scale/CustomScaleDefinition"
41
+ import { usePolarChartLayout } from "../context/chartLayoutContext"
42
+ import { getAxisTypeBasedOnLayout } from "../util/getAxisTypeBasedOnLayout"
43
+ import { getClassNameFromUnknown } from "../util/getClassNameFromUnknown"
44
+ import { teardownWrite } from "../state/teardownWrite"
45
+
46
+ type TickOrientation = "left" | "right" | "middle"
47
+
48
+ export interface PolarRadiusAxisProps<DataPointType = unknown, DataValueType = unknown>
49
+ extends
50
+ Omit<
51
+ RenderableAxisProps<DataPointType, DataValueType>,
52
+ "axisLine" | "angle" | "type" | "tickSize" | "domain" | "scale" | "tick"
53
+ >,
54
+ ZIndexable {
55
+ /**
56
+ * Determines how the axis line is drawn. Options:
57
+ * - `true`: the axis line is drawn with default props;
58
+ * - `false`: the axis line is not visible;
59
+ * - `object`: passed as props to SVG `<line>` element representing the axis line.
60
+ *
61
+ * @example <PolarRadiusAxis axisLine={false} />
62
+ * @example <PolarRadiusAxis axisLine={{ stroke: 'red', strokeWidth: 2 }} />
63
+ * @defaultValue true
64
+ */
65
+ axisLine?: boolean | JSX.LineSVGAttributes<SVGLineElement>
66
+ /**
67
+ * The angle of the whole axis: the line, ticks and labels, everything.
68
+ *
69
+ * This is different from other graphical elements where angle usually means
70
+ * the angle of text. Here, it means the angle of everything.
71
+ *
72
+ * @defaultValue 0
73
+ */
74
+ angle?: number
75
+ /**
76
+ * The type of axis.
77
+ *
78
+ * `category`: Treats data as distinct values.
79
+ * Each value is in the same distance from its neighbors, regardless of their actual numeric difference.
80
+ *
81
+ * `number`: Treats data as continuous range.
82
+ * Values that are numerically closer are placed closer together on the axis.
83
+ *
84
+ * `auto`: the type is inferred based on the chart layout.
85
+ *
86
+ * @defaultValue auto
87
+ */
88
+ type?: AxisDomainTypeInput
89
+ /**
90
+ * The orientation of axis text.
91
+ * @defaultValue right
92
+ */
93
+ orientation?: TickOrientation
94
+ /**
95
+ * Specify the domain of axis when the axis is a number axis.
96
+ *
97
+ * If undefined, then the domain is calculated based on the data and dataKeys.
98
+ *
99
+ * The length of domain should be 2, and we will validate the values in domain.
100
+ *
101
+ * Each element in the array can be a number, 'auto', 'dataMin', 'dataMax', a string like 'dataMin - 20', 'dataMax + 100',
102
+ * or a function that accepts a single argument and returns a number.
103
+ *
104
+ * If any element of domain is set to be 'auto', comprehensible scale ticks will be calculated, and the final domain of axis is generated by the ticks.
105
+ * If a function, receives '[dataMin, dataMax]', and must return a computed domain as '[min, max]'.
106
+ *
107
+ * @example <PolarRadiusAxis type="number" domain={['dataMin', 'dataMax']} />
108
+ * @example <PolarRadiusAxis type="number" domain={[0, 'dataMax']} />
109
+ * @example <PolarRadiusAxis type="number" domain={['auto', 'auto']} />
110
+ * @example <PolarRadiusAxis type="number" domain={[0, 'dataMax + 1000']} />
111
+ * @example <PolarRadiusAxis type="number" domain={['dataMin - 100', 'dataMax + 100']} />
112
+ * @example <PolarRadiusAxis type="number" domain={[dataMin => (0 - Math.abs(dataMin)), dataMax => (dataMax * 2)]} />
113
+ * @example <PolarRadiusAxis type="number" domain={([dataMin, dataMax]) => { const absMax = Math.max(Math.abs(dataMin), Math.abs(dataMax)); return [-absMax, absMax]; }} />
114
+ * @example <PolarRadiusAxis type="number" domain={[0, 100]} allowDataOverflow />
115
+ */
116
+ domain?: AxisDomain
117
+ /**
118
+ * Scale function determines how data values are mapped to visual values.
119
+ * In other words, decided the mapping between data domain and coordinate range.
120
+ *
121
+ * If undefined, or 'auto', the scale function is created internally according to the type of axis and data.
122
+ *
123
+ * You can define a custom scale, either as a string shortcut to a d3 scale, or as a complete scale definition object.
124
+ *
125
+ * @defaultValue auto
126
+ * @example <PolarRadiusAxis scale="log" />
127
+ * @example
128
+ * import { scaleLog } from 'd3-scale';
129
+ * const scale = scaleLog().base(Math.E);
130
+ * <PolarRadiusAxis scale={scale} />
131
+ */
132
+ scale?:
133
+ | ScaleType
134
+ | CustomScaleDefinition
135
+ | CustomScaleDefinition<string>
136
+ | CustomScaleDefinition<number>
137
+ | CustomScaleDefinition<Date>
138
+ /**
139
+ * The customized event handler of click on the ticks of this axis
140
+ */
141
+ onClick?: (
142
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract */
143
+ data: any,
144
+ index: number,
145
+ e: MouseEvent & { currentTarget: SVGTextElement },
146
+ ) => void
147
+ /**
148
+ * The customized event handler of mousedown on the ticks of this axis
149
+ */
150
+ onMouseDown?: (
151
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract */
152
+ data: any,
153
+ index: number,
154
+ e: MouseEvent & { currentTarget: SVGTextElement },
155
+ ) => void
156
+ /**
157
+ * The customized event handler of mouseup on the ticks of this axis
158
+ */
159
+ onMouseUp?: (
160
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract */
161
+ data: any,
162
+ index: number,
163
+ e: MouseEvent & { currentTarget: SVGTextElement },
164
+ ) => void
165
+ /**
166
+ * The customized event handler of mousemove on the ticks of this axis
167
+ */
168
+ onMouseMove?: (
169
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract */
170
+ data: any,
171
+ index: number,
172
+ e: MouseEvent & { currentTarget: SVGTextElement },
173
+ ) => void
174
+ /**
175
+ * The customized event handler of mouseover on the ticks of this axis
176
+ */
177
+ onMouseOver?: (
178
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract */
179
+ data: any,
180
+ index: number,
181
+ e: MouseEvent & { currentTarget: SVGTextElement },
182
+ ) => void
183
+ /**
184
+ * The customized event handler of mouseout on the ticks of this axis
185
+ */
186
+ onMouseOut?: (
187
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract */
188
+ data: any,
189
+ index: number,
190
+ e: MouseEvent & { currentTarget: SVGTextElement },
191
+ ) => void
192
+ /**
193
+ * The customized event handler of mouseenter on the ticks of this axis
194
+ */
195
+ onMouseEnter?: (
196
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract */
197
+ data: any,
198
+ index: number,
199
+ e: MouseEvent & { currentTarget: SVGTextElement },
200
+ ) => void
201
+ /**
202
+ * The customized event handler of mouseleave on the ticks of this axis
203
+ */
204
+ onMouseLeave?: (
205
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract */
206
+ data: any,
207
+ index: number,
208
+ e: MouseEvent & { currentTarget: SVGTextElement },
209
+ ) => void
210
+ /**
211
+ * Allow the ticks of axis to be decimals or not.
212
+ *
213
+ * @defaultValue false
214
+ */
215
+ allowDecimals?: boolean
216
+ /**
217
+ * @defaultValue 0
218
+ */
219
+ radiusAxisId?: string | number
220
+ /**
221
+ * Defines how the individual label text is rendered.
222
+ * This controls the settings for individual ticks; on a typical axis, there are multiple ticks, depending on your data.
223
+ *
224
+ * If you want to customize the overall axis label, use the `label` prop instead.
225
+ *
226
+ * Options:
227
+ * - `false`: Do not render any tick labels.
228
+ * - `true`: Render tick labels with default settings.
229
+ * - `object`: An object of props to be merged into the internally calculated tick props.
230
+ * - `Element`: A custom element to be used as the tick label.
231
+ * - `function`: A function that returns an element for custom rendering of tick labels.
232
+ *
233
+ * @defaultValue true
234
+ */
235
+ tick?: TickProp<BaseTickContentProps>
236
+ ticks?: ReadonlyArray<TickItem>
237
+ /**
238
+ * Z-Index of this component and its children. The higher the value,
239
+ * the more on top it will be rendered.
240
+ * Components with higher zIndex will appear in front of components with lower zIndex.
241
+ * If undefined or 0, the content is rendered in the default layer without portals.
242
+ *
243
+ * @since 3.4
244
+ * @defaultValue 500
245
+ * @see {@link https://recharts.github.io/en-US/guide/zIndex/ Z-Index and layers guide}
246
+ */
247
+ zIndex?: number
248
+ }
249
+
250
+ type AxisSvgProps = Omit<
251
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract: tick handlers receive untyped data */
252
+ PresentationAttributesAdaptChildEvent<any, SVGTextElement>,
253
+ "scale" | "type"
254
+ >
255
+
256
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract: untyped axes accept any data */
257
+ export type Props<DataPointType = any, DataValueType = any> = AxisSvgProps &
258
+ PolarRadiusAxisProps<DataPointType, DataValueType>
259
+
260
+ type PropsWithDefaults = RequiresDefaultProps<Props, typeof defaultPolarRadiusAxisProps>
261
+
262
+ type InsideProps = Omit<PropsWithDefaults, "scale"> &
263
+ PolarViewBoxRequired & {
264
+ scale: RechartsScale
265
+ }
266
+
267
+ const AXIS_TYPE = "radiusAxis"
268
+
269
+ function SetRadiusAxisSettings(
270
+ props: Omit<RadiusAxisSettings, "type"> & { type: AxisDomainTypeInput },
271
+ ): null {
272
+ const ctx = useChartStore()
273
+ const stateCtx = useContext(RechartsStateContext)
274
+ const settings = createMemo((): RadiusAxisSettings | undefined => {
275
+ const evaluatedType: EvaluatedAxisDomainType | undefined = getAxisTypeBasedOnLayout(
276
+ usePolarChartLayout(),
277
+ "radiusAxis",
278
+ props.type,
279
+ )
280
+ if (evaluatedType == null) {
281
+ return undefined
282
+ }
283
+ return {
284
+ allowDataOverflow: props.allowDataOverflow,
285
+ allowDecimals: props.allowDecimals,
286
+ allowDuplicatedCategory: props.allowDuplicatedCategory,
287
+ dataKey: props.dataKey,
288
+ domain: props.domain,
289
+ id: props.id,
290
+ includeHidden: props.includeHidden,
291
+ name: props.name,
292
+ reversed: props.reversed,
293
+ scale: props.scale,
294
+ tick: props.tick,
295
+ tickCount: props.tickCount,
296
+ niceTicks: props.niceTicks,
297
+ ticks: props.ticks,
298
+ type: evaluatedType,
299
+ unit: props.unit,
300
+ }
301
+ })
302
+ createEffect(settings, (s) => {
303
+ if (s == null) {
304
+ return
305
+ }
306
+ const id = String(s.id)
307
+ if (stateCtx != null) {
308
+ stateCtx.setState("polarAxes", "radiusAxis", id, { settings: s })
309
+ return () => {
310
+ teardownWrite(() => {
311
+ stateCtx.setState(
312
+ "polarAxes",
313
+ (polar) => {
314
+ delete (polar.radiusAxis as Record<string, unknown>)[id]
315
+ },
316
+ )
317
+ })
318
+ }
319
+ }
320
+
321
+ })
322
+ return null
323
+ }
324
+
325
+ /**
326
+ * Calculate the coordinate of tick
327
+ * @param coordinate The radius of tick
328
+ * @param angle from props
329
+ * @param cx from chart
330
+ * @param cy from chart
331
+ * @return (x, y)
332
+ */
333
+ const getTickValueCoord = (
334
+ { coordinate }: TickItem,
335
+ angle: number,
336
+ cx: number,
337
+ cy: number,
338
+ ): Coordinate => {
339
+ return polarToCartesian(cx, cy, coordinate, angle)
340
+ }
341
+
342
+ const getTickTextAnchor = (orientation: TickOrientation): string => {
343
+ let textAnchor
344
+
345
+ switch (orientation) {
346
+ case "left":
347
+ textAnchor = "end"
348
+ break
349
+ case "right":
350
+ textAnchor = "start"
351
+ break
352
+ default:
353
+ textAnchor = "middle"
354
+ break
355
+ }
356
+
357
+ return textAnchor
358
+ }
359
+
360
+ const getViewBox = (
361
+ angle: number,
362
+ cx: number,
363
+ cy: number,
364
+ ticks: ReadonlyArray<TickItem>,
365
+ ): PolarViewBoxRequired => {
366
+ const maxRadiusTick = maxBy(ticks, (entry: TickItem) => entry.coordinate || 0)
367
+ const minRadiusTick = minBy(ticks, (entry: TickItem) => entry.coordinate || 0)
368
+
369
+ return {
370
+ clockWise: false,
371
+ cx,
372
+ cy,
373
+ endAngle: angle,
374
+ innerRadius: minRadiusTick?.coordinate || 0,
375
+ outerRadius: maxRadiusTick?.coordinate || 0,
376
+ startAngle: angle,
377
+ }
378
+ }
379
+
380
+ function renderAxisLine(props: InsideProps, ticks: ReadonlyArray<TickItem>): JSX.Element {
381
+ const extent: [number, number] = ticks.reduce(
382
+ (result: [number, number], entry: TickItem): [number, number] => [
383
+ Math.min(result[0], entry.coordinate),
384
+ Math.max(result[1], entry.coordinate),
385
+ ],
386
+ [Infinity, -Infinity],
387
+ )
388
+ const point0 = polarToCartesian(props.cx, props.cy, extent[0], props.angle)
389
+ const point1 = polarToCartesian(props.cx, props.cy, extent[1], props.angle)
390
+
391
+ const { ref: _ref, ...baseSvgProps } = svgPropertiesNoEvents(props)
392
+ const axisLineProps = {
393
+ ...baseSvgProps,
394
+ fill: "none",
395
+ ...svgPropertiesNoEvents(props.axisLine),
396
+ x1: point0.x,
397
+ y1: point0.y,
398
+ x2: point1.x,
399
+ y2: point1.y,
400
+ }
401
+
402
+ return <line class="recharts-polar-radius-axis-line" {...axisLineProps} />
403
+ }
404
+
405
+ function renderTickItem(
406
+ option: Props["tick"],
407
+ tickProps: Record<string, unknown>,
408
+ value: string | number,
409
+ ): JSX.Element {
410
+ if (typeof option === "function") {
411
+ return (option as (p: Record<string, unknown>) => JSX.Element)(tickProps)
412
+ }
413
+ if (isJsxNode(option)) {
414
+ return <>{cloneJsxNodeWithProps(option, tickProps) as unknown as JSX.Element}</>
415
+ }
416
+ return (
417
+ <Text {...tickProps} className="recharts-polar-radius-axis-tick-value">
418
+ {value}
419
+ </Text>
420
+ )
421
+ }
422
+
423
+ function renderTicks(props: InsideProps, ticks: ReadonlyArray<TickItem>): JSX.Element {
424
+ const textAnchor = getTickTextAnchor(props.orientation)
425
+ const axisProps = svgPropertiesNoEvents(props)
426
+ const customTickProps = svgPropertiesNoEventsFromUnknown(props.tick)
427
+
428
+ const items = ticks.map((entry, i) => {
429
+ const coord = getTickValueCoord(entry, props.angle, props.cx, props.cy)
430
+ const tickProps = {
431
+ textAnchor,
432
+ transform: `rotate(${90 - props.angle}, ${coord.x}, ${coord.y})`,
433
+ ...axisProps,
434
+ stroke: "none",
435
+ fill: props.stroke,
436
+ ...customTickProps,
437
+ index: i,
438
+ ...coord,
439
+ payload: entry,
440
+ }
441
+
442
+ return (
443
+ <Layer
444
+ class={clsx("recharts-polar-radius-axis-tick", getClassNameFromUnknown(props.tick))}
445
+ {...adaptEventsOfChild(props, entry, i)}
446
+ >
447
+ {renderTickItem(
448
+ props.tick,
449
+ tickProps,
450
+ props.tickFormatter ? props.tickFormatter(entry.value, i) : entry.value,
451
+ )}
452
+ </Layer>
453
+ )
454
+ })
455
+
456
+ return <Layer class="recharts-polar-radius-axis-ticks">{items}</Layer>
457
+ }
458
+
459
+ export function PolarRadiusAxisWrapper(defaultsAndInputs: PropsWithDefaults): JSX.Element {
460
+ const ctx = useChartStore()
461
+ const viewBox = createMemo(() => (ctx ? selectPolarViewBox(ctx.store) : undefined))
462
+ const scale = createMemo(() =>
463
+ ctx
464
+ ? selectPolarAxisScale(ctx.store, "radiusAxis", defaultsAndInputs.radiusAxisId)
465
+ : undefined,
466
+ )
467
+ const ticks = createMemo(() =>
468
+ ctx
469
+ ? selectPolarAxisTicks(ctx.store, "radiusAxis", defaultsAndInputs.radiusAxisId, false)
470
+ : undefined,
471
+ )
472
+
473
+ /* resolved is null until every dep is present; Show + Show.children-as-fn rerenders
474
+ when the memo flips truthy. IIFE-in-JSX would freeze body at first eval. */
475
+ const resolved = createMemo<{ props: InsideProps; ticks: ReadonlyArray<TickItem> } | null>(
476
+ () => {
477
+ const vb = viewBox()
478
+ const t = ticks()
479
+ const s = scale()
480
+ if (vb == null || t == null || t.length === 0 || s == null) {
481
+ return null
482
+ }
483
+ const props: InsideProps = {
484
+ ...defaultsAndInputs,
485
+ scale: s,
486
+ ...vb,
487
+ }
488
+ return { props, ticks: t }
489
+ },
490
+ )
491
+
492
+ return (
493
+ <Show when={resolved()}>
494
+ {(r) => (
495
+ <ZIndexLayer zIndex={r().props.zIndex}>
496
+ <Layer
497
+ class={clsx("recharts-polar-radius-axis", AXIS_TYPE, r().props.className)}
498
+ >
499
+ <Show when={r().props.axisLine}>{renderAxisLine(r().props, r().ticks)}</Show>
500
+ <Show when={r().props.tick}>{renderTicks(r().props, r().ticks)}</Show>
501
+ <PolarLabelContextProvider
502
+ {...getViewBox(r().props.angle, r().props.cx, r().props.cy, r().ticks)}
503
+ >
504
+ <PolarLabelFromLabelProp label={r().props.label} />
505
+ {r().props.children}
506
+ </PolarLabelContextProvider>
507
+ </Layer>
508
+ </ZIndexLayer>
509
+ )}
510
+ </Show>
511
+ )
512
+ }
513
+
514
+ /**
515
+ * @provides PolarLabelContext
516
+ * @consumes PolarViewBoxContext
517
+ */
518
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract: untyped axes accept any data */
519
+ export function PolarRadiusAxis<DataPointType = any, DataValueType = any>(
520
+ outsideProps: Props<DataPointType, DataValueType>,
521
+ ): JSX.Element {
522
+ const props: PropsWithDefaults = resolveDefaultProps(outsideProps, defaultPolarRadiusAxisProps)
523
+ return (
524
+ <>
525
+ <SetRadiusAxisSettings
526
+ domain={props.domain}
527
+ id={props.radiusAxisId}
528
+ scale={props.scale}
529
+ type={props.type}
530
+ dataKey={props.dataKey}
531
+ unit={undefined}
532
+ name={props.name}
533
+ allowDuplicatedCategory={props.allowDuplicatedCategory}
534
+ allowDataOverflow={props.allowDataOverflow}
535
+ reversed={props.reversed}
536
+ includeHidden={props.includeHidden}
537
+ allowDecimals={props.allowDecimals}
538
+ /* passed through unchanged like upstream, whose TickItem prop and AxisTick setting types disagree */
539
+ ticks={props.ticks as unknown as ReadonlyArray<AxisTick> | undefined}
540
+ tickCount={props.tickCount}
541
+ niceTicks={props.niceTicks}
542
+ tick={props.tick as TickProp<unknown>}
543
+ />
544
+ <PolarRadiusAxisWrapper {...props} />
545
+ </>
546
+ )
547
+ }