@solidports/recharts 0.1.0 → 0.1.1
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/dist/index.d.ts +40 -2
- package/dist/index.js +14238 -7174
- package/dist/{dev.js → index.jsx} +18367 -15900
- package/dist/server.js +48178 -0
- package/package.json +36 -19
- package/src/animation/AnimatedItems.tsx +0 -183
- package/src/animation/AnimationController.ts +0 -33
- package/src/animation/AnimationControllerImpl.ts +0 -36
- package/src/animation/AnimationHandle.ts +0 -307
- package/src/animation/CSSTransitionAnimate.tsx +0 -170
- package/src/animation/JavascriptAnimate.tsx +0 -119
- package/src/animation/easing.ts +0 -221
- package/src/animation/matchBy.ts +0 -164
- package/src/animation/timeoutController.ts +0 -70
- package/src/animation/useAnimationController.tsx +0 -34
- package/src/animation/useAnimationStartSnapshot.ts +0 -118
- package/src/animation/util.ts +0 -41
- package/src/cartesian/Area.tsx +0 -915
- package/src/cartesian/AreaRevealShape.tsx +0 -190
- package/src/cartesian/Bar.tsx +0 -1369
- package/src/cartesian/BarStack.tsx +0 -152
- package/src/cartesian/Brush.tsx +0 -951
- package/src/cartesian/CartesianAxis.tsx +0 -722
- package/src/cartesian/CartesianGrid.tsx +0 -711
- package/src/cartesian/ErrorBar.tsx +0 -361
- package/src/cartesian/Funnel.tsx +0 -803
- package/src/cartesian/GraphicalItemClipPath.tsx +0 -67
- package/src/cartesian/Line.tsx +0 -863
- package/src/cartesian/LineDrawShape.tsx +0 -89
- package/src/cartesian/ReferenceArea.tsx +0 -331
- package/src/cartesian/ReferenceDot.tsx +0 -304
- package/src/cartesian/ReferenceLine.tsx +0 -474
- package/src/cartesian/Scatter.tsx +0 -888
- package/src/cartesian/XAxis.tsx +0 -433
- package/src/cartesian/YAxis.tsx +0 -443
- package/src/cartesian/ZAxis.tsx +0 -155
- package/src/cartesian/cartesianPositionToCSSTranslate.tsx +0 -29
- package/src/cartesian/cartesianViewBoxToTrapezoid.tsx +0 -21
- package/src/cartesian/getCartesianPosition.tsx +0 -267
- package/src/cartesian/getEquidistantTicks.ts +0 -144
- package/src/cartesian/getTicks.ts +0 -225
- package/src/cartesian/isOutsidePosition.ts +0 -15
- package/src/cartesian/useAnimatedLineLength.ts +0 -54
- package/src/chart/AreaChart.tsx +0 -29
- package/src/chart/BarChart.tsx +0 -29
- package/src/chart/CartesianChart.tsx +0 -131
- package/src/chart/CategoricalChart.tsx +0 -94
- package/src/chart/ComposedChart.tsx +0 -29
- package/src/chart/FunnelChart.tsx +0 -29
- package/src/chart/LineChart.tsx +0 -29
- package/src/chart/PieChart.tsx +0 -50
- package/src/chart/PolarChart.tsx +0 -164
- package/src/chart/RadarChart.tsx +0 -70
- package/src/chart/RadialBarChart.tsx +0 -46
- package/src/chart/RechartsWrapper.tsx +0 -551
- package/src/chart/Sankey.tsx +0 -1534
- package/src/chart/ScatterChart.tsx +0 -29
- package/src/chart/SunburstChart.tsx +0 -504
- package/src/chart/Treemap.tsx +0 -1223
- package/src/chart/createInitialRootProps.ts +0 -24
- package/src/chart/types.ts +0 -53
- package/src/component/ActivePoints.tsx +0 -144
- package/src/component/Cell.tsx +0 -37
- package/src/component/Cursor.tsx +0 -185
- package/src/component/Customized.tsx +0 -50
- package/src/component/DefaultLegendContent.tsx +0 -348
- package/src/component/DefaultTooltipContent.tsx +0 -224
- package/src/component/Dots.tsx +0 -157
- package/src/component/Label.tsx +0 -636
- package/src/component/LabelList.tsx +0 -375
- package/src/component/Legend.tsx +0 -512
- package/src/component/ResponsiveContainer.tsx +0 -348
- package/src/component/Text.tsx +0 -541
- package/src/component/Tooltip.tsx +0 -470
- package/src/component/TooltipBoundingBox.tsx +0 -146
- package/src/component/responsiveContainerUtils.ts +0 -134
- package/src/container/ClipPathProvider.tsx +0 -51
- package/src/container/Layer.tsx +0 -38
- package/src/container/RootSurface.tsx +0 -120
- package/src/container/Surface.tsx +0 -61
- package/src/context/CellsContext.tsx +0 -54
- package/src/context/ErrorBarContext.tsx +0 -146
- package/src/context/GraphicalItemChildrenScope.tsx +0 -18
- package/src/context/PanoramaContext.tsx +0 -9
- package/src/context/RegisterGraphicalItemId.tsx +0 -30
- package/src/context/accessibilityContext.tsx +0 -6
- package/src/context/brushUpdateContext.tsx +0 -9
- package/src/context/chartDataContext.tsx +0 -97
- package/src/context/chartLayoutContext.tsx +0 -201
- package/src/context/legendPayloadContext.tsx +0 -20
- package/src/context/legendPortalContext.tsx +0 -12
- package/src/context/tooltipContext.tsx +0 -89
- package/src/context/tooltipPortalContext.tsx +0 -12
- package/src/context/useTooltipAxis.ts +0 -22
- package/src/hooks.ts +0 -476
- package/src/index.ts +0 -280
- package/src/polar/Pie.tsx +0 -1360
- package/src/polar/PolarAngleAxis.tsx +0 -616
- package/src/polar/PolarGrid.tsx +0 -312
- package/src/polar/PolarRadiusAxis.tsx +0 -547
- package/src/polar/Radar.tsx +0 -734
- package/src/polar/RadialBar.tsx +0 -917
- package/src/polar/defaultPolarAngleAxisProps.tsx +0 -27
- package/src/polar/defaultPolarRadiusAxisProps.tsx +0 -25
- package/src/shape/Cross.tsx +0 -89
- package/src/shape/Curve.tsx +0 -343
- package/src/shape/Dot.tsx +0 -70
- package/src/shape/Polygon.tsx +0 -195
- package/src/shape/Rectangle.tsx +0 -470
- package/src/shape/Sector.tsx +0 -347
- package/src/shape/Symbols.tsx +0 -139
- package/src/shape/Trapezoid.tsx +0 -280
- package/src/state/RechartsStateContext.tsx +0 -12
- package/src/state/RechartsStateProvider.tsx +0 -87
- package/src/state/RechartsStoreContext.tsx +0 -25
- package/src/state/RechartsStoreProvider.tsx +0 -35
- package/src/state/ReportChartProps.tsx +0 -40
- package/src/state/ReportEventSettings.tsx +0 -30
- package/src/state/ReportMainChartProps.tsx +0 -61
- package/src/state/ReportPolarOptions.tsx +0 -35
- package/src/state/SetGraphicalItem.ts +0 -79
- package/src/state/SetLegendPayload.ts +0 -134
- package/src/state/SetTooltipEntrySettings.tsx +0 -72
- package/src/state/actions.ts +0 -464
- package/src/state/brushSlice.ts +0 -13
- package/src/state/cartesianAxisSlice.ts +0 -141
- package/src/state/chartDataSlice.ts +0 -50
- package/src/state/chartState.ts +0 -297
- package/src/state/errorBarSlice.ts +0 -29
- package/src/state/eventSettingsSlice.ts +0 -8
- package/src/state/events.ts +0 -76
- package/src/state/externalEventsMiddleware.ts +0 -255
- package/src/state/graphicalItemsSlice.ts +0 -74
- package/src/state/hooks/useChartSelectors.tsx +0 -45
- package/src/state/keyboardEventsMiddleware.ts +0 -228
- package/src/state/layoutSlice.ts +0 -21
- package/src/state/legendSlice.ts +0 -57
- package/src/state/mouseEventsMiddleware.ts +0 -185
- package/src/state/optionsSlice.ts +0 -47
- package/src/state/polarAxisSlice.ts +0 -10
- package/src/state/polarOptionsSlice.ts +0 -12
- package/src/state/rawData.ts +0 -26
- package/src/state/referenceElementsSlice.ts +0 -40
- package/src/state/renderedTicksSlice.ts +0 -15
- package/src/state/rootPropsSlice.ts +0 -47
- package/src/state/selectors/areaSelectors.ts +0 -240
- package/src/state/selectors/arrayEqualityCheck.ts +0 -29
- package/src/state/selectors/axisSelectors.ts +0 -2157
- package/src/state/selectors/barSelectors.ts +0 -310
- package/src/state/selectors/barStackSelectors.ts +0 -77
- package/src/state/selectors/brushSelectors.ts +0 -33
- package/src/state/selectors/chartSelector.ts +0 -185
- package/src/state/selectors/combiners/combineActiveLabel.ts +0 -16
- package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +0 -95
- package/src/state/selectors/combiners/combineAllBarPositions.ts +0 -122
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +0 -16
- package/src/state/selectors/combiners/combineBarPosition.ts +0 -23
- package/src/state/selectors/combiners/combineBarSizeList.ts +0 -80
- package/src/state/selectors/combiners/combineCheckedDomain.ts +0 -48
- package/src/state/selectors/combiners/combineConfiguredScale.ts +0 -111
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +0 -45
- package/src/state/selectors/combiners/combineDisplayedStackedData.ts +0 -50
- package/src/state/selectors/combiners/combineInverseScaleFunction.ts +0 -16
- package/src/state/selectors/combiners/combineRealScaleType.ts +0 -44
- package/src/state/selectors/combiners/combineStackedData.ts +0 -27
- package/src/state/selectors/combiners/combineTooltipInteractionState.ts +0 -86
- package/src/state/selectors/combiners/combineTooltipPayload.ts +0 -205
- package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +0 -58
- package/src/state/selectors/containerSelectors.ts +0 -12
- package/src/state/selectors/dataSelectors.ts +0 -88
- package/src/state/selectors/funnelSelectors.ts +0 -75
- package/src/state/selectors/graphicalItemSelectors.ts +0 -30
- package/src/state/selectors/legendSelectors.ts +0 -29
- package/src/state/selectors/lineSelectors.ts +0 -134
- package/src/state/selectors/numberDomainEqualityCheck.ts +0 -14
- package/src/state/selectors/pickAxisId.ts +0 -5
- package/src/state/selectors/pickAxisType.ts +0 -3
- package/src/state/selectors/pieSelectors.ts +0 -97
- package/src/state/selectors/polarAxisSelectors.ts +0 -201
- package/src/state/selectors/polarGridSelectors.ts +0 -28
- package/src/state/selectors/polarScaleSelectors.ts +0 -133
- package/src/state/selectors/polarSelectors.ts +0 -219
- package/src/state/selectors/radarSelectors.ts +0 -191
- package/src/state/selectors/radialBarSelectors.ts +0 -435
- package/src/state/selectors/rootPropsSelectors.ts +0 -25
- package/src/state/selectors/scatterSelectors.ts +0 -96
- package/src/state/selectors/selectActivePropsFromChartPointer.ts +0 -26
- package/src/state/selectors/selectAllAxes.ts +0 -17
- package/src/state/selectors/selectChartOffset.ts +0 -16
- package/src/state/selectors/selectChartOffsetInternal.ts +0 -136
- package/src/state/selectors/selectLegendArea.ts +0 -20
- package/src/state/selectors/selectPlotArea.ts +0 -22
- package/src/state/selectors/selectTooltipAxisId.ts +0 -7
- package/src/state/selectors/selectTooltipAxisType.ts +0 -32
- package/src/state/selectors/selectTooltipEventType.ts +0 -48
- package/src/state/selectors/selectTooltipPayloadSearcher.ts +0 -6
- package/src/state/selectors/selectTooltipSettings.ts +0 -39
- package/src/state/selectors/selectTooltipState.ts +0 -8
- package/src/state/selectors/selectors.ts +0 -271
- package/src/state/selectors/tooltipSelectors.ts +0 -578
- package/src/state/selectors/touchSelectors.ts +0 -31
- package/src/state/store.ts +0 -29
- package/src/state/storeIdentity.ts +0 -9
- package/src/state/teardownWrite.ts +0 -10
- package/src/state/tooltipInteraction.ts +0 -23
- package/src/state/tooltipSlice.ts +0 -334
- package/src/state/touchEventsMiddleware.ts +0 -214
- package/src/state/types/AnimationSettings.ts +0 -20
- package/src/state/types/AreaSettings.ts +0 -14
- package/src/state/types/BarSettings.ts +0 -15
- package/src/state/types/LineSettings.ts +0 -9
- package/src/state/types/PieSettings.ts +0 -34
- package/src/state/types/RadarSettings.ts +0 -5
- package/src/state/types/RadialBarSettings.ts +0 -10
- package/src/state/types/ScatterSettings.ts +0 -12
- package/src/state/types/StackedGraphicalItem.ts +0 -34
- package/src/state/useChartState.ts +0 -17
- package/src/state/zIndexSlice.ts +0 -39
- package/src/synchronisation/syncSelectors.ts +0 -7
- package/src/synchronisation/types.ts +0 -44
- package/src/synchronisation/useChartSynchronisation.tsx +0 -404
- package/src/theme/RechartsTheme.ts +0 -16
- package/src/theme/RechartsThemeContext.ts +0 -19
- package/src/theme/darkTheme.ts +0 -13
- package/src/theme/graphicalItemIdentity.ts +0 -70
- package/src/theme/legacyTheme.ts +0 -17
- package/src/theme/lightTheme.ts +0 -13
- package/src/types.ts +0 -54
- package/src/util/ActiveShapeUtils.tsx +0 -162
- package/src/util/BarUtils.tsx +0 -62
- package/src/util/BarePortal.tsx +0 -50
- package/src/util/CamelCaseSVGAttrs.ts +0 -34
- package/src/util/CartesianUtils.ts +0 -48
- package/src/util/ChartUtils.ts +0 -802
- package/src/util/Constants.ts +0 -42
- package/src/util/CssPrefixUtils.ts +0 -20
- package/src/util/DOMUtils.ts +0 -129
- package/src/util/DataUtils.ts +0 -216
- package/src/util/Events.ts +0 -16
- package/src/util/FunnelUtils.tsx +0 -15
- package/src/util/Global.ts +0 -12
- package/src/util/IfOverflow.ts +0 -15
- package/src/util/LRUCache.ts +0 -41
- package/src/util/LogUtils.ts +0 -22
- package/src/util/PolarUtils.ts +0 -132
- package/src/util/RadialBarUtils.tsx +0 -24
- package/src/util/ReactUtils.ts +0 -95
- package/src/util/ReduceCSSCalc.ts +0 -187
- package/src/util/ScatterUtils.tsx +0 -52
- package/src/util/ShapeElementProps.tsx +0 -87
- package/src/util/TickUtils.ts +0 -60
- package/src/util/XAxisUtils.ts +0 -48
- package/src/util/YAxisUtils.ts +0 -48
- package/src/util/axisPropsAreEqual.ts +0 -48
- package/src/util/createCartesianCharts.tsx +0 -150
- package/src/util/createEventProxy.ts +0 -20
- package/src/util/createPolarCharts.tsx +0 -112
- package/src/util/cursor/getCursorPoints.ts +0 -46
- package/src/util/cursor/getCursorRectangle.ts +0 -28
- package/src/util/cursor/getRadialCursorPoints.ts +0 -32
- package/src/util/excludeEventProps.ts +0 -171
- package/src/util/getActiveCoordinate.ts +0 -213
- package/src/util/getAxisTypeBasedOnLayout.ts +0 -21
- package/src/util/getClassNameFromUnknown.ts +0 -6
- package/src/util/getEveryNth.ts +0 -27
- package/src/util/getRadiusAndStrokeWidthFromDot.ts +0 -35
- package/src/util/getRelativeCoordinate.ts +0 -80
- package/src/util/getSliced.ts +0 -13
- package/src/util/hoverDedupe.ts +0 -41
- package/src/util/isDomainSpecifiedByUser.ts +0 -219
- package/src/util/isWellBehavedNumber.ts +0 -7
- package/src/util/pathTotalLength.ts +0 -25
- package/src/util/payload/getUniqPayload.ts +0 -28
- package/src/util/propsAreEqual.ts +0 -121
- package/src/util/resolveDefaultProps.ts +0 -161
- package/src/util/round.ts +0 -32
- package/src/util/scale/CartesianScaleHelper.ts +0 -72
- package/src/util/scale/CustomScaleDefinition.ts +0 -81
- package/src/util/scale/RechartsScale.ts +0 -130
- package/src/util/scale/createCategoricalInverse.ts +0 -72
- package/src/util/scale/getNiceTickValues.ts +0 -311
- package/src/util/scale/index.ts +0 -2
- package/src/util/scale/util/arithmetic.ts +0 -54
- package/src/util/solid-1-compat.ts +0 -310
- package/src/util/solidJsxCamelAugment.d.ts +0 -84
- package/src/util/stacks/getStackSeriesIdentifier.ts +0 -21
- package/src/util/stacks/stackTypes.ts +0 -60
- package/src/util/structurallyEqual.ts +0 -31
- package/src/util/svgPropertiesAndEvents.ts +0 -53
- package/src/util/svgPropertiesNoEvents.ts +0 -571
- package/src/util/tooltip/translate.ts +0 -171
- package/src/util/typedDataKey.ts +0 -48
- package/src/util/types.ts +0 -1560
- package/src/util/useAnimationId.ts +0 -31
- package/src/util/useElementOffset.ts +0 -110
- package/src/util/useId.ts +0 -8
- package/src/util/usePrefersReducedMotion.ts +0 -48
- package/src/util/useReportScale.ts +0 -24
- package/src/util/useUniqueId.ts +0 -30
- package/src/zIndex/DefaultZIndexes.ts +0 -84
- package/src/zIndex/ZIndexLayer.tsx +0 -121
- package/src/zIndex/ZIndexPortal.tsx +0 -79
- package/src/zIndex/getZIndexFromUnknown.ts +0 -14
- package/src/zIndex/zIndexSelectors.ts +0 -48
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
/* eslint-disable import/no-cycle */
|
|
2
|
-
import { getPercentValue, isNumber, isPercent } from "../util/DataUtils"
|
|
3
|
-
import { CartesianViewBoxRequired, TrapezoidViewBox } from "../util/types"
|
|
4
|
-
import { TextAnchor, TextVerticalAnchor } from "../component/Text"
|
|
5
|
-
import { cartesianViewBoxToTrapezoid } from "./cartesianViewBoxToTrapezoid"
|
|
6
|
-
|
|
7
|
-
export type CartesianLabelPosition =
|
|
8
|
-
| "top"
|
|
9
|
-
| "left"
|
|
10
|
-
| "right"
|
|
11
|
-
| "bottom"
|
|
12
|
-
| "inside"
|
|
13
|
-
| "outside"
|
|
14
|
-
| "insideLeft"
|
|
15
|
-
| "insideRight"
|
|
16
|
-
| "insideTop"
|
|
17
|
-
| "insideBottom"
|
|
18
|
-
| "insideTopLeft"
|
|
19
|
-
| "insideBottomLeft"
|
|
20
|
-
| "insideTopRight"
|
|
21
|
-
| "insideBottomRight"
|
|
22
|
-
| "insideStart"
|
|
23
|
-
| "insideEnd"
|
|
24
|
-
| "end"
|
|
25
|
-
| "center"
|
|
26
|
-
| "centerTop"
|
|
27
|
-
| "centerBottom"
|
|
28
|
-
| "middle"
|
|
29
|
-
| {
|
|
30
|
-
x?: number | string
|
|
31
|
-
y?: number | string
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export type GetCartesianPositionOptions = {
|
|
35
|
-
viewBox: TrapezoidViewBox | CartesianViewBoxRequired
|
|
36
|
-
parentViewBox?: CartesianViewBoxRequired
|
|
37
|
-
/**
|
|
38
|
-
* The offset to the specified "position". Direction of the offset depends on the position.
|
|
39
|
-
*/
|
|
40
|
-
offset?: number
|
|
41
|
-
/**
|
|
42
|
-
* The position of the element relative to the view box.
|
|
43
|
-
*/
|
|
44
|
-
position?: CartesianLabelPosition
|
|
45
|
-
/**
|
|
46
|
-
* If true, the returned width and height will be clamped to keep the element within the parentViewBox.
|
|
47
|
-
* This is useful for preventing labels from overflowing the chart area.
|
|
48
|
-
*/
|
|
49
|
-
clamp?: boolean
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export type CartesianPosition = {
|
|
53
|
-
x: number
|
|
54
|
-
y: number
|
|
55
|
-
horizontalAnchor: TextAnchor
|
|
56
|
-
verticalAnchor: TextVerticalAnchor
|
|
57
|
-
width?: number
|
|
58
|
-
height?: number
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export { isOutsidePosition } from "./isOutsidePosition"
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Calculates the position and alignment for a generic element in a Cartesian coordinate system.
|
|
65
|
-
*
|
|
66
|
-
* @param options - The options including viewBox, position, and offset.
|
|
67
|
-
* @returns The calculated x, y, alignment and size.
|
|
68
|
-
*/
|
|
69
|
-
export const getCartesianPosition = (options: GetCartesianPositionOptions): CartesianPosition => {
|
|
70
|
-
const { viewBox, position, offset = 0, parentViewBox: parentViewBoxFromOptions, clamp } = options
|
|
71
|
-
|
|
72
|
-
const { x, y, height, upperWidth, lowerWidth } = cartesianViewBoxToTrapezoid(viewBox)
|
|
73
|
-
|
|
74
|
-
/* Funnel.tsx provides a viewBox where `x` is the top-left of the trapezoid shape. */
|
|
75
|
-
const upperX = x
|
|
76
|
-
/* The trapezoid is centered, so we can calculate the other corners from the top-left. */
|
|
77
|
-
const lowerX = x + (upperWidth - lowerWidth) / 2
|
|
78
|
-
/* middleX is the x-coordinate of the left edge at the vertical midpoint of the trapezoid. */
|
|
79
|
-
const middleX = (upperX + lowerX) / 2
|
|
80
|
-
/* The width of the trapezoid at its vertical midpoint. */
|
|
81
|
-
const midHeightWidth = (upperWidth + lowerWidth) / 2
|
|
82
|
-
/* The center x-coordinate is constant for the entire height of the trapezoid. */
|
|
83
|
-
const centerX = upperX + upperWidth / 2
|
|
84
|
-
|
|
85
|
-
/* Define vertical offsets and position inverts based on the value being positive or negative.
|
|
86
|
-
* This allows labels to be positioned correctly for bars with negative height. */
|
|
87
|
-
const verticalSign = height >= 0 ? 1 : -1
|
|
88
|
-
const verticalOffset = verticalSign * offset
|
|
89
|
-
const verticalEnd = verticalSign > 0 ? "end" : "start"
|
|
90
|
-
const verticalStart = verticalSign > 0 ? "start" : "end"
|
|
91
|
-
|
|
92
|
-
/* Define horizontal offsets and position inverts based on the value being positive or negative.
|
|
93
|
-
* This allows labels to be positioned correctly for bars with negative width. */
|
|
94
|
-
const horizontalSign = upperWidth >= 0 ? 1 : -1
|
|
95
|
-
const horizontalOffset = horizontalSign * offset
|
|
96
|
-
const horizontalEnd = horizontalSign > 0 ? "end" : "start"
|
|
97
|
-
const horizontalStart = horizontalSign > 0 ? "start" : "end"
|
|
98
|
-
|
|
99
|
-
/* We assume parentViewBox is generic if provided.
|
|
100
|
-
* The user has asserted that parentViewBox will be CartesianViewBoxRequired if present. */
|
|
101
|
-
const parentViewBox = parentViewBoxFromOptions
|
|
102
|
-
|
|
103
|
-
if (position === "top") {
|
|
104
|
-
const result: CartesianPosition = {
|
|
105
|
-
horizontalAnchor: "middle",
|
|
106
|
-
verticalAnchor: verticalEnd,
|
|
107
|
-
x: upperX + upperWidth / 2,
|
|
108
|
-
y: y - verticalOffset,
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (clamp && parentViewBox) {
|
|
112
|
-
result.height = Math.max(y - parentViewBox.y, 0)
|
|
113
|
-
result.width = upperWidth
|
|
114
|
-
}
|
|
115
|
-
return result
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if (position === "bottom") {
|
|
119
|
-
const result: CartesianPosition = {
|
|
120
|
-
horizontalAnchor: "middle",
|
|
121
|
-
verticalAnchor: verticalStart,
|
|
122
|
-
x: lowerX + lowerWidth / 2,
|
|
123
|
-
y: y + height + verticalOffset,
|
|
124
|
-
}
|
|
125
|
-
if (clamp && parentViewBox) {
|
|
126
|
-
result.height = Math.max(parentViewBox.y + parentViewBox.height - (y + height), 0)
|
|
127
|
-
result.width = lowerWidth
|
|
128
|
-
}
|
|
129
|
-
return result
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (position === "left") {
|
|
133
|
-
const result: CartesianPosition = {
|
|
134
|
-
horizontalAnchor: horizontalEnd,
|
|
135
|
-
verticalAnchor: "middle",
|
|
136
|
-
x: middleX - horizontalOffset,
|
|
137
|
-
y: y + height / 2,
|
|
138
|
-
}
|
|
139
|
-
if (clamp && parentViewBox) {
|
|
140
|
-
result.width = Math.max(result.x - parentViewBox.x, 0)
|
|
141
|
-
result.height = height
|
|
142
|
-
}
|
|
143
|
-
return result
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (position === "right") {
|
|
147
|
-
const result: CartesianPosition = {
|
|
148
|
-
horizontalAnchor: horizontalStart,
|
|
149
|
-
verticalAnchor: "middle",
|
|
150
|
-
x: middleX + midHeightWidth + horizontalOffset,
|
|
151
|
-
y: y + height / 2,
|
|
152
|
-
}
|
|
153
|
-
if (clamp && parentViewBox) {
|
|
154
|
-
result.width = Math.max(parentViewBox.x + parentViewBox.width - result.x, 0)
|
|
155
|
-
result.height = height
|
|
156
|
-
}
|
|
157
|
-
return result
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const sizeAttrs = clamp && parentViewBox ? { height, width: midHeightWidth } : {}
|
|
161
|
-
|
|
162
|
-
if (position === "insideLeft") {
|
|
163
|
-
return {
|
|
164
|
-
horizontalAnchor: horizontalStart,
|
|
165
|
-
verticalAnchor: "middle",
|
|
166
|
-
x: middleX + horizontalOffset,
|
|
167
|
-
y: y + height / 2,
|
|
168
|
-
...sizeAttrs,
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
if (position === "insideRight") {
|
|
173
|
-
return {
|
|
174
|
-
horizontalAnchor: horizontalEnd,
|
|
175
|
-
verticalAnchor: "middle",
|
|
176
|
-
x: middleX + midHeightWidth - horizontalOffset,
|
|
177
|
-
y: y + height / 2,
|
|
178
|
-
...sizeAttrs,
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (position === "insideTop") {
|
|
183
|
-
return {
|
|
184
|
-
horizontalAnchor: "middle",
|
|
185
|
-
verticalAnchor: verticalStart,
|
|
186
|
-
x: upperX + upperWidth / 2,
|
|
187
|
-
y: y + verticalOffset,
|
|
188
|
-
...sizeAttrs,
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (position === "insideBottom") {
|
|
193
|
-
return {
|
|
194
|
-
horizontalAnchor: "middle",
|
|
195
|
-
verticalAnchor: verticalEnd,
|
|
196
|
-
x: lowerX + lowerWidth / 2,
|
|
197
|
-
y: y + height - verticalOffset,
|
|
198
|
-
...sizeAttrs,
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
if (position === "insideTopLeft") {
|
|
203
|
-
return {
|
|
204
|
-
horizontalAnchor: horizontalStart,
|
|
205
|
-
verticalAnchor: verticalStart,
|
|
206
|
-
x: upperX + horizontalOffset,
|
|
207
|
-
y: y + verticalOffset,
|
|
208
|
-
...sizeAttrs,
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
if (position === "insideTopRight") {
|
|
213
|
-
return {
|
|
214
|
-
horizontalAnchor: horizontalEnd,
|
|
215
|
-
verticalAnchor: verticalStart,
|
|
216
|
-
x: upperX + upperWidth - horizontalOffset,
|
|
217
|
-
y: y + verticalOffset,
|
|
218
|
-
...sizeAttrs,
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
if (position === "insideBottomLeft") {
|
|
223
|
-
return {
|
|
224
|
-
horizontalAnchor: horizontalStart,
|
|
225
|
-
verticalAnchor: verticalEnd,
|
|
226
|
-
x: lowerX + horizontalOffset,
|
|
227
|
-
y: y + height - verticalOffset,
|
|
228
|
-
...sizeAttrs,
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
if (position === "insideBottomRight") {
|
|
233
|
-
return {
|
|
234
|
-
horizontalAnchor: horizontalEnd,
|
|
235
|
-
verticalAnchor: verticalEnd,
|
|
236
|
-
x: lowerX + lowerWidth - horizontalOffset,
|
|
237
|
-
y: y + height - verticalOffset,
|
|
238
|
-
...sizeAttrs,
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
if (
|
|
243
|
-
position != null &&
|
|
244
|
-
typeof position === "object" &&
|
|
245
|
-
(isNumber(position.x) || isPercent(position.x)) &&
|
|
246
|
-
(isNumber(position.y) || isPercent(position.y))
|
|
247
|
-
) {
|
|
248
|
-
/* TODO: This is not quite right. The width of the trapezoid changes with y.
|
|
249
|
-
* A percentage-based x should be relative to the width at that y.
|
|
250
|
-
* For now, we use the mid-height width as a reasonable approximation. */
|
|
251
|
-
return {
|
|
252
|
-
horizontalAnchor: "end",
|
|
253
|
-
verticalAnchor: "end",
|
|
254
|
-
x: x + getPercentValue(position.x, midHeightWidth),
|
|
255
|
-
y: y + getPercentValue(position.y, height),
|
|
256
|
-
...sizeAttrs,
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
return {
|
|
261
|
-
horizontalAnchor: "middle",
|
|
262
|
-
verticalAnchor: "middle",
|
|
263
|
-
x: centerX,
|
|
264
|
-
y: y + height / 2,
|
|
265
|
-
...sizeAttrs,
|
|
266
|
-
}
|
|
267
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/* eslint-disable import/no-cycle */
|
|
2
|
-
import { isVisible } from "../util/TickUtils"
|
|
3
|
-
import { CartesianTickItem } from "../util/types"
|
|
4
|
-
import { getEveryNth } from "../util/getEveryNth"
|
|
5
|
-
import { Sign } from "./getTicks"
|
|
6
|
-
|
|
7
|
-
export function getEquidistantTicks(
|
|
8
|
-
sign: Sign,
|
|
9
|
-
boundaries: { start: number; end: number },
|
|
10
|
-
getTickSize: (tick: CartesianTickItem, index: number) => number,
|
|
11
|
-
ticks: ReadonlyArray<CartesianTickItem>,
|
|
12
|
-
minTickGap: number,
|
|
13
|
-
): ReadonlyArray<CartesianTickItem> {
|
|
14
|
-
/* If the ticks are readonly, then the slice might not be necessary */
|
|
15
|
-
const result = (ticks || []).slice()
|
|
16
|
-
|
|
17
|
-
const { start: initialStart, end } = boundaries
|
|
18
|
-
let index = 0
|
|
19
|
-
/* Premature optimisation idea 1: Estimate a lower bound, and start from there.
|
|
20
|
-
* For now, start from every tick */
|
|
21
|
-
let stepsize = 1
|
|
22
|
-
let start = initialStart
|
|
23
|
-
|
|
24
|
-
while (stepsize <= result.length) {
|
|
25
|
-
/* Given stepsize, evaluate whether every stepsize-th tick can be shown.
|
|
26
|
-
* If it can not, then increase the stepsize by 1, and try again. */
|
|
27
|
-
|
|
28
|
-
const entry = ticks?.[index]
|
|
29
|
-
|
|
30
|
-
/* Break condition - If we have evaluated all the ticks, then we are done. */
|
|
31
|
-
if (entry === undefined) {
|
|
32
|
-
return getEveryNth(ticks, stepsize)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/* Check if the element collides with the next element */
|
|
36
|
-
const i = index
|
|
37
|
-
let size: number | undefined
|
|
38
|
-
const getSize = () => {
|
|
39
|
-
if (size === undefined) {
|
|
40
|
-
size = getTickSize(entry, i)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return size
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const tickCoord = entry.coordinate
|
|
47
|
-
/* We will always show the first tick. */
|
|
48
|
-
const isShow = index === 0 || isVisible(sign, tickCoord, getSize, start, end)
|
|
49
|
-
|
|
50
|
-
if (!isShow) {
|
|
51
|
-
/* Start all over with a larger stepsize */
|
|
52
|
-
index = 0
|
|
53
|
-
start = initialStart
|
|
54
|
-
stepsize += 1
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (isShow) {
|
|
58
|
-
/* If it can be shown, update the start */
|
|
59
|
-
start = tickCoord + sign * (getSize() / 2 + minTickGap)
|
|
60
|
-
index += stepsize
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return []
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export function getEquidistantPreserveEndTicks(
|
|
68
|
-
sign: Sign,
|
|
69
|
-
boundaries: { start: number; end: number },
|
|
70
|
-
getTickSize: (tick: CartesianTickItem, index: number) => number,
|
|
71
|
-
ticks: ReadonlyArray<CartesianTickItem>,
|
|
72
|
-
minTickGap: number,
|
|
73
|
-
): ReadonlyArray<CartesianTickItem> {
|
|
74
|
-
/* If the ticks are readonly, then the slice might not be necessary */
|
|
75
|
-
/* Reworked logic for getEquidistantPreserveEndTicks */
|
|
76
|
-
const result = (ticks || []).slice()
|
|
77
|
-
const len = result.length
|
|
78
|
-
|
|
79
|
-
if (len === 0) {
|
|
80
|
-
return []
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const { start: initialStart, end } = boundaries
|
|
84
|
-
|
|
85
|
-
/* Start with stepsize = 1 (every tick) up to the maximum possible stepsize (len) */
|
|
86
|
-
for (let stepsize = 1; stepsize <= len; stepsize++) {
|
|
87
|
-
/* 1. Calculate the offset so the last tick (index len - 1) is always included in the sequence. */
|
|
88
|
-
const offset = (len - 1) % stepsize
|
|
89
|
-
let start = initialStart
|
|
90
|
-
let ok = true
|
|
91
|
-
|
|
92
|
-
/* 2. Iterate through the end-anchored sequence: offset, offset + stepsize, ..., len - 1 */
|
|
93
|
-
for (let index = offset; index < len; index += stepsize) {
|
|
94
|
-
const entry = ticks[index]
|
|
95
|
-
if (entry == null) {
|
|
96
|
-
continue
|
|
97
|
-
}
|
|
98
|
-
const i = index
|
|
99
|
-
let size: number | undefined
|
|
100
|
-
|
|
101
|
-
/* Use a function to get size, as in the original code */
|
|
102
|
-
const getSize = () => {
|
|
103
|
-
if (size === undefined) {
|
|
104
|
-
size = getTickSize(entry, i)
|
|
105
|
-
}
|
|
106
|
-
return size
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const tickCoord = entry.coordinate
|
|
110
|
-
|
|
111
|
-
/* 3. Apply visibility logic (including the first tick special case)
|
|
112
|
-
* The reviewer says *not* to unconditionally bypass checks for the last tick. */
|
|
113
|
-
const isShow = index === offset || isVisible(sign, tickCoord, getSize, start, end)
|
|
114
|
-
|
|
115
|
-
if (!isShow) {
|
|
116
|
-
/* If any tick in this end-anchored sequence fails visibility/collision,
|
|
117
|
-
* reject this stepsize and move to the next iteration (larger stepsize). */
|
|
118
|
-
ok = false
|
|
119
|
-
break
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/* 4. If showable, update the 'start' coordinate for the next collision check */
|
|
123
|
-
if (isShow) {
|
|
124
|
-
start = tickCoord + sign * (getSize() / 2 + minTickGap)
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/* 5. If the entire sequence for this stepsize passed the visibility check, return the result */
|
|
129
|
-
if (ok) {
|
|
130
|
-
/* Build the final result array explicitly using the validated stepsize and offset. */
|
|
131
|
-
const finalTicks: CartesianTickItem[] = []
|
|
132
|
-
for (let index = offset; index < len; index += stepsize) {
|
|
133
|
-
const tick = ticks[index]
|
|
134
|
-
if (tick != null) {
|
|
135
|
-
finalTicks.push(tick)
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return finalTicks
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/* If no stepsize works (this shouldn't happen unless minTickGap is huge), return an empty array. */
|
|
143
|
-
return []
|
|
144
|
-
}
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
/* eslint-disable import/no-cycle */
|
|
2
|
-
import { CartesianTickItem, CartesianViewBoxRequired, Size } from "../util/types"
|
|
3
|
-
import { mathSign, isNumber } from "../util/DataUtils"
|
|
4
|
-
import { getStringSize } from "../util/DOMUtils"
|
|
5
|
-
import { Global } from "../util/Global"
|
|
6
|
-
import {
|
|
7
|
-
isVisible,
|
|
8
|
-
getTickBoundaries,
|
|
9
|
-
getNumberIntervalTicks,
|
|
10
|
-
getAngledTickWidth,
|
|
11
|
-
} from "../util/TickUtils"
|
|
12
|
-
import { getEquidistantTicks, getEquidistantPreserveEndTicks } from "./getEquidistantTicks"
|
|
13
|
-
import {
|
|
14
|
-
CartesianAxisSettings,
|
|
15
|
-
XAxisOrientation,
|
|
16
|
-
YAxisOrientation,
|
|
17
|
-
} from "../state/cartesianAxisSlice"
|
|
18
|
-
|
|
19
|
-
export type Sign = 0 | 1 | -1
|
|
20
|
-
|
|
21
|
-
function getTicksEnd(
|
|
22
|
-
sign: Sign,
|
|
23
|
-
boundaries: { start: number; end: number },
|
|
24
|
-
getTickSize: (tick: CartesianTickItem, index: number) => number,
|
|
25
|
-
ticks: ReadonlyArray<CartesianTickItem>,
|
|
26
|
-
minTickGap: number,
|
|
27
|
-
): ReadonlyArray<CartesianTickItem> {
|
|
28
|
-
const result = (ticks || []).slice()
|
|
29
|
-
const len = result.length
|
|
30
|
-
|
|
31
|
-
const { start } = boundaries
|
|
32
|
-
let { end } = boundaries
|
|
33
|
-
|
|
34
|
-
for (let i = len - 1; i >= 0; i--) {
|
|
35
|
-
const initialEntry = result[i]
|
|
36
|
-
if (initialEntry == null) {
|
|
37
|
-
continue
|
|
38
|
-
}
|
|
39
|
-
let entry = initialEntry
|
|
40
|
-
let size: number | undefined
|
|
41
|
-
const getSize = () => {
|
|
42
|
-
if (size === undefined) {
|
|
43
|
-
size = getTickSize(initialEntry, i)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return size
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (i === len - 1) {
|
|
50
|
-
const gap = sign * (entry.coordinate + (sign * getSize()) / 2 - end)
|
|
51
|
-
result[i] = entry = {
|
|
52
|
-
...entry,
|
|
53
|
-
tickCoord: gap > 0 ? entry.coordinate - gap * sign : entry.coordinate,
|
|
54
|
-
}
|
|
55
|
-
} else {
|
|
56
|
-
result[i] = entry = { ...entry, tickCoord: entry.coordinate }
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (entry.tickCoord != null) {
|
|
60
|
-
const isShow = isVisible(sign, entry.tickCoord, getSize, start, end)
|
|
61
|
-
|
|
62
|
-
if (isShow) {
|
|
63
|
-
end = entry.tickCoord - sign * (getSize() / 2 + minTickGap)
|
|
64
|
-
result[i] = { ...entry, isShow: true }
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return result
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function getTicksStart(
|
|
73
|
-
sign: Sign,
|
|
74
|
-
boundaries: { start: number; end: number },
|
|
75
|
-
getTickSize: (tick: CartesianTickItem, index: number) => number,
|
|
76
|
-
ticks: ReadonlyArray<CartesianTickItem>,
|
|
77
|
-
minTickGap: number,
|
|
78
|
-
preserveEnd?: boolean,
|
|
79
|
-
): ReadonlyArray<CartesianTickItem> {
|
|
80
|
-
/* This method is mutating the array so clone is indeed necessary here */
|
|
81
|
-
const result: Array<CartesianTickItem> = (ticks || []).slice()
|
|
82
|
-
const len = result.length
|
|
83
|
-
|
|
84
|
-
let { start, end } = boundaries
|
|
85
|
-
|
|
86
|
-
if (preserveEnd) {
|
|
87
|
-
/* Try to guarantee the tail to be displayed */
|
|
88
|
-
let tail = ticks[len - 1]
|
|
89
|
-
if (tail != null) {
|
|
90
|
-
const tailSize = getTickSize(tail, len - 1)
|
|
91
|
-
const tailGap = sign * (tail.coordinate + (sign * tailSize) / 2 - end)
|
|
92
|
-
result[len - 1] = tail = {
|
|
93
|
-
...tail,
|
|
94
|
-
tickCoord: tailGap > 0 ? tail.coordinate - tailGap * sign : tail.coordinate,
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (tail.tickCoord != null) {
|
|
98
|
-
const isTailShow = isVisible(sign, tail.tickCoord, () => tailSize, start, end)
|
|
99
|
-
|
|
100
|
-
if (isTailShow) {
|
|
101
|
-
end = tail.tickCoord - sign * (tailSize / 2 + minTickGap)
|
|
102
|
-
result[len - 1] = { ...tail, isShow: true }
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const count = preserveEnd ? len - 1 : len
|
|
109
|
-
for (let i = 0; i < count; i++) {
|
|
110
|
-
const initialEntry = result[i]
|
|
111
|
-
if (initialEntry == null) {
|
|
112
|
-
continue
|
|
113
|
-
}
|
|
114
|
-
let entry = initialEntry
|
|
115
|
-
let size: number | undefined
|
|
116
|
-
const getSize = () => {
|
|
117
|
-
if (size === undefined) {
|
|
118
|
-
size = getTickSize(initialEntry, i)
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return size
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (i === 0) {
|
|
125
|
-
const gap = sign * (entry.coordinate - (sign * getSize()) / 2 - start)
|
|
126
|
-
result[i] = entry = {
|
|
127
|
-
...entry,
|
|
128
|
-
tickCoord: gap < 0 ? entry.coordinate - gap * sign : entry.coordinate,
|
|
129
|
-
}
|
|
130
|
-
} else {
|
|
131
|
-
result[i] = entry = { ...entry, tickCoord: entry.coordinate }
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (entry.tickCoord != null) {
|
|
135
|
-
const isShow = isVisible(sign, entry.tickCoord, getSize, start, end)
|
|
136
|
-
|
|
137
|
-
if (isShow) {
|
|
138
|
-
start = entry.tickCoord + sign * (getSize() / 2 + minTickGap)
|
|
139
|
-
result[i] = { ...entry, isShow: true }
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return result
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export type GetTicksInput = {
|
|
148
|
-
angle?: number
|
|
149
|
-
interval: CartesianAxisSettings["interval"] | undefined
|
|
150
|
-
minTickGap: number
|
|
151
|
-
orientation: XAxisOrientation | YAxisOrientation
|
|
152
|
-
tick: CartesianAxisSettings["tick"]
|
|
153
|
-
tickFormatter?: CartesianAxisSettings["tickFormatter"]
|
|
154
|
-
ticks: ReadonlyArray<CartesianTickItem> | null
|
|
155
|
-
unit?: CartesianAxisSettings["unit"]
|
|
156
|
-
viewBox: CartesianViewBoxRequired
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
export function getTicks(
|
|
160
|
-
props: GetTicksInput,
|
|
161
|
-
fontSize?: string,
|
|
162
|
-
letterSpacing?: string,
|
|
163
|
-
): ReadonlyArray<CartesianTickItem> {
|
|
164
|
-
const { tick, ticks, viewBox, minTickGap, orientation, interval, tickFormatter, unit, angle } =
|
|
165
|
-
props
|
|
166
|
-
|
|
167
|
-
if (!ticks || !ticks.length || !tick) {
|
|
168
|
-
return []
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (isNumber(interval) || Global.isSsr) {
|
|
172
|
-
return getNumberIntervalTicks(ticks, isNumber(interval) ? interval : 0) ?? []
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
let candidates: ReadonlyArray<CartesianTickItem> = []
|
|
176
|
-
|
|
177
|
-
const sizeKey = orientation === "top" || orientation === "bottom" ? "width" : "height"
|
|
178
|
-
const unitSize: Size =
|
|
179
|
-
unit && sizeKey === "width"
|
|
180
|
-
? getStringSize(unit, { "font-size": fontSize, "letter-spacing": letterSpacing })
|
|
181
|
-
: { height: 0, width: 0 }
|
|
182
|
-
|
|
183
|
-
const getTickSize = (content: CartesianTickItem, index: number) => {
|
|
184
|
-
const value =
|
|
185
|
-
typeof tickFormatter === "function" ? tickFormatter(content.value, index) : content.value
|
|
186
|
-
/* Recharts only supports angles when sizeKey === 'width' */
|
|
187
|
-
return sizeKey === "width"
|
|
188
|
-
? getAngledTickWidth(
|
|
189
|
-
getStringSize(value, { "font-size": fontSize, "letter-spacing": letterSpacing }),
|
|
190
|
-
unitSize,
|
|
191
|
-
angle,
|
|
192
|
-
)
|
|
193
|
-
: getStringSize(value, { "font-size": fontSize, "letter-spacing": letterSpacing })[sizeKey]
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const tick0 = ticks[0]
|
|
197
|
-
const tick1 = ticks[1]
|
|
198
|
-
const sign =
|
|
199
|
-
ticks.length >= 2 && tick0 != null && tick1 != null
|
|
200
|
-
? mathSign(tick1.coordinate - tick0.coordinate)
|
|
201
|
-
: 1
|
|
202
|
-
const boundaries = getTickBoundaries(viewBox, sign, sizeKey)
|
|
203
|
-
|
|
204
|
-
if (interval === "equidistantPreserveStart") {
|
|
205
|
-
return getEquidistantTicks(sign, boundaries, getTickSize, ticks, minTickGap)
|
|
206
|
-
}
|
|
207
|
-
if (interval === "equidistantPreserveEnd") {
|
|
208
|
-
return getEquidistantPreserveEndTicks(sign, boundaries, getTickSize, ticks, minTickGap)
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
if (interval === "preserveStart" || interval === "preserveStartEnd") {
|
|
212
|
-
candidates = getTicksStart(
|
|
213
|
-
sign,
|
|
214
|
-
boundaries,
|
|
215
|
-
getTickSize,
|
|
216
|
-
ticks,
|
|
217
|
-
minTickGap,
|
|
218
|
-
interval === "preserveStartEnd",
|
|
219
|
-
)
|
|
220
|
-
} else {
|
|
221
|
-
candidates = getTicksEnd(sign, boundaries, getTickSize, ticks, minTickGap)
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
return candidates.filter((entry) => entry.isShow)
|
|
225
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
const absolutePositions: ReadonlyArray<string> = ["top", "left", "right", "bottom"]
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* True when the legend (or label) sits outside the plot: `top`/`left`/`right`/`bottom`,
|
|
5
|
-
* or a coordinate object. Inside keywords (`insideTop`, …) return false.
|
|
6
|
-
*/
|
|
7
|
-
export function isOutsidePosition(position: unknown): boolean {
|
|
8
|
-
if (position == null) {
|
|
9
|
-
return false
|
|
10
|
-
}
|
|
11
|
-
if (typeof position === "object") {
|
|
12
|
-
return true
|
|
13
|
-
}
|
|
14
|
-
return typeof position === "string" && absolutePositions.includes(position)
|
|
15
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { untrack } from "solid-js"
|
|
2
|
-
import type { Accessor } from "solid-js"
|
|
3
|
-
import { round } from "../util/round"
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Tracks the animated visible length of a Line's SVG path across data changes.
|
|
7
|
-
*
|
|
8
|
-
* Invariants:
|
|
9
|
-
* 1. The visible length only grows (monotonically non-decreasing with animationElapsedTime).
|
|
10
|
-
* 2. The visible length changes continuously — no jumps when data changes mid-animation.
|
|
11
|
-
* This is achieved by tracking the maximum animated length in pixels and using it
|
|
12
|
-
* as the starting point for the next animation.
|
|
13
|
-
* 3. Once the line reaches 100% visibility, it never becomes partially visible again.
|
|
14
|
-
* In that case the callback returns `null`, meaning no animation stroke-dasharray is needed.
|
|
15
|
-
*
|
|
16
|
-
* @param animationInput Identity of the current data. When it changes, the next call
|
|
17
|
-
* starts a new animation from the current visible length.
|
|
18
|
-
* @returns A callback `(animationElapsedTime, totalLength) => number | null` where:
|
|
19
|
-
* - `animationElapsedTime` is the animation progress (0 to 1)
|
|
20
|
-
* - `totalLength` is the current total length of the SVG path in pixels
|
|
21
|
-
* - returns the visible length in pixels, or `null` if the line is fully visible
|
|
22
|
-
*/
|
|
23
|
-
export function useAnimatedLineLength(
|
|
24
|
-
animationInput: Accessor<unknown>,
|
|
25
|
-
): (animationElapsedTime: number, totalLength: number) => number | null {
|
|
26
|
-
let startingLength = 0
|
|
27
|
-
let maxAnimatedLength = 0
|
|
28
|
-
let reachedFull = false
|
|
29
|
-
let prevInput = untrack(animationInput)
|
|
30
|
-
|
|
31
|
-
return (animationElapsedTime: number, totalLength: number): number | null => {
|
|
32
|
-
const input = animationInput()
|
|
33
|
-
if (input !== prevInput) {
|
|
34
|
-
startingLength = maxAnimatedLength
|
|
35
|
-
prevInput = input
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (reachedFull) {
|
|
39
|
-
return null
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const visibleLength = Math.min(round(startingLength + animationElapsedTime * totalLength), totalLength)
|
|
43
|
-
|
|
44
|
-
if (animationElapsedTime > 0 && totalLength > 0) {
|
|
45
|
-
maxAnimatedLength = Math.max(maxAnimatedLength, visibleLength)
|
|
46
|
-
if (visibleLength >= totalLength) {
|
|
47
|
-
reachedFull = true
|
|
48
|
-
return null
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return visibleLength
|
|
53
|
-
}
|
|
54
|
-
}
|