drizzle-cube 0.3.13 → 0.3.15
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/dist/adapters/{compiler-DTOU8IsK.js → compiler-DdcGVWIl.js} +7429 -4165
- package/dist/adapters/compiler-mAJDpIQx.cjs +214 -0
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.d.ts +1 -1
- package/dist/adapters/express/index.js +1 -1
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.d.ts +1 -1
- package/dist/adapters/fastify/index.js +1 -1
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.d.ts +1 -1
- package/dist/adapters/hono/index.js +1 -1
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.d.ts +1 -1
- package/dist/adapters/nextjs/index.js +1 -1
- package/dist/adapters/utils.d.ts +29 -0
- package/dist/client/adapters/index.d.ts +2 -0
- package/dist/client/adapters/retentionModeAdapter.d.ts +3 -0
- package/dist/client/charts.js +12 -12
- package/dist/client/chunks/RetentionCombinedChart-CqMAkdcR.js +256 -0
- package/dist/client/chunks/RetentionCombinedChart-CqMAkdcR.js.map +1 -0
- package/dist/client/chunks/RetentionCombinedChart.config-C-ILIaEb.js +47 -0
- package/dist/client/chunks/RetentionCombinedChart.config-C-ILIaEb.js.map +1 -0
- package/dist/client/chunks/RetentionHeatmap-Bofadstm.js +178 -0
- package/dist/client/chunks/RetentionHeatmap-Bofadstm.js.map +1 -0
- package/dist/client/chunks/RetentionHeatmap.config-CIvhc-GT.js +28 -0
- package/dist/client/chunks/RetentionHeatmap.config-CIvhc-GT.js.map +1 -0
- package/dist/client/chunks/analysis-builder-D0MIKiKS.js +6939 -0
- package/dist/client/chunks/analysis-builder-D0MIKiKS.js.map +1 -0
- package/dist/client/chunks/analysis-builder-shared-gS0TDC6Y.js +2779 -0
- package/dist/client/chunks/analysis-builder-shared-gS0TDC6Y.js.map +1 -0
- package/dist/client/chunks/{chart-activity-grid-CuPARsr1.js → chart-activity-grid-B37W8fcE.js} +11 -11
- package/dist/client/chunks/{chart-activity-grid-CuPARsr1.js.map → chart-activity-grid-B37W8fcE.js.map} +1 -1
- package/dist/client/chunks/{chart-area-cPrJnhLj.js → chart-area-DZcxSVB1.js} +2 -2
- package/dist/client/chunks/{chart-area-cPrJnhLj.js.map → chart-area-DZcxSVB1.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-D68HFPpa.js → chart-bar-BFAdRj-E.js} +2 -2
- package/dist/client/chunks/{chart-bar-D68HFPpa.js.map → chart-bar-BFAdRj-E.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-CquyYfNO.js → chart-bubble-eoCCbl3h.js} +2 -2
- package/dist/client/chunks/{chart-bubble-CquyYfNO.js.map → chart-bubble-eoCCbl3h.js.map} +1 -1
- package/dist/client/chunks/{chart-config-activity-grid-Bkvx0F-G.js → chart-config-activity-grid-BBSNCbkb.js} +2 -2
- package/dist/client/chunks/{chart-config-activity-grid-Bkvx0F-G.js.map → chart-config-activity-grid-BBSNCbkb.js.map} +1 -1
- package/dist/client/chunks/{chart-config-area-OApsRaYC.js → chart-config-area-CyyJOO2T.js} +2 -2
- package/dist/client/chunks/{chart-config-area-OApsRaYC.js.map → chart-config-area-CyyJOO2T.js.map} +1 -1
- package/dist/client/chunks/{chart-config-bar-Dy21oaIA.js → chart-config-bar-BJKGnfLt.js} +2 -2
- package/dist/client/chunks/{chart-config-bar-Dy21oaIA.js.map → chart-config-bar-BJKGnfLt.js.map} +1 -1
- package/dist/client/chunks/{chart-config-bubble-Chv0SoFm.js → chart-config-bubble-CuSsCHZ4.js} +2 -2
- package/dist/client/chunks/{chart-config-bubble-Chv0SoFm.js.map → chart-config-bubble-CuSsCHZ4.js.map} +1 -1
- package/dist/client/chunks/{chart-config-data-table-DTIdC35a.js → chart-config-data-table-BhgqwoqT.js} +2 -2
- package/dist/client/chunks/{chart-config-data-table-DTIdC35a.js.map → chart-config-data-table-BhgqwoqT.js.map} +1 -1
- package/dist/client/chunks/{chart-config-funnel-f17Livgr.js → chart-config-funnel-BlSQYng0.js} +4 -4
- package/dist/client/chunks/{chart-config-funnel-f17Livgr.js.map → chart-config-funnel-BlSQYng0.js.map} +1 -1
- package/dist/client/chunks/{chart-config-heat-map-DPhNICha.js → chart-config-heat-map-DHQGFZhX.js} +2 -2
- package/dist/client/chunks/{chart-config-heat-map-DPhNICha.js.map → chart-config-heat-map-DHQGFZhX.js.map} +1 -1
- package/dist/client/chunks/{chart-config-kpi-delta-CCl1d-St.js → chart-config-kpi-delta-yTA5ug_l.js} +2 -2
- package/dist/client/chunks/{chart-config-kpi-delta-CCl1d-St.js.map → chart-config-kpi-delta-yTA5ug_l.js.map} +1 -1
- package/dist/client/chunks/{chart-config-kpi-number-DkE3eSwH.js → chart-config-kpi-number-nVAwDXzq.js} +2 -2
- package/dist/client/chunks/{chart-config-kpi-number-DkE3eSwH.js.map → chart-config-kpi-number-nVAwDXzq.js.map} +1 -1
- package/dist/client/chunks/{chart-config-kpi-text-BMbgdxZm.js → chart-config-kpi-text-DZjqsx-b.js} +2 -2
- package/dist/client/chunks/{chart-config-kpi-text-BMbgdxZm.js.map → chart-config-kpi-text-DZjqsx-b.js.map} +1 -1
- package/dist/client/chunks/{chart-config-line-BnLlRUQE.js → chart-config-line-DR0ThxZy.js} +2 -2
- package/dist/client/chunks/{chart-config-line-BnLlRUQE.js.map → chart-config-line-DR0ThxZy.js.map} +1 -1
- package/dist/client/chunks/{chart-config-markdown-DIaMFC0Z.js → chart-config-markdown-DZxdGNVQ.js} +2 -2
- package/dist/client/chunks/{chart-config-markdown-DIaMFC0Z.js.map → chart-config-markdown-DZxdGNVQ.js.map} +1 -1
- package/dist/client/chunks/{chart-config-pie-O9y_T0BQ.js → chart-config-pie-BM5lgH-w.js} +2 -2
- package/dist/client/chunks/{chart-config-pie-O9y_T0BQ.js.map → chart-config-pie-BM5lgH-w.js.map} +1 -1
- package/dist/client/chunks/{chart-config-radar-CXa0354h.js → chart-config-radar-BBAVIF0S.js} +2 -2
- package/dist/client/chunks/{chart-config-radar-CXa0354h.js.map → chart-config-radar-BBAVIF0S.js.map} +1 -1
- package/dist/client/chunks/{chart-config-radial-bar-BppJU8-Q.js → chart-config-radial-bar-CTwjDRnB.js} +2 -2
- package/dist/client/chunks/{chart-config-radial-bar-BppJU8-Q.js.map → chart-config-radial-bar-CTwjDRnB.js.map} +1 -1
- package/dist/client/chunks/{chart-config-sankey-BfBHgL4x.js → chart-config-sankey-CNAgsMQ4.js} +2 -2
- package/dist/client/chunks/{chart-config-sankey-BfBHgL4x.js.map → chart-config-sankey-CNAgsMQ4.js.map} +1 -1
- package/dist/client/chunks/{chart-config-scatter-BTt8a10R.js → chart-config-scatter-CWvN2E-X.js} +2 -2
- package/dist/client/chunks/{chart-config-scatter-BTt8a10R.js.map → chart-config-scatter-CWvN2E-X.js.map} +1 -1
- package/dist/client/chunks/{chart-config-sunburst-DNmQpIIx.js → chart-config-sunburst-W_SKwaj0.js} +4 -4
- package/dist/client/chunks/{chart-config-sunburst-DNmQpIIx.js.map → chart-config-sunburst-W_SKwaj0.js.map} +1 -1
- package/dist/client/chunks/{chart-config-tree-map-HVgG4oa0.js → chart-config-tree-map-CLmRvvMR.js} +2 -2
- package/dist/client/chunks/{chart-config-tree-map-HVgG4oa0.js.map → chart-config-tree-map-CLmRvvMR.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-D4WDqbM0.js → chart-data-table-kudRwZxJ.js} +4 -4
- package/dist/client/chunks/{chart-data-table-D4WDqbM0.js.map → chart-data-table-kudRwZxJ.js.map} +1 -1
- package/dist/client/chunks/{chart-funnel-Csdn4FbN.js → chart-funnel-CA0XJkfh.js} +2 -2
- package/dist/client/chunks/{chart-funnel-Csdn4FbN.js.map → chart-funnel-CA0XJkfh.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-v1afxnjq.js → chart-heat-map-DUy9_pWM.js} +2 -2
- package/dist/client/chunks/{chart-heat-map-v1afxnjq.js.map → chart-heat-map-DUy9_pWM.js.map} +1 -1
- package/dist/client/chunks/chart-kpi-delta-MIGGCpkG.js +351 -0
- package/dist/client/chunks/chart-kpi-delta-MIGGCpkG.js.map +1 -0
- package/dist/client/chunks/chart-kpi-number-DM0Brd91.js +473 -0
- package/dist/client/chunks/chart-kpi-number-DM0Brd91.js.map +1 -0
- package/dist/client/chunks/{chart-kpi-text-CRp8QWYG.js → chart-kpi-text-BAb28V4X.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-CRp8QWYG.js.map → chart-kpi-text-BAb28V4X.js.map} +1 -1
- package/dist/client/chunks/{chart-line-DqqE7ky9.js → chart-line-e3h8sa1R.js} +5 -5
- package/dist/client/chunks/{chart-line-DqqE7ky9.js.map → chart-line-e3h8sa1R.js.map} +1 -1
- package/dist/client/chunks/{chart-pie-B5WBzIRH.js → chart-pie-CFoHYqDB.js} +2 -2
- package/dist/client/chunks/{chart-pie-B5WBzIRH.js.map → chart-pie-CFoHYqDB.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-DL_dvhA-.js → chart-radar-CPPwkfxj.js} +2 -2
- package/dist/client/chunks/{chart-radar-DL_dvhA-.js.map → chart-radar-CPPwkfxj.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-DDRo6nz-.js → chart-radial-bar-BdEOM-P1.js} +2 -2
- package/dist/client/chunks/{chart-radial-bar-DDRo6nz-.js.map → chart-radial-bar-BdEOM-P1.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-C_bgIfg-.js → chart-sankey-Bbady-8g.js} +2 -2
- package/dist/client/chunks/{chart-sankey-C_bgIfg-.js.map → chart-sankey-Bbady-8g.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-DjmJRlK0.js → chart-scatter-JFu0Pv3a.js} +15 -15
- package/dist/client/chunks/{chart-scatter-DjmJRlK0.js.map → chart-scatter-JFu0Pv3a.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-CbMEnaes.js → chart-sunburst-sayxze15.js} +2 -2
- package/dist/client/chunks/{chart-sunburst-CbMEnaes.js.map → chart-sunburst-sayxze15.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-DEfJtJVC.js → chart-tree-map-Ks2xev8b.js} +30 -30
- package/dist/client/chunks/{chart-tree-map-DEfJtJVC.js.map → chart-tree-map-Ks2xev8b.js.map} +1 -1
- package/dist/client/chunks/chartConfigRegistry-BumUIPw4.js +44 -0
- package/dist/client/chunks/{chartConfigRegistry-CiOq-PqX.js.map → chartConfigRegistry-BumUIPw4.js.map} +1 -1
- package/dist/client/chunks/charts-_yZ9gBJU.js +230 -0
- package/dist/client/chunks/charts-_yZ9gBJU.js.map +1 -0
- package/dist/client/chunks/{charts-core-CXrhEEVF.js → charts-core-Bzu9PzMd.js} +10 -10
- package/dist/client/chunks/{charts-core-CXrhEEVF.js.map → charts-core-Bzu9PzMd.js.map} +1 -1
- package/dist/client/chunks/{charts-loader-BtsnUO4Q.js → charts-loader-cMtx4zHx.js} +30 -28
- package/dist/client/chunks/charts-loader-cMtx4zHx.js.map +1 -0
- package/dist/client/chunks/{components-BDrlf9Er.js → components-DQuPThfA.js} +3575 -3208
- package/dist/client/chunks/components-DQuPThfA.js.map +1 -0
- package/dist/client/chunks/{core-B8zw0qRf.js → core-DwOXVb87.js} +2 -2
- package/dist/client/chunks/{core-B8zw0qRf.js.map → core-DwOXVb87.js.map} +1 -1
- package/dist/client/chunks/hooks-DPRv1Xhb.js +150 -0
- package/dist/client/chunks/{hooks-B8Zw5PfL.js.map → hooks-DPRv1Xhb.js.map} +1 -1
- package/dist/client/chunks/{icons-NzFHtqeM.js → icons-DRreo6m8.js} +128 -112
- package/dist/client/chunks/{icons-NzFHtqeM.js.map → icons-DRreo6m8.js.map} +1 -1
- package/dist/client/chunks/{providers-CqCiJTEj.js → providers-BW8D7Wso.js} +2 -2
- package/dist/client/chunks/{providers-CqCiJTEj.js.map → providers-BW8D7Wso.js.map} +1 -1
- package/dist/client/chunks/retention-CzCo8262.js +120 -0
- package/dist/client/chunks/retention-CzCo8262.js.map +1 -0
- package/dist/client/chunks/{useDirtyStateTracking-C_mitVwh.js → useDirtyStateTracking-Yu_qQXb-.js} +101 -99
- package/dist/client/chunks/useDirtyStateTracking-Yu_qQXb-.js.map +1 -0
- package/dist/client/chunks/{vendor-DzzxS7Ay.js → vendor-BSkQZgtm.js} +548 -540
- package/dist/client/chunks/vendor-BSkQZgtm.js.map +1 -0
- package/dist/client/components/AnalysisBuilder/AnalysisTypeSelector.d.ts +3 -1
- package/dist/client/components/AnalysisBuilder/RetentionConfigPanel.d.ts +36 -0
- package/dist/client/components/AnalysisBuilder/RetentionModeContent.d.ts +71 -0
- package/dist/client/components/AnalysisBuilder/types.d.ts +99 -0
- package/dist/client/components/DebugModal.d.ts +2 -1
- package/dist/client/components/charts/RetentionCombinedChart.config.d.ts +2 -0
- package/dist/client/components/charts/RetentionCombinedChart.d.ts +14 -0
- package/dist/client/components/charts/RetentionHeatmap.config.d.ts +2 -0
- package/dist/client/components/charts/RetentionHeatmap.d.ts +7 -0
- package/dist/client/components.js +2 -2
- package/dist/client/hooks/queries/index.d.ts +2 -1
- package/dist/client/hooks/queries/useDryRunQuery.d.ts +26 -0
- package/dist/client/hooks/queries/useExplainQuery.d.ts +3 -1
- package/dist/client/hooks/queries/useFlowQuery.d.ts +5 -0
- package/dist/client/hooks/queries/useRetentionQuery.d.ts +67 -0
- package/dist/client/hooks/useAnalysisBuilderHook.d.ts +61 -0
- package/dist/client/hooks/useAnalysisQueryExecution.d.ts +42 -1
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons/customIcons.d.ts +7 -0
- package/dist/client/icons/types.d.ts +1 -0
- package/dist/client/icons.js +1 -1
- package/dist/client/index.js +11 -11
- package/dist/client/providers.js +1 -1
- package/dist/client/stores/analysisBuilderStore.d.ts +86 -1
- package/dist/client/stores/dashboardStore.d.ts +2 -1
- package/dist/client/stores/slices/index.d.ts +2 -0
- package/dist/client/stores/slices/retentionSlice.d.ts +66 -0
- package/dist/client/styles.css +1 -1
- package/dist/client/types/analysisConfig.d.ts +29 -4
- package/dist/client/types/funnel.d.ts +5 -0
- package/dist/client/types/retention.d.ts +301 -0
- package/dist/client/types.d.ts +6 -3
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.cjs +76 -54
- package/dist/server/index.d.ts +217 -0
- package/dist/server/index.js +7363 -4152
- package/package.json +5 -2
- package/dist/adapters/compiler-CO13DaEb.cjs +0 -192
- package/dist/client/chunks/analysis-builder-Dc9NrG_N.js +0 -6013
- package/dist/client/chunks/analysis-builder-Dc9NrG_N.js.map +0 -1
- package/dist/client/chunks/analysis-builder-shared-B3-UWqQ2.js +0 -2540
- package/dist/client/chunks/analysis-builder-shared-B3-UWqQ2.js.map +0 -1
- package/dist/client/chunks/chart-kpi-delta-Bs5R5xr4.js +0 -435
- package/dist/client/chunks/chart-kpi-delta-Bs5R5xr4.js.map +0 -1
- package/dist/client/chunks/chart-kpi-number-Cf4Pgkm9.js +0 -392
- package/dist/client/chunks/chart-kpi-number-Cf4Pgkm9.js.map +0 -1
- package/dist/client/chunks/chartConfigRegistry-CiOq-PqX.js +0 -44
- package/dist/client/chunks/charts-loader-BtsnUO4Q.js.map +0 -1
- package/dist/client/chunks/charts-xNubY0vm.js +0 -226
- package/dist/client/chunks/charts-xNubY0vm.js.map +0 -1
- package/dist/client/chunks/components-BDrlf9Er.js.map +0 -1
- package/dist/client/chunks/hooks-B8Zw5PfL.js +0 -123
- package/dist/client/chunks/useDirtyStateTracking-C_mitVwh.js.map +0 -1
- package/dist/client/chunks/vendor-DzzxS7Ay.js.map +0 -1
|
@@ -1,392 +0,0 @@
|
|
|
1
|
-
import { jsxs as m, jsx as n } from "react/jsx-runtime";
|
|
2
|
-
import te, { useState as _, useRef as K, useMemo as g, useCallback as ne, useEffect as re } from "react";
|
|
3
|
-
import { I as se, d as ie } from "./icons-NzFHtqeM.js";
|
|
4
|
-
import { u as le, p as oe, j as ae, k as ce } from "./charts-core-CXrhEEVF.js";
|
|
5
|
-
import { f as de } from "./chart-kpi-delta-Bs5R5xr4.js";
|
|
6
|
-
function me({
|
|
7
|
-
values: z,
|
|
8
|
-
min: o,
|
|
9
|
-
max: f,
|
|
10
|
-
color: r = "#1f2937",
|
|
11
|
-
bucketCount: v = 12,
|
|
12
|
-
height: s = 32,
|
|
13
|
-
formatValue: a = (b) => b.toString(),
|
|
14
|
-
width: p,
|
|
15
|
-
showAverageIndicator: R = !0,
|
|
16
|
-
targetValue: y
|
|
17
|
-
}) {
|
|
18
|
-
const b = new Array(v).fill(0), c = f - o;
|
|
19
|
-
z.forEach((i) => {
|
|
20
|
-
if (c === 0)
|
|
21
|
-
b[Math.floor(v / 2)]++;
|
|
22
|
-
else {
|
|
23
|
-
let u = Math.floor((i - o) / c * (v - 1));
|
|
24
|
-
u = Math.max(0, Math.min(v - 1, u)), b[u]++;
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
const M = Math.max(...b), I = z.reduce((i, u) => i + u, 0) / z.length, A = c === 0 ? 50 : (I - o) / c * 100, h = y !== void 0 && c > 0 ? (y - o) / c * 100 : null;
|
|
28
|
-
return /* @__PURE__ */ m("div", { className: "flex flex-col items-center", children: [
|
|
29
|
-
/* @__PURE__ */ m(
|
|
30
|
-
"div",
|
|
31
|
-
{
|
|
32
|
-
className: "relative flex items-end justify-center space-x-0.5",
|
|
33
|
-
style: {
|
|
34
|
-
height: `${s}px`,
|
|
35
|
-
width: p ? `${p}px` : "200px",
|
|
36
|
-
minWidth: "200px"
|
|
37
|
-
},
|
|
38
|
-
children: [
|
|
39
|
-
b.map((i, u) => {
|
|
40
|
-
const S = M > 0 ? i / M : 0, F = 0.1, T = i > 0 ? Math.max(F, S) : F;
|
|
41
|
-
return /* @__PURE__ */ n(
|
|
42
|
-
"div",
|
|
43
|
-
{
|
|
44
|
-
className: "flex-1 rounded-t-sm transition-all duration-300 ease-out",
|
|
45
|
-
style: {
|
|
46
|
-
height: `${T * s}px`,
|
|
47
|
-
backgroundColor: r,
|
|
48
|
-
opacity: i > 0 ? 0.7 + S * 0.3 : 0.2
|
|
49
|
-
// higher opacity for buckets with data
|
|
50
|
-
},
|
|
51
|
-
title: `${i} values in this range`
|
|
52
|
-
},
|
|
53
|
-
u
|
|
54
|
-
);
|
|
55
|
-
}),
|
|
56
|
-
R && /* @__PURE__ */ n(
|
|
57
|
-
"div",
|
|
58
|
-
{
|
|
59
|
-
className: "absolute top-0 bottom-0 pointer-events-none",
|
|
60
|
-
style: {
|
|
61
|
-
left: `${A}%`,
|
|
62
|
-
transform: "translateX(-50%)",
|
|
63
|
-
width: "2px",
|
|
64
|
-
backgroundColor: "#ef4444",
|
|
65
|
-
opacity: 0.8,
|
|
66
|
-
zIndex: 10
|
|
67
|
-
},
|
|
68
|
-
title: `Average: ${a(I)}`,
|
|
69
|
-
children: /* @__PURE__ */ n(
|
|
70
|
-
"div",
|
|
71
|
-
{
|
|
72
|
-
className: "absolute -top-1",
|
|
73
|
-
style: {
|
|
74
|
-
left: "50%",
|
|
75
|
-
transform: "translateX(-50%)",
|
|
76
|
-
width: "0",
|
|
77
|
-
height: "0",
|
|
78
|
-
borderLeft: "4px solid transparent",
|
|
79
|
-
borderRight: "4px solid transparent",
|
|
80
|
-
borderTop: "6px solid #ef4444"
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
)
|
|
84
|
-
}
|
|
85
|
-
),
|
|
86
|
-
h !== null && y !== void 0 && /* @__PURE__ */ n(
|
|
87
|
-
"div",
|
|
88
|
-
{
|
|
89
|
-
className: "absolute top-0 bottom-0 pointer-events-none",
|
|
90
|
-
style: {
|
|
91
|
-
left: `${Math.max(0, Math.min(100, h))}%`,
|
|
92
|
-
transform: "translateX(-50%)",
|
|
93
|
-
width: "2px",
|
|
94
|
-
backgroundColor: "#10b981",
|
|
95
|
-
opacity: 0.8,
|
|
96
|
-
zIndex: 11
|
|
97
|
-
},
|
|
98
|
-
title: `Target: ${a(y)}`,
|
|
99
|
-
children: /* @__PURE__ */ n(
|
|
100
|
-
"div",
|
|
101
|
-
{
|
|
102
|
-
className: "absolute -top-1",
|
|
103
|
-
style: {
|
|
104
|
-
left: "50%",
|
|
105
|
-
transform: "translateX(-50%)",
|
|
106
|
-
width: "0",
|
|
107
|
-
height: "0",
|
|
108
|
-
borderLeft: "4px solid transparent",
|
|
109
|
-
borderRight: "4px solid transparent",
|
|
110
|
-
borderTop: "6px solid #10b981"
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
)
|
|
114
|
-
}
|
|
115
|
-
)
|
|
116
|
-
]
|
|
117
|
-
}
|
|
118
|
-
),
|
|
119
|
-
/* @__PURE__ */ m(
|
|
120
|
-
"div",
|
|
121
|
-
{
|
|
122
|
-
className: "flex justify-between mt-2 text-xs text-dc-text-muted",
|
|
123
|
-
style: {
|
|
124
|
-
width: p ? `${p}px` : "200px",
|
|
125
|
-
minWidth: "200px"
|
|
126
|
-
},
|
|
127
|
-
children: [
|
|
128
|
-
/* @__PURE__ */ n("span", { children: a(o) }),
|
|
129
|
-
/* @__PURE__ */ n("span", { children: a(f) })
|
|
130
|
-
]
|
|
131
|
-
}
|
|
132
|
-
),
|
|
133
|
-
/* @__PURE__ */ m("div", { className: "text-center mt-1 text-xs text-dc-text-muted", children: [
|
|
134
|
-
"Average of ",
|
|
135
|
-
z.length,
|
|
136
|
-
" values"
|
|
137
|
-
] })
|
|
138
|
-
] });
|
|
139
|
-
}
|
|
140
|
-
const ue = te.memo(function({
|
|
141
|
-
data: o,
|
|
142
|
-
chartConfig: f,
|
|
143
|
-
displayConfig: r = {},
|
|
144
|
-
queryObject: v,
|
|
145
|
-
height: s = "100%",
|
|
146
|
-
colorPalette: a
|
|
147
|
-
}) {
|
|
148
|
-
const [p, R] = _(32), [y, b] = _(250), c = K(null), M = K(null), I = le(), A = g(() => f?.yAxis ? typeof f.yAxis == "string" ? [f.yAxis] : Array.isArray(f.yAxis) ? f.yAxis : [] : [], [f?.yAxis]), h = A[0] || "", i = v?.timeDimensions?.[0]?.dimension || void 0, u = g(() => {
|
|
149
|
-
if (!o || o.length === 0) return [];
|
|
150
|
-
let e = [...o];
|
|
151
|
-
return i && (e = e.sort((t, x) => {
|
|
152
|
-
const l = t[i], N = x[i];
|
|
153
|
-
return l < N ? -1 : l > N ? 1 : 0;
|
|
154
|
-
})), e;
|
|
155
|
-
}, [o, i]), { useLastCompletePeriod: S = !0, skipLastPeriod: F = !1 } = r, {
|
|
156
|
-
filteredData: T,
|
|
157
|
-
excludedIncompletePeriod: X,
|
|
158
|
-
skippedLastPeriod: $,
|
|
159
|
-
granularity: k
|
|
160
|
-
} = g(() => u.length === 0 ? { filteredData: [], excludedIncompletePeriod: !1, skippedLastPeriod: !1, granularity: void 0 } : de(u, i, v, S, F), [u, i, v, S, F]), L = T, d = g(() => !h || L.length === 0 ? [] : L.map((t) => {
|
|
161
|
-
if (t[h] !== void 0)
|
|
162
|
-
return t[h];
|
|
163
|
-
const x = Object.keys(t).filter(
|
|
164
|
-
(l) => typeof t[l] == "number" && !isNaN(t[l])
|
|
165
|
-
);
|
|
166
|
-
if (x.length > 0)
|
|
167
|
-
return t[x[0]];
|
|
168
|
-
}).filter((t) => t != null && !isNaN(Number(t))).map((t) => Number(t)), [L, h]), { avg: O, min: P, max: U } = g(() => {
|
|
169
|
-
if (d.length === 0) return { avg: 0, min: 0, max: 0 };
|
|
170
|
-
const t = d.reduce((N, j) => N + j, 0) / d.length, x = Math.min(...d), l = Math.max(...d);
|
|
171
|
-
return { avg: t, min: x, max: l };
|
|
172
|
-
}, [d]), V = ne((e) => {
|
|
173
|
-
if (r.formatValue)
|
|
174
|
-
return r.formatValue(e);
|
|
175
|
-
if (e == null)
|
|
176
|
-
return "—";
|
|
177
|
-
const t = r.decimals ?? 0, x = r.prefix ?? "";
|
|
178
|
-
let l;
|
|
179
|
-
return Math.abs(e) >= 1e9 ? l = (e / 1e9).toFixed(t) + "B" : Math.abs(e) >= 1e6 ? l = (e / 1e6).toFixed(t) + "M" : Math.abs(e) >= 1e3 ? l = (e / 1e3).toFixed(t) + "K" : l = e.toFixed(t), x + l;
|
|
180
|
-
}, [r]), B = d.length === 1 ? d[0] : O, G = d.length > 1, D = g(() => {
|
|
181
|
-
if (r.valueColorIndex !== void 0 && a?.colors) {
|
|
182
|
-
const e = r.valueColorIndex;
|
|
183
|
-
if (e >= 0 && e < a.colors.length)
|
|
184
|
-
return a.colors[e];
|
|
185
|
-
}
|
|
186
|
-
return a?.colors?.[0] || "#1f2937";
|
|
187
|
-
}, [r.valueColorIndex, a?.colors]), W = g(() => oe(r?.target || ""), [r?.target]), w = W.length > 0 ? W[0] : null, H = w !== null && d.length > 0 ? ae(B, w) : null, J = g(() => {
|
|
188
|
-
if (H === null) return "#6B7280";
|
|
189
|
-
if (H >= 0) {
|
|
190
|
-
const e = r.positiveColorIndex ?? 1;
|
|
191
|
-
return a?.colors?.[e] || "#10B981";
|
|
192
|
-
} else {
|
|
193
|
-
const e = r.negativeColorIndex ?? 7;
|
|
194
|
-
return a?.colors?.[e] || "#EF4444";
|
|
195
|
-
}
|
|
196
|
-
}, [H, r.positiveColorIndex, r.negativeColorIndex, a?.colors]);
|
|
197
|
-
return re(() => {
|
|
198
|
-
const e = () => {
|
|
199
|
-
if (c.current) {
|
|
200
|
-
const N = c.current.getBoundingClientRect(), j = N.width, E = N.height;
|
|
201
|
-
if (j > 0 && E > 0) {
|
|
202
|
-
const Q = j / 5, Y = E / 4, Z = Math.min(Q, Y), q = Math.max(24, Math.min(Z, 120));
|
|
203
|
-
R(q), setTimeout(() => {
|
|
204
|
-
if (M.current) {
|
|
205
|
-
const C = M.current.getBoundingClientRect().width, ee = Math.max(C, Math.min(j * 0.6, 300));
|
|
206
|
-
b(ee);
|
|
207
|
-
}
|
|
208
|
-
}, 10);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}, t = setTimeout(e, 50), x = new ResizeObserver(() => {
|
|
212
|
-
setTimeout(e, 10);
|
|
213
|
-
});
|
|
214
|
-
return c.current && x.observe(c.current), () => {
|
|
215
|
-
clearTimeout(t), x.disconnect();
|
|
216
|
-
};
|
|
217
|
-
}, [o, f]), !o || o.length === 0 ? /* @__PURE__ */ n(
|
|
218
|
-
"div",
|
|
219
|
-
{
|
|
220
|
-
className: "flex items-center justify-center w-full h-full",
|
|
221
|
-
style: {
|
|
222
|
-
height: s === "100%" ? "100%" : s,
|
|
223
|
-
minHeight: s === "100%" ? "200px" : void 0
|
|
224
|
-
},
|
|
225
|
-
children: /* @__PURE__ */ m("div", { className: "text-center text-dc-text-muted", children: [
|
|
226
|
-
/* @__PURE__ */ n("div", { className: "text-sm font-semibold mb-1", children: "No data available" }),
|
|
227
|
-
/* @__PURE__ */ n("div", { className: "text-xs text-dc-text-secondary", children: "No data points to display" })
|
|
228
|
-
] })
|
|
229
|
-
}
|
|
230
|
-
) : A.length === 0 ? /* @__PURE__ */ n(
|
|
231
|
-
"div",
|
|
232
|
-
{
|
|
233
|
-
className: "flex items-center justify-center w-full h-full",
|
|
234
|
-
style: {
|
|
235
|
-
height: s === "100%" ? "100%" : s,
|
|
236
|
-
minHeight: s === "100%" ? "200px" : void 0,
|
|
237
|
-
backgroundColor: "var(--dc-danger-bg)",
|
|
238
|
-
color: "var(--dc-danger)",
|
|
239
|
-
borderColor: "var(--dc-danger-border)"
|
|
240
|
-
},
|
|
241
|
-
children: /* @__PURE__ */ m("div", { className: "text-center", children: [
|
|
242
|
-
/* @__PURE__ */ n("div", { className: "text-sm font-semibold mb-1", children: "Configuration Error" }),
|
|
243
|
-
/* @__PURE__ */ n("div", { className: "text-xs", children: "No measure fields configured" })
|
|
244
|
-
] })
|
|
245
|
-
}
|
|
246
|
-
) : d.length === 0 ? /* @__PURE__ */ m(
|
|
247
|
-
"div",
|
|
248
|
-
{
|
|
249
|
-
ref: c,
|
|
250
|
-
className: "flex flex-col items-center justify-center w-full h-full p-4",
|
|
251
|
-
style: {
|
|
252
|
-
height: s === "100%" ? "100%" : s,
|
|
253
|
-
minHeight: s === "100%" ? "200px" : void 0
|
|
254
|
-
},
|
|
255
|
-
children: [
|
|
256
|
-
/* @__PURE__ */ n(
|
|
257
|
-
"div",
|
|
258
|
-
{
|
|
259
|
-
className: "text-dc-text-secondary font-bold text-center mb-3",
|
|
260
|
-
style: {
|
|
261
|
-
fontSize: "14px",
|
|
262
|
-
lineHeight: "1.2"
|
|
263
|
-
},
|
|
264
|
-
children: I(h)
|
|
265
|
-
}
|
|
266
|
-
),
|
|
267
|
-
/* @__PURE__ */ n(
|
|
268
|
-
"div",
|
|
269
|
-
{
|
|
270
|
-
className: "font-bold leading-none text-dc-text-muted",
|
|
271
|
-
style: {
|
|
272
|
-
fontSize: `${p}px`
|
|
273
|
-
},
|
|
274
|
-
children: "—"
|
|
275
|
-
}
|
|
276
|
-
),
|
|
277
|
-
/* @__PURE__ */ n("div", { className: "text-xs text-dc-text-muted mt-2", children: "No data" })
|
|
278
|
-
]
|
|
279
|
-
}
|
|
280
|
-
) : /* @__PURE__ */ m(
|
|
281
|
-
"div",
|
|
282
|
-
{
|
|
283
|
-
ref: c,
|
|
284
|
-
className: "flex flex-col items-center justify-center w-full h-full p-4",
|
|
285
|
-
style: {
|
|
286
|
-
height: s === "100%" ? "100%" : s,
|
|
287
|
-
minHeight: s === "100%" ? "200px" : void 0
|
|
288
|
-
},
|
|
289
|
-
children: [
|
|
290
|
-
/* @__PURE__ */ m(
|
|
291
|
-
"div",
|
|
292
|
-
{
|
|
293
|
-
className: "text-dc-text-secondary font-bold text-center mb-3 flex items-center justify-center gap-1",
|
|
294
|
-
style: {
|
|
295
|
-
fontSize: "14px",
|
|
296
|
-
lineHeight: "1.2"
|
|
297
|
-
},
|
|
298
|
-
children: [
|
|
299
|
-
/* @__PURE__ */ n("span", { children: (() => {
|
|
300
|
-
const e = I(h);
|
|
301
|
-
return e && e.length > 1 ? e : h;
|
|
302
|
-
})() }),
|
|
303
|
-
(X || $) && /* @__PURE__ */ n(
|
|
304
|
-
"span",
|
|
305
|
-
{
|
|
306
|
-
title: $ ? `Excludes last ${k || "period"}` : `Excludes current incomplete ${k}`,
|
|
307
|
-
className: "cursor-help",
|
|
308
|
-
children: /* @__PURE__ */ n(se, { icon: ie, className: "w-4 h-4 text-dc-text-muted opacity-70" })
|
|
309
|
-
}
|
|
310
|
-
)
|
|
311
|
-
]
|
|
312
|
-
}
|
|
313
|
-
),
|
|
314
|
-
/* @__PURE__ */ m("div", { className: "flex items-center justify-center gap-4 mb-3", children: [
|
|
315
|
-
/* @__PURE__ */ n(
|
|
316
|
-
"div",
|
|
317
|
-
{
|
|
318
|
-
ref: M,
|
|
319
|
-
className: "font-bold leading-none",
|
|
320
|
-
style: {
|
|
321
|
-
fontSize: `${p}px`,
|
|
322
|
-
color: D
|
|
323
|
-
},
|
|
324
|
-
children: V(B)
|
|
325
|
-
}
|
|
326
|
-
),
|
|
327
|
-
w !== null && H !== null && /* @__PURE__ */ m("div", { className: "flex flex-col items-start", children: [
|
|
328
|
-
/* @__PURE__ */ n(
|
|
329
|
-
"div",
|
|
330
|
-
{
|
|
331
|
-
className: "font-semibold",
|
|
332
|
-
style: {
|
|
333
|
-
fontSize: `${Math.max(12, p * 0.3)}px`,
|
|
334
|
-
color: J,
|
|
335
|
-
lineHeight: "1.2"
|
|
336
|
-
},
|
|
337
|
-
children: ce(H, 1)
|
|
338
|
-
}
|
|
339
|
-
),
|
|
340
|
-
/* @__PURE__ */ m(
|
|
341
|
-
"div",
|
|
342
|
-
{
|
|
343
|
-
className: "text-dc-text-muted text-xs",
|
|
344
|
-
style: {
|
|
345
|
-
opacity: 0.7,
|
|
346
|
-
fontSize: `${Math.max(10, p * 0.2)}px`
|
|
347
|
-
},
|
|
348
|
-
children: [
|
|
349
|
-
"vs ",
|
|
350
|
-
V(w)
|
|
351
|
-
]
|
|
352
|
-
}
|
|
353
|
-
)
|
|
354
|
-
] })
|
|
355
|
-
] }),
|
|
356
|
-
r.suffix && !r.formatValue && /* @__PURE__ */ n(
|
|
357
|
-
"div",
|
|
358
|
-
{
|
|
359
|
-
className: "text-dc-text-muted text-center",
|
|
360
|
-
style: {
|
|
361
|
-
fontSize: "14px",
|
|
362
|
-
lineHeight: "1.2",
|
|
363
|
-
opacity: 0.8
|
|
364
|
-
},
|
|
365
|
-
children: r.suffix
|
|
366
|
-
}
|
|
367
|
-
),
|
|
368
|
-
G && /* @__PURE__ */ n("div", { className: "mt-4", children: /* @__PURE__ */ n(
|
|
369
|
-
me,
|
|
370
|
-
{
|
|
371
|
-
values: d,
|
|
372
|
-
min: P,
|
|
373
|
-
max: U,
|
|
374
|
-
color: D,
|
|
375
|
-
formatValue: V,
|
|
376
|
-
height: 24,
|
|
377
|
-
width: y,
|
|
378
|
-
targetValue: w || void 0
|
|
379
|
-
}
|
|
380
|
-
) })
|
|
381
|
-
]
|
|
382
|
-
}
|
|
383
|
-
);
|
|
384
|
-
}), ge = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
385
|
-
__proto__: null,
|
|
386
|
-
default: ue
|
|
387
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
388
|
-
export {
|
|
389
|
-
me as D,
|
|
390
|
-
ge as K
|
|
391
|
-
};
|
|
392
|
-
//# sourceMappingURL=chart-kpi-number-Cf4Pgkm9.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chart-kpi-number-Cf4Pgkm9.js","sources":["../../../src/client/components/DataHistogram.tsx","../../../src/client/components/charts/KpiNumber.tsx"],"sourcesContent":["\ninterface DataHistogramProps {\n /** Array of numeric values to create histogram from */\n values: number[]\n /** Minimum value in the dataset */\n min: number\n /** Maximum value in the dataset */\n max: number\n /** Color for the histogram bars */\n color?: string\n /** Number of buckets/bars to create (default: 12) */\n bucketCount?: number\n /** Height of the histogram in pixels (default: 32) */\n height?: number\n /** Format function for min/max labels */\n formatValue?: (value: number) => string\n /** Width of the histogram to match text above */\n width?: number\n /** Whether to show average indicator line (default: true) */\n showAverageIndicator?: boolean\n /** Target value to show as green line */\n targetValue?: number\n}\n\n/**\n * Reusable histogram component that shows the distribution of actual data values\n */\nexport default function DataHistogram({\n values,\n min,\n max,\n color = '#1f2937',\n bucketCount = 12,\n height = 32,\n formatValue = (val) => val.toString(),\n width,\n showAverageIndicator = true,\n targetValue\n}: DataHistogramProps) {\n // Create histogram buckets from actual data\n const buckets = new Array(bucketCount).fill(0)\n const range = max - min\n \n // Distribute actual values into buckets\n values.forEach(value => {\n if (range === 0) {\n // All values are the same, put everything in middle bucket\n buckets[Math.floor(bucketCount / 2)]++\n } else {\n // Calculate which bucket this value belongs to\n let bucketIndex = Math.floor(((value - min) / range) * (bucketCount - 1))\n // Clamp to valid bucket range\n bucketIndex = Math.max(0, Math.min(bucketCount - 1, bucketIndex))\n buckets[bucketIndex]++\n }\n })\n \n // Find max bucket count for normalization\n const maxBucketCount = Math.max(...buckets)\n \n // Calculate average for indicator positioning\n const average = values.reduce((sum, val) => sum + val, 0) / values.length\n \n // Calculate average position as percentage of histogram width\n const averagePosition = range === 0 ? 50 : ((average - min) / range) * 100\n \n // Calculate target position if target value is provided\n const targetPosition = targetValue !== undefined && range > 0 \n ? ((targetValue - min) / range) * 100 \n : null\n\n return (\n <div className=\"flex flex-col items-center\">\n {/* Horizontal bars representing actual data distribution */}\n <div \n className=\"relative flex items-end justify-center space-x-0.5\" \n style={{ \n height: `${height}px`,\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n {buckets.map((count, i) => {\n // Normalize height based on actual data frequency\n const normalizedHeight = maxBucketCount > 0 ? count / maxBucketCount : 0\n const minHeight = 0.1 // minimum height for empty buckets\n const displayHeight = count > 0 ? Math.max(minHeight, normalizedHeight) : minHeight\n \n return (\n <div\n key={i}\n className=\"flex-1 rounded-t-sm transition-all duration-300 ease-out\"\n style={{\n height: `${displayHeight * height}px`,\n backgroundColor: color,\n opacity: count > 0 ? 0.7 + (normalizedHeight * 0.3) : 0.2 // higher opacity for buckets with data\n }}\n title={`${count} values in this range`} // tooltip showing actual count\n />\n )\n })}\n \n {/* Average indicator line */}\n {showAverageIndicator && (\n <div\n className=\"absolute top-0 bottom-0 pointer-events-none\"\n style={{\n left: `${averagePosition}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#ef4444',\n opacity: 0.8,\n zIndex: 10\n }}\n title={`Average: ${formatValue(average)}`}\n >\n {/* Small triangle at top to indicate average */}\n <div\n className=\"absolute -top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #ef4444'\n }}\n />\n </div>\n )}\n \n {/* Target indicator line */}\n {targetPosition !== null && targetValue !== undefined && (\n <div\n className=\"absolute top-0 bottom-0 pointer-events-none\"\n style={{\n left: `${Math.max(0, Math.min(100, targetPosition))}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#10b981',\n opacity: 0.8,\n zIndex: 11\n }}\n title={`Target: ${formatValue(targetValue)}`}\n >\n {/* Small triangle at top to indicate target */}\n <div\n className=\"absolute -top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #10b981'\n }}\n />\n </div>\n )}\n </div>\n \n {/* Min/Max values aligned with histogram width */}\n <div\n className=\"flex justify-between mt-2 text-xs text-dc-text-muted\"\n style={{\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n <span>{formatValue(min)}</span>\n <span>{formatValue(max)}</span>\n </div>\n\n {/* Average indicator */}\n <div className=\"text-center mt-1 text-xs text-dc-text-muted\">\n Average of {values.length} values\n </div>\n </div>\n )\n}","import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'\nimport { Icon } from '@iconify/react'\nimport infoCircleIcon from '@iconify-icons/tabler/info-circle'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport DataHistogram from '../DataHistogram'\nimport { parseTargetValues, calculateVariance, formatVariance } from '../../utils/targetUtils'\nimport { filterIncompletePeriod } from '../../utils/periodUtils'\nimport type { ChartProps } from '../../types'\n\nconst KpiNumber = React.memo(function KpiNumber({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [fontSize, setFontSize] = useState(32)\n const [textWidth, setTextWidth] = useState(250)\n const containerRef = useRef<HTMLDivElement>(null)\n const valueRef = useRef<HTMLDivElement>(null)\n\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Extract value field from chart config - handle both string and array formats\n const valueFields = useMemo(() => {\n if (!chartConfig?.yAxis) return []\n if (typeof chartConfig.yAxis === 'string') return [chartConfig.yAxis]\n if (Array.isArray(chartConfig.yAxis)) return chartConfig.yAxis\n return []\n }, [chartConfig?.yAxis])\n\n const valueField = valueFields[0] || '' // Use first measure field\n\n // Get time dimension field if present (for incomplete period filtering)\n const timeDimensionField = queryObject?.timeDimensions?.[0]?.dimension || undefined\n\n // Memoize sorted data to prevent recalculation on every render\n const sortedData = useMemo(() => {\n if (!data || data.length === 0) return []\n let sorted = [...data]\n if (timeDimensionField) {\n sorted = sorted.sort((a, b) => {\n const aVal = a[timeDimensionField]\n const bVal = b[timeDimensionField]\n if (aVal < bVal) return -1\n if (aVal > bVal) return 1\n return 0\n })\n }\n return sorted\n }, [data, timeDimensionField])\n\n // Filter out incomplete or last period if enabled\n const { useLastCompletePeriod = true, skipLastPeriod = false } = displayConfig\n\n // Memoize filtered data\n const {\n filteredData,\n excludedIncompletePeriod,\n skippedLastPeriod,\n granularity\n } = useMemo(() => {\n if (sortedData.length === 0) {\n return { filteredData: [], excludedIncompletePeriod: false, skippedLastPeriod: false, granularity: undefined }\n }\n return filterIncompletePeriod(sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod)\n }, [sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod])\n\n // Use filtered data for calculations\n const dataToUse = filteredData\n\n // Memoize value extraction to prevent recalculation\n const values = useMemo(() => {\n if (!valueField || dataToUse.length === 0) return []\n\n const rawValues = dataToUse.map(row => {\n // Try direct field access first\n if (row[valueField] !== undefined) {\n return row[valueField]\n }\n\n // If not found, try finding the first numeric field as fallback\n const numericFields = Object.keys(row).filter(key =>\n typeof row[key] === 'number' && !isNaN(row[key])\n )\n\n if (numericFields.length > 0) {\n return row[numericFields[0]]\n }\n\n return undefined\n })\n\n return rawValues\n .filter(val => val !== null && val !== undefined && !isNaN(Number(val)))\n .map(val => Number(val))\n }, [dataToUse, valueField])\n\n // Memoize statistics calculations\n const { avg, min, max } = useMemo(() => {\n if (values.length === 0) return { avg: 0, min: 0, max: 0 }\n const sum = values.reduce((acc, val) => acc + val, 0)\n const avg = sum / values.length\n const min = Math.min(...values)\n const max = Math.max(...values)\n return { avg, min, max }\n }, [values])\n\n // Memoize format function to prevent re-creating on every render\n const formatNumber = useCallback((value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value)\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = displayConfig.decimals ?? 0\n const prefix = displayConfig.prefix ?? ''\n\n let formattedValue: string\n\n if (Math.abs(value) >= 1e9) {\n formattedValue = (value / 1e9).toFixed(decimals) + 'B'\n } else if (Math.abs(value) >= 1e6) {\n formattedValue = (value / 1e6).toFixed(decimals) + 'M'\n } else if (Math.abs(value) >= 1e3) {\n formattedValue = (value / 1e3).toFixed(decimals) + 'K'\n } else {\n formattedValue = value.toFixed(decimals)\n }\n\n return prefix + formattedValue\n }, [displayConfig])\n\n const mainValue = values.length === 1 ? values[0] : avg\n const showStats = values.length > 1\n\n // Memoize color calculation to prevent re-creating function on every render\n const valueColor = useMemo((): string => {\n if (displayConfig.valueColorIndex !== undefined && colorPalette?.colors) {\n const colorIndex = displayConfig.valueColorIndex\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex]\n }\n }\n // Default to first color in palette if available, otherwise fallback to dark gray\n return colorPalette?.colors?.[0] || '#1f2937'\n }, [displayConfig.valueColorIndex, colorPalette?.colors])\n\n // Process target values for variance calculation\n const targetValues = useMemo(() => parseTargetValues(displayConfig?.target || ''), [displayConfig?.target])\n const targetValue = targetValues.length > 0 ? targetValues[0] : null // Use first target value\n const variance = targetValue !== null && values.length > 0 ? calculateVariance(mainValue, targetValue) : null\n\n // Memoize variance color calculation\n const varianceColor = useMemo((): string => {\n if (variance === null) return '#6B7280' // Gray for no target\n\n if (variance >= 0) {\n // Positive variance - use positive color from palette\n const positiveIndex = displayConfig.positiveColorIndex ?? 1\n return colorPalette?.colors?.[positiveIndex] || '#10B981' // Green fallback\n } else {\n // Negative variance - use negative color from palette\n const negativeIndex = displayConfig.negativeColorIndex ?? 7\n return colorPalette?.colors?.[negativeIndex] || '#EF4444' // Red fallback\n }\n }, [variance, displayConfig.positiveColorIndex, displayConfig.negativeColorIndex, colorPalette?.colors])\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n\n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI displays, we want the text to be large and prominent\n // Reserve space for the label by using more conservative sizing\n const widthBasedSize = containerWidth / 5\n const heightBasedSize = containerHeight / 4 // More conservative to leave room for label\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(24, Math.min(baseFontSize, 120)) // Lower max to ensure label fits\n setFontSize(clampedFontSize)\n\n // Use a timeout to measure text width after font size is applied\n setTimeout(() => {\n if (valueRef.current) {\n const textRect = valueRef.current.getBoundingClientRect()\n const measuredWidth = textRect.width\n // Ensure we have a minimum width and use container width as fallback\n const effectiveWidth = Math.max(measuredWidth, Math.min(containerWidth * 0.6, 300))\n setTextWidth(effectiveWidth)\n }\n }, 10)\n }\n }\n }\n\n // Initial calculation - reduce delay for faster initial render\n const timer = setTimeout(updateDimensions, 50)\n\n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n setTimeout(updateDimensions, 10)\n })\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n // Early returns AFTER all hooks\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display</div>\n </div>\n </div>\n )\n }\n\n if (valueFields.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No measure fields configured</div>\n </div>\n </div>\n )\n }\n\n // Null handling: If all values are null, show placeholder instead of error\n if (values.length === 0) {\n return (\n <div\n ref={containerRef}\n className=\"flex flex-col items-center justify-center w-full h-full p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label */}\n <div\n className=\"text-dc-text-secondary font-bold text-center mb-3\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n {getFieldLabel(valueField)}\n </div>\n\n {/* No Data Placeholder */}\n <div\n className=\"font-bold leading-none text-dc-text-muted\"\n style={{\n fontSize: `${fontSize}px`\n }}\n >\n —\n </div>\n\n <div className=\"text-xs text-dc-text-muted mt-2\">No data</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className=\"flex flex-col items-center justify-center w-full h-full p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label - Bolder and bigger */}\n <div\n className=\"text-dc-text-secondary font-bold text-center mb-3 flex items-center justify-center gap-1\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n <span>\n {(() => {\n const label = getFieldLabel(valueField)\n // Temporary fix: if label seems wrong, use the field name directly\n const displayLabel = (label && label.length > 1) ? label : valueField\n return displayLabel\n })()}\n </span>\n {(excludedIncompletePeriod || skippedLastPeriod) && (\n <span\n title={skippedLastPeriod\n ? `Excludes last ${granularity || 'period'}`\n : `Excludes current incomplete ${granularity}`}\n className=\"cursor-help\"\n >\n <Icon icon={infoCircleIcon} className=\"w-4 h-4 text-dc-text-muted opacity-70\" />\n </span>\n )}\n </div>\n\n {/* Main KPI Value and Variance - Horizontal layout */}\n <div className=\"flex items-center justify-center gap-4 mb-3\">\n <div\n ref={valueRef}\n className=\"font-bold leading-none\"\n style={{\n fontSize: `${fontSize}px`,\n color: valueColor\n }}\n >\n {formatNumber(mainValue)}\n </div>\n\n {/* Target Variance Display - To the right of main value */}\n {targetValue !== null && variance !== null && (\n <div className=\"flex flex-col items-start\">\n <div\n className=\"font-semibold\"\n style={{\n fontSize: `${Math.max(12, fontSize * 0.3)}px`,\n color: varianceColor,\n lineHeight: '1.2'\n }}\n >\n {formatVariance(variance, 1)}\n </div>\n <div\n className=\"text-dc-text-muted text-xs\"\n style={{\n opacity: 0.7,\n fontSize: `${Math.max(10, fontSize * 0.2)}px`\n }}\n >\n vs {formatNumber(targetValue)}\n </div>\n </div>\n )}\n </div>\n\n {/* Unit/Suffix - Larger, not bold (hidden when formatValue is provided) */}\n {displayConfig.suffix && !displayConfig.formatValue && (\n <div\n className=\"text-dc-text-muted text-center\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2',\n opacity: 0.8\n }}\n >\n {displayConfig.suffix}\n </div>\n )}\n\n {/* Data Histogram for multiple values */}\n {showStats && (\n <div className=\"mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth}\n targetValue={targetValue || undefined}\n />\n </div>\n )}\n </div>\n )\n})\n\nexport default KpiNumber\n"],"names":["DataHistogram","values","min","max","color","bucketCount","height","formatValue","val","width","showAverageIndicator","targetValue","buckets","range","value","bucketIndex","maxBucketCount","average","sum","averagePosition","targetPosition","jsxs","count","i","normalizedHeight","minHeight","displayHeight","jsx","KpiNumber","React","data","chartConfig","displayConfig","queryObject","colorPalette","fontSize","setFontSize","useState","textWidth","setTextWidth","containerRef","useRef","valueRef","getFieldLabel","useCubeFieldLabel","valueFields","useMemo","valueField","timeDimensionField","sortedData","sorted","a","b","aVal","bVal","useLastCompletePeriod","skipLastPeriod","filteredData","excludedIncompletePeriod","skippedLastPeriod","granularity","filterIncompletePeriod","dataToUse","row","numericFields","key","avg","acc","formatNumber","useCallback","decimals","prefix","formattedValue","mainValue","showStats","valueColor","colorIndex","targetValues","parseTargetValues","variance","calculateVariance","varianceColor","positiveIndex","negativeIndex","useEffect","updateDimensions","rect","containerWidth","containerHeight","widthBasedSize","heightBasedSize","baseFontSize","clampedFontSize","measuredWidth","effectiveWidth","timer","resizeObserver","label","Icon","infoCircleIcon","formatVariance"],"mappings":"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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { barChartConfig as r } from "./chart-config-bar-Dy21oaIA.js";
|
|
2
|
-
import { lineChartConfig as o } from "./chart-config-line-BnLlRUQE.js";
|
|
3
|
-
import { areaChartConfig as i } from "./chart-config-area-OApsRaYC.js";
|
|
4
|
-
import { pieChartConfig as t } from "./chart-config-pie-O9y_T0BQ.js";
|
|
5
|
-
import { scatterChartConfig as a } from "./chart-config-scatter-BTt8a10R.js";
|
|
6
|
-
import { bubbleChartConfig as m } from "./chart-config-bubble-Chv0SoFm.js";
|
|
7
|
-
import { radarChartConfig as f } from "./chart-config-radar-CXa0354h.js";
|
|
8
|
-
import { radialBarChartConfig as C } from "./chart-config-radial-bar-BppJU8-Q.js";
|
|
9
|
-
import { treemapChartConfig as n } from "./chart-config-tree-map-HVgG4oa0.js";
|
|
10
|
-
import { dataTableConfig as p } from "./chart-config-data-table-DTIdC35a.js";
|
|
11
|
-
import { activityGridChartConfig as e } from "./chart-config-activity-grid-Bkvx0F-G.js";
|
|
12
|
-
import { kpiNumberConfig as g } from "./chart-config-kpi-number-DkE3eSwH.js";
|
|
13
|
-
import { kpiDeltaConfig as h } from "./chart-config-kpi-delta-CCl1d-St.js";
|
|
14
|
-
import { kpiTextConfig as b } from "./chart-config-kpi-text-BMbgdxZm.js";
|
|
15
|
-
import { markdownConfig as l } from "./chart-config-markdown-DIaMFC0Z.js";
|
|
16
|
-
import { funnelChartConfig as k } from "./chart-config-funnel-f17Livgr.js";
|
|
17
|
-
import { sankeyChartConfig as s } from "./chart-config-sankey-BfBHgL4x.js";
|
|
18
|
-
import { sunburstChartConfig as u } from "./chart-config-sunburst-DNmQpIIx.js";
|
|
19
|
-
import { heatmapChartConfig as d } from "./chart-config-heat-map-DPhNICha.js";
|
|
20
|
-
const J = {
|
|
21
|
-
bar: r,
|
|
22
|
-
line: o,
|
|
23
|
-
area: i,
|
|
24
|
-
pie: t,
|
|
25
|
-
scatter: a,
|
|
26
|
-
bubble: m,
|
|
27
|
-
radar: f,
|
|
28
|
-
radialBar: C,
|
|
29
|
-
treemap: n,
|
|
30
|
-
table: p,
|
|
31
|
-
activityGrid: e,
|
|
32
|
-
kpiNumber: g,
|
|
33
|
-
kpiDelta: h,
|
|
34
|
-
kpiText: b,
|
|
35
|
-
markdown: l,
|
|
36
|
-
funnel: k,
|
|
37
|
-
sankey: s,
|
|
38
|
-
sunburst: u,
|
|
39
|
-
heatmap: d
|
|
40
|
-
};
|
|
41
|
-
export {
|
|
42
|
-
J as chartConfigRegistry
|
|
43
|
-
};
|
|
44
|
-
//# sourceMappingURL=chartConfigRegistry-CiOq-PqX.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"charts-loader-BtsnUO4Q.js","sources":["../../../src/client/components/charts/MissingDependencyFallback.tsx","../../../src/client/charts/ChartLoader.tsx"],"sourcesContent":["interface MissingDependencyFallbackProps {\n chartType: string\n packageName: string\n installCommand: string\n height?: string | number\n}\n\n/**\n * Fallback component shown when a chart's optional dependency is not installed.\n * Provides clear instructions on how to install the missing package.\n */\nexport function MissingDependencyFallback({\n chartType,\n packageName,\n installCommand,\n height = 200\n}: MissingDependencyFallbackProps) {\n return (\n <div\n className=\"dc-missing-dependency-fallback\"\n style={{\n height: typeof height === 'number' ? `${height}px` : height,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n padding: '1.5rem',\n textAlign: 'center',\n border: '1px dashed var(--dc-border, #e5e7eb)',\n borderRadius: '0.5rem',\n backgroundColor: 'var(--dc-surface, #f9fafb)'\n }}\n >\n <div style={{ fontSize: '2.5rem', marginBottom: '1rem' }}>📦</div>\n <h3 style={{\n fontSize: '1.125rem',\n fontWeight: 600,\n marginBottom: '0.5rem',\n color: 'var(--dc-text, #111827)'\n }}>\n Missing Dependency\n </h3>\n <p style={{\n fontSize: '0.875rem',\n color: 'var(--dc-text-secondary, #6b7280)',\n marginBottom: '1rem',\n maxWidth: '28rem'\n }}>\n The <code style={{\n padding: '0.125rem 0.375rem',\n backgroundColor: 'var(--dc-surface-secondary, #f3f4f6)',\n borderRadius: '0.25rem',\n fontFamily: 'monospace',\n fontSize: '0.75rem'\n }}>{chartType}</code> chart requires the <code style={{\n padding: '0.125rem 0.375rem',\n backgroundColor: 'var(--dc-surface-secondary, #f3f4f6)',\n borderRadius: '0.25rem',\n fontFamily: 'monospace',\n fontSize: '0.75rem'\n }}>{packageName}</code> package.\n </p>\n <div style={{\n backgroundColor: 'var(--dc-surface-secondary, #f3f4f6)',\n borderRadius: '0.5rem',\n padding: '0.75rem 1rem',\n fontFamily: 'monospace',\n fontSize: '0.875rem',\n color: 'var(--dc-text, #111827)'\n }}>\n <span style={{\n color: 'var(--dc-text-muted, #9ca3af)',\n userSelect: 'none'\n }}>$ </span>\n {installCommand}\n </div>\n <p style={{\n fontSize: '0.75rem',\n color: 'var(--dc-text-muted, #9ca3af)',\n marginTop: '0.75rem'\n }}>\n After installing, restart your development server.\n </p>\n </div>\n )\n}\n","/**\n * Lazy Chart Loader\n *\n * Provides React.lazy-based dynamic loading for chart components.\n * This enables code splitting - each chart type loads only when needed.\n *\n * Handles missing optional dependencies gracefully by showing a fallback\n * component instead of crashing the application.\n */\n\nimport { lazy, Suspense, ComponentType, ReactNode, LazyExoticComponent } from 'react'\nimport type { ChartType, ChartProps } from '../types'\nimport { MissingDependencyFallback } from '../components/charts/MissingDependencyFallback'\n\n// Type for lazy-loaded chart components\ntype LazyChartComponent = ComponentType<ChartProps>\n\n// Chart loader cache to prevent re-creating lazy components\nconst chartLoaderCache = new Map<ChartType, LazyExoticComponent<LazyChartComponent>>()\n\n// Track which chart types have failed to load due to missing dependencies\nconst failedChartTypes = new Set<ChartType>()\n\n/**\n * Maps chart types to their optional peer dependencies.\n * Charts not listed here have no external dependencies (table, KPIs, markdown).\n */\nconst chartDependencyMap: Partial<Record<ChartType, { packageName: string; installCommand: string }>> = {\n // Recharts-based charts\n bar: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n line: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n area: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n pie: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n scatter: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n radar: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n radialBar: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n treemap: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n bubble: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n funnel: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n sankey: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n sunburst: {\n packageName: 'recharts',\n installCommand: 'npm install recharts'\n },\n // Nivo-based charts\n heatmap: {\n packageName: '@nivo/heatmap',\n installCommand: 'npm install @nivo/heatmap'\n }\n // Charts with no external deps: table, activityGrid, kpiNumber, kpiDelta, kpiText, markdown\n}\n\n// Dynamic import functions for each chart type\nconst chartImportMap: Record<ChartType, () => Promise<{ default: LazyChartComponent }>> = {\n bar: () => import('../components/charts/BarChart'),\n line: () => import('../components/charts/LineChart'),\n area: () => import('../components/charts/AreaChart'),\n pie: () => import('../components/charts/PieChart'),\n scatter: () => import('../components/charts/ScatterChart'),\n radar: () => import('../components/charts/RadarChart'),\n radialBar: () => import('../components/charts/RadialBarChart'),\n treemap: () => import('../components/charts/TreeMapChart'),\n bubble: () => import('../components/charts/BubbleChart'),\n table: () => import('../components/charts/DataTable'),\n activityGrid: () => import('../components/charts/ActivityGridChart'),\n kpiNumber: () => import('../components/charts/KpiNumber'),\n kpiDelta: () => import('../components/charts/KpiDelta'),\n kpiText: () => import('../components/charts/KpiText'),\n markdown: () => import('../components/charts/MarkdownChart'),\n funnel: () => import('../components/charts/FunnelChart'),\n sankey: () => import('../components/charts/SankeyChart'),\n sunburst: () => import('../components/charts/SunburstChart'),\n heatmap: () => import('../components/charts/HeatMapChart'),\n}\n\n/**\n * Creates a fallback component for a chart type with missing dependencies.\n */\nfunction createFallbackComponent(chartType: ChartType): LazyChartComponent {\n const depInfo = chartDependencyMap[chartType]\n\n const FallbackComponent: LazyChartComponent = ({ height }) => (\n <MissingDependencyFallback\n chartType={chartType}\n packageName={depInfo?.packageName || 'unknown'}\n installCommand={depInfo?.installCommand || `npm install [package-name]`}\n height={height}\n />\n )\n\n FallbackComponent.displayName = `${chartType}Fallback`\n return FallbackComponent\n}\n\n/**\n * Wraps a chart import function with error handling.\n * If the import fails (e.g., missing dependency), returns a fallback component.\n */\nfunction createSafeImport(\n chartType: ChartType,\n importFn: () => Promise<{ default: LazyChartComponent }>\n): () => Promise<{ default: LazyChartComponent }> {\n return async () => {\n try {\n return await importFn()\n } catch (error) {\n // Log the error for debugging\n console.warn(\n `[drizzle-cube] Failed to load ${chartType} chart:`,\n error instanceof Error ? error.message : error\n )\n\n // Track that this chart type failed\n failedChartTypes.add(chartType)\n\n // Return the fallback component wrapped in the expected format\n return { default: createFallbackComponent(chartType) }\n }\n }\n}\n\n/**\n * Get or create a lazy component for a chart type.\n * Handles import failures gracefully by returning a fallback component.\n */\nfunction getLazyChart(chartType: ChartType): LazyExoticComponent<LazyChartComponent> {\n if (!chartLoaderCache.has(chartType)) {\n const importFn = chartImportMap[chartType]\n if (!importFn) {\n throw new Error(`Unknown chart type: ${chartType}`)\n }\n // Wrap the import with error handling for graceful degradation\n const safeImport = createSafeImport(chartType, importFn)\n chartLoaderCache.set(chartType, lazy(safeImport))\n }\n return chartLoaderCache.get(chartType)!\n}\n\n/**\n * Check if a chart type is supported\n */\nexport function isValidChartType(chartType: string): chartType is ChartType {\n return chartType in chartImportMap\n}\n\n// Props for the LazyChart wrapper\nexport interface LazyChartProps extends ChartProps {\n chartType: ChartType\n fallback?: ReactNode\n}\n\n/**\n * Default loading placeholder for charts\n */\nfunction DefaultChartFallback({ height }: { height?: string | number }) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height: typeof height === 'number' ? `${height}px` : height || '200px' }}\n >\n <div className=\"animate-pulse bg-dc-surface-secondary rounded w-full h-full min-h-[100px]\" />\n </div>\n )\n}\n\n/**\n * Lazy Chart Component\n *\n * Renders a chart component with React.lazy dynamic loading.\n * The chart type determines which chart component is loaded.\n *\n * @example\n * ```tsx\n * <LazyChart\n * chartType=\"bar\"\n * data={chartData}\n * chartConfig={{ yAxis: ['value'] }}\n * height={300}\n * />\n * ```\n */\nexport function LazyChart({\n chartType,\n fallback,\n height,\n ...chartProps\n}: LazyChartProps) {\n const ChartComponent = getLazyChart(chartType)\n\n return (\n <Suspense fallback={fallback ?? <DefaultChartFallback height={height} />}>\n <ChartComponent height={height} {...chartProps} />\n </Suspense>\n )\n}\n\n/**\n * Preload a chart type\n *\n * Triggers the dynamic import without rendering.\n * Useful for prefetching charts that will likely be needed.\n *\n * @example\n * ```tsx\n * // Preload bar chart on hover\n * onMouseEnter={() => preloadChart('bar')}\n * ```\n */\nexport function preloadChart(chartType: ChartType): void {\n const importFn = chartImportMap[chartType]\n if (importFn) {\n importFn()\n }\n}\n\n/**\n * Preload multiple chart types\n *\n * @example\n * ```tsx\n * // Preload common charts on app init\n * useEffect(() => {\n * preloadCharts(['bar', 'line', 'pie'])\n * }, [])\n * ```\n */\nexport function preloadCharts(chartTypes: ChartType[]): void {\n chartTypes.forEach(preloadChart)\n}\n\n/**\n * Get all available chart types\n */\nexport function getAvailableChartTypes(): ChartType[] {\n return Object.keys(chartImportMap) as ChartType[]\n}\n\n/**\n * Check if a chart type has loaded successfully.\n * Returns false if the chart failed to load due to missing dependencies.\n *\n * Note: This only returns accurate results after the chart has been attempted to load.\n * Use this for conditional UI logic (e.g., hiding unavailable chart types).\n */\nexport function isChartTypeAvailable(chartType: ChartType): boolean {\n return !failedChartTypes.has(chartType)\n}\n\n/**\n * Get list of chart types that failed to load due to missing dependencies.\n */\nexport function getUnavailableChartTypes(): ChartType[] {\n return Array.from(failedChartTypes)\n}\n"],"names":["MissingDependencyFallback","chartType","packageName","installCommand","height","jsxs","jsx","chartLoaderCache","failedChartTypes","chartDependencyMap","chartImportMap","n","createFallbackComponent","depInfo","FallbackComponent","createSafeImport","importFn","error","getLazyChart","safeImport","lazy","isValidChartType","DefaultChartFallback","LazyChart","fallback","chartProps","ChartComponent","Suspense","preloadChart","preloadCharts","chartTypes","getAvailableChartTypes","isChartTypeAvailable","getUnavailableChartTypes"],"mappings":"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"}
|