-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathliquid.ts
105 lines (95 loc) · 2.06 KB
/
liquid.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import { deepMix, isNumber } from '@antv/util';
import { subObject } from '../utils/helper';
import { prettyNumber } from '../utils/number';
import { CompositeMarkComponent as CC } from '../runtime';
import { LiquidMark } from '../spec';
import { LiquidShape } from '../shape';
const DEFAULT_OPTIONS = {
axis: {
x: false,
y: false,
},
legend: false,
tooltip: false,
encode: {
x: 'type',
y: 'percent',
},
scale: {
y: {
domain: [0, 1],
},
},
style: {
shape: LiquidShape,
},
animate: {
enter: {
type: 'fadeIn',
},
},
};
const DEFAULT_TEXT_OPTIONS = {
type: 'text',
style: {
x: '50%',
y: '50%',
textAlign: 'center',
textBaseline: 'middle',
fontSize: 20,
fontWeight: 800,
fill: '#888',
},
animate: {
enter: {
type: 'fadeIn',
},
},
};
export type LiquidData =
| {
percent?: number;
}
| number;
export type LiquidOptions = Omit<LiquidMark, 'type'>;
export const Liquid: CC<LiquidOptions> = (options) => {
const { data = {}, style = {}, animate, ...resOptions } = options;
// Compatible with old data structures: { percent: number } and percent >= 0.
const percent = Math.max(0, isNumber(data) ? data : data?.percent);
const newData = [{ percent, type: 'liquid' }];
const contentStyle = {
...subObject(style, 'text'),
...subObject(style, 'content'),
};
const outline = subObject(style, 'outline');
const wave = subObject(style, 'wave');
const background = subObject(style, 'background');
return [
deepMix({}, DEFAULT_OPTIONS, {
type: 'interval',
data: newData,
style: {
liquidOptions: {
percent,
liquidShape: style?.shape,
},
styleOptions: {
...style,
outline,
wave,
background,
},
},
animate,
...resOptions,
}),
deepMix({}, DEFAULT_TEXT_OPTIONS, {
style: {
text: `${prettyNumber(percent * 100)} %`,
...contentStyle,
},
animate,
}),
];
};
Liquid.props = {};