@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.
- package/dist/index.d.ts +40 -2
- package/dist/index.js +14238 -7174
- package/dist/{dev.js → index.jsx} +18367 -15900
- package/dist/server.js +48178 -0
- package/package.json +36 -19
- package/src/animation/AnimatedItems.tsx +0 -183
- package/src/animation/AnimationController.ts +0 -33
- package/src/animation/AnimationControllerImpl.ts +0 -36
- package/src/animation/AnimationHandle.ts +0 -307
- package/src/animation/CSSTransitionAnimate.tsx +0 -170
- package/src/animation/JavascriptAnimate.tsx +0 -119
- package/src/animation/easing.ts +0 -221
- package/src/animation/matchBy.ts +0 -164
- package/src/animation/timeoutController.ts +0 -70
- package/src/animation/useAnimationController.tsx +0 -34
- package/src/animation/useAnimationStartSnapshot.ts +0 -118
- package/src/animation/util.ts +0 -41
- package/src/cartesian/Area.tsx +0 -915
- package/src/cartesian/AreaRevealShape.tsx +0 -190
- package/src/cartesian/Bar.tsx +0 -1369
- package/src/cartesian/BarStack.tsx +0 -152
- package/src/cartesian/Brush.tsx +0 -951
- package/src/cartesian/CartesianAxis.tsx +0 -722
- package/src/cartesian/CartesianGrid.tsx +0 -711
- package/src/cartesian/ErrorBar.tsx +0 -361
- package/src/cartesian/Funnel.tsx +0 -803
- package/src/cartesian/GraphicalItemClipPath.tsx +0 -67
- package/src/cartesian/Line.tsx +0 -863
- package/src/cartesian/LineDrawShape.tsx +0 -89
- package/src/cartesian/ReferenceArea.tsx +0 -331
- package/src/cartesian/ReferenceDot.tsx +0 -304
- package/src/cartesian/ReferenceLine.tsx +0 -474
- package/src/cartesian/Scatter.tsx +0 -888
- package/src/cartesian/XAxis.tsx +0 -433
- package/src/cartesian/YAxis.tsx +0 -443
- package/src/cartesian/ZAxis.tsx +0 -155
- package/src/cartesian/cartesianPositionToCSSTranslate.tsx +0 -29
- package/src/cartesian/cartesianViewBoxToTrapezoid.tsx +0 -21
- package/src/cartesian/getCartesianPosition.tsx +0 -267
- package/src/cartesian/getEquidistantTicks.ts +0 -144
- package/src/cartesian/getTicks.ts +0 -225
- package/src/cartesian/isOutsidePosition.ts +0 -15
- package/src/cartesian/useAnimatedLineLength.ts +0 -54
- package/src/chart/AreaChart.tsx +0 -29
- package/src/chart/BarChart.tsx +0 -29
- package/src/chart/CartesianChart.tsx +0 -131
- package/src/chart/CategoricalChart.tsx +0 -94
- package/src/chart/ComposedChart.tsx +0 -29
- package/src/chart/FunnelChart.tsx +0 -29
- package/src/chart/LineChart.tsx +0 -29
- package/src/chart/PieChart.tsx +0 -50
- package/src/chart/PolarChart.tsx +0 -164
- package/src/chart/RadarChart.tsx +0 -70
- package/src/chart/RadialBarChart.tsx +0 -46
- package/src/chart/RechartsWrapper.tsx +0 -551
- package/src/chart/Sankey.tsx +0 -1534
- package/src/chart/ScatterChart.tsx +0 -29
- package/src/chart/SunburstChart.tsx +0 -504
- package/src/chart/Treemap.tsx +0 -1223
- package/src/chart/createInitialRootProps.ts +0 -24
- package/src/chart/types.ts +0 -53
- package/src/component/ActivePoints.tsx +0 -144
- package/src/component/Cell.tsx +0 -37
- package/src/component/Cursor.tsx +0 -185
- package/src/component/Customized.tsx +0 -50
- package/src/component/DefaultLegendContent.tsx +0 -348
- package/src/component/DefaultTooltipContent.tsx +0 -224
- package/src/component/Dots.tsx +0 -157
- package/src/component/Label.tsx +0 -636
- package/src/component/LabelList.tsx +0 -375
- package/src/component/Legend.tsx +0 -512
- package/src/component/ResponsiveContainer.tsx +0 -348
- package/src/component/Text.tsx +0 -541
- package/src/component/Tooltip.tsx +0 -470
- package/src/component/TooltipBoundingBox.tsx +0 -146
- package/src/component/responsiveContainerUtils.ts +0 -134
- package/src/container/ClipPathProvider.tsx +0 -51
- package/src/container/Layer.tsx +0 -38
- package/src/container/RootSurface.tsx +0 -120
- package/src/container/Surface.tsx +0 -61
- package/src/context/CellsContext.tsx +0 -54
- package/src/context/ErrorBarContext.tsx +0 -146
- package/src/context/GraphicalItemChildrenScope.tsx +0 -18
- package/src/context/PanoramaContext.tsx +0 -9
- package/src/context/RegisterGraphicalItemId.tsx +0 -30
- package/src/context/accessibilityContext.tsx +0 -6
- package/src/context/brushUpdateContext.tsx +0 -9
- package/src/context/chartDataContext.tsx +0 -97
- package/src/context/chartLayoutContext.tsx +0 -201
- package/src/context/legendPayloadContext.tsx +0 -20
- package/src/context/legendPortalContext.tsx +0 -12
- package/src/context/tooltipContext.tsx +0 -89
- package/src/context/tooltipPortalContext.tsx +0 -12
- package/src/context/useTooltipAxis.ts +0 -22
- package/src/hooks.ts +0 -476
- package/src/index.ts +0 -280
- package/src/polar/Pie.tsx +0 -1360
- package/src/polar/PolarAngleAxis.tsx +0 -616
- package/src/polar/PolarGrid.tsx +0 -312
- package/src/polar/PolarRadiusAxis.tsx +0 -547
- package/src/polar/Radar.tsx +0 -734
- package/src/polar/RadialBar.tsx +0 -917
- package/src/polar/defaultPolarAngleAxisProps.tsx +0 -27
- package/src/polar/defaultPolarRadiusAxisProps.tsx +0 -25
- package/src/shape/Cross.tsx +0 -89
- package/src/shape/Curve.tsx +0 -343
- package/src/shape/Dot.tsx +0 -70
- package/src/shape/Polygon.tsx +0 -195
- package/src/shape/Rectangle.tsx +0 -470
- package/src/shape/Sector.tsx +0 -347
- package/src/shape/Symbols.tsx +0 -139
- package/src/shape/Trapezoid.tsx +0 -280
- package/src/state/RechartsStateContext.tsx +0 -12
- package/src/state/RechartsStateProvider.tsx +0 -87
- package/src/state/RechartsStoreContext.tsx +0 -25
- package/src/state/RechartsStoreProvider.tsx +0 -35
- package/src/state/ReportChartProps.tsx +0 -40
- package/src/state/ReportEventSettings.tsx +0 -30
- package/src/state/ReportMainChartProps.tsx +0 -61
- package/src/state/ReportPolarOptions.tsx +0 -35
- package/src/state/SetGraphicalItem.ts +0 -79
- package/src/state/SetLegendPayload.ts +0 -134
- package/src/state/SetTooltipEntrySettings.tsx +0 -72
- package/src/state/actions.ts +0 -464
- package/src/state/brushSlice.ts +0 -13
- package/src/state/cartesianAxisSlice.ts +0 -141
- package/src/state/chartDataSlice.ts +0 -50
- package/src/state/chartState.ts +0 -297
- package/src/state/errorBarSlice.ts +0 -29
- package/src/state/eventSettingsSlice.ts +0 -8
- package/src/state/events.ts +0 -76
- package/src/state/externalEventsMiddleware.ts +0 -255
- package/src/state/graphicalItemsSlice.ts +0 -74
- package/src/state/hooks/useChartSelectors.tsx +0 -45
- package/src/state/keyboardEventsMiddleware.ts +0 -228
- package/src/state/layoutSlice.ts +0 -21
- package/src/state/legendSlice.ts +0 -57
- package/src/state/mouseEventsMiddleware.ts +0 -185
- package/src/state/optionsSlice.ts +0 -47
- package/src/state/polarAxisSlice.ts +0 -10
- package/src/state/polarOptionsSlice.ts +0 -12
- package/src/state/rawData.ts +0 -26
- package/src/state/referenceElementsSlice.ts +0 -40
- package/src/state/renderedTicksSlice.ts +0 -15
- package/src/state/rootPropsSlice.ts +0 -47
- package/src/state/selectors/areaSelectors.ts +0 -240
- package/src/state/selectors/arrayEqualityCheck.ts +0 -29
- package/src/state/selectors/axisSelectors.ts +0 -2157
- package/src/state/selectors/barSelectors.ts +0 -310
- package/src/state/selectors/barStackSelectors.ts +0 -77
- package/src/state/selectors/brushSelectors.ts +0 -33
- package/src/state/selectors/chartSelector.ts +0 -185
- package/src/state/selectors/combiners/combineActiveLabel.ts +0 -16
- package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +0 -95
- package/src/state/selectors/combiners/combineAllBarPositions.ts +0 -122
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +0 -16
- package/src/state/selectors/combiners/combineBarPosition.ts +0 -23
- package/src/state/selectors/combiners/combineBarSizeList.ts +0 -80
- package/src/state/selectors/combiners/combineCheckedDomain.ts +0 -48
- package/src/state/selectors/combiners/combineConfiguredScale.ts +0 -111
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +0 -45
- package/src/state/selectors/combiners/combineDisplayedStackedData.ts +0 -50
- package/src/state/selectors/combiners/combineInverseScaleFunction.ts +0 -16
- package/src/state/selectors/combiners/combineRealScaleType.ts +0 -44
- package/src/state/selectors/combiners/combineStackedData.ts +0 -27
- package/src/state/selectors/combiners/combineTooltipInteractionState.ts +0 -86
- package/src/state/selectors/combiners/combineTooltipPayload.ts +0 -205
- package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +0 -58
- package/src/state/selectors/containerSelectors.ts +0 -12
- package/src/state/selectors/dataSelectors.ts +0 -88
- package/src/state/selectors/funnelSelectors.ts +0 -75
- package/src/state/selectors/graphicalItemSelectors.ts +0 -30
- package/src/state/selectors/legendSelectors.ts +0 -29
- package/src/state/selectors/lineSelectors.ts +0 -134
- package/src/state/selectors/numberDomainEqualityCheck.ts +0 -14
- package/src/state/selectors/pickAxisId.ts +0 -5
- package/src/state/selectors/pickAxisType.ts +0 -3
- package/src/state/selectors/pieSelectors.ts +0 -97
- package/src/state/selectors/polarAxisSelectors.ts +0 -201
- package/src/state/selectors/polarGridSelectors.ts +0 -28
- package/src/state/selectors/polarScaleSelectors.ts +0 -133
- package/src/state/selectors/polarSelectors.ts +0 -219
- package/src/state/selectors/radarSelectors.ts +0 -191
- package/src/state/selectors/radialBarSelectors.ts +0 -435
- package/src/state/selectors/rootPropsSelectors.ts +0 -25
- package/src/state/selectors/scatterSelectors.ts +0 -96
- package/src/state/selectors/selectActivePropsFromChartPointer.ts +0 -26
- package/src/state/selectors/selectAllAxes.ts +0 -17
- package/src/state/selectors/selectChartOffset.ts +0 -16
- package/src/state/selectors/selectChartOffsetInternal.ts +0 -136
- package/src/state/selectors/selectLegendArea.ts +0 -20
- package/src/state/selectors/selectPlotArea.ts +0 -22
- package/src/state/selectors/selectTooltipAxisId.ts +0 -7
- package/src/state/selectors/selectTooltipAxisType.ts +0 -32
- package/src/state/selectors/selectTooltipEventType.ts +0 -48
- package/src/state/selectors/selectTooltipPayloadSearcher.ts +0 -6
- package/src/state/selectors/selectTooltipSettings.ts +0 -39
- package/src/state/selectors/selectTooltipState.ts +0 -8
- package/src/state/selectors/selectors.ts +0 -271
- package/src/state/selectors/tooltipSelectors.ts +0 -578
- package/src/state/selectors/touchSelectors.ts +0 -31
- package/src/state/store.ts +0 -29
- package/src/state/storeIdentity.ts +0 -9
- package/src/state/teardownWrite.ts +0 -10
- package/src/state/tooltipInteraction.ts +0 -23
- package/src/state/tooltipSlice.ts +0 -334
- package/src/state/touchEventsMiddleware.ts +0 -214
- package/src/state/types/AnimationSettings.ts +0 -20
- package/src/state/types/AreaSettings.ts +0 -14
- package/src/state/types/BarSettings.ts +0 -15
- package/src/state/types/LineSettings.ts +0 -9
- package/src/state/types/PieSettings.ts +0 -34
- package/src/state/types/RadarSettings.ts +0 -5
- package/src/state/types/RadialBarSettings.ts +0 -10
- package/src/state/types/ScatterSettings.ts +0 -12
- package/src/state/types/StackedGraphicalItem.ts +0 -34
- package/src/state/useChartState.ts +0 -17
- package/src/state/zIndexSlice.ts +0 -39
- package/src/synchronisation/syncSelectors.ts +0 -7
- package/src/synchronisation/types.ts +0 -44
- package/src/synchronisation/useChartSynchronisation.tsx +0 -404
- package/src/theme/RechartsTheme.ts +0 -16
- package/src/theme/RechartsThemeContext.ts +0 -19
- package/src/theme/darkTheme.ts +0 -13
- package/src/theme/graphicalItemIdentity.ts +0 -70
- package/src/theme/legacyTheme.ts +0 -17
- package/src/theme/lightTheme.ts +0 -13
- package/src/types.ts +0 -54
- package/src/util/ActiveShapeUtils.tsx +0 -162
- package/src/util/BarUtils.tsx +0 -62
- package/src/util/BarePortal.tsx +0 -50
- package/src/util/CamelCaseSVGAttrs.ts +0 -34
- package/src/util/CartesianUtils.ts +0 -48
- package/src/util/ChartUtils.ts +0 -802
- package/src/util/Constants.ts +0 -42
- package/src/util/CssPrefixUtils.ts +0 -20
- package/src/util/DOMUtils.ts +0 -129
- package/src/util/DataUtils.ts +0 -216
- package/src/util/Events.ts +0 -16
- package/src/util/FunnelUtils.tsx +0 -15
- package/src/util/Global.ts +0 -12
- package/src/util/IfOverflow.ts +0 -15
- package/src/util/LRUCache.ts +0 -41
- package/src/util/LogUtils.ts +0 -22
- package/src/util/PolarUtils.ts +0 -132
- package/src/util/RadialBarUtils.tsx +0 -24
- package/src/util/ReactUtils.ts +0 -95
- package/src/util/ReduceCSSCalc.ts +0 -187
- package/src/util/ScatterUtils.tsx +0 -52
- package/src/util/ShapeElementProps.tsx +0 -87
- package/src/util/TickUtils.ts +0 -60
- package/src/util/XAxisUtils.ts +0 -48
- package/src/util/YAxisUtils.ts +0 -48
- package/src/util/axisPropsAreEqual.ts +0 -48
- package/src/util/createCartesianCharts.tsx +0 -150
- package/src/util/createEventProxy.ts +0 -20
- package/src/util/createPolarCharts.tsx +0 -112
- package/src/util/cursor/getCursorPoints.ts +0 -46
- package/src/util/cursor/getCursorRectangle.ts +0 -28
- package/src/util/cursor/getRadialCursorPoints.ts +0 -32
- package/src/util/excludeEventProps.ts +0 -171
- package/src/util/getActiveCoordinate.ts +0 -213
- package/src/util/getAxisTypeBasedOnLayout.ts +0 -21
- package/src/util/getClassNameFromUnknown.ts +0 -6
- package/src/util/getEveryNth.ts +0 -27
- package/src/util/getRadiusAndStrokeWidthFromDot.ts +0 -35
- package/src/util/getRelativeCoordinate.ts +0 -80
- package/src/util/getSliced.ts +0 -13
- package/src/util/hoverDedupe.ts +0 -41
- package/src/util/isDomainSpecifiedByUser.ts +0 -219
- package/src/util/isWellBehavedNumber.ts +0 -7
- package/src/util/pathTotalLength.ts +0 -25
- package/src/util/payload/getUniqPayload.ts +0 -28
- package/src/util/propsAreEqual.ts +0 -121
- package/src/util/resolveDefaultProps.ts +0 -161
- package/src/util/round.ts +0 -32
- package/src/util/scale/CartesianScaleHelper.ts +0 -72
- package/src/util/scale/CustomScaleDefinition.ts +0 -81
- package/src/util/scale/RechartsScale.ts +0 -130
- package/src/util/scale/createCategoricalInverse.ts +0 -72
- package/src/util/scale/getNiceTickValues.ts +0 -311
- package/src/util/scale/index.ts +0 -2
- package/src/util/scale/util/arithmetic.ts +0 -54
- package/src/util/solid-1-compat.ts +0 -310
- package/src/util/solidJsxCamelAugment.d.ts +0 -84
- package/src/util/stacks/getStackSeriesIdentifier.ts +0 -21
- package/src/util/stacks/stackTypes.ts +0 -60
- package/src/util/structurallyEqual.ts +0 -31
- package/src/util/svgPropertiesAndEvents.ts +0 -53
- package/src/util/svgPropertiesNoEvents.ts +0 -571
- package/src/util/tooltip/translate.ts +0 -171
- package/src/util/typedDataKey.ts +0 -48
- package/src/util/types.ts +0 -1560
- package/src/util/useAnimationId.ts +0 -31
- package/src/util/useElementOffset.ts +0 -110
- package/src/util/useId.ts +0 -8
- package/src/util/usePrefersReducedMotion.ts +0 -48
- package/src/util/useReportScale.ts +0 -24
- package/src/util/useUniqueId.ts +0 -30
- package/src/zIndex/DefaultZIndexes.ts +0 -84
- package/src/zIndex/ZIndexLayer.tsx +0 -121
- package/src/zIndex/ZIndexPortal.tsx +0 -79
- package/src/zIndex/getZIndexFromUnknown.ts +0 -14
- 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
|
-
}
|