@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,722 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle, sort-keys */
|
|
2
|
+
/**
|
|
3
|
+
* @fileOverview Cartesian Axis
|
|
4
|
+
*/
|
|
5
|
+
import type { JSX } from '@solidjs/web';
|
|
6
|
+
import { createEffect, createMemo, createSignal, For, onCleanup, onSettled, Show, untrack, useContext } from 'solid-js';
|
|
7
|
+
import isEqual from "es-toolkit/compat/isEqual"
|
|
8
|
+
import { RechartsStateContext } from "../state/RechartsStateContext"
|
|
9
|
+
import { teardownWrite } from "../state/teardownWrite"
|
|
10
|
+
import type { AxisId } from "../state/cartesianAxisSlice"
|
|
11
|
+
import type { TickItem as RenderedTickItem } from "../util/types"
|
|
12
|
+
import get from "es-toolkit/compat/get"
|
|
13
|
+
import { clsx } from "clsx"
|
|
14
|
+
import { Layer } from "../container/Layer"
|
|
15
|
+
import { Text, Props as TextProps, TextAnchor, TextVerticalAnchor, isValidTextAnchor } from "../component/Text"
|
|
16
|
+
import {
|
|
17
|
+
CartesianLabelContextProvider,
|
|
18
|
+
ImplicitLabelType,
|
|
19
|
+
CartesianLabelFromLabelProp,
|
|
20
|
+
} from "../component/Label"
|
|
21
|
+
import { isNumber } from "../util/DataUtils"
|
|
22
|
+
import {
|
|
23
|
+
CartesianViewBox,
|
|
24
|
+
adaptEventsOfChild,
|
|
25
|
+
PresentationAttributesAdaptChildEvent,
|
|
26
|
+
CartesianTickItem,
|
|
27
|
+
AxisInterval,
|
|
28
|
+
Coordinate,
|
|
29
|
+
RectangleCoordinate,
|
|
30
|
+
TickProp,
|
|
31
|
+
BaseTickContentProps,
|
|
32
|
+
XAxisTickContentProps,
|
|
33
|
+
YAxisTickContentProps,
|
|
34
|
+
} from "../util/types"
|
|
35
|
+
import { getTicks } from "./getTicks"
|
|
36
|
+
import {
|
|
37
|
+
svgPropertiesNoEvents,
|
|
38
|
+
svgPropertiesNoEventsFromUnknown,
|
|
39
|
+
} from "../util/svgPropertiesNoEvents"
|
|
40
|
+
import {
|
|
41
|
+
XAxisOrientation,
|
|
42
|
+
XAxisPadding,
|
|
43
|
+
YAxisOrientation,
|
|
44
|
+
YAxisPadding,
|
|
45
|
+
} from "../state/cartesianAxisSlice"
|
|
46
|
+
import { RequiresDefaultProps, resolveDefaultProps } from "../util/resolveDefaultProps"
|
|
47
|
+
import { ZIndexable, ZIndexLayer } from "../zIndex/ZIndexLayer"
|
|
48
|
+
import { DefaultZIndexes } from "../zIndex/DefaultZIndexes"
|
|
49
|
+
import { getClassNameFromUnknown } from "../util/getClassNameFromUnknown"
|
|
50
|
+
import { cloneJsxNodeWithProps, isJsxNode } from "../util/ReactUtils"
|
|
51
|
+
import { bindRef, splitProps } from "../util/solid-1-compat"
|
|
52
|
+
import { getCalculatedXAxisHeight } from "../util/XAxisUtils"
|
|
53
|
+
import { getCalculatedYAxisWidth } from "../util/YAxisUtils"
|
|
54
|
+
|
|
55
|
+
/** The orientation of the axis in correspondence to the chart */
|
|
56
|
+
export type Orientation = XAxisOrientation | YAxisOrientation
|
|
57
|
+
/** A unit to be appended to a value */
|
|
58
|
+
export type Unit = string | number
|
|
59
|
+
/** The formatter function of tick */
|
|
60
|
+
export type TickFormatter = (value: unknown, index: number) => string
|
|
61
|
+
|
|
62
|
+
export interface CartesianAxisProps extends ZIndexable {
|
|
63
|
+
class?: string
|
|
64
|
+
axisType?: "xAxis" | "yAxis"
|
|
65
|
+
/** Identifies the axis whose rendered ticks are published to the store. */
|
|
66
|
+
axisId?: AxisId
|
|
67
|
+
x?: number
|
|
68
|
+
y?: number
|
|
69
|
+
width?: number
|
|
70
|
+
height?: number
|
|
71
|
+
unit?: Unit
|
|
72
|
+
orientation?: Orientation
|
|
73
|
+
viewBox?: CartesianViewBox
|
|
74
|
+
tick?: TickProp<unknown>
|
|
75
|
+
/**
|
|
76
|
+
* Additional props to spread to each tick Text element.
|
|
77
|
+
* Optional, the CartesianAxis component will provide its own defaults calculated from other props.
|
|
78
|
+
*/
|
|
79
|
+
tickTextProps?: TextProps
|
|
80
|
+
axisLine?: boolean | JSX.LineSVGAttributes<SVGLineElement>
|
|
81
|
+
tickLine?: boolean | JSX.LineSVGAttributes<SVGLineElement>
|
|
82
|
+
mirror?: boolean
|
|
83
|
+
tickMargin?: number
|
|
84
|
+
hide?: boolean
|
|
85
|
+
label?: ImplicitLabelType
|
|
86
|
+
/** Padding information passed to custom tick components */
|
|
87
|
+
padding?: XAxisPadding | YAxisPadding
|
|
88
|
+
|
|
89
|
+
minTickGap?: number
|
|
90
|
+
/**
|
|
91
|
+
* Careful - this is the same name as XAxis + YAxis `ticks` but completely different object!
|
|
92
|
+
*/
|
|
93
|
+
ticks?: ReadonlyArray<CartesianTickItem>
|
|
94
|
+
tickSize?: number
|
|
95
|
+
tickFormatter?: TickFormatter
|
|
96
|
+
interval?: AxisInterval
|
|
97
|
+
/** Angle in which ticks will be rendered. */
|
|
98
|
+
angle?: number
|
|
99
|
+
/**
|
|
100
|
+
* CartesianAxis reads scale internally and this prop is ignored since 3.0
|
|
101
|
+
* @deprecated
|
|
102
|
+
*/
|
|
103
|
+
scale?: unknown
|
|
104
|
+
labelRef?: SVGTextElement | null
|
|
105
|
+
/**
|
|
106
|
+
* Imperative size API for XAxis `height="auto"` / YAxis `width="auto"`.
|
|
107
|
+
* Separate from `ref`, which is the tick-labels `<g>` element.
|
|
108
|
+
*/
|
|
109
|
+
axisRef?: (api: CartesianAxisRef | null) => void
|
|
110
|
+
|
|
111
|
+
ref?: SVGElement | ((el: SVGElement) => void)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export interface CartesianAxisRef {
|
|
115
|
+
getCalculatedWidth(): number
|
|
116
|
+
getCalculatedHeight(): number
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export const defaultCartesianAxisProps = {
|
|
120
|
+
axisLine: true,
|
|
121
|
+
height: 0,
|
|
122
|
+
interval: "preserveEnd",
|
|
123
|
+
minTickGap: 5,
|
|
124
|
+
mirror: false,
|
|
125
|
+
orientation: "bottom",
|
|
126
|
+
stroke: "#666",
|
|
127
|
+
|
|
128
|
+
tick: true,
|
|
129
|
+
tickLine: true,
|
|
130
|
+
tickMargin: 2,
|
|
131
|
+
tickSize: 6,
|
|
132
|
+
ticks: [] as CartesianAxisProps["ticks"],
|
|
133
|
+
|
|
134
|
+
viewBox: { height: 0, width: 0, x: 0, y: 0 },
|
|
135
|
+
width: 0,
|
|
136
|
+
x: 0,
|
|
137
|
+
y: 0,
|
|
138
|
+
zIndex: DefaultZIndexes.axis,
|
|
139
|
+
} as const satisfies Partial<Props>
|
|
140
|
+
|
|
141
|
+
/*
|
|
142
|
+
* `viewBox` and `scale` are SVG attributes.
|
|
143
|
+
* Recharts however - unfortunately - has its own attributes named `viewBox` and `scale`
|
|
144
|
+
* that are completely different data shape and different purpose.
|
|
145
|
+
*/
|
|
146
|
+
export type Props = Omit<
|
|
147
|
+
PresentationAttributesAdaptChildEvent<unknown, SVGTextElement>,
|
|
148
|
+
"viewBox" | "scale" | "ref"
|
|
149
|
+
> &
|
|
150
|
+
CartesianAxisProps
|
|
151
|
+
|
|
152
|
+
type InternalProps = RequiresDefaultProps<Props, typeof defaultCartesianAxisProps>
|
|
153
|
+
|
|
154
|
+
function AxisLine(axisLineProps: {
|
|
155
|
+
x: number
|
|
156
|
+
y: number
|
|
157
|
+
width: number
|
|
158
|
+
height: number
|
|
159
|
+
orientation: Orientation
|
|
160
|
+
mirror: boolean
|
|
161
|
+
axisLine: boolean | JSX.LineSVGAttributes<SVGLineElement>
|
|
162
|
+
otherSvgProps: JSX.LineSVGAttributes<SVGLineElement> | null
|
|
163
|
+
}) {
|
|
164
|
+
/* GOTCHA: do NOT spread coordinate values into a plain object here. AxisLine's
|
|
165
|
+
function body executes once at mount; reads of `axisLineProps.x/y/width/height`
|
|
166
|
+
inside that body freeze at the initial pass. JSX expression slots with `{}`
|
|
167
|
+
stay reactive — coords must be passed as accessors so the line re-renders when
|
|
168
|
+
chart-offset reflows (e.g. legend size dispatch arrives post-mount). */
|
|
169
|
+
const isHorizontal = () =>
|
|
170
|
+
axisLineProps.orientation === "top" || axisLineProps.orientation === "bottom"
|
|
171
|
+
const needHeight = () =>
|
|
172
|
+
Number(
|
|
173
|
+
(axisLineProps.orientation === "top" && !axisLineProps.mirror) ||
|
|
174
|
+
(axisLineProps.orientation === "bottom" && axisLineProps.mirror),
|
|
175
|
+
)
|
|
176
|
+
const needWidth = () =>
|
|
177
|
+
Number(
|
|
178
|
+
(axisLineProps.orientation === "left" && !axisLineProps.mirror) ||
|
|
179
|
+
(axisLineProps.orientation === "right" && axisLineProps.mirror),
|
|
180
|
+
)
|
|
181
|
+
const x1 = () =>
|
|
182
|
+
isHorizontal() ? axisLineProps.x : axisLineProps.x + needWidth() * axisLineProps.width
|
|
183
|
+
const x2 = () =>
|
|
184
|
+
isHorizontal()
|
|
185
|
+
? axisLineProps.x + axisLineProps.width
|
|
186
|
+
: axisLineProps.x + needWidth() * axisLineProps.width
|
|
187
|
+
const y1 = () =>
|
|
188
|
+
isHorizontal()
|
|
189
|
+
? axisLineProps.y + needHeight() * axisLineProps.height
|
|
190
|
+
: axisLineProps.y
|
|
191
|
+
const y2 = () =>
|
|
192
|
+
isHorizontal()
|
|
193
|
+
? axisLineProps.y + needHeight() * axisLineProps.height
|
|
194
|
+
: axisLineProps.y + axisLineProps.height
|
|
195
|
+
|
|
196
|
+
const styleProps = (): JSX.LineSVGAttributes<SVGLineElement> => ({
|
|
197
|
+
...axisLineProps.otherSvgProps,
|
|
198
|
+
...svgPropertiesNoEvents(axisLineProps.axisLine),
|
|
199
|
+
fill: "none",
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
return (
|
|
203
|
+
<Show when={axisLineProps.axisLine}>
|
|
204
|
+
<line
|
|
205
|
+
{...styleProps()}
|
|
206
|
+
x1={x1()}
|
|
207
|
+
x2={x2()}
|
|
208
|
+
y1={y1()}
|
|
209
|
+
y2={y2()}
|
|
210
|
+
class={clsx("recharts-cartesian-axis-line", get(axisLineProps.axisLine, "className"))}
|
|
211
|
+
/>
|
|
212
|
+
</Show>
|
|
213
|
+
)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Calculate the coordinates of endpoints in ticks.
|
|
218
|
+
* @param data The data of a simple tick.
|
|
219
|
+
* @param x The x-coordinate of the axis.
|
|
220
|
+
* @param y The y-coordinate of the axis.
|
|
221
|
+
* @param width The width of the axis.
|
|
222
|
+
* @param height The height of the axis.
|
|
223
|
+
* @param orientation The orientation of the axis.
|
|
224
|
+
* @param tickSize The length of the tick line.
|
|
225
|
+
* @param mirror If true, the ticks are mirrored.
|
|
226
|
+
* @param tickMargin The margin between the tick line and the tick text.
|
|
227
|
+
* @returns An object with `line` and `tick` coordinates.
|
|
228
|
+
* `line` is the coordinates for the tick line, and `tick` is the coordinate for the tick text.
|
|
229
|
+
*/
|
|
230
|
+
function getTickLineCoord(
|
|
231
|
+
data: CartesianTickItem,
|
|
232
|
+
x: number,
|
|
233
|
+
y: number,
|
|
234
|
+
width: number,
|
|
235
|
+
height: number,
|
|
236
|
+
orientation: Orientation,
|
|
237
|
+
tickSize: number,
|
|
238
|
+
mirror: boolean,
|
|
239
|
+
tickMargin: number,
|
|
240
|
+
): {
|
|
241
|
+
line: RectangleCoordinate
|
|
242
|
+
tick: Coordinate
|
|
243
|
+
} {
|
|
244
|
+
let x1: number
|
|
245
|
+
let x2: number
|
|
246
|
+
let y1: number
|
|
247
|
+
let y2: number
|
|
248
|
+
let tx: number
|
|
249
|
+
let ty: number
|
|
250
|
+
|
|
251
|
+
const sign = mirror ? -1 : 1
|
|
252
|
+
const finalTickSize = data.tickSize || tickSize
|
|
253
|
+
const tickCoord = isNumber(data.tickCoord) ? data.tickCoord : data.coordinate
|
|
254
|
+
|
|
255
|
+
switch (orientation) {
|
|
256
|
+
case "top":
|
|
257
|
+
x1 = x2 = data.coordinate
|
|
258
|
+
y2 = y + +!mirror * height
|
|
259
|
+
y1 = y2 - sign * finalTickSize
|
|
260
|
+
ty = y1 - sign * tickMargin
|
|
261
|
+
tx = tickCoord
|
|
262
|
+
break
|
|
263
|
+
case "left":
|
|
264
|
+
y1 = y2 = data.coordinate
|
|
265
|
+
x2 = x + +!mirror * width
|
|
266
|
+
x1 = x2 - sign * finalTickSize
|
|
267
|
+
tx = x1 - sign * tickMargin
|
|
268
|
+
ty = tickCoord
|
|
269
|
+
break
|
|
270
|
+
case "right":
|
|
271
|
+
y1 = y2 = data.coordinate
|
|
272
|
+
x2 = x + +mirror * width
|
|
273
|
+
x1 = x2 + sign * finalTickSize
|
|
274
|
+
tx = x1 + sign * tickMargin
|
|
275
|
+
ty = tickCoord
|
|
276
|
+
break
|
|
277
|
+
default:
|
|
278
|
+
x1 = x2 = data.coordinate
|
|
279
|
+
y2 = y + +mirror * height
|
|
280
|
+
y1 = y2 + sign * finalTickSize
|
|
281
|
+
ty = y1 + sign * tickMargin
|
|
282
|
+
tx = tickCoord
|
|
283
|
+
break
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return { line: { x1, x2, y1, y2 }, tick: { x: tx, y: ty } }
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* @param orientation The orientation of the axis.
|
|
291
|
+
* @param mirror If true, the ticks are mirrored.
|
|
292
|
+
* @returns The text anchor of the tick.
|
|
293
|
+
*/
|
|
294
|
+
function getTickTextAnchor(orientation: Orientation, mirror: boolean): TextAnchor {
|
|
295
|
+
switch (orientation) {
|
|
296
|
+
case "left":
|
|
297
|
+
return mirror ? "start" : "end"
|
|
298
|
+
case "right":
|
|
299
|
+
return mirror ? "end" : "start"
|
|
300
|
+
default:
|
|
301
|
+
return "middle"
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* @param orientation The orientation of the axis.
|
|
307
|
+
* @param mirror If true, the ticks are mirrored.
|
|
308
|
+
* @returns The vertical text anchor of the tick.
|
|
309
|
+
*/
|
|
310
|
+
function getTickVerticalAnchor(orientation: Orientation, mirror: boolean): TextVerticalAnchor {
|
|
311
|
+
switch (orientation) {
|
|
312
|
+
case "left":
|
|
313
|
+
case "right":
|
|
314
|
+
return "middle"
|
|
315
|
+
case "top":
|
|
316
|
+
return mirror ? "start" : "end"
|
|
317
|
+
default:
|
|
318
|
+
return mirror ? "end" : "start"
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function TickItem(props: { option: Props["tick"]; tickProps: TextProps; value: string }) {
|
|
323
|
+
/* tick type is structural (function vs node vs boolean); snapshot once */
|
|
324
|
+
const option = untrack(() => props.option)
|
|
325
|
+
if (typeof option === "function") {
|
|
326
|
+
const content = () => {
|
|
327
|
+
/* tickProps may carry the axis class via Solid `class` alias — accept both. */
|
|
328
|
+
const baseClassName =
|
|
329
|
+
props.tickProps.className ?? (props.tickProps as { class?: string }).class
|
|
330
|
+
const combinedClassName = clsx(baseClassName, "recharts-cartesian-axis-tick-value")
|
|
331
|
+
return option({ ...props.tickProps, className: combinedClassName })
|
|
332
|
+
}
|
|
333
|
+
return <>{content()}</>
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (isJsxNode(option)) {
|
|
337
|
+
const content = () =>
|
|
338
|
+
cloneJsxNodeWithProps(
|
|
339
|
+
option,
|
|
340
|
+
props.tickProps as unknown as Record<string, unknown>,
|
|
341
|
+
) as unknown as JSX.Element
|
|
342
|
+
return <>{content()}</>
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (typeof option !== "boolean") {
|
|
346
|
+
const className = () =>
|
|
347
|
+
clsx("recharts-cartesian-axis-tick-value", getClassNameFromUnknown(option))
|
|
348
|
+
return (
|
|
349
|
+
<Text {...props.tickProps} className={className()}>
|
|
350
|
+
{props.value}
|
|
351
|
+
</Text>
|
|
352
|
+
)
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
return (
|
|
356
|
+
<Text {...props.tickProps} className="recharts-cartesian-axis-tick-value">
|
|
357
|
+
{props.value}
|
|
358
|
+
</Text>
|
|
359
|
+
)
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
type TicksProps = {
|
|
363
|
+
axisType: "xAxis" | "yAxis" | undefined
|
|
364
|
+
axisId: AxisId | undefined
|
|
365
|
+
events: Omit<PresentationAttributesAdaptChildEvent<unknown, SVGTextElement>, "scale" | "viewBox" | "ref">
|
|
366
|
+
fontSize: string
|
|
367
|
+
getTicksConfig: Omit<Props, "ticks" | "ref">
|
|
368
|
+
height: number
|
|
369
|
+
letterSpacing: string
|
|
370
|
+
mirror: boolean
|
|
371
|
+
orientation: Orientation
|
|
372
|
+
padding?: Props["padding"]
|
|
373
|
+
ref?: SVGGElement | ((el: SVGGElement) => void)
|
|
374
|
+
stroke?: Props["stroke"]
|
|
375
|
+
tick?: Props["tick"]
|
|
376
|
+
tickFormatter?: Props["tickFormatter"]
|
|
377
|
+
tickLine?: Props["tickLine"]
|
|
378
|
+
tickMargin: number
|
|
379
|
+
tickSize: number
|
|
380
|
+
tickTextProps?: Props["tickTextProps"]
|
|
381
|
+
ticks?: ReadonlyArray<CartesianTickItem>
|
|
382
|
+
unit?: Props["unit"]
|
|
383
|
+
width: number
|
|
384
|
+
x: number
|
|
385
|
+
y: number
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
function Ticks(props: TicksProps) {
|
|
389
|
+
const ticks = () => props.ticks ?? []
|
|
390
|
+
const finalTicks = createMemo(() =>
|
|
391
|
+
getTicks(
|
|
392
|
+
{ ...props.getTicksConfig, ticks: ticks() } as Parameters<typeof getTicks>[0],
|
|
393
|
+
props.fontSize,
|
|
394
|
+
props.letterSpacing,
|
|
395
|
+
),
|
|
396
|
+
)
|
|
397
|
+
/*
|
|
398
|
+
* Publish the actually rendered ticks so hooks and the inverse tick-snap scale can read them.
|
|
399
|
+
* Skip the write when the tick values are unchanged so re-renders keep a stable reference
|
|
400
|
+
* (https://github.com/recharts/recharts/issues/7563).
|
|
401
|
+
*/
|
|
402
|
+
const stateCtx = useContext(RechartsStateContext)
|
|
403
|
+
let lastPublished: { axisId: AxisId; axisType: "xAxis" | "yAxis"; ticks: ReadonlyArray<RenderedTickItem> } | null = null
|
|
404
|
+
createEffect(
|
|
405
|
+
() => {
|
|
406
|
+
const axisId = props.axisId
|
|
407
|
+
const axisType = props.axisType
|
|
408
|
+
if (axisId == null || axisType == null) {
|
|
409
|
+
return null
|
|
410
|
+
}
|
|
411
|
+
// Filter out irrelevant internal properties before exposing externally
|
|
412
|
+
const tickItems: ReadonlyArray<RenderedTickItem> = finalTicks().map((tick) => ({
|
|
413
|
+
coordinate: tick.coordinate,
|
|
414
|
+
index: tick.index,
|
|
415
|
+
offset: tick.offset,
|
|
416
|
+
value: tick.value,
|
|
417
|
+
}))
|
|
418
|
+
return { axisId, axisType, ticks: tickItems }
|
|
419
|
+
},
|
|
420
|
+
(next) => {
|
|
421
|
+
if (next == null || stateCtx == null) {
|
|
422
|
+
return undefined
|
|
423
|
+
}
|
|
424
|
+
const last = lastPublished
|
|
425
|
+
if (
|
|
426
|
+
last == null ||
|
|
427
|
+
last.axisId !== next.axisId ||
|
|
428
|
+
last.axisType !== next.axisType ||
|
|
429
|
+
!isEqual(last.ticks, next.ticks)
|
|
430
|
+
) {
|
|
431
|
+
lastPublished = next
|
|
432
|
+
stateCtx.setState("renderedTicks", next.axisType, String(next.axisId), next.ticks)
|
|
433
|
+
}
|
|
434
|
+
return undefined
|
|
435
|
+
},
|
|
436
|
+
)
|
|
437
|
+
onCleanup(() => {
|
|
438
|
+
const last = lastPublished
|
|
439
|
+
if (last == null || stateCtx == null) {
|
|
440
|
+
return
|
|
441
|
+
}
|
|
442
|
+
lastPublished = null
|
|
443
|
+
teardownWrite(() => {
|
|
444
|
+
stateCtx.setState("renderedTicks", last.axisType, (axes) => {
|
|
445
|
+
delete (axes as Record<string, unknown>)[String(last.axisId)]
|
|
446
|
+
})
|
|
447
|
+
})
|
|
448
|
+
})
|
|
449
|
+
|
|
450
|
+
const axisProps = createMemo(() => svgPropertiesNoEvents(props.getTicksConfig))
|
|
451
|
+
/* User-provided textAnchor wins; svgPropertiesNoEvents emits it as kebab `text-anchor`. */
|
|
452
|
+
const textAnchor = createMemo((): TextAnchor => {
|
|
453
|
+
const userAnchor = (axisProps() as Record<string, string | undefined>)["text-anchor"]
|
|
454
|
+
return isValidTextAnchor(userAnchor) ? userAnchor : getTickTextAnchor(props.orientation, props.mirror)
|
|
455
|
+
})
|
|
456
|
+
const verticalAnchor = (): TextVerticalAnchor =>
|
|
457
|
+
getTickVerticalAnchor(props.orientation, props.mirror)
|
|
458
|
+
const customTickProps = createMemo(() => svgPropertiesNoEventsFromUnknown(props.tick))
|
|
459
|
+
|
|
460
|
+
const tickLineProps = createMemo((): JSX.LineSVGAttributes<SVGLineElement> => {
|
|
461
|
+
let tickLinePropsObject: JSX.LineSVGAttributes<SVGLineElement> = {}
|
|
462
|
+
if (typeof props.tickLine === "object") {
|
|
463
|
+
tickLinePropsObject = props.tickLine
|
|
464
|
+
}
|
|
465
|
+
return {
|
|
466
|
+
...axisProps(),
|
|
467
|
+
fill: "none",
|
|
468
|
+
...tickLinePropsObject,
|
|
469
|
+
}
|
|
470
|
+
})
|
|
471
|
+
|
|
472
|
+
const tickLineCoords = createMemo(() =>
|
|
473
|
+
finalTicks().map((entry: CartesianTickItem) =>
|
|
474
|
+
Object.assign(
|
|
475
|
+
{ entry },
|
|
476
|
+
getTickLineCoord(
|
|
477
|
+
entry,
|
|
478
|
+
props.x,
|
|
479
|
+
props.y,
|
|
480
|
+
props.width,
|
|
481
|
+
props.height,
|
|
482
|
+
props.orientation,
|
|
483
|
+
props.tickSize,
|
|
484
|
+
props.mirror,
|
|
485
|
+
props.tickMargin,
|
|
486
|
+
),
|
|
487
|
+
),
|
|
488
|
+
),
|
|
489
|
+
)
|
|
490
|
+
|
|
491
|
+
return (
|
|
492
|
+
<g class={`recharts-cartesian-axis-ticks recharts-${props.axisType}-ticks`}>
|
|
493
|
+
<Show when={tickLineCoords().length > 0}>
|
|
494
|
+
<ZIndexLayer zIndex={DefaultZIndexes.label}>
|
|
495
|
+
<g
|
|
496
|
+
class={`recharts-cartesian-axis-tick-labels recharts-${props.axisType}-tick-labels`}
|
|
497
|
+
ref={(el) => bindRef(props.ref, el)}
|
|
498
|
+
>
|
|
499
|
+
<For each={tickLineCoords()}>
|
|
500
|
+
{({ entry, tick: tickCoord }, i) => {
|
|
501
|
+
const tickProps = (): XAxisTickContentProps | YAxisTickContentProps => {
|
|
502
|
+
/* svgPropertiesNoEvents strips Solid `class` (not an SVG key);
|
|
503
|
+
bridge to React-style `className` so custom tick fns receive it. */
|
|
504
|
+
const axisClass = (props.getTicksConfig as { class?: string }).class
|
|
505
|
+
return {
|
|
506
|
+
verticalAnchor: verticalAnchor(),
|
|
507
|
+
...axisProps(),
|
|
508
|
+
...(axisClass != null ? { className: axisClass } : {}),
|
|
509
|
+
textAnchor: textAnchor(),
|
|
510
|
+
stroke: "none",
|
|
511
|
+
fill: props.stroke,
|
|
512
|
+
...tickCoord,
|
|
513
|
+
index: i(),
|
|
514
|
+
payload: entry,
|
|
515
|
+
visibleTicksCount: finalTicks().length,
|
|
516
|
+
tickFormatter: props.tickFormatter,
|
|
517
|
+
padding: props.padding,
|
|
518
|
+
...props.tickTextProps,
|
|
519
|
+
angle:
|
|
520
|
+
props.tickTextProps?.angle ??
|
|
521
|
+
(axisProps() as Record<string, unknown>).angle ??
|
|
522
|
+
0,
|
|
523
|
+
} as XAxisTickContentProps | YAxisTickContentProps
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
const finalTickProps = (): BaseTickContentProps =>
|
|
527
|
+
({
|
|
528
|
+
...tickProps(),
|
|
529
|
+
...customTickProps(),
|
|
530
|
+
}) as BaseTickContentProps
|
|
531
|
+
|
|
532
|
+
return (
|
|
533
|
+
<Layer
|
|
534
|
+
class="recharts-cartesian-axis-tick-label"
|
|
535
|
+
{...adaptEventsOfChild(props.events, entry, i())}
|
|
536
|
+
>
|
|
537
|
+
<Show when={props.tick}>
|
|
538
|
+
<TickItem
|
|
539
|
+
option={props.tick}
|
|
540
|
+
tickProps={finalTickProps()}
|
|
541
|
+
value={`${typeof props.tickFormatter === "function" ? props.tickFormatter(entry.value, i()) : entry.value}${props.unit || ""}`}
|
|
542
|
+
/>
|
|
543
|
+
</Show>
|
|
544
|
+
</Layer>
|
|
545
|
+
)
|
|
546
|
+
}}
|
|
547
|
+
</For>
|
|
548
|
+
</g>
|
|
549
|
+
</ZIndexLayer>
|
|
550
|
+
</Show>
|
|
551
|
+
<Show when={tickLineCoords().length > 0}>
|
|
552
|
+
<g class={`recharts-cartesian-axis-tick-lines recharts-${props.axisType}-tick-lines`}>
|
|
553
|
+
<For each={tickLineCoords()}>
|
|
554
|
+
{({ entry: _entry, line: lineCoord }) => (
|
|
555
|
+
<Layer class="recharts-cartesian-axis-tick">
|
|
556
|
+
<Show when={props.tickLine}>
|
|
557
|
+
<line
|
|
558
|
+
{...tickLineProps()}
|
|
559
|
+
{...lineCoord}
|
|
560
|
+
class={clsx(
|
|
561
|
+
"recharts-cartesian-axis-tick-line",
|
|
562
|
+
get(props.tickLine, "className"),
|
|
563
|
+
)}
|
|
564
|
+
/>
|
|
565
|
+
</Show>
|
|
566
|
+
</Layer>
|
|
567
|
+
)}
|
|
568
|
+
</For>
|
|
569
|
+
</g>
|
|
570
|
+
</Show>
|
|
571
|
+
</g>
|
|
572
|
+
)
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
function CartesianAxisComponent(props: InternalProps) {
|
|
576
|
+
/* Tick config and events never need `children`; keeping it out avoids instantiating
|
|
577
|
+
child labels outside the axis label context. */
|
|
578
|
+
const [, propsWithoutChildren] = splitProps(props, ["children"])
|
|
579
|
+
const [fontSize, setFontSize] = createSignal("")
|
|
580
|
+
const [letterSpacing, setLetterSpacing] = createSignal("")
|
|
581
|
+
let _tickRefs: HTMLCollectionOf<Element> | null = null
|
|
582
|
+
|
|
583
|
+
const api: CartesianAxisRef = {
|
|
584
|
+
getCalculatedHeight(): number {
|
|
585
|
+
return getCalculatedXAxisHeight({
|
|
586
|
+
label: untrack(() => props.labelRef),
|
|
587
|
+
labelGapWithTick: 5,
|
|
588
|
+
tickMargin: untrack(() => props.tickMargin),
|
|
589
|
+
ticks: _tickRefs,
|
|
590
|
+
tickSize: untrack(() => props.tickSize),
|
|
591
|
+
})
|
|
592
|
+
},
|
|
593
|
+
getCalculatedWidth(): number {
|
|
594
|
+
return getCalculatedYAxisWidth({
|
|
595
|
+
label: untrack(() => props.labelRef),
|
|
596
|
+
labelGapWithTick: 5,
|
|
597
|
+
tickMargin: untrack(() => props.tickMargin),
|
|
598
|
+
ticks: _tickRefs,
|
|
599
|
+
tickSize: untrack(() => props.tickSize),
|
|
600
|
+
})
|
|
601
|
+
},
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
const publishAxisRef = (value: CartesianAxisRef | null) => {
|
|
605
|
+
untrack(() => {
|
|
606
|
+
props.axisRef?.(value)
|
|
607
|
+
})
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
onCleanup(() => {
|
|
611
|
+
publishAxisRef(null)
|
|
612
|
+
})
|
|
613
|
+
|
|
614
|
+
const layerRef = (el: SVGGElement) => {
|
|
615
|
+
if (el) {
|
|
616
|
+
/* Live collection: it fills in once the ticks are inserted. */
|
|
617
|
+
_tickRefs = el.getElementsByClassName("recharts-cartesian-axis-tick-value")
|
|
618
|
+
publishAxisRef(api)
|
|
619
|
+
} else {
|
|
620
|
+
_tickRefs = null
|
|
621
|
+
publishAxisRef(null)
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/* Ticks are not in the DOM when the ref runs, so read their computed font after mount. */
|
|
626
|
+
onSettled(() => {
|
|
627
|
+
const tick: Element | undefined = _tickRefs?.[0]
|
|
628
|
+
if (tick) {
|
|
629
|
+
const computedStyle = window.getComputedStyle(tick)
|
|
630
|
+
const calculatedFontSize = computedStyle.fontSize
|
|
631
|
+
const calculatedLetterSpacing = computedStyle.letterSpacing
|
|
632
|
+
if (
|
|
633
|
+
calculatedFontSize !== untrack(fontSize) ||
|
|
634
|
+
calculatedLetterSpacing !== untrack(letterSpacing)
|
|
635
|
+
) {
|
|
636
|
+
setFontSize(calculatedFontSize)
|
|
637
|
+
setLetterSpacing(calculatedLetterSpacing)
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
})
|
|
641
|
+
|
|
642
|
+
return (
|
|
643
|
+
<Show
|
|
644
|
+
when={
|
|
645
|
+
!props.hide &&
|
|
646
|
+
!((props.width != null && props.width <= 0) || (props.height != null && props.height <= 0))
|
|
647
|
+
}
|
|
648
|
+
>
|
|
649
|
+
<ZIndexLayer zIndex={props.zIndex}>
|
|
650
|
+
<Layer class={clsx("recharts-cartesian-axis", props.class)}>
|
|
651
|
+
<AxisLine
|
|
652
|
+
x={props.x}
|
|
653
|
+
y={props.y}
|
|
654
|
+
width={props.width}
|
|
655
|
+
height={props.height}
|
|
656
|
+
orientation={props.orientation}
|
|
657
|
+
mirror={props.mirror}
|
|
658
|
+
axisLine={props.axisLine}
|
|
659
|
+
otherSvgProps={(() => {
|
|
660
|
+
const { ref: _ref, ...rest } = svgPropertiesNoEvents(props)
|
|
661
|
+
return rest
|
|
662
|
+
})()}
|
|
663
|
+
/>
|
|
664
|
+
<Ticks
|
|
665
|
+
ref={layerRef}
|
|
666
|
+
axisType={props.axisType}
|
|
667
|
+
axisId={props.axisId}
|
|
668
|
+
events={propsWithoutChildren}
|
|
669
|
+
fontSize={fontSize()}
|
|
670
|
+
getTicksConfig={propsWithoutChildren}
|
|
671
|
+
height={props.height}
|
|
672
|
+
letterSpacing={letterSpacing()}
|
|
673
|
+
mirror={props.mirror}
|
|
674
|
+
orientation={props.orientation}
|
|
675
|
+
padding={props.padding}
|
|
676
|
+
stroke={props.stroke}
|
|
677
|
+
tick={props.tick}
|
|
678
|
+
tickFormatter={props.tickFormatter}
|
|
679
|
+
tickLine={props.tickLine}
|
|
680
|
+
tickMargin={props.tickMargin}
|
|
681
|
+
tickSize={props.tickSize}
|
|
682
|
+
tickTextProps={props.tickTextProps}
|
|
683
|
+
ticks={props.ticks}
|
|
684
|
+
unit={props.unit}
|
|
685
|
+
width={props.width}
|
|
686
|
+
x={props.x}
|
|
687
|
+
y={props.y}
|
|
688
|
+
/>
|
|
689
|
+
<CartesianLabelContextProvider
|
|
690
|
+
x={props.x}
|
|
691
|
+
y={props.y}
|
|
692
|
+
width={props.width}
|
|
693
|
+
height={props.height}
|
|
694
|
+
lowerWidth={props.width}
|
|
695
|
+
upperWidth={props.width}
|
|
696
|
+
>
|
|
697
|
+
<CartesianLabelFromLabelProp
|
|
698
|
+
label={props.label}
|
|
699
|
+
labelRef={props.labelRef ?? undefined}
|
|
700
|
+
/>
|
|
701
|
+
{props.children}
|
|
702
|
+
</CartesianLabelContextProvider>
|
|
703
|
+
</Layer>
|
|
704
|
+
</ZIndexLayer>
|
|
705
|
+
</Show>
|
|
706
|
+
)
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/**
|
|
710
|
+
* @deprecated
|
|
711
|
+
*
|
|
712
|
+
* This component is not meant to be used directly in app code.
|
|
713
|
+
* Use XAxis or YAxis instead.
|
|
714
|
+
*
|
|
715
|
+
* Starting from Recharts v4.0 we will make this component internal only.
|
|
716
|
+
*/
|
|
717
|
+
export function CartesianAxis(outsideProps: Props) {
|
|
718
|
+
const props = resolveDefaultProps(outsideProps, defaultCartesianAxisProps)
|
|
719
|
+
return <CartesianAxisComponent {...props} />
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
CartesianAxis.displayName = "CartesianAxis"
|