@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,470 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import { createMemo, Show, createEffect } from 'solid-js';
|
|
3
|
+
import type { JSX } from '@solidjs/web';
|
|
4
|
+
import { BarePortal } from "../util/BarePortal"
|
|
5
|
+
import {
|
|
6
|
+
DefaultTooltipContent,
|
|
7
|
+
type NameType,
|
|
8
|
+
type Payload,
|
|
9
|
+
type Props as DefaultTooltipContentProps,
|
|
10
|
+
type TooltipItemSorter,
|
|
11
|
+
type ValueType,
|
|
12
|
+
} from "./DefaultTooltipContent"
|
|
13
|
+
import { TooltipBoundingBox } from "./TooltipBoundingBox"
|
|
14
|
+
|
|
15
|
+
import { getUniqPayload, type UniqueOption } from "../util/payload/getUniqPayload"
|
|
16
|
+
import type {
|
|
17
|
+
AllowInDimension,
|
|
18
|
+
AnimationDuration,
|
|
19
|
+
AnimationTiming,
|
|
20
|
+
Coordinate,
|
|
21
|
+
} from "../util/types"
|
|
22
|
+
import { useViewBox } from "../context/chartLayoutContext"
|
|
23
|
+
import { useAccessibilityLayer } from "../context/accessibilityContext"
|
|
24
|
+
import { useElementOffset } from "../util/useElementOffset"
|
|
25
|
+
import { Cursor, type CursorDefinition } from "./Cursor"
|
|
26
|
+
import {
|
|
27
|
+
selectActiveCoordinate,
|
|
28
|
+
selectActiveLabel,
|
|
29
|
+
selectIsTooltipActive,
|
|
30
|
+
selectTooltipPayload,
|
|
31
|
+
} from "../state/selectors/selectors"
|
|
32
|
+
import { useTooltipPortal } from "../context/tooltipPortalContext"
|
|
33
|
+
import type { TooltipTrigger } from "../chart/types"
|
|
34
|
+
import { useChartStore } from "../state/RechartsStoreContext"
|
|
35
|
+
import { useOptionalChartState } from "../state/useChartState"
|
|
36
|
+
import type { ChartState } from "../state/chartState"
|
|
37
|
+
import type {
|
|
38
|
+
TooltipIndex,
|
|
39
|
+
TooltipPayload,
|
|
40
|
+
TooltipPayloadEntry,
|
|
41
|
+
TooltipSettingsState,
|
|
42
|
+
} from "../state/tooltipSlice"
|
|
43
|
+
import type { AxisId } from "../state/cartesianAxisSlice"
|
|
44
|
+
import { useTooltipChartSynchronisation } from "../synchronisation/useChartSynchronisation"
|
|
45
|
+
import { selectTooltipEventType } from "../state/selectors/selectTooltipEventType"
|
|
46
|
+
|
|
47
|
+
import { mergeProps } from '../util/solid-1-compat';
|
|
48
|
+
export type ContentType<TValue extends ValueType = ValueType, TName extends NameType = NameType> =
|
|
49
|
+
| JSX.Element
|
|
50
|
+
| ((props: TooltipContentProps<TValue, TName>) => JSX.Element)
|
|
51
|
+
|
|
52
|
+
function defaultUniqBy(entry: Payload<ValueType, NameType>) {
|
|
53
|
+
return entry.dataKey
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type TooltipContentProps<
|
|
57
|
+
TValue extends ValueType = ValueType,
|
|
58
|
+
TName extends NameType = NameType,
|
|
59
|
+
> = TooltipProps<TValue, TName> & {
|
|
60
|
+
label?: string | number
|
|
61
|
+
payload: TooltipPayload
|
|
62
|
+
coordinate: Coordinate | undefined
|
|
63
|
+
active: boolean
|
|
64
|
+
accessibilityLayer: boolean
|
|
65
|
+
activeIndex: TooltipIndex | undefined
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function renderContent<TValue extends ValueType, TName extends NameType>(
|
|
69
|
+
content: ContentType<TValue, TName> | undefined,
|
|
70
|
+
contentProps: TooltipContentProps,
|
|
71
|
+
): JSX.Element {
|
|
72
|
+
if (typeof content === "function") {
|
|
73
|
+
return (content as (p: TooltipContentProps) => JSX.Element)(contentProps)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (content != null) {
|
|
77
|
+
return content as JSX.Element
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return <DefaultTooltipContent {...contentProps} />
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
type PropertiesReadFromContext =
|
|
84
|
+
| "viewBox"
|
|
85
|
+
| "active"
|
|
86
|
+
| "payload"
|
|
87
|
+
| "coordinate"
|
|
88
|
+
| "label"
|
|
89
|
+
| "accessibilityLayer"
|
|
90
|
+
|
|
91
|
+
export type TooltipProps<
|
|
92
|
+
TValue extends ValueType = ValueType,
|
|
93
|
+
TName extends NameType = NameType,
|
|
94
|
+
> = Omit<DefaultTooltipContentProps<TValue, TName>, PropertiesReadFromContext> & {
|
|
95
|
+
/**
|
|
96
|
+
* If true, then Tooltip is always displayed, once an activeIndex is set by mouse over, or programmatically.
|
|
97
|
+
* If false, then Tooltip is never displayed.
|
|
98
|
+
* If undefined, Recharts will control when the Tooltip displays. This includes mouse and keyboard controls.
|
|
99
|
+
*/
|
|
100
|
+
active?: boolean
|
|
101
|
+
/**
|
|
102
|
+
* This option allows the tooltip to extend beyond the viewBox of the chart itself.
|
|
103
|
+
* @defaultValue {"x":false,"y":false}
|
|
104
|
+
*/
|
|
105
|
+
allowEscapeViewBox?: AllowInDimension
|
|
106
|
+
/**
|
|
107
|
+
* Specifies the duration of animation, the unit of this option is ms.
|
|
108
|
+
* @defaultValue 400
|
|
109
|
+
*/
|
|
110
|
+
animationDuration?: AnimationDuration
|
|
111
|
+
/**
|
|
112
|
+
* The type of easing function.
|
|
113
|
+
* @defaultValue ease
|
|
114
|
+
*/
|
|
115
|
+
animationEasing?: AnimationTiming
|
|
116
|
+
/**
|
|
117
|
+
* Tooltip always attaches itself to the "Tooltip" axis. Which axis is it? Depends on the layout:
|
|
118
|
+
* - horizontal layout -> X axis
|
|
119
|
+
* - vertical layout -> Y axis
|
|
120
|
+
* - radial layout -> radial axis
|
|
121
|
+
* - centric layout -> angle axis
|
|
122
|
+
*
|
|
123
|
+
* Tooltip will use the default axis for the layout, unless you specify an axisId.
|
|
124
|
+
*
|
|
125
|
+
* @defaultValue 0
|
|
126
|
+
*/
|
|
127
|
+
axisId?: AxisId
|
|
128
|
+
/**
|
|
129
|
+
* Renders the content of the tooltip.
|
|
130
|
+
*
|
|
131
|
+
* This should return HTML elements, not SVG elements.
|
|
132
|
+
*
|
|
133
|
+
* - If not set, the {@link DefaultTooltipContent} component is used.
|
|
134
|
+
* - If set to a JSX element, that element will be rendered.
|
|
135
|
+
* - If set to a function, the function will be called and should return HTML elements.
|
|
136
|
+
*
|
|
137
|
+
* @see {@link https://recharts.github.io/en-US/examples/CustomContentOfTooltip/ Example with custom content}
|
|
138
|
+
*/
|
|
139
|
+
content?: ContentType<TValue, TName>
|
|
140
|
+
/**
|
|
141
|
+
* The style of tooltip content which is a dom element.
|
|
142
|
+
* @defaultValue {}
|
|
143
|
+
*/
|
|
144
|
+
contentStyle?: JSX.CSSProperties
|
|
145
|
+
/**
|
|
146
|
+
* If set false, no cursor will be drawn when tooltip is active.
|
|
147
|
+
* If set a object, the option is the configuration of cursor.
|
|
148
|
+
* If set a JSX element, the option is the custom element of drawing cursor.
|
|
149
|
+
* @defaultValue true
|
|
150
|
+
*/
|
|
151
|
+
cursor?: CursorDefinition
|
|
152
|
+
defaultIndex?: number | TooltipIndex
|
|
153
|
+
/**
|
|
154
|
+
* When an item of the payload has value null or undefined, this item won't be displayed.
|
|
155
|
+
* @defaultValue true
|
|
156
|
+
*/
|
|
157
|
+
filterNull?: boolean
|
|
158
|
+
/**
|
|
159
|
+
* Function to customize the value in the tooltip.
|
|
160
|
+
* If you return an array, the first entry will be the formatted "value", and the second entry will be the formatted "name"
|
|
161
|
+
*/
|
|
162
|
+
formatter?: (
|
|
163
|
+
value: TValue,
|
|
164
|
+
name: TName,
|
|
165
|
+
item: TooltipPayloadEntry,
|
|
166
|
+
index: number,
|
|
167
|
+
payload: TooltipPayload,
|
|
168
|
+
) => JSX.Element | [JSX.Element, JSX.Element]
|
|
169
|
+
/**
|
|
170
|
+
* If true, the tooltip will display information about hidden series.
|
|
171
|
+
* Defaults to false.
|
|
172
|
+
* Interacting with the hide property of Area, Bar, Line, Scatter.
|
|
173
|
+
*
|
|
174
|
+
* @defaultValue false
|
|
175
|
+
*/
|
|
176
|
+
includeHidden?: boolean | undefined
|
|
177
|
+
/**
|
|
178
|
+
* If set false, animation of tooltip will be disabled.
|
|
179
|
+
* If set "auto", animation is disabled during SSR and when the user prefers reduced motion.
|
|
180
|
+
* @defaultValue auto
|
|
181
|
+
*/
|
|
182
|
+
isAnimationActive?: boolean | "auto"
|
|
183
|
+
/**
|
|
184
|
+
* Sorts tooltip items.
|
|
185
|
+
* Defaults to 'name' which means it sorts alphabetically by graphical item `name` property.
|
|
186
|
+
* @defaultValue name
|
|
187
|
+
*/
|
|
188
|
+
itemSorter?: TooltipItemSorter
|
|
189
|
+
/**
|
|
190
|
+
* The style of default tooltip content item which is a li element.
|
|
191
|
+
* @defaultValue {}
|
|
192
|
+
*/
|
|
193
|
+
itemStyle?: JSX.CSSProperties
|
|
194
|
+
/**
|
|
195
|
+
* The formatter function of label in tooltip.
|
|
196
|
+
*/
|
|
197
|
+
labelFormatter?: (label: unknown, payload: TooltipPayload) => JSX.Element
|
|
198
|
+
/**
|
|
199
|
+
* The style of default tooltip label which is a p element.
|
|
200
|
+
* @defaultValue {}
|
|
201
|
+
*/
|
|
202
|
+
labelStyle?: JSX.CSSProperties
|
|
203
|
+
/**
|
|
204
|
+
* The offset size between the position of tooltip and the mouse cursor position.
|
|
205
|
+
* When a number is provided, the same offset is applied to both x and y axes.
|
|
206
|
+
*
|
|
207
|
+
* When a Coordinate object is provided, you can specify different offsets for each axis (x and y as numbers)
|
|
208
|
+
* @defaultValue 10
|
|
209
|
+
*/
|
|
210
|
+
offset?: number | Coordinate
|
|
211
|
+
payloadUniqBy?: UniqueOption<TooltipPayloadEntry>
|
|
212
|
+
/**
|
|
213
|
+
* If portal is defined, then Tooltip will use this element as a target
|
|
214
|
+
* for rendering using Solid Portal.
|
|
215
|
+
*
|
|
216
|
+
* If this is undefined then Tooltip renders inside the recharts-wrapper element.
|
|
217
|
+
*/
|
|
218
|
+
portal?: HTMLElement | null
|
|
219
|
+
/**
|
|
220
|
+
* If this field is set, the tooltip will be displayed at the specified position
|
|
221
|
+
* regardless of the mouse position.
|
|
222
|
+
*
|
|
223
|
+
* You can set a single field (x or y) and let the other field be calculated automatically based
|
|
224
|
+
* on the mouse position.
|
|
225
|
+
*/
|
|
226
|
+
position?: Partial<Coordinate>
|
|
227
|
+
/**
|
|
228
|
+
* @defaultValue {"x":false,"y":false}
|
|
229
|
+
*/
|
|
230
|
+
reverseDirection?: AllowInDimension
|
|
231
|
+
/**
|
|
232
|
+
* The separator between name and value.
|
|
233
|
+
* @defaultValue ' : '
|
|
234
|
+
*/
|
|
235
|
+
separator?: string
|
|
236
|
+
/**
|
|
237
|
+
* Defines whether the tooltip is reacting to the current data point,
|
|
238
|
+
* or to all data points at the current axis coordinate.
|
|
239
|
+
*
|
|
240
|
+
* - `true`: tooltip will appear on top of all bars on an axis tick.
|
|
241
|
+
* - `false`: tooltip will appear on individual bars.
|
|
242
|
+
*
|
|
243
|
+
* Different chart types allow different modes, and have different defaults.
|
|
244
|
+
*
|
|
245
|
+
* @see {@link https://github.com/recharts/recharts/wiki/Tooltip-event-type-and-shared-prop Tooltip event type and shared prop wiki page}
|
|
246
|
+
*/
|
|
247
|
+
shared?: boolean
|
|
248
|
+
/**
|
|
249
|
+
* If `hover` then the Tooltip shows on mouse enter and hides on mouse leave.
|
|
250
|
+
*
|
|
251
|
+
* If `click` then the Tooltip shows after clicking and stays active.
|
|
252
|
+
*
|
|
253
|
+
* @defaultValue hover
|
|
254
|
+
*/
|
|
255
|
+
trigger?: TooltipTrigger
|
|
256
|
+
/**
|
|
257
|
+
* @defaultValue false
|
|
258
|
+
*/
|
|
259
|
+
useTranslate3d?: boolean
|
|
260
|
+
/**
|
|
261
|
+
* CSS styles to be applied to the wrapper `div` element.
|
|
262
|
+
*/
|
|
263
|
+
wrapperStyle?: JSX.CSSProperties
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const emptyPayload: TooltipPayload = []
|
|
267
|
+
|
|
268
|
+
export const defaultTooltipProps = {
|
|
269
|
+
allowEscapeViewBox: { x: false, y: false },
|
|
270
|
+
animationDuration: 400,
|
|
271
|
+
animationEasing: "ease",
|
|
272
|
+
axisId: 0,
|
|
273
|
+
contentStyle: {},
|
|
274
|
+
cursor: true,
|
|
275
|
+
filterNull: true,
|
|
276
|
+
includeHidden: false,
|
|
277
|
+
isAnimationActive: "auto",
|
|
278
|
+
itemSorter: "name",
|
|
279
|
+
itemStyle: {},
|
|
280
|
+
labelStyle: {},
|
|
281
|
+
offset: 10,
|
|
282
|
+
reverseDirection: { x: false, y: false },
|
|
283
|
+
separator: " : ",
|
|
284
|
+
trigger: "hover",
|
|
285
|
+
useTranslate3d: false,
|
|
286
|
+
wrapperStyle: {},
|
|
287
|
+
} as const satisfies Partial<TooltipProps>
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* The Tooltip component displays a floating box with data values when hovering over or clicking on chart elements.
|
|
291
|
+
*
|
|
292
|
+
* It can be configured to show information for individual data points or for all points at a specific axis coordinate.
|
|
293
|
+
* The appearance and content of the tooltip can be customized via props.
|
|
294
|
+
*
|
|
295
|
+
* @see {@link https://github.com/recharts/recharts/wiki/Tooltip-event-type-and-shared-prop Tooltip event type and shared prop wiki page}
|
|
296
|
+
* @see {@link https://recharts.github.io/en-US/guide/activeIndex/ Active index replacement when migrating from Recharts v2 to v3}
|
|
297
|
+
*
|
|
298
|
+
* @consumes CartesianChartContext
|
|
299
|
+
* @consumes PolarChartContext
|
|
300
|
+
* @consumes TooltipEntrySettings
|
|
301
|
+
*/
|
|
302
|
+
export function Tooltip(outsideProps: TooltipProps<ValueType, NameType>) {
|
|
303
|
+
/* mergeProps preserves the reactive props proxy; resolveDefaultProps would freeze
|
|
304
|
+
`payload`/`active`/etc. as snapshots and leak the children getter through the
|
|
305
|
+
spread, breaking GOTCHA-005-C and GOTCHA-006-E semantics. */
|
|
306
|
+
const props = mergeProps(defaultTooltipProps, outsideProps) as TooltipProps<ValueType, NameType> &
|
|
307
|
+
typeof defaultTooltipProps
|
|
308
|
+
|
|
309
|
+
const ctx = useChartStore()
|
|
310
|
+
const newCtx = useOptionalChartState()
|
|
311
|
+
const defaultIndexAsString = (): string | null | undefined =>
|
|
312
|
+
typeof props.defaultIndex === "number" ? String(props.defaultIndex) : props.defaultIndex
|
|
313
|
+
|
|
314
|
+
createEffect(
|
|
315
|
+
(): TooltipSettingsState => ({
|
|
316
|
+
active: props.active,
|
|
317
|
+
axisId: props.axisId,
|
|
318
|
+
defaultIndex: defaultIndexAsString(),
|
|
319
|
+
shared: props.shared,
|
|
320
|
+
trigger: props.trigger,
|
|
321
|
+
}),
|
|
322
|
+
(settings) => {
|
|
323
|
+
/* Replace the settings object wholesale, like upstream setTooltipSettingsState. */
|
|
324
|
+
newCtx?.setState((draft: ChartState) => {
|
|
325
|
+
draft.tooltip.settings = settings
|
|
326
|
+
})
|
|
327
|
+
},
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
const viewBox = createMemo(() => useViewBox())
|
|
331
|
+
const accessibilityLayer = createMemo(() => useAccessibilityLayer())
|
|
332
|
+
const tooltipEventType = createMemo(() =>
|
|
333
|
+
ctx ? selectTooltipEventType(ctx.store, props.shared) : undefined,
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
/* selectTooltipState (D27 full merge) now handles new-state-first for all
|
|
337
|
+
interaction subtrees — ctx.store already reflects the merged view. */
|
|
338
|
+
const tooltipActiveResult = createMemo((): { isActive: boolean; activeIndex: TooltipIndex | null } => {
|
|
339
|
+
return (
|
|
340
|
+
(ctx?.store
|
|
341
|
+
? selectIsTooltipActive(ctx.store, tooltipEventType(), props.trigger, defaultIndexAsString())
|
|
342
|
+
: undefined) ?? { activeIndex: null, isActive: false }
|
|
343
|
+
)
|
|
344
|
+
})
|
|
345
|
+
|
|
346
|
+
const payloadFromRedux = createMemo(() =>
|
|
347
|
+
ctx?.store
|
|
348
|
+
? selectTooltipPayload(ctx.store, tooltipEventType(), props.trigger, defaultIndexAsString())
|
|
349
|
+
: undefined,
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
const labelFromRedux = createMemo(() =>
|
|
353
|
+
ctx?.store
|
|
354
|
+
? selectActiveLabel(ctx.store, tooltipEventType(), props.trigger, defaultIndexAsString())
|
|
355
|
+
: undefined,
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
const coordinate = createMemo((): Coordinate | undefined =>
|
|
359
|
+
ctx?.store
|
|
360
|
+
? selectActiveCoordinate(ctx.store, tooltipEventType(), props.trigger, defaultIndexAsString())
|
|
361
|
+
: undefined,
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
const tooltipPortalFromContext = useTooltipPortal()
|
|
365
|
+
|
|
366
|
+
/*
|
|
367
|
+
* The user can set `active=true` on the Tooltip in which case the Tooltip will stay always active,
|
|
368
|
+
* or `active=false` in which case the Tooltip never shows.
|
|
369
|
+
*
|
|
370
|
+
* If the `active` prop is not defined then it will show and hide based on mouse or keyboard activity.
|
|
371
|
+
*/
|
|
372
|
+
const finalIsActive = (): boolean => props.active ?? tooltipActiveResult().isActive ?? false
|
|
373
|
+
const activeIndex = () => tooltipActiveResult().activeIndex
|
|
374
|
+
|
|
375
|
+
const finalLabel = () => (tooltipEventType() === "axis" ? labelFromRedux() : undefined)
|
|
376
|
+
|
|
377
|
+
/* eslint-disable-next-line solid/reactivity -- tooltipEventType and coordinate are createMemo accessors passed by reference, not invoked here */
|
|
378
|
+
useTooltipChartSynchronisation(
|
|
379
|
+
tooltipEventType,
|
|
380
|
+
() => props.trigger,
|
|
381
|
+
coordinate,
|
|
382
|
+
finalLabel,
|
|
383
|
+
activeIndex,
|
|
384
|
+
finalIsActive,
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
const tooltipPortal = () => props.portal ?? tooltipPortalFromContext()
|
|
388
|
+
|
|
389
|
+
const finalPayload = createMemo((): TooltipPayload => {
|
|
390
|
+
let fp: TooltipPayload = payloadFromRedux() ?? emptyPayload
|
|
391
|
+
if (!finalIsActive()) {
|
|
392
|
+
fp = emptyPayload
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
if (props.filterNull && fp.length) {
|
|
396
|
+
fp = getUniqPayload(
|
|
397
|
+
fp.filter(
|
|
398
|
+
(entry) => entry.value != null && (entry.hide !== true || props.includeHidden),
|
|
399
|
+
),
|
|
400
|
+
props.payloadUniqBy,
|
|
401
|
+
defaultUniqBy,
|
|
402
|
+
)
|
|
403
|
+
}
|
|
404
|
+
return fp
|
|
405
|
+
})
|
|
406
|
+
|
|
407
|
+
const hasPayload = () => finalPayload().length > 0
|
|
408
|
+
|
|
409
|
+
/* Re-measure tooltip box whenever payload or active flips. Mirrors React's
|
|
410
|
+
useElementOffset([payload, finalIsActive]) — without these deps the bounding
|
|
411
|
+
box is read once at mount (0×0 when hidden) and never updates, leaving the
|
|
412
|
+
tooltip stuck at top-left of the chart. */
|
|
413
|
+
const [lastBoundingBox, updateBoundingBox] = useElementOffset(() => [
|
|
414
|
+
finalPayload(),
|
|
415
|
+
finalIsActive(),
|
|
416
|
+
])
|
|
417
|
+
|
|
418
|
+
const tooltipContentProps = (): TooltipContentProps => ({
|
|
419
|
+
...props,
|
|
420
|
+
accessibilityLayer: accessibilityLayer(),
|
|
421
|
+
active: finalIsActive(),
|
|
422
|
+
activeIndex: activeIndex(),
|
|
423
|
+
coordinate: coordinate(),
|
|
424
|
+
label: finalLabel(),
|
|
425
|
+
payload: finalPayload(),
|
|
426
|
+
})
|
|
427
|
+
|
|
428
|
+
const isReady = createMemo(
|
|
429
|
+
() => tooltipPortal() != null && viewBox() != null && tooltipEventType() != null,
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
return (
|
|
433
|
+
<Show when={isReady()}>
|
|
434
|
+
{/* Tooltip the HTML element renders through a Solid portal so that it escapes clipping, and it renders on top of everything else */}
|
|
435
|
+
<BarePortal mount={tooltipPortal() ?? undefined}>
|
|
436
|
+
<TooltipBoundingBox
|
|
437
|
+
allowEscapeViewBox={props.allowEscapeViewBox}
|
|
438
|
+
animationDuration={props.animationDuration}
|
|
439
|
+
animationEasing={props.animationEasing}
|
|
440
|
+
isAnimationActive={props.isAnimationActive}
|
|
441
|
+
active={finalIsActive()}
|
|
442
|
+
coordinate={coordinate()}
|
|
443
|
+
hasPayload={hasPayload()}
|
|
444
|
+
offset={props.offset}
|
|
445
|
+
position={props.position}
|
|
446
|
+
reverseDirection={props.reverseDirection}
|
|
447
|
+
useTranslate3d={props.useTranslate3d}
|
|
448
|
+
viewBox={viewBox() ?? { height: 0, width: 0, x: 0, y: 0 }}
|
|
449
|
+
wrapperStyle={props.wrapperStyle}
|
|
450
|
+
lastBoundingBox={lastBoundingBox()}
|
|
451
|
+
innerRef={updateBoundingBox}
|
|
452
|
+
hasPortalFromProps={Boolean(props.portal)}
|
|
453
|
+
>
|
|
454
|
+
{renderContent(props.content, tooltipContentProps())}
|
|
455
|
+
</TooltipBoundingBox>
|
|
456
|
+
</BarePortal>
|
|
457
|
+
<Show when={finalIsActive() && tooltipEventType()}>
|
|
458
|
+
{(eventType) => (
|
|
459
|
+
<Cursor
|
|
460
|
+
cursor={props.cursor}
|
|
461
|
+
tooltipEventType={eventType()}
|
|
462
|
+
coordinate={coordinate()}
|
|
463
|
+
payload={finalPayload()}
|
|
464
|
+
index={activeIndex()}
|
|
465
|
+
/>
|
|
466
|
+
)}
|
|
467
|
+
</Show>
|
|
468
|
+
</Show>
|
|
469
|
+
)
|
|
470
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle, sort-keys */
|
|
2
|
+
import { createSignal, onCleanup, onSettled, createEffect } from 'solid-js';
|
|
3
|
+
import type { JSX } from '@solidjs/web';
|
|
4
|
+
import type {
|
|
5
|
+
AllowInDimension,
|
|
6
|
+
AnimationDuration,
|
|
7
|
+
AnimationTiming,
|
|
8
|
+
CartesianViewBox,
|
|
9
|
+
Coordinate,
|
|
10
|
+
PolarCoordinate,
|
|
11
|
+
} from "../util/types"
|
|
12
|
+
import { getTooltipTranslate } from "../util/tooltip/translate"
|
|
13
|
+
import type { ElementOffset, SetElementOffset } from "../util/useElementOffset"
|
|
14
|
+
import { usePrefersReducedMotion } from "../util/usePrefersReducedMotion"
|
|
15
|
+
|
|
16
|
+
function resolveTransitionProperty(args: {
|
|
17
|
+
prefersReducedMotion: boolean
|
|
18
|
+
isAnimationActive: boolean | "auto"
|
|
19
|
+
active: boolean
|
|
20
|
+
animationDuration: number
|
|
21
|
+
animationEasing: AnimationTiming
|
|
22
|
+
}): string | undefined {
|
|
23
|
+
if (args.prefersReducedMotion && args.isAnimationActive === "auto") {
|
|
24
|
+
return undefined
|
|
25
|
+
}
|
|
26
|
+
if (args.isAnimationActive && args.active) {
|
|
27
|
+
return `transform ${args.animationDuration}ms ${args.animationEasing}`
|
|
28
|
+
}
|
|
29
|
+
return undefined
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type TooltipBoundingBoxProps = {
|
|
33
|
+
active: boolean
|
|
34
|
+
allowEscapeViewBox: AllowInDimension
|
|
35
|
+
animationDuration: AnimationDuration
|
|
36
|
+
animationEasing: AnimationTiming
|
|
37
|
+
children: JSX.Element
|
|
38
|
+
coordinate: Coordinate | PolarCoordinate | undefined
|
|
39
|
+
hasPayload: boolean
|
|
40
|
+
isAnimationActive: boolean | "auto"
|
|
41
|
+
offset: number | Coordinate
|
|
42
|
+
position: Partial<Coordinate> | undefined
|
|
43
|
+
reverseDirection: AllowInDimension
|
|
44
|
+
useTranslate3d: boolean
|
|
45
|
+
viewBox: CartesianViewBox
|
|
46
|
+
wrapperStyle: JSX.CSSProperties
|
|
47
|
+
lastBoundingBox: ElementOffset
|
|
48
|
+
innerRef: SetElementOffset
|
|
49
|
+
hasPortalFromProps: boolean
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function TooltipBoundingBox(props: TooltipBoundingBoxProps) {
|
|
53
|
+
const prefersReducedMotion = usePrefersReducedMotion()
|
|
54
|
+
const [dismissed, setDismissed] = createSignal(false)
|
|
55
|
+
const [dismissedAtCoordinate, setDismissedAtCoordinate] = createSignal<Coordinate>({ x: 0, y: 0 })
|
|
56
|
+
|
|
57
|
+
const handleKeyDown = (event: KeyboardEvent) => {
|
|
58
|
+
if (event.key === "Escape") {
|
|
59
|
+
setDismissed(true)
|
|
60
|
+
setDismissedAtCoordinate({
|
|
61
|
+
x: props.coordinate?.x ?? 0,
|
|
62
|
+
y: props.coordinate?.y ?? 0,
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
onSettled(() => {
|
|
68
|
+
document.addEventListener("keydown", handleKeyDown)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
onCleanup(() => {
|
|
72
|
+
document.removeEventListener("keydown", handleKeyDown)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
/* Re-show tooltip when coordinate changes after dismiss */
|
|
76
|
+
createEffect(
|
|
77
|
+
() =>
|
|
78
|
+
dismissed() &&
|
|
79
|
+
(props.coordinate?.x !== dismissedAtCoordinate().x ||
|
|
80
|
+
props.coordinate?.y !== dismissedAtCoordinate().y),
|
|
81
|
+
(moved) => {
|
|
82
|
+
if (moved) {
|
|
83
|
+
setDismissed(false)
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
const offsetLeft = () => (typeof props.offset === "number" ? props.offset : props.offset.x)
|
|
89
|
+
const offsetTop = () => (typeof props.offset === "number" ? props.offset : props.offset.y)
|
|
90
|
+
|
|
91
|
+
const tooltipTranslate = () =>
|
|
92
|
+
getTooltipTranslate({
|
|
93
|
+
allowEscapeViewBox: props.allowEscapeViewBox,
|
|
94
|
+
coordinate: props.coordinate,
|
|
95
|
+
offsetLeft: offsetLeft(),
|
|
96
|
+
offsetTop: offsetTop(),
|
|
97
|
+
position: props.position,
|
|
98
|
+
reverseDirection: props.reverseDirection,
|
|
99
|
+
tooltipBox: {
|
|
100
|
+
height: props.lastBoundingBox.height,
|
|
101
|
+
width: props.lastBoundingBox.width,
|
|
102
|
+
},
|
|
103
|
+
useTranslate3d: props.useTranslate3d,
|
|
104
|
+
viewBox: props.viewBox,
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
const isVisible = () => !dismissed() && props.active && props.hasPayload
|
|
108
|
+
|
|
109
|
+
/* do not use absolute styles if the user has passed a custom portal prop */
|
|
110
|
+
const positionStyles = (): JSX.CSSProperties =>
|
|
111
|
+
props.hasPortalFromProps
|
|
112
|
+
? {}
|
|
113
|
+
: {
|
|
114
|
+
transition: resolveTransitionProperty({
|
|
115
|
+
prefersReducedMotion,
|
|
116
|
+
isAnimationActive: props.isAnimationActive,
|
|
117
|
+
active: props.active,
|
|
118
|
+
animationDuration: props.animationDuration,
|
|
119
|
+
animationEasing: props.animationEasing,
|
|
120
|
+
}),
|
|
121
|
+
...tooltipTranslate().cssProperties,
|
|
122
|
+
"pointer-events": "none",
|
|
123
|
+
visibility: isVisible() ? "visible" : "hidden",
|
|
124
|
+
position: "absolute",
|
|
125
|
+
top: 0,
|
|
126
|
+
left: 0,
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const outerStyle = (): JSX.CSSProperties => ({
|
|
130
|
+
...positionStyles(),
|
|
131
|
+
visibility: isVisible() ? "visible" : "hidden",
|
|
132
|
+
...props.wrapperStyle,
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
return (
|
|
136
|
+
/* This element allow listening to the `Escape` key. See https://github.com/recharts/recharts/pull/2925 */
|
|
137
|
+
<div
|
|
138
|
+
tabindex={-1}
|
|
139
|
+
class={tooltipTranslate().cssClasses}
|
|
140
|
+
style={outerStyle()}
|
|
141
|
+
ref={props.innerRef}
|
|
142
|
+
>
|
|
143
|
+
{props.children}
|
|
144
|
+
</div>
|
|
145
|
+
)
|
|
146
|
+
}
|