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,72 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/scale/CartesianScaleHelper.ts (commit 7a23854).
|
|
2
|
+
import { BandPosition, RechartsScale } from "./RechartsScale";
|
|
3
|
+
import { CategoricalDomainItem, Coordinate, NullableCoordinate } from "../types";
|
|
4
|
+
|
|
5
|
+
export interface CartesianScaleHelper<
|
|
6
|
+
XDomain extends CategoricalDomainItem = CategoricalDomainItem,
|
|
7
|
+
YDomain extends CategoricalDomainItem = CategoricalDomainItem,
|
|
8
|
+
> {
|
|
9
|
+
map(value: { x: XDomain; y: YDomain }, { position }: { position: BandPosition }): Coordinate;
|
|
10
|
+
|
|
11
|
+
mapWithFallback(
|
|
12
|
+
value: { x?: XDomain | null | undefined; y?: YDomain | null | undefined },
|
|
13
|
+
{ position, fallback }: { position?: BandPosition; fallback: "rangeMin" | "rangeMax" },
|
|
14
|
+
): Coordinate;
|
|
15
|
+
|
|
16
|
+
isInRange({ x, y }: Partial<NullableCoordinate>): boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Groups X and Y scale functions together and provides helper methods.
|
|
21
|
+
*/
|
|
22
|
+
export class CartesianScaleHelperImpl<
|
|
23
|
+
XDomain extends CategoricalDomainItem = CategoricalDomainItem,
|
|
24
|
+
YDomain extends CategoricalDomainItem = CategoricalDomainItem,
|
|
25
|
+
> implements CartesianScaleHelper<XDomain, YDomain> {
|
|
26
|
+
private xAxisScale: RechartsScale<XDomain>;
|
|
27
|
+
|
|
28
|
+
private yAxisScale: RechartsScale<YDomain>;
|
|
29
|
+
|
|
30
|
+
constructor({ x, y }: { x: RechartsScale<XDomain>; y: RechartsScale<YDomain> }) {
|
|
31
|
+
this.xAxisScale = x;
|
|
32
|
+
this.yAxisScale = y;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
map(value: { x: XDomain; y: YDomain }, { position }: { position: BandPosition }): Coordinate {
|
|
36
|
+
return {
|
|
37
|
+
x: this.xAxisScale.map(value.x, { position }) ?? 0,
|
|
38
|
+
y: this.yAxisScale.map(value.y, { position }) ?? 0,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
mapWithFallback(
|
|
43
|
+
value: { x?: XDomain | null | undefined; y?: YDomain | null | undefined },
|
|
44
|
+
{ position, fallback }: { position?: BandPosition; fallback: "rangeMin" | "rangeMax" },
|
|
45
|
+
): Coordinate {
|
|
46
|
+
let fallbackY: number, fallbackX: number;
|
|
47
|
+
if (fallback === "rangeMin") {
|
|
48
|
+
fallbackY = this.yAxisScale.rangeMin();
|
|
49
|
+
} else if (fallback === "rangeMax") {
|
|
50
|
+
fallbackY = this.yAxisScale.rangeMax();
|
|
51
|
+
} else {
|
|
52
|
+
fallbackY = 0;
|
|
53
|
+
}
|
|
54
|
+
if (fallback === "rangeMin") {
|
|
55
|
+
fallbackX = this.xAxisScale.rangeMin();
|
|
56
|
+
} else if (fallback === "rangeMax") {
|
|
57
|
+
fallbackX = this.xAxisScale.rangeMax();
|
|
58
|
+
} else {
|
|
59
|
+
fallbackX = 0;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
x: this.xAxisScale.map(value.x, { position }) ?? fallbackX,
|
|
63
|
+
y: this.yAxisScale.map(value.y, { position }) ?? fallbackY,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
isInRange({ x, y }: Partial<NullableCoordinate>): boolean {
|
|
68
|
+
const xInRange = x == null || this.xAxisScale.isInRange(x);
|
|
69
|
+
const yInRange = y == null || this.yAxisScale.isInRange(y);
|
|
70
|
+
return xInRange && yInRange;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/scale/CustomScaleDefinition.ts (commit 7a23854).
|
|
2
|
+
import { CategoricalDomainItem } from "../types";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A subset of d3-scale. This is the external representation;
|
|
6
|
+
* This is the type that we expect from `axis.scale` props, if users want to provide custom scales.
|
|
7
|
+
*
|
|
8
|
+
* The actual d3 scales have many more methods, but we don't need them all.
|
|
9
|
+
* Specifically we want to avoid all the setters
|
|
10
|
+
* - immutable API is preferred in Recharts and mutating state will lead to hard-to-debug issues.
|
|
11
|
+
*
|
|
12
|
+
* @see {@link ScaleType} and {@link RechartsScaleType} for string shortcuts that you can use instead of this interface.
|
|
13
|
+
*/
|
|
14
|
+
export interface CustomScaleDefinition<
|
|
15
|
+
Domain extends CategoricalDomainItem = CategoricalDomainItem,
|
|
16
|
+
> {
|
|
17
|
+
/**
|
|
18
|
+
* Returns the scale's current domain.
|
|
19
|
+
* The domain could be:
|
|
20
|
+
* - in categorical scales: an array of strings or categories
|
|
21
|
+
* - in continuous scales: tuple of two numbers: [min, max]
|
|
22
|
+
*/
|
|
23
|
+
domain(): ReadonlyArray<Domain>;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Sets the domain of the scale.
|
|
27
|
+
*/
|
|
28
|
+
domain(newDomain: ReadonlyArray<Domain>): this;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Returns the scale's current range.
|
|
32
|
+
*/
|
|
33
|
+
range(): ReadonlyArray<number>;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Sets the range of the scale.
|
|
37
|
+
*/
|
|
38
|
+
range(newRange: ReadonlyArray<number>): this;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Returns an exact copy of this scale. Changes to this scale will not affect the returned scale, and vice versa.
|
|
42
|
+
* We use this method in Recharts to ensure immutability - changes to the scale outside should not affect the internal state,
|
|
43
|
+
* as they won't trigger re-renders in React.
|
|
44
|
+
*/
|
|
45
|
+
copy(): CustomScaleDefinition<Domain>;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Returns width of each band.
|
|
49
|
+
* Most scales are not banded, so this method is optional.
|
|
50
|
+
* Banded scales (like scaleBand from d3-scale) will implement this method.
|
|
51
|
+
*/
|
|
52
|
+
bandwidth?: () => number;
|
|
53
|
+
/**
|
|
54
|
+
* Quantitative (continuous) scales provide a ticks method that returns representative values from the scale's domain.
|
|
55
|
+
* Ordinal and band scales do not have this method.
|
|
56
|
+
*
|
|
57
|
+
* An optional count argument requests more or fewer ticks.
|
|
58
|
+
* The number of ticks returned, however, is not necessarily equal to the requested count.
|
|
59
|
+
*
|
|
60
|
+
* @see {@link https://d3js.org/d3-scale/linear#linear_ticks}
|
|
61
|
+
* @see {@link https://observablehq.com/@d3/scale-ticks}
|
|
62
|
+
*
|
|
63
|
+
* @param count number of ticks
|
|
64
|
+
*/
|
|
65
|
+
ticks?: (count: number | undefined) => ReadonlyArray<number>;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Given an arbitrary input, returns the corresponding point derived from the output range if the input is in the scale's domain.
|
|
69
|
+
* If the input is not included in the domain, returns undefined.
|
|
70
|
+
*
|
|
71
|
+
* @param input
|
|
72
|
+
*/
|
|
73
|
+
(input: Domain): number | undefined;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Given a value from the range, returns the corresponding value from the domain.
|
|
77
|
+
*
|
|
78
|
+
* This method is optional, as not all scales provide an inverse mapping.
|
|
79
|
+
* Linear and time scales typically do, while band and ordinal scales may not.
|
|
80
|
+
*/
|
|
81
|
+
invert?(value: number): Domain | undefined;
|
|
82
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/scale/RechartsScale.ts (commit 7a23854).
|
|
2
|
+
import { CustomScaleDefinition } from "./CustomScaleDefinition";
|
|
3
|
+
import { CategoricalDomainItem } from "../types";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This is internal representation of scale used in Recharts.
|
|
7
|
+
* Users will provide CustomScaleDefinition or a string, which we will parse into RechartsScale.
|
|
8
|
+
* Most importantly, RechartsScale is fully immutable - there are no setters that mutate the scale in place.
|
|
9
|
+
* This is important for React integration - if the scale changes, we want to trigger re-renders.
|
|
10
|
+
* Mutating the scale in place would not trigger re-renders, leading to stale UI.
|
|
11
|
+
*/
|
|
12
|
+
export interface RechartsScale<Domain extends CategoricalDomainItem = CategoricalDomainItem> {
|
|
13
|
+
/**
|
|
14
|
+
* Returns the scale's current domain.
|
|
15
|
+
* The domain could be:
|
|
16
|
+
* - in categorical scales: an array of strings or categories
|
|
17
|
+
* - in continuous scales: tuple of two numbers: [min, max]
|
|
18
|
+
*/
|
|
19
|
+
domain(): ReadonlyArray<Domain>;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Returns the scale's current range.
|
|
23
|
+
*
|
|
24
|
+
* This should be a readonly tuple of two numbers: [min, max]
|
|
25
|
+
* and so a better type would be `readonly [number, number]` but again - breaking changes,
|
|
26
|
+
* so let's keep that for 4.0.
|
|
27
|
+
*/
|
|
28
|
+
range(): ReadonlyArray<number>;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Returns the minimum value from the range.
|
|
32
|
+
*/
|
|
33
|
+
rangeMin(): number;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Returns the maximum value from the range.
|
|
37
|
+
*/
|
|
38
|
+
rangeMax(): number;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Returns true if the given value is within the scale's range.
|
|
42
|
+
* @param value
|
|
43
|
+
*/
|
|
44
|
+
isInRange(value: number): boolean;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Returns width of each band.
|
|
48
|
+
* Most scales are not banded, so this method is optional.
|
|
49
|
+
* Banded scales (like scaleBand from d3-scale) will implement this method.
|
|
50
|
+
*/
|
|
51
|
+
bandwidth?: () => number;
|
|
52
|
+
/**
|
|
53
|
+
* Quantitative (continuous) scales provide a ticks method that returns representative values from the scale's domain.
|
|
54
|
+
* Ordinal and band scales do not have this method.
|
|
55
|
+
*
|
|
56
|
+
* An optional count argument requests more or fewer ticks.
|
|
57
|
+
* The number of ticks returned, however, is not necessarily equal to the requested count.
|
|
58
|
+
*
|
|
59
|
+
* @see {@link https://d3js.org/d3-scale/linear#linear_ticks}
|
|
60
|
+
* @see {@link https://observablehq.com/@d3/scale-ticks}
|
|
61
|
+
*
|
|
62
|
+
* @param count number of ticks
|
|
63
|
+
*/
|
|
64
|
+
ticks?: (count: number | undefined) => ReadonlyArray<number>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Given an arbitrary input, returns the corresponding point derived from the output range if the input is in the scale's domain.
|
|
68
|
+
* If the input is not included in the domain, returns undefined.
|
|
69
|
+
*/
|
|
70
|
+
map(input: unknown, options?: { position?: BandPosition }): number | undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Position within a band for banded scales.
|
|
75
|
+
* In scales that are not banded, this parameter is ignored.
|
|
76
|
+
*
|
|
77
|
+
* @inline
|
|
78
|
+
*/
|
|
79
|
+
export type BandPosition = "start" | "middle" | "end";
|
|
80
|
+
|
|
81
|
+
export function rechartsScaleFactory<Domain extends CategoricalDomainItem = CategoricalDomainItem>(
|
|
82
|
+
d3Scale: CustomScaleDefinition<Domain>,
|
|
83
|
+
): RechartsScale<Domain>;
|
|
84
|
+
export function rechartsScaleFactory<Domain extends CategoricalDomainItem = CategoricalDomainItem>(
|
|
85
|
+
d3Scale: CustomScaleDefinition<Domain> | undefined,
|
|
86
|
+
): RechartsScale<Domain> | undefined;
|
|
87
|
+
export function rechartsScaleFactory<Domain extends CategoricalDomainItem = CategoricalDomainItem>(
|
|
88
|
+
d3Scale: CustomScaleDefinition<Domain> | undefined,
|
|
89
|
+
): RechartsScale<Domain> | undefined {
|
|
90
|
+
if (d3Scale == null) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const ticksFn = d3Scale.ticks;
|
|
94
|
+
const bandwidthFn = d3Scale.bandwidth;
|
|
95
|
+
const d3Range: ReadonlyArray<number> = d3Scale.range();
|
|
96
|
+
const range: [number, number] = [Math.min(...d3Range), Math.max(...d3Range)];
|
|
97
|
+
return {
|
|
98
|
+
domain: () => d3Scale.domain(),
|
|
99
|
+
range: () => range,
|
|
100
|
+
rangeMin: () => range[0],
|
|
101
|
+
rangeMax: () => range[1],
|
|
102
|
+
isInRange(value: number): boolean {
|
|
103
|
+
const first = range[0];
|
|
104
|
+
const last = range[1];
|
|
105
|
+
return first <= last ? value >= first && value <= last : value >= last && value <= first;
|
|
106
|
+
},
|
|
107
|
+
bandwidth: bandwidthFn ? () => bandwidthFn.call(d3Scale) : undefined,
|
|
108
|
+
ticks: ticksFn ? (count: number | undefined) => ticksFn.call(d3Scale, count) : undefined,
|
|
109
|
+
map: (input: Domain, options?: { position?: BandPosition }) => {
|
|
110
|
+
let baseValue = d3Scale(input);
|
|
111
|
+
if (baseValue == null) {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
if (d3Scale.bandwidth && options?.position) {
|
|
115
|
+
const bandWidth = d3Scale.bandwidth();
|
|
116
|
+
switch (options.position) {
|
|
117
|
+
case "middle":
|
|
118
|
+
baseValue += bandWidth / 2;
|
|
119
|
+
break;
|
|
120
|
+
case "end":
|
|
121
|
+
baseValue += bandWidth;
|
|
122
|
+
break;
|
|
123
|
+
default:
|
|
124
|
+
// 'start' requires no adjustment
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return baseValue;
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/scale/createCategoricalInverse.ts (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Solid/type deviations from reference (no behavior change):
|
|
4
|
+
// - `bisect` reads indices into `?? 0` locals instead of non-null `!` (our
|
|
5
|
+
// tsconfig enables noUncheckedIndexedAccess; the `?? 0` never fires for the
|
|
6
|
+
// in-bounds accesses the algorithm makes).
|
|
7
|
+
// - `allDataPointsOnAxis` is typed `ReadonlyArray<CategoricalDomainItem>` (the
|
|
8
|
+
// scale's actual input type) rather than `unknown[]`, which lets `scale(d)`
|
|
9
|
+
// typecheck and drops the reference's `@ts-expect-error`.
|
|
10
|
+
import { InverseScaleFunction } from "../../hooks";
|
|
11
|
+
import { CategoricalDomainItem } from "../types";
|
|
12
|
+
import { CustomScaleDefinition } from "./CustomScaleDefinition";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Binary search to find the index where x would fit in array a.
|
|
16
|
+
* Works for arrays that are sorted both ascending and descending.
|
|
17
|
+
*
|
|
18
|
+
* Unlike d3.bisect, this implementation handles both ascending and descending arrays.
|
|
19
|
+
*
|
|
20
|
+
* @param haystack Sorted array of numbers
|
|
21
|
+
* @param needle Number to find the insertion index for
|
|
22
|
+
* @returns Index where x would fit in array a
|
|
23
|
+
*/
|
|
24
|
+
export function bisect(haystack: ReadonlyArray<number>, needle: number): number {
|
|
25
|
+
let lo = 0;
|
|
26
|
+
let hi = haystack.length;
|
|
27
|
+
const first = haystack[0] ?? 0;
|
|
28
|
+
const last = haystack[haystack.length - 1] ?? 0;
|
|
29
|
+
const ascending = first < last;
|
|
30
|
+
|
|
31
|
+
while (lo < hi) {
|
|
32
|
+
const mid = Math.floor((lo + hi) / 2);
|
|
33
|
+
const midVal = haystack[mid] ?? 0;
|
|
34
|
+
if (ascending ? midVal < needle : midVal > needle) {
|
|
35
|
+
lo = mid + 1;
|
|
36
|
+
} else {
|
|
37
|
+
hi = mid;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return lo;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Computes an inverse scale function for categorical/ordinal scales.
|
|
45
|
+
* Uses bisect to find the closest domain value for a given pixel coordinate.
|
|
46
|
+
*/
|
|
47
|
+
export function createCategoricalInverse(
|
|
48
|
+
scale: CustomScaleDefinition | undefined,
|
|
49
|
+
allDataPointsOnAxis?: ReadonlyArray<CategoricalDomainItem>,
|
|
50
|
+
): InverseScaleFunction | undefined {
|
|
51
|
+
if (!scale) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const domain = allDataPointsOnAxis ?? scale.domain();
|
|
55
|
+
// Build an array of pixel positions for each domain value.
|
|
56
|
+
const pixelPositions: number[] = domain.map((d) => scale(d) ?? 0);
|
|
57
|
+
const range = scale.range();
|
|
58
|
+
|
|
59
|
+
if (domain.length === 0 || range.length < 2) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return (pixelValue: number): unknown => {
|
|
64
|
+
// Find the closest domain value using bisect
|
|
65
|
+
const index = bisect(pixelPositions, pixelValue);
|
|
66
|
+
|
|
67
|
+
// Clamp to valid range
|
|
68
|
+
if (index <= 0) {
|
|
69
|
+
return domain[0];
|
|
70
|
+
}
|
|
71
|
+
if (index >= domain.length) {
|
|
72
|
+
return domain[domain.length - 1];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Check which neighbor is closer
|
|
76
|
+
const leftPixel = pixelPositions[index - 1] ?? 0;
|
|
77
|
+
const rightPixel = pixelPositions[index] ?? 0;
|
|
78
|
+
if (Math.abs(pixelValue - leftPixel) <= Math.abs(pixelValue - rightPixel)) {
|
|
79
|
+
return domain[index - 1];
|
|
80
|
+
}
|
|
81
|
+
return domain[index];
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/scale/getNiceTickValues.ts (commit 7a23854).
|
|
2
|
+
// Pure math — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
/**
|
|
4
|
+
* @fileOverview calculate tick values of scale
|
|
5
|
+
* @author xile611, arcthur
|
|
6
|
+
* @date 2015-09-17
|
|
7
|
+
*/
|
|
8
|
+
import Decimal from "./util/DecimalLite";
|
|
9
|
+
import { getDigitCount, rangeStep } from "./util/arithmetic";
|
|
10
|
+
import { NumberDomain } from "../types";
|
|
11
|
+
import { NiceTicksAlgorithm } from "../../state/cartesianAxisSlice";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Calculate a interval of a minimum value and a maximum value
|
|
15
|
+
*
|
|
16
|
+
* @param {Number} min The minimum value
|
|
17
|
+
* @param {Number} max The maximum value
|
|
18
|
+
* @return {Array} An interval
|
|
19
|
+
*/
|
|
20
|
+
export const getValidInterval = ([min, max]: [number, number]): [number, number] => {
|
|
21
|
+
let [validMin, validMax] = [min, max];
|
|
22
|
+
|
|
23
|
+
// exchange
|
|
24
|
+
if (min > max) {
|
|
25
|
+
[validMin, validMax] = [max, min];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return [validMin, validMax];
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Calculate the step which is easy to understand between ticks, like 10, 20, 25
|
|
33
|
+
*
|
|
34
|
+
* @param roughStep The rough step calculated by dividing the difference by the tickCount
|
|
35
|
+
* @param allowDecimals Allow the ticks to be decimals or not
|
|
36
|
+
* @param correctionFactor A correction factor
|
|
37
|
+
* @return The step which is easy to understand between two ticks
|
|
38
|
+
*/
|
|
39
|
+
export const getAdaptiveStep = (
|
|
40
|
+
roughStep: Decimal,
|
|
41
|
+
allowDecimals: boolean,
|
|
42
|
+
correctionFactor: number,
|
|
43
|
+
) => {
|
|
44
|
+
if (roughStep.lte(0)) {
|
|
45
|
+
return new Decimal(0);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const digitCount = getDigitCount(roughStep.toNumber());
|
|
49
|
+
// The ratio between the rough step and the smallest number which has a bigger
|
|
50
|
+
// order of magnitudes than the rough step
|
|
51
|
+
const digitCountValue = new Decimal(10).pow(digitCount);
|
|
52
|
+
const stepRatio = roughStep.div(digitCountValue);
|
|
53
|
+
// When an integer and a float multiplied, the accuracy of result may be wrong
|
|
54
|
+
const stepRatioScale = digitCount !== 1 ? 0.05 : 0.1;
|
|
55
|
+
const amendStepRatio = new Decimal(Math.ceil(stepRatio.div(stepRatioScale).toNumber()))
|
|
56
|
+
.add(correctionFactor)
|
|
57
|
+
.mul(stepRatioScale);
|
|
58
|
+
|
|
59
|
+
const formatStep = amendStepRatio.mul(digitCountValue);
|
|
60
|
+
|
|
61
|
+
return allowDecimals
|
|
62
|
+
? new Decimal(formatStep.toNumber())
|
|
63
|
+
: new Decimal(Math.ceil(formatStep.toNumber()));
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
type StepFunction = (
|
|
67
|
+
roughStep: Decimal,
|
|
68
|
+
allowDecimals: boolean,
|
|
69
|
+
correctionFactor: number,
|
|
70
|
+
) => Decimal;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The snap125 step algorithm snaps to nice numbers (1, 2, 2.5, 5) at each
|
|
74
|
+
* order of magnitude, producing human-friendly tick intervals like
|
|
75
|
+
* 0, 5, 10, 15, 20 instead of 0, 4, 8, 12, 16.
|
|
76
|
+
*
|
|
77
|
+
* This is opt-in and can be enabled via the `niceTicks` prop on axis components.
|
|
78
|
+
*
|
|
79
|
+
* @param roughStep The rough step calculated by dividing the difference by the tickCount
|
|
80
|
+
* @param allowDecimals Allow the ticks to be decimals or not
|
|
81
|
+
* @param correctionFactor A correction factor
|
|
82
|
+
* @return The step which is easy to understand between two ticks
|
|
83
|
+
*/
|
|
84
|
+
export const getSnap125Step: StepFunction = (
|
|
85
|
+
roughStep: Decimal,
|
|
86
|
+
allowDecimals: boolean,
|
|
87
|
+
correctionFactor: number,
|
|
88
|
+
) => {
|
|
89
|
+
if (roughStep.lte(0)) {
|
|
90
|
+
return new Decimal(0);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const NICE_STEPS = [1, 2, 2.5, 5];
|
|
94
|
+
|
|
95
|
+
const roughNum = roughStep.toNumber();
|
|
96
|
+
const exponent = Math.floor(new Decimal(roughNum).abs().log(10).toNumber());
|
|
97
|
+
let magnitude = new Decimal(10).pow(exponent);
|
|
98
|
+
|
|
99
|
+
// normalized is in the range [1, 10)
|
|
100
|
+
const normalized = roughStep.div(magnitude).toNumber();
|
|
101
|
+
|
|
102
|
+
// Find the smallest nice step >= normalized (ceiling)
|
|
103
|
+
let niceIdx = NICE_STEPS.findIndex((s) => s >= normalized - 1e-10);
|
|
104
|
+
if (niceIdx === -1) {
|
|
105
|
+
// normalized > 5 (e.g. 7.3), move to next order of magnitude
|
|
106
|
+
magnitude = magnitude.mul(10);
|
|
107
|
+
niceIdx = 0;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Apply correction factor by stepping through the nice number sequence
|
|
111
|
+
niceIdx += correctionFactor;
|
|
112
|
+
if (niceIdx >= NICE_STEPS.length) {
|
|
113
|
+
const extraMag = Math.floor(niceIdx / NICE_STEPS.length);
|
|
114
|
+
niceIdx %= NICE_STEPS.length;
|
|
115
|
+
magnitude = magnitude.mul(new Decimal(10).pow(extraMag));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const niceStep = NICE_STEPS[niceIdx] ?? 1;
|
|
119
|
+
const formatStep = new Decimal(niceStep).mul(magnitude);
|
|
120
|
+
|
|
121
|
+
return allowDecimals ? formatStep : new Decimal(Math.ceil(formatStep.toNumber()));
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* calculate the ticks when the minimum value equals to the maximum value
|
|
126
|
+
*
|
|
127
|
+
* @param value The minimum value which is also the maximum value
|
|
128
|
+
* @param tickCount The count of ticks
|
|
129
|
+
* @param allowDecimals Allow the ticks to be decimals or not
|
|
130
|
+
* @return array of ticks
|
|
131
|
+
*/
|
|
132
|
+
export const getTickOfSingleValue = (
|
|
133
|
+
value: number,
|
|
134
|
+
tickCount: number,
|
|
135
|
+
allowDecimals: boolean,
|
|
136
|
+
): Array<number> => {
|
|
137
|
+
let step: Decimal = new Decimal(1);
|
|
138
|
+
// calculate the middle value of ticks
|
|
139
|
+
let middle = new Decimal(value);
|
|
140
|
+
|
|
141
|
+
if (!middle.isint() && allowDecimals) {
|
|
142
|
+
const absVal = Math.abs(value);
|
|
143
|
+
|
|
144
|
+
if (absVal < 1) {
|
|
145
|
+
// The step should be a float number when the difference is smaller than 1
|
|
146
|
+
step = new Decimal(10).pow(getDigitCount(value) - 1);
|
|
147
|
+
|
|
148
|
+
middle = new Decimal(Math.floor(middle.div(step).toNumber())).mul(step);
|
|
149
|
+
} else if (absVal > 1) {
|
|
150
|
+
// Return the maximum integer which is smaller than 'value' when 'value' is greater than 1
|
|
151
|
+
middle = new Decimal(Math.floor(value));
|
|
152
|
+
}
|
|
153
|
+
} else if (value === 0) {
|
|
154
|
+
middle = new Decimal(Math.floor((tickCount - 1) / 2));
|
|
155
|
+
} else if (!allowDecimals) {
|
|
156
|
+
middle = new Decimal(Math.floor(value));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const middleIndex = Math.floor((tickCount - 1) / 2);
|
|
160
|
+
const ticks: Array<number> = [];
|
|
161
|
+
|
|
162
|
+
for (let i = 0; i < tickCount; i++) {
|
|
163
|
+
ticks.push(middle.add(new Decimal(i - middleIndex).mul(step)).toNumber());
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return ticks;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Calculate the step
|
|
171
|
+
*
|
|
172
|
+
* @param min The minimum value of an interval
|
|
173
|
+
* @param max The maximum value of an interval
|
|
174
|
+
* @param tickCount The count of ticks
|
|
175
|
+
* @param allowDecimals Allow the ticks to be decimals or not
|
|
176
|
+
* @param correctionFactor A correction factor
|
|
177
|
+
* @return The step, minimum value of ticks, maximum value of ticks
|
|
178
|
+
*/
|
|
179
|
+
export const calculateStep = (
|
|
180
|
+
min: number,
|
|
181
|
+
max: number,
|
|
182
|
+
tickCount: number,
|
|
183
|
+
allowDecimals: boolean,
|
|
184
|
+
correctionFactor: number = 0,
|
|
185
|
+
stepFn: StepFunction = getAdaptiveStep,
|
|
186
|
+
): {
|
|
187
|
+
step: Decimal;
|
|
188
|
+
tickMin: Decimal;
|
|
189
|
+
tickMax: Decimal;
|
|
190
|
+
} => {
|
|
191
|
+
// dirty hack (for recharts' test)
|
|
192
|
+
if (!Number.isFinite((max - min) / (tickCount - 1))) {
|
|
193
|
+
return {
|
|
194
|
+
step: new Decimal(0),
|
|
195
|
+
tickMin: new Decimal(0),
|
|
196
|
+
tickMax: new Decimal(0),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// The step which is easy to understand between two ticks
|
|
201
|
+
const step = stepFn(
|
|
202
|
+
new Decimal(max).sub(min).div(tickCount - 1),
|
|
203
|
+
allowDecimals,
|
|
204
|
+
correctionFactor,
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
// A medial value of ticks
|
|
208
|
+
let middle;
|
|
209
|
+
|
|
210
|
+
// When 0 is inside the interval, 0 should be a tick
|
|
211
|
+
if (min <= 0 && max >= 0) {
|
|
212
|
+
middle = new Decimal(0);
|
|
213
|
+
} else {
|
|
214
|
+
// calculate the middle value
|
|
215
|
+
middle = new Decimal(min).add(max).div(2);
|
|
216
|
+
// minus modulo value
|
|
217
|
+
middle = middle.sub(new Decimal(middle).mod(step));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
let belowCount = Math.ceil(middle.sub(min).div(step).toNumber());
|
|
221
|
+
let upCount = Math.ceil(new Decimal(max).sub(middle).div(step).toNumber());
|
|
222
|
+
const scaleCount = belowCount + upCount + 1;
|
|
223
|
+
|
|
224
|
+
if (scaleCount > tickCount) {
|
|
225
|
+
// When more ticks need to cover the interval, step should be bigger.
|
|
226
|
+
return calculateStep(min, max, tickCount, allowDecimals, correctionFactor + 1, stepFn);
|
|
227
|
+
}
|
|
228
|
+
if (scaleCount < tickCount) {
|
|
229
|
+
// When less ticks can cover the interval, we should add some additional ticks
|
|
230
|
+
upCount = max > 0 ? upCount + (tickCount - scaleCount) : upCount;
|
|
231
|
+
belowCount = max > 0 ? belowCount : belowCount + (tickCount - scaleCount);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return {
|
|
235
|
+
step,
|
|
236
|
+
tickMin: middle.sub(new Decimal(belowCount).mul(step)),
|
|
237
|
+
tickMax: middle.add(new Decimal(upCount).mul(step)),
|
|
238
|
+
};
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Calculate the ticks of an interval. Ticks can appear outside the interval
|
|
243
|
+
* if it makes them more rounded and nice.
|
|
244
|
+
*
|
|
245
|
+
* @param tuple of [min,max] min: The minimum value, max: The maximum value
|
|
246
|
+
* @param tickCount The count of ticks
|
|
247
|
+
* @param allowDecimals Allow the ticks to be decimals or not
|
|
248
|
+
* @param niceTicksMode The algorithm to use for calculating nice ticks.
|
|
249
|
+
* @return array of ticks
|
|
250
|
+
*/
|
|
251
|
+
export const getNiceTickValues = (
|
|
252
|
+
[min, max]: NumberDomain,
|
|
253
|
+
tickCount = 6,
|
|
254
|
+
allowDecimals = true,
|
|
255
|
+
niceTicksMode: NiceTicksAlgorithm = "auto",
|
|
256
|
+
): number[] => {
|
|
257
|
+
// More than two ticks should be return
|
|
258
|
+
const count = Math.max(tickCount, 2);
|
|
259
|
+
const [cormin, cormax] = getValidInterval([min, max]);
|
|
260
|
+
|
|
261
|
+
if (cormin === -Infinity || cormax === Infinity) {
|
|
262
|
+
const values: Array<number> =
|
|
263
|
+
cormax === Infinity
|
|
264
|
+
? [cormin, ...Array<number>(tickCount - 1).fill(Infinity)]
|
|
265
|
+
: [...Array<number>(tickCount - 1).fill(-Infinity), cormax];
|
|
266
|
+
|
|
267
|
+
return min > max ? values.reverse() : values;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (cormin === cormax) {
|
|
271
|
+
return getTickOfSingleValue(cormin, tickCount, allowDecimals);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const stepFn = niceTicksMode === "snap125" ? getSnap125Step : getAdaptiveStep;
|
|
275
|
+
|
|
276
|
+
// Get the step between two ticks
|
|
277
|
+
const { step, tickMin, tickMax } = calculateStep(cormin, cormax, count, allowDecimals, 0, stepFn);
|
|
278
|
+
|
|
279
|
+
const values = rangeStep(tickMin, tickMax.add(new Decimal(0.1).mul(step)), step);
|
|
280
|
+
|
|
281
|
+
return min > max ? values.reverse() : values;
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Calculate the ticks of an interval.
|
|
286
|
+
* Ticks will be constrained to the interval [min, max] even if it makes them less rounded and nice.
|
|
287
|
+
*
|
|
288
|
+
* @param tuple of [min,max] min: The minimum value, max: The maximum value
|
|
289
|
+
* @param tickCount The count of ticks. This function may return less than tickCount ticks if the interval is too small.
|
|
290
|
+
* @param allowDecimals Allow the ticks to be decimals or not
|
|
291
|
+
* @param niceTicksMode The algorithm to use for calculating nice ticks. See {@link NiceTicksAlgorithm}.
|
|
292
|
+
* @return array of ticks
|
|
293
|
+
*/
|
|
294
|
+
export const getTickValuesFixedDomain = (
|
|
295
|
+
[min, max]: NumberDomain,
|
|
296
|
+
tickCount: number,
|
|
297
|
+
allowDecimals = true,
|
|
298
|
+
niceTicksMode: NiceTicksAlgorithm = "auto",
|
|
299
|
+
) => {
|
|
300
|
+
// More than two ticks should be return
|
|
301
|
+
const [cormin, cormax] = getValidInterval([min, max]);
|
|
302
|
+
|
|
303
|
+
if (cormin === -Infinity || cormax === Infinity) {
|
|
304
|
+
return [min, max];
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (cormin === cormax) {
|
|
308
|
+
return [cormin];
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const stepFn = niceTicksMode === "snap125" ? getSnap125Step : getAdaptiveStep;
|
|
312
|
+
const count = Math.max(tickCount, 2);
|
|
313
|
+
const step = stepFn(new Decimal(cormax).sub(cormin).div(count - 1), allowDecimals, 0);
|
|
314
|
+
let values = [...rangeStep(new Decimal(cormin), new Decimal(cormax), step), cormax];
|
|
315
|
+
|
|
316
|
+
if (allowDecimals === false) {
|
|
317
|
+
/*
|
|
318
|
+
* allowDecimals is false means that we want to have integer ticks.
|
|
319
|
+
* The step is guaranteed to be an integer in the code above which is great start
|
|
320
|
+
* but when the first step is not an integer, it will start stepping from a decimal value anyway.
|
|
321
|
+
* So we need to round all the values to integers after the fact.
|
|
322
|
+
* The domain boundary (cormax) is appended after the rangeStep values. When
|
|
323
|
+
* cormax rounds down to the same integer as the last rangeStep value, we end up
|
|
324
|
+
* with a duplicate trailing tick. Remove it.
|
|
325
|
+
*/
|
|
326
|
+
values = values.map((value) => Math.round(value));
|
|
327
|
+
const last = values.length - 1;
|
|
328
|
+
if (last > 0 && values[last] === values[last - 1]) {
|
|
329
|
+
values = values.slice(0, last);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return min > max ? values.reverse() : values;
|
|
334
|
+
};
|