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,124 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/container/RootSurface.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Solid deviations: `forwardRef` → `ref` prop; chart-dimension/accessibility
|
|
4
|
+
// hooks return Accessors → call them; `return null` → keyed `<Show>` (which also
|
|
5
|
+
// narrows width/height to numbers without a non-null `!`).
|
|
6
|
+
import { Show } from "solid-js";
|
|
7
|
+
import type { JSX } from "@solidjs/web";
|
|
8
|
+
import { useChartHeight, useChartWidth } from "../context/chartLayoutContext";
|
|
9
|
+
import { useAccessibilityLayer } from "../context/accessibilityContext";
|
|
10
|
+
import { useIsPanorama } from "../context/PanoramaContext";
|
|
11
|
+
import { Surface } from "./Surface";
|
|
12
|
+
import { useAppSelector } from "../state/hooks";
|
|
13
|
+
import { selectBrushDimensions } from "../state/selectors/brushSelectors";
|
|
14
|
+
import { isPositiveNumber } from "../util/isWellBehavedNumber";
|
|
15
|
+
import { AllZIndexPortals } from "../zIndex/ZIndexPortal";
|
|
16
|
+
|
|
17
|
+
interface RootSurfaceProps {
|
|
18
|
+
children: JSX.Element;
|
|
19
|
+
title: string | undefined;
|
|
20
|
+
desc: string | undefined;
|
|
21
|
+
otherAttributes: Record<string, unknown> | null;
|
|
22
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const FULL_WIDTH_AND_HEIGHT = {
|
|
26
|
+
width: "100%",
|
|
27
|
+
height: "100%",
|
|
28
|
+
// display: block avoids the inline-SVG descender gap that otherwise grows a
|
|
29
|
+
// responsive container indefinitely.
|
|
30
|
+
display: "block",
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const MainChartSurface = (props: RootSurfaceProps): JSX.Element => {
|
|
34
|
+
const width = useChartWidth();
|
|
35
|
+
const height = useChartHeight();
|
|
36
|
+
const hasAccessibilityLayer = useAccessibilityLayer();
|
|
37
|
+
|
|
38
|
+
const dims = (): { width: number; height: number } | undefined => {
|
|
39
|
+
const w = width();
|
|
40
|
+
const h = height();
|
|
41
|
+
return isPositiveNumber(w) && isPositiveNumber(h) ? { width: w, height: h } : undefined;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const tabIndex = (): number | undefined => {
|
|
45
|
+
const other = props.otherAttributes;
|
|
46
|
+
if (other == null) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
// The chart-prop record keeps recharts' camelCase keys (KeepCase filter);
|
|
50
|
+
// Surface renames to DOM attribute names when it renders.
|
|
51
|
+
const explicit = other.tabIndex;
|
|
52
|
+
return typeof explicit === "number" ? explicit : hasAccessibilityLayer() ? 0 : undefined;
|
|
53
|
+
};
|
|
54
|
+
const role = (): string | undefined => {
|
|
55
|
+
const other = props.otherAttributes;
|
|
56
|
+
if (other == null) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
return typeof other.role === "string"
|
|
60
|
+
? other.role
|
|
61
|
+
: hasAccessibilityLayer()
|
|
62
|
+
? "application"
|
|
63
|
+
: undefined;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// role/tabindex go through the (loosely-typed) spread, not typed props: Solid's
|
|
67
|
+
// `role` prop is a strict ARIA-literal union that rejects a plain `string`.
|
|
68
|
+
const attrs = (): Record<string, unknown> => ({
|
|
69
|
+
...(props.otherAttributes ?? {}),
|
|
70
|
+
role: role(),
|
|
71
|
+
tabIndex: tabIndex(),
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Non-keyed Show: mount the Surface once when dimensions are positive; width/
|
|
75
|
+
// height update reactively. (Keyed would churn the subtree on each size change.)
|
|
76
|
+
return (
|
|
77
|
+
<Show when={dims()}>
|
|
78
|
+
{(d) => (
|
|
79
|
+
<Surface
|
|
80
|
+
{...attrs()}
|
|
81
|
+
title={props.title}
|
|
82
|
+
desc={props.desc}
|
|
83
|
+
width={d().width}
|
|
84
|
+
height={d().height}
|
|
85
|
+
style={FULL_WIDTH_AND_HEIGHT}
|
|
86
|
+
ref={props.ref}
|
|
87
|
+
>
|
|
88
|
+
{props.children}
|
|
89
|
+
</Surface>
|
|
90
|
+
)}
|
|
91
|
+
</Show>
|
|
92
|
+
);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const BrushPanoramaSurface = (props: { children: JSX.Element }): JSX.Element => {
|
|
96
|
+
const brushDimensions = useAppSelector(selectBrushDimensions);
|
|
97
|
+
|
|
98
|
+
return (
|
|
99
|
+
<Show when={brushDimensions()}>
|
|
100
|
+
{(dims) => (
|
|
101
|
+
<Surface width={dims().width} height={dims().height} x={dims().x} y={dims().y}>
|
|
102
|
+
{props.children}
|
|
103
|
+
</Surface>
|
|
104
|
+
)}
|
|
105
|
+
</Show>
|
|
106
|
+
);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export const RootSurface = (props: RootSurfaceProps): JSX.Element => {
|
|
110
|
+
const isPanorama = useIsPanorama();
|
|
111
|
+
|
|
112
|
+
if (isPanorama) {
|
|
113
|
+
return (
|
|
114
|
+
<BrushPanoramaSurface>
|
|
115
|
+
<AllZIndexPortals isPanorama>{props.children}</AllZIndexPortals>
|
|
116
|
+
</BrushPanoramaSurface>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
return (
|
|
120
|
+
<MainChartSurface {...props}>
|
|
121
|
+
<AllZIndexPortals isPanorama={false}>{props.children}</AllZIndexPortals>
|
|
122
|
+
</MainChartSurface>
|
|
123
|
+
);
|
|
124
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type CamelSvgProps } from "../util/svgPropertiesNoEvents";
|
|
2
|
+
import { svgPropertiesAndEvents } from "../util/svgPropertiesAndEvents";
|
|
3
|
+
import { omit } from "solid-js";
|
|
4
|
+
import type { JSX } from "@solidjs/web";
|
|
5
|
+
|
|
6
|
+
export interface CartesianViewBox {
|
|
7
|
+
x?: number;
|
|
8
|
+
y?: number;
|
|
9
|
+
width?: number;
|
|
10
|
+
height?: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface SurfaceOwnProps {
|
|
14
|
+
width: number | string;
|
|
15
|
+
height: number | string;
|
|
16
|
+
viewBox?: CartesianViewBox;
|
|
17
|
+
style?: JSX.CSSProperties;
|
|
18
|
+
children?: JSX.Element;
|
|
19
|
+
title?: string;
|
|
20
|
+
desc?: string;
|
|
21
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void);
|
|
22
|
+
/** Maps to recharts' `className` (a plain string); the array `class` form below merges it. */
|
|
23
|
+
class?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Props parity with recharts SurfaceProps; `class` (vs `className: string`) is the only framework
|
|
27
|
+
// deviation. We Omit the wide SVG `class` so ours stays `string`, matching recharts and keeping the
|
|
28
|
+
// native array `class` form typed.
|
|
29
|
+
export type SurfaceProps = Omit<
|
|
30
|
+
CamelSvgProps<JSX.SvgSVGAttributes<SVGSVGElement>>,
|
|
31
|
+
"viewBox" | "style" | "class"
|
|
32
|
+
> &
|
|
33
|
+
SurfaceOwnProps;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Renders an SVG element. All charts include a Surface; you would not normally use this directly.
|
|
37
|
+
*/
|
|
38
|
+
export const Surface = (props: SurfaceProps) => {
|
|
39
|
+
const svgView = () => props.viewBox ?? { width: props.width, height: props.height, x: 0, y: 0 };
|
|
40
|
+
const rest = omit(
|
|
41
|
+
props,
|
|
42
|
+
"children",
|
|
43
|
+
"width",
|
|
44
|
+
"height",
|
|
45
|
+
"viewBox",
|
|
46
|
+
"class",
|
|
47
|
+
"style",
|
|
48
|
+
"title",
|
|
49
|
+
"desc",
|
|
50
|
+
"ref",
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
// Parity with recharts Surface: the passthrough props go through the SVG
|
|
54
|
+
// filter (camelCase props → DOM attribute names), not a verbatim spread.
|
|
55
|
+
return (
|
|
56
|
+
<svg
|
|
57
|
+
{...svgPropertiesAndEvents({ ...rest })}
|
|
58
|
+
class={["recharts-surface", props.class]}
|
|
59
|
+
width={props.width}
|
|
60
|
+
height={props.height}
|
|
61
|
+
style={props.style}
|
|
62
|
+
viewBox={`${svgView().x ?? 0} ${svgView().y ?? 0} ${svgView().width} ${svgView().height}`}
|
|
63
|
+
ref={props.ref}
|
|
64
|
+
>
|
|
65
|
+
<title>{props.title}</title>
|
|
66
|
+
<desc>{props.desc}</desc>
|
|
67
|
+
{props.children}
|
|
68
|
+
</svg>
|
|
69
|
+
);
|
|
70
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/context/ErrorBarContext.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// The graphical item provides its data + a point formatter + axis ids via this
|
|
4
|
+
// context; ErrorBar consumes it to draw whiskers, and ReportErrorBarSettings
|
|
5
|
+
// registers the error bar in the store (so axes can extend their domain).
|
|
6
|
+
//
|
|
7
|
+
// Solid deviations: context value carries an `Accessor` (Solid context is fixed
|
|
8
|
+
// at provide-time; the accessor keeps `data` reactive). useEffect add/replace +
|
|
9
|
+
// cleanup remove → createEffect + onCleanup. useGraphicalItemId provides the id.
|
|
10
|
+
import { createContext, createEffect, useContext } from "solid-js";
|
|
11
|
+
import type { Accessor } from "solid-js";
|
|
12
|
+
import type { JSX } from "@solidjs/web";
|
|
13
|
+
import { AxisId } from "../state/cartesianAxisSlice";
|
|
14
|
+
import type { ErrorBarDataPointFormatter } from "../cartesian/ErrorBar";
|
|
15
|
+
import type { ErrorBarsSettings } from "../state/errorBarSlice";
|
|
16
|
+
import { useAppStore } from "../state/hooks";
|
|
17
|
+
import { useGraphicalItemId } from "./RegisterGraphicalItemId";
|
|
18
|
+
import { unregisterOnCleanup } from "../state/unregisterOnCleanup";
|
|
19
|
+
|
|
20
|
+
export interface ErrorBarContextValue {
|
|
21
|
+
data: ReadonlyArray<unknown> | undefined;
|
|
22
|
+
xAxisId: AxisId;
|
|
23
|
+
yAxisId: AxisId;
|
|
24
|
+
dataPointFormatter: ErrorBarDataPointFormatter;
|
|
25
|
+
errorBarOffset: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const initialContextState: ErrorBarContextValue = {
|
|
29
|
+
data: [],
|
|
30
|
+
xAxisId: 0,
|
|
31
|
+
yAxisId: 0,
|
|
32
|
+
dataPointFormatter: () => ({ x: 0, y: 0, value: 0 }),
|
|
33
|
+
errorBarOffset: 0,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const ErrorBarContext = createContext<Accessor<ErrorBarContextValue>>(() => initialContextState);
|
|
37
|
+
|
|
38
|
+
export function SetErrorBarContext(
|
|
39
|
+
props: ErrorBarContextValue & { children: JSX.Element },
|
|
40
|
+
): JSX.Element {
|
|
41
|
+
const value = (): ErrorBarContextValue => ({
|
|
42
|
+
data: props.data,
|
|
43
|
+
xAxisId: props.xAxisId,
|
|
44
|
+
yAxisId: props.yAxisId,
|
|
45
|
+
dataPointFormatter: props.dataPointFormatter,
|
|
46
|
+
errorBarOffset: props.errorBarOffset,
|
|
47
|
+
});
|
|
48
|
+
return <ErrorBarContext value={value}>{props.children}</ErrorBarContext>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const useErrorBarContext = (): Accessor<ErrorBarContextValue> => useContext(ErrorBarContext);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Registers an ErrorBar's settings in the store under its graphical item's id,
|
|
55
|
+
* so the corresponding axis can extend its domain to fit the error values.
|
|
56
|
+
*/
|
|
57
|
+
export function ReportErrorBarSettings(props: ErrorBarsSettings): JSX.Element {
|
|
58
|
+
const store = useAppStore();
|
|
59
|
+
const graphicalItemId = useGraphicalItemId();
|
|
60
|
+
let prev: ErrorBarsSettings | null = null;
|
|
61
|
+
|
|
62
|
+
createEffect(
|
|
63
|
+
(): ErrorBarsSettings => ({ dataKey: props.dataKey, direction: props.direction }),
|
|
64
|
+
(settings) => {
|
|
65
|
+
if (store == null || graphicalItemId == null) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (prev === null) {
|
|
69
|
+
store.actions.errorBars.addErrorBar({ itemId: graphicalItemId, errorBar: settings });
|
|
70
|
+
} else if (prev !== settings) {
|
|
71
|
+
store.actions.errorBars.replaceErrorBar({ itemId: graphicalItemId, prev, next: settings });
|
|
72
|
+
}
|
|
73
|
+
prev = settings;
|
|
74
|
+
},
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
unregisterOnCleanup(() => {
|
|
78
|
+
if (prev != null && store != null && graphicalItemId != null) {
|
|
79
|
+
store.actions.errorBars.removeErrorBar({ itemId: graphicalItemId, errorBar: prev });
|
|
80
|
+
prev = null;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/context/PanoramaContext.tsx (commit 7a23854).
|
|
2
|
+
// Context-value-is-provider in Solid 2.0; default `null` (a real value) so
|
|
3
|
+
// `useContext` returns it without throwing outside a provider.
|
|
4
|
+
import { createContext, useContext } from "solid-js";
|
|
5
|
+
import type { JSX } from "@solidjs/web";
|
|
6
|
+
|
|
7
|
+
const PanoramaContext = createContext<boolean | null>(null);
|
|
8
|
+
|
|
9
|
+
export const useIsPanorama = (): boolean => useContext(PanoramaContext) != null;
|
|
10
|
+
|
|
11
|
+
export const PanoramaContextProvider = (props: { children: JSX.Element }): JSX.Element => (
|
|
12
|
+
<PanoramaContext value={true}>{props.children}</PanoramaContext>
|
|
13
|
+
);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/context/RegisterGraphicalItemId.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Resolves a graphical item's id (user-provided or generated) once and provides
|
|
4
|
+
// it to descendants via context, exposing it to the item itself through a
|
|
5
|
+
// render-prop child. Solid 2.0: context value is the provider; the `children`
|
|
6
|
+
// function receives the resolved id (same render-prop shape as the reference).
|
|
7
|
+
//
|
|
8
|
+
// Not yet adopted by <Line> (which currently generates its own id inline); this
|
|
9
|
+
// is the shared primitive for graphical items (Line/Bar/Area/Scatter) to use.
|
|
10
|
+
import { createContext, useContext } from "solid-js";
|
|
11
|
+
import type { JSX } from "@solidjs/web";
|
|
12
|
+
import { useUniqueId } from "../util/useUniqueId";
|
|
13
|
+
import { GraphicalItemId } from "../state/graphicalItemsSlice";
|
|
14
|
+
|
|
15
|
+
export interface IdSetter {
|
|
16
|
+
id?: string;
|
|
17
|
+
type: string;
|
|
18
|
+
/**
|
|
19
|
+
* Children must be a function that receives the resolved id of the graphical
|
|
20
|
+
* item — either the one provided via `id` or one generated automatically.
|
|
21
|
+
*/
|
|
22
|
+
children: (id: GraphicalItemId) => JSX.Element;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Default must be a real value (null), not an explicit `undefined`: Solid 2.0
|
|
26
|
+
// treats an undefined default as "no default" and THROWS from useContext when
|
|
27
|
+
// no provider is above. Consumers (e.g. an <ErrorBar> child evaluated by Bar's
|
|
28
|
+
// collectCells probe outside the provider) rely on getting "no id" back and
|
|
29
|
+
// no-op'ing instead.
|
|
30
|
+
const GraphicalItemIdContext = createContext<GraphicalItemId | null>(null);
|
|
31
|
+
|
|
32
|
+
export const RegisterGraphicalItemId = (props: IdSetter): JSX.Element => {
|
|
33
|
+
const resolvedId = useUniqueId(`recharts-${props.type}`, props.id);
|
|
34
|
+
return (
|
|
35
|
+
<GraphicalItemIdContext value={resolvedId}>{props.children(resolvedId)}</GraphicalItemIdContext>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export function useGraphicalItemId(): GraphicalItemId | undefined {
|
|
40
|
+
return useContext(GraphicalItemIdContext) ?? undefined;
|
|
41
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/context/accessibilityContext.tsx (commit 7a23854).
|
|
2
|
+
// `useAppSelector` returns an Accessor in this Solid port, so `useAccessibilityLayer`
|
|
3
|
+
// returns an `Accessor<boolean>` (recharts returned a bare boolean).
|
|
4
|
+
import { type Accessor } from "solid-js";
|
|
5
|
+
import { useAppSelector } from "../state/hooks";
|
|
6
|
+
|
|
7
|
+
export const useAccessibilityLayer = (): Accessor<boolean> => {
|
|
8
|
+
const accessibilityLayer = useAppSelector((state) => state.rootProps.accessibilityLayer);
|
|
9
|
+
return () => accessibilityLayer() ?? true;
|
|
10
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/context/brushUpdateContext.tsx (commit 7a23854).
|
|
2
|
+
// No JSX → `.ts`. Solid 2.0: the context value is the provider; the default
|
|
3
|
+
// (`() => {}`) is a real value so `useContext` returns it without throwing
|
|
4
|
+
// outside a provider (matching recharts' default-callback behavior).
|
|
5
|
+
import { createContext } from "solid-js";
|
|
6
|
+
|
|
7
|
+
export interface BrushStartEndIndex {
|
|
8
|
+
startIndex: number;
|
|
9
|
+
endIndex: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type OnBrushUpdate = (newState: BrushStartEndIndex) => void;
|
|
13
|
+
|
|
14
|
+
export const BrushUpdateDispatchContext = createContext<OnBrushUpdate>(() => {});
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/context/chartDataContext.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Solid deviations: `useAppDispatch` + action creators → `useAppStore()` + slice
|
|
4
|
+
// actions (`store.actions.chartData.*`); `useEffect` → two-arg `createEffect`
|
|
5
|
+
// (the cleanup is returned from the apply phase); selector hooks return
|
|
6
|
+
// Accessors (since `useAppSelector` does). `SetComputedData` and the BrushStartEndIndex
|
|
7
|
+
// type are kept local; the latter re-homes to brushUpdateContext when ported.
|
|
8
|
+
import { createEffect, type Accessor } from "solid-js";
|
|
9
|
+
import type { JSX } from "@solidjs/web";
|
|
10
|
+
import { ChartData } from "../state/chartDataSlice";
|
|
11
|
+
import { useAppSelector, useAppStore } from "../state/hooks";
|
|
12
|
+
import { unregisterCleanup } from "../state/unregisterOnCleanup";
|
|
13
|
+
import { RechartsRootState } from "../state/store";
|
|
14
|
+
import { useIsPanorama } from "./PanoramaContext";
|
|
15
|
+
|
|
16
|
+
interface BrushStartEndIndex {
|
|
17
|
+
startIndex: number;
|
|
18
|
+
endIndex: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const ChartDataContextProvider = (props: {
|
|
22
|
+
chartData: ChartData | undefined;
|
|
23
|
+
}): JSX.Element => {
|
|
24
|
+
const store = useAppStore();
|
|
25
|
+
const isPanorama = useIsPanorama();
|
|
26
|
+
|
|
27
|
+
createEffect(
|
|
28
|
+
() => props.chartData,
|
|
29
|
+
(chartData) => {
|
|
30
|
+
// Panorama mode reuses the main chart's data — don't overwrite it.
|
|
31
|
+
if (isPanorama) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
store?.actions.chartData.setChartData(chartData);
|
|
35
|
+
return unregisterCleanup(() => {
|
|
36
|
+
store?.actions.chartData.setChartData(undefined);
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
return null;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const SetComputedData = (props: { computedData: unknown }): JSX.Element => {
|
|
45
|
+
const store = useAppStore();
|
|
46
|
+
|
|
47
|
+
createEffect(
|
|
48
|
+
() => props.computedData,
|
|
49
|
+
(computedData) => {
|
|
50
|
+
store?.actions.chartData.setComputedData(computedData);
|
|
51
|
+
return unregisterCleanup(() => {
|
|
52
|
+
store?.actions.chartData.setChartData(undefined);
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
return null;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const selectChartData = (state: RechartsRootState): ChartData | undefined =>
|
|
61
|
+
state.chartData.chartData;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Returns the chart's `data` array (set on the chart root), or `undefined`.
|
|
65
|
+
* @deprecated use a more specific selector depending on how the graphical item identifies its data.
|
|
66
|
+
*/
|
|
67
|
+
export const useChartData = (): Accessor<ChartData | undefined> => useAppSelector(selectChartData);
|
|
68
|
+
|
|
69
|
+
const selectDataIndex = (state: RechartsRootState): BrushStartEndIndex => {
|
|
70
|
+
const { dataStartIndex, dataEndIndex } = state.chartData;
|
|
71
|
+
return { startIndex: dataStartIndex, endIndex: dataEndIndex };
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* startIndex and endIndex are data boundaries set through Brush.
|
|
76
|
+
*/
|
|
77
|
+
export const useDataIndex = (): Accessor<BrushStartEndIndex | undefined> => {
|
|
78
|
+
return useAppSelector(selectDataIndex);
|
|
79
|
+
};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/context/chartLayoutContext.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Solid deviations: selector hooks return Accessors (since `useAppSelector`
|
|
4
|
+
// does); `useAppDispatch` + action creators → `useAppStore().actions` +
|
|
5
|
+
// `createEffect`. Brush/responsive reads go through the current stubs.
|
|
6
|
+
import { createEffect, type Accessor } from "solid-js";
|
|
7
|
+
import type { JSX } from "@solidjs/web";
|
|
8
|
+
import {
|
|
9
|
+
CartesianLayout,
|
|
10
|
+
CartesianViewBoxRequired,
|
|
11
|
+
ChartOffsetInternal,
|
|
12
|
+
LayoutType,
|
|
13
|
+
Margin,
|
|
14
|
+
Percent,
|
|
15
|
+
PolarLayout,
|
|
16
|
+
TrapezoidViewBox,
|
|
17
|
+
} from "../util/types";
|
|
18
|
+
import { useAppSelector, useAppStore } from "../state/hooks";
|
|
19
|
+
import { RechartsRootState } from "../state/store";
|
|
20
|
+
import {
|
|
21
|
+
selectChartOffsetInternal,
|
|
22
|
+
selectChartViewBox,
|
|
23
|
+
} from "../state/selectors/selectChartOffsetInternal";
|
|
24
|
+
import { selectChartHeight, selectChartWidth } from "../state/selectors/containerSelectors";
|
|
25
|
+
import { useIsPanorama } from "./PanoramaContext";
|
|
26
|
+
import { selectBrushDimensions, selectBrushSettings } from "../state/selectors/brushSelectors";
|
|
27
|
+
import { useResponsiveContainerContext } from "../component/ResponsiveContainer";
|
|
28
|
+
import { isPositiveNumber } from "../util/isWellBehavedNumber";
|
|
29
|
+
|
|
30
|
+
export function cartesianViewBoxToTrapezoid(box: undefined): undefined;
|
|
31
|
+
export function cartesianViewBoxToTrapezoid(
|
|
32
|
+
box: CartesianViewBoxRequired | TrapezoidViewBox,
|
|
33
|
+
): TrapezoidViewBox;
|
|
34
|
+
export function cartesianViewBoxToTrapezoid(
|
|
35
|
+
box: CartesianViewBoxRequired | TrapezoidViewBox | undefined,
|
|
36
|
+
): TrapezoidViewBox | undefined {
|
|
37
|
+
if (!box) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
x: box.x,
|
|
42
|
+
y: box.y,
|
|
43
|
+
upperWidth: "upperWidth" in box ? box.upperWidth : box.width,
|
|
44
|
+
lowerWidth: "lowerWidth" in box ? box.lowerWidth : box.width,
|
|
45
|
+
width: box.width,
|
|
46
|
+
height: box.height,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const useViewBox = (): Accessor<CartesianViewBoxRequired | undefined> => {
|
|
51
|
+
const panorama = useIsPanorama();
|
|
52
|
+
const rootViewBox = useAppSelector(selectChartViewBox);
|
|
53
|
+
const brushDimensions = useAppSelector(selectBrushDimensions);
|
|
54
|
+
const brushSettings = useAppSelector(selectBrushSettings);
|
|
55
|
+
return () => {
|
|
56
|
+
const padding = brushSettings()?.padding;
|
|
57
|
+
const dims = brushDimensions();
|
|
58
|
+
if (!panorama || !dims || !padding) {
|
|
59
|
+
return rootViewBox();
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
width: dims.width - padding.left - padding.right,
|
|
63
|
+
height: dims.height - padding.top - padding.bottom,
|
|
64
|
+
x: padding.left,
|
|
65
|
+
y: padding.top,
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const manyComponentsThrowErrorsIfOffsetIsUndefined: ChartOffsetInternal = {
|
|
71
|
+
top: 0,
|
|
72
|
+
bottom: 0,
|
|
73
|
+
left: 0,
|
|
74
|
+
right: 0,
|
|
75
|
+
width: 0,
|
|
76
|
+
height: 0,
|
|
77
|
+
brushBottom: 0,
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/** Internal. Returns the chart offset in pixels (or a zeroed default). */
|
|
81
|
+
export const useOffsetInternal = (): Accessor<ChartOffsetInternal> => {
|
|
82
|
+
const offset = useAppSelector(selectChartOffsetInternal);
|
|
83
|
+
return () => offset() ?? manyComponentsThrowErrorsIfOffsetIsUndefined;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/** Width of the chart in pixels, or `undefined` outside a chart context. */
|
|
87
|
+
export const useChartWidth = (): Accessor<number | undefined> => useAppSelector(selectChartWidth);
|
|
88
|
+
|
|
89
|
+
/** Height of the chart in pixels, or `undefined` outside a chart context. */
|
|
90
|
+
export const useChartHeight = (): Accessor<number | undefined> => useAppSelector(selectChartHeight);
|
|
91
|
+
|
|
92
|
+
/** Margin (empty space around the chart, excluding axes/legend/brushes). */
|
|
93
|
+
export const useMargin = (): Accessor<Margin | undefined> =>
|
|
94
|
+
useAppSelector((state) => state.layout.margin);
|
|
95
|
+
|
|
96
|
+
export const selectChartLayout = (state: RechartsRootState): LayoutType => state.layout.layoutType;
|
|
97
|
+
|
|
98
|
+
export const useChartLayout = (): Accessor<LayoutType | undefined> =>
|
|
99
|
+
useAppSelector(selectChartLayout);
|
|
100
|
+
|
|
101
|
+
export const useCartesianChartLayout = (): Accessor<CartesianLayout | undefined> => {
|
|
102
|
+
const layout = useChartLayout();
|
|
103
|
+
return () => {
|
|
104
|
+
const l = layout();
|
|
105
|
+
return l === "horizontal" || l === "vertical" ? l : undefined;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export const selectPolarChartLayout = (state: RechartsRootState): PolarLayout | undefined => {
|
|
110
|
+
const layout = state.layout.layoutType;
|
|
111
|
+
return layout === "centric" || layout === "radial" ? layout : undefined;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export const usePolarChartLayout = (): Accessor<PolarLayout | undefined> =>
|
|
115
|
+
useAppSelector(selectPolarChartLayout);
|
|
116
|
+
|
|
117
|
+
/** True if rendered inside a chart context (all charts provide a layout type). */
|
|
118
|
+
export const useIsInChartContext = (): Accessor<boolean> => {
|
|
119
|
+
const layout = useChartLayout();
|
|
120
|
+
return () => layout() !== undefined;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export const ReportChartSize = (props: {
|
|
124
|
+
width: number | Percent | undefined;
|
|
125
|
+
height: number | Percent | undefined;
|
|
126
|
+
}): JSX.Element => {
|
|
127
|
+
const store = useAppStore();
|
|
128
|
+
const isPanorama = useIsPanorama();
|
|
129
|
+
const responsive = useResponsiveContainerContext();
|
|
130
|
+
|
|
131
|
+
// Prefer ResponsiveContainer-measured dimensions when present (3.x behavior).
|
|
132
|
+
const width = (): number | Percent | undefined =>
|
|
133
|
+
responsive && responsive.width > 0 ? responsive.width : props.width;
|
|
134
|
+
const height = (): number | Percent | undefined =>
|
|
135
|
+
responsive && responsive.height > 0 ? responsive.height : props.height;
|
|
136
|
+
|
|
137
|
+
createEffect(
|
|
138
|
+
() => ({ width: width(), height: height() }),
|
|
139
|
+
({ width: w, height: h }) => {
|
|
140
|
+
if (!isPanorama && isPositiveNumber(w) && isPositiveNumber(h)) {
|
|
141
|
+
store?.actions.layout.setChartSize({ width: w, height: h });
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
return null;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
export const ReportChartMargin = (props: { margin: Partial<Margin> }): JSX.Element => {
|
|
150
|
+
const store = useAppStore();
|
|
151
|
+
createEffect(
|
|
152
|
+
() => props.margin,
|
|
153
|
+
(margin) => {
|
|
154
|
+
store?.actions.layout.setMargin(margin);
|
|
155
|
+
},
|
|
156
|
+
);
|
|
157
|
+
return null;
|
|
158
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/context/legendPayloadContext.ts (commit 7a23854).
|
|
2
|
+
// Deviation: returns an Accessor (Solid reactive-hook convention).
|
|
3
|
+
import { Accessor } from "solid-js";
|
|
4
|
+
import { LegendPayload } from "../component/DefaultLegendContent";
|
|
5
|
+
import { useAppSelector } from "../state/hooks";
|
|
6
|
+
import { selectLegendPayload } from "../state/selectors/legendSelectors";
|
|
7
|
+
|
|
8
|
+
/** Reads the current Legend items (for Legend or anywhere reading legend payload). */
|
|
9
|
+
export function useLegendPayload(): Accessor<ReadonlyArray<LegendPayload> | undefined> {
|
|
10
|
+
return useAppSelector(selectLegendPayload);
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 src/context/legendPortalContext.tsx (commit 7a23854).
|
|
2
|
+
//
|
|
3
|
+
// Deviation (same as tooltipPortalContext): the context carries an
|
|
4
|
+
// `Accessor<HTMLElement | null>` so the wrapper can set it reactively from its
|
|
5
|
+
// portal-div ref (Solid context values are fixed at provide time). Default
|
|
6
|
+
// accessor returns null (outside a provider).
|
|
7
|
+
import { Accessor, createContext, useContext } from "solid-js";
|
|
8
|
+
|
|
9
|
+
export const LegendPortalContext = createContext<Accessor<HTMLElement | null>>(() => null);
|
|
10
|
+
|
|
11
|
+
export const useLegendPortal = (): Accessor<HTMLElement | null> => useContext(LegendPortalContext);
|