@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,470 @@
1
+ /* eslint-disable import/no-cycle */
2
+ import { createMemo, Show, createEffect } from 'solid-js';
3
+ import type { JSX } from '@solidjs/web';
4
+ import { BarePortal } from "../util/BarePortal"
5
+ import {
6
+ DefaultTooltipContent,
7
+ type NameType,
8
+ type Payload,
9
+ type Props as DefaultTooltipContentProps,
10
+ type TooltipItemSorter,
11
+ type ValueType,
12
+ } from "./DefaultTooltipContent"
13
+ import { TooltipBoundingBox } from "./TooltipBoundingBox"
14
+
15
+ import { getUniqPayload, type UniqueOption } from "../util/payload/getUniqPayload"
16
+ import type {
17
+ AllowInDimension,
18
+ AnimationDuration,
19
+ AnimationTiming,
20
+ Coordinate,
21
+ } from "../util/types"
22
+ import { useViewBox } from "../context/chartLayoutContext"
23
+ import { useAccessibilityLayer } from "../context/accessibilityContext"
24
+ import { useElementOffset } from "../util/useElementOffset"
25
+ import { Cursor, type CursorDefinition } from "./Cursor"
26
+ import {
27
+ selectActiveCoordinate,
28
+ selectActiveLabel,
29
+ selectIsTooltipActive,
30
+ selectTooltipPayload,
31
+ } from "../state/selectors/selectors"
32
+ import { useTooltipPortal } from "../context/tooltipPortalContext"
33
+ import type { TooltipTrigger } from "../chart/types"
34
+ import { useChartStore } from "../state/RechartsStoreContext"
35
+ import { useOptionalChartState } from "../state/useChartState"
36
+ import type { ChartState } from "../state/chartState"
37
+ import type {
38
+ TooltipIndex,
39
+ TooltipPayload,
40
+ TooltipPayloadEntry,
41
+ TooltipSettingsState,
42
+ } from "../state/tooltipSlice"
43
+ import type { AxisId } from "../state/cartesianAxisSlice"
44
+ import { useTooltipChartSynchronisation } from "../synchronisation/useChartSynchronisation"
45
+ import { selectTooltipEventType } from "../state/selectors/selectTooltipEventType"
46
+
47
+ import { mergeProps } from '../util/solid-1-compat';
48
+ export type ContentType<TValue extends ValueType = ValueType, TName extends NameType = NameType> =
49
+ | JSX.Element
50
+ | ((props: TooltipContentProps<TValue, TName>) => JSX.Element)
51
+
52
+ function defaultUniqBy(entry: Payload<ValueType, NameType>) {
53
+ return entry.dataKey
54
+ }
55
+
56
+ export type TooltipContentProps<
57
+ TValue extends ValueType = ValueType,
58
+ TName extends NameType = NameType,
59
+ > = TooltipProps<TValue, TName> & {
60
+ label?: string | number
61
+ payload: TooltipPayload
62
+ coordinate: Coordinate | undefined
63
+ active: boolean
64
+ accessibilityLayer: boolean
65
+ activeIndex: TooltipIndex | undefined
66
+ }
67
+
68
+ function renderContent<TValue extends ValueType, TName extends NameType>(
69
+ content: ContentType<TValue, TName> | undefined,
70
+ contentProps: TooltipContentProps,
71
+ ): JSX.Element {
72
+ if (typeof content === "function") {
73
+ return (content as (p: TooltipContentProps) => JSX.Element)(contentProps)
74
+ }
75
+
76
+ if (content != null) {
77
+ return content as JSX.Element
78
+ }
79
+
80
+ return <DefaultTooltipContent {...contentProps} />
81
+ }
82
+
83
+ type PropertiesReadFromContext =
84
+ | "viewBox"
85
+ | "active"
86
+ | "payload"
87
+ | "coordinate"
88
+ | "label"
89
+ | "accessibilityLayer"
90
+
91
+ export type TooltipProps<
92
+ TValue extends ValueType = ValueType,
93
+ TName extends NameType = NameType,
94
+ > = Omit<DefaultTooltipContentProps<TValue, TName>, PropertiesReadFromContext> & {
95
+ /**
96
+ * If true, then Tooltip is always displayed, once an activeIndex is set by mouse over, or programmatically.
97
+ * If false, then Tooltip is never displayed.
98
+ * If undefined, Recharts will control when the Tooltip displays. This includes mouse and keyboard controls.
99
+ */
100
+ active?: boolean
101
+ /**
102
+ * This option allows the tooltip to extend beyond the viewBox of the chart itself.
103
+ * @defaultValue {"x":false,"y":false}
104
+ */
105
+ allowEscapeViewBox?: AllowInDimension
106
+ /**
107
+ * Specifies the duration of animation, the unit of this option is ms.
108
+ * @defaultValue 400
109
+ */
110
+ animationDuration?: AnimationDuration
111
+ /**
112
+ * The type of easing function.
113
+ * @defaultValue ease
114
+ */
115
+ animationEasing?: AnimationTiming
116
+ /**
117
+ * Tooltip always attaches itself to the "Tooltip" axis. Which axis is it? Depends on the layout:
118
+ * - horizontal layout -> X axis
119
+ * - vertical layout -> Y axis
120
+ * - radial layout -> radial axis
121
+ * - centric layout -> angle axis
122
+ *
123
+ * Tooltip will use the default axis for the layout, unless you specify an axisId.
124
+ *
125
+ * @defaultValue 0
126
+ */
127
+ axisId?: AxisId
128
+ /**
129
+ * Renders the content of the tooltip.
130
+ *
131
+ * This should return HTML elements, not SVG elements.
132
+ *
133
+ * - If not set, the {@link DefaultTooltipContent} component is used.
134
+ * - If set to a JSX element, that element will be rendered.
135
+ * - If set to a function, the function will be called and should return HTML elements.
136
+ *
137
+ * @see {@link https://recharts.github.io/en-US/examples/CustomContentOfTooltip/ Example with custom content}
138
+ */
139
+ content?: ContentType<TValue, TName>
140
+ /**
141
+ * The style of tooltip content which is a dom element.
142
+ * @defaultValue {}
143
+ */
144
+ contentStyle?: JSX.CSSProperties
145
+ /**
146
+ * If set false, no cursor will be drawn when tooltip is active.
147
+ * If set a object, the option is the configuration of cursor.
148
+ * If set a JSX element, the option is the custom element of drawing cursor.
149
+ * @defaultValue true
150
+ */
151
+ cursor?: CursorDefinition
152
+ defaultIndex?: number | TooltipIndex
153
+ /**
154
+ * When an item of the payload has value null or undefined, this item won't be displayed.
155
+ * @defaultValue true
156
+ */
157
+ filterNull?: boolean
158
+ /**
159
+ * Function to customize the value in the tooltip.
160
+ * If you return an array, the first entry will be the formatted "value", and the second entry will be the formatted "name"
161
+ */
162
+ formatter?: (
163
+ value: TValue,
164
+ name: TName,
165
+ item: TooltipPayloadEntry,
166
+ index: number,
167
+ payload: TooltipPayload,
168
+ ) => JSX.Element | [JSX.Element, JSX.Element]
169
+ /**
170
+ * If true, the tooltip will display information about hidden series.
171
+ * Defaults to false.
172
+ * Interacting with the hide property of Area, Bar, Line, Scatter.
173
+ *
174
+ * @defaultValue false
175
+ */
176
+ includeHidden?: boolean | undefined
177
+ /**
178
+ * If set false, animation of tooltip will be disabled.
179
+ * If set "auto", animation is disabled during SSR and when the user prefers reduced motion.
180
+ * @defaultValue auto
181
+ */
182
+ isAnimationActive?: boolean | "auto"
183
+ /**
184
+ * Sorts tooltip items.
185
+ * Defaults to 'name' which means it sorts alphabetically by graphical item `name` property.
186
+ * @defaultValue name
187
+ */
188
+ itemSorter?: TooltipItemSorter
189
+ /**
190
+ * The style of default tooltip content item which is a li element.
191
+ * @defaultValue {}
192
+ */
193
+ itemStyle?: JSX.CSSProperties
194
+ /**
195
+ * The formatter function of label in tooltip.
196
+ */
197
+ labelFormatter?: (label: unknown, payload: TooltipPayload) => JSX.Element
198
+ /**
199
+ * The style of default tooltip label which is a p element.
200
+ * @defaultValue {}
201
+ */
202
+ labelStyle?: JSX.CSSProperties
203
+ /**
204
+ * The offset size between the position of tooltip and the mouse cursor position.
205
+ * When a number is provided, the same offset is applied to both x and y axes.
206
+ *
207
+ * When a Coordinate object is provided, you can specify different offsets for each axis (x and y as numbers)
208
+ * @defaultValue 10
209
+ */
210
+ offset?: number | Coordinate
211
+ payloadUniqBy?: UniqueOption<TooltipPayloadEntry>
212
+ /**
213
+ * If portal is defined, then Tooltip will use this element as a target
214
+ * for rendering using Solid Portal.
215
+ *
216
+ * If this is undefined then Tooltip renders inside the recharts-wrapper element.
217
+ */
218
+ portal?: HTMLElement | null
219
+ /**
220
+ * If this field is set, the tooltip will be displayed at the specified position
221
+ * regardless of the mouse position.
222
+ *
223
+ * You can set a single field (x or y) and let the other field be calculated automatically based
224
+ * on the mouse position.
225
+ */
226
+ position?: Partial<Coordinate>
227
+ /**
228
+ * @defaultValue {"x":false,"y":false}
229
+ */
230
+ reverseDirection?: AllowInDimension
231
+ /**
232
+ * The separator between name and value.
233
+ * @defaultValue ' : '
234
+ */
235
+ separator?: string
236
+ /**
237
+ * Defines whether the tooltip is reacting to the current data point,
238
+ * or to all data points at the current axis coordinate.
239
+ *
240
+ * - `true`: tooltip will appear on top of all bars on an axis tick.
241
+ * - `false`: tooltip will appear on individual bars.
242
+ *
243
+ * Different chart types allow different modes, and have different defaults.
244
+ *
245
+ * @see {@link https://github.com/recharts/recharts/wiki/Tooltip-event-type-and-shared-prop Tooltip event type and shared prop wiki page}
246
+ */
247
+ shared?: boolean
248
+ /**
249
+ * If `hover` then the Tooltip shows on mouse enter and hides on mouse leave.
250
+ *
251
+ * If `click` then the Tooltip shows after clicking and stays active.
252
+ *
253
+ * @defaultValue hover
254
+ */
255
+ trigger?: TooltipTrigger
256
+ /**
257
+ * @defaultValue false
258
+ */
259
+ useTranslate3d?: boolean
260
+ /**
261
+ * CSS styles to be applied to the wrapper `div` element.
262
+ */
263
+ wrapperStyle?: JSX.CSSProperties
264
+ }
265
+
266
+ const emptyPayload: TooltipPayload = []
267
+
268
+ export const defaultTooltipProps = {
269
+ allowEscapeViewBox: { x: false, y: false },
270
+ animationDuration: 400,
271
+ animationEasing: "ease",
272
+ axisId: 0,
273
+ contentStyle: {},
274
+ cursor: true,
275
+ filterNull: true,
276
+ includeHidden: false,
277
+ isAnimationActive: "auto",
278
+ itemSorter: "name",
279
+ itemStyle: {},
280
+ labelStyle: {},
281
+ offset: 10,
282
+ reverseDirection: { x: false, y: false },
283
+ separator: " : ",
284
+ trigger: "hover",
285
+ useTranslate3d: false,
286
+ wrapperStyle: {},
287
+ } as const satisfies Partial<TooltipProps>
288
+
289
+ /**
290
+ * The Tooltip component displays a floating box with data values when hovering over or clicking on chart elements.
291
+ *
292
+ * It can be configured to show information for individual data points or for all points at a specific axis coordinate.
293
+ * The appearance and content of the tooltip can be customized via props.
294
+ *
295
+ * @see {@link https://github.com/recharts/recharts/wiki/Tooltip-event-type-and-shared-prop Tooltip event type and shared prop wiki page}
296
+ * @see {@link https://recharts.github.io/en-US/guide/activeIndex/ Active index replacement when migrating from Recharts v2 to v3}
297
+ *
298
+ * @consumes CartesianChartContext
299
+ * @consumes PolarChartContext
300
+ * @consumes TooltipEntrySettings
301
+ */
302
+ export function Tooltip(outsideProps: TooltipProps<ValueType, NameType>) {
303
+ /* mergeProps preserves the reactive props proxy; resolveDefaultProps would freeze
304
+ `payload`/`active`/etc. as snapshots and leak the children getter through the
305
+ spread, breaking GOTCHA-005-C and GOTCHA-006-E semantics. */
306
+ const props = mergeProps(defaultTooltipProps, outsideProps) as TooltipProps<ValueType, NameType> &
307
+ typeof defaultTooltipProps
308
+
309
+ const ctx = useChartStore()
310
+ const newCtx = useOptionalChartState()
311
+ const defaultIndexAsString = (): string | null | undefined =>
312
+ typeof props.defaultIndex === "number" ? String(props.defaultIndex) : props.defaultIndex
313
+
314
+ createEffect(
315
+ (): TooltipSettingsState => ({
316
+ active: props.active,
317
+ axisId: props.axisId,
318
+ defaultIndex: defaultIndexAsString(),
319
+ shared: props.shared,
320
+ trigger: props.trigger,
321
+ }),
322
+ (settings) => {
323
+ /* Replace the settings object wholesale, like upstream setTooltipSettingsState. */
324
+ newCtx?.setState((draft: ChartState) => {
325
+ draft.tooltip.settings = settings
326
+ })
327
+ },
328
+ )
329
+
330
+ const viewBox = createMemo(() => useViewBox())
331
+ const accessibilityLayer = createMemo(() => useAccessibilityLayer())
332
+ const tooltipEventType = createMemo(() =>
333
+ ctx ? selectTooltipEventType(ctx.store, props.shared) : undefined,
334
+ )
335
+
336
+ /* selectTooltipState (D27 full merge) now handles new-state-first for all
337
+ interaction subtrees — ctx.store already reflects the merged view. */
338
+ const tooltipActiveResult = createMemo((): { isActive: boolean; activeIndex: TooltipIndex | null } => {
339
+ return (
340
+ (ctx?.store
341
+ ? selectIsTooltipActive(ctx.store, tooltipEventType(), props.trigger, defaultIndexAsString())
342
+ : undefined) ?? { activeIndex: null, isActive: false }
343
+ )
344
+ })
345
+
346
+ const payloadFromRedux = createMemo(() =>
347
+ ctx?.store
348
+ ? selectTooltipPayload(ctx.store, tooltipEventType(), props.trigger, defaultIndexAsString())
349
+ : undefined,
350
+ )
351
+
352
+ const labelFromRedux = createMemo(() =>
353
+ ctx?.store
354
+ ? selectActiveLabel(ctx.store, tooltipEventType(), props.trigger, defaultIndexAsString())
355
+ : undefined,
356
+ )
357
+
358
+ const coordinate = createMemo((): Coordinate | undefined =>
359
+ ctx?.store
360
+ ? selectActiveCoordinate(ctx.store, tooltipEventType(), props.trigger, defaultIndexAsString())
361
+ : undefined,
362
+ )
363
+
364
+ const tooltipPortalFromContext = useTooltipPortal()
365
+
366
+ /*
367
+ * The user can set `active=true` on the Tooltip in which case the Tooltip will stay always active,
368
+ * or `active=false` in which case the Tooltip never shows.
369
+ *
370
+ * If the `active` prop is not defined then it will show and hide based on mouse or keyboard activity.
371
+ */
372
+ const finalIsActive = (): boolean => props.active ?? tooltipActiveResult().isActive ?? false
373
+ const activeIndex = () => tooltipActiveResult().activeIndex
374
+
375
+ const finalLabel = () => (tooltipEventType() === "axis" ? labelFromRedux() : undefined)
376
+
377
+ /* eslint-disable-next-line solid/reactivity -- tooltipEventType and coordinate are createMemo accessors passed by reference, not invoked here */
378
+ useTooltipChartSynchronisation(
379
+ tooltipEventType,
380
+ () => props.trigger,
381
+ coordinate,
382
+ finalLabel,
383
+ activeIndex,
384
+ finalIsActive,
385
+ )
386
+
387
+ const tooltipPortal = () => props.portal ?? tooltipPortalFromContext()
388
+
389
+ const finalPayload = createMemo((): TooltipPayload => {
390
+ let fp: TooltipPayload = payloadFromRedux() ?? emptyPayload
391
+ if (!finalIsActive()) {
392
+ fp = emptyPayload
393
+ }
394
+
395
+ if (props.filterNull && fp.length) {
396
+ fp = getUniqPayload(
397
+ fp.filter(
398
+ (entry) => entry.value != null && (entry.hide !== true || props.includeHidden),
399
+ ),
400
+ props.payloadUniqBy,
401
+ defaultUniqBy,
402
+ )
403
+ }
404
+ return fp
405
+ })
406
+
407
+ const hasPayload = () => finalPayload().length > 0
408
+
409
+ /* Re-measure tooltip box whenever payload or active flips. Mirrors React's
410
+ useElementOffset([payload, finalIsActive]) — without these deps the bounding
411
+ box is read once at mount (0×0 when hidden) and never updates, leaving the
412
+ tooltip stuck at top-left of the chart. */
413
+ const [lastBoundingBox, updateBoundingBox] = useElementOffset(() => [
414
+ finalPayload(),
415
+ finalIsActive(),
416
+ ])
417
+
418
+ const tooltipContentProps = (): TooltipContentProps => ({
419
+ ...props,
420
+ accessibilityLayer: accessibilityLayer(),
421
+ active: finalIsActive(),
422
+ activeIndex: activeIndex(),
423
+ coordinate: coordinate(),
424
+ label: finalLabel(),
425
+ payload: finalPayload(),
426
+ })
427
+
428
+ const isReady = createMemo(
429
+ () => tooltipPortal() != null && viewBox() != null && tooltipEventType() != null,
430
+ )
431
+
432
+ return (
433
+ <Show when={isReady()}>
434
+ {/* Tooltip the HTML element renders through a Solid portal so that it escapes clipping, and it renders on top of everything else */}
435
+ <BarePortal mount={tooltipPortal() ?? undefined}>
436
+ <TooltipBoundingBox
437
+ allowEscapeViewBox={props.allowEscapeViewBox}
438
+ animationDuration={props.animationDuration}
439
+ animationEasing={props.animationEasing}
440
+ isAnimationActive={props.isAnimationActive}
441
+ active={finalIsActive()}
442
+ coordinate={coordinate()}
443
+ hasPayload={hasPayload()}
444
+ offset={props.offset}
445
+ position={props.position}
446
+ reverseDirection={props.reverseDirection}
447
+ useTranslate3d={props.useTranslate3d}
448
+ viewBox={viewBox() ?? { height: 0, width: 0, x: 0, y: 0 }}
449
+ wrapperStyle={props.wrapperStyle}
450
+ lastBoundingBox={lastBoundingBox()}
451
+ innerRef={updateBoundingBox}
452
+ hasPortalFromProps={Boolean(props.portal)}
453
+ >
454
+ {renderContent(props.content, tooltipContentProps())}
455
+ </TooltipBoundingBox>
456
+ </BarePortal>
457
+ <Show when={finalIsActive() && tooltipEventType()}>
458
+ {(eventType) => (
459
+ <Cursor
460
+ cursor={props.cursor}
461
+ tooltipEventType={eventType()}
462
+ coordinate={coordinate()}
463
+ payload={finalPayload()}
464
+ index={activeIndex()}
465
+ />
466
+ )}
467
+ </Show>
468
+ </Show>
469
+ )
470
+ }
@@ -0,0 +1,146 @@
1
+ /* eslint-disable import/no-cycle, sort-keys */
2
+ import { createSignal, onCleanup, onSettled, createEffect } from 'solid-js';
3
+ import type { JSX } from '@solidjs/web';
4
+ import type {
5
+ AllowInDimension,
6
+ AnimationDuration,
7
+ AnimationTiming,
8
+ CartesianViewBox,
9
+ Coordinate,
10
+ PolarCoordinate,
11
+ } from "../util/types"
12
+ import { getTooltipTranslate } from "../util/tooltip/translate"
13
+ import type { ElementOffset, SetElementOffset } from "../util/useElementOffset"
14
+ import { usePrefersReducedMotion } from "../util/usePrefersReducedMotion"
15
+
16
+ function resolveTransitionProperty(args: {
17
+ prefersReducedMotion: boolean
18
+ isAnimationActive: boolean | "auto"
19
+ active: boolean
20
+ animationDuration: number
21
+ animationEasing: AnimationTiming
22
+ }): string | undefined {
23
+ if (args.prefersReducedMotion && args.isAnimationActive === "auto") {
24
+ return undefined
25
+ }
26
+ if (args.isAnimationActive && args.active) {
27
+ return `transform ${args.animationDuration}ms ${args.animationEasing}`
28
+ }
29
+ return undefined
30
+ }
31
+
32
+ export type TooltipBoundingBoxProps = {
33
+ active: boolean
34
+ allowEscapeViewBox: AllowInDimension
35
+ animationDuration: AnimationDuration
36
+ animationEasing: AnimationTiming
37
+ children: JSX.Element
38
+ coordinate: Coordinate | PolarCoordinate | undefined
39
+ hasPayload: boolean
40
+ isAnimationActive: boolean | "auto"
41
+ offset: number | Coordinate
42
+ position: Partial<Coordinate> | undefined
43
+ reverseDirection: AllowInDimension
44
+ useTranslate3d: boolean
45
+ viewBox: CartesianViewBox
46
+ wrapperStyle: JSX.CSSProperties
47
+ lastBoundingBox: ElementOffset
48
+ innerRef: SetElementOffset
49
+ hasPortalFromProps: boolean
50
+ }
51
+
52
+ export function TooltipBoundingBox(props: TooltipBoundingBoxProps) {
53
+ const prefersReducedMotion = usePrefersReducedMotion()
54
+ const [dismissed, setDismissed] = createSignal(false)
55
+ const [dismissedAtCoordinate, setDismissedAtCoordinate] = createSignal<Coordinate>({ x: 0, y: 0 })
56
+
57
+ const handleKeyDown = (event: KeyboardEvent) => {
58
+ if (event.key === "Escape") {
59
+ setDismissed(true)
60
+ setDismissedAtCoordinate({
61
+ x: props.coordinate?.x ?? 0,
62
+ y: props.coordinate?.y ?? 0,
63
+ })
64
+ }
65
+ }
66
+
67
+ onSettled(() => {
68
+ document.addEventListener("keydown", handleKeyDown)
69
+ })
70
+
71
+ onCleanup(() => {
72
+ document.removeEventListener("keydown", handleKeyDown)
73
+ })
74
+
75
+ /* Re-show tooltip when coordinate changes after dismiss */
76
+ createEffect(
77
+ () =>
78
+ dismissed() &&
79
+ (props.coordinate?.x !== dismissedAtCoordinate().x ||
80
+ props.coordinate?.y !== dismissedAtCoordinate().y),
81
+ (moved) => {
82
+ if (moved) {
83
+ setDismissed(false)
84
+ }
85
+ },
86
+ )
87
+
88
+ const offsetLeft = () => (typeof props.offset === "number" ? props.offset : props.offset.x)
89
+ const offsetTop = () => (typeof props.offset === "number" ? props.offset : props.offset.y)
90
+
91
+ const tooltipTranslate = () =>
92
+ getTooltipTranslate({
93
+ allowEscapeViewBox: props.allowEscapeViewBox,
94
+ coordinate: props.coordinate,
95
+ offsetLeft: offsetLeft(),
96
+ offsetTop: offsetTop(),
97
+ position: props.position,
98
+ reverseDirection: props.reverseDirection,
99
+ tooltipBox: {
100
+ height: props.lastBoundingBox.height,
101
+ width: props.lastBoundingBox.width,
102
+ },
103
+ useTranslate3d: props.useTranslate3d,
104
+ viewBox: props.viewBox,
105
+ })
106
+
107
+ const isVisible = () => !dismissed() && props.active && props.hasPayload
108
+
109
+ /* do not use absolute styles if the user has passed a custom portal prop */
110
+ const positionStyles = (): JSX.CSSProperties =>
111
+ props.hasPortalFromProps
112
+ ? {}
113
+ : {
114
+ transition: resolveTransitionProperty({
115
+ prefersReducedMotion,
116
+ isAnimationActive: props.isAnimationActive,
117
+ active: props.active,
118
+ animationDuration: props.animationDuration,
119
+ animationEasing: props.animationEasing,
120
+ }),
121
+ ...tooltipTranslate().cssProperties,
122
+ "pointer-events": "none",
123
+ visibility: isVisible() ? "visible" : "hidden",
124
+ position: "absolute",
125
+ top: 0,
126
+ left: 0,
127
+ }
128
+
129
+ const outerStyle = (): JSX.CSSProperties => ({
130
+ ...positionStyles(),
131
+ visibility: isVisible() ? "visible" : "hidden",
132
+ ...props.wrapperStyle,
133
+ })
134
+
135
+ return (
136
+ /* This element allow listening to the `Escape` key. See https://github.com/recharts/recharts/pull/2925 */
137
+ <div
138
+ tabindex={-1}
139
+ class={tooltipTranslate().cssClasses}
140
+ style={outerStyle()}
141
+ ref={props.innerRef}
142
+ >
143
+ {props.children}
144
+ </div>
145
+ )
146
+ }