@solidports/recharts 0.1.0 → 0.1.1

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 (304) hide show
  1. package/dist/index.d.ts +40 -2
  2. package/dist/index.js +14238 -7174
  3. package/dist/{dev.js → index.jsx} +18367 -15900
  4. package/dist/server.js +48178 -0
  5. package/package.json +36 -19
  6. package/src/animation/AnimatedItems.tsx +0 -183
  7. package/src/animation/AnimationController.ts +0 -33
  8. package/src/animation/AnimationControllerImpl.ts +0 -36
  9. package/src/animation/AnimationHandle.ts +0 -307
  10. package/src/animation/CSSTransitionAnimate.tsx +0 -170
  11. package/src/animation/JavascriptAnimate.tsx +0 -119
  12. package/src/animation/easing.ts +0 -221
  13. package/src/animation/matchBy.ts +0 -164
  14. package/src/animation/timeoutController.ts +0 -70
  15. package/src/animation/useAnimationController.tsx +0 -34
  16. package/src/animation/useAnimationStartSnapshot.ts +0 -118
  17. package/src/animation/util.ts +0 -41
  18. package/src/cartesian/Area.tsx +0 -915
  19. package/src/cartesian/AreaRevealShape.tsx +0 -190
  20. package/src/cartesian/Bar.tsx +0 -1369
  21. package/src/cartesian/BarStack.tsx +0 -152
  22. package/src/cartesian/Brush.tsx +0 -951
  23. package/src/cartesian/CartesianAxis.tsx +0 -722
  24. package/src/cartesian/CartesianGrid.tsx +0 -711
  25. package/src/cartesian/ErrorBar.tsx +0 -361
  26. package/src/cartesian/Funnel.tsx +0 -803
  27. package/src/cartesian/GraphicalItemClipPath.tsx +0 -67
  28. package/src/cartesian/Line.tsx +0 -863
  29. package/src/cartesian/LineDrawShape.tsx +0 -89
  30. package/src/cartesian/ReferenceArea.tsx +0 -331
  31. package/src/cartesian/ReferenceDot.tsx +0 -304
  32. package/src/cartesian/ReferenceLine.tsx +0 -474
  33. package/src/cartesian/Scatter.tsx +0 -888
  34. package/src/cartesian/XAxis.tsx +0 -433
  35. package/src/cartesian/YAxis.tsx +0 -443
  36. package/src/cartesian/ZAxis.tsx +0 -155
  37. package/src/cartesian/cartesianPositionToCSSTranslate.tsx +0 -29
  38. package/src/cartesian/cartesianViewBoxToTrapezoid.tsx +0 -21
  39. package/src/cartesian/getCartesianPosition.tsx +0 -267
  40. package/src/cartesian/getEquidistantTicks.ts +0 -144
  41. package/src/cartesian/getTicks.ts +0 -225
  42. package/src/cartesian/isOutsidePosition.ts +0 -15
  43. package/src/cartesian/useAnimatedLineLength.ts +0 -54
  44. package/src/chart/AreaChart.tsx +0 -29
  45. package/src/chart/BarChart.tsx +0 -29
  46. package/src/chart/CartesianChart.tsx +0 -131
  47. package/src/chart/CategoricalChart.tsx +0 -94
  48. package/src/chart/ComposedChart.tsx +0 -29
  49. package/src/chart/FunnelChart.tsx +0 -29
  50. package/src/chart/LineChart.tsx +0 -29
  51. package/src/chart/PieChart.tsx +0 -50
  52. package/src/chart/PolarChart.tsx +0 -164
  53. package/src/chart/RadarChart.tsx +0 -70
  54. package/src/chart/RadialBarChart.tsx +0 -46
  55. package/src/chart/RechartsWrapper.tsx +0 -551
  56. package/src/chart/Sankey.tsx +0 -1534
  57. package/src/chart/ScatterChart.tsx +0 -29
  58. package/src/chart/SunburstChart.tsx +0 -504
  59. package/src/chart/Treemap.tsx +0 -1223
  60. package/src/chart/createInitialRootProps.ts +0 -24
  61. package/src/chart/types.ts +0 -53
  62. package/src/component/ActivePoints.tsx +0 -144
  63. package/src/component/Cell.tsx +0 -37
  64. package/src/component/Cursor.tsx +0 -185
  65. package/src/component/Customized.tsx +0 -50
  66. package/src/component/DefaultLegendContent.tsx +0 -348
  67. package/src/component/DefaultTooltipContent.tsx +0 -224
  68. package/src/component/Dots.tsx +0 -157
  69. package/src/component/Label.tsx +0 -636
  70. package/src/component/LabelList.tsx +0 -375
  71. package/src/component/Legend.tsx +0 -512
  72. package/src/component/ResponsiveContainer.tsx +0 -348
  73. package/src/component/Text.tsx +0 -541
  74. package/src/component/Tooltip.tsx +0 -470
  75. package/src/component/TooltipBoundingBox.tsx +0 -146
  76. package/src/component/responsiveContainerUtils.ts +0 -134
  77. package/src/container/ClipPathProvider.tsx +0 -51
  78. package/src/container/Layer.tsx +0 -38
  79. package/src/container/RootSurface.tsx +0 -120
  80. package/src/container/Surface.tsx +0 -61
  81. package/src/context/CellsContext.tsx +0 -54
  82. package/src/context/ErrorBarContext.tsx +0 -146
  83. package/src/context/GraphicalItemChildrenScope.tsx +0 -18
  84. package/src/context/PanoramaContext.tsx +0 -9
  85. package/src/context/RegisterGraphicalItemId.tsx +0 -30
  86. package/src/context/accessibilityContext.tsx +0 -6
  87. package/src/context/brushUpdateContext.tsx +0 -9
  88. package/src/context/chartDataContext.tsx +0 -97
  89. package/src/context/chartLayoutContext.tsx +0 -201
  90. package/src/context/legendPayloadContext.tsx +0 -20
  91. package/src/context/legendPortalContext.tsx +0 -12
  92. package/src/context/tooltipContext.tsx +0 -89
  93. package/src/context/tooltipPortalContext.tsx +0 -12
  94. package/src/context/useTooltipAxis.ts +0 -22
  95. package/src/hooks.ts +0 -476
  96. package/src/index.ts +0 -280
  97. package/src/polar/Pie.tsx +0 -1360
  98. package/src/polar/PolarAngleAxis.tsx +0 -616
  99. package/src/polar/PolarGrid.tsx +0 -312
  100. package/src/polar/PolarRadiusAxis.tsx +0 -547
  101. package/src/polar/Radar.tsx +0 -734
  102. package/src/polar/RadialBar.tsx +0 -917
  103. package/src/polar/defaultPolarAngleAxisProps.tsx +0 -27
  104. package/src/polar/defaultPolarRadiusAxisProps.tsx +0 -25
  105. package/src/shape/Cross.tsx +0 -89
  106. package/src/shape/Curve.tsx +0 -343
  107. package/src/shape/Dot.tsx +0 -70
  108. package/src/shape/Polygon.tsx +0 -195
  109. package/src/shape/Rectangle.tsx +0 -470
  110. package/src/shape/Sector.tsx +0 -347
  111. package/src/shape/Symbols.tsx +0 -139
  112. package/src/shape/Trapezoid.tsx +0 -280
  113. package/src/state/RechartsStateContext.tsx +0 -12
  114. package/src/state/RechartsStateProvider.tsx +0 -87
  115. package/src/state/RechartsStoreContext.tsx +0 -25
  116. package/src/state/RechartsStoreProvider.tsx +0 -35
  117. package/src/state/ReportChartProps.tsx +0 -40
  118. package/src/state/ReportEventSettings.tsx +0 -30
  119. package/src/state/ReportMainChartProps.tsx +0 -61
  120. package/src/state/ReportPolarOptions.tsx +0 -35
  121. package/src/state/SetGraphicalItem.ts +0 -79
  122. package/src/state/SetLegendPayload.ts +0 -134
  123. package/src/state/SetTooltipEntrySettings.tsx +0 -72
  124. package/src/state/actions.ts +0 -464
  125. package/src/state/brushSlice.ts +0 -13
  126. package/src/state/cartesianAxisSlice.ts +0 -141
  127. package/src/state/chartDataSlice.ts +0 -50
  128. package/src/state/chartState.ts +0 -297
  129. package/src/state/errorBarSlice.ts +0 -29
  130. package/src/state/eventSettingsSlice.ts +0 -8
  131. package/src/state/events.ts +0 -76
  132. package/src/state/externalEventsMiddleware.ts +0 -255
  133. package/src/state/graphicalItemsSlice.ts +0 -74
  134. package/src/state/hooks/useChartSelectors.tsx +0 -45
  135. package/src/state/keyboardEventsMiddleware.ts +0 -228
  136. package/src/state/layoutSlice.ts +0 -21
  137. package/src/state/legendSlice.ts +0 -57
  138. package/src/state/mouseEventsMiddleware.ts +0 -185
  139. package/src/state/optionsSlice.ts +0 -47
  140. package/src/state/polarAxisSlice.ts +0 -10
  141. package/src/state/polarOptionsSlice.ts +0 -12
  142. package/src/state/rawData.ts +0 -26
  143. package/src/state/referenceElementsSlice.ts +0 -40
  144. package/src/state/renderedTicksSlice.ts +0 -15
  145. package/src/state/rootPropsSlice.ts +0 -47
  146. package/src/state/selectors/areaSelectors.ts +0 -240
  147. package/src/state/selectors/arrayEqualityCheck.ts +0 -29
  148. package/src/state/selectors/axisSelectors.ts +0 -2157
  149. package/src/state/selectors/barSelectors.ts +0 -310
  150. package/src/state/selectors/barStackSelectors.ts +0 -77
  151. package/src/state/selectors/brushSelectors.ts +0 -33
  152. package/src/state/selectors/chartSelector.ts +0 -185
  153. package/src/state/selectors/combiners/combineActiveLabel.ts +0 -16
  154. package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +0 -95
  155. package/src/state/selectors/combiners/combineAllBarPositions.ts +0 -122
  156. package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +0 -16
  157. package/src/state/selectors/combiners/combineBarPosition.ts +0 -23
  158. package/src/state/selectors/combiners/combineBarSizeList.ts +0 -80
  159. package/src/state/selectors/combiners/combineCheckedDomain.ts +0 -48
  160. package/src/state/selectors/combiners/combineConfiguredScale.ts +0 -111
  161. package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +0 -45
  162. package/src/state/selectors/combiners/combineDisplayedStackedData.ts +0 -50
  163. package/src/state/selectors/combiners/combineInverseScaleFunction.ts +0 -16
  164. package/src/state/selectors/combiners/combineRealScaleType.ts +0 -44
  165. package/src/state/selectors/combiners/combineStackedData.ts +0 -27
  166. package/src/state/selectors/combiners/combineTooltipInteractionState.ts +0 -86
  167. package/src/state/selectors/combiners/combineTooltipPayload.ts +0 -205
  168. package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +0 -58
  169. package/src/state/selectors/containerSelectors.ts +0 -12
  170. package/src/state/selectors/dataSelectors.ts +0 -88
  171. package/src/state/selectors/funnelSelectors.ts +0 -75
  172. package/src/state/selectors/graphicalItemSelectors.ts +0 -30
  173. package/src/state/selectors/legendSelectors.ts +0 -29
  174. package/src/state/selectors/lineSelectors.ts +0 -134
  175. package/src/state/selectors/numberDomainEqualityCheck.ts +0 -14
  176. package/src/state/selectors/pickAxisId.ts +0 -5
  177. package/src/state/selectors/pickAxisType.ts +0 -3
  178. package/src/state/selectors/pieSelectors.ts +0 -97
  179. package/src/state/selectors/polarAxisSelectors.ts +0 -201
  180. package/src/state/selectors/polarGridSelectors.ts +0 -28
  181. package/src/state/selectors/polarScaleSelectors.ts +0 -133
  182. package/src/state/selectors/polarSelectors.ts +0 -219
  183. package/src/state/selectors/radarSelectors.ts +0 -191
  184. package/src/state/selectors/radialBarSelectors.ts +0 -435
  185. package/src/state/selectors/rootPropsSelectors.ts +0 -25
  186. package/src/state/selectors/scatterSelectors.ts +0 -96
  187. package/src/state/selectors/selectActivePropsFromChartPointer.ts +0 -26
  188. package/src/state/selectors/selectAllAxes.ts +0 -17
  189. package/src/state/selectors/selectChartOffset.ts +0 -16
  190. package/src/state/selectors/selectChartOffsetInternal.ts +0 -136
  191. package/src/state/selectors/selectLegendArea.ts +0 -20
  192. package/src/state/selectors/selectPlotArea.ts +0 -22
  193. package/src/state/selectors/selectTooltipAxisId.ts +0 -7
  194. package/src/state/selectors/selectTooltipAxisType.ts +0 -32
  195. package/src/state/selectors/selectTooltipEventType.ts +0 -48
  196. package/src/state/selectors/selectTooltipPayloadSearcher.ts +0 -6
  197. package/src/state/selectors/selectTooltipSettings.ts +0 -39
  198. package/src/state/selectors/selectTooltipState.ts +0 -8
  199. package/src/state/selectors/selectors.ts +0 -271
  200. package/src/state/selectors/tooltipSelectors.ts +0 -578
  201. package/src/state/selectors/touchSelectors.ts +0 -31
  202. package/src/state/store.ts +0 -29
  203. package/src/state/storeIdentity.ts +0 -9
  204. package/src/state/teardownWrite.ts +0 -10
  205. package/src/state/tooltipInteraction.ts +0 -23
  206. package/src/state/tooltipSlice.ts +0 -334
  207. package/src/state/touchEventsMiddleware.ts +0 -214
  208. package/src/state/types/AnimationSettings.ts +0 -20
  209. package/src/state/types/AreaSettings.ts +0 -14
  210. package/src/state/types/BarSettings.ts +0 -15
  211. package/src/state/types/LineSettings.ts +0 -9
  212. package/src/state/types/PieSettings.ts +0 -34
  213. package/src/state/types/RadarSettings.ts +0 -5
  214. package/src/state/types/RadialBarSettings.ts +0 -10
  215. package/src/state/types/ScatterSettings.ts +0 -12
  216. package/src/state/types/StackedGraphicalItem.ts +0 -34
  217. package/src/state/useChartState.ts +0 -17
  218. package/src/state/zIndexSlice.ts +0 -39
  219. package/src/synchronisation/syncSelectors.ts +0 -7
  220. package/src/synchronisation/types.ts +0 -44
  221. package/src/synchronisation/useChartSynchronisation.tsx +0 -404
  222. package/src/theme/RechartsTheme.ts +0 -16
  223. package/src/theme/RechartsThemeContext.ts +0 -19
  224. package/src/theme/darkTheme.ts +0 -13
  225. package/src/theme/graphicalItemIdentity.ts +0 -70
  226. package/src/theme/legacyTheme.ts +0 -17
  227. package/src/theme/lightTheme.ts +0 -13
  228. package/src/types.ts +0 -54
  229. package/src/util/ActiveShapeUtils.tsx +0 -162
  230. package/src/util/BarUtils.tsx +0 -62
  231. package/src/util/BarePortal.tsx +0 -50
  232. package/src/util/CamelCaseSVGAttrs.ts +0 -34
  233. package/src/util/CartesianUtils.ts +0 -48
  234. package/src/util/ChartUtils.ts +0 -802
  235. package/src/util/Constants.ts +0 -42
  236. package/src/util/CssPrefixUtils.ts +0 -20
  237. package/src/util/DOMUtils.ts +0 -129
  238. package/src/util/DataUtils.ts +0 -216
  239. package/src/util/Events.ts +0 -16
  240. package/src/util/FunnelUtils.tsx +0 -15
  241. package/src/util/Global.ts +0 -12
  242. package/src/util/IfOverflow.ts +0 -15
  243. package/src/util/LRUCache.ts +0 -41
  244. package/src/util/LogUtils.ts +0 -22
  245. package/src/util/PolarUtils.ts +0 -132
  246. package/src/util/RadialBarUtils.tsx +0 -24
  247. package/src/util/ReactUtils.ts +0 -95
  248. package/src/util/ReduceCSSCalc.ts +0 -187
  249. package/src/util/ScatterUtils.tsx +0 -52
  250. package/src/util/ShapeElementProps.tsx +0 -87
  251. package/src/util/TickUtils.ts +0 -60
  252. package/src/util/XAxisUtils.ts +0 -48
  253. package/src/util/YAxisUtils.ts +0 -48
  254. package/src/util/axisPropsAreEqual.ts +0 -48
  255. package/src/util/createCartesianCharts.tsx +0 -150
  256. package/src/util/createEventProxy.ts +0 -20
  257. package/src/util/createPolarCharts.tsx +0 -112
  258. package/src/util/cursor/getCursorPoints.ts +0 -46
  259. package/src/util/cursor/getCursorRectangle.ts +0 -28
  260. package/src/util/cursor/getRadialCursorPoints.ts +0 -32
  261. package/src/util/excludeEventProps.ts +0 -171
  262. package/src/util/getActiveCoordinate.ts +0 -213
  263. package/src/util/getAxisTypeBasedOnLayout.ts +0 -21
  264. package/src/util/getClassNameFromUnknown.ts +0 -6
  265. package/src/util/getEveryNth.ts +0 -27
  266. package/src/util/getRadiusAndStrokeWidthFromDot.ts +0 -35
  267. package/src/util/getRelativeCoordinate.ts +0 -80
  268. package/src/util/getSliced.ts +0 -13
  269. package/src/util/hoverDedupe.ts +0 -41
  270. package/src/util/isDomainSpecifiedByUser.ts +0 -219
  271. package/src/util/isWellBehavedNumber.ts +0 -7
  272. package/src/util/pathTotalLength.ts +0 -25
  273. package/src/util/payload/getUniqPayload.ts +0 -28
  274. package/src/util/propsAreEqual.ts +0 -121
  275. package/src/util/resolveDefaultProps.ts +0 -161
  276. package/src/util/round.ts +0 -32
  277. package/src/util/scale/CartesianScaleHelper.ts +0 -72
  278. package/src/util/scale/CustomScaleDefinition.ts +0 -81
  279. package/src/util/scale/RechartsScale.ts +0 -130
  280. package/src/util/scale/createCategoricalInverse.ts +0 -72
  281. package/src/util/scale/getNiceTickValues.ts +0 -311
  282. package/src/util/scale/index.ts +0 -2
  283. package/src/util/scale/util/arithmetic.ts +0 -54
  284. package/src/util/solid-1-compat.ts +0 -310
  285. package/src/util/solidJsxCamelAugment.d.ts +0 -84
  286. package/src/util/stacks/getStackSeriesIdentifier.ts +0 -21
  287. package/src/util/stacks/stackTypes.ts +0 -60
  288. package/src/util/structurallyEqual.ts +0 -31
  289. package/src/util/svgPropertiesAndEvents.ts +0 -53
  290. package/src/util/svgPropertiesNoEvents.ts +0 -571
  291. package/src/util/tooltip/translate.ts +0 -171
  292. package/src/util/typedDataKey.ts +0 -48
  293. package/src/util/types.ts +0 -1560
  294. package/src/util/useAnimationId.ts +0 -31
  295. package/src/util/useElementOffset.ts +0 -110
  296. package/src/util/useId.ts +0 -8
  297. package/src/util/usePrefersReducedMotion.ts +0 -48
  298. package/src/util/useReportScale.ts +0 -24
  299. package/src/util/useUniqueId.ts +0 -30
  300. package/src/zIndex/DefaultZIndexes.ts +0 -84
  301. package/src/zIndex/ZIndexLayer.tsx +0 -121
  302. package/src/zIndex/ZIndexPortal.tsx +0 -79
  303. package/src/zIndex/getZIndexFromUnknown.ts +0 -14
  304. package/src/zIndex/zIndexSelectors.ts +0 -48
@@ -1,28 +0,0 @@
1
- import uniqBy from "es-toolkit/compat/uniqBy"
2
-
3
- type UniqueFunc<T> = (entry: T) => unknown
4
-
5
- /**
6
- * This is configuration option that decides how to filter for unique values only:
7
- *
8
- * - `false` means "no filter"
9
- * - `true` means "use recharts default filter"
10
- * - function means "use return of this function as the default key"
11
- */
12
- export type UniqueOption<T> = boolean | UniqueFunc<T>
13
-
14
- export function getUniqPayload<T>(
15
- payload: ReadonlyArray<T>,
16
- option: UniqueOption<T> | undefined,
17
- defaultUniqBy: UniqueFunc<T>,
18
- ): ReadonlyArray<T> {
19
- if (option === true) {
20
- return uniqBy(payload, defaultUniqBy)
21
- }
22
-
23
- if (typeof option === "function") {
24
- return uniqBy(payload, option)
25
- }
26
-
27
- return payload
28
- }
@@ -1,121 +0,0 @@
1
- const propsToShallowCompare = new Set<string>([
2
- "axisLine",
3
- "tickLine",
4
- "activeBar",
5
- "activeDot",
6
- "activeLabel",
7
- "activeShape",
8
- "allowEscapeViewBox",
9
- "background",
10
- "cursor",
11
- "dot",
12
- "label",
13
- "line",
14
- "margin",
15
- "padding",
16
- "position",
17
- "shape",
18
- "style",
19
- "tick",
20
- "wrapperStyle",
21
- /* radius can be an array of 4 numbers, easy to compare shallowly */
22
- "radius",
23
- "throttledEvents",
24
- ])
25
-
26
- /**
27
- * Shallow equality check for objects (one level deep).
28
- * Replacement for react-redux shallowEqual.
29
- */
30
- export function shallowEqual(a: unknown, b: unknown): boolean {
31
- if (Object.is(a, b)) {
32
- return true
33
- }
34
- if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
35
- return false
36
- }
37
- const keysA = Object.keys(a)
38
- const keysB = Object.keys(b)
39
- if (keysA.length !== keysB.length) {
40
- return false
41
- }
42
- for (const key of keysA) {
43
- if (
44
- !Object.prototype.hasOwnProperty.call(b, key) ||
45
- !Object.is((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])
46
- ) {
47
- return false
48
- }
49
- }
50
- return true
51
- }
52
-
53
- /**
54
- * When comparing two values, returns true if they are the same value or
55
- * are both NaN.
56
- *
57
- * If we used just a simple triple equals, we would get false negatives for two NaNs
58
- * which could cause extra re-renders so let's have this instead.
59
- *
60
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Equality_comparisons_and_sameness#same-value-zero_equality
61
- *
62
- * @param x first value to compare
63
- * @param y second value to compare
64
- * return true if the same, false if different
65
- */
66
- function sameValueZero(x: unknown, y: unknown): boolean {
67
- if (x == null && y == null) {
68
- /*
69
- * treat null and undefined as equal. Internally in Recharts we make no difference between these two
70
- * so there is no need to re-render.
71
- */
72
- return true
73
- }
74
- if (typeof x === "number" && typeof y === "number") {
75
- /* x and y are equal (this is true for -0 and 0) or they are both NaN */
76
- return x === y || (x !== x && y !== y)
77
- }
78
- return x === y
79
- }
80
-
81
- /**
82
- * So usually React would compare only the first level of props using Object.is.
83
- * However, in our case many props are objects or arrays, and our own docs recommend to do that!
84
- * Therefore, we need a custom comparison function that does a shallow comparison of each prop value.
85
- *
86
- * Because charts can and do receive large props (typically the data array),
87
- * we only limit this to a subset of known props that are likely to be objects/arrays.
88
- *
89
- * @param prevProps
90
- * @param nextProps
91
- */
92
- export function propsAreEqual<T extends Record<string, unknown>>(
93
- prevProps: T,
94
- nextProps: T,
95
- ): boolean {
96
- const allKeys = new Set<string>([...Object.keys(prevProps), ...Object.keys(nextProps)])
97
- for (const key of allKeys) {
98
- /*
99
- * If a key is on a special allowlist, go one level deeper
100
- * and do a shallow comparison of the values.
101
- */
102
- if (propsToShallowCompare.has(key)) {
103
- if (prevProps[key] == null && nextProps[key] == null) {
104
- /*
105
- * treat null and undefined as equal. Internally in Recharts we make no difference between these two
106
- * so there is no need to re-render.
107
- */
108
- continue
109
- }
110
- if (!shallowEqual(prevProps[key], nextProps[key])) {
111
- return false
112
- }
113
- /*
114
- * Otherwise do a simple same-value comparison (with NaN support).
115
- */
116
- } else if (!sameValueZero(prevProps[key], nextProps[key])) {
117
- return false
118
- }
119
- }
120
- return true
121
- }
@@ -1,161 +0,0 @@
1
- import type { JSX } from '@solidjs/web';
2
- import { untrack } from 'solid-js';
3
- import { mergeProps } from './solid-1-compat';
4
- import { ownStringKeys } from './svgPropertiesNoEvents';
5
- /**
6
- * Solid-aware analogue of upstream React's defaultProps + spread pattern.
7
- *
8
- * Upstream React re-runs the component on every parent re-render, so a plain
9
- * `{...realProps}` spread is fine — a new resolved object is built each pass.
10
- * In Solid the component body runs ONCE and `realProps` is a lazy proxy whose
11
- * field getters back-propagate to upstream signals. A naive `{...realProps}`
12
- * spread eagerly invokes every getter and freezes the values at mount; downstream
13
- * computations never re-fire when upstream changes (verified: chart-offset legend
14
- * reflow lands but axis-line `<line>` y attrs stayed stale at the pre-reflow value).
15
- *
16
- * The visual debug fix moved to `mergeProps(defaults, realProps)` to restore that
17
- * reactivity, but a lazy proxy hits two further hazards in this codebase:
18
- *
19
- * 1. `children` re-evaluation. The Solid JSX `<Label/>` lives behind a getter on
20
- * the parent's props proxy. Reading `realProps.children` re-invokes the getter
21
- * and produces a NEW Label instance every read; downstream `{...props}`
22
- * spreads enumerate keys and each spread re-reads children, ballooning into
23
- * orphan DOM (regressed YAxis label test: 15× duplicate `<text>`).
24
- *
25
- * 2. Iteration order. `mergeProps` enumerates default keys first, so a downstream
26
- * `{...resolved}` spread emits user-supplied keys AFTER defaults — flipping
27
- * attribute order on `<path>` (regressed Pie inactive-shape test asserts on
28
- * `getAttributeNames()` order).
29
- *
30
- * Strategy: build a plain object whose own-keys list mirrors realProps first then
31
- * defaults (matches upstream React `{...realProps}` order), back every key with a
32
- * getter that re-reads realProps lazily so reactivity is preserved, and snapshot
33
- * `children` ONCE up front so JSX-as-child doesn't multiply.
34
- */
35
- export function resolveDefaultProps<T, D extends Partial<T>>(
36
- realProps: T,
37
- defaultProps: D & DisallowExtraKeys<T, D>,
38
- ): RequiresDefaultProps<T, D> {
39
- /* Key enumeration is structural (which props were passed). Solid 2 treats
40
- Object.keys / `in` on a props or store proxy as a reactive read, and this
41
- helper runs in the component body. Snapshot once; value getters stay live. */
42
- const realKeys: ReadonlyArray<string> = untrack(() =>
43
- /* ownStringKeys: Object.keys on a props proxy pays a descriptor trap per key. */
44
- isNonNullObject(realProps) ? ownStringKeys(realProps as object) : [],
45
- )
46
- const realKeySet = new Set(realKeys)
47
- const defaultKeys = Object.keys(defaultProps as object).filter((k) => !realKeySet.has(k))
48
- const orderedKeys = [...realKeys, ...defaultKeys]
49
-
50
- /* Element children (`<Label/>` lives behind a Solid getter that mints a fresh component
51
- on each read) are read once, lazily, so they stay stable across downstream
52
- `{...props}` spreads and are instantiated where the children are placed, under that
53
- position's context providers. Primitive children (text from an expression such as
54
- `{format(props.index)}`) carry no component and stay live: every read re-runs the
55
- getter so the text tracks its inputs. */
56
- const realPropsHasChildren = untrack(
57
- () =>
58
- realProps != null && typeof realProps === "object" && "children" in (realProps as object),
59
- )
60
- let childrenMode: "unknown" | "primitive" | "element" = "unknown"
61
- let childrenSnapshot: JSX.Element | undefined
62
- const readChildren = (): JSX.Element | undefined => {
63
- if (childrenMode === "element") {
64
- return childrenSnapshot
65
- }
66
- const value = (realProps as unknown as { children: JSX.Element }).children
67
- if (childrenMode === "unknown") {
68
- childrenMode = isPrimitiveChild(value) ? "primitive" : "element"
69
- childrenSnapshot = value
70
- }
71
- return value
72
- }
73
-
74
- const target: Record<string, unknown> = {}
75
- const overrides: Record<string, unknown> = {}
76
- let hasOverride = false
77
- for (const key of orderedKeys) {
78
- Object.defineProperty(target, key, {
79
- configurable: true,
80
- enumerable: true,
81
- get() {
82
- if (hasOverride && key in overrides) {
83
- return overrides[key]
84
- }
85
- if (key === "children" && realPropsHasChildren) {
86
- return readChildren()
87
- }
88
- if (isNonNullObject(realProps)) {
89
- const v = (realProps as Record<string, unknown>)[key]
90
- if (v !== undefined) {
91
- return v
92
- }
93
- }
94
- return (defaultProps as Record<string, unknown>)[key]
95
- },
96
- /* Solid's ref assignment + downstream local-prop mutation paths write through
97
- to the resolved object. Capture writes in an overrides bag so the getters
98
- keep their reactive read paths but writers can stash refs/event handlers. */
99
- set(value: unknown) {
100
- hasOverride = true
101
- overrides[key] = value
102
- },
103
- })
104
- }
105
- return target as RequiresDefaultProps<T, D>
106
- }
107
-
108
- function isPrimitiveChild(value: unknown): boolean {
109
- return value == null || typeof value === "string" || typeof value === "number" || typeof value === "boolean"
110
- }
111
-
112
- function isNonNullObject(value: unknown): value is Record<string, unknown> {
113
- return value != null && typeof value === "object"
114
- }
115
-
116
- /* Re-export so callers that need a $PROXY-bearing proxy (e.g. `<Dynamic>` spreads)
117
- can opt in. Default consumers prefer the ordered target above. */
118
- export { mergeProps }
119
-
120
- /**
121
- * Helper type to extract the keys of T that are required.
122
- * It iterates through each key K in T. If Pick<T, K> cannot be assigned an empty object {},
123
- * it means K is required, so we keep K; otherwise, we discard it (never).
124
- * [keyof T] at the end creates a union of the kept keys.
125
- */
126
- export type RequiredKeys<T> = {
127
- [K in keyof T]-?: object extends Pick<T, K> ? never : K
128
- }[keyof T]
129
-
130
- /**
131
- * Helper type to extract the keys of T that are optional.
132
- * It iterates through each key K in T. If Pick<T, K> can be assigned an empty object {},
133
- * it means K is optional (or potentially missing), so we keep K; otherwise, we discard it (never).
134
- * [keyof T] at the end creates a union of the kept keys.
135
- */
136
- export type OptionalKeys<T> = {
137
- [K in keyof T]-?: object extends Pick<T, K> ? K : never
138
- }[keyof T]
139
-
140
- /**
141
- * Helper type to ensure keys of D exist in T.
142
- * For each key K in D, if K is also a key of T, keep the type D[K].
143
- * If K is NOT a key of T, map it to type `never`.
144
- * An object cannot have a property of type `never`, effectively disallowing extra keys.
145
- */
146
- export type DisallowExtraKeys<T, D> = { [K in keyof D]: K extends keyof T ? D[K] : never }
147
-
148
- /**
149
- * This type will take a source type `Props` and a default type `Defaults` and will return a new type
150
- * where all properties that are optional in `Props` but required in `Defaults` are made required in the result.
151
- * Properties that are required in `Props` and optional in `Defaults` will remain required.
152
- * Properties that are optional in both `Props` and `Defaults` will remain optional.
153
- *
154
- * This is useful for creating a type that represents the resolved props of a component with default props.
155
- */
156
- export type RequiresDefaultProps<Props, Defaults extends Partial<Props>> = Pick<
157
- Props,
158
- RequiredKeys<Props>
159
- > &
160
- Required<Pick<Props, Extract<OptionalKeys<Props>, RequiredKeys<Defaults>>>> &
161
- Pick<Props, Exclude<OptionalKeys<Props>, keyof Defaults>>
package/src/util/round.ts DELETED
@@ -1,32 +0,0 @@
1
- /* if you go lower than 3, wild wild things happen during rendering */
2
- const defaultRoundPrecision = 4
3
-
4
- export function round(num: number, roundPrecision: number = defaultRoundPrecision): number {
5
- const factor = 10 ** roundPrecision
6
- const rounded = Math.round(num * factor) / factor
7
- if (Object.is(rounded, -0)) {
8
- return 0
9
- }
10
- return rounded
11
- }
12
-
13
- /**
14
- * This function will accept a string template literal and for each
15
- * variable placeholder, it will round the value to avoid long float numbers in
16
- * the SVG path which might cause rendering issues in some browsers.
17
- */
18
- export function roundTemplateLiteral(
19
- strings: TemplateStringsArray,
20
- ...values: ReadonlyArray<number | string>
21
- ) {
22
- return strings.reduce((result, string, i) => {
23
- const value = values[i - 1]
24
- if (typeof value === "string") {
25
- return result + value + string
26
- }
27
- if (value !== undefined) {
28
- return result + round(value) + string
29
- }
30
- return result + string
31
- }, "")
32
- }
@@ -1,72 +0,0 @@
1
- /* eslint-disable import/no-cycle */
2
- import { BandPosition, RechartsScale } from "./RechartsScale"
3
- import { CategoricalDomainItem, Coordinate, NullableCoordinate } from "../types"
4
-
5
- export interface CartesianScaleHelper<
6
- XDomain extends CategoricalDomainItem = CategoricalDomainItem,
7
- YDomain extends CategoricalDomainItem = CategoricalDomainItem,
8
- > {
9
- map(value: { x: XDomain; y: YDomain }, { position }: { position: BandPosition }): Coordinate
10
-
11
- mapWithFallback(
12
- value: { x?: XDomain | null | undefined; y?: YDomain | null | undefined },
13
- { position, fallback }: { position?: BandPosition; fallback: "rangeMin" | "rangeMax" },
14
- ): Coordinate
15
-
16
- isInRange({ x, y }: Partial<NullableCoordinate>): boolean
17
- }
18
-
19
- /**
20
- * Groups X and Y scale functions together and provides helper methods.
21
- */
22
- export class CartesianScaleHelperImpl<
23
- XDomain extends CategoricalDomainItem = CategoricalDomainItem,
24
- YDomain extends CategoricalDomainItem = CategoricalDomainItem,
25
- > implements CartesianScaleHelper<XDomain, YDomain> {
26
- private xAxisScale: RechartsScale<XDomain>
27
-
28
- private yAxisScale: RechartsScale<YDomain>
29
-
30
- constructor({ x, y }: { x: RechartsScale<XDomain>; y: RechartsScale<YDomain> }) {
31
- this.xAxisScale = x
32
- this.yAxisScale = y
33
- }
34
-
35
- map(value: { x: XDomain; y: YDomain }, { position }: { position: BandPosition }): Coordinate {
36
- return {
37
- x: this.xAxisScale.map(value.x, { position }) ?? 0,
38
- y: this.yAxisScale.map(value.y, { position }) ?? 0,
39
- }
40
- }
41
-
42
- mapWithFallback(
43
- value: { x?: XDomain | null | undefined; y?: YDomain | null | undefined },
44
- { position, fallback }: { position?: BandPosition; fallback: "rangeMin" | "rangeMax" },
45
- ): Coordinate {
46
- let fallbackY: number, fallbackX: number
47
- if (fallback === "rangeMin") {
48
- fallbackY = this.yAxisScale.rangeMin()
49
- } else if (fallback === "rangeMax") {
50
- fallbackY = this.yAxisScale.rangeMax()
51
- } else {
52
- fallbackY = 0
53
- }
54
- if (fallback === "rangeMin") {
55
- fallbackX = this.xAxisScale.rangeMin()
56
- } else if (fallback === "rangeMax") {
57
- fallbackX = this.xAxisScale.rangeMax()
58
- } else {
59
- fallbackX = 0
60
- }
61
- return {
62
- x: this.xAxisScale.map(value.x, { position }) ?? fallbackX,
63
- y: this.yAxisScale.map(value.y, { position }) ?? fallbackY,
64
- }
65
- }
66
-
67
- isInRange({ x, y }: Partial<NullableCoordinate>): boolean {
68
- const xInRange = x == null || this.xAxisScale.isInRange(x)
69
- const yInRange = y == null || this.yAxisScale.isInRange(y)
70
- return xInRange && yInRange
71
- }
72
- }
@@ -1,81 +0,0 @@
1
- import type { CategoricalDomainItem } from "../types"
2
-
3
- /**
4
- * A subset of d3-scale. This is the external representation;
5
- * This is the type that we expect from `axis.scale` props, if users want to provide custom scales.
6
- *
7
- * The actual d3 scales have many more methods, but we don't need them all.
8
- * Specifically we want to avoid all the setters
9
- * - immutable API is preferred in Recharts and mutating state will lead to hard-to-debug issues.
10
- *
11
- * @see {@link ScaleType} and {@link D3ScaleType} for string shortcuts that you can use instead of this interface.
12
- */
13
- export interface CustomScaleDefinition<
14
- Domain extends CategoricalDomainItem = CategoricalDomainItem,
15
- > {
16
- /**
17
- * Returns the scale's current domain.
18
- * The domain could be:
19
- * - in categorical scales: an array of strings or categories
20
- * - in continuous scales: tuple of two numbers: [min, max]
21
- */
22
- domain(): ReadonlyArray<Domain>
23
-
24
- /**
25
- * Sets the domain of the scale.
26
- */
27
- domain(newDomain: ReadonlyArray<Domain>): this
28
-
29
- /**
30
- * Returns the scale's current range.
31
- */
32
- range(): ReadonlyArray<number>
33
-
34
- /**
35
- * Sets the range of the scale.
36
- */
37
- range(newRange: ReadonlyArray<number>): this
38
-
39
- /**
40
- * Returns an exact copy of this scale. Changes to this scale will not affect the returned scale, and vice versa.
41
- * We use this method in Recharts to ensure immutability - changes to the scale outside should not affect the internal state,
42
- * as they won't trigger re-renders in React.
43
- */
44
- copy(): CustomScaleDefinition<Domain>
45
-
46
- /**
47
- * Returns width of each band.
48
- * Most scales are not banded, so this method is optional.
49
- * Banded scales (like scaleBand from d3-scale) will implement this method.
50
- */
51
- bandwidth?: () => number
52
- /**
53
- * Quantitative (continuous) scales provide a ticks method that returns representative values from the scale's domain.
54
- * Ordinal and band scales do not have this method.
55
- *
56
- * An optional count argument requests more or fewer ticks.
57
- * The number of ticks returned, however, is not necessarily equal to the requested count.
58
- *
59
- * @see {@link https://d3js.org/d3-scale/linear#linear_ticks}
60
- * @see {@link https://observablehq.com/@d3/scale-ticks}
61
- *
62
- * @param count number of ticks
63
- */
64
- ticks?: (count: number | undefined) => ReadonlyArray<number>
65
-
66
- /**
67
- * Given an arbitrary input, returns the corresponding point derived from the output range if the input is in the scale's domain.
68
- * If the input is not included in the domain, returns undefined.
69
- *
70
- * @param input
71
- */
72
- (input: Domain): number | undefined
73
-
74
- /**
75
- * Given a value from the range, returns the corresponding value from the domain.
76
- *
77
- * This method is optional, as not all scales provide an inverse mapping.
78
- * Linear and time scales typically do, while band and ordinal scales may not.
79
- */
80
- invert?(value: number): Domain | undefined
81
- }
@@ -1,130 +0,0 @@
1
- /* eslint-disable import/no-cycle */
2
- import { CustomScaleDefinition } from "./CustomScaleDefinition"
3
- import { CategoricalDomainItem } from "../types"
4
-
5
- /**
6
- * This is internal representation of scale used in Recharts.
7
- * Users will provide CustomScaleDefinition or a string, which we will parse into RechartsScale.
8
- * Most importantly, RechartsScale is fully immutable - there are no setters that mutate the scale in place.
9
- * This is important for Solid integration - if the scale changes, we want to trigger re-renders.
10
- * Mutating the scale in place would not trigger re-renders, leading to stale UI.
11
- */
12
- export interface RechartsScale<Domain extends CategoricalDomainItem = CategoricalDomainItem> {
13
- /**
14
- * Returns the scale's current domain.
15
- * The domain could be:
16
- * - in categorical scales: an array of strings or categories
17
- * - in continuous scales: tuple of two numbers: [min, max]
18
- */
19
- domain(): ReadonlyArray<Domain>
20
-
21
- /**
22
- * Returns the scale's current range.
23
- *
24
- * This should be a readonly tuple of two numbers: [min, max]
25
- * and so a better type would be `readonly [number, number]` but again - breaking changes,
26
- * so let's keep that for 4.0.
27
- */
28
- range(): ReadonlyArray<number>
29
-
30
- /**
31
- * Returns the minimum value from the range.
32
- */
33
- rangeMin(): number
34
-
35
- /**
36
- * Returns the maximum value from the range.
37
- */
38
- rangeMax(): number
39
-
40
- /**
41
- * Returns true if the given value is within the scale's range.
42
- * @param value
43
- */
44
- isInRange(value: number): boolean
45
-
46
- /**
47
- * Returns width of each band.
48
- * Most scales are not banded, so this method is optional.
49
- * Banded scales (like scaleBand from d3-scale) will implement this method.
50
- */
51
- bandwidth?: () => number
52
- /**
53
- * Quantitative (continuous) scales provide a ticks method that returns representative values from the scale's domain.
54
- * Ordinal and band scales do not have this method.
55
- *
56
- * An optional count argument requests more or fewer ticks.
57
- * The number of ticks returned, however, is not necessarily equal to the requested count.
58
- *
59
- * @see {@link https://d3js.org/d3-scale/linear#linear_ticks}
60
- * @see {@link https://observablehq.com/@d3/scale-ticks}
61
- *
62
- * @param count number of ticks
63
- */
64
- ticks?: (count: number | undefined) => ReadonlyArray<number>
65
-
66
- /**
67
- * Given an arbitrary input, returns the corresponding point derived from the output range if the input is in the scale's domain.
68
- * If the input is not included in the domain, returns undefined.
69
- */
70
- map(input: unknown, options?: { position?: BandPosition }): number | undefined
71
- }
72
-
73
- /**
74
- * Position within a band for banded scales.
75
- * In scales that are not banded, this parameter is ignored.
76
- *
77
- * @inline
78
- */
79
- export type BandPosition = "start" | "middle" | "end"
80
-
81
- export function rechartsScaleFactory<Domain extends CategoricalDomainItem = CategoricalDomainItem>(
82
- d3Scale: CustomScaleDefinition<Domain>,
83
- ): RechartsScale<Domain>
84
- export function rechartsScaleFactory<Domain extends CategoricalDomainItem = CategoricalDomainItem>(
85
- d3Scale: CustomScaleDefinition<Domain> | undefined,
86
- ): RechartsScale<Domain> | undefined
87
- export function rechartsScaleFactory<Domain extends CategoricalDomainItem = CategoricalDomainItem>(
88
- d3Scale: CustomScaleDefinition<Domain> | undefined,
89
- ): RechartsScale<Domain> | undefined {
90
- if (d3Scale == null) {
91
- return undefined
92
- }
93
- const ticksFn = d3Scale.ticks
94
- const bandwidthFn = d3Scale.bandwidth
95
- const d3Range: ReadonlyArray<number> = d3Scale.range()
96
- const range: [number, number] = [Math.min(...d3Range), Math.max(...d3Range)]
97
- return {
98
- bandwidth: bandwidthFn ? () => bandwidthFn.call(d3Scale) : undefined,
99
- domain: () => d3Scale.domain(),
100
- isInRange(value: number): boolean {
101
- const first = range[0]
102
- const last = range[1]
103
- return first <= last ? value >= first && value <= last : value >= last && value <= first
104
- },
105
- map: (input: Domain, options?: { position?: BandPosition }) => {
106
- let baseValue = d3Scale(input)
107
- if (baseValue == null) {
108
- return undefined
109
- }
110
- if (d3Scale.bandwidth && options?.position) {
111
- const bandWidth = d3Scale.bandwidth()
112
- switch (options.position) {
113
- case "middle":
114
- baseValue += bandWidth / 2
115
- break
116
- case "end":
117
- baseValue += bandWidth
118
- break
119
- default:
120
- break
121
- }
122
- }
123
- return baseValue
124
- },
125
- range: () => range,
126
- rangeMax: () => range[1],
127
- rangeMin: () => range[0],
128
- ticks: ticksFn ? (count: number | undefined) => ticksFn.call(d3Scale, count) : undefined,
129
- }
130
- }