@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,280 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
/**
|
|
3
|
+
* @fileOverview Rectangle
|
|
4
|
+
*/
|
|
5
|
+
import type { JSX } from '@solidjs/web';
|
|
6
|
+
import { useShapeElementProps } from "../util/ShapeElementProps"
|
|
7
|
+
import type { WithoutRemoveFalse } from "../util/types"
|
|
8
|
+
import { createMemo, createSignal, Show, createEffect, untrack } from 'solid-js';
|
|
9
|
+
import { clsx } from "clsx"
|
|
10
|
+
import type { AnimationDuration, AnimationTiming } from "../util/types"
|
|
11
|
+
import { resolveDefaultProps } from "../util/resolveDefaultProps"
|
|
12
|
+
import { JavascriptAnimate } from "../animation/JavascriptAnimate"
|
|
13
|
+
import { useAnimationId } from "../util/useAnimationId"
|
|
14
|
+
import { interpolate } from "../util/DataUtils"
|
|
15
|
+
import { getTransitionVal } from "../animation/util"
|
|
16
|
+
import { svgPropertiesAndEvents } from "../util/svgPropertiesAndEvents"
|
|
17
|
+
import { roundTemplateLiteral } from "../util/round"
|
|
18
|
+
|
|
19
|
+
const getTrapezoidPath = (
|
|
20
|
+
x: number,
|
|
21
|
+
y: number,
|
|
22
|
+
upperWidth: number,
|
|
23
|
+
lowerWidth: number,
|
|
24
|
+
height: number,
|
|
25
|
+
): string => {
|
|
26
|
+
const widthGap = upperWidth - lowerWidth
|
|
27
|
+
let path
|
|
28
|
+
path = roundTemplateLiteral`M ${x},${y}`
|
|
29
|
+
path += roundTemplateLiteral`L ${x + upperWidth},${y}`
|
|
30
|
+
path += roundTemplateLiteral`L ${x + upperWidth - widthGap / 2},${y + height}`
|
|
31
|
+
path += roundTemplateLiteral`L ${x + upperWidth - widthGap / 2 - lowerWidth},${y + height}`
|
|
32
|
+
path += roundTemplateLiteral`L ${x},${y} Z`
|
|
33
|
+
return path
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface TrapezoidProps {
|
|
37
|
+
class?: string
|
|
38
|
+
/**
|
|
39
|
+
* The x-coordinate of top left point of the trapezoid.
|
|
40
|
+
* @default 0
|
|
41
|
+
*/
|
|
42
|
+
x?: number
|
|
43
|
+
/**
|
|
44
|
+
* The y-coordinate of top left point of the trapezoid.
|
|
45
|
+
* @default 0
|
|
46
|
+
*/
|
|
47
|
+
y?: number
|
|
48
|
+
/**
|
|
49
|
+
* Width of the upper horizontal side of the trapezoid in pixels.
|
|
50
|
+
* @default 0
|
|
51
|
+
*/
|
|
52
|
+
upperWidth?: number
|
|
53
|
+
/**
|
|
54
|
+
* Width of the lower horizontal side of the trapezoid in pixels.
|
|
55
|
+
* @default 0
|
|
56
|
+
*/
|
|
57
|
+
lowerWidth?: number
|
|
58
|
+
/**
|
|
59
|
+
* Height of the trapezoid in pixels.
|
|
60
|
+
* @default 0
|
|
61
|
+
*/
|
|
62
|
+
height?: number
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* If set to true, trapezoid will update and render with a gradual fade-in animation from left to right.
|
|
66
|
+
* If set "auto", animation is disabled during SSR and when the user prefers reduced motion.
|
|
67
|
+
* @default false
|
|
68
|
+
*/
|
|
69
|
+
isUpdateAnimationActive?: boolean | "auto"
|
|
70
|
+
animationBegin?: number
|
|
71
|
+
animationDuration?: AnimationDuration
|
|
72
|
+
animationEasing?: AnimationTiming
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The customized event handler of click on the trapezoid
|
|
76
|
+
*/
|
|
77
|
+
onClick?: (e: MouseEvent & { currentTarget: SVGPathElement }) => void
|
|
78
|
+
/**
|
|
79
|
+
* The customized event handler of mousedown on the trapezoid
|
|
80
|
+
*/
|
|
81
|
+
onMouseDown?: (e: MouseEvent & { currentTarget: SVGPathElement }) => void
|
|
82
|
+
/**
|
|
83
|
+
* The customized event handler of mouseup on the trapezoid
|
|
84
|
+
*/
|
|
85
|
+
onMouseUp?: (e: MouseEvent & { currentTarget: SVGPathElement }) => void
|
|
86
|
+
/**
|
|
87
|
+
* The customized event handler of mousemove on the trapezoid
|
|
88
|
+
*/
|
|
89
|
+
onMouseMove?: (e: MouseEvent & { currentTarget: SVGPathElement }) => void
|
|
90
|
+
/**
|
|
91
|
+
* The customized event handler of mouseover on the trapezoid
|
|
92
|
+
*/
|
|
93
|
+
onMouseOver?: (e: MouseEvent & { currentTarget: SVGPathElement }) => void
|
|
94
|
+
/**
|
|
95
|
+
* The customized event handler of mouseout on the trapezoid
|
|
96
|
+
*/
|
|
97
|
+
onMouseOut?: (e: MouseEvent & { currentTarget: SVGPathElement }) => void
|
|
98
|
+
/**
|
|
99
|
+
* The customized event handler of mouseenter on the trapezoid
|
|
100
|
+
*/
|
|
101
|
+
onMouseEnter?: (e: MouseEvent & { currentTarget: SVGPathElement }) => void
|
|
102
|
+
/**
|
|
103
|
+
* The customized event handler of mouseleave on the trapezoid
|
|
104
|
+
*/
|
|
105
|
+
onMouseLeave?: (e: MouseEvent & { currentTarget: SVGPathElement }) => void
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export type Props = WithoutRemoveFalse<Omit<JSX.PathSVGAttributes<SVGPathElement>, keyof TrapezoidProps>> & TrapezoidProps
|
|
109
|
+
|
|
110
|
+
export const defaultTrapezoidProps = {
|
|
111
|
+
animationBegin: 0,
|
|
112
|
+
animationDuration: 1500,
|
|
113
|
+
animationEasing: "ease",
|
|
114
|
+
height: 0,
|
|
115
|
+
isUpdateAnimationActive: false,
|
|
116
|
+
lowerWidth: 0,
|
|
117
|
+
upperWidth: 0,
|
|
118
|
+
x: 0,
|
|
119
|
+
y: 0,
|
|
120
|
+
} as const satisfies Partial<Props>
|
|
121
|
+
|
|
122
|
+
export function Trapezoid(ownProps: Props) {
|
|
123
|
+
/* Props injected for a shape passed as an element (see ShapeElementProps). */
|
|
124
|
+
const outsideProps = useShapeElementProps(ownProps)
|
|
125
|
+
const trapezoidProps = resolveDefaultProps(outsideProps, defaultTrapezoidProps)
|
|
126
|
+
|
|
127
|
+
/* Solid only writes refs through function callbacks / signal setters —
|
|
128
|
+
* `ref={letBoundVar}` is a no-op, so we capture explicitly. */
|
|
129
|
+
let pathRef: SVGPathElement | undefined
|
|
130
|
+
const capturePathRef = (el: SVGPathElement) => {
|
|
131
|
+
pathRef = el
|
|
132
|
+
if (el.getTotalLength) {
|
|
133
|
+
try {
|
|
134
|
+
const pathTotalLength = el.getTotalLength()
|
|
135
|
+
if (pathTotalLength) {
|
|
136
|
+
setTotalLength(pathTotalLength)
|
|
137
|
+
}
|
|
138
|
+
} catch {
|
|
139
|
+
/* calculate total length error */
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const [totalLength, setTotalLength] = createSignal(-1)
|
|
144
|
+
|
|
145
|
+
const animationId = useAnimationId(() => outsideProps, "trapezoid-")
|
|
146
|
+
|
|
147
|
+
const isValid = () =>
|
|
148
|
+
trapezoidProps.x === +trapezoidProps.x &&
|
|
149
|
+
trapezoidProps.y === +trapezoidProps.y &&
|
|
150
|
+
trapezoidProps.upperWidth === +trapezoidProps.upperWidth &&
|
|
151
|
+
trapezoidProps.lowerWidth === +trapezoidProps.lowerWidth &&
|
|
152
|
+
trapezoidProps.height === +trapezoidProps.height &&
|
|
153
|
+
(trapezoidProps.upperWidth !== 0 || trapezoidProps.lowerWidth !== 0) &&
|
|
154
|
+
trapezoidProps.height !== 0
|
|
155
|
+
|
|
156
|
+
/* Animation starts from the geometry at mount. */
|
|
157
|
+
let prevUpperWidth = untrack(() => trapezoidProps.upperWidth)
|
|
158
|
+
let prevLowerWidth = untrack(() => trapezoidProps.lowerWidth)
|
|
159
|
+
let prevHeight = untrack(() => trapezoidProps.height)
|
|
160
|
+
let prevX = untrack(() => trapezoidProps.x)
|
|
161
|
+
let prevY = untrack(() => trapezoidProps.y)
|
|
162
|
+
|
|
163
|
+
/* React-style `className` alias forwarded through Shape's prop transformer
|
|
164
|
+
(e.g. `shape={{ className: "x" }}`); accept both. */
|
|
165
|
+
const layerClass = () =>
|
|
166
|
+
clsx(
|
|
167
|
+
"recharts-trapezoid",
|
|
168
|
+
trapezoidProps.class,
|
|
169
|
+
(trapezoidProps as { className?: string }).className,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
return (
|
|
173
|
+
<Show when={isValid()}>
|
|
174
|
+
<Show
|
|
175
|
+
when={trapezoidProps.isUpdateAnimationActive}
|
|
176
|
+
fallback={
|
|
177
|
+
<g>
|
|
178
|
+
<path
|
|
179
|
+
{...svgPropertiesAndEvents(trapezoidProps)}
|
|
180
|
+
class={layerClass()}
|
|
181
|
+
d={getTrapezoidPath(
|
|
182
|
+
trapezoidProps.x,
|
|
183
|
+
trapezoidProps.y,
|
|
184
|
+
trapezoidProps.upperWidth,
|
|
185
|
+
trapezoidProps.lowerWidth,
|
|
186
|
+
trapezoidProps.height,
|
|
187
|
+
)}
|
|
188
|
+
/>
|
|
189
|
+
</g>
|
|
190
|
+
}
|
|
191
|
+
>
|
|
192
|
+
{(() => {
|
|
193
|
+
const from = () => `0px ${totalLength() === -1 ? 1 : totalLength()}px`
|
|
194
|
+
const to = () => `${totalLength()}px 0px`
|
|
195
|
+
const transition = () =>
|
|
196
|
+
getTransitionVal(
|
|
197
|
+
["strokeDasharray"],
|
|
198
|
+
trapezoidProps.animationDuration,
|
|
199
|
+
trapezoidProps.animationEasing,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
return (
|
|
203
|
+
<JavascriptAnimate
|
|
204
|
+
animationId={animationId()}
|
|
205
|
+
canBegin={totalLength() > 0}
|
|
206
|
+
duration={trapezoidProps.animationDuration}
|
|
207
|
+
easing={trapezoidProps.animationEasing}
|
|
208
|
+
isActive={trapezoidProps.isUpdateAnimationActive}
|
|
209
|
+
begin={trapezoidProps.animationBegin}
|
|
210
|
+
>
|
|
211
|
+
{(t: () => number) => {
|
|
212
|
+
/* GOTCHA-014: thunk children — write prev via effect to avoid stale-memo drift.
|
|
213
|
+
Upstream reads prev* refs once per Trapezoid render, so the start point
|
|
214
|
+
is frozen until geometry props change. */
|
|
215
|
+
const start = createMemo(() => {
|
|
216
|
+
void trapezoidProps.upperWidth
|
|
217
|
+
void trapezoidProps.lowerWidth
|
|
218
|
+
void trapezoidProps.height
|
|
219
|
+
void trapezoidProps.x
|
|
220
|
+
void trapezoidProps.y
|
|
221
|
+
return untrack(() => ({
|
|
222
|
+
height: prevHeight,
|
|
223
|
+
lowerWidth: prevLowerWidth,
|
|
224
|
+
upperWidth: prevUpperWidth,
|
|
225
|
+
x: prevX,
|
|
226
|
+
y: prevY,
|
|
227
|
+
}))
|
|
228
|
+
})
|
|
229
|
+
const currUpperWidth = createMemo(() =>
|
|
230
|
+
interpolate(start().upperWidth, trapezoidProps.upperWidth, t()),
|
|
231
|
+
)
|
|
232
|
+
const currLowerWidth = createMemo(() =>
|
|
233
|
+
interpolate(start().lowerWidth, trapezoidProps.lowerWidth, t()),
|
|
234
|
+
)
|
|
235
|
+
const currHeight = createMemo(() => interpolate(start().height, trapezoidProps.height, t()))
|
|
236
|
+
const currX = createMemo(() => interpolate(start().x, trapezoidProps.x, t()))
|
|
237
|
+
const currY = createMemo(() => interpolate(start().y, trapezoidProps.y, t()))
|
|
238
|
+
createEffect(
|
|
239
|
+
() => (t() > 0 ? { prevHeight: currHeight(), prevLowerWidth: currLowerWidth(), prevUpperWidth: currUpperWidth(), prevX: currX(), prevY: currY() } : null),
|
|
240
|
+
(step) => {
|
|
241
|
+
if (step != null && pathRef) {
|
|
242
|
+
prevUpperWidth = step.prevUpperWidth
|
|
243
|
+
prevLowerWidth = step.prevLowerWidth
|
|
244
|
+
prevHeight = step.prevHeight
|
|
245
|
+
prevX = step.prevX
|
|
246
|
+
prevY = step.prevY
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
)
|
|
250
|
+
const animationStyle = createMemo(() =>
|
|
251
|
+
t() > 0
|
|
252
|
+
? { "stroke-dasharray": to(), transition: transition() }
|
|
253
|
+
: { "stroke-dasharray": from() },
|
|
254
|
+
)
|
|
255
|
+
return (
|
|
256
|
+
<path
|
|
257
|
+
{...svgPropertiesAndEvents(trapezoidProps)}
|
|
258
|
+
class={layerClass()}
|
|
259
|
+
d={getTrapezoidPath(
|
|
260
|
+
currX(),
|
|
261
|
+
currY(),
|
|
262
|
+
currUpperWidth(),
|
|
263
|
+
currLowerWidth(),
|
|
264
|
+
currHeight(),
|
|
265
|
+
)}
|
|
266
|
+
ref={capturePathRef}
|
|
267
|
+
style={{
|
|
268
|
+
...animationStyle(),
|
|
269
|
+
...(typeof trapezoidProps.style === "object" ? trapezoidProps.style : {}),
|
|
270
|
+
}}
|
|
271
|
+
/>
|
|
272
|
+
)
|
|
273
|
+
}}
|
|
274
|
+
</JavascriptAnimate>
|
|
275
|
+
)
|
|
276
|
+
})()}
|
|
277
|
+
</Show>
|
|
278
|
+
</Show>
|
|
279
|
+
)
|
|
280
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createContext } from 'solid-js';
|
|
2
|
+
import { type SetStoreFunction } from '../util/solid-1-compat';
|
|
3
|
+
import type { ChartState } from "./chartState"
|
|
4
|
+
|
|
5
|
+
/** Shape exposed via context — state for reads, setState for fine-grained writes. */
|
|
6
|
+
export type RechartsStateContextValue = {
|
|
7
|
+
state: ChartState
|
|
8
|
+
setState: SetStoreFunction<ChartState>
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Typed context — null outside a RechartsStateProvider. */
|
|
12
|
+
export const RechartsStateContext = createContext<RechartsStateContextValue | null>(null)
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/* @jsxImportSource @solidjs/web */
|
|
2
|
+
import type { JSX } from '@solidjs/web';
|
|
3
|
+
import { getOwner, untrack } from 'solid-js';
|
|
4
|
+
import { RechartsStateContext } from "./RechartsStateContext"
|
|
5
|
+
import type { RechartsStateContextValue } from "./RechartsStateContext"
|
|
6
|
+
import type { ChartState } from "./chartState"
|
|
7
|
+
import { createInitialChartState } from "./chartState"
|
|
8
|
+
import { useIsPanorama } from "../context/PanoramaContext"
|
|
9
|
+
import { RechartsStoreContext } from "./RechartsStoreContext"
|
|
10
|
+
import { createEventHandlers } from "./events"
|
|
11
|
+
import { registerChartOwner } from "./selectors/chartSelector"
|
|
12
|
+
|
|
13
|
+
import { createStore, type SetStoreFunction } from '../util/solid-1-compat';
|
|
14
|
+
type RechartsStateProviderProps = {
|
|
15
|
+
/**
|
|
16
|
+
* Top-level keys override defaults. Sub-objects must be complete — shallow
|
|
17
|
+
* merge only; partial nested overrides are not supported in Phase 1.
|
|
18
|
+
*/
|
|
19
|
+
preloadedState?: Partial<ChartState>
|
|
20
|
+
children: JSX.Element
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Solid setStore throws when a path segment points to an undefined intermediate node.
|
|
24
|
+
Wraps to pre-initialize missing nodes before the deep write — needed for callers that
|
|
25
|
+
write into axis slots that haven't been mounted yet (e.g. test probes, panorama shared state).
|
|
26
|
+
Only the ≥4-arg case (3+ path segments) needs the walk; shallow writes are fine as-is. */
|
|
27
|
+
function makeAutoInitsetState(
|
|
28
|
+
state: ChartState,
|
|
29
|
+
setStore: SetStoreFunction<ChartState>,
|
|
30
|
+
): SetStoreFunction<ChartState> {
|
|
31
|
+
return ((...args: unknown[]) => {
|
|
32
|
+
if (args.length >= 4) {
|
|
33
|
+
/* The walk only probes for missing nodes; a setter must not subscribe its caller. */
|
|
34
|
+
untrack(() => {
|
|
35
|
+
const pathSegments = args.slice(0, -1)
|
|
36
|
+
let node: unknown = state
|
|
37
|
+
for (let i = 0; i < pathSegments.length - 1; i++) {
|
|
38
|
+
const seg = pathSegments[i]
|
|
39
|
+
if (typeof seg !== "string" && typeof seg !== "number") break
|
|
40
|
+
const next = (node as Record<string | number, unknown>)[seg]
|
|
41
|
+
if (next === undefined || next === null) {
|
|
42
|
+
;(setStore as (...a: unknown[]) => void)(...pathSegments.slice(0, i + 1), {})
|
|
43
|
+
}
|
|
44
|
+
node = (node as Record<string | number, unknown>)[seg] ?? {}
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
;(setStore as (...a: unknown[]) => void)(...args)
|
|
49
|
+
}) as SetStoreFunction<ChartState>
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Mounts an isolated ChartState store and exposes it via RechartsStateContext. */
|
|
53
|
+
export function RechartsStateProvider(props: RechartsStateProviderProps): JSX.Element {
|
|
54
|
+
const isPanorama = useIsPanorama()
|
|
55
|
+
|
|
56
|
+
/*
|
|
57
|
+
* Panorama = this is a Brush sub-chart preview, not a real chart instance.
|
|
58
|
+
* Skip mounting a new store so descendants inherit the parent chart's context
|
|
59
|
+
* via Solid context bubbling — mirrors RechartsStoreProvider's panorama guard.
|
|
60
|
+
*/
|
|
61
|
+
if (isPanorama) {
|
|
62
|
+
return <>{props.children}</>
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* preloadedState seeds the store once, like React initialState. */
|
|
66
|
+
const [state, setStore] = createStore<ChartState>(
|
|
67
|
+
untrack(() => createInitialChartState(props.preloadedState)),
|
|
68
|
+
)
|
|
69
|
+
/* Selector memos for this chart live under the provider owner and die with it. */
|
|
70
|
+
registerChartOwner(state, getOwner())
|
|
71
|
+
const setState = makeAutoInitsetState(state, setStore)
|
|
72
|
+
const value: RechartsStateContextValue = { setState, state }
|
|
73
|
+
const events = createEventHandlers(state, setState)
|
|
74
|
+
return (
|
|
75
|
+
<RechartsStateContext value={value}>
|
|
76
|
+
<RechartsStoreContext
|
|
77
|
+
value={{
|
|
78
|
+
events,
|
|
79
|
+
setStore: setState,
|
|
80
|
+
store: state,
|
|
81
|
+
}}
|
|
82
|
+
>
|
|
83
|
+
{props.children}
|
|
84
|
+
</RechartsStoreContext>
|
|
85
|
+
</RechartsStateContext>
|
|
86
|
+
)
|
|
87
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createContext, useContext } from 'solid-js';
|
|
2
|
+
import type { ChartState } from "./chartState"
|
|
3
|
+
import type { ChartEventHandlers } from "./events"
|
|
4
|
+
|
|
5
|
+
import { type SetStoreFunction } from '../util/solid-1-compat';
|
|
6
|
+
export type ChartStoreContextValue = {
|
|
7
|
+
store: ChartState
|
|
8
|
+
setStore: SetStoreFunction<ChartState>
|
|
9
|
+
events: ChartEventHandlers
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Independent Solid context — must not collide with consumer apps that bring
|
|
14
|
+
* their own stores. Provides store + setStore for state access plus consolidated
|
|
15
|
+
* event handlers.
|
|
16
|
+
*/
|
|
17
|
+
export const RechartsStoreContext = createContext<ChartStoreContextValue | null>(null)
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Returns the chart store handle from context. Returns `null` outside a
|
|
21
|
+
* chart wrapper — matches panorama and stand-alone usage; callers must guard.
|
|
22
|
+
*/
|
|
23
|
+
export function useChartStore(): ChartStoreContextValue | null {
|
|
24
|
+
return useContext(RechartsStoreContext)
|
|
25
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* @jsxImportSource @solidjs/web */
|
|
2
|
+
/* eslint-disable import/no-cycle */
|
|
3
|
+
import type { JSX } from '@solidjs/web';
|
|
4
|
+
import { useIsPanorama } from "../context/PanoramaContext"
|
|
5
|
+
import { useOptionalChartState } from "./useChartState"
|
|
6
|
+
import { RechartsStateProvider } from "./RechartsStateProvider"
|
|
7
|
+
import type { ChartState } from "./chartState"
|
|
8
|
+
|
|
9
|
+
type RechartsStoreProviderProps = {
|
|
10
|
+
children: JSX.Element
|
|
11
|
+
preloadedState?: Partial<ChartState>
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Compatibility wrapper for tests that still mount RechartsStoreProvider.
|
|
16
|
+
* Production charts use RechartsStateProvider only — one ChartState store.
|
|
17
|
+
* Standalone mounts create that provider; nested mounts inherit it (no second store).
|
|
18
|
+
*/
|
|
19
|
+
export function RechartsStoreProvider(props: RechartsStoreProviderProps): JSX.Element {
|
|
20
|
+
const isPanorama = useIsPanorama()
|
|
21
|
+
if (isPanorama) {
|
|
22
|
+
return <>{props.children}</>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const existing = useOptionalChartState()
|
|
26
|
+
if (existing != null) {
|
|
27
|
+
return <>{props.children}</>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<RechartsStateProvider preloadedState={props.preloadedState}>
|
|
32
|
+
{props.children}
|
|
33
|
+
</RechartsStateProvider>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import { createEffect, onCleanup } from 'solid-js';
|
|
3
|
+
import type { UpdatableChartOptions } from "./rootPropsSlice"
|
|
4
|
+
import { initialRootPropsState } from "./rootPropsSlice"
|
|
5
|
+
import { useOptionalChartState } from "./useChartState"
|
|
6
|
+
import { teardownWrite } from "./teardownWrite"
|
|
7
|
+
|
|
8
|
+
export function ReportChartProps(props: UpdatableChartOptions): null {
|
|
9
|
+
const ctx = useOptionalChartState()
|
|
10
|
+
if (ctx == null) {
|
|
11
|
+
return null
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
createEffect(
|
|
15
|
+
() => ({
|
|
16
|
+
accessibilityLayer: props.accessibilityLayer,
|
|
17
|
+
barCategoryGap: props.barCategoryGap,
|
|
18
|
+
barGap: props.barGap,
|
|
19
|
+
barSize: props.barSize,
|
|
20
|
+
baseValue: props.baseValue,
|
|
21
|
+
className: props.className,
|
|
22
|
+
maxBarSize: props.maxBarSize,
|
|
23
|
+
reverseStackOrder: props.reverseStackOrder,
|
|
24
|
+
stackOffset: props.stackOffset,
|
|
25
|
+
syncId: props.syncId,
|
|
26
|
+
syncMethod: props.syncMethod,
|
|
27
|
+
}),
|
|
28
|
+
(rootProps) => {
|
|
29
|
+
ctx.setState("rootProps", rootProps)
|
|
30
|
+
},
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
onCleanup(() => {
|
|
34
|
+
teardownWrite(() => {
|
|
35
|
+
ctx.setState("rootProps", { ...initialRootPropsState })
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
return null
|
|
40
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createEffect, onCleanup } from 'solid-js';
|
|
2
|
+
import { useOptionalChartState } from "./useChartState"
|
|
3
|
+
import { initialEventSettingsState } from "./eventSettingsSlice"
|
|
4
|
+
import type { EventThrottlingProps } from "../util/types"
|
|
5
|
+
import { teardownWrite } from "./teardownWrite"
|
|
6
|
+
|
|
7
|
+
export function ReportEventSettings(props: EventThrottlingProps): null {
|
|
8
|
+
const ctx = useOptionalChartState()
|
|
9
|
+
if (ctx == null) {
|
|
10
|
+
return null
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
createEffect(
|
|
14
|
+
() => ({
|
|
15
|
+
throttleDelay: props.throttleDelay ?? initialEventSettingsState.throttleDelay,
|
|
16
|
+
throttledEvents: props.throttledEvents ?? initialEventSettingsState.throttledEvents,
|
|
17
|
+
}),
|
|
18
|
+
(settings) => {
|
|
19
|
+
ctx.setState("eventSettings", settings)
|
|
20
|
+
},
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
onCleanup(() => {
|
|
24
|
+
teardownWrite(() => {
|
|
25
|
+
ctx.setState("eventSettings", { ...initialEventSettingsState })
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
return null
|
|
30
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { createEffect, onCleanup } from 'solid-js';
|
|
2
|
+
import type { LayoutType, Margin } from "../util/types"
|
|
3
|
+
import { useIsPanorama } from "../context/PanoramaContext"
|
|
4
|
+
import { initialLayoutState } from "./layoutSlice"
|
|
5
|
+
import { useOptionalChartState } from "./useChartState"
|
|
6
|
+
import { teardownWrite } from "./teardownWrite"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* "Main" props are props that are only accepted on the main chart,
|
|
10
|
+
* as opposed to the small panorama chart inside a Brush.
|
|
11
|
+
*/
|
|
12
|
+
type MainChartProps = {
|
|
13
|
+
layout: LayoutType
|
|
14
|
+
margin: Partial<Margin>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function ReportMainChartProps(props: MainChartProps): null {
|
|
18
|
+
const ctx = useOptionalChartState()
|
|
19
|
+
if (ctx == null) {
|
|
20
|
+
return null
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* Skip dispatching properties in panorama chart for two reasons:
|
|
25
|
+
* 1. The root chart should be deciding on these properties, and
|
|
26
|
+
* 2. Brush reads these properties from the store, and so they must remain stable
|
|
27
|
+
* to avoid circular dependency and infinite re-rendering.
|
|
28
|
+
*/
|
|
29
|
+
const isPanorama = useIsPanorama()
|
|
30
|
+
|
|
31
|
+
/* The chart root seeds layout at store creation; this keeps it in sync after mount. */
|
|
32
|
+
createEffect(
|
|
33
|
+
() => ({
|
|
34
|
+
layoutType: props.layout,
|
|
35
|
+
/* upstream setMargin: missing sides become 0 */
|
|
36
|
+
margin: {
|
|
37
|
+
bottom: props.margin.bottom ?? 0,
|
|
38
|
+
left: props.margin.left ?? 0,
|
|
39
|
+
right: props.margin.right ?? 0,
|
|
40
|
+
top: props.margin.top ?? 0,
|
|
41
|
+
},
|
|
42
|
+
}),
|
|
43
|
+
(next) => {
|
|
44
|
+
if (!isPanorama) {
|
|
45
|
+
ctx.setState("layout", "layoutType", next.layoutType)
|
|
46
|
+
ctx.setState("layout", "margin", next.margin)
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
onCleanup(() => {
|
|
52
|
+
teardownWrite(() => {
|
|
53
|
+
if (!isPanorama) {
|
|
54
|
+
ctx.setState("layout", "layoutType", initialLayoutState.layoutType)
|
|
55
|
+
ctx.setState("layout", "margin", { ...initialLayoutState.margin })
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
return null
|
|
61
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createEffect, onCleanup } from "solid-js"
|
|
2
|
+
import { useOptionalChartState } from "./useChartState"
|
|
3
|
+
import type { PolarChartOptions } from "./polarOptionsSlice"
|
|
4
|
+
import { teardownWrite } from "./teardownWrite"
|
|
5
|
+
|
|
6
|
+
export function ReportPolarOptions(props: PolarChartOptions): null {
|
|
7
|
+
const ctx = useOptionalChartState()
|
|
8
|
+
if (ctx == null) {
|
|
9
|
+
return null
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
createEffect(
|
|
13
|
+
() => ({
|
|
14
|
+
cx: props.cx,
|
|
15
|
+
cy: props.cy,
|
|
16
|
+
endAngle: props.endAngle,
|
|
17
|
+
innerRadius: props.innerRadius,
|
|
18
|
+
outerRadius: props.outerRadius,
|
|
19
|
+
startAngle: props.startAngle,
|
|
20
|
+
}),
|
|
21
|
+
(polarOptions) => {
|
|
22
|
+
ctx.setState("polarOptions", polarOptions)
|
|
23
|
+
},
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
onCleanup(() => {
|
|
27
|
+
teardownWrite(() => {
|
|
28
|
+
/* polarOptions is `PolarChartOptions | null`. reconcile(null) tries to
|
|
29
|
+
adopt a null store target and throws STORE_TARGET. */
|
|
30
|
+
ctx.setState("polarOptions", null)
|
|
31
|
+
})
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
return null
|
|
35
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { createEffect, onCleanup, useContext } from 'solid-js';
|
|
2
|
+
import { RechartsStateContext } from "./RechartsStateContext"
|
|
3
|
+
import type {
|
|
4
|
+
CartesianGraphicalItemSettings,
|
|
5
|
+
PolarGraphicalItemSettings,
|
|
6
|
+
} from "./graphicalItemsSlice"
|
|
7
|
+
import type { CartesianItemState, PolarItemState } from "./chartState"
|
|
8
|
+
import { teardownWrite } from "./teardownWrite"
|
|
9
|
+
import { markRawData } from "./rawData"
|
|
10
|
+
|
|
11
|
+
/** Registers a cartesian graphical item into chartState on mount, updates on change, removes on cleanup. */
|
|
12
|
+
export function SetCartesianGraphicalItem<T extends CartesianGraphicalItemSettings>(
|
|
13
|
+
props: T,
|
|
14
|
+
): null {
|
|
15
|
+
const stateCtx = useContext(RechartsStateContext)
|
|
16
|
+
if (stateCtx == null) {
|
|
17
|
+
return null
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let prevProps: T | null = null
|
|
21
|
+
|
|
22
|
+
createEffect(
|
|
23
|
+
() => ({ ...props }) as T,
|
|
24
|
+
(current) => {
|
|
25
|
+
if (current.id != null) {
|
|
26
|
+
/* Item-level data is served by reference like chart data (see markRawData). */
|
|
27
|
+
markRawData(current.data)
|
|
28
|
+
const itemState = { settings: current, type: current.type } as CartesianItemState
|
|
29
|
+
stateCtx.setState("graphicalItems", String(current.id), itemState as never)
|
|
30
|
+
}
|
|
31
|
+
prevProps = current
|
|
32
|
+
},
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
onCleanup(() => {
|
|
36
|
+
teardownWrite(() => {
|
|
37
|
+
if (prevProps?.id != null) {
|
|
38
|
+
stateCtx.setState("graphicalItems", String(prevProps.id), undefined as never)
|
|
39
|
+
prevProps = null
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
return null
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Registers a polar graphical item into chartState on mount, updates on change, removes on cleanup. */
|
|
48
|
+
export function SetPolarGraphicalItem(props: PolarGraphicalItemSettings): null {
|
|
49
|
+
const stateCtx = useContext(RechartsStateContext)
|
|
50
|
+
if (stateCtx == null) {
|
|
51
|
+
return null
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
let prevProps: PolarGraphicalItemSettings | null = null
|
|
55
|
+
|
|
56
|
+
createEffect(
|
|
57
|
+
() => ({ ...props }) as PolarGraphicalItemSettings,
|
|
58
|
+
(current) => {
|
|
59
|
+
if (current.id != null) {
|
|
60
|
+
/* Item-level data is served by reference like chart data (see markRawData). */
|
|
61
|
+
markRawData(current.data)
|
|
62
|
+
const itemState = { settings: current, type: current.type } as PolarItemState
|
|
63
|
+
stateCtx.setState("graphicalItems", String(current.id), itemState as never)
|
|
64
|
+
}
|
|
65
|
+
prevProps = current
|
|
66
|
+
},
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
onCleanup(() => {
|
|
70
|
+
teardownWrite(() => {
|
|
71
|
+
if (prevProps?.id != null) {
|
|
72
|
+
stateCtx.setState("graphicalItems", String(prevProps.id), undefined as never)
|
|
73
|
+
prevProps = null
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
return null
|
|
79
|
+
}
|