@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,348 @@
1
+ /* eslint-disable import/no-cycle */
2
+ import { clsx } from "clsx"
3
+ import { createContext, createMemo, createSignal, Show, useContext, createEffect, omit } from 'solid-js';
4
+ import type { JSX } from '@solidjs/web';
5
+ import throttle from "es-toolkit/compat/throttle"
6
+ import { isNumber, noop } from "../util/DataUtils"
7
+ import { warn } from "../util/LogUtils"
8
+ import {
9
+ calculateChartDimensions,
10
+ defaultResponsiveContainerProps,
11
+ getDefaultWidthAndHeight,
12
+ getInnerDivStyle,
13
+ } from "./responsiveContainerUtils"
14
+ import type { Percent, Size } from "../util/types"
15
+ import { isPositiveNumber } from "../util/isWellBehavedNumber"
16
+
17
+ export interface Props
18
+ extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "id" | "class" | "style" | "onResize" | "ref" | "children"> {
19
+ /**
20
+ * width / height. If specified, the height will be calculated by width / aspect.
21
+ */
22
+ aspect?: number
23
+ /**
24
+ * The width of chart container.
25
+ * Can be a number or a percent string like "100%".
26
+ * @default '100%'
27
+ */
28
+ width?: Percent | number
29
+ /**
30
+ * The height of chart container.
31
+ * Can be a number or a percent string like "100%".
32
+ * @default '100%'
33
+ */
34
+ height?: Percent | number
35
+ /**
36
+ * The minimum width of the container.
37
+ * @default 0
38
+ */
39
+ minWidth?: string | number
40
+ /**
41
+ * The minimum height of the container.
42
+ */
43
+ minHeight?: string | number
44
+ /**
45
+ * The initial width and height of the container.
46
+ * @default {"width":-1,"height":-1}
47
+ */
48
+ initialDimension?: {
49
+ width: number
50
+ height: number
51
+ }
52
+ /** The maximum height of the container. It can be a number. */
53
+ maxHeight?: number
54
+ /**
55
+ * The content of the container.
56
+ * It can contain multiple charts, and then they will all share the same dimensions.
57
+ */
58
+ children: JSX.Element
59
+ /**
60
+ * If specified a positive number, debounced function will be used to handle the resize event.
61
+ * @default 0
62
+ */
63
+ debounce?: number
64
+ /**
65
+ * Unique identifier of this component.
66
+ * Used as an HTML attribute `id`.
67
+ */
68
+ id?: string | number
69
+ /** The HTML element's class name */
70
+ className?: string | number
71
+ /** The style of the container. */
72
+ style?: JSX.CSSProperties
73
+ /**
74
+ * If specified provides a callback providing the updated chart width and height values.
75
+ */
76
+ onResize?: (width: number, height: number) => void
77
+ /**
78
+ * Ref callback for the container div.
79
+ */
80
+ ref?: (el: HTMLDivElement) => void
81
+ }
82
+
83
+ const ResponsiveContainerContext = createContext<Size>(
84
+ defaultResponsiveContainerProps.initialDimension,
85
+ )
86
+
87
+ function isAcceptableSize(size: {
88
+ width: number | undefined
89
+ height: number | undefined
90
+ }): size is Size {
91
+ return isPositiveNumber(size.width) && isPositiveNumber(size.height)
92
+ }
93
+
94
+ function ResponsiveContainerContextProvider(props: {
95
+ children: JSX.Element
96
+ width: number | undefined
97
+ height: number | undefined
98
+ }) {
99
+ const size = createMemo(() => ({ height: props.height, width: props.width }))
100
+ /* Solid context value is captured once at JSX time; reactive getters expose live size to consumers that destructure or read fields multiple times. */
101
+ const reactiveSize: Size = {
102
+ get height() {
103
+ return (size().height ?? -1) as number
104
+ },
105
+ get width() {
106
+ return (size().width ?? -1) as number
107
+ },
108
+ }
109
+ return (
110
+ <Show when={isAcceptableSize(size())} fallback={null}>
111
+ <ResponsiveContainerContext value={reactiveSize}>
112
+ {props.children}
113
+ </ResponsiveContainerContext>
114
+ </Show>
115
+ )
116
+ }
117
+
118
+ export const useResponsiveContainerContext = () => useContext(ResponsiveContainerContext)
119
+
120
+ function SizeDetectorContainer(props: Props) {
121
+ let containerRef: HTMLDivElement | undefined
122
+ /* remaining HTML attributes go to the root div, like upstream's `...others` */
123
+ const others = omit(
124
+ props,
125
+ "aspect",
126
+ "initialDimension",
127
+ "width",
128
+ "height",
129
+ "minWidth",
130
+ "minHeight",
131
+ "maxHeight",
132
+ "children",
133
+ "debounce",
134
+ "id",
135
+ "className",
136
+ "onResize",
137
+ "style",
138
+ "ref",
139
+ )
140
+
141
+ const aspect = () => props.aspect
142
+ const initialDimension = () =>
143
+ props.initialDimension ?? defaultResponsiveContainerProps.initialDimension
144
+ const width = () => props.width
145
+ const height = () => props.height
146
+ const minWidth = () => props.minWidth ?? defaultResponsiveContainerProps.minWidth
147
+ const minHeight = () => props.minHeight
148
+ const maxHeight = () => props.maxHeight
149
+ const debounce = () => props.debounce ?? defaultResponsiveContainerProps.debounce
150
+
151
+ const [sizes, setSizes] = createSignal({
152
+ containerHeight: initialDimension().height,
153
+ containerWidth: initialDimension().width,
154
+ })
155
+
156
+ const setContainerSize = (newWidth: number, newHeight: number) => {
157
+ const roundedWidth = Math.round(newWidth)
158
+ const roundedHeight = Math.round(newHeight)
159
+ setSizes((prevState) => {
160
+ if (
161
+ prevState.containerWidth === roundedWidth &&
162
+ prevState.containerHeight === roundedHeight
163
+ ) {
164
+ return prevState
165
+ }
166
+ return { containerHeight: roundedHeight, containerWidth: roundedWidth }
167
+ })
168
+ }
169
+
170
+ createEffect(debounce, (debounceMs) => {
171
+ if (containerRef == null || typeof ResizeObserver === "undefined") {
172
+ return noop
173
+ }
174
+ let callback = (entries: ResizeObserverEntry[]) => {
175
+ const entry = entries[0]
176
+ if (entry == null) {
177
+ return
178
+ }
179
+ const { width: containerWidth, height: containerHeight } = entry.contentRect
180
+ setContainerSize(containerWidth, containerHeight)
181
+ props.onResize?.(containerWidth, containerHeight)
182
+ }
183
+ if (debounceMs > 0) {
184
+ callback = throttle(callback, debounceMs, {
185
+ leading: false,
186
+ trailing: true,
187
+ })
188
+ }
189
+ const observer = new ResizeObserver(callback)
190
+
191
+ const { width: containerWidth, height: containerHeight } = containerRef.getBoundingClientRect()
192
+ setContainerSize(containerWidth, containerHeight)
193
+
194
+ observer.observe(containerRef)
195
+
196
+ return () => {
197
+ observer.disconnect()
198
+ }
199
+ })
200
+
201
+ const containerWidth = () => sizes().containerWidth
202
+ const containerHeight = () => sizes().containerHeight
203
+
204
+ /* eslint-disable-next-line solid/reactivity -- dev-only validation call at setup; stale warn on aspect change is acceptable */
205
+ warn(!aspect() || (aspect() ?? 0) > 0, "The aspect(%s) must be greater than zero.", aspect())
206
+
207
+ const dimensions = createMemo(() =>
208
+ calculateChartDimensions(containerWidth(), containerHeight(), {
209
+ aspect: aspect(),
210
+ height: height(),
211
+ maxHeight: maxHeight(),
212
+ width: width(),
213
+ }),
214
+ )
215
+
216
+ const calculatedWidth = () => dimensions().calculatedWidth
217
+ const calculatedHeight = () => dimensions().calculatedHeight
218
+
219
+ /* Skip warn until initial -1 placeholder has been replaced by a real measurement.
220
+ React useState defers component-body-warn until after first useEffect runs;
221
+ Solid runs the body sync so we'd otherwise emit on every chart's first paint. */
222
+ createEffect(
223
+ () =>
224
+ containerWidth() === -1 && containerHeight() === -1
225
+ ? null
226
+ : [
227
+ (calculatedWidth() != null && (calculatedWidth() ?? 0) > 0) ||
228
+ (calculatedHeight() != null && (calculatedHeight() ?? 0) > 0),
229
+ calculatedWidth(),
230
+ calculatedHeight(),
231
+ width(),
232
+ height(),
233
+ minWidth(),
234
+ minHeight(),
235
+ aspect(),
236
+ ] as const,
237
+ (args) => {
238
+ if (args == null) return
239
+ const [ok, ...values] = args
240
+ warn(
241
+ ok,
242
+ `The width(%s) and height(%s) of chart should be greater than 0,
243
+ please check the style of container, or the props width(%s) and height(%s),
244
+ or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the
245
+ height and width.`,
246
+ ...values,
247
+ )
248
+ },
249
+ )
250
+
251
+ return (
252
+ <div
253
+ id={props.id ? `${props.id}` : undefined}
254
+ class={clsx("recharts-responsive-container", props.className)}
255
+ style={{
256
+ ...props.style,
257
+ height: typeof height() === "number" ? `${height()}px` : (height() as string | undefined),
258
+ "max-height": maxHeight() ? `${maxHeight()}px` : undefined,
259
+ "min-height":
260
+ typeof minHeight() === "number"
261
+ ? `${minHeight()}px`
262
+ : (minHeight() as string | undefined),
263
+ "min-width":
264
+ typeof minWidth() === "number" ? `${minWidth()}px` : (minWidth() as string | undefined),
265
+ width: typeof width() === "number" ? `${width()}px` : (width() as string | undefined),
266
+ }}
267
+ ref={(el) => {
268
+ containerRef = el
269
+ if (typeof props.ref === "function") {
270
+ props.ref(el)
271
+ }
272
+ }}
273
+ {...others}
274
+ >
275
+ <div style={getInnerDivStyle({ height: height(), width: width() })}>
276
+ <ResponsiveContainerContextProvider width={calculatedWidth()} height={calculatedHeight()}>
277
+ {props.children}
278
+ </ResponsiveContainerContextProvider>
279
+ </div>
280
+ </div>
281
+ )
282
+ }
283
+
284
+ /**
285
+ * The `ResponsiveContainer` component is a container that adjusts its width and height based on the size of its parent element.
286
+ * It is used to create responsive charts that adapt to different screen sizes.
287
+ *
288
+ * This component uses the {@link https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver ResizeObserver} API to monitor changes to the size of its parent element.
289
+ * If you need to support older browsers that do not support this API, you may need to include a polyfill.
290
+ *
291
+ * @see {@link https://recharts.github.io/en-US/guide/sizes/ Chart size guide}
292
+ *
293
+ * @provides ResponsiveContainerContext
294
+ */
295
+ export function ResponsiveContainer(props: Props) {
296
+ const responsiveContainerContext = useResponsiveContainerContext()
297
+ if (
298
+ isPositiveNumber(responsiveContainerContext.width) &&
299
+ isPositiveNumber(responsiveContainerContext.height)
300
+ ) {
301
+ /*
302
+ * If we detect that we are already inside another ResponsiveContainer,
303
+ * we do not attempt to add another layer of responsiveness.
304
+ */
305
+ return <>{props.children}</>
306
+ }
307
+
308
+ /* eslint-disable solid/reactivity -- initial sizing pass; these pure-fn results are fixed at mount (ResponsiveContainer design intent) */
309
+ const { width, height } = getDefaultWidthAndHeight({
310
+ aspect: props.aspect,
311
+ height: props.height,
312
+ width: props.width,
313
+ })
314
+
315
+ /*
316
+ * Let's try to get the calculated dimensions without having the div container set up.
317
+ * Sometimes this does produce fixed, positive dimensions. If so, we can skip rendering the div and monitoring its size.
318
+ */
319
+ const { calculatedWidth, calculatedHeight } = calculateChartDimensions(undefined, undefined, {
320
+ aspect: props.aspect,
321
+ height,
322
+ maxHeight: props.maxHeight,
323
+ width,
324
+ })
325
+ /* eslint-enable solid/reactivity */
326
+
327
+ if (isNumber(calculatedWidth) && isNumber(calculatedHeight)) {
328
+ /*
329
+ * If it just so happens that the combination of width, height, and aspect ratio
330
+ * results in fixed dimensions, then we don't need to monitor the container's size.
331
+ * We can just provide these fixed dimensions to the context.
332
+ *
333
+ * Note that here we are not checking for positive numbers;
334
+ * if the user provides a zero or negative width/height, we will just pass that along
335
+ * as whatever size we detect won't be helping anyway.
336
+ */
337
+ return (
338
+ <ResponsiveContainerContextProvider width={calculatedWidth} height={calculatedHeight}>
339
+ {props.children}
340
+ </ResponsiveContainerContextProvider>
341
+ )
342
+ }
343
+ /*
344
+ * Static analysis did not produce fixed dimensions,
345
+ * so we need to render a special div and monitor its size.
346
+ */
347
+ return <SizeDetectorContainer {...props} width={width} height={height} />
348
+ }