@antv/gpt-vis 1.0.0 → 1.0.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/README.md +66 -1
- package/README.zh-CN.md +66 -1
- package/dist/cjs/types/index.d.ts +2 -1
- package/dist/cjs/util/animation.d.ts +2 -0
- package/dist/cjs/util/animation.js +38 -0
- package/dist/cjs/util/components.d.ts +15 -0
- package/dist/cjs/util/components.js +94 -0
- package/dist/cjs/util/crosshair-axis-labels.d.ts +9 -0
- package/dist/cjs/util/crosshair-axis-labels.js +304 -0
- package/dist/cjs/util/index.d.ts +6 -0
- package/dist/cjs/util/index.js +33 -0
- package/dist/cjs/util/interaction.d.ts +14 -0
- package/dist/cjs/util/interaction.js +89 -0
- package/dist/cjs/util/theme.d.ts +18 -24
- package/dist/cjs/util/theme.js +303 -120
- package/dist/cjs/util/tokens.d.ts +31 -0
- package/dist/cjs/util/tokens.js +98 -0
- package/dist/cjs/vis/area/index.d.ts +2 -2
- package/dist/cjs/vis/area/index.js +76 -31
- package/dist/cjs/vis/bar/index.d.ts +2 -2
- package/dist/cjs/vis/bar/index.js +22 -19
- package/dist/cjs/vis/boxplot/index.js +1 -4
- package/dist/cjs/vis/column/index.d.ts +2 -2
- package/dist/cjs/vis/column/index.js +28 -18
- package/dist/cjs/vis/dual-axes/index.d.ts +2 -2
- package/dist/cjs/vis/dual-axes/index.js +89 -34
- package/dist/cjs/vis/funnel/index.d.ts +4 -2
- package/dist/cjs/vis/funnel/index.js +171 -92
- package/dist/cjs/vis/histogram/index.js +1 -4
- package/dist/cjs/vis/line/index.d.ts +2 -2
- package/dist/cjs/vis/line/index.js +71 -31
- package/dist/cjs/vis/liquid/index.d.ts +2 -2
- package/dist/cjs/vis/liquid/index.js +41 -16
- package/dist/cjs/vis/pie/index.d.ts +2 -2
- package/dist/cjs/vis/pie/index.js +26 -16
- package/dist/cjs/vis/radar/index.d.ts +2 -2
- package/dist/cjs/vis/radar/index.js +21 -29
- package/dist/cjs/vis/sankey/index.js +1 -4
- package/dist/cjs/vis/scatter/index.d.ts +2 -2
- package/dist/cjs/vis/scatter/index.js +40 -17
- package/dist/cjs/vis/treemap/index.js +1 -4
- package/dist/cjs/vis/venn/index.js +1 -4
- package/dist/cjs/vis/violin/index.js +1 -1
- package/dist/cjs/vis/waterfall/index.js +1 -1
- package/dist/cjs/vis/word-cloud/index.d.ts +3 -2
- package/dist/cjs/vis/word-cloud/index.js +125 -10
- package/dist/esm/types/index.d.ts +2 -1
- package/dist/esm/util/animation.d.ts +2 -0
- package/dist/esm/util/animation.js +17 -0
- package/dist/esm/util/components.d.ts +15 -0
- package/dist/esm/util/components.js +67 -0
- package/dist/esm/util/crosshair-axis-labels.d.ts +9 -0
- package/dist/esm/util/crosshair-axis-labels.js +328 -0
- package/dist/esm/util/index.d.ts +6 -0
- package/dist/esm/util/index.js +6 -0
- package/dist/esm/util/interaction.d.ts +14 -0
- package/dist/esm/util/interaction.js +73 -0
- package/dist/esm/util/theme.d.ts +18 -24
- package/dist/esm/util/theme.js +302 -126
- package/dist/esm/util/tokens.d.ts +31 -0
- package/dist/esm/util/tokens.js +64 -0
- package/dist/esm/vis/area/index.d.ts +2 -2
- package/dist/esm/vis/area/index.js +91 -41
- package/dist/esm/vis/bar/index.d.ts +2 -2
- package/dist/esm/vis/bar/index.js +28 -29
- package/dist/esm/vis/boxplot/index.js +4 -5
- package/dist/esm/vis/column/index.d.ts +2 -2
- package/dist/esm/vis/column/index.js +36 -29
- package/dist/esm/vis/dual-axes/index.d.ts +2 -2
- package/dist/esm/vis/dual-axes/index.js +115 -42
- package/dist/esm/vis/funnel/index.d.ts +4 -2
- package/dist/esm/vis/funnel/index.js +156 -83
- package/dist/esm/vis/histogram/index.js +4 -5
- package/dist/esm/vis/line/index.d.ts +2 -2
- package/dist/esm/vis/line/index.js +80 -37
- package/dist/esm/vis/liquid/index.d.ts +2 -2
- package/dist/esm/vis/liquid/index.js +41 -14
- package/dist/esm/vis/pie/index.d.ts +2 -2
- package/dist/esm/vis/pie/index.js +36 -16
- package/dist/esm/vis/radar/index.d.ts +2 -2
- package/dist/esm/vis/radar/index.js +21 -34
- package/dist/esm/vis/sankey/index.js +4 -5
- package/dist/esm/vis/scatter/index.d.ts +2 -2
- package/dist/esm/vis/scatter/index.js +41 -25
- package/dist/esm/vis/treemap/index.js +4 -5
- package/dist/esm/vis/venn/index.js +4 -5
- package/dist/esm/vis/violin/index.js +5 -13
- package/dist/esm/vis/waterfall/index.js +5 -7
- package/dist/esm/vis/word-cloud/index.d.ts +3 -2
- package/dist/esm/vis/word-cloud/index.js +158 -10
- package/dist/umd/index.min.js +1 -1
- package/package.json +18 -15
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { VisualizationOptions } from '../../types';
|
|
1
|
+
import type { VisualizationOptions, VisualizationTheme } from '../../types';
|
|
2
2
|
/**
|
|
3
3
|
* WordCloudDataItem is the type for each data item in the word cloud chart.
|
|
4
4
|
*/
|
|
@@ -12,8 +12,9 @@ export type WordCloudDataItem = {
|
|
|
12
12
|
export interface WordCloudConfig {
|
|
13
13
|
type?: 'word-cloud';
|
|
14
14
|
data: WordCloudDataItem[];
|
|
15
|
-
theme?:
|
|
15
|
+
theme?: VisualizationTheme;
|
|
16
16
|
title?: string;
|
|
17
|
+
locale?: string;
|
|
17
18
|
style?: {
|
|
18
19
|
backgroundColor?: string;
|
|
19
20
|
palette?: string[];
|
|
@@ -23,17 +23,99 @@ __export(word_cloud_exports, {
|
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(word_cloud_exports);
|
|
25
25
|
var import_g2 = require("@antv/g2");
|
|
26
|
+
var import_components = require("../../util/components");
|
|
26
27
|
var import_theme = require("../../util/theme");
|
|
28
|
+
var WORD_CLOUD_MAX_WORDS = 50;
|
|
29
|
+
var WORD_CLOUD_FONT_FAMILY = "Impact";
|
|
30
|
+
var WORD_CLOUD_ROTATIONS = [-90, -60, -30, 0, 30, 60];
|
|
31
|
+
var WORD_CLOUD_LABELS = {
|
|
32
|
+
"en-US": {
|
|
33
|
+
rank: "Rank",
|
|
34
|
+
share: "Share of total weight",
|
|
35
|
+
weight: "Weight / frequency"
|
|
36
|
+
},
|
|
37
|
+
"zh-CN": {
|
|
38
|
+
rank: "排名",
|
|
39
|
+
share: "占总权重",
|
|
40
|
+
weight: "权重 / 词频"
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
var hashWordCloudData = (data) => {
|
|
44
|
+
let hash = 2166136261;
|
|
45
|
+
data.forEach(({ text, value }) => {
|
|
46
|
+
const input = `${text}\0${value}`;
|
|
47
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
48
|
+
hash ^= input.charCodeAt(index);
|
|
49
|
+
hash = Math.imul(hash, 16777619);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
return hash >>> 0;
|
|
53
|
+
};
|
|
54
|
+
var createSeededRandom = (seed) => {
|
|
55
|
+
let state = seed || 1;
|
|
56
|
+
return () => {
|
|
57
|
+
state += 1831565813;
|
|
58
|
+
let value = state;
|
|
59
|
+
value = Math.imul(value ^ value >>> 15, value | 1);
|
|
60
|
+
value ^= value + Math.imul(value ^ value >>> 7, value | 61);
|
|
61
|
+
return ((value ^ value >>> 14) >>> 0) / 4294967296;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
var getWordCloudPalette = (palette, theme) => (0, import_theme.normalizePalette)(palette, theme);
|
|
65
|
+
var prepareWordCloudData = (data, colors) => {
|
|
66
|
+
const rankedData = data.map((item, index) => ({ item, index })).filter(
|
|
67
|
+
({ item }) => item.text.trim().length > 0 && Number.isFinite(item.value) && item.value > 0
|
|
68
|
+
).sort((a, b) => b.item.value - a.item.value || a.index - b.index);
|
|
69
|
+
const totalWeight = rankedData.reduce((sum, { item }) => sum + item.value, 0);
|
|
70
|
+
const visibleData = rankedData.slice(0, WORD_CLOUD_MAX_WORDS);
|
|
71
|
+
const lastVisibleIndex = Math.max(1, visibleData.length - 1);
|
|
72
|
+
const colorByText = /* @__PURE__ */ new Map();
|
|
73
|
+
let nextColorIndex = 0;
|
|
74
|
+
return visibleData.map(({ item }, index) => {
|
|
75
|
+
const percentile = index / lastVisibleIndex;
|
|
76
|
+
const fontWeight = percentile <= 0.1 ? 700 : percentile <= 0.32 ? 600 : percentile <= 0.68 ? 500 : 400;
|
|
77
|
+
let wordColor = colorByText.get(item.text);
|
|
78
|
+
if (!wordColor) {
|
|
79
|
+
wordColor = colors[nextColorIndex % colors.length];
|
|
80
|
+
colorByText.set(item.text, wordColor);
|
|
81
|
+
nextColorIndex += 1;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
...item,
|
|
85
|
+
rank: index + 1,
|
|
86
|
+
share: totalWeight > 0 ? item.value / totalWeight : 0,
|
|
87
|
+
fontWeight,
|
|
88
|
+
wordColor
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
};
|
|
27
92
|
var WordCloud = (options) => {
|
|
28
|
-
const { container, width, height, theme: chartTheme = "default" } = options;
|
|
93
|
+
const { container, width, height, locale, theme: chartTheme = "default" } = options;
|
|
29
94
|
let chart = null;
|
|
30
95
|
const render = (config) => {
|
|
31
|
-
const {
|
|
96
|
+
const {
|
|
97
|
+
data = [],
|
|
98
|
+
theme = chartTheme,
|
|
99
|
+
title,
|
|
100
|
+
locale: renderLocale = locale,
|
|
101
|
+
style = {}
|
|
102
|
+
} = config;
|
|
103
|
+
const chartLocale = (0, import_components.resolveChartLocale)(renderLocale);
|
|
104
|
+
const labels = WORD_CLOUD_LABELS[chartLocale];
|
|
105
|
+
const valueFormatter = new Intl.NumberFormat(chartLocale, {
|
|
106
|
+
maximumFractionDigits: 2
|
|
107
|
+
});
|
|
108
|
+
const percentageFormatter = new Intl.NumberFormat(chartLocale, {
|
|
109
|
+
style: "percent",
|
|
110
|
+
maximumFractionDigits: 2
|
|
111
|
+
});
|
|
32
112
|
if (chart) {
|
|
33
113
|
chart.destroy();
|
|
34
114
|
}
|
|
35
|
-
const colors = (
|
|
36
|
-
const
|
|
115
|
+
const colors = getWordCloudPalette(style.palette, theme);
|
|
116
|
+
const preparedData = prepareWordCloudData(data, colors);
|
|
117
|
+
const layoutSeed = hashWordCloudData(preparedData);
|
|
118
|
+
const rotationRandom = createSeededRandom(layoutSeed ^ 2654435769);
|
|
37
119
|
chart = new import_g2.Chart({
|
|
38
120
|
container,
|
|
39
121
|
width,
|
|
@@ -43,31 +125,64 @@ var WordCloud = (options) => {
|
|
|
43
125
|
const chartOptions = {
|
|
44
126
|
animate: false,
|
|
45
127
|
type: "wordCloud",
|
|
46
|
-
data,
|
|
128
|
+
data: preparedData,
|
|
47
129
|
title: title ?? "",
|
|
48
130
|
layout: {
|
|
49
|
-
|
|
131
|
+
font: WORD_CLOUD_FONT_FAMILY,
|
|
132
|
+
fontSize: [11, 44],
|
|
133
|
+
fontWeight: (d) => d.fontWeight,
|
|
134
|
+
padding: 2,
|
|
135
|
+
random: createSeededRandom(layoutSeed),
|
|
136
|
+
rotate: () => WORD_CLOUD_ROTATIONS[Math.floor(rotationRandom() * WORD_CLOUD_ROTATIONS.length)]
|
|
50
137
|
},
|
|
51
138
|
encode: {
|
|
52
139
|
text: "text",
|
|
53
140
|
color: "text",
|
|
54
141
|
value: "value"
|
|
55
142
|
},
|
|
143
|
+
style: {
|
|
144
|
+
fill: (d) => d.wordColor,
|
|
145
|
+
fontFamily: WORD_CLOUD_FONT_FAMILY,
|
|
146
|
+
fontWeight: (d) => d.weight ?? d.fontWeight,
|
|
147
|
+
stroke: (d) => d.wordColor
|
|
148
|
+
},
|
|
56
149
|
scale: {
|
|
57
150
|
color: { range: colors }
|
|
58
151
|
},
|
|
59
152
|
legend: false,
|
|
153
|
+
state: {
|
|
154
|
+
active: {
|
|
155
|
+
fillOpacity: 1,
|
|
156
|
+
strokeOpacity: 1
|
|
157
|
+
},
|
|
158
|
+
inactive: {
|
|
159
|
+
fillOpacity: 0.3,
|
|
160
|
+
strokeOpacity: 0.3
|
|
161
|
+
}
|
|
162
|
+
},
|
|
60
163
|
tooltip: {
|
|
164
|
+
title: "text",
|
|
61
165
|
items: [
|
|
62
166
|
(d) => ({
|
|
63
|
-
name:
|
|
64
|
-
value: d.value
|
|
167
|
+
name: labels.weight,
|
|
168
|
+
value: valueFormatter.format(d.value)
|
|
169
|
+
}),
|
|
170
|
+
(d) => ({
|
|
171
|
+
name: labels.rank,
|
|
172
|
+
value: `#${d.rank}`
|
|
173
|
+
}),
|
|
174
|
+
(d) => ({
|
|
175
|
+
name: labels.share,
|
|
176
|
+
value: percentageFormatter.format(d.share)
|
|
65
177
|
})
|
|
66
178
|
]
|
|
67
179
|
},
|
|
68
|
-
|
|
69
|
-
|
|
180
|
+
interaction: {
|
|
181
|
+
tooltip: true,
|
|
182
|
+
elementHighlight: true,
|
|
183
|
+
elementHoverScale: true
|
|
70
184
|
},
|
|
185
|
+
viewStyle: style.backgroundColor ? { viewFill: style.backgroundColor } : void 0,
|
|
71
186
|
theme: (0, import_theme.getThemeObject)(theme)
|
|
72
187
|
};
|
|
73
188
|
chart.options(chartOptions);
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
* Common visualization options for all chart components.
|
|
3
3
|
* Defines the container and dimensions for rendering visualizations.
|
|
4
4
|
*/
|
|
5
|
+
export type VisualizationTheme = 'default' | 'light' | 'dark' | 'academy';
|
|
5
6
|
export interface VisualizationOptions {
|
|
6
7
|
container: string | HTMLElement;
|
|
7
8
|
width?: number;
|
|
8
9
|
height?: number;
|
|
9
|
-
theme?:
|
|
10
|
+
theme?: VisualizationTheme;
|
|
10
11
|
wrapper?: boolean;
|
|
11
12
|
locale?: string;
|
|
12
13
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
var prefersReducedMotion = function prefersReducedMotion() {
|
|
2
|
+
return typeof window !== 'undefined' && typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
3
|
+
};
|
|
4
|
+
export var getChartAnimation = function getChartAnimation(hasRendered, enterType) {
|
|
5
|
+
if (hasRendered || prefersReducedMotion()) return false;
|
|
6
|
+
return {
|
|
7
|
+
enter: enterType ? {
|
|
8
|
+
type: enterType
|
|
9
|
+
} : {},
|
|
10
|
+
update: {
|
|
11
|
+
type: null
|
|
12
|
+
},
|
|
13
|
+
exit: {
|
|
14
|
+
type: null
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type ChartLocale = 'en-US' | 'zh-CN';
|
|
2
|
+
export type CartesianXAxisOptions = {
|
|
3
|
+
xLabels?: unknown[];
|
|
4
|
+
chartWidth?: number;
|
|
5
|
+
};
|
|
6
|
+
export type CartesianAxisOptions = CartesianXAxisOptions & {
|
|
7
|
+
axisXTitle?: string | false;
|
|
8
|
+
axisYTitle?: string | false;
|
|
9
|
+
};
|
|
10
|
+
export declare const resolveChartLocale: (locale?: string) => ChartLocale;
|
|
11
|
+
export declare const getCartesianLayout: ({ xLabels, chartWidth, }: CartesianXAxisOptions) => Record<string, number>;
|
|
12
|
+
export declare const getCartesianAxis: ({ axisXTitle, axisYTitle, xLabels, chartWidth, }: CartesianAxisOptions) => Record<'x' | 'y', Record<string, unknown>>;
|
|
13
|
+
export declare const getColorLegend: (visible: boolean) => false | {
|
|
14
|
+
color: Record<string, never>;
|
|
15
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
+
var DEFAULT_CHART_WIDTH = 640;
|
|
8
|
+
var AXIS_HORIZONTAL_PADDING = 96;
|
|
9
|
+
var ANGLED_LABEL_MARGIN_RIGHT_MIN = 32;
|
|
10
|
+
var ANGLED_LABEL_MARGIN_RIGHT_MAX = 64;
|
|
11
|
+
var ANGLED_LABEL_EDGE_GAP = 8;
|
|
12
|
+
var estimateLabelWidth = function estimateLabelWidth(value) {
|
|
13
|
+
return Array.from(String(value !== null && value !== void 0 ? value : '')).reduce(function (width, character) {
|
|
14
|
+
var _character$codePointA;
|
|
15
|
+
return width + (((_character$codePointA = character.codePointAt(0)) !== null && _character$codePointA !== void 0 ? _character$codePointA : 0) > 0xff ? 12 : 7);
|
|
16
|
+
}, 0);
|
|
17
|
+
};
|
|
18
|
+
var shouldUseAngledXAxisLabels = function shouldUseAngledXAxisLabels(labels) {
|
|
19
|
+
var chartWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_CHART_WIDTH;
|
|
20
|
+
if (!(labels !== null && labels !== void 0 && labels.length)) return false;
|
|
21
|
+
var uniqueLabels = Array.from(new Set(labels.map(function (label) {
|
|
22
|
+
return String(label !== null && label !== void 0 ? label : '');
|
|
23
|
+
})));
|
|
24
|
+
if (uniqueLabels.length <= 1) return false;
|
|
25
|
+
var availableWidth = Math.max(chartWidth - AXIS_HORIZONTAL_PADDING, 240);
|
|
26
|
+
var estimatedWidth = uniqueLabels.reduce(function (total, label) {
|
|
27
|
+
return total + Math.max(28, estimateLabelWidth(label) + 16);
|
|
28
|
+
}, 0);
|
|
29
|
+
return estimatedWidth > availableWidth;
|
|
30
|
+
};
|
|
31
|
+
export var resolveChartLocale = function resolveChartLocale(locale) {
|
|
32
|
+
return locale !== null && locale !== void 0 && locale.toLowerCase().startsWith('zh') ? 'zh-CN' : 'en-US';
|
|
33
|
+
};
|
|
34
|
+
export var getCartesianLayout = function getCartesianLayout(_ref) {
|
|
35
|
+
var xLabels = _ref.xLabels,
|
|
36
|
+
chartWidth = _ref.chartWidth;
|
|
37
|
+
if (!shouldUseAngledXAxisLabels(xLabels, chartWidth)) return {};
|
|
38
|
+
var tailLabel = xLabels === null || xLabels === void 0 ? void 0 : xLabels[xLabels.length - 1];
|
|
39
|
+
var labelWidth = estimateLabelWidth(tailLabel);
|
|
40
|
+
var projectedHalfWidth = (labelWidth + 12) * Math.SQRT1_2 / 2;
|
|
41
|
+
return {
|
|
42
|
+
marginRight: Math.min(ANGLED_LABEL_MARGIN_RIGHT_MAX, Math.max(ANGLED_LABEL_MARGIN_RIGHT_MIN, Math.ceil(projectedHalfWidth + ANGLED_LABEL_EDGE_GAP)))
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export var getCartesianAxis = function getCartesianAxis(_ref2) {
|
|
46
|
+
var axisXTitle = _ref2.axisXTitle,
|
|
47
|
+
axisYTitle = _ref2.axisYTitle,
|
|
48
|
+
xLabels = _ref2.xLabels,
|
|
49
|
+
chartWidth = _ref2.chartWidth;
|
|
50
|
+
var useAngledXAxisLabels = shouldUseAngledXAxisLabels(xLabels, chartWidth);
|
|
51
|
+
return {
|
|
52
|
+
x: _objectSpread({
|
|
53
|
+
title: axisXTitle || false
|
|
54
|
+
}, useAngledXAxisLabels ? {
|
|
55
|
+
labelTransform: 'rotate(45)',
|
|
56
|
+
labelAutoRotate: false
|
|
57
|
+
} : {}),
|
|
58
|
+
y: {
|
|
59
|
+
title: axisYTitle || false
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
export var getColorLegend = function getColorLegend(visible) {
|
|
64
|
+
return visible ? {
|
|
65
|
+
color: {}
|
|
66
|
+
} : false;
|
|
67
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Chart } from '@antv/g2';
|
|
2
|
+
import type { VisualizationTheme } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Bridges G2 tooltip crosshairs to axis value tags.
|
|
5
|
+
*
|
|
6
|
+
* G2 does not currently expose axis tags for tooltip crosshairs, so this adapter
|
|
7
|
+
* reads the rule geometry created by G2 5.4 and renders labels with LineCrosshair.
|
|
8
|
+
*/
|
|
9
|
+
export declare const bindCrosshairAxisLabels: (chart: Chart, theme: VisualizationTheme) => (() => void);
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
8
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
9
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
10
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
11
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
12
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
13
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
14
|
+
import { LineCrosshair } from '@antv/component';
|
|
15
|
+
import { selectPlotArea } from '@antv/g2';
|
|
16
|
+
import { CHART_FONT_FAMILY, getChartVisualTokens } from "./tokens";
|
|
17
|
+
var formatCrosshairAxisValue = function formatCrosshairAxisValue(value, formatter, precision) {
|
|
18
|
+
if (value === undefined || value === null || value === '') return '';
|
|
19
|
+
try {
|
|
20
|
+
var formatted = formatter === null || formatter === void 0 ? void 0 : formatter(value);
|
|
21
|
+
if (formatted !== undefined && formatted !== null) return String(formatted);
|
|
22
|
+
} catch (_unused) {
|
|
23
|
+
// Fall back to the original value when a scale formatter rejects it.
|
|
24
|
+
}
|
|
25
|
+
if (value instanceof Date) return value.toLocaleString();
|
|
26
|
+
if (typeof value === 'number' && Number.isFinite(value) && precision !== undefined) {
|
|
27
|
+
return value.toFixed(precision);
|
|
28
|
+
}
|
|
29
|
+
return String(value);
|
|
30
|
+
};
|
|
31
|
+
var getNumberPrecision = function getNumberPrecision(value) {
|
|
32
|
+
var _coefficient$split$;
|
|
33
|
+
if (!Number.isFinite(value) || value === 0) return 0;
|
|
34
|
+
var _Math$abs$toExponenti = Math.abs(value).toExponential().split('e'),
|
|
35
|
+
_Math$abs$toExponenti2 = _slicedToArray(_Math$abs$toExponenti, 2),
|
|
36
|
+
coefficient = _Math$abs$toExponenti2[0],
|
|
37
|
+
_Math$abs$toExponenti3 = _Math$abs$toExponenti2[1],
|
|
38
|
+
exponentText = _Math$abs$toExponenti3 === void 0 ? '0' : _Math$abs$toExponenti3;
|
|
39
|
+
var coefficientPrecision = ((_coefficient$split$ = coefficient.split('.')[1]) === null || _coefficient$split$ === void 0 ? void 0 : _coefficient$split$.length) || 0;
|
|
40
|
+
return Math.max(0, coefficientPrecision - Number(exponentText));
|
|
41
|
+
};
|
|
42
|
+
var getCrosshairScalePrecision = function getCrosshairScalePrecision(scale) {
|
|
43
|
+
var _scale$getTicks;
|
|
44
|
+
var ticks = scale === null || scale === void 0 || (_scale$getTicks = scale.getTicks) === null || _scale$getTicks === void 0 ? void 0 : _scale$getTicks.call(scale);
|
|
45
|
+
if (!Array.isArray(ticks) || ticks.length < 2) return undefined;
|
|
46
|
+
var interval = Number.POSITIVE_INFINITY;
|
|
47
|
+
for (var index = 1; index < ticks.length; index += 1) {
|
|
48
|
+
var current = Number(ticks[index]);
|
|
49
|
+
var previous = Number(ticks[index - 1]);
|
|
50
|
+
var difference = Math.abs(current - previous);
|
|
51
|
+
if (Number.isFinite(difference) && difference > 0) interval = Math.min(interval, difference);
|
|
52
|
+
}
|
|
53
|
+
if (!Number.isFinite(interval)) return undefined;
|
|
54
|
+
return Math.min(getNumberPrecision(interval) + 2, 20);
|
|
55
|
+
};
|
|
56
|
+
var getCrosshairTagStyle = function getCrosshairTagStyle(theme, tokens) {
|
|
57
|
+
return {
|
|
58
|
+
lineLineWidth: 0,
|
|
59
|
+
lineStrokeOpacity: 0,
|
|
60
|
+
linePointerEvents: 'none',
|
|
61
|
+
tagPadding: [4, 7],
|
|
62
|
+
tagRadius: 6,
|
|
63
|
+
tagBackgroundFill: tokens.textPrimary,
|
|
64
|
+
tagBackgroundStroke: 'transparent',
|
|
65
|
+
tagBackgroundLineWidth: 0,
|
|
66
|
+
tagBackgroundShadowColor: theme === 'dark' ? 'rgba(0, 0, 0, 0.38)' : 'rgba(15, 23, 42, 0.18)',
|
|
67
|
+
tagBackgroundShadowBlur: 8,
|
|
68
|
+
tagBackgroundShadowOffsetY: 2,
|
|
69
|
+
tagLabelFill: tokens.background,
|
|
70
|
+
tagLabelFillOpacity: 1,
|
|
71
|
+
tagLabelFontFamily: CHART_FONT_FAMILY,
|
|
72
|
+
tagLabelFontSize: 11,
|
|
73
|
+
tagLabelFontWeight: 500,
|
|
74
|
+
tagLabelLineWidth: 0,
|
|
75
|
+
tagPointerEvents: 'none'
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
var clamp = function clamp(value, min, max) {
|
|
79
|
+
return Math.min(Math.max(value, Math.min(min, max)), Math.max(min, max));
|
|
80
|
+
};
|
|
81
|
+
var invertCrosshairValue = function invertCrosshairValue(scale, value) {
|
|
82
|
+
if (!scale || typeof scale.invert !== 'function' || value === undefined) return undefined;
|
|
83
|
+
if (typeof scale.getBandWidth === 'function') {
|
|
84
|
+
var _scale$getOptions;
|
|
85
|
+
var domain = (_scale$getOptions = scale.getOptions) === null || _scale$getOptions === void 0 || (_scale$getOptions = _scale$getOptions.call(scale)) === null || _scale$getOptions === void 0 ? void 0 : _scale$getOptions.domain;
|
|
86
|
+
if (!Array.isArray(domain) || domain.length === 0 || !Number.isFinite(Number(value))) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
var nearestValue = domain[0];
|
|
90
|
+
var nearestDistance = Number.POSITIVE_INFINITY;
|
|
91
|
+
var _iterator = _createForOfIteratorHelper(domain),
|
|
92
|
+
_step;
|
|
93
|
+
try {
|
|
94
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
95
|
+
var _scale$map;
|
|
96
|
+
var domainValue = _step.value;
|
|
97
|
+
var start = Number((_scale$map = scale.map) === null || _scale$map === void 0 ? void 0 : _scale$map.call(scale, domainValue));
|
|
98
|
+
var bandWidth = Number(scale.getBandWidth(domainValue)) || 0;
|
|
99
|
+
var distance = Math.abs(start + bandWidth / 2 - Number(value));
|
|
100
|
+
if (Number.isFinite(distance) && distance < nearestDistance) {
|
|
101
|
+
nearestValue = domainValue;
|
|
102
|
+
nearestDistance = distance;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
} catch (err) {
|
|
106
|
+
_iterator.e(err);
|
|
107
|
+
} finally {
|
|
108
|
+
_iterator.f();
|
|
109
|
+
}
|
|
110
|
+
return nearestValue;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
return scale.invert(value);
|
|
114
|
+
} catch (_unused2) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
var getTooltipPlot = function getTooltipPlot(context) {
|
|
119
|
+
var _context$canvas;
|
|
120
|
+
var root = (_context$canvas = context.canvas) === null || _context$canvas === void 0 ? void 0 : _context$canvas.getRoot();
|
|
121
|
+
if (!root) return undefined;
|
|
122
|
+
|
|
123
|
+
// G2 5.4 stores tooltip rules on the plot display object. Keep that version-specific
|
|
124
|
+
// detail isolated here while using the public plot selector for discovery.
|
|
125
|
+
return selectPlotArea(root);
|
|
126
|
+
};
|
|
127
|
+
var getCartesianView = function getCartesianView(context) {
|
|
128
|
+
var _context$views;
|
|
129
|
+
return (_context$views = context.views) === null || _context$views === void 0 ? void 0 : _context$views.find(function (_ref) {
|
|
130
|
+
var coordinate = _ref.coordinate,
|
|
131
|
+
scale = _ref.scale;
|
|
132
|
+
return Boolean((scale === null || scale === void 0 ? void 0 : scale.x) && (scale === null || scale === void 0 ? void 0 : scale.y)) && typeof (coordinate === null || coordinate === void 0 ? void 0 : coordinate.invert) === 'function';
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
var getRuleLine = function getRuleLine(rule) {
|
|
136
|
+
var _rule$style, _rule$style2, _rule$style3, _rule$style4;
|
|
137
|
+
var x1 = Number(rule === null || rule === void 0 || (_rule$style = rule.style) === null || _rule$style === void 0 ? void 0 : _rule$style.x1);
|
|
138
|
+
var x2 = Number(rule === null || rule === void 0 || (_rule$style2 = rule.style) === null || _rule$style2 === void 0 ? void 0 : _rule$style2.x2);
|
|
139
|
+
var y1 = Number(rule === null || rule === void 0 || (_rule$style3 = rule.style) === null || _rule$style3 === void 0 ? void 0 : _rule$style3.y1);
|
|
140
|
+
var y2 = Number(rule === null || rule === void 0 || (_rule$style4 = rule.style) === null || _rule$style4 === void 0 ? void 0 : _rule$style4.y2);
|
|
141
|
+
if (![x1, x2, y1, y2].every(Number.isFinite)) return undefined;
|
|
142
|
+
return {
|
|
143
|
+
x1: x1,
|
|
144
|
+
x2: x2,
|
|
145
|
+
y1: y1,
|
|
146
|
+
y2: y2
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
var getPlotOffset = function getPlotOffset(plot) {
|
|
150
|
+
var _plot$getLocalPositio;
|
|
151
|
+
var _ref2 = ((_plot$getLocalPositio = plot.getLocalPosition) === null || _plot$getLocalPositio === void 0 ? void 0 : _plot$getLocalPositio.call(plot)) || [],
|
|
152
|
+
_ref3 = _slicedToArray(_ref2, 2),
|
|
153
|
+
_ref3$ = _ref3[0],
|
|
154
|
+
x = _ref3$ === void 0 ? 0 : _ref3$,
|
|
155
|
+
_ref3$2 = _ref3[1],
|
|
156
|
+
y = _ref3$2 === void 0 ? 0 : _ref3$2;
|
|
157
|
+
return [Number.isFinite(Number(x)) ? Number(x) : 0, Number.isFinite(Number(y)) ? Number(y) : 0];
|
|
158
|
+
};
|
|
159
|
+
var invertCoordinate = function invertCoordinate(view, point) {
|
|
160
|
+
try {
|
|
161
|
+
var inverted = view.coordinate.invert(point);
|
|
162
|
+
if (!Array.isArray(inverted) || inverted.length < 2) return undefined;
|
|
163
|
+
var x = Number(inverted[0]);
|
|
164
|
+
var y = Number(inverted[1]);
|
|
165
|
+
return Number.isFinite(x) && Number.isFinite(y) ? [x, y] : undefined;
|
|
166
|
+
} catch (_unused3) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Bridges G2 tooltip crosshairs to axis value tags.
|
|
173
|
+
*
|
|
174
|
+
* G2 does not currently expose axis tags for tooltip crosshairs, so this adapter
|
|
175
|
+
* reads the rule geometry created by G2 5.4 and renders labels with LineCrosshair.
|
|
176
|
+
*/
|
|
177
|
+
export var bindCrosshairAxisLabels = function bindCrosshairAxisLabels(chart, theme) {
|
|
178
|
+
if (!chart || typeof chart.on !== 'function') return function () {
|
|
179
|
+
return undefined;
|
|
180
|
+
};
|
|
181
|
+
var tagStyle = getCrosshairTagStyle(theme, getChartVisualTokens(theme));
|
|
182
|
+
var boundPlot = null;
|
|
183
|
+
var xCrosshair = null;
|
|
184
|
+
var yCrosshair = null;
|
|
185
|
+
var latestPointerY = null;
|
|
186
|
+
var latestXValue;
|
|
187
|
+
var destroyCrosshairs = function destroyCrosshairs() {
|
|
188
|
+
var _xCrosshair, _yCrosshair;
|
|
189
|
+
(_xCrosshair = xCrosshair) === null || _xCrosshair === void 0 || _xCrosshair.destroy();
|
|
190
|
+
(_yCrosshair = yCrosshair) === null || _yCrosshair === void 0 || _yCrosshair.destroy();
|
|
191
|
+
xCrosshair = null;
|
|
192
|
+
yCrosshair = null;
|
|
193
|
+
boundPlot = null;
|
|
194
|
+
};
|
|
195
|
+
var hideCrosshairs = function hideCrosshairs() {
|
|
196
|
+
for (var _i = 0, _arr = [xCrosshair, yCrosshair]; _i < _arr.length; _i++) {
|
|
197
|
+
var crosshair = _arr[_i];
|
|
198
|
+
if (crosshair) crosshair.style.visibility = 'hidden';
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
var resetCrosshairs = function resetCrosshairs() {
|
|
202
|
+
latestPointerY = null;
|
|
203
|
+
latestXValue = undefined;
|
|
204
|
+
hideCrosshairs();
|
|
205
|
+
};
|
|
206
|
+
var ensureCrosshairs = function ensureCrosshairs(plot, xLine, yLine, xText, yText) {
|
|
207
|
+
if (boundPlot !== plot) destroyCrosshairs();
|
|
208
|
+
if (xCrosshair && yCrosshair) return;
|
|
209
|
+
var layer = plot.parentNode || plot;
|
|
210
|
+
var _getPlotOffset = getPlotOffset(plot),
|
|
211
|
+
_getPlotOffset2 = _slicedToArray(_getPlotOffset, 2),
|
|
212
|
+
plotX = _getPlotOffset2[0],
|
|
213
|
+
plotY = _getPlotOffset2[1];
|
|
214
|
+
var xStart = [xLine.x1 + plotX, xLine.y1 + plotY];
|
|
215
|
+
var xEnd = [xLine.x2 + plotX, xLine.y2 + plotY];
|
|
216
|
+
var yStart = [yLine.x1 + plotX, yLine.y1 + plotY];
|
|
217
|
+
var yEnd = [yLine.x2 + plotX, yLine.y2 + plotY];
|
|
218
|
+
if (!xCrosshair) {
|
|
219
|
+
xCrosshair = new LineCrosshair({
|
|
220
|
+
style: _objectSpread(_objectSpread({}, tagStyle), {}, {
|
|
221
|
+
startPos: xStart,
|
|
222
|
+
endPos: xEnd,
|
|
223
|
+
tagText: xText,
|
|
224
|
+
tagPosition: 'end'
|
|
225
|
+
})
|
|
226
|
+
});
|
|
227
|
+
xCrosshair.style.zIndex = 7;
|
|
228
|
+
xCrosshair.style.pointerEvents = 'none';
|
|
229
|
+
layer.appendChild(xCrosshair);
|
|
230
|
+
}
|
|
231
|
+
if (!yCrosshair) {
|
|
232
|
+
yCrosshair = new LineCrosshair({
|
|
233
|
+
style: _objectSpread(_objectSpread({}, tagStyle), {}, {
|
|
234
|
+
startPos: yStart,
|
|
235
|
+
endPos: yEnd,
|
|
236
|
+
tagText: yText,
|
|
237
|
+
tagPosition: 'start'
|
|
238
|
+
})
|
|
239
|
+
});
|
|
240
|
+
yCrosshair.style.zIndex = 7;
|
|
241
|
+
yCrosshair.style.pointerEvents = 'none';
|
|
242
|
+
layer.appendChild(yCrosshair);
|
|
243
|
+
}
|
|
244
|
+
boundPlot = plot;
|
|
245
|
+
};
|
|
246
|
+
var updateCrosshairs = function updateCrosshairs(event) {
|
|
247
|
+
var _event$offsetY, _latestXValue, _invertCrosshairValue, _event$data, _view$scale$x$getForm, _view$scale$x, _view$scale$y$getForm, _view$scale$y, _plot$ruleY, _plot$ruleX;
|
|
248
|
+
var context = chart.getContext();
|
|
249
|
+
var plot = getTooltipPlot(context);
|
|
250
|
+
var view = getCartesianView(context);
|
|
251
|
+
if (!plot || !view) {
|
|
252
|
+
hideCrosshairs();
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
var verticalRule = getRuleLine(plot.ruleY);
|
|
256
|
+
var horizontalRule = getRuleLine(plot.ruleX);
|
|
257
|
+
if (!verticalRule || !horizontalRule) {
|
|
258
|
+
hideCrosshairs();
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
var _getPlotOffset3 = getPlotOffset(plot),
|
|
262
|
+
_getPlotOffset4 = _slicedToArray(_getPlotOffset3, 2),
|
|
263
|
+
plotX = _getPlotOffset4[0],
|
|
264
|
+
plotY = _getPlotOffset4[1];
|
|
265
|
+
var eventY = Number((_event$offsetY = event.offsetY) !== null && _event$offsetY !== void 0 ? _event$offsetY : event.canvasY);
|
|
266
|
+
var globalY = Number.isFinite(eventY) ? eventY : latestPointerY;
|
|
267
|
+
var pointerY = Number.isFinite(globalY) ? Number(globalY) - plotY : horizontalRule.y1;
|
|
268
|
+
var x = clamp(verticalRule.x1, horizontalRule.x1, horizontalRule.x2);
|
|
269
|
+
var y = clamp(pointerY, verticalRule.y1, verticalRule.y2);
|
|
270
|
+
var invertedPosition = invertCoordinate(view, [x, y]);
|
|
271
|
+
var xValue = (_latestXValue = latestXValue) !== null && _latestXValue !== void 0 ? _latestXValue : invertCrosshairValue(view.scale.x, invertedPosition === null || invertedPosition === void 0 ? void 0 : invertedPosition[0]);
|
|
272
|
+
var yValue = (_invertCrosshairValue = invertCrosshairValue(view.scale.y, invertedPosition === null || invertedPosition === void 0 ? void 0 : invertedPosition[1])) !== null && _invertCrosshairValue !== void 0 ? _invertCrosshairValue : (_event$data = event.data) === null || _event$data === void 0 || (_event$data = _event$data.items) === null || _event$data === void 0 || (_event$data = _event$data[0]) === null || _event$data === void 0 ? void 0 : _event$data.value;
|
|
273
|
+
var xText = formatCrosshairAxisValue(xValue, (_view$scale$x$getForm = (_view$scale$x = view.scale.x).getFormatter) === null || _view$scale$x$getForm === void 0 ? void 0 : _view$scale$x$getForm.call(_view$scale$x));
|
|
274
|
+
var yText = formatCrosshairAxisValue(yValue, (_view$scale$y$getForm = (_view$scale$y = view.scale.y).getFormatter) === null || _view$scale$y$getForm === void 0 ? void 0 : _view$scale$y$getForm.call(_view$scale$y), getCrosshairScalePrecision(view.scale.y));
|
|
275
|
+
if (!xText || !yText) {
|
|
276
|
+
hideCrosshairs();
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if ((_plot$ruleY = plot.ruleY) !== null && _plot$ruleY !== void 0 && _plot$ruleY.style) {
|
|
280
|
+
plot.ruleY.style.x1 = x;
|
|
281
|
+
plot.ruleY.style.x2 = x;
|
|
282
|
+
}
|
|
283
|
+
if ((_plot$ruleX = plot.ruleX) !== null && _plot$ruleX !== void 0 && _plot$ruleX.style) {
|
|
284
|
+
plot.ruleX.style.y1 = y;
|
|
285
|
+
plot.ruleX.style.y2 = y;
|
|
286
|
+
}
|
|
287
|
+
var displayVerticalRule = _objectSpread(_objectSpread({}, verticalRule), {}, {
|
|
288
|
+
x1: x,
|
|
289
|
+
x2: x
|
|
290
|
+
});
|
|
291
|
+
var displayHorizontalRule = _objectSpread(_objectSpread({}, horizontalRule), {}, {
|
|
292
|
+
y1: y,
|
|
293
|
+
y2: y
|
|
294
|
+
});
|
|
295
|
+
ensureCrosshairs(plot, displayVerticalRule, displayHorizontalRule, xText, yText);
|
|
296
|
+
if (!xCrosshair || !yCrosshair) return;
|
|
297
|
+
xCrosshair.setText(xText);
|
|
298
|
+
xCrosshair.setPointer([x + plotX, verticalRule.y2 + plotY]);
|
|
299
|
+
xCrosshair.style.visibility = 'visible';
|
|
300
|
+
yCrosshair.setText(yText);
|
|
301
|
+
yCrosshair.setPointer([horizontalRule.x1 + plotX, y + plotY]);
|
|
302
|
+
yCrosshair.style.visibility = 'visible';
|
|
303
|
+
};
|
|
304
|
+
var onPointerMove = function onPointerMove(event) {
|
|
305
|
+
var _event$offsetY2;
|
|
306
|
+
var y = Number((_event$offsetY2 = event.offsetY) !== null && _event$offsetY2 !== void 0 ? _event$offsetY2 : event.canvasY);
|
|
307
|
+
if (Number.isFinite(y)) latestPointerY = y;
|
|
308
|
+
updateCrosshairs(event);
|
|
309
|
+
};
|
|
310
|
+
var onTooltipShow = function onTooltipShow(event) {
|
|
311
|
+
var _event$data2;
|
|
312
|
+
if (!event.nativeEvent) return;
|
|
313
|
+
if (((_event$data2 = event.data) === null || _event$data2 === void 0 || (_event$data2 = _event$data2.data) === null || _event$data2 === void 0 ? void 0 : _event$data2.x) !== undefined) latestXValue = event.data.data.x;
|
|
314
|
+
updateCrosshairs(event);
|
|
315
|
+
};
|
|
316
|
+
chart.on('tooltip:show', onTooltipShow);
|
|
317
|
+
chart.on('tooltip:hide', resetCrosshairs);
|
|
318
|
+
chart.on('plot:pointermove', onPointerMove);
|
|
319
|
+
chart.on('plot:pointerleave', resetCrosshairs);
|
|
320
|
+
return function () {
|
|
321
|
+
var _chart$off, _chart$off2, _chart$off3, _chart$off4;
|
|
322
|
+
(_chart$off = chart.off) === null || _chart$off === void 0 || _chart$off.call(chart, 'tooltip:show', onTooltipShow);
|
|
323
|
+
(_chart$off2 = chart.off) === null || _chart$off2 === void 0 || _chart$off2.call(chart, 'tooltip:hide', resetCrosshairs);
|
|
324
|
+
(_chart$off3 = chart.off) === null || _chart$off3 === void 0 || _chart$off3.call(chart, 'plot:pointermove', onPointerMove);
|
|
325
|
+
(_chart$off4 = chart.off) === null || _chart$off4 === void 0 || _chart$off4.call(chart, 'plot:pointerleave', resetCrosshairs);
|
|
326
|
+
destroyCrosshairs();
|
|
327
|
+
};
|
|
328
|
+
};
|