@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,141 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AxisDomain,
|
|
3
|
+
AxisInterval,
|
|
4
|
+
AxisTick,
|
|
5
|
+
DataKey,
|
|
6
|
+
EvaluatedAxisDomainType,
|
|
7
|
+
ScaleType,
|
|
8
|
+
TickProp,
|
|
9
|
+
} from "../util/types"
|
|
10
|
+
import type { TickFormatter } from "../cartesian/CartesianAxis"
|
|
11
|
+
import type { AxisRange } from "./selectors/axisSelectors"
|
|
12
|
+
import type { CustomScaleDefinition } from "../util/scale/CustomScaleDefinition"
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @inline
|
|
16
|
+
*/
|
|
17
|
+
export type AxisId = string | number
|
|
18
|
+
export const defaultAxisId: AxisId = 0
|
|
19
|
+
export type XAxisPadding = { left?: number; right?: number } | "gap" | "no-gap"
|
|
20
|
+
export type YAxisPadding = { top?: number; bottom?: number } | "gap" | "no-gap"
|
|
21
|
+
|
|
22
|
+
export type XAxisOrientation = "top" | "bottom"
|
|
23
|
+
export type YAxisOrientation = "left" | "right"
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Controls how Recharts calculates "nice" tick values for an axis.
|
|
27
|
+
* - `'auto'` (default): nice ticks for linear numeric axes, extending an `'auto'` domain.
|
|
28
|
+
* - `'adaptive'`: always use the space-efficient algorithm.
|
|
29
|
+
* - `'snap125'`: snap steps to 1, 2, 2.5, 5 at each order of magnitude.
|
|
30
|
+
* - `'none'`: no nice ticks.
|
|
31
|
+
*
|
|
32
|
+
* @inline
|
|
33
|
+
*/
|
|
34
|
+
export type NiceTicksAlgorithm = "none" | "auto" | "adaptive" | "snap125"
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Properties shared in X, Y, and Z axes.
|
|
38
|
+
* User defined axis settings, coming from props.
|
|
39
|
+
*/
|
|
40
|
+
export type BaseCartesianAxis = {
|
|
41
|
+
id: AxisId
|
|
42
|
+
scale:
|
|
43
|
+
| ScaleType
|
|
44
|
+
| CustomScaleDefinition
|
|
45
|
+
| CustomScaleDefinition<string>
|
|
46
|
+
| CustomScaleDefinition<number>
|
|
47
|
+
| CustomScaleDefinition<Date>
|
|
48
|
+
/**
|
|
49
|
+
* Before creating this object, evaluate the domain type based on the chart layout so that we have the 'auto' resolved.
|
|
50
|
+
*/
|
|
51
|
+
type: EvaluatedAxisDomainType
|
|
52
|
+
/**
|
|
53
|
+
* The axis functionality is severely restricted without a dataKey
|
|
54
|
+
* - but there is still something left, and the prop is optional
|
|
55
|
+
* so this can also be undefined even in real charts.
|
|
56
|
+
* There are no defaults.
|
|
57
|
+
*/
|
|
58
|
+
dataKey: DataKey<unknown> | undefined
|
|
59
|
+
unit: string | undefined
|
|
60
|
+
name: string | undefined
|
|
61
|
+
allowDuplicatedCategory: boolean
|
|
62
|
+
allowDataOverflow: boolean
|
|
63
|
+
reversed: boolean
|
|
64
|
+
includeHidden: boolean
|
|
65
|
+
domain: AxisDomain | undefined
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type TicksSettings = {
|
|
69
|
+
allowDecimals: boolean
|
|
70
|
+
/**
|
|
71
|
+
* We pass the suggested number of ticks to d3 https://d3js.org/d3-scale/linear#linear_ticks
|
|
72
|
+
* This number is a suggestion. d3 tries to accommodate it, but it might return more or less ticks than requested:
|
|
73
|
+
* > The specified count is only a hint; the scale may return more or fewer values depending on the domain.
|
|
74
|
+
*
|
|
75
|
+
* If undefined, then d3 decides the number of ticks on its own. The default in d3 is 10,
|
|
76
|
+
* but it can vary based on the domain size and other factors.
|
|
77
|
+
*/
|
|
78
|
+
tickCount: number | undefined
|
|
79
|
+
/**
|
|
80
|
+
* Ticks can be any type when the axis is the type of category
|
|
81
|
+
* Ticks must be numbers when the axis is the type of number
|
|
82
|
+
*/
|
|
83
|
+
ticks: ReadonlyArray<AxisTick> | undefined
|
|
84
|
+
tick: TickProp<unknown>
|
|
85
|
+
/**
|
|
86
|
+
* Controls how Recharts calculates "nice" tick values for this axis.
|
|
87
|
+
* See {@link NiceTicksAlgorithm} for a full description of each option.
|
|
88
|
+
*
|
|
89
|
+
* @defaultValue 'auto'
|
|
90
|
+
*/
|
|
91
|
+
niceTicks: NiceTicksAlgorithm
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* These are the external props, visible for users as they set them using our public API.
|
|
96
|
+
* There is all sorts of internal computed things based on these, but they will come through selectors.
|
|
97
|
+
*
|
|
98
|
+
* Properties shared between X and Y axes
|
|
99
|
+
*/
|
|
100
|
+
export type CartesianAxisSettings = BaseCartesianAxis &
|
|
101
|
+
TicksSettings & {
|
|
102
|
+
interval: AxisInterval
|
|
103
|
+
mirror: boolean
|
|
104
|
+
minTickGap: number
|
|
105
|
+
angle: number
|
|
106
|
+
hide: boolean
|
|
107
|
+
tickFormatter: TickFormatter | undefined
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export type XAxisHeight = number | "auto"
|
|
111
|
+
|
|
112
|
+
export type XAxisSettings = CartesianAxisSettings & {
|
|
113
|
+
padding: XAxisPadding
|
|
114
|
+
height: XAxisHeight
|
|
115
|
+
orientation: XAxisOrientation
|
|
116
|
+
heightHistory?: number[]
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export type YAxisWidth = number | "auto"
|
|
120
|
+
|
|
121
|
+
export type YAxisSettings = CartesianAxisSettings & {
|
|
122
|
+
padding: YAxisPadding
|
|
123
|
+
width: YAxisWidth
|
|
124
|
+
orientation: YAxisOrientation
|
|
125
|
+
widthHistory?: number[]
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Z axis is special because it's never displayed. It controls the size of Scatter dots,
|
|
130
|
+
* but it never displays ticks anywhere.
|
|
131
|
+
*/
|
|
132
|
+
export type ZAxisSettings = BaseCartesianAxis & {
|
|
133
|
+
range: AxisRange
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export type AxisMapState = {
|
|
137
|
+
xAxis: Record<AxisId, XAxisSettings>
|
|
138
|
+
yAxis: Record<AxisId, YAxisSettings>
|
|
139
|
+
zAxis: Record<AxisId, ZAxisSettings>
|
|
140
|
+
}
|
|
141
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { BrushStartEndIndex } from "../context/brushUpdateContext"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This is the data that's coming through main chart `data` prop
|
|
5
|
+
* Recharts is very flexible in what it accepts so the type is very flexible too.
|
|
6
|
+
* This will typically be an object, and various components will provide various `dataKey`
|
|
7
|
+
* that dictates how to pull data from that object.
|
|
8
|
+
*
|
|
9
|
+
* TL;DR: before dataKey
|
|
10
|
+
*
|
|
11
|
+
* @inline
|
|
12
|
+
*/
|
|
13
|
+
export type ChartData<DataPointType = unknown> = ReadonlyArray<DataPointType>
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* So this is the same unknown type as ChartData but this is after the dataKey has been applied.
|
|
17
|
+
* We still don't know what the type is - that depends on what exactly it was before the dataKey application,
|
|
18
|
+
* and the dataKey can return whatever anyway - but let's keep it separate as a form of documentation.
|
|
19
|
+
*
|
|
20
|
+
* TL;DR: ChartData after dataKey.
|
|
21
|
+
*/
|
|
22
|
+
export type AppliedChartData = ReadonlyArray<{ value: unknown }>
|
|
23
|
+
|
|
24
|
+
export type ChartDataState = {
|
|
25
|
+
chartData: ChartData | undefined
|
|
26
|
+
/**
|
|
27
|
+
* store a copy of chart data after it has been processed by each chart's specific
|
|
28
|
+
* compute functions. TODO: add other charts besides Sankey
|
|
29
|
+
*/
|
|
30
|
+
computedData: unknown | undefined
|
|
31
|
+
/**
|
|
32
|
+
* Using Brush, users can choose where they want to zoom in.
|
|
33
|
+
* This is zero-based index of the starting data point.
|
|
34
|
+
*/
|
|
35
|
+
dataStartIndex: number
|
|
36
|
+
/**
|
|
37
|
+
* Using Brush, users can choose where they want to zoom in.
|
|
38
|
+
* This is zero-based index of the last data point.
|
|
39
|
+
*/
|
|
40
|
+
dataEndIndex: number
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const initialChartDataState: ChartDataState = {
|
|
44
|
+
chartData: undefined,
|
|
45
|
+
computedData: undefined,
|
|
46
|
+
dataEndIndex: 0,
|
|
47
|
+
dataStartIndex: 0,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type BrushStartEndIndexActionPayload = Partial<BrushStartEndIndex>
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import type { AxisId, XAxisSettings, YAxisSettings, ZAxisSettings } from "./cartesianAxisSlice"
|
|
2
|
+
import type { AngleAxisSettings, RadiusAxisSettings } from "./polarAxisSlice"
|
|
3
|
+
import type { TooltipState, TooltipInteractionState } from "./tooltipSlice"
|
|
4
|
+
import type { LegendState } from "./legendSlice"
|
|
5
|
+
import type { BrushSettings } from "./brushSlice"
|
|
6
|
+
import type { GraphicalItemId } from "./graphicalItemsSlice"
|
|
7
|
+
import type { ChartDataState } from "./chartDataSlice"
|
|
8
|
+
import { markRawData } from "./rawData"
|
|
9
|
+
import type { ErrorBarsState } from "./errorBarSlice"
|
|
10
|
+
import type { EventSettingsState } from "./eventSettingsSlice"
|
|
11
|
+
import type { ChartLayoutState } from "./layoutSlice"
|
|
12
|
+
import type { ChartOptions } from "./optionsSlice"
|
|
13
|
+
import type { PolarChartState } from "./polarOptionsSlice"
|
|
14
|
+
import type { ReferenceElementState } from "./referenceElementsSlice"
|
|
15
|
+
import type { UpdatableChartOptions } from "./rootPropsSlice"
|
|
16
|
+
import type { ZIndexState } from "./zIndexSlice"
|
|
17
|
+
import { DefaultZIndexes } from "../zIndex/DefaultZIndexes"
|
|
18
|
+
import type { RenderedTicksState } from "./renderedTicksSlice"
|
|
19
|
+
import { createInitialRenderedTicksState } from "./renderedTicksSlice"
|
|
20
|
+
import type { LineSettings } from "./types/LineSettings"
|
|
21
|
+
import type { AreaSettings } from "./types/AreaSettings"
|
|
22
|
+
import type { BarSettings } from "./types/BarSettings"
|
|
23
|
+
import type { ScatterSettings } from "./types/ScatterSettings"
|
|
24
|
+
import type { PieSettings } from "./types/PieSettings"
|
|
25
|
+
import type { RadarSettings } from "./types/RadarSettings"
|
|
26
|
+
import type { RadialBarSettings } from "./types/RadialBarSettings"
|
|
27
|
+
|
|
28
|
+
/** Phase 2+: axis entry wraps settings; leaves room for computed fields (domain, scale) in Phase 3+. */
|
|
29
|
+
export type XAxisState = { settings: XAxisSettings }
|
|
30
|
+
|
|
31
|
+
/** Phase 2+: axis entry wraps settings; leaves room for computed fields (domain, scale) in Phase 3+. */
|
|
32
|
+
export type YAxisState = { settings: YAxisSettings }
|
|
33
|
+
|
|
34
|
+
/** Phase 2+: axis entry wraps settings; leaves room for computed fields (domain, scale) in Phase 3+. */
|
|
35
|
+
export type ZAxisState = { settings: ZAxisSettings }
|
|
36
|
+
|
|
37
|
+
/** Phase 4: wraps settings for fine-grained Solid store reactivity. */
|
|
38
|
+
export type AngleAxisState = { settings: AngleAxisSettings }
|
|
39
|
+
|
|
40
|
+
/** Phase 4: wraps settings for fine-grained Solid store reactivity. */
|
|
41
|
+
export type RadiusAxisState = { settings: RadiusAxisSettings }
|
|
42
|
+
|
|
43
|
+
/** Discriminated union for cartesian graphical item state entries. */
|
|
44
|
+
export type LineState = { type: "line"; settings: LineSettings }
|
|
45
|
+
/** Discriminated union for cartesian graphical item state entries. */
|
|
46
|
+
export type AreaState = { type: "area"; settings: AreaSettings }
|
|
47
|
+
/** Discriminated union for cartesian graphical item state entries. */
|
|
48
|
+
export type BarState = { type: "bar"; settings: BarSettings }
|
|
49
|
+
/** Discriminated union for cartesian graphical item state entries. */
|
|
50
|
+
export type ScatterState = { type: "scatter"; settings: ScatterSettings }
|
|
51
|
+
/** Union of all cartesian item state shapes. */
|
|
52
|
+
export type CartesianItemState = LineState | AreaState | BarState | ScatterState
|
|
53
|
+
|
|
54
|
+
/** Discriminated union for polar graphical item state entries. */
|
|
55
|
+
export type PieState = { type: "pie"; settings: PieSettings }
|
|
56
|
+
/** Discriminated union for polar graphical item state entries. */
|
|
57
|
+
export type RadarState = { type: "radar"; settings: RadarSettings }
|
|
58
|
+
/** Discriminated union for polar graphical item state entries. */
|
|
59
|
+
export type RadialBarState = { type: "radialBar"; settings: RadialBarSettings }
|
|
60
|
+
/** Union of all polar item state shapes. */
|
|
61
|
+
export type PolarItemState = PieState | RadarState | RadialBarState
|
|
62
|
+
|
|
63
|
+
/** Union of all graphical item state shapes. */
|
|
64
|
+
export type ItemState = CartesianItemState | PolarItemState
|
|
65
|
+
|
|
66
|
+
/** Chart-level animation defaults. Per-item match/interpolate live on item props. */
|
|
67
|
+
export type AnimationState = {
|
|
68
|
+
isAnimationActive: boolean | "auto"
|
|
69
|
+
animationDuration: number
|
|
70
|
+
animationEasing: string
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** BrushState is BrushSettings for Phase 1; alias for clarity in ChartState. */
|
|
74
|
+
export type BrushState = BrushSettings
|
|
75
|
+
|
|
76
|
+
/** Full chart state held in a Solid createStore. */
|
|
77
|
+
export type ChartState = {
|
|
78
|
+
animation: AnimationState
|
|
79
|
+
brush: BrushState
|
|
80
|
+
cartesianAxes: {
|
|
81
|
+
xAxis: Record<AxisId, XAxisState>
|
|
82
|
+
yAxis: Record<AxisId, YAxisState>
|
|
83
|
+
zAxis: Record<AxisId, ZAxisState>
|
|
84
|
+
}
|
|
85
|
+
chartData: ChartDataState
|
|
86
|
+
chartSize: { width: number; height: number }
|
|
87
|
+
errorBars: ErrorBarsState
|
|
88
|
+
eventSettings: EventSettingsState
|
|
89
|
+
graphicalItems: Record<GraphicalItemId, ItemState>
|
|
90
|
+
layout: ChartLayoutState
|
|
91
|
+
legend: LegendState
|
|
92
|
+
margin: ChartLayoutState["margin"]
|
|
93
|
+
options: ChartOptions
|
|
94
|
+
polarAxes: {
|
|
95
|
+
angleAxis: Record<AxisId, AngleAxisState>
|
|
96
|
+
radiusAxis: Record<AxisId, RadiusAxisState>
|
|
97
|
+
}
|
|
98
|
+
polarOptions: PolarChartState
|
|
99
|
+
referenceElements: ReferenceElementState
|
|
100
|
+
renderedTicks: RenderedTicksState
|
|
101
|
+
rootProps: UpdatableChartOptions
|
|
102
|
+
tooltip: TooltipState
|
|
103
|
+
zIndex: ZIndexState
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* Factories mirror each slice's initial state. Literal construction (not JSON roundtrip) so function
|
|
107
|
+
fields (e.g. LegendItemSorter) survive. Keep in sync with the slice files. Never export a singleton. */
|
|
108
|
+
|
|
109
|
+
function makeBrushState(): BrushState {
|
|
110
|
+
return { height: 0, padding: { bottom: 0, left: 0, right: 0, top: 0 }, width: 0, x: 0, y: 0 }
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function makeLegendState(): LegendState {
|
|
114
|
+
return {
|
|
115
|
+
payload: [],
|
|
116
|
+
settings: {
|
|
117
|
+
align: "center",
|
|
118
|
+
itemSorter: "value",
|
|
119
|
+
layout: "horizontal",
|
|
120
|
+
offset: 0,
|
|
121
|
+
position: undefined,
|
|
122
|
+
verticalAlign: "middle",
|
|
123
|
+
},
|
|
124
|
+
size: { height: 0, width: 0 },
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function makeTooltipState(): TooltipState {
|
|
129
|
+
const noInteraction: TooltipInteractionState = {
|
|
130
|
+
active: false,
|
|
131
|
+
coordinate: undefined,
|
|
132
|
+
dataKey: undefined,
|
|
133
|
+
graphicalItemId: undefined,
|
|
134
|
+
index: null,
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
axisInteraction: { click: { ...noInteraction }, hover: { ...noInteraction } },
|
|
138
|
+
itemInteraction: { click: { ...noInteraction }, hover: { ...noInteraction } },
|
|
139
|
+
keyboardInteraction: { ...noInteraction },
|
|
140
|
+
settings: { active: false, axisId: 0, defaultIndex: undefined, shared: undefined, trigger: "hover" },
|
|
141
|
+
syncInteraction: {
|
|
142
|
+
active: false,
|
|
143
|
+
coordinate: undefined,
|
|
144
|
+
dataKey: undefined,
|
|
145
|
+
graphicalItemId: undefined,
|
|
146
|
+
index: null,
|
|
147
|
+
label: undefined,
|
|
148
|
+
sourceViewBox: undefined,
|
|
149
|
+
},
|
|
150
|
+
tooltipItemPayloads: [],
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function makeChartDataState(): ChartDataState {
|
|
155
|
+
return {
|
|
156
|
+
chartData: undefined,
|
|
157
|
+
computedData: undefined,
|
|
158
|
+
dataEndIndex: 0,
|
|
159
|
+
dataStartIndex: 0,
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Chart data seed for a chart root; ChartDataContextProvider keeps it in sync after mount. */
|
|
164
|
+
export function createInitialChartDataState(data: ChartDataState["chartData"]): ChartDataState {
|
|
165
|
+
return {
|
|
166
|
+
...makeChartDataState(),
|
|
167
|
+
chartData: markRawData(data),
|
|
168
|
+
dataEndIndex: data != null && data.length > 0 ? data.length - 1 : 0,
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function makeEventSettingsState(): EventSettingsState {
|
|
173
|
+
return {
|
|
174
|
+
throttleDelay: "raf",
|
|
175
|
+
throttledEvents: ["mousemove", "touchmove", "pointermove", "scroll", "wheel"],
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function makeLayoutState(): ChartLayoutState {
|
|
180
|
+
return {
|
|
181
|
+
height: 0,
|
|
182
|
+
layoutType: "horizontal",
|
|
183
|
+
margin: { bottom: 5, left: 5, right: 5, top: 5 },
|
|
184
|
+
scale: 1,
|
|
185
|
+
width: 0,
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Layout seed for a chart root. Report components keep the store in sync after
|
|
191
|
+
* mount; seeding lets the first render use the declared size, margin, and layout.
|
|
192
|
+
*/
|
|
193
|
+
export function createInitialLayoutState(seed: {
|
|
194
|
+
width?: unknown
|
|
195
|
+
height?: unknown
|
|
196
|
+
margin?: Partial<ChartLayoutState["margin"]>
|
|
197
|
+
layoutType?: ChartLayoutState["layoutType"]
|
|
198
|
+
}): ChartLayoutState {
|
|
199
|
+
const layout = makeLayoutState()
|
|
200
|
+
const isPositive = (n: unknown): n is number => typeof n === "number" && Number.isFinite(n) && n > 0
|
|
201
|
+
return {
|
|
202
|
+
...layout,
|
|
203
|
+
height: isPositive(seed.height) ? seed.height : layout.height,
|
|
204
|
+
layoutType: seed.layoutType ?? layout.layoutType,
|
|
205
|
+
/* Same resolution as ReportChartMargin (upstream setMargin): a provided margin
|
|
206
|
+
fills missing sides with 0, not with the default margin. */
|
|
207
|
+
margin:
|
|
208
|
+
seed.margin == null
|
|
209
|
+
? layout.margin
|
|
210
|
+
: {
|
|
211
|
+
bottom: seed.margin.bottom ?? 0,
|
|
212
|
+
left: seed.margin.left ?? 0,
|
|
213
|
+
right: seed.margin.right ?? 0,
|
|
214
|
+
top: seed.margin.top ?? 0,
|
|
215
|
+
},
|
|
216
|
+
width: isPositive(seed.width) ? seed.width : layout.width,
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function makeOptionsState(): ChartOptions {
|
|
221
|
+
return {
|
|
222
|
+
chartName: "",
|
|
223
|
+
defaultTooltipEventType: "axis",
|
|
224
|
+
eventEmitter: undefined,
|
|
225
|
+
tooltipPayloadSearcher: () => undefined,
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function makeReferenceElementsState(): ReferenceElementState {
|
|
230
|
+
return { areas: [], dots: [], lines: [] }
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function makeRootPropsState(): UpdatableChartOptions {
|
|
234
|
+
return {
|
|
235
|
+
accessibilityLayer: true,
|
|
236
|
+
barCategoryGap: "10%",
|
|
237
|
+
barGap: 4,
|
|
238
|
+
barSize: undefined,
|
|
239
|
+
baseValue: undefined,
|
|
240
|
+
className: undefined,
|
|
241
|
+
maxBarSize: undefined,
|
|
242
|
+
reverseStackOrder: false,
|
|
243
|
+
stackOffset: "none",
|
|
244
|
+
syncId: undefined,
|
|
245
|
+
syncMethod: "index",
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function makeZIndexState(): ZIndexState {
|
|
250
|
+
const zIndexMap: ZIndexState["zIndexMap"] = {}
|
|
251
|
+
for (const current of Object.values(DefaultZIndexes)) {
|
|
252
|
+
zIndexMap[current] = { consumers: 0, element: undefined, panoramaElement: undefined }
|
|
253
|
+
}
|
|
254
|
+
return { zIndexMap }
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/** Identity helper: selectors still call this while ChartState is being deleted. */
|
|
258
|
+
export function readChartState(store: ChartState): ChartState {
|
|
259
|
+
return store
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** Returns a fresh ChartState per call. Always use this to seed createStore — never share an instance. */
|
|
263
|
+
export function createInitialChartState(overrides?: Partial<ChartState>): ChartState {
|
|
264
|
+
const layout = overrides?.layout ?? makeLayoutState()
|
|
265
|
+
return {
|
|
266
|
+
animation: { animationDuration: 1500, animationEasing: "ease", isAnimationActive: "auto" },
|
|
267
|
+
brush: makeBrushState(),
|
|
268
|
+
cartesianAxes: { xAxis: {}, yAxis: {}, zAxis: {} },
|
|
269
|
+
chartData: makeChartDataState(),
|
|
270
|
+
chartSize: { height: layout.height, width: layout.width },
|
|
271
|
+
errorBars: {},
|
|
272
|
+
eventSettings: makeEventSettingsState(),
|
|
273
|
+
graphicalItems: {},
|
|
274
|
+
layout,
|
|
275
|
+
legend: makeLegendState(),
|
|
276
|
+
margin: { bottom: 5, left: 5, right: 5, top: 5 },
|
|
277
|
+
polarAxes: { angleAxis: {}, radiusAxis: {} },
|
|
278
|
+
polarOptions: null,
|
|
279
|
+
referenceElements: makeReferenceElementsState(),
|
|
280
|
+
renderedTicks: createInitialRenderedTicksState(),
|
|
281
|
+
rootProps: makeRootPropsState(),
|
|
282
|
+
tooltip: makeTooltipState(),
|
|
283
|
+
zIndex: makeZIndexState(),
|
|
284
|
+
...overrides,
|
|
285
|
+
options: ownChartOptions(overrides?.options ?? makeOptionsState()),
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/*
|
|
290
|
+
* Chart modules pass module-level options (and tooltip event type lists). Solid's store maps
|
|
291
|
+
* every raw object it wraps to its target in one global WeakMap, so a shared constant would
|
|
292
|
+
* keep the last store that wrapped it alive and hand the next chart that store's proxy.
|
|
293
|
+
*/
|
|
294
|
+
function ownChartOptions(options: ChartOptions): ChartOptions {
|
|
295
|
+
const types = options.validateTooltipEventTypes
|
|
296
|
+
return types == null ? { ...options } : { ...options, validateTooltipEventTypes: [...types] }
|
|
297
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ErrorBarDirection } from "../cartesian/ErrorBar"
|
|
2
|
+
import type { DataKey } from "../util/types"
|
|
3
|
+
import type { GraphicalItemId } from "./graphicalItemsSlice"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* ErrorBars have lot more settings but all the others are scoped to the component itself.
|
|
7
|
+
* Only some of them required to be reported to the global store because XAxis and YAxis need to know
|
|
8
|
+
* if the error bar is contributing to extending the axis domain.
|
|
9
|
+
*/
|
|
10
|
+
export type ErrorBarsSettings = {
|
|
11
|
+
/**
|
|
12
|
+
* The direction is only used in Scatter chart, and decided based on ChartLayout in other charts.
|
|
13
|
+
*/
|
|
14
|
+
direction: ErrorBarDirection
|
|
15
|
+
/**
|
|
16
|
+
* The dataKey decides which property from the data will each individual ErrorBar use.
|
|
17
|
+
* If it so happens that the ErrorBar data are bigger than the axis domain,
|
|
18
|
+
* the error bar data will stretch the axis domain.
|
|
19
|
+
*/
|
|
20
|
+
dataKey: DataKey<unknown>
|
|
21
|
+
/*
|
|
22
|
+
* ErrorBar props say that it has explicit xAxis and yAxis props,
|
|
23
|
+
* but actually it always inherits the xAxis and yAxis defined on the parent graphical item.
|
|
24
|
+
*/
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type ErrorBarsState = Record<GraphicalItemId, ReadonlyArray<ErrorBarsSettings>>
|
|
28
|
+
|
|
29
|
+
export const initialErrorBarState: ErrorBarsState = {}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EventThrottlingProps } from "../util/types"
|
|
2
|
+
|
|
3
|
+
export type EventSettingsState = Required<EventThrottlingProps>
|
|
4
|
+
|
|
5
|
+
export const initialEventSettingsState: EventSettingsState = {
|
|
6
|
+
throttleDelay: "raf",
|
|
7
|
+
throttledEvents: ["mousemove", "touchmove", "pointermove", "scroll", "wheel"],
|
|
8
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { CategoricalChartFunc } from "../chart/types"
|
|
3
|
+
import type { HTMLMousePointer } from "../util/types"
|
|
4
|
+
import type { ChartState } from "./chartState"
|
|
5
|
+
import {
|
|
6
|
+
mouseClickAction,
|
|
7
|
+
mouseMoveAction,
|
|
8
|
+
} from "./mouseEventsMiddleware"
|
|
9
|
+
import {
|
|
10
|
+
blurAction,
|
|
11
|
+
focusAction,
|
|
12
|
+
keyDownAction,
|
|
13
|
+
} from "./keyboardEventsMiddleware"
|
|
14
|
+
import { touchEventAction } from "./touchEventsMiddleware"
|
|
15
|
+
import { externalEventAction } from "./externalEventsMiddleware"
|
|
16
|
+
|
|
17
|
+
import { type SetStoreFunction } from '../util/solid-1-compat';
|
|
18
|
+
export type ChartEventHandlers = {
|
|
19
|
+
handleMouseClick: (mousePointer: HTMLMousePointer) => void
|
|
20
|
+
handleMouseMove: (mousePointer: HTMLMousePointer) => void
|
|
21
|
+
handleFocus: () => void
|
|
22
|
+
handleBlur: () => void
|
|
23
|
+
handleKeyDown: (key: KeyboardEvent["key"]) => void
|
|
24
|
+
handleTouchMove: (touchEvent: TouchEvent) => void
|
|
25
|
+
handleExternalEvent: <E extends Event>(
|
|
26
|
+
event: E,
|
|
27
|
+
handler: CategoricalChartFunc<E> | undefined,
|
|
28
|
+
) => void
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Native Solid event-handler factory. Wraps the per-middleware action thunks
|
|
33
|
+
* (`mouseClickAction`/`mouseMoveAction`/`focusAction`/`blurAction`/
|
|
34
|
+
* `keyDownAction`/`touchEventAction`/`externalEventAction`) into a single
|
|
35
|
+
* composed object exposed on the store context.
|
|
36
|
+
*
|
|
37
|
+
* Behavior matches the underlying action wrappers: synchronous state mutation
|
|
38
|
+
* so that subsequent `handleExternalEvent` reads observe the freshly-updated
|
|
39
|
+
* tooltip state in the same tick (chartEvents contract). The throttled
|
|
40
|
+
* `createMouseEventHandlers` etc. factories remain on their middleware
|
|
41
|
+
* modules for direct consumers but are not used here.
|
|
42
|
+
*
|
|
43
|
+
* `actions` is reserved for a later migration that replaces the direct
|
|
44
|
+
* `setStore` calls inside each thunk with `actions.<method>()`.
|
|
45
|
+
*/
|
|
46
|
+
export function createEventHandlers(
|
|
47
|
+
store: ChartState,
|
|
48
|
+
setStore: SetStoreFunction<ChartState>,
|
|
49
|
+
): ChartEventHandlers {
|
|
50
|
+
return {
|
|
51
|
+
handleBlur(): void {
|
|
52
|
+
blurAction()(setStore, store)
|
|
53
|
+
},
|
|
54
|
+
handleExternalEvent<E extends Event>(
|
|
55
|
+
event: E,
|
|
56
|
+
handler: CategoricalChartFunc<E> | undefined,
|
|
57
|
+
): void {
|
|
58
|
+
externalEventAction({ handler, reactEvent: event })(setStore, store)
|
|
59
|
+
},
|
|
60
|
+
handleFocus(): void {
|
|
61
|
+
focusAction()(setStore, store)
|
|
62
|
+
},
|
|
63
|
+
handleKeyDown(key: KeyboardEvent["key"]): void {
|
|
64
|
+
keyDownAction(key)(setStore, store)
|
|
65
|
+
},
|
|
66
|
+
handleMouseClick(mousePointer: HTMLMousePointer): void {
|
|
67
|
+
mouseClickAction(mousePointer)(setStore, store)
|
|
68
|
+
},
|
|
69
|
+
handleMouseMove(mousePointer: HTMLMousePointer): void {
|
|
70
|
+
mouseMoveAction(mousePointer)(setStore, store)
|
|
71
|
+
},
|
|
72
|
+
handleTouchMove(touchEvent: TouchEvent): void {
|
|
73
|
+
touchEventAction(touchEvent)(setStore, store)
|
|
74
|
+
},
|
|
75
|
+
}
|
|
76
|
+
}
|