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,35 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/RadialBarUtils.tsx (commit 7a23854).
|
|
2
|
+
// Renders a RadialBar sector through the <Shape> abstraction (default = Sector).
|
|
3
|
+
import { omit } from "solid-js";
|
|
4
|
+
import type { JSX } from "@solidjs/web";
|
|
5
|
+
import { RadialBarDataItem, RadialBarProps } from "../polar/RadialBar";
|
|
6
|
+
import { Sector } from "../shape/Sector";
|
|
7
|
+
import { Shape } from "./ActiveShapeUtils";
|
|
8
|
+
|
|
9
|
+
export const defaultRadialBarShape = Sector;
|
|
10
|
+
|
|
11
|
+
export function parseCornerRadius(cornerRadius: string | number | undefined): number | undefined {
|
|
12
|
+
if (typeof cornerRadius === "string") {
|
|
13
|
+
return parseInt(cornerRadius, 10);
|
|
14
|
+
}
|
|
15
|
+
return cornerRadius;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface RadialBarSectorProps extends RadialBarDataItem {
|
|
19
|
+
index: number;
|
|
20
|
+
isActive: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type RadialBarSectorComponentProps = RadialBarSectorProps & {
|
|
24
|
+
option: Exclude<RadialBarProps["shape"], undefined> | RadialBarProps["activeShape"];
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export function RadialBarSector(props: RadialBarSectorComponentProps): JSX.Element {
|
|
28
|
+
return (
|
|
29
|
+
<Shape<RadialBarSectorProps, SVGPathElement>
|
|
30
|
+
option={props.option}
|
|
31
|
+
DefaultShape={defaultRadialBarShape}
|
|
32
|
+
shapeProps={omit(props, "option")}
|
|
33
|
+
/>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/ReduceCSSCalc.ts (commit 7a23854).
|
|
2
|
+
// Pure CSS-calc parser — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
|
|
4
|
+
import { isNan } from "./DataUtils";
|
|
5
|
+
|
|
6
|
+
const MULTIPLY_OR_DIVIDE_REGEX = /(-?\d+(?:\.\d+)?[a-zA-Z%]*)([*/])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/;
|
|
7
|
+
const ADD_OR_SUBTRACT_REGEX = /(-?\d+(?:\.\d+)?[a-zA-Z%]*)([+-])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/;
|
|
8
|
+
const CSS_LENGTH_UNIT_REGEX = /^(px|cm|vh|vw|em|rem|%|mm|in|pt|pc|ex|ch|vmin|vmax|Q)$/;
|
|
9
|
+
const NUM_SPLIT_REGEX = /(-?\d+(?:\.\d+)?)([a-zA-Z%]+)?/;
|
|
10
|
+
|
|
11
|
+
type SupportedUnits = "cm" | "mm" | "pt" | "pc" | "in" | "Q" | "px";
|
|
12
|
+
|
|
13
|
+
const CONVERSION_RATES: Record<SupportedUnits, number> = {
|
|
14
|
+
cm: 96 / 2.54,
|
|
15
|
+
mm: 96 / 25.4,
|
|
16
|
+
pt: 96 / 72,
|
|
17
|
+
pc: 96 / 6,
|
|
18
|
+
in: 96,
|
|
19
|
+
Q: 96 / (2.54 * 40),
|
|
20
|
+
px: 1,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const FIXED_CSS_LENGTH_UNITS: ReadonlyArray<SupportedUnits> = [
|
|
24
|
+
"cm",
|
|
25
|
+
"mm",
|
|
26
|
+
"pt",
|
|
27
|
+
"pc",
|
|
28
|
+
"in",
|
|
29
|
+
"Q",
|
|
30
|
+
"px",
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
function isSupportedUnit(unit: string): unit is SupportedUnits {
|
|
34
|
+
return FIXED_CSS_LENGTH_UNITS.some((supported) => supported === unit);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const STR_NAN = "NaN";
|
|
38
|
+
|
|
39
|
+
function convertToPx(value: number, unit: SupportedUnits): number {
|
|
40
|
+
return value * CONVERSION_RATES[unit];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
class DecimalCSS {
|
|
44
|
+
static parse(str: string) {
|
|
45
|
+
const [, numStr, unit] = NUM_SPLIT_REGEX.exec(str) ?? [];
|
|
46
|
+
|
|
47
|
+
if (numStr == null) {
|
|
48
|
+
return DecimalCSS.NaN;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return new DecimalCSS(parseFloat(numStr), unit ?? "");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
static NaN = new DecimalCSS(NaN, "");
|
|
55
|
+
|
|
56
|
+
constructor(
|
|
57
|
+
public num: number,
|
|
58
|
+
public unit: string,
|
|
59
|
+
) {
|
|
60
|
+
// `num`/`unit` are parameter properties (auto-assigned); no explicit assignment needed.
|
|
61
|
+
if (isNan(num)) {
|
|
62
|
+
this.unit = "";
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (unit !== "" && !CSS_LENGTH_UNIT_REGEX.test(unit)) {
|
|
66
|
+
this.num = NaN;
|
|
67
|
+
this.unit = "";
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (isSupportedUnit(unit)) {
|
|
71
|
+
this.num = convertToPx(num, unit);
|
|
72
|
+
this.unit = "px";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
add(other: DecimalCSS) {
|
|
77
|
+
if (this.unit !== other.unit) {
|
|
78
|
+
return new DecimalCSS(NaN, "");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return new DecimalCSS(this.num + other.num, this.unit);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
subtract(other: DecimalCSS) {
|
|
85
|
+
if (this.unit !== other.unit) {
|
|
86
|
+
return new DecimalCSS(NaN, "");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return new DecimalCSS(this.num - other.num, this.unit);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
multiply(other: DecimalCSS) {
|
|
93
|
+
if (this.unit !== "" && other.unit !== "" && this.unit !== other.unit) {
|
|
94
|
+
return new DecimalCSS(NaN, "");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return new DecimalCSS(this.num * other.num, this.unit || other.unit);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
divide(other: DecimalCSS) {
|
|
101
|
+
if (this.unit !== "" && other.unit !== "" && this.unit !== other.unit) {
|
|
102
|
+
return new DecimalCSS(NaN, "");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return new DecimalCSS(this.num / other.num, this.unit || other.unit);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
toString() {
|
|
109
|
+
return `${this.num}${this.unit}`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
isNaN() {
|
|
113
|
+
return isNan(this.num);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function calculateArithmetic(expr: string | undefined): string {
|
|
118
|
+
if (expr == null || expr.includes(STR_NAN)) {
|
|
119
|
+
return STR_NAN;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
let newExpr = expr;
|
|
123
|
+
while (newExpr.includes("*") || newExpr.includes("/")) {
|
|
124
|
+
const [, leftOperand, operator, rightOperand] = MULTIPLY_OR_DIVIDE_REGEX.exec(newExpr) ?? [];
|
|
125
|
+
const lTs = DecimalCSS.parse(leftOperand ?? "");
|
|
126
|
+
const rTs = DecimalCSS.parse(rightOperand ?? "");
|
|
127
|
+
const result = operator === "*" ? lTs.multiply(rTs) : lTs.divide(rTs);
|
|
128
|
+
if (result.isNaN()) {
|
|
129
|
+
return STR_NAN;
|
|
130
|
+
}
|
|
131
|
+
newExpr = newExpr.replace(MULTIPLY_OR_DIVIDE_REGEX, result.toString());
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
while (newExpr.includes("+") || /.-\d+(?:\.\d+)?/.test(newExpr)) {
|
|
135
|
+
const [, leftOperand, operator, rightOperand] = ADD_OR_SUBTRACT_REGEX.exec(newExpr) ?? [];
|
|
136
|
+
const lTs = DecimalCSS.parse(leftOperand ?? "");
|
|
137
|
+
const rTs = DecimalCSS.parse(rightOperand ?? "");
|
|
138
|
+
const result = operator === "+" ? lTs.add(rTs) : lTs.subtract(rTs);
|
|
139
|
+
if (result.isNaN()) {
|
|
140
|
+
return STR_NAN;
|
|
141
|
+
}
|
|
142
|
+
newExpr = newExpr.replace(ADD_OR_SUBTRACT_REGEX, result.toString());
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return newExpr;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const PARENTHESES_REGEX = /\(([^()]*)\)/;
|
|
149
|
+
|
|
150
|
+
function calculateParentheses(expr: string): string {
|
|
151
|
+
let newExpr = expr;
|
|
152
|
+
let match: ReturnType<typeof RegExp.prototype.exec> | null;
|
|
153
|
+
// eslint-disable-next-line no-cond-assign
|
|
154
|
+
while ((match = PARENTHESES_REGEX.exec(newExpr)) != null) {
|
|
155
|
+
const [, parentheticalExpression] = match;
|
|
156
|
+
newExpr = newExpr.replace(PARENTHESES_REGEX, calculateArithmetic(parentheticalExpression));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return newExpr;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function evaluateExpression(expression: string): string {
|
|
163
|
+
let newExpr = expression.replace(/\s+/g, "");
|
|
164
|
+
newExpr = calculateParentheses(newExpr);
|
|
165
|
+
newExpr = calculateArithmetic(newExpr);
|
|
166
|
+
|
|
167
|
+
return newExpr;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function safeEvaluateExpression(expression: string): string {
|
|
171
|
+
try {
|
|
172
|
+
return evaluateExpression(expression);
|
|
173
|
+
} catch {
|
|
174
|
+
return STR_NAN;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function reduceCSSCalc(expression: string): string {
|
|
179
|
+
const result = safeEvaluateExpression(expression.slice(5, -1));
|
|
180
|
+
|
|
181
|
+
if (result === STR_NAN) {
|
|
182
|
+
return "";
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Reimplements react-redux's `shallowEqual` (react-redux/src/utils/shallowEqual.ts).
|
|
2
|
+
// The reference test imports `shallowEqual` from 'react-redux'; this project has no
|
|
3
|
+
// react-redux, so we provide a local equivalent: Object.is reference/NaN handling,
|
|
4
|
+
// then own-enumerable-key comparison in both directions with Object.is per key.
|
|
5
|
+
|
|
6
|
+
function is(x: unknown, y: unknown): boolean {
|
|
7
|
+
if (x === y) {
|
|
8
|
+
return x !== 0 || y !== 0 || 1 / x === 1 / y;
|
|
9
|
+
}
|
|
10
|
+
return x !== x && y !== y;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function shallowEqual(objA: unknown, objB: unknown): boolean {
|
|
14
|
+
if (is(objA, objB)) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const keysA = Object.keys(objA);
|
|
23
|
+
const keysB = Object.keys(objB);
|
|
24
|
+
|
|
25
|
+
if (keysA.length !== keysB.length) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
for (let i = 0; i < keysA.length; i++) {
|
|
30
|
+
const key = keysA[i];
|
|
31
|
+
if (key === undefined) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (
|
|
35
|
+
!Object.prototype.hasOwnProperty.call(objB, key) ||
|
|
36
|
+
!is(Reflect.get(objA, key), Reflect.get(objB, key))
|
|
37
|
+
) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/TickUtils.ts.
|
|
2
|
+
// Pure geometry — no framework surface — so behavior is byte-identical to recharts.
|
|
3
|
+
import { getAngledRectangleWidth } from "./CartesianUtils";
|
|
4
|
+
import { getEveryNth } from "./getEveryNth";
|
|
5
|
+
import { Size, CartesianTickItem, CartesianViewBoxRequired } from "./types";
|
|
6
|
+
|
|
7
|
+
export function getAngledTickWidth(contentSize: Size, unitSize: Size, angle: number | undefined) {
|
|
8
|
+
const size = {
|
|
9
|
+
width: contentSize.width + unitSize.width,
|
|
10
|
+
height: contentSize.height + unitSize.height,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
return getAngledRectangleWidth(size, angle);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function getTickBoundaries(
|
|
17
|
+
viewBox: CartesianViewBoxRequired,
|
|
18
|
+
sign: number,
|
|
19
|
+
sizeKey: string,
|
|
20
|
+
) {
|
|
21
|
+
const isWidth = sizeKey === "width";
|
|
22
|
+
const { x, y, width, height } = viewBox;
|
|
23
|
+
if (sign === 1) {
|
|
24
|
+
return {
|
|
25
|
+
start: isWidth ? x : y,
|
|
26
|
+
end: isWidth ? x + width : y + height,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
start: isWidth ? x + width : y + height,
|
|
31
|
+
end: isWidth ? x : y,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function isVisible(
|
|
36
|
+
sign: number,
|
|
37
|
+
tickPosition: number,
|
|
38
|
+
getSize: () => number,
|
|
39
|
+
start: number,
|
|
40
|
+
end: number,
|
|
41
|
+
): boolean {
|
|
42
|
+
/* Since getSize() is expensive (it reads the ticks' size from the DOM), we do this check first to avoid calculating
|
|
43
|
+
* the tick's size. */
|
|
44
|
+
if (sign * tickPosition < sign * start || sign * tickPosition > sign * end) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const size = getSize();
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
sign * (tickPosition - (sign * size) / 2 - start) >= 0 &&
|
|
52
|
+
sign * (tickPosition + (sign * size) / 2 - end) <= 0
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function getNumberIntervalTicks(
|
|
57
|
+
ticks: ReadonlyArray<CartesianTickItem>,
|
|
58
|
+
interval: number,
|
|
59
|
+
): ReadonlyArray<CartesianTickItem> | undefined {
|
|
60
|
+
return getEveryNth(ticks, interval + 1);
|
|
61
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/YAxisUtils.ts (commit 7a23854).
|
|
2
|
+
type IGetBoundingClient = Pick<Element, "getBoundingClientRect">;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Calculates the width of the Y-axis based on the tick labels and the axis label.
|
|
6
|
+
* @param params.ticks an array-like of tick elements, each with `getBoundingClientRect`
|
|
7
|
+
* @param params.label the axis label element, with `getBoundingClientRect`
|
|
8
|
+
* @param params.labelGapWithTick gap between the label and the tick (default 5)
|
|
9
|
+
* @param params.tickSize length of the tick line (default 0)
|
|
10
|
+
* @param params.tickMargin margin between the tick line and the tick text (default 0)
|
|
11
|
+
* @returns the calculated width of the Y-axis
|
|
12
|
+
*/
|
|
13
|
+
export const getCalculatedYAxisWidth = ({
|
|
14
|
+
ticks,
|
|
15
|
+
label,
|
|
16
|
+
labelGapWithTick = 5,
|
|
17
|
+
tickSize = 0,
|
|
18
|
+
tickMargin = 0,
|
|
19
|
+
}: {
|
|
20
|
+
ticks: ArrayLike<IGetBoundingClient> | null;
|
|
21
|
+
label: IGetBoundingClient | null | undefined;
|
|
22
|
+
labelGapWithTick: number | undefined;
|
|
23
|
+
tickSize: number | undefined;
|
|
24
|
+
tickMargin: number | undefined;
|
|
25
|
+
}): number => {
|
|
26
|
+
let maxTickWidth = 0;
|
|
27
|
+
if (ticks) {
|
|
28
|
+
Array.from(ticks).forEach((tickNode: IGetBoundingClient) => {
|
|
29
|
+
if (tickNode) {
|
|
30
|
+
const bbox = tickNode.getBoundingClientRect();
|
|
31
|
+
|
|
32
|
+
if (bbox.width > maxTickWidth) {
|
|
33
|
+
maxTickWidth = bbox.width;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const labelWidth = label ? label.getBoundingClientRect().width : 0;
|
|
39
|
+
|
|
40
|
+
const tickWidth = tickSize + tickMargin;
|
|
41
|
+
|
|
42
|
+
const updatedYAxisWidth =
|
|
43
|
+
maxTickWidth + tickWidth + labelWidth + (label ? labelGapWithTick : 0);
|
|
44
|
+
|
|
45
|
+
return Math.round(updatedYAxisWidth);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return 0;
|
|
49
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/types.ts `adaptEventHandlers` (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// recharts wraps each event handler found on a props object so it is invoked with
|
|
4
|
+
// `(props, event)` — the props object first, then the DOM event. Components like
|
|
5
|
+
// Curve spread `adaptEventHandlers(props)` onto their root element so a user's
|
|
6
|
+
// `<Line onClick={fn} />` ends up calling `fn(curveProps, event)`.
|
|
7
|
+
//
|
|
8
|
+
// DEVIATION from recharts: recharts also accepts a React element (via
|
|
9
|
+
// `isValidElement` + `element.props`). Solid has no element-props introspection
|
|
10
|
+
// (a rendered element is a DOM node, not a `{ props }` structure), so the element
|
|
11
|
+
// branch is deferred — mirroring `svgPropertiesAndEventsFromUnknown`, this accepts
|
|
12
|
+
// `unknown` and guards internally. Non-object inputs (function/boolean/null/array)
|
|
13
|
+
// return `null`, exactly as recharts.
|
|
14
|
+
import { isEventKey } from "./excludeEventProps";
|
|
15
|
+
|
|
16
|
+
type EventHandler = (e: Event) => void;
|
|
17
|
+
type RechartsEventHandler = (props: Record<string, unknown>, e: Event) => void;
|
|
18
|
+
|
|
19
|
+
/** Type guard giving an `unknown` value the recharts `(props, event)` call signature. */
|
|
20
|
+
function isRechartsEventHandler(value: unknown): value is RechartsEventHandler {
|
|
21
|
+
return typeof value === "function";
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Returns a record of the event handlers on `input`, each rewrapped to be called
|
|
26
|
+
* with `(props, event)`. Pass `newHandler` to replace every handler with one
|
|
27
|
+
* uniform callback (recharts uses this for synthetic forwarding). Returns `null`
|
|
28
|
+
* for non-object inputs.
|
|
29
|
+
*/
|
|
30
|
+
export function adaptEventHandlers(
|
|
31
|
+
input: unknown,
|
|
32
|
+
newHandler?: (e?: Event) => unknown,
|
|
33
|
+
): Record<string, EventHandler> | null {
|
|
34
|
+
if (input == null || typeof input !== "object" || Array.isArray(input)) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const inputProps: Record<string, unknown> = { ...input };
|
|
39
|
+
const out: Record<string, EventHandler> = {};
|
|
40
|
+
|
|
41
|
+
Object.keys(inputProps).forEach((key) => {
|
|
42
|
+
const value = inputProps[key];
|
|
43
|
+
if (isEventKey(key) && isRechartsEventHandler(value)) {
|
|
44
|
+
out[key] = newHandler ?? ((e: Event) => value(inputProps, e));
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Returns the raw (unwrapped) event handlers on `input`. Used by a parent component
|
|
53
|
+
* to forward a user's event props down to a child (e.g. Line → Curve) where the
|
|
54
|
+
* child's own `adaptEventHandlers` performs the props-first wrapping.
|
|
55
|
+
*/
|
|
56
|
+
export function pickEventHandlers(input: unknown): Record<string, unknown> {
|
|
57
|
+
if (input == null || typeof input !== "object" || Array.isArray(input)) {
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
const inputProps: Record<string, unknown> = { ...input };
|
|
61
|
+
const out: Record<string, unknown> = {};
|
|
62
|
+
Object.keys(inputProps).forEach((key) => {
|
|
63
|
+
const value = inputProps[key];
|
|
64
|
+
if (isEventKey(key) && typeof value === "function") {
|
|
65
|
+
out[key] = value;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/axisPropsAreEqual.ts (commit 7a23854).
|
|
2
|
+
import { AxisRange } from "../state/selectors/axisSelectors";
|
|
3
|
+
import { AxisDomain } from "./types";
|
|
4
|
+
import { propsAreEqual } from "./propsAreEqual";
|
|
5
|
+
|
|
6
|
+
function shortArraysAreEqual(
|
|
7
|
+
arr1: AxisDomain | AxisRange | undefined,
|
|
8
|
+
arr2: AxisDomain | AxisRange | undefined,
|
|
9
|
+
): boolean {
|
|
10
|
+
if (arr1 === arr2) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (Array.isArray(arr1) && arr1.length === 2 && Array.isArray(arr2) && arr2.length === 2) {
|
|
15
|
+
return arr1[0] === arr2[0] && arr1[1] === arr2[1];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function axisPropsAreEqual<
|
|
22
|
+
T extends Record<string, unknown> & {
|
|
23
|
+
domain?: AxisDomain;
|
|
24
|
+
range?: AxisRange;
|
|
25
|
+
},
|
|
26
|
+
>(prevProps: T, nextProps: T): boolean {
|
|
27
|
+
if (prevProps === nextProps) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
const { domain: prevDomain, range: prevRange, ...prevRest } = prevProps;
|
|
31
|
+
const { domain: nextDomain, range: nextRange, ...nextRest } = nextProps;
|
|
32
|
+
|
|
33
|
+
if (!shortArraysAreEqual(prevDomain, nextDomain)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (!shortArraysAreEqual(prevRange, nextRange)) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return propsAreEqual(prevRest, nextRest);
|
|
42
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Replaces es-toolkit core `sortBy` / `uniqBy` / `range` — faithful ports of
|
|
2
|
+
// the es-toolkit implementations (MIT), adapted to this repo's type discipline.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* es-toolkit `compareValues` (ascending): JS relational comparison of the
|
|
6
|
+
* mapped criterion values. Numbers and strings compare natively; mixed pairs
|
|
7
|
+
* fall back to numeric coercion, mirroring the abstract `<`/`>` semantics.
|
|
8
|
+
*/
|
|
9
|
+
function compareValues(a: unknown, b: unknown): number {
|
|
10
|
+
if (typeof a === "number" && typeof b === "number") {
|
|
11
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
12
|
+
}
|
|
13
|
+
if (typeof a === "string" && typeof b === "string") {
|
|
14
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
15
|
+
}
|
|
16
|
+
const an = Number(a);
|
|
17
|
+
const bn = Number(b);
|
|
18
|
+
if (!Number.isNaN(an) && !Number.isNaN(bn)) {
|
|
19
|
+
return an < bn ? -1 : an > bn ? 1 : 0;
|
|
20
|
+
}
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Sorts by the given criteria (object keys or mapper functions), ascending.
|
|
26
|
+
* Stable: ties keep their original order (native sort is stable per ES2019).
|
|
27
|
+
*/
|
|
28
|
+
export function sortBy<T extends object>(
|
|
29
|
+
arr: readonly T[],
|
|
30
|
+
criteria: Array<((item: T) => unknown) | keyof T>,
|
|
31
|
+
): T[] {
|
|
32
|
+
const mapped = arr.map((item) => ({
|
|
33
|
+
item,
|
|
34
|
+
keys: criteria.map((c) => (typeof c === "function" ? c(item) : item[c])),
|
|
35
|
+
}));
|
|
36
|
+
mapped.sort((a, b) => {
|
|
37
|
+
for (let i = 0; i < a.keys.length; i++) {
|
|
38
|
+
const order = compareValues(a.keys[i], b.keys[i]);
|
|
39
|
+
if (order !== 0) {
|
|
40
|
+
return order;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return 0;
|
|
44
|
+
});
|
|
45
|
+
return mapped.map((m) => m.item);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Unique elements by mapped key; the FIRST occurrence of each key is kept.
|
|
50
|
+
* Keys compare by Map semantics (SameValueZero).
|
|
51
|
+
*/
|
|
52
|
+
export function uniqBy<T, U>(
|
|
53
|
+
arr: readonly T[],
|
|
54
|
+
mapper: (item: T, index: number, array: readonly T[]) => U,
|
|
55
|
+
): T[] {
|
|
56
|
+
const map = new Map<U, T>();
|
|
57
|
+
let index = 0;
|
|
58
|
+
for (const item of arr) {
|
|
59
|
+
const key = mapper(item, index, arr);
|
|
60
|
+
if (!map.has(key)) {
|
|
61
|
+
map.set(key, item);
|
|
62
|
+
}
|
|
63
|
+
index++;
|
|
64
|
+
}
|
|
65
|
+
return Array.from(map.values());
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Integers from `start` (inclusive) to `end` (exclusive), step 1. */
|
|
69
|
+
export function range(start: number, end?: number, step = 1): number[] {
|
|
70
|
+
if (end == null) {
|
|
71
|
+
end = start;
|
|
72
|
+
start = 0;
|
|
73
|
+
}
|
|
74
|
+
if (!Number.isInteger(step) || step === 0) {
|
|
75
|
+
throw new Error("The step value must be a non-zero integer.");
|
|
76
|
+
}
|
|
77
|
+
const length = Math.max(Math.ceil((end - start) / step), 0);
|
|
78
|
+
const result: number[] = new Array<number>(length);
|
|
79
|
+
for (let i = 0; i < length; i++) {
|
|
80
|
+
result[i] = start + i * step;
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/util/createCartesianCharts.tsx.
|
|
2
|
+
// Solid-native: React.ComponentType → `(props) => JSX.Element`. The layout
|
|
3
|
+
// binding wrapper spreads the user props then sets `layout` as a static
|
|
4
|
+
// attribute LAST, so the bound layout wins over any passed value; the public
|
|
5
|
+
// type omits `layout` so TS rejects it too.
|
|
6
|
+
import type { JSX } from "@solidjs/web";
|
|
7
|
+
import { AreaChart as OriginalAreaChart } from "../chart/AreaChart";
|
|
8
|
+
import { BarChart as OriginalBarChart } from "../chart/BarChart";
|
|
9
|
+
import { LineChart as OriginalLineChart } from "../chart/LineChart";
|
|
10
|
+
import { ComposedChart as OriginalComposedChart } from "../chart/ComposedChart";
|
|
11
|
+
import { ScatterChart as OriginalScatterChart } from "../chart/ScatterChart";
|
|
12
|
+
import { FunnelChart as OriginalFunnelChart } from "../chart/FunnelChart";
|
|
13
|
+
import type { CartesianChartProps } from "./types";
|
|
14
|
+
|
|
15
|
+
type Component<P> = (props: P) => JSX.Element;
|
|
16
|
+
type ChartComponent<TData> = Component<Omit<CartesianChartProps<TData>, "layout">>;
|
|
17
|
+
|
|
18
|
+
export type TypedHorizontalChartContext<TData, _TCategorical, _TNumerical, TComponents> = {
|
|
19
|
+
AreaChart: ChartComponent<TData>;
|
|
20
|
+
BarChart: ChartComponent<TData>;
|
|
21
|
+
LineChart: ChartComponent<TData>;
|
|
22
|
+
ComposedChart: ChartComponent<TData>;
|
|
23
|
+
ScatterChart: ChartComponent<TData>;
|
|
24
|
+
} & Omit<TComponents, "Funnel" | "FunnelChart">;
|
|
25
|
+
|
|
26
|
+
export type TypedVerticalChartContext<TData, _TCategorical, _TNumerical, TComponents> = {
|
|
27
|
+
AreaChart: ChartComponent<TData>;
|
|
28
|
+
BarChart: ChartComponent<TData>;
|
|
29
|
+
LineChart: ChartComponent<TData>;
|
|
30
|
+
ComposedChart: ChartComponent<TData>;
|
|
31
|
+
ScatterChart: ChartComponent<TData>;
|
|
32
|
+
FunnelChart: ChartComponent<TData>;
|
|
33
|
+
} & TComponents;
|
|
34
|
+
|
|
35
|
+
const createCartesianCharts = <TData,>(
|
|
36
|
+
layout: "horizontal" | "vertical",
|
|
37
|
+
): {
|
|
38
|
+
AreaChart: ChartComponent<TData>;
|
|
39
|
+
BarChart: ChartComponent<TData>;
|
|
40
|
+
LineChart: ChartComponent<TData>;
|
|
41
|
+
ComposedChart: ChartComponent<TData>;
|
|
42
|
+
ScatterChart: ChartComponent<TData>;
|
|
43
|
+
} => ({
|
|
44
|
+
AreaChart: (props) => <OriginalAreaChart {...props} layout={layout} />,
|
|
45
|
+
BarChart: (props) => <OriginalBarChart {...props} layout={layout} />,
|
|
46
|
+
LineChart: (props) => <OriginalLineChart {...props} layout={layout} />,
|
|
47
|
+
ComposedChart: (props) => <OriginalComposedChart {...props} layout={layout} />,
|
|
48
|
+
ScatterChart: (props) => <OriginalScatterChart {...props} layout={layout} />,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
export type NoFunnel<T> = "Funnel" extends keyof T
|
|
52
|
+
? never
|
|
53
|
+
: "FunnelChart" extends keyof T
|
|
54
|
+
? never
|
|
55
|
+
: T;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Creates a typed context for horizontal Cartesian charts. Curries the chart
|
|
59
|
+
* definition to statically bind `layout="horizontal"`. Rejects strictly vertical
|
|
60
|
+
* components (`Funnel`, `FunnelChart`) at compile time.
|
|
61
|
+
*
|
|
62
|
+
* @since 3.8
|
|
63
|
+
*/
|
|
64
|
+
export function createHorizontalChart<TData, TCategorical = string, TNumerical = number>() {
|
|
65
|
+
return function withComponents<TComponents extends Record<string, unknown>>(
|
|
66
|
+
components: NoFunnel<TComponents>,
|
|
67
|
+
): TypedHorizontalChartContext<TData, TCategorical, TNumerical, TComponents> {
|
|
68
|
+
// The wrapper-chart map + the caller's components don't structurally match the
|
|
69
|
+
// mapped result type (component identity is preserved at runtime, remapped only
|
|
70
|
+
// at the type level), so the unsound cast is intentional — same as recharts.
|
|
71
|
+
// eslint-disable-next-line typescript/consistent-type-assertions -- runtime identity preserved; type is a remap
|
|
72
|
+
return {
|
|
73
|
+
...createCartesianCharts<TData>("horizontal"),
|
|
74
|
+
// eslint-disable-next-line typescript/consistent-type-assertions -- NoFunnel<T> narrows to T at runtime
|
|
75
|
+
...(components as TComponents),
|
|
76
|
+
} as unknown as TypedHorizontalChartContext<TData, TCategorical, TNumerical, TComponents>;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Creates a typed context for vertical Cartesian charts. Curries the chart
|
|
82
|
+
* definition to statically bind `layout="vertical"`. Natively supports strictly
|
|
83
|
+
* vertical components like `Funnel` and `FunnelChart`.
|
|
84
|
+
*
|
|
85
|
+
* @since 3.8
|
|
86
|
+
*/
|
|
87
|
+
export function createVerticalChart<TData, TCategorical = string, TNumerical = number>() {
|
|
88
|
+
return function withComponents<TComponents extends Record<string, unknown>>(
|
|
89
|
+
components: TComponents,
|
|
90
|
+
): TypedVerticalChartContext<TData, TCategorical, TNumerical, TComponents> {
|
|
91
|
+
const FunnelChart: ChartComponent<TData> = (props) => (
|
|
92
|
+
<OriginalFunnelChart {...props} layout="vertical" />
|
|
93
|
+
);
|
|
94
|
+
// eslint-disable-next-line typescript/consistent-type-assertions -- runtime identity preserved; type is a remap
|
|
95
|
+
return {
|
|
96
|
+
...createCartesianCharts<TData>("vertical"),
|
|
97
|
+
FunnelChart,
|
|
98
|
+
...components,
|
|
99
|
+
} as unknown as TypedVerticalChartContext<TData, TCategorical, TNumerical, TComponents>;
|
|
100
|
+
};
|
|
101
|
+
}
|