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,33 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/polar/defaultPolarAngleAxisProps.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// DEVIATION: recharts types this `as const satisfies Props` (Props from
|
|
4
|
+
// PolarAngleAxis). The PolarAngleAxis component is deferred to a follow-up, so
|
|
5
|
+
// for now the object is typed only `as const`; when the component lands its
|
|
6
|
+
// `Props` will pin these via `satisfies`. The values are byte-identical to
|
|
7
|
+
// recharts. Consumed by polarAxisSelectors' implicitAngleAxis (and, later, the
|
|
8
|
+
// component's default-props merge).
|
|
9
|
+
import { DefaultZIndexes } from "../zIndex/DefaultZIndexes";
|
|
10
|
+
|
|
11
|
+
export const defaultPolarAngleAxisProps = {
|
|
12
|
+
allowDecimals: false,
|
|
13
|
+
allowDuplicatedCategory: true, // see recharts note: false breaks Radar tooltip sync
|
|
14
|
+
allowDataOverflow: false,
|
|
15
|
+
angle: 0,
|
|
16
|
+
angleAxisId: 0,
|
|
17
|
+
axisLine: true,
|
|
18
|
+
axisLineType: "polygon",
|
|
19
|
+
cx: 0,
|
|
20
|
+
cy: 0,
|
|
21
|
+
hide: false,
|
|
22
|
+
includeHidden: false,
|
|
23
|
+
label: false,
|
|
24
|
+
niceTicks: "auto",
|
|
25
|
+
orientation: "outer",
|
|
26
|
+
reversed: false,
|
|
27
|
+
scale: "auto",
|
|
28
|
+
tick: true,
|
|
29
|
+
tickLine: true,
|
|
30
|
+
tickSize: 8,
|
|
31
|
+
type: "auto",
|
|
32
|
+
zIndex: DefaultZIndexes.axis,
|
|
33
|
+
} as const;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/polar/defaultPolarRadiusAxisProps.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// DEVIATION: typed only `as const` for now (PolarRadiusAxis component deferred);
|
|
4
|
+
// when it lands its `Props` pins these via `satisfies`. Values byte-identical to
|
|
5
|
+
// recharts. Consumed by polarAxisSelectors' implicitRadiusAxis.
|
|
6
|
+
import { DefaultZIndexes } from "../zIndex/DefaultZIndexes";
|
|
7
|
+
|
|
8
|
+
export const defaultPolarRadiusAxisProps = {
|
|
9
|
+
allowDataOverflow: false,
|
|
10
|
+
allowDecimals: false,
|
|
11
|
+
allowDuplicatedCategory: true,
|
|
12
|
+
angle: 0,
|
|
13
|
+
axisLine: true,
|
|
14
|
+
includeHidden: false,
|
|
15
|
+
hide: false,
|
|
16
|
+
niceTicks: "auto",
|
|
17
|
+
label: false,
|
|
18
|
+
orientation: "right",
|
|
19
|
+
radiusAxisId: 0,
|
|
20
|
+
reversed: false,
|
|
21
|
+
scale: "auto",
|
|
22
|
+
stroke: "#ccc",
|
|
23
|
+
tick: true,
|
|
24
|
+
tickCount: 5,
|
|
25
|
+
tickLine: true,
|
|
26
|
+
type: "auto",
|
|
27
|
+
zIndex: DefaultZIndexes.axis,
|
|
28
|
+
} as const;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileOverview Cross
|
|
3
|
+
*
|
|
4
|
+
* Ported from recharts 3.8.1 src/shape/Cross.tsx (commit 7a23854).
|
|
5
|
+
* Solid deviations: `className` (recharts) → `class: string` (and Omit the wide
|
|
6
|
+
* SVG `class` so the array form typechecks); destructuring defaults → `?? 0`
|
|
7
|
+
* accessors; `clsx` → `class={[...]}`; `return null` → `<Show>`.
|
|
8
|
+
*/
|
|
9
|
+
import { type CamelSvgProps } from "../util/svgPropertiesNoEvents";
|
|
10
|
+
import { Show, omit } from "solid-js";
|
|
11
|
+
import type { JSX } from "@solidjs/web";
|
|
12
|
+
import { isNumber } from "../util/DataUtils";
|
|
13
|
+
import { svgPropertiesAndEvents } from "../util/svgPropertiesAndEvents";
|
|
14
|
+
|
|
15
|
+
interface CrossOwnProps {
|
|
16
|
+
/** The x-coordinate of the vertical line of the cross in pixels. */
|
|
17
|
+
x?: number;
|
|
18
|
+
/** The y-coordinate of the horizontal line of the cross in pixels. */
|
|
19
|
+
y?: number;
|
|
20
|
+
/** Width of the cross in pixels. */
|
|
21
|
+
width?: number;
|
|
22
|
+
/** Height of the cross in pixels. */
|
|
23
|
+
height?: number;
|
|
24
|
+
/** The y-coordinate of the top left point in the boundary box of the cross. */
|
|
25
|
+
top?: number;
|
|
26
|
+
/** The x-coordinate of the top left point in the boundary box of the cross. */
|
|
27
|
+
left?: number;
|
|
28
|
+
class?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type CrossProps = Omit<CamelSvgProps<JSX.PathSVGAttributes<SVGPathElement>>, "class"> &
|
|
32
|
+
CrossOwnProps;
|
|
33
|
+
|
|
34
|
+
const getPath = (
|
|
35
|
+
x: number,
|
|
36
|
+
y: number,
|
|
37
|
+
width: number,
|
|
38
|
+
height: number,
|
|
39
|
+
top: number,
|
|
40
|
+
left: number,
|
|
41
|
+
): string => {
|
|
42
|
+
return `M${x},${top}v${height}M${left},${y}h${width}`;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const Cross = (props: CrossProps): JSX.Element => {
|
|
46
|
+
const x = (): number => props.x ?? 0;
|
|
47
|
+
const y = (): number => props.y ?? 0;
|
|
48
|
+
const top = (): number => props.top ?? 0;
|
|
49
|
+
const left = (): number => props.left ?? 0;
|
|
50
|
+
const width = (): number => props.width ?? 0;
|
|
51
|
+
const height = (): number => props.height ?? 0;
|
|
52
|
+
|
|
53
|
+
const valid = (): boolean =>
|
|
54
|
+
isNumber(x()) &&
|
|
55
|
+
isNumber(y()) &&
|
|
56
|
+
isNumber(width()) &&
|
|
57
|
+
isNumber(height()) &&
|
|
58
|
+
isNumber(top()) &&
|
|
59
|
+
isNumber(left());
|
|
60
|
+
|
|
61
|
+
// recharts spreads `{ x, y, top, left, width, height, ...rest }` through the
|
|
62
|
+
// SVG-prop filter; only allowlisted keys (x, y, width, height, …) survive onto
|
|
63
|
+
// the <path>. `top`/`left`/`class` are filtered/handled separately.
|
|
64
|
+
const passthrough = (): Record<string, unknown> => ({
|
|
65
|
+
...omit(props, "class"),
|
|
66
|
+
x: x(),
|
|
67
|
+
y: y(),
|
|
68
|
+
top: top(),
|
|
69
|
+
left: left(),
|
|
70
|
+
width: width(),
|
|
71
|
+
height: height(),
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<Show when={valid()}>
|
|
76
|
+
<path
|
|
77
|
+
{...svgPropertiesAndEvents(passthrough())}
|
|
78
|
+
class={["recharts-cross", props.class]}
|
|
79
|
+
d={getPath(x(), y(), width(), height(), top(), left())}
|
|
80
|
+
/>
|
|
81
|
+
</Show>
|
|
82
|
+
);
|
|
83
|
+
};
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileOverview Curve
|
|
3
|
+
*
|
|
4
|
+
* Ported from recharts 3.8.1 src/shape/Curve.tsx (commit 7a23854).
|
|
5
|
+
* Pure `getPath`/`getCurveFactory` helpers copied verbatim (modulo type
|
|
6
|
+
* adjustments). Solid deviations:
|
|
7
|
+
* - `className` → `class` (Omit the wide SVG `class`); `clsx` → `class={[...]}`.
|
|
8
|
+
* - `resolveDefaultProps` → `merge()` defaults via per-prop `?? default`.
|
|
9
|
+
* - `React.forwardRef` → `ref?: SVGPathElement | ((el: SVGPathElement) => void)`.
|
|
10
|
+
* - `return null` → `<Show>`.
|
|
11
|
+
* - `useChartLayout()` returns `Accessor<LayoutType | undefined>` in Solid.
|
|
12
|
+
* - `svgPropertiesNoEvents(props)` (attributes) + `adaptEventHandlers(props)`
|
|
13
|
+
* (events, rewrapped props-first) — same split as recharts Curve.
|
|
14
|
+
* - `noUncheckedIndexedAccess`: `baseLine[index]` is `NullableCoordinate | undefined`
|
|
15
|
+
* but the `base?:` field in `NullableAreaPoint` already accepts `undefined`.
|
|
16
|
+
* - Two `@ts-expect-error` from recharts kept: d3's `defined()` changes the
|
|
17
|
+
* generic type internally but its typings don't reflect that.
|
|
18
|
+
*/
|
|
19
|
+
import { type CamelSvgProps } from "../util/svgPropertiesNoEvents";
|
|
20
|
+
import { Show, omit } from "solid-js";
|
|
21
|
+
import type { JSX } from "@solidjs/web";
|
|
22
|
+
import {
|
|
23
|
+
area as shapeArea,
|
|
24
|
+
type Area as D3AreaCurve,
|
|
25
|
+
curveBasis,
|
|
26
|
+
curveBasisClosed,
|
|
27
|
+
curveBasisOpen,
|
|
28
|
+
curveBumpX,
|
|
29
|
+
curveBumpY,
|
|
30
|
+
type CurveFactory,
|
|
31
|
+
curveLinear,
|
|
32
|
+
curveLinearClosed,
|
|
33
|
+
curveMonotoneX,
|
|
34
|
+
curveMonotoneY,
|
|
35
|
+
curveNatural,
|
|
36
|
+
curveStep,
|
|
37
|
+
curveStepAfter,
|
|
38
|
+
curveStepBefore,
|
|
39
|
+
line as shapeLine,
|
|
40
|
+
type Line as D3LineCurve,
|
|
41
|
+
} from "victory-vendor/d3-shape";
|
|
42
|
+
import { isNumber, upperFirst } from "../util/DataUtils";
|
|
43
|
+
import { isWellBehavedNumber } from "../util/isWellBehavedNumber";
|
|
44
|
+
import { svgPropertiesNoEvents } from "../util/svgPropertiesNoEvents";
|
|
45
|
+
import { adaptEventHandlers } from "../util/adaptEventHandlers";
|
|
46
|
+
import { useChartLayout } from "../context/chartLayoutContext";
|
|
47
|
+
import type { Coordinate, LayoutType, NullableCoordinate } from "../util/types";
|
|
48
|
+
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Curve factory lookup
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
|
|
53
|
+
interface CurveFactories {
|
|
54
|
+
[index: string]: CurveFactory;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const CURVE_FACTORIES: CurveFactories = {
|
|
58
|
+
curveBasisClosed,
|
|
59
|
+
curveBasisOpen,
|
|
60
|
+
curveBasis,
|
|
61
|
+
curveBumpX,
|
|
62
|
+
curveBumpY,
|
|
63
|
+
curveLinearClosed,
|
|
64
|
+
curveLinear,
|
|
65
|
+
curveMonotoneX,
|
|
66
|
+
curveMonotoneY,
|
|
67
|
+
curveNatural,
|
|
68
|
+
curveStep,
|
|
69
|
+
curveStepAfter,
|
|
70
|
+
curveStepBefore,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @inline
|
|
75
|
+
*/
|
|
76
|
+
export type CurveType =
|
|
77
|
+
| "basis"
|
|
78
|
+
| "basisClosed"
|
|
79
|
+
| "basisOpen"
|
|
80
|
+
| "bumpX"
|
|
81
|
+
| "bumpY"
|
|
82
|
+
| "bump"
|
|
83
|
+
| "linear"
|
|
84
|
+
| "linearClosed"
|
|
85
|
+
| "natural"
|
|
86
|
+
| "monotoneX"
|
|
87
|
+
| "monotoneY"
|
|
88
|
+
| "monotone"
|
|
89
|
+
| "step"
|
|
90
|
+
| "stepBefore"
|
|
91
|
+
| "stepAfter"
|
|
92
|
+
| CurveFactory;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @inline
|
|
96
|
+
*/
|
|
97
|
+
export type BaseLineType = number | ReadonlyArray<NullableCoordinate>;
|
|
98
|
+
|
|
99
|
+
type AreaPoint = Coordinate & { base: Coordinate };
|
|
100
|
+
type NullableAreaPoint = NullableCoordinate & { base?: NullableCoordinate };
|
|
101
|
+
|
|
102
|
+
const defined = (p: NullableCoordinate): p is Coordinate =>
|
|
103
|
+
isWellBehavedNumber(p.x) && isWellBehavedNumber(p.y);
|
|
104
|
+
|
|
105
|
+
const areaDefined = (d: NullableAreaPoint): d is AreaPoint =>
|
|
106
|
+
d.base != null && defined(d.base) && defined(d);
|
|
107
|
+
|
|
108
|
+
const getX = (p: Coordinate): number => p.x;
|
|
109
|
+
const getY = (p: Coordinate): number => p.y;
|
|
110
|
+
|
|
111
|
+
const getCurveFactory = (type: CurveType, layout: LayoutType | undefined): CurveFactory => {
|
|
112
|
+
if (typeof type === "function") {
|
|
113
|
+
return type;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const name = `curve${upperFirst(type)}`;
|
|
117
|
+
|
|
118
|
+
if ((name === "curveMonotone" || name === "curveBump") && layout) {
|
|
119
|
+
const factory = CURVE_FACTORIES[`${name}${layout === "vertical" ? "Y" : "X"}`];
|
|
120
|
+
if (factory) {
|
|
121
|
+
return factory;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return CURVE_FACTORIES[name] ?? curveLinear;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// getPath — exported pure helper
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
|
|
131
|
+
type GetPathProps = Pick<CurveOwnProps, "type" | "points" | "baseLine" | "layout" | "connectNulls">;
|
|
132
|
+
|
|
133
|
+
export const defaultCurveProps = {
|
|
134
|
+
connectNulls: false,
|
|
135
|
+
type: "linear",
|
|
136
|
+
} as const satisfies Partial<CurveOwnProps>;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Calculate the path of curve. Returns null if points is an empty array.
|
|
140
|
+
* @return path or null
|
|
141
|
+
*/
|
|
142
|
+
export const getPath = ({
|
|
143
|
+
type = defaultCurveProps.type,
|
|
144
|
+
points = [],
|
|
145
|
+
baseLine,
|
|
146
|
+
layout,
|
|
147
|
+
connectNulls = defaultCurveProps.connectNulls,
|
|
148
|
+
}: GetPathProps): string | null => {
|
|
149
|
+
const curveFactory = getCurveFactory(type, layout);
|
|
150
|
+
const formatPoints: ReadonlyArray<NullableCoordinate> = connectNulls
|
|
151
|
+
? points.filter(defined)
|
|
152
|
+
: points;
|
|
153
|
+
|
|
154
|
+
// When dealing with an area chart (where `baseLine` is an array),
|
|
155
|
+
// we need to pair points with their corresponding `baseLine` points first.
|
|
156
|
+
// This is to ensure that we filter points and their baseline counterparts together,
|
|
157
|
+
// preventing errors from mismatched array lengths and ensuring `defined` checks both.
|
|
158
|
+
// Narrow to the array form by EXCLUDING number/nullish rather than
|
|
159
|
+
// `Array.isArray` — the latter widens a ReadonlyArray to `any[]` (a TS
|
|
160
|
+
// limitation), which would make `baseLine[index]` an unsafe `any`. After this
|
|
161
|
+
// guard, baseLine is `ReadonlyArray<NullableCoordinate>`.
|
|
162
|
+
if (typeof baseLine !== "number" && baseLine != null) {
|
|
163
|
+
let lineFunction: D3AreaCurve<AreaPoint>;
|
|
164
|
+
|
|
165
|
+
// noUncheckedIndexedAccess: baseLine[index] is NullableCoordinate | undefined,
|
|
166
|
+
// which is compatible with `base?: NullableCoordinate` in NullableAreaPoint.
|
|
167
|
+
const areaPoints: ReadonlyArray<NullableAreaPoint> = points.map((entry, index) => ({
|
|
168
|
+
...entry,
|
|
169
|
+
base: baseLine[index],
|
|
170
|
+
}));
|
|
171
|
+
|
|
172
|
+
if (layout === "vertical") {
|
|
173
|
+
lineFunction = shapeArea<AreaPoint>()
|
|
174
|
+
.y(getY)
|
|
175
|
+
.x1(getX)
|
|
176
|
+
.x0((d) => d.base.x);
|
|
177
|
+
} else {
|
|
178
|
+
lineFunction = shapeArea<AreaPoint>()
|
|
179
|
+
.x(getX)
|
|
180
|
+
.y1(getY)
|
|
181
|
+
.y0((d) => d.base.y);
|
|
182
|
+
}
|
|
183
|
+
/*
|
|
184
|
+
* What happens here is that the `.defined()` call will make it so that this function can accept
|
|
185
|
+
* nullable points, and internally it will filter them out and skip when generating the path.
|
|
186
|
+
* So on the input it accepts NullableCoordinate, but it never calls getX/getY on null points because of the defined() filter.
|
|
187
|
+
*
|
|
188
|
+
* The d3 type definition has only one generic so it doesn't allow to describe this properly.
|
|
189
|
+
* However. d3 types are mutable, but we can pretend that they are not, and we can pretend
|
|
190
|
+
* that calling defined() returns a new function with a different generic type.
|
|
191
|
+
*/
|
|
192
|
+
// @ts-expect-error the defined call changes the generic type internally but d3 types don't reflect that
|
|
193
|
+
const nullableLineFunction: D3AreaCurve<NullableAreaPoint> = lineFunction
|
|
194
|
+
.defined(areaDefined)
|
|
195
|
+
.curve(curveFactory);
|
|
196
|
+
|
|
197
|
+
const finalPoints: ReadonlyArray<NullableAreaPoint> = connectNulls
|
|
198
|
+
? areaPoints.filter(areaDefined)
|
|
199
|
+
: areaPoints;
|
|
200
|
+
|
|
201
|
+
return nullableLineFunction(finalPoints);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
let lineFunction: D3LineCurve<Coordinate> | D3AreaCurve<Coordinate>;
|
|
205
|
+
if (layout === "vertical" && isNumber(baseLine)) {
|
|
206
|
+
lineFunction = shapeArea<Coordinate>().y(getY).x1(getX).x0(baseLine);
|
|
207
|
+
} else if (isNumber(baseLine)) {
|
|
208
|
+
lineFunction = shapeArea<Coordinate>().x(getX).y1(getY).y0(baseLine);
|
|
209
|
+
} else {
|
|
210
|
+
lineFunction = shapeLine<Coordinate>().x(getX).y(getY);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// @ts-expect-error the defined call changes the generic type internally but d3 types don't reflect that
|
|
214
|
+
const nullableLineFunction: D3LineCurve<NullableCoordinate> = lineFunction
|
|
215
|
+
.defined(defined)
|
|
216
|
+
.curve(curveFactory);
|
|
217
|
+
|
|
218
|
+
return nullableLineFunction(formatPoints);
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Props
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
|
|
225
|
+
interface CurveOwnProps {
|
|
226
|
+
class?: string;
|
|
227
|
+
/**
|
|
228
|
+
* The interpolation type of curve. Allows custom interpolation function.
|
|
229
|
+
*
|
|
230
|
+
* @defaultValue linear
|
|
231
|
+
* @link https://d3js.org/d3-shape/curve
|
|
232
|
+
*/
|
|
233
|
+
type?: CurveType;
|
|
234
|
+
/**
|
|
235
|
+
* This option affects the interpolation algorithm when the `type` prop is set to 'monotone'.
|
|
236
|
+
* It also specifies the type of baseline when the curve is closed.
|
|
237
|
+
*/
|
|
238
|
+
layout?: LayoutType;
|
|
239
|
+
/**
|
|
240
|
+
* Baseline of the area:
|
|
241
|
+
* - number: uses the corresponding axis value as a flat baseline;
|
|
242
|
+
* - an array of coordinates: describes a custom baseline path.
|
|
243
|
+
*/
|
|
244
|
+
baseLine?: BaseLineType;
|
|
245
|
+
/**
|
|
246
|
+
* The coordinates of all the points in the curve, like an array of objects with x and y coordinates.
|
|
247
|
+
*/
|
|
248
|
+
points?: ReadonlyArray<NullableCoordinate>;
|
|
249
|
+
/**
|
|
250
|
+
* Whether to connect the curve across null points.
|
|
251
|
+
*
|
|
252
|
+
* @defaultValue false
|
|
253
|
+
*/
|
|
254
|
+
connectNulls?: boolean;
|
|
255
|
+
path?: string;
|
|
256
|
+
/**
|
|
257
|
+
* Ref callback or element ref for the underlying <path> element.
|
|
258
|
+
* (Replaces React's `pathRef: Ref<SVGPathElement>`.)
|
|
259
|
+
*/
|
|
260
|
+
pathRef?: SVGPathElement | ((el: SVGPathElement) => void);
|
|
261
|
+
/**
|
|
262
|
+
* The pattern of dashes and gaps used to paint the line.
|
|
263
|
+
*
|
|
264
|
+
* @example strokeDasharray="5 5"
|
|
265
|
+
* @example strokeDasharray={10}
|
|
266
|
+
*/
|
|
267
|
+
strokeDasharray?: string | number;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export type CurveProps = Omit<CamelSvgProps<JSX.PathSVGAttributes<SVGPathElement>>, "class"> &
|
|
271
|
+
CurveOwnProps;
|
|
272
|
+
|
|
273
|
+
// ---------------------------------------------------------------------------
|
|
274
|
+
// Component
|
|
275
|
+
// ---------------------------------------------------------------------------
|
|
276
|
+
|
|
277
|
+
export const Curve = (props: CurveProps): JSX.Element => {
|
|
278
|
+
const layoutFromContext = useChartLayout();
|
|
279
|
+
|
|
280
|
+
const hasPoints = (): boolean => props.points != null && props.points.length > 0;
|
|
281
|
+
const hasPath = (): boolean => props.path != null && props.path.length > 0;
|
|
282
|
+
|
|
283
|
+
const realPath = (): string | null | undefined => {
|
|
284
|
+
if (hasPoints()) {
|
|
285
|
+
return getPath({
|
|
286
|
+
type: props.type,
|
|
287
|
+
points: props.points,
|
|
288
|
+
baseLine: props.baseLine,
|
|
289
|
+
layout: props.layout ?? layoutFromContext(),
|
|
290
|
+
connectNulls: props.connectNulls,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
return props.path;
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
// Convert null → undefined so the `d` attr is simply omitted (null is not a
|
|
297
|
+
// valid SVG attribute value here, but d3 can return null for empty point sets).
|
|
298
|
+
const dAttr = (): string | undefined => {
|
|
299
|
+
const p = realPath();
|
|
300
|
+
return p === null ? undefined : p;
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
// `strokeDasharray` (camelCase) is forwarded by the spread — svgPropertiesNoEvents
|
|
304
|
+
// renames it to the kebab `stroke-dasharray` DOM attribute (see svg-attribute-rename).
|
|
305
|
+
const others = (): Record<string, unknown> => ({
|
|
306
|
+
...omit(
|
|
307
|
+
props,
|
|
308
|
+
"class",
|
|
309
|
+
"type",
|
|
310
|
+
"layout",
|
|
311
|
+
"baseLine",
|
|
312
|
+
"points",
|
|
313
|
+
"connectNulls",
|
|
314
|
+
"path",
|
|
315
|
+
"pathRef",
|
|
316
|
+
),
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
// recharts Curve spreads `svgPropertiesNoEvents(props)` for attributes and
|
|
320
|
+
// `adaptEventHandlers(props)` for events — the latter rewraps each handler to be
|
|
321
|
+
// called with `(props, event)` (props-first). We mirror that split: attributes
|
|
322
|
+
// from `others()` (the manual omit), events from the FULL props so handlers
|
|
323
|
+
// receive the complete curve props as recharts does (Line.spec relies on this).
|
|
324
|
+
return (
|
|
325
|
+
<Show when={hasPoints() || hasPath()}>
|
|
326
|
+
<path
|
|
327
|
+
{...svgPropertiesNoEvents(others())}
|
|
328
|
+
{...(adaptEventHandlers(props) ?? {})}
|
|
329
|
+
class={["recharts-curve", props.class]}
|
|
330
|
+
d={dAttr()}
|
|
331
|
+
ref={props.pathRef}
|
|
332
|
+
/>
|
|
333
|
+
</Show>
|
|
334
|
+
);
|
|
335
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type CamelSvgProps } from "../util/svgPropertiesNoEvents";
|
|
2
|
+
import { svgPropertiesAndEvents } from "../util/svgPropertiesAndEvents";
|
|
3
|
+
import { Show, omit } from "solid-js";
|
|
4
|
+
import type { JSX } from "@solidjs/web";
|
|
5
|
+
import { isNumber } from "../util/DataUtils";
|
|
6
|
+
|
|
7
|
+
interface DotOwnProps {
|
|
8
|
+
/** The x-coordinate of center, in pixels. */
|
|
9
|
+
cx?: number;
|
|
10
|
+
/** The y-coordinate of center, in pixels. */
|
|
11
|
+
cy?: number;
|
|
12
|
+
/** The radius of the dot. */
|
|
13
|
+
r?: number | string;
|
|
14
|
+
clipDot?: boolean;
|
|
15
|
+
/** Maps to recharts' `className` (a plain string); the array `class` form below merges it. */
|
|
16
|
+
class?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Props parity with recharts DotProps; `class` is the only framework-idiomatic deviation
|
|
20
|
+
// (recharts' public prop is `className: string`). We Omit the wide SVG `class` so our
|
|
21
|
+
// `class` stays `string`, matching recharts and keeping the native array `class` form typed.
|
|
22
|
+
export type DotProps = Omit<
|
|
23
|
+
CamelSvgProps<JSX.CircleSVGAttributes<SVGCircleElement>>,
|
|
24
|
+
"cx" | "cy" | "r" | "class"
|
|
25
|
+
> &
|
|
26
|
+
DotOwnProps;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Renders a dot. Accepts X/Y coordinates in pixels; for data-positioned dots use ReferenceDot.
|
|
30
|
+
*
|
|
31
|
+
* Solid handles event props (onClick, ...) via delegation, so they never render as attributes —
|
|
32
|
+
* recharts achieves the same via svgPropertiesNoEvents + adaptEventHandlers. clipDot is omitted
|
|
33
|
+
* because it is not a valid SVG attribute.
|
|
34
|
+
*/
|
|
35
|
+
export const Dot = (props: DotProps) => {
|
|
36
|
+
const rest = omit(props, "class", "cx", "cy", "r", "clipDot");
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<Show when={isNumber(props.cx) && isNumber(props.cy) && isNumber(props.r)}>
|
|
40
|
+
<circle
|
|
41
|
+
{...svgPropertiesAndEvents({ ...rest })}
|
|
42
|
+
class={["recharts-dot", props.class]}
|
|
43
|
+
cx={props.cx}
|
|
44
|
+
cy={props.cy}
|
|
45
|
+
r={props.r}
|
|
46
|
+
/>
|
|
47
|
+
</Show>
|
|
48
|
+
);
|
|
49
|
+
};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileOverview Polygon
|
|
3
|
+
*
|
|
4
|
+
* Ported from recharts 3.8.1 src/shape/Polygon.tsx (commit 7a23854).
|
|
5
|
+
* Pure path helpers are copied verbatim. Solid deviations: `className` → `class`
|
|
6
|
+
* (Omit the wide SVG `class`); no destructuring (use `omit` + a keyed `<Show>`
|
|
7
|
+
* to narrow `points` without a non-null `!`); `clsx` → `class={[...]}`;
|
|
8
|
+
* `return null` → `<Show>`.
|
|
9
|
+
*/
|
|
10
|
+
import { type CamelSvgProps } from "../util/svgPropertiesNoEvents";
|
|
11
|
+
import { Show, omit } from "solid-js";
|
|
12
|
+
import type { JSX } from "@solidjs/web";
|
|
13
|
+
import { Coordinate } from "../util/types";
|
|
14
|
+
import { svgPropertiesAndEvents } from "../util/svgPropertiesAndEvents";
|
|
15
|
+
import { roundTemplateLiteral } from "../util/round";
|
|
16
|
+
|
|
17
|
+
const isValidatePoint = (point: Coordinate | undefined): point is Coordinate => {
|
|
18
|
+
return point != null && point.x === +point.x && point.y === +point.y;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const getParsedPoints = (points: ReadonlyArray<Coordinate> = []): Coordinate[][] => {
|
|
22
|
+
let segmentPoints: Coordinate[][] = [[]];
|
|
23
|
+
|
|
24
|
+
points.forEach((entry) => {
|
|
25
|
+
const lastLink = segmentPoints[segmentPoints.length - 1];
|
|
26
|
+
if (isValidatePoint(entry)) {
|
|
27
|
+
if (lastLink) {
|
|
28
|
+
lastLink.push(entry);
|
|
29
|
+
}
|
|
30
|
+
} else if (lastLink && lastLink.length > 0) {
|
|
31
|
+
// add another path
|
|
32
|
+
segmentPoints.push([]);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const firstPoint = points[0];
|
|
37
|
+
const lastLink = segmentPoints[segmentPoints.length - 1];
|
|
38
|
+
if (isValidatePoint(firstPoint) && lastLink) {
|
|
39
|
+
lastLink.push(firstPoint);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const finalLink = segmentPoints[segmentPoints.length - 1];
|
|
43
|
+
if (finalLink && finalLink.length <= 0) {
|
|
44
|
+
segmentPoints = segmentPoints.slice(0, -1);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return segmentPoints;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const getSinglePolygonPath = (
|
|
51
|
+
points: ReadonlyArray<Coordinate>,
|
|
52
|
+
connectNulls?: boolean,
|
|
53
|
+
): string => {
|
|
54
|
+
let segmentPoints = getParsedPoints(points);
|
|
55
|
+
|
|
56
|
+
if (connectNulls) {
|
|
57
|
+
segmentPoints = [
|
|
58
|
+
segmentPoints.reduce((res: Coordinate[], segPoints: Coordinate[]) => {
|
|
59
|
+
return [...res, ...segPoints];
|
|
60
|
+
}, []),
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const polygonPath = segmentPoints
|
|
65
|
+
.map((segPoints) => {
|
|
66
|
+
return segPoints.reduce((path: string, point: Coordinate, index: number) => {
|
|
67
|
+
return roundTemplateLiteral`${path}${index === 0 ? "M" : "L"}${point.x},${point.y}`;
|
|
68
|
+
}, "");
|
|
69
|
+
})
|
|
70
|
+
.join("");
|
|
71
|
+
|
|
72
|
+
return segmentPoints.length === 1 ? `${polygonPath}Z` : polygonPath;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const getRanglePath = (
|
|
76
|
+
points: ReadonlyArray<Coordinate>,
|
|
77
|
+
baseLinePoints: ReadonlyArray<Coordinate>,
|
|
78
|
+
connectNulls?: boolean,
|
|
79
|
+
): string => {
|
|
80
|
+
const outerPath = getSinglePolygonPath(points, connectNulls);
|
|
81
|
+
|
|
82
|
+
return `${outerPath.slice(-1) === "Z" ? outerPath.slice(0, -1) : outerPath}L${getSinglePolygonPath(
|
|
83
|
+
Array.from(baseLinePoints).reverse(),
|
|
84
|
+
connectNulls,
|
|
85
|
+
).slice(1)}`;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
interface PolygonOwnProps {
|
|
89
|
+
class?: string;
|
|
90
|
+
/**
|
|
91
|
+
* The coordinates of all the vertexes of the polygon, like an array of objects with x and y coordinates.
|
|
92
|
+
*/
|
|
93
|
+
points?: ReadonlyArray<Coordinate>;
|
|
94
|
+
baseLinePoints?: ReadonlyArray<Coordinate>;
|
|
95
|
+
connectNulls?: boolean;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export type PolygonProps = Omit<
|
|
99
|
+
CamelSvgProps<JSX.PolygonSVGAttributes<SVGPolygonElement>>,
|
|
100
|
+
"points" | "class"
|
|
101
|
+
> &
|
|
102
|
+
PolygonOwnProps;
|
|
103
|
+
|
|
104
|
+
export const Polygon = (props: PolygonProps): JSX.Element => {
|
|
105
|
+
const others = (): Record<string, unknown> => ({
|
|
106
|
+
...omit(props, "class", "points", "baseLinePoints", "connectNulls"),
|
|
107
|
+
});
|
|
108
|
+
const layerClass = (): Array<string | undefined> => ["recharts-polygon", props.class];
|
|
109
|
+
|
|
110
|
+
// Narrow `points` to a non-empty array via keyed Show (no non-null assertion).
|
|
111
|
+
const validPoints = (): ReadonlyArray<Coordinate> | undefined =>
|
|
112
|
+
props.points != null && props.points.length > 0 ? props.points : undefined;
|
|
113
|
+
const validBase = (): ReadonlyArray<Coordinate> | undefined =>
|
|
114
|
+
props.baseLinePoints != null && props.baseLinePoints.length > 0
|
|
115
|
+
? props.baseLinePoints
|
|
116
|
+
: undefined;
|
|
117
|
+
|
|
118
|
+
return (
|
|
119
|
+
<Show when={validPoints()} keyed>
|
|
120
|
+
{(points) => (
|
|
121
|
+
<Show
|
|
122
|
+
when={validBase()}
|
|
123
|
+
keyed
|
|
124
|
+
fallback={(() => {
|
|
125
|
+
const singlePath = getSinglePolygonPath(points, props.connectNulls);
|
|
126
|
+
return (
|
|
127
|
+
<path
|
|
128
|
+
{...svgPropertiesAndEvents(others())}
|
|
129
|
+
fill={singlePath.slice(-1) === "Z" ? props.fill : "none"}
|
|
130
|
+
class={layerClass()}
|
|
131
|
+
d={singlePath}
|
|
132
|
+
/>
|
|
133
|
+
);
|
|
134
|
+
})()}
|
|
135
|
+
>
|
|
136
|
+
{(baseLinePoints) => {
|
|
137
|
+
const hasStroke = props.stroke && props.stroke !== "none";
|
|
138
|
+
const rangePath = getRanglePath(points, baseLinePoints, props.connectNulls);
|
|
139
|
+
return (
|
|
140
|
+
<g class={layerClass()}>
|
|
141
|
+
<path
|
|
142
|
+
{...svgPropertiesAndEvents(others())}
|
|
143
|
+
fill={rangePath.slice(-1) === "Z" ? props.fill : "none"}
|
|
144
|
+
stroke="none"
|
|
145
|
+
d={rangePath}
|
|
146
|
+
/>
|
|
147
|
+
<Show when={hasStroke}>
|
|
148
|
+
<path
|
|
149
|
+
{...svgPropertiesAndEvents(others())}
|
|
150
|
+
fill="none"
|
|
151
|
+
d={getSinglePolygonPath(points, props.connectNulls)}
|
|
152
|
+
/>
|
|
153
|
+
</Show>
|
|
154
|
+
<Show when={hasStroke}>
|
|
155
|
+
<path
|
|
156
|
+
{...svgPropertiesAndEvents(others())}
|
|
157
|
+
fill="none"
|
|
158
|
+
d={getSinglePolygonPath(baseLinePoints, props.connectNulls)}
|
|
159
|
+
/>
|
|
160
|
+
</Show>
|
|
161
|
+
</g>
|
|
162
|
+
);
|
|
163
|
+
}}
|
|
164
|
+
</Show>
|
|
165
|
+
)}
|
|
166
|
+
</Show>
|
|
167
|
+
);
|
|
168
|
+
};
|