@wavemaker/react-native-echarts 1.0.0-dev.5 → 1.0.0-dev.9
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/README.md +29 -3
- package/area/area-chart.d.ts +1 -1
- package/area/area-chart.d.ts.map +1 -1
- package/area/area-chart.js +63 -37
- package/area/area-chart.props.d.ts +4 -0
- package/area/area-chart.props.d.ts.map +1 -1
- package/area/index.d.ts +1 -1
- package/area/index.d.ts.map +1 -1
- package/axis.d.ts +26 -0
- package/axis.d.ts.map +1 -1
- package/axis.js +35 -0
- package/bubble/bubble-chart.d.ts.map +1 -1
- package/bubble/bubble-chart.js +59 -33
- package/candlestick/candlestick-chart.d.ts.map +1 -1
- package/candlestick/candlestick-chart.js +15 -8
- package/cartesian/tooltip/axis-tooltip-presets.d.ts +5 -0
- package/cartesian/tooltip/axis-tooltip-presets.d.ts.map +1 -0
- package/cartesian/tooltip/axis-tooltip-presets.js +46 -0
- package/cartesian/tooltip/axis-tooltip.types.d.ts +38 -0
- package/cartesian/tooltip/axis-tooltip.types.d.ts.map +1 -0
- package/cartesian/tooltip/axis-tooltip.types.js +4 -0
- package/cartesian/tooltip/axis-tooltip.utils.d.ts +10 -0
- package/cartesian/tooltip/axis-tooltip.utils.d.ts.map +1 -0
- package/cartesian/tooltip/axis-tooltip.utils.js +121 -0
- package/cartesian/tooltip/default-axis-tooltip.d.ts +9 -0
- package/cartesian/tooltip/default-axis-tooltip.d.ts.map +1 -0
- package/cartesian/tooltip/default-axis-tooltip.js +53 -0
- package/cartesian/tooltip/index.d.ts +7 -0
- package/cartesian/tooltip/index.d.ts.map +1 -0
- package/cartesian/tooltip/index.js +4 -0
- package/cartesian/tooltip/use-axis-tooltip.d.ts +38 -0
- package/cartesian/tooltip/use-axis-tooltip.d.ts.map +1 -0
- package/cartesian/tooltip/use-axis-tooltip.js +54 -0
- package/column/column-chart.d.ts.map +1 -1
- package/column/column-chart.js +86 -31
- package/geo/geo-chart.d.ts.map +1 -1
- package/geo/geo-chart.js +56 -24
- package/geo/geo-chart.props.d.ts +11 -5
- package/geo/geo-chart.props.d.ts.map +1 -1
- package/geo/index.d.ts +1 -0
- package/geo/index.d.ts.map +1 -1
- package/geo/index.js +1 -0
- package/geo/tooltip/default-geo-tooltip.d.ts +6 -0
- package/geo/tooltip/default-geo-tooltip.d.ts.map +1 -0
- package/geo/tooltip/default-geo-tooltip.js +47 -0
- package/geo/tooltip/geo-item-tooltip-presets.d.ts +5 -0
- package/geo/tooltip/geo-item-tooltip-presets.d.ts.map +1 -0
- package/geo/tooltip/geo-item-tooltip-presets.js +35 -0
- package/geo/tooltip/geo-item-tooltip.types.d.ts +19 -0
- package/geo/tooltip/geo-item-tooltip.types.d.ts.map +1 -0
- package/geo/tooltip/geo-item-tooltip.types.js +3 -0
- package/geo/tooltip/geo-item-tooltip.utils.d.ts +14 -0
- package/geo/tooltip/geo-item-tooltip.utils.d.ts.map +1 -0
- package/geo/tooltip/geo-item-tooltip.utils.js +220 -0
- package/geo/tooltip/index.d.ts +7 -0
- package/geo/tooltip/index.d.ts.map +1 -0
- package/geo/tooltip/index.js +4 -0
- package/geo/tooltip/use-geo-item-tooltip.d.ts +26 -0
- package/geo/tooltip/use-geo-item-tooltip.d.ts.map +1 -0
- package/geo/tooltip/use-geo-item-tooltip.js +59 -0
- package/geo/us-chart.js +1 -1
- package/geo/us-states.json +54 -0
- package/geo/world.json +1 -0
- package/index.d.ts +2 -0
- package/index.d.ts.map +1 -1
- package/index.js +2 -0
- package/line/index.d.ts +1 -1
- package/line/index.d.ts.map +1 -1
- package/line/line-chart.d.ts +1 -1
- package/line/line-chart.d.ts.map +1 -1
- package/line/line-chart.props.d.ts +5 -0
- package/line/line-chart.props.d.ts.map +1 -1
- package/package.json +1 -1
- package/pie/index.d.ts +1 -0
- package/pie/index.d.ts.map +1 -1
- package/pie/index.js +1 -0
- package/pie/pie-chart.d.ts.map +1 -1
- package/pie/pie-chart.js +59 -36
- package/pie/pie-chart.props.d.ts +12 -6
- package/pie/pie-chart.props.d.ts.map +1 -1
- package/pie/tooltip/default-pie-tooltip.d.ts +5 -0
- package/pie/tooltip/default-pie-tooltip.d.ts.map +1 -0
- package/pie/tooltip/default-pie-tooltip.js +57 -0
- package/pie/tooltip/index.d.ts +7 -0
- package/pie/tooltip/index.d.ts.map +1 -0
- package/pie/tooltip/index.js +4 -0
- package/pie/tooltip/pie-item-tooltip-presets.d.ts +5 -0
- package/pie/tooltip/pie-item-tooltip-presets.d.ts.map +1 -0
- package/pie/tooltip/pie-item-tooltip-presets.js +39 -0
- package/pie/tooltip/pie-item-tooltip.types.d.ts +28 -0
- package/pie/tooltip/pie-item-tooltip.types.d.ts.map +1 -0
- package/pie/tooltip/pie-item-tooltip.types.js +3 -0
- package/pie/tooltip/pie-item-tooltip.utils.d.ts +9 -0
- package/pie/tooltip/pie-item-tooltip.utils.d.ts.map +1 -0
- package/pie/tooltip/pie-item-tooltip.utils.js +139 -0
- package/pie/tooltip/use-pie-item-tooltip.d.ts +24 -0
- package/pie/tooltip/use-pie-item-tooltip.d.ts.map +1 -0
- package/pie/tooltip/use-pie-item-tooltip.js +45 -0
- package/props/cartesian.d.ts +43 -11
- package/props/cartesian.d.ts.map +1 -1
- package/radar/index.d.ts +1 -0
- package/radar/index.d.ts.map +1 -1
- package/radar/index.js +1 -0
- package/radar/radar-chart.d.ts.map +1 -1
- package/radar/radar-chart.js +52 -10
- package/radar/radar-chart.props.d.ts +13 -0
- package/radar/radar-chart.props.d.ts.map +1 -1
- package/radar/tooltip/default-radar-tooltip.d.ts +6 -0
- package/radar/tooltip/default-radar-tooltip.d.ts.map +1 -0
- package/radar/tooltip/default-radar-tooltip.js +47 -0
- package/radar/tooltip/index.d.ts +7 -0
- package/radar/tooltip/index.d.ts.map +1 -0
- package/radar/tooltip/index.js +4 -0
- package/radar/tooltip/radar-item-tooltip-presets.d.ts +5 -0
- package/radar/tooltip/radar-item-tooltip-presets.d.ts.map +1 -0
- package/radar/tooltip/radar-item-tooltip-presets.js +50 -0
- package/radar/tooltip/radar-item-tooltip.types.d.ts +28 -0
- package/radar/tooltip/radar-item-tooltip.types.d.ts.map +1 -0
- package/radar/tooltip/radar-item-tooltip.types.js +3 -0
- package/radar/tooltip/radar-item-tooltip.utils.d.ts +9 -0
- package/radar/tooltip/radar-item-tooltip.utils.d.ts.map +1 -0
- package/radar/tooltip/radar-item-tooltip.utils.js +77 -0
- package/radar/tooltip/use-radar-item-tooltip.d.ts +22 -0
- package/radar/tooltip/use-radar-item-tooltip.d.ts.map +1 -0
- package/radar/tooltip/use-radar-item-tooltip.js +43 -0
- package/radial/index.d.ts +1 -0
- package/radial/index.d.ts.map +1 -1
- package/radial/index.js +1 -0
- package/radial/radial-chart.d.ts.map +1 -1
- package/radial/radial-chart.js +42 -10
- package/radial/radial-chart.props.d.ts +14 -1
- package/radial/radial-chart.props.d.ts.map +1 -1
- package/radial/tooltip/default-radial-tooltip.d.ts +6 -0
- package/radial/tooltip/default-radial-tooltip.d.ts.map +1 -0
- package/radial/tooltip/default-radial-tooltip.js +52 -0
- package/radial/tooltip/index.d.ts +7 -0
- package/radial/tooltip/index.d.ts.map +1 -0
- package/radial/tooltip/index.js +4 -0
- package/radial/tooltip/radial-item-tooltip-presets.d.ts +5 -0
- package/radial/tooltip/radial-item-tooltip-presets.d.ts.map +1 -0
- package/radial/tooltip/radial-item-tooltip-presets.js +43 -0
- package/radial/tooltip/radial-item-tooltip.types.d.ts +23 -0
- package/radial/tooltip/radial-item-tooltip.types.d.ts.map +1 -0
- package/radial/tooltip/radial-item-tooltip.types.js +3 -0
- package/radial/tooltip/radial-item-tooltip.utils.d.ts +9 -0
- package/radial/tooltip/radial-item-tooltip.utils.d.ts.map +1 -0
- package/radial/tooltip/radial-item-tooltip.utils.js +122 -0
- package/radial/tooltip/use-radial-item-tooltip.d.ts +22 -0
- package/radial/tooltip/use-radial-item-tooltip.d.ts.map +1 -0
- package/radial/tooltip/use-radial-item-tooltip.js +43 -0
- package/scatter/index.d.ts +1 -0
- package/scatter/index.d.ts.map +1 -1
- package/scatter/index.js +1 -0
- package/scatter/scatter-chart.d.ts.map +1 -1
- package/scatter/scatter-chart.js +57 -20
- package/scatter/scatter-chart.props.d.ts +7 -1
- package/scatter/scatter-chart.props.d.ts.map +1 -1
- package/scatter/tooltip/default-scatter-tooltip.d.ts +8 -0
- package/scatter/tooltip/default-scatter-tooltip.d.ts.map +1 -0
- package/scatter/tooltip/default-scatter-tooltip.js +57 -0
- package/scatter/tooltip/index.d.ts +7 -0
- package/scatter/tooltip/index.d.ts.map +1 -0
- package/scatter/tooltip/index.js +4 -0
- package/scatter/tooltip/scatter-item-tooltip-presets.d.ts +5 -0
- package/scatter/tooltip/scatter-item-tooltip-presets.d.ts.map +1 -0
- package/scatter/tooltip/scatter-item-tooltip-presets.js +49 -0
- package/scatter/tooltip/scatter-item-tooltip.types.d.ts +22 -0
- package/scatter/tooltip/scatter-item-tooltip.types.d.ts.map +1 -0
- package/scatter/tooltip/scatter-item-tooltip.types.js +3 -0
- package/scatter/tooltip/scatter-item-tooltip.utils.d.ts +9 -0
- package/scatter/tooltip/scatter-item-tooltip.utils.d.ts.map +1 -0
- package/scatter/tooltip/scatter-item-tooltip.utils.js +83 -0
- package/scatter/tooltip/use-scatter-item-tooltip.d.ts +25 -0
- package/scatter/tooltip/use-scatter-item-tooltip.d.ts.map +1 -0
- package/scatter/tooltip/use-scatter-item-tooltip.js +46 -0
- package/tooltip/chart-pointer-tooltip-overlay.d.ts +11 -0
- package/tooltip/chart-pointer-tooltip-overlay.d.ts.map +1 -0
- package/tooltip/chart-pointer-tooltip-overlay.js +88 -0
- package/tooltip/chart-tooltip-preset-shells.d.ts +66 -0
- package/tooltip/chart-tooltip-preset-shells.d.ts.map +1 -0
- package/tooltip/chart-tooltip-preset-shells.js +409 -0
- package/tooltip/index.d.ts +7 -0
- package/tooltip/index.d.ts.map +1 -0
- package/tooltip/index.js +1 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
function resolveDataIndexInside(data, evt) {
|
|
2
|
+
if (typeof evt?.dataIndexInside === 'number' && !Number.isNaN(evt.dataIndexInside)) {
|
|
3
|
+
return evt.dataIndexInside;
|
|
4
|
+
}
|
|
5
|
+
if (typeof evt?.dataIndex === 'number' && !Number.isNaN(evt.dataIndex)) {
|
|
6
|
+
const mapped = typeof data?.indexOfRawIndex === 'function' ? data.indexOfRawIndex(evt.dataIndex) : evt.dataIndex;
|
|
7
|
+
if (typeof mapped === 'number' && !Number.isNaN(mapped))
|
|
8
|
+
return mapped;
|
|
9
|
+
}
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
function scatterItemPixel(chart, seriesModel, data, diInside) {
|
|
13
|
+
const layout = data.getItemLayout?.(diInside);
|
|
14
|
+
if (layout && Number.isFinite(layout.x) && Number.isFinite(layout.y)) {
|
|
15
|
+
const w = typeof layout.width === 'number' ? layout.width : 0;
|
|
16
|
+
const h = typeof layout.height === 'number' ? layout.height : 0;
|
|
17
|
+
return { x: layout.x + w / 2, y: layout.y + h / 2 };
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const dims = data.dimensions ?? [];
|
|
21
|
+
if (dims.length >= 2 && typeof chart.convertToPixel === 'function') {
|
|
22
|
+
const v0 = data.get(dims[0], diInside);
|
|
23
|
+
const v1 = data.get(dims[1], diInside);
|
|
24
|
+
const pt = chart.convertToPixel({ seriesIndex: seriesModel.seriesIndex }, [v0, v1]);
|
|
25
|
+
if (Array.isArray(pt) && pt.length >= 2 && Number.isFinite(pt[0]) && Number.isFinite(pt[1])) {
|
|
26
|
+
return { x: pt[0], y: pt[1] };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
/* ignore */
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build scatter/bubble tooltip params from an ECharts `showTip` action and chart instance.
|
|
37
|
+
* Ignores axis-style payloads (`dataByCoordSys`). Skips non-scatter series (e.g. regression line).
|
|
38
|
+
*/
|
|
39
|
+
export function scatterItemParamsFromShowTip(chart, evt, ctx, themeSeries) {
|
|
40
|
+
if (!chart || !evt)
|
|
41
|
+
return null;
|
|
42
|
+
if (Array.isArray(evt.dataByCoordSys) && evt.dataByCoordSys.length > 0)
|
|
43
|
+
return null;
|
|
44
|
+
const si = evt.seriesIndex;
|
|
45
|
+
if (typeof si !== 'number' || si < 0)
|
|
46
|
+
return null;
|
|
47
|
+
const seriesModel = chart.getModel?.().getSeriesByIndex?.(si);
|
|
48
|
+
const seriesKind = seriesModel?.subType ?? seriesModel?.get?.('type');
|
|
49
|
+
if (!seriesModel || seriesKind !== 'scatter')
|
|
50
|
+
return null;
|
|
51
|
+
const data = seriesModel.getData?.();
|
|
52
|
+
if (!data)
|
|
53
|
+
return null;
|
|
54
|
+
const diInside = resolveDataIndexInside(data, evt);
|
|
55
|
+
if (diInside == null || diInside < 0)
|
|
56
|
+
return null;
|
|
57
|
+
const pixel = scatterItemPixel(chart, seriesModel, data, diInside);
|
|
58
|
+
if (!pixel)
|
|
59
|
+
return null;
|
|
60
|
+
const s = ctx.normalizedSeries[si];
|
|
61
|
+
const row = s?.data?.[diInside];
|
|
62
|
+
if (!row || row.length < 2)
|
|
63
|
+
return null;
|
|
64
|
+
const x = Number(row[0]);
|
|
65
|
+
const y = Number(row[1]);
|
|
66
|
+
const z = row.length >= 3 ? Number(row[2]) : undefined;
|
|
67
|
+
if (!Number.isFinite(x) || !Number.isFinite(y))
|
|
68
|
+
return null;
|
|
69
|
+
const seriesName = s?.name != null && s.name !== '' ? String(s.name) : `Series ${si + 1}`;
|
|
70
|
+
const themeLen = Math.max(themeSeries.length, 1);
|
|
71
|
+
const color = themeSeries[si % themeLen]?.color;
|
|
72
|
+
return {
|
|
73
|
+
pointerX: pixel.x,
|
|
74
|
+
pointerY: pixel.y,
|
|
75
|
+
seriesIndex: si,
|
|
76
|
+
dataIndex: diInside,
|
|
77
|
+
seriesName,
|
|
78
|
+
x,
|
|
79
|
+
y,
|
|
80
|
+
...(Number.isFinite(z) ? { z } : {}),
|
|
81
|
+
...(typeof color === 'string' ? { color } : {}),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ScatterItemTooltipContext, ScatterItemTooltipParams } from './scatter-item-tooltip.types';
|
|
3
|
+
export interface UseScatterItemTooltipOptions {
|
|
4
|
+
active: boolean;
|
|
5
|
+
renderTooltip: (params: ScatterItemTooltipParams) => React.ReactNode;
|
|
6
|
+
contextRef: React.RefObject<ScatterItemTooltipContext>;
|
|
7
|
+
themeSeriesRef: React.RefObject<Array<{
|
|
8
|
+
color: string;
|
|
9
|
+
}>>;
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
}
|
|
13
|
+
export interface UseScatterItemTooltipResult {
|
|
14
|
+
attachScatterItemTooltipListeners: (chart: {
|
|
15
|
+
on: (ev: string, fn: (...args: any[]) => void) => void;
|
|
16
|
+
off: (ev: string, fn: (...args: any[]) => void) => void;
|
|
17
|
+
}) => () => void;
|
|
18
|
+
renderScatterTooltipOverlay: () => React.ReactNode;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Scatter/bubble item tooltip as React Native UI (`trigger: 'item'`).
|
|
22
|
+
* Listens to `showTip` / `hideTip` and maps with {@link scatterItemParamsFromShowTip}.
|
|
23
|
+
*/
|
|
24
|
+
export declare function useScatterItemTooltip(options: UseScatterItemTooltipOptions): UseScatterItemTooltipResult;
|
|
25
|
+
//# sourceMappingURL=use-scatter-item-tooltip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-scatter-item-tooltip.d.ts","sourceRoot":"","sources":["../../../../../components/chart/scatter/tooltip/use-scatter-item-tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,KAAK,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGxG,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;IACvD,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,iCAAiC,EAAE,CAAC,KAAK,EAAE;QACzC,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;QACvD,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;KACzD,KAAK,MAAM,IAAI,CAAC;IACjB,2BAA2B,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;CACpD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,2BAA2B,CAiDxG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { ChartPointerTooltipOverlay } from '../../tooltip/chart-pointer-tooltip-overlay';
|
|
3
|
+
import { scatterItemParamsFromShowTip } from './scatter-item-tooltip.utils';
|
|
4
|
+
/**
|
|
5
|
+
* Scatter/bubble item tooltip as React Native UI (`trigger: 'item'`).
|
|
6
|
+
* Listens to `showTip` / `hideTip` and maps with {@link scatterItemParamsFromShowTip}.
|
|
7
|
+
*/
|
|
8
|
+
export function useScatterItemTooltip(options) {
|
|
9
|
+
const { active, renderTooltip, contextRef, themeSeriesRef, width, height } = options;
|
|
10
|
+
const [params, setParams] = useState(null);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!active)
|
|
13
|
+
setParams(null);
|
|
14
|
+
}, [active]);
|
|
15
|
+
const attachScatterItemTooltipListeners = useCallback((chart) => {
|
|
16
|
+
if (!active)
|
|
17
|
+
return () => { };
|
|
18
|
+
const onShowTip = (evt) => {
|
|
19
|
+
const ctx = contextRef.current;
|
|
20
|
+
if (!ctx?.normalizedSeries?.length) {
|
|
21
|
+
setParams(null);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const next = scatterItemParamsFromShowTip(chart, evt, ctx, themeSeriesRef.current ?? []);
|
|
25
|
+
setParams(next);
|
|
26
|
+
};
|
|
27
|
+
const onHideTip = () => setParams(null);
|
|
28
|
+
chart.on('showTip', onShowTip);
|
|
29
|
+
chart.on('hideTip', onHideTip);
|
|
30
|
+
return () => {
|
|
31
|
+
chart.off('showTip', onShowTip);
|
|
32
|
+
chart.off('hideTip', onHideTip);
|
|
33
|
+
};
|
|
34
|
+
}, [active, contextRef, themeSeriesRef]);
|
|
35
|
+
const renderScatterTooltipOverlay = useCallback(() => {
|
|
36
|
+
if (!active || params == null)
|
|
37
|
+
return null;
|
|
38
|
+
return (<ChartPointerTooltipOverlay width={width} height={height} pointerX={params.pointerX} pointerY={params.pointerY}>
|
|
39
|
+
{renderTooltip(params)}
|
|
40
|
+
</ChartPointerTooltipOverlay>);
|
|
41
|
+
}, [active, renderTooltip, params, width, height]);
|
|
42
|
+
return {
|
|
43
|
+
attachScatterItemTooltipListeners,
|
|
44
|
+
renderScatterTooltipOverlay,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface ChartPointerTooltipOverlayProps {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
pointerX: number;
|
|
6
|
+
pointerY: number;
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
/** Positions tooltip UI near `(pointerX, pointerY)` in chart pixel space. */
|
|
10
|
+
export declare function ChartPointerTooltipOverlay({ width, height, pointerX, pointerY, children, }: ChartPointerTooltipOverlayProps): React.JSX.Element;
|
|
11
|
+
//# sourceMappingURL=chart-pointer-tooltip-overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-pointer-tooltip-overlay.d.ts","sourceRoot":"","sources":["../../../../components/chart/tooltip/chart-pointer-tooltip-overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4C,MAAM,OAAO,CAAC;AA0EjE,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,6EAA6E;AAC7E,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,EAAE,+BAA+B,qBAiDjC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import React, { useLayoutEffect, useRef, useState } from 'react';
|
|
2
|
+
import { StyleSheet, View } from 'react-native';
|
|
3
|
+
const TOOLTIP_EDGE_PAD = 4;
|
|
4
|
+
const TOOLTIP_GAP_H = 12;
|
|
5
|
+
const TOOLTIP_GAP_V = 8;
|
|
6
|
+
const TOOLTIP_FLIP_HYSTERESIS = 28;
|
|
7
|
+
function tooltipPositionSticky(pointerX, pointerY, chartW, chartH, tooltipW, tooltipH, placeLeftRef, placeAboveRef) {
|
|
8
|
+
let left = pointerX + TOOLTIP_GAP_H;
|
|
9
|
+
let top = pointerY + TOOLTIP_GAP_V;
|
|
10
|
+
if (tooltipW > 0) {
|
|
11
|
+
let useLeft = placeLeftRef.current;
|
|
12
|
+
if (!useLeft && pointerX + TOOLTIP_GAP_H + tooltipW > chartW - TOOLTIP_EDGE_PAD) {
|
|
13
|
+
useLeft = true;
|
|
14
|
+
placeLeftRef.current = true;
|
|
15
|
+
}
|
|
16
|
+
if (useLeft &&
|
|
17
|
+
pointerX + TOOLTIP_GAP_H + tooltipW <= chartW - TOOLTIP_EDGE_PAD - TOOLTIP_FLIP_HYSTERESIS &&
|
|
18
|
+
pointerX - TOOLTIP_GAP_H - tooltipW >= TOOLTIP_EDGE_PAD) {
|
|
19
|
+
useLeft = false;
|
|
20
|
+
placeLeftRef.current = false;
|
|
21
|
+
}
|
|
22
|
+
if (useLeft && pointerX - TOOLTIP_GAP_H - tooltipW < TOOLTIP_EDGE_PAD) {
|
|
23
|
+
useLeft = false;
|
|
24
|
+
placeLeftRef.current = false;
|
|
25
|
+
}
|
|
26
|
+
left = useLeft ? pointerX - TOOLTIP_GAP_H - tooltipW : pointerX + TOOLTIP_GAP_H;
|
|
27
|
+
const maxL = Math.max(TOOLTIP_EDGE_PAD, chartW - tooltipW - TOOLTIP_EDGE_PAD);
|
|
28
|
+
left = Math.min(Math.max(TOOLTIP_EDGE_PAD, left), maxL);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
left = Math.min(Math.max(TOOLTIP_EDGE_PAD, left), chartW - TOOLTIP_EDGE_PAD - 24);
|
|
32
|
+
}
|
|
33
|
+
if (tooltipH > 0) {
|
|
34
|
+
let useAbove = placeAboveRef.current;
|
|
35
|
+
if (!useAbove && pointerY + TOOLTIP_GAP_V + tooltipH > chartH - TOOLTIP_EDGE_PAD) {
|
|
36
|
+
useAbove = true;
|
|
37
|
+
placeAboveRef.current = true;
|
|
38
|
+
}
|
|
39
|
+
if (useAbove &&
|
|
40
|
+
pointerY + TOOLTIP_GAP_V + tooltipH <= chartH - TOOLTIP_EDGE_PAD - TOOLTIP_FLIP_HYSTERESIS &&
|
|
41
|
+
pointerY - TOOLTIP_GAP_V - tooltipH >= TOOLTIP_EDGE_PAD) {
|
|
42
|
+
useAbove = false;
|
|
43
|
+
placeAboveRef.current = false;
|
|
44
|
+
}
|
|
45
|
+
if (useAbove && pointerY - TOOLTIP_GAP_V - tooltipH < TOOLTIP_EDGE_PAD) {
|
|
46
|
+
useAbove = false;
|
|
47
|
+
placeAboveRef.current = false;
|
|
48
|
+
}
|
|
49
|
+
top = useAbove ? pointerY - TOOLTIP_GAP_V - tooltipH : pointerY + TOOLTIP_GAP_V;
|
|
50
|
+
const maxT = Math.max(TOOLTIP_EDGE_PAD, chartH - tooltipH - TOOLTIP_EDGE_PAD);
|
|
51
|
+
top = Math.min(Math.max(TOOLTIP_EDGE_PAD, top), maxT);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
top = Math.max(TOOLTIP_EDGE_PAD, top);
|
|
55
|
+
}
|
|
56
|
+
return { left, top };
|
|
57
|
+
}
|
|
58
|
+
/** Positions tooltip UI near `(pointerX, pointerY)` in chart pixel space. */
|
|
59
|
+
export function ChartPointerTooltipOverlay({ width, height, pointerX, pointerY, children, }) {
|
|
60
|
+
const [measured, setMeasured] = useState(null);
|
|
61
|
+
const placeLeftRef = useRef(false);
|
|
62
|
+
const placeAboveRef = useRef(false);
|
|
63
|
+
useLayoutEffect(() => {
|
|
64
|
+
setMeasured(null);
|
|
65
|
+
placeLeftRef.current = false;
|
|
66
|
+
placeAboveRef.current = false;
|
|
67
|
+
}, [width, height]);
|
|
68
|
+
const tw = measured?.w ?? 0;
|
|
69
|
+
const th = measured?.h ?? 0;
|
|
70
|
+
const { left, top } = tooltipPositionSticky(pointerX, pointerY, width, height, tw, th, placeLeftRef, placeAboveRef);
|
|
71
|
+
const maxBoxWidth = width - 2 * TOOLTIP_EDGE_PAD;
|
|
72
|
+
return (<View pointerEvents="box-none" style={[StyleSheet.absoluteFillObject, { alignItems: 'flex-start' }]}>
|
|
73
|
+
<View pointerEvents="none" onLayout={(e) => {
|
|
74
|
+
const { width: w, height: h } = e.nativeEvent.layout;
|
|
75
|
+
if (w <= 0 || h <= 0)
|
|
76
|
+
return;
|
|
77
|
+
setMeasured((prev) => (prev?.w === w && prev?.h === h ? prev : { w, h }));
|
|
78
|
+
}} style={{
|
|
79
|
+
position: 'absolute',
|
|
80
|
+
left,
|
|
81
|
+
top,
|
|
82
|
+
maxWidth: maxBoxWidth,
|
|
83
|
+
opacity: measured != null ? 1 : 0,
|
|
84
|
+
}} collapsable={false}>
|
|
85
|
+
{children}
|
|
86
|
+
</View>
|
|
87
|
+
</View>);
|
|
88
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/** White card + shadow (axis category + series, or item header + body). */
|
|
3
|
+
export declare function TooltipPresetCard({ minWidth, eyebrow, categoryTitle, header, seriesRows, keyValueRows, children, }: {
|
|
4
|
+
minWidth?: number;
|
|
5
|
+
eyebrow?: string;
|
|
6
|
+
categoryTitle?: string;
|
|
7
|
+
header?: {
|
|
8
|
+
swatchColor?: string;
|
|
9
|
+
title: string;
|
|
10
|
+
titleVariant?: 'muted' | 'emphasis';
|
|
11
|
+
marginBottom?: number;
|
|
12
|
+
};
|
|
13
|
+
seriesRows?: Array<{
|
|
14
|
+
key: string | number;
|
|
15
|
+
swatchColor: string;
|
|
16
|
+
label: string;
|
|
17
|
+
value: React.ReactNode;
|
|
18
|
+
}>;
|
|
19
|
+
/** Optional label/value rows on light background (e.g. radar). */
|
|
20
|
+
keyValueRows?: Array<{
|
|
21
|
+
key: string;
|
|
22
|
+
left: string;
|
|
23
|
+
right: React.ReactNode;
|
|
24
|
+
}>;
|
|
25
|
+
children?: React.ReactNode;
|
|
26
|
+
}): React.JSX.Element;
|
|
27
|
+
/** Pill chip on dark glass. */
|
|
28
|
+
export declare function TooltipPresetCompact({ emphasis, detail, wrap, }: {
|
|
29
|
+
emphasis: string;
|
|
30
|
+
detail: string;
|
|
31
|
+
wrap?: boolean;
|
|
32
|
+
}): React.JSX.Element;
|
|
33
|
+
/** KPI strip with optional footer metric rows. */
|
|
34
|
+
export declare function TooltipPresetKpi({ accentColor, minWidth, overline, metric, caption, footerRows, }: {
|
|
35
|
+
accentColor: string;
|
|
36
|
+
minWidth?: number;
|
|
37
|
+
overline: string;
|
|
38
|
+
metric: React.ReactNode;
|
|
39
|
+
caption?: string;
|
|
40
|
+
footerRows?: Array<{
|
|
41
|
+
key: string | number;
|
|
42
|
+
left: string;
|
|
43
|
+
right: React.ReactNode;
|
|
44
|
+
}>;
|
|
45
|
+
}): React.JSX.Element;
|
|
46
|
+
export type TooltipStripedRow = {
|
|
47
|
+
key: string;
|
|
48
|
+
right: string | number;
|
|
49
|
+
left?: React.ReactNode;
|
|
50
|
+
leftLabel?: string;
|
|
51
|
+
leftSwatchColor?: string;
|
|
52
|
+
};
|
|
53
|
+
/** Banded header + zebra rows. */
|
|
54
|
+
export declare function TooltipPresetStriped({ header, headerTitle, headerSwatch, rows, }: {
|
|
55
|
+
/** Custom header content; wins over `headerTitle` / `headerSwatch`. */
|
|
56
|
+
header?: React.ReactNode;
|
|
57
|
+
/** Bold title only (e.g. axis category). */
|
|
58
|
+
headerTitle?: string;
|
|
59
|
+
/** Small swatch + bold title (item tooltips). */
|
|
60
|
+
headerSwatch?: {
|
|
61
|
+
color: string;
|
|
62
|
+
title: string;
|
|
63
|
+
};
|
|
64
|
+
rows: TooltipStripedRow[];
|
|
65
|
+
}): React.JSX.Element;
|
|
66
|
+
//# sourceMappingURL=chart-tooltip-preset-shells.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-tooltip-preset-shells.d.ts","sourceRoot":"","sources":["../../../../components/chart/tooltip/chart-tooltip-preset-shells.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAoNvC,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,OAAO,EACP,aAAa,EACb,MAAM,EACN,UAAU,EACV,YAAY,EACZ,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;QACpC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;KACxB,CAAC,CAAC;IACH,kEAAkE;IAClE,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;IAC5E,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,qBA0CA;AAED,+BAA+B;AAC/B,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,MAAM,EACN,IAAW,GACZ,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,qBAUA;AAED,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,EAC/B,WAAW,EACX,QAAc,EACd,QAAQ,EACR,MAAM,EACN,OAAO,EACP,UAAU,GACX,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;CACpF,qBAyBA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,kCAAkC;AAClC,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,WAAW,EACX,YAAY,EACZ,IAAI,GACL,EAAE;IACD,uEAAuE;IACvE,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,IAAI,EAAE,iBAAiB,EAAE,CAAC;CAC3B,qBAwDA"}
|