@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,334 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { TooltipTrigger } from "../chart/types"
|
|
3
|
+
import type { NameType, Payload, ValueType } from "../component/DefaultTooltipContent"
|
|
4
|
+
import type { CartesianViewBoxRequired, Coordinate, DataKey, PolarCoordinate } from "../util/types"
|
|
5
|
+
import type { AxisId } from "./cartesianAxisSlice"
|
|
6
|
+
import type { GraphicalItemId } from "./graphicalItemsSlice"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* One Tooltip can display multiple TooltipPayloadEntries at a time.
|
|
10
|
+
*/
|
|
11
|
+
export type TooltipPayloadEntry = Payload<ValueType, NameType>
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* So what happens is that the tooltip payload is decided based on the available data, and the dataKey.
|
|
15
|
+
* The dataKey can either be defined on the graphical element (like Line, or Bar)
|
|
16
|
+
* or on the tooltip itself.
|
|
17
|
+
*
|
|
18
|
+
* The data can be defined in the chart element, or in the graphical item.
|
|
19
|
+
*
|
|
20
|
+
* So this type is all the settings, other than the data + dataKey complications.
|
|
21
|
+
*/
|
|
22
|
+
export type TooltipEntrySettings = Omit<TooltipPayloadEntry, "payload" | "value"> & {
|
|
23
|
+
nameKey: DataKey<unknown> | undefined
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* This is what Tooltip renders.
|
|
28
|
+
*/
|
|
29
|
+
export type TooltipPayload = ReadonlyArray<TooltipPayloadEntry>
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* null means no active index
|
|
33
|
+
* string means: whichever index from the chart data it is.
|
|
34
|
+
* Different charts have different requirements on data shapes,
|
|
35
|
+
* and are also responsible for providing a function that will accept this index
|
|
36
|
+
* and return data.
|
|
37
|
+
*/
|
|
38
|
+
export type TooltipIndex = string | null
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Different items have different data shapes so the state has no opinion on what the data shape should be;
|
|
42
|
+
* the only requirement is that the chart also provides a searcher function
|
|
43
|
+
* that accepts the data, and a key, and returns whatever the payload in Tooltip should be.
|
|
44
|
+
*/
|
|
45
|
+
export type TooltipPayloadSearcher<T = unknown> = (
|
|
46
|
+
data: T,
|
|
47
|
+
index: TooltipIndex,
|
|
48
|
+
computedData?: unknown,
|
|
49
|
+
nameKey?: DataKey<unknown>,
|
|
50
|
+
) => T | undefined
|
|
51
|
+
|
|
52
|
+
export type TooltipPayloadConfiguration = {
|
|
53
|
+
settings: TooltipEntrySettings
|
|
54
|
+
/**
|
|
55
|
+
* This is the data that the item has provided, all of it mixed together.
|
|
56
|
+
* Later as user is interacting with the chart, a selector will use this
|
|
57
|
+
* data + activeIndex, pass it to the TooltipPayloadSearcher, and render the result in a Tooltip.
|
|
58
|
+
*
|
|
59
|
+
* Because we have no controls over which data shape the graphical item provides,
|
|
60
|
+
* this is typed as unknown, and it is the responsibility of the selector
|
|
61
|
+
* to know what to do with it.
|
|
62
|
+
*
|
|
63
|
+
* We can't have better typing here because different graphical items
|
|
64
|
+
* may provide different data shapes. For example someone may decide to put Area element
|
|
65
|
+
* in a Sankey chart.
|
|
66
|
+
*/
|
|
67
|
+
dataDefinedOnItem: unknown
|
|
68
|
+
/**
|
|
69
|
+
* Opportunity for the graphical item to define its own Tooltip coordinates
|
|
70
|
+
* instead of relying on the axes.
|
|
71
|
+
*
|
|
72
|
+
* If undefined, then Recharts will use mouse interaction coordinates, or the axis coordinates,
|
|
73
|
+
* with some defaults (like, top/left of the chart).
|
|
74
|
+
*
|
|
75
|
+
* Unlike the chart data which can be nested, the positions are expected to be flat array or record.
|
|
76
|
+
* They however should reuse the same tooltip index format as the chart data.
|
|
77
|
+
*/
|
|
78
|
+
getPosition: (tooltipIndex: NonNullable<TooltipIndex>) => Coordinate | undefined
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export type ActiveTooltipProps = {
|
|
82
|
+
activeIndex: TooltipIndex
|
|
83
|
+
activeCoordinate: Coordinate | undefined
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* So this informs the "tooltip event type". Tooltip event type can be either "axis" or "item"
|
|
88
|
+
* and it is used for two things:
|
|
89
|
+
* 1. Sets the active area
|
|
90
|
+
* 2. Sets the background and cursor highlights
|
|
91
|
+
*
|
|
92
|
+
* Some charts only allow to have one type of tooltip event type, some allow both.
|
|
93
|
+
* Those charts that allow both will have one default, and the "shared" prop will be used to switch between them.
|
|
94
|
+
* Undefined means "use the chart default".
|
|
95
|
+
*
|
|
96
|
+
* Charts that only allow one tooltip event type, will ignore the shared prop.
|
|
97
|
+
*/
|
|
98
|
+
export type SharedTooltipSettings = boolean | undefined
|
|
99
|
+
|
|
100
|
+
export type TooltipSettingsState = {
|
|
101
|
+
shared: SharedTooltipSettings
|
|
102
|
+
trigger: TooltipTrigger
|
|
103
|
+
axisId: AxisId
|
|
104
|
+
/**
|
|
105
|
+
* The `active` prop, despite its name, does not mean "always active".
|
|
106
|
+
* It means "active after user interaction has ended".
|
|
107
|
+
* By default, the tooltip is only active while the user is hovering over the chart.
|
|
108
|
+
* With `active=true`, the tooltip will remain visible after mouse leave event.
|
|
109
|
+
*
|
|
110
|
+
* If you want to see the "active before user interaction" settings, see `defaultIndex`.
|
|
111
|
+
*
|
|
112
|
+
* Undefined means "depends on user interactions".
|
|
113
|
+
*/
|
|
114
|
+
active: boolean | undefined
|
|
115
|
+
/**
|
|
116
|
+
* If you want to set the tooltip to be active before user interaction, you can set this property.
|
|
117
|
+
* New chartState stores the raw prop value (number or string); legacy store always holds string.
|
|
118
|
+
*/
|
|
119
|
+
defaultIndex: TooltipIndex | number | undefined
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* A generic state for user interaction with the chart.
|
|
124
|
+
* User interaction can come through multiple channels: mouse events, keyboard events, or hardcoded in props, or synchronised from other charts.
|
|
125
|
+
*
|
|
126
|
+
* Each of the interaction states is represented as TooltipInteractionState,
|
|
127
|
+
* and then the selectors and Tooltip will decide which of the interaction states to use.
|
|
128
|
+
*/
|
|
129
|
+
export type TooltipInteractionState = {
|
|
130
|
+
/**
|
|
131
|
+
* If user interaction is in progress or not.
|
|
132
|
+
* Why is this its own property? Why is this not computed from the index?
|
|
133
|
+
* Certainly if index !== -1 then the tooltip is active, right?
|
|
134
|
+
* Well not so fast. Recharts allows Tooltips can be set to `active=true`
|
|
135
|
+
* which means the tooltip remains displayed after the user stops interacting.
|
|
136
|
+
* - This implies that we cannot set index to <empty value> after interaction ends,
|
|
137
|
+
* because the chart must remember the last position just in case the `active` prop on Tooltip is set to true.
|
|
138
|
+
*/
|
|
139
|
+
active: boolean
|
|
140
|
+
/**
|
|
141
|
+
* This is the current data index that is set for the chart.
|
|
142
|
+
* This can come from mouse events, keyboard events, or hardcoded in props
|
|
143
|
+
* in property `defaultIndex` on Tooltip.
|
|
144
|
+
*/
|
|
145
|
+
index: TooltipIndex | undefined
|
|
146
|
+
/**
|
|
147
|
+
* DataKey filter.
|
|
148
|
+
*
|
|
149
|
+
* In case of multiple graphical items, this is the dataKey that is set for the item.
|
|
150
|
+
* Very useful for `Tooltip.shared=false`, where activeIndex can display multiple values,
|
|
151
|
+
* but we only want to display one of them.
|
|
152
|
+
*
|
|
153
|
+
* If we want to interact with all the graphical items, then this is undefined.
|
|
154
|
+
* This is the case for eventTooltipType === 'axis' for example.
|
|
155
|
+
*/
|
|
156
|
+
dataKey: DataKey<unknown> | undefined
|
|
157
|
+
/**
|
|
158
|
+
* GraphicalItemId filter.
|
|
159
|
+
*
|
|
160
|
+
* In case of multiple graphical items with the same dataKey (e.g., multiple Pie charts),
|
|
161
|
+
* this identifies which specific graphical item is being interacted with.
|
|
162
|
+
* This is more reliable than coordinate matching for distinguishing between items.
|
|
163
|
+
*/
|
|
164
|
+
graphicalItemId: string | undefined
|
|
165
|
+
/**
|
|
166
|
+
* The Coordinate where user last interacted with the chart. This needs saved so we can continue to render the tooltip at that point.
|
|
167
|
+
* This is undefined on several occasions:
|
|
168
|
+
* - before the user started interacting with the chart,
|
|
169
|
+
* - when the chart is controlled programmatically through `defaultIndex` prop
|
|
170
|
+
* - when the chart is controlled using keyboard interactions
|
|
171
|
+
*/
|
|
172
|
+
coordinate: Coordinate | PolarCoordinate | undefined
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export type TooltipSyncState = TooltipInteractionState & {
|
|
176
|
+
/**
|
|
177
|
+
* Tooltip synchronization is a feature that allows multiple charts to share the same interaction state.
|
|
178
|
+
* This comes with one specialty - the syncMethod. `syncMethod=value` allows the user to synchronise charts
|
|
179
|
+
* based on the active label (which is rendered as the title of the Tooltip).
|
|
180
|
+
* To allow that, we need the label to be stored in the sync state.
|
|
181
|
+
*/
|
|
182
|
+
label: string | undefined
|
|
183
|
+
/**
|
|
184
|
+
* ViewBox of the chart that sent the sync event.
|
|
185
|
+
* Used to scale coordinates between charts of different sizes so tooltips
|
|
186
|
+
* show up in the right place on all synchronized charts.
|
|
187
|
+
*/
|
|
188
|
+
sourceViewBox: CartesianViewBoxRequired | undefined
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export const noInteraction: TooltipInteractionState = {
|
|
192
|
+
active: false,
|
|
193
|
+
coordinate: undefined,
|
|
194
|
+
dataKey: undefined,
|
|
195
|
+
graphicalItemId: undefined,
|
|
196
|
+
index: null,
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* The tooltip interaction state stores:
|
|
201
|
+
*
|
|
202
|
+
* - Which graphical item is user interacting with at the moment,
|
|
203
|
+
* - which axis (or, which part of chart background) is user interacting with at the moment
|
|
204
|
+
* - The data that individual graphical items wish to be displayed in case the tooltip gets activated
|
|
205
|
+
*/
|
|
206
|
+
export type TooltipState = {
|
|
207
|
+
/**
|
|
208
|
+
* This is the state of interactions with individual graphical items.
|
|
209
|
+
*/
|
|
210
|
+
itemInteraction: {
|
|
211
|
+
click: TooltipInteractionState
|
|
212
|
+
/**
|
|
213
|
+
* Why is hover activation separate from click activation? Because they are independent:
|
|
214
|
+
* If a click is set, then mouseLeave should not clear it.
|
|
215
|
+
* - the opposite is technically true too - but it's difficult to click on things without also hovering.
|
|
216
|
+
*/
|
|
217
|
+
hover: TooltipInteractionState
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* This is the state of interaction with the bar background - which will get mapped
|
|
221
|
+
* to the axis index.
|
|
222
|
+
*
|
|
223
|
+
* Axis interaction is independent of item interaction so the state must also be independent.
|
|
224
|
+
*/
|
|
225
|
+
axisInteraction: {
|
|
226
|
+
click: TooltipInteractionState
|
|
227
|
+
hover: TooltipInteractionState
|
|
228
|
+
}
|
|
229
|
+
keyboardInteraction: TooltipInteractionState
|
|
230
|
+
/**
|
|
231
|
+
* This part of the state is the information coming from other charts.
|
|
232
|
+
* If there are two charts with the same syncId, events from one chart will be transferred
|
|
233
|
+
* to other charts. So this is what the other charts are reporting.
|
|
234
|
+
*/
|
|
235
|
+
syncInteraction: TooltipSyncState
|
|
236
|
+
/**
|
|
237
|
+
* One graphical item will have one configuration;
|
|
238
|
+
* hovering over multiple of them (for example with tooltipEventType===axis)
|
|
239
|
+
* may render multiple tooltip payloads.
|
|
240
|
+
*/
|
|
241
|
+
tooltipItemPayloads: ReadonlyArray<TooltipPayloadConfiguration>
|
|
242
|
+
/**
|
|
243
|
+
* Tooltip props or other settings that need store access.
|
|
244
|
+
* This assumes that there is always only one Tooltip. In case we want to start supporting multiple Tooltips,
|
|
245
|
+
* we have to change this to an array - and update all the places reading this state too.
|
|
246
|
+
*/
|
|
247
|
+
settings: TooltipSettingsState
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* This is the event we get when user is interacting with a specific graphical item.
|
|
252
|
+
*/
|
|
253
|
+
export type GraphicalItemTooltipActionPayload = {
|
|
254
|
+
/**
|
|
255
|
+
* Every graphical item must report its own index.
|
|
256
|
+
*/
|
|
257
|
+
activeIndex: TooltipIndex
|
|
258
|
+
/**
|
|
259
|
+
* A graphical item may or may not have a particular dataKey specified.
|
|
260
|
+
* This is undefined in case the user did not set a dataKey on the graphical item.
|
|
261
|
+
* In which case the dataKey is implied by the axes settings.
|
|
262
|
+
*/
|
|
263
|
+
activeDataKey: DataKey<unknown> | undefined
|
|
264
|
+
/**
|
|
265
|
+
* This is the coordinate where Recharts think the tooltip should appear.
|
|
266
|
+
*
|
|
267
|
+
* Graphical items have a preference where to render the actual tooltip
|
|
268
|
+
* which is defined in the TooltipPayloadConfiguration.positions.
|
|
269
|
+
*
|
|
270
|
+
* This property is resolved by combining that preference with the actual user interaction coordinate.
|
|
271
|
+
* This is not the raw mouse coordinate! We don't store that currently in this slice.
|
|
272
|
+
*
|
|
273
|
+
* This can be undefined depending on the graphical item settings, and the tooltip searcher.
|
|
274
|
+
*/
|
|
275
|
+
activeCoordinate: Coordinate | undefined
|
|
276
|
+
/**
|
|
277
|
+
* ID of the element user is interacting with.
|
|
278
|
+
* Cannot be undefined - each graphical item is responsible for generating its own ID
|
|
279
|
+
* in case user did not provide an explicit one.
|
|
280
|
+
*/
|
|
281
|
+
activeGraphicalItemId: GraphicalItemId
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export type AxisTooltipActionPayload = {
|
|
285
|
+
/**
|
|
286
|
+
* Each axis interaction must report the index of where the user is interacting.
|
|
287
|
+
*/
|
|
288
|
+
activeIndex: TooltipIndex
|
|
289
|
+
/**
|
|
290
|
+
* DataKey filter. An axis may or may not have a particular dataKey specified.
|
|
291
|
+
* This is undefined in case the user did not set a dataKey on the axis.
|
|
292
|
+
* In which case the dataKey is implied by the graphical item settings.
|
|
293
|
+
*/
|
|
294
|
+
activeDataKey: DataKey<unknown> | undefined
|
|
295
|
+
/**
|
|
296
|
+
This is the coordinate where Recharts think the tooltip should appear.
|
|
297
|
+
*
|
|
298
|
+
* Graphical items have a preference where to render the actual tooltip
|
|
299
|
+
* which is defined in the TooltipPayloadConfiguration.positions.
|
|
300
|
+
*
|
|
301
|
+
* This property is resolved by combining that preference with the actual user interaction coordinate.
|
|
302
|
+
* This is not the raw mouse coordinate! We don't store that currently in this slice.
|
|
303
|
+
*
|
|
304
|
+
* This can be undefined depending on the graphical item settings, and the tooltip searcher.
|
|
305
|
+
*/
|
|
306
|
+
activeCoordinate?: Coordinate
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Keyboard interaction payload has no graphical item ID,
|
|
311
|
+
* and no dataKey, because keyboard interaction is always
|
|
312
|
+
* with the whole chart, not with a specific graphical item.
|
|
313
|
+
*/
|
|
314
|
+
export type KeyboardTooltipActionPayload = {
|
|
315
|
+
/**
|
|
316
|
+
* If true, means user is actively interacting with the chart using keyboard.
|
|
317
|
+
* If false, means user has stopped interacting with the chart using keyboard - perhaps focus has moved away, or ESC key was pressed.
|
|
318
|
+
*/
|
|
319
|
+
active: boolean
|
|
320
|
+
/**
|
|
321
|
+
* Keyboard interaction index. The middleware is responsible for computing this index based on
|
|
322
|
+
* current index, key pressed, chart direction, etc.
|
|
323
|
+
* Each chart type may have different index types (string or number) and different idea on how to iterate them.
|
|
324
|
+
*/
|
|
325
|
+
activeIndex: TooltipIndex | undefined
|
|
326
|
+
/**
|
|
327
|
+
This is the coordinate where Recharts think the tooltip should appear.
|
|
328
|
+
|
|
329
|
+
* Keyboard coordinate follows the same rules as defaultIndex coordinate.
|
|
330
|
+
* In an absence of mouse coordinates, the chart must compute where to render the tooltip
|
|
331
|
+
* based on the activeIndex and domain and range.
|
|
332
|
+
*/
|
|
333
|
+
activeCoordinate: Coordinate | undefined
|
|
334
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { ChartState } from "./chartState"
|
|
3
|
+
import { selectActivePropsFromChartPointer } from "./selectors/selectActivePropsFromChartPointer"
|
|
4
|
+
import { getRelativeCoordinate } from "../util/getRelativeCoordinate"
|
|
5
|
+
import { selectTooltipEventType } from "./selectors/selectTooltipEventType"
|
|
6
|
+
import { readChartState } from "./chartState"
|
|
7
|
+
import {
|
|
8
|
+
DATA_ITEM_GRAPHICAL_ITEM_ID_ATTRIBUTE_NAME,
|
|
9
|
+
DATA_ITEM_INDEX_ATTRIBUTE_NAME,
|
|
10
|
+
} from "../util/Constants"
|
|
11
|
+
import { selectTooltipCoordinate } from "./selectors/touchSelectors"
|
|
12
|
+
import { selectAllGraphicalItemsSettings } from "./selectors/tooltipSelectors"
|
|
13
|
+
import type { RelativePointer } from "../util/types"
|
|
14
|
+
import { createEventProxy } from "../util/createEventProxy"
|
|
15
|
+
|
|
16
|
+
import { type SetStoreFunction } from '../util/solid-1-compat';
|
|
17
|
+
import { setTooltipInteraction } from "./tooltipInteraction"
|
|
18
|
+
export type TouchEventHandlers = {
|
|
19
|
+
handleTouchMove: (touchEvent: TouchEvent) => void
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Creates touch event handler functions that read from the Solid store and update it directly.
|
|
24
|
+
* Replaces the Redux createListenerMiddleware pattern for touch events.
|
|
25
|
+
*/
|
|
26
|
+
export function createTouchEventHandlers(
|
|
27
|
+
store: ChartState,
|
|
28
|
+
setStore: SetStoreFunction<ChartState>,
|
|
29
|
+
): TouchEventHandlers {
|
|
30
|
+
let rafId: number | null = null
|
|
31
|
+
let timeoutId: ReturnType<typeof setTimeout> | null = null
|
|
32
|
+
let latestChartPointers: ReadonlyArray<RelativePointer> | null = null
|
|
33
|
+
let latestTouchEvent: TouchEvent | null = null
|
|
34
|
+
|
|
35
|
+
function handleTouchMove(touchEvent: TouchEvent): void {
|
|
36
|
+
if (touchEvent.touches == null || touchEvent.touches.length === 0) {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
latestTouchEvent = createEventProxy(touchEvent)
|
|
41
|
+
|
|
42
|
+
const { throttleDelay, throttledEvents } = store.eventSettings
|
|
43
|
+
const isThrottled = throttledEvents === "all" || throttledEvents.includes("touchmove")
|
|
44
|
+
|
|
45
|
+
if (rafId !== null) {
|
|
46
|
+
cancelAnimationFrame(rafId)
|
|
47
|
+
rafId = null
|
|
48
|
+
}
|
|
49
|
+
if (timeoutId !== null && (typeof throttleDelay !== "number" || !isThrottled)) {
|
|
50
|
+
clearTimeout(timeoutId)
|
|
51
|
+
timeoutId = null
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
latestChartPointers = Array.from(touchEvent.touches).map((touch) =>
|
|
55
|
+
getRelativeCoordinate({
|
|
56
|
+
clientX: touch.clientX,
|
|
57
|
+
clientY: touch.clientY,
|
|
58
|
+
currentTarget: touchEvent.currentTarget as HTMLElement,
|
|
59
|
+
}),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
const callback = () => {
|
|
63
|
+
if (latestTouchEvent == null) {
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const tooltipEventType = selectTooltipEventType(
|
|
68
|
+
store,
|
|
69
|
+
readChartState(store).tooltip.settings.shared,
|
|
70
|
+
)
|
|
71
|
+
if (tooltipEventType === "axis") {
|
|
72
|
+
const latestTouchPointer = latestChartPointers?.[0]
|
|
73
|
+
if (latestTouchPointer == null) {
|
|
74
|
+
rafId = null
|
|
75
|
+
timeoutId = null
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
const activeProps = selectActivePropsFromChartPointer(store, latestTouchPointer)
|
|
79
|
+
if (activeProps?.activeIndex != null) {
|
|
80
|
+
setTooltipInteraction(setStore, "axisInteraction", "hover", {
|
|
81
|
+
active: true,
|
|
82
|
+
coordinate: activeProps.activeCoordinate,
|
|
83
|
+
dataKey: undefined,
|
|
84
|
+
graphicalItemId: undefined,
|
|
85
|
+
index: activeProps.activeIndex,
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
} else if (tooltipEventType === "item") {
|
|
89
|
+
const touch = latestTouchEvent.touches[0]
|
|
90
|
+
if (document.elementFromPoint == null || touch == null) {
|
|
91
|
+
return
|
|
92
|
+
}
|
|
93
|
+
const target = document.elementFromPoint(touch.clientX, touch.clientY)
|
|
94
|
+
if (target == null || target.getAttribute == null) {
|
|
95
|
+
return
|
|
96
|
+
}
|
|
97
|
+
const itemIndex = target.getAttribute(DATA_ITEM_INDEX_ATTRIBUTE_NAME)
|
|
98
|
+
const graphicalItemId =
|
|
99
|
+
target.getAttribute(DATA_ITEM_GRAPHICAL_ITEM_ID_ATTRIBUTE_NAME) ?? undefined
|
|
100
|
+
const settings = selectAllGraphicalItemsSettings(store).find(
|
|
101
|
+
(item) => item.id === graphicalItemId,
|
|
102
|
+
)
|
|
103
|
+
if (itemIndex == null || settings == null || graphicalItemId == null) {
|
|
104
|
+
return
|
|
105
|
+
}
|
|
106
|
+
const { dataKey } = settings
|
|
107
|
+
const coordinate = selectTooltipCoordinate(store, itemIndex, graphicalItemId)
|
|
108
|
+
|
|
109
|
+
setTooltipInteraction(setStore, "itemInteraction", "hover", {
|
|
110
|
+
active: true,
|
|
111
|
+
coordinate,
|
|
112
|
+
dataKey,
|
|
113
|
+
graphicalItemId,
|
|
114
|
+
index: itemIndex,
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
rafId = null
|
|
118
|
+
timeoutId = null
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (!isThrottled) {
|
|
122
|
+
callback()
|
|
123
|
+
return
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (throttleDelay === "raf") {
|
|
127
|
+
rafId = requestAnimationFrame(callback)
|
|
128
|
+
} else if (typeof throttleDelay === "number") {
|
|
129
|
+
if (timeoutId === null) {
|
|
130
|
+
callback()
|
|
131
|
+
latestTouchEvent = null
|
|
132
|
+
|
|
133
|
+
timeoutId = setTimeout(() => {
|
|
134
|
+
if (latestTouchEvent) {
|
|
135
|
+
callback()
|
|
136
|
+
} else {
|
|
137
|
+
timeoutId = null
|
|
138
|
+
rafId = null
|
|
139
|
+
}
|
|
140
|
+
}, throttleDelay)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return { handleTouchMove }
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Action thunk wrapper for touch events, used with the dispatch pattern.
|
|
150
|
+
*/
|
|
151
|
+
export const touchEventAction =
|
|
152
|
+
(touchEvent: TouchEvent) =>
|
|
153
|
+
(
|
|
154
|
+
setStore: SetStoreFunction<ChartState>,
|
|
155
|
+
store: ChartState,
|
|
156
|
+
) => {
|
|
157
|
+
if (touchEvent.touches == null || touchEvent.touches.length === 0) {
|
|
158
|
+
return
|
|
159
|
+
}
|
|
160
|
+
const tooltipEventType = selectTooltipEventType(
|
|
161
|
+
store,
|
|
162
|
+
readChartState(store).tooltip.settings.shared,
|
|
163
|
+
)
|
|
164
|
+
if (tooltipEventType === "axis") {
|
|
165
|
+
const firstTouch = touchEvent.touches[0]
|
|
166
|
+
if (firstTouch == null) {
|
|
167
|
+
return
|
|
168
|
+
}
|
|
169
|
+
const chartPointer = getRelativeCoordinate({
|
|
170
|
+
clientX: firstTouch.clientX,
|
|
171
|
+
clientY: firstTouch.clientY,
|
|
172
|
+
currentTarget: touchEvent.currentTarget as HTMLElement,
|
|
173
|
+
})
|
|
174
|
+
const activeProps = selectActivePropsFromChartPointer(store, chartPointer)
|
|
175
|
+
if (activeProps?.activeIndex != null) {
|
|
176
|
+
const payload = {
|
|
177
|
+
active: true,
|
|
178
|
+
coordinate: activeProps.activeCoordinate,
|
|
179
|
+
dataKey: undefined,
|
|
180
|
+
graphicalItemId: undefined,
|
|
181
|
+
index: activeProps.activeIndex,
|
|
182
|
+
}
|
|
183
|
+
setTooltipInteraction(setStore, "axisInteraction", "hover", payload)
|
|
184
|
+
}
|
|
185
|
+
} else if (tooltipEventType === "item") {
|
|
186
|
+
const touch = touchEvent.touches[0]
|
|
187
|
+
if (document.elementFromPoint == null || touch == null) {
|
|
188
|
+
return
|
|
189
|
+
}
|
|
190
|
+
const target = document.elementFromPoint(touch.clientX, touch.clientY)
|
|
191
|
+
if (target == null || target.getAttribute == null) {
|
|
192
|
+
return
|
|
193
|
+
}
|
|
194
|
+
const itemIndex = target.getAttribute(DATA_ITEM_INDEX_ATTRIBUTE_NAME)
|
|
195
|
+
const graphicalItemId =
|
|
196
|
+
target.getAttribute(DATA_ITEM_GRAPHICAL_ITEM_ID_ATTRIBUTE_NAME) ?? undefined
|
|
197
|
+
const settings = selectAllGraphicalItemsSettings(store).find(
|
|
198
|
+
(item) => item.id === graphicalItemId,
|
|
199
|
+
)
|
|
200
|
+
if (itemIndex == null || settings == null || graphicalItemId == null) {
|
|
201
|
+
return
|
|
202
|
+
}
|
|
203
|
+
const { dataKey } = settings
|
|
204
|
+
const coordinate = selectTooltipCoordinate(store, itemIndex, graphicalItemId)
|
|
205
|
+
const payload = {
|
|
206
|
+
active: true,
|
|
207
|
+
coordinate,
|
|
208
|
+
dataKey,
|
|
209
|
+
graphicalItemId,
|
|
210
|
+
index: itemIndex,
|
|
211
|
+
}
|
|
212
|
+
setTooltipInteraction(setStore, "itemInteraction", "hover", payload)
|
|
213
|
+
}
|
|
214
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tagged union for an item during animation.
|
|
3
|
+
* Match helpers live in `src/animation/matchBy.ts`.
|
|
4
|
+
*/
|
|
5
|
+
export type AnimationItem<T> =
|
|
6
|
+
| { readonly status: "matched"; readonly prev: T; readonly next: T }
|
|
7
|
+
| { readonly status: "added"; readonly next: T }
|
|
8
|
+
| { readonly status: "removed"; readonly prev: T }
|
|
9
|
+
|
|
10
|
+
export type AnimationMatchBy<T> = (item: T, index: number) => string | number | null
|
|
11
|
+
|
|
12
|
+
export type AnimationMatchBySentinel = "index" | "append"
|
|
13
|
+
|
|
14
|
+
export type AnimationMatchByProp<T> = AnimationMatchBySentinel | AnimationMatchBy<T>
|
|
15
|
+
|
|
16
|
+
export type AnimationInterpolateFn<ItemType, Layout = unknown> = (
|
|
17
|
+
items: ReadonlyArray<AnimationItem<ItemType>> | null,
|
|
18
|
+
animationElapsedTime: number,
|
|
19
|
+
layout: Layout,
|
|
20
|
+
) => ReadonlyArray<ItemType>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BaseValue } from "../../cartesian/Area"
|
|
2
|
+
import { DataKey } from "../../util/types"
|
|
3
|
+
import { ChartData } from "../chartDataSlice"
|
|
4
|
+
import { MaybeStackedGraphicalItem } from "./StackedGraphicalItem"
|
|
5
|
+
import { BaseCartesianGraphicalItemSettings } from "../graphicalItemsSlice"
|
|
6
|
+
|
|
7
|
+
export type AreaSettings = BaseCartesianGraphicalItemSettings &
|
|
8
|
+
MaybeStackedGraphicalItem & {
|
|
9
|
+
type: "area"
|
|
10
|
+
connectNulls: boolean
|
|
11
|
+
baseValue: BaseValue | undefined
|
|
12
|
+
dataKey: DataKey<unknown>
|
|
13
|
+
data: ChartData | undefined
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { MinPointSize } from "../../util/BarUtils"
|
|
2
|
+
import { MaybeStackedGraphicalItem } from "./StackedGraphicalItem"
|
|
3
|
+
import { BaseCartesianGraphicalItemSettings } from "../graphicalItemsSlice"
|
|
4
|
+
|
|
5
|
+
export type BarSettings = BaseCartesianGraphicalItemSettings &
|
|
6
|
+
MaybeStackedGraphicalItem & {
|
|
7
|
+
type: "bar"
|
|
8
|
+
maxBarSize: number | undefined
|
|
9
|
+
minPointSize: MinPointSize
|
|
10
|
+
/**
|
|
11
|
+
* When true, zero-dimension bars are not filtered out because the custom shape
|
|
12
|
+
* may still render something visible.
|
|
13
|
+
*/
|
|
14
|
+
hasCustomShape?: boolean
|
|
15
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ChartData } from "../chartDataSlice"
|
|
2
|
+
import { DataKey } from "../../util/types"
|
|
3
|
+
import { BaseCartesianGraphicalItemSettings } from "../graphicalItemsSlice"
|
|
4
|
+
|
|
5
|
+
export type LineSettings = BaseCartesianGraphicalItemSettings & {
|
|
6
|
+
type: "line"
|
|
7
|
+
data: ChartData | undefined
|
|
8
|
+
dataKey: DataKey<unknown> | undefined
|
|
9
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { JSX } from '@solidjs/web';
|
|
3
|
+
import type { WithoutRemoveFalse } from "../../util/types"
|
|
4
|
+
import { BasePolarGraphicalItemSettings } from "../graphicalItemsSlice"
|
|
5
|
+
import { DataKey, LegendType } from "../../util/types"
|
|
6
|
+
import { TooltipType } from "../../component/DefaultTooltipContent"
|
|
7
|
+
import { SVGPropsNoEvents } from "../../util/svgPropertiesNoEvents"
|
|
8
|
+
import { WithoutId } from "../../util/useUniqueId"
|
|
9
|
+
|
|
10
|
+
export type PiePresentationProps = SVGPropsNoEvents<
|
|
11
|
+
WithoutId<WithoutRemoveFalse<JSX.PathSVGAttributes<SVGPathElement>>>
|
|
12
|
+
>
|
|
13
|
+
|
|
14
|
+
export interface PieSettings extends BasePolarGraphicalItemSettings {
|
|
15
|
+
type: "pie"
|
|
16
|
+
name: string | number | undefined
|
|
17
|
+
nameKey: DataKey<unknown>
|
|
18
|
+
tooltipType: TooltipType | undefined
|
|
19
|
+
|
|
20
|
+
legendType: LegendType
|
|
21
|
+
fill: string
|
|
22
|
+
|
|
23
|
+
cx: number | string
|
|
24
|
+
cy: number | string
|
|
25
|
+
startAngle: number
|
|
26
|
+
endAngle: number
|
|
27
|
+
paddingAngle: number
|
|
28
|
+
minAngle: number
|
|
29
|
+
innerRadius: number | string
|
|
30
|
+
outerRadius: number | string | ((element: unknown) => number | string)
|
|
31
|
+
maxRadius: number | undefined
|
|
32
|
+
cornerRadius: number | string | undefined
|
|
33
|
+
presentationProps: PiePresentationProps | null
|
|
34
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import { MaybeStackedGraphicalItem } from "./StackedGraphicalItem"
|
|
3
|
+
import { BasePolarGraphicalItemSettings } from "../graphicalItemsSlice"
|
|
4
|
+
|
|
5
|
+
export interface RadialBarSettings
|
|
6
|
+
extends BasePolarGraphicalItemSettings, MaybeStackedGraphicalItem {
|
|
7
|
+
type: "radialBar"
|
|
8
|
+
minPointSize: number
|
|
9
|
+
maxBarSize: number | undefined
|
|
10
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ChartData } from "../chartDataSlice"
|
|
2
|
+
import { DataKey } from "../../util/types"
|
|
3
|
+
import { TooltipType } from "../../component/DefaultTooltipContent"
|
|
4
|
+
import { BaseCartesianGraphicalItemSettings } from "../graphicalItemsSlice"
|
|
5
|
+
|
|
6
|
+
export type ScatterSettings = BaseCartesianGraphicalItemSettings & {
|
|
7
|
+
type: "scatter"
|
|
8
|
+
data: ChartData | undefined
|
|
9
|
+
dataKey: DataKey<unknown> | undefined
|
|
10
|
+
tooltipType: TooltipType | undefined
|
|
11
|
+
name: string | number | undefined
|
|
12
|
+
}
|