drizzle-cube 0.3.13 → 0.3.16

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 (182) hide show
  1. package/dist/adapters/express/index.cjs +1 -1
  2. package/dist/adapters/express/index.d.ts +8 -1
  3. package/dist/adapters/express/index.js +162 -99
  4. package/dist/adapters/fastify/index.cjs +1 -1
  5. package/dist/adapters/fastify/index.d.ts +8 -1
  6. package/dist/adapters/fastify/index.js +183 -96
  7. package/dist/adapters/hono/index.cjs +1 -1
  8. package/dist/adapters/hono/index.d.ts +8 -1
  9. package/dist/adapters/hono/index.js +198 -142
  10. package/dist/adapters/nextjs/index.cjs +1 -1
  11. package/dist/adapters/nextjs/index.d.ts +29 -1
  12. package/dist/adapters/nextjs/index.js +251 -132
  13. package/dist/adapters/utils.d.ts +100 -1
  14. package/dist/adapters/validation-Bgauxvm6.cjs +214 -0
  15. package/dist/adapters/{compiler-DTOU8IsK.js → validation-_UkKJ2pC.js} +9582 -5295
  16. package/dist/client/adapters/index.d.ts +2 -0
  17. package/dist/client/adapters/retentionModeAdapter.d.ts +3 -0
  18. package/dist/client/charts.js +12 -12
  19. package/dist/client/chunks/RetentionCombinedChart-DirfDaZH.js +256 -0
  20. package/dist/client/chunks/RetentionCombinedChart-DirfDaZH.js.map +1 -0
  21. package/dist/client/chunks/RetentionCombinedChart.config-C-ILIaEb.js +47 -0
  22. package/dist/client/chunks/RetentionCombinedChart.config-C-ILIaEb.js.map +1 -0
  23. package/dist/client/chunks/RetentionHeatmap-Bofadstm.js +178 -0
  24. package/dist/client/chunks/RetentionHeatmap-Bofadstm.js.map +1 -0
  25. package/dist/client/chunks/RetentionHeatmap.config-CIvhc-GT.js +28 -0
  26. package/dist/client/chunks/RetentionHeatmap.config-CIvhc-GT.js.map +1 -0
  27. package/dist/client/chunks/analysis-builder-APeCxkEH.js +6939 -0
  28. package/dist/client/chunks/analysis-builder-APeCxkEH.js.map +1 -0
  29. package/dist/client/chunks/analysis-builder-shared-DEovRjrp.js +2779 -0
  30. package/dist/client/chunks/analysis-builder-shared-DEovRjrp.js.map +1 -0
  31. package/dist/client/chunks/{chart-activity-grid-CuPARsr1.js → chart-activity-grid-BnweuBvr.js} +11 -11
  32. package/dist/client/chunks/{chart-activity-grid-CuPARsr1.js.map → chart-activity-grid-BnweuBvr.js.map} +1 -1
  33. package/dist/client/chunks/{chart-area-cPrJnhLj.js → chart-area-DLmXFWWy.js} +2 -2
  34. package/dist/client/chunks/{chart-area-cPrJnhLj.js.map → chart-area-DLmXFWWy.js.map} +1 -1
  35. package/dist/client/chunks/{chart-bar-D68HFPpa.js → chart-bar-7y0-F27Q.js} +2 -2
  36. package/dist/client/chunks/{chart-bar-D68HFPpa.js.map → chart-bar-7y0-F27Q.js.map} +1 -1
  37. package/dist/client/chunks/{chart-bubble-CquyYfNO.js → chart-bubble-3jYKCA2B.js} +2 -2
  38. package/dist/client/chunks/{chart-bubble-CquyYfNO.js.map → chart-bubble-3jYKCA2B.js.map} +1 -1
  39. package/dist/client/chunks/{chart-config-activity-grid-Bkvx0F-G.js → chart-config-activity-grid-BBSNCbkb.js} +2 -2
  40. package/dist/client/chunks/{chart-config-activity-grid-Bkvx0F-G.js.map → chart-config-activity-grid-BBSNCbkb.js.map} +1 -1
  41. package/dist/client/chunks/{chart-config-area-OApsRaYC.js → chart-config-area-CyyJOO2T.js} +2 -2
  42. package/dist/client/chunks/{chart-config-area-OApsRaYC.js.map → chart-config-area-CyyJOO2T.js.map} +1 -1
  43. package/dist/client/chunks/{chart-config-bar-Dy21oaIA.js → chart-config-bar-BJKGnfLt.js} +2 -2
  44. package/dist/client/chunks/{chart-config-bar-Dy21oaIA.js.map → chart-config-bar-BJKGnfLt.js.map} +1 -1
  45. package/dist/client/chunks/{chart-config-bubble-Chv0SoFm.js → chart-config-bubble-CuSsCHZ4.js} +2 -2
  46. package/dist/client/chunks/{chart-config-bubble-Chv0SoFm.js.map → chart-config-bubble-CuSsCHZ4.js.map} +1 -1
  47. package/dist/client/chunks/{chart-config-data-table-DTIdC35a.js → chart-config-data-table-BhgqwoqT.js} +2 -2
  48. package/dist/client/chunks/{chart-config-data-table-DTIdC35a.js.map → chart-config-data-table-BhgqwoqT.js.map} +1 -1
  49. package/dist/client/chunks/{chart-config-funnel-f17Livgr.js → chart-config-funnel-BlSQYng0.js} +4 -4
  50. package/dist/client/chunks/{chart-config-funnel-f17Livgr.js.map → chart-config-funnel-BlSQYng0.js.map} +1 -1
  51. package/dist/client/chunks/{chart-config-heat-map-DPhNICha.js → chart-config-heat-map-DHQGFZhX.js} +2 -2
  52. package/dist/client/chunks/{chart-config-heat-map-DPhNICha.js.map → chart-config-heat-map-DHQGFZhX.js.map} +1 -1
  53. package/dist/client/chunks/{chart-config-kpi-delta-CCl1d-St.js → chart-config-kpi-delta-yTA5ug_l.js} +2 -2
  54. package/dist/client/chunks/{chart-config-kpi-delta-CCl1d-St.js.map → chart-config-kpi-delta-yTA5ug_l.js.map} +1 -1
  55. package/dist/client/chunks/{chart-config-kpi-number-DkE3eSwH.js → chart-config-kpi-number-nVAwDXzq.js} +2 -2
  56. package/dist/client/chunks/{chart-config-kpi-number-DkE3eSwH.js.map → chart-config-kpi-number-nVAwDXzq.js.map} +1 -1
  57. package/dist/client/chunks/{chart-config-kpi-text-BMbgdxZm.js → chart-config-kpi-text-DZjqsx-b.js} +2 -2
  58. package/dist/client/chunks/{chart-config-kpi-text-BMbgdxZm.js.map → chart-config-kpi-text-DZjqsx-b.js.map} +1 -1
  59. package/dist/client/chunks/{chart-config-line-BnLlRUQE.js → chart-config-line-DR0ThxZy.js} +2 -2
  60. package/dist/client/chunks/{chart-config-line-BnLlRUQE.js.map → chart-config-line-DR0ThxZy.js.map} +1 -1
  61. package/dist/client/chunks/{chart-config-markdown-DIaMFC0Z.js → chart-config-markdown-DZxdGNVQ.js} +2 -2
  62. package/dist/client/chunks/{chart-config-markdown-DIaMFC0Z.js.map → chart-config-markdown-DZxdGNVQ.js.map} +1 -1
  63. package/dist/client/chunks/{chart-config-pie-O9y_T0BQ.js → chart-config-pie-BM5lgH-w.js} +2 -2
  64. package/dist/client/chunks/{chart-config-pie-O9y_T0BQ.js.map → chart-config-pie-BM5lgH-w.js.map} +1 -1
  65. package/dist/client/chunks/{chart-config-radar-CXa0354h.js → chart-config-radar-BBAVIF0S.js} +2 -2
  66. package/dist/client/chunks/{chart-config-radar-CXa0354h.js.map → chart-config-radar-BBAVIF0S.js.map} +1 -1
  67. package/dist/client/chunks/{chart-config-radial-bar-BppJU8-Q.js → chart-config-radial-bar-CTwjDRnB.js} +2 -2
  68. package/dist/client/chunks/{chart-config-radial-bar-BppJU8-Q.js.map → chart-config-radial-bar-CTwjDRnB.js.map} +1 -1
  69. package/dist/client/chunks/{chart-config-sankey-BfBHgL4x.js → chart-config-sankey-CNAgsMQ4.js} +2 -2
  70. package/dist/client/chunks/{chart-config-sankey-BfBHgL4x.js.map → chart-config-sankey-CNAgsMQ4.js.map} +1 -1
  71. package/dist/client/chunks/{chart-config-scatter-BTt8a10R.js → chart-config-scatter-CWvN2E-X.js} +2 -2
  72. package/dist/client/chunks/{chart-config-scatter-BTt8a10R.js.map → chart-config-scatter-CWvN2E-X.js.map} +1 -1
  73. package/dist/client/chunks/{chart-config-sunburst-DNmQpIIx.js → chart-config-sunburst-W_SKwaj0.js} +4 -4
  74. package/dist/client/chunks/{chart-config-sunburst-DNmQpIIx.js.map → chart-config-sunburst-W_SKwaj0.js.map} +1 -1
  75. package/dist/client/chunks/{chart-config-tree-map-HVgG4oa0.js → chart-config-tree-map-CLmRvvMR.js} +2 -2
  76. package/dist/client/chunks/{chart-config-tree-map-HVgG4oa0.js.map → chart-config-tree-map-CLmRvvMR.js.map} +1 -1
  77. package/dist/client/chunks/{chart-data-table-D4WDqbM0.js → chart-data-table-rUFLqysu.js} +4 -4
  78. package/dist/client/chunks/{chart-data-table-D4WDqbM0.js.map → chart-data-table-rUFLqysu.js.map} +1 -1
  79. package/dist/client/chunks/{chart-funnel-Csdn4FbN.js → chart-funnel-C7zGBfSw.js} +2 -2
  80. package/dist/client/chunks/{chart-funnel-Csdn4FbN.js.map → chart-funnel-C7zGBfSw.js.map} +1 -1
  81. package/dist/client/chunks/{chart-heat-map-v1afxnjq.js → chart-heat-map-B-l8hK8b.js} +2 -2
  82. package/dist/client/chunks/{chart-heat-map-v1afxnjq.js.map → chart-heat-map-B-l8hK8b.js.map} +1 -1
  83. package/dist/client/chunks/chart-kpi-delta-sfZEvQZm.js +351 -0
  84. package/dist/client/chunks/chart-kpi-delta-sfZEvQZm.js.map +1 -0
  85. package/dist/client/chunks/chart-kpi-number-BxGNOtzI.js +473 -0
  86. package/dist/client/chunks/chart-kpi-number-BxGNOtzI.js.map +1 -0
  87. package/dist/client/chunks/{chart-kpi-text-CRp8QWYG.js → chart-kpi-text-BLQ_CWQP.js} +3 -3
  88. package/dist/client/chunks/{chart-kpi-text-CRp8QWYG.js.map → chart-kpi-text-BLQ_CWQP.js.map} +1 -1
  89. package/dist/client/chunks/{chart-line-DqqE7ky9.js → chart-line-FSEpBk6Y.js} +5 -5
  90. package/dist/client/chunks/{chart-line-DqqE7ky9.js.map → chart-line-FSEpBk6Y.js.map} +1 -1
  91. package/dist/client/chunks/{chart-pie-B5WBzIRH.js → chart-pie-BRQEH9e-.js} +2 -2
  92. package/dist/client/chunks/{chart-pie-B5WBzIRH.js.map → chart-pie-BRQEH9e-.js.map} +1 -1
  93. package/dist/client/chunks/{chart-radar-DL_dvhA-.js → chart-radar-DgsFyiIP.js} +2 -2
  94. package/dist/client/chunks/{chart-radar-DL_dvhA-.js.map → chart-radar-DgsFyiIP.js.map} +1 -1
  95. package/dist/client/chunks/{chart-radial-bar-DDRo6nz-.js → chart-radial-bar-CUMoXyl9.js} +2 -2
  96. package/dist/client/chunks/{chart-radial-bar-DDRo6nz-.js.map → chart-radial-bar-CUMoXyl9.js.map} +1 -1
  97. package/dist/client/chunks/{chart-sankey-C_bgIfg-.js → chart-sankey-IAKDEe7A.js} +2 -2
  98. package/dist/client/chunks/{chart-sankey-C_bgIfg-.js.map → chart-sankey-IAKDEe7A.js.map} +1 -1
  99. package/dist/client/chunks/{chart-scatter-DjmJRlK0.js → chart-scatter-D6XwOD2W.js} +15 -15
  100. package/dist/client/chunks/{chart-scatter-DjmJRlK0.js.map → chart-scatter-D6XwOD2W.js.map} +1 -1
  101. package/dist/client/chunks/{chart-sunburst-CbMEnaes.js → chart-sunburst-CP_pnj0S.js} +2 -2
  102. package/dist/client/chunks/{chart-sunburst-CbMEnaes.js.map → chart-sunburst-CP_pnj0S.js.map} +1 -1
  103. package/dist/client/chunks/{chart-tree-map-DEfJtJVC.js → chart-tree-map-DQMsn47a.js} +30 -30
  104. package/dist/client/chunks/{chart-tree-map-DEfJtJVC.js.map → chart-tree-map-DQMsn47a.js.map} +1 -1
  105. package/dist/client/chunks/chartConfigRegistry-BumUIPw4.js +44 -0
  106. package/dist/client/chunks/{chartConfigRegistry-CiOq-PqX.js.map → chartConfigRegistry-BumUIPw4.js.map} +1 -1
  107. package/dist/client/chunks/charts-Dk_9XrA7.js +230 -0
  108. package/dist/client/chunks/charts-Dk_9XrA7.js.map +1 -0
  109. package/dist/client/chunks/{charts-core-CXrhEEVF.js → charts-core-CjQZBxmv.js} +10 -10
  110. package/dist/client/chunks/{charts-core-CXrhEEVF.js.map → charts-core-CjQZBxmv.js.map} +1 -1
  111. package/dist/client/chunks/{charts-loader-BtsnUO4Q.js → charts-loader-ChTUa_-G.js} +30 -28
  112. package/dist/client/chunks/charts-loader-ChTUa_-G.js.map +1 -0
  113. package/dist/client/chunks/{components-BDrlf9Er.js → components-BKZ7EAg0.js} +3575 -3208
  114. package/dist/client/chunks/components-BKZ7EAg0.js.map +1 -0
  115. package/dist/client/chunks/{core-B8zw0qRf.js → core-BRC075EG.js} +2 -2
  116. package/dist/client/chunks/{core-B8zw0qRf.js.map → core-BRC075EG.js.map} +1 -1
  117. package/dist/client/chunks/hooks-D7APQ8uS.js +150 -0
  118. package/dist/client/chunks/{hooks-B8Zw5PfL.js.map → hooks-D7APQ8uS.js.map} +1 -1
  119. package/dist/client/chunks/{icons-NzFHtqeM.js → icons-DRreo6m8.js} +128 -112
  120. package/dist/client/chunks/{icons-NzFHtqeM.js.map → icons-DRreo6m8.js.map} +1 -1
  121. package/dist/client/chunks/{providers-CqCiJTEj.js → providers-Cj7PQfXn.js} +2 -2
  122. package/dist/client/chunks/{providers-CqCiJTEj.js.map → providers-Cj7PQfXn.js.map} +1 -1
  123. package/dist/client/chunks/retention-CzCo8262.js +120 -0
  124. package/dist/client/chunks/retention-CzCo8262.js.map +1 -0
  125. package/dist/client/chunks/{useDirtyStateTracking-C_mitVwh.js → useDirtyStateTracking-ZSi3voVl.js} +101 -99
  126. package/dist/client/chunks/useDirtyStateTracking-ZSi3voVl.js.map +1 -0
  127. package/dist/client/chunks/{vendor-DzzxS7Ay.js → vendor-cTQhZ_G3.js} +549 -541
  128. package/dist/client/chunks/vendor-cTQhZ_G3.js.map +1 -0
  129. package/dist/client/components/AnalysisBuilder/AnalysisTypeSelector.d.ts +3 -1
  130. package/dist/client/components/AnalysisBuilder/RetentionConfigPanel.d.ts +36 -0
  131. package/dist/client/components/AnalysisBuilder/RetentionModeContent.d.ts +71 -0
  132. package/dist/client/components/AnalysisBuilder/types.d.ts +99 -0
  133. package/dist/client/components/DebugModal.d.ts +2 -1
  134. package/dist/client/components/charts/RetentionCombinedChart.config.d.ts +2 -0
  135. package/dist/client/components/charts/RetentionCombinedChart.d.ts +14 -0
  136. package/dist/client/components/charts/RetentionHeatmap.config.d.ts +2 -0
  137. package/dist/client/components/charts/RetentionHeatmap.d.ts +7 -0
  138. package/dist/client/components.js +2 -2
  139. package/dist/client/hooks/queries/index.d.ts +2 -1
  140. package/dist/client/hooks/queries/useDryRunQuery.d.ts +26 -0
  141. package/dist/client/hooks/queries/useExplainQuery.d.ts +3 -1
  142. package/dist/client/hooks/queries/useFlowQuery.d.ts +5 -0
  143. package/dist/client/hooks/queries/useRetentionQuery.d.ts +67 -0
  144. package/dist/client/hooks/useAnalysisBuilderHook.d.ts +61 -0
  145. package/dist/client/hooks/useAnalysisQueryExecution.d.ts +42 -1
  146. package/dist/client/hooks.js +3 -3
  147. package/dist/client/icons/customIcons.d.ts +7 -0
  148. package/dist/client/icons/types.d.ts +1 -0
  149. package/dist/client/icons.js +1 -1
  150. package/dist/client/index.js +11 -11
  151. package/dist/client/providers.js +1 -1
  152. package/dist/client/stores/analysisBuilderStore.d.ts +86 -1
  153. package/dist/client/stores/dashboardStore.d.ts +2 -1
  154. package/dist/client/stores/slices/index.d.ts +2 -0
  155. package/dist/client/stores/slices/retentionSlice.d.ts +66 -0
  156. package/dist/client/styles.css +1 -1
  157. package/dist/client/types/analysisConfig.d.ts +29 -4
  158. package/dist/client/types/funnel.d.ts +5 -0
  159. package/dist/client/types/retention.d.ts +301 -0
  160. package/dist/client/types.d.ts +6 -3
  161. package/dist/client-bundle-stats.html +1 -1
  162. package/dist/server/index.cjs +101 -79
  163. package/dist/server/index.d.ts +427 -0
  164. package/dist/server/index.js +9140 -4934
  165. package/package.json +5 -2
  166. package/dist/adapters/compiler-CO13DaEb.cjs +0 -192
  167. package/dist/client/chunks/analysis-builder-Dc9NrG_N.js +0 -6013
  168. package/dist/client/chunks/analysis-builder-Dc9NrG_N.js.map +0 -1
  169. package/dist/client/chunks/analysis-builder-shared-B3-UWqQ2.js +0 -2540
  170. package/dist/client/chunks/analysis-builder-shared-B3-UWqQ2.js.map +0 -1
  171. package/dist/client/chunks/chart-kpi-delta-Bs5R5xr4.js +0 -435
  172. package/dist/client/chunks/chart-kpi-delta-Bs5R5xr4.js.map +0 -1
  173. package/dist/client/chunks/chart-kpi-number-Cf4Pgkm9.js +0 -392
  174. package/dist/client/chunks/chart-kpi-number-Cf4Pgkm9.js.map +0 -1
  175. package/dist/client/chunks/chartConfigRegistry-CiOq-PqX.js +0 -44
  176. package/dist/client/chunks/charts-loader-BtsnUO4Q.js.map +0 -1
  177. package/dist/client/chunks/charts-xNubY0vm.js +0 -226
  178. package/dist/client/chunks/charts-xNubY0vm.js.map +0 -1
  179. package/dist/client/chunks/components-BDrlf9Er.js.map +0 -1
  180. package/dist/client/chunks/hooks-B8Zw5PfL.js +0 -123
  181. package/dist/client/chunks/useDirtyStateTracking-C_mitVwh.js.map +0 -1
  182. package/dist/client/chunks/vendor-DzzxS7Ay.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { jsx as y, jsxs as te } from "react/jsx-runtime";
2
2
  import Ae, { useSyncExternalStore as Fe, useCallback as Se, useRef as ne, useState as oe, useMemo as we, useLayoutEffect as ve, useEffect as ce } from "react";
3
3
  import { select as D, scaleLinear as de, extent as ue, scaleSqrt as ze, max as Te, scaleQuantize as $e, scaleOrdinal as me, axisBottom as xe, axisLeft as fe } from "d3";
4
- import { u as Ne, g as ke, f as ye, i as Ye, h as he, a as pe, C as ge, e as se, c as N } from "./charts-core-CXrhEEVF.js";
4
+ import { u as Ne, g as ke, d as ye, i as Ye, e as he, C as pe, h as ge, c as se, f as N } from "./charts-core-CjQZBxmv.js";
5
5
  import { g as be, s as Re, w as Ve } from "./theme-Dp3hFed1.js";
6
6
  const H = {
7
7
  listeners: /* @__PURE__ */ new Set(),
@@ -246,4 +246,4 @@ export {
246
246
  He as B,
247
247
  Be as u
248
248
  };
249
- //# sourceMappingURL=chart-bubble-CquyYfNO.js.map
249
+ //# sourceMappingURL=chart-bubble-3jYKCA2B.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-bubble-CquyYfNO.js","sources":["../../../src/client/hooks/useTheme.ts","../../../src/client/components/charts/BubbleChart.tsx"],"sourcesContent":["/**\n * useTheme - External Theme State Hook\n *\n * Uses React 18's useSyncExternalStore to prevent parent component re-renders.\n * The theme state is stored externally and changes are propagated through\n * a subscribe/notify pattern.\n *\n * This prevents the ThemeToggle component from causing Layout re-renders.\n */\n\nimport { useSyncExternalStore, useCallback } from 'react'\nimport { getTheme, setTheme as setThemeUtil, watchThemeChanges, type Theme } from '../theme'\n\n// External store for theme state\nconst themeStore = {\n listeners: new Set<() => void>(),\n\n subscribe(listener: () => void) {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n },\n\n notify() {\n this.listeners.forEach(listener => listener())\n }\n}\n\n// Watch theme changes from DOM/system and notify subscribers\nwatchThemeChanges(() => {\n themeStore.notify()\n})\n\n/**\n * Hook to access and update theme\n *\n * Returns current theme and a setter function.\n * Only components using this hook will re-render on theme changes.\n */\nexport function useTheme() {\n // Subscribe to external theme store\n const theme = useSyncExternalStore(\n themeStore.subscribe.bind(themeStore),\n getTheme, // Client-side snapshot\n getTheme // Server-side snapshot (SSR)\n )\n\n // Stable setter function\n const setTheme = useCallback((newTheme: Theme) => {\n setThemeUtil(newTheme)\n themeStore.notify()\n }, [])\n\n return { theme, setTheme }\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { select, scaleLinear, scaleSqrt, scaleOrdinal, scaleQuantize, extent, max, axisBottom, axisLeft, transition as _transition, type ScaleOrdinal, type ScaleQuantize } from 'd3'\n// _transition import is for side effects only - it extends Selection.prototype with .transition() method\nimport { CHART_COLORS, CHART_COLORS_GRADIENT, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, parseNumericValue, isValidNumericValue, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport { useTheme } from '../../hooks/useTheme'\nimport type { ChartProps } from '../../types'\n\ninterface BubbleData {\n x: number\n xLabel?: string // Formatted label for time dimensions\n y: number\n size: number\n color?: string | number\n label: string\n series?: string\n}\n\nconst BubbleChart = React.memo(function BubbleChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const svgRef = useRef<SVGSVGElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n const [dimensionsReady, setDimensionsReady] = useState(false)\n const { theme } = useTheme()\n const getFieldLabel = useCubeFieldLabel()\n\n // Memoize safeDisplayConfig to prevent unnecessary re-renders\n const safeDisplayConfig = useMemo(() => ({\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n minBubbleSize: displayConfig?.minBubbleSize ?? 5,\n maxBubbleSize: displayConfig?.maxBubbleSize ?? 50,\n bubbleOpacity: displayConfig?.bubbleOpacity ?? 0.7,\n xAxisFormat: displayConfig?.xAxisFormat,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }), [\n displayConfig?.showLegend,\n displayConfig?.showGrid,\n displayConfig?.showTooltip,\n displayConfig?.minBubbleSize,\n displayConfig?.maxBubbleSize,\n displayConfig?.bubbleOpacity,\n displayConfig?.xAxisFormat,\n displayConfig?.leftYAxisFormat\n ])\n\n // Enhanced dimension measurement with retry mechanism\n useLayoutEffect(() => {\n let retryCount = 0\n const maxRetries = 10\n let rafId: number\n let timeoutId: ReturnType<typeof setTimeout>\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n \n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n setDimensionsReady(true)\n return true\n }\n }\n return false\n }\n \n // Immediate measurement\n const success = updateDimensions()\n \n if (!success && retryCount < maxRetries) {\n // Retry with requestAnimationFrame\n const retryWithRaf = () => {\n const rafSuccess = updateDimensions()\n \n if (!rafSuccess && retryCount < maxRetries) {\n retryCount++\n // Use setTimeout for additional retries with increasing delays\n timeoutId = setTimeout(() => {\n rafId = requestAnimationFrame(retryWithRaf)\n }, 50 * retryCount) // Increasing delay: 50ms, 100ms, 150ms, etc.\n }\n }\n \n rafId = requestAnimationFrame(retryWithRaf)\n }\n \n return () => {\n if (rafId) cancelAnimationFrame(rafId)\n if (timeoutId) clearTimeout(timeoutId)\n }\n }, [])\n\n // Enhanced ResizeObserver for dynamic resizing with immediate initialization\n useEffect(() => {\n let resizeObserver: ResizeObserver | null = null\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n }\n \n // Initialize ResizeObserver immediately\n if (containerRef.current) {\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n })\n \n resizeObserver.observe(containerRef.current)\n \n // Also try immediate measurement as fallback\n updateDimensions()\n }\n\n // Window resize as additional fallback\n window.addEventListener('resize', updateDimensions)\n \n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n window.removeEventListener('resize', updateDimensions)\n }\n }, [dimensionsReady])\n\n useEffect(() => {\n if (!data || data.length === 0 || !svgRef.current || !dimensionsReady || dimensions.width === 0) {\n return\n }\n\n // Clear previous chart\n select(svgRef.current).selectAll('*').remove()\n\n\n // Validate chartConfig - only new format supported\n if (!chartConfig?.xAxis || !chartConfig?.yAxis || !chartConfig?.series) {\n return\n }\n\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n const seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series\n const sizeFieldName = Array.isArray(chartConfig.sizeField) ? chartConfig.sizeField[0] : chartConfig.sizeField || yAxisField\n const colorFieldName = Array.isArray(chartConfig.colorField) ? chartConfig.colorField[0] : chartConfig.colorField\n\n\n if (!xAxisField || !yAxisField || !seriesField || !sizeFieldName) {\n return\n }\n\n // Transform data for bubble chart\n // Null handling: Filter out bubbles where x, y, or size are null\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n\n // Check if x-axis field is a time dimension\n const isTimeDimension = queryObject?.timeDimensions?.some(\n (td: { dimension: string }) => td.dimension === xAxisField\n ) || false\n\n const bubbleData: BubbleData[] = data\n .map(item => {\n const rawXValue = item[xAxisField]\n let xNum: number\n let xLabel: string\n\n if (isTimeDimension && rawXValue) {\n // For time dimensions, convert to timestamp for proper numeric positioning\n const dateStr = String(rawXValue)\n // Try to parse as date - handle ISO format and PostgreSQL format\n let date: Date\n if (dateStr.match(/^\\d{4}-\\d{2}-\\d{2}[T ]/)) {\n // Full timestamp format\n let isoStr = dateStr\n if (dateStr.includes(' ')) {\n isoStr = dateStr.replace(' ', 'T').replace('+00', 'Z').replace(/\\+\\d{2}:\\d{2}$/, 'Z')\n }\n if (!isoStr.endsWith('Z') && !isoStr.includes('+')) {\n isoStr = isoStr + 'Z'\n }\n date = new Date(isoStr)\n } else {\n date = new Date(dateStr)\n }\n\n xNum = isNaN(date.getTime()) ? parseFloat(dateStr) : date.getTime()\n xLabel = formatTimeValue(rawXValue, xGranularity)\n } else {\n // Non-time value - use as-is\n const formattedValue = formatTimeValue(rawXValue, xGranularity) || rawXValue\n xNum = typeof formattedValue === 'string' ? parseFloat(formattedValue) : formattedValue\n xLabel = String(formattedValue)\n }\n\n const yValue = parseNumericValue(item[yAxisField])\n const sizeValue = parseNumericValue(item[sizeFieldName])\n const seriesValue = item[seriesField]\n\n return {\n x: xNum,\n xLabel, // Store formatted label for tooltip display\n y: yValue as number, // Type assertion: filter below ensures this is never null\n size: sizeValue !== null ? Math.abs(sizeValue) : 0, // Ensure positive size\n color: colorFieldName ? item[colorFieldName] : seriesValue,\n series: seriesValue,\n label: `${seriesValue || 'Unknown'}`,\n isValid: isValidNumericValue(xNum) && yValue !== null && sizeValue !== null && sizeValue > 0\n }\n })\n .filter(d => d.isValid && d.size > 0) // Filter out bubbles with invalid coordinates or no size\n\n if (bubbleData.length === 0) return\n\n const margin = { \n ...CHART_MARGINS, \n left: CHART_MARGINS.left + 30, // Add extra 30px left margin for Y-axis label\n bottom: (safeDisplayConfig.showLegend && colorFieldName) ? 100 : 40 // Add extra space for legend\n }\n const width = dimensions.width - margin.left - margin.right\n const chartHeight = dimensions.height - margin.top - margin.bottom\n\n const svg = select(svgRef.current)\n .attr('width', dimensions.width)\n .attr('height', dimensions.height)\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`)\n\n // Set up scales\n const xScale = scaleLinear()\n .domain(extent(bubbleData, d => d.x) as [number, number])\n .range([0, width])\n .nice()\n\n const yScale = scaleLinear()\n .domain(extent(bubbleData, d => d.y) as [number, number])\n .range([chartHeight, 0])\n .nice()\n\n const sizeScale = scaleSqrt()\n .domain([0, max(bubbleData, d => d.size) as number])\n .range([safeDisplayConfig.minBubbleSize, safeDisplayConfig.maxBubbleSize])\n\n // Set up color scale\n let colorScale: ScaleOrdinal<string, string> | ScaleQuantize<string>\n let isNumericColorField = false\n let uniqueColors: string[] = []\n \n if (colorFieldName && bubbleData.length > 0) {\n // Check if color field is numeric for color scaling (same logic as TreeMapChart)\n const colorValues = bubbleData.map(item => {\n const value = item.color\n return typeof value === 'string' ? parseFloat(value) : value\n }).filter((val): val is number => !isNaN(val as number))\n \n isNumericColorField = colorValues.length === bubbleData.length && colorValues.every(val => typeof val === 'number')\n \n if (isNumericColorField) {\n // Use D3 quantize scale for better color distribution with small ranges\n const minValue = Math.min(...colorValues)\n const maxValue = Math.max(...colorValues)\n \n // Create D3 quantize color scale - maps continuous data to discrete color bands\n colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(colorPalette?.gradient || CHART_COLORS_GRADIENT)\n } else {\n // Categorical color field - use series colors\n uniqueColors = [...new Set(bubbleData.map(d => String(d.color)))]\n colorScale = scaleOrdinal<string>()\n .domain(uniqueColors)\n .range(colorPalette?.colors || CHART_COLORS)\n }\n } else {\n // Single color for all bubbles\n colorScale = scaleOrdinal<string>()\n .domain(['default'])\n .range([CHART_COLORS[0]])\n }\n\n // Get theme colors from CSS variables\n const getThemeColor = (varName: string, fallback: string) => {\n const value = getComputedStyle(document.documentElement).getPropertyValue(varName).trim()\n return value || fallback\n }\n\n const isDark = theme !== 'light'\n const textColor = isDark\n ? getThemeColor('--dc-text-muted', '#cbd5e1') // Lighter text for dark mode\n : getThemeColor('--dc-text-secondary', '#374151') // Darker text for light mode\n const gridColor = isDark\n ? getThemeColor('--dc-border', '#475569') // Lighter grid for dark mode\n : '#9ca3af' // Much darker gray for light mode visibility\n\n // Add grid\n if (safeDisplayConfig.showGrid) {\n // X-axis grid\n const xGrid = g.append('g')\n .attr('class', 'grid')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(axisBottom(xScale)\n .tickSize(-chartHeight)\n .tickFormat(() => '')\n )\n\n xGrid.selectAll('line')\n .style('stroke', gridColor)\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n xGrid.select('.domain')\n .style('stroke', 'none')\n\n // Y-axis grid\n const yGrid = g.append('g')\n .attr('class', 'grid')\n .call(axisLeft(yScale)\n .tickSize(-width)\n .tickFormat(() => '')\n )\n\n yGrid.selectAll('line')\n .style('stroke', gridColor)\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n yGrid.select('.domain')\n .style('stroke', 'none')\n }\n\n // Add X axis with proper time formatting if needed\n const xAxisGenerator = axisBottom(xScale)\n\n // If it's a time dimension, format the tick labels\n if (isTimeDimension) {\n xAxisGenerator.tickFormat((d) => {\n const date = new Date(d as number)\n if (isNaN(date.getTime())) return String(d)\n\n // Format based on granularity\n switch (xGranularity?.toLowerCase()) {\n case 'year':\n return String(date.getUTCFullYear())\n case 'quarter': {\n const q = Math.floor(date.getUTCMonth() / 3) + 1\n return `${date.getUTCFullYear()}-Q${q}`\n }\n case 'month':\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`\n case 'week':\n case 'day':\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')}`\n case 'hour':\n return `${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')} ${String(date.getUTCHours()).padStart(2, '0')}:00`\n default:\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`\n }\n })\n } else if (safeDisplayConfig.xAxisFormat) {\n // Apply custom formatting for non-time X-axis\n xAxisGenerator.tickFormat((d) => formatAxisValue(d as number, safeDisplayConfig.xAxisFormat))\n }\n\n const xAxis = g.append('g')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(xAxisGenerator)\n\n xAxis.selectAll('text')\n .style('fill', textColor)\n\n xAxis.selectAll('line, path')\n .style('stroke', gridColor)\n\n xAxis.append('text')\n .attr('x', width / 2)\n .attr('y', 35)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(safeDisplayConfig.xAxisFormat?.label || getFieldLabel(xAxisField))\n\n // Add Y axis with optional formatting\n const yAxisGenerator = axisLeft(yScale)\n if (safeDisplayConfig.leftYAxisFormat) {\n yAxisGenerator.tickFormat((d) => formatAxisValue(d as number, safeDisplayConfig.leftYAxisFormat))\n }\n const yAxis = g.append('g')\n .call(yAxisGenerator)\n\n yAxis.selectAll('text')\n .style('fill', textColor)\n\n yAxis.selectAll('line, path')\n .style('stroke', gridColor)\n\n yAxis.append('text')\n .attr('transform', 'rotate(-90)')\n .attr('y', -35)\n .attr('x', -chartHeight / 2)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(safeDisplayConfig.leftYAxisFormat?.label || getFieldLabel(yAxisField))\n\n // Create tooltip\n const tooltip = select('body').append('div')\n .attr('class', 'bubble-chart-tooltip')\n .style('position', 'absolute')\n .style('padding', '8px')\n .style('background', 'rgba(0, 0, 0, 0.8)')\n .style('color', 'white')\n .style('border-radius', '4px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('opacity', 0)\n .style('z-index', 1000)\n\n // Add bubbles\n const bubbles = g.selectAll('.bubble')\n .data(bubbleData)\n .enter().append('circle')\n .attr('class', 'bubble')\n .attr('cx', d => xScale(d.x))\n .attr('cy', d => yScale(d.y))\n .attr('r', d => sizeScale(d.size))\n .style('fill', d => {\n if (colorFieldName && d.color !== undefined) {\n return isNumericColorField\n ? (colorScale as ScaleQuantize<string>)(d.color as number)\n : (colorScale as ScaleOrdinal<string, string>)(String(d.color))\n }\n return CHART_COLORS[0]\n })\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .style('stroke', '#fff')\n .style('stroke-width', 1)\n .style('cursor', 'pointer')\n\n // Add hover effects\n if (safeDisplayConfig.showTooltip) {\n bubbles\n .on('mouseover', function(event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', 1)\n .attr('r', sizeScale(d.size) * 1.1)\n\n const tooltipContent = [\n `<strong>${d.series || 'Unknown'}</strong>`,\n `${getFieldLabel(xAxisField)}: ${d.xLabel || (safeDisplayConfig.xAxisFormat ? formatAxisValue(d.x, safeDisplayConfig.xAxisFormat) : d.x)}`,\n `${getFieldLabel(yAxisField)}: ${safeDisplayConfig.leftYAxisFormat ? formatAxisValue(d.y, safeDisplayConfig.leftYAxisFormat) : d.y}`,\n `${getFieldLabel(sizeFieldName)}: ${safeDisplayConfig.leftYAxisFormat ? formatAxisValue(d.size, safeDisplayConfig.leftYAxisFormat) : d.size}`,\n colorFieldName && d.color ? `${getFieldLabel(colorFieldName)}: ${d.color}` : ''\n ].filter(Boolean).join('<br>')\n\n tooltip\n .html(tooltipContent)\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n .transition()\n .duration(200)\n .style('opacity', 1)\n })\n .on('mousemove', function(event) {\n tooltip\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n })\n .on('mouseout', function(_event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .attr('r', sizeScale(d.size))\n\n tooltip\n .transition()\n .duration(200)\n .style('opacity', 0)\n })\n }\n\n // Add legend if needed\n if (safeDisplayConfig.showLegend && colorFieldName) {\n if (isNumericColorField) {\n // Create gradient legend for numeric color field\n const legendWidth = 200\n const legendHeight = 20\n const minValue = Math.min(...bubbleData.map(d => d.color as number))\n const maxValue = Math.max(...bubbleData.map(d => d.color as number))\n \n const legend = g.append('g')\n .attr('class', 'color-legend')\n .attr('transform', `translate(${width / 2 - legendWidth / 2}, ${chartHeight + 60})`)\n\n // Create gradient definition\n const defs = svg.append('defs')\n const gradient = defs.append('linearGradient')\n .attr('id', 'color-scale-gradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '100%')\n .attr('y2', '0%')\n\n // Add color stops for the gradient\n const gradientColors = colorPalette?.gradient || CHART_COLORS_GRADIENT\n gradientColors.forEach((color, i) => {\n gradient.append('stop')\n .attr('offset', `${(i / (gradientColors.length - 1)) * 100}%`)\n .attr('stop-color', color)\n })\n\n // Add the gradient rectangle\n legend.append('rect')\n .attr('width', legendWidth)\n .attr('height', legendHeight)\n .style('fill', 'url(#color-scale-gradient)')\n .style('stroke', '#ccc')\n .style('stroke-width', 1)\n\n // Add min value label\n legend.append('text')\n .attr('x', 0)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'start')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(safeDisplayConfig.leftYAxisFormat ? formatAxisValue(minValue, safeDisplayConfig.leftYAxisFormat) : minValue.toFixed(2))\n\n // Add max value label\n legend.append('text')\n .attr('x', legendWidth)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'end')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(safeDisplayConfig.leftYAxisFormat ? formatAxisValue(maxValue, safeDisplayConfig.leftYAxisFormat) : maxValue.toFixed(2))\n\n // Add field name label\n legend.append('text')\n .attr('x', legendWidth / 2)\n .attr('y', -5)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .style('fill', textColor)\n .text(getFieldLabel(colorFieldName))\n\n } else {\n // Original categorical legend\n const legendItems = uniqueColors\n\n if (legendItems.length > 0) {\n const legend = g.append('g')\n .attr('class', 'legend')\n .attr('transform', `translate(${width / 2 - (legendItems.length * 80) / 2}, ${chartHeight + 60})`)\n\n const legendItem = legend.selectAll('.legend-item')\n .data(legendItems)\n .enter().append('g')\n .attr('class', 'legend-item')\n .attr('transform', (_d, i) => `translate(${i * 80}, 0)`)\n .style('cursor', 'pointer')\n\n legendItem.append('circle')\n .attr('cx', 5)\n .attr('cy', 5)\n .attr('r', 5)\n .style('fill', d => (colorScale as ScaleOrdinal<string, string>)(d as string))\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n\n legendItem.append('text')\n .attr('x', 15)\n .attr('y', 5)\n .attr('dy', '.35em')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(d => String(d))\n\n // Legend hover effects\n legendItem\n .on('mouseover', function(_event, legendKey) {\n // Highlight matching bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', d => {\n const matches = colorFieldName && String(d.color) === legendKey\n return matches ? 1 : 0.2\n })\n })\n .on('mouseout', function() {\n // Reset all bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n })\n }\n }\n }\n\n // Cleanup function\n return () => {\n tooltip.remove()\n }\n }, [data, chartConfig, safeDisplayConfig, queryObject, dimensions, dimensionsReady, colorPalette, theme, getFieldLabel])\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\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 in bubble chart</div>\n </div>\n </div>\n )\n }\n\n // Validate that we have required fields\n const hasValidConfig = chartConfig?.xAxis && chartConfig?.yAxis && chartConfig?.series\n if (!hasValidConfig) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Required</div>\n <div className=\"text-xs\">Bubble chart requires xAxis, yAxis, series, and sizeField dimensions</div>\n <div className=\"text-xs mt-1\">Optional: colorField for bubble coloring</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full flex-1 flex flex-col relative\" style={{ height, minHeight: '250px', overflow: 'hidden' }}>\n <div ref={containerRef} className=\"w-full h-full relative\">\n <svg ref={svgRef} className=\"w-full h-full\" />\n {!dimensionsReady && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"text-dc-text-muted text-sm\">Measuring chart dimensions...</div>\n </div>\n )}\n </div>\n </div>\n )\n})\n\nexport default BubbleChart"],"names":["themeStore","listener","watchThemeChanges","useTheme","theme","useSyncExternalStore","getTheme","setTheme","useCallback","newTheme","setThemeUtil","BubbleChart","React","data","chartConfig","displayConfig","queryObject","height","colorPalette","svgRef","useRef","containerRef","dimensions","setDimensions","useState","dimensionsReady","setDimensionsReady","getFieldLabel","useCubeFieldLabel","safeDisplayConfig","useMemo","useLayoutEffect","retryCount","maxRetries","rafId","timeoutId","updateDimensions","width","retryWithRaf","useEffect","resizeObserver","entries","entry","select","xAxisField","yAxisField","seriesField","sizeFieldName","colorFieldName","xGranularity","getFieldGranularity","isTimeDimension","td","bubbleData","item","rawXValue","xNum","xLabel","dateStr","date","isoStr","formatTimeValue","formattedValue","yValue","parseNumericValue","sizeValue","seriesValue","isValidNumericValue","d","margin","CHART_MARGINS","chartHeight","svg","g","xScale","scaleLinear","extent","yScale","sizeScale","scaleSqrt","max","colorScale","isNumericColorField","uniqueColors","colorValues","value","val","minValue","maxValue","scaleQuantize","CHART_COLORS_GRADIENT","scaleOrdinal","CHART_COLORS","getThemeColor","varName","fallback","isDark","textColor","gridColor","xGrid","axisBottom","yGrid","axisLeft","xAxisGenerator","q","formatAxisValue","xAxis","yAxisGenerator","yAxis","tooltip","bubbles","event","tooltipContent","_event","legend","gradient","gradientColors","color","i","legendItems","legendItem","_d","legendKey","jsx","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"chart-bubble-3jYKCA2B.js","sources":["../../../src/client/hooks/useTheme.ts","../../../src/client/components/charts/BubbleChart.tsx"],"sourcesContent":["/**\n * useTheme - External Theme State Hook\n *\n * Uses React 18's useSyncExternalStore to prevent parent component re-renders.\n * The theme state is stored externally and changes are propagated through\n * a subscribe/notify pattern.\n *\n * This prevents the ThemeToggle component from causing Layout re-renders.\n */\n\nimport { useSyncExternalStore, useCallback } from 'react'\nimport { getTheme, setTheme as setThemeUtil, watchThemeChanges, type Theme } from '../theme'\n\n// External store for theme state\nconst themeStore = {\n listeners: new Set<() => void>(),\n\n subscribe(listener: () => void) {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n },\n\n notify() {\n this.listeners.forEach(listener => listener())\n }\n}\n\n// Watch theme changes from DOM/system and notify subscribers\nwatchThemeChanges(() => {\n themeStore.notify()\n})\n\n/**\n * Hook to access and update theme\n *\n * Returns current theme and a setter function.\n * Only components using this hook will re-render on theme changes.\n */\nexport function useTheme() {\n // Subscribe to external theme store\n const theme = useSyncExternalStore(\n themeStore.subscribe.bind(themeStore),\n getTheme, // Client-side snapshot\n getTheme // Server-side snapshot (SSR)\n )\n\n // Stable setter function\n const setTheme = useCallback((newTheme: Theme) => {\n setThemeUtil(newTheme)\n themeStore.notify()\n }, [])\n\n return { theme, setTheme }\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { select, scaleLinear, scaleSqrt, scaleOrdinal, scaleQuantize, extent, max, axisBottom, axisLeft, transition as _transition, type ScaleOrdinal, type ScaleQuantize } from 'd3'\n// _transition import is for side effects only - it extends Selection.prototype with .transition() method\nimport { CHART_COLORS, CHART_COLORS_GRADIENT, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, parseNumericValue, isValidNumericValue, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport { useTheme } from '../../hooks/useTheme'\nimport type { ChartProps } from '../../types'\n\ninterface BubbleData {\n x: number\n xLabel?: string // Formatted label for time dimensions\n y: number\n size: number\n color?: string | number\n label: string\n series?: string\n}\n\nconst BubbleChart = React.memo(function BubbleChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const svgRef = useRef<SVGSVGElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n const [dimensionsReady, setDimensionsReady] = useState(false)\n const { theme } = useTheme()\n const getFieldLabel = useCubeFieldLabel()\n\n // Memoize safeDisplayConfig to prevent unnecessary re-renders\n const safeDisplayConfig = useMemo(() => ({\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n minBubbleSize: displayConfig?.minBubbleSize ?? 5,\n maxBubbleSize: displayConfig?.maxBubbleSize ?? 50,\n bubbleOpacity: displayConfig?.bubbleOpacity ?? 0.7,\n xAxisFormat: displayConfig?.xAxisFormat,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }), [\n displayConfig?.showLegend,\n displayConfig?.showGrid,\n displayConfig?.showTooltip,\n displayConfig?.minBubbleSize,\n displayConfig?.maxBubbleSize,\n displayConfig?.bubbleOpacity,\n displayConfig?.xAxisFormat,\n displayConfig?.leftYAxisFormat\n ])\n\n // Enhanced dimension measurement with retry mechanism\n useLayoutEffect(() => {\n let retryCount = 0\n const maxRetries = 10\n let rafId: number\n let timeoutId: ReturnType<typeof setTimeout>\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n \n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n setDimensionsReady(true)\n return true\n }\n }\n return false\n }\n \n // Immediate measurement\n const success = updateDimensions()\n \n if (!success && retryCount < maxRetries) {\n // Retry with requestAnimationFrame\n const retryWithRaf = () => {\n const rafSuccess = updateDimensions()\n \n if (!rafSuccess && retryCount < maxRetries) {\n retryCount++\n // Use setTimeout for additional retries with increasing delays\n timeoutId = setTimeout(() => {\n rafId = requestAnimationFrame(retryWithRaf)\n }, 50 * retryCount) // Increasing delay: 50ms, 100ms, 150ms, etc.\n }\n }\n \n rafId = requestAnimationFrame(retryWithRaf)\n }\n \n return () => {\n if (rafId) cancelAnimationFrame(rafId)\n if (timeoutId) clearTimeout(timeoutId)\n }\n }, [])\n\n // Enhanced ResizeObserver for dynamic resizing with immediate initialization\n useEffect(() => {\n let resizeObserver: ResizeObserver | null = null\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n }\n \n // Initialize ResizeObserver immediately\n if (containerRef.current) {\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n })\n \n resizeObserver.observe(containerRef.current)\n \n // Also try immediate measurement as fallback\n updateDimensions()\n }\n\n // Window resize as additional fallback\n window.addEventListener('resize', updateDimensions)\n \n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n window.removeEventListener('resize', updateDimensions)\n }\n }, [dimensionsReady])\n\n useEffect(() => {\n if (!data || data.length === 0 || !svgRef.current || !dimensionsReady || dimensions.width === 0) {\n return\n }\n\n // Clear previous chart\n select(svgRef.current).selectAll('*').remove()\n\n\n // Validate chartConfig - only new format supported\n if (!chartConfig?.xAxis || !chartConfig?.yAxis || !chartConfig?.series) {\n return\n }\n\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n const seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series\n const sizeFieldName = Array.isArray(chartConfig.sizeField) ? chartConfig.sizeField[0] : chartConfig.sizeField || yAxisField\n const colorFieldName = Array.isArray(chartConfig.colorField) ? chartConfig.colorField[0] : chartConfig.colorField\n\n\n if (!xAxisField || !yAxisField || !seriesField || !sizeFieldName) {\n return\n }\n\n // Transform data for bubble chart\n // Null handling: Filter out bubbles where x, y, or size are null\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n\n // Check if x-axis field is a time dimension\n const isTimeDimension = queryObject?.timeDimensions?.some(\n (td: { dimension: string }) => td.dimension === xAxisField\n ) || false\n\n const bubbleData: BubbleData[] = data\n .map(item => {\n const rawXValue = item[xAxisField]\n let xNum: number\n let xLabel: string\n\n if (isTimeDimension && rawXValue) {\n // For time dimensions, convert to timestamp for proper numeric positioning\n const dateStr = String(rawXValue)\n // Try to parse as date - handle ISO format and PostgreSQL format\n let date: Date\n if (dateStr.match(/^\\d{4}-\\d{2}-\\d{2}[T ]/)) {\n // Full timestamp format\n let isoStr = dateStr\n if (dateStr.includes(' ')) {\n isoStr = dateStr.replace(' ', 'T').replace('+00', 'Z').replace(/\\+\\d{2}:\\d{2}$/, 'Z')\n }\n if (!isoStr.endsWith('Z') && !isoStr.includes('+')) {\n isoStr = isoStr + 'Z'\n }\n date = new Date(isoStr)\n } else {\n date = new Date(dateStr)\n }\n\n xNum = isNaN(date.getTime()) ? parseFloat(dateStr) : date.getTime()\n xLabel = formatTimeValue(rawXValue, xGranularity)\n } else {\n // Non-time value - use as-is\n const formattedValue = formatTimeValue(rawXValue, xGranularity) || rawXValue\n xNum = typeof formattedValue === 'string' ? parseFloat(formattedValue) : formattedValue\n xLabel = String(formattedValue)\n }\n\n const yValue = parseNumericValue(item[yAxisField])\n const sizeValue = parseNumericValue(item[sizeFieldName])\n const seriesValue = item[seriesField]\n\n return {\n x: xNum,\n xLabel, // Store formatted label for tooltip display\n y: yValue as number, // Type assertion: filter below ensures this is never null\n size: sizeValue !== null ? Math.abs(sizeValue) : 0, // Ensure positive size\n color: colorFieldName ? item[colorFieldName] : seriesValue,\n series: seriesValue,\n label: `${seriesValue || 'Unknown'}`,\n isValid: isValidNumericValue(xNum) && yValue !== null && sizeValue !== null && sizeValue > 0\n }\n })\n .filter(d => d.isValid && d.size > 0) // Filter out bubbles with invalid coordinates or no size\n\n if (bubbleData.length === 0) return\n\n const margin = { \n ...CHART_MARGINS, \n left: CHART_MARGINS.left + 30, // Add extra 30px left margin for Y-axis label\n bottom: (safeDisplayConfig.showLegend && colorFieldName) ? 100 : 40 // Add extra space for legend\n }\n const width = dimensions.width - margin.left - margin.right\n const chartHeight = dimensions.height - margin.top - margin.bottom\n\n const svg = select(svgRef.current)\n .attr('width', dimensions.width)\n .attr('height', dimensions.height)\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`)\n\n // Set up scales\n const xScale = scaleLinear()\n .domain(extent(bubbleData, d => d.x) as [number, number])\n .range([0, width])\n .nice()\n\n const yScale = scaleLinear()\n .domain(extent(bubbleData, d => d.y) as [number, number])\n .range([chartHeight, 0])\n .nice()\n\n const sizeScale = scaleSqrt()\n .domain([0, max(bubbleData, d => d.size) as number])\n .range([safeDisplayConfig.minBubbleSize, safeDisplayConfig.maxBubbleSize])\n\n // Set up color scale\n let colorScale: ScaleOrdinal<string, string> | ScaleQuantize<string>\n let isNumericColorField = false\n let uniqueColors: string[] = []\n \n if (colorFieldName && bubbleData.length > 0) {\n // Check if color field is numeric for color scaling (same logic as TreeMapChart)\n const colorValues = bubbleData.map(item => {\n const value = item.color\n return typeof value === 'string' ? parseFloat(value) : value\n }).filter((val): val is number => !isNaN(val as number))\n \n isNumericColorField = colorValues.length === bubbleData.length && colorValues.every(val => typeof val === 'number')\n \n if (isNumericColorField) {\n // Use D3 quantize scale for better color distribution with small ranges\n const minValue = Math.min(...colorValues)\n const maxValue = Math.max(...colorValues)\n \n // Create D3 quantize color scale - maps continuous data to discrete color bands\n colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(colorPalette?.gradient || CHART_COLORS_GRADIENT)\n } else {\n // Categorical color field - use series colors\n uniqueColors = [...new Set(bubbleData.map(d => String(d.color)))]\n colorScale = scaleOrdinal<string>()\n .domain(uniqueColors)\n .range(colorPalette?.colors || CHART_COLORS)\n }\n } else {\n // Single color for all bubbles\n colorScale = scaleOrdinal<string>()\n .domain(['default'])\n .range([CHART_COLORS[0]])\n }\n\n // Get theme colors from CSS variables\n const getThemeColor = (varName: string, fallback: string) => {\n const value = getComputedStyle(document.documentElement).getPropertyValue(varName).trim()\n return value || fallback\n }\n\n const isDark = theme !== 'light'\n const textColor = isDark\n ? getThemeColor('--dc-text-muted', '#cbd5e1') // Lighter text for dark mode\n : getThemeColor('--dc-text-secondary', '#374151') // Darker text for light mode\n const gridColor = isDark\n ? getThemeColor('--dc-border', '#475569') // Lighter grid for dark mode\n : '#9ca3af' // Much darker gray for light mode visibility\n\n // Add grid\n if (safeDisplayConfig.showGrid) {\n // X-axis grid\n const xGrid = g.append('g')\n .attr('class', 'grid')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(axisBottom(xScale)\n .tickSize(-chartHeight)\n .tickFormat(() => '')\n )\n\n xGrid.selectAll('line')\n .style('stroke', gridColor)\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n xGrid.select('.domain')\n .style('stroke', 'none')\n\n // Y-axis grid\n const yGrid = g.append('g')\n .attr('class', 'grid')\n .call(axisLeft(yScale)\n .tickSize(-width)\n .tickFormat(() => '')\n )\n\n yGrid.selectAll('line')\n .style('stroke', gridColor)\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n yGrid.select('.domain')\n .style('stroke', 'none')\n }\n\n // Add X axis with proper time formatting if needed\n const xAxisGenerator = axisBottom(xScale)\n\n // If it's a time dimension, format the tick labels\n if (isTimeDimension) {\n xAxisGenerator.tickFormat((d) => {\n const date = new Date(d as number)\n if (isNaN(date.getTime())) return String(d)\n\n // Format based on granularity\n switch (xGranularity?.toLowerCase()) {\n case 'year':\n return String(date.getUTCFullYear())\n case 'quarter': {\n const q = Math.floor(date.getUTCMonth() / 3) + 1\n return `${date.getUTCFullYear()}-Q${q}`\n }\n case 'month':\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`\n case 'week':\n case 'day':\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')}`\n case 'hour':\n return `${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')} ${String(date.getUTCHours()).padStart(2, '0')}:00`\n default:\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`\n }\n })\n } else if (safeDisplayConfig.xAxisFormat) {\n // Apply custom formatting for non-time X-axis\n xAxisGenerator.tickFormat((d) => formatAxisValue(d as number, safeDisplayConfig.xAxisFormat))\n }\n\n const xAxis = g.append('g')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(xAxisGenerator)\n\n xAxis.selectAll('text')\n .style('fill', textColor)\n\n xAxis.selectAll('line, path')\n .style('stroke', gridColor)\n\n xAxis.append('text')\n .attr('x', width / 2)\n .attr('y', 35)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(safeDisplayConfig.xAxisFormat?.label || getFieldLabel(xAxisField))\n\n // Add Y axis with optional formatting\n const yAxisGenerator = axisLeft(yScale)\n if (safeDisplayConfig.leftYAxisFormat) {\n yAxisGenerator.tickFormat((d) => formatAxisValue(d as number, safeDisplayConfig.leftYAxisFormat))\n }\n const yAxis = g.append('g')\n .call(yAxisGenerator)\n\n yAxis.selectAll('text')\n .style('fill', textColor)\n\n yAxis.selectAll('line, path')\n .style('stroke', gridColor)\n\n yAxis.append('text')\n .attr('transform', 'rotate(-90)')\n .attr('y', -35)\n .attr('x', -chartHeight / 2)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(safeDisplayConfig.leftYAxisFormat?.label || getFieldLabel(yAxisField))\n\n // Create tooltip\n const tooltip = select('body').append('div')\n .attr('class', 'bubble-chart-tooltip')\n .style('position', 'absolute')\n .style('padding', '8px')\n .style('background', 'rgba(0, 0, 0, 0.8)')\n .style('color', 'white')\n .style('border-radius', '4px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('opacity', 0)\n .style('z-index', 1000)\n\n // Add bubbles\n const bubbles = g.selectAll('.bubble')\n .data(bubbleData)\n .enter().append('circle')\n .attr('class', 'bubble')\n .attr('cx', d => xScale(d.x))\n .attr('cy', d => yScale(d.y))\n .attr('r', d => sizeScale(d.size))\n .style('fill', d => {\n if (colorFieldName && d.color !== undefined) {\n return isNumericColorField\n ? (colorScale as ScaleQuantize<string>)(d.color as number)\n : (colorScale as ScaleOrdinal<string, string>)(String(d.color))\n }\n return CHART_COLORS[0]\n })\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .style('stroke', '#fff')\n .style('stroke-width', 1)\n .style('cursor', 'pointer')\n\n // Add hover effects\n if (safeDisplayConfig.showTooltip) {\n bubbles\n .on('mouseover', function(event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', 1)\n .attr('r', sizeScale(d.size) * 1.1)\n\n const tooltipContent = [\n `<strong>${d.series || 'Unknown'}</strong>`,\n `${getFieldLabel(xAxisField)}: ${d.xLabel || (safeDisplayConfig.xAxisFormat ? formatAxisValue(d.x, safeDisplayConfig.xAxisFormat) : d.x)}`,\n `${getFieldLabel(yAxisField)}: ${safeDisplayConfig.leftYAxisFormat ? formatAxisValue(d.y, safeDisplayConfig.leftYAxisFormat) : d.y}`,\n `${getFieldLabel(sizeFieldName)}: ${safeDisplayConfig.leftYAxisFormat ? formatAxisValue(d.size, safeDisplayConfig.leftYAxisFormat) : d.size}`,\n colorFieldName && d.color ? `${getFieldLabel(colorFieldName)}: ${d.color}` : ''\n ].filter(Boolean).join('<br>')\n\n tooltip\n .html(tooltipContent)\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n .transition()\n .duration(200)\n .style('opacity', 1)\n })\n .on('mousemove', function(event) {\n tooltip\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n })\n .on('mouseout', function(_event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .attr('r', sizeScale(d.size))\n\n tooltip\n .transition()\n .duration(200)\n .style('opacity', 0)\n })\n }\n\n // Add legend if needed\n if (safeDisplayConfig.showLegend && colorFieldName) {\n if (isNumericColorField) {\n // Create gradient legend for numeric color field\n const legendWidth = 200\n const legendHeight = 20\n const minValue = Math.min(...bubbleData.map(d => d.color as number))\n const maxValue = Math.max(...bubbleData.map(d => d.color as number))\n \n const legend = g.append('g')\n .attr('class', 'color-legend')\n .attr('transform', `translate(${width / 2 - legendWidth / 2}, ${chartHeight + 60})`)\n\n // Create gradient definition\n const defs = svg.append('defs')\n const gradient = defs.append('linearGradient')\n .attr('id', 'color-scale-gradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '100%')\n .attr('y2', '0%')\n\n // Add color stops for the gradient\n const gradientColors = colorPalette?.gradient || CHART_COLORS_GRADIENT\n gradientColors.forEach((color, i) => {\n gradient.append('stop')\n .attr('offset', `${(i / (gradientColors.length - 1)) * 100}%`)\n .attr('stop-color', color)\n })\n\n // Add the gradient rectangle\n legend.append('rect')\n .attr('width', legendWidth)\n .attr('height', legendHeight)\n .style('fill', 'url(#color-scale-gradient)')\n .style('stroke', '#ccc')\n .style('stroke-width', 1)\n\n // Add min value label\n legend.append('text')\n .attr('x', 0)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'start')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(safeDisplayConfig.leftYAxisFormat ? formatAxisValue(minValue, safeDisplayConfig.leftYAxisFormat) : minValue.toFixed(2))\n\n // Add max value label\n legend.append('text')\n .attr('x', legendWidth)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'end')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(safeDisplayConfig.leftYAxisFormat ? formatAxisValue(maxValue, safeDisplayConfig.leftYAxisFormat) : maxValue.toFixed(2))\n\n // Add field name label\n legend.append('text')\n .attr('x', legendWidth / 2)\n .attr('y', -5)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .style('fill', textColor)\n .text(getFieldLabel(colorFieldName))\n\n } else {\n // Original categorical legend\n const legendItems = uniqueColors\n\n if (legendItems.length > 0) {\n const legend = g.append('g')\n .attr('class', 'legend')\n .attr('transform', `translate(${width / 2 - (legendItems.length * 80) / 2}, ${chartHeight + 60})`)\n\n const legendItem = legend.selectAll('.legend-item')\n .data(legendItems)\n .enter().append('g')\n .attr('class', 'legend-item')\n .attr('transform', (_d, i) => `translate(${i * 80}, 0)`)\n .style('cursor', 'pointer')\n\n legendItem.append('circle')\n .attr('cx', 5)\n .attr('cy', 5)\n .attr('r', 5)\n .style('fill', d => (colorScale as ScaleOrdinal<string, string>)(d as string))\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n\n legendItem.append('text')\n .attr('x', 15)\n .attr('y', 5)\n .attr('dy', '.35em')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(d => String(d))\n\n // Legend hover effects\n legendItem\n .on('mouseover', function(_event, legendKey) {\n // Highlight matching bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', d => {\n const matches = colorFieldName && String(d.color) === legendKey\n return matches ? 1 : 0.2\n })\n })\n .on('mouseout', function() {\n // Reset all bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n })\n }\n }\n }\n\n // Cleanup function\n return () => {\n tooltip.remove()\n }\n }, [data, chartConfig, safeDisplayConfig, queryObject, dimensions, dimensionsReady, colorPalette, theme, getFieldLabel])\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\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 in bubble chart</div>\n </div>\n </div>\n )\n }\n\n // Validate that we have required fields\n const hasValidConfig = chartConfig?.xAxis && chartConfig?.yAxis && chartConfig?.series\n if (!hasValidConfig) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Required</div>\n <div className=\"text-xs\">Bubble chart requires xAxis, yAxis, series, and sizeField dimensions</div>\n <div className=\"text-xs mt-1\">Optional: colorField for bubble coloring</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full flex-1 flex flex-col relative\" style={{ height, minHeight: '250px', overflow: 'hidden' }}>\n <div ref={containerRef} className=\"w-full h-full relative\">\n <svg ref={svgRef} className=\"w-full h-full\" />\n {!dimensionsReady && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"text-dc-text-muted text-sm\">Measuring chart dimensions...</div>\n </div>\n )}\n </div>\n </div>\n )\n})\n\nexport default BubbleChart"],"names":["themeStore","listener","watchThemeChanges","useTheme","theme","useSyncExternalStore","getTheme","setTheme","useCallback","newTheme","setThemeUtil","BubbleChart","React","data","chartConfig","displayConfig","queryObject","height","colorPalette","svgRef","useRef","containerRef","dimensions","setDimensions","useState","dimensionsReady","setDimensionsReady","getFieldLabel","useCubeFieldLabel","safeDisplayConfig","useMemo","useLayoutEffect","retryCount","maxRetries","rafId","timeoutId","updateDimensions","width","retryWithRaf","useEffect","resizeObserver","entries","entry","select","xAxisField","yAxisField","seriesField","sizeFieldName","colorFieldName","xGranularity","getFieldGranularity","isTimeDimension","td","bubbleData","item","rawXValue","xNum","xLabel","dateStr","date","isoStr","formatTimeValue","formattedValue","yValue","parseNumericValue","sizeValue","seriesValue","isValidNumericValue","d","margin","CHART_MARGINS","chartHeight","svg","g","xScale","scaleLinear","extent","yScale","sizeScale","scaleSqrt","max","colorScale","isNumericColorField","uniqueColors","colorValues","value","val","minValue","maxValue","scaleQuantize","CHART_COLORS_GRADIENT","scaleOrdinal","CHART_COLORS","getThemeColor","varName","fallback","isDark","textColor","gridColor","xGrid","axisBottom","yGrid","axisLeft","xAxisGenerator","q","formatAxisValue","xAxis","yAxisGenerator","yAxis","tooltip","bubbles","event","tooltipContent","_event","legend","gradient","gradientColors","color","i","legendItems","legendItem","_d","legendKey","jsx","jsxs"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { g as a } from "./icons-NzFHtqeM.js";
1
+ import { a } from "./icons-DRreo6m8.js";
2
2
  const s = {
3
3
  icon: a("activityGrid"),
4
4
  description: "GitHub-style activity grid showing temporal patterns across different time scales",
@@ -47,4 +47,4 @@ const s = {
47
47
  export {
48
48
  s as activityGridChartConfig
49
49
  };
50
- //# sourceMappingURL=chart-config-activity-grid-Bkvx0F-G.js.map
50
+ //# sourceMappingURL=chart-config-activity-grid-BBSNCbkb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-config-activity-grid-Bkvx0F-G.js","sources":["../../../src/client/components/charts/ActivityGridChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the activity grid chart type\n */\nexport const activityGridChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('activityGrid'),\n description: 'GitHub-style activity grid showing temporal patterns across different time scales',\n useCase: 'Best for visualizing activity patterns over time. Supports hour (3hr blocks × days), day (days × weeks), week (weeks × months), month (months × quarters), and quarter (quarters × years) granularities',\n dropZones: [\n {\n key: 'dateField',\n label: 'Time Dimension',\n description: 'Time field that determines grid structure (granularity affects layout)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['timeDimension'],\n emptyText: 'Drop a time dimension (granularity affects grid structure)'\n },\n {\n key: 'valueField',\n label: 'Activity Measure',\n description: 'Measure used for activity intensity (color coding)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for activity intensity'\n }\n ],\n displayOptions: ['showLabels', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'fitToWidth',\n label: 'Fit to Width',\n type: 'boolean',\n defaultValue: false,\n description: 'Automatically size blocks to fill portlet width and height while maintaining aspect ratio'\n }\n ],\n validate: (config) => {\n const { dateField, valueField } = config\n \n if (!dateField || (Array.isArray(dateField) && dateField.length === 0)) {\n return {\n isValid: false,\n message: 'Time dimension is required for activity grid'\n }\n }\n \n if (!valueField || (Array.isArray(valueField) && valueField.length === 0)) {\n return {\n isValid: false,\n message: 'Activity measure is required for intensity mapping'\n }\n }\n \n return { isValid: true }\n }\n}"],"names":["activityGridChartConfig","getChartTypeIcon","config","dateField","valueField"],"mappings":";AAMO,MAAMA,IAA2C;AAAA,EACtD,MAAMC,EAAiB,cAAc;AAAA,EACrC,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,eAAe;AAAA,MAC7B,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,eAAe,YAAY;AAAA,EAC1D,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,UAAU,CAACC,MAAW;AACpB,UAAM,EAAE,WAAAC,GAAW,YAAAC,EAAA,IAAeF;AAElC,WAAI,CAACC,KAAc,MAAM,QAAQA,CAAS,KAAKA,EAAU,WAAW,IAC3D;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,IAAA,IAIT,CAACC,KAAe,MAAM,QAAQA,CAAU,KAAKA,EAAW,WAAW,IAC9D;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,IAAA,IAIN,EAAE,SAAS,GAAA;AAAA,EACpB;AACF;"}
1
+ {"version":3,"file":"chart-config-activity-grid-BBSNCbkb.js","sources":["../../../src/client/components/charts/ActivityGridChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the activity grid chart type\n */\nexport const activityGridChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('activityGrid'),\n description: 'GitHub-style activity grid showing temporal patterns across different time scales',\n useCase: 'Best for visualizing activity patterns over time. Supports hour (3hr blocks × days), day (days × weeks), week (weeks × months), month (months × quarters), and quarter (quarters × years) granularities',\n dropZones: [\n {\n key: 'dateField',\n label: 'Time Dimension',\n description: 'Time field that determines grid structure (granularity affects layout)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['timeDimension'],\n emptyText: 'Drop a time dimension (granularity affects grid structure)'\n },\n {\n key: 'valueField',\n label: 'Activity Measure',\n description: 'Measure used for activity intensity (color coding)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for activity intensity'\n }\n ],\n displayOptions: ['showLabels', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'fitToWidth',\n label: 'Fit to Width',\n type: 'boolean',\n defaultValue: false,\n description: 'Automatically size blocks to fill portlet width and height while maintaining aspect ratio'\n }\n ],\n validate: (config) => {\n const { dateField, valueField } = config\n \n if (!dateField || (Array.isArray(dateField) && dateField.length === 0)) {\n return {\n isValid: false,\n message: 'Time dimension is required for activity grid'\n }\n }\n \n if (!valueField || (Array.isArray(valueField) && valueField.length === 0)) {\n return {\n isValid: false,\n message: 'Activity measure is required for intensity mapping'\n }\n }\n \n return { isValid: true }\n }\n}"],"names":["activityGridChartConfig","getChartTypeIcon","config","dateField","valueField"],"mappings":";AAMO,MAAMA,IAA2C;AAAA,EACtD,MAAMC,EAAiB,cAAc;AAAA,EACrC,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,eAAe;AAAA,MAC7B,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,eAAe,YAAY;AAAA,EAC1D,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,UAAU,CAACC,MAAW;AACpB,UAAM,EAAE,WAAAC,GAAW,YAAAC,EAAA,IAAeF;AAElC,WAAI,CAACC,KAAc,MAAM,QAAQA,CAAS,KAAKA,EAAU,WAAW,IAC3D;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,IAAA,IAIT,CAACC,KAAe,MAAM,QAAQA,CAAU,KAAKA,EAAW,WAAW,IAC9D;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,IAAA,IAIN,EAAE,SAAS,GAAA;AAAA,EACpB;AACF;"}
@@ -1,4 +1,4 @@
1
- import { g as e } from "./icons-NzFHtqeM.js";
1
+ import { a as e } from "./icons-DRreo6m8.js";
2
2
  const s = {
3
3
  icon: e("area"),
4
4
  description: "Emphasize magnitude of change over time",
@@ -75,4 +75,4 @@ const s = {
75
75
  export {
76
76
  s as areaChartConfig
77
77
  };
78
- //# sourceMappingURL=chart-config-area-OApsRaYC.js.map
78
+ //# sourceMappingURL=chart-config-area-CyyJOO2T.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-config-area-OApsRaYC.js","sources":["../../../src/client/components/charts/AreaChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the area chart type\n */\nexport const areaChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('area'),\n description: 'Emphasize magnitude of change over time',\n useCase: 'Best for showing cumulative totals, volume changes, or stacked comparisons over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for area values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here',\n enableDualAxis: true\n },\n {\n key: 'series',\n label: 'Series (Stack Areas)',\n description: 'Dimensions to create stacked areas',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for stacked areas'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'stackType',\n label: 'Stacking',\n type: 'select',\n defaultValue: 'none',\n options: [\n { value: 'none', label: 'None' },\n { value: 'normal', label: 'Stacked' },\n { value: 'percent', label: 'Stacked 100%' }\n ],\n description: 'How to stack multiple area series'\n },\n {\n key: 'connectNulls',\n label: 'Connect Nulls',\n type: 'boolean',\n defaultValue: false,\n description: 'Draw continuous line through missing data points'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Left Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for left Y-axis'\n },\n {\n key: 'rightYAxisFormat',\n label: 'Right Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for right Y-axis'\n }\n ]\n}"],"names":["areaChartConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAmC;AAAA,EAC9C,MAAMC,EAAiB,MAAM;AAAA,EAC7B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,eAAe;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,MACX,gBAAgB;AAAA,IAAA;AAAA,IAElB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,YAAY;AAAA,EACtE,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,UAAA;AAAA,QAC1B,EAAE,OAAO,WAAW,OAAO,eAAA;AAAA,MAAe;AAAA,MAE5C,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
1
+ {"version":3,"file":"chart-config-area-CyyJOO2T.js","sources":["../../../src/client/components/charts/AreaChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the area chart type\n */\nexport const areaChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('area'),\n description: 'Emphasize magnitude of change over time',\n useCase: 'Best for showing cumulative totals, volume changes, or stacked comparisons over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for area values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here',\n enableDualAxis: true\n },\n {\n key: 'series',\n label: 'Series (Stack Areas)',\n description: 'Dimensions to create stacked areas',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for stacked areas'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'stackType',\n label: 'Stacking',\n type: 'select',\n defaultValue: 'none',\n options: [\n { value: 'none', label: 'None' },\n { value: 'normal', label: 'Stacked' },\n { value: 'percent', label: 'Stacked 100%' }\n ],\n description: 'How to stack multiple area series'\n },\n {\n key: 'connectNulls',\n label: 'Connect Nulls',\n type: 'boolean',\n defaultValue: false,\n description: 'Draw continuous line through missing data points'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Left Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for left Y-axis'\n },\n {\n key: 'rightYAxisFormat',\n label: 'Right Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for right Y-axis'\n }\n ]\n}"],"names":["areaChartConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAmC;AAAA,EAC9C,MAAMC,EAAiB,MAAM;AAAA,EAC7B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,eAAe;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,MACX,gBAAgB;AAAA,IAAA;AAAA,IAElB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,YAAY;AAAA,EACtE,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,UAAA;AAAA,QAC1B,EAAE,OAAO,WAAW,OAAO,eAAA;AAAA,MAAe;AAAA,MAE5C,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
@@ -1,4 +1,4 @@
1
- import { g as e } from "./icons-NzFHtqeM.js";
1
+ import { a as e } from "./icons-DRreo6m8.js";
2
2
  const i = {
3
3
  icon: e("bar"),
4
4
  description: "Compare values across categories",
@@ -68,4 +68,4 @@ const i = {
68
68
  export {
69
69
  i as barChartConfig
70
70
  };
71
- //# sourceMappingURL=chart-config-bar-Dy21oaIA.js.map
71
+ //# sourceMappingURL=chart-config-bar-BJKGnfLt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-config-bar-Dy21oaIA.js","sources":["../../../src/client/components/charts/BarChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the bar chart type\n */\nexport const barChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('bar'),\n description: 'Compare values across categories',\n useCase: 'Best for comparing discrete categories, showing rankings, or displaying changes over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Categories)',\n description: 'Dimensions and time dimensions for grouping',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop dimensions & time dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for bar heights',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here',\n enableDualAxis: true\n },\n {\n key: 'series',\n label: 'Series (Split into Multiple Series)',\n description: 'Dimensions to create separate data series',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here to split data into series'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'stackType',\n label: 'Stacking',\n type: 'select',\n defaultValue: 'none',\n options: [\n { value: 'none', label: 'None' },\n { value: 'normal', label: 'Stacked' },\n { value: 'percent', label: 'Stacked 100%' }\n ],\n description: 'How to stack multiple bar series'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Left Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for left Y-axis'\n },\n {\n key: 'rightYAxisFormat',\n label: 'Right Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for right Y-axis'\n }\n ]\n}"],"names":["barChartConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAkC;AAAA,EAC7C,MAAMC,EAAiB,KAAK;AAAA,EAC5B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,eAAe;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,MACX,gBAAgB;AAAA,IAAA;AAAA,IAElB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,YAAY;AAAA,EACtE,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,UAAA;AAAA,QAC1B,EAAE,OAAO,WAAW,OAAO,eAAA;AAAA,MAAe;AAAA,MAE5C,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
1
+ {"version":3,"file":"chart-config-bar-BJKGnfLt.js","sources":["../../../src/client/components/charts/BarChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the bar chart type\n */\nexport const barChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('bar'),\n description: 'Compare values across categories',\n useCase: 'Best for comparing discrete categories, showing rankings, or displaying changes over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Categories)',\n description: 'Dimensions and time dimensions for grouping',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop dimensions & time dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for bar heights',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here',\n enableDualAxis: true\n },\n {\n key: 'series',\n label: 'Series (Split into Multiple Series)',\n description: 'Dimensions to create separate data series',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here to split data into series'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'stackType',\n label: 'Stacking',\n type: 'select',\n defaultValue: 'none',\n options: [\n { value: 'none', label: 'None' },\n { value: 'normal', label: 'Stacked' },\n { value: 'percent', label: 'Stacked 100%' }\n ],\n description: 'How to stack multiple bar series'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Left Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for left Y-axis'\n },\n {\n key: 'rightYAxisFormat',\n label: 'Right Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for right Y-axis'\n }\n ]\n}"],"names":["barChartConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAkC;AAAA,EAC7C,MAAMC,EAAiB,KAAK;AAAA,EAC5B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,eAAe;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,MACX,gBAAgB;AAAA,IAAA;AAAA,IAElB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,YAAY;AAAA,EACtE,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,UAAA;AAAA,QAC1B,EAAE,OAAO,WAAW,OAAO,eAAA;AAAA,MAAe;AAAA,MAE5C,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
@@ -1,4 +1,4 @@
1
- import { g as e } from "./icons-NzFHtqeM.js";
1
+ import { a as e } from "./icons-DRreo6m8.js";
2
2
  const a = {
3
3
  icon: e("bubble"),
4
4
  description: "Compare three dimensions of data",
@@ -69,4 +69,4 @@ const a = {
69
69
  export {
70
70
  a as bubbleChartConfig
71
71
  };
72
- //# sourceMappingURL=chart-config-bubble-Chv0SoFm.js.map
72
+ //# sourceMappingURL=chart-config-bubble-CuSsCHZ4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-config-bubble-Chv0SoFm.js","sources":["../../../src/client/components/charts/BubbleChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the bubble chart type\n */\nexport const bubbleChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('bubble'),\n description: 'Compare three dimensions of data',\n useCase: 'Best for showing relationships between three variables (X, Y, and size), market analysis',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis',\n description: 'Horizontal axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop a field for X-axis position'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis', \n description: 'Vertical axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for Y-axis position'\n },\n {\n key: 'sizeField',\n label: 'Bubble Radius',\n description: 'Size of bubbles based on this measure',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for bubble size'\n },\n {\n key: 'series',\n label: 'Bubble Labels',\n description: 'Field to use for bubble labels and identification',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for bubble labels'\n },\n {\n key: 'colorField',\n label: 'Bubble Colour',\n description: 'Color bubbles by this field (optional)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension', 'measure'],\n emptyText: 'Drop a field for bubble color (optional)'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'minBubbleSize', 'maxBubbleSize', 'bubbleOpacity', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'xAxisFormat',\n label: 'X-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for Y-axis and values'\n }\n ]\n}"],"names":["bubbleChartConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAqC;AAAA,EAChD,MAAMC,EAAiB,QAAQ;AAAA,EAC/B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,aAAa,iBAAiB,SAAS;AAAA,MACrD,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,aAAa,SAAS;AAAA,MACpC,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,iBAAiB,iBAAiB,iBAAiB,YAAY;AAAA,EACzH,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
1
+ {"version":3,"file":"chart-config-bubble-CuSsCHZ4.js","sources":["../../../src/client/components/charts/BubbleChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the bubble chart type\n */\nexport const bubbleChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('bubble'),\n description: 'Compare three dimensions of data',\n useCase: 'Best for showing relationships between three variables (X, Y, and size), market analysis',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis',\n description: 'Horizontal axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop a field for X-axis position'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis', \n description: 'Vertical axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for Y-axis position'\n },\n {\n key: 'sizeField',\n label: 'Bubble Radius',\n description: 'Size of bubbles based on this measure',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for bubble size'\n },\n {\n key: 'series',\n label: 'Bubble Labels',\n description: 'Field to use for bubble labels and identification',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for bubble labels'\n },\n {\n key: 'colorField',\n label: 'Bubble Colour',\n description: 'Color bubbles by this field (optional)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension', 'measure'],\n emptyText: 'Drop a field for bubble color (optional)'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'minBubbleSize', 'maxBubbleSize', 'bubbleOpacity', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'xAxisFormat',\n label: 'X-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for Y-axis and values'\n }\n ]\n}"],"names":["bubbleChartConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAqC;AAAA,EAChD,MAAMC,EAAiB,QAAQ;AAAA,EAC/B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,aAAa,iBAAiB,SAAS;AAAA,MACrD,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,aAAa,SAAS;AAAA,MACpC,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,YAAY,eAAe,iBAAiB,iBAAiB,iBAAiB,YAAY;AAAA,EACzH,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
@@ -1,4 +1,4 @@
1
- import { g as e } from "./icons-NzFHtqeM.js";
1
+ import { a as e } from "./icons-DRreo6m8.js";
2
2
  const s = {
3
3
  icon: e("table"),
4
4
  description: "Display detailed tabular data",
@@ -26,4 +26,4 @@ const s = {
26
26
  export {
27
27
  s as dataTableConfig
28
28
  };
29
- //# sourceMappingURL=chart-config-data-table-DTIdC35a.js.map
29
+ //# sourceMappingURL=chart-config-data-table-BhgqwoqT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-config-data-table-DTIdC35a.js","sources":["../../../src/client/components/charts/DataTable.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the data table type\n */\nexport const dataTableConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('table'),\n description: 'Display detailed tabular data',\n useCase: 'Best for precise values, detailed analysis, sortable/filterable data exploration',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Columns',\n description: 'All fields to display as columns',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop fields to display as columns (or leave empty for all)'\n }\n ],\n displayOptions: ['hideHeader'],\n displayOptionsConfig: [\n {\n key: 'leftYAxisFormat',\n label: 'Value Format',\n type: 'axisFormat',\n description: 'Number formatting for numeric values'\n }\n ]\n}"],"names":["dataTableConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAmC;AAAA,EAC9C,MAAMC,EAAiB,OAAO;AAAA,EAC9B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,iBAAiB,SAAS;AAAA,MACrD,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAAA,EAC7B,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
1
+ {"version":3,"file":"chart-config-data-table-BhgqwoqT.js","sources":["../../../src/client/components/charts/DataTable.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the data table type\n */\nexport const dataTableConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('table'),\n description: 'Display detailed tabular data',\n useCase: 'Best for precise values, detailed analysis, sortable/filterable data exploration',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Columns',\n description: 'All fields to display as columns',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop fields to display as columns (or leave empty for all)'\n }\n ],\n displayOptions: ['hideHeader'],\n displayOptionsConfig: [\n {\n key: 'leftYAxisFormat',\n label: 'Value Format',\n type: 'axisFormat',\n description: 'Number formatting for numeric values'\n }\n ]\n}"],"names":["dataTableConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAmC;AAAA,EAC9C,MAAMC,EAAiB,OAAO;AAAA,EAC9B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa,CAAC,aAAa,iBAAiB,SAAS;AAAA,MACrD,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAAA,EAC7B,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
@@ -1,5 +1,5 @@
1
- import { g as e } from "./icons-NzFHtqeM.js";
2
- const n = {
1
+ import { a as e } from "./icons-DRreo6m8.js";
2
+ const a = {
3
3
  icon: e("funnel"),
4
4
  description: "Show conversion through sequential steps",
5
5
  useCase: "Best for visualizing user journey funnels, sales pipelines, or multi-step processes",
@@ -88,6 +88,6 @@ const n = {
88
88
  ]
89
89
  };
90
90
  export {
91
- n as funnelChartConfig
91
+ a as funnelChartConfig
92
92
  };
93
- //# sourceMappingURL=chart-config-funnel-f17Livgr.js.map
93
+ //# sourceMappingURL=chart-config-funnel-BlSQYng0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-config-funnel-f17Livgr.js","sources":["../../../src/client/components/charts/FunnelChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the funnel chart type\n *\n * Funnel charts visualize sequential conversion data.\n * They work with data from useFunnelQuery which provides\n * pre-calculated step names, values, and conversion rates.\n */\nexport const funnelChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('funnel'),\n description: 'Show conversion through sequential steps',\n useCase: 'Best for visualizing user journey funnels, sales pipelines, or multi-step processes',\n dropZones: [\n // Funnel charts don't use traditional drop zones since they work with\n // pre-calculated funnel data from useFunnelQuery. The steps are defined\n // in the funnel configuration, not through drag-and-drop.\n // However, we keep xAxis and yAxis for compatibility with chart system.\n {\n key: 'xAxis',\n label: 'Step Name',\n description: 'Step names (auto-populated from funnel steps)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Steps defined in funnel config'\n },\n {\n key: 'yAxis',\n label: 'Step Count',\n description: 'Count at each step (auto-calculated)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Counts calculated from funnel execution'\n }\n ],\n displayOptions: ['hideHeader'],\n displayOptionsConfig: [\n {\n key: 'funnelStyle',\n label: 'Funnel Style',\n type: 'buttonGroup',\n defaultValue: 'bars',\n options: [\n { value: 'bars', label: 'Bars' },\n { value: 'funnel', label: 'Funnel' }\n ],\n description: 'Visualization style'\n },\n {\n key: 'funnelOrientation',\n label: 'Orientation',\n type: 'buttonGroup',\n defaultValue: 'horizontal',\n options: [\n { value: 'horizontal', label: 'Horizontal' },\n { value: 'vertical', label: 'Vertical' }\n ]\n },\n {\n key: 'hideSummaryFooter',\n label: 'Hide Summary Footer',\n type: 'boolean',\n defaultValue: false,\n description: 'Hide the summary footer showing steps count and overall conversion'\n },\n {\n key: 'showFunnelConversion',\n label: 'Show Conversion Rate',\n type: 'boolean',\n defaultValue: true,\n description: 'Display step-to-step conversion percentage'\n },\n {\n key: 'showFunnelAvgTime',\n label: 'Show Avg Time',\n type: 'boolean',\n defaultValue: false,\n description: 'Display average time to convert'\n },\n {\n key: 'showFunnelMedianTime',\n label: 'Show Median Time',\n type: 'boolean',\n defaultValue: false,\n description: 'Display median time to convert'\n },\n {\n key: 'showFunnelP90Time',\n label: 'Show P90 Time',\n type: 'boolean',\n defaultValue: false,\n description: 'Display 90th percentile time to convert'\n }\n ]\n}\n"],"names":["funnelChartConfig","getChartTypeIcon"],"mappings":";AAUO,MAAMA,IAAqC;AAAA,EAChD,MAAMC,EAAiB,QAAQ;AAAA,EAC/B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,IAKT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAAA,EAC7B,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,SAAA;AAAA,MAAS;AAAA,MAErC,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,cAAc,OAAO,aAAA;AAAA,QAC9B,EAAE,OAAO,YAAY,OAAO,WAAA;AAAA,MAAW;AAAA,IACzC;AAAA,IAEF;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
1
+ {"version":3,"file":"chart-config-funnel-BlSQYng0.js","sources":["../../../src/client/components/charts/FunnelChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the funnel chart type\n *\n * Funnel charts visualize sequential conversion data.\n * They work with data from useFunnelQuery which provides\n * pre-calculated step names, values, and conversion rates.\n */\nexport const funnelChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('funnel'),\n description: 'Show conversion through sequential steps',\n useCase: 'Best for visualizing user journey funnels, sales pipelines, or multi-step processes',\n dropZones: [\n // Funnel charts don't use traditional drop zones since they work with\n // pre-calculated funnel data from useFunnelQuery. The steps are defined\n // in the funnel configuration, not through drag-and-drop.\n // However, we keep xAxis and yAxis for compatibility with chart system.\n {\n key: 'xAxis',\n label: 'Step Name',\n description: 'Step names (auto-populated from funnel steps)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Steps defined in funnel config'\n },\n {\n key: 'yAxis',\n label: 'Step Count',\n description: 'Count at each step (auto-calculated)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Counts calculated from funnel execution'\n }\n ],\n displayOptions: ['hideHeader'],\n displayOptionsConfig: [\n {\n key: 'funnelStyle',\n label: 'Funnel Style',\n type: 'buttonGroup',\n defaultValue: 'bars',\n options: [\n { value: 'bars', label: 'Bars' },\n { value: 'funnel', label: 'Funnel' }\n ],\n description: 'Visualization style'\n },\n {\n key: 'funnelOrientation',\n label: 'Orientation',\n type: 'buttonGroup',\n defaultValue: 'horizontal',\n options: [\n { value: 'horizontal', label: 'Horizontal' },\n { value: 'vertical', label: 'Vertical' }\n ]\n },\n {\n key: 'hideSummaryFooter',\n label: 'Hide Summary Footer',\n type: 'boolean',\n defaultValue: false,\n description: 'Hide the summary footer showing steps count and overall conversion'\n },\n {\n key: 'showFunnelConversion',\n label: 'Show Conversion Rate',\n type: 'boolean',\n defaultValue: true,\n description: 'Display step-to-step conversion percentage'\n },\n {\n key: 'showFunnelAvgTime',\n label: 'Show Avg Time',\n type: 'boolean',\n defaultValue: false,\n description: 'Display average time to convert'\n },\n {\n key: 'showFunnelMedianTime',\n label: 'Show Median Time',\n type: 'boolean',\n defaultValue: false,\n description: 'Display median time to convert'\n },\n {\n key: 'showFunnelP90Time',\n label: 'Show P90 Time',\n type: 'boolean',\n defaultValue: false,\n description: 'Display 90th percentile time to convert'\n }\n ]\n}\n"],"names":["funnelChartConfig","getChartTypeIcon"],"mappings":";AAUO,MAAMA,IAAqC;AAAA,EAChD,MAAMC,EAAiB,QAAQ;AAAA,EAC/B,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,IAKT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAAA,EAC7B,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,SAAA;AAAA,MAAS;AAAA,MAErC,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,cAAc,OAAO,aAAA;AAAA,QAC9B,EAAE,OAAO,YAAY,OAAO,WAAA;AAAA,MAAW;AAAA,IACzC;AAAA,IAEF;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
@@ -1,4 +1,4 @@
1
- import { g as a } from "./icons-NzFHtqeM.js";
1
+ import { a } from "./icons-DRreo6m8.js";
2
2
  const i = {
3
3
  icon: a("heatmap"),
4
4
  description: "Visualize intensity across two dimensions",
@@ -75,4 +75,4 @@ const i = {
75
75
  export {
76
76
  i as heatmapChartConfig
77
77
  };
78
- //# sourceMappingURL=chart-config-heat-map-DPhNICha.js.map
78
+ //# sourceMappingURL=chart-config-heat-map-DHQGFZhX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-config-heat-map-DPhNICha.js","sources":["../../../src/client/components/charts/HeatMapChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the heatmap chart type\n *\n * Heatmap charts visualize intensity across two dimensions as a color matrix.\n * Best for showing patterns in matrix data like correlations, schedules, or category comparisons.\n */\nexport const heatmapChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('heatmap'),\n description: 'Visualize intensity across two dimensions',\n useCase: 'Best for showing patterns in matrix data like correlations, schedules, or category comparisons',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Columns (X-Axis)',\n description: 'Dimension for column categories',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop one dimension here',\n },\n {\n key: 'yAxis',\n label: 'Rows (Y-Axis)',\n description: 'Dimension for row categories',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop one dimension here',\n },\n {\n key: 'valueField',\n label: 'Value (Color Intensity)',\n description: 'Measure that determines cell color',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop one measure here',\n },\n ],\n displayOptions: ['showLegend', 'showTooltip'],\n displayOptionsConfig: [\n {\n key: 'showLabels',\n label: 'Show Cell Values',\n type: 'boolean',\n defaultValue: false,\n description: 'Display values inside each cell',\n },\n {\n key: 'cellShape',\n label: 'Cell Shape',\n type: 'select',\n defaultValue: 'rect',\n options: [\n { value: 'rect', label: 'Rectangle' },\n { value: 'circle', label: 'Circle' },\n ],\n },\n {\n key: 'xAxisFormat',\n label: 'X-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for X-axis labels',\n },\n {\n key: 'yAxisFormat',\n label: 'Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for Y-axis labels',\n },\n {\n key: 'valueFormat',\n label: 'Value Format',\n type: 'axisFormat',\n description: 'Number formatting for cell values and legend',\n },\n ],\n validate: (config) => {\n if (!config.xAxis?.length) return { isValid: false, message: 'X-axis dimension required' }\n if (!config.yAxis?.length) return { isValid: false, message: 'Y-axis dimension required' }\n if (!config.valueField?.length) return { isValid: false, message: 'Value measure required' }\n return { isValid: true }\n },\n}\n"],"names":["heatmapChartConfig","getChartTypeIcon","config"],"mappings":";AASO,MAAMA,IAAsC;AAAA,EACjD,MAAMC,EAAiB,SAAS;AAAA,EAChC,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,aAAa;AAAA,EAC5C,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,YAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,SAAA;AAAA,MAAS;AAAA,IACrC;AAAA,IAEF;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,UAAU,CAACC,MACJA,EAAO,OAAO,SACdA,EAAO,OAAO,SACdA,EAAO,YAAY,SACjB,EAAE,SAAS,GAAA,IADqB,EAAE,SAAS,IAAO,SAAS,yBAAA,IADhC,EAAE,SAAS,IAAO,SAAS,4BAAA,IAD3B,EAAE,SAAS,IAAO,SAAS,4BAAA;AAKjE;"}
1
+ {"version":3,"file":"chart-config-heat-map-DHQGFZhX.js","sources":["../../../src/client/components/charts/HeatMapChart.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the heatmap chart type\n *\n * Heatmap charts visualize intensity across two dimensions as a color matrix.\n * Best for showing patterns in matrix data like correlations, schedules, or category comparisons.\n */\nexport const heatmapChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('heatmap'),\n description: 'Visualize intensity across two dimensions',\n useCase: 'Best for showing patterns in matrix data like correlations, schedules, or category comparisons',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Columns (X-Axis)',\n description: 'Dimension for column categories',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop one dimension here',\n },\n {\n key: 'yAxis',\n label: 'Rows (Y-Axis)',\n description: 'Dimension for row categories',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop one dimension here',\n },\n {\n key: 'valueField',\n label: 'Value (Color Intensity)',\n description: 'Measure that determines cell color',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop one measure here',\n },\n ],\n displayOptions: ['showLegend', 'showTooltip'],\n displayOptionsConfig: [\n {\n key: 'showLabels',\n label: 'Show Cell Values',\n type: 'boolean',\n defaultValue: false,\n description: 'Display values inside each cell',\n },\n {\n key: 'cellShape',\n label: 'Cell Shape',\n type: 'select',\n defaultValue: 'rect',\n options: [\n { value: 'rect', label: 'Rectangle' },\n { value: 'circle', label: 'Circle' },\n ],\n },\n {\n key: 'xAxisFormat',\n label: 'X-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for X-axis labels',\n },\n {\n key: 'yAxisFormat',\n label: 'Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for Y-axis labels',\n },\n {\n key: 'valueFormat',\n label: 'Value Format',\n type: 'axisFormat',\n description: 'Number formatting for cell values and legend',\n },\n ],\n validate: (config) => {\n if (!config.xAxis?.length) return { isValid: false, message: 'X-axis dimension required' }\n if (!config.yAxis?.length) return { isValid: false, message: 'Y-axis dimension required' }\n if (!config.valueField?.length) return { isValid: false, message: 'Value measure required' }\n return { isValid: true }\n },\n}\n"],"names":["heatmapChartConfig","getChartTypeIcon","config"],"mappings":";AASO,MAAMA,IAAsC;AAAA,EACjD,MAAMC,EAAiB,SAAS;AAAA,EAChC,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,WAAW;AAAA,MACzB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,gBAAgB,CAAC,cAAc,aAAa;AAAA,EAC5C,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,YAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,SAAA;AAAA,MAAS;AAAA,IACrC;AAAA,IAEF;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,UAAU,CAACC,MACJA,EAAO,OAAO,SACdA,EAAO,OAAO,SACdA,EAAO,YAAY,SACjB,EAAE,SAAS,GAAA,IADqB,EAAE,SAAS,IAAO,SAAS,yBAAA,IADhC,EAAE,SAAS,IAAO,SAAS,4BAAA,IAD3B,EAAE,SAAS,IAAO,SAAS,4BAAA;AAKjE;"}
@@ -1,4 +1,4 @@
1
- import { g as a } from "./icons-NzFHtqeM.js";
1
+ import { a } from "./icons-DRreo6m8.js";
2
2
  const i = {
3
3
  icon: a("kpiDelta"),
4
4
  description: "Display change between latest and previous values with trend indicators",
@@ -95,4 +95,4 @@ const i = {
95
95
  export {
96
96
  i as kpiDeltaConfig
97
97
  };
98
- //# sourceMappingURL=chart-config-kpi-delta-CCl1d-St.js.map
98
+ //# sourceMappingURL=chart-config-kpi-delta-yTA5ug_l.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-config-kpi-delta-CCl1d-St.js","sources":["../../../src/client/components/charts/KpiDelta.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the KPI Delta chart type\n */\nexport const kpiDeltaConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('kpiDelta'),\n description: 'Display change between latest and previous values with trend indicators',\n useCase: 'Perfect for showing performance changes over time, such as revenue growth, user acquisition changes, or other metrics where the trend and delta are more important than the absolute value',\n dropZones: [\n {\n key: 'yAxis',\n label: 'Value',\n description: 'Measure to track changes for',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure here'\n },\n {\n key: 'xAxis',\n label: 'Dimension (optional)',\n description: 'Dimension for ordering data (typically time)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop a dimension for ordering'\n }\n ],\n displayOptionsConfig: [\n {\n key: 'prefix',\n label: 'Prefix',\n type: 'string',\n placeholder: 'e.g., $, €, #',\n description: 'Text to display before the number'\n },\n {\n key: 'suffix',\n label: 'Suffix',\n type: 'string',\n placeholder: 'e.g., %, units, items',\n description: 'Text to display after the number'\n },\n {\n key: 'decimals',\n label: 'Decimal Places',\n type: 'number',\n defaultValue: 1,\n min: 0,\n max: 10,\n step: 1,\n description: 'Number of decimal places to display'\n },\n {\n key: 'positiveColorIndex',\n label: 'Positive Change Color',\n type: 'paletteColor',\n defaultValue: 2, // Typically green in most palettes\n description: 'Color for positive changes (increases)'\n },\n {\n key: 'negativeColorIndex',\n label: 'Negative Change Color', \n type: 'paletteColor',\n defaultValue: 3, // Typically red in most palettes\n description: 'Color for negative changes (decreases)'\n },\n {\n key: 'showHistogram',\n label: 'Show Variance Histogram',\n type: 'boolean',\n defaultValue: true,\n description: 'Display historical variance chart below the delta'\n },\n {\n key: 'useLastCompletePeriod',\n label: 'Use Last Complete Period',\n type: 'boolean',\n defaultValue: true,\n description: 'Exclude current incomplete period from delta calculation (e.g., partial week/month)'\n },\n {\n key: 'skipLastPeriod',\n label: 'Skip Last Period',\n type: 'boolean',\n defaultValue: false,\n description: 'Always exclude the last period regardless of completeness'\n }\n ],\n displayOptions: ['hideHeader'],\n validate: (config: any) => {\n if (!config.yAxis || (Array.isArray(config.yAxis) && config.yAxis.length === 0)) {\n return {\n isValid: false,\n message: 'A measure is required for KPI Delta charts'\n }\n }\n \n return { isValid: true }\n }\n}"],"names":["kpiDeltaConfig","getChartTypeIcon","config"],"mappings":";AAMO,MAAMA,IAAkC;AAAA,EAC7C,MAAMC,EAAiB,UAAU;AAAA,EACjC,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,aAAa,eAAe;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAAA,EAC7B,UAAU,CAACC,MACL,CAACA,EAAO,SAAU,MAAM,QAAQA,EAAO,KAAK,KAAKA,EAAO,MAAM,WAAW,IACpE;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,EAAA,IAIN,EAAE,SAAS,GAAA;AAEtB;"}
1
+ {"version":3,"file":"chart-config-kpi-delta-yTA5ug_l.js","sources":["../../../src/client/components/charts/KpiDelta.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the KPI Delta chart type\n */\nexport const kpiDeltaConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('kpiDelta'),\n description: 'Display change between latest and previous values with trend indicators',\n useCase: 'Perfect for showing performance changes over time, such as revenue growth, user acquisition changes, or other metrics where the trend and delta are more important than the absolute value',\n dropZones: [\n {\n key: 'yAxis',\n label: 'Value',\n description: 'Measure to track changes for',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure here'\n },\n {\n key: 'xAxis',\n label: 'Dimension (optional)',\n description: 'Dimension for ordering data (typically time)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop a dimension for ordering'\n }\n ],\n displayOptionsConfig: [\n {\n key: 'prefix',\n label: 'Prefix',\n type: 'string',\n placeholder: 'e.g., $, €, #',\n description: 'Text to display before the number'\n },\n {\n key: 'suffix',\n label: 'Suffix',\n type: 'string',\n placeholder: 'e.g., %, units, items',\n description: 'Text to display after the number'\n },\n {\n key: 'decimals',\n label: 'Decimal Places',\n type: 'number',\n defaultValue: 1,\n min: 0,\n max: 10,\n step: 1,\n description: 'Number of decimal places to display'\n },\n {\n key: 'positiveColorIndex',\n label: 'Positive Change Color',\n type: 'paletteColor',\n defaultValue: 2, // Typically green in most palettes\n description: 'Color for positive changes (increases)'\n },\n {\n key: 'negativeColorIndex',\n label: 'Negative Change Color', \n type: 'paletteColor',\n defaultValue: 3, // Typically red in most palettes\n description: 'Color for negative changes (decreases)'\n },\n {\n key: 'showHistogram',\n label: 'Show Variance Histogram',\n type: 'boolean',\n defaultValue: true,\n description: 'Display historical variance chart below the delta'\n },\n {\n key: 'useLastCompletePeriod',\n label: 'Use Last Complete Period',\n type: 'boolean',\n defaultValue: true,\n description: 'Exclude current incomplete period from delta calculation (e.g., partial week/month)'\n },\n {\n key: 'skipLastPeriod',\n label: 'Skip Last Period',\n type: 'boolean',\n defaultValue: false,\n description: 'Always exclude the last period regardless of completeness'\n }\n ],\n displayOptions: ['hideHeader'],\n validate: (config: any) => {\n if (!config.yAxis || (Array.isArray(config.yAxis) && config.yAxis.length === 0)) {\n return {\n isValid: false,\n message: 'A measure is required for KPI Delta charts'\n }\n }\n \n return { isValid: true }\n }\n}"],"names":["kpiDeltaConfig","getChartTypeIcon","config"],"mappings":";AAMO,MAAMA,IAAkC;AAAA,EAC7C,MAAMC,EAAiB,UAAU;AAAA,EACjC,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,aAAa,eAAe;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAAA,EAC7B,UAAU,CAACC,MACL,CAACA,EAAO,SAAU,MAAM,QAAQA,EAAO,KAAK,KAAKA,EAAO,MAAM,WAAW,IACpE;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,EAAA,IAIN,EAAE,SAAS,GAAA;AAEtB;"}
@@ -1,4 +1,4 @@
1
- import { g as e } from "./icons-NzFHtqeM.js";
1
+ import { a as e } from "./icons-DRreo6m8.js";
2
2
  const a = {
3
3
  icon: e("kpiNumber"),
4
4
  description: "Display key performance indicators as large numbers",
@@ -73,4 +73,4 @@ const a = {
73
73
  export {
74
74
  a as kpiNumberConfig
75
75
  };
76
- //# sourceMappingURL=chart-config-kpi-number-DkE3eSwH.js.map
76
+ //# sourceMappingURL=chart-config-kpi-number-nVAwDXzq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-config-kpi-number-DkE3eSwH.js","sources":["../../../src/client/components/charts/KpiNumber.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the KPI Number chart type\n */\nexport const kpiNumberConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('kpiNumber'),\n description: 'Display key performance indicators as large numbers',\n useCase: 'Perfect for showing important metrics like revenue, user count, or other key business metrics in a prominent, easy-to-read format',\n dropZones: [\n {\n key: 'yAxis',\n label: 'Value',\n description: 'Measure to display as KPI number',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure here'\n }\n ],\n displayOptionsConfig: [\n {\n key: 'target',\n label: 'Target Value',\n type: 'string',\n placeholder: 'e.g., 100',\n description: 'Target value to compare against (first value used if multiple provided)'\n },\n {\n key: 'prefix',\n label: 'Prefix',\n type: 'string',\n placeholder: 'e.g., $, €, #',\n description: 'Text to display before the number'\n },\n {\n key: 'suffix',\n label: 'Suffix',\n type: 'string',\n placeholder: 'e.g., %, units, items',\n description: 'Text to display after the number'\n },\n {\n key: 'decimals',\n label: 'Decimal Places',\n type: 'number',\n defaultValue: 0,\n min: 0,\n max: 10,\n step: 1,\n description: 'Number of decimal places to display'\n },\n {\n key: 'valueColorIndex',\n label: 'Value Color',\n type: 'paletteColor',\n defaultValue: 0,\n description: 'Color from the dashboard palette for the KPI value text'\n },\n {\n key: 'useLastCompletePeriod',\n label: 'Use Last Complete Period',\n type: 'boolean',\n defaultValue: true,\n description: 'Exclude current incomplete period from aggregation (e.g., partial week/month)'\n },\n {\n key: 'skipLastPeriod',\n label: 'Skip Last Period',\n type: 'boolean',\n defaultValue: false,\n description: 'Always exclude the last period regardless of completeness'\n }\n ],\n displayOptions: ['hideHeader']\n}"],"names":["kpiNumberConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAmC;AAAA,EAC9C,MAAMC,EAAiB,WAAW;AAAA,EAClC,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAC/B;"}
1
+ {"version":3,"file":"chart-config-kpi-number-nVAwDXzq.js","sources":["../../../src/client/components/charts/KpiNumber.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the KPI Number chart type\n */\nexport const kpiNumberConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('kpiNumber'),\n description: 'Display key performance indicators as large numbers',\n useCase: 'Perfect for showing important metrics like revenue, user count, or other key business metrics in a prominent, easy-to-read format',\n dropZones: [\n {\n key: 'yAxis',\n label: 'Value',\n description: 'Measure to display as KPI number',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure here'\n }\n ],\n displayOptionsConfig: [\n {\n key: 'target',\n label: 'Target Value',\n type: 'string',\n placeholder: 'e.g., 100',\n description: 'Target value to compare against (first value used if multiple provided)'\n },\n {\n key: 'prefix',\n label: 'Prefix',\n type: 'string',\n placeholder: 'e.g., $, €, #',\n description: 'Text to display before the number'\n },\n {\n key: 'suffix',\n label: 'Suffix',\n type: 'string',\n placeholder: 'e.g., %, units, items',\n description: 'Text to display after the number'\n },\n {\n key: 'decimals',\n label: 'Decimal Places',\n type: 'number',\n defaultValue: 0,\n min: 0,\n max: 10,\n step: 1,\n description: 'Number of decimal places to display'\n },\n {\n key: 'valueColorIndex',\n label: 'Value Color',\n type: 'paletteColor',\n defaultValue: 0,\n description: 'Color from the dashboard palette for the KPI value text'\n },\n {\n key: 'useLastCompletePeriod',\n label: 'Use Last Complete Period',\n type: 'boolean',\n defaultValue: true,\n description: 'Exclude current incomplete period from aggregation (e.g., partial week/month)'\n },\n {\n key: 'skipLastPeriod',\n label: 'Skip Last Period',\n type: 'boolean',\n defaultValue: false,\n description: 'Always exclude the last period regardless of completeness'\n }\n ],\n displayOptions: ['hideHeader']\n}"],"names":["kpiNumberConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAmC;AAAA,EAC9C,MAAMC,EAAiB,WAAW;AAAA,EAClC,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAC/B;"}
@@ -1,4 +1,4 @@
1
- import { g as e } from "./icons-NzFHtqeM.js";
1
+ import { a as e } from "./icons-DRreo6m8.js";
2
2
  const a = {
3
3
  icon: e("kpiText"),
4
4
  description: "Display key performance indicators as customizable text",
@@ -45,4 +45,4 @@ const a = {
45
45
  export {
46
46
  a as kpiTextConfig
47
47
  };
48
- //# sourceMappingURL=chart-config-kpi-text-BMbgdxZm.js.map
48
+ //# sourceMappingURL=chart-config-kpi-text-DZjqsx-b.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-config-kpi-text-BMbgdxZm.js","sources":["../../../src/client/components/charts/KpiText.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the KPI Text chart type\n */\nexport const kpiTextConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('kpiText'),\n description: 'Display key performance indicators as customizable text',\n useCase: 'Perfect for showing metrics with custom formatting, combining multiple values, or displaying contextual KPI information using templates',\n dropZones: [\n {\n key: 'yAxis',\n label: 'Value',\n description: 'Measure to display in the KPI text template',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure here'\n }\n ],\n displayOptionsConfig: [\n {\n key: 'template',\n label: 'Text Template',\n type: 'string',\n placeholder: 'e.g., Total Revenue: ${value}',\n description: 'Template for displaying the text. Use ${value} to insert the measure value.'\n },\n {\n key: 'decimals',\n label: 'Decimal Places',\n type: 'number',\n defaultValue: 0,\n min: 0,\n max: 10,\n step: 1,\n description: 'Number of decimal places to display for numeric values'\n },\n {\n key: 'valueColorIndex',\n label: 'Value Color',\n type: 'paletteColor',\n defaultValue: 0,\n description: 'Color from the dashboard palette for the KPI value text'\n }\n ],\n displayOptions: ['hideHeader']\n}"],"names":["kpiTextConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAiC;AAAA,EAC5C,MAAMC,EAAiB,SAAS;AAAA,EAChC,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAC/B;"}
1
+ {"version":3,"file":"chart-config-kpi-text-DZjqsx-b.js","sources":["../../../src/client/components/charts/KpiText.config.tsx"],"sourcesContent":["import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the KPI Text chart type\n */\nexport const kpiTextConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('kpiText'),\n description: 'Display key performance indicators as customizable text',\n useCase: 'Perfect for showing metrics with custom formatting, combining multiple values, or displaying contextual KPI information using templates',\n dropZones: [\n {\n key: 'yAxis',\n label: 'Value',\n description: 'Measure to display in the KPI text template',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure here'\n }\n ],\n displayOptionsConfig: [\n {\n key: 'template',\n label: 'Text Template',\n type: 'string',\n placeholder: 'e.g., Total Revenue: ${value}',\n description: 'Template for displaying the text. Use ${value} to insert the measure value.'\n },\n {\n key: 'decimals',\n label: 'Decimal Places',\n type: 'number',\n defaultValue: 0,\n min: 0,\n max: 10,\n step: 1,\n description: 'Number of decimal places to display for numeric values'\n },\n {\n key: 'valueColorIndex',\n label: 'Value Color',\n type: 'paletteColor',\n defaultValue: 0,\n description: 'Color from the dashboard palette for the KPI value text'\n }\n ],\n displayOptions: ['hideHeader']\n}"],"names":["kpiTextConfig","getChartTypeIcon"],"mappings":";AAMO,MAAMA,IAAiC;AAAA,EAC5C,MAAMC,EAAiB,SAAS;AAAA,EAChC,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,IACT;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AAAA,MACvB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,sBAAsB;AAAA,IACpB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,IAEf;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,gBAAgB,CAAC,YAAY;AAC/B;"}