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,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text/paragraph component
|
|
3
|
+
*/
|
|
4
|
+
import { FONT_STACK, getThemeColors } from '../core/themes.js';
|
|
5
|
+
import { registerComponent } from './registry.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate styled text/paragraph content
|
|
8
|
+
*/
|
|
9
|
+
function generateText(spec) {
|
|
10
|
+
const content = spec.content ?? '';
|
|
11
|
+
const title = spec.title ?? '';
|
|
12
|
+
const theme = (spec.theme ?? 'light');
|
|
13
|
+
const colors = getThemeColors(theme);
|
|
14
|
+
const titleUpper = title.toUpperCase();
|
|
15
|
+
const titleHtml = title ? `<h2>${titleUpper}</h2>` : '';
|
|
16
|
+
return `<!DOCTYPE html>
|
|
17
|
+
<html lang="en">
|
|
18
|
+
<head>
|
|
19
|
+
<meta charset="utf-8">
|
|
20
|
+
<title>${title}</title>
|
|
21
|
+
<style>
|
|
22
|
+
* { box-sizing: border-box; }
|
|
23
|
+
html, body {
|
|
24
|
+
margin: 0; padding: 0; width: 100%; height: 100%;
|
|
25
|
+
background-color: ${colors.background}; font-family: ${FONT_STACK};
|
|
26
|
+
}
|
|
27
|
+
.container { padding: 24px; width: 100%; }
|
|
28
|
+
h2 {
|
|
29
|
+
font-family: ${FONT_STACK}; font-weight: 700; color: ${colors.text};
|
|
30
|
+
font-size: 16px; margin: 0 0 16px 0; letter-spacing: 0.05em;
|
|
31
|
+
}
|
|
32
|
+
.content { font-size: 14px; color: ${colors.text}; line-height: 1.6; }
|
|
33
|
+
</style>
|
|
34
|
+
</head>
|
|
35
|
+
<body>
|
|
36
|
+
<div class="container">
|
|
37
|
+
${titleHtml}
|
|
38
|
+
<div class="content">${content}</div>
|
|
39
|
+
</div>
|
|
40
|
+
</body>
|
|
41
|
+
</html>`;
|
|
42
|
+
}
|
|
43
|
+
// Register the component
|
|
44
|
+
registerComponent('text')(generateText);
|
|
45
|
+
export { generateText };
|
|
46
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../components/text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,SAAS,YAAY,CAAC,IAAmB;IACvC,MAAM,OAAO,GAAI,IAAI,CAAC,OAAkB,IAAI,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAI,IAAI,CAAC,KAAgB,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAU,CAAC;IAE/C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAErC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,UAAU,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAExD,OAAO;;;;WAIE,KAAK;;;;;0BAKU,MAAM,CAAC,UAAU,kBAAkB,UAAU;;;;qBAIlD,UAAU,8BAA8B,MAAM,CAAC,IAAI;;;yCAG/B,MAAM,CAAC,IAAI;;;;;MAK9C,SAAS;2BACY,OAAO;;;QAG1B,CAAC;AACT,CAAC;AAED,yBAAyB;AACzB,iBAAiB,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Textarea component with markdown support
|
|
3
|
+
*/
|
|
4
|
+
import type { ComponentSpec } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generate a textarea component with markdown support
|
|
7
|
+
*/
|
|
8
|
+
declare function generateTextarea(spec: ComponentSpec): string;
|
|
9
|
+
export { generateTextarea };
|
|
10
|
+
//# sourceMappingURL=textarea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../components/textarea.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAS,MAAM,aAAa,CAAC;AAIxD;;GAEG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAsErD;AAKD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Textarea component with markdown support
|
|
3
|
+
*/
|
|
4
|
+
import { COLORS, PALETTE, FONT_STACK, getThemeColors } from '../core/themes.js';
|
|
5
|
+
import { registerComponent } from './registry.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate a textarea component with markdown support
|
|
8
|
+
*/
|
|
9
|
+
function generateTextarea(spec) {
|
|
10
|
+
const content = spec.content ?? '';
|
|
11
|
+
const title = spec.title ?? '';
|
|
12
|
+
const theme = (spec.theme ?? 'light');
|
|
13
|
+
const colors = getThemeColors(theme);
|
|
14
|
+
const titleUpper = title.toUpperCase();
|
|
15
|
+
const titleHtml = title
|
|
16
|
+
? `<h2 style="font-family: ${FONT_STACK}; font-weight: 700; color: ${colors.text}; font-size: 16px; margin: 0 0 16px 0; letter-spacing: 0.05em;">${titleUpper}</h2>`
|
|
17
|
+
: '';
|
|
18
|
+
// Escape content for safe embedding in JavaScript
|
|
19
|
+
const escapedContent = content.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$/g, '\\$');
|
|
20
|
+
return `<!DOCTYPE html>
|
|
21
|
+
<html lang="en">
|
|
22
|
+
<head>
|
|
23
|
+
<meta charset="utf-8">
|
|
24
|
+
<title>${title}</title>
|
|
25
|
+
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
|
26
|
+
<style>
|
|
27
|
+
* { box-sizing: border-box; }
|
|
28
|
+
html, body {
|
|
29
|
+
margin: 0; padding: 0; width: 100%; height: 100%;
|
|
30
|
+
background-color: ${colors.background}; font-family: ${FONT_STACK};
|
|
31
|
+
}
|
|
32
|
+
.container { padding: 24px; width: 100%; }
|
|
33
|
+
h2 {
|
|
34
|
+
font-family: ${FONT_STACK}; font-weight: 700; color: ${colors.text};
|
|
35
|
+
font-size: 16px; margin: 0 0 16px 0; letter-spacing: 0.05em;
|
|
36
|
+
}
|
|
37
|
+
.markdown-content {
|
|
38
|
+
font-size: 14px; color: ${colors.text}; line-height: 1.6;
|
|
39
|
+
}
|
|
40
|
+
.markdown-content h1 { font-size: 24px; font-weight: 900; margin: 16px 0 8px 0; }
|
|
41
|
+
.markdown-content h2 { font-size: 18px; font-weight: 700; margin: 14px 0 6px 0; }
|
|
42
|
+
.markdown-content h3 { font-size: 16px; font-weight: 700; margin: 12px 0 4px 0; }
|
|
43
|
+
.markdown-content p { margin: 8px 0; }
|
|
44
|
+
.markdown-content ul, .markdown-content ol { margin: 8px 0; padding-left: 24px; }
|
|
45
|
+
.markdown-content li { margin: 4px 0; }
|
|
46
|
+
.markdown-content code {
|
|
47
|
+
background: ${colors.border}40; padding: 2px 6px; border-radius: 3px;
|
|
48
|
+
font-family: 'Consolas', 'Monaco', monospace; font-size: 13px;
|
|
49
|
+
}
|
|
50
|
+
.markdown-content pre {
|
|
51
|
+
background: ${colors.border}40; padding: 12px; border-radius: 4px;
|
|
52
|
+
overflow-x: auto; margin: 12px 0;
|
|
53
|
+
}
|
|
54
|
+
.markdown-content pre code { background: none; padding: 0; }
|
|
55
|
+
.markdown-content blockquote {
|
|
56
|
+
border-left: 3px solid ${COLORS.ERROR_RED}; margin: 12px 0; padding-left: 16px;
|
|
57
|
+
color: ${colors.textSecondary}; font-style: italic;
|
|
58
|
+
}
|
|
59
|
+
.markdown-content a { color: ${PALETTE[0]}; text-decoration: none; }
|
|
60
|
+
.markdown-content a:hover { text-decoration: underline; }
|
|
61
|
+
.markdown-content strong { font-weight: 700; }
|
|
62
|
+
.markdown-content em { font-style: italic; }
|
|
63
|
+
</style>
|
|
64
|
+
</head>
|
|
65
|
+
<body>
|
|
66
|
+
<div class="container">
|
|
67
|
+
${titleHtml}
|
|
68
|
+
<div class="markdown-content" id="content"></div>
|
|
69
|
+
</div>
|
|
70
|
+
<script>
|
|
71
|
+
document.getElementById('content').innerHTML = marked.parse(\`${escapedContent}\`);
|
|
72
|
+
</script>
|
|
73
|
+
</body>
|
|
74
|
+
</html>`;
|
|
75
|
+
}
|
|
76
|
+
// Register the component
|
|
77
|
+
registerComponent('textarea')(generateTextarea);
|
|
78
|
+
export { generateTextarea };
|
|
79
|
+
//# sourceMappingURL=textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../components/textarea.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAmB;IAC3C,MAAM,OAAO,GAAI,IAAI,CAAC,OAAkB,IAAI,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAI,IAAI,CAAC,KAAgB,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAU,CAAC;IAE/C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAErC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK;QACrB,CAAC,CAAC,2BAA2B,UAAU,8BAA8B,MAAM,CAAC,IAAI,mEAAmE,UAAU,OAAO;QACpK,CAAC,CAAC,EAAE,CAAC;IAEP,kDAAkD;IAClD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEjG,OAAO;;;;WAIE,KAAK;;;;;;0BAMU,MAAM,CAAC,UAAU,kBAAkB,UAAU;;;;qBAIlD,UAAU,8BAA8B,MAAM,CAAC,IAAI;;;;gCAIxC,MAAM,CAAC,IAAI;;;;;;;;;oBASvB,MAAM,CAAC,MAAM;;;;oBAIb,MAAM,CAAC,MAAM;;;;;+BAKF,MAAM,CAAC,SAAS;eAChC,MAAM,CAAC,aAAa;;mCAEA,OAAO,CAAC,CAAC,CAAC;;;;;;;;MAQvC,SAAS;;;;oEAIqD,cAAc;;;QAG1E,CAAC;AACT,CAAC;AAED,yBAAyB;AACzB,iBAAiB,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAAC,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color utilities for mviz
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* RGB color representation
|
|
6
|
+
*/
|
|
7
|
+
export interface RGB {
|
|
8
|
+
r: number;
|
|
9
|
+
g: number;
|
|
10
|
+
b: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Convert hex color to RGB
|
|
14
|
+
*/
|
|
15
|
+
export declare function hexToRgb(hex: string): RGB;
|
|
16
|
+
/**
|
|
17
|
+
* Convert RGB to hex color
|
|
18
|
+
*/
|
|
19
|
+
export declare function rgbToHex(r: number, g: number, b: number): string;
|
|
20
|
+
/**
|
|
21
|
+
* Get contrasting text color (black or white) for a background
|
|
22
|
+
* Uses WCAG AA contrast ratio guidelines
|
|
23
|
+
*/
|
|
24
|
+
export declare function getContrastingTextColor(backgroundColor: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Interpolate between two colors
|
|
27
|
+
*/
|
|
28
|
+
export declare function interpolateColor(color1: string, color2: string, factor: number): string;
|
|
29
|
+
/**
|
|
30
|
+
* Calculate heatmap color based on value and range
|
|
31
|
+
*/
|
|
32
|
+
export declare function calculateHeatmapColor(value: number, min: number, max: number, lowColor?: string, highColor?: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Result of heatmap color calculation with text color for contrast
|
|
35
|
+
*/
|
|
36
|
+
export interface HeatmapColorResult {
|
|
37
|
+
bgColor: string;
|
|
38
|
+
textColor: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Calculate heatmap background and text colors for a value
|
|
42
|
+
* Uses gradient colors array for multi-stop gradients
|
|
43
|
+
*/
|
|
44
|
+
export declare function calculateHeatmapColorWithContrast(value: number, min: number, max: number, colors: string[]): HeatmapColorResult;
|
|
45
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../core/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAQzC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAMhE;AAaD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAKvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUvF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,QAAQ,SAAY,EACpB,SAAS,SAAY,GACpB,MAAM,CAMR;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EAAE,GACf,kBAAkB,CA+BpB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color utilities for mviz
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Convert hex color to RGB
|
|
6
|
+
*/
|
|
7
|
+
export function hexToRgb(hex) {
|
|
8
|
+
const cleaned = hex.replace('#', '');
|
|
9
|
+
const bigint = parseInt(cleaned, 16);
|
|
10
|
+
return {
|
|
11
|
+
r: (bigint >> 16) & 255,
|
|
12
|
+
g: (bigint >> 8) & 255,
|
|
13
|
+
b: bigint & 255,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Convert RGB to hex color
|
|
18
|
+
*/
|
|
19
|
+
export function rgbToHex(r, g, b) {
|
|
20
|
+
const toHex = (n) => {
|
|
21
|
+
const hex = Math.round(Math.max(0, Math.min(255, n))).toString(16);
|
|
22
|
+
return hex.length === 1 ? '0' + hex : hex;
|
|
23
|
+
};
|
|
24
|
+
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Calculate relative luminance for WCAG contrast
|
|
28
|
+
*/
|
|
29
|
+
function getLuminance(rgb) {
|
|
30
|
+
const [rs, gs, bs] = [rgb.r, rgb.g, rgb.b].map((c) => {
|
|
31
|
+
const s = c / 255;
|
|
32
|
+
return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
|
|
33
|
+
});
|
|
34
|
+
return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get contrasting text color (black or white) for a background
|
|
38
|
+
* Uses WCAG AA contrast ratio guidelines
|
|
39
|
+
*/
|
|
40
|
+
export function getContrastingTextColor(backgroundColor) {
|
|
41
|
+
const rgb = hexToRgb(backgroundColor);
|
|
42
|
+
const luminance = getLuminance(rgb);
|
|
43
|
+
// Use white text on dark backgrounds, black on light
|
|
44
|
+
return luminance > 0.179 ? '#231f20' : '#ffffff';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Interpolate between two colors
|
|
48
|
+
*/
|
|
49
|
+
export function interpolateColor(color1, color2, factor) {
|
|
50
|
+
const rgb1 = hexToRgb(color1);
|
|
51
|
+
const rgb2 = hexToRgb(color2);
|
|
52
|
+
const t = Math.max(0, Math.min(1, factor));
|
|
53
|
+
return rgbToHex(rgb1.r + (rgb2.r - rgb1.r) * t, rgb1.g + (rgb2.g - rgb1.g) * t, rgb1.b + (rgb2.b - rgb1.b) * t);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Calculate heatmap color based on value and range
|
|
57
|
+
*/
|
|
58
|
+
export function calculateHeatmapColor(value, min, max, lowColor = '#ffffff', highColor = '#0777b3') {
|
|
59
|
+
if (min === max) {
|
|
60
|
+
return interpolateColor(lowColor, highColor, 0.5);
|
|
61
|
+
}
|
|
62
|
+
const normalized = (value - min) / (max - min);
|
|
63
|
+
return interpolateColor(lowColor, highColor, normalized);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Calculate heatmap background and text colors for a value
|
|
67
|
+
* Uses gradient colors array for multi-stop gradients
|
|
68
|
+
*/
|
|
69
|
+
export function calculateHeatmapColorWithContrast(value, min, max, colors) {
|
|
70
|
+
if (colors.length < 2) {
|
|
71
|
+
const bgColor = colors[0] ?? '#ffffff';
|
|
72
|
+
return { bgColor, textColor: getContrastingTextColor(bgColor) };
|
|
73
|
+
}
|
|
74
|
+
// Normalize value to 0-1 range
|
|
75
|
+
let normalized = 0.5;
|
|
76
|
+
if (min !== max) {
|
|
77
|
+
normalized = (value - min) / (max - min);
|
|
78
|
+
}
|
|
79
|
+
normalized = Math.max(0, Math.min(1, normalized));
|
|
80
|
+
// For 2 colors, simple interpolation
|
|
81
|
+
if (colors.length === 2) {
|
|
82
|
+
const bgColor = interpolateColor(colors[0], colors[1], normalized);
|
|
83
|
+
return { bgColor, textColor: getContrastingTextColor(bgColor) };
|
|
84
|
+
}
|
|
85
|
+
// For multi-stop gradients, find the right segment
|
|
86
|
+
const segments = colors.length - 1;
|
|
87
|
+
const segmentSize = 1 / segments;
|
|
88
|
+
const segmentIndex = Math.min(Math.floor(normalized / segmentSize), segments - 1);
|
|
89
|
+
const segmentProgress = (normalized - segmentIndex * segmentSize) / segmentSize;
|
|
90
|
+
const bgColor = interpolateColor(colors[segmentIndex], colors[segmentIndex + 1], segmentProgress);
|
|
91
|
+
return { bgColor, textColor: getContrastingTextColor(bgColor) };
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../core/colors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS generation utilities for mviz
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Generate base CSS for standalone charts
|
|
6
|
+
*/
|
|
7
|
+
export declare function getBaseChartCss(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Generate CSS for component cards
|
|
10
|
+
*/
|
|
11
|
+
export declare function getComponentCardCss(backgroundColor: string, textColor: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Generate CSS for tables
|
|
14
|
+
*/
|
|
15
|
+
export declare function getTableCss(theme?: 'light' | 'dark'): string;
|
|
16
|
+
/**
|
|
17
|
+
* Inline CSS as style attribute
|
|
18
|
+
*/
|
|
19
|
+
export declare function inlineStyles(styles: Record<string, string | number>): string;
|
|
20
|
+
//# sourceMappingURL=css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../core/css.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAyBxC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQtF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,GAAE,OAAO,GAAG,MAAgB,GAAG,MAAM,CAoCrE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAQ5E"}
|
package/dist/core/css.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS generation utilities for mviz
|
|
3
|
+
*/
|
|
4
|
+
import { FONT_SIZE_SM, FONT_SIZE_XS, SPACING_SM, SPACING_XS } from './themes.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generate base CSS for standalone charts
|
|
7
|
+
*/
|
|
8
|
+
export function getBaseChartCss() {
|
|
9
|
+
return `
|
|
10
|
+
* {
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
body {
|
|
14
|
+
margin: 0;
|
|
15
|
+
padding: ${SPACING_SM}px;
|
|
16
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
17
|
+
font-size: ${FONT_SIZE_SM}px;
|
|
18
|
+
line-height: 1.5;
|
|
19
|
+
}
|
|
20
|
+
.chart-container {
|
|
21
|
+
width: 100%;
|
|
22
|
+
position: relative;
|
|
23
|
+
}
|
|
24
|
+
@media print {
|
|
25
|
+
body {
|
|
26
|
+
padding: 0;
|
|
27
|
+
}
|
|
28
|
+
.chart-container {
|
|
29
|
+
page-break-inside: avoid;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
`.trim();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generate CSS for component cards
|
|
36
|
+
*/
|
|
37
|
+
export function getComponentCardCss(backgroundColor, textColor) {
|
|
38
|
+
return `
|
|
39
|
+
background-color: ${backgroundColor};
|
|
40
|
+
color: ${textColor};
|
|
41
|
+
padding: ${SPACING_SM}px;
|
|
42
|
+
border-radius: ${SPACING_XS}px;
|
|
43
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
44
|
+
`.trim();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generate CSS for tables
|
|
48
|
+
*/
|
|
49
|
+
export function getTableCss(theme = 'light') {
|
|
50
|
+
const borderColor = theme === 'dark' ? '#424242' : '#e0e0e0';
|
|
51
|
+
const headerBg = theme === 'dark' ? '#424242' : '#f5f5f5';
|
|
52
|
+
const textColor = theme === 'dark' ? '#ffffff' : '#231f20';
|
|
53
|
+
const hoverBg = theme === 'dark' ? '#616161' : '#f5f5f5';
|
|
54
|
+
return `
|
|
55
|
+
.mviz-table {
|
|
56
|
+
width: 100%;
|
|
57
|
+
border-collapse: collapse;
|
|
58
|
+
font-size: ${FONT_SIZE_XS}px;
|
|
59
|
+
color: ${textColor};
|
|
60
|
+
}
|
|
61
|
+
.mviz-table th,
|
|
62
|
+
.mviz-table td {
|
|
63
|
+
padding: ${SPACING_XS}px ${SPACING_SM}px;
|
|
64
|
+
border: 1px solid ${borderColor};
|
|
65
|
+
text-align: left;
|
|
66
|
+
}
|
|
67
|
+
.mviz-table th {
|
|
68
|
+
background-color: ${headerBg};
|
|
69
|
+
font-weight: 600;
|
|
70
|
+
}
|
|
71
|
+
.mviz-table tr:hover {
|
|
72
|
+
background-color: ${hoverBg};
|
|
73
|
+
}
|
|
74
|
+
.mviz-table td.numeric {
|
|
75
|
+
text-align: right;
|
|
76
|
+
font-variant-numeric: tabular-nums;
|
|
77
|
+
}
|
|
78
|
+
@media print {
|
|
79
|
+
.mviz-table {
|
|
80
|
+
page-break-inside: avoid;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
`.trim();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Inline CSS as style attribute
|
|
87
|
+
*/
|
|
88
|
+
export function inlineStyles(styles) {
|
|
89
|
+
return Object.entries(styles)
|
|
90
|
+
.map(([key, value]) => {
|
|
91
|
+
const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();
|
|
92
|
+
const cssValue = typeof value === 'number' ? `${value}px` : value;
|
|
93
|
+
return `${cssKey}: ${cssValue}`;
|
|
94
|
+
})
|
|
95
|
+
.join('; ');
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../../core/css.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjF;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;iBAMQ,UAAU;;mBAER,YAAY;;;;;;;;;;;;;;;GAe5B,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,eAAuB,EAAE,SAAiB;IAC5E,OAAO;wBACe,eAAe;aAC1B,SAAS;eACP,UAAU;qBACJ,UAAU;;GAE5B,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAA0B,OAAO;IAC3D,MAAM,WAAW,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,MAAM,QAAQ,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,MAAM,SAAS,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,MAAM,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAEzD,OAAO;;;;mBAIU,YAAY;eAChB,SAAS;;;;iBAIP,UAAU,MAAM,UAAU;0BACjB,WAAW;;;;0BAIX,QAAQ;;;;0BAIR,OAAO;;;;;;;;;;;GAW9B,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAuC;IAClE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAClE,OAAO,GAAG,MAAM,KAAK,QAAQ,EAAE,CAAC;IAClC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom exception classes for mviz
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Base error class for chart generator errors
|
|
6
|
+
*/
|
|
7
|
+
export declare class ChartGeneratorError extends Error {
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Error thrown when a file cannot be loaded
|
|
12
|
+
*/
|
|
13
|
+
export declare class FileLoadError extends ChartGeneratorError {
|
|
14
|
+
readonly filePath: string;
|
|
15
|
+
readonly reason: string;
|
|
16
|
+
constructor(filePath: string, reason: string);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Error thrown when a file path cannot be resolved
|
|
20
|
+
*/
|
|
21
|
+
export declare class FileNotResolvable extends ChartGeneratorError {
|
|
22
|
+
readonly filePath: string;
|
|
23
|
+
readonly baseDir?: string | undefined;
|
|
24
|
+
constructor(filePath: string, baseDir?: string | undefined);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Error thrown when JSON is invalid
|
|
28
|
+
*/
|
|
29
|
+
export declare class InvalidJSONError extends ChartGeneratorError {
|
|
30
|
+
readonly input: string;
|
|
31
|
+
readonly parseError: string;
|
|
32
|
+
constructor(input: string, parseError: string);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Error thrown when a component/chart type is unknown
|
|
36
|
+
*/
|
|
37
|
+
export declare class UnknownComponentType extends ChartGeneratorError {
|
|
38
|
+
readonly componentType: string;
|
|
39
|
+
readonly suggestions?: string[] | undefined;
|
|
40
|
+
constructor(componentType: string, suggestions?: string[] | undefined);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Error thrown when a dashboard row overflows the grid
|
|
44
|
+
*/
|
|
45
|
+
export declare class RowOverflowError extends ChartGeneratorError {
|
|
46
|
+
readonly rowIndex: number;
|
|
47
|
+
readonly totalSpan: number;
|
|
48
|
+
readonly maxColumns: number;
|
|
49
|
+
constructor(rowIndex: number, totalSpan: number, maxColumns: number);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Error thrown when a required field is missing
|
|
53
|
+
*/
|
|
54
|
+
export declare class MissingRequiredFieldError extends ChartGeneratorError {
|
|
55
|
+
readonly fieldName: string;
|
|
56
|
+
readonly componentType: string;
|
|
57
|
+
constructor(fieldName: string, componentType: string);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=exceptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.d.ts","sourceRoot":"","sources":["../../core/exceptions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,mBAAmB;aAElC,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,MAAM;gBADd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAKjC;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,mBAAmB;aAEtC,QAAQ,EAAE,MAAM;aAChB,OAAO,CAAC,EAAE,MAAM;gBADhB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,YAAA;CAQnC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,mBAAmB;aAErC,KAAK,EAAE,MAAM;aACb,UAAU,EAAE,MAAM;gBADlB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM;CAKrC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,mBAAmB;aAEzC,aAAa,EAAE,MAAM;aACrB,WAAW,CAAC,EAAE,MAAM,EAAE;gBADtB,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,MAAM,EAAE,YAAA;CASzC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,mBAAmB;aAErC,QAAQ,EAAE,MAAM;aAChB,SAAS,EAAE,MAAM;aACjB,UAAU,EAAE,MAAM;gBAFlB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM;CAOrC;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,mBAAmB;aAE9C,SAAS,EAAE,MAAM;aACjB,aAAa,EAAE,MAAM;gBADrB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM;CAKxC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom exception classes for mviz
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Base error class for chart generator errors
|
|
6
|
+
*/
|
|
7
|
+
export class ChartGeneratorError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'ChartGeneratorError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Error thrown when a file cannot be loaded
|
|
15
|
+
*/
|
|
16
|
+
export class FileLoadError extends ChartGeneratorError {
|
|
17
|
+
filePath;
|
|
18
|
+
reason;
|
|
19
|
+
constructor(filePath, reason) {
|
|
20
|
+
super(`Failed to load file '${filePath}': ${reason}`);
|
|
21
|
+
this.filePath = filePath;
|
|
22
|
+
this.reason = reason;
|
|
23
|
+
this.name = 'FileLoadError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Error thrown when a file path cannot be resolved
|
|
28
|
+
*/
|
|
29
|
+
export class FileNotResolvable extends ChartGeneratorError {
|
|
30
|
+
filePath;
|
|
31
|
+
baseDir;
|
|
32
|
+
constructor(filePath, baseDir) {
|
|
33
|
+
const msg = baseDir
|
|
34
|
+
? `Cannot resolve file '${filePath}' from base directory '${baseDir}'`
|
|
35
|
+
: `Cannot resolve file '${filePath}'`;
|
|
36
|
+
super(msg);
|
|
37
|
+
this.filePath = filePath;
|
|
38
|
+
this.baseDir = baseDir;
|
|
39
|
+
this.name = 'FileNotResolvable';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Error thrown when JSON is invalid
|
|
44
|
+
*/
|
|
45
|
+
export class InvalidJSONError extends ChartGeneratorError {
|
|
46
|
+
input;
|
|
47
|
+
parseError;
|
|
48
|
+
constructor(input, parseError) {
|
|
49
|
+
super(`Invalid JSON: ${parseError}`);
|
|
50
|
+
this.input = input;
|
|
51
|
+
this.parseError = parseError;
|
|
52
|
+
this.name = 'InvalidJSONError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Error thrown when a component/chart type is unknown
|
|
57
|
+
*/
|
|
58
|
+
export class UnknownComponentType extends ChartGeneratorError {
|
|
59
|
+
componentType;
|
|
60
|
+
suggestions;
|
|
61
|
+
constructor(componentType, suggestions) {
|
|
62
|
+
let msg = `Unknown component type: '${componentType}'`;
|
|
63
|
+
if (suggestions && suggestions.length > 0) {
|
|
64
|
+
msg += `. Did you mean: ${suggestions.join(', ')}?`;
|
|
65
|
+
}
|
|
66
|
+
super(msg);
|
|
67
|
+
this.componentType = componentType;
|
|
68
|
+
this.suggestions = suggestions;
|
|
69
|
+
this.name = 'UnknownComponentType';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Error thrown when a dashboard row overflows the grid
|
|
74
|
+
*/
|
|
75
|
+
export class RowOverflowError extends ChartGeneratorError {
|
|
76
|
+
rowIndex;
|
|
77
|
+
totalSpan;
|
|
78
|
+
maxColumns;
|
|
79
|
+
constructor(rowIndex, totalSpan, maxColumns) {
|
|
80
|
+
super(`Row ${rowIndex} overflows grid: ${totalSpan} columns used, max is ${maxColumns}`);
|
|
81
|
+
this.rowIndex = rowIndex;
|
|
82
|
+
this.totalSpan = totalSpan;
|
|
83
|
+
this.maxColumns = maxColumns;
|
|
84
|
+
this.name = 'RowOverflowError';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Error thrown when a required field is missing
|
|
89
|
+
*/
|
|
90
|
+
export class MissingRequiredFieldError extends ChartGeneratorError {
|
|
91
|
+
fieldName;
|
|
92
|
+
componentType;
|
|
93
|
+
constructor(fieldName, componentType) {
|
|
94
|
+
super(`Missing required field '${fieldName}' for ${componentType}`);
|
|
95
|
+
this.fieldName = fieldName;
|
|
96
|
+
this.componentType = componentType;
|
|
97
|
+
this.name = 'MissingRequiredFieldError';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=exceptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../../core/exceptions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,mBAAmB;IAElC;IACA;IAFlB,YACkB,QAAgB,EAChB,MAAc;QAE9B,KAAK,CAAC,wBAAwB,QAAQ,MAAM,MAAM,EAAE,CAAC,CAAC;QAHtC,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,mBAAmB;IAEtC;IACA;IAFlB,YACkB,QAAgB,EAChB,OAAgB;QAEhC,MAAM,GAAG,GAAG,OAAO;YACjB,CAAC,CAAC,wBAAwB,QAAQ,0BAA0B,OAAO,GAAG;YACtE,CAAC,CAAC,wBAAwB,QAAQ,GAAG,CAAC;QACxC,KAAK,CAAC,GAAG,CAAC,CAAC;QANK,aAAQ,GAAR,QAAQ,CAAQ;QAChB,YAAO,GAAP,OAAO,CAAS;QAMhC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,mBAAmB;IAErC;IACA;IAFlB,YACkB,KAAa,EACb,UAAkB;QAElC,KAAK,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;QAHrB,UAAK,GAAL,KAAK,CAAQ;QACb,eAAU,GAAV,UAAU,CAAQ;QAGlC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,mBAAmB;IAEzC;IACA;IAFlB,YACkB,aAAqB,EACrB,WAAsB;QAEtC,IAAI,GAAG,GAAG,4BAA4B,aAAa,GAAG,CAAC;QACvD,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,GAAG,IAAI,mBAAmB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,CAAC;QAPK,kBAAa,GAAb,aAAa,CAAQ;QACrB,gBAAW,GAAX,WAAW,CAAW;QAOtC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,mBAAmB;IAErC;IACA;IACA;IAHlB,YACkB,QAAgB,EAChB,SAAiB,EACjB,UAAkB;QAElC,KAAK,CACH,OAAO,QAAQ,oBAAoB,SAAS,yBAAyB,UAAU,EAAE,CAClF,CAAC;QANc,aAAQ,GAAR,QAAQ,CAAQ;QAChB,cAAS,GAAT,SAAS,CAAQ;QACjB,eAAU,GAAV,UAAU,CAAQ;QAKlC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,mBAAmB;IAE9C;IACA;IAFlB,YACkB,SAAiB,EACjB,aAAqB;QAErC,KAAK,CAAC,2BAA2B,SAAS,SAAS,aAAa,EAAE,CAAC,CAAC;QAHpD,cAAS,GAAT,SAAS,CAAQ;QACjB,kBAAa,GAAb,aAAa,CAAQ;QAGrC,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Number formatting utilities for mviz
|
|
3
|
+
*/
|
|
4
|
+
import type { FormatType, AxisType } from '../types.js';
|
|
5
|
+
export type { FormatType, AxisType };
|
|
6
|
+
/**
|
|
7
|
+
* Format a number according to the specified format type
|
|
8
|
+
* @param showSign - If true, prefix positive numbers with +
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatNumber(value: number | null | undefined, format?: FormatType, showSign?: boolean): string;
|
|
11
|
+
/**
|
|
12
|
+
* Infer format type from field name and sample value
|
|
13
|
+
*/
|
|
14
|
+
export declare function inferFormat(fieldName: string, value?: number): FormatType;
|
|
15
|
+
/**
|
|
16
|
+
* Check if field name suggests currency
|
|
17
|
+
*/
|
|
18
|
+
export declare function isCurrencyField(fieldName: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Check if field name suggests percentage
|
|
21
|
+
*/
|
|
22
|
+
export declare function isPercentageField(fieldName: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Check if field name suggests count/integer
|
|
25
|
+
*/
|
|
26
|
+
export declare function isCountField(fieldName: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Infer axis type from data values
|
|
29
|
+
*/
|
|
30
|
+
export declare function inferAxisType(values: unknown[]): AxisType;
|
|
31
|
+
/**
|
|
32
|
+
* Parse a potentially numeric string to number
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseNumericString(value: string): number | string;
|
|
35
|
+
/**
|
|
36
|
+
* Generate ECharts formatter expression based on format type.
|
|
37
|
+
* Returns a simple JavaScript expression for inline use.
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatValue(fmt: FormatType | null): string;
|
|
40
|
+
/**
|
|
41
|
+
* Generate an ECharts label formatter function based on format type.
|
|
42
|
+
* Returns a dict with _js_ key containing the formatter function.
|
|
43
|
+
*/
|
|
44
|
+
export declare function getLabelFormatterJs(fmt: FormatType | null | undefined): {
|
|
45
|
+
_js_: string;
|
|
46
|
+
} | null;
|
|
47
|
+
/**
|
|
48
|
+
* Generate an ECharts axis formatter function.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getAxisFormatterJs(fmt: FormatType | null | undefined): {
|
|
51
|
+
_js_: string;
|
|
52
|
+
} | null;
|
|
53
|
+
//# sourceMappingURL=formatting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../core/formatting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGxD,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAErC;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,MAAM,CAAC,EAAE,UAAU,EACnB,QAAQ,UAAQ,GACf,MAAM,CA2DR;AA6JD;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAuBzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAqB1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAI5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAIvD;AA4BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAqCzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAUjE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,CA4B1D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgD/F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsD9F"}
|