solid-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/NEXT_SESSION_PROMPT.md +114 -0
- package/package.json +28 -0
- package/src/animation/AnimatedItems.tsx +169 -0
- package/src/animation/AnimationController.ts +24 -0
- package/src/animation/AnimationControllerImpl.ts +37 -0
- package/src/animation/AnimationHandle.ts +273 -0
- package/src/animation/CSSTransitionAnimate.tsx +142 -0
- package/src/animation/JavascriptAnimate.tsx +107 -0
- package/src/animation/easing.ts +261 -0
- package/src/animation/matchBy.ts +211 -0
- package/src/animation/timeoutController.ts +51 -0
- package/src/animation/useAnimationController.tsx +31 -0
- package/src/animation/useAnimationStartSnapshot.ts +73 -0
- package/src/animation/util.ts +16 -0
- package/src/cartesian/Area.tsx +810 -0
- package/src/cartesian/AreaRevealShape.tsx +250 -0
- package/src/cartesian/Bar.tsx +1216 -0
- package/src/cartesian/BarStack.tsx +148 -0
- package/src/cartesian/Brush.tsx +653 -0
- package/src/cartesian/CartesianAxis.tsx +541 -0
- package/src/cartesian/CartesianGrid.tsx +605 -0
- package/src/cartesian/ErrorBar.tsx +319 -0
- package/src/cartesian/Funnel.tsx +594 -0
- package/src/cartesian/GraphicalItemClipPath.tsx +75 -0
- package/src/cartesian/Line.tsx +742 -0
- package/src/cartesian/LineDrawShape.tsx +190 -0
- package/src/cartesian/ReferenceArea.tsx +275 -0
- package/src/cartesian/ReferenceDot.tsx +286 -0
- package/src/cartesian/ReferenceLine.tsx +414 -0
- package/src/cartesian/RenderedTicksReporter.tsx +49 -0
- package/src/cartesian/Scatter.tsx +741 -0
- package/src/cartesian/XAxis.tsx +293 -0
- package/src/cartesian/YAxis.tsx +333 -0
- package/src/cartesian/ZAxis.tsx +80 -0
- package/src/cartesian/getCartesianPosition.ts +255 -0
- package/src/cartesian/getEquidistantTicks.ts +126 -0
- package/src/cartesian/getTicks.ts +225 -0
- package/src/cartesian/useAnimatedLineLength.ts +84 -0
- package/src/chart/AreaChart.tsx +30 -0
- package/src/chart/BarChart.tsx +27 -0
- package/src/chart/CartesianChart.tsx +91 -0
- package/src/chart/CategoricalChart.tsx +60 -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 +41 -0
- package/src/chart/PolarChart.tsx +97 -0
- package/src/chart/RadarChart.tsx +37 -0
- package/src/chart/RadialBarChart.tsx +39 -0
- package/src/chart/RechartsWrapper.tsx +486 -0
- package/src/chart/Sankey.tsx +992 -0
- package/src/chart/ScatterChart.tsx +29 -0
- package/src/chart/SunburstChart.tsx +394 -0
- package/src/chart/Treemap.tsx +874 -0
- package/src/chart/types.ts +37 -0
- package/src/component/ActivePoints.tsx +136 -0
- package/src/component/Cell.tsx +72 -0
- package/src/component/Cursor.tsx +249 -0
- package/src/component/Customized.tsx +8 -0
- package/src/component/DefaultLegendContent.tsx +205 -0
- package/src/component/DefaultTooltipContent.tsx +247 -0
- package/src/component/Dots.tsx +128 -0
- package/src/component/Label.tsx +507 -0
- package/src/component/LabelList.tsx +270 -0
- package/src/component/Legend.tsx +273 -0
- package/src/component/ResponsiveContainer.tsx +397 -0
- package/src/component/Text.tsx +436 -0
- package/src/component/Tooltip.tsx +309 -0
- package/src/component/TooltipBoundingBox.tsx +152 -0
- package/src/component/responsiveContainerUtils.ts +128 -0
- package/src/container/ClipPathProvider.tsx +40 -0
- package/src/container/Layer.tsx +38 -0
- package/src/container/RootSurface.tsx +124 -0
- package/src/container/Surface.tsx +70 -0
- package/src/context/ErrorBarContext.tsx +85 -0
- package/src/context/PanoramaContext.tsx +13 -0
- package/src/context/RegisterGraphicalItemId.tsx +41 -0
- package/src/context/accessibilityContext.tsx +10 -0
- package/src/context/brushUpdateContext.ts +14 -0
- package/src/context/chartDataContext.tsx +79 -0
- package/src/context/chartLayoutContext.tsx +158 -0
- package/src/context/legendPayloadContext.ts +11 -0
- package/src/context/legendPortalContext.ts +11 -0
- package/src/context/tooltipContext.ts +72 -0
- package/src/context/tooltipPortalContext.ts +14 -0
- package/src/context/useTooltipAxis.ts +24 -0
- package/src/hooks.ts +312 -0
- package/src/index.ts +288 -0
- package/src/polar/Pie.tsx +912 -0
- package/src/polar/PolarAngleAxis.tsx +494 -0
- package/src/polar/PolarGrid.tsx +269 -0
- package/src/polar/PolarRadiusAxis.tsx +422 -0
- package/src/polar/Radar.tsx +652 -0
- package/src/polar/RadialBar.tsx +767 -0
- package/src/polar/defaultPolarAngleAxisProps.tsx +33 -0
- package/src/polar/defaultPolarRadiusAxisProps.tsx +28 -0
- package/src/shape/Cross.tsx +83 -0
- package/src/shape/Curve.tsx +335 -0
- package/src/shape/Dot.tsx +49 -0
- package/src/shape/Polygon.tsx +168 -0
- package/src/shape/Rectangle.tsx +301 -0
- package/src/shape/Sector.tsx +304 -0
- package/src/shape/Symbols.tsx +144 -0
- package/src/shape/Trapezoid.tsx +228 -0
- package/src/state/RechartsReduxContext.tsx +8 -0
- package/src/state/RechartsStoreContext.ts +15 -0
- package/src/state/RechartsStoreProvider.tsx +27 -0
- package/src/state/ReportChartProps.tsx +19 -0
- package/src/state/ReportEventSettings.tsx +19 -0
- package/src/state/ReportMainChartProps.tsx +35 -0
- package/src/state/ReportPolarOptions.tsx +28 -0
- package/src/state/SetLegendPayload.ts +50 -0
- package/src/state/SetTooltipEntrySettings.tsx +46 -0
- package/src/state/brushSlice.ts +60 -0
- package/src/state/cartesianAxisSlice.ts +288 -0
- package/src/state/chartDataSlice.ts +115 -0
- package/src/state/errorBarSlice.ts +84 -0
- package/src/state/eventSettingsSlice.ts +41 -0
- package/src/state/externalEventsMiddleware.ts +136 -0
- package/src/state/graphicalItemsSlice.ts +162 -0
- package/src/state/hooks.ts +42 -0
- package/src/state/keyboardEventsMiddleware.ts +213 -0
- package/src/state/layoutSlice.ts +71 -0
- package/src/state/legendSlice.ts +107 -0
- package/src/state/mouseEventsMiddleware.ts +103 -0
- package/src/state/optionsSlice.ts +64 -0
- package/src/state/polarAxisSlice.ts +65 -0
- package/src/state/polarOptionsSlice.ts +54 -0
- package/src/state/reduxDevtoolsJsonStringifyReplacer.ts +15 -0
- package/src/state/referenceElementsSlice.ts +121 -0
- package/src/state/renderedTicksSlice.ts +61 -0
- package/src/state/rootPropsSlice.ts +70 -0
- package/src/state/selectors/areaSelectors.ts +169 -0
- package/src/state/selectors/arrayEqualityCheck.ts +8 -0
- package/src/state/selectors/axisSelectors.ts +2196 -0
- package/src/state/selectors/barSelectors.ts +319 -0
- package/src/state/selectors/barStackSelectors.ts +79 -0
- package/src/state/selectors/brushSelectors.ts +40 -0
- package/src/state/selectors/combiners/combineActiveLabel.ts +21 -0
- package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +93 -0
- package/src/state/selectors/combiners/combineAllBarPositions.ts +131 -0
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +17 -0
- package/src/state/selectors/combiners/combineBarPosition.ts +24 -0
- package/src/state/selectors/combiners/combineBarSizeList.ts +75 -0
- package/src/state/selectors/combiners/combineCheckedDomain.ts +49 -0
- package/src/state/selectors/combiners/combineConfiguredScale.ts +121 -0
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +43 -0
- package/src/state/selectors/combiners/combineDisplayedStackedData.ts +50 -0
- package/src/state/selectors/combiners/combineInverseScaleFunction.ts +17 -0
- package/src/state/selectors/combiners/combineRealScaleType.ts +48 -0
- package/src/state/selectors/combiners/combineStackedData.ts +28 -0
- package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
- package/src/state/selectors/combiners/combineTooltipPayload.ts +203 -0
- package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +45 -0
- package/src/state/selectors/containerSelectors.ts +12 -0
- package/src/state/selectors/dataSelectors.ts +90 -0
- package/src/state/selectors/funnelSelectors.ts +83 -0
- package/src/state/selectors/graphicalItemSelectors.ts +23 -0
- package/src/state/selectors/legendSelectors.ts +29 -0
- package/src/state/selectors/lineSelectors.ts +111 -0
- package/src/state/selectors/numberDomainEqualityCheck.ts +8 -0
- package/src/state/selectors/pickAxisId.ts +6 -0
- package/src/state/selectors/pickAxisType.ts +4 -0
- package/src/state/selectors/pieSelectors.ts +103 -0
- package/src/state/selectors/polarAxisSelectors.ts +202 -0
- package/src/state/selectors/polarGridSelectors.ts +24 -0
- package/src/state/selectors/polarScaleSelectors.ts +149 -0
- package/src/state/selectors/polarSelectors.ts +211 -0
- package/src/state/selectors/radarSelectors.ts +152 -0
- package/src/state/selectors/radialBarSelectors.ts +328 -0
- package/src/state/selectors/rootPropsSelectors.ts +36 -0
- package/src/state/selectors/scatterSelectors.ts +77 -0
- package/src/state/selectors/selectAllAxes.ts +10 -0
- package/src/state/selectors/selectChartOffset.ts +15 -0
- package/src/state/selectors/selectChartOffsetInternal.ts +111 -0
- package/src/state/selectors/selectPlotArea.ts +27 -0
- package/src/state/selectors/selectTooltipAxisId.ts +6 -0
- package/src/state/selectors/selectTooltipAxisType.ts +33 -0
- package/src/state/selectors/selectTooltipEventType.ts +45 -0
- package/src/state/selectors/selectTooltipPayloadSearcher.ts +7 -0
- package/src/state/selectors/selectTooltipSettings.ts +6 -0
- package/src/state/selectors/selectTooltipState.ts +5 -0
- package/src/state/selectors/tooltipSelectors.ts +690 -0
- package/src/state/selectors/touchSelectors.ts +29 -0
- package/src/state/store.ts +167 -0
- package/src/state/tooltipSlice.ts +289 -0
- package/src/state/types/AreaSettings.ts +17 -0
- package/src/state/types/BarSettings.ts +16 -0
- package/src/state/types/LineSettings.ts +12 -0
- package/src/state/types/PieSettings.ts +32 -0
- package/src/state/types/RadarSettings.ts +6 -0
- package/src/state/types/RadialBarSettings.ts +10 -0
- package/src/state/types/ScatterSettings.ts +13 -0
- package/src/state/types/StackedGraphicalItem.ts +33 -0
- package/src/state/unregisterOnCleanup.ts +26 -0
- package/src/state/zIndexSlice.ts +128 -0
- package/src/synchronisation/syncRegistry.ts +131 -0
- package/src/synchronisation/syncSelectors.ts +7 -0
- package/src/synchronisation/types.ts +42 -0
- package/src/synchronisation/useChartSynchronisation.tsx +372 -0
- package/src/types.ts +39 -0
- package/src/util/ActiveShapeUtils.tsx +80 -0
- package/src/util/BarUtils.tsx +74 -0
- package/src/util/CartesianUtils.ts +53 -0
- package/src/util/ChartUtils.ts +696 -0
- package/src/util/Constants.ts +42 -0
- package/src/util/CssPrefixUtils.ts +24 -0
- package/src/util/DOMUtils.ts +141 -0
- package/src/util/DataUtils.ts +205 -0
- package/src/util/FunnelUtils.tsx +37 -0
- package/src/util/Global.ts +15 -0
- package/src/util/IfOverflow.ts +17 -0
- package/src/util/LRUCache.ts +46 -0
- package/src/util/LogUtils.ts +26 -0
- package/src/util/PolarUtils.ts +134 -0
- package/src/util/RadialBarUtils.tsx +35 -0
- package/src/util/ReduceCSSCalc.ts +186 -0
- package/src/util/ShallowEqual.ts +43 -0
- package/src/util/TickUtils.ts +61 -0
- package/src/util/YAxisUtils.ts +49 -0
- package/src/util/adaptEventHandlers.ts +69 -0
- package/src/util/axisPropsAreEqual.ts +42 -0
- package/src/util/collectionUtils.ts +83 -0
- package/src/util/createCartesianCharts.tsx +101 -0
- package/src/util/createEventProxy.ts +24 -0
- package/src/util/createPolarCharts.tsx +86 -0
- package/src/util/cursor/getCursorPoints.ts +48 -0
- package/src/util/cursor/getCursorRectangle.ts +31 -0
- package/src/util/cursor/getRadialCursorPoints.ts +34 -0
- package/src/util/excludeEventProps.ts +172 -0
- package/src/util/getActiveCoordinate.ts +205 -0
- package/src/util/getAxisTypeBasedOnLayout.ts +21 -0
- package/src/util/getEveryNth.ts +30 -0
- package/src/util/getRadiusAndStrokeWidthFromDot.ts +35 -0
- package/src/util/getRelativeCoordinate.ts +84 -0
- package/src/util/getSliced.ts +21 -0
- package/src/util/isDomainSpecifiedByUser.ts +217 -0
- package/src/util/isWellBehavedNumber.ts +10 -0
- package/src/util/objectPath.ts +129 -0
- package/src/util/payload/getUniqPayload.ts +31 -0
- package/src/util/propsAreEqual.ts +137 -0
- package/src/util/resolveDefaultProps.tsx +8 -0
- package/src/util/round.ts +35 -0
- package/src/util/scale/CartesianScaleHelper.ts +72 -0
- package/src/util/scale/CustomScaleDefinition.ts +82 -0
- package/src/util/scale/RechartsScale.ts +131 -0
- package/src/util/scale/createCategoricalInverse.ts +83 -0
- package/src/util/scale/getNiceTickValues.ts +334 -0
- package/src/util/scale/index.ts +3 -0
- package/src/util/scale/util/DecimalLite.ts +194 -0
- package/src/util/scale/util/arithmetic.ts +56 -0
- package/src/util/stacks/getStackSeriesIdentifier.ts +20 -0
- package/src/util/stacks/stackTypes.ts +53 -0
- package/src/util/svgPropertiesAndEvents.ts +84 -0
- package/src/util/svgPropertiesNoEvents.ts +520 -0
- package/src/util/tooltip/translate.ts +179 -0
- package/src/util/typedDataKey.ts +8 -0
- package/src/util/types.ts +724 -0
- package/src/util/useAnimationId.tsx +31 -0
- package/src/util/useElementOffset.ts +164 -0
- package/src/util/useId.ts +20 -0
- package/src/util/usePrefersReducedMotion.ts +44 -0
- package/src/util/useUniqueId.ts +34 -0
- package/src/zIndex/DefaultZIndexes.tsx +87 -0
- package/src/zIndex/ZIndexLayer.tsx +126 -0
- package/src/zIndex/ZIndexPortal.tsx +69 -0
- package/src/zIndex/getZIndexFromUnknown.tsx +17 -0
- package/src/zIndex/zIndexSelectors.ts +46 -0
- package/test/_data.ts +408 -0
- package/test/animation/AnimationController.typed.spec.ts +53 -0
- package/test/animation/AnimationControllerImpl.spec.ts +271 -0
- package/test/animation/CSSTransitionAnimate.timing.spec.tsx +473 -0
- package/test/animation/JavascriptAnimate.spec.tsx +62 -0
- package/test/animation/RechartsAnimation.spec.ts +636 -0
- package/test/animation/easing.spec.ts +218 -0
- package/test/animation/legacyAnimationLengthChange.spec.tsx +803 -0
- package/test/animation/matchBy.spec.ts +467 -0
- package/test/animation/mockAnimationController.ts +40 -0
- package/test/animation/mockControllerAnimationManager.ts +143 -0
- package/test/animation/mockTimeoutController.ts +114 -0
- package/test/animation/timeoutController.spec.ts +138 -0
- package/test/animation/useAnimationStartSnapshot.spec.ts +147 -0
- package/test/animation/util.spec.ts +28 -0
- package/test/cartesian/Area.animation.spec.tsx +363 -0
- package/test/cartesian/Area.range.spec.tsx +54 -0
- package/test/cartesian/Area.spec.tsx +1202 -0
- package/test/cartesian/Area.stacked.render.spec.tsx +69 -0
- package/test/cartesian/Area.typed.spec.tsx +209 -0
- package/test/cartesian/Axis.integration.spec.tsx +158 -0
- package/test/cartesian/Bar/Bar.csstransition.spec.tsx +299 -0
- package/test/cartesian/Bar/Bar.spec.tsx +2314 -0
- package/test/cartesian/Bar/Bar.typed.spec.tsx +192 -0
- package/test/cartesian/Bar.animation.spec.tsx +426 -0
- package/test/cartesian/Bar.stackDomain.spec.tsx +66 -0
- package/test/cartesian/Bar.stacked.render.spec.tsx +53 -0
- package/test/cartesian/Bar.truncateByDomain.spec.tsx +237 -0
- package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +336 -0
- package/test/cartesian/BarStack.spec.tsx +91 -0
- package/test/cartesian/Brush.keyboard.spec.tsx +88 -0
- package/test/cartesian/Brush.panorama.spec.tsx +41 -0
- package/test/cartesian/Brush.props.spec.tsx +63 -0
- package/test/cartesian/Brush.render.spec.tsx +117 -0
- package/test/cartesian/Brush.spec.tsx +522 -0
- package/test/cartesian/Brush.stacked.spec.tsx +221 -0
- package/test/cartesian/CartesianAxis.render.spec.tsx +50 -0
- package/test/cartesian/CartesianAxis.spec.tsx +396 -0
- package/test/cartesian/CartesianGrid.render.spec.tsx +39 -0
- package/test/cartesian/CartesianGrid.spec.tsx +2103 -0
- package/test/cartesian/ErrorBar.render.spec.tsx +69 -0
- package/test/cartesian/ErrorBar.spec.tsx +2414 -0
- package/test/cartesian/Funnel.animation.spec.tsx +241 -0
- package/test/cartesian/Funnel.spec.tsx +226 -0
- package/test/cartesian/Funnel.typed.spec.tsx +221 -0
- package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +627 -0
- package/test/cartesian/GraphicalItemClipPath.spec.tsx +427 -0
- package/test/cartesian/Line.animation.spec.tsx +643 -0
- package/test/cartesian/Line.sparseAnimationPath.spec.tsx +98 -0
- package/test/cartesian/Line.spec.tsx +471 -0
- package/test/cartesian/Line.typed.spec.tsx +152 -0
- package/test/cartesian/ReferenceArea.render.spec.tsx +63 -0
- package/test/cartesian/ReferenceArea.spec.tsx +663 -0
- package/test/cartesian/ReferenceArea.typed.spec.tsx +74 -0
- package/test/cartesian/ReferenceDot.render.spec.tsx +55 -0
- package/test/cartesian/ReferenceDot.spec.tsx +462 -0
- package/test/cartesian/ReferenceDot.typed.spec.tsx +76 -0
- package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +184 -0
- package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +744 -0
- package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +74 -0
- package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +399 -0
- package/test/cartesian/ReferenceLine.render.spec.tsx +134 -0
- package/test/cartesian/Scatter.animation.spec.tsx +381 -0
- package/test/cartesian/Scatter.render.spec.tsx +61 -0
- package/test/cartesian/Scatter.spec.tsx +406 -0
- package/test/cartesian/Scatter.typed.spec.tsx +153 -0
- package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +336 -0
- package/test/cartesian/XAxis/XAxis.brush.spec.tsx +266 -0
- package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +872 -0
- package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +86 -0
- package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +127 -0
- package/test/cartesian/XAxis/XAxis.hide.spec.tsx +106 -0
- package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +336 -0
- package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +1466 -0
- package/test/cartesian/XAxis/XAxis.padding.spec.tsx +758 -0
- package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +65 -0
- package/test/cartesian/XAxis/XAxis.state.spec.tsx +355 -0
- package/test/cartesian/XAxis/XAxis.tick.spec.tsx +493 -0
- package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +233 -0
- package/test/cartesian/XAxis/XAxis.type.spec.tsx +107 -0
- package/test/cartesian/XAxis/XAxis.typed.spec.tsx +102 -0
- package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +265 -0
- package/test/cartesian/XAxis.tickFormatter.spec.tsx +54 -0
- package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +230 -0
- package/test/cartesian/YAxis/YAxis.7362.spec.tsx +104 -0
- package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +88 -0
- package/test/cartesian/YAxis/YAxis.label.spec.tsx +219 -0
- package/test/cartesian/YAxis/YAxis.spec.tsx +1595 -0
- package/test/cartesian/YAxis/YAxis.tick.spec.tsx +428 -0
- package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +54 -0
- package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +263 -0
- package/test/cartesian/YAxis/YAxis.type.spec.tsx +107 -0
- package/test/cartesian/YAxis/YAxis.typed.spec.tsx +102 -0
- package/test/cartesian/ZAxis.spec.tsx +300 -0
- package/test/cartesian/ZAxis.typed.spec.tsx +33 -0
- package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +5 -0
- package/test/cartesian/axisLineAndStroke.spec.tsx +72 -0
- package/test/cartesian/getCartesianPosition.spec.ts +907 -0
- package/test/cartesian/getEquidistantTicks.spec.ts +88 -0
- package/test/cartesian/getTicks.spec.ts +378 -0
- package/test/cartesian/miscFeatureGaps.spec.tsx +89 -0
- package/test/cartesian/useAnimatedLineLength.spec.ts +168 -0
- package/test/chart/AccessibilityLayer.spec.tsx +569 -0
- package/test/chart/AccessibilityScans.spec.tsx +286 -0
- package/test/chart/AreaChart.spec.tsx +409 -0
- package/test/chart/AreaChart.stacked.spec.tsx +1407 -0
- package/test/chart/AreaChart.typed.spec.tsx +39 -0
- package/test/chart/BarChart.spec.tsx +3719 -0
- package/test/chart/BarChart.typed.spec.tsx +60 -0
- package/test/chart/CategoricalChart.spec.tsx +255 -0
- package/test/chart/ComposedChart.spec.tsx +199 -0
- package/test/chart/ComposedChart.typed.spec.tsx +39 -0
- package/test/chart/FunnelChart.spec.tsx +215 -0
- package/test/chart/FunnelChart.typed.spec.tsx +39 -0
- package/test/chart/LineChart.multiseries.spec.tsx +50 -0
- package/test/chart/LineChart.smoke.spec.tsx +50 -0
- package/test/chart/LineChart.spec.tsx +930 -0
- package/test/chart/LineChart.typed.spec.tsx +39 -0
- package/test/chart/NicheChartTooltip.spec.tsx +81 -0
- package/test/chart/PieChart.spec.tsx +793 -0
- package/test/chart/PieChart.typed.spec.tsx +39 -0
- package/test/chart/RadarChart.spec.tsx +530 -0
- package/test/chart/RadarChart.typed.spec.tsx +39 -0
- package/test/chart/RadialBarChart.5966.spec.tsx +48 -0
- package/test/chart/RadialBarChart.spec.tsx +679 -0
- package/test/chart/RadialBarChart.typed.spec.tsx +39 -0
- package/test/chart/RechartsWrapper.spec.tsx +83 -0
- package/test/chart/Sankey.content.spec.tsx +46 -0
- package/test/chart/Sankey.spec.tsx +952 -0
- package/test/chart/Sankey.typed.spec.tsx +29 -0
- package/test/chart/ScatterChart.spec.tsx +2613 -0
- package/test/chart/ScatterChart.typed.spec.tsx +39 -0
- package/test/chart/SunburstChart.spec.tsx +146 -0
- package/test/chart/Treemap.animation.spec.tsx +52 -0
- package/test/chart/Treemap.spec.tsx +1003 -0
- package/test/chart/Treemap.typed.spec.tsx +26 -0
- package/test/chart/chartEvents.spec.tsx +127 -0
- package/test/chart/responsive.spec.tsx +620 -0
- package/test/component/Cell.render.spec.tsx +155 -0
- package/test/component/Cell.spec.tsx +12 -0
- package/test/component/Cursor.spec.tsx +186 -0
- package/test/component/DefaultTooltipContent.spec.tsx +102 -0
- package/test/component/Label.render.spec.tsx +63 -0
- package/test/component/Label.spec.tsx +686 -0
- package/test/component/Label.typed.spec.tsx +46 -0
- package/test/component/LabelList.spec.tsx +188 -0
- package/test/component/Legend.itemSorter.spec.tsx +704 -0
- package/test/component/Legend.render.spec.tsx +92 -0
- package/test/component/Legend.spec.tsx +2213 -0
- package/test/component/Legend.typed.spec.tsx +22 -0
- package/test/component/ResponsiveContainer.spec.tsx +523 -0
- package/test/component/ResponsiveContainerDataTest.spec.tsx +51 -0
- package/test/component/Text.spec.tsx +415 -0
- package/test/component/Text.typed.spec.tsx +46 -0
- package/test/component/Tooltip/ActiveDot.spec.tsx +370 -0
- package/test/component/Tooltip/Tooltip.animation.spec.tsx +209 -0
- package/test/component/Tooltip/Tooltip.content.spec.tsx +128 -0
- package/test/component/Tooltip/Tooltip.formatter.spec.tsx +152 -0
- package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +79 -0
- package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +165 -0
- package/test/component/Tooltip/Tooltip.offset.spec.tsx +113 -0
- package/test/component/Tooltip/Tooltip.state.spec.tsx +74 -0
- package/test/component/Tooltip/Tooltip.sync.spec.tsx +639 -0
- package/test/component/Tooltip/defaultIndex.spec.tsx +227 -0
- package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +138 -0
- package/test/component/Tooltip/itemSorter.spec.tsx +2815 -0
- package/test/component/Tooltip/tooltipEventType.spec.tsx +344 -0
- package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +41 -0
- package/test/component/Tooltip/tooltipTestHelpers.tsx +162 -0
- package/test/component/Tooltip.defaultIndex.spec.tsx +48 -0
- package/test/component/Tooltip.hover.spec.tsx +61 -0
- package/test/component/Tooltip.item.spec.tsx +54 -0
- package/test/component/Tooltip.keyboard.spec.tsx +51 -0
- package/test/component/Tooltip.payload.spec.tsx +1716 -0
- package/test/component/Tooltip.touch.spec.tsx +39 -0
- package/test/component/Tooltip.visibility.spec.tsx +1889 -0
- package/test/component/TooltipBoundingBox.spec.tsx +89 -0
- package/test/component/responsiveContainerUtils.spec.ts +205 -0
- package/test/container/ClipPath.spec.tsx +602 -0
- package/test/container/chartDimensions.spec.tsx +368 -0
- package/test/context/chartLayoutContext.spec.tsx +378 -0
- package/test/helper/ExpectAxisDomain.tsx +27 -0
- package/test/helper/assertNotNull.ts +6 -0
- package/test/helper/assertZIndexLayerOrder.ts +19 -0
- package/test/helper/createSelectorTestCase.tsx +176 -0
- package/test/helper/expectAnimatedPieAngles.ts +100 -0
- package/test/helper/expectAnimatedPiePaths.ts +78 -0
- package/test/helper/expectAreaCurve.ts +15 -0
- package/test/helper/expectAxisTicks.ts +48 -0
- package/test/helper/expectBars.ts +54 -0
- package/test/helper/expectFunctionReturning.ts +58 -0
- package/test/helper/expectLabel.ts +32 -0
- package/test/helper/expectLastCalledWith.ts +48 -0
- package/test/helper/expectLine.ts +20 -0
- package/test/helper/expectPieSectors.ts +80 -0
- package/test/helper/expectScale.ts +37 -0
- package/test/helper/expectScatterPoints.ts +52 -0
- package/test/helper/expectStackGroups.ts +144 -0
- package/test/helper/mockAxes.ts +22 -0
- package/test/helper/mockGetBoundingClientRect.ts +66 -0
- package/test/helper/mockHTMLElementProperty.ts +19 -0
- package/test/helper/mockTouchingElement.ts +27 -0
- package/test/helper/offsetHelpers.ts +19 -0
- package/test/helper/parameterizedTestCases.tsx +99 -0
- package/test/helper/produceState.ts +32 -0
- package/test/helper/render.ts +7 -0
- package/test/helper/selectorTestHelpers.tsx +63 -0
- package/test/helper/trim.spec.ts +35 -0
- package/test/helper/trim.ts +11 -0
- package/test/hooks/useActiveTooltipDataPoints.spec.tsx +358 -0
- package/test/hooks/useAxisDomain.spec.tsx +361 -0
- package/test/hooks/useAxisScale.spec.tsx +283 -0
- package/test/hooks/useAxisTicks.spec.tsx +130 -0
- package/test/hooks/useOffset.spec.tsx +248 -0
- package/test/hooks/useTooltipStateHooks.spec.tsx +109 -0
- package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +135 -0
- package/test/polar/Pie/Pie.spec.tsx +784 -0
- package/test/polar/Pie/Pie.typed.spec.tsx +78 -0
- package/test/polar/Pie.animation.spec.tsx +529 -0
- package/test/polar/PieWithLegend.animation.spec.tsx +142 -0
- package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +76 -0
- package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +2079 -0
- package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +102 -0
- package/test/polar/PolarAngleAxis.render.spec.tsx +79 -0
- package/test/polar/PolarGrid.render.spec.tsx +75 -0
- package/test/polar/PolarGrid.spec.tsx +918 -0
- package/test/polar/PolarLegendPerRow.render.spec.tsx +85 -0
- package/test/polar/PolarRadiusAxis.events.spec.tsx +65 -0
- package/test/polar/PolarRadiusAxis.render.spec.tsx +52 -0
- package/test/polar/PolarRadiusAxis.spec.tsx +991 -0
- package/test/polar/PolarRadiusAxis.typed.spec.tsx +84 -0
- package/test/polar/PolarTooltipLegend.render.spec.tsx +80 -0
- package/test/polar/Radar.animation.spec.tsx +570 -0
- package/test/polar/Radar.render.spec.tsx +71 -0
- package/test/polar/Radar.spec.tsx +265 -0
- package/test/polar/Radar.typed.spec.tsx +119 -0
- package/test/polar/RadialBar/RadialBar.spec.tsx +1521 -0
- package/test/polar/RadialBar/RadialBar.typed.spec.tsx +132 -0
- package/test/polar/RadialBar.animation.spec.tsx +375 -0
- package/test/polar/RadialBar.render.spec.tsx +66 -0
- package/test/polar/RadialBar.stacked.spec.tsx +57 -0
- package/test/setup.ts +84 -0
- package/test/shape/ActiveShape.spec.tsx +181 -0
- package/test/shape/Cross.spec.tsx +60 -0
- package/test/shape/Cross.typed.spec.tsx +26 -0
- package/test/shape/Curve.spec.tsx +368 -0
- package/test/shape/Curve.typed.spec.tsx +69 -0
- package/test/shape/Dot.spec.tsx +73 -0
- package/test/shape/Dot.typed.spec.tsx +30 -0
- package/test/shape/Polygon.spec.tsx +357 -0
- package/test/shape/Polygon.typed.spec.tsx +28 -0
- package/test/shape/Rectangle.animation.spec.tsx +451 -0
- package/test/shape/Rectangle.spec.tsx +68 -0
- package/test/shape/Rectangle.typed.spec.tsx +24 -0
- package/test/shape/Sector.spec.tsx +76 -0
- package/test/shape/Sector.typed.spec.tsx +24 -0
- package/test/shape/Symbols.spec.tsx +43 -0
- package/test/shape/Symbols.typed.spec.tsx +24 -0
- package/test/shape/Trapezoid.spec.tsx +50 -0
- package/test/shape/Trapezoid.typed.spec.tsx +24 -0
- package/test/shape/__snapshots__/Cross.spec.tsx.snap +62 -0
- package/test/shape/__snapshots__/Curve.spec.tsx.snap +460 -0
- package/test/shape/__snapshots__/Polygon.spec.tsx.snap +58 -0
- package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +117 -0
- package/test/shape/__snapshots__/Sector.spec.tsx.snap +71 -0
- package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +64 -0
- package/test/state/chartDataSlice.spec.ts +53 -0
- package/test/state/externalEventsMiddleware.spec.ts +178 -0
- package/test/state/graphicalItemsSlice.spec.ts +92 -0
- package/test/state/hooks.spec.tsx +68 -0
- package/test/state/legendSlice.spec.ts +44 -0
- package/test/state/mouseEventsMiddleware.spec.ts +75 -0
- package/test/state/optionsSlice.spec.ts +19 -0
- package/test/state/reduxDevtoolsJsonStringifyReplacer.spec.ts +25 -0
- package/test/state/referenceElementsSlice.spec.ts +84 -0
- package/test/state/selectors/areaSelectors.spec.tsx +77 -0
- package/test/state/selectors/axisSelectors.spec.tsx +1418 -0
- package/test/state/selectors/barStackSelectors.spec.tsx +752 -0
- package/test/state/selectors/brushSelectors.spec.tsx +30 -0
- package/test/state/selectors/cartesianAxisSlice.spec.ts +96 -0
- package/test/state/selectors/combineNiceTicks.spec.ts +207 -0
- package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +61 -0
- package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +39 -0
- package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +56 -0
- package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +123 -0
- package/test/state/selectors/combiners/combineRealScaleType.spec.ts +80 -0
- package/test/state/selectors/containerSelectors.spec.tsx +168 -0
- package/test/state/selectors/dataSelectors.spec.tsx +136 -0
- package/test/state/selectors/legendSelectors.spec.tsx +113 -0
- package/test/state/selectors/lineSelectors.spec.tsx +60 -0
- package/test/state/selectors/pieSelectors.spec.tsx +72 -0
- package/test/state/selectors/radarSelectors.spec.tsx +496 -0
- package/test/state/selectors/rootPropsSelectors.spec.tsx +169 -0
- package/test/state/selectors/scatterSelectors.spec.tsx +47 -0
- package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +234 -0
- package/test/state/selectors/selectAllAxes.spec.tsx +18 -0
- package/test/state/selectors/selectAxisDomain.spec.tsx +21 -0
- package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +19 -0
- package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +22 -0
- package/test/state/selectors/selectAxisScale.spec.tsx +91 -0
- package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +503 -0
- package/test/state/selectors/selectBaseAxis.spec.tsx +56 -0
- package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +57 -0
- package/test/state/selectors/selectChartOffset.spec.tsx +26 -0
- package/test/state/selectors/selectDisplayedData.spec.tsx +282 -0
- package/test/state/selectors/selectIsTooltipActive.spec.tsx +231 -0
- package/test/state/selectors/selectNumericalDomain.spec.tsx +21 -0
- package/test/state/selectors/selectRealScaleType.spec.tsx +19 -0
- package/test/state/selectors/selectStackGroups.spec.tsx +322 -0
- package/test/state/selectors/selectXAxisPosition.spec.tsx +22 -0
- package/test/state/selectors/selectYAxisPosition.spec.tsx +22 -0
- package/test/state/selectors/selectors.spec.tsx +1613 -0
- package/test/state/throttling.spec.ts +200 -0
- package/test/state/zIndexSlice.spec.ts +85 -0
- package/test/synchronisation/useChartSynchronisation.spec.tsx +225 -0
- package/test/util/BarUtils.spec.ts +39 -0
- package/test/util/CartesianUtils/CartesianUtils.spec.ts +261 -0
- package/test/util/CartesianUtils/rectWithPoints.spec.ts +48 -0
- package/test/util/ChartUtils/ChartUtils.spec.ts +491 -0
- package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +136 -0
- package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +133 -0
- package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +83 -0
- package/test/util/ChartUtils/getStackedData.spec.ts +416 -0
- package/test/util/ChartUtils/truncateByDomain.spec.ts +70 -0
- package/test/util/DataUtils.spec.ts +385 -0
- package/test/util/DomUtils.spec.tsx +117 -0
- package/test/util/FunnelUtils.spec.tsx +70 -0
- package/test/util/Global.spec.ts +11 -0
- package/test/util/LRUCache.spec.ts +81 -0
- package/test/util/LogUtils.spec.ts +45 -0
- package/test/util/PolarUtils.spec.ts +66 -0
- package/test/util/ReduceCssCalcPrototype.spec.ts +141 -0
- package/test/util/ShallowEqual.spec.ts +102 -0
- package/test/util/TickUtils.spec.ts +29 -0
- package/test/util/axisPropsAreEqual.spec.ts +93 -0
- package/test/util/createChartHelpers.spec.tsx +210 -0
- package/test/util/cursor/getCursorPoints.spec.ts +136 -0
- package/test/util/cursor/getCursorRectangle.spec.ts +50 -0
- package/test/util/cursor/getRadialCursorPoints.spec.ts +36 -0
- package/test/util/errorValue.spec.ts +69 -0
- package/test/util/getEveryNth.spec.ts +39 -0
- package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +51 -0
- package/test/util/getRelativeCoordinate.spec.ts +250 -0
- package/test/util/getSliced.spec.ts +45 -0
- package/test/util/isDomainSpecifiedByUser.spec.ts +207 -0
- package/test/util/isWellBehavedNumber.spec.ts +54 -0
- package/test/util/payload/getUniqPayload.spec.ts +56 -0
- package/test/util/propsAreEqual.spec.ts +75 -0
- package/test/util/round.spec.ts +112 -0
- package/test/util/scale/arithmetic.spec.ts +61 -0
- package/test/util/scale/createCategoricalInverse.spec.ts +84 -0
- package/test/util/scale/getNiceTickValues.spec.ts +421 -0
- package/test/util/scale/getTickValuesFixedDomain.spec.ts +155 -0
- package/test/util/svgPropertiesAndEvents.spec.tsx +206 -0
- package/test/util/svgPropertiesNoEvents.spec.tsx +228 -0
- package/test/util/tooltip/translate.spec.ts +396 -0
- package/test/util/useAnimationId.spec.tsx +59 -0
- package/test/util/useElementOffset.spec.tsx +173 -0
- package/test/util/usePrefersReducedMotion.spec.ts +54 -0
- package/test/util/useUniqueId.spec.ts +99 -0
- package/test/utils/diagnostics-allowlist.ts +18 -0
- package/test/utils/diagnostics.ts +58 -0
- package/test/zIndex/AllZIndexPortals.spec.tsx +83 -0
- package/test/zIndex/DefaultZIndexes.spec.ts +80 -0
- package/test/zIndex/DynamicZIndex.spec.tsx +102 -0
- package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +125 -0
- package/test/zIndex/componentZIndex.spec.tsx +255 -0
- package/test/zIndex/getZIndexFromUnknown.spec.ts +51 -0
- package/test/zIndex/multiChartZIndexIsolation.spec.tsx +90 -0
- package/test/zIndex/zIndexSelectors.spec.ts +172 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/cartesian/ReferenceDot.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Draws a circle at a DATA coordinate (x, y), mapped to pixels through the
|
|
4
|
+
// cartesian scale spine (CartesianScaleHelperImpl over the x/y RechartsScales).
|
|
5
|
+
//
|
|
6
|
+
// Solid deviations (documented):
|
|
7
|
+
// - resolveDefaultProps → `merge`; useEffect add/remove → createEffect + onCleanup.
|
|
8
|
+
// - The registered settings carry a generated `id` (proxy-safe removal).
|
|
9
|
+
// - Mouse handlers are wrapped props-first (`(dotProps, e)`) on the default dot
|
|
10
|
+
// via adaptEventHandlers (recharts does this inside Dot; the port's Dot
|
|
11
|
+
// forwards raw delegated handlers).
|
|
12
|
+
// - PERMANENT-N/A (by design, NOT deferred): the custom-element `shape` branch
|
|
13
|
+
// (React.cloneElement — use the render-function form);
|
|
14
|
+
// `children` is not rendered (CartesianLabelContext).
|
|
15
|
+
import { createEffect, createMemo, merge, Show } from "solid-js";
|
|
16
|
+
import type { JSX } from "@solidjs/web";
|
|
17
|
+
import { Layer } from "../container/Layer";
|
|
18
|
+
import { Dot, type DotProps } from "../shape/Dot";
|
|
19
|
+
import {
|
|
20
|
+
CartesianLabelContextProvider,
|
|
21
|
+
CartesianLabelFromLabelProp,
|
|
22
|
+
type ImplicitLabelType,
|
|
23
|
+
} from "../component/Label";
|
|
24
|
+
import { isNumOrStr } from "../util/DataUtils";
|
|
25
|
+
import { IfOverflow } from "../util/IfOverflow";
|
|
26
|
+
import type { ReferenceDotSettings } from "../state/referenceElementsSlice";
|
|
27
|
+
import { useAppSelector, useAppStore } from "../state/hooks";
|
|
28
|
+
import { selectAxisScale } from "../state/selectors/axisSelectors";
|
|
29
|
+
import { useIsPanorama } from "../context/PanoramaContext";
|
|
30
|
+
import { useClipPathId } from "../container/ClipPathProvider";
|
|
31
|
+
import { svgPropertiesAndEventsKeepCase } from "../util/svgPropertiesAndEvents";
|
|
32
|
+
import { adaptEventHandlers } from "../util/adaptEventHandlers";
|
|
33
|
+
import { useUniqueId } from "../util/useUniqueId";
|
|
34
|
+
import type { AxisId } from "../state/cartesianAxisSlice";
|
|
35
|
+
import { DefaultZIndexes } from "../zIndex/DefaultZIndexes";
|
|
36
|
+
import { ZIndexLayer } from "../zIndex/ZIndexLayer";
|
|
37
|
+
import { Coordinate } from "../util/types";
|
|
38
|
+
import { CartesianScaleHelperImpl } from "../util/scale/CartesianScaleHelper";
|
|
39
|
+
import { unregisterOnCleanup } from "../state/unregisterOnCleanup";
|
|
40
|
+
|
|
41
|
+
type ReferenceCoordinateValue = number | string;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* ReferenceDot mouse handlers are called props-first: `(dotProps, event)` (recharts parity).
|
|
45
|
+
* The event's `currentTarget` is the rendered `<circle>`, so the event satisfies
|
|
46
|
+
* `SVGMousePointer` and can be passed to {@link getRelativeCoordinate} directly.
|
|
47
|
+
*/
|
|
48
|
+
export type ReferenceDotEventHandler = (
|
|
49
|
+
dotProps: DotProps,
|
|
50
|
+
event: MouseEvent & { currentTarget: SVGCircleElement },
|
|
51
|
+
) => void;
|
|
52
|
+
|
|
53
|
+
/** Touch variant of {@link ReferenceDotEventHandler} — also called props-first. */
|
|
54
|
+
export type ReferenceDotTouchEventHandler = (
|
|
55
|
+
dotProps: DotProps,
|
|
56
|
+
event: TouchEvent & { currentTarget: SVGCircleElement },
|
|
57
|
+
) => void;
|
|
58
|
+
|
|
59
|
+
export interface ReferenceDotProps<
|
|
60
|
+
XValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
61
|
+
YValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
62
|
+
> {
|
|
63
|
+
/** The radius of the dot in pixels. @defaultValue 10 */
|
|
64
|
+
r?: number;
|
|
65
|
+
/** The x-coordinate (data space) of the center of the dot. */
|
|
66
|
+
x?: XValueType;
|
|
67
|
+
/** The y-coordinate (data space) of the center of the dot. */
|
|
68
|
+
y?: YValueType;
|
|
69
|
+
/** The id of the corresponding y-axis. @defaultValue 0 */
|
|
70
|
+
yAxisId?: AxisId;
|
|
71
|
+
/** The id of the corresponding x-axis. @defaultValue 0 */
|
|
72
|
+
xAxisId?: AxisId;
|
|
73
|
+
/** Defines how to draw the dot when it overflows the plot area. @defaultValue 'discard' */
|
|
74
|
+
ifOverflow?: IfOverflow;
|
|
75
|
+
/** Custom render function for the dot shape. */
|
|
76
|
+
shape?: (props: DotProps) => JSX.Element;
|
|
77
|
+
/** A single label rendered around the dot. @defaultValue false */
|
|
78
|
+
label?: ImplicitLabelType;
|
|
79
|
+
/** Stacking order within the chart's z-index system. @defaultValue DefaultZIndexes.scatter */
|
|
80
|
+
zIndex?: number;
|
|
81
|
+
class?: string;
|
|
82
|
+
children?: JSX.Element;
|
|
83
|
+
/** The customized event handler of click on the dot. */
|
|
84
|
+
onClick?: ReferenceDotEventHandler;
|
|
85
|
+
/** The customized event handler of mousedown on the dot. */
|
|
86
|
+
onMouseDown?: ReferenceDotEventHandler;
|
|
87
|
+
/** The customized event handler of mouseup on the dot. */
|
|
88
|
+
onMouseUp?: ReferenceDotEventHandler;
|
|
89
|
+
/** The customized event handler of mouseover on the dot. */
|
|
90
|
+
onMouseOver?: ReferenceDotEventHandler;
|
|
91
|
+
/** The customized event handler of mouseout on the dot. */
|
|
92
|
+
onMouseOut?: ReferenceDotEventHandler;
|
|
93
|
+
/** The customized event handler of mouseenter on the dot. */
|
|
94
|
+
onMouseEnter?: ReferenceDotEventHandler;
|
|
95
|
+
/** The customized event handler of mousemove on the dot. */
|
|
96
|
+
onMouseMove?: ReferenceDotEventHandler;
|
|
97
|
+
/** The customized event handler of mouseleave on the dot. */
|
|
98
|
+
onMouseLeave?: ReferenceDotEventHandler;
|
|
99
|
+
/** The customized event handler of touchstart on the dot. */
|
|
100
|
+
onTouchStart?: ReferenceDotTouchEventHandler;
|
|
101
|
+
/** The customized event handler of touchmove on the dot. */
|
|
102
|
+
onTouchMove?: ReferenceDotTouchEventHandler;
|
|
103
|
+
/** The customized event handler of touchend on the dot. */
|
|
104
|
+
onTouchEnd?: ReferenceDotTouchEventHandler;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export type Props<
|
|
108
|
+
XValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
109
|
+
YValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
110
|
+
> = Omit<
|
|
111
|
+
DotProps,
|
|
112
|
+
| "cx"
|
|
113
|
+
| "cy"
|
|
114
|
+
| "clipDot"
|
|
115
|
+
| "class"
|
|
116
|
+
// Redeclared above with the recharts props-first `(dotProps, event)` signature.
|
|
117
|
+
| "onClick"
|
|
118
|
+
| "onMouseDown"
|
|
119
|
+
| "onMouseUp"
|
|
120
|
+
| "onMouseOver"
|
|
121
|
+
| "onMouseOut"
|
|
122
|
+
| "onMouseEnter"
|
|
123
|
+
| "onMouseMove"
|
|
124
|
+
| "onMouseLeave"
|
|
125
|
+
| "onTouchStart"
|
|
126
|
+
| "onTouchMove"
|
|
127
|
+
| "onTouchEnd"
|
|
128
|
+
> &
|
|
129
|
+
ReferenceDotProps<XValueType, YValueType>;
|
|
130
|
+
|
|
131
|
+
function ReportReferenceDot(props: ReferenceDotSettings): JSX.Element {
|
|
132
|
+
const store = useAppStore();
|
|
133
|
+
let prev: ReferenceDotSettings | null = null;
|
|
134
|
+
|
|
135
|
+
createEffect(
|
|
136
|
+
(): ReferenceDotSettings => ({
|
|
137
|
+
id: props.id,
|
|
138
|
+
xAxisId: props.xAxisId,
|
|
139
|
+
yAxisId: props.yAxisId,
|
|
140
|
+
ifOverflow: props.ifOverflow,
|
|
141
|
+
x: props.x,
|
|
142
|
+
y: props.y,
|
|
143
|
+
r: props.r,
|
|
144
|
+
}),
|
|
145
|
+
(settings) => {
|
|
146
|
+
if (store == null) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (prev === null) {
|
|
150
|
+
store.actions.referenceElements.addDot(settings);
|
|
151
|
+
} else if (prev !== settings) {
|
|
152
|
+
store.actions.referenceElements.removeDot(prev);
|
|
153
|
+
store.actions.referenceElements.addDot(settings);
|
|
154
|
+
}
|
|
155
|
+
prev = settings;
|
|
156
|
+
},
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
unregisterOnCleanup(() => {
|
|
160
|
+
if (prev && store != null) {
|
|
161
|
+
store.actions.referenceElements.removeDot(prev);
|
|
162
|
+
prev = null;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const renderDot = (option: Props["shape"], props: DotProps): JSX.Element => {
|
|
170
|
+
if (typeof option === "function") {
|
|
171
|
+
return option(props);
|
|
172
|
+
}
|
|
173
|
+
// recharts' Dot rewraps its event handlers props-first via adaptEventHandlers
|
|
174
|
+
// (a user's onClick is called `(dotProps, event)`); the port's Dot forwards raw
|
|
175
|
+
// delegated handlers, so the wrapping happens here on the default-dot branch
|
|
176
|
+
// (a custom `shape` receives the raw props, as in recharts).
|
|
177
|
+
const dotProps: DotProps = { ...props, class: "recharts-reference-dot-dot" };
|
|
178
|
+
return (
|
|
179
|
+
<Dot {...dotProps} {...(adaptEventHandlers(dotProps) ?? {})} cx={props.cx} cy={props.cy} />
|
|
180
|
+
);
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
const referenceDotDefaultProps = {
|
|
184
|
+
ifOverflow: "discard",
|
|
185
|
+
xAxisId: 0,
|
|
186
|
+
yAxisId: 0,
|
|
187
|
+
r: 10,
|
|
188
|
+
fill: "#fff",
|
|
189
|
+
stroke: "#ccc",
|
|
190
|
+
fillOpacity: 1,
|
|
191
|
+
strokeWidth: 1,
|
|
192
|
+
label: false,
|
|
193
|
+
} as const satisfies Partial<Props>;
|
|
194
|
+
|
|
195
|
+
function ReferenceDotImpl(props: Props): JSX.Element {
|
|
196
|
+
const merged = merge(referenceDotDefaultProps, props);
|
|
197
|
+
const clipPathId = useClipPathId();
|
|
198
|
+
const isPanorama = useIsPanorama();
|
|
199
|
+
const xAxisScale = useAppSelector((s) => selectAxisScale(s, "xAxis", merged.xAxisId, isPanorama));
|
|
200
|
+
const yAxisScale = useAppSelector((s) => selectAxisScale(s, "yAxis", merged.yAxisId, isPanorama));
|
|
201
|
+
|
|
202
|
+
const coordinate = createMemo<Coordinate | null>(() => {
|
|
203
|
+
const xv = merged.x;
|
|
204
|
+
const yv = merged.y;
|
|
205
|
+
const xs = xAxisScale();
|
|
206
|
+
const ys = yAxisScale();
|
|
207
|
+
if (!isNumOrStr(xv) || !isNumOrStr(yv) || xs == null || ys == null) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
const scales = new CartesianScaleHelperImpl({ x: xs, y: ys });
|
|
211
|
+
const result = scales.map({ x: xv, y: yv }, { position: "middle" });
|
|
212
|
+
if (merged.ifOverflow === "discard" && !scales.isInRange(result)) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// The memo returns the dot PROPS (or null) — all reactive prop reads (the svg
|
|
219
|
+
// spread) happen in this tracking scope, so the Show callback has no untracked
|
|
220
|
+
// reads beyond the (static) shape.
|
|
221
|
+
const dotProps = createMemo<DotProps | null>(() => {
|
|
222
|
+
const c = coordinate();
|
|
223
|
+
if (!c) {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
const clipPath = merged.ifOverflow === "hidden" ? `url(#${clipPathId})` : undefined;
|
|
227
|
+
return {
|
|
228
|
+
clipPath,
|
|
229
|
+
...svgPropertiesAndEventsKeepCase({ ...merged }),
|
|
230
|
+
cx: c.x,
|
|
231
|
+
cy: c.y,
|
|
232
|
+
r: merged.r,
|
|
233
|
+
};
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
return (
|
|
237
|
+
<Show when={dotProps()}>
|
|
238
|
+
{(p) => (
|
|
239
|
+
<ZIndexLayer zIndex={merged.zIndex ?? DefaultZIndexes.scatter}>
|
|
240
|
+
<Layer class="recharts-reference-dot">
|
|
241
|
+
{renderDot(merged.shape, p())}
|
|
242
|
+
<CartesianLabelContextProvider
|
|
243
|
+
x={(p().cx ?? 0) - merged.r}
|
|
244
|
+
y={(p().cy ?? 0) - merged.r}
|
|
245
|
+
width={2 * merged.r}
|
|
246
|
+
height={2 * merged.r}
|
|
247
|
+
upperWidth={2 * merged.r}
|
|
248
|
+
lowerWidth={2 * merged.r}
|
|
249
|
+
>
|
|
250
|
+
<CartesianLabelFromLabelProp label={merged.label} />
|
|
251
|
+
</CartesianLabelContextProvider>
|
|
252
|
+
</Layer>
|
|
253
|
+
</ZIndexLayer>
|
|
254
|
+
)}
|
|
255
|
+
</Show>
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Draws a circle on the chart at a data coordinate (the cartesian-aware version
|
|
261
|
+
* of {@link Dot}). ReferenceDot maps the provided data coordinates to pixels
|
|
262
|
+
* through the chart's scales.
|
|
263
|
+
*/
|
|
264
|
+
export function ReferenceDot<
|
|
265
|
+
XValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
266
|
+
YValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
267
|
+
>(props: Props<XValueType, YValueType>): JSX.Element {
|
|
268
|
+
const merged = merge(referenceDotDefaultProps, props);
|
|
269
|
+
const id = useUniqueId("recharts-reference-dot");
|
|
270
|
+
return (
|
|
271
|
+
<>
|
|
272
|
+
<ReportReferenceDot
|
|
273
|
+
id={id}
|
|
274
|
+
y={merged.y}
|
|
275
|
+
x={merged.x}
|
|
276
|
+
r={merged.r}
|
|
277
|
+
yAxisId={merged.yAxisId}
|
|
278
|
+
xAxisId={merged.xAxisId}
|
|
279
|
+
ifOverflow={merged.ifOverflow}
|
|
280
|
+
/>
|
|
281
|
+
<ReferenceDotImpl {...props} />
|
|
282
|
+
</>
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
ReferenceDot.displayName = "ReferenceDot";
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/cartesian/ReferenceLine.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Draws a horizontal/vertical/diagonal line at a DATA coordinate, mapped to
|
|
4
|
+
// pixels through the cartesian scale spine (selectAxisScale → RechartsScale).
|
|
5
|
+
//
|
|
6
|
+
// Solid deviations (documented):
|
|
7
|
+
// - resolveDefaultProps → `merge`; useEffect add/remove → createEffect + onCleanup
|
|
8
|
+
// (the same effect-dispatch registration idiom Line/Bar/Area/SetTooltipEntrySettings use).
|
|
9
|
+
// - The registered settings carry a generated `id` (proxy-safe removal — see
|
|
10
|
+
// referenceElementsSlice); recharts matches by object reference.
|
|
11
|
+
// - `clsx` → single `class` string (Layer takes one string).
|
|
12
|
+
// - The `label` prop IS wired (CartesianLabelFromLabelProp), and the line renders
|
|
13
|
+
// inside <ZIndexLayer zIndex={merged.zIndex ?? DefaultZIndexes.line}>.
|
|
14
|
+
// - PERMANENT-N/A (by design, NOT deferred): the custom-element `shape` branch
|
|
15
|
+
// (React.cloneElement — Solid has no element-props introspection; use the
|
|
16
|
+
// render-function form; the default-`<line>` branch is kept). <Label> CHILDREN
|
|
17
|
+
// are not rendered (the `label` prop is).
|
|
18
|
+
import { type CamelSvgProps } from "../util/svgPropertiesNoEvents";
|
|
19
|
+
import { createEffect, createMemo, merge, Show } from "solid-js";
|
|
20
|
+
import type { JSX } from "@solidjs/web";
|
|
21
|
+
import { Layer } from "../container/Layer";
|
|
22
|
+
import {
|
|
23
|
+
CartesianLabelContextProvider,
|
|
24
|
+
CartesianLabelFromLabelProp,
|
|
25
|
+
type ImplicitLabelType,
|
|
26
|
+
} from "../component/Label";
|
|
27
|
+
import { rectWithCoords } from "../util/CartesianUtils";
|
|
28
|
+
import { IfOverflow } from "../util/IfOverflow";
|
|
29
|
+
import { isNumOrStr } from "../util/DataUtils";
|
|
30
|
+
import { CartesianViewBoxRequired, Coordinate, RectanglePosition } from "../util/types";
|
|
31
|
+
import { useViewBox } from "../context/chartLayoutContext";
|
|
32
|
+
import type { ReferenceLineSettings } from "../state/referenceElementsSlice";
|
|
33
|
+
import { useAppSelector, useAppStore } from "../state/hooks";
|
|
34
|
+
import {
|
|
35
|
+
selectAxisScale,
|
|
36
|
+
selectXAxisSettings,
|
|
37
|
+
selectYAxisSettings,
|
|
38
|
+
} from "../state/selectors/axisSelectors";
|
|
39
|
+
import { useIsPanorama } from "../context/PanoramaContext";
|
|
40
|
+
import { useClipPathId } from "../container/ClipPathProvider";
|
|
41
|
+
import { svgPropertiesAndEvents } from "../util/svgPropertiesAndEvents";
|
|
42
|
+
import { useUniqueId } from "../util/useUniqueId";
|
|
43
|
+
import { isWellBehavedNumber } from "../util/isWellBehavedNumber";
|
|
44
|
+
import { BandPosition, RechartsScale } from "../util/scale/RechartsScale";
|
|
45
|
+
import { CartesianScaleHelper, CartesianScaleHelperImpl } from "../util/scale/CartesianScaleHelper";
|
|
46
|
+
import type { AxisId } from "../state/cartesianAxisSlice";
|
|
47
|
+
import { DefaultZIndexes } from "../zIndex/DefaultZIndexes";
|
|
48
|
+
import { ZIndexLayer } from "../zIndex/ZIndexLayer";
|
|
49
|
+
import { unregisterOnCleanup } from "../state/unregisterOnCleanup";
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Single point that defines one end of a segment, in data space.
|
|
53
|
+
* @inline
|
|
54
|
+
*/
|
|
55
|
+
export type ReferenceLineSegment = readonly [
|
|
56
|
+
{ x?: number | string; y?: number | string },
|
|
57
|
+
{ x?: number | string; y?: number | string },
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
type ReferenceCoordinateValue = number | string;
|
|
61
|
+
|
|
62
|
+
/** Orientation of the two cartesian axes (xAxis is top/bottom, yAxis is left/right). */
|
|
63
|
+
type AxisOrientation = "top" | "bottom" | "left" | "right";
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Props of the inner `<line>` shape (after svg filtering + endpoint geometry).
|
|
67
|
+
* NOT wrapped in CamelSvgProps: this is a DOM-READY OUTPUT payload (built from
|
|
68
|
+
* svgPropertiesAndEvents, spread verbatim onto <line> / handed to `shape`
|
|
69
|
+
* functions), so its keys are the real kebab attribute names by design.
|
|
70
|
+
*/
|
|
71
|
+
export type LineShapeProps = Partial<JSX.LineSVGAttributes<SVGLineElement>> & {
|
|
72
|
+
x1?: number;
|
|
73
|
+
y1?: number;
|
|
74
|
+
x2?: number;
|
|
75
|
+
y2?: number;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export interface ReferenceLineProps<
|
|
79
|
+
XValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
80
|
+
YValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
81
|
+
> {
|
|
82
|
+
/** If defined, renders a horizontal line at this (data-space) y position. */
|
|
83
|
+
y?: YValueType;
|
|
84
|
+
/** If defined, renders a vertical line at this (data-space) x position. */
|
|
85
|
+
x?: XValueType;
|
|
86
|
+
/** Tuple of coordinates. If defined, renders a diagonal line segment. */
|
|
87
|
+
segment?: readonly [{ x?: XValueType; y?: YValueType }, { x?: XValueType; y?: YValueType }];
|
|
88
|
+
/** Where within a band the line is drawn (band scales only). @defaultValue 'middle' */
|
|
89
|
+
position?: BandPosition;
|
|
90
|
+
/** The id of the corresponding y-axis. @defaultValue 0 */
|
|
91
|
+
yAxisId?: AxisId;
|
|
92
|
+
/** The id of the corresponding x-axis. @defaultValue 0 */
|
|
93
|
+
xAxisId?: AxisId;
|
|
94
|
+
/** Defines how to draw the line when it overflows the plot area. @defaultValue 'discard' */
|
|
95
|
+
ifOverflow?: IfOverflow;
|
|
96
|
+
/** Custom render function for the line shape. */
|
|
97
|
+
shape?: (props: LineShapeProps) => JSX.Element;
|
|
98
|
+
/** A single label rendered along the line. @defaultValue false */
|
|
99
|
+
label?: ImplicitLabelType;
|
|
100
|
+
/** Stacking order within the chart's z-index system. @defaultValue DefaultZIndexes.line */
|
|
101
|
+
zIndex?: number;
|
|
102
|
+
class?: string;
|
|
103
|
+
children?: JSX.Element;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export type Props<
|
|
107
|
+
XValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
108
|
+
YValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
109
|
+
> = Omit<CamelSvgProps<JSX.LineSVGAttributes<SVGLineElement>>, "x" | "y" | "class" | "children"> &
|
|
110
|
+
ReferenceLineProps<XValueType, YValueType>;
|
|
111
|
+
|
|
112
|
+
const getHorizontalLineEndPoints = (
|
|
113
|
+
yCoord: number | string,
|
|
114
|
+
ifOverflow: IfOverflow,
|
|
115
|
+
position: BandPosition | undefined,
|
|
116
|
+
yAxisOrientation: AxisOrientation | undefined,
|
|
117
|
+
yAxisScale: RechartsScale,
|
|
118
|
+
viewBox: CartesianViewBoxRequired,
|
|
119
|
+
): ReadonlyArray<Coordinate> | null => {
|
|
120
|
+
const { x, width } = viewBox;
|
|
121
|
+
const coord = yAxisScale.map(yCoord, { position });
|
|
122
|
+
if (!isWellBehavedNumber(coord)) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
if (ifOverflow === "discard" && !yAxisScale.isInRange(coord)) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
const points = [
|
|
129
|
+
{ x: x + width, y: coord },
|
|
130
|
+
{ x, y: coord },
|
|
131
|
+
];
|
|
132
|
+
return yAxisOrientation === "left" ? points.reverse() : points;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const getVerticalLineEndPoints = (
|
|
136
|
+
xCoord: number | string,
|
|
137
|
+
ifOverflow: IfOverflow,
|
|
138
|
+
position: BandPosition | undefined,
|
|
139
|
+
xAxisOrientation: AxisOrientation | undefined,
|
|
140
|
+
xAxisScale: RechartsScale,
|
|
141
|
+
viewBox: CartesianViewBoxRequired,
|
|
142
|
+
): ReadonlyArray<Coordinate> | null => {
|
|
143
|
+
const { y, height } = viewBox;
|
|
144
|
+
const coord = xAxisScale.map(xCoord, { position });
|
|
145
|
+
if (!isWellBehavedNumber(coord)) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
if (ifOverflow === "discard" && !xAxisScale.isInRange(coord)) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
const points = [
|
|
152
|
+
{ x: coord, y: y + height },
|
|
153
|
+
{ x: coord, y },
|
|
154
|
+
];
|
|
155
|
+
return xAxisOrientation === "top" ? points.reverse() : points;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
const getSegmentLineEndPoints = (
|
|
159
|
+
segment: ReferenceLineSegment,
|
|
160
|
+
ifOverflow: IfOverflow,
|
|
161
|
+
position: BandPosition | undefined,
|
|
162
|
+
scales: CartesianScaleHelper,
|
|
163
|
+
): ReadonlyArray<Coordinate> | null => {
|
|
164
|
+
const points: [Coordinate, Coordinate] = [
|
|
165
|
+
scales.mapWithFallback(segment[0], { position, fallback: "rangeMin" }),
|
|
166
|
+
scales.mapWithFallback(segment[1], { position, fallback: "rangeMax" }),
|
|
167
|
+
];
|
|
168
|
+
if (ifOverflow === "discard" && points.some((p) => !scales.isInRange(p))) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
return points;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
type EndPointsPropsSubset = {
|
|
175
|
+
x?: number | string;
|
|
176
|
+
y?: number | string;
|
|
177
|
+
segment?: ReferenceLineSegment;
|
|
178
|
+
ifOverflow: IfOverflow;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export const getEndPoints = (
|
|
182
|
+
xAxisScale: RechartsScale,
|
|
183
|
+
yAxisScale: RechartsScale,
|
|
184
|
+
viewBox: CartesianViewBoxRequired,
|
|
185
|
+
position: BandPosition | undefined,
|
|
186
|
+
xAxisOrientation: AxisOrientation | undefined,
|
|
187
|
+
yAxisOrientation: AxisOrientation | undefined,
|
|
188
|
+
props: EndPointsPropsSubset,
|
|
189
|
+
): ReadonlyArray<Coordinate> | null => {
|
|
190
|
+
const { x: xCoord, y: yCoord, segment, ifOverflow } = props;
|
|
191
|
+
const isFixedX = isNumOrStr(xCoord);
|
|
192
|
+
const isFixedY = isNumOrStr(yCoord);
|
|
193
|
+
|
|
194
|
+
if (isFixedY) {
|
|
195
|
+
return getHorizontalLineEndPoints(
|
|
196
|
+
yCoord,
|
|
197
|
+
ifOverflow,
|
|
198
|
+
position,
|
|
199
|
+
yAxisOrientation,
|
|
200
|
+
yAxisScale,
|
|
201
|
+
viewBox,
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
if (isFixedX) {
|
|
205
|
+
return getVerticalLineEndPoints(
|
|
206
|
+
xCoord,
|
|
207
|
+
ifOverflow,
|
|
208
|
+
position,
|
|
209
|
+
xAxisOrientation,
|
|
210
|
+
xAxisScale,
|
|
211
|
+
viewBox,
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
if (segment != null && segment.length === 2) {
|
|
215
|
+
return getSegmentLineEndPoints(
|
|
216
|
+
segment,
|
|
217
|
+
ifOverflow,
|
|
218
|
+
position,
|
|
219
|
+
new CartesianScaleHelperImpl({ x: xAxisScale, y: yAxisScale }),
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
const renderLine = (
|
|
226
|
+
option: ReferenceLineProps["shape"],
|
|
227
|
+
lineProps: LineShapeProps,
|
|
228
|
+
): JSX.Element => {
|
|
229
|
+
if (typeof option === "function") {
|
|
230
|
+
return option(lineProps);
|
|
231
|
+
}
|
|
232
|
+
if (
|
|
233
|
+
!isWellBehavedNumber(lineProps.x1) ||
|
|
234
|
+
!isWellBehavedNumber(lineProps.y1) ||
|
|
235
|
+
!isWellBehavedNumber(lineProps.x2) ||
|
|
236
|
+
!isWellBehavedNumber(lineProps.y2)
|
|
237
|
+
) {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
return <line {...lineProps} class="recharts-reference-line-line" />;
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
function ReportReferenceLine(props: ReferenceLineSettings): JSX.Element {
|
|
244
|
+
const store = useAppStore();
|
|
245
|
+
let prev: ReferenceLineSettings | null = null;
|
|
246
|
+
|
|
247
|
+
createEffect(
|
|
248
|
+
(): ReferenceLineSettings => ({
|
|
249
|
+
id: props.id,
|
|
250
|
+
xAxisId: props.xAxisId,
|
|
251
|
+
yAxisId: props.yAxisId,
|
|
252
|
+
ifOverflow: props.ifOverflow,
|
|
253
|
+
x: props.x,
|
|
254
|
+
y: props.y,
|
|
255
|
+
segment: props.segment,
|
|
256
|
+
}),
|
|
257
|
+
(settings) => {
|
|
258
|
+
if (store == null) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (prev === null) {
|
|
262
|
+
store.actions.referenceElements.addLine(settings);
|
|
263
|
+
} else if (prev !== settings) {
|
|
264
|
+
store.actions.referenceElements.removeLine(prev);
|
|
265
|
+
store.actions.referenceElements.addLine(settings);
|
|
266
|
+
}
|
|
267
|
+
prev = settings;
|
|
268
|
+
},
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
unregisterOnCleanup(() => {
|
|
272
|
+
if (prev && store != null) {
|
|
273
|
+
store.actions.referenceElements.removeLine(prev);
|
|
274
|
+
prev = null;
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const referenceLineDefaultProps = {
|
|
282
|
+
ifOverflow: "discard",
|
|
283
|
+
xAxisId: 0,
|
|
284
|
+
yAxisId: 0,
|
|
285
|
+
fill: "none",
|
|
286
|
+
stroke: "#ccc",
|
|
287
|
+
fillOpacity: 1,
|
|
288
|
+
strokeWidth: 1,
|
|
289
|
+
position: "middle",
|
|
290
|
+
label: false,
|
|
291
|
+
} as const satisfies Partial<Props>;
|
|
292
|
+
|
|
293
|
+
function ReferenceLineImpl(props: Props): JSX.Element {
|
|
294
|
+
const merged = merge(referenceLineDefaultProps, props);
|
|
295
|
+
const isPanorama = useIsPanorama();
|
|
296
|
+
const clipPathId = useClipPathId();
|
|
297
|
+
const viewBox = useViewBox();
|
|
298
|
+
const xAxis = useAppSelector((s) => selectXAxisSettings(s, merged.xAxisId));
|
|
299
|
+
const yAxis = useAppSelector((s) => selectYAxisSettings(s, merged.yAxisId));
|
|
300
|
+
const xAxisScale = useAppSelector((s) => selectAxisScale(s, "xAxis", merged.xAxisId, isPanorama));
|
|
301
|
+
const yAxisScale = useAppSelector((s) => selectAxisScale(s, "yAxis", merged.yAxisId, isPanorama));
|
|
302
|
+
|
|
303
|
+
const coords = createMemo<{ x1: number; y1: number; x2: number; y2: number } | null>(() => {
|
|
304
|
+
const vb = viewBox();
|
|
305
|
+
const xs = xAxisScale();
|
|
306
|
+
const ys = yAxisScale();
|
|
307
|
+
const xAxisSettings = xAxis();
|
|
308
|
+
const yAxisSettings = yAxis();
|
|
309
|
+
if (
|
|
310
|
+
clipPathId == null ||
|
|
311
|
+
vb == null ||
|
|
312
|
+
xs == null ||
|
|
313
|
+
ys == null ||
|
|
314
|
+
xAxisSettings == null ||
|
|
315
|
+
yAxisSettings == null
|
|
316
|
+
) {
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
const endPoints = getEndPoints(
|
|
320
|
+
xs,
|
|
321
|
+
ys,
|
|
322
|
+
vb,
|
|
323
|
+
merged.position,
|
|
324
|
+
xAxisSettings.orientation,
|
|
325
|
+
yAxisSettings.orientation,
|
|
326
|
+
{
|
|
327
|
+
x: merged.x,
|
|
328
|
+
y: merged.y,
|
|
329
|
+
segment: merged.segment,
|
|
330
|
+
ifOverflow: merged.ifOverflow,
|
|
331
|
+
},
|
|
332
|
+
);
|
|
333
|
+
if (!endPoints) {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
const point1 = endPoints[0];
|
|
337
|
+
const point2 = endPoints[1];
|
|
338
|
+
if (point1 == null || point2 == null) {
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
return { x1: point1.x, y1: point1.y, x2: point2.x, y2: point2.y };
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
// The memo returns the line PROPS (or null) — all reactive prop reads (the svg
|
|
345
|
+
// spread) happen in this tracking scope, so the Show callback has no untracked
|
|
346
|
+
// reads beyond the (static) shape.
|
|
347
|
+
const rendered = createMemo<{ line: LineShapeProps; rect: RectanglePosition } | null>(() => {
|
|
348
|
+
const c = coords();
|
|
349
|
+
if (!c) {
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
const clipPath = merged.ifOverflow === "hidden" ? `url(#${clipPathId})` : undefined;
|
|
353
|
+
const line: LineShapeProps = {
|
|
354
|
+
"clip-path": clipPath,
|
|
355
|
+
...svgPropertiesAndEvents({ ...merged }),
|
|
356
|
+
x1: c.x1,
|
|
357
|
+
y1: c.y1,
|
|
358
|
+
x2: c.x2,
|
|
359
|
+
y2: c.y2,
|
|
360
|
+
};
|
|
361
|
+
return { line, rect: rectWithCoords({ x1: c.x1, y1: c.y1, x2: c.x2, y2: c.y2 }) };
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
return (
|
|
365
|
+
<Show when={rendered()}>
|
|
366
|
+
{(r) => (
|
|
367
|
+
<ZIndexLayer zIndex={merged.zIndex ?? DefaultZIndexes.line}>
|
|
368
|
+
<Layer class="recharts-reference-line">
|
|
369
|
+
{renderLine(merged.shape, r().line)}
|
|
370
|
+
<CartesianLabelContextProvider
|
|
371
|
+
x={r().rect.x}
|
|
372
|
+
y={r().rect.y}
|
|
373
|
+
width={r().rect.width}
|
|
374
|
+
height={r().rect.height}
|
|
375
|
+
upperWidth={r().rect.width}
|
|
376
|
+
lowerWidth={r().rect.width}
|
|
377
|
+
>
|
|
378
|
+
<CartesianLabelFromLabelProp label={merged.label} />
|
|
379
|
+
</CartesianLabelContextProvider>
|
|
380
|
+
</Layer>
|
|
381
|
+
</ZIndexLayer>
|
|
382
|
+
)}
|
|
383
|
+
</Show>
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Draws a line on the chart at a data coordinate (the cartesian-aware version of
|
|
389
|
+
* an SVG `<line>`). ReferenceLine maps the provided data coordinates to pixels
|
|
390
|
+
* through the chart's scales.
|
|
391
|
+
*/
|
|
392
|
+
export function ReferenceLine<
|
|
393
|
+
XValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
394
|
+
YValueType extends ReferenceCoordinateValue = ReferenceCoordinateValue,
|
|
395
|
+
>(props: Props<XValueType, YValueType>): JSX.Element {
|
|
396
|
+
const merged = merge(referenceLineDefaultProps, props);
|
|
397
|
+
const id = useUniqueId("recharts-reference-line");
|
|
398
|
+
return (
|
|
399
|
+
<>
|
|
400
|
+
<ReportReferenceLine
|
|
401
|
+
id={id}
|
|
402
|
+
yAxisId={merged.yAxisId}
|
|
403
|
+
xAxisId={merged.xAxisId}
|
|
404
|
+
ifOverflow={merged.ifOverflow}
|
|
405
|
+
x={merged.x}
|
|
406
|
+
y={merged.y}
|
|
407
|
+
segment={merged.segment}
|
|
408
|
+
/>
|
|
409
|
+
<ReferenceLineImpl {...props} />
|
|
410
|
+
</>
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
ReferenceLine.displayName = "ReferenceLine";
|