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.
Files changed (194) hide show
  1. package/README.md +174 -0
  2. package/dist/charts/area.d.ts +14 -0
  3. package/dist/charts/area.d.ts.map +1 -0
  4. package/dist/charts/area.js +137 -0
  5. package/dist/charts/area.js.map +1 -0
  6. package/dist/charts/bar.d.ts +14 -0
  7. package/dist/charts/bar.d.ts.map +1 -0
  8. package/dist/charts/bar.js +191 -0
  9. package/dist/charts/bar.js.map +1 -0
  10. package/dist/charts/boxplot.d.ts +14 -0
  11. package/dist/charts/boxplot.d.ts.map +1 -0
  12. package/dist/charts/boxplot.js +79 -0
  13. package/dist/charts/boxplot.js.map +1 -0
  14. package/dist/charts/bubble.d.ts +14 -0
  15. package/dist/charts/bubble.d.ts.map +1 -0
  16. package/dist/charts/bubble.js +127 -0
  17. package/dist/charts/bubble.js.map +1 -0
  18. package/dist/charts/calendar.d.ts +14 -0
  19. package/dist/charts/calendar.d.ts.map +1 -0
  20. package/dist/charts/calendar.js +94 -0
  21. package/dist/charts/calendar.js.map +1 -0
  22. package/dist/charts/combo.d.ts +14 -0
  23. package/dist/charts/combo.d.ts.map +1 -0
  24. package/dist/charts/combo.js +163 -0
  25. package/dist/charts/combo.js.map +1 -0
  26. package/dist/charts/dumbbell.d.ts +17 -0
  27. package/dist/charts/dumbbell.d.ts.map +1 -0
  28. package/dist/charts/dumbbell.js +368 -0
  29. package/dist/charts/dumbbell.js.map +1 -0
  30. package/dist/charts/funnel.d.ts +14 -0
  31. package/dist/charts/funnel.d.ts.map +1 -0
  32. package/dist/charts/funnel.js +145 -0
  33. package/dist/charts/funnel.js.map +1 -0
  34. package/dist/charts/heatmap.d.ts +14 -0
  35. package/dist/charts/heatmap.d.ts.map +1 -0
  36. package/dist/charts/heatmap.js +202 -0
  37. package/dist/charts/heatmap.js.map +1 -0
  38. package/dist/charts/histogram.d.ts +14 -0
  39. package/dist/charts/histogram.d.ts.map +1 -0
  40. package/dist/charts/histogram.js +103 -0
  41. package/dist/charts/histogram.js.map +1 -0
  42. package/dist/charts/index.d.ts +40 -0
  43. package/dist/charts/index.d.ts.map +1 -0
  44. package/dist/charts/index.js +42 -0
  45. package/dist/charts/index.js.map +1 -0
  46. package/dist/charts/line.d.ts +14 -0
  47. package/dist/charts/line.d.ts.map +1 -0
  48. package/dist/charts/line.js +134 -0
  49. package/dist/charts/line.js.map +1 -0
  50. package/dist/charts/pie.d.ts +14 -0
  51. package/dist/charts/pie.d.ts.map +1 -0
  52. package/dist/charts/pie.js +75 -0
  53. package/dist/charts/pie.js.map +1 -0
  54. package/dist/charts/registry.d.ts +36 -0
  55. package/dist/charts/registry.d.ts.map +1 -0
  56. package/dist/charts/registry.js +55 -0
  57. package/dist/charts/registry.js.map +1 -0
  58. package/dist/charts/sankey.d.ts +14 -0
  59. package/dist/charts/sankey.d.ts.map +1 -0
  60. package/dist/charts/sankey.js +74 -0
  61. package/dist/charts/sankey.js.map +1 -0
  62. package/dist/charts/scatter.d.ts +14 -0
  63. package/dist/charts/scatter.d.ts.map +1 -0
  64. package/dist/charts/scatter.js +130 -0
  65. package/dist/charts/scatter.js.map +1 -0
  66. package/dist/charts/sparkline.d.ts +19 -0
  67. package/dist/charts/sparkline.d.ts.map +1 -0
  68. package/dist/charts/sparkline.js +154 -0
  69. package/dist/charts/sparkline.js.map +1 -0
  70. package/dist/charts/waterfall.d.ts +14 -0
  71. package/dist/charts/waterfall.d.ts.map +1 -0
  72. package/dist/charts/waterfall.js +232 -0
  73. package/dist/charts/waterfall.js.map +1 -0
  74. package/dist/charts/xmr.d.ts +14 -0
  75. package/dist/charts/xmr.d.ts.map +1 -0
  76. package/dist/charts/xmr.js +456 -0
  77. package/dist/charts/xmr.js.map +1 -0
  78. package/dist/cli.d.ts +12 -0
  79. package/dist/cli.d.ts.map +1 -0
  80. package/dist/cli.js +120 -0
  81. package/dist/cli.js.map +1 -0
  82. package/dist/components/alert.d.ts +10 -0
  83. package/dist/components/alert.d.ts.map +1 -0
  84. package/dist/components/alert.js +65 -0
  85. package/dist/components/alert.js.map +1 -0
  86. package/dist/components/big_value.d.ts +10 -0
  87. package/dist/components/big_value.d.ts.map +1 -0
  88. package/dist/components/big_value.js +78 -0
  89. package/dist/components/big_value.js.map +1 -0
  90. package/dist/components/delta.d.ts +10 -0
  91. package/dist/components/delta.d.ts.map +1 -0
  92. package/dist/components/delta.js +83 -0
  93. package/dist/components/delta.js.map +1 -0
  94. package/dist/components/empty_space.d.ts +10 -0
  95. package/dist/components/empty_space.d.ts.map +1 -0
  96. package/dist/components/empty_space.js +29 -0
  97. package/dist/components/empty_space.js.map +1 -0
  98. package/dist/components/index.d.ts +21 -0
  99. package/dist/components/index.d.ts.map +1 -0
  100. package/dist/components/index.js +23 -0
  101. package/dist/components/index.js.map +1 -0
  102. package/dist/components/note.d.ts +10 -0
  103. package/dist/components/note.d.ts.map +1 -0
  104. package/dist/components/note.js +66 -0
  105. package/dist/components/note.js.map +1 -0
  106. package/dist/components/registry.d.ts +24 -0
  107. package/dist/components/registry.d.ts.map +1 -0
  108. package/dist/components/registry.js +36 -0
  109. package/dist/components/registry.js.map +1 -0
  110. package/dist/components/table.d.ts +90 -0
  111. package/dist/components/table.d.ts.map +1 -0
  112. package/dist/components/table.js +610 -0
  113. package/dist/components/table.js.map +1 -0
  114. package/dist/components/text.d.ts +10 -0
  115. package/dist/components/text.d.ts.map +1 -0
  116. package/dist/components/text.js +46 -0
  117. package/dist/components/text.js.map +1 -0
  118. package/dist/components/textarea.d.ts +10 -0
  119. package/dist/components/textarea.d.ts.map +1 -0
  120. package/dist/components/textarea.js +79 -0
  121. package/dist/components/textarea.js.map +1 -0
  122. package/dist/core/colors.d.ts +45 -0
  123. package/dist/core/colors.d.ts.map +1 -0
  124. package/dist/core/colors.js +93 -0
  125. package/dist/core/colors.js.map +1 -0
  126. package/dist/core/css.d.ts +20 -0
  127. package/dist/core/css.d.ts.map +1 -0
  128. package/dist/core/css.js +97 -0
  129. package/dist/core/css.js.map +1 -0
  130. package/dist/core/exceptions.d.ts +59 -0
  131. package/dist/core/exceptions.d.ts.map +1 -0
  132. package/dist/core/exceptions.js +100 -0
  133. package/dist/core/exceptions.js.map +1 -0
  134. package/dist/core/formatting.d.ts +53 -0
  135. package/dist/core/formatting.d.ts.map +1 -0
  136. package/dist/core/formatting.js +491 -0
  137. package/dist/core/formatting.js.map +1 -0
  138. package/dist/core/index.d.ts +10 -0
  139. package/dist/core/index.d.ts.map +1 -0
  140. package/dist/core/index.js +10 -0
  141. package/dist/core/index.js.map +1 -0
  142. package/dist/core/serializer.d.ts +29 -0
  143. package/dist/core/serializer.d.ts.map +1 -0
  144. package/dist/core/serializer.js +84 -0
  145. package/dist/core/serializer.js.map +1 -0
  146. package/dist/core/themes.d.ts +138 -0
  147. package/dist/core/themes.d.ts.map +1 -0
  148. package/dist/core/themes.js +484 -0
  149. package/dist/core/themes.js.map +1 -0
  150. package/dist/core/version-check.d.ts +23 -0
  151. package/dist/core/version-check.d.ts.map +1 -0
  152. package/dist/core/version-check.js +163 -0
  153. package/dist/core/version-check.js.map +1 -0
  154. package/dist/generate_test_harness.d.ts +13 -0
  155. package/dist/generate_test_harness.d.ts.map +1 -0
  156. package/dist/generate_test_harness.js +35 -0
  157. package/dist/generate_test_harness.js.map +1 -0
  158. package/dist/index.d.ts +17 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +19 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/layout/converter.d.ts +22 -0
  163. package/dist/layout/converter.d.ts.map +1 -0
  164. package/dist/layout/converter.js +46 -0
  165. package/dist/layout/converter.js.map +1 -0
  166. package/dist/layout/csv.d.ts +15 -0
  167. package/dist/layout/csv.d.ts.map +1 -0
  168. package/dist/layout/csv.js +88 -0
  169. package/dist/layout/csv.js.map +1 -0
  170. package/dist/layout/dispatcher.d.ts +13 -0
  171. package/dist/layout/dispatcher.d.ts.map +1 -0
  172. package/dist/layout/dispatcher.js +47 -0
  173. package/dist/layout/dispatcher.js.map +1 -0
  174. package/dist/layout/index.d.ts +8 -0
  175. package/dist/layout/index.d.ts.map +1 -0
  176. package/dist/layout/index.js +8 -0
  177. package/dist/layout/index.js.map +1 -0
  178. package/dist/layout/parser.d.ts +19 -0
  179. package/dist/layout/parser.d.ts.map +1 -0
  180. package/dist/layout/parser.js +888 -0
  181. package/dist/layout/parser.js.map +1 -0
  182. package/dist/layout/templates.d.ts +32 -0
  183. package/dist/layout/templates.d.ts.map +1 -0
  184. package/dist/layout/templates.js +1016 -0
  185. package/dist/layout/templates.js.map +1 -0
  186. package/dist/types.d.ts +144 -0
  187. package/dist/types.d.ts.map +1 -0
  188. package/dist/types.js +5 -0
  189. package/dist/types.js.map +1 -0
  190. package/dist/vitest.config.d.ts +3 -0
  191. package/dist/vitest.config.d.ts.map +1 -0
  192. package/dist/vitest.config.js +14 -0
  193. package/dist/vitest.config.js.map +1 -0
  194. 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"}
@@ -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"}