@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,334 @@
1
+ /* eslint-disable import/no-cycle */
2
+ import type { TooltipTrigger } from "../chart/types"
3
+ import type { NameType, Payload, ValueType } from "../component/DefaultTooltipContent"
4
+ import type { CartesianViewBoxRequired, Coordinate, DataKey, PolarCoordinate } from "../util/types"
5
+ import type { AxisId } from "./cartesianAxisSlice"
6
+ import type { GraphicalItemId } from "./graphicalItemsSlice"
7
+
8
+ /**
9
+ * One Tooltip can display multiple TooltipPayloadEntries at a time.
10
+ */
11
+ export type TooltipPayloadEntry = Payload<ValueType, NameType>
12
+
13
+ /**
14
+ * So what happens is that the tooltip payload is decided based on the available data, and the dataKey.
15
+ * The dataKey can either be defined on the graphical element (like Line, or Bar)
16
+ * or on the tooltip itself.
17
+ *
18
+ * The data can be defined in the chart element, or in the graphical item.
19
+ *
20
+ * So this type is all the settings, other than the data + dataKey complications.
21
+ */
22
+ export type TooltipEntrySettings = Omit<TooltipPayloadEntry, "payload" | "value"> & {
23
+ nameKey: DataKey<unknown> | undefined
24
+ }
25
+
26
+ /**
27
+ * This is what Tooltip renders.
28
+ */
29
+ export type TooltipPayload = ReadonlyArray<TooltipPayloadEntry>
30
+
31
+ /**
32
+ * null means no active index
33
+ * string means: whichever index from the chart data it is.
34
+ * Different charts have different requirements on data shapes,
35
+ * and are also responsible for providing a function that will accept this index
36
+ * and return data.
37
+ */
38
+ export type TooltipIndex = string | null
39
+
40
+ /**
41
+ * Different items have different data shapes so the state has no opinion on what the data shape should be;
42
+ * the only requirement is that the chart also provides a searcher function
43
+ * that accepts the data, and a key, and returns whatever the payload in Tooltip should be.
44
+ */
45
+ export type TooltipPayloadSearcher<T = unknown> = (
46
+ data: T,
47
+ index: TooltipIndex,
48
+ computedData?: unknown,
49
+ nameKey?: DataKey<unknown>,
50
+ ) => T | undefined
51
+
52
+ export type TooltipPayloadConfiguration = {
53
+ settings: TooltipEntrySettings
54
+ /**
55
+ * This is the data that the item has provided, all of it mixed together.
56
+ * Later as user is interacting with the chart, a selector will use this
57
+ * data + activeIndex, pass it to the TooltipPayloadSearcher, and render the result in a Tooltip.
58
+ *
59
+ * Because we have no controls over which data shape the graphical item provides,
60
+ * this is typed as unknown, and it is the responsibility of the selector
61
+ * to know what to do with it.
62
+ *
63
+ * We can't have better typing here because different graphical items
64
+ * may provide different data shapes. For example someone may decide to put Area element
65
+ * in a Sankey chart.
66
+ */
67
+ dataDefinedOnItem: unknown
68
+ /**
69
+ * Opportunity for the graphical item to define its own Tooltip coordinates
70
+ * instead of relying on the axes.
71
+ *
72
+ * If undefined, then Recharts will use mouse interaction coordinates, or the axis coordinates,
73
+ * with some defaults (like, top/left of the chart).
74
+ *
75
+ * Unlike the chart data which can be nested, the positions are expected to be flat array or record.
76
+ * They however should reuse the same tooltip index format as the chart data.
77
+ */
78
+ getPosition: (tooltipIndex: NonNullable<TooltipIndex>) => Coordinate | undefined
79
+ }
80
+
81
+ export type ActiveTooltipProps = {
82
+ activeIndex: TooltipIndex
83
+ activeCoordinate: Coordinate | undefined
84
+ }
85
+
86
+ /**
87
+ * So this informs the "tooltip event type". Tooltip event type can be either "axis" or "item"
88
+ * and it is used for two things:
89
+ * 1. Sets the active area
90
+ * 2. Sets the background and cursor highlights
91
+ *
92
+ * Some charts only allow to have one type of tooltip event type, some allow both.
93
+ * Those charts that allow both will have one default, and the "shared" prop will be used to switch between them.
94
+ * Undefined means "use the chart default".
95
+ *
96
+ * Charts that only allow one tooltip event type, will ignore the shared prop.
97
+ */
98
+ export type SharedTooltipSettings = boolean | undefined
99
+
100
+ export type TooltipSettingsState = {
101
+ shared: SharedTooltipSettings
102
+ trigger: TooltipTrigger
103
+ axisId: AxisId
104
+ /**
105
+ * The `active` prop, despite its name, does not mean "always active".
106
+ * It means "active after user interaction has ended".
107
+ * By default, the tooltip is only active while the user is hovering over the chart.
108
+ * With `active=true`, the tooltip will remain visible after mouse leave event.
109
+ *
110
+ * If you want to see the "active before user interaction" settings, see `defaultIndex`.
111
+ *
112
+ * Undefined means "depends on user interactions".
113
+ */
114
+ active: boolean | undefined
115
+ /**
116
+ * If you want to set the tooltip to be active before user interaction, you can set this property.
117
+ * New chartState stores the raw prop value (number or string); legacy store always holds string.
118
+ */
119
+ defaultIndex: TooltipIndex | number | undefined
120
+ }
121
+
122
+ /**
123
+ * A generic state for user interaction with the chart.
124
+ * User interaction can come through multiple channels: mouse events, keyboard events, or hardcoded in props, or synchronised from other charts.
125
+ *
126
+ * Each of the interaction states is represented as TooltipInteractionState,
127
+ * and then the selectors and Tooltip will decide which of the interaction states to use.
128
+ */
129
+ export type TooltipInteractionState = {
130
+ /**
131
+ * If user interaction is in progress or not.
132
+ * Why is this its own property? Why is this not computed from the index?
133
+ * Certainly if index !== -1 then the tooltip is active, right?
134
+ * Well not so fast. Recharts allows Tooltips can be set to `active=true`
135
+ * which means the tooltip remains displayed after the user stops interacting.
136
+ * - This implies that we cannot set index to <empty value> after interaction ends,
137
+ * because the chart must remember the last position just in case the `active` prop on Tooltip is set to true.
138
+ */
139
+ active: boolean
140
+ /**
141
+ * This is the current data index that is set for the chart.
142
+ * This can come from mouse events, keyboard events, or hardcoded in props
143
+ * in property `defaultIndex` on Tooltip.
144
+ */
145
+ index: TooltipIndex | undefined
146
+ /**
147
+ * DataKey filter.
148
+ *
149
+ * In case of multiple graphical items, this is the dataKey that is set for the item.
150
+ * Very useful for `Tooltip.shared=false`, where activeIndex can display multiple values,
151
+ * but we only want to display one of them.
152
+ *
153
+ * If we want to interact with all the graphical items, then this is undefined.
154
+ * This is the case for eventTooltipType === 'axis' for example.
155
+ */
156
+ dataKey: DataKey<unknown> | undefined
157
+ /**
158
+ * GraphicalItemId filter.
159
+ *
160
+ * In case of multiple graphical items with the same dataKey (e.g., multiple Pie charts),
161
+ * this identifies which specific graphical item is being interacted with.
162
+ * This is more reliable than coordinate matching for distinguishing between items.
163
+ */
164
+ graphicalItemId: string | undefined
165
+ /**
166
+ * The Coordinate where user last interacted with the chart. This needs saved so we can continue to render the tooltip at that point.
167
+ * This is undefined on several occasions:
168
+ * - before the user started interacting with the chart,
169
+ * - when the chart is controlled programmatically through `defaultIndex` prop
170
+ * - when the chart is controlled using keyboard interactions
171
+ */
172
+ coordinate: Coordinate | PolarCoordinate | undefined
173
+ }
174
+
175
+ export type TooltipSyncState = TooltipInteractionState & {
176
+ /**
177
+ * Tooltip synchronization is a feature that allows multiple charts to share the same interaction state.
178
+ * This comes with one specialty - the syncMethod. `syncMethod=value` allows the user to synchronise charts
179
+ * based on the active label (which is rendered as the title of the Tooltip).
180
+ * To allow that, we need the label to be stored in the sync state.
181
+ */
182
+ label: string | undefined
183
+ /**
184
+ * ViewBox of the chart that sent the sync event.
185
+ * Used to scale coordinates between charts of different sizes so tooltips
186
+ * show up in the right place on all synchronized charts.
187
+ */
188
+ sourceViewBox: CartesianViewBoxRequired | undefined
189
+ }
190
+
191
+ export const noInteraction: TooltipInteractionState = {
192
+ active: false,
193
+ coordinate: undefined,
194
+ dataKey: undefined,
195
+ graphicalItemId: undefined,
196
+ index: null,
197
+ }
198
+
199
+ /**
200
+ * The tooltip interaction state stores:
201
+ *
202
+ * - Which graphical item is user interacting with at the moment,
203
+ * - which axis (or, which part of chart background) is user interacting with at the moment
204
+ * - The data that individual graphical items wish to be displayed in case the tooltip gets activated
205
+ */
206
+ export type TooltipState = {
207
+ /**
208
+ * This is the state of interactions with individual graphical items.
209
+ */
210
+ itemInteraction: {
211
+ click: TooltipInteractionState
212
+ /**
213
+ * Why is hover activation separate from click activation? Because they are independent:
214
+ * If a click is set, then mouseLeave should not clear it.
215
+ * - the opposite is technically true too - but it's difficult to click on things without also hovering.
216
+ */
217
+ hover: TooltipInteractionState
218
+ }
219
+ /**
220
+ * This is the state of interaction with the bar background - which will get mapped
221
+ * to the axis index.
222
+ *
223
+ * Axis interaction is independent of item interaction so the state must also be independent.
224
+ */
225
+ axisInteraction: {
226
+ click: TooltipInteractionState
227
+ hover: TooltipInteractionState
228
+ }
229
+ keyboardInteraction: TooltipInteractionState
230
+ /**
231
+ * This part of the state is the information coming from other charts.
232
+ * If there are two charts with the same syncId, events from one chart will be transferred
233
+ * to other charts. So this is what the other charts are reporting.
234
+ */
235
+ syncInteraction: TooltipSyncState
236
+ /**
237
+ * One graphical item will have one configuration;
238
+ * hovering over multiple of them (for example with tooltipEventType===axis)
239
+ * may render multiple tooltip payloads.
240
+ */
241
+ tooltipItemPayloads: ReadonlyArray<TooltipPayloadConfiguration>
242
+ /**
243
+ * Tooltip props or other settings that need store access.
244
+ * This assumes that there is always only one Tooltip. In case we want to start supporting multiple Tooltips,
245
+ * we have to change this to an array - and update all the places reading this state too.
246
+ */
247
+ settings: TooltipSettingsState
248
+ }
249
+
250
+ /**
251
+ * This is the event we get when user is interacting with a specific graphical item.
252
+ */
253
+ export type GraphicalItemTooltipActionPayload = {
254
+ /**
255
+ * Every graphical item must report its own index.
256
+ */
257
+ activeIndex: TooltipIndex
258
+ /**
259
+ * A graphical item may or may not have a particular dataKey specified.
260
+ * This is undefined in case the user did not set a dataKey on the graphical item.
261
+ * In which case the dataKey is implied by the axes settings.
262
+ */
263
+ activeDataKey: DataKey<unknown> | undefined
264
+ /**
265
+ * This is the coordinate where Recharts think the tooltip should appear.
266
+ *
267
+ * Graphical items have a preference where to render the actual tooltip
268
+ * which is defined in the TooltipPayloadConfiguration.positions.
269
+ *
270
+ * This property is resolved by combining that preference with the actual user interaction coordinate.
271
+ * This is not the raw mouse coordinate! We don't store that currently in this slice.
272
+ *
273
+ * This can be undefined depending on the graphical item settings, and the tooltip searcher.
274
+ */
275
+ activeCoordinate: Coordinate | undefined
276
+ /**
277
+ * ID of the element user is interacting with.
278
+ * Cannot be undefined - each graphical item is responsible for generating its own ID
279
+ * in case user did not provide an explicit one.
280
+ */
281
+ activeGraphicalItemId: GraphicalItemId
282
+ }
283
+
284
+ export type AxisTooltipActionPayload = {
285
+ /**
286
+ * Each axis interaction must report the index of where the user is interacting.
287
+ */
288
+ activeIndex: TooltipIndex
289
+ /**
290
+ * DataKey filter. An axis may or may not have a particular dataKey specified.
291
+ * This is undefined in case the user did not set a dataKey on the axis.
292
+ * In which case the dataKey is implied by the graphical item settings.
293
+ */
294
+ activeDataKey: DataKey<unknown> | undefined
295
+ /**
296
+ This is the coordinate where Recharts think the tooltip should appear.
297
+ *
298
+ * Graphical items have a preference where to render the actual tooltip
299
+ * which is defined in the TooltipPayloadConfiguration.positions.
300
+ *
301
+ * This property is resolved by combining that preference with the actual user interaction coordinate.
302
+ * This is not the raw mouse coordinate! We don't store that currently in this slice.
303
+ *
304
+ * This can be undefined depending on the graphical item settings, and the tooltip searcher.
305
+ */
306
+ activeCoordinate?: Coordinate
307
+ }
308
+
309
+ /**
310
+ * Keyboard interaction payload has no graphical item ID,
311
+ * and no dataKey, because keyboard interaction is always
312
+ * with the whole chart, not with a specific graphical item.
313
+ */
314
+ export type KeyboardTooltipActionPayload = {
315
+ /**
316
+ * If true, means user is actively interacting with the chart using keyboard.
317
+ * If false, means user has stopped interacting with the chart using keyboard - perhaps focus has moved away, or ESC key was pressed.
318
+ */
319
+ active: boolean
320
+ /**
321
+ * Keyboard interaction index. The middleware is responsible for computing this index based on
322
+ * current index, key pressed, chart direction, etc.
323
+ * Each chart type may have different index types (string or number) and different idea on how to iterate them.
324
+ */
325
+ activeIndex: TooltipIndex | undefined
326
+ /**
327
+ This is the coordinate where Recharts think the tooltip should appear.
328
+
329
+ * Keyboard coordinate follows the same rules as defaultIndex coordinate.
330
+ * In an absence of mouse coordinates, the chart must compute where to render the tooltip
331
+ * based on the activeIndex and domain and range.
332
+ */
333
+ activeCoordinate: Coordinate | undefined
334
+ }
@@ -0,0 +1,214 @@
1
+ /* eslint-disable import/no-cycle */
2
+ import type { ChartState } from "./chartState"
3
+ import { selectActivePropsFromChartPointer } from "./selectors/selectActivePropsFromChartPointer"
4
+ import { getRelativeCoordinate } from "../util/getRelativeCoordinate"
5
+ import { selectTooltipEventType } from "./selectors/selectTooltipEventType"
6
+ import { readChartState } from "./chartState"
7
+ import {
8
+ DATA_ITEM_GRAPHICAL_ITEM_ID_ATTRIBUTE_NAME,
9
+ DATA_ITEM_INDEX_ATTRIBUTE_NAME,
10
+ } from "../util/Constants"
11
+ import { selectTooltipCoordinate } from "./selectors/touchSelectors"
12
+ import { selectAllGraphicalItemsSettings } from "./selectors/tooltipSelectors"
13
+ import type { RelativePointer } from "../util/types"
14
+ import { createEventProxy } from "../util/createEventProxy"
15
+
16
+ import { type SetStoreFunction } from '../util/solid-1-compat';
17
+ import { setTooltipInteraction } from "./tooltipInteraction"
18
+ export type TouchEventHandlers = {
19
+ handleTouchMove: (touchEvent: TouchEvent) => void
20
+ }
21
+
22
+ /**
23
+ * Creates touch event handler functions that read from the Solid store and update it directly.
24
+ * Replaces the Redux createListenerMiddleware pattern for touch events.
25
+ */
26
+ export function createTouchEventHandlers(
27
+ store: ChartState,
28
+ setStore: SetStoreFunction<ChartState>,
29
+ ): TouchEventHandlers {
30
+ let rafId: number | null = null
31
+ let timeoutId: ReturnType<typeof setTimeout> | null = null
32
+ let latestChartPointers: ReadonlyArray<RelativePointer> | null = null
33
+ let latestTouchEvent: TouchEvent | null = null
34
+
35
+ function handleTouchMove(touchEvent: TouchEvent): void {
36
+ if (touchEvent.touches == null || touchEvent.touches.length === 0) {
37
+ return
38
+ }
39
+
40
+ latestTouchEvent = createEventProxy(touchEvent)
41
+
42
+ const { throttleDelay, throttledEvents } = store.eventSettings
43
+ const isThrottled = throttledEvents === "all" || throttledEvents.includes("touchmove")
44
+
45
+ if (rafId !== null) {
46
+ cancelAnimationFrame(rafId)
47
+ rafId = null
48
+ }
49
+ if (timeoutId !== null && (typeof throttleDelay !== "number" || !isThrottled)) {
50
+ clearTimeout(timeoutId)
51
+ timeoutId = null
52
+ }
53
+
54
+ latestChartPointers = Array.from(touchEvent.touches).map((touch) =>
55
+ getRelativeCoordinate({
56
+ clientX: touch.clientX,
57
+ clientY: touch.clientY,
58
+ currentTarget: touchEvent.currentTarget as HTMLElement,
59
+ }),
60
+ )
61
+
62
+ const callback = () => {
63
+ if (latestTouchEvent == null) {
64
+ return
65
+ }
66
+
67
+ const tooltipEventType = selectTooltipEventType(
68
+ store,
69
+ readChartState(store).tooltip.settings.shared,
70
+ )
71
+ if (tooltipEventType === "axis") {
72
+ const latestTouchPointer = latestChartPointers?.[0]
73
+ if (latestTouchPointer == null) {
74
+ rafId = null
75
+ timeoutId = null
76
+ return
77
+ }
78
+ const activeProps = selectActivePropsFromChartPointer(store, latestTouchPointer)
79
+ if (activeProps?.activeIndex != null) {
80
+ setTooltipInteraction(setStore, "axisInteraction", "hover", {
81
+ active: true,
82
+ coordinate: activeProps.activeCoordinate,
83
+ dataKey: undefined,
84
+ graphicalItemId: undefined,
85
+ index: activeProps.activeIndex,
86
+ })
87
+ }
88
+ } else if (tooltipEventType === "item") {
89
+ const touch = latestTouchEvent.touches[0]
90
+ if (document.elementFromPoint == null || touch == null) {
91
+ return
92
+ }
93
+ const target = document.elementFromPoint(touch.clientX, touch.clientY)
94
+ if (target == null || target.getAttribute == null) {
95
+ return
96
+ }
97
+ const itemIndex = target.getAttribute(DATA_ITEM_INDEX_ATTRIBUTE_NAME)
98
+ const graphicalItemId =
99
+ target.getAttribute(DATA_ITEM_GRAPHICAL_ITEM_ID_ATTRIBUTE_NAME) ?? undefined
100
+ const settings = selectAllGraphicalItemsSettings(store).find(
101
+ (item) => item.id === graphicalItemId,
102
+ )
103
+ if (itemIndex == null || settings == null || graphicalItemId == null) {
104
+ return
105
+ }
106
+ const { dataKey } = settings
107
+ const coordinate = selectTooltipCoordinate(store, itemIndex, graphicalItemId)
108
+
109
+ setTooltipInteraction(setStore, "itemInteraction", "hover", {
110
+ active: true,
111
+ coordinate,
112
+ dataKey,
113
+ graphicalItemId,
114
+ index: itemIndex,
115
+ })
116
+ }
117
+ rafId = null
118
+ timeoutId = null
119
+ }
120
+
121
+ if (!isThrottled) {
122
+ callback()
123
+ return
124
+ }
125
+
126
+ if (throttleDelay === "raf") {
127
+ rafId = requestAnimationFrame(callback)
128
+ } else if (typeof throttleDelay === "number") {
129
+ if (timeoutId === null) {
130
+ callback()
131
+ latestTouchEvent = null
132
+
133
+ timeoutId = setTimeout(() => {
134
+ if (latestTouchEvent) {
135
+ callback()
136
+ } else {
137
+ timeoutId = null
138
+ rafId = null
139
+ }
140
+ }, throttleDelay)
141
+ }
142
+ }
143
+ }
144
+
145
+ return { handleTouchMove }
146
+ }
147
+
148
+ /**
149
+ * Action thunk wrapper for touch events, used with the dispatch pattern.
150
+ */
151
+ export const touchEventAction =
152
+ (touchEvent: TouchEvent) =>
153
+ (
154
+ setStore: SetStoreFunction<ChartState>,
155
+ store: ChartState,
156
+ ) => {
157
+ if (touchEvent.touches == null || touchEvent.touches.length === 0) {
158
+ return
159
+ }
160
+ const tooltipEventType = selectTooltipEventType(
161
+ store,
162
+ readChartState(store).tooltip.settings.shared,
163
+ )
164
+ if (tooltipEventType === "axis") {
165
+ const firstTouch = touchEvent.touches[0]
166
+ if (firstTouch == null) {
167
+ return
168
+ }
169
+ const chartPointer = getRelativeCoordinate({
170
+ clientX: firstTouch.clientX,
171
+ clientY: firstTouch.clientY,
172
+ currentTarget: touchEvent.currentTarget as HTMLElement,
173
+ })
174
+ const activeProps = selectActivePropsFromChartPointer(store, chartPointer)
175
+ if (activeProps?.activeIndex != null) {
176
+ const payload = {
177
+ active: true,
178
+ coordinate: activeProps.activeCoordinate,
179
+ dataKey: undefined,
180
+ graphicalItemId: undefined,
181
+ index: activeProps.activeIndex,
182
+ }
183
+ setTooltipInteraction(setStore, "axisInteraction", "hover", payload)
184
+ }
185
+ } else if (tooltipEventType === "item") {
186
+ const touch = touchEvent.touches[0]
187
+ if (document.elementFromPoint == null || touch == null) {
188
+ return
189
+ }
190
+ const target = document.elementFromPoint(touch.clientX, touch.clientY)
191
+ if (target == null || target.getAttribute == null) {
192
+ return
193
+ }
194
+ const itemIndex = target.getAttribute(DATA_ITEM_INDEX_ATTRIBUTE_NAME)
195
+ const graphicalItemId =
196
+ target.getAttribute(DATA_ITEM_GRAPHICAL_ITEM_ID_ATTRIBUTE_NAME) ?? undefined
197
+ const settings = selectAllGraphicalItemsSettings(store).find(
198
+ (item) => item.id === graphicalItemId,
199
+ )
200
+ if (itemIndex == null || settings == null || graphicalItemId == null) {
201
+ return
202
+ }
203
+ const { dataKey } = settings
204
+ const coordinate = selectTooltipCoordinate(store, itemIndex, graphicalItemId)
205
+ const payload = {
206
+ active: true,
207
+ coordinate,
208
+ dataKey,
209
+ graphicalItemId,
210
+ index: itemIndex,
211
+ }
212
+ setTooltipInteraction(setStore, "itemInteraction", "hover", payload)
213
+ }
214
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Tagged union for an item during animation.
3
+ * Match helpers live in `src/animation/matchBy.ts`.
4
+ */
5
+ export type AnimationItem<T> =
6
+ | { readonly status: "matched"; readonly prev: T; readonly next: T }
7
+ | { readonly status: "added"; readonly next: T }
8
+ | { readonly status: "removed"; readonly prev: T }
9
+
10
+ export type AnimationMatchBy<T> = (item: T, index: number) => string | number | null
11
+
12
+ export type AnimationMatchBySentinel = "index" | "append"
13
+
14
+ export type AnimationMatchByProp<T> = AnimationMatchBySentinel | AnimationMatchBy<T>
15
+
16
+ export type AnimationInterpolateFn<ItemType, Layout = unknown> = (
17
+ items: ReadonlyArray<AnimationItem<ItemType>> | null,
18
+ animationElapsedTime: number,
19
+ layout: Layout,
20
+ ) => ReadonlyArray<ItemType>
@@ -0,0 +1,14 @@
1
+ import { BaseValue } from "../../cartesian/Area"
2
+ import { DataKey } from "../../util/types"
3
+ import { ChartData } from "../chartDataSlice"
4
+ import { MaybeStackedGraphicalItem } from "./StackedGraphicalItem"
5
+ import { BaseCartesianGraphicalItemSettings } from "../graphicalItemsSlice"
6
+
7
+ export type AreaSettings = BaseCartesianGraphicalItemSettings &
8
+ MaybeStackedGraphicalItem & {
9
+ type: "area"
10
+ connectNulls: boolean
11
+ baseValue: BaseValue | undefined
12
+ dataKey: DataKey<unknown>
13
+ data: ChartData | undefined
14
+ }
@@ -0,0 +1,15 @@
1
+ import { MinPointSize } from "../../util/BarUtils"
2
+ import { MaybeStackedGraphicalItem } from "./StackedGraphicalItem"
3
+ import { BaseCartesianGraphicalItemSettings } from "../graphicalItemsSlice"
4
+
5
+ export type BarSettings = BaseCartesianGraphicalItemSettings &
6
+ MaybeStackedGraphicalItem & {
7
+ type: "bar"
8
+ maxBarSize: number | undefined
9
+ minPointSize: MinPointSize
10
+ /**
11
+ * When true, zero-dimension bars are not filtered out because the custom shape
12
+ * may still render something visible.
13
+ */
14
+ hasCustomShape?: boolean
15
+ }
@@ -0,0 +1,9 @@
1
+ import { ChartData } from "../chartDataSlice"
2
+ import { DataKey } from "../../util/types"
3
+ import { BaseCartesianGraphicalItemSettings } from "../graphicalItemsSlice"
4
+
5
+ export type LineSettings = BaseCartesianGraphicalItemSettings & {
6
+ type: "line"
7
+ data: ChartData | undefined
8
+ dataKey: DataKey<unknown> | undefined
9
+ }
@@ -0,0 +1,34 @@
1
+ /* eslint-disable import/no-cycle */
2
+ import type { JSX } from '@solidjs/web';
3
+ import type { WithoutRemoveFalse } from "../../util/types"
4
+ import { BasePolarGraphicalItemSettings } from "../graphicalItemsSlice"
5
+ import { DataKey, LegendType } from "../../util/types"
6
+ import { TooltipType } from "../../component/DefaultTooltipContent"
7
+ import { SVGPropsNoEvents } from "../../util/svgPropertiesNoEvents"
8
+ import { WithoutId } from "../../util/useUniqueId"
9
+
10
+ export type PiePresentationProps = SVGPropsNoEvents<
11
+ WithoutId<WithoutRemoveFalse<JSX.PathSVGAttributes<SVGPathElement>>>
12
+ >
13
+
14
+ export interface PieSettings extends BasePolarGraphicalItemSettings {
15
+ type: "pie"
16
+ name: string | number | undefined
17
+ nameKey: DataKey<unknown>
18
+ tooltipType: TooltipType | undefined
19
+
20
+ legendType: LegendType
21
+ fill: string
22
+
23
+ cx: number | string
24
+ cy: number | string
25
+ startAngle: number
26
+ endAngle: number
27
+ paddingAngle: number
28
+ minAngle: number
29
+ innerRadius: number | string
30
+ outerRadius: number | string | ((element: unknown) => number | string)
31
+ maxRadius: number | undefined
32
+ cornerRadius: number | string | undefined
33
+ presentationProps: PiePresentationProps | null
34
+ }
@@ -0,0 +1,5 @@
1
+ import { BasePolarGraphicalItemSettings } from "../graphicalItemsSlice"
2
+
3
+ export interface RadarSettings extends BasePolarGraphicalItemSettings {
4
+ type: "radar"
5
+ }
@@ -0,0 +1,10 @@
1
+ /* eslint-disable import/no-cycle */
2
+ import { MaybeStackedGraphicalItem } from "./StackedGraphicalItem"
3
+ import { BasePolarGraphicalItemSettings } from "../graphicalItemsSlice"
4
+
5
+ export interface RadialBarSettings
6
+ extends BasePolarGraphicalItemSettings, MaybeStackedGraphicalItem {
7
+ type: "radialBar"
8
+ minPointSize: number
9
+ maxBarSize: number | undefined
10
+ }
@@ -0,0 +1,12 @@
1
+ import { ChartData } from "../chartDataSlice"
2
+ import { DataKey } from "../../util/types"
3
+ import { TooltipType } from "../../component/DefaultTooltipContent"
4
+ import { BaseCartesianGraphicalItemSettings } from "../graphicalItemsSlice"
5
+
6
+ export type ScatterSettings = BaseCartesianGraphicalItemSettings & {
7
+ type: "scatter"
8
+ data: ChartData | undefined
9
+ dataKey: DataKey<unknown> | undefined
10
+ tooltipType: TooltipType | undefined
11
+ name: string | number | undefined
12
+ }