@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,722 @@
1
+ /* eslint-disable import/no-cycle, sort-keys */
2
+ /**
3
+ * @fileOverview Cartesian Axis
4
+ */
5
+ import type { JSX } from '@solidjs/web';
6
+ import { createEffect, createMemo, createSignal, For, onCleanup, onSettled, Show, untrack, useContext } from 'solid-js';
7
+ import isEqual from "es-toolkit/compat/isEqual"
8
+ import { RechartsStateContext } from "../state/RechartsStateContext"
9
+ import { teardownWrite } from "../state/teardownWrite"
10
+ import type { AxisId } from "../state/cartesianAxisSlice"
11
+ import type { TickItem as RenderedTickItem } from "../util/types"
12
+ import get from "es-toolkit/compat/get"
13
+ import { clsx } from "clsx"
14
+ import { Layer } from "../container/Layer"
15
+ import { Text, Props as TextProps, TextAnchor, TextVerticalAnchor, isValidTextAnchor } from "../component/Text"
16
+ import {
17
+ CartesianLabelContextProvider,
18
+ ImplicitLabelType,
19
+ CartesianLabelFromLabelProp,
20
+ } from "../component/Label"
21
+ import { isNumber } from "../util/DataUtils"
22
+ import {
23
+ CartesianViewBox,
24
+ adaptEventsOfChild,
25
+ PresentationAttributesAdaptChildEvent,
26
+ CartesianTickItem,
27
+ AxisInterval,
28
+ Coordinate,
29
+ RectangleCoordinate,
30
+ TickProp,
31
+ BaseTickContentProps,
32
+ XAxisTickContentProps,
33
+ YAxisTickContentProps,
34
+ } from "../util/types"
35
+ import { getTicks } from "./getTicks"
36
+ import {
37
+ svgPropertiesNoEvents,
38
+ svgPropertiesNoEventsFromUnknown,
39
+ } from "../util/svgPropertiesNoEvents"
40
+ import {
41
+ XAxisOrientation,
42
+ XAxisPadding,
43
+ YAxisOrientation,
44
+ YAxisPadding,
45
+ } from "../state/cartesianAxisSlice"
46
+ import { RequiresDefaultProps, resolveDefaultProps } from "../util/resolveDefaultProps"
47
+ import { ZIndexable, ZIndexLayer } from "../zIndex/ZIndexLayer"
48
+ import { DefaultZIndexes } from "../zIndex/DefaultZIndexes"
49
+ import { getClassNameFromUnknown } from "../util/getClassNameFromUnknown"
50
+ import { cloneJsxNodeWithProps, isJsxNode } from "../util/ReactUtils"
51
+ import { bindRef, splitProps } from "../util/solid-1-compat"
52
+ import { getCalculatedXAxisHeight } from "../util/XAxisUtils"
53
+ import { getCalculatedYAxisWidth } from "../util/YAxisUtils"
54
+
55
+ /** The orientation of the axis in correspondence to the chart */
56
+ export type Orientation = XAxisOrientation | YAxisOrientation
57
+ /** A unit to be appended to a value */
58
+ export type Unit = string | number
59
+ /** The formatter function of tick */
60
+ export type TickFormatter = (value: unknown, index: number) => string
61
+
62
+ export interface CartesianAxisProps extends ZIndexable {
63
+ class?: string
64
+ axisType?: "xAxis" | "yAxis"
65
+ /** Identifies the axis whose rendered ticks are published to the store. */
66
+ axisId?: AxisId
67
+ x?: number
68
+ y?: number
69
+ width?: number
70
+ height?: number
71
+ unit?: Unit
72
+ orientation?: Orientation
73
+ viewBox?: CartesianViewBox
74
+ tick?: TickProp<unknown>
75
+ /**
76
+ * Additional props to spread to each tick Text element.
77
+ * Optional, the CartesianAxis component will provide its own defaults calculated from other props.
78
+ */
79
+ tickTextProps?: TextProps
80
+ axisLine?: boolean | JSX.LineSVGAttributes<SVGLineElement>
81
+ tickLine?: boolean | JSX.LineSVGAttributes<SVGLineElement>
82
+ mirror?: boolean
83
+ tickMargin?: number
84
+ hide?: boolean
85
+ label?: ImplicitLabelType
86
+ /** Padding information passed to custom tick components */
87
+ padding?: XAxisPadding | YAxisPadding
88
+
89
+ minTickGap?: number
90
+ /**
91
+ * Careful - this is the same name as XAxis + YAxis `ticks` but completely different object!
92
+ */
93
+ ticks?: ReadonlyArray<CartesianTickItem>
94
+ tickSize?: number
95
+ tickFormatter?: TickFormatter
96
+ interval?: AxisInterval
97
+ /** Angle in which ticks will be rendered. */
98
+ angle?: number
99
+ /**
100
+ * CartesianAxis reads scale internally and this prop is ignored since 3.0
101
+ * @deprecated
102
+ */
103
+ scale?: unknown
104
+ labelRef?: SVGTextElement | null
105
+ /**
106
+ * Imperative size API for XAxis `height="auto"` / YAxis `width="auto"`.
107
+ * Separate from `ref`, which is the tick-labels `<g>` element.
108
+ */
109
+ axisRef?: (api: CartesianAxisRef | null) => void
110
+
111
+ ref?: SVGElement | ((el: SVGElement) => void)
112
+ }
113
+
114
+ export interface CartesianAxisRef {
115
+ getCalculatedWidth(): number
116
+ getCalculatedHeight(): number
117
+ }
118
+
119
+ export const defaultCartesianAxisProps = {
120
+ axisLine: true,
121
+ height: 0,
122
+ interval: "preserveEnd",
123
+ minTickGap: 5,
124
+ mirror: false,
125
+ orientation: "bottom",
126
+ stroke: "#666",
127
+
128
+ tick: true,
129
+ tickLine: true,
130
+ tickMargin: 2,
131
+ tickSize: 6,
132
+ ticks: [] as CartesianAxisProps["ticks"],
133
+
134
+ viewBox: { height: 0, width: 0, x: 0, y: 0 },
135
+ width: 0,
136
+ x: 0,
137
+ y: 0,
138
+ zIndex: DefaultZIndexes.axis,
139
+ } as const satisfies Partial<Props>
140
+
141
+ /*
142
+ * `viewBox` and `scale` are SVG attributes.
143
+ * Recharts however - unfortunately - has its own attributes named `viewBox` and `scale`
144
+ * that are completely different data shape and different purpose.
145
+ */
146
+ export type Props = Omit<
147
+ PresentationAttributesAdaptChildEvent<unknown, SVGTextElement>,
148
+ "viewBox" | "scale" | "ref"
149
+ > &
150
+ CartesianAxisProps
151
+
152
+ type InternalProps = RequiresDefaultProps<Props, typeof defaultCartesianAxisProps>
153
+
154
+ function AxisLine(axisLineProps: {
155
+ x: number
156
+ y: number
157
+ width: number
158
+ height: number
159
+ orientation: Orientation
160
+ mirror: boolean
161
+ axisLine: boolean | JSX.LineSVGAttributes<SVGLineElement>
162
+ otherSvgProps: JSX.LineSVGAttributes<SVGLineElement> | null
163
+ }) {
164
+ /* GOTCHA: do NOT spread coordinate values into a plain object here. AxisLine's
165
+ function body executes once at mount; reads of `axisLineProps.x/y/width/height`
166
+ inside that body freeze at the initial pass. JSX expression slots with `{}`
167
+ stay reactive — coords must be passed as accessors so the line re-renders when
168
+ chart-offset reflows (e.g. legend size dispatch arrives post-mount). */
169
+ const isHorizontal = () =>
170
+ axisLineProps.orientation === "top" || axisLineProps.orientation === "bottom"
171
+ const needHeight = () =>
172
+ Number(
173
+ (axisLineProps.orientation === "top" && !axisLineProps.mirror) ||
174
+ (axisLineProps.orientation === "bottom" && axisLineProps.mirror),
175
+ )
176
+ const needWidth = () =>
177
+ Number(
178
+ (axisLineProps.orientation === "left" && !axisLineProps.mirror) ||
179
+ (axisLineProps.orientation === "right" && axisLineProps.mirror),
180
+ )
181
+ const x1 = () =>
182
+ isHorizontal() ? axisLineProps.x : axisLineProps.x + needWidth() * axisLineProps.width
183
+ const x2 = () =>
184
+ isHorizontal()
185
+ ? axisLineProps.x + axisLineProps.width
186
+ : axisLineProps.x + needWidth() * axisLineProps.width
187
+ const y1 = () =>
188
+ isHorizontal()
189
+ ? axisLineProps.y + needHeight() * axisLineProps.height
190
+ : axisLineProps.y
191
+ const y2 = () =>
192
+ isHorizontal()
193
+ ? axisLineProps.y + needHeight() * axisLineProps.height
194
+ : axisLineProps.y + axisLineProps.height
195
+
196
+ const styleProps = (): JSX.LineSVGAttributes<SVGLineElement> => ({
197
+ ...axisLineProps.otherSvgProps,
198
+ ...svgPropertiesNoEvents(axisLineProps.axisLine),
199
+ fill: "none",
200
+ })
201
+
202
+ return (
203
+ <Show when={axisLineProps.axisLine}>
204
+ <line
205
+ {...styleProps()}
206
+ x1={x1()}
207
+ x2={x2()}
208
+ y1={y1()}
209
+ y2={y2()}
210
+ class={clsx("recharts-cartesian-axis-line", get(axisLineProps.axisLine, "className"))}
211
+ />
212
+ </Show>
213
+ )
214
+ }
215
+
216
+ /**
217
+ * Calculate the coordinates of endpoints in ticks.
218
+ * @param data The data of a simple tick.
219
+ * @param x The x-coordinate of the axis.
220
+ * @param y The y-coordinate of the axis.
221
+ * @param width The width of the axis.
222
+ * @param height The height of the axis.
223
+ * @param orientation The orientation of the axis.
224
+ * @param tickSize The length of the tick line.
225
+ * @param mirror If true, the ticks are mirrored.
226
+ * @param tickMargin The margin between the tick line and the tick text.
227
+ * @returns An object with `line` and `tick` coordinates.
228
+ * `line` is the coordinates for the tick line, and `tick` is the coordinate for the tick text.
229
+ */
230
+ function getTickLineCoord(
231
+ data: CartesianTickItem,
232
+ x: number,
233
+ y: number,
234
+ width: number,
235
+ height: number,
236
+ orientation: Orientation,
237
+ tickSize: number,
238
+ mirror: boolean,
239
+ tickMargin: number,
240
+ ): {
241
+ line: RectangleCoordinate
242
+ tick: Coordinate
243
+ } {
244
+ let x1: number
245
+ let x2: number
246
+ let y1: number
247
+ let y2: number
248
+ let tx: number
249
+ let ty: number
250
+
251
+ const sign = mirror ? -1 : 1
252
+ const finalTickSize = data.tickSize || tickSize
253
+ const tickCoord = isNumber(data.tickCoord) ? data.tickCoord : data.coordinate
254
+
255
+ switch (orientation) {
256
+ case "top":
257
+ x1 = x2 = data.coordinate
258
+ y2 = y + +!mirror * height
259
+ y1 = y2 - sign * finalTickSize
260
+ ty = y1 - sign * tickMargin
261
+ tx = tickCoord
262
+ break
263
+ case "left":
264
+ y1 = y2 = data.coordinate
265
+ x2 = x + +!mirror * width
266
+ x1 = x2 - sign * finalTickSize
267
+ tx = x1 - sign * tickMargin
268
+ ty = tickCoord
269
+ break
270
+ case "right":
271
+ y1 = y2 = data.coordinate
272
+ x2 = x + +mirror * width
273
+ x1 = x2 + sign * finalTickSize
274
+ tx = x1 + sign * tickMargin
275
+ ty = tickCoord
276
+ break
277
+ default:
278
+ x1 = x2 = data.coordinate
279
+ y2 = y + +mirror * height
280
+ y1 = y2 + sign * finalTickSize
281
+ ty = y1 + sign * tickMargin
282
+ tx = tickCoord
283
+ break
284
+ }
285
+
286
+ return { line: { x1, x2, y1, y2 }, tick: { x: tx, y: ty } }
287
+ }
288
+
289
+ /**
290
+ * @param orientation The orientation of the axis.
291
+ * @param mirror If true, the ticks are mirrored.
292
+ * @returns The text anchor of the tick.
293
+ */
294
+ function getTickTextAnchor(orientation: Orientation, mirror: boolean): TextAnchor {
295
+ switch (orientation) {
296
+ case "left":
297
+ return mirror ? "start" : "end"
298
+ case "right":
299
+ return mirror ? "end" : "start"
300
+ default:
301
+ return "middle"
302
+ }
303
+ }
304
+
305
+ /**
306
+ * @param orientation The orientation of the axis.
307
+ * @param mirror If true, the ticks are mirrored.
308
+ * @returns The vertical text anchor of the tick.
309
+ */
310
+ function getTickVerticalAnchor(orientation: Orientation, mirror: boolean): TextVerticalAnchor {
311
+ switch (orientation) {
312
+ case "left":
313
+ case "right":
314
+ return "middle"
315
+ case "top":
316
+ return mirror ? "start" : "end"
317
+ default:
318
+ return mirror ? "end" : "start"
319
+ }
320
+ }
321
+
322
+ function TickItem(props: { option: Props["tick"]; tickProps: TextProps; value: string }) {
323
+ /* tick type is structural (function vs node vs boolean); snapshot once */
324
+ const option = untrack(() => props.option)
325
+ if (typeof option === "function") {
326
+ const content = () => {
327
+ /* tickProps may carry the axis class via Solid `class` alias — accept both. */
328
+ const baseClassName =
329
+ props.tickProps.className ?? (props.tickProps as { class?: string }).class
330
+ const combinedClassName = clsx(baseClassName, "recharts-cartesian-axis-tick-value")
331
+ return option({ ...props.tickProps, className: combinedClassName })
332
+ }
333
+ return <>{content()}</>
334
+ }
335
+
336
+ if (isJsxNode(option)) {
337
+ const content = () =>
338
+ cloneJsxNodeWithProps(
339
+ option,
340
+ props.tickProps as unknown as Record<string, unknown>,
341
+ ) as unknown as JSX.Element
342
+ return <>{content()}</>
343
+ }
344
+
345
+ if (typeof option !== "boolean") {
346
+ const className = () =>
347
+ clsx("recharts-cartesian-axis-tick-value", getClassNameFromUnknown(option))
348
+ return (
349
+ <Text {...props.tickProps} className={className()}>
350
+ {props.value}
351
+ </Text>
352
+ )
353
+ }
354
+
355
+ return (
356
+ <Text {...props.tickProps} className="recharts-cartesian-axis-tick-value">
357
+ {props.value}
358
+ </Text>
359
+ )
360
+ }
361
+
362
+ type TicksProps = {
363
+ axisType: "xAxis" | "yAxis" | undefined
364
+ axisId: AxisId | undefined
365
+ events: Omit<PresentationAttributesAdaptChildEvent<unknown, SVGTextElement>, "scale" | "viewBox" | "ref">
366
+ fontSize: string
367
+ getTicksConfig: Omit<Props, "ticks" | "ref">
368
+ height: number
369
+ letterSpacing: string
370
+ mirror: boolean
371
+ orientation: Orientation
372
+ padding?: Props["padding"]
373
+ ref?: SVGGElement | ((el: SVGGElement) => void)
374
+ stroke?: Props["stroke"]
375
+ tick?: Props["tick"]
376
+ tickFormatter?: Props["tickFormatter"]
377
+ tickLine?: Props["tickLine"]
378
+ tickMargin: number
379
+ tickSize: number
380
+ tickTextProps?: Props["tickTextProps"]
381
+ ticks?: ReadonlyArray<CartesianTickItem>
382
+ unit?: Props["unit"]
383
+ width: number
384
+ x: number
385
+ y: number
386
+ }
387
+
388
+ function Ticks(props: TicksProps) {
389
+ const ticks = () => props.ticks ?? []
390
+ const finalTicks = createMemo(() =>
391
+ getTicks(
392
+ { ...props.getTicksConfig, ticks: ticks() } as Parameters<typeof getTicks>[0],
393
+ props.fontSize,
394
+ props.letterSpacing,
395
+ ),
396
+ )
397
+ /*
398
+ * Publish the actually rendered ticks so hooks and the inverse tick-snap scale can read them.
399
+ * Skip the write when the tick values are unchanged so re-renders keep a stable reference
400
+ * (https://github.com/recharts/recharts/issues/7563).
401
+ */
402
+ const stateCtx = useContext(RechartsStateContext)
403
+ let lastPublished: { axisId: AxisId; axisType: "xAxis" | "yAxis"; ticks: ReadonlyArray<RenderedTickItem> } | null = null
404
+ createEffect(
405
+ () => {
406
+ const axisId = props.axisId
407
+ const axisType = props.axisType
408
+ if (axisId == null || axisType == null) {
409
+ return null
410
+ }
411
+ // Filter out irrelevant internal properties before exposing externally
412
+ const tickItems: ReadonlyArray<RenderedTickItem> = finalTicks().map((tick) => ({
413
+ coordinate: tick.coordinate,
414
+ index: tick.index,
415
+ offset: tick.offset,
416
+ value: tick.value,
417
+ }))
418
+ return { axisId, axisType, ticks: tickItems }
419
+ },
420
+ (next) => {
421
+ if (next == null || stateCtx == null) {
422
+ return undefined
423
+ }
424
+ const last = lastPublished
425
+ if (
426
+ last == null ||
427
+ last.axisId !== next.axisId ||
428
+ last.axisType !== next.axisType ||
429
+ !isEqual(last.ticks, next.ticks)
430
+ ) {
431
+ lastPublished = next
432
+ stateCtx.setState("renderedTicks", next.axisType, String(next.axisId), next.ticks)
433
+ }
434
+ return undefined
435
+ },
436
+ )
437
+ onCleanup(() => {
438
+ const last = lastPublished
439
+ if (last == null || stateCtx == null) {
440
+ return
441
+ }
442
+ lastPublished = null
443
+ teardownWrite(() => {
444
+ stateCtx.setState("renderedTicks", last.axisType, (axes) => {
445
+ delete (axes as Record<string, unknown>)[String(last.axisId)]
446
+ })
447
+ })
448
+ })
449
+
450
+ const axisProps = createMemo(() => svgPropertiesNoEvents(props.getTicksConfig))
451
+ /* User-provided textAnchor wins; svgPropertiesNoEvents emits it as kebab `text-anchor`. */
452
+ const textAnchor = createMemo((): TextAnchor => {
453
+ const userAnchor = (axisProps() as Record<string, string | undefined>)["text-anchor"]
454
+ return isValidTextAnchor(userAnchor) ? userAnchor : getTickTextAnchor(props.orientation, props.mirror)
455
+ })
456
+ const verticalAnchor = (): TextVerticalAnchor =>
457
+ getTickVerticalAnchor(props.orientation, props.mirror)
458
+ const customTickProps = createMemo(() => svgPropertiesNoEventsFromUnknown(props.tick))
459
+
460
+ const tickLineProps = createMemo((): JSX.LineSVGAttributes<SVGLineElement> => {
461
+ let tickLinePropsObject: JSX.LineSVGAttributes<SVGLineElement> = {}
462
+ if (typeof props.tickLine === "object") {
463
+ tickLinePropsObject = props.tickLine
464
+ }
465
+ return {
466
+ ...axisProps(),
467
+ fill: "none",
468
+ ...tickLinePropsObject,
469
+ }
470
+ })
471
+
472
+ const tickLineCoords = createMemo(() =>
473
+ finalTicks().map((entry: CartesianTickItem) =>
474
+ Object.assign(
475
+ { entry },
476
+ getTickLineCoord(
477
+ entry,
478
+ props.x,
479
+ props.y,
480
+ props.width,
481
+ props.height,
482
+ props.orientation,
483
+ props.tickSize,
484
+ props.mirror,
485
+ props.tickMargin,
486
+ ),
487
+ ),
488
+ ),
489
+ )
490
+
491
+ return (
492
+ <g class={`recharts-cartesian-axis-ticks recharts-${props.axisType}-ticks`}>
493
+ <Show when={tickLineCoords().length > 0}>
494
+ <ZIndexLayer zIndex={DefaultZIndexes.label}>
495
+ <g
496
+ class={`recharts-cartesian-axis-tick-labels recharts-${props.axisType}-tick-labels`}
497
+ ref={(el) => bindRef(props.ref, el)}
498
+ >
499
+ <For each={tickLineCoords()}>
500
+ {({ entry, tick: tickCoord }, i) => {
501
+ const tickProps = (): XAxisTickContentProps | YAxisTickContentProps => {
502
+ /* svgPropertiesNoEvents strips Solid `class` (not an SVG key);
503
+ bridge to React-style `className` so custom tick fns receive it. */
504
+ const axisClass = (props.getTicksConfig as { class?: string }).class
505
+ return {
506
+ verticalAnchor: verticalAnchor(),
507
+ ...axisProps(),
508
+ ...(axisClass != null ? { className: axisClass } : {}),
509
+ textAnchor: textAnchor(),
510
+ stroke: "none",
511
+ fill: props.stroke,
512
+ ...tickCoord,
513
+ index: i(),
514
+ payload: entry,
515
+ visibleTicksCount: finalTicks().length,
516
+ tickFormatter: props.tickFormatter,
517
+ padding: props.padding,
518
+ ...props.tickTextProps,
519
+ angle:
520
+ props.tickTextProps?.angle ??
521
+ (axisProps() as Record<string, unknown>).angle ??
522
+ 0,
523
+ } as XAxisTickContentProps | YAxisTickContentProps
524
+ }
525
+
526
+ const finalTickProps = (): BaseTickContentProps =>
527
+ ({
528
+ ...tickProps(),
529
+ ...customTickProps(),
530
+ }) as BaseTickContentProps
531
+
532
+ return (
533
+ <Layer
534
+ class="recharts-cartesian-axis-tick-label"
535
+ {...adaptEventsOfChild(props.events, entry, i())}
536
+ >
537
+ <Show when={props.tick}>
538
+ <TickItem
539
+ option={props.tick}
540
+ tickProps={finalTickProps()}
541
+ value={`${typeof props.tickFormatter === "function" ? props.tickFormatter(entry.value, i()) : entry.value}${props.unit || ""}`}
542
+ />
543
+ </Show>
544
+ </Layer>
545
+ )
546
+ }}
547
+ </For>
548
+ </g>
549
+ </ZIndexLayer>
550
+ </Show>
551
+ <Show when={tickLineCoords().length > 0}>
552
+ <g class={`recharts-cartesian-axis-tick-lines recharts-${props.axisType}-tick-lines`}>
553
+ <For each={tickLineCoords()}>
554
+ {({ entry: _entry, line: lineCoord }) => (
555
+ <Layer class="recharts-cartesian-axis-tick">
556
+ <Show when={props.tickLine}>
557
+ <line
558
+ {...tickLineProps()}
559
+ {...lineCoord}
560
+ class={clsx(
561
+ "recharts-cartesian-axis-tick-line",
562
+ get(props.tickLine, "className"),
563
+ )}
564
+ />
565
+ </Show>
566
+ </Layer>
567
+ )}
568
+ </For>
569
+ </g>
570
+ </Show>
571
+ </g>
572
+ )
573
+ }
574
+
575
+ function CartesianAxisComponent(props: InternalProps) {
576
+ /* Tick config and events never need `children`; keeping it out avoids instantiating
577
+ child labels outside the axis label context. */
578
+ const [, propsWithoutChildren] = splitProps(props, ["children"])
579
+ const [fontSize, setFontSize] = createSignal("")
580
+ const [letterSpacing, setLetterSpacing] = createSignal("")
581
+ let _tickRefs: HTMLCollectionOf<Element> | null = null
582
+
583
+ const api: CartesianAxisRef = {
584
+ getCalculatedHeight(): number {
585
+ return getCalculatedXAxisHeight({
586
+ label: untrack(() => props.labelRef),
587
+ labelGapWithTick: 5,
588
+ tickMargin: untrack(() => props.tickMargin),
589
+ ticks: _tickRefs,
590
+ tickSize: untrack(() => props.tickSize),
591
+ })
592
+ },
593
+ getCalculatedWidth(): number {
594
+ return getCalculatedYAxisWidth({
595
+ label: untrack(() => props.labelRef),
596
+ labelGapWithTick: 5,
597
+ tickMargin: untrack(() => props.tickMargin),
598
+ ticks: _tickRefs,
599
+ tickSize: untrack(() => props.tickSize),
600
+ })
601
+ },
602
+ }
603
+
604
+ const publishAxisRef = (value: CartesianAxisRef | null) => {
605
+ untrack(() => {
606
+ props.axisRef?.(value)
607
+ })
608
+ }
609
+
610
+ onCleanup(() => {
611
+ publishAxisRef(null)
612
+ })
613
+
614
+ const layerRef = (el: SVGGElement) => {
615
+ if (el) {
616
+ /* Live collection: it fills in once the ticks are inserted. */
617
+ _tickRefs = el.getElementsByClassName("recharts-cartesian-axis-tick-value")
618
+ publishAxisRef(api)
619
+ } else {
620
+ _tickRefs = null
621
+ publishAxisRef(null)
622
+ }
623
+ }
624
+
625
+ /* Ticks are not in the DOM when the ref runs, so read their computed font after mount. */
626
+ onSettled(() => {
627
+ const tick: Element | undefined = _tickRefs?.[0]
628
+ if (tick) {
629
+ const computedStyle = window.getComputedStyle(tick)
630
+ const calculatedFontSize = computedStyle.fontSize
631
+ const calculatedLetterSpacing = computedStyle.letterSpacing
632
+ if (
633
+ calculatedFontSize !== untrack(fontSize) ||
634
+ calculatedLetterSpacing !== untrack(letterSpacing)
635
+ ) {
636
+ setFontSize(calculatedFontSize)
637
+ setLetterSpacing(calculatedLetterSpacing)
638
+ }
639
+ }
640
+ })
641
+
642
+ return (
643
+ <Show
644
+ when={
645
+ !props.hide &&
646
+ !((props.width != null && props.width <= 0) || (props.height != null && props.height <= 0))
647
+ }
648
+ >
649
+ <ZIndexLayer zIndex={props.zIndex}>
650
+ <Layer class={clsx("recharts-cartesian-axis", props.class)}>
651
+ <AxisLine
652
+ x={props.x}
653
+ y={props.y}
654
+ width={props.width}
655
+ height={props.height}
656
+ orientation={props.orientation}
657
+ mirror={props.mirror}
658
+ axisLine={props.axisLine}
659
+ otherSvgProps={(() => {
660
+ const { ref: _ref, ...rest } = svgPropertiesNoEvents(props)
661
+ return rest
662
+ })()}
663
+ />
664
+ <Ticks
665
+ ref={layerRef}
666
+ axisType={props.axisType}
667
+ axisId={props.axisId}
668
+ events={propsWithoutChildren}
669
+ fontSize={fontSize()}
670
+ getTicksConfig={propsWithoutChildren}
671
+ height={props.height}
672
+ letterSpacing={letterSpacing()}
673
+ mirror={props.mirror}
674
+ orientation={props.orientation}
675
+ padding={props.padding}
676
+ stroke={props.stroke}
677
+ tick={props.tick}
678
+ tickFormatter={props.tickFormatter}
679
+ tickLine={props.tickLine}
680
+ tickMargin={props.tickMargin}
681
+ tickSize={props.tickSize}
682
+ tickTextProps={props.tickTextProps}
683
+ ticks={props.ticks}
684
+ unit={props.unit}
685
+ width={props.width}
686
+ x={props.x}
687
+ y={props.y}
688
+ />
689
+ <CartesianLabelContextProvider
690
+ x={props.x}
691
+ y={props.y}
692
+ width={props.width}
693
+ height={props.height}
694
+ lowerWidth={props.width}
695
+ upperWidth={props.width}
696
+ >
697
+ <CartesianLabelFromLabelProp
698
+ label={props.label}
699
+ labelRef={props.labelRef ?? undefined}
700
+ />
701
+ {props.children}
702
+ </CartesianLabelContextProvider>
703
+ </Layer>
704
+ </ZIndexLayer>
705
+ </Show>
706
+ )
707
+ }
708
+
709
+ /**
710
+ * @deprecated
711
+ *
712
+ * This component is not meant to be used directly in app code.
713
+ * Use XAxis or YAxis instead.
714
+ *
715
+ * Starting from Recharts v4.0 we will make this component internal only.
716
+ */
717
+ export function CartesianAxis(outsideProps: Props) {
718
+ const props = resolveDefaultProps(outsideProps, defaultCartesianAxisProps)
719
+ return <CartesianAxisComponent {...props} />
720
+ }
721
+
722
+ CartesianAxis.displayName = "CartesianAxis"