mviz 1.4.2
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 +174 -0
- package/dist/charts/area.d.ts +14 -0
- package/dist/charts/area.d.ts.map +1 -0
- package/dist/charts/area.js +137 -0
- package/dist/charts/area.js.map +1 -0
- package/dist/charts/bar.d.ts +14 -0
- package/dist/charts/bar.d.ts.map +1 -0
- package/dist/charts/bar.js +191 -0
- package/dist/charts/bar.js.map +1 -0
- package/dist/charts/boxplot.d.ts +14 -0
- package/dist/charts/boxplot.d.ts.map +1 -0
- package/dist/charts/boxplot.js +79 -0
- package/dist/charts/boxplot.js.map +1 -0
- package/dist/charts/bubble.d.ts +14 -0
- package/dist/charts/bubble.d.ts.map +1 -0
- package/dist/charts/bubble.js +127 -0
- package/dist/charts/bubble.js.map +1 -0
- package/dist/charts/calendar.d.ts +14 -0
- package/dist/charts/calendar.d.ts.map +1 -0
- package/dist/charts/calendar.js +94 -0
- package/dist/charts/calendar.js.map +1 -0
- package/dist/charts/combo.d.ts +14 -0
- package/dist/charts/combo.d.ts.map +1 -0
- package/dist/charts/combo.js +163 -0
- package/dist/charts/combo.js.map +1 -0
- package/dist/charts/dumbbell.d.ts +17 -0
- package/dist/charts/dumbbell.d.ts.map +1 -0
- package/dist/charts/dumbbell.js +368 -0
- package/dist/charts/dumbbell.js.map +1 -0
- package/dist/charts/funnel.d.ts +14 -0
- package/dist/charts/funnel.d.ts.map +1 -0
- package/dist/charts/funnel.js +145 -0
- package/dist/charts/funnel.js.map +1 -0
- package/dist/charts/heatmap.d.ts +14 -0
- package/dist/charts/heatmap.d.ts.map +1 -0
- package/dist/charts/heatmap.js +202 -0
- package/dist/charts/heatmap.js.map +1 -0
- package/dist/charts/histogram.d.ts +14 -0
- package/dist/charts/histogram.d.ts.map +1 -0
- package/dist/charts/histogram.js +103 -0
- package/dist/charts/histogram.js.map +1 -0
- package/dist/charts/index.d.ts +40 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +42 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/line.d.ts +14 -0
- package/dist/charts/line.d.ts.map +1 -0
- package/dist/charts/line.js +134 -0
- package/dist/charts/line.js.map +1 -0
- package/dist/charts/pie.d.ts +14 -0
- package/dist/charts/pie.d.ts.map +1 -0
- package/dist/charts/pie.js +75 -0
- package/dist/charts/pie.js.map +1 -0
- package/dist/charts/registry.d.ts +36 -0
- package/dist/charts/registry.d.ts.map +1 -0
- package/dist/charts/registry.js +55 -0
- package/dist/charts/registry.js.map +1 -0
- package/dist/charts/sankey.d.ts +14 -0
- package/dist/charts/sankey.d.ts.map +1 -0
- package/dist/charts/sankey.js +74 -0
- package/dist/charts/sankey.js.map +1 -0
- package/dist/charts/scatter.d.ts +14 -0
- package/dist/charts/scatter.d.ts.map +1 -0
- package/dist/charts/scatter.js +130 -0
- package/dist/charts/scatter.js.map +1 -0
- package/dist/charts/sparkline.d.ts +19 -0
- package/dist/charts/sparkline.d.ts.map +1 -0
- package/dist/charts/sparkline.js +154 -0
- package/dist/charts/sparkline.js.map +1 -0
- package/dist/charts/waterfall.d.ts +14 -0
- package/dist/charts/waterfall.d.ts.map +1 -0
- package/dist/charts/waterfall.js +232 -0
- package/dist/charts/waterfall.js.map +1 -0
- package/dist/charts/xmr.d.ts +14 -0
- package/dist/charts/xmr.d.ts.map +1 -0
- package/dist/charts/xmr.js +456 -0
- package/dist/charts/xmr.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +120 -0
- package/dist/cli.js.map +1 -0
- package/dist/components/alert.d.ts +10 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +65 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/big_value.d.ts +10 -0
- package/dist/components/big_value.d.ts.map +1 -0
- package/dist/components/big_value.js +78 -0
- package/dist/components/big_value.js.map +1 -0
- package/dist/components/delta.d.ts +10 -0
- package/dist/components/delta.d.ts.map +1 -0
- package/dist/components/delta.js +83 -0
- package/dist/components/delta.js.map +1 -0
- package/dist/components/empty_space.d.ts +10 -0
- package/dist/components/empty_space.d.ts.map +1 -0
- package/dist/components/empty_space.js +29 -0
- package/dist/components/empty_space.js.map +1 -0
- package/dist/components/index.d.ts +21 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +23 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/note.d.ts +10 -0
- package/dist/components/note.d.ts.map +1 -0
- package/dist/components/note.js +66 -0
- package/dist/components/note.js.map +1 -0
- package/dist/components/registry.d.ts +24 -0
- package/dist/components/registry.d.ts.map +1 -0
- package/dist/components/registry.js +36 -0
- package/dist/components/registry.js.map +1 -0
- package/dist/components/table.d.ts +90 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +610 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/text.d.ts +10 -0
- package/dist/components/text.d.ts.map +1 -0
- package/dist/components/text.js +46 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/textarea.d.ts +10 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +79 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/core/colors.d.ts +45 -0
- package/dist/core/colors.d.ts.map +1 -0
- package/dist/core/colors.js +93 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/css.d.ts +20 -0
- package/dist/core/css.d.ts.map +1 -0
- package/dist/core/css.js +97 -0
- package/dist/core/css.js.map +1 -0
- package/dist/core/exceptions.d.ts +59 -0
- package/dist/core/exceptions.d.ts.map +1 -0
- package/dist/core/exceptions.js +100 -0
- package/dist/core/exceptions.js.map +1 -0
- package/dist/core/formatting.d.ts +53 -0
- package/dist/core/formatting.d.ts.map +1 -0
- package/dist/core/formatting.js +491 -0
- package/dist/core/formatting.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/serializer.d.ts +29 -0
- package/dist/core/serializer.d.ts.map +1 -0
- package/dist/core/serializer.js +84 -0
- package/dist/core/serializer.js.map +1 -0
- package/dist/core/themes.d.ts +138 -0
- package/dist/core/themes.d.ts.map +1 -0
- package/dist/core/themes.js +484 -0
- package/dist/core/themes.js.map +1 -0
- package/dist/core/version-check.d.ts +23 -0
- package/dist/core/version-check.d.ts.map +1 -0
- package/dist/core/version-check.js +163 -0
- package/dist/core/version-check.js.map +1 -0
- package/dist/generate_test_harness.d.ts +13 -0
- package/dist/generate_test_harness.d.ts.map +1 -0
- package/dist/generate_test_harness.js +35 -0
- package/dist/generate_test_harness.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/converter.d.ts +22 -0
- package/dist/layout/converter.d.ts.map +1 -0
- package/dist/layout/converter.js +46 -0
- package/dist/layout/converter.js.map +1 -0
- package/dist/layout/csv.d.ts +15 -0
- package/dist/layout/csv.d.ts.map +1 -0
- package/dist/layout/csv.js +88 -0
- package/dist/layout/csv.js.map +1 -0
- package/dist/layout/dispatcher.d.ts +13 -0
- package/dist/layout/dispatcher.d.ts.map +1 -0
- package/dist/layout/dispatcher.js +47 -0
- package/dist/layout/dispatcher.js.map +1 -0
- package/dist/layout/index.d.ts +8 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +8 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/parser.d.ts +19 -0
- package/dist/layout/parser.d.ts.map +1 -0
- package/dist/layout/parser.js +888 -0
- package/dist/layout/parser.js.map +1 -0
- package/dist/layout/templates.d.ts +32 -0
- package/dist/layout/templates.d.ts.map +1 -0
- package/dist/layout/templates.js +1016 -0
- package/dist/layout/templates.js.map +1 -0
- package/dist/types.d.ts +144 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +14 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bubble chart generator
|
|
3
|
+
*/
|
|
4
|
+
import type { ChartSpec } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Build ECharts options for a bubble chart
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildBubbleOptions(spec: ChartSpec): Record<string, unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* Generate a bubble chart with JS function for symbol size
|
|
11
|
+
*/
|
|
12
|
+
declare function generateBubble(spec: ChartSpec): string;
|
|
13
|
+
export { generateBubble };
|
|
14
|
+
//# sourceMappingURL=bubble.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bubble.d.ts","sourceRoot":"","sources":["../../charts/bubble.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AAI/D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyE3E;AAED;;GAEG;AACH,iBAAS,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CA0C/C;AAMD,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bubble chart generator
|
|
3
|
+
*/
|
|
4
|
+
import { COLORS, FONT_SIZE_TINY, ECHARTS_CDN, FONT_STACK, getThemeColors, getPalette } from '../core/themes.js';
|
|
5
|
+
import { registerChart, registerOptions } from './registry.js';
|
|
6
|
+
/**
|
|
7
|
+
* Build ECharts options for a bubble chart
|
|
8
|
+
*/
|
|
9
|
+
export function buildBubbleOptions(spec) {
|
|
10
|
+
const data = (spec.data ?? []);
|
|
11
|
+
const xField = spec.x ?? 'x';
|
|
12
|
+
const yField = spec.y ?? 'y';
|
|
13
|
+
const sizeField = spec.size ?? 'size';
|
|
14
|
+
const theme = (spec.theme ?? 'light');
|
|
15
|
+
const colors = getThemeColors(theme);
|
|
16
|
+
const palette = getPalette(theme);
|
|
17
|
+
// Find min/max for size scaling
|
|
18
|
+
const sizes = data.map((d) => (typeof d[sizeField] === 'number' ? d[sizeField] : 1));
|
|
19
|
+
const minSize = sizes.length > 0 ? Math.min(...sizes) : 1;
|
|
20
|
+
const maxSize = sizes.length > 0 ? Math.max(...sizes) : 1;
|
|
21
|
+
const sizeRange = maxSize - minSize || 1;
|
|
22
|
+
// Build bubble data with scaled sizes
|
|
23
|
+
const bubbleData = data.map((d) => {
|
|
24
|
+
const s = typeof d[sizeField] === 'number' ? d[sizeField] : 1;
|
|
25
|
+
const scaledSize = 10 + ((s - minSize) / sizeRange) * 40;
|
|
26
|
+
return [d[xField] ?? 0, d[yField] ?? 0, s, scaledSize];
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
backgroundColor: 'transparent',
|
|
30
|
+
animation: false,
|
|
31
|
+
color: palette,
|
|
32
|
+
tooltip: {
|
|
33
|
+
trigger: 'item',
|
|
34
|
+
backgroundColor: colors.paper,
|
|
35
|
+
borderColor: colors.border,
|
|
36
|
+
textStyle: { color: colors.text },
|
|
37
|
+
},
|
|
38
|
+
grid: {
|
|
39
|
+
left: '6%',
|
|
40
|
+
right: '8%',
|
|
41
|
+
top: '12%',
|
|
42
|
+
bottom: '14%',
|
|
43
|
+
containLabel: true,
|
|
44
|
+
},
|
|
45
|
+
xAxis: {
|
|
46
|
+
type: 'value',
|
|
47
|
+
name: xField,
|
|
48
|
+
nameLocation: 'middle',
|
|
49
|
+
nameGap: 24,
|
|
50
|
+
nameTextStyle: { color: colors.textSecondary, fontSize: FONT_SIZE_TINY },
|
|
51
|
+
scale: true,
|
|
52
|
+
axisLine: { show: false },
|
|
53
|
+
axisTick: { show: false },
|
|
54
|
+
axisLabel: { color: colors.textSecondary },
|
|
55
|
+
splitLine: { lineStyle: { color: colors.border, type: [2, 3], opacity: 0.6 } },
|
|
56
|
+
},
|
|
57
|
+
yAxis: {
|
|
58
|
+
type: 'value',
|
|
59
|
+
name: yField,
|
|
60
|
+
nameLocation: 'middle',
|
|
61
|
+
nameGap: 32,
|
|
62
|
+
nameTextStyle: { color: colors.textSecondary, fontSize: FONT_SIZE_TINY },
|
|
63
|
+
scale: true,
|
|
64
|
+
axisLine: { show: false },
|
|
65
|
+
axisTick: { show: false },
|
|
66
|
+
axisLabel: { color: colors.textSecondary },
|
|
67
|
+
splitLine: { lineStyle: { color: colors.border, type: [2, 3], opacity: 0.6 } },
|
|
68
|
+
},
|
|
69
|
+
series: [
|
|
70
|
+
{
|
|
71
|
+
type: 'scatter',
|
|
72
|
+
data: bubbleData,
|
|
73
|
+
symbolSize: '__SYMBOL_SIZE_FUNC__',
|
|
74
|
+
itemStyle: { color: palette[0], opacity: 0.55 },
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Generate a bubble chart with JS function for symbol size
|
|
81
|
+
*/
|
|
82
|
+
function generateBubble(spec) {
|
|
83
|
+
const option = buildBubbleOptions(spec);
|
|
84
|
+
const title = spec.title ?? '';
|
|
85
|
+
const theme = (spec.theme ?? 'light');
|
|
86
|
+
const colors = getThemeColors(theme);
|
|
87
|
+
// Convert to JSON and inject the symbolSize function
|
|
88
|
+
let optionJson = JSON.stringify(option, null, 2);
|
|
89
|
+
optionJson = optionJson.replace('"__SYMBOL_SIZE_FUNC__"', 'function(val) { return val[3] || 20; }');
|
|
90
|
+
return `<!DOCTYPE html>
|
|
91
|
+
<html lang="en">
|
|
92
|
+
<head>
|
|
93
|
+
<meta charset="utf-8">
|
|
94
|
+
<title>${title}</title>
|
|
95
|
+
<script src="${ECHARTS_CDN}"></script>
|
|
96
|
+
<style>
|
|
97
|
+
* { box-sizing: border-box; }
|
|
98
|
+
html, body {
|
|
99
|
+
margin: 0; padding: 0; width: 100%; height: 100%;
|
|
100
|
+
background-color: ${colors.background}; font-family: ${FONT_STACK};
|
|
101
|
+
}
|
|
102
|
+
.container { padding: 20px; width: 100%; height: 100%; display: flex; flex-direction: column; }
|
|
103
|
+
.red-line { width: 100%; height: 3px; background-color: ${COLORS.ERROR_RED}; margin-bottom: 12px; }
|
|
104
|
+
h2 { font-family: ${FONT_STACK}; color: ${colors.text}; font-size: 18px; font-weight: 900; margin: 0 0 4px 0; }
|
|
105
|
+
#chart { width: 100%; flex: 1; min-height: 300px; }
|
|
106
|
+
</style>
|
|
107
|
+
</head>
|
|
108
|
+
<body>
|
|
109
|
+
<div class="container">
|
|
110
|
+
<div class="red-line"></div>
|
|
111
|
+
<h2>${title}</h2>
|
|
112
|
+
<div id="chart"></div>
|
|
113
|
+
</div>
|
|
114
|
+
<script>
|
|
115
|
+
var chart = echarts.init(document.getElementById('chart'));
|
|
116
|
+
var option = ${optionJson};
|
|
117
|
+
chart.setOption(option);
|
|
118
|
+
window.addEventListener('resize', function() { chart.resize(); });
|
|
119
|
+
</script>
|
|
120
|
+
</body>
|
|
121
|
+
</html>`;
|
|
122
|
+
}
|
|
123
|
+
// Register the chart
|
|
124
|
+
registerChart('bubble')(generateBubble);
|
|
125
|
+
registerOptions('bubble')(buildBubbleOptions);
|
|
126
|
+
export { generateBubble };
|
|
127
|
+
//# sourceMappingURL=bubble.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bubble.js","sourceRoot":"","sources":["../../charts/bubble.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendar heatmap chart generator
|
|
3
|
+
*/
|
|
4
|
+
import type { ChartSpec } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Build ECharts options for a calendar heatmap
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildCalendarOptions(spec: ChartSpec): Record<string, unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* Generate a calendar heatmap chart
|
|
11
|
+
*/
|
|
12
|
+
declare function generateCalendar(spec: ChartSpec): string;
|
|
13
|
+
export { generateCalendar };
|
|
14
|
+
//# sourceMappingURL=calendar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../charts/calendar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AAK/D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6E7E;AAED;;GAEG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAGjD;AAMD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendar heatmap chart generator
|
|
3
|
+
*/
|
|
4
|
+
import { PALETTE, FONT_SIZE_MICRO, getThemeColors } from '../core/themes.js';
|
|
5
|
+
import { wrapHtml } from '../core/serializer.js';
|
|
6
|
+
import { registerChart, registerOptions } from './registry.js';
|
|
7
|
+
/**
|
|
8
|
+
* Build ECharts options for a calendar heatmap
|
|
9
|
+
*/
|
|
10
|
+
export function buildCalendarOptions(spec) {
|
|
11
|
+
const data = (spec.data ?? []);
|
|
12
|
+
const theme = (spec.theme ?? 'light');
|
|
13
|
+
const year = typeof spec.year === 'number' ? spec.year : 2024;
|
|
14
|
+
const colors = getThemeColors(theme);
|
|
15
|
+
// Convert data to [date, value] format
|
|
16
|
+
let calData;
|
|
17
|
+
if (data.length > 0 && typeof data[0] === 'object') {
|
|
18
|
+
calData = data.map((d) => [String(d.date ?? ''), (d.value ?? 0)]);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
calData = data;
|
|
22
|
+
}
|
|
23
|
+
const values = calData.map((d) => d[1]);
|
|
24
|
+
const maxVal = values.length > 0 ? Math.max(...values) : 100;
|
|
25
|
+
// Color range depends on theme
|
|
26
|
+
const colorRange = theme === 'dark'
|
|
27
|
+
? [colors.background, PALETTE[0], '#FFFFFF']
|
|
28
|
+
: [colors.border, PALETTE[1] ?? PALETTE[0], PALETTE[0]];
|
|
29
|
+
return {
|
|
30
|
+
backgroundColor: 'transparent',
|
|
31
|
+
animation: false,
|
|
32
|
+
tooltip: {
|
|
33
|
+
trigger: 'item',
|
|
34
|
+
backgroundColor: colors.paper,
|
|
35
|
+
borderColor: colors.border,
|
|
36
|
+
textStyle: { color: colors.text },
|
|
37
|
+
},
|
|
38
|
+
visualMap: {
|
|
39
|
+
min: 0,
|
|
40
|
+
max: maxVal,
|
|
41
|
+
show: false,
|
|
42
|
+
inRange: { color: colorRange },
|
|
43
|
+
},
|
|
44
|
+
calendar: {
|
|
45
|
+
top: '15%',
|
|
46
|
+
left: '5%',
|
|
47
|
+
right: '2%',
|
|
48
|
+
bottom: '5%',
|
|
49
|
+
cellSize: [14, 14],
|
|
50
|
+
range: String(year),
|
|
51
|
+
itemStyle: {
|
|
52
|
+
borderWidth: 1,
|
|
53
|
+
borderColor: colors.background,
|
|
54
|
+
},
|
|
55
|
+
splitLine: {
|
|
56
|
+
show: true,
|
|
57
|
+
lineStyle: { color: colors.border, width: 1 },
|
|
58
|
+
},
|
|
59
|
+
yearLabel: { show: false },
|
|
60
|
+
dayLabel: {
|
|
61
|
+
show: true,
|
|
62
|
+
firstDay: 0,
|
|
63
|
+
color: colors.textSecondary,
|
|
64
|
+
fontSize: FONT_SIZE_MICRO,
|
|
65
|
+
nameMap: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
|
|
66
|
+
margin: 5,
|
|
67
|
+
},
|
|
68
|
+
monthLabel: {
|
|
69
|
+
show: true,
|
|
70
|
+
color: colors.textSecondary,
|
|
71
|
+
fontSize: FONT_SIZE_MICRO,
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
series: [
|
|
75
|
+
{
|
|
76
|
+
type: 'heatmap',
|
|
77
|
+
coordinateSystem: 'calendar',
|
|
78
|
+
data: calData,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Generate a calendar heatmap chart
|
|
85
|
+
*/
|
|
86
|
+
function generateCalendar(spec) {
|
|
87
|
+
const height = typeof spec.height === 'number' ? spec.height : 200;
|
|
88
|
+
return wrapHtml('chart', buildCalendarOptions(spec), '', '100%', height);
|
|
89
|
+
}
|
|
90
|
+
// Register the chart
|
|
91
|
+
registerChart('calendar')(generateCalendar);
|
|
92
|
+
registerOptions('calendar')(buildCalendarOptions);
|
|
93
|
+
export { generateCalendar };
|
|
94
|
+
//# sourceMappingURL=calendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../charts/calendar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Combo chart generator (bar + line with optional dual axis)
|
|
3
|
+
*/
|
|
4
|
+
import type { ChartSpec } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Build ECharts options for a combo chart (bar + line with optional dual axis)
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildComboOptions(spec: ChartSpec): Record<string, unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* Generate a combo chart
|
|
11
|
+
*/
|
|
12
|
+
declare function generateCombo(spec: ChartSpec): string;
|
|
13
|
+
export { generateCombo };
|
|
14
|
+
//# sourceMappingURL=combo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combo.d.ts","sourceRoot":"","sources":["../../charts/combo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAgC,MAAM,aAAa,CAAC;AAc3E;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+J1E;AAED;;GAEG;AACH,iBAAS,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAG9C;AAMD,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Combo chart generator (bar + line with optional dual axis)
|
|
3
|
+
*/
|
|
4
|
+
import { FONT_SIZE_XXS, BAR_MAX_WIDTH, LEGEND_ITEM_WIDTH, LEGEND_ITEM_HEIGHT, LEGEND_ITEM_GAP, getThemeColors, getPalette, } from '../core/themes.js';
|
|
5
|
+
import { wrapHtml } from '../core/serializer.js';
|
|
6
|
+
import { inferAxisType, inferFormat, getAxisFormatterJs } from '../core/formatting.js';
|
|
7
|
+
import { registerChart, registerOptions } from './registry.js';
|
|
8
|
+
/**
|
|
9
|
+
* Build ECharts options for a combo chart (bar + line with optional dual axis)
|
|
10
|
+
*/
|
|
11
|
+
export function buildComboOptions(spec) {
|
|
12
|
+
const data = (spec.data ?? []);
|
|
13
|
+
const x = spec.x ?? 'name';
|
|
14
|
+
const barFields = spec.bar;
|
|
15
|
+
const lineFields = spec.line;
|
|
16
|
+
const theme = (spec.theme ?? 'light');
|
|
17
|
+
const dualAxis = spec.dualAxis ?? false;
|
|
18
|
+
const colors = getThemeColors(theme);
|
|
19
|
+
const palette = getPalette(theme);
|
|
20
|
+
const barKeys = Array.isArray(barFields) ? barFields : barFields ? [barFields] : [];
|
|
21
|
+
const lineKeys = Array.isArray(lineFields) ? lineFields : lineFields ? [lineFields] : [];
|
|
22
|
+
const categories = data.map((d) => d[x]);
|
|
23
|
+
// Infer format for primary y-axis (bars)
|
|
24
|
+
const barSample = data.length > 0 && data[0] && barKeys[0] ? data[0][barKeys[0]] ?? 0 : 0;
|
|
25
|
+
const primaryFormat = spec.format ?? inferFormat(barKeys[0] ?? 'value', barSample);
|
|
26
|
+
const primaryAxisFormatter = getAxisFormatterJs(primaryFormat);
|
|
27
|
+
// Infer format for secondary y-axis (line if dual axis)
|
|
28
|
+
const lineSample = data.length > 0 && data[0] && lineKeys[0] ? data[0][lineKeys[0]] ?? 0 : 0;
|
|
29
|
+
const secondaryFormat = spec.secondaryFormat ?? inferFormat(lineKeys[0] ?? 'value', lineSample);
|
|
30
|
+
const secondaryAxisFormatter = getAxisFormatterJs(secondaryFormat);
|
|
31
|
+
// Detect x-axis type
|
|
32
|
+
const xAxisType = inferAxisType(categories);
|
|
33
|
+
// Get axis label config based on axis type
|
|
34
|
+
const xAxisLabelConfig = xAxisType === 'category'
|
|
35
|
+
? { interval: 0, rotate: 45, overflow: 'truncate', ellipsis: '...', width: 100 }
|
|
36
|
+
: xAxisType === 'time'
|
|
37
|
+
? {
|
|
38
|
+
hideOverlap: true,
|
|
39
|
+
formatter: {
|
|
40
|
+
_js_: `function(value) {
|
|
41
|
+
var d = new Date(value);
|
|
42
|
+
var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
|
|
43
|
+
return months[d.getMonth()] + ' ' + d.getDate();
|
|
44
|
+
}`,
|
|
45
|
+
},
|
|
46
|
+
}
|
|
47
|
+
: { hideOverlap: true };
|
|
48
|
+
const series = [];
|
|
49
|
+
// Add bar series
|
|
50
|
+
barKeys.forEach((key, i) => {
|
|
51
|
+
const seriesData = xAxisType === 'time' || xAxisType === 'value'
|
|
52
|
+
? data.map((d) => [d[x] ?? '', d[key] ?? 0])
|
|
53
|
+
: data.map((d) => d[key] ?? 0);
|
|
54
|
+
series.push({
|
|
55
|
+
name: key,
|
|
56
|
+
type: 'bar',
|
|
57
|
+
data: seriesData,
|
|
58
|
+
barMaxWidth: BAR_MAX_WIDTH,
|
|
59
|
+
itemStyle: {
|
|
60
|
+
color: palette[i % palette.length],
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
// Add line series
|
|
65
|
+
lineKeys.forEach((key, i) => {
|
|
66
|
+
const seriesData = xAxisType === 'time' || xAxisType === 'value'
|
|
67
|
+
? data.map((d) => [d[x] ?? '', d[key] ?? 0])
|
|
68
|
+
: data.map((d) => d[key] ?? 0);
|
|
69
|
+
const lineSeries = {
|
|
70
|
+
name: key,
|
|
71
|
+
type: 'line',
|
|
72
|
+
data: seriesData,
|
|
73
|
+
smooth: false,
|
|
74
|
+
symbol: 'none',
|
|
75
|
+
lineStyle: { width: 2 },
|
|
76
|
+
itemStyle: { color: palette[(barKeys.length + i) % palette.length] },
|
|
77
|
+
};
|
|
78
|
+
if (dualAxis) {
|
|
79
|
+
lineSeries.yAxisIndex = 1;
|
|
80
|
+
}
|
|
81
|
+
series.push(lineSeries);
|
|
82
|
+
});
|
|
83
|
+
const yAxis = [
|
|
84
|
+
{
|
|
85
|
+
type: 'value',
|
|
86
|
+
axisLine: { show: false },
|
|
87
|
+
axisTick: { show: false },
|
|
88
|
+
axisLabel: {
|
|
89
|
+
color: colors.textSecondary,
|
|
90
|
+
...(primaryAxisFormatter && { formatter: primaryAxisFormatter }),
|
|
91
|
+
},
|
|
92
|
+
splitLine: { lineStyle: { color: colors.border, type: [2, 3], opacity: 0.6 } },
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
// Apply yMin/yMax to primary y-axis
|
|
96
|
+
if (spec.yMin !== undefined) {
|
|
97
|
+
yAxis[0].min = spec.yMin;
|
|
98
|
+
}
|
|
99
|
+
if (spec.yMax !== undefined) {
|
|
100
|
+
yAxis[0].max = spec.yMax;
|
|
101
|
+
}
|
|
102
|
+
if (dualAxis) {
|
|
103
|
+
yAxis.push({
|
|
104
|
+
type: 'value',
|
|
105
|
+
axisLine: { show: false },
|
|
106
|
+
axisTick: { show: false },
|
|
107
|
+
axisLabel: {
|
|
108
|
+
color: colors.textSecondary,
|
|
109
|
+
...(secondaryAxisFormatter && { formatter: secondaryAxisFormatter }),
|
|
110
|
+
},
|
|
111
|
+
splitLine: { show: false }, // Hide gridlines on secondary axis
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
backgroundColor: 'transparent',
|
|
116
|
+
animation: false,
|
|
117
|
+
tooltip: {
|
|
118
|
+
trigger: 'axis',
|
|
119
|
+
backgroundColor: colors.paper,
|
|
120
|
+
borderColor: colors.border,
|
|
121
|
+
textStyle: { color: colors.text },
|
|
122
|
+
},
|
|
123
|
+
grid: {
|
|
124
|
+
left: '2%',
|
|
125
|
+
right: dualAxis ? '5%' : '2%',
|
|
126
|
+
top: '14%',
|
|
127
|
+
bottom: '8%',
|
|
128
|
+
containLabel: true,
|
|
129
|
+
},
|
|
130
|
+
legend: {
|
|
131
|
+
data: [...barKeys, ...lineKeys],
|
|
132
|
+
top: 0,
|
|
133
|
+
textStyle: { color: colors.textSecondary, fontSize: FONT_SIZE_XXS },
|
|
134
|
+
itemWidth: LEGEND_ITEM_WIDTH,
|
|
135
|
+
itemHeight: LEGEND_ITEM_HEIGHT,
|
|
136
|
+
itemGap: LEGEND_ITEM_GAP,
|
|
137
|
+
},
|
|
138
|
+
xAxis: {
|
|
139
|
+
type: xAxisType,
|
|
140
|
+
data: xAxisType === 'category' ? categories.map(String) : undefined,
|
|
141
|
+
axisLine: { show: false },
|
|
142
|
+
axisTick: { show: false },
|
|
143
|
+
axisLabel: {
|
|
144
|
+
color: colors.textSecondary,
|
|
145
|
+
...xAxisLabelConfig,
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
yAxis,
|
|
149
|
+
series,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Generate a combo chart
|
|
154
|
+
*/
|
|
155
|
+
function generateCombo(spec) {
|
|
156
|
+
const height = typeof spec.height === 'number' ? spec.height : 300;
|
|
157
|
+
return wrapHtml('chart', buildComboOptions(spec), '', '100%', height);
|
|
158
|
+
}
|
|
159
|
+
// Register the chart
|
|
160
|
+
registerChart('combo')(generateCombo);
|
|
161
|
+
registerOptions('combo')(buildComboOptions);
|
|
162
|
+
export { generateCombo };
|
|
163
|
+
//# sourceMappingURL=combo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combo.js","sourceRoot":"","sources":["../../charts/combo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dumbbell chart generator
|
|
3
|
+
*
|
|
4
|
+
* Dumbbell plots show comparisons between two values for each category,
|
|
5
|
+
* connected by a line with directional color-coding.
|
|
6
|
+
*/
|
|
7
|
+
import type { ChartSpec } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Build ECharts options for a dumbbell plot with directional coloring
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildDumbbellOptions(spec: ChartSpec): Record<string, unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* Generate a dumbbell chart
|
|
14
|
+
*/
|
|
15
|
+
declare function generateDumbbell(spec: ChartSpec): string;
|
|
16
|
+
export { generateDumbbell };
|
|
17
|
+
//# sourceMappingURL=dumbbell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dumbbell.d.ts","sourceRoot":"","sources":["../../charts/dumbbell.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AAgD/D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqT7E;AAsBD;;GAEG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAIjD;AAMD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|