@solidports/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/LICENSE +22 -0
- package/NOTICE +19 -0
- package/README.md +102 -0
- package/dist/dev.js +28564 -0
- package/dist/index.d.ts +7859 -0
- package/dist/index.js +28546 -0
- package/package.json +98 -0
- package/src/animation/AnimatedItems.tsx +183 -0
- package/src/animation/AnimationController.ts +33 -0
- package/src/animation/AnimationControllerImpl.ts +36 -0
- package/src/animation/AnimationHandle.ts +307 -0
- package/src/animation/CSSTransitionAnimate.tsx +170 -0
- package/src/animation/JavascriptAnimate.tsx +119 -0
- package/src/animation/easing.ts +221 -0
- package/src/animation/matchBy.ts +164 -0
- package/src/animation/timeoutController.ts +70 -0
- package/src/animation/useAnimationController.tsx +34 -0
- package/src/animation/useAnimationStartSnapshot.ts +118 -0
- package/src/animation/util.ts +41 -0
- package/src/cartesian/Area.tsx +915 -0
- package/src/cartesian/AreaRevealShape.tsx +190 -0
- package/src/cartesian/Bar.tsx +1369 -0
- package/src/cartesian/BarStack.tsx +152 -0
- package/src/cartesian/Brush.tsx +951 -0
- package/src/cartesian/CartesianAxis.tsx +722 -0
- package/src/cartesian/CartesianGrid.tsx +711 -0
- package/src/cartesian/ErrorBar.tsx +361 -0
- package/src/cartesian/Funnel.tsx +803 -0
- package/src/cartesian/GraphicalItemClipPath.tsx +67 -0
- package/src/cartesian/Line.tsx +863 -0
- package/src/cartesian/LineDrawShape.tsx +89 -0
- package/src/cartesian/ReferenceArea.tsx +331 -0
- package/src/cartesian/ReferenceDot.tsx +304 -0
- package/src/cartesian/ReferenceLine.tsx +474 -0
- package/src/cartesian/Scatter.tsx +888 -0
- package/src/cartesian/XAxis.tsx +433 -0
- package/src/cartesian/YAxis.tsx +443 -0
- package/src/cartesian/ZAxis.tsx +155 -0
- package/src/cartesian/cartesianPositionToCSSTranslate.tsx +29 -0
- package/src/cartesian/cartesianViewBoxToTrapezoid.tsx +21 -0
- package/src/cartesian/getCartesianPosition.tsx +267 -0
- package/src/cartesian/getEquidistantTicks.ts +144 -0
- package/src/cartesian/getTicks.ts +225 -0
- package/src/cartesian/isOutsidePosition.ts +15 -0
- package/src/cartesian/useAnimatedLineLength.ts +54 -0
- package/src/chart/AreaChart.tsx +29 -0
- package/src/chart/BarChart.tsx +29 -0
- package/src/chart/CartesianChart.tsx +131 -0
- package/src/chart/CategoricalChart.tsx +94 -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 +50 -0
- package/src/chart/PolarChart.tsx +164 -0
- package/src/chart/RadarChart.tsx +70 -0
- package/src/chart/RadialBarChart.tsx +46 -0
- package/src/chart/RechartsWrapper.tsx +551 -0
- package/src/chart/Sankey.tsx +1534 -0
- package/src/chart/ScatterChart.tsx +29 -0
- package/src/chart/SunburstChart.tsx +504 -0
- package/src/chart/Treemap.tsx +1223 -0
- package/src/chart/createInitialRootProps.ts +24 -0
- package/src/chart/types.ts +53 -0
- package/src/component/ActivePoints.tsx +144 -0
- package/src/component/Cell.tsx +37 -0
- package/src/component/Cursor.tsx +185 -0
- package/src/component/Customized.tsx +50 -0
- package/src/component/DefaultLegendContent.tsx +348 -0
- package/src/component/DefaultTooltipContent.tsx +224 -0
- package/src/component/Dots.tsx +157 -0
- package/src/component/Label.tsx +636 -0
- package/src/component/LabelList.tsx +375 -0
- package/src/component/Legend.tsx +512 -0
- package/src/component/ResponsiveContainer.tsx +348 -0
- package/src/component/Text.tsx +541 -0
- package/src/component/Tooltip.tsx +470 -0
- package/src/component/TooltipBoundingBox.tsx +146 -0
- package/src/component/responsiveContainerUtils.ts +134 -0
- package/src/container/ClipPathProvider.tsx +51 -0
- package/src/container/Layer.tsx +38 -0
- package/src/container/RootSurface.tsx +120 -0
- package/src/container/Surface.tsx +61 -0
- package/src/context/CellsContext.tsx +54 -0
- package/src/context/ErrorBarContext.tsx +146 -0
- package/src/context/GraphicalItemChildrenScope.tsx +18 -0
- package/src/context/PanoramaContext.tsx +9 -0
- package/src/context/RegisterGraphicalItemId.tsx +30 -0
- package/src/context/accessibilityContext.tsx +6 -0
- package/src/context/brushUpdateContext.tsx +9 -0
- package/src/context/chartDataContext.tsx +97 -0
- package/src/context/chartLayoutContext.tsx +201 -0
- package/src/context/legendPayloadContext.tsx +20 -0
- package/src/context/legendPortalContext.tsx +12 -0
- package/src/context/tooltipContext.tsx +89 -0
- package/src/context/tooltipPortalContext.tsx +12 -0
- package/src/context/useTooltipAxis.ts +22 -0
- package/src/hooks.ts +476 -0
- package/src/index.ts +280 -0
- package/src/polar/Pie.tsx +1360 -0
- package/src/polar/PolarAngleAxis.tsx +616 -0
- package/src/polar/PolarGrid.tsx +312 -0
- package/src/polar/PolarRadiusAxis.tsx +547 -0
- package/src/polar/Radar.tsx +734 -0
- package/src/polar/RadialBar.tsx +917 -0
- package/src/polar/defaultPolarAngleAxisProps.tsx +27 -0
- package/src/polar/defaultPolarRadiusAxisProps.tsx +25 -0
- package/src/shape/Cross.tsx +89 -0
- package/src/shape/Curve.tsx +343 -0
- package/src/shape/Dot.tsx +70 -0
- package/src/shape/Polygon.tsx +195 -0
- package/src/shape/Rectangle.tsx +470 -0
- package/src/shape/Sector.tsx +347 -0
- package/src/shape/Symbols.tsx +139 -0
- package/src/shape/Trapezoid.tsx +280 -0
- package/src/state/RechartsStateContext.tsx +12 -0
- package/src/state/RechartsStateProvider.tsx +87 -0
- package/src/state/RechartsStoreContext.tsx +25 -0
- package/src/state/RechartsStoreProvider.tsx +35 -0
- package/src/state/ReportChartProps.tsx +40 -0
- package/src/state/ReportEventSettings.tsx +30 -0
- package/src/state/ReportMainChartProps.tsx +61 -0
- package/src/state/ReportPolarOptions.tsx +35 -0
- package/src/state/SetGraphicalItem.ts +79 -0
- package/src/state/SetLegendPayload.ts +134 -0
- package/src/state/SetTooltipEntrySettings.tsx +72 -0
- package/src/state/actions.ts +464 -0
- package/src/state/brushSlice.ts +13 -0
- package/src/state/cartesianAxisSlice.ts +141 -0
- package/src/state/chartDataSlice.ts +50 -0
- package/src/state/chartState.ts +297 -0
- package/src/state/errorBarSlice.ts +29 -0
- package/src/state/eventSettingsSlice.ts +8 -0
- package/src/state/events.ts +76 -0
- package/src/state/externalEventsMiddleware.ts +255 -0
- package/src/state/graphicalItemsSlice.ts +74 -0
- package/src/state/hooks/useChartSelectors.tsx +45 -0
- package/src/state/keyboardEventsMiddleware.ts +228 -0
- package/src/state/layoutSlice.ts +21 -0
- package/src/state/legendSlice.ts +57 -0
- package/src/state/mouseEventsMiddleware.ts +185 -0
- package/src/state/optionsSlice.ts +47 -0
- package/src/state/polarAxisSlice.ts +10 -0
- package/src/state/polarOptionsSlice.ts +12 -0
- package/src/state/rawData.ts +26 -0
- package/src/state/referenceElementsSlice.ts +40 -0
- package/src/state/renderedTicksSlice.ts +15 -0
- package/src/state/rootPropsSlice.ts +47 -0
- package/src/state/selectors/areaSelectors.ts +240 -0
- package/src/state/selectors/arrayEqualityCheck.ts +29 -0
- package/src/state/selectors/axisSelectors.ts +2157 -0
- package/src/state/selectors/barSelectors.ts +310 -0
- package/src/state/selectors/barStackSelectors.ts +77 -0
- package/src/state/selectors/brushSelectors.ts +33 -0
- package/src/state/selectors/chartSelector.ts +185 -0
- package/src/state/selectors/combiners/combineActiveLabel.ts +16 -0
- package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +95 -0
- package/src/state/selectors/combiners/combineAllBarPositions.ts +122 -0
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +16 -0
- package/src/state/selectors/combiners/combineBarPosition.ts +23 -0
- package/src/state/selectors/combiners/combineBarSizeList.ts +80 -0
- package/src/state/selectors/combiners/combineCheckedDomain.ts +48 -0
- package/src/state/selectors/combiners/combineConfiguredScale.ts +111 -0
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +45 -0
- package/src/state/selectors/combiners/combineDisplayedStackedData.ts +50 -0
- package/src/state/selectors/combiners/combineInverseScaleFunction.ts +16 -0
- package/src/state/selectors/combiners/combineRealScaleType.ts +44 -0
- package/src/state/selectors/combiners/combineStackedData.ts +27 -0
- package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
- package/src/state/selectors/combiners/combineTooltipPayload.ts +205 -0
- package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +58 -0
- package/src/state/selectors/containerSelectors.ts +12 -0
- package/src/state/selectors/dataSelectors.ts +88 -0
- package/src/state/selectors/funnelSelectors.ts +75 -0
- package/src/state/selectors/graphicalItemSelectors.ts +30 -0
- package/src/state/selectors/legendSelectors.ts +29 -0
- package/src/state/selectors/lineSelectors.ts +134 -0
- package/src/state/selectors/numberDomainEqualityCheck.ts +14 -0
- package/src/state/selectors/pickAxisId.ts +5 -0
- package/src/state/selectors/pickAxisType.ts +3 -0
- package/src/state/selectors/pieSelectors.ts +97 -0
- package/src/state/selectors/polarAxisSelectors.ts +201 -0
- package/src/state/selectors/polarGridSelectors.ts +28 -0
- package/src/state/selectors/polarScaleSelectors.ts +133 -0
- package/src/state/selectors/polarSelectors.ts +219 -0
- package/src/state/selectors/radarSelectors.ts +191 -0
- package/src/state/selectors/radialBarSelectors.ts +435 -0
- package/src/state/selectors/rootPropsSelectors.ts +25 -0
- package/src/state/selectors/scatterSelectors.ts +96 -0
- package/src/state/selectors/selectActivePropsFromChartPointer.ts +26 -0
- package/src/state/selectors/selectAllAxes.ts +17 -0
- package/src/state/selectors/selectChartOffset.ts +16 -0
- package/src/state/selectors/selectChartOffsetInternal.ts +136 -0
- package/src/state/selectors/selectLegendArea.ts +20 -0
- package/src/state/selectors/selectPlotArea.ts +22 -0
- package/src/state/selectors/selectTooltipAxisId.ts +7 -0
- package/src/state/selectors/selectTooltipAxisType.ts +32 -0
- package/src/state/selectors/selectTooltipEventType.ts +48 -0
- package/src/state/selectors/selectTooltipPayloadSearcher.ts +6 -0
- package/src/state/selectors/selectTooltipSettings.ts +39 -0
- package/src/state/selectors/selectTooltipState.ts +8 -0
- package/src/state/selectors/selectors.ts +271 -0
- package/src/state/selectors/tooltipSelectors.ts +578 -0
- package/src/state/selectors/touchSelectors.ts +31 -0
- package/src/state/store.ts +29 -0
- package/src/state/storeIdentity.ts +9 -0
- package/src/state/teardownWrite.ts +10 -0
- package/src/state/tooltipInteraction.ts +23 -0
- package/src/state/tooltipSlice.ts +334 -0
- package/src/state/touchEventsMiddleware.ts +214 -0
- package/src/state/types/AnimationSettings.ts +20 -0
- package/src/state/types/AreaSettings.ts +14 -0
- package/src/state/types/BarSettings.ts +15 -0
- package/src/state/types/LineSettings.ts +9 -0
- package/src/state/types/PieSettings.ts +34 -0
- package/src/state/types/RadarSettings.ts +5 -0
- package/src/state/types/RadialBarSettings.ts +10 -0
- package/src/state/types/ScatterSettings.ts +12 -0
- package/src/state/types/StackedGraphicalItem.ts +34 -0
- package/src/state/useChartState.ts +17 -0
- package/src/state/zIndexSlice.ts +39 -0
- package/src/synchronisation/syncSelectors.ts +7 -0
- package/src/synchronisation/types.ts +44 -0
- package/src/synchronisation/useChartSynchronisation.tsx +404 -0
- package/src/theme/RechartsTheme.ts +16 -0
- package/src/theme/RechartsThemeContext.ts +19 -0
- package/src/theme/darkTheme.ts +13 -0
- package/src/theme/graphicalItemIdentity.ts +70 -0
- package/src/theme/legacyTheme.ts +17 -0
- package/src/theme/lightTheme.ts +13 -0
- package/src/types.ts +54 -0
- package/src/util/ActiveShapeUtils.tsx +162 -0
- package/src/util/BarUtils.tsx +62 -0
- package/src/util/BarePortal.tsx +50 -0
- package/src/util/CamelCaseSVGAttrs.ts +34 -0
- package/src/util/CartesianUtils.ts +48 -0
- package/src/util/ChartUtils.ts +802 -0
- package/src/util/Constants.ts +42 -0
- package/src/util/CssPrefixUtils.ts +20 -0
- package/src/util/DOMUtils.ts +129 -0
- package/src/util/DataUtils.ts +216 -0
- package/src/util/Events.ts +16 -0
- package/src/util/FunnelUtils.tsx +15 -0
- package/src/util/Global.ts +12 -0
- package/src/util/IfOverflow.ts +15 -0
- package/src/util/LRUCache.ts +41 -0
- package/src/util/LogUtils.ts +22 -0
- package/src/util/PolarUtils.ts +132 -0
- package/src/util/RadialBarUtils.tsx +24 -0
- package/src/util/ReactUtils.ts +95 -0
- package/src/util/ReduceCSSCalc.ts +187 -0
- package/src/util/ScatterUtils.tsx +52 -0
- package/src/util/ShapeElementProps.tsx +87 -0
- package/src/util/TickUtils.ts +60 -0
- package/src/util/XAxisUtils.ts +48 -0
- package/src/util/YAxisUtils.ts +48 -0
- package/src/util/axisPropsAreEqual.ts +48 -0
- package/src/util/createCartesianCharts.tsx +150 -0
- package/src/util/createEventProxy.ts +20 -0
- package/src/util/createPolarCharts.tsx +112 -0
- package/src/util/cursor/getCursorPoints.ts +46 -0
- package/src/util/cursor/getCursorRectangle.ts +28 -0
- package/src/util/cursor/getRadialCursorPoints.ts +32 -0
- package/src/util/excludeEventProps.ts +171 -0
- package/src/util/getActiveCoordinate.ts +213 -0
- package/src/util/getAxisTypeBasedOnLayout.ts +21 -0
- package/src/util/getClassNameFromUnknown.ts +6 -0
- package/src/util/getEveryNth.ts +27 -0
- package/src/util/getRadiusAndStrokeWidthFromDot.ts +35 -0
- package/src/util/getRelativeCoordinate.ts +80 -0
- package/src/util/getSliced.ts +13 -0
- package/src/util/hoverDedupe.ts +41 -0
- package/src/util/isDomainSpecifiedByUser.ts +219 -0
- package/src/util/isWellBehavedNumber.ts +7 -0
- package/src/util/pathTotalLength.ts +25 -0
- package/src/util/payload/getUniqPayload.ts +28 -0
- package/src/util/propsAreEqual.ts +121 -0
- package/src/util/resolveDefaultProps.ts +161 -0
- package/src/util/round.ts +32 -0
- package/src/util/scale/CartesianScaleHelper.ts +72 -0
- package/src/util/scale/CustomScaleDefinition.ts +81 -0
- package/src/util/scale/RechartsScale.ts +130 -0
- package/src/util/scale/createCategoricalInverse.ts +72 -0
- package/src/util/scale/getNiceTickValues.ts +311 -0
- package/src/util/scale/index.ts +2 -0
- package/src/util/scale/util/arithmetic.ts +54 -0
- package/src/util/solid-1-compat.ts +310 -0
- package/src/util/solidJsxCamelAugment.d.ts +84 -0
- package/src/util/stacks/getStackSeriesIdentifier.ts +21 -0
- package/src/util/stacks/stackTypes.ts +60 -0
- package/src/util/structurallyEqual.ts +31 -0
- package/src/util/svgPropertiesAndEvents.ts +53 -0
- package/src/util/svgPropertiesNoEvents.ts +571 -0
- package/src/util/tooltip/translate.ts +171 -0
- package/src/util/typedDataKey.ts +48 -0
- package/src/util/types.ts +1560 -0
- package/src/util/useAnimationId.ts +31 -0
- package/src/util/useElementOffset.ts +110 -0
- package/src/util/useId.ts +8 -0
- package/src/util/usePrefersReducedMotion.ts +48 -0
- package/src/util/useReportScale.ts +24 -0
- package/src/util/useUniqueId.ts +30 -0
- package/src/zIndex/DefaultZIndexes.ts +84 -0
- package/src/zIndex/ZIndexLayer.tsx +121 -0
- package/src/zIndex/ZIndexPortal.tsx +79 -0
- package/src/zIndex/getZIndexFromUnknown.ts +14 -0
- package/src/zIndex/zIndexSelectors.ts +48 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { JSX } from '@solidjs/web';
|
|
3
|
+
import { arrayTooltipSearcher } from "../state/optionsSlice"
|
|
4
|
+
import { CartesianChart } from "./CartesianChart"
|
|
5
|
+
import type { CartesianChartProps, TooltipEventType } from "../util/types"
|
|
6
|
+
|
|
7
|
+
const allowedTooltipTypes: ReadonlyArray<TooltipEventType> = ["axis"]
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @consumes ResponsiveContainerContext
|
|
11
|
+
* @provides CartesianViewBoxContext
|
|
12
|
+
* @provides CartesianChartContext
|
|
13
|
+
*/
|
|
14
|
+
export function AreaChart<DataPointType = unknown>(
|
|
15
|
+
props: CartesianChartProps<DataPointType> & {
|
|
16
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void)
|
|
17
|
+
},
|
|
18
|
+
): JSX.Element {
|
|
19
|
+
return (
|
|
20
|
+
<CartesianChart
|
|
21
|
+
chartName="AreaChart"
|
|
22
|
+
defaultTooltipEventType="axis"
|
|
23
|
+
validateTooltipEventTypes={allowedTooltipTypes}
|
|
24
|
+
tooltipPayloadSearcher={arrayTooltipSearcher}
|
|
25
|
+
categoricalChartProps={props}
|
|
26
|
+
ref={props.ref}
|
|
27
|
+
/>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { JSX } from '@solidjs/web';
|
|
3
|
+
import { arrayTooltipSearcher } from "../state/optionsSlice"
|
|
4
|
+
import type { CartesianChartProps, TooltipEventType } from "../util/types"
|
|
5
|
+
import { CartesianChart } from "./CartesianChart"
|
|
6
|
+
|
|
7
|
+
const allowedTooltipTypes: ReadonlyArray<TooltipEventType> = ["axis", "item"]
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @consumes ResponsiveContainerContext
|
|
11
|
+
* @provides CartesianViewBoxContext
|
|
12
|
+
* @provides CartesianChartContext
|
|
13
|
+
*/
|
|
14
|
+
export function BarChart<DataPointType = unknown>(
|
|
15
|
+
props: CartesianChartProps<DataPointType> & {
|
|
16
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void)
|
|
17
|
+
},
|
|
18
|
+
): JSX.Element {
|
|
19
|
+
return (
|
|
20
|
+
<CartesianChart
|
|
21
|
+
chartName="BarChart"
|
|
22
|
+
defaultTooltipEventType="axis"
|
|
23
|
+
validateTooltipEventTypes={allowedTooltipTypes}
|
|
24
|
+
tooltipPayloadSearcher={arrayTooltipSearcher}
|
|
25
|
+
categoricalChartProps={props}
|
|
26
|
+
ref={props.ref}
|
|
27
|
+
/>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import { createMemo, untrack } from 'solid-js';
|
|
3
|
+
import type { ChartOptions } from "../state/optionsSlice"
|
|
4
|
+
import { RechartsStateProvider } from "../state/RechartsStateProvider"
|
|
5
|
+
import { createInitialChartDataState, createInitialLayoutState } from "../state/chartState"
|
|
6
|
+
import { ChartDataContextProvider } from "../context/chartDataContext"
|
|
7
|
+
import { ReportMainChartProps } from "../state/ReportMainChartProps"
|
|
8
|
+
import { ReportChartProps } from "../state/ReportChartProps"
|
|
9
|
+
import { createInitialRootProps } from "./createInitialRootProps"
|
|
10
|
+
import { ReportEventSettings } from "../state/ReportEventSettings"
|
|
11
|
+
import type { CartesianChartProps, Margin, TooltipEventType } from "../util/types"
|
|
12
|
+
import type { TooltipPayloadSearcher } from "../state/tooltipSlice"
|
|
13
|
+
import { CategoricalChart } from "./CategoricalChart"
|
|
14
|
+
import { resolveDefaultProps } from "../util/resolveDefaultProps"
|
|
15
|
+
import { initialEventSettingsState } from "../state/eventSettingsSlice"
|
|
16
|
+
|
|
17
|
+
import { splitProps } from '../util/solid-1-compat';
|
|
18
|
+
const defaultMargin: Margin = { bottom: 5, left: 5, right: 5, top: 5 }
|
|
19
|
+
|
|
20
|
+
export const defaultCartesianChartProps = {
|
|
21
|
+
accessibilityLayer: true,
|
|
22
|
+
barCategoryGap: "10%",
|
|
23
|
+
barGap: 4,
|
|
24
|
+
layout: "horizontal",
|
|
25
|
+
margin: defaultMargin,
|
|
26
|
+
responsive: false,
|
|
27
|
+
reverseStackOrder: false,
|
|
28
|
+
stackOffset: "none",
|
|
29
|
+
syncMethod: "index",
|
|
30
|
+
...initialEventSettingsState,
|
|
31
|
+
} as const satisfies Partial<CartesianChartProps>
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* These are one-time, immutable options that decide the chart's behavior.
|
|
35
|
+
* Users who wish to call CartesianChart may decide to pass these options explicitly,
|
|
36
|
+
* but usually we would expect that they use one of the convenience components like BarChart, LineChart, etc.
|
|
37
|
+
*/
|
|
38
|
+
export type CartesianChartOptions = {
|
|
39
|
+
chartName: string
|
|
40
|
+
defaultTooltipEventType: TooltipEventType
|
|
41
|
+
validateTooltipEventTypes: ReadonlyArray<TooltipEventType>
|
|
42
|
+
tooltipPayloadSearcher: TooltipPayloadSearcher
|
|
43
|
+
categoricalChartProps: CartesianChartProps
|
|
44
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function CartesianChartInner(props: {
|
|
48
|
+
categoricalChartProps: CartesianChartProps
|
|
49
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void)
|
|
50
|
+
}) {
|
|
51
|
+
/*
|
|
52
|
+
* Owner MUST be inside RechartsStoreProvider — the memo captures its creation-site owner,
|
|
53
|
+
* and any createComponent triggered during memo evaluation (via the `children` getter on
|
|
54
|
+
* the Solid props proxy) inherits that owner. If this memo lived in the outer CartesianChart
|
|
55
|
+
* component, children instantiated through the spread would be OUTSIDE the store Provider.
|
|
56
|
+
*
|
|
57
|
+
* Children must NOT flow through the resolveDefaultProps spread. resolveDefaultProps does
|
|
58
|
+
* `{...realProps}` which enumerates own keys of the Solid props proxy — reading the
|
|
59
|
+
* `children` getter eagerly calls createComponent(...) on user JSX (Legend, Tooltip, etc.)
|
|
60
|
+
* under the CURRENT owner. That owner is inside RechartsStoreProvider but OUTSIDE
|
|
61
|
+
* RechartsWrapper, so user components miss the LegendPortalContext / TooltipPortalContext
|
|
62
|
+
* Providers that RechartsWrapper installs. Strip children with splitProps and pass them
|
|
63
|
+
* as JSX children so the read happens deep inside RechartsWrapper, where all Providers
|
|
64
|
+
* are visible.
|
|
65
|
+
*/
|
|
66
|
+
/* eslint-disable-next-line solid/reactivity -- splitProps receives the nested prop accessor once; restProps is a reactive proxy, reactivity flows through it */
|
|
67
|
+
const [childrenProps, restProps] = splitProps(props.categoricalChartProps, ["children"])
|
|
68
|
+
const rootChartProps = createMemo(() =>
|
|
69
|
+
resolveDefaultProps(restProps, defaultCartesianChartProps),
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
return (
|
|
73
|
+
<>
|
|
74
|
+
<ChartDataContextProvider chartData={rootChartProps().data} />
|
|
75
|
+
<ReportMainChartProps layout={rootChartProps().layout} margin={rootChartProps().margin} />
|
|
76
|
+
<ReportEventSettings
|
|
77
|
+
throttleDelay={rootChartProps().throttleDelay}
|
|
78
|
+
throttledEvents={rootChartProps().throttledEvents}
|
|
79
|
+
/>
|
|
80
|
+
<ReportChartProps
|
|
81
|
+
baseValue={rootChartProps().baseValue}
|
|
82
|
+
accessibilityLayer={rootChartProps().accessibilityLayer}
|
|
83
|
+
barCategoryGap={rootChartProps().barCategoryGap}
|
|
84
|
+
maxBarSize={rootChartProps().maxBarSize}
|
|
85
|
+
stackOffset={rootChartProps().stackOffset}
|
|
86
|
+
barGap={rootChartProps().barGap}
|
|
87
|
+
barSize={rootChartProps().barSize}
|
|
88
|
+
syncId={rootChartProps().syncId}
|
|
89
|
+
syncMethod={rootChartProps().syncMethod}
|
|
90
|
+
className={rootChartProps().className}
|
|
91
|
+
reverseStackOrder={rootChartProps().reverseStackOrder}
|
|
92
|
+
/>
|
|
93
|
+
<CategoricalChart {...rootChartProps()} ref={props.ref}>
|
|
94
|
+
{childrenProps.children}
|
|
95
|
+
</CategoricalChart>
|
|
96
|
+
</>
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function CartesianChart(props: CartesianChartOptions) {
|
|
101
|
+
const options = (): ChartOptions => ({
|
|
102
|
+
chartName: props.chartName,
|
|
103
|
+
defaultTooltipEventType: props.defaultTooltipEventType,
|
|
104
|
+
eventEmitter: undefined,
|
|
105
|
+
tooltipPayloadSearcher: props.tooltipPayloadSearcher,
|
|
106
|
+
validateTooltipEventTypes: props.validateTooltipEventTypes,
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
const initialChartData = () =>
|
|
110
|
+
untrack(() => createInitialChartDataState(props.categoricalChartProps.data))
|
|
111
|
+
const initialLayout = () =>
|
|
112
|
+
untrack(() =>
|
|
113
|
+
createInitialLayoutState({
|
|
114
|
+
height: props.categoricalChartProps.height,
|
|
115
|
+
layoutType: props.categoricalChartProps.layout ?? defaultCartesianChartProps.layout,
|
|
116
|
+
margin: props.categoricalChartProps.margin ?? defaultCartesianChartProps.margin,
|
|
117
|
+
width: props.categoricalChartProps.width,
|
|
118
|
+
}),
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
<RechartsStateProvider preloadedState={{
|
|
123
|
+
chartData: initialChartData(),
|
|
124
|
+
layout: initialLayout(),
|
|
125
|
+
options: options(),
|
|
126
|
+
rootProps: untrack(() => createInitialRootProps(props.categoricalChartProps)),
|
|
127
|
+
}}>
|
|
128
|
+
<CartesianChartInner categoricalChartProps={props.categoricalChartProps} ref={props.ref} />
|
|
129
|
+
</RechartsStateProvider>
|
|
130
|
+
)
|
|
131
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import { RootSurface } from "../container/RootSurface"
|
|
3
|
+
import { RechartsWrapper } from "./RechartsWrapper"
|
|
4
|
+
import { ClipPathProvider } from "../container/ClipPathProvider"
|
|
5
|
+
import { useIsPanorama } from "../context/PanoramaContext"
|
|
6
|
+
import type { CartesianChartProps } from "../util/types"
|
|
7
|
+
import { svgPropertiesNoEvents } from "../util/svgPropertiesNoEvents"
|
|
8
|
+
import { ReportChartSize } from "../context/chartLayoutContext"
|
|
9
|
+
|
|
10
|
+
import { untrack } from "solid-js"
|
|
11
|
+
import { bindRef, splitProps } from '../util/solid-1-compat';
|
|
12
|
+
export function CategoricalChart(
|
|
13
|
+
props: CartesianChartProps & {
|
|
14
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void)
|
|
15
|
+
},
|
|
16
|
+
) {
|
|
17
|
+
const [local, others] = splitProps(props, [
|
|
18
|
+
"width",
|
|
19
|
+
"height",
|
|
20
|
+
"responsive",
|
|
21
|
+
"children",
|
|
22
|
+
"className",
|
|
23
|
+
"style",
|
|
24
|
+
"compact",
|
|
25
|
+
"title",
|
|
26
|
+
"desc",
|
|
27
|
+
"ref",
|
|
28
|
+
"onClick",
|
|
29
|
+
"onMouseLeave",
|
|
30
|
+
"onMouseEnter",
|
|
31
|
+
"onMouseMove",
|
|
32
|
+
"onMouseDown",
|
|
33
|
+
"onMouseUp",
|
|
34
|
+
"onContextMenu",
|
|
35
|
+
"onDoubleClick",
|
|
36
|
+
"onTouchStart",
|
|
37
|
+
"onTouchMove",
|
|
38
|
+
"onTouchEnd",
|
|
39
|
+
])
|
|
40
|
+
const attrs = () => svgPropertiesNoEvents(others)
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
* The "compact" mode is used as the panorama within Brush.
|
|
44
|
+
* However because `compact` is a public prop, let's assume that it can render outside of Brush too.
|
|
45
|
+
*/
|
|
46
|
+
/* Upstream Brush clones its child chart with `compact: true`; Solid cannot clone
|
|
47
|
+
JSX, so a chart rendered inside the Brush panorama is compact by context.
|
|
48
|
+
`compact` is set once at creation and never changes at runtime. */
|
|
49
|
+
const isPanorama = useIsPanorama()
|
|
50
|
+
if (isPanorama || untrack(() => local.compact)) {
|
|
51
|
+
return (
|
|
52
|
+
<>
|
|
53
|
+
<ReportChartSize width={local.width} height={local.height} />
|
|
54
|
+
<RootSurface
|
|
55
|
+
otherAttributes={attrs()}
|
|
56
|
+
title={local.title}
|
|
57
|
+
desc={local.desc}
|
|
58
|
+
>
|
|
59
|
+
{local.children}
|
|
60
|
+
</RootSurface>
|
|
61
|
+
</>
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<RechartsWrapper
|
|
67
|
+
class={local.className}
|
|
68
|
+
style={local.style}
|
|
69
|
+
width={local.width}
|
|
70
|
+
height={local.height}
|
|
71
|
+
responsive={local.responsive ?? false}
|
|
72
|
+
onClick={local.onClick}
|
|
73
|
+
onMouseLeave={local.onMouseLeave}
|
|
74
|
+
onMouseEnter={local.onMouseEnter}
|
|
75
|
+
onMouseMove={local.onMouseMove}
|
|
76
|
+
onMouseDown={local.onMouseDown}
|
|
77
|
+
onMouseUp={local.onMouseUp}
|
|
78
|
+
onContextMenu={local.onContextMenu}
|
|
79
|
+
onDoubleClick={local.onDoubleClick}
|
|
80
|
+
onTouchStart={local.onTouchStart}
|
|
81
|
+
onTouchMove={local.onTouchMove}
|
|
82
|
+
onTouchEnd={local.onTouchEnd}
|
|
83
|
+
>
|
|
84
|
+
<RootSurface
|
|
85
|
+
otherAttributes={attrs()}
|
|
86
|
+
title={local.title}
|
|
87
|
+
desc={local.desc}
|
|
88
|
+
ref={(el) => bindRef(local.ref, el)}
|
|
89
|
+
>
|
|
90
|
+
<ClipPathProvider>{local.children}</ClipPathProvider>
|
|
91
|
+
</RootSurface>
|
|
92
|
+
</RechartsWrapper>
|
|
93
|
+
)
|
|
94
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { JSX } from '@solidjs/web';
|
|
3
|
+
import { arrayTooltipSearcher } from "../state/optionsSlice"
|
|
4
|
+
import { CartesianChart } from "./CartesianChart"
|
|
5
|
+
import type { CartesianChartProps, TooltipEventType } from "../util/types"
|
|
6
|
+
|
|
7
|
+
const allowedTooltipTypes: ReadonlyArray<TooltipEventType> = ["axis"]
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @consumes ResponsiveContainerContext
|
|
11
|
+
* @provides CartesianViewBoxContext
|
|
12
|
+
* @provides CartesianChartContext
|
|
13
|
+
*/
|
|
14
|
+
export function ComposedChart<DataPointType = unknown>(
|
|
15
|
+
props: CartesianChartProps<DataPointType> & {
|
|
16
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void)
|
|
17
|
+
},
|
|
18
|
+
): JSX.Element {
|
|
19
|
+
return (
|
|
20
|
+
<CartesianChart
|
|
21
|
+
chartName="ComposedChart"
|
|
22
|
+
defaultTooltipEventType="axis"
|
|
23
|
+
validateTooltipEventTypes={allowedTooltipTypes}
|
|
24
|
+
tooltipPayloadSearcher={arrayTooltipSearcher}
|
|
25
|
+
categoricalChartProps={props}
|
|
26
|
+
ref={props.ref}
|
|
27
|
+
/>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { JSX } from '@solidjs/web';
|
|
3
|
+
import { arrayTooltipSearcher } from "../state/optionsSlice"
|
|
4
|
+
import { CartesianChart } from "./CartesianChart"
|
|
5
|
+
import type { CartesianChartProps, TooltipEventType } from "../util/types"
|
|
6
|
+
|
|
7
|
+
const allowedTooltipTypes: ReadonlyArray<TooltipEventType> = ["item"]
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @consumes ResponsiveContainerContext
|
|
11
|
+
* @provides CartesianViewBoxContext
|
|
12
|
+
* @provides CartesianChartContext
|
|
13
|
+
*/
|
|
14
|
+
export function FunnelChart<DataPointType = unknown>(
|
|
15
|
+
props: CartesianChartProps<DataPointType> & {
|
|
16
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void)
|
|
17
|
+
},
|
|
18
|
+
): JSX.Element {
|
|
19
|
+
return (
|
|
20
|
+
<CartesianChart
|
|
21
|
+
chartName="FunnelChart"
|
|
22
|
+
defaultTooltipEventType="item"
|
|
23
|
+
validateTooltipEventTypes={allowedTooltipTypes}
|
|
24
|
+
tooltipPayloadSearcher={arrayTooltipSearcher}
|
|
25
|
+
categoricalChartProps={props}
|
|
26
|
+
ref={props.ref}
|
|
27
|
+
/>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { JSX } from '@solidjs/web';
|
|
3
|
+
import { arrayTooltipSearcher } from "../state/optionsSlice"
|
|
4
|
+
import { CartesianChart } from "./CartesianChart"
|
|
5
|
+
import type { CartesianChartProps, TooltipEventType } from "../util/types"
|
|
6
|
+
|
|
7
|
+
const allowedTooltipTypes: ReadonlyArray<TooltipEventType> = ["axis"]
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @consumes ResponsiveContainerContext
|
|
11
|
+
* @provides CartesianViewBoxContext
|
|
12
|
+
* @provides CartesianChartContext
|
|
13
|
+
*/
|
|
14
|
+
export function LineChart<DataPointType = unknown>(
|
|
15
|
+
props: CartesianChartProps<DataPointType> & {
|
|
16
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void)
|
|
17
|
+
},
|
|
18
|
+
): JSX.Element {
|
|
19
|
+
return (
|
|
20
|
+
<CartesianChart
|
|
21
|
+
chartName="LineChart"
|
|
22
|
+
defaultTooltipEventType="axis"
|
|
23
|
+
validateTooltipEventTypes={allowedTooltipTypes}
|
|
24
|
+
tooltipPayloadSearcher={arrayTooltipSearcher}
|
|
25
|
+
categoricalChartProps={props}
|
|
26
|
+
ref={props.ref}
|
|
27
|
+
/>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { JSX } from '@solidjs/web';
|
|
3
|
+
import { arrayTooltipSearcher } from "../state/optionsSlice"
|
|
4
|
+
import { defaultPolarChartProps, PolarChart } from "./PolarChart"
|
|
5
|
+
import type { PolarChartProps, TooltipEventType } from "../util/types"
|
|
6
|
+
|
|
7
|
+
import { mergeProps } from '../util/solid-1-compat';
|
|
8
|
+
const allowedTooltipTypes: ReadonlyArray<TooltipEventType> = ["item"]
|
|
9
|
+
|
|
10
|
+
export const defaultPieChartProps = {
|
|
11
|
+
...defaultPolarChartProps,
|
|
12
|
+
endAngle: 360,
|
|
13
|
+
layout: "centric",
|
|
14
|
+
startAngle: 0,
|
|
15
|
+
} as const satisfies Partial<PolarChartProps<never>>
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @consumes ResponsiveContainerContext
|
|
19
|
+
* @provides PolarViewBoxContext
|
|
20
|
+
* @provides PolarChartContext
|
|
21
|
+
*/
|
|
22
|
+
export function PieChart<DataPointType = unknown>(
|
|
23
|
+
props: PolarChartProps<DataPointType> & { ref?: SVGSVGElement | ((el: SVGSVGElement) => void) },
|
|
24
|
+
): JSX.Element {
|
|
25
|
+
/* mergeProps preserves the props proxy — do NOT resolveDefaultProps here.
|
|
26
|
+
resolveDefaultProps spreads `{...realProps}` which enumerates own keys including
|
|
27
|
+
`children`; reading the children getter eagerly instantiates user JSX (Legend,
|
|
28
|
+
Tooltip, etc.) under PieChart's owner — which sits ABOVE RechartsStoreProvider
|
|
29
|
+
and the portal Providers, breaking every downstream context lookup. */
|
|
30
|
+
const propsWithDefaults = mergeProps(defaultPieChartProps, props) as PolarChartProps<
|
|
31
|
+
DataPointType
|
|
32
|
+
> & {
|
|
33
|
+
cx: NonNullable<PolarChartProps["cx"]>
|
|
34
|
+
cy: NonNullable<PolarChartProps["cy"]>
|
|
35
|
+
startAngle: NonNullable<PolarChartProps["startAngle"]>
|
|
36
|
+
endAngle: NonNullable<PolarChartProps["endAngle"]>
|
|
37
|
+
innerRadius: NonNullable<PolarChartProps["innerRadius"]>
|
|
38
|
+
outerRadius: NonNullable<PolarChartProps["outerRadius"]>
|
|
39
|
+
}
|
|
40
|
+
return (
|
|
41
|
+
<PolarChart
|
|
42
|
+
chartName="PieChart"
|
|
43
|
+
defaultTooltipEventType="item"
|
|
44
|
+
validateTooltipEventTypes={allowedTooltipTypes}
|
|
45
|
+
tooltipPayloadSearcher={arrayTooltipSearcher}
|
|
46
|
+
categoricalChartProps={propsWithDefaults}
|
|
47
|
+
ref={props.ref}
|
|
48
|
+
/>
|
|
49
|
+
)
|
|
50
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import { createMemo, untrack } from 'solid-js';
|
|
3
|
+
import type { ChartOptions } from "../state/optionsSlice"
|
|
4
|
+
import { RechartsStateProvider } from "../state/RechartsStateProvider"
|
|
5
|
+
import { createInitialChartDataState, createInitialLayoutState } from "../state/chartState"
|
|
6
|
+
import { ChartDataContextProvider } from "../context/chartDataContext"
|
|
7
|
+
import { ReportMainChartProps } from "../state/ReportMainChartProps"
|
|
8
|
+
import { ReportChartProps } from "../state/ReportChartProps"
|
|
9
|
+
import { createInitialRootProps } from "./createInitialRootProps"
|
|
10
|
+
import { ReportEventSettings } from "../state/ReportEventSettings"
|
|
11
|
+
import { ReportPolarOptions } from "../state/ReportPolarOptions"
|
|
12
|
+
import type { Margin, PolarChartProps, TooltipEventType } from "../util/types"
|
|
13
|
+
import type { TooltipPayloadSearcher } from "../state/tooltipSlice"
|
|
14
|
+
import { CategoricalChart } from "./CategoricalChart"
|
|
15
|
+
import { resolveDefaultProps } from "../util/resolveDefaultProps"
|
|
16
|
+
import { initialEventSettingsState } from "../state/eventSettingsSlice"
|
|
17
|
+
|
|
18
|
+
import { splitProps } from '../util/solid-1-compat';
|
|
19
|
+
const defaultMargin: Margin = { bottom: 5, left: 5, right: 5, top: 5 }
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* These default props are the same for all PolarChart components.
|
|
23
|
+
*/
|
|
24
|
+
export const defaultPolarChartProps = {
|
|
25
|
+
accessibilityLayer: true,
|
|
26
|
+
barCategoryGap: "10%",
|
|
27
|
+
barGap: 4,
|
|
28
|
+
cx: "50%",
|
|
29
|
+
cy: "50%",
|
|
30
|
+
innerRadius: 0,
|
|
31
|
+
layout: "radial",
|
|
32
|
+
margin: defaultMargin,
|
|
33
|
+
outerRadius: "80%",
|
|
34
|
+
responsive: false,
|
|
35
|
+
reverseStackOrder: false,
|
|
36
|
+
stackOffset: "none",
|
|
37
|
+
syncMethod: "index",
|
|
38
|
+
...initialEventSettingsState,
|
|
39
|
+
} as const satisfies Partial<PolarChartProps<never>>
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* These props are required for the PolarChart to function correctly.
|
|
43
|
+
* Users usually would not need to specify these explicitly,
|
|
44
|
+
* because the convenience components like PieChart, RadarChart, etc.
|
|
45
|
+
* will provide these defaults.
|
|
46
|
+
* We can't have the defaults in this file because each of those convenience components
|
|
47
|
+
* have their own opinions about what they should be.
|
|
48
|
+
*/
|
|
49
|
+
type PolarChartPropsWithDefaults = PolarChartProps & {
|
|
50
|
+
cx: NonNullable<PolarChartProps["cx"]>
|
|
51
|
+
cy: NonNullable<PolarChartProps["cy"]>
|
|
52
|
+
startAngle: NonNullable<PolarChartProps["startAngle"]>
|
|
53
|
+
endAngle: NonNullable<PolarChartProps["endAngle"]>
|
|
54
|
+
innerRadius: NonNullable<PolarChartProps["innerRadius"]>
|
|
55
|
+
outerRadius: NonNullable<PolarChartProps["outerRadius"]>
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* These are one-time, immutable options that decide the chart's behavior.
|
|
60
|
+
* Users who wish to call CartesianChart may decide to pass these options explicitly,
|
|
61
|
+
* but usually we would expect that they use one of the convenience components like PieChart, RadarChart, etc.
|
|
62
|
+
*/
|
|
63
|
+
export type PolarChartOptions = {
|
|
64
|
+
chartName: string
|
|
65
|
+
defaultTooltipEventType: TooltipEventType
|
|
66
|
+
validateTooltipEventTypes: ReadonlyArray<TooltipEventType>
|
|
67
|
+
tooltipPayloadSearcher: TooltipPayloadSearcher
|
|
68
|
+
categoricalChartProps: PolarChartPropsWithDefaults
|
|
69
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function PolarChartInner(props: {
|
|
73
|
+
categoricalChartProps: PolarChartPropsWithDefaults
|
|
74
|
+
ref?: SVGSVGElement | ((el: SVGSVGElement) => void)
|
|
75
|
+
}) {
|
|
76
|
+
/*
|
|
77
|
+
* See GOTCHA-004 and GOTCHA-005: memo must be created inside RechartsStoreProvider.
|
|
78
|
+
* resolveDefaultProps spreads the props proxy, which enumerates own keys including
|
|
79
|
+
* `children`; reading the children getter eagerly instantiates user JSX (Legend,
|
|
80
|
+
* Tooltip, etc.) under the CURRENT owner. That owner sits above RechartsWrapper, so
|
|
81
|
+
* those user components miss the LegendPortalContext / TooltipPortalContext Providers.
|
|
82
|
+
* Strip children with splitProps and pass them as JSX children so the read happens
|
|
83
|
+
* deep inside RechartsWrapper, where every Provider is visible.
|
|
84
|
+
*/
|
|
85
|
+
/* eslint-disable-next-line solid/reactivity -- splitProps receives the nested prop accessor once; restProps is a reactive proxy, reactivity flows through it */
|
|
86
|
+
const [childrenProps, restProps] = splitProps(props.categoricalChartProps, ["children"])
|
|
87
|
+
const polarChartProps = createMemo(() =>
|
|
88
|
+
resolveDefaultProps(restProps, defaultPolarChartProps),
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
return (
|
|
92
|
+
<>
|
|
93
|
+
<ChartDataContextProvider chartData={polarChartProps().data} />
|
|
94
|
+
<ReportMainChartProps layout={polarChartProps().layout} margin={polarChartProps().margin} />
|
|
95
|
+
<ReportEventSettings
|
|
96
|
+
throttleDelay={polarChartProps().throttleDelay}
|
|
97
|
+
throttledEvents={polarChartProps().throttledEvents}
|
|
98
|
+
/>
|
|
99
|
+
<ReportChartProps
|
|
100
|
+
baseValue={undefined}
|
|
101
|
+
accessibilityLayer={polarChartProps().accessibilityLayer}
|
|
102
|
+
barCategoryGap={polarChartProps().barCategoryGap}
|
|
103
|
+
maxBarSize={polarChartProps().maxBarSize}
|
|
104
|
+
stackOffset={polarChartProps().stackOffset}
|
|
105
|
+
barGap={polarChartProps().barGap}
|
|
106
|
+
barSize={polarChartProps().barSize}
|
|
107
|
+
syncId={polarChartProps().syncId}
|
|
108
|
+
syncMethod={polarChartProps().syncMethod}
|
|
109
|
+
className={polarChartProps().className}
|
|
110
|
+
reverseStackOrder={polarChartProps().reverseStackOrder}
|
|
111
|
+
/>
|
|
112
|
+
<ReportPolarOptions
|
|
113
|
+
cx={polarChartProps().cx}
|
|
114
|
+
cy={polarChartProps().cy}
|
|
115
|
+
startAngle={polarChartProps().startAngle}
|
|
116
|
+
endAngle={polarChartProps().endAngle}
|
|
117
|
+
innerRadius={polarChartProps().innerRadius}
|
|
118
|
+
outerRadius={polarChartProps().outerRadius}
|
|
119
|
+
/>
|
|
120
|
+
<CategoricalChart
|
|
121
|
+
{...(() => {
|
|
122
|
+
const { layout: _layout, ...rest } = polarChartProps()
|
|
123
|
+
return rest
|
|
124
|
+
})()}
|
|
125
|
+
ref={props.ref}
|
|
126
|
+
>
|
|
127
|
+
{childrenProps.children}
|
|
128
|
+
</CategoricalChart>
|
|
129
|
+
</>
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function PolarChart(props: PolarChartOptions) {
|
|
134
|
+
const options = (): ChartOptions => ({
|
|
135
|
+
chartName: props.chartName,
|
|
136
|
+
defaultTooltipEventType: props.defaultTooltipEventType,
|
|
137
|
+
eventEmitter: undefined,
|
|
138
|
+
tooltipPayloadSearcher: props.tooltipPayloadSearcher,
|
|
139
|
+
validateTooltipEventTypes: props.validateTooltipEventTypes,
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
const initialChartData = () =>
|
|
143
|
+
untrack(() => createInitialChartDataState(props.categoricalChartProps.data))
|
|
144
|
+
const initialLayout = () =>
|
|
145
|
+
untrack(() =>
|
|
146
|
+
createInitialLayoutState({
|
|
147
|
+
height: props.categoricalChartProps.height,
|
|
148
|
+
layoutType: props.categoricalChartProps.layout ?? defaultPolarChartProps.layout,
|
|
149
|
+
margin: props.categoricalChartProps.margin ?? defaultPolarChartProps.margin,
|
|
150
|
+
width: props.categoricalChartProps.width,
|
|
151
|
+
}),
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
return (
|
|
155
|
+
<RechartsStateProvider preloadedState={{
|
|
156
|
+
chartData: initialChartData(),
|
|
157
|
+
layout: initialLayout(),
|
|
158
|
+
options: options(),
|
|
159
|
+
rootProps: untrack(() => createInitialRootProps(props.categoricalChartProps)),
|
|
160
|
+
}}>
|
|
161
|
+
<PolarChartInner categoricalChartProps={props.categoricalChartProps} ref={props.ref} />
|
|
162
|
+
</RechartsStateProvider>
|
|
163
|
+
)
|
|
164
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import type { JSX } from '@solidjs/web';
|
|
3
|
+
import { arrayTooltipSearcher } from "../state/optionsSlice"
|
|
4
|
+
import type { PolarChartProps, PolarLayout, TooltipEventType } from "../util/types"
|
|
5
|
+
import { defaultPolarChartProps, PolarChart } from "./PolarChart"
|
|
6
|
+
|
|
7
|
+
import { mergeProps } from '../util/solid-1-compat';
|
|
8
|
+
const allowedTooltipTypes: ReadonlyArray<TooltipEventType> = ["axis"]
|
|
9
|
+
|
|
10
|
+
export const defaultRadarChartProps = {
|
|
11
|
+
...defaultPolarChartProps,
|
|
12
|
+
endAngle: -270,
|
|
13
|
+
layout: "centric",
|
|
14
|
+
startAngle: 90,
|
|
15
|
+
} as const satisfies Partial<PolarChartProps<never>>
|
|
16
|
+
|
|
17
|
+
type RadarChartProps<DataPointType> = Omit<
|
|
18
|
+
PolarChartProps<DataPointType>,
|
|
19
|
+
"layout" | "startAngle" | "endAngle"
|
|
20
|
+
> & {
|
|
21
|
+
/**
|
|
22
|
+
* The layout of chart defines the orientation of axes, graphical items, and tooltip.
|
|
23
|
+
*
|
|
24
|
+
* @defaultValue centric
|
|
25
|
+
*/
|
|
26
|
+
layout?: PolarLayout
|
|
27
|
+
/**
|
|
28
|
+
* Angle in degrees from which the chart should start.
|
|
29
|
+
* @defaultValue 90
|
|
30
|
+
*
|
|
31
|
+
*/
|
|
32
|
+
startAngle?: number
|
|
33
|
+
/**
|
|
34
|
+
* Angle, in degrees, at which the chart should end.
|
|
35
|
+
*
|
|
36
|
+
* @defaultValue -270
|
|
37
|
+
*/
|
|
38
|
+
endAngle?: number
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @consumes ResponsiveContainerContext
|
|
43
|
+
* @provides PolarViewBoxContext
|
|
44
|
+
* @provides PolarChartContext
|
|
45
|
+
*/
|
|
46
|
+
export function RadarChart<DataPointType = unknown>(
|
|
47
|
+
props: RadarChartProps<DataPointType> & { ref?: SVGSVGElement | ((el: SVGSVGElement) => void) },
|
|
48
|
+
): JSX.Element {
|
|
49
|
+
/* mergeProps preserves the props proxy — see PieChart for the rationale. */
|
|
50
|
+
const propsWithDefaults = mergeProps(defaultRadarChartProps, props) as PolarChartProps<
|
|
51
|
+
DataPointType
|
|
52
|
+
> & {
|
|
53
|
+
cx: NonNullable<PolarChartProps["cx"]>
|
|
54
|
+
cy: NonNullable<PolarChartProps["cy"]>
|
|
55
|
+
startAngle: NonNullable<PolarChartProps["startAngle"]>
|
|
56
|
+
endAngle: NonNullable<PolarChartProps["endAngle"]>
|
|
57
|
+
innerRadius: NonNullable<PolarChartProps["innerRadius"]>
|
|
58
|
+
outerRadius: NonNullable<PolarChartProps["outerRadius"]>
|
|
59
|
+
}
|
|
60
|
+
return (
|
|
61
|
+
<PolarChart
|
|
62
|
+
chartName="RadarChart"
|
|
63
|
+
defaultTooltipEventType="axis"
|
|
64
|
+
validateTooltipEventTypes={allowedTooltipTypes}
|
|
65
|
+
tooltipPayloadSearcher={arrayTooltipSearcher}
|
|
66
|
+
categoricalChartProps={propsWithDefaults}
|
|
67
|
+
ref={props.ref}
|
|
68
|
+
/>
|
|
69
|
+
)
|
|
70
|
+
}
|