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,42 @@
|
|
|
1
|
+
// Partial seed of recharts 3.8.1 src/util/Constants.ts (commit 7a23854).
|
|
2
|
+
// Only the constants consumed so far; grows as more land.
|
|
3
|
+
|
|
4
|
+
/** Default width of a Y axis, in pixels, when `width` is not specified. */
|
|
5
|
+
export const DEFAULT_Y_AXIS_WIDTH = 60;
|
|
6
|
+
|
|
7
|
+
/** Default categorical color palette (used by Treemap, Sankey). */
|
|
8
|
+
export const COLOR_PANEL = [
|
|
9
|
+
"#1890FF",
|
|
10
|
+
"#66B5FF",
|
|
11
|
+
"#41D9C7",
|
|
12
|
+
"#2FC25B",
|
|
13
|
+
"#6EDB8F",
|
|
14
|
+
"#9AE65C",
|
|
15
|
+
"#FACC14",
|
|
16
|
+
"#E6965C",
|
|
17
|
+
"#57AD71",
|
|
18
|
+
"#223273",
|
|
19
|
+
"#738AE6",
|
|
20
|
+
"#7564CC",
|
|
21
|
+
"#8543E0",
|
|
22
|
+
"#A877ED",
|
|
23
|
+
"#5C8EE6",
|
|
24
|
+
"#13C2C2",
|
|
25
|
+
"#70E0E0",
|
|
26
|
+
"#5CA3E6",
|
|
27
|
+
"#3436C7",
|
|
28
|
+
"#8082FF",
|
|
29
|
+
"#DD81E6",
|
|
30
|
+
"#F04864",
|
|
31
|
+
"#FA7D92",
|
|
32
|
+
"#D598D9",
|
|
33
|
+
] as const;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Identifies which data item the user is touching. The index is the position in
|
|
37
|
+
* the data array (number) or a matrix path string (Treemap/Sunkey).
|
|
38
|
+
*/
|
|
39
|
+
export const DATA_ITEM_INDEX_ATTRIBUTE_NAME = "data-recharts-item-index";
|
|
40
|
+
|
|
41
|
+
/** Identifies which graphical item owns the touched element (always unique). */
|
|
42
|
+
export const DATA_ITEM_GRAPHICAL_ITEM_ID_ATTRIBUTE_NAME = "data-recharts-item-id";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/CssPrefixUtils.ts (commit 7a23854).
|
|
2
|
+
const PREFIX_LIST = ["Webkit", "Moz", "O", "ms"];
|
|
3
|
+
|
|
4
|
+
export const generatePrefixStyle = (
|
|
5
|
+
name: string,
|
|
6
|
+
value: string,
|
|
7
|
+
): Record<string, string> | undefined => {
|
|
8
|
+
if (!name) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const camelName = name.replace(/(\w)/, (v) => v.toUpperCase());
|
|
13
|
+
const result: Record<string, string> = PREFIX_LIST.reduce(
|
|
14
|
+
(res, entry) => ({
|
|
15
|
+
...res,
|
|
16
|
+
[entry + camelName]: value,
|
|
17
|
+
}),
|
|
18
|
+
{},
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
result[name] = value;
|
|
22
|
+
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/DOMUtils.ts (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Deviation: React's `CSSProperties` (camelCase, e.g. `fontSize`) → csstype's
|
|
4
|
+
// `Properties` (the same camelCase type React's CSSProperties is built on).
|
|
5
|
+
// We deliberately do NOT use Solid's `JSX.CSSProperties`, which is kebab-case
|
|
6
|
+
// (`csstype.PropertiesHyphen`); the measurement API and its callers use
|
|
7
|
+
// camelCase keys, matching recharts. Everything else (DOM measurement span,
|
|
8
|
+
// LRUCache, Global SSR guard) is framework-agnostic.
|
|
9
|
+
import type { Properties as CSSProperties } from "csstype";
|
|
10
|
+
import { Global } from "./Global";
|
|
11
|
+
import { Size } from "./types";
|
|
12
|
+
import { LRUCache } from "./LRUCache";
|
|
13
|
+
|
|
14
|
+
export interface TextMeasurementConfig {
|
|
15
|
+
/** Maximum number of items to cache */
|
|
16
|
+
cacheSize: number;
|
|
17
|
+
/** Whether to enable caching */
|
|
18
|
+
enableCache: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const defaultConfig: TextMeasurementConfig = {
|
|
22
|
+
cacheSize: 2000,
|
|
23
|
+
enableCache: true,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
let currentConfig = { ...defaultConfig };
|
|
27
|
+
|
|
28
|
+
let stringCache = new LRUCache<string, Size>(currentConfig.cacheSize);
|
|
29
|
+
const SPAN_STYLE = {
|
|
30
|
+
position: "absolute",
|
|
31
|
+
top: "-20000px",
|
|
32
|
+
left: 0,
|
|
33
|
+
padding: 0,
|
|
34
|
+
margin: 0,
|
|
35
|
+
border: "none",
|
|
36
|
+
whiteSpace: "pre",
|
|
37
|
+
};
|
|
38
|
+
const MEASUREMENT_SPAN_ID = "recharts_measurement_span";
|
|
39
|
+
|
|
40
|
+
function createCacheKey(text: string | number, style: CSSProperties): string {
|
|
41
|
+
// Simple string concatenation for better performance than JSON.stringify
|
|
42
|
+
const fontSize = style.fontSize || "";
|
|
43
|
+
const fontFamily = style.fontFamily || "";
|
|
44
|
+
const fontWeight = style.fontWeight || "";
|
|
45
|
+
const fontStyle = style.fontStyle || "";
|
|
46
|
+
const letterSpacing = style.letterSpacing || "";
|
|
47
|
+
const textTransform = style.textTransform || "";
|
|
48
|
+
|
|
49
|
+
return `${text}|${fontSize}|${fontFamily}|${fontWeight}|${fontStyle}|${letterSpacing}|${textTransform}`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Measure text using DOM (accurate but slower)
|
|
54
|
+
* @param text - The text to measure
|
|
55
|
+
* @param style - CSS style properties to apply
|
|
56
|
+
* @returns The size of the text
|
|
57
|
+
*/
|
|
58
|
+
const measureTextWithDOM = (text: string | number, style: CSSProperties): Size => {
|
|
59
|
+
try {
|
|
60
|
+
let measurementSpan = document.getElementById(MEASUREMENT_SPAN_ID);
|
|
61
|
+
if (!measurementSpan) {
|
|
62
|
+
measurementSpan = document.createElement("span");
|
|
63
|
+
measurementSpan.setAttribute("id", MEASUREMENT_SPAN_ID);
|
|
64
|
+
measurementSpan.setAttribute("aria-hidden", "true");
|
|
65
|
+
document.body.appendChild(measurementSpan);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Apply styles directly without unnecessary object creation
|
|
69
|
+
Object.assign(measurementSpan.style, SPAN_STYLE, style);
|
|
70
|
+
measurementSpan.textContent = `${text}`;
|
|
71
|
+
|
|
72
|
+
const rect = measurementSpan.getBoundingClientRect();
|
|
73
|
+
return { width: rect.width, height: rect.height };
|
|
74
|
+
} catch {
|
|
75
|
+
return { width: 0, height: 0 };
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const getStringSize = (text: string | number, style: CSSProperties = {}): Size => {
|
|
80
|
+
if (text === undefined || text === null || Global.isSsr) {
|
|
81
|
+
return { width: 0, height: 0 };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// If caching is disabled, measure directly
|
|
85
|
+
if (!currentConfig.enableCache) {
|
|
86
|
+
return measureTextWithDOM(text, style);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const cacheKey = createCacheKey(text, style);
|
|
90
|
+
const cachedResult = stringCache.get(cacheKey);
|
|
91
|
+
|
|
92
|
+
if (cachedResult) {
|
|
93
|
+
return cachedResult;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Measure using DOM
|
|
97
|
+
const result = measureTextWithDOM(text, style);
|
|
98
|
+
|
|
99
|
+
// Store in LRU cache
|
|
100
|
+
stringCache.set(cacheKey, result);
|
|
101
|
+
|
|
102
|
+
return result;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Configure text measurement behavior
|
|
107
|
+
* @param config - Partial configuration to apply
|
|
108
|
+
* @returns void
|
|
109
|
+
*/
|
|
110
|
+
export const configureTextMeasurement = (config: Partial<TextMeasurementConfig>): void => {
|
|
111
|
+
const newConfig = { ...currentConfig, ...config };
|
|
112
|
+
|
|
113
|
+
if (newConfig.cacheSize !== currentConfig.cacheSize) {
|
|
114
|
+
stringCache = new LRUCache<string, Size>(newConfig.cacheSize);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
currentConfig = newConfig;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Get current text measurement configuration
|
|
122
|
+
* @returns Current configuration
|
|
123
|
+
*/
|
|
124
|
+
export const getTextMeasurementConfig = (): TextMeasurementConfig => ({ ...currentConfig });
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Clear the string size cache. Useful for testing or memory management.
|
|
128
|
+
* @returns void
|
|
129
|
+
*/
|
|
130
|
+
export const clearStringCache = (): void => {
|
|
131
|
+
stringCache.clear();
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Get cache statistics for debugging purposes.
|
|
136
|
+
* @returns Cache statistics including size and max size
|
|
137
|
+
*/
|
|
138
|
+
export const getStringCacheStats = () => ({
|
|
139
|
+
size: stringCache.size(),
|
|
140
|
+
maxSize: currentConfig.cacheSize,
|
|
141
|
+
});
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/DataUtils.ts (grown incrementally as
|
|
2
|
+
// consumers need more; the full 53-case spec ports when this is completed).
|
|
3
|
+
import { get } from "./objectPath";
|
|
4
|
+
import { NonEmptyArray, Percent } from "./types";
|
|
5
|
+
import { round } from "./round";
|
|
6
|
+
|
|
7
|
+
let idCounter = 0;
|
|
8
|
+
|
|
9
|
+
export const uniqueId = (prefix?: string): string => {
|
|
10
|
+
const id = ++idCounter;
|
|
11
|
+
|
|
12
|
+
return `${prefix || ""}${id}`;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const mathSign = (value: number): number => {
|
|
16
|
+
if (value === 0) {
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
if (value > 0) {
|
|
20
|
+
return 1;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return -1;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const isNan = (value: unknown): boolean => typeof value === "number" && Number.isNaN(value);
|
|
27
|
+
|
|
28
|
+
export const isNumber = (value: unknown): value is number =>
|
|
29
|
+
(typeof value === "number" || value instanceof Number) && !isNan(Number(value));
|
|
30
|
+
|
|
31
|
+
export const isNumOrStr = (value: unknown): value is number | string =>
|
|
32
|
+
isNumber(value) || typeof value === "string";
|
|
33
|
+
|
|
34
|
+
export const isNullish = (value: unknown): value is null | undefined =>
|
|
35
|
+
value === null || typeof value === "undefined";
|
|
36
|
+
|
|
37
|
+
export function noop(): undefined {}
|
|
38
|
+
|
|
39
|
+
export function interpolate(start: number | null | undefined, end: number, t: number): number;
|
|
40
|
+
export function interpolate(start: number | null | undefined, end: null, t: number): null;
|
|
41
|
+
export function interpolate(start: number | null | undefined, end: undefined, t: number): undefined;
|
|
42
|
+
export function interpolate(
|
|
43
|
+
start: number | null | undefined,
|
|
44
|
+
end: number | null,
|
|
45
|
+
t: number,
|
|
46
|
+
): number | null;
|
|
47
|
+
export function interpolate(
|
|
48
|
+
start: number | null | undefined,
|
|
49
|
+
end: number | undefined,
|
|
50
|
+
t: number,
|
|
51
|
+
): number | undefined;
|
|
52
|
+
export function interpolate(
|
|
53
|
+
start: number | null | undefined,
|
|
54
|
+
end: number | null | undefined,
|
|
55
|
+
t: number,
|
|
56
|
+
): number | null | undefined;
|
|
57
|
+
export function interpolate(
|
|
58
|
+
start: number | null | undefined,
|
|
59
|
+
end: number | null | undefined,
|
|
60
|
+
t: number,
|
|
61
|
+
): number | null | undefined {
|
|
62
|
+
if (isNumber(start) && isNumber(end)) {
|
|
63
|
+
return round(start + t * (end - start));
|
|
64
|
+
}
|
|
65
|
+
return end;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const upperFirst = (value: string): string => {
|
|
69
|
+
if (isNullish(value)) {
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export const isPercent = (value: string | number | undefined): value is Percent =>
|
|
77
|
+
typeof value === "string" && value.length > 1 && value.indexOf("%") === value.length - 1;
|
|
78
|
+
|
|
79
|
+
export const hasDuplicate = (ary: ReadonlyArray<unknown>): boolean => {
|
|
80
|
+
if (!Array.isArray(ary)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const len = ary.length;
|
|
85
|
+
const cache: Record<string, boolean> = {};
|
|
86
|
+
|
|
87
|
+
for (let i = 0; i < len; i++) {
|
|
88
|
+
if (!cache[String(ary[i])]) {
|
|
89
|
+
cache[String(ary[i])] = true;
|
|
90
|
+
} else {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return false;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export function findEntryInArray<T>(
|
|
99
|
+
ary: ReadonlyArray<T>,
|
|
100
|
+
specifiedKey: number | string | ((entry: T) => unknown),
|
|
101
|
+
specifiedValue: unknown,
|
|
102
|
+
): T | undefined {
|
|
103
|
+
if (!ary || !ary.length) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return ary.find(
|
|
108
|
+
(entry) =>
|
|
109
|
+
entry &&
|
|
110
|
+
(typeof specifiedKey === "function" ? specifiedKey(entry) : get(entry, specifiedKey)) ===
|
|
111
|
+
specifiedValue,
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
type LinearRegressionResult = {
|
|
116
|
+
xmin: number;
|
|
117
|
+
xmax: number;
|
|
118
|
+
a: number;
|
|
119
|
+
b: number;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* The least square linear regression
|
|
124
|
+
* @param {Array} data The array of points
|
|
125
|
+
* @returns {Object} The domain of x, and the parameter of linear function
|
|
126
|
+
*/
|
|
127
|
+
export const getLinearRegression = (
|
|
128
|
+
data: NonEmptyArray<{ cx?: number; cy?: number }>,
|
|
129
|
+
): LinearRegressionResult => {
|
|
130
|
+
const len = data.length;
|
|
131
|
+
let xsum = 0;
|
|
132
|
+
let ysum = 0;
|
|
133
|
+
let xysum = 0;
|
|
134
|
+
let xxsum = 0;
|
|
135
|
+
let xmin = Infinity;
|
|
136
|
+
let xmax = -Infinity;
|
|
137
|
+
let xcurrent = 0;
|
|
138
|
+
let ycurrent = 0;
|
|
139
|
+
|
|
140
|
+
for (let i = 0; i < len; i++) {
|
|
141
|
+
xcurrent = data[i]?.cx || 0;
|
|
142
|
+
ycurrent = data[i]?.cy || 0;
|
|
143
|
+
|
|
144
|
+
xsum += xcurrent;
|
|
145
|
+
ysum += ycurrent;
|
|
146
|
+
xysum += xcurrent * ycurrent;
|
|
147
|
+
xxsum += xcurrent * xcurrent;
|
|
148
|
+
xmin = Math.min(xmin, xcurrent);
|
|
149
|
+
xmax = Math.max(xmax, xcurrent);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const a =
|
|
153
|
+
len * xxsum !== xsum * xsum ? (len * xysum - xsum * ysum) / (len * xxsum - xsum * xsum) : 0;
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
xmin,
|
|
157
|
+
xmax,
|
|
158
|
+
a,
|
|
159
|
+
b: (ysum - a * xsum) / len,
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Checks if the value is not null nor undefined.
|
|
165
|
+
* @param value The value to check
|
|
166
|
+
* @returns true if the value is not null nor undefined
|
|
167
|
+
*/
|
|
168
|
+
export function isNotNil<T>(value: T): value is NonNullable<T> {
|
|
169
|
+
return value != null;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export const getPercentValue = (
|
|
173
|
+
percent: number | string | undefined,
|
|
174
|
+
totalValue: number | undefined,
|
|
175
|
+
defaultValue = 0,
|
|
176
|
+
validate = false,
|
|
177
|
+
): number => {
|
|
178
|
+
if (!isNumber(percent) && typeof percent !== "string") {
|
|
179
|
+
return defaultValue;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
let value: number;
|
|
183
|
+
|
|
184
|
+
if (isPercent(percent)) {
|
|
185
|
+
if (totalValue == null) {
|
|
186
|
+
return defaultValue;
|
|
187
|
+
}
|
|
188
|
+
const index = percent.indexOf("%");
|
|
189
|
+
// `isPercent` narrows `percent` to the `${number}%` template type (a string),
|
|
190
|
+
// so `.slice` works without recharts' `as string` assertion.
|
|
191
|
+
value = (totalValue * parseFloat(percent.slice(0, index))) / 100;
|
|
192
|
+
} else {
|
|
193
|
+
value = +percent;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (isNan(value)) {
|
|
197
|
+
value = defaultValue;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (validate && totalValue != null && value > totalValue) {
|
|
201
|
+
value = totalValue;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return value;
|
|
205
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/FunnelUtils.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// `<FunnelTrapezoid>` renders a funnel trapezoid through the shared `<Shape>`
|
|
4
|
+
// helper: it draws the `option` (function/object/default) and wraps it in a
|
|
5
|
+
// `<Layer>` g whose class is `recharts-active-shape` when `isActive` is true.
|
|
6
|
+
// Deviations: `Props as FunnelProps` → the local `FunnelTrapezoidItem` import; the
|
|
7
|
+
// React element-form `option` constituent is dropped (Solid has no cloneElement —
|
|
8
|
+
// function + object + boolean forms are supported, matching ActiveShapeUtils). The
|
|
9
|
+
// `option` is typed as the wider `ActiveShape` the `<Shape>` helper accepts (the
|
|
10
|
+
// `<Funnel>` `shape`/`activeShape` function-form props are assignable to it).
|
|
11
|
+
import type { JSX } from "@solidjs/web";
|
|
12
|
+
import { Trapezoid } from "../shape/Trapezoid";
|
|
13
|
+
import { Shape } from "./ActiveShapeUtils";
|
|
14
|
+
import type { ActiveShape, ShapeAnimationProps } from "./types";
|
|
15
|
+
import type { FunnelTrapezoidItem } from "../cartesian/Funnel";
|
|
16
|
+
|
|
17
|
+
export const defaultFunnelShape = Trapezoid;
|
|
18
|
+
|
|
19
|
+
type FunnelTrapezoidShapeProps = FunnelTrapezoidItem & ShapeAnimationProps & { isActive: boolean };
|
|
20
|
+
|
|
21
|
+
export type FunnelTrapezoidProps = {
|
|
22
|
+
option: ActiveShape<FunnelTrapezoidShapeProps, SVGPathElement> | undefined;
|
|
23
|
+
} & FunnelTrapezoidShapeProps;
|
|
24
|
+
|
|
25
|
+
export function FunnelTrapezoid(props: FunnelTrapezoidProps): JSX.Element {
|
|
26
|
+
const shapeProps = (): FunnelTrapezoidShapeProps => {
|
|
27
|
+
const { option: _option, ...rest } = props;
|
|
28
|
+
return rest;
|
|
29
|
+
};
|
|
30
|
+
return (
|
|
31
|
+
<Shape<FunnelTrapezoidShapeProps, SVGPathElement>
|
|
32
|
+
option={props.option}
|
|
33
|
+
DefaultShape={defaultFunnelShape}
|
|
34
|
+
shapeProps={shapeProps()}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/Global.ts (commit 7a23854).
|
|
2
|
+
// Pure constant object — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
|
|
4
|
+
const parseIsSsrByDefault = (): boolean =>
|
|
5
|
+
!(
|
|
6
|
+
typeof window !== "undefined" &&
|
|
7
|
+
window.document &&
|
|
8
|
+
typeof window.document.createElement === "function" &&
|
|
9
|
+
window.setTimeout
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export const Global = {
|
|
13
|
+
devToolsEnabled: process.env.NODE_ENV !== "production",
|
|
14
|
+
isSsr: parseIsSsrByDefault(),
|
|
15
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/IfOverflow.ts (commit 7a23854).
|
|
2
|
+
export type IfOverflow = "hidden" | "visible" | "discard" | "extendDomain";
|
|
3
|
+
|
|
4
|
+
export interface Overflowable {
|
|
5
|
+
/**
|
|
6
|
+
* Defines how to draw this component if it falls partly outside the canvas:
|
|
7
|
+
*
|
|
8
|
+
* - `discard`: the whole component will not be drawn at all
|
|
9
|
+
* - `hidden`: the component will be clipped to the chart plot area
|
|
10
|
+
* - `visible`: the component will be drawn completely
|
|
11
|
+
* - `extendDomain`: the domain of the overflown axis will be extended such
|
|
12
|
+
* that the whole component fits into the plot area
|
|
13
|
+
*
|
|
14
|
+
* @defaultValue discard
|
|
15
|
+
*/
|
|
16
|
+
ifOverflow?: IfOverflow;
|
|
17
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/LRUCache.ts (commit 7a23854).
|
|
2
|
+
// Pure data structure — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
// Deviations from the reference are limited to satisfying this repo's type
|
|
4
|
+
// discipline (no `as` / no non-null `!`); `as const` is retained where applicable.
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Simple LRU (Least Recently Used) cache implementation
|
|
8
|
+
*/
|
|
9
|
+
export class LRUCache<K, V> {
|
|
10
|
+
private cache = new Map<K, V>();
|
|
11
|
+
|
|
12
|
+
private maxSize: number;
|
|
13
|
+
|
|
14
|
+
constructor(maxSize: number) {
|
|
15
|
+
this.maxSize = maxSize;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
get(key: K): V | undefined {
|
|
19
|
+
const value = this.cache.get(key);
|
|
20
|
+
if (value !== undefined) {
|
|
21
|
+
this.cache.delete(key);
|
|
22
|
+
this.cache.set(key, value);
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
set(key: K, value: V): void {
|
|
28
|
+
if (this.cache.has(key)) {
|
|
29
|
+
this.cache.delete(key);
|
|
30
|
+
} else if (this.cache.size >= this.maxSize) {
|
|
31
|
+
const firstKey = this.cache.keys().next().value;
|
|
32
|
+
if (firstKey != null) {
|
|
33
|
+
this.cache.delete(firstKey);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
this.cache.set(key, value);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
clear(): void {
|
|
40
|
+
this.cache.clear();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
size(): number {
|
|
44
|
+
return this.cache.size;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/LogUtils.ts (commit 7a23854).
|
|
2
|
+
// Pure util — no framework surface — behavior is byte-identical to recharts.
|
|
3
|
+
|
|
4
|
+
/* eslint no-console: 0 */
|
|
5
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
6
|
+
|
|
7
|
+
export const warn = (condition: boolean, format: string, ...args: unknown[]): void => {
|
|
8
|
+
if (isDev && typeof console !== "undefined" && console.warn) {
|
|
9
|
+
if (format === undefined) {
|
|
10
|
+
console.warn("LogUtils requires an error message argument");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (!condition) {
|
|
14
|
+
if (format === undefined) {
|
|
15
|
+
console.warn(
|
|
16
|
+
"Minified exception occurred; use the non-minified dev environment " +
|
|
17
|
+
"for the full error message and additional helpful warnings.",
|
|
18
|
+
);
|
|
19
|
+
} else {
|
|
20
|
+
let argIndex = 0;
|
|
21
|
+
|
|
22
|
+
console.warn(format.replace(/%s/g, () => String(args[argIndex++])));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/PolarUtils.ts (commit 7a23854).
|
|
2
|
+
// Pure math — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
ChartOffsetInternal,
|
|
6
|
+
RelativePointer,
|
|
7
|
+
Coordinate,
|
|
8
|
+
PolarViewBoxRequired,
|
|
9
|
+
RangeObj,
|
|
10
|
+
} from "./types";
|
|
11
|
+
|
|
12
|
+
export const RADIAN = Math.PI / 180;
|
|
13
|
+
|
|
14
|
+
export const degreeToRadian = (angle: number) => (angle * Math.PI) / 180;
|
|
15
|
+
|
|
16
|
+
export const radianToDegree = (angleInRadian: number) => (angleInRadian * 180) / Math.PI;
|
|
17
|
+
|
|
18
|
+
export const polarToCartesian = (
|
|
19
|
+
cx: number,
|
|
20
|
+
cy: number,
|
|
21
|
+
radius: number,
|
|
22
|
+
angle: number,
|
|
23
|
+
): Coordinate => ({
|
|
24
|
+
x: cx + Math.cos(-RADIAN * angle) * radius,
|
|
25
|
+
y: cy + Math.sin(-RADIAN * angle) * radius,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export const getMaxRadius = (
|
|
29
|
+
width: number,
|
|
30
|
+
height: number,
|
|
31
|
+
offset: ChartOffsetInternal = {
|
|
32
|
+
top: 0,
|
|
33
|
+
right: 0,
|
|
34
|
+
bottom: 0,
|
|
35
|
+
left: 0,
|
|
36
|
+
width: 0,
|
|
37
|
+
height: 0,
|
|
38
|
+
brushBottom: 0,
|
|
39
|
+
},
|
|
40
|
+
) =>
|
|
41
|
+
Math.min(
|
|
42
|
+
Math.abs(width - (offset.left || 0) - (offset.right || 0)),
|
|
43
|
+
Math.abs(height - (offset.top || 0) - (offset.bottom || 0)),
|
|
44
|
+
) / 2;
|
|
45
|
+
|
|
46
|
+
const distanceBetweenPoints = (point: Coordinate, anotherPoint: Coordinate) => {
|
|
47
|
+
const { x: x1, y: y1 } = point;
|
|
48
|
+
const { x: x2, y: y2 } = anotherPoint;
|
|
49
|
+
|
|
50
|
+
return Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const getAngleOfPoint = ({ x, y }: Coordinate, { cx, cy }: PolarViewBoxRequired) => {
|
|
54
|
+
const radius = distanceBetweenPoints({ x, y }, { x: cx, y: cy });
|
|
55
|
+
|
|
56
|
+
if (radius <= 0) {
|
|
57
|
+
return { radius, angle: 0 };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const cos = (x - cx) / radius;
|
|
61
|
+
let angleInRadian = Math.acos(cos);
|
|
62
|
+
|
|
63
|
+
if (y > cy) {
|
|
64
|
+
angleInRadian = 2 * Math.PI - angleInRadian;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return { radius, angle: radianToDegree(angleInRadian), angleInRadian };
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const formatAngleOfSector = ({ startAngle, endAngle }: PolarViewBoxRequired) => {
|
|
71
|
+
const startCnt = Math.floor(startAngle / 360);
|
|
72
|
+
const endCnt = Math.floor(endAngle / 360);
|
|
73
|
+
const min = Math.min(startCnt, endCnt);
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
startAngle: startAngle - min * 360,
|
|
77
|
+
endAngle: endAngle - min * 360,
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const reverseFormatAngleOfSector = (
|
|
82
|
+
angle: number,
|
|
83
|
+
{ startAngle, endAngle }: PolarViewBoxRequired,
|
|
84
|
+
): number => {
|
|
85
|
+
const startCnt = Math.floor(startAngle / 360);
|
|
86
|
+
const endCnt = Math.floor(endAngle / 360);
|
|
87
|
+
const min = Math.min(startCnt, endCnt);
|
|
88
|
+
|
|
89
|
+
return angle + min * 360;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const inRangeOfSector = (
|
|
93
|
+
{ relativeX: x, relativeY: y }: RelativePointer,
|
|
94
|
+
viewBox: PolarViewBoxRequired,
|
|
95
|
+
): RangeObj | null => {
|
|
96
|
+
const { radius, angle } = getAngleOfPoint({ x, y }, viewBox);
|
|
97
|
+
const { innerRadius, outerRadius } = viewBox;
|
|
98
|
+
|
|
99
|
+
if (radius < innerRadius || radius > outerRadius) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (radius === 0) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const { startAngle, endAngle } = formatAngleOfSector(viewBox);
|
|
108
|
+
let formatAngle = angle;
|
|
109
|
+
let inRange;
|
|
110
|
+
|
|
111
|
+
if (startAngle <= endAngle) {
|
|
112
|
+
while (formatAngle > endAngle) {
|
|
113
|
+
formatAngle -= 360;
|
|
114
|
+
}
|
|
115
|
+
while (formatAngle < startAngle) {
|
|
116
|
+
formatAngle += 360;
|
|
117
|
+
}
|
|
118
|
+
inRange = formatAngle >= startAngle && formatAngle <= endAngle;
|
|
119
|
+
} else {
|
|
120
|
+
while (formatAngle > startAngle) {
|
|
121
|
+
formatAngle -= 360;
|
|
122
|
+
}
|
|
123
|
+
while (formatAngle < endAngle) {
|
|
124
|
+
formatAngle += 360;
|
|
125
|
+
}
|
|
126
|
+
inRange = formatAngle >= endAngle && formatAngle <= startAngle;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (inRange) {
|
|
130
|
+
return { ...viewBox, radius, angle: reverseFormatAngleOfSector(formatAngle, viewBox) };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return null;
|
|
134
|
+
};
|