@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,616 @@
1
+ /* eslint-disable import/no-cycle, sort-keys */
2
+ import type { JSX } from '@solidjs/web';
3
+ import type { NiceTicksAlgorithm } from "../state/cartesianAxisSlice"
4
+ import { createMemo, Show, useContext, createEffect } from 'solid-js';
5
+ import { clsx } from "clsx"
6
+ import { Layer } from "../container/Layer"
7
+ import { Dot } from "../shape/Dot"
8
+ import { Polygon } from "../shape/Polygon"
9
+ import { Text, TextAnchor, TextVerticalAnchor } from "../component/Text"
10
+ import {
11
+ adaptEventsOfChild,
12
+ AxisDomain,
13
+ AxisTick,
14
+ AxisDomainTypeInput,
15
+ BaseTickContentProps,
16
+ DataKey,
17
+ EvaluatedAxisDomainType,
18
+ PresentationAttributesAdaptChildEvent,
19
+ RenderableAxisProps,
20
+ ScaleType,
21
+ TickItem,
22
+ TickProp,
23
+ } from "../util/types"
24
+ import { degreeToRadian, polarToCartesian } from "../util/PolarUtils"
25
+ import { cloneJsxNodeWithProps, isJsxNode } from "../util/ReactUtils"
26
+ import type { AngleAxisSettings } from "../state/polarAxisSlice"
27
+ import { useChartStore } from "../state/RechartsStoreContext"
28
+ import { RechartsStateContext } from "../state/RechartsStateContext"
29
+ import {
30
+ selectPolarAngleAxisTicks,
31
+ selectPolarAxisScale,
32
+ } from "../state/selectors/polarScaleSelectors"
33
+ import { selectAngleAxis, selectPolarViewBox } from "../state/selectors/polarAxisSelectors"
34
+ import { defaultPolarAngleAxisProps } from "./defaultPolarAngleAxisProps"
35
+ import { useIsPanorama } from "../context/PanoramaContext"
36
+ import {
37
+ svgPropertiesNoEvents,
38
+ svgPropertiesNoEventsFromUnknown,
39
+ } from "../util/svgPropertiesNoEvents"
40
+ import { RequiresDefaultProps, resolveDefaultProps } from "../util/resolveDefaultProps"
41
+ import { ZIndexable, ZIndexLayer } from "../zIndex/ZIndexLayer"
42
+ import { RechartsScale } from "../util/scale/RechartsScale"
43
+ import { CustomScaleDefinition } from "../util/scale/CustomScaleDefinition"
44
+ import { usePolarChartLayout } from "../context/chartLayoutContext"
45
+ import { getAxisTypeBasedOnLayout } from "../util/getAxisTypeBasedOnLayout"
46
+ import { getClassNameFromUnknown } from "../util/getClassNameFromUnknown"
47
+ import { teardownWrite } from "../state/teardownWrite"
48
+
49
+ const eps = 1e-5
50
+ const COS_45 = Math.cos(degreeToRadian(45))
51
+
52
+ export interface PolarAngleAxisProps<DataPointType = unknown, DataValueType = unknown>
53
+ extends
54
+ Omit<
55
+ RenderableAxisProps<DataPointType, DataValueType>,
56
+ "axisLine" | "tickCount" | "domain" | "scale" | "tick"
57
+ >,
58
+ ZIndexable {
59
+ /**
60
+ * Controls axis line element. These are be passed as props to SVG `<line>` element representing the axis line.
61
+ * If `true` then the axis line is drawn using props of the PolarAngleAxis component.
62
+ * If `false` then the axis line is not drawn.
63
+ *
64
+ * Also see `axisLineType` prop to change the shape of the axis line.
65
+ *
66
+ * @defaultValue true
67
+ *
68
+ * @example <PolarAngleAxis axisLine={{ stroke: 'red', strokeWidth: 2 }} />
69
+ * @example <PolarAngleAxis axisLine={false} />
70
+ * @example <PolarAngleAxis stroke='red' strokeWidth={2} strokeDasharray={4} />
71
+ */
72
+ axisLine?: boolean | JSX.LineSVGAttributes<SVGLineElement>
73
+ /**
74
+ * @defaultValue false
75
+ */
76
+ allowDecimals?: boolean
77
+ /**
78
+ * Allow the axis has duplicated categories or not when the type of axis is "category".
79
+ * @defaultValue true
80
+ */
81
+ allowDuplicatedCategory?: boolean
82
+ /**
83
+ * @defaultValue 0
84
+ */
85
+ angleAxisId?: string | number
86
+ /**
87
+ * The type of axis line.
88
+ * @defaultValue polygon
89
+ */
90
+ axisLineType?: "polygon" | "circle"
91
+ /**
92
+ * The x-coordinate of center.
93
+ * When used inside a chart context, this prop is calculated based on the chart's dimensions,
94
+ * and this prop is ignored.
95
+ *
96
+ * This is only used when rendered outside a chart context.
97
+ */
98
+ cx?: number
99
+ /**
100
+ * The y-coordinate of center.
101
+ * When used inside a chart context, this prop is calculated based on the chart's dimensions,
102
+ * and this prop is ignored.
103
+ *
104
+ * This is only used when rendered outside a chart context.
105
+ */
106
+ cy?: number
107
+ /**
108
+ * The orientation of axis text.
109
+ * @defaultValue 'outer'
110
+ */
111
+ orientation?: "inner" | "outer"
112
+ /**
113
+ * Specify the domain of axis when the axis is a number axis.
114
+ *
115
+ * If undefined, then the domain is calculated based on the data and dataKeys.
116
+ *
117
+ * The length of domain should be 2, and we will validate the values in domain.
118
+ *
119
+ * Each element in the array can be a number, 'auto', 'dataMin', 'dataMax', a string like 'dataMin - 20', 'dataMax + 100',
120
+ * or a function that accepts a single argument and returns a number.
121
+ *
122
+ * 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.
123
+ * If a function, receives '[dataMin, dataMax]', and must return a computed domain as '[min, max]'.
124
+ *
125
+ * @example <PolarAngleAxis type="number" domain={['dataMin', 'dataMax']} />
126
+ * @example <PolarAngleAxis type="number" domain={[0, 'dataMax']} />
127
+ * @example <PolarAngleAxis type="number" domain={['auto', 'auto']} />
128
+ * @example <PolarAngleAxis type="number" domain={[0, 'dataMax + 1000']} />
129
+ * @example <PolarAngleAxis type="number" domain={['dataMin - 100', 'dataMax + 100']} />
130
+ * @example <PolarAngleAxis type="number" domain={[dataMin => (0 - Math.abs(dataMin)), dataMax => (dataMax * 2)]} />
131
+ * @example <PolarAngleAxis type="number" domain={([dataMin, dataMax]) => { const absMax = Math.max(Math.abs(dataMin), Math.abs(dataMax)); return [-absMax, absMax]; }} />
132
+ * @example <PolarAngleAxis type="number" domain={[0, 100]} allowDataOverflow />
133
+ */
134
+ domain?: AxisDomain
135
+ /**
136
+ * Scale function determines how data values are mapped to visual values.
137
+ * In other words, decided the mapping between data domain and coordinate range.
138
+ *
139
+ * If undefined, or 'auto', the scale function is created internally according to the type of axis and data.
140
+ *
141
+ * You can define a custom scale, either as a string shortcut to a d3 scale, or as a complete scale definition object.
142
+ *
143
+ * @defaultValue auto
144
+ * @example <PolarAngleAxis scale="log" />
145
+ * @example
146
+ * import { scaleLog } from 'd3-scale';
147
+ * const scale = scaleLog().base(Math.E);
148
+ * <PolarAngleAxis scale={scale} />
149
+ */
150
+ scale?:
151
+ | ScaleType
152
+ | CustomScaleDefinition
153
+ | CustomScaleDefinition<string>
154
+ | CustomScaleDefinition<number>
155
+ | CustomScaleDefinition<Date>
156
+ /**
157
+ * The outer radius of circle grid.
158
+ * If set a percentage, the final value is obtained by multiplying the percentage of maxRadius which is calculated by the width, height, cx, cy.
159
+ */
160
+ radius?: number | string
161
+ /**
162
+ * Defines how the individual label text is rendered.
163
+ * This controls the settings for individual ticks; on a typical axis, there are multiple ticks, depending on your data.
164
+ *
165
+ * If you want to customize the overall axis label, use the `label` prop instead.
166
+ *
167
+ * Options:
168
+ * - `false`: Do not render any tick labels.
169
+ * - `true`: Render tick labels with default settings.
170
+ * - `object`: An object of props to be merged into the internally calculated tick props.
171
+ * - `Element`: A custom element to be used as the tick label.
172
+ * - `function`: A function that returns an element for custom rendering of tick labels.
173
+ *
174
+ * @defaultValue true
175
+ */
176
+ tick?: TickProp<BaseTickContentProps>
177
+
178
+ /**
179
+ * The count of axis ticks. Not used if 'type' is 'category'.
180
+ */
181
+ tickCount?: number
182
+ /**
183
+ * Controls how Recharts calculates "nice" tick values for this axis.
184
+ * See {@link NiceTicksAlgorithm} for a full description of each option.
185
+ *
186
+ * @defaultValue 'auto'
187
+ */
188
+ niceTicks?: NiceTicksAlgorithm
189
+ /**
190
+ * The formatter function of ticks.
191
+ */
192
+ tickFormatter?: (value: unknown, index: number) => string
193
+ /**
194
+ * The length of tick line.
195
+ * @defaultValue 8
196
+ */
197
+ tickSize?: number
198
+ /**
199
+ * The array of every tick's value and angle.
200
+ */
201
+ ticks?: ReadonlyArray<TickItem>
202
+ /**
203
+ * The type of axis.
204
+ *
205
+ * `category`: Treats data as distinct values.
206
+ * Each value is in the same distance from its neighbors, regardless of their actual numeric difference.
207
+ *
208
+ * `number`: Treats data as continuous range.
209
+ * Values that are numerically closer are placed closer together on the axis.
210
+ *
211
+ * `auto`: the type is inferred based on the chart layout.
212
+ *
213
+ * @defaultValue auto
214
+ */
215
+ type?: AxisDomainTypeInput
216
+ /**
217
+ * Z-Index of this component and its children. The higher the value,
218
+ * the more on top it will be rendered.
219
+ * Components with higher zIndex will appear in front of components with lower zIndex.
220
+ * If undefined or 0, the content is rendered in the default layer without portals.
221
+ *
222
+ * @since 3.4
223
+ * @defaultValue 500
224
+ * @see {@link https://recharts.github.io/en-US/guide/zIndex/ Z-Index and layers guide}
225
+ */
226
+ zIndex?: number
227
+ /**
228
+ * The customized event handler of click on the ticks of this axis
229
+ */
230
+ onClick?: (data: TickItem, index: number, e: MouseEvent & { currentTarget: SVGTextElement }) => void
231
+ /**
232
+ * The customized event handler of mousedown on the ticks of this axis
233
+ */
234
+ onMouseDown?: (data: TickItem, index: number, e: MouseEvent & { currentTarget: SVGTextElement }) => void
235
+ /**
236
+ * The customized event handler of mouseup on the ticks of this axis
237
+ */
238
+ onMouseUp?: (data: TickItem, index: number, e: MouseEvent & { currentTarget: SVGTextElement }) => void
239
+ /**
240
+ * The customized event handler of mousemove on the ticks of this axis
241
+ */
242
+ onMouseMove?: (data: TickItem, index: number, e: MouseEvent & { currentTarget: SVGTextElement }) => void
243
+ /**
244
+ * The customized event handler of mouseover on the ticks of this axis
245
+ */
246
+ onMouseOver?: (data: TickItem, index: number, e: MouseEvent & { currentTarget: SVGTextElement }) => void
247
+ /**
248
+ * The customized event handler of mouseout on the ticks of this axis
249
+ */
250
+ onMouseOut?: (data: TickItem, index: number, e: MouseEvent & { currentTarget: SVGTextElement }) => void
251
+ /**
252
+ * The customized event handler of mouseenter on the ticks of this axis
253
+ */
254
+ onMouseEnter?: (data: TickItem, index: number, e: MouseEvent & { currentTarget: SVGTextElement }) => void
255
+ /**
256
+ * The customized event handler of mouseleave on the ticks of this axis
257
+ */
258
+ onMouseLeave?: (data: TickItem, index: number, e: MouseEvent & { currentTarget: SVGTextElement }) => void
259
+ }
260
+
261
+ type AxisSvgProps = Omit<
262
+ PresentationAttributesAdaptChildEvent<TickItem, SVGTextElement>,
263
+ "scale" | "type" | "dangerouslySetInnerHTML"
264
+ >
265
+
266
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract: untyped axes accept any data */
267
+ export type Props<DataPointType = any, DataValueType = any> = AxisSvgProps &
268
+ PolarAngleAxisProps<DataPointType, DataValueType>
269
+
270
+ type PropsWithDefaults = RequiresDefaultProps<Props, typeof defaultPolarAngleAxisProps>
271
+
272
+ type InsideProps = Omit<PropsWithDefaults, "scale"> & {
273
+ cx: number
274
+ cy: number
275
+ radius: number
276
+ ticks: ReadonlyArray<TickItem>
277
+ scale: RechartsScale
278
+ }
279
+
280
+ const AXIS_TYPE = "angleAxis"
281
+
282
+ type AngleAxisSettingsReporter = Omit<AngleAxisSettings, "type"> & {
283
+ children: JSX.Element
284
+ type: AxisDomainTypeInput
285
+ }
286
+
287
+ function SetAngleAxisSettings(props: AngleAxisSettingsReporter): JSX.Element {
288
+ const ctx = useChartStore()
289
+ const stateCtx = useContext(RechartsStateContext)
290
+ const settings = createMemo((): AngleAxisSettings | undefined => {
291
+ const evaluatedType: EvaluatedAxisDomainType | undefined = getAxisTypeBasedOnLayout(
292
+ usePolarChartLayout(),
293
+ "angleAxis",
294
+ props.type,
295
+ )
296
+ if (evaluatedType == null) {
297
+ return undefined
298
+ }
299
+ return {
300
+ allowDataOverflow: props.allowDataOverflow,
301
+ allowDecimals: props.allowDecimals,
302
+ allowDuplicatedCategory: props.allowDuplicatedCategory,
303
+ dataKey: props.dataKey,
304
+ domain: props.domain,
305
+ id: props.id,
306
+ includeHidden: props.includeHidden,
307
+ name: props.name,
308
+ reversed: props.reversed,
309
+ scale: props.scale,
310
+ tick: props.tick,
311
+ tickCount: props.tickCount,
312
+ niceTicks: props.niceTicks,
313
+ ticks: props.ticks,
314
+ type: evaluatedType,
315
+ unit: props.unit,
316
+ }
317
+ })
318
+ const synchronizedSettings = createMemo(() =>
319
+ ctx ? selectAngleAxis(ctx.store, settings()?.id) : undefined,
320
+ )
321
+ /* upstream React used `=== ` for reference equality (settings reference flows
322
+ through Redux untouched). Solid's createStore proxy-wraps store values so
323
+ the read object is never `===` the dispatched one. Gate on presence instead;
324
+ Solid's fine-grained reactivity already handles ordering. */
325
+ const settingsAreSynchronized = () => synchronizedSettings() != null
326
+
327
+ createEffect(settings, (s) => {
328
+ if (s == null) {
329
+ return
330
+ }
331
+ const id = String(s.id)
332
+ if (stateCtx != null) {
333
+ stateCtx.setState("polarAxes", "angleAxis", id, { settings: s })
334
+ return () => {
335
+ teardownWrite(() => {
336
+ stateCtx.setState(
337
+ "polarAxes",
338
+ (polar) => {
339
+ delete (polar.angleAxis as Record<string, unknown>)[id]
340
+ },
341
+ )
342
+ })
343
+ }
344
+ }
345
+
346
+ })
347
+
348
+ return <Show when={settingsAreSynchronized()}>{props.children}</Show>
349
+ }
350
+
351
+ /**
352
+ * Calculate the coordinate of line endpoint
353
+ * @param data The data if there are ticks
354
+ * @param props axis settings
355
+ * @return (x1, y1): The point close to text,
356
+ * (x2, y2): The point close to axis
357
+ */
358
+ const getTickLineCoord = (
359
+ data: TickItem,
360
+ props: InsideProps,
361
+ ): {
362
+ x1: number
363
+ y1: number
364
+ x2: number
365
+ y2: number
366
+ } => {
367
+ const tickLineSize = props.tickSize || 8
368
+ const p1 = polarToCartesian(props.cx, props.cy, props.radius, data.coordinate)
369
+ const p2 = polarToCartesian(
370
+ props.cx,
371
+ props.cy,
372
+ props.radius + (props.orientation === "inner" ? -1 : 1) * tickLineSize,
373
+ data.coordinate,
374
+ )
375
+
376
+ return { x1: p1.x, x2: p2.x, y1: p1.y, y2: p2.y }
377
+ }
378
+
379
+ /**
380
+ * Get the text-anchor of each tick
381
+ * @param data Data of ticks
382
+ * @param orientation of the axis ticks
383
+ * @return text-anchor
384
+ */
385
+ const getTickTextAnchor = (data: TickItem, orientation: Props["orientation"]): TextAnchor => {
386
+ const cos = Math.cos(degreeToRadian(-data.coordinate))
387
+
388
+ if (cos > eps) {
389
+ return orientation === "outer" ? "start" : "end"
390
+ }
391
+ if (cos < -eps) {
392
+ return orientation === "outer" ? "end" : "start"
393
+ }
394
+ return "middle"
395
+ }
396
+
397
+ /**
398
+ * Get the text vertical anchor of each tick
399
+ * @param data Data of a tick
400
+ * @return text vertical anchor
401
+ */
402
+ const getTickTextVerticalAnchor = (data: TickItem): TextVerticalAnchor => {
403
+ const cos = Math.cos(degreeToRadian(-data.coordinate))
404
+ const sin = Math.sin(degreeToRadian(-data.coordinate))
405
+
406
+ /* handle top and bottom sectors: 90+-45deg and 270+-45deg */
407
+ if (Math.abs(cos) <= COS_45) {
408
+ /* sin > 0: top sector, sin < 0: bottom sector */
409
+ return sin > 0 ? "start" : "end"
410
+ }
411
+
412
+ return "middle"
413
+ }
414
+
415
+ function AxisLine(props: InsideProps): JSX.Element {
416
+ return <>{renderAxisLine(props)}</>
417
+ }
418
+
419
+ /* Runs inside AxisLine's JSX expression so every prop read is tracked. */
420
+ function renderAxisLine(props: InsideProps): JSX.Element {
421
+ if (!props.axisLine) {
422
+ return null
423
+ }
424
+ const { ref: _ref, ...baseSvgProps } = svgPropertiesNoEvents(props)
425
+ const axisLineProps: Record<string, unknown> = {
426
+ ...baseSvgProps,
427
+ fill: "none",
428
+ ...svgPropertiesNoEvents(props.axisLine),
429
+ }
430
+
431
+ if (props.axisLineType === "circle") {
432
+ return (
433
+ <Dot
434
+ class="recharts-polar-angle-axis-line"
435
+ {...axisLineProps}
436
+ cx={props.cx}
437
+ cy={props.cy}
438
+ r={props.radius}
439
+ />
440
+ )
441
+ }
442
+ const points = props.ticks.map((entry) =>
443
+ polarToCartesian(props.cx, props.cy, props.radius, entry.coordinate),
444
+ )
445
+
446
+ return <Polygon class="recharts-polar-angle-axis-line" {...axisLineProps} points={points} />
447
+ }
448
+
449
+ type TickItemProps = {
450
+ tick: TickProp<BaseTickContentProps>
451
+ tickProps: BaseTickContentProps
452
+ value: string | number
453
+ }
454
+
455
+ /* eslint-disable solid/reactivity -- TickItemText reads are structural type checks at component setup; called from within reactive map, not a tracked scope */
456
+ function TickItemText(props: TickItemProps): JSX.Element {
457
+ return <>{renderTickItemText(props)}</>
458
+ }
459
+
460
+ /* Runs inside TickItemText's JSX expression so every reactive read is tracked. */
461
+ function renderTickItemText(props: TickItemProps): JSX.Element {
462
+ if (!props.tick) {
463
+ return null
464
+ }
465
+ if (typeof props.tick === "function") {
466
+ return (props.tick as (p: BaseTickContentProps) => JSX.Element)(props.tickProps)
467
+ }
468
+ if (isJsxNode(props.tick)) {
469
+ return <>{cloneJsxNodeWithProps(props.tick, props.tickProps as unknown as Record<string, unknown>) as unknown as JSX.Element}</>
470
+ }
471
+ return (
472
+ <Text {...props.tickProps} className="recharts-polar-angle-axis-tick-value">
473
+ {props.value}
474
+ </Text>
475
+ )
476
+ }
477
+ /* eslint-enable solid/reactivity */
478
+
479
+ /* eslint-disable solid/reactivity -- Ticks reads props at component setup; called from within reactive JSX (resolved memo drives re-render), so props are stable per render */
480
+ function Ticks(props: InsideProps): JSX.Element {
481
+ return <>{renderTicks(props)}</>
482
+ }
483
+
484
+ /* Runs inside Ticks's JSX expression so every reactive read is tracked. */
485
+ function renderTicks(props: InsideProps): JSX.Element {
486
+ const { ref: _ref, ...axisProps }: Record<string, unknown> = svgPropertiesNoEvents(props)
487
+ const customTickProps = svgPropertiesNoEventsFromUnknown(props.tick)
488
+ const tickLineProps = {
489
+ ...axisProps,
490
+ fill: "none",
491
+ ...svgPropertiesNoEvents(props.tickLine),
492
+ }
493
+
494
+ const items = props.ticks.map((entry, i) => {
495
+ const lineCoord = getTickLineCoord(entry, props)
496
+ const textAnchor: TextAnchor = getTickTextAnchor(entry, props.orientation)
497
+ const verticalAnchor: TextVerticalAnchor = getTickTextVerticalAnchor(entry)
498
+ const tickProps: BaseTickContentProps = {
499
+ ...axisProps,
500
+ textAnchor,
501
+ verticalAnchor,
502
+ stroke: "none",
503
+ fill: props.stroke,
504
+ ...customTickProps,
505
+ index: i,
506
+ payload: entry,
507
+ x: lineCoord.x2,
508
+ y: lineCoord.y2,
509
+ } as BaseTickContentProps
510
+
511
+ return (
512
+ <Layer
513
+ class={clsx("recharts-polar-angle-axis-tick", getClassNameFromUnknown(props.tick))}
514
+ {...adaptEventsOfChild(props, entry, i)}
515
+ >
516
+ <Show when={props.tickLine}>
517
+ <line class="recharts-polar-angle-axis-tick-line" {...tickLineProps} {...lineCoord} />
518
+ </Show>
519
+ <TickItemText
520
+ tick={props.tick}
521
+ tickProps={tickProps}
522
+ value={props.tickFormatter ? props.tickFormatter(entry.value, i) : entry.value}
523
+ />
524
+ </Layer>
525
+ )
526
+ })
527
+
528
+ return <Layer class="recharts-polar-angle-axis-ticks">{items}</Layer>
529
+ }
530
+ /* eslint-enable solid/reactivity */
531
+
532
+ export function PolarAngleAxisWrapper(defaultsAndInputs: PropsWithDefaults): JSX.Element {
533
+ const ctx = useChartStore()
534
+ const viewBox = createMemo(() => (ctx ? selectPolarViewBox(ctx.store) : undefined))
535
+ const scale = createMemo(() =>
536
+ ctx ? selectPolarAxisScale(ctx.store, "angleAxis", defaultsAndInputs.angleAxisId) : undefined,
537
+ )
538
+ const isPanorama = useIsPanorama()
539
+ const ticks = createMemo(() =>
540
+ ctx
541
+ ? selectPolarAngleAxisTicks(
542
+ ctx.store,
543
+ "angleAxis",
544
+ defaultsAndInputs.angleAxisId,
545
+ isPanorama,
546
+ )
547
+ : undefined,
548
+ )
549
+
550
+ /* resolved drops to null when any dep is missing; Show rerenders the subtree when
551
+ the memo flips falsy → truthy. IIFE-in-JSX would freeze the body at first eval. */
552
+ const resolved = createMemo<InsideProps | null>(() => {
553
+ const vb = viewBox()
554
+ const t = ticks()
555
+ const s = scale()
556
+ if (vb == null || t == null || t.length === 0 || s == null) {
557
+ return null
558
+ }
559
+ return {
560
+ ...defaultsAndInputs,
561
+ scale: s,
562
+ ...vb,
563
+ radius: vb.outerRadius,
564
+ ticks: t,
565
+ }
566
+ })
567
+
568
+ return (
569
+ <Show when={resolved()}>
570
+ {(p) => (
571
+ <ZIndexLayer zIndex={p().zIndex}>
572
+ <Layer class={clsx("recharts-polar-angle-axis", AXIS_TYPE, p().className)}>
573
+ <AxisLine {...p()} />
574
+ <Ticks {...p()} />
575
+ </Layer>
576
+ </ZIndexLayer>
577
+ )}
578
+ </Show>
579
+ )
580
+ }
581
+
582
+ /**
583
+ * @provides PolarLabelContext
584
+ * @consumes PolarViewBoxContext
585
+ */
586
+ /* eslint-disable-next-line typescript-eslint/no-explicit-any -- upstream contract: untyped axes accept any data */
587
+ export function PolarAngleAxis<DataPointType = any, DataValueType = any>(
588
+ outsideProps: Props<DataPointType, DataValueType>,
589
+ ): JSX.Element {
590
+ const props = resolveDefaultProps(outsideProps, defaultPolarAngleAxisProps)
591
+
592
+ return (
593
+ <SetAngleAxisSettings
594
+ id={props.angleAxisId}
595
+ scale={props.scale}
596
+ type={props.type}
597
+ /* settings are untyped; the generic only constrains what callers pass */
598
+ dataKey={props.dataKey as DataKey<unknown>}
599
+ unit={undefined}
600
+ name={props.name}
601
+ allowDuplicatedCategory={false}
602
+ allowDataOverflow={false}
603
+ reversed={props.reversed}
604
+ includeHidden={false}
605
+ allowDecimals={props.allowDecimals}
606
+ tickCount={props.tickCount}
607
+ niceTicks={props.niceTicks}
608
+ /* passed through unchanged like upstream, whose TickItem prop and AxisTick setting types disagree */
609
+ ticks={props.ticks as unknown as ReadonlyArray<AxisTick> | undefined}
610
+ tick={props.tick as TickProp<unknown>}
611
+ domain={props.domain}
612
+ >
613
+ <PolarAngleAxisWrapper {...props} />
614
+ </SetAngleAxisSettings>
615
+ )
616
+ }