@burdenoff/microfe-bigconsole 2026.613.2 → 2026.613.4

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 (53) hide show
  1. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +142 -135
  2. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  3. package/dist/bigconsole/components/dashboard/WidgetPalette.js +124 -120
  4. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  5. package/dist/bigconsole/components/widgets/PropertiesPanel.js +9 -9
  6. package/dist/bigconsole/components/widgets/WidgetRegistry.js +65 -8
  7. package/dist/bigconsole/components/widgets/WidgetRegistry.js.map +1 -1
  8. package/dist/bigconsole/components/widgets/WidgetTypeSelector.js +32 -27
  9. package/dist/bigconsole/components/widgets/WidgetTypeSelector.js.map +1 -1
  10. package/dist/bigconsole/components/widgets/WidgetWrapper.js +9 -9
  11. package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
  12. package/dist/bigconsole/components/widgets/chart/ChartWidget.js +123 -91
  13. package/dist/bigconsole/components/widgets/chart/ChartWidget.js.map +1 -1
  14. package/dist/bigconsole/components/widgets/chart/charts/AreaChart.js +40 -35
  15. package/dist/bigconsole/components/widgets/chart/charts/AreaChart.js.map +1 -1
  16. package/dist/bigconsole/components/widgets/chart/charts/BarChart.js +30 -25
  17. package/dist/bigconsole/components/widgets/chart/charts/BarChart.js.map +1 -1
  18. package/dist/bigconsole/components/widgets/chart/charts/ComboChart.js +139 -0
  19. package/dist/bigconsole/components/widgets/chart/charts/ComboChart.js.map +1 -0
  20. package/dist/bigconsole/components/widgets/chart/charts/LineChart.js +35 -30
  21. package/dist/bigconsole/components/widgets/chart/charts/LineChart.js.map +1 -1
  22. package/dist/bigconsole/components/widgets/chart/charts/ScatterChart.js +128 -0
  23. package/dist/bigconsole/components/widgets/chart/charts/ScatterChart.js.map +1 -0
  24. package/dist/bigconsole/components/widgets/chart/charts/WaterfallChart.js +111 -0
  25. package/dist/bigconsole/components/widgets/chart/charts/WaterfallChart.js.map +1 -0
  26. package/dist/bigconsole/components/widgets/chart/charts/index.js +4 -0
  27. package/dist/bigconsole/components/widgets/chart/charts/referenceElements.js +49 -0
  28. package/dist/bigconsole/components/widgets/chart/charts/referenceElements.js.map +1 -0
  29. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js +72 -68
  30. package/dist/bigconsole/components/widgets/kpi-comparison/KPIComparisonWidget.js.map +1 -1
  31. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js +74 -24
  32. package/dist/bigconsole/components/widgets/map-widget/MapWidget.js.map +1 -1
  33. package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js +87 -86
  34. package/dist/bigconsole/components/widgets/metric-card/MetricCardWidget.js.map +1 -1
  35. package/dist/bigconsole/components/widgets/table/TableCell.js +55 -26
  36. package/dist/bigconsole/components/widgets/table/TableCell.js.map +1 -1
  37. package/dist/bigconsole/components/widgets/table/TableHeader.js +25 -18
  38. package/dist/bigconsole/components/widgets/table/TableHeader.js.map +1 -1
  39. package/dist/bigconsole/components/widgets/table/TableWidget.js +255 -107
  40. package/dist/bigconsole/components/widgets/table/TableWidget.js.map +1 -1
  41. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js +91 -0
  42. package/dist/bigconsole/components/widgets/utils/conditionalFormat.js.map +1 -0
  43. package/dist/bigconsole/hooks/index.js +2 -0
  44. package/dist/bigconsole/hooks/useDashboardImageExport.js +1 -0
  45. package/dist/bigconsole/hooks/useWidgetCatalog.js +82 -0
  46. package/dist/bigconsole/hooks/useWidgetCatalog.js.map +1 -0
  47. package/dist/bigconsole/pages/DashboardBuilderPage.js +172 -163
  48. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  49. package/dist/bigconsole/utils/widgetTypeMapping.js +1 -0
  50. package/dist/bigconsole/utils/widgetTypeMapping.js.map +1 -1
  51. package/dist/generated/wspace-operations.js +17 -17
  52. package/dist/generated/wspace-operations.js.map +1 -1
  53. package/package.json +1 -1
@@ -1,24 +1,25 @@
1
1
  import e from "../ChartTooltip.js";
2
- import { memo as t, useMemo as n } from "react";
3
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
- import { CartesianGrid as a, Legend as o, Line as s, LineChart as c, ResponsiveContainer as l, Tooltip as u, XAxis as d, YAxis as f } from "recharts";
2
+ import { buildReferenceElements as t } from "./referenceElements.js";
3
+ import { memo as n, useMemo as r } from "react";
4
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ import { CartesianGrid as o, Legend as s, Line as c, LineChart as l, ResponsiveContainer as u, Tooltip as d, XAxis as f, YAxis as p } from "recharts";
5
6
  //#region src/bigconsole/components/widgets/chart/charts/LineChart.tsx
6
- var p = [
7
+ var m = [
7
8
  "var(--color-chart-1)",
8
9
  "var(--color-chart-2)",
9
10
  "var(--color-chart-3)",
10
11
  "var(--color-chart-4)",
11
12
  "var(--color-chart-5)"
12
- ], m = t(function({ data: t = [], config: m, hiddenSeries: h = [], onDataClick: g }) {
13
- let _ = n(() => t?.length ? Object.keys(t[0]).filter((e) => e !== m.xAxisKey && typeof t[0][e] == "number") : [], [t, m.xAxisKey]), v = (e) => typeof e == "number" ? new Intl.NumberFormat("en-US", {
13
+ ], h = n(function({ data: n = [], config: h, hiddenSeries: g = [], onDataClick: _ }) {
14
+ let v = r(() => n?.length ? Object.keys(n[0]).filter((e) => e !== h.xAxisKey && typeof n[0][e] == "number") : [], [n, h.xAxisKey]), y = (e) => typeof e == "number" ? new Intl.NumberFormat("en-US", {
14
15
  notation: e >= 1e4 ? "compact" : "standard",
15
16
  maximumFractionDigits: 2
16
17
  }).format(e) : String(e);
17
- return t?.length ? /* @__PURE__ */ r(l, {
18
+ return n?.length ? /* @__PURE__ */ i(u, {
18
19
  width: "100%",
19
20
  height: "100%",
20
- children: /* @__PURE__ */ i(c, {
21
- data: t,
21
+ children: /* @__PURE__ */ a(l, {
22
+ data: n,
22
23
  margin: {
23
24
  top: 10,
24
25
  right: 10,
@@ -26,64 +27,68 @@ var p = [
26
27
  bottom: 0
27
28
  },
28
29
  onClick: (e) => {
29
- e?.activePayload?.[0] && g && g(e.activePayload[0].payload, e.activeTooltipIndex || 0);
30
+ e?.activePayload?.[0] && _ && _(e.activePayload[0].payload, e.activeTooltipIndex || 0);
30
31
  },
31
32
  children: [
32
- m.showGrid !== !1 && /* @__PURE__ */ r(a, {
33
+ h.showGrid !== !1 && /* @__PURE__ */ i(o, {
33
34
  strokeDasharray: "3 3",
34
35
  stroke: "var(--color-border-default)",
35
36
  opacity: .5
36
37
  }),
37
- /* @__PURE__ */ r(d, {
38
- dataKey: m.xAxisKey || "name",
38
+ /* @__PURE__ */ i(f, {
39
+ dataKey: h.xAxisKey || "name",
39
40
  tick: {
40
41
  fill: "var(--color-text-secondary)",
41
42
  fontSize: 12
42
43
  },
43
44
  tickLine: { stroke: "var(--color-border-default)" },
44
45
  axisLine: { stroke: "var(--color-border-default)" },
45
- label: m.xAxisLabel ? {
46
- value: m.xAxisLabel,
46
+ label: h.xAxisLabel ? {
47
+ value: h.xAxisLabel,
47
48
  position: "insideBottom",
48
49
  offset: -5,
49
50
  fill: "var(--color-text-secondary)"
50
51
  } : void 0
51
52
  }),
52
- /* @__PURE__ */ r(f, {
53
+ /* @__PURE__ */ i(p, {
53
54
  tick: {
54
55
  fill: "var(--color-text-secondary)",
55
56
  fontSize: 12
56
57
  },
57
58
  tickLine: { stroke: "var(--color-border-default)" },
58
59
  axisLine: { stroke: "var(--color-border-default)" },
59
- tickFormatter: v,
60
- label: m.yAxisLabel ? {
61
- value: m.yAxisLabel,
60
+ tickFormatter: y,
61
+ scale: h.logScale ? "log" : "auto",
62
+ domain: h.logScale ? ["auto", "auto"] : void 0,
63
+ allowDataOverflow: h.logScale || void 0,
64
+ label: h.yAxisLabel ? {
65
+ value: h.yAxisLabel,
62
66
  angle: -90,
63
67
  position: "insideLeft",
64
68
  fill: "var(--color-text-secondary)"
65
69
  } : void 0
66
70
  }),
67
- /* @__PURE__ */ r(u, {
68
- content: /* @__PURE__ */ r(e, { valueFormatter: v }),
71
+ /* @__PURE__ */ i(d, {
72
+ content: /* @__PURE__ */ i(e, { valueFormatter: y }),
69
73
  cursor: { stroke: "var(--color-border-default)" }
70
74
  }),
71
- m.showLegend !== !1 && /* @__PURE__ */ r(o, {
75
+ h.showLegend !== !1 && /* @__PURE__ */ i(s, {
72
76
  wrapperStyle: { paddingTop: 20 },
73
- formatter: (e) => /* @__PURE__ */ r("span", {
77
+ formatter: (e) => /* @__PURE__ */ i("span", {
74
78
  style: { color: "var(--color-text-primary)" },
75
79
  children: e
76
80
  })
77
81
  }),
78
- _.map((e, t) => /* @__PURE__ */ r(s, {
79
- type: m.curveType || "monotone",
82
+ t(h.referenceLines),
83
+ v.map((e, t) => /* @__PURE__ */ i(c, {
84
+ type: h.curveType || "monotone",
80
85
  dataKey: e,
81
- name: m.seriesNames?.[e] || e,
82
- stroke: m.colors?.[t] || p[t % p.length],
86
+ name: h.seriesNames?.[e] || e,
87
+ stroke: h.colors?.[t] || m[t % m.length],
83
88
  strokeWidth: 2,
84
- dot: m.showDots !== !1,
89
+ dot: h.showDots !== !1,
85
90
  activeDot: { r: 6 },
86
- hide: h.includes(e),
91
+ hide: g.includes(e),
87
92
  connectNulls: !0
88
93
  }, e))
89
94
  ]
@@ -91,6 +96,6 @@ var p = [
91
96
  }) : null;
92
97
  });
93
98
  //#endregion
94
- export { m as default };
99
+ export { h as default };
95
100
 
96
101
  //# sourceMappingURL=LineChart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LineChart.js","names":[],"sources":["../../../../../../src/bigconsole/components/widgets/chart/charts/LineChart.tsx"],"sourcesContent":["/**\n * LineChart Component\n *\n * Line chart using Recharts.\n */\n\nimport { type FC, memo, useMemo } from 'react';\nimport {\n LineChart as RechartsLineChart,\n Line,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n Legend,\n} from 'recharts';\nimport { ChartTooltip } from '../ChartTooltip';\nimport type { ChartConfig, ChartData } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LineChartProps {\n /** Chart data */\n data: ChartData[];\n /** Chart configuration */\n config: ChartConfig;\n /** Series to hide */\n hiddenSeries?: string[];\n /** Click handler for data points */\n onDataClick?: (data: ChartData, index: number) => void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const LineChart: FC<LineChartProps> = memo(function LineChart({\n data = [],\n config,\n hiddenSeries = [],\n onDataClick,\n}) {\n // Extract data keys (series)\n const dataKeys = useMemo(() => {\n if (!data?.length) return [];\n const keys = Object.keys(data[0]).filter((key) => key !== config.xAxisKey && typeof data[0][key] === 'number');\n return keys;\n }, [data, config.xAxisKey]);\n\n // Format value\n const formatValue = (value: number | string): string => {\n if (typeof value !== 'number') return String(value);\n return new Intl.NumberFormat('en-US', {\n notation: value >= 10000 ? 'compact' : 'standard',\n maximumFractionDigits: 2,\n }).format(value);\n };\n\n if (!data?.length) {\n return null;\n }\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsLineChart\n data={data}\n margin={{ top: 10, right: 10, left: 0, bottom: 0 }}\n onClick={(e) => {\n if (e?.activePayload?.[0] && onDataClick) {\n onDataClick(e.activePayload[0].payload, e.activeTooltipIndex || 0);\n }\n }}\n >\n {config.showGrid !== false && (\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border-default)\" opacity={0.5} />\n )}\n\n <XAxis\n dataKey={config.xAxisKey || 'name'}\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n label={\n config.xAxisLabel\n ? {\n value: config.xAxisLabel,\n position: 'insideBottom',\n offset: -5,\n fill: 'var(--color-text-secondary)',\n }\n : undefined\n }\n />\n\n <YAxis\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n tickFormatter={formatValue}\n label={\n config.yAxisLabel\n ? {\n value: config.yAxisLabel,\n angle: -90,\n position: 'insideLeft',\n fill: 'var(--color-text-secondary)',\n }\n : undefined\n }\n />\n\n <Tooltip\n content={<ChartTooltip valueFormatter={formatValue} />}\n cursor={{ stroke: 'var(--color-border-default)' }}\n />\n\n {config.showLegend !== false && (\n <Legend\n wrapperStyle={{ paddingTop: 20 }}\n formatter={(value) => <span style={{ color: 'var(--color-text-primary)' }}>{value}</span>}\n />\n )}\n\n {dataKeys.map((key, index) => (\n <Line\n key={key}\n type={config.curveType || 'monotone'}\n dataKey={key}\n name={config.seriesNames?.[key] || key}\n stroke={config.colors?.[index] || DEFAULT_COLORS[index % DEFAULT_COLORS.length]}\n strokeWidth={2}\n dot={config.showDots !== false}\n activeDot={{ r: 6 }}\n hide={hiddenSeries.includes(key)}\n connectNulls\n />\n ))}\n </RechartsLineChart>\n </ResponsiveContainer>\n );\n});\n\nexport default LineChart;\n"],"mappings":";;;;;AAuCA,IAAM,IAAiB;CACrB;CACA;CACA;CACA;CACA;CACD,EAMY,IAAgC,EAAK,SAAmB,EACnE,UAAO,EAAE,EACT,WACA,kBAAe,EAAE,EACjB,kBACC;CAED,IAAM,IAAW,QACV,GAAM,SACE,OAAO,KAAK,EAAK,GAAG,CAAC,QAAQ,MAAQ,MAAQ,EAAO,YAAY,OAAO,EAAK,GAAG,MAAS,SAAS,GADpF,EAAE,EAG3B,CAAC,GAAM,EAAO,SAAS,CAAC,EAGrB,KAAe,MACf,OAAO,KAAU,WACd,IAAI,KAAK,aAAa,SAAS;EACpC,UAAU,KAAS,MAAQ,YAAY;EACvC,uBAAuB;EACxB,CAAC,CAAC,OAAO,EAAM,GAJsB,OAAO,EAAM;AAWrD,QAJK,GAAM,SAKT,kBAAC,GAAD;EAAqB,OAAM;EAAO,QAAO;YACvC,kBAAC,GAAD;GACQ;GACN,QAAQ;IAAE,KAAK;IAAI,OAAO;IAAI,MAAM;IAAG,QAAQ;IAAG;GAClD,UAAU,MAAM;AACd,IAAI,GAAG,gBAAgB,MAAM,KAC3B,EAAY,EAAE,cAAc,GAAG,SAAS,EAAE,sBAAsB,EAAE;;aALxE;IASG,EAAO,aAAa,MACnB,kBAAC,GAAD;KAAe,iBAAgB;KAAM,QAAO;KAA8B,SAAS;KAAO,CAAA;IAG5F,kBAAC,GAAD;KACE,SAAS,EAAO,YAAY;KAC5B,MAAM;MAAE,MAAM;MAA+B,UAAU;MAAI;KAC3D,UAAU,EAAE,QAAQ,+BAA+B;KACnD,UAAU,EAAE,QAAQ,+BAA+B;KACnD,OACE,EAAO,aACH;MACE,OAAO,EAAO;MACd,UAAU;MACV,QAAQ;MACR,MAAM;MACP,GACD,KAAA;KAEN,CAAA;IAEF,kBAAC,GAAD;KACE,MAAM;MAAE,MAAM;MAA+B,UAAU;MAAI;KAC3D,UAAU,EAAE,QAAQ,+BAA+B;KACnD,UAAU,EAAE,QAAQ,+BAA+B;KACnD,eAAe;KACf,OACE,EAAO,aACH;MACE,OAAO,EAAO;MACd,OAAO;MACP,UAAU;MACV,MAAM;MACP,GACD,KAAA;KAEN,CAAA;IAEF,kBAAC,GAAD;KACE,SAAS,kBAAC,GAAD,EAAc,gBAAgB,GAAe,CAAA;KACtD,QAAQ,EAAE,QAAQ,+BAA+B;KACjD,CAAA;IAED,EAAO,eAAe,MACrB,kBAAC,GAAD;KACE,cAAc,EAAE,YAAY,IAAI;KAChC,YAAY,MAAU,kBAAC,QAAD;MAAM,OAAO,EAAE,OAAO,6BAA6B;gBAAG;MAAa,CAAA;KACzF,CAAA;IAGH,EAAS,KAAK,GAAK,MAClB,kBAAC,GAAD;KAEE,MAAM,EAAO,aAAa;KAC1B,SAAS;KACT,MAAM,EAAO,cAAc,MAAQ;KACnC,QAAQ,EAAO,SAAS,MAAU,EAAe,IAAQ,EAAe;KACxE,aAAa;KACb,KAAK,EAAO,aAAa;KACzB,WAAW,EAAE,GAAG,GAAG;KACnB,MAAM,EAAa,SAAS,EAAI;KAChC,cAAA;KACA,EAVK,EAUL,CACF;IACgB;;EACA,CAAA,GA/Ef;EAiFT"}
1
+ {"version":3,"file":"LineChart.js","names":[],"sources":["../../../../../../src/bigconsole/components/widgets/chart/charts/LineChart.tsx"],"sourcesContent":["/**\n * LineChart Component\n *\n * Line chart using Recharts.\n */\n\nimport { type FC, memo, useMemo } from 'react';\nimport {\n LineChart as RechartsLineChart,\n Line,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n Legend,\n} from 'recharts';\nimport { ChartTooltip } from '../ChartTooltip';\nimport type { ChartConfig, ChartData } from './types';\nimport { buildReferenceElements } from './referenceElements';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LineChartProps {\n /** Chart data */\n data: ChartData[];\n /** Chart configuration */\n config: ChartConfig;\n /** Series to hide */\n hiddenSeries?: string[];\n /** Click handler for data points */\n onDataClick?: (data: ChartData, index: number) => void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const LineChart: FC<LineChartProps> = memo(function LineChart({\n data = [],\n config,\n hiddenSeries = [],\n onDataClick,\n}) {\n // Extract data keys (series)\n const dataKeys = useMemo(() => {\n if (!data?.length) return [];\n const keys = Object.keys(data[0]).filter((key) => key !== config.xAxisKey && typeof data[0][key] === 'number');\n return keys;\n }, [data, config.xAxisKey]);\n\n // Format value\n const formatValue = (value: number | string): string => {\n if (typeof value !== 'number') return String(value);\n return new Intl.NumberFormat('en-US', {\n notation: value >= 10000 ? 'compact' : 'standard',\n maximumFractionDigits: 2,\n }).format(value);\n };\n\n if (!data?.length) {\n return null;\n }\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsLineChart\n data={data}\n margin={{ top: 10, right: 10, left: 0, bottom: 0 }}\n onClick={(e) => {\n if (e?.activePayload?.[0] && onDataClick) {\n onDataClick(e.activePayload[0].payload, e.activeTooltipIndex || 0);\n }\n }}\n >\n {config.showGrid !== false && (\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border-default)\" opacity={0.5} />\n )}\n\n <XAxis\n dataKey={config.xAxisKey || 'name'}\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n label={\n config.xAxisLabel\n ? {\n value: config.xAxisLabel,\n position: 'insideBottom',\n offset: -5,\n fill: 'var(--color-text-secondary)',\n }\n : undefined\n }\n />\n\n <YAxis\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n tickFormatter={formatValue}\n scale={config.logScale ? 'log' : 'auto'}\n domain={config.logScale ? ['auto', 'auto'] : undefined}\n allowDataOverflow={config.logScale || undefined}\n label={\n config.yAxisLabel\n ? {\n value: config.yAxisLabel,\n angle: -90,\n position: 'insideLeft',\n fill: 'var(--color-text-secondary)',\n }\n : undefined\n }\n />\n\n <Tooltip\n content={<ChartTooltip valueFormatter={formatValue} />}\n cursor={{ stroke: 'var(--color-border-default)' }}\n />\n\n {config.showLegend !== false && (\n <Legend\n wrapperStyle={{ paddingTop: 20 }}\n formatter={(value) => <span style={{ color: 'var(--color-text-primary)' }}>{value}</span>}\n />\n )}\n\n {buildReferenceElements(config.referenceLines)}\n\n {dataKeys.map((key, index) => (\n <Line\n key={key}\n type={config.curveType || 'monotone'}\n dataKey={key}\n name={config.seriesNames?.[key] || key}\n stroke={config.colors?.[index] || DEFAULT_COLORS[index % DEFAULT_COLORS.length]}\n strokeWidth={2}\n dot={config.showDots !== false}\n activeDot={{ r: 6 }}\n hide={hiddenSeries.includes(key)}\n connectNulls\n />\n ))}\n </RechartsLineChart>\n </ResponsiveContainer>\n );\n});\n\nexport default LineChart;\n"],"mappings":";;;;;;AAwCA,IAAM,IAAiB;CACrB;CACA;CACA;CACA;CACA;CACD,EAMY,IAAgC,EAAK,SAAmB,EACnE,UAAO,EAAE,EACT,WACA,kBAAe,EAAE,EACjB,kBACC;CAED,IAAM,IAAW,QACV,GAAM,SACE,OAAO,KAAK,EAAK,GAAG,CAAC,QAAQ,MAAQ,MAAQ,EAAO,YAAY,OAAO,EAAK,GAAG,MAAS,SAAS,GADpF,EAAE,EAG3B,CAAC,GAAM,EAAO,SAAS,CAAC,EAGrB,KAAe,MACf,OAAO,KAAU,WACd,IAAI,KAAK,aAAa,SAAS;EACpC,UAAU,KAAS,MAAQ,YAAY;EACvC,uBAAuB;EACxB,CAAC,CAAC,OAAO,EAAM,GAJsB,OAAO,EAAM;AAWrD,QAJK,GAAM,SAKT,kBAAC,GAAD;EAAqB,OAAM;EAAO,QAAO;YACvC,kBAAC,GAAD;GACQ;GACN,QAAQ;IAAE,KAAK;IAAI,OAAO;IAAI,MAAM;IAAG,QAAQ;IAAG;GAClD,UAAU,MAAM;AACd,IAAI,GAAG,gBAAgB,MAAM,KAC3B,EAAY,EAAE,cAAc,GAAG,SAAS,EAAE,sBAAsB,EAAE;;aALxE;IASG,EAAO,aAAa,MACnB,kBAAC,GAAD;KAAe,iBAAgB;KAAM,QAAO;KAA8B,SAAS;KAAO,CAAA;IAG5F,kBAAC,GAAD;KACE,SAAS,EAAO,YAAY;KAC5B,MAAM;MAAE,MAAM;MAA+B,UAAU;MAAI;KAC3D,UAAU,EAAE,QAAQ,+BAA+B;KACnD,UAAU,EAAE,QAAQ,+BAA+B;KACnD,OACE,EAAO,aACH;MACE,OAAO,EAAO;MACd,UAAU;MACV,QAAQ;MACR,MAAM;MACP,GACD,KAAA;KAEN,CAAA;IAEF,kBAAC,GAAD;KACE,MAAM;MAAE,MAAM;MAA+B,UAAU;MAAI;KAC3D,UAAU,EAAE,QAAQ,+BAA+B;KACnD,UAAU,EAAE,QAAQ,+BAA+B;KACnD,eAAe;KACf,OAAO,EAAO,WAAW,QAAQ;KACjC,QAAQ,EAAO,WAAW,CAAC,QAAQ,OAAO,GAAG,KAAA;KAC7C,mBAAmB,EAAO,YAAY,KAAA;KACtC,OACE,EAAO,aACH;MACE,OAAO,EAAO;MACd,OAAO;MACP,UAAU;MACV,MAAM;MACP,GACD,KAAA;KAEN,CAAA;IAEF,kBAAC,GAAD;KACE,SAAS,kBAAC,GAAD,EAAc,gBAAgB,GAAe,CAAA;KACtD,QAAQ,EAAE,QAAQ,+BAA+B;KACjD,CAAA;IAED,EAAO,eAAe,MACrB,kBAAC,GAAD;KACE,cAAc,EAAE,YAAY,IAAI;KAChC,YAAY,MAAU,kBAAC,QAAD;MAAM,OAAO,EAAE,OAAO,6BAA6B;gBAAG;MAAa,CAAA;KACzF,CAAA;IAGH,EAAuB,EAAO,eAAe;IAE7C,EAAS,KAAK,GAAK,MAClB,kBAAC,GAAD;KAEE,MAAM,EAAO,aAAa;KAC1B,SAAS;KACT,MAAM,EAAO,cAAc,MAAQ;KACnC,QAAQ,EAAO,SAAS,MAAU,EAAe,IAAQ,EAAe;KACxE,aAAa;KACb,KAAK,EAAO,aAAa;KACzB,WAAW,EAAE,GAAG,GAAG;KACnB,MAAM,EAAa,SAAS,EAAI;KAChC,cAAA;KACA,EAVK,EAUL,CACF;IACgB;;EACA,CAAA,GApFf;EAsFT"}
@@ -0,0 +1,128 @@
1
+ import e from "../ChartTooltip.js";
2
+ import { buildReferenceElements as t } from "./referenceElements.js";
3
+ import { memo as n, useMemo as r } from "react";
4
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ import { CartesianGrid as o, Legend as s, ResponsiveContainer as c, Scatter as l, ScatterChart as u, Tooltip as d, XAxis as f, YAxis as p, ZAxis as m } from "recharts";
6
+ //#region src/bigconsole/components/widgets/chart/charts/ScatterChart.tsx
7
+ var h = [
8
+ "var(--color-chart-1)",
9
+ "var(--color-chart-2)",
10
+ "var(--color-chart-3)",
11
+ "var(--color-chart-4)",
12
+ "var(--color-chart-5)"
13
+ ], g = n(function({ data: n = [], config: g, onDataClick: _ }) {
14
+ let { xKey: v, yKey: y } = r(() => {
15
+ if (g.xField && g.yField) return {
16
+ xKey: g.xField,
17
+ yKey: g.yField
18
+ };
19
+ let e = n.length ? Object.keys(n[0]).filter((e) => typeof n[0][e] == "number") : [];
20
+ return {
21
+ xKey: g.xField || e[0] || "x",
22
+ yKey: g.yField || e[1] || "y"
23
+ };
24
+ }, [
25
+ g.xField,
26
+ g.yField,
27
+ n
28
+ ]), b = g.sizeField, x = g.colorField, S = r(() => {
29
+ if (!x) return [{
30
+ name: g.seriesNames?.[y] || y,
31
+ points: n
32
+ }];
33
+ let e = /* @__PURE__ */ new Map();
34
+ for (let t of n) {
35
+ let n = String(t[x] ?? "—");
36
+ e.has(n) || e.set(n, []), e.get(n).push(t);
37
+ }
38
+ return Array.from(e.entries()).map(([e, t]) => ({
39
+ name: e,
40
+ points: t
41
+ }));
42
+ }, [
43
+ n,
44
+ x,
45
+ y,
46
+ g.seriesNames
47
+ ]), C = (e) => typeof e == "number" ? new Intl.NumberFormat("en-US", {
48
+ notation: Math.abs(e) >= 1e4 ? "compact" : "standard",
49
+ maximumFractionDigits: 2
50
+ }).format(e) : String(e);
51
+ return n?.length ? /* @__PURE__ */ i(c, {
52
+ width: "100%",
53
+ height: "100%",
54
+ children: /* @__PURE__ */ a(u, {
55
+ margin: {
56
+ top: 10,
57
+ right: 10,
58
+ left: 0,
59
+ bottom: 0
60
+ },
61
+ children: [
62
+ g.showGrid !== !1 && /* @__PURE__ */ i(o, {
63
+ strokeDasharray: "3 3",
64
+ stroke: "var(--color-border-default)",
65
+ opacity: .5
66
+ }),
67
+ /* @__PURE__ */ i(f, {
68
+ type: "number",
69
+ dataKey: v,
70
+ name: g.xAxisLabel || v,
71
+ tick: {
72
+ fill: "var(--color-text-secondary)",
73
+ fontSize: 12
74
+ },
75
+ tickLine: { stroke: "var(--color-border-default)" },
76
+ axisLine: { stroke: "var(--color-border-default)" },
77
+ tickFormatter: C,
78
+ scale: g.logScale ? "log" : "auto",
79
+ domain: g.logScale ? ["auto", "auto"] : void 0
80
+ }),
81
+ /* @__PURE__ */ i(p, {
82
+ type: "number",
83
+ dataKey: y,
84
+ name: g.yAxisLabel || y,
85
+ tick: {
86
+ fill: "var(--color-text-secondary)",
87
+ fontSize: 12
88
+ },
89
+ tickLine: { stroke: "var(--color-border-default)" },
90
+ axisLine: { stroke: "var(--color-border-default)" },
91
+ tickFormatter: C,
92
+ scale: g.logScale ? "log" : "auto",
93
+ domain: g.logScale ? ["auto", "auto"] : void 0
94
+ }),
95
+ b && /* @__PURE__ */ i(m, {
96
+ type: "number",
97
+ dataKey: b,
98
+ range: [40, 400],
99
+ name: b
100
+ }),
101
+ /* @__PURE__ */ i(d, {
102
+ content: /* @__PURE__ */ i(e, { valueFormatter: C }),
103
+ cursor: {
104
+ strokeDasharray: "3 3",
105
+ stroke: "var(--color-border-default)"
106
+ }
107
+ }),
108
+ S.length > 1 && g.showLegend !== !1 && /* @__PURE__ */ i(s, { formatter: (e) => /* @__PURE__ */ i("span", {
109
+ style: { color: "var(--color-text-primary)" },
110
+ children: e
111
+ }) }),
112
+ t(g.referenceLines),
113
+ S.map((e, t) => /* @__PURE__ */ i(l, {
114
+ name: e.name,
115
+ data: e.points,
116
+ fill: g.colors?.[t] || h[t % h.length],
117
+ onClick: (e) => {
118
+ _ && e?.payload && _(e.payload, 0);
119
+ }
120
+ }, e.name))
121
+ ]
122
+ })
123
+ }) : null;
124
+ });
125
+ //#endregion
126
+ export { g as default };
127
+
128
+ //# sourceMappingURL=ScatterChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScatterChart.js","names":[],"sources":["../../../../../../src/bigconsole/components/widgets/chart/charts/ScatterChart.tsx"],"sourcesContent":["/**\n * ScatterChart Component\n *\n * Scatter / bubble chart using Recharts `ScatterChart`. Plots `xField` vs\n * `yField`; an optional `sizeField` drives bubble radius (ZAxis) and an\n * optional `colorField` splits points into colored groups.\n */\n\nimport { type FC, memo, useMemo } from 'react';\nimport {\n ScatterChart as RechartsScatterChart,\n Scatter,\n XAxis,\n YAxis,\n ZAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n Legend,\n} from 'recharts';\nimport { ChartTooltip } from '../ChartTooltip';\nimport type { ChartConfig, ChartData } from './types';\nimport { buildReferenceElements } from './referenceElements';\n\nexport interface ScatterChartProps {\n data: ChartData[];\n config: ChartConfig;\n hiddenSeries?: string[];\n onDataClick?: (data: ChartData, index: number) => void;\n}\n\nconst DEFAULT_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n];\n\nexport const ScatterChart: FC<ScatterChartProps> = memo(function ScatterChart({ data = [], config, onDataClick }) {\n // Resolve axis fields, falling back to the first two numeric fields.\n const { xKey, yKey } = useMemo(() => {\n if (config.xField && config.yField) return { xKey: config.xField, yKey: config.yField };\n const numeric = data.length ? Object.keys(data[0]).filter((k) => typeof data[0][k] === 'number') : [];\n return { xKey: config.xField || numeric[0] || 'x', yKey: config.yField || numeric[1] || 'y' };\n }, [config.xField, config.yField, data]);\n\n const sizeKey = config.sizeField;\n const colorKey = config.colorField;\n\n // Group points by colorField (single group when absent).\n const groups = useMemo(() => {\n if (!colorKey) return [{ name: config.seriesNames?.[yKey] || yKey, points: data }];\n const map = new Map<string, ChartData[]>();\n for (const row of data) {\n const key = String(row[colorKey] ?? '—');\n if (!map.has(key)) map.set(key, []);\n map.get(key)!.push(row);\n }\n return Array.from(map.entries()).map(([name, points]) => ({ name, points }));\n }, [data, colorKey, yKey, config.seriesNames]);\n\n const formatValue = (value: number | string): string => {\n if (typeof value !== 'number') return String(value);\n return new Intl.NumberFormat('en-US', {\n notation: Math.abs(value) >= 10000 ? 'compact' : 'standard',\n maximumFractionDigits: 2,\n }).format(value);\n };\n\n if (!data?.length) return null;\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsScatterChart margin={{ top: 10, right: 10, left: 0, bottom: 0 }}>\n {config.showGrid !== false && (\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border-default)\" opacity={0.5} />\n )}\n <XAxis\n type=\"number\"\n dataKey={xKey}\n name={config.xAxisLabel || xKey}\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n tickFormatter={formatValue}\n scale={config.logScale ? 'log' : 'auto'}\n domain={config.logScale ? ['auto', 'auto'] : undefined}\n />\n <YAxis\n type=\"number\"\n dataKey={yKey}\n name={config.yAxisLabel || yKey}\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n tickFormatter={formatValue}\n scale={config.logScale ? 'log' : 'auto'}\n domain={config.logScale ? ['auto', 'auto'] : undefined}\n />\n {sizeKey && <ZAxis type=\"number\" dataKey={sizeKey} range={[40, 400]} name={sizeKey} />}\n <Tooltip\n content={<ChartTooltip valueFormatter={formatValue} />}\n cursor={{ strokeDasharray: '3 3', stroke: 'var(--color-border-default)' }}\n />\n {groups.length > 1 && config.showLegend !== false && (\n <Legend formatter={(value) => <span style={{ color: 'var(--color-text-primary)' }}>{value}</span>} />\n )}\n {buildReferenceElements(config.referenceLines)}\n {groups.map((g, i) => (\n <Scatter\n key={g.name}\n name={g.name}\n data={g.points}\n fill={config.colors?.[i] || DEFAULT_COLORS[i % DEFAULT_COLORS.length]}\n onClick={(point) => {\n if (onDataClick && point?.payload) onDataClick(point.payload as ChartData, 0);\n }}\n />\n ))}\n </RechartsScatterChart>\n </ResponsiveContainer>\n );\n});\n\nexport default ScatterChart;\n"],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import e from "../ChartTooltip.js";
2
+ import { buildReferenceElements as t } from "./referenceElements.js";
3
+ import { memo as n, useMemo as r } from "react";
4
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ import { Bar as o, BarChart as s, CartesianGrid as c, Cell as l, ResponsiveContainer as u, Tooltip as d, XAxis as f, YAxis as p } from "recharts";
6
+ //#region src/bigconsole/components/widgets/chart/charts/WaterfallChart.tsx
7
+ var m = "var(--color-status-success)", h = "var(--color-status-error)", g = "var(--color-chart-1)", _ = n(function({ data: n = [], config: _, onDataClick: v }) {
8
+ let y = _.labelField || _.xAxisKey || "name", b = _.valueField || "value", x = r(() => {
9
+ if (!n.length) return [];
10
+ let e = 0, t = n.map((t) => {
11
+ let n = typeof t[b] == "number" ? t[b] : Number(t[b]) || 0, r = n >= 0 ? e : e + n;
12
+ return e += n, {
13
+ name: String(t[y] ?? ""),
14
+ base: r,
15
+ delta: Math.abs(n),
16
+ cumulative: e,
17
+ isTotal: !1,
18
+ sign: n >= 0 ? "up" : "down"
19
+ };
20
+ });
21
+ return _.showTotal && t.push({
22
+ name: _.totalLabel || "Total",
23
+ base: 0,
24
+ delta: e,
25
+ cumulative: e,
26
+ isTotal: !0,
27
+ sign: "total"
28
+ }), t;
29
+ }, [
30
+ n,
31
+ y,
32
+ b,
33
+ _.showTotal,
34
+ _.totalLabel
35
+ ]), S = (e) => typeof e == "number" ? new Intl.NumberFormat("en-US", {
36
+ notation: Math.abs(e) >= 1e4 ? "compact" : "standard",
37
+ maximumFractionDigits: 2
38
+ }).format(e) : String(e);
39
+ return x.length ? /* @__PURE__ */ i(u, {
40
+ width: "100%",
41
+ height: "100%",
42
+ children: /* @__PURE__ */ a(s, {
43
+ data: x,
44
+ margin: {
45
+ top: 10,
46
+ right: 10,
47
+ left: 0,
48
+ bottom: 0
49
+ },
50
+ onClick: (e) => {
51
+ e?.activePayload?.[0] && v && v(e.activePayload[0].payload, e.activeTooltipIndex || 0);
52
+ },
53
+ children: [
54
+ _.showGrid !== !1 && /* @__PURE__ */ i(c, {
55
+ strokeDasharray: "3 3",
56
+ stroke: "var(--color-border-default)",
57
+ opacity: .5,
58
+ vertical: !1
59
+ }),
60
+ /* @__PURE__ */ i(f, {
61
+ dataKey: "name",
62
+ tick: {
63
+ fill: "var(--color-text-secondary)",
64
+ fontSize: 12
65
+ },
66
+ tickLine: { stroke: "var(--color-border-default)" },
67
+ axisLine: { stroke: "var(--color-border-default)" }
68
+ }),
69
+ /* @__PURE__ */ i(p, {
70
+ tick: {
71
+ fill: "var(--color-text-secondary)",
72
+ fontSize: 12
73
+ },
74
+ tickLine: { stroke: "var(--color-border-default)" },
75
+ axisLine: { stroke: "var(--color-border-default)" },
76
+ tickFormatter: S
77
+ }),
78
+ /* @__PURE__ */ i(d, {
79
+ content: /* @__PURE__ */ i(e, { valueFormatter: S }),
80
+ cursor: {
81
+ fill: "var(--color-bg-muted)",
82
+ opacity: .5
83
+ }
84
+ }),
85
+ t(_.referenceLines),
86
+ /* @__PURE__ */ i(o, {
87
+ dataKey: "base",
88
+ stackId: "wf",
89
+ fill: "transparent",
90
+ isAnimationActive: !1
91
+ }),
92
+ /* @__PURE__ */ i(o, {
93
+ dataKey: "delta",
94
+ stackId: "wf",
95
+ radius: [
96
+ 4,
97
+ 4,
98
+ 0,
99
+ 0
100
+ ],
101
+ name: "Change",
102
+ children: x.map((e, t) => /* @__PURE__ */ i(l, { fill: e.sign === "total" ? g : e.sign === "up" ? m : h }, t))
103
+ })
104
+ ]
105
+ })
106
+ }) : null;
107
+ });
108
+ //#endregion
109
+ export { _ as default };
110
+
111
+ //# sourceMappingURL=WaterfallChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaterfallChart.js","names":[],"sources":["../../../../../../src/bigconsole/components/widgets/chart/charts/WaterfallChart.tsx"],"sourcesContent":["/**\n * WaterfallChart Component\n *\n * Bridge / waterfall chart (budget-vs-actual, P&L) using a Recharts stacked\n * BarChart: a transparent \"base\" bar floats each visible delta bar to its\n * running cumulative position. Positive steps render success-toned, negative\n * steps danger-toned, and an optional final bar shows the cumulative total.\n */\n\nimport { type FC, memo, useMemo } from 'react';\nimport {\n BarChart as RechartsBarChart,\n Bar,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n Cell,\n} from 'recharts';\nimport { ChartTooltip } from '../ChartTooltip';\nimport type { ChartConfig, ChartData } from './types';\nimport { buildReferenceElements } from './referenceElements';\n\nexport interface WaterfallChartProps {\n data: ChartData[];\n config: ChartConfig;\n hiddenSeries?: string[];\n onDataClick?: (data: ChartData, index: number) => void;\n}\n\ninterface WaterfallRow {\n name: string;\n base: number;\n delta: number;\n cumulative: number;\n isTotal: boolean;\n sign: 'up' | 'down' | 'total';\n}\n\nconst COLOR_UP = 'var(--color-status-success)';\nconst COLOR_DOWN = 'var(--color-status-error)';\nconst COLOR_TOTAL = 'var(--color-chart-1)';\n\nexport const WaterfallChart: FC<WaterfallChartProps> = memo(function WaterfallChart({\n data = [],\n config,\n onDataClick,\n}) {\n const labelKey = config.labelField || config.xAxisKey || 'name';\n const valueKey = config.valueField || 'value';\n\n const rows: WaterfallRow[] = useMemo(() => {\n if (!data.length) return [];\n let cumulative = 0;\n const out: WaterfallRow[] = data.map((d) => {\n const delta = typeof d[valueKey] === 'number' ? (d[valueKey] as number) : Number(d[valueKey]) || 0;\n const base = delta >= 0 ? cumulative : cumulative + delta;\n cumulative += delta;\n return {\n name: String(d[labelKey] ?? ''),\n base,\n delta: Math.abs(delta),\n cumulative,\n isTotal: false,\n sign: delta >= 0 ? 'up' : 'down',\n };\n });\n if (config.showTotal) {\n out.push({\n name: config.totalLabel || 'Total',\n base: 0,\n delta: cumulative,\n cumulative,\n isTotal: true,\n sign: 'total',\n });\n }\n return out;\n }, [data, labelKey, valueKey, config.showTotal, config.totalLabel]);\n\n const formatValue = (value: number | string): string => {\n if (typeof value !== 'number') return String(value);\n return new Intl.NumberFormat('en-US', {\n notation: Math.abs(value) >= 10000 ? 'compact' : 'standard',\n maximumFractionDigits: 2,\n }).format(value);\n };\n\n if (!rows.length) return null;\n\n return (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsBarChart\n data={rows}\n margin={{ top: 10, right: 10, left: 0, bottom: 0 }}\n onClick={(e) => {\n if (e?.activePayload?.[0] && onDataClick) {\n onDataClick(e.activePayload[0].payload, e.activeTooltipIndex || 0);\n }\n }}\n >\n {config.showGrid !== false && (\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border-default)\" opacity={0.5} vertical={false} />\n )}\n <XAxis\n dataKey=\"name\"\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n />\n <YAxis\n tick={{ fill: 'var(--color-text-secondary)', fontSize: 12 }}\n tickLine={{ stroke: 'var(--color-border-default)' }}\n axisLine={{ stroke: 'var(--color-border-default)' }}\n tickFormatter={formatValue}\n />\n <Tooltip\n content={<ChartTooltip valueFormatter={formatValue} />}\n cursor={{ fill: 'var(--color-bg-muted)', opacity: 0.5 }}\n />\n {buildReferenceElements(config.referenceLines)}\n {/* Transparent floating base */}\n <Bar dataKey=\"base\" stackId=\"wf\" fill=\"transparent\" isAnimationActive={false} />\n {/* Visible delta, colored by direction */}\n <Bar dataKey=\"delta\" stackId=\"wf\" radius={[4, 4, 0, 0]} name=\"Change\">\n {rows.map((r, i) => (\n <Cell key={i} fill={r.sign === 'total' ? COLOR_TOTAL : r.sign === 'up' ? COLOR_UP : COLOR_DOWN} />\n ))}\n </Bar>\n </RechartsBarChart>\n </ResponsiveContainer>\n );\n});\n\nexport default WaterfallChart;\n"],"mappings":";;;;;;AAwCA,IAAM,IAAW,+BACX,IAAa,6BACb,IAAc,wBAEP,IAA0C,EAAK,SAAwB,EAClF,UAAO,EAAE,EACT,WACA,kBACC;CACD,IAAM,IAAW,EAAO,cAAc,EAAO,YAAY,QACnD,IAAW,EAAO,cAAc,SAEhC,IAAuB,QAAc;AACzC,MAAI,CAAC,EAAK,OAAQ,QAAO,EAAE;EAC3B,IAAI,IAAa,GACX,IAAsB,EAAK,KAAK,MAAM;GAC1C,IAAM,IAAQ,OAAO,EAAE,MAAc,WAAY,EAAE,KAAuB,OAAO,EAAE,GAAU,IAAI,GAC3F,IAAO,KAAS,IAAI,IAAa,IAAa;AAEpD,UADA,KAAc,GACP;IACL,MAAM,OAAO,EAAE,MAAa,GAAG;IAC/B;IACA,OAAO,KAAK,IAAI,EAAM;IACtB;IACA,SAAS;IACT,MAAM,KAAS,IAAI,OAAO;IAC3B;IACD;AAWF,SAVI,EAAO,aACT,EAAI,KAAK;GACP,MAAM,EAAO,cAAc;GAC3B,MAAM;GACN,OAAO;GACP;GACA,SAAS;GACT,MAAM;GACP,CAAC,EAEG;IACN;EAAC;EAAM;EAAU;EAAU,EAAO;EAAW,EAAO;EAAW,CAAC,EAE7D,KAAe,MACf,OAAO,KAAU,WACd,IAAI,KAAK,aAAa,SAAS;EACpC,UAAU,KAAK,IAAI,EAAM,IAAI,MAAQ,YAAY;EACjD,uBAAuB;EACxB,CAAC,CAAC,OAAO,EAAM,GAJsB,OAAO,EAAM;AASrD,QAFK,EAAK,SAGR,kBAAC,GAAD;EAAqB,OAAM;EAAO,QAAO;YACvC,kBAAC,GAAD;GACE,MAAM;GACN,QAAQ;IAAE,KAAK;IAAI,OAAO;IAAI,MAAM;IAAG,QAAQ;IAAG;GAClD,UAAU,MAAM;AACd,IAAI,GAAG,gBAAgB,MAAM,KAC3B,EAAY,EAAE,cAAc,GAAG,SAAS,EAAE,sBAAsB,EAAE;;aALxE;IASG,EAAO,aAAa,MACnB,kBAAC,GAAD;KAAe,iBAAgB;KAAM,QAAO;KAA8B,SAAS;KAAK,UAAU;KAAS,CAAA;IAE7G,kBAAC,GAAD;KACE,SAAQ;KACR,MAAM;MAAE,MAAM;MAA+B,UAAU;MAAI;KAC3D,UAAU,EAAE,QAAQ,+BAA+B;KACnD,UAAU,EAAE,QAAQ,+BAA+B;KACnD,CAAA;IACF,kBAAC,GAAD;KACE,MAAM;MAAE,MAAM;MAA+B,UAAU;MAAI;KAC3D,UAAU,EAAE,QAAQ,+BAA+B;KACnD,UAAU,EAAE,QAAQ,+BAA+B;KACnD,eAAe;KACf,CAAA;IACF,kBAAC,GAAD;KACE,SAAS,kBAAC,GAAD,EAAc,gBAAgB,GAAe,CAAA;KACtD,QAAQ;MAAE,MAAM;MAAyB,SAAS;MAAK;KACvD,CAAA;IACD,EAAuB,EAAO,eAAe;IAE9C,kBAAC,GAAD;KAAK,SAAQ;KAAO,SAAQ;KAAK,MAAK;KAAc,mBAAmB;KAAS,CAAA;IAEhF,kBAAC,GAAD;KAAK,SAAQ;KAAQ,SAAQ;KAAK,QAAQ;MAAC;MAAG;MAAG;MAAG;MAAE;KAAE,MAAK;eAC1D,EAAK,KAAK,GAAG,MACZ,kBAAC,GAAD,EAAc,MAAM,EAAE,SAAS,UAAU,IAAc,EAAE,SAAS,OAAO,IAAW,GAAc,EAAvF,EAAuF,CAClG;KACE,CAAA;IACW;;EACC,CAAA,GA1CC;EA4CzB"}
@@ -1,5 +1,9 @@
1
+ import "./referenceElements.js";
1
2
  import "./LineChart.js";
2
3
  import "./BarChart.js";
3
4
  import "./AreaChart.js";
4
5
  import "./PieChart.js";
5
6
  import "./FunnelChart.js";
7
+ import "./ComboChart.js";
8
+ import "./WaterfallChart.js";
9
+ import "./ScatterChart.js";
@@ -0,0 +1,49 @@
1
+ import { intentToCssVar as e } from "../../utils/conditionalFormat.js";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ import { ReferenceArea as n, ReferenceLine as r } from "recharts";
4
+ //#region src/bigconsole/components/widgets/chart/charts/referenceElements.tsx
5
+ function i(i, a) {
6
+ return i?.length ? i.map((i, o) => {
7
+ let s = e(i.color ?? "danger"), c = (i.axis ?? "y") === "y", l = a?.yAxisId;
8
+ if (i.value2 != null) {
9
+ let e = Math.min(i.value, i.value2), r = Math.max(i.value, i.value2);
10
+ return /* @__PURE__ */ t(n, {
11
+ ...c ? {
12
+ y1: e,
13
+ y2: r
14
+ } : {
15
+ x1: e,
16
+ x2: r
17
+ },
18
+ ...l == null ? {} : { yAxisId: l },
19
+ fill: s,
20
+ fillOpacity: .1,
21
+ stroke: s,
22
+ strokeOpacity: .3,
23
+ label: i.label ? {
24
+ value: i.label,
25
+ fill: s,
26
+ fontSize: 11,
27
+ position: "insideTopLeft"
28
+ } : void 0
29
+ }, `ref-band-${o}`);
30
+ }
31
+ return /* @__PURE__ */ t(r, {
32
+ ...c ? { y: i.value } : { x: i.value },
33
+ ...l == null ? {} : { yAxisId: l },
34
+ stroke: s,
35
+ strokeWidth: 1.5,
36
+ strokeDasharray: i.dashed === !1 ? void 0 : "6 4",
37
+ label: i.label ? {
38
+ value: i.label,
39
+ fill: s,
40
+ fontSize: 11,
41
+ position: "right"
42
+ } : void 0
43
+ }, `ref-line-${o}`);
44
+ }) : [];
45
+ }
46
+ //#endregion
47
+ export { i as buildReferenceElements };
48
+
49
+ //# sourceMappingURL=referenceElements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"referenceElements.js","names":[],"sources":["../../../../../../src/bigconsole/components/widgets/chart/charts/referenceElements.tsx"],"sourcesContent":["/**\n * Reference / threshold line & band helpers (Recharts).\n *\n * Builds `ReferenceLine` / `ReferenceArea` elements from a widget's\n * `config.referenceLines`. Colors are resolved from semantic intents so\n * targets / control limits / SLAs stay theme-aware.\n */\n\nimport { ReferenceLine, ReferenceArea } from 'recharts';\nimport type { ReactElement } from 'react';\nimport { intentToCssVar, type SemanticIntent } from '../../utils/conditionalFormat';\n\nexport interface ReferenceLineConfig {\n axis?: 'x' | 'y';\n value: number;\n value2?: number;\n label?: string;\n color?: SemanticIntent;\n dashed?: boolean;\n}\n\n/**\n * Build reference line/band elements for a cartesian chart.\n * `yAxisIds` lets dual-axis charts target the correct axis (defaults to none).\n */\nexport function buildReferenceElements(\n referenceLines: ReferenceLineConfig[] | undefined,\n opts?: { yAxisId?: string | number }\n): ReactElement[] {\n if (!referenceLines?.length) return [];\n\n return referenceLines.map((ref, index) => {\n const color = intentToCssVar(ref.color ?? 'danger');\n const onY = (ref.axis ?? 'y') === 'y';\n const yAxisId = opts?.yAxisId;\n\n // Band (shaded area) when a second bound is supplied.\n if (ref.value2 != null) {\n const lo = Math.min(ref.value, ref.value2);\n const hi = Math.max(ref.value, ref.value2);\n return (\n <ReferenceArea\n key={`ref-band-${index}`}\n {...(onY ? { y1: lo, y2: hi } : { x1: lo, x2: hi })}\n {...(yAxisId != null ? { yAxisId } : {})}\n fill={color}\n fillOpacity={0.1}\n stroke={color}\n strokeOpacity={0.3}\n label={ref.label ? { value: ref.label, fill: color, fontSize: 11, position: 'insideTopLeft' } : undefined}\n />\n );\n }\n\n return (\n <ReferenceLine\n key={`ref-line-${index}`}\n {...(onY ? { y: ref.value } : { x: ref.value })}\n {...(yAxisId != null ? { yAxisId } : {})}\n stroke={color}\n strokeWidth={1.5}\n strokeDasharray={ref.dashed === false ? undefined : '6 4'}\n label={ref.label ? { value: ref.label, fill: color, fontSize: 11, position: 'right' } : undefined}\n />\n );\n });\n}\n"],"mappings":";;;;AAyBA,SAAgB,EACd,GACA,GACgB;AAGhB,QAFK,GAAgB,SAEd,EAAe,KAAK,GAAK,MAAU;EACxC,IAAM,IAAQ,EAAe,EAAI,SAAS,SAAS,EAC7C,KAAO,EAAI,QAAQ,SAAS,KAC5B,IAAU,GAAM;AAGtB,MAAI,EAAI,UAAU,MAAM;GACtB,IAAM,IAAK,KAAK,IAAI,EAAI,OAAO,EAAI,OAAO,EACpC,IAAK,KAAK,IAAI,EAAI,OAAO,EAAI,OAAO;AAC1C,UACE,kBAAC,GAAD;IAEE,GAAK,IAAM;KAAE,IAAI;KAAI,IAAI;KAAI,GAAG;KAAE,IAAI;KAAI,IAAI;KAAI;IAClD,GAAK,KAAW,OAAqB,EAAE,GAAhB,EAAE,YAAS;IAClC,MAAM;IACN,aAAa;IACb,QAAQ;IACR,eAAe;IACf,OAAO,EAAI,QAAQ;KAAE,OAAO,EAAI;KAAO,MAAM;KAAO,UAAU;KAAI,UAAU;KAAiB,GAAG,KAAA;IAChG,EARK,YAAY,IAQjB;;AAIN,SACE,kBAAC,GAAD;GAEE,GAAK,IAAM,EAAE,GAAG,EAAI,OAAO,GAAG,EAAE,GAAG,EAAI,OAAO;GAC9C,GAAK,KAAW,OAAqB,EAAE,GAAhB,EAAE,YAAS;GAClC,QAAQ;GACR,aAAa;GACb,iBAAiB,EAAI,WAAW,KAAQ,KAAA,IAAY;GACpD,OAAO,EAAI,QAAQ;IAAE,OAAO,EAAI;IAAO,MAAM;IAAO,UAAU;IAAI,UAAU;IAAS,GAAG,KAAA;GACxF,EAPK,YAAY,IAOjB;GAEJ,GApCkC,EAAE"}