@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.
- package/LICENSE +22 -0
- package/NOTICE +19 -0
- package/README.md +102 -0
- package/dist/dev.js +28564 -0
- package/dist/index.d.ts +7859 -0
- package/dist/index.js +28546 -0
- package/package.json +98 -0
- package/src/animation/AnimatedItems.tsx +183 -0
- package/src/animation/AnimationController.ts +33 -0
- package/src/animation/AnimationControllerImpl.ts +36 -0
- package/src/animation/AnimationHandle.ts +307 -0
- package/src/animation/CSSTransitionAnimate.tsx +170 -0
- package/src/animation/JavascriptAnimate.tsx +119 -0
- package/src/animation/easing.ts +221 -0
- package/src/animation/matchBy.ts +164 -0
- package/src/animation/timeoutController.ts +70 -0
- package/src/animation/useAnimationController.tsx +34 -0
- package/src/animation/useAnimationStartSnapshot.ts +118 -0
- package/src/animation/util.ts +41 -0
- package/src/cartesian/Area.tsx +915 -0
- package/src/cartesian/AreaRevealShape.tsx +190 -0
- package/src/cartesian/Bar.tsx +1369 -0
- package/src/cartesian/BarStack.tsx +152 -0
- package/src/cartesian/Brush.tsx +951 -0
- package/src/cartesian/CartesianAxis.tsx +722 -0
- package/src/cartesian/CartesianGrid.tsx +711 -0
- package/src/cartesian/ErrorBar.tsx +361 -0
- package/src/cartesian/Funnel.tsx +803 -0
- package/src/cartesian/GraphicalItemClipPath.tsx +67 -0
- package/src/cartesian/Line.tsx +863 -0
- package/src/cartesian/LineDrawShape.tsx +89 -0
- package/src/cartesian/ReferenceArea.tsx +331 -0
- package/src/cartesian/ReferenceDot.tsx +304 -0
- package/src/cartesian/ReferenceLine.tsx +474 -0
- package/src/cartesian/Scatter.tsx +888 -0
- package/src/cartesian/XAxis.tsx +433 -0
- package/src/cartesian/YAxis.tsx +443 -0
- package/src/cartesian/ZAxis.tsx +155 -0
- package/src/cartesian/cartesianPositionToCSSTranslate.tsx +29 -0
- package/src/cartesian/cartesianViewBoxToTrapezoid.tsx +21 -0
- package/src/cartesian/getCartesianPosition.tsx +267 -0
- package/src/cartesian/getEquidistantTicks.ts +144 -0
- package/src/cartesian/getTicks.ts +225 -0
- package/src/cartesian/isOutsidePosition.ts +15 -0
- package/src/cartesian/useAnimatedLineLength.ts +54 -0
- package/src/chart/AreaChart.tsx +29 -0
- package/src/chart/BarChart.tsx +29 -0
- package/src/chart/CartesianChart.tsx +131 -0
- package/src/chart/CategoricalChart.tsx +94 -0
- package/src/chart/ComposedChart.tsx +29 -0
- package/src/chart/FunnelChart.tsx +29 -0
- package/src/chart/LineChart.tsx +29 -0
- package/src/chart/PieChart.tsx +50 -0
- package/src/chart/PolarChart.tsx +164 -0
- package/src/chart/RadarChart.tsx +70 -0
- package/src/chart/RadialBarChart.tsx +46 -0
- package/src/chart/RechartsWrapper.tsx +551 -0
- package/src/chart/Sankey.tsx +1534 -0
- package/src/chart/ScatterChart.tsx +29 -0
- package/src/chart/SunburstChart.tsx +504 -0
- package/src/chart/Treemap.tsx +1223 -0
- package/src/chart/createInitialRootProps.ts +24 -0
- package/src/chart/types.ts +53 -0
- package/src/component/ActivePoints.tsx +144 -0
- package/src/component/Cell.tsx +37 -0
- package/src/component/Cursor.tsx +185 -0
- package/src/component/Customized.tsx +50 -0
- package/src/component/DefaultLegendContent.tsx +348 -0
- package/src/component/DefaultTooltipContent.tsx +224 -0
- package/src/component/Dots.tsx +157 -0
- package/src/component/Label.tsx +636 -0
- package/src/component/LabelList.tsx +375 -0
- package/src/component/Legend.tsx +512 -0
- package/src/component/ResponsiveContainer.tsx +348 -0
- package/src/component/Text.tsx +541 -0
- package/src/component/Tooltip.tsx +470 -0
- package/src/component/TooltipBoundingBox.tsx +146 -0
- package/src/component/responsiveContainerUtils.ts +134 -0
- package/src/container/ClipPathProvider.tsx +51 -0
- package/src/container/Layer.tsx +38 -0
- package/src/container/RootSurface.tsx +120 -0
- package/src/container/Surface.tsx +61 -0
- package/src/context/CellsContext.tsx +54 -0
- package/src/context/ErrorBarContext.tsx +146 -0
- package/src/context/GraphicalItemChildrenScope.tsx +18 -0
- package/src/context/PanoramaContext.tsx +9 -0
- package/src/context/RegisterGraphicalItemId.tsx +30 -0
- package/src/context/accessibilityContext.tsx +6 -0
- package/src/context/brushUpdateContext.tsx +9 -0
- package/src/context/chartDataContext.tsx +97 -0
- package/src/context/chartLayoutContext.tsx +201 -0
- package/src/context/legendPayloadContext.tsx +20 -0
- package/src/context/legendPortalContext.tsx +12 -0
- package/src/context/tooltipContext.tsx +89 -0
- package/src/context/tooltipPortalContext.tsx +12 -0
- package/src/context/useTooltipAxis.ts +22 -0
- package/src/hooks.ts +476 -0
- package/src/index.ts +280 -0
- package/src/polar/Pie.tsx +1360 -0
- package/src/polar/PolarAngleAxis.tsx +616 -0
- package/src/polar/PolarGrid.tsx +312 -0
- package/src/polar/PolarRadiusAxis.tsx +547 -0
- package/src/polar/Radar.tsx +734 -0
- package/src/polar/RadialBar.tsx +917 -0
- package/src/polar/defaultPolarAngleAxisProps.tsx +27 -0
- package/src/polar/defaultPolarRadiusAxisProps.tsx +25 -0
- package/src/shape/Cross.tsx +89 -0
- package/src/shape/Curve.tsx +343 -0
- package/src/shape/Dot.tsx +70 -0
- package/src/shape/Polygon.tsx +195 -0
- package/src/shape/Rectangle.tsx +470 -0
- package/src/shape/Sector.tsx +347 -0
- package/src/shape/Symbols.tsx +139 -0
- package/src/shape/Trapezoid.tsx +280 -0
- package/src/state/RechartsStateContext.tsx +12 -0
- package/src/state/RechartsStateProvider.tsx +87 -0
- package/src/state/RechartsStoreContext.tsx +25 -0
- package/src/state/RechartsStoreProvider.tsx +35 -0
- package/src/state/ReportChartProps.tsx +40 -0
- package/src/state/ReportEventSettings.tsx +30 -0
- package/src/state/ReportMainChartProps.tsx +61 -0
- package/src/state/ReportPolarOptions.tsx +35 -0
- package/src/state/SetGraphicalItem.ts +79 -0
- package/src/state/SetLegendPayload.ts +134 -0
- package/src/state/SetTooltipEntrySettings.tsx +72 -0
- package/src/state/actions.ts +464 -0
- package/src/state/brushSlice.ts +13 -0
- package/src/state/cartesianAxisSlice.ts +141 -0
- package/src/state/chartDataSlice.ts +50 -0
- package/src/state/chartState.ts +297 -0
- package/src/state/errorBarSlice.ts +29 -0
- package/src/state/eventSettingsSlice.ts +8 -0
- package/src/state/events.ts +76 -0
- package/src/state/externalEventsMiddleware.ts +255 -0
- package/src/state/graphicalItemsSlice.ts +74 -0
- package/src/state/hooks/useChartSelectors.tsx +45 -0
- package/src/state/keyboardEventsMiddleware.ts +228 -0
- package/src/state/layoutSlice.ts +21 -0
- package/src/state/legendSlice.ts +57 -0
- package/src/state/mouseEventsMiddleware.ts +185 -0
- package/src/state/optionsSlice.ts +47 -0
- package/src/state/polarAxisSlice.ts +10 -0
- package/src/state/polarOptionsSlice.ts +12 -0
- package/src/state/rawData.ts +26 -0
- package/src/state/referenceElementsSlice.ts +40 -0
- package/src/state/renderedTicksSlice.ts +15 -0
- package/src/state/rootPropsSlice.ts +47 -0
- package/src/state/selectors/areaSelectors.ts +240 -0
- package/src/state/selectors/arrayEqualityCheck.ts +29 -0
- package/src/state/selectors/axisSelectors.ts +2157 -0
- package/src/state/selectors/barSelectors.ts +310 -0
- package/src/state/selectors/barStackSelectors.ts +77 -0
- package/src/state/selectors/brushSelectors.ts +33 -0
- package/src/state/selectors/chartSelector.ts +185 -0
- package/src/state/selectors/combiners/combineActiveLabel.ts +16 -0
- package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +95 -0
- package/src/state/selectors/combiners/combineAllBarPositions.ts +122 -0
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +16 -0
- package/src/state/selectors/combiners/combineBarPosition.ts +23 -0
- package/src/state/selectors/combiners/combineBarSizeList.ts +80 -0
- package/src/state/selectors/combiners/combineCheckedDomain.ts +48 -0
- package/src/state/selectors/combiners/combineConfiguredScale.ts +111 -0
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +45 -0
- package/src/state/selectors/combiners/combineDisplayedStackedData.ts +50 -0
- package/src/state/selectors/combiners/combineInverseScaleFunction.ts +16 -0
- package/src/state/selectors/combiners/combineRealScaleType.ts +44 -0
- package/src/state/selectors/combiners/combineStackedData.ts +27 -0
- package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
- package/src/state/selectors/combiners/combineTooltipPayload.ts +205 -0
- package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +58 -0
- package/src/state/selectors/containerSelectors.ts +12 -0
- package/src/state/selectors/dataSelectors.ts +88 -0
- package/src/state/selectors/funnelSelectors.ts +75 -0
- package/src/state/selectors/graphicalItemSelectors.ts +30 -0
- package/src/state/selectors/legendSelectors.ts +29 -0
- package/src/state/selectors/lineSelectors.ts +134 -0
- package/src/state/selectors/numberDomainEqualityCheck.ts +14 -0
- package/src/state/selectors/pickAxisId.ts +5 -0
- package/src/state/selectors/pickAxisType.ts +3 -0
- package/src/state/selectors/pieSelectors.ts +97 -0
- package/src/state/selectors/polarAxisSelectors.ts +201 -0
- package/src/state/selectors/polarGridSelectors.ts +28 -0
- package/src/state/selectors/polarScaleSelectors.ts +133 -0
- package/src/state/selectors/polarSelectors.ts +219 -0
- package/src/state/selectors/radarSelectors.ts +191 -0
- package/src/state/selectors/radialBarSelectors.ts +435 -0
- package/src/state/selectors/rootPropsSelectors.ts +25 -0
- package/src/state/selectors/scatterSelectors.ts +96 -0
- package/src/state/selectors/selectActivePropsFromChartPointer.ts +26 -0
- package/src/state/selectors/selectAllAxes.ts +17 -0
- package/src/state/selectors/selectChartOffset.ts +16 -0
- package/src/state/selectors/selectChartOffsetInternal.ts +136 -0
- package/src/state/selectors/selectLegendArea.ts +20 -0
- package/src/state/selectors/selectPlotArea.ts +22 -0
- package/src/state/selectors/selectTooltipAxisId.ts +7 -0
- package/src/state/selectors/selectTooltipAxisType.ts +32 -0
- package/src/state/selectors/selectTooltipEventType.ts +48 -0
- package/src/state/selectors/selectTooltipPayloadSearcher.ts +6 -0
- package/src/state/selectors/selectTooltipSettings.ts +39 -0
- package/src/state/selectors/selectTooltipState.ts +8 -0
- package/src/state/selectors/selectors.ts +271 -0
- package/src/state/selectors/tooltipSelectors.ts +578 -0
- package/src/state/selectors/touchSelectors.ts +31 -0
- package/src/state/store.ts +29 -0
- package/src/state/storeIdentity.ts +9 -0
- package/src/state/teardownWrite.ts +10 -0
- package/src/state/tooltipInteraction.ts +23 -0
- package/src/state/tooltipSlice.ts +334 -0
- package/src/state/touchEventsMiddleware.ts +214 -0
- package/src/state/types/AnimationSettings.ts +20 -0
- package/src/state/types/AreaSettings.ts +14 -0
- package/src/state/types/BarSettings.ts +15 -0
- package/src/state/types/LineSettings.ts +9 -0
- package/src/state/types/PieSettings.ts +34 -0
- package/src/state/types/RadarSettings.ts +5 -0
- package/src/state/types/RadialBarSettings.ts +10 -0
- package/src/state/types/ScatterSettings.ts +12 -0
- package/src/state/types/StackedGraphicalItem.ts +34 -0
- package/src/state/useChartState.ts +17 -0
- package/src/state/zIndexSlice.ts +39 -0
- package/src/synchronisation/syncSelectors.ts +7 -0
- package/src/synchronisation/types.ts +44 -0
- package/src/synchronisation/useChartSynchronisation.tsx +404 -0
- package/src/theme/RechartsTheme.ts +16 -0
- package/src/theme/RechartsThemeContext.ts +19 -0
- package/src/theme/darkTheme.ts +13 -0
- package/src/theme/graphicalItemIdentity.ts +70 -0
- package/src/theme/legacyTheme.ts +17 -0
- package/src/theme/lightTheme.ts +13 -0
- package/src/types.ts +54 -0
- package/src/util/ActiveShapeUtils.tsx +162 -0
- package/src/util/BarUtils.tsx +62 -0
- package/src/util/BarePortal.tsx +50 -0
- package/src/util/CamelCaseSVGAttrs.ts +34 -0
- package/src/util/CartesianUtils.ts +48 -0
- package/src/util/ChartUtils.ts +802 -0
- package/src/util/Constants.ts +42 -0
- package/src/util/CssPrefixUtils.ts +20 -0
- package/src/util/DOMUtils.ts +129 -0
- package/src/util/DataUtils.ts +216 -0
- package/src/util/Events.ts +16 -0
- package/src/util/FunnelUtils.tsx +15 -0
- package/src/util/Global.ts +12 -0
- package/src/util/IfOverflow.ts +15 -0
- package/src/util/LRUCache.ts +41 -0
- package/src/util/LogUtils.ts +22 -0
- package/src/util/PolarUtils.ts +132 -0
- package/src/util/RadialBarUtils.tsx +24 -0
- package/src/util/ReactUtils.ts +95 -0
- package/src/util/ReduceCSSCalc.ts +187 -0
- package/src/util/ScatterUtils.tsx +52 -0
- package/src/util/ShapeElementProps.tsx +87 -0
- package/src/util/TickUtils.ts +60 -0
- package/src/util/XAxisUtils.ts +48 -0
- package/src/util/YAxisUtils.ts +48 -0
- package/src/util/axisPropsAreEqual.ts +48 -0
- package/src/util/createCartesianCharts.tsx +150 -0
- package/src/util/createEventProxy.ts +20 -0
- package/src/util/createPolarCharts.tsx +112 -0
- package/src/util/cursor/getCursorPoints.ts +46 -0
- package/src/util/cursor/getCursorRectangle.ts +28 -0
- package/src/util/cursor/getRadialCursorPoints.ts +32 -0
- package/src/util/excludeEventProps.ts +171 -0
- package/src/util/getActiveCoordinate.ts +213 -0
- package/src/util/getAxisTypeBasedOnLayout.ts +21 -0
- package/src/util/getClassNameFromUnknown.ts +6 -0
- package/src/util/getEveryNth.ts +27 -0
- package/src/util/getRadiusAndStrokeWidthFromDot.ts +35 -0
- package/src/util/getRelativeCoordinate.ts +80 -0
- package/src/util/getSliced.ts +13 -0
- package/src/util/hoverDedupe.ts +41 -0
- package/src/util/isDomainSpecifiedByUser.ts +219 -0
- package/src/util/isWellBehavedNumber.ts +7 -0
- package/src/util/pathTotalLength.ts +25 -0
- package/src/util/payload/getUniqPayload.ts +28 -0
- package/src/util/propsAreEqual.ts +121 -0
- package/src/util/resolveDefaultProps.ts +161 -0
- package/src/util/round.ts +32 -0
- package/src/util/scale/CartesianScaleHelper.ts +72 -0
- package/src/util/scale/CustomScaleDefinition.ts +81 -0
- package/src/util/scale/RechartsScale.ts +130 -0
- package/src/util/scale/createCategoricalInverse.ts +72 -0
- package/src/util/scale/getNiceTickValues.ts +311 -0
- package/src/util/scale/index.ts +2 -0
- package/src/util/scale/util/arithmetic.ts +54 -0
- package/src/util/solid-1-compat.ts +310 -0
- package/src/util/solidJsxCamelAugment.d.ts +84 -0
- package/src/util/stacks/getStackSeriesIdentifier.ts +21 -0
- package/src/util/stacks/stackTypes.ts +60 -0
- package/src/util/structurallyEqual.ts +31 -0
- package/src/util/svgPropertiesAndEvents.ts +53 -0
- package/src/util/svgPropertiesNoEvents.ts +571 -0
- package/src/util/tooltip/translate.ts +171 -0
- package/src/util/typedDataKey.ts +48 -0
- package/src/util/types.ts +1560 -0
- package/src/util/useAnimationId.ts +31 -0
- package/src/util/useElementOffset.ts +110 -0
- package/src/util/useId.ts +8 -0
- package/src/util/usePrefersReducedMotion.ts +48 -0
- package/src/util/useReportScale.ts +24 -0
- package/src/util/useUniqueId.ts +30 -0
- package/src/zIndex/DefaultZIndexes.ts +84 -0
- package/src/zIndex/ZIndexLayer.tsx +121 -0
- package/src/zIndex/ZIndexPortal.tsx +79 -0
- package/src/zIndex/getZIndexFromUnknown.ts +14 -0
- package/src/zIndex/zIndexSelectors.ts +48 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
/**
|
|
3
|
+
* @fileOverview Render a group of error bar
|
|
4
|
+
*/
|
|
5
|
+
import { createMemo, For, Show } from 'solid-js';
|
|
6
|
+
import type { CamelCaseSVGAttrs } from "../util/CamelCaseSVGAttrs"
|
|
7
|
+
import type { WithoutRemoveFalse } from "../util/types"
|
|
8
|
+
import type { JSX } from '@solidjs/web';
|
|
9
|
+
import { Layer } from "../container/Layer"
|
|
10
|
+
import type { AnimationTiming, DataKey, RectangleCoordinate } from "../util/types"
|
|
11
|
+
import type { BarRectangleItem } from "./Bar"
|
|
12
|
+
import type { LinePointItem } from "./Line"
|
|
13
|
+
import type { ScatterPointItem } from "./Scatter"
|
|
14
|
+
import { ReportErrorBarSettings, useErrorBarContext } from "../context/ErrorBarContext"
|
|
15
|
+
import { useXAxis, useYAxis } from "../hooks"
|
|
16
|
+
import { resolveDefaultProps } from "../util/resolveDefaultProps"
|
|
17
|
+
import { svgPropertiesNoEvents } from "../util/svgPropertiesNoEvents"
|
|
18
|
+
import { useChartLayout } from "../context/chartLayoutContext"
|
|
19
|
+
import { CSSTransitionAnimate, extractCssEasing } from "../animation/CSSTransitionAnimate"
|
|
20
|
+
import type { ZIndexable } from "../zIndex/ZIndexLayer"
|
|
21
|
+
import { ZIndexLayer } from "../zIndex/ZIndexLayer"
|
|
22
|
+
import { DefaultZIndexes } from "../zIndex/DefaultZIndexes"
|
|
23
|
+
|
|
24
|
+
import { splitProps } from '../util/solid-1-compat';
|
|
25
|
+
export interface ErrorBarDataItem {
|
|
26
|
+
x: number | undefined
|
|
27
|
+
y: number | undefined
|
|
28
|
+
value: number
|
|
29
|
+
errorVal?: number[] | number
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* So usually the direction is decided by the chart layout.
|
|
34
|
+
* Horizontal layout means error bars are vertical means direction=y
|
|
35
|
+
* Vertical layout means error bars are horizontal means direction=x
|
|
36
|
+
*
|
|
37
|
+
* Except! In Scatter chart, error bars can go both ways.
|
|
38
|
+
*
|
|
39
|
+
* So this property is only ever used in Scatter chart, and ignored elsewhere.
|
|
40
|
+
*/
|
|
41
|
+
export type ErrorBarDirection = "x" | "y"
|
|
42
|
+
|
|
43
|
+
export type ErrorBarDataPointFormatter<
|
|
44
|
+
T extends BarRectangleItem | LinePointItem | ScatterPointItem,
|
|
45
|
+
> = (
|
|
46
|
+
entry: T,
|
|
47
|
+
dataKey: DataKey<T, number[] | number>,
|
|
48
|
+
direction: ErrorBarDirection,
|
|
49
|
+
) => ErrorBarDataItem
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* External ErrorBar props, visible for users of the library
|
|
53
|
+
*/
|
|
54
|
+
interface ErrorBarProps<DataPointType = unknown, DataValueType = unknown> extends ZIndexable {
|
|
55
|
+
/**
|
|
56
|
+
* Decides how to extract the value of this ErrorBar from the data:
|
|
57
|
+
* - `string`: the name of the field in the data object;
|
|
58
|
+
* - `number`: the index of the field in the data;
|
|
59
|
+
* - `function`: a function that receives the data object and returns the value of this ErrorBar.
|
|
60
|
+
*
|
|
61
|
+
* The error values can be a single value for symmetric error bars;
|
|
62
|
+
* or an array of a lower and upper error value for asymmetric error bars.
|
|
63
|
+
*/
|
|
64
|
+
dataKey: DataKey<DataPointType, DataValueType>
|
|
65
|
+
/**
|
|
66
|
+
* Width of the error bar ends (the serifs) in pixels.
|
|
67
|
+
* This is not the total width of the error bar, but just the width of the little lines at the ends.
|
|
68
|
+
*
|
|
69
|
+
* The total width of the error bar is determined by the data value plus/minus the error value.
|
|
70
|
+
*
|
|
71
|
+
* @defaultValue 5
|
|
72
|
+
*/
|
|
73
|
+
width?: number
|
|
74
|
+
/**
|
|
75
|
+
* Direction of the error bar. Usually determined by chart layout, except in Scatter chart.
|
|
76
|
+
* In Scatter chart, "x" means horizontal error bars, "y" means vertical error bars.
|
|
77
|
+
*/
|
|
78
|
+
direction?: ErrorBarDirection
|
|
79
|
+
/**
|
|
80
|
+
* If set "auto", animation is disabled during SSR and when the user prefers reduced motion.
|
|
81
|
+
* @defaultValue true
|
|
82
|
+
*/
|
|
83
|
+
isAnimationActive?: boolean | "auto"
|
|
84
|
+
/**
|
|
85
|
+
* @defaultValue 0
|
|
86
|
+
*/
|
|
87
|
+
animationBegin?: number
|
|
88
|
+
/**
|
|
89
|
+
* @defaultValue 400
|
|
90
|
+
*/
|
|
91
|
+
animationDuration?: number
|
|
92
|
+
/**
|
|
93
|
+
* @defaultValue ease-in-out
|
|
94
|
+
*/
|
|
95
|
+
animationEasing?: AnimationTiming
|
|
96
|
+
/**
|
|
97
|
+
* The width of the stroke
|
|
98
|
+
*/
|
|
99
|
+
strokeWidth?: number | string
|
|
100
|
+
/**
|
|
101
|
+
* The stroke color. If "none", no line will be drawn.
|
|
102
|
+
*
|
|
103
|
+
* @defaultValue black
|
|
104
|
+
*/
|
|
105
|
+
stroke?: string
|
|
106
|
+
/**
|
|
107
|
+
* @defaultValue 400
|
|
108
|
+
*/
|
|
109
|
+
zIndex?: number
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* React's SVGProps carries the SVG `offset` attribute; Solid's line attributes do not. */
|
|
113
|
+
type OffsetAttr = { offset?: number | string }
|
|
114
|
+
|
|
115
|
+
export type Props = WithoutRemoveFalse<JSX.LineSVGAttributes<SVGLineElement>> &
|
|
116
|
+
CamelCaseSVGAttrs &
|
|
117
|
+
OffsetAttr &
|
|
118
|
+
ErrorBarProps
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Props after defaults, and required props have been applied.
|
|
122
|
+
*/
|
|
123
|
+
type ErrorBarInternalProps = WithoutRemoveFalse<JSX.LineSVGAttributes<SVGLineElement>> & OffsetAttr & {
|
|
124
|
+
dataKey: DataKey<unknown>
|
|
125
|
+
/** the width of the error bar ends */
|
|
126
|
+
width: number
|
|
127
|
+
/**
|
|
128
|
+
* Only used for ScatterChart with error bars in two directions.
|
|
129
|
+
* Only accepts a value of "x" or "y" and makes the error bars lie in that direction.
|
|
130
|
+
*/
|
|
131
|
+
direction: ErrorBarDirection
|
|
132
|
+
isAnimationActive: boolean | "auto"
|
|
133
|
+
animationBegin: number
|
|
134
|
+
animationDuration: number
|
|
135
|
+
animationEasing: AnimationTiming
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function ErrorBarImpl(props: ErrorBarInternalProps) {
|
|
139
|
+
const svgProps = () => {
|
|
140
|
+
/* eslint-disable solid/reactivity -- reactive accessor called from JSX; multi-line destructure is inside tracked scope */
|
|
141
|
+
const {
|
|
142
|
+
direction: _direction,
|
|
143
|
+
width: _width,
|
|
144
|
+
dataKey: _dataKey,
|
|
145
|
+
isAnimationActive: _isAnimationActive,
|
|
146
|
+
animationBegin: _animationBegin,
|
|
147
|
+
animationDuration: _animationDuration,
|
|
148
|
+
animationEasing: _animationEasing,
|
|
149
|
+
...others
|
|
150
|
+
} = props
|
|
151
|
+
/* eslint-enable solid/reactivity */
|
|
152
|
+
const { ref: _ref, ...noRef } = svgPropertiesNoEvents(others)
|
|
153
|
+
return noRef
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* ctx is now an Accessor (GOTCHA-005-A). Each `ctx()` re-reads through the
|
|
157
|
+
reactive Provider value so data/formatter/offset stay live as parent
|
|
158
|
+
computes rectangles/points. */
|
|
159
|
+
const ctx = useErrorBarContext()
|
|
160
|
+
const xAxis = createMemo(() => useXAxis(ctx().xAxisId))
|
|
161
|
+
const yAxis = createMemo(() => useYAxis(ctx().yAxisId))
|
|
162
|
+
|
|
163
|
+
return (
|
|
164
|
+
<Show when={xAxis()?.scale != null && yAxis()?.scale != null && ctx().data != null}>
|
|
165
|
+
<Show when={props.direction !== "x" || xAxis()?.type === "number"}>
|
|
166
|
+
<Layer class="recharts-errorBars">
|
|
167
|
+
<For each={ctx().data as ReadonlyArray<unknown>}>
|
|
168
|
+
{(entry: unknown, _dataIndex) => {
|
|
169
|
+
const formatted = () =>
|
|
170
|
+
ctx().dataPointFormatter(
|
|
171
|
+
entry as BarRectangleItem | LinePointItem | ScatterPointItem,
|
|
172
|
+
props.dataKey as DataKey<
|
|
173
|
+
BarRectangleItem | LinePointItem | ScatterPointItem,
|
|
174
|
+
number[] | number
|
|
175
|
+
>,
|
|
176
|
+
props.direction,
|
|
177
|
+
)
|
|
178
|
+
const errorVal = () => formatted().errorVal
|
|
179
|
+
const x = () => formatted().x
|
|
180
|
+
const y = () => formatted().y
|
|
181
|
+
const value = () => formatted().value
|
|
182
|
+
|
|
183
|
+
const lineCoordinates = (): Array<RectangleCoordinate> => {
|
|
184
|
+
if (errorVal() == null || x() == null || y() == null) {
|
|
185
|
+
return []
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const ev = errorVal()
|
|
189
|
+
let lowBound: number
|
|
190
|
+
let highBound: number
|
|
191
|
+
|
|
192
|
+
if (Array.isArray(ev)) {
|
|
193
|
+
const [low, high] = ev
|
|
194
|
+
if (low == null || high == null) {
|
|
195
|
+
return []
|
|
196
|
+
}
|
|
197
|
+
lowBound = low
|
|
198
|
+
highBound = high
|
|
199
|
+
} else {
|
|
200
|
+
lowBound = ev as number
|
|
201
|
+
highBound = ev as number
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const coords: Array<RectangleCoordinate> = []
|
|
205
|
+
const offset = ctx().errorBarOffset
|
|
206
|
+
|
|
207
|
+
if (props.direction === "x") {
|
|
208
|
+
const scale = xAxis()?.scale
|
|
209
|
+
const yMid = (y() as number) + offset
|
|
210
|
+
const yMin = yMid + props.width
|
|
211
|
+
const yMax = yMid - props.width
|
|
212
|
+
const xMin = scale?.map(value() - lowBound)
|
|
213
|
+
const xMax = scale?.map(value() + highBound)
|
|
214
|
+
|
|
215
|
+
if (xMin != null && xMax != null) {
|
|
216
|
+
coords.push({ x1: xMax, x2: xMax, y1: yMin, y2: yMax })
|
|
217
|
+
coords.push({ x1: xMin, x2: xMax, y1: yMid, y2: yMid })
|
|
218
|
+
coords.push({ x1: xMin, x2: xMin, y1: yMin, y2: yMax })
|
|
219
|
+
}
|
|
220
|
+
} else if (props.direction === "y") {
|
|
221
|
+
const scale = yAxis()?.scale
|
|
222
|
+
const xMid = (x() as number) + offset
|
|
223
|
+
const xMin = xMid - props.width
|
|
224
|
+
const xMax = xMid + props.width
|
|
225
|
+
const yMin = scale?.map(value() - lowBound)
|
|
226
|
+
const yMax = scale?.map(value() + highBound)
|
|
227
|
+
|
|
228
|
+
if (yMin != null && yMax != null) {
|
|
229
|
+
coords.push({ x1: xMin, x2: xMax, y1: yMax, y2: yMax })
|
|
230
|
+
coords.push({ x1: xMid, x2: xMid, y1: yMin, y2: yMax })
|
|
231
|
+
coords.push({ x1: xMin, x2: xMax, y1: yMin, y2: yMin })
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return coords
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const scaleDirection = () => (props.direction === "x" ? "scaleX" : "scaleY")
|
|
239
|
+
const transformOrigin = () =>
|
|
240
|
+
`${(x() as number) + ctx().errorBarOffset}px ${(y() as number) + ctx().errorBarOffset}px`
|
|
241
|
+
|
|
242
|
+
return (
|
|
243
|
+
<Show when={lineCoordinates().length > 0}>
|
|
244
|
+
<Layer class="recharts-errorBar" {...svgProps()}>
|
|
245
|
+
<For each={lineCoordinates()}>
|
|
246
|
+
{(c, _lineIndex) => {
|
|
247
|
+
const lineStyle = () =>
|
|
248
|
+
props.isAnimationActive
|
|
249
|
+
? { "transform-origin": transformOrigin() }
|
|
250
|
+
: undefined
|
|
251
|
+
return (
|
|
252
|
+
<CSSTransitionAnimate
|
|
253
|
+
animationId={`error-bar-${props.direction}_${c.x1}-${c.x2}-${c.y1}-${c.y2}`}
|
|
254
|
+
from={`${scaleDirection()}(0)`}
|
|
255
|
+
to={`${scaleDirection()}(1)`}
|
|
256
|
+
attributeName="transform"
|
|
257
|
+
begin={props.animationBegin}
|
|
258
|
+
easing={extractCssEasing(props.animationEasing)}
|
|
259
|
+
isActive={props.isAnimationActive}
|
|
260
|
+
duration={props.animationDuration}
|
|
261
|
+
>
|
|
262
|
+
{(style) => (
|
|
263
|
+
<line
|
|
264
|
+
{...c}
|
|
265
|
+
style={{ ...lineStyle(), ...style() }}
|
|
266
|
+
/>
|
|
267
|
+
)}
|
|
268
|
+
</CSSTransitionAnimate>
|
|
269
|
+
)
|
|
270
|
+
}}
|
|
271
|
+
</For>
|
|
272
|
+
</Layer>
|
|
273
|
+
</Show>
|
|
274
|
+
)
|
|
275
|
+
}}
|
|
276
|
+
</For>
|
|
277
|
+
</Layer>
|
|
278
|
+
</Show>
|
|
279
|
+
</Show>
|
|
280
|
+
)
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function useErrorBarDirection(
|
|
284
|
+
directionFromProps: ErrorBarDirection | undefined,
|
|
285
|
+
): ErrorBarDirection {
|
|
286
|
+
const layout = useChartLayout()
|
|
287
|
+
if (directionFromProps != null) {
|
|
288
|
+
return directionFromProps
|
|
289
|
+
}
|
|
290
|
+
if (layout != null) {
|
|
291
|
+
return layout === "horizontal" ? "y" : "x"
|
|
292
|
+
}
|
|
293
|
+
return "x"
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* Upstream key order: defaults spread into the layer, so the order sets DOM attribute order. */
|
|
297
|
+
/* eslint-disable sort-keys */
|
|
298
|
+
export const errorBarDefaultProps = {
|
|
299
|
+
stroke: "black",
|
|
300
|
+
strokeWidth: 1.5,
|
|
301
|
+
width: 5,
|
|
302
|
+
offset: 0,
|
|
303
|
+
isAnimationActive: true,
|
|
304
|
+
animationBegin: 0,
|
|
305
|
+
animationDuration: 400,
|
|
306
|
+
animationEasing: "ease-in-out",
|
|
307
|
+
zIndex: DefaultZIndexes.line,
|
|
308
|
+
} as const satisfies Partial<Props>
|
|
309
|
+
/* eslint-enable sort-keys */
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* ErrorBar renders whiskers to represent error margins on a chart.
|
|
313
|
+
*
|
|
314
|
+
* It must be a child of a graphical element.
|
|
315
|
+
*
|
|
316
|
+
* ErrorBar expects data in one of the following forms:
|
|
317
|
+
* - Symmetric error bars: a single error value representing both lower and upper bounds.
|
|
318
|
+
* - Asymmetric error bars: an array of two values representing lower and upper bounds separately. First value is the lower bound, second value is the upper bound.
|
|
319
|
+
*
|
|
320
|
+
* The values provided are relative to the main data value.
|
|
321
|
+
* For example, if the main data value is 10 and the error value is 2,
|
|
322
|
+
* the error bar will extend from 8 to 12 for symmetric error bars.
|
|
323
|
+
*
|
|
324
|
+
* In other words, what ErrorBar will render is:
|
|
325
|
+
* - For symmetric error bars: [value - errorVal, value + errorVal]
|
|
326
|
+
* - For asymmetric error bars: [value - errorVal[0], value + errorVal[1]]
|
|
327
|
+
*
|
|
328
|
+
* In stacked or ranged Bar charts, ErrorBar will use the higher data value
|
|
329
|
+
* as the reference point for calculating the error bar positions.
|
|
330
|
+
*
|
|
331
|
+
* @consumes ErrorBarContext
|
|
332
|
+
*/
|
|
333
|
+
export function ErrorBar(outsideProps: Props) {
|
|
334
|
+
const realDirection = createMemo(() => useErrorBarDirection(outsideProps.direction))
|
|
335
|
+
/* GOTCHA-013: split children before resolveDefaultProps. resolveDefaultProps
|
|
336
|
+
does `{...realProps}` which enumerates own keys of the Solid props proxy —
|
|
337
|
+
children are not part of ErrorBar's public API, but extra spread keys are
|
|
338
|
+
still resolved through proxy getters at setup. Strip first to keep the
|
|
339
|
+
resolved props plain and stable. */
|
|
340
|
+
const [, restProps] = splitProps(outsideProps, ["children"])
|
|
341
|
+
const props = resolveDefaultProps(restProps, errorBarDefaultProps)
|
|
342
|
+
|
|
343
|
+
return (
|
|
344
|
+
<>
|
|
345
|
+
<ReportErrorBarSettings dataKey={props.dataKey} direction={realDirection()} />
|
|
346
|
+
<ZIndexLayer zIndex={props.zIndex}>
|
|
347
|
+
<ErrorBarImpl
|
|
348
|
+
{...props}
|
|
349
|
+
direction={realDirection()}
|
|
350
|
+
width={props.width}
|
|
351
|
+
isAnimationActive={props.isAnimationActive}
|
|
352
|
+
animationBegin={props.animationBegin}
|
|
353
|
+
animationDuration={props.animationDuration}
|
|
354
|
+
animationEasing={props.animationEasing}
|
|
355
|
+
/>
|
|
356
|
+
</ZIndexLayer>
|
|
357
|
+
</>
|
|
358
|
+
)
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
ErrorBar.displayName = "ErrorBar"
|