drizzle-cube 0.6.6 → 0.7.0

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 (538) hide show
  1. package/README.md +231 -106
  2. package/dist/adapters/ActivityGridChart.config-DaYILvFZ.cjs +1 -0
  3. package/dist/adapters/ActivityGridChart.config-_SyTBEyR.js +2 -0
  4. package/dist/adapters/AreaChart.config-BKh6fY1_.cjs +1 -0
  5. package/dist/adapters/AreaChart.config-CJoxLP3Y.js +2 -0
  6. package/dist/adapters/BarChart.config-Bm1bfRbI.cjs +1 -0
  7. package/dist/adapters/BarChart.config-CGu2Bqrx.js +2 -0
  8. package/dist/adapters/BoxPlotChart.config-B7M9CQaE.js +2 -0
  9. package/dist/adapters/BoxPlotChart.config-CXQel8Hk.cjs +1 -0
  10. package/dist/adapters/BubbleChart.config-BJ36IuVS.cjs +1 -0
  11. package/dist/adapters/BubbleChart.config-CWoXeLdm.js +2 -0
  12. package/dist/adapters/CandlestickChart.config-CGMLZVIy.cjs +1 -0
  13. package/dist/adapters/CandlestickChart.config-CzOcfF1e.js +2 -0
  14. package/dist/adapters/DataTable.config-CdAzueTs.cjs +1 -0
  15. package/dist/adapters/DataTable.config-D_KmPyxV.js +2 -0
  16. package/dist/adapters/FunnelChart.config-D1QAUuYl.cjs +1 -0
  17. package/dist/adapters/FunnelChart.config-DCRHQoFc.js +2 -0
  18. package/dist/adapters/GaugeChart.config-DAybRXP3.js +2 -0
  19. package/dist/adapters/GaugeChart.config-WUPfyLP-.cjs +1 -0
  20. package/dist/adapters/HeatMapChart.config-CziltPnC.cjs +1 -0
  21. package/dist/adapters/HeatMapChart.config-DHpXNONW.js +2 -0
  22. package/dist/adapters/KpiDelta.config-Bw5o0ocY.js +2 -0
  23. package/dist/adapters/KpiDelta.config-CdAmE1pw.cjs +1 -0
  24. package/dist/adapters/KpiNumber.config-CQ_wq2gx.js +2 -0
  25. package/dist/adapters/KpiNumber.config-wxN8x4DC.cjs +1 -0
  26. package/dist/adapters/KpiText.config-DIRIC97F.cjs +1 -0
  27. package/dist/adapters/KpiText.config-eODcP6Hn.js +2 -0
  28. package/dist/adapters/LineChart.config-32-9zA2V.js +2 -0
  29. package/dist/adapters/LineChart.config-BukeFp6z.cjs +1 -0
  30. package/dist/adapters/MarkdownChart.config-BVsR5LDy.js +2 -0
  31. package/dist/adapters/MarkdownChart.config-j4veYjcZ.cjs +1 -0
  32. package/dist/adapters/MeasureProfileChart.config-BRDYx1hw.js +2 -0
  33. package/dist/adapters/MeasureProfileChart.config-CIosBxco.cjs +1 -0
  34. package/dist/adapters/PieChart.config-Bj8KiA0n.cjs +1 -0
  35. package/dist/adapters/PieChart.config-DgAj3y-I.js +2 -0
  36. package/dist/adapters/ProportionBarChart.config-BfFOppHY.js +2 -0
  37. package/dist/adapters/ProportionBarChart.config-c8GGE1aK.cjs +1 -0
  38. package/dist/adapters/RadarChart.config-D7iHY1v9.js +2 -0
  39. package/dist/adapters/RadarChart.config-ghlANG2-.cjs +1 -0
  40. package/dist/adapters/RadialBarChart.config-CsXIz-0v.js +2 -0
  41. package/dist/adapters/RadialBarChart.config-Dsvu2CPV.cjs +1 -0
  42. package/dist/adapters/RetentionCombinedChart.config-CdT1kXC7.js +2 -0
  43. package/dist/adapters/RetentionCombinedChart.config-sDjFKH9K.cjs +1 -0
  44. package/dist/adapters/RetentionHeatmap.config-CvKBvQmu.cjs +1 -0
  45. package/dist/adapters/RetentionHeatmap.config-DbM3ICwc.js +2 -0
  46. package/dist/adapters/SankeyChart.config-BNBcIHaD.js +2 -0
  47. package/dist/adapters/SankeyChart.config-DZscz3kh.cjs +1 -0
  48. package/dist/adapters/ScatterChart.config-BNYIddyM.cjs +1 -0
  49. package/dist/adapters/ScatterChart.config-CEhtoLWc.js +2 -0
  50. package/dist/adapters/SunburstChart.config-ClseCzji.cjs +1 -0
  51. package/dist/adapters/SunburstChart.config-nnphNoVO.js +2 -0
  52. package/dist/adapters/TreeMapChart.config-C8-75muA.js +2 -0
  53. package/dist/adapters/TreeMapChart.config-DoXeUg9Y.cjs +1 -0
  54. package/dist/adapters/WaterfallChart.config-BOF1qxY3.cjs +1 -0
  55. package/dist/adapters/WaterfallChart.config-uW5YyOji.js +2 -0
  56. package/dist/adapters/chartConfigHelpers-BZMu_1EP.cjs +1 -0
  57. package/dist/adapters/{chartConfigHelpers-CcvqrIWF.js → chartConfigHelpers-BsnbxA2c.js} +30 -1
  58. package/dist/adapters/compiler-DAyodAnH.cjs +166 -0
  59. package/dist/adapters/{compiler-ZruQ85ff.js → compiler-Dq04wAjm.js} +116 -60
  60. package/dist/adapters/core/index.cjs +1 -1
  61. package/dist/adapters/core/index.js +1 -1
  62. package/dist/adapters/{core-BMZhIzaI.js → core-BjxfG6Uf.js} +8 -8
  63. package/dist/adapters/core-zV2w0hO2.cjs +1 -0
  64. package/dist/adapters/{dist-CH3hwAUk.js → dist-ChBfLb7x.js} +7 -4
  65. package/dist/adapters/{dist-BOdf-GQO.cjs → dist-CohrBmKe.cjs} +2 -2
  66. package/dist/adapters/express/index.cjs +1 -1
  67. package/dist/adapters/express/index.js +5 -5
  68. package/dist/adapters/fastify/index.cjs +2 -2
  69. package/dist/adapters/fastify/index.js +10 -6
  70. package/dist/adapters/google-BhvizbFR.cjs +2 -0
  71. package/dist/adapters/{google-CvKM9yVM.js → google-eKAc20al.js} +3 -3
  72. package/dist/adapters/{handler-_PXp3G47.cjs → handler-C6Hj6_Yk.cjs} +9 -9
  73. package/dist/adapters/{handler-xR2P1EI4.js → handler-ox6qxLw5.js} +230 -152
  74. package/dist/adapters/hono/index.cjs +1 -1
  75. package/dist/adapters/hono/index.js +26 -18
  76. package/dist/adapters/mcp-tools.cjs +1 -1
  77. package/dist/adapters/mcp-tools.js +2 -2
  78. package/dist/adapters/mcp-transport-C_t_p0wU.cjs +40 -0
  79. package/dist/adapters/mcp-transport-DFH9e6de.js +603 -0
  80. package/dist/adapters/nextjs/index.cjs +1 -1
  81. package/dist/adapters/nextjs/index.js +14 -11
  82. package/dist/{server/openai-C3-mjSAc.cjs → adapters/openai-BffpdO4n.cjs} +1 -1
  83. package/dist/adapters/openai-C9LNhHfK.js +9295 -0
  84. package/dist/adapters/{openai-B6hWZk_r.js → openai-CmyXJWti.js} +18 -17
  85. package/dist/adapters/openai-DlT-0VRC.cjs +19 -0
  86. package/dist/adapters/utils-C5FLHK04.cjs +128 -0
  87. package/dist/adapters/{utils-U7gV5wQL.js → utils-tjiwXFnP.js} +69 -17
  88. package/dist/adapters/utils.cjs +1 -1
  89. package/dist/adapters/utils.js +1 -1
  90. package/dist/cjs/client/charts/chartConfigHelpers.d.ts +20 -0
  91. package/dist/cjs/client/components/AgenticNotebook/AgentChatPanel.d.ts +1 -1
  92. package/dist/cjs/client/components/AgenticNotebook/ChatInput.d.ts +1 -1
  93. package/dist/cjs/client/components/AgenticNotebook/ChatMessage.d.ts +1 -1
  94. package/dist/cjs/client/components/AgenticNotebook/NotebookCanvas.d.ts +2 -2
  95. package/dist/cjs/client/components/AgenticNotebook/NotebookMarkdownBlock.d.ts +1 -1
  96. package/dist/cjs/client/components/AgenticNotebook/NotebookPortletBlock.d.ts +1 -1
  97. package/dist/cjs/client/components/AgenticNotebook/index.d.ts +1 -1
  98. package/dist/cjs/client/components/AnalysisBuilder/AnalysisQueryPanel.d.ts +1 -1
  99. package/dist/cjs/client/components/AnalysisBuilder/AnalysisResultsPanel.d.ts +1 -1
  100. package/dist/cjs/client/components/AnalysisBuilder/AnalysisTypeSelector.d.ts +1 -1
  101. package/dist/cjs/client/components/AnalysisBuilder/BreakdownComparisonToggle.d.ts +1 -1
  102. package/dist/cjs/client/components/AnalysisBuilder/BreakdownItemCard.d.ts +1 -1
  103. package/dist/cjs/client/components/AnalysisBuilder/BreakdownRow.d.ts +1 -1
  104. package/dist/cjs/client/components/AnalysisBuilder/BreakdownSection.d.ts +1 -1
  105. package/dist/cjs/client/components/AnalysisBuilder/ExecutionPlanPanel.d.ts +1 -1
  106. package/dist/cjs/client/components/AnalysisBuilder/FieldSearchResults.d.ts +1 -1
  107. package/dist/cjs/client/components/AnalysisBuilder/FlowConfigPanel.d.ts +1 -1
  108. package/dist/cjs/client/components/AnalysisBuilder/FlowDepthControls.d.ts +1 -1
  109. package/dist/cjs/client/components/AnalysisBuilder/FlowModeContent.d.ts +1 -1
  110. package/dist/cjs/client/components/AnalysisBuilder/FlowVisualizationPicker.d.ts +1 -1
  111. package/dist/cjs/client/components/AnalysisBuilder/FunnelBindingKeySelector.d.ts +1 -1
  112. package/dist/cjs/client/components/AnalysisBuilder/FunnelConfigPanel.d.ts +1 -1
  113. package/dist/cjs/client/components/AnalysisBuilder/FunnelModeContent.d.ts +1 -1
  114. package/dist/cjs/client/components/AnalysisBuilder/FunnelStepCard.d.ts +1 -1
  115. package/dist/cjs/client/components/AnalysisBuilder/FunnelStepList.d.ts +1 -1
  116. package/dist/cjs/client/components/AnalysisBuilder/LegacyBooleanOptions.d.ts +1 -1
  117. package/dist/cjs/client/components/AnalysisBuilder/MetricItemCard.d.ts +1 -1
  118. package/dist/cjs/client/components/AnalysisBuilder/MetricRow.d.ts +1 -1
  119. package/dist/cjs/client/components/AnalysisBuilder/MetricsSection.d.ts +1 -1
  120. package/dist/cjs/client/components/AnalysisBuilder/RetentionConfigPanel.d.ts +2 -2
  121. package/dist/cjs/client/components/AnalysisBuilder/RetentionModeContent.d.ts +1 -1
  122. package/dist/cjs/client/components/AnalysisBuilder/SortToggleButton.d.ts +1 -1
  123. package/dist/cjs/client/components/DashboardPortletCard.d.ts +1 -1
  124. package/dist/cjs/client/components/DataBrowser/DataBrowserTable.d.ts +1 -1
  125. package/dist/cjs/client/components/PortletGroupCard.d.ts +18 -0
  126. package/dist/cjs/client/components/RowManagedLayout.d.ts +15 -3
  127. package/dist/cjs/client/components/analyticsPortlet/intrinsicChartHeight.d.ts +9 -0
  128. package/dist/cjs/client/components/charts/ActivityGridChart.d.ts +1 -1
  129. package/dist/cjs/client/components/charts/AngledXAxisTick.d.ts +5 -0
  130. package/dist/cjs/client/components/charts/AreaChart.d.ts +1 -1
  131. package/dist/cjs/client/components/charts/BarChart.d.ts +1 -1
  132. package/dist/cjs/client/components/charts/BoxPlotChart.d.ts +1 -1
  133. package/dist/cjs/client/components/charts/BubbleChart.d.ts +1 -1
  134. package/dist/cjs/client/components/charts/CandlestickChart.d.ts +1 -1
  135. package/dist/cjs/client/components/charts/ChartContainer.d.ts +7 -1
  136. package/dist/cjs/client/components/charts/ChartSummaryHeader.d.ts +31 -0
  137. package/dist/cjs/client/components/charts/DataTable.d.ts +1 -1
  138. package/dist/cjs/client/components/charts/FunnelChart.d.ts +1 -1
  139. package/dist/cjs/client/components/charts/GaugeChart.d.ts +1 -1
  140. package/dist/cjs/client/components/charts/HeatMapChart.d.ts +1 -1
  141. package/dist/cjs/client/components/charts/KpiCompactLayout.d.ts +31 -0
  142. package/dist/cjs/client/components/charts/KpiDelta.d.ts +1 -1
  143. package/dist/cjs/client/components/charts/KpiDelta.helpers.d.ts +2 -0
  144. package/dist/cjs/client/components/charts/KpiNumber.d.ts +1 -1
  145. package/dist/cjs/client/components/charts/KpiStates.d.ts +7 -2
  146. package/dist/cjs/client/components/charts/KpiText.d.ts +1 -1
  147. package/dist/cjs/client/components/charts/LineChart.d.ts +1 -1
  148. package/dist/cjs/client/components/charts/MarkdownChart.d.ts +1 -1
  149. package/dist/cjs/client/components/charts/MeasureProfileChart.d.ts +1 -1
  150. package/dist/cjs/client/components/charts/PieChart.d.ts +1 -1
  151. package/dist/cjs/client/components/charts/ProportionBarChart.config.d.ts +10 -0
  152. package/dist/cjs/client/components/charts/ProportionBarChart.d.ts +12 -0
  153. package/dist/cjs/client/components/charts/RadarChart.d.ts +1 -1
  154. package/dist/cjs/client/components/charts/RadialBarChart.d.ts +1 -1
  155. package/dist/cjs/client/components/charts/RetentionCombinedChart.d.ts +1 -1
  156. package/dist/cjs/client/components/charts/RetentionHeatmap.d.ts +1 -1
  157. package/dist/cjs/client/components/charts/SankeyChart.d.ts +1 -1
  158. package/dist/cjs/client/components/charts/ScatterChart.d.ts +1 -1
  159. package/dist/cjs/client/components/charts/SunburstChart.d.ts +1 -1
  160. package/dist/cjs/client/components/charts/TreeMapChart.d.ts +1 -1
  161. package/dist/cjs/client/components/charts/WaterfallChart.d.ts +1 -1
  162. package/dist/cjs/client/components/charts/cartesianChartHelpers.d.ts +62 -0
  163. package/dist/cjs/client/components/charts/chartScaffolding.d.ts +29 -0
  164. package/dist/cjs/client/components/dashboard/DashboardContext.d.ts +5 -1
  165. package/dist/cjs/client/components/dashboard/dashboardGridUtils.d.ts +2 -4
  166. package/dist/cjs/client/components/dashboardPortletCard/EditActionButtons.d.ts +34 -0
  167. package/dist/cjs/client/components/dashboardPortletCard/PortletCardHeader.d.ts +2 -12
  168. package/dist/cjs/client/components/dashboardPortletCard/PortletFloatingActions.d.ts +24 -0
  169. package/dist/cjs/client/components/dashboardPortletCard/cardStyles.d.ts +5 -0
  170. package/dist/cjs/client/components/dashboardPortletCard/propsEqual.d.ts +2 -0
  171. package/dist/cjs/client/components/mobileStackedLayout/memberDisplay.d.ts +21 -0
  172. package/dist/cjs/client/components.d.ts +1 -1
  173. package/dist/cjs/client/hooks/dashboard/groupGeometry.d.ts +23 -0
  174. package/dist/cjs/client/hooks/dashboard/groupUtils.d.ts +57 -0
  175. package/dist/cjs/client/hooks/dashboard/layoutUtils.d.ts +34 -3
  176. package/dist/cjs/client/hooks/dashboard/useDashboardController.d.ts +11 -3
  177. package/dist/cjs/client/hooks/dashboard/useRowLayoutEngine.d.ts +12 -2
  178. package/dist/cjs/client/hooks/useDashboardHook.d.ts +14 -1
  179. package/dist/cjs/client/icons/types.d.ts +1 -0
  180. package/dist/cjs/client/index.d.ts +1 -1
  181. package/dist/cjs/client/stores/dashboardStore.d.ts +11 -1
  182. package/dist/cjs/client/types.d.ts +37 -2
  183. package/dist/cli/index.cjs +6 -5
  184. package/dist/client/charts/chartConfigHelpers.d.ts +20 -0
  185. package/dist/client/charts.js +13 -13
  186. package/dist/client/chunks/DashboardEditModal-ByXLlXZD.js +11777 -0
  187. package/dist/client/chunks/DashboardEditModal-ByXLlXZD.js.map +1 -0
  188. package/dist/client/chunks/ProportionBarChart-lOeVz8ZC.js +109 -0
  189. package/dist/client/chunks/ProportionBarChart-lOeVz8ZC.js.map +1 -0
  190. package/dist/client/chunks/{RetentionCombinedChart-DY7wKLs5.js → RetentionCombinedChart-Mcm7zHFx.js} +8 -8
  191. package/dist/client/chunks/{RetentionCombinedChart-DY7wKLs5.js.map → RetentionCombinedChart-Mcm7zHFx.js.map} +1 -1
  192. package/dist/client/chunks/{RetentionHeatmap-iNCG-dLd.js → RetentionHeatmap-4VJx5KDM.js} +6 -6
  193. package/dist/client/chunks/{RetentionHeatmap-iNCG-dLd.js.map → RetentionHeatmap-4VJx5KDM.js.map} +1 -1
  194. package/dist/client/chunks/{analysis-builder-BDWychCW.js → analysis-builder-CWTJQQtL.js} +421 -413
  195. package/dist/client/chunks/analysis-builder-CWTJQQtL.js.map +1 -0
  196. package/dist/client/chunks/{analysis-builder-shared-DkL0e-wU.js → analysis-builder-shared-l-4WKVS1.js} +454 -452
  197. package/dist/client/chunks/analysis-builder-shared-l-4WKVS1.js.map +1 -0
  198. package/dist/client/chunks/{chart-activity-grid-DDqFVWoa.js → chart-activity-grid-DVOhLgxv.js} +61 -6
  199. package/dist/client/chunks/{chart-activity-grid-DDqFVWoa.js.map → chart-activity-grid-DVOhLgxv.js.map} +1 -1
  200. package/dist/client/chunks/chart-area-C-5ATxvi.js +963 -0
  201. package/dist/client/chunks/chart-area-C-5ATxvi.js.map +1 -0
  202. package/dist/client/chunks/{chart-bar-DAO3PPcE.js → chart-bar-CPiLaXHP.js} +71 -64
  203. package/dist/client/chunks/chart-bar-CPiLaXHP.js.map +1 -0
  204. package/dist/client/chunks/{chart-box-plot-CUpFyQQk.js → chart-box-plot-Bae5O9xC.js} +3 -3
  205. package/dist/client/chunks/{chart-box-plot-CUpFyQQk.js.map → chart-box-plot-Bae5O9xC.js.map} +1 -1
  206. package/dist/client/chunks/{chart-bubble-DvP_6_n9.js → chart-bubble-BFN5WIpf.js} +5 -5
  207. package/dist/client/chunks/{chart-bubble-DvP_6_n9.js.map → chart-bubble-BFN5WIpf.js.map} +1 -1
  208. package/dist/client/chunks/{chart-candlestick-Dx8ZCMzl.js → chart-candlestick-PBQKp_z7.js} +3 -3
  209. package/dist/client/chunks/{chart-candlestick-Dx8ZCMzl.js.map → chart-candlestick-PBQKp_z7.js.map} +1 -1
  210. package/dist/client/chunks/{chart-config-activity-grid-BU_bkvER.js → chart-config-activity-grid-C4vXGQNu.js} +2 -2
  211. package/dist/client/chunks/{chart-config-activity-grid-BU_bkvER.js.map → chart-config-activity-grid-C4vXGQNu.js.map} +1 -1
  212. package/dist/client/chunks/{chart-config-area-DxwIZ4Uf.js → chart-config-area-DsrZCIwF.js} +35 -4
  213. package/dist/client/chunks/chart-config-area-DsrZCIwF.js.map +1 -0
  214. package/dist/client/chunks/{chart-config-bar-Cc8GY9aQ.js → chart-config-bar-BixSs43E.js} +7 -7
  215. package/dist/client/chunks/{chart-config-bar-Cc8GY9aQ.js.map → chart-config-bar-BixSs43E.js.map} +1 -1
  216. package/dist/client/chunks/{chart-config-box-plot-Bs8ovYvV.js → chart-config-box-plot-DMuJZqkr.js} +2 -2
  217. package/dist/client/chunks/{chart-config-box-plot-Bs8ovYvV.js.map → chart-config-box-plot-DMuJZqkr.js.map} +1 -1
  218. package/dist/client/chunks/{chart-config-bubble-BfgY7pt8.js → chart-config-bubble-1IyZinH0.js} +2 -2
  219. package/dist/client/chunks/{chart-config-bubble-BfgY7pt8.js.map → chart-config-bubble-1IyZinH0.js.map} +1 -1
  220. package/dist/client/chunks/{chart-config-candlestick-jaeNNEtC.js → chart-config-candlestick-QwQwJB_-.js} +2 -2
  221. package/dist/client/chunks/{chart-config-candlestick-jaeNNEtC.js.map → chart-config-candlestick-QwQwJB_-.js.map} +1 -1
  222. package/dist/client/chunks/{chart-config-data-table-CRk0C0rW.js → chart-config-data-table-CrGyS7aJ.js} +2 -2
  223. package/dist/client/chunks/{chart-config-data-table-CRk0C0rW.js.map → chart-config-data-table-CrGyS7aJ.js.map} +1 -1
  224. package/dist/client/chunks/{chart-config-funnel-boT_LNfl.js → chart-config-funnel-DMLLKtPF.js} +2 -2
  225. package/dist/client/chunks/{chart-config-funnel-boT_LNfl.js.map → chart-config-funnel-DMLLKtPF.js.map} +1 -1
  226. package/dist/client/chunks/{chart-config-gauge-C5uJEr97.js → chart-config-gauge-DNafFwfS.js} +2 -2
  227. package/dist/client/chunks/{chart-config-gauge-C5uJEr97.js.map → chart-config-gauge-DNafFwfS.js.map} +1 -1
  228. package/dist/client/chunks/{chart-config-heat-map-CCarP44-.js → chart-config-heat-map-CJF65SyL.js} +2 -2
  229. package/dist/client/chunks/{chart-config-heat-map-CCarP44-.js.map → chart-config-heat-map-CJF65SyL.js.map} +1 -1
  230. package/dist/client/chunks/{chart-config-kpi-delta-DYopvwyG.js → chart-config-kpi-delta-Cl7k6jTj.js} +13 -4
  231. package/dist/client/chunks/chart-config-kpi-delta-Cl7k6jTj.js.map +1 -0
  232. package/dist/client/chunks/{chart-config-kpi-number-BhMdoArB.js → chart-config-kpi-number-DCcnANWC.js} +6 -4
  233. package/dist/client/chunks/chart-config-kpi-number-DCcnANWC.js.map +1 -0
  234. package/dist/client/chunks/{chart-config-kpi-text-DE6Zdi53.js → chart-config-kpi-text-DnnxvOSA.js} +2 -2
  235. package/dist/client/chunks/{chart-config-kpi-text-DE6Zdi53.js.map → chart-config-kpi-text-DnnxvOSA.js.map} +1 -1
  236. package/dist/client/chunks/{chart-config-line-CBfM0Rds.js → chart-config-line-CBF9Px9b.js} +9 -7
  237. package/dist/client/chunks/chart-config-line-CBF9Px9b.js.map +1 -0
  238. package/dist/client/chunks/{chart-config-markdown-BCDyBI8K.js → chart-config-markdown-C5kBQOjP.js} +2 -2
  239. package/dist/client/chunks/{chart-config-markdown-BCDyBI8K.js.map → chart-config-markdown-C5kBQOjP.js.map} +1 -1
  240. package/dist/client/chunks/{chart-config-measure-profile-BgQIH1u2.js → chart-config-measure-profile-CRSRIpKh.js} +2 -2
  241. package/dist/client/chunks/{chart-config-measure-profile-BgQIH1u2.js.map → chart-config-measure-profile-CRSRIpKh.js.map} +1 -1
  242. package/dist/client/chunks/{chart-config-pie-ChfFz6DV.js → chart-config-pie-DZLa6Eqm.js} +3 -3
  243. package/dist/client/chunks/{chart-config-pie-ChfFz6DV.js.map → chart-config-pie-DZLa6Eqm.js.map} +1 -1
  244. package/dist/client/chunks/{chart-config-radar-BlAIGnww.js → chart-config-radar-DR6vHHyd.js} +3 -3
  245. package/dist/client/chunks/{chart-config-radar-BlAIGnww.js.map → chart-config-radar-DR6vHHyd.js.map} +1 -1
  246. package/dist/client/chunks/{chart-config-radial-bar-VFerwbCO.js → chart-config-radial-bar-DVFou4fB.js} +3 -3
  247. package/dist/client/chunks/{chart-config-radial-bar-VFerwbCO.js.map → chart-config-radial-bar-DVFou4fB.js.map} +1 -1
  248. package/dist/client/chunks/{chart-config-sankey-BhrDxIgj.js → chart-config-sankey-De8E0C1A.js} +2 -2
  249. package/dist/client/chunks/{chart-config-sankey-BhrDxIgj.js.map → chart-config-sankey-De8E0C1A.js.map} +1 -1
  250. package/dist/client/chunks/{chart-config-scatter-q_olh54e.js → chart-config-scatter-CWA89oX4.js} +2 -2
  251. package/dist/client/chunks/{chart-config-scatter-q_olh54e.js.map → chart-config-scatter-CWA89oX4.js.map} +1 -1
  252. package/dist/client/chunks/{chart-config-sunburst-BOmkOnKn.js → chart-config-sunburst-B4NUYHMH.js} +2 -2
  253. package/dist/client/chunks/{chart-config-sunburst-BOmkOnKn.js.map → chart-config-sunburst-B4NUYHMH.js.map} +1 -1
  254. package/dist/client/chunks/{chart-config-tree-map-BjX88YBY.js → chart-config-tree-map-Uhise6Bx.js} +3 -3
  255. package/dist/client/chunks/{chart-config-tree-map-BjX88YBY.js.map → chart-config-tree-map-Uhise6Bx.js.map} +1 -1
  256. package/dist/client/chunks/{chart-config-waterfall-QsWXVSoF.js → chart-config-waterfall-DlQb_PLh.js} +2 -2
  257. package/dist/client/chunks/{chart-config-waterfall-QsWXVSoF.js.map → chart-config-waterfall-DlQb_PLh.js.map} +1 -1
  258. package/dist/client/chunks/{chart-data-table-BP6DMdom.js → chart-data-table-SNSqZj9B.js} +1072 -1034
  259. package/dist/client/chunks/chart-data-table-SNSqZj9B.js.map +1 -0
  260. package/dist/client/chunks/{chart-funnel-xeVGBy-p.js → chart-funnel-CkHSXp6h.js} +3 -3
  261. package/dist/client/chunks/{chart-funnel-xeVGBy-p.js.map → chart-funnel-CkHSXp6h.js.map} +1 -1
  262. package/dist/client/chunks/{chart-gauge-DXQ4r3cb.js → chart-gauge-DHIGq3TH.js} +62 -62
  263. package/dist/client/chunks/{chart-gauge-DXQ4r3cb.js.map → chart-gauge-DHIGq3TH.js.map} +1 -1
  264. package/dist/client/chunks/{chart-heat-map-Pnk6rhqQ.js → chart-heat-map-Bb8L1XQr.js} +4 -4
  265. package/dist/client/chunks/{chart-heat-map-Pnk6rhqQ.js.map → chart-heat-map-Bb8L1XQr.js.map} +1 -1
  266. package/dist/client/chunks/{chart-kpi-delta-nXQnRRBr.js → chart-kpi-delta-BJCOXE-F.js} +122 -48
  267. package/dist/client/chunks/chart-kpi-delta-BJCOXE-F.js.map +1 -0
  268. package/dist/client/chunks/chart-kpi-number-Cdqgv20g.js +263 -0
  269. package/dist/client/chunks/chart-kpi-number-Cdqgv20g.js.map +1 -0
  270. package/dist/client/chunks/{chart-kpi-text-CurpqmaD.js → chart-kpi-text-B10ZHCsI.js} +4 -4
  271. package/dist/client/chunks/{chart-kpi-text-CurpqmaD.js.map → chart-kpi-text-B10ZHCsI.js.map} +1 -1
  272. package/dist/client/chunks/chart-line-CzvVL3Be.js +117 -0
  273. package/dist/client/chunks/chart-line-CzvVL3Be.js.map +1 -0
  274. package/dist/client/chunks/{chart-markdown-BVrqqygz.js → chart-markdown-C0xxBW81.js} +1550 -1349
  275. package/dist/client/chunks/chart-markdown-C0xxBW81.js.map +1 -0
  276. package/dist/client/chunks/{chart-measure-profile-k9_QDQbB.js → chart-measure-profile-BSUPFZCR.js} +6 -5
  277. package/dist/client/chunks/{chart-measure-profile-k9_QDQbB.js.map → chart-measure-profile-BSUPFZCR.js.map} +1 -1
  278. package/dist/client/chunks/{chart-pie-BDaaYt7a.js → chart-pie-CwRfwWWZ.js} +11 -11
  279. package/dist/client/chunks/{chart-pie-BDaaYt7a.js.map → chart-pie-CwRfwWWZ.js.map} +1 -1
  280. package/dist/client/chunks/{chart-radar-Bz07PIVe.js → chart-radar-Dfql2E7i.js} +10 -10
  281. package/dist/client/chunks/{chart-radar-Bz07PIVe.js.map → chart-radar-Dfql2E7i.js.map} +1 -1
  282. package/dist/client/chunks/{chart-radial-bar-DpyxKQMj.js → chart-radial-bar-oE9OZ1IX.js} +11 -11
  283. package/dist/client/chunks/{chart-radial-bar-DpyxKQMj.js.map → chart-radial-bar-oE9OZ1IX.js.map} +1 -1
  284. package/dist/client/chunks/{chart-sankey-BAeNbI-p.js → chart-sankey-tK7Oz1bC.js} +3 -3
  285. package/dist/client/chunks/{chart-sankey-BAeNbI-p.js.map → chart-sankey-tK7Oz1bC.js.map} +1 -1
  286. package/dist/client/chunks/{chart-scatter-CRhGLCcy.js → chart-scatter-BtLfAsZb.js} +10 -10
  287. package/dist/client/chunks/{chart-scatter-CRhGLCcy.js.map → chart-scatter-BtLfAsZb.js.map} +1 -1
  288. package/dist/client/chunks/{chart-sunburst-D3wV5OrK.js → chart-sunburst-B7ryWwQ1.js} +4 -4
  289. package/dist/client/chunks/{chart-sunburst-D3wV5OrK.js.map → chart-sunburst-B7ryWwQ1.js.map} +1 -1
  290. package/dist/client/chunks/{chart-tree-map-iI3ewOKY.js → chart-tree-map-DU5M3-qe.js} +31 -29
  291. package/dist/client/chunks/{chart-tree-map-iI3ewOKY.js.map → chart-tree-map-DU5M3-qe.js.map} +1 -1
  292. package/dist/client/chunks/{chart-waterfall-BrrYTZfs.js → chart-waterfall-CAwutpzd.js} +4 -4
  293. package/dist/client/chunks/{chart-waterfall-BrrYTZfs.js.map → chart-waterfall-CAwutpzd.js.map} +1 -1
  294. package/dist/client/chunks/{charts-core-Cs-UIsQa.js → charts-core-BxBB2zBE.js} +2 -2
  295. package/dist/client/chunks/{charts-core-Cs-UIsQa.js.map → charts-core-BxBB2zBE.js.map} +1 -1
  296. package/dist/client/chunks/charts-loader-0avVzeDd.js +85 -0
  297. package/dist/client/chunks/charts-loader-0avVzeDd.js.map +1 -0
  298. package/dist/client/chunks/{core-D7vPfUIe.js → core-BWRP9s8x.js} +9 -8
  299. package/dist/client/chunks/core-BWRP9s8x.js.map +1 -0
  300. package/dist/client/chunks/{dist-BwQr11Fz.js → dist-BPmPx7kz.js} +56 -51
  301. package/dist/client/chunks/{dist-BwQr11Fz.js.map → dist-BPmPx7kz.js.map} +1 -1
  302. package/dist/client/chunks/{exceljs.min-Dey-qIFL.js → exceljs.min-DWC_b8G9.js} +236 -202
  303. package/dist/client/chunks/{exceljs.min-Dey-qIFL.js.map → exceljs.min-DWC_b8G9.js.map} +1 -1
  304. package/dist/client/chunks/{javascript-DFnKaHmQ.js → javascript-D6aJaG8F.js} +7 -5
  305. package/dist/client/chunks/javascript-D6aJaG8F.js.map +1 -0
  306. package/dist/client/chunks/json-BrJhaXJI.js +44 -0
  307. package/dist/client/chunks/json-BrJhaXJI.js.map +1 -0
  308. package/dist/client/chunks/{nl-NL-2zTAWTej.js → nl-NL-BSMhprPr.js} +57 -2
  309. package/dist/client/chunks/{nl-NL-2zTAWTej.js.map → nl-NL-BSMhprPr.js.map} +1 -1
  310. package/dist/client/chunks/{rolldown-runtime-CWhphoD1.js → rolldown-runtime-DArdT4gl.js} +2 -2
  311. package/dist/client/chunks/{schema-visualization-BGT_cNon.js → schema-visualization-CGbnbzj_.js} +10 -10
  312. package/dist/client/chunks/schema-visualization-CGbnbzj_.js.map +1 -0
  313. package/dist/client/chunks/{syntaxHighlighting-Bq2Bj9Xt.js → syntaxHighlighting-Cm43as8i.js} +2 -2
  314. package/dist/client/chunks/{syntaxHighlighting-Bq2Bj9Xt.js.map → syntaxHighlighting-Cm43as8i.js.map} +1 -1
  315. package/dist/client/chunks/{useDebounce-7suCFq9v.js → useDirtyStateTracking-Dc-Si4db.js} +112 -50
  316. package/dist/client/chunks/useDirtyStateTracking-Dc-Si4db.js.map +1 -0
  317. package/dist/client/chunks/{useExplainAI-DueJjb0r.js → useExplainAI-DJbc7Lu4.js} +18 -18
  318. package/dist/client/chunks/{useExplainAI-DueJjb0r.js.map → useExplainAI-DJbc7Lu4.js.map} +1 -1
  319. package/dist/client/chunks/{utils-DjLiJKS_.js → utils-CToHkuhU.js} +2 -2
  320. package/dist/client/chunks/{utils-DjLiJKS_.js.map → utils-CToHkuhU.js.map} +1 -1
  321. package/dist/client/chunks/{vendor-ChnlgSP0.js → vendor-cTfe9Kho.js} +223 -167
  322. package/dist/client/chunks/vendor-cTfe9Kho.js.map +1 -0
  323. package/dist/client/components/AgenticNotebook/AgentChatPanel.d.ts +1 -1
  324. package/dist/client/components/AgenticNotebook/ChatInput.d.ts +1 -1
  325. package/dist/client/components/AgenticNotebook/ChatMessage.d.ts +1 -1
  326. package/dist/client/components/AgenticNotebook/NotebookCanvas.d.ts +2 -2
  327. package/dist/client/components/AgenticNotebook/NotebookMarkdownBlock.d.ts +1 -1
  328. package/dist/client/components/AgenticNotebook/NotebookPortletBlock.d.ts +1 -1
  329. package/dist/client/components/AgenticNotebook/index.d.ts +1 -1
  330. package/dist/client/components/AnalysisBuilder/AnalysisQueryPanel.d.ts +1 -1
  331. package/dist/client/components/AnalysisBuilder/AnalysisResultsPanel.d.ts +1 -1
  332. package/dist/client/components/AnalysisBuilder/AnalysisTypeSelector.d.ts +1 -1
  333. package/dist/client/components/AnalysisBuilder/BreakdownComparisonToggle.d.ts +1 -1
  334. package/dist/client/components/AnalysisBuilder/BreakdownItemCard.d.ts +1 -1
  335. package/dist/client/components/AnalysisBuilder/BreakdownRow.d.ts +1 -1
  336. package/dist/client/components/AnalysisBuilder/BreakdownSection.d.ts +1 -1
  337. package/dist/client/components/AnalysisBuilder/ExecutionPlanPanel.d.ts +1 -1
  338. package/dist/client/components/AnalysisBuilder/FieldSearchResults.d.ts +1 -1
  339. package/dist/client/components/AnalysisBuilder/FlowConfigPanel.d.ts +1 -1
  340. package/dist/client/components/AnalysisBuilder/FlowDepthControls.d.ts +1 -1
  341. package/dist/client/components/AnalysisBuilder/FlowModeContent.d.ts +1 -1
  342. package/dist/client/components/AnalysisBuilder/FlowVisualizationPicker.d.ts +1 -1
  343. package/dist/client/components/AnalysisBuilder/FunnelBindingKeySelector.d.ts +1 -1
  344. package/dist/client/components/AnalysisBuilder/FunnelConfigPanel.d.ts +1 -1
  345. package/dist/client/components/AnalysisBuilder/FunnelModeContent.d.ts +1 -1
  346. package/dist/client/components/AnalysisBuilder/FunnelStepCard.d.ts +1 -1
  347. package/dist/client/components/AnalysisBuilder/FunnelStepList.d.ts +1 -1
  348. package/dist/client/components/AnalysisBuilder/LegacyBooleanOptions.d.ts +1 -1
  349. package/dist/client/components/AnalysisBuilder/MetricItemCard.d.ts +1 -1
  350. package/dist/client/components/AnalysisBuilder/MetricRow.d.ts +1 -1
  351. package/dist/client/components/AnalysisBuilder/MetricsSection.d.ts +1 -1
  352. package/dist/client/components/AnalysisBuilder/RetentionConfigPanel.d.ts +2 -2
  353. package/dist/client/components/AnalysisBuilder/RetentionModeContent.d.ts +1 -1
  354. package/dist/client/components/AnalysisBuilder/SortToggleButton.d.ts +1 -1
  355. package/dist/client/components/DashboardPortletCard.d.ts +1 -1
  356. package/dist/client/components/DataBrowser/DataBrowserTable.d.ts +1 -1
  357. package/dist/client/components/PortletGroupCard.d.ts +18 -0
  358. package/dist/client/components/RowManagedLayout.d.ts +15 -3
  359. package/dist/client/components/analyticsPortlet/intrinsicChartHeight.d.ts +9 -0
  360. package/dist/client/components/charts/ActivityGridChart.d.ts +1 -1
  361. package/dist/client/components/charts/AngledXAxisTick.d.ts +5 -0
  362. package/dist/client/components/charts/AreaChart.d.ts +1 -1
  363. package/dist/client/components/charts/BarChart.d.ts +1 -1
  364. package/dist/client/components/charts/BoxPlotChart.d.ts +1 -1
  365. package/dist/client/components/charts/BubbleChart.d.ts +1 -1
  366. package/dist/client/components/charts/CandlestickChart.d.ts +1 -1
  367. package/dist/client/components/charts/ChartContainer.d.ts +7 -1
  368. package/dist/client/components/charts/ChartSummaryHeader.d.ts +31 -0
  369. package/dist/client/components/charts/DataTable.d.ts +1 -1
  370. package/dist/client/components/charts/FunnelChart.d.ts +1 -1
  371. package/dist/client/components/charts/GaugeChart.d.ts +1 -1
  372. package/dist/client/components/charts/HeatMapChart.d.ts +1 -1
  373. package/dist/client/components/charts/KpiCompactLayout.d.ts +31 -0
  374. package/dist/client/components/charts/KpiDelta.d.ts +1 -1
  375. package/dist/client/components/charts/KpiDelta.helpers.d.ts +2 -0
  376. package/dist/client/components/charts/KpiNumber.d.ts +1 -1
  377. package/dist/client/components/charts/KpiStates.d.ts +7 -2
  378. package/dist/client/components/charts/KpiText.d.ts +1 -1
  379. package/dist/client/components/charts/LineChart.d.ts +1 -1
  380. package/dist/client/components/charts/MarkdownChart.d.ts +1 -1
  381. package/dist/client/components/charts/MeasureProfileChart.d.ts +1 -1
  382. package/dist/client/components/charts/PieChart.d.ts +1 -1
  383. package/dist/client/components/charts/ProportionBarChart.config.d.ts +10 -0
  384. package/dist/client/components/charts/ProportionBarChart.d.ts +12 -0
  385. package/dist/client/components/charts/RadarChart.d.ts +1 -1
  386. package/dist/client/components/charts/RadialBarChart.d.ts +1 -1
  387. package/dist/client/components/charts/RetentionCombinedChart.d.ts +1 -1
  388. package/dist/client/components/charts/RetentionHeatmap.d.ts +1 -1
  389. package/dist/client/components/charts/SankeyChart.d.ts +1 -1
  390. package/dist/client/components/charts/ScatterChart.d.ts +1 -1
  391. package/dist/client/components/charts/SunburstChart.d.ts +1 -1
  392. package/dist/client/components/charts/TreeMapChart.d.ts +1 -1
  393. package/dist/client/components/charts/WaterfallChart.d.ts +1 -1
  394. package/dist/client/components/charts/cartesianChartHelpers.d.ts +62 -0
  395. package/dist/client/components/charts/chartScaffolding.d.ts +29 -0
  396. package/dist/client/components/dashboard/DashboardContext.d.ts +5 -1
  397. package/dist/client/components/dashboard/dashboardGridUtils.d.ts +2 -4
  398. package/dist/client/components/dashboardPortletCard/EditActionButtons.d.ts +34 -0
  399. package/dist/client/components/dashboardPortletCard/PortletCardHeader.d.ts +2 -12
  400. package/dist/client/components/dashboardPortletCard/PortletFloatingActions.d.ts +24 -0
  401. package/dist/client/components/dashboardPortletCard/cardStyles.d.ts +5 -0
  402. package/dist/client/components/dashboardPortletCard/propsEqual.d.ts +2 -0
  403. package/dist/client/components/mobileStackedLayout/memberDisplay.d.ts +21 -0
  404. package/dist/client/components.d.ts +1 -1
  405. package/dist/client/components.js +3 -4
  406. package/dist/client/hooks/dashboard/groupGeometry.d.ts +23 -0
  407. package/dist/client/hooks/dashboard/groupUtils.d.ts +57 -0
  408. package/dist/client/hooks/dashboard/layoutUtils.d.ts +34 -3
  409. package/dist/client/hooks/dashboard/useDashboardController.d.ts +11 -3
  410. package/dist/client/hooks/dashboard/useRowLayoutEngine.d.ts +12 -2
  411. package/dist/client/hooks/useDashboardHook.d.ts +14 -1
  412. package/dist/client/hooks.js +4 -5
  413. package/dist/client/icons/types.d.ts +1 -0
  414. package/dist/client/icons.js +1 -1
  415. package/dist/client/index.d.ts +1 -1
  416. package/dist/client/index.js +48 -49
  417. package/dist/client/index.js.map +1 -1
  418. package/dist/client/providers.js +1 -1
  419. package/dist/client/schema.js +1 -1
  420. package/dist/client/stores/dashboardStore.d.ts +11 -1
  421. package/dist/client/styles.css +1 -1
  422. package/dist/client/styles.d.css.ts +2 -0
  423. package/dist/client/types.d.ts +37 -2
  424. package/dist/client/utils.js +13 -9
  425. package/dist/client/utils.js.map +1 -1
  426. package/dist/client-bundle-stats.html +388 -33
  427. package/dist/mcp-app/mcp-app.html +152 -165
  428. package/dist/server/chartConfigHelpers-BZMu_1EP.cjs +1 -0
  429. package/dist/server/{chartConfigHelpers-CcvqrIWF.js → chartConfigHelpers-BsnbxA2c.js} +30 -1
  430. package/dist/server/{dist-CH3hwAUk.js → dist-ChBfLb7x.js} +7 -4
  431. package/dist/server/{dist-BOdf-GQO.cjs → dist-CohrBmKe.cjs} +2 -2
  432. package/dist/server/google-BhvizbFR.cjs +2 -0
  433. package/dist/server/{google-CvKM9yVM.js → google-eKAc20al.js} +3 -3
  434. package/dist/server/index.cjs +84 -84
  435. package/dist/server/index.js +2436 -2260
  436. package/dist/server/openai-CUf4vc3Q.js +9295 -0
  437. package/dist/server/openai-Cu4TXXjl.cjs +19 -0
  438. package/dist/server/{openai-B6hWZk_r.js → openai-Czk1BdHa.js} +18 -17
  439. package/dist/{adapters/openai-C3-mjSAc.cjs → server/openai-DBwI1OSu.cjs} +1 -1
  440. package/dist/server/rolldown-runtime-B0aSnxlc.js +20 -0
  441. package/dist/server/rolldown-runtime-DF3sbh8G.cjs +1 -0
  442. package/package.json +14 -10
  443. package/dist/adapters/ActivityGridChart.config-BK3hB9co.cjs +0 -1
  444. package/dist/adapters/ActivityGridChart.config-C-68HsAw.js +0 -2
  445. package/dist/adapters/AreaChart.config-5G7_E-7u.cjs +0 -1
  446. package/dist/adapters/AreaChart.config-C7S67Qt4.js +0 -2
  447. package/dist/adapters/BarChart.config-C6kG_uEt.cjs +0 -1
  448. package/dist/adapters/BarChart.config-DQcicZYy.js +0 -2
  449. package/dist/adapters/BoxPlotChart.config-B4xDTwop.js +0 -2
  450. package/dist/adapters/BoxPlotChart.config-DifAPvo0.cjs +0 -1
  451. package/dist/adapters/BubbleChart.config-BS2edxZ5.cjs +0 -1
  452. package/dist/adapters/BubbleChart.config-C5AYou9n.js +0 -2
  453. package/dist/adapters/CandlestickChart.config-Duknkqyk.js +0 -2
  454. package/dist/adapters/CandlestickChart.config-jk3ZXIAQ.cjs +0 -1
  455. package/dist/adapters/DataTable.config-BG_5hx63.cjs +0 -1
  456. package/dist/adapters/DataTable.config-Bkv6CmFa.js +0 -2
  457. package/dist/adapters/FunnelChart.config-Dvy0S17e.js +0 -2
  458. package/dist/adapters/FunnelChart.config-DzqGZgKz.cjs +0 -1
  459. package/dist/adapters/GaugeChart.config-DAWIU33N.js +0 -2
  460. package/dist/adapters/GaugeChart.config-DC0NW8XT.cjs +0 -1
  461. package/dist/adapters/HeatMapChart.config-BlQDS9nY.cjs +0 -1
  462. package/dist/adapters/HeatMapChart.config-DccGkzHI.js +0 -2
  463. package/dist/adapters/KpiDelta.config-DvpALT3Z.js +0 -2
  464. package/dist/adapters/KpiDelta.config-u2AlJkZ3.cjs +0 -1
  465. package/dist/adapters/KpiNumber.config-CF_LqRh-.cjs +0 -1
  466. package/dist/adapters/KpiNumber.config-lhEzZOFR.js +0 -2
  467. package/dist/adapters/KpiText.config-BCYGZdnx.js +0 -2
  468. package/dist/adapters/KpiText.config-FbnsbjdV.cjs +0 -1
  469. package/dist/adapters/LineChart.config-B7qWURRH.js +0 -2
  470. package/dist/adapters/LineChart.config-B9JKd48E.cjs +0 -1
  471. package/dist/adapters/MarkdownChart.config-BIS9PqHh.js +0 -2
  472. package/dist/adapters/MarkdownChart.config-BfM9NaQe.cjs +0 -1
  473. package/dist/adapters/MeasureProfileChart.config-1hh--3nI.js +0 -2
  474. package/dist/adapters/MeasureProfileChart.config-cmL8wp6a.cjs +0 -1
  475. package/dist/adapters/PieChart.config-DzzCeT7z.cjs +0 -1
  476. package/dist/adapters/PieChart.config-aRJJwYx4.js +0 -2
  477. package/dist/adapters/RadarChart.config-AcZ7kWG8.js +0 -2
  478. package/dist/adapters/RadarChart.config-CddBTWAo.cjs +0 -1
  479. package/dist/adapters/RadialBarChart.config-D4qPexJV.cjs +0 -1
  480. package/dist/adapters/RadialBarChart.config-y-NBkq5N.js +0 -2
  481. package/dist/adapters/RetentionCombinedChart.config-BkRNE7lX.cjs +0 -1
  482. package/dist/adapters/RetentionCombinedChart.config-WoX6n6D5.js +0 -2
  483. package/dist/adapters/RetentionHeatmap.config-ByjWidhh.cjs +0 -1
  484. package/dist/adapters/RetentionHeatmap.config-DjXLk03y.js +0 -2
  485. package/dist/adapters/SankeyChart.config-BWO9LszQ.cjs +0 -1
  486. package/dist/adapters/SankeyChart.config-SuP0jjib.js +0 -2
  487. package/dist/adapters/ScatterChart.config-Dk1G4Eaj.cjs +0 -1
  488. package/dist/adapters/ScatterChart.config-DzVXd1ZM.js +0 -2
  489. package/dist/adapters/SunburstChart.config-Cu4ib4Ui.cjs +0 -1
  490. package/dist/adapters/SunburstChart.config-_0gUzNs7.js +0 -2
  491. package/dist/adapters/TreeMapChart.config-DbwYrje4.js +0 -2
  492. package/dist/adapters/TreeMapChart.config-hM8PukgE.cjs +0 -1
  493. package/dist/adapters/WaterfallChart.config-CjUHeE8R.js +0 -2
  494. package/dist/adapters/WaterfallChart.config-Dwxt0kK-.cjs +0 -1
  495. package/dist/adapters/chartConfigHelpers-DHQB-_v5.cjs +0 -1
  496. package/dist/adapters/compiler-D0v5KJhv.cjs +0 -166
  497. package/dist/adapters/core-VK-KVH9q.cjs +0 -1
  498. package/dist/adapters/google-BOnRIN1w.cjs +0 -2
  499. package/dist/adapters/mcp-transport-C2v5BTDF.cjs +0 -40
  500. package/dist/adapters/mcp-transport-CyDBoYEe.js +0 -601
  501. package/dist/adapters/openai-B1pC8nVM.js +0 -6178
  502. package/dist/adapters/openai-DQZaHN0V.cjs +0 -18
  503. package/dist/adapters/utils-CBR-9AMD.cjs +0 -128
  504. package/dist/client/chunks/ConfirmModal-D6eLc9NO.js +0 -3283
  505. package/dist/client/chunks/ConfirmModal-D6eLc9NO.js.map +0 -1
  506. package/dist/client/chunks/DashboardEditModal-9o16JNF0.js +0 -7580
  507. package/dist/client/chunks/DashboardEditModal-9o16JNF0.js.map +0 -1
  508. package/dist/client/chunks/analysis-builder-BDWychCW.js.map +0 -1
  509. package/dist/client/chunks/analysis-builder-shared-DkL0e-wU.js.map +0 -1
  510. package/dist/client/chunks/chart-area-BHxPNsmc.js +0 -775
  511. package/dist/client/chunks/chart-area-BHxPNsmc.js.map +0 -1
  512. package/dist/client/chunks/chart-bar-DAO3PPcE.js.map +0 -1
  513. package/dist/client/chunks/chart-config-area-DxwIZ4Uf.js.map +0 -1
  514. package/dist/client/chunks/chart-config-kpi-delta-DYopvwyG.js.map +0 -1
  515. package/dist/client/chunks/chart-config-kpi-number-BhMdoArB.js.map +0 -1
  516. package/dist/client/chunks/chart-config-line-CBfM0Rds.js.map +0 -1
  517. package/dist/client/chunks/chart-data-table-BP6DMdom.js.map +0 -1
  518. package/dist/client/chunks/chart-kpi-delta-nXQnRRBr.js.map +0 -1
  519. package/dist/client/chunks/chart-kpi-number-m8UGJfBr.js +0 -244
  520. package/dist/client/chunks/chart-kpi-number-m8UGJfBr.js.map +0 -1
  521. package/dist/client/chunks/chart-line-sJK-cJc0.js +0 -101
  522. package/dist/client/chunks/chart-line-sJK-cJc0.js.map +0 -1
  523. package/dist/client/chunks/chart-markdown-BVrqqygz.js.map +0 -1
  524. package/dist/client/chunks/charts-loader-DAJbAD7a.js +0 -84
  525. package/dist/client/chunks/charts-loader-DAJbAD7a.js.map +0 -1
  526. package/dist/client/chunks/core-D7vPfUIe.js.map +0 -1
  527. package/dist/client/chunks/javascript-DFnKaHmQ.js.map +0 -1
  528. package/dist/client/chunks/json-Cu6rbgWf.js +0 -38
  529. package/dist/client/chunks/json-Cu6rbgWf.js.map +0 -1
  530. package/dist/client/chunks/schema-visualization-BGT_cNon.js.map +0 -1
  531. package/dist/client/chunks/useDebounce-7suCFq9v.js.map +0 -1
  532. package/dist/client/chunks/useDirtyStateTracking-D2OiqKoQ.js +0 -66
  533. package/dist/client/chunks/useDirtyStateTracking-D2OiqKoQ.js.map +0 -1
  534. package/dist/client/chunks/vendor-ChnlgSP0.js.map +0 -1
  535. package/dist/server/chartConfigHelpers-DHQB-_v5.cjs +0 -1
  536. package/dist/server/google-BOnRIN1w.cjs +0 -2
  537. package/dist/server/openai-B1pC8nVM.js +0 -6178
  538. package/dist/server/openai-DQZaHN0V.cjs +0 -18
@@ -1,6 +1,6 @@
1
- import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
- import { D as t, E as n, M as r, P as i, S as a, s as o, w as s } from "./chart-activity-grid-DDqFVWoa.js";
3
- import { S as c, T as l, b as u, w as d, x as f, y as p } from "./chart-area-BHxPNsmc.js";
1
+ import { n as e } from "./rolldown-runtime-DArdT4gl.js";
2
+ import { D as t, E as n, M as r, P as i, S as a, s as o, w as s } from "./chart-activity-grid-DVOhLgxv.js";
3
+ import { D as c, E as l, M as u, O as d, j as f, k as p } from "./chart-area-C-5ATxvi.js";
4
4
  import m, { useMemo as h, useState as g } from "react";
5
5
  import { jsx as _, jsxs as v } from "react/jsx-runtime";
6
6
  import { Cell as y, Legend as b, Pie as x, PieChart as S } from "recharts";
@@ -36,7 +36,7 @@ function w(e, i, a, o, s, c) {
36
36
  };
37
37
  }
38
38
  var T = m.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryObject: r, height: m = "100%", colorPalette: C, onDataPointClick: T, drillEnabled: E }) {
39
- let { t: D } = i(), [O, k] = g(null), A = a(), { xAxisField: j, yAxisFields: M, seriesFields: N, errorCode: P } = h(() => p(t), [t]);
39
+ let { t: D } = i(), [O, k] = g(null), A = a(), { xAxisField: j, yAxisFields: M, seriesFields: N, errorCode: P } = h(() => l(t), [t]);
40
40
  try {
41
41
  let t = {
42
42
  showLegend: n?.showLegend ?? !0,
@@ -44,20 +44,20 @@ var T = m.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryO
44
44
  leftYAxisFormat: n?.leftYAxisFormat,
45
45
  innerRadius: n?.innerRadius || "0%"
46
46
  };
47
- if (!e || e.length === 0) return /* @__PURE__ */ _(f, {
47
+ if (!e || e.length === 0) return /* @__PURE__ */ _(d, {
48
48
  height: m,
49
49
  hint: D("chart.runtime.noDataHint.pie")
50
50
  });
51
- if (P) return /* @__PURE__ */ _(u, {
51
+ if (P) return /* @__PURE__ */ _(c, {
52
52
  height: m,
53
53
  hint: D(P === "axisInvalid" ? "chart.runtime.configErrorHint.pieAxis" : "chart.runtime.configErrorHint.axisFields")
54
54
  });
55
55
  let { pieData: i, originalLength: a } = w(e, j, M, N, r, A);
56
- return i.length === 0 ? /* @__PURE__ */ _(f, {
56
+ return i.length === 0 ? /* @__PURE__ */ _(d, {
57
57
  height: m,
58
58
  titleKey: "chart.runtime.noValidData",
59
59
  hint: a > 0 ? `Filtered out ${a} data points (zero or invalid values)` : "No data points to display in pie chart"
60
- }) : /* @__PURE__ */ _(l, {
60
+ }) : /* @__PURE__ */ _(u, {
61
61
  height: m,
62
62
  children: /* @__PURE__ */ v(S, {
63
63
  accessibilityLayer: !1,
@@ -88,7 +88,7 @@ var T = m.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryO
88
88
  fillOpacity: O ? O === i[t].name ? 1 : .3 : 1
89
89
  }, `cell-${t}`))
90
90
  }),
91
- t.showTooltip && /* @__PURE__ */ _(d, { formatter: t.leftYAxisFormat ? (e, n) => [s(e, t.leftYAxisFormat), n] : void 0 }),
91
+ t.showTooltip && /* @__PURE__ */ _(f, { formatter: t.leftYAxisFormat ? (e, n) => [s(e, t.leftYAxisFormat), n] : void 0 }),
92
92
  t.showLegend && /* @__PURE__ */ _(b, {
93
93
  wrapperStyle: {
94
94
  fontSize: "12px",
@@ -106,7 +106,7 @@ var T = m.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryO
106
106
  })
107
107
  });
108
108
  } catch (e) {
109
- return /* @__PURE__ */ _(c, {
109
+ return /* @__PURE__ */ _(p, {
110
110
  height: m,
111
111
  chartType: "Pie Chart",
112
112
  error: e
@@ -116,4 +116,4 @@ var T = m.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryO
116
116
  //#endregion
117
117
  export { C as n, T as t };
118
118
 
119
- //# sourceMappingURL=chart-pie-BDaaYt7a.js.map
119
+ //# sourceMappingURL=chart-pie-CwRfwWWZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-pie-BDaaYt7a.js","names":[],"sources":["../../../src/client/components/charts/PieChart.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { PieChart as RechartsPieChart, Pie, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer.js'\nimport ChartTooltip from './ChartTooltip.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport { resolveChartAxisFields } from './chartAxisResolution.js'\nimport { CHART_COLORS } from '../../utils/chartConstants.js'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport type { ChartProps, CubeQuery } from '../../types.js'\n\ninterface PieSlice {\n name: string\n value: number\n}\n\n/**\n * Build pie slices from query data, supporting both series-based (dimension\n * slices) and standard measure-based pies. Returns the slices that survive\n * value filtering plus the pre-filter count (so the caller can explain how\n * many points were dropped). Pure — extracted to keep `PieChart` simple.\n */\nfunction buildPieData(\n data: any[],\n xField: string,\n yAxisFields: string[],\n seriesFields: string[],\n queryObject: CubeQuery | undefined,\n getFieldLabel: (field: string) => string\n): { pieData: PieSlice[]; originalLength: number } {\n let pieData: PieSlice[]\n\n if (seriesFields.length > 0) {\n // Use series-based transformation for dimension-based pie slices\n const { data: chartData } = transformChartDataWithSeries(\n data,\n xField,\n yAxisFields,\n queryObject,\n seriesFields,\n getFieldLabel\n )\n\n // Convert series data to pie format\n pieData = []\n if (chartData.length > 0) {\n const firstRow = chartData[0]\n Object.keys(firstRow).forEach(key => {\n if (key !== 'name' && typeof firstRow[key] === 'number') {\n pieData.push({ name: String(key), value: firstRow[key] })\n }\n })\n }\n } else {\n // Standard measure-based pie chart\n const granularity = getFieldGranularity(queryObject, xField)\n pieData = data.map(item => {\n let name = formatTimeValue(item[xField], granularity) || String(item[xField]) || 'Unknown'\n // Handle boolean values with better labels\n if (typeof item[xField] === 'boolean') {\n name = item[xField] ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n }\n return {\n name,\n value: typeof item[yAxisFields[0]] === 'string'\n ? parseFloat(item[yAxisFields[0]])\n : (item[yAxisFields[0]] || 0)\n }\n })\n }\n\n // Filter out invalid values (null, undefined, NaN, or non-positive)\n const originalLength = pieData.length\n pieData = pieData.filter(item =>\n item.value != null &&\n !isNaN(item.value) &&\n item.value !== 0 &&\n item.value > 0\n )\n\n return { pieData, originalLength }\n}\n\nconst PieChart = React.memo(function PieChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette,\n onDataPointClick,\n drillEnabled\n}: ChartProps) {\n const { t } = useTranslation()\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Resolve + validate axis fields (hooks-first to satisfy React rules)\n const { xAxisField, yAxisFields, seriesFields, errorCode } = useMemo(\n () => resolveChartAxisFields(chartConfig),\n [chartConfig]\n )\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat,\n innerRadius: displayConfig?.innerRadius || '0%'\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.pie')} />\n }\n\n if (errorCode) {\n // Pie surfaces a pie-specific message for the \"invalid config\" case\n const hintKey = errorCode === 'axisInvalid'\n ? 'chart.runtime.configErrorHint.pieAxis'\n : 'chart.runtime.configErrorHint.axisFields'\n return <ChartConfigError height={height} hint={t(hintKey)} />\n }\n\n // The errorCode guard above guarantees xAxisField is defined here\n const xField = xAxisField as string\n\n const { pieData, originalLength } = buildPieData(\n data,\n xField,\n yAxisFields,\n seriesFields,\n queryObject,\n getFieldLabel\n )\n\n if (pieData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint={\n originalLength > 0\n ? `Filtered out ${originalLength} data points (zero or invalid values)`\n : 'No data points to display in pie chart'\n }\n />\n )\n }\n \n return (\n <ChartContainer height={height}>\n <RechartsPieChart accessibilityLayer={false}>\n <Pie\n data={pieData}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={safeDisplayConfig.innerRadius !== '0%' ? safeDisplayConfig.innerRadius : undefined}\n outerRadius=\"70%\"\n dataKey=\"value\"\n label={!safeDisplayConfig.showLegend ? ({ name, percent }) =>\n `${name} ${((percent || 0) * 100).toFixed(0)}%`\n : undefined}\n cursor={drillEnabled ? 'pointer' : undefined}\n onClick={(sliceData: any, _index: number, event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled && sliceData) {\n onDataPointClick({\n dataPoint: sliceData,\n clickedField: yAxisFields[0],\n xValue: sliceData.name,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event\n })\n }\n }}\n >\n {pieData.map((_entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === pieData[index].name ? 1 : 0.3) : 1}\n />\n ))}\n </Pie>\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n </RechartsPieChart>\n </ChartContainer>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Pie Chart\" error={error} />\n }\n})\n\nexport default PieChart"],"mappings":"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"}
1
+ {"version":3,"file":"chart-pie-CwRfwWWZ.js","names":[],"sources":["../../../src/client/components/charts/PieChart.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { PieChart as RechartsPieChart, Pie, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer.js'\nimport ChartTooltip from './ChartTooltip.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport { resolveChartAxisFields } from './chartAxisResolution.js'\nimport { CHART_COLORS } from '../../utils/chartConstants.js'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport type { ChartProps, CubeQuery } from '../../types.js'\n\ninterface PieSlice {\n name: string\n value: number\n}\n\n/**\n * Build pie slices from query data, supporting both series-based (dimension\n * slices) and standard measure-based pies. Returns the slices that survive\n * value filtering plus the pre-filter count (so the caller can explain how\n * many points were dropped). Pure — extracted to keep `PieChart` simple.\n */\nfunction buildPieData(\n data: any[],\n xField: string,\n yAxisFields: string[],\n seriesFields: string[],\n queryObject: CubeQuery | undefined,\n getFieldLabel: (field: string) => string\n): { pieData: PieSlice[]; originalLength: number } {\n let pieData: PieSlice[]\n\n if (seriesFields.length > 0) {\n // Use series-based transformation for dimension-based pie slices\n const { data: chartData } = transformChartDataWithSeries(\n data,\n xField,\n yAxisFields,\n queryObject,\n seriesFields,\n getFieldLabel\n )\n\n // Convert series data to pie format\n pieData = []\n if (chartData.length > 0) {\n const firstRow = chartData[0]\n Object.keys(firstRow).forEach(key => {\n if (key !== 'name' && typeof firstRow[key] === 'number') {\n pieData.push({ name: String(key), value: firstRow[key] })\n }\n })\n }\n } else {\n // Standard measure-based pie chart\n const granularity = getFieldGranularity(queryObject, xField)\n pieData = data.map(item => {\n let name = formatTimeValue(item[xField], granularity) || String(item[xField]) || 'Unknown'\n // Handle boolean values with better labels\n if (typeof item[xField] === 'boolean') {\n name = item[xField] ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n }\n return {\n name,\n value: typeof item[yAxisFields[0]] === 'string'\n ? parseFloat(item[yAxisFields[0]])\n : (item[yAxisFields[0]] || 0)\n }\n })\n }\n\n // Filter out invalid values (null, undefined, NaN, or non-positive)\n const originalLength = pieData.length\n pieData = pieData.filter(item =>\n item.value != null &&\n !isNaN(item.value) &&\n item.value !== 0 &&\n item.value > 0\n )\n\n return { pieData, originalLength }\n}\n\nconst PieChart = React.memo(function PieChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette,\n onDataPointClick,\n drillEnabled\n}: ChartProps) {\n const { t } = useTranslation()\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Resolve + validate axis fields (hooks-first to satisfy React rules)\n const { xAxisField, yAxisFields, seriesFields, errorCode } = useMemo(\n () => resolveChartAxisFields(chartConfig),\n [chartConfig]\n )\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat,\n innerRadius: displayConfig?.innerRadius || '0%'\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.pie')} />\n }\n\n if (errorCode) {\n // Pie surfaces a pie-specific message for the \"invalid config\" case\n const hintKey = errorCode === 'axisInvalid'\n ? 'chart.runtime.configErrorHint.pieAxis'\n : 'chart.runtime.configErrorHint.axisFields'\n return <ChartConfigError height={height} hint={t(hintKey)} />\n }\n\n // The errorCode guard above guarantees xAxisField is defined here\n const xField = xAxisField as string\n\n const { pieData, originalLength } = buildPieData(\n data,\n xField,\n yAxisFields,\n seriesFields,\n queryObject,\n getFieldLabel\n )\n\n if (pieData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint={\n originalLength > 0\n ? `Filtered out ${originalLength} data points (zero or invalid values)`\n : 'No data points to display in pie chart'\n }\n />\n )\n }\n \n return (\n <ChartContainer height={height}>\n <RechartsPieChart accessibilityLayer={false}>\n <Pie\n data={pieData}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={safeDisplayConfig.innerRadius !== '0%' ? safeDisplayConfig.innerRadius : undefined}\n outerRadius=\"70%\"\n dataKey=\"value\"\n label={!safeDisplayConfig.showLegend ? ({ name, percent }) =>\n `${name} ${((percent || 0) * 100).toFixed(0)}%`\n : undefined}\n cursor={drillEnabled ? 'pointer' : undefined}\n onClick={(sliceData: any, _index: number, event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled && sliceData) {\n onDataPointClick({\n dataPoint: sliceData,\n clickedField: yAxisFields[0],\n xValue: sliceData.name,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event\n })\n }\n }}\n >\n {pieData.map((_entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === pieData[index].name ? 1 : 0.3) : 1}\n />\n ))}\n </Pie>\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n </RechartsPieChart>\n </ChartContainer>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Pie Chart\" error={error} />\n }\n})\n\nexport default PieChart"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
- import { D as t, E as n, M as r, P as i, s as a, w as o } from "./chart-activity-grid-DDqFVWoa.js";
3
- import { S as s, T as c, b as l, w as u, x as d } from "./chart-area-BHxPNsmc.js";
1
+ import { n as e } from "./rolldown-runtime-DArdT4gl.js";
2
+ import { D as t, E as n, M as r, P as i, s as a, w as o } from "./chart-activity-grid-DVOhLgxv.js";
3
+ import { D as s, M as c, O as l, j as u, k as d } from "./chart-area-C-5ATxvi.js";
4
4
  import f, { useState as p } from "react";
5
5
  import { jsx as m, jsxs as h } from "react/jsx-runtime";
6
6
  import { Legend as g, PolarAngleAxis as _, PolarGrid as v, PolarRadiusAxis as y, Radar as b, RadarChart as x } from "recharts";
@@ -57,16 +57,16 @@ var E = /* @__PURE__ */ e({ default: () => D }), D = f.memo(function({ data: e,
57
57
  showGrid: n?.showGrid ?? !0,
58
58
  leftYAxisFormat: n?.leftYAxisFormat
59
59
  };
60
- if (!e || e.length === 0) return /* @__PURE__ */ m(d, {
60
+ if (!e || e.length === 0) return /* @__PURE__ */ m(l, {
61
61
  height: f,
62
62
  hint: C("chart.runtime.noDataHint.radar")
63
63
  });
64
- let { radarData: s, seriesKeys: p, noNumericFields: D } = T(e, t, r);
65
- if (D) return /* @__PURE__ */ m(l, {
64
+ let { radarData: d, seriesKeys: p, noNumericFields: D } = T(e, t, r);
65
+ if (D) return /* @__PURE__ */ m(s, {
66
66
  height: f,
67
67
  hint: C("chart.runtime.configErrorHint.radarNumeric")
68
68
  });
69
- if (!s || s.length === 0) return /* @__PURE__ */ m(d, {
69
+ if (!d || d.length === 0) return /* @__PURE__ */ m(l, {
70
70
  height: f,
71
71
  titleKey: "chart.runtime.noValidData",
72
72
  hint: "No valid data points for radar chart after transformation"
@@ -75,7 +75,7 @@ var E = /* @__PURE__ */ e({ default: () => D }), D = f.memo(function({ data: e,
75
75
  return /* @__PURE__ */ m(c, {
76
76
  height: f,
77
77
  children: /* @__PURE__ */ h(x, {
78
- data: s,
78
+ data: d,
79
79
  margin: {
80
80
  top: 20,
81
81
  right: 80,
@@ -125,7 +125,7 @@ var E = /* @__PURE__ */ e({ default: () => D }), D = f.memo(function({ data: e,
125
125
  })
126
126
  });
127
127
  } catch (e) {
128
- return /* @__PURE__ */ m(s, {
128
+ return /* @__PURE__ */ m(d, {
129
129
  height: f,
130
130
  chartType: "Radar Chart",
131
131
  error: e
@@ -135,4 +135,4 @@ var E = /* @__PURE__ */ e({ default: () => D }), D = f.memo(function({ data: e,
135
135
  //#endregion
136
136
  export { E as n, D as t };
137
137
 
138
- //# sourceMappingURL=chart-radar-Bz07PIVe.js.map
138
+ //# sourceMappingURL=chart-radar-Dfql2E7i.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-radar-Bz07PIVe.js","names":[],"sources":["../../../src/client/components/charts/radarChartHelpers.ts","../../../src/client/components/charts/RadarChart.tsx"],"sourcesContent":["import { transformChartDataWithSeries, formatTimeValue, getFieldGranularity } from '../../utils/chartUtils.js'\n\n/**\n * Co-located data-shaping helpers for RadarChart. The component supports a\n * config-driven format and a legacy auto-detection format; both branches are\n * isolated here so the component body stays focused on rendering. Pure\n * extraction — no behaviour change.\n */\n\nexport interface RadarShape {\n radarData: any[]\n seriesKeys: string[]\n /** True when no numeric value fields could be found (legacy auto-detect). */\n noNumericFields?: boolean\n}\n\nfunction shapeFromChartConfig(\n data: any[],\n chartConfig: any,\n queryObject: any\n): RadarShape {\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n const seriesFields = chartConfig.series || []\n\n const { data: radarData, seriesKeys } = transformChartDataWithSeries(\n data,\n xAxisField,\n yAxisFields,\n queryObject,\n seriesFields\n )\n return { radarData, seriesKeys }\n}\n\nfunction toNumber(value: unknown): number {\n return typeof value === 'string' ? parseFloat(value) : ((value as number) || 0)\n}\n\nfunction shapeFromLegacy(data: any[], queryObject: any): RadarShape {\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n\n const subjectField = keys.find(key =>\n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('subject') ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n const valueFields = keys.filter(key => typeof firstRow[key] === 'number' && key !== subjectField)\n\n if (valueFields.length === 0) {\n return { radarData: [], seriesKeys: [], noNumericFields: true }\n }\n\n if (subjectField) {\n const granularity = getFieldGranularity(queryObject, subjectField)\n const radarData = data.map(item => {\n const transformedItem: any = {\n name: formatTimeValue(item[subjectField], granularity) || String(item[subjectField]) || 'Unknown'\n }\n valueFields.forEach(field => {\n const displayName = field.split('.').pop() || field\n transformedItem[displayName] = toNumber(item[field])\n })\n return transformedItem\n })\n return { radarData, seriesKeys: valueFields.map(field => field.split('.').pop() || field) }\n }\n\n const radarData = data.map(item => ({\n name: String(item[keys[0]] || 'Unknown'),\n value: toNumber(item[valueFields[0]])\n }))\n return { radarData, seriesKeys: ['value'] }\n}\n\n/** Shape rows for the radar chart via config-driven or legacy auto-detection. */\nexport function buildRadarData(data: any[], chartConfig: any, queryObject: any): RadarShape {\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n return shapeFromChartConfig(data, chartConfig, queryObject)\n }\n return shapeFromLegacy(data, queryObject)\n}\n","import React, { useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { RadarChart as RechartsRadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer.js'\nimport ChartTooltip from './ChartTooltip.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport { buildRadarData } from './radarChartHelpers.js'\nimport { CHART_COLORS } from '../../utils/chartConstants.js'\nimport { formatAxisValue } from '../../utils/chartUtils.js'\nimport type { ChartProps } from '../../types.js'\n\nconst RadarChart = React.memo(function RadarChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.radar')} />\n }\n\n const { radarData, seriesKeys, noNumericFields } = buildRadarData(data, chartConfig, queryObject)\n\n if (noNumericFields) {\n return <ChartConfigError height={height} hint={t('chart.runtime.configErrorHint.radarNumeric')} />\n }\n\n // Validate transformed data\n if (!radarData || radarData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint=\"No valid data points for radar chart after transformation\"\n />\n )\n }\n\n const { leftYAxisFormat } = safeDisplayConfig\n return (\n <ChartContainer height={height}>\n <RechartsRadarChart data={radarData} margin={{ top: 20, right: 80, bottom: 20, left: 80 }} accessibilityLayer={false}>\n {safeDisplayConfig.showGrid && (\n <PolarGrid />\n )}\n <PolarAngleAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n className=\"text-dc-text-muted\"\n />\n <PolarRadiusAxis\n tick={{ fontSize: 10 }}\n className=\"text-dc-text-muted\"\n tickFormatter={leftYAxisFormat\n ? (value: any) => formatAxisValue(value, leftYAxisFormat)\n : undefined\n }\n />\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {(safeDisplayConfig.showLegend && seriesKeys.length > 1) && (\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"rect\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => {\n const color = (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n return (\n <Radar\n key={seriesKey}\n name={seriesKey}\n dataKey={seriesKey}\n stroke={color}\n fill={color}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 0.6 : 0.1) : 0.3}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n strokeWidth={2}\n />\n )\n })}\n </RechartsRadarChart>\n </ChartContainer>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Radar Chart\" error={error} />\n }\n})\n\nexport default RadarChart\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-radar-Dfql2E7i.js","names":[],"sources":["../../../src/client/components/charts/radarChartHelpers.ts","../../../src/client/components/charts/RadarChart.tsx"],"sourcesContent":["import { transformChartDataWithSeries, formatTimeValue, getFieldGranularity } from '../../utils/chartUtils.js'\n\n/**\n * Co-located data-shaping helpers for RadarChart. The component supports a\n * config-driven format and a legacy auto-detection format; both branches are\n * isolated here so the component body stays focused on rendering. Pure\n * extraction — no behaviour change.\n */\n\nexport interface RadarShape {\n radarData: any[]\n seriesKeys: string[]\n /** True when no numeric value fields could be found (legacy auto-detect). */\n noNumericFields?: boolean\n}\n\nfunction shapeFromChartConfig(\n data: any[],\n chartConfig: any,\n queryObject: any\n): RadarShape {\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n const seriesFields = chartConfig.series || []\n\n const { data: radarData, seriesKeys } = transformChartDataWithSeries(\n data,\n xAxisField,\n yAxisFields,\n queryObject,\n seriesFields\n )\n return { radarData, seriesKeys }\n}\n\nfunction toNumber(value: unknown): number {\n return typeof value === 'string' ? parseFloat(value) : ((value as number) || 0)\n}\n\nfunction shapeFromLegacy(data: any[], queryObject: any): RadarShape {\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n\n const subjectField = keys.find(key =>\n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('subject') ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n const valueFields = keys.filter(key => typeof firstRow[key] === 'number' && key !== subjectField)\n\n if (valueFields.length === 0) {\n return { radarData: [], seriesKeys: [], noNumericFields: true }\n }\n\n if (subjectField) {\n const granularity = getFieldGranularity(queryObject, subjectField)\n const radarData = data.map(item => {\n const transformedItem: any = {\n name: formatTimeValue(item[subjectField], granularity) || String(item[subjectField]) || 'Unknown'\n }\n valueFields.forEach(field => {\n const displayName = field.split('.').pop() || field\n transformedItem[displayName] = toNumber(item[field])\n })\n return transformedItem\n })\n return { radarData, seriesKeys: valueFields.map(field => field.split('.').pop() || field) }\n }\n\n const radarData = data.map(item => ({\n name: String(item[keys[0]] || 'Unknown'),\n value: toNumber(item[valueFields[0]])\n }))\n return { radarData, seriesKeys: ['value'] }\n}\n\n/** Shape rows for the radar chart via config-driven or legacy auto-detection. */\nexport function buildRadarData(data: any[], chartConfig: any, queryObject: any): RadarShape {\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n return shapeFromChartConfig(data, chartConfig, queryObject)\n }\n return shapeFromLegacy(data, queryObject)\n}\n","import React, { useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { RadarChart as RechartsRadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer.js'\nimport ChartTooltip from './ChartTooltip.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport { buildRadarData } from './radarChartHelpers.js'\nimport { CHART_COLORS } from '../../utils/chartConstants.js'\nimport { formatAxisValue } from '../../utils/chartUtils.js'\nimport type { ChartProps } from '../../types.js'\n\nconst RadarChart = React.memo(function RadarChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.radar')} />\n }\n\n const { radarData, seriesKeys, noNumericFields } = buildRadarData(data, chartConfig, queryObject)\n\n if (noNumericFields) {\n return <ChartConfigError height={height} hint={t('chart.runtime.configErrorHint.radarNumeric')} />\n }\n\n // Validate transformed data\n if (!radarData || radarData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint=\"No valid data points for radar chart after transformation\"\n />\n )\n }\n\n const { leftYAxisFormat } = safeDisplayConfig\n return (\n <ChartContainer height={height}>\n <RechartsRadarChart data={radarData} margin={{ top: 20, right: 80, bottom: 20, left: 80 }} accessibilityLayer={false}>\n {safeDisplayConfig.showGrid && (\n <PolarGrid />\n )}\n <PolarAngleAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n className=\"text-dc-text-muted\"\n />\n <PolarRadiusAxis\n tick={{ fontSize: 10 }}\n className=\"text-dc-text-muted\"\n tickFormatter={leftYAxisFormat\n ? (value: any) => formatAxisValue(value, leftYAxisFormat)\n : undefined\n }\n />\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {(safeDisplayConfig.showLegend && seriesKeys.length > 1) && (\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"rect\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => {\n const color = (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n return (\n <Radar\n key={seriesKey}\n name={seriesKey}\n dataKey={seriesKey}\n stroke={color}\n fill={color}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 0.6 : 0.1) : 0.3}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n strokeWidth={2}\n />\n )\n })}\n </RechartsRadarChart>\n </ChartContainer>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Radar Chart\" error={error} />\n }\n})\n\nexport default RadarChart\n"],"mappings":";;;;;;;AAgBA,SAAS,EACP,GACA,GACA,GACY;CAKZ,IAAM,EAAE,MAAM,GAAW,kBAAe,EACtC,GALiB,MAAM,QAAQ,EAAY,KAAK,IAAI,EAAY,MAAM,KAAK,EAAY,OACrE,MAAM,QAAQ,EAAY,KAAK,IAAI,EAAY,QAAQ,CAAC,EAAY,KAAK,GAO3F,GANmB,EAAY,UAAU,CAAC,CAQ5C;CACA,OAAO;EAAE;EAAW;CAAW;AACjC;AAEA,SAAS,EAAS,GAAwB;CACxC,OAAO,OAAO,KAAU,WAAW,WAAW,CAAK,IAAM,KAAoB;AAC/E;AAEA,SAAS,EAAgB,GAAa,GAA8B;CAClE,IAAM,IAAW,EAAK,IAChB,IAAO,OAAO,KAAK,CAAQ,GAE3B,IAAe,EAAK,MAAK,MAC7B,OAAO,EAAS,MAAS,YACzB,EAAI,YAAY,CAAC,CAAC,SAAS,SAAS,KACpC,EAAI,YAAY,CAAC,CAAC,SAAS,MAAM,KACjC,EAAI,YAAY,CAAC,CAAC,SAAS,UAAU,CACvC,KAAK,EAAK,IAEJ,IAAc,EAAK,QAAO,MAAO,OAAO,EAAS,MAAS,YAAY,MAAQ,CAAY;CAEhG,IAAI,EAAY,WAAW,GACzB,OAAO;EAAE,WAAW,CAAC;EAAG,YAAY,CAAC;EAAG,iBAAiB;CAAK;CAGhE,IAAI,GAAc;EAChB,IAAM,IAAc,EAAoB,GAAa,CAAY;EAWjE,OAAO;GAAE,WAVS,EAAK,KAAI,MAAQ;IACjC,IAAM,IAAuB,EAC3B,MAAM,EAAgB,EAAK,IAAe,CAAW,KAAK,OAAO,EAAK,EAAa,KAAK,UAC1F;IAKA,OAJA,EAAY,SAAQ,MAAS;KAC3B,IAAM,IAAc,EAAM,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK;KAC9C,EAAgB,KAAe,EAAS,EAAK,EAAM;IACrD,CAAC,GACM;GACT,CACS;GAAW,YAAY,EAAY,KAAI,MAAS,EAAM,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAK;EAAE;CAC5F;CAMA,OAAO;EAAE,WAJS,EAAK,KAAI,OAAS;GAClC,MAAM,OAAO,EAAK,EAAK,OAAO,SAAS;GACvC,OAAO,EAAS,EAAK,EAAY,GAAG;EACtC,EACS;EAAW,YAAY,CAAC,OAAO;CAAE;AAC5C;AAGA,SAAgB,EAAe,GAAa,GAAkB,GAA8B;CAI1F,OAHI,GAAa,SAAS,GAAa,QAC9B,EAAqB,GAAM,GAAa,CAAW,IAErD,EAAgB,GAAM,CAAW;AAC1C;;;iDCzEM,IAAa,EAAM,KAAK,SAAoB,EAChD,SACA,gBACA,mBAAgB,CAAC,GACjB,gBACA,YAAS,QACT,mBACa;CACb,IAAM,EAAE,SAAM,EAAe,GACvB,CAAC,GAAe,KAAoB,EAAwB,IAAI;CAEtE,IAAI;EACF,IAAM,IAAoB;GACxB,YAAY,GAAe,cAAc;GACzC,aAAa,GAAe,eAAe;GAC3C,UAAU,GAAe,YAAY;GACrC,iBAAiB,GAAe;EAClC;EAEA,IAAI,CAAC,KAAQ,EAAK,WAAW,GAC3B,OAAO,kBAAC,GAAD;GAAyB;GAAQ,MAAM,EAAE,gCAAgC;EAAI,CAAA;EAGtF,IAAM,EAAE,cAAW,eAAY,uBAAoB,EAAe,GAAM,GAAa,CAAW;EAEhG,IAAI,GACF,OAAO,kBAAC,GAAD;GAA0B;GAAQ,MAAM,EAAE,4CAA4C;EAAI,CAAA;EAInG,IAAI,CAAC,KAAa,EAAU,WAAW,GACrC,OACE,kBAAC,GAAD;GACU;GACR,UAAS;GACT,MAAK;EACN,CAAA;EAIL,IAAM,EAAE,uBAAoB;EAC5B,OACE,kBAAC,GAAD;GAAwB;GACtB,UAAA,kBAAC,GAAD;IAAoB,MAAM;IAAW,QAAQ;KAAE,KAAK;KAAI,OAAO;KAAI,QAAQ;KAAI,MAAM;IAAG;IAAG,oBAAoB;IAA/G,UAAA;KACG,EAAkB,YACjB,kBAAC,GAAD,CAAY,CAAA;KAEd,kBAAC,GAAD;MACE,SAAQ;MACR,MAAM,EAAE,UAAU,GAAG;MACrB,WAAU;KACX,CAAA;KACD,kBAAC,GAAD;MACE,MAAM,EAAE,UAAU,GAAG;MACrB,WAAU;MACV,eAAe,KACV,MAAe,EAAgB,GAAO,CAAe,IACtD,KAAA;KAEL,CAAA;KACA,EAAkB,eACjB,kBAAC,GAAD,EACE,WAAW,KACN,GAAY,MAAiB,CAAC,EAAgB,GAAO,CAAe,GAAG,CAAI,IAC5E,KAAA,EAEL,CAAA;KAED,EAAkB,cAAc,EAAW,SAAS,KACpD,kBAAC,GAAD;MACE,cAAc;OAAE,UAAU;OAAQ,YAAY;MAAO;MACrD,UAAS;MACT,UAAU;MACV,QAAO;MACP,OAAM;MACN,eAAc;MACd,eAAe,MAAM,EAAiB,OAAO,EAAE,WAAW,EAAE,CAAC;MAC7D,oBAAoB,EAAiB,IAAI;KAC1C,CAAA;KAEF,EAAW,KAAK,GAAW,MAAU;MACpC,IAAM,IAAS,GAAc,UAAU,EAAa,OAAO,IAAQ,EAAa,OAAO,WAAY,EAAa,IAAQ,EAAa;MACrI,OACE,kBAAC,GAAD;OAEE,MAAM;OACN,SAAS;OACT,QAAQ;OACR,MAAM;OACN,aAAa,IAAiB,MAAkB,IAAY,KAAM,KAAO;OACzE,eAAe,IAAiB,MAAkB,IAAY,IAAI,KAAO;OACzE,aAAa;MACd,GARM,CAQN;KAEL,CAAC;IACiB;;EACN,CAAA;CAEpB,SAAS,GAAO;EACd,OAAO,kBAAC,GAAD;GAA0B;GAAQ,WAAU;GAAqB;EAAQ,CAAA;CAClF;AACF,CAAC"}
@@ -1,6 +1,6 @@
1
- import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
- import { D as t, E as n, P as r, s as i, w as a } from "./chart-activity-grid-DDqFVWoa.js";
3
- import { S as o, T as s, b as c, w as l, x as u } from "./chart-area-BHxPNsmc.js";
1
+ import { n as e } from "./rolldown-runtime-DArdT4gl.js";
2
+ import { D as t, E as n, P as r, s as i, w as a } from "./chart-activity-grid-DVOhLgxv.js";
3
+ import { D as o, M as s, O as c, j as l, k as u } from "./chart-area-C-5ATxvi.js";
4
4
  import d, { useState as f } from "react";
5
5
  import { jsx as p, jsxs as m } from "react/jsx-runtime";
6
6
  import { Cell as h, Legend as g, RadialBar as _, RadialBarChart as v } from "recharts";
@@ -48,16 +48,16 @@ var T = /* @__PURE__ */ e({ default: () => E }), E = d.memo(function({ data: e,
48
48
  showTooltip: n?.showTooltip ?? !0,
49
49
  leftYAxisFormat: n?.leftYAxisFormat
50
50
  };
51
- if (!e || e.length === 0) return /* @__PURE__ */ p(u, {
51
+ if (!e || e.length === 0) return /* @__PURE__ */ p(c, {
52
52
  height: d,
53
53
  hint: b("chart.runtime.noDataHint.radialBar")
54
54
  });
55
- let { radialData: o, noValueField: f } = w(e, t, i, y);
56
- if (f) return /* @__PURE__ */ p(c, {
55
+ let { radialData: u, noValueField: f } = w(e, t, i, y);
56
+ if (f) return /* @__PURE__ */ p(o, {
57
57
  height: d,
58
58
  hint: b("chart.runtime.configErrorHint.radialBarNumeric")
59
59
  });
60
- if (o.length === 0) return /* @__PURE__ */ p(u, {
60
+ if (u.length === 0) return /* @__PURE__ */ p(c, {
61
61
  height: d,
62
62
  titleKey: "chart.runtime.noValidData",
63
63
  hint: "No valid data points for radial bar chart after transformation"
@@ -66,7 +66,7 @@ var T = /* @__PURE__ */ e({ default: () => E }), E = d.memo(function({ data: e,
66
66
  return /* @__PURE__ */ p(s, {
67
67
  height: d,
68
68
  children: /* @__PURE__ */ m(v, {
69
- data: o,
69
+ data: u,
70
70
  innerRadius: "10%",
71
71
  outerRadius: "80%",
72
72
  margin: {
@@ -100,7 +100,7 @@ var T = /* @__PURE__ */ e({ default: () => E }), E = d.memo(function({ data: e,
100
100
  fontSize: 12,
101
101
  formatter: C ? (e) => a(e, C) : void 0
102
102
  },
103
- children: o.map((e, t) => /* @__PURE__ */ p(h, {
103
+ children: u.map((e, t) => /* @__PURE__ */ p(h, {
104
104
  fill: e.fill,
105
105
  fillOpacity: x ? x === e.name ? 1 : .3 : 1
106
106
  }, `cell-${t}`))
@@ -109,7 +109,7 @@ var T = /* @__PURE__ */ e({ default: () => E }), E = d.memo(function({ data: e,
109
109
  })
110
110
  });
111
111
  } catch (e) {
112
- return /* @__PURE__ */ p(o, {
112
+ return /* @__PURE__ */ p(u, {
113
113
  height: d,
114
114
  chartType: "Radial Bar Chart",
115
115
  error: e
@@ -119,4 +119,4 @@ var T = /* @__PURE__ */ e({ default: () => E }), E = d.memo(function({ data: e,
119
119
  //#endregion
120
120
  export { T as n, E as t };
121
121
 
122
- //# sourceMappingURL=chart-radial-bar-DpyxKQMj.js.map
122
+ //# sourceMappingURL=chart-radial-bar-oE9OZ1IX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-radial-bar-DpyxKQMj.js","names":[],"sources":["../../../src/client/components/charts/radialBarChartHelpers.ts","../../../src/client/components/charts/RadialBarChart.tsx"],"sourcesContent":["import { CHART_COLORS } from '../../utils/chartConstants.js'\nimport { formatTimeValue, getFieldGranularity } from '../../utils/chartUtils.js'\nimport type { ColorPalette } from '../../types.js'\n\n/**\n * Co-located data-shaping helpers for RadialBarChart. The component supports a\n * config-driven format and a legacy auto-detection format; both branches are\n * isolated here so the component body stays focused on rendering. Pure\n * extraction — no behaviour change.\n */\n\nexport interface RadialDatum {\n name: string\n value: number\n fill?: string\n}\n\nexport interface RadialShape {\n radialData: RadialDatum[]\n /** True when the legacy auto-detect found no usable value field. */\n noValueField?: boolean\n}\n\nfunction colorAt(colorPalette: ColorPalette | undefined, index: number): string {\n const colors = colorPalette?.colors\n return (colors && colors[index % colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n}\n\nfunction toNumber(value: unknown): number {\n return typeof value === 'string' ? parseFloat(value) : ((value as number) || 0)\n}\n\nfunction shapeFromChartConfig(\n data: any[],\n chartConfig: any,\n queryObject: any,\n colorPalette: ColorPalette | undefined\n): RadialShape {\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 granularity = getFieldGranularity(queryObject, xAxisField)\n\n const radialData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n value: toNumber(item[yAxisField]),\n fill: colorAt(colorPalette, index)\n }))\n return { radialData }\n}\n\n/** Coerce a name value to a display label, mapping booleans to Active/Inactive. */\nfunction toRadialName(name: unknown): string {\n if (typeof name === 'boolean') return name ? 'Active' : 'Inactive'\n if (name === 'true' || name === 'false') return name === 'true' ? 'Active' : 'Inactive'\n return String(name)\n}\n\nfunction shapeFromLegacy(\n data: any[],\n colorPalette: ColorPalette | undefined\n): RadialShape {\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n\n const nameField = keys.find(key =>\n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n const valueField = keys.find(key => typeof firstRow[key] === 'number' && key !== nameField) || keys[1]\n\n if (!valueField) {\n return { radialData: [], noValueField: true }\n }\n\n const radialData = data.map((item, index) => ({\n name: toRadialName(item[nameField]),\n value: toNumber(item[valueField]),\n fill: colorAt(colorPalette, index)\n }))\n return { radialData }\n}\n\n/**\n * Shape rows for the radial bar chart (config-driven or legacy auto-detect),\n * filtering out null/zero values.\n */\nexport function buildRadialData(\n data: any[],\n chartConfig: any,\n queryObject: any,\n colorPalette: ColorPalette | undefined\n): RadialShape {\n const shaped = chartConfig?.xAxis && chartConfig?.yAxis\n ? shapeFromChartConfig(data, chartConfig, queryObject, colorPalette)\n : shapeFromLegacy(data, colorPalette)\n\n if (shaped.noValueField) return shaped\n\n return { radialData: shaped.radialData.filter(item => item.value != null && item.value !== 0) }\n}\n","import React, { useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { RadialBarChart as RechartsRadialBarChart, RadialBar, Legend, Cell } from 'recharts'\nimport ChartContainer from './ChartContainer.js'\nimport ChartTooltip from './ChartTooltip.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport { buildRadialData } from './radialBarChartHelpers.js'\nimport { formatAxisValue } from '../../utils/chartUtils.js'\nimport type { ChartProps } from '../../types.js'\n\nconst RadialBarChart = React.memo(function RadialBarChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.radialBar')} />\n }\n\n const { radialData, noValueField } = buildRadialData(data, chartConfig, queryObject, colorPalette)\n\n if (noValueField) {\n return <ChartConfigError height={height} hint={t('chart.runtime.configErrorHint.radialBarNumeric')} />\n }\n\n if (radialData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint=\"No valid data points for radial bar chart after transformation\"\n />\n )\n }\n\n const { leftYAxisFormat } = safeDisplayConfig\n return (\n <ChartContainer height={height}>\n <RechartsRadialBarChart\n data={radialData}\n innerRadius=\"10%\"\n outerRadius=\"80%\"\n margin={{ top: 20, right: 30, bottom: 20, left: 30 }}\n accessibilityLayer={false}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n <RadialBar\n dataKey=\"value\"\n cornerRadius={4}\n label={{\n position: 'insideStart',\n fill: '#fff',\n fontSize: 12,\n formatter: leftYAxisFormat\n ? (value: any) => formatAxisValue(value, leftYAxisFormat)\n : undefined\n }}\n >\n {radialData.map((entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={entry.fill}\n fillOpacity={hoveredLegend ? (hoveredLegend === entry.name ? 1 : 0.3) : 1}\n />\n ))}\n </RadialBar>\n </RechartsRadialBarChart>\n </ChartContainer>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Radial Bar Chart\" error={error} />\n }\n})\n\nexport default RadialBarChart\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-radial-bar-oE9OZ1IX.js","names":[],"sources":["../../../src/client/components/charts/radialBarChartHelpers.ts","../../../src/client/components/charts/RadialBarChart.tsx"],"sourcesContent":["import { CHART_COLORS } from '../../utils/chartConstants.js'\nimport { formatTimeValue, getFieldGranularity } from '../../utils/chartUtils.js'\nimport type { ColorPalette } from '../../types.js'\n\n/**\n * Co-located data-shaping helpers for RadialBarChart. The component supports a\n * config-driven format and a legacy auto-detection format; both branches are\n * isolated here so the component body stays focused on rendering. Pure\n * extraction — no behaviour change.\n */\n\nexport interface RadialDatum {\n name: string\n value: number\n fill?: string\n}\n\nexport interface RadialShape {\n radialData: RadialDatum[]\n /** True when the legacy auto-detect found no usable value field. */\n noValueField?: boolean\n}\n\nfunction colorAt(colorPalette: ColorPalette | undefined, index: number): string {\n const colors = colorPalette?.colors\n return (colors && colors[index % colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n}\n\nfunction toNumber(value: unknown): number {\n return typeof value === 'string' ? parseFloat(value) : ((value as number) || 0)\n}\n\nfunction shapeFromChartConfig(\n data: any[],\n chartConfig: any,\n queryObject: any,\n colorPalette: ColorPalette | undefined\n): RadialShape {\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 granularity = getFieldGranularity(queryObject, xAxisField)\n\n const radialData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n value: toNumber(item[yAxisField]),\n fill: colorAt(colorPalette, index)\n }))\n return { radialData }\n}\n\n/** Coerce a name value to a display label, mapping booleans to Active/Inactive. */\nfunction toRadialName(name: unknown): string {\n if (typeof name === 'boolean') return name ? 'Active' : 'Inactive'\n if (name === 'true' || name === 'false') return name === 'true' ? 'Active' : 'Inactive'\n return String(name)\n}\n\nfunction shapeFromLegacy(\n data: any[],\n colorPalette: ColorPalette | undefined\n): RadialShape {\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n\n const nameField = keys.find(key =>\n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n const valueField = keys.find(key => typeof firstRow[key] === 'number' && key !== nameField) || keys[1]\n\n if (!valueField) {\n return { radialData: [], noValueField: true }\n }\n\n const radialData = data.map((item, index) => ({\n name: toRadialName(item[nameField]),\n value: toNumber(item[valueField]),\n fill: colorAt(colorPalette, index)\n }))\n return { radialData }\n}\n\n/**\n * Shape rows for the radial bar chart (config-driven or legacy auto-detect),\n * filtering out null/zero values.\n */\nexport function buildRadialData(\n data: any[],\n chartConfig: any,\n queryObject: any,\n colorPalette: ColorPalette | undefined\n): RadialShape {\n const shaped = chartConfig?.xAxis && chartConfig?.yAxis\n ? shapeFromChartConfig(data, chartConfig, queryObject, colorPalette)\n : shapeFromLegacy(data, colorPalette)\n\n if (shaped.noValueField) return shaped\n\n return { radialData: shaped.radialData.filter(item => item.value != null && item.value !== 0) }\n}\n","import React, { useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { RadialBarChart as RechartsRadialBarChart, RadialBar, Legend, Cell } from 'recharts'\nimport ChartContainer from './ChartContainer.js'\nimport ChartTooltip from './ChartTooltip.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport { buildRadialData } from './radialBarChartHelpers.js'\nimport { formatAxisValue } from '../../utils/chartUtils.js'\nimport type { ChartProps } from '../../types.js'\n\nconst RadialBarChart = React.memo(function RadialBarChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const { t } = useTranslation()\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.radialBar')} />\n }\n\n const { radialData, noValueField } = buildRadialData(data, chartConfig, queryObject, colorPalette)\n\n if (noValueField) {\n return <ChartConfigError height={height} hint={t('chart.runtime.configErrorHint.radialBarNumeric')} />\n }\n\n if (radialData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint=\"No valid data points for radial bar chart after transformation\"\n />\n )\n }\n\n const { leftYAxisFormat } = safeDisplayConfig\n return (\n <ChartContainer height={height}>\n <RechartsRadialBarChart\n data={radialData}\n innerRadius=\"10%\"\n outerRadius=\"80%\"\n margin={{ top: 20, right: 30, bottom: 20, left: 30 }}\n accessibilityLayer={false}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n <RadialBar\n dataKey=\"value\"\n cornerRadius={4}\n label={{\n position: 'insideStart',\n fill: '#fff',\n fontSize: 12,\n formatter: leftYAxisFormat\n ? (value: any) => formatAxisValue(value, leftYAxisFormat)\n : undefined\n }}\n >\n {radialData.map((entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={entry.fill}\n fillOpacity={hoveredLegend ? (hoveredLegend === entry.name ? 1 : 0.3) : 1}\n />\n ))}\n </RadialBar>\n </RechartsRadialBarChart>\n </ChartContainer>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Radial Bar Chart\" error={error} />\n }\n})\n\nexport default RadialBarChart\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
- import { P as t, s as n } from "./chart-activity-grid-DDqFVWoa.js";
1
+ import { n as e } from "./rolldown-runtime-DArdT4gl.js";
2
+ import { P as t, s as n } from "./chart-activity-grid-DVOhLgxv.js";
3
3
  import r, { useEffect as i, useMemo as a, useRef as o, useState as s } from "react";
4
4
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
5
  import { ResponsiveContainer as u, Sankey as d, Tooltip as f } from "recharts";
@@ -216,4 +216,4 @@ var w = r.memo(function({ data: e, height: r = "100%", colorPalette: p, displayC
216
216
  //#endregion
217
217
  export { p as n, m as r, h as t };
218
218
 
219
- //# sourceMappingURL=chart-sankey-BAeNbI-p.js.map
219
+ //# sourceMappingURL=chart-sankey-tK7Oz1bC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-sankey-BAeNbI-p.js","names":[],"sources":["../../../src/client/types/flow.ts","../../../src/client/components/charts/SankeyChart.tsx"],"sourcesContent":["/**\n * Flow Analysis Types\n *\n * Types for Flow analysis mode which visualizes user journeys using Sankey diagrams.\n * Flow analysis explores paths BEFORE and AFTER a defined starting step (bidirectional),\n * unlike funnel which only tracks linear forward progression.\n */\n\nimport type { Filter } from '../types.js'\nimport type { FunnelBindingKey } from './funnel.js'\n\n// ============================================================================\n// Starting Step Definition\n// ============================================================================\n\n/**\n * Starting step definition for flow analysis\n * The starting step is the anchor point from which we explore paths\n * in both directions (before and after)\n */\nexport interface FlowStartingStep {\n /** Display name for the starting step */\n name: string\n /** Filters that define which events qualify as the starting step */\n filters: Filter[]\n}\n\n// ============================================================================\n// Server Query Format\n// ============================================================================\n\n/**\n * Server flow query format\n * This is the shape sent to the server for execution\n * Wrapped in { flow: {...} } similar to funnel queries\n */\nexport interface ServerFlowQuery {\n flow: FlowQueryConfig\n}\n\n/**\n * Flow query configuration\n * Contains all parameters needed for server-side flow analysis\n */\nexport interface FlowQueryConfig {\n /**\n * Binding key that identifies individual entities (e.g., userId)\n * Can be a single string like 'Events.userId' or array for multi-cube\n */\n bindingKey: string | { cube: string; dimension: string }[]\n\n /**\n * Time dimension used for ordering events\n * Can be a single string like 'Events.timestamp' or array for multi-cube\n */\n timeDimension: string | { cube: string; dimension: string }[]\n\n /**\n * The starting step from which we explore paths\n * Defines the anchor point for bidirectional flow analysis\n */\n startingStep: {\n /** Display name for the starting step */\n name: string\n /** Filter(s) that identify events for this starting step */\n filter?: Filter | Filter[]\n }\n\n /** Number of steps to explore BEFORE the starting step (0-5) */\n stepsBefore: number\n\n /** Number of steps to explore AFTER the starting step (0-5) */\n stepsAfter: number\n\n /**\n * Event dimension that categorizes events (e.g., 'Events.eventType')\n * This dimension's values become the node labels in the Sankey diagram\n */\n eventDimension: string\n\n /**\n * Optional limit on the number of entities to process\n * Useful for performance on large datasets\n */\n entityLimit?: number\n\n /**\n * Output mode for flow data aggregation\n * - 'sankey': Aggregate by (layer, event_type) - standard flow visualization where paths can converge\n * - 'sunburst': Path-qualified nodes for hierarchical tree visualization where each path is unique\n * @default 'sankey'\n */\n outputMode?: 'sankey' | 'sunburst'\n\n /**\n * Join strategy for fetching steps\n * - 'auto' (default): use lateral when supported, otherwise window\n * - 'lateral': force lateral joins\n * - 'window': force window function strategy\n */\n joinStrategy: 'auto' | 'lateral' | 'window'\n}\n\n// ============================================================================\n// Sankey Result Types\n// ============================================================================\n\n/**\n * A node in the Sankey diagram\n * Represents an event type at a specific layer (distance from starting step)\n */\nexport interface SankeyNode {\n /**\n * Unique identifier for this node\n * Format: \"before_{depth}_{eventType}\" or \"after_{depth}_{eventType}\" or \"start_{eventType}\"\n * Examples: \"before_2_Signup\", \"start_Purchase\", \"after_1_Checkout\"\n */\n id: string\n\n /** Display name (typically the event type value) */\n name: string\n\n /**\n * Layer position in the Sankey diagram\n * Negative for steps before starting step, 0 for starting step, positive for after\n * Example: -2, -1, 0, 1, 2 for a flow with 2 steps before and 2 after\n */\n layer: number\n\n /** Total count of entities passing through this node */\n value?: number\n}\n\n/**\n * A link (edge) in the Sankey diagram\n * Represents a transition between two nodes\n */\nexport interface SankeyLink {\n /** Source node ID */\n source: string\n\n /** Target node ID */\n target: string\n\n /** Count of entities that follow this path */\n value: number\n}\n\n/**\n * Complete flow result row returned from server\n * Contains the full Sankey diagram data\n */\nexport interface FlowResultRow {\n nodes: SankeyNode[]\n links: SankeyLink[]\n}\n\n/**\n * Chart-ready flow data format\n * Same structure as FlowResultRow, used for chart components\n */\nexport interface FlowChartData {\n nodes: SankeyNode[]\n links: SankeyLink[]\n}\n\n// ============================================================================\n// Flow Slice State (for Zustand store)\n// ============================================================================\n\n/**\n * Flow mode state for the AnalysisBuilder store\n * Contains all UI state needed to configure a flow analysis\n */\nexport interface FlowSliceState {\n /** Selected cube for flow analysis (must be an eventStream cube) */\n flowCube: string | null\n\n /** Binding key that identifies entities (reuses funnel binding key type) */\n flowBindingKey: FunnelBindingKey | null\n\n /** Time dimension for ordering events */\n flowTimeDimension: string | null\n\n /** Starting step configuration */\n startingStep: FlowStartingStep\n\n /** Number of steps to explore before starting step (0-5, default 3) */\n stepsBefore: number\n\n /** Number of steps to explore after starting step (0-5, default 3) */\n stepsAfter: number\n\n /** Event dimension that categorizes events */\n eventDimension: string | null\n\n /** Join strategy for flow execution */\n joinStrategy: 'auto' | 'lateral' | 'window'\n}\n\n/**\n * Flow slice actions for the store\n */\nexport interface FlowSliceActions {\n setFlowCube: (cube: string | null) => void\n setFlowBindingKey: (key: FunnelBindingKey | null) => void\n setFlowTimeDimension: (dim: string | null) => void\n setEventDimension: (dim: string | null) => void\n setStartingStepName: (name: string) => void\n setStartingStepFilters: (filters: Filter[]) => void\n addStartingStepFilter: (filter: Filter) => void\n removeStartingStepFilter: (index: number) => void\n updateStartingStepFilter: (index: number, filter: Filter) => void\n setStepsBefore: (count: number) => void\n setStepsAfter: (count: number) => void\n setJoinStrategy: (strategy: 'auto' | 'lateral' | 'window') => void\n isFlowMode: () => boolean\n isFlowModeEnabled: () => boolean\n buildFlowQuery: () => ServerFlowQuery | null\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard to check if data is Sankey/Flow chart data\n */\nexport function isSankeyData(data: unknown): data is FlowChartData {\n if (!data || typeof data !== 'object') return false\n const d = data as Record<string, unknown>\n return (\n Array.isArray(d.nodes) &&\n Array.isArray(d.links) &&\n (d.nodes.length === 0 ||\n (typeof d.nodes[0] === 'object' &&\n d.nodes[0] !== null &&\n 'id' in d.nodes[0]))\n )\n}\n\n/**\n * Type guard to detect server flow query format\n * Used to distinguish { flow: {...} } from CubeQuery, MultiQueryConfig, or ServerFunnelQuery\n */\nexport function isServerFlowQuery(obj: unknown): obj is ServerFlowQuery {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n 'flow' in obj &&\n typeof (obj as { flow: unknown }).flow === 'object'\n )\n}\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\n/**\n * Default flow slice state for store initialization\n */\nexport const defaultFlowSliceState: FlowSliceState = {\n flowCube: null,\n flowBindingKey: null,\n flowTimeDimension: null,\n startingStep: {\n name: '',\n filters: [],\n },\n stepsBefore: 3,\n stepsAfter: 3,\n eventDimension: null,\n joinStrategy: 'auto',\n}\n\n/**\n * Minimum and maximum values for step depth\n */\nexport const FLOW_MIN_DEPTH = 0\nexport const FLOW_MAX_DEPTH = 5\n","/**\n * SankeyChart Component\n *\n * Visualizes flow data using Sankey diagrams showing paths between states.\n * Works with data from flow queries which provide nodes and links.\n *\n * The chart displays:\n * - Nodes representing events at different layers (before, start, after)\n * - Links showing the flow of entities between adjacent nodes\n * - Values indicating count of entities following each path\n */\n\nimport React, { useMemo, useRef, useState, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { Sankey, Tooltip, ResponsiveContainer } from 'recharts'\nimport { CHART_COLORS } from '../../utils/chartConstants.js'\nimport type { ChartProps } from '../../types.js'\nimport type { FlowChartData } from '../../types/flow.js'\nimport { isSankeyData } from '../../types/flow.js'\n\n/**\n * Color palette for Sankey nodes based on layer\n */\nconst SANKEY_COLORS = {\n before: '#F97316', // orange-500 - for steps before\n start: '#3B82F6', // blue-500 - for starting step\n after: '#10B981', // emerald-500 - for steps after\n}\n\n/**\n * Get color for a node based on its layer\n */\nfunction getNodeColor(layer: number, colorPalette?: string[]): string {\n if (colorPalette && colorPalette.length > 0) {\n // Use palette colors cycling through\n const absLayer = Math.abs(layer)\n return colorPalette[absLayer % colorPalette.length]\n }\n\n if (layer < 0) return SANKEY_COLORS.before\n if (layer === 0) return SANKEY_COLORS.start\n return SANKEY_COLORS.after\n}\n\n/**\n * Transform FlowChartData to Recharts Sankey format\n */\nfunction transformToRechartsFormat(\n data: FlowChartData,\n colorPalette?: string[]\n): {\n nodes: Array<{ name: string; fill: string; layer: number; value?: number }>\n links: Array<{ source: number; target: number; value: number }>\n} | null {\n if (!data.nodes || data.nodes.length === 0) return null\n\n // Create node index map for link resolution\n const nodeIndexMap = new Map<string, number>()\n data.nodes.forEach((node, index) => {\n nodeIndexMap.set(node.id, index)\n })\n\n // Transform nodes\n const nodes = data.nodes.map((node) => ({\n name: node.name,\n fill: getNodeColor(node.layer, colorPalette),\n layer: node.layer,\n value: node.value,\n }))\n\n // Transform links - resolve string IDs to numeric indices\n const links = data.links\n .map((link) => {\n const sourceIndex = nodeIndexMap.get(link.source)\n const targetIndex = nodeIndexMap.get(link.target)\n\n if (sourceIndex === undefined || targetIndex === undefined) {\n console.warn(`Sankey: Could not resolve link ${link.source} -> ${link.target}`)\n return null\n }\n\n return {\n source: sourceIndex,\n target: targetIndex,\n value: link.value,\n }\n })\n .filter((link): link is { source: number; target: number; value: number } => link !== null)\n\n return { nodes, links }\n}\n\n/**\n * Extract FlowChartData from various data formats\n */\nfunction extractFlowData(data: unknown[]): FlowChartData | null {\n if (!data || data.length === 0) return null\n\n // If first element is already FlowChartData (server returns as single-row array)\n if (isSankeyData(data[0])) {\n return data[0] as FlowChartData\n }\n\n // If data itself is FlowChartData shape\n if (isSankeyData(data)) {\n return data as unknown as FlowChartData\n }\n\n // Check if data is an array with nodes and links at top level\n const asAny = data as unknown as Record<string, unknown>\n if (asAny.nodes && asAny.links) {\n return asAny as unknown as FlowChartData\n }\n\n return null\n}\n\n/**\n * Custom node renderer for Sankey chart\n * Displays the node rectangle with label and value\n */\nfunction SankeyNode({\n x,\n y,\n width,\n height,\n payload,\n containerWidth,\n showLabels = true,\n}: {\n x: number\n y: number\n width: number\n height: number\n payload: { name: string; value?: number; fill: string }\n containerWidth: number\n showLabels?: boolean\n}) {\n // Determine if label should be on the left or right based on position\n const isRightSide = x > containerWidth / 2\n const labelX = isRightSide ? x - 6 : x + width + 6\n const textAnchor = isRightSide ? 'end' : 'start'\n\n return (\n <g>\n {/* Node rectangle */}\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={payload.fill}\n rx={2}\n ry={2}\n />\n {/* Node label - only shown if showLabels is true */}\n {showLabels && (\n <text\n x={labelX}\n y={y + height / 2}\n textAnchor={textAnchor}\n dominantBaseline=\"middle\"\n className=\"dc:text-xs dc:fill-dc-text\"\n style={{ fontSize: 11 }}\n >\n {payload.name}\n {payload.value !== undefined && (\n <tspan className=\"dc:fill-dc-text-secondary\" dx={4}>\n ({payload.value.toLocaleString()})\n </tspan>\n )}\n </text>\n )}\n </g>\n )\n}\n\n/** Shared tooltip card wrapper for the Sankey tooltip variants. */\nfunction SankeyTooltipCard({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"bg-dc-surface dc:border border-dc-border dc:rounded-md dc:px-3 dc:py-2 dc:shadow-lg dc:text-sm\">\n {children}\n </div>\n )\n}\n\n/** Entity count row shared by both tooltip variants. */\nfunction SankeyEntityCount({ value }: { value: number }) {\n return (\n <div className=\"text-dc-text-secondary dc:mt-1\">\n <span className=\"dc:font-medium\">{value.toLocaleString()}</span> entities\n </div>\n )\n}\n\ninterface SankeyTooltipDatum {\n name: string\n value: number\n source?: { name: string }\n target?: { name: string }\n}\n\n/**\n * Custom tooltip for Sankey chart. Renders a link variant (source → target)\n * when both endpoints are present, otherwise a node variant.\n */\nfunction SankeyTooltip({ active, payload }: {\n active?: boolean\n payload?: Array<{ payload: SankeyTooltipDatum }>\n}) {\n if (!active || !payload || payload.length === 0) return null\n\n const data = payload[0].payload\n const { source, target } = data\n\n if (source && target) {\n return (\n <SankeyTooltipCard>\n <div className=\"dc:font-medium text-dc-text\">\n {source.name} → {target.name}\n </div>\n <SankeyEntityCount value={data.value} />\n </SankeyTooltipCard>\n )\n }\n\n return (\n <SankeyTooltipCard>\n <div className=\"dc:font-medium text-dc-text\">{data.name}</div>\n {data.value !== undefined && <SankeyEntityCount value={data.value} />}\n </SankeyTooltipCard>\n )\n}\n\n/**\n * SankeyChart Component\n *\n * Renders a Sankey diagram visualization from FlowChartData.\n * Shows flow paths with nodes at each layer and links between them.\n */\nconst SankeyChart = React.memo(function SankeyChart({\n data,\n height = '100%',\n colorPalette,\n displayConfig,\n}: ChartProps) {\n const { t } = useTranslation()\n // Track container width for label positioning\n const containerRef = useRef<HTMLDivElement>(null)\n const [containerWidth, setContainerWidth] = useState(800)\n\n useEffect(() => {\n const updateWidth = () => {\n if (containerRef.current) {\n setContainerWidth(containerRef.current.offsetWidth)\n }\n }\n updateWidth()\n window.addEventListener('resize', updateWidth)\n return () => window.removeEventListener('resize', updateWidth)\n }, [])\n\n // Get display config options\n // Use custom properties from displayConfig if available, otherwise use defaults\n const displayConfigAny = displayConfig as Record<string, unknown> | undefined\n const linkOpacity = parseFloat(String(displayConfigAny?.linkOpacity || '0.5'))\n const nodeWidth = (displayConfigAny?.nodeWidth as number) ?? 10\n const nodePadding = (displayConfigAny?.nodePadding as number) ?? 50\n const showNodeLabels = displayConfigAny?.showNodeLabels !== false // Default true\n\n // Extract and transform data\n const flowData = useMemo(() => {\n const extracted = extractFlowData(data || [])\n if (!extracted) return null\n\n return transformToRechartsFormat(extracted, colorPalette?.colors || CHART_COLORS)\n }, [data, colorPalette])\n\n // Calculate summary stats\n const summaryStats = useMemo(() => {\n const extracted = extractFlowData(data || [])\n if (!extracted) return null\n\n const totalEntities = extracted.nodes\n .filter((n) => n.layer === 0)\n .reduce((sum, n) => sum + (n.value || 0), 0)\n\n const totalPaths = extracted.links.reduce((sum, l) => sum + l.value, 0)\n\n return {\n nodeCount: extracted.nodes.length,\n linkCount: extracted.links.length,\n totalEntities,\n totalPaths,\n }\n }, [data])\n\n // Handle no data\n if (!data || data.length === 0 || !flowData || flowData.nodes.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.flow.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n {t('chart.runtime.noDataHint.flow')}\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <div ref={containerRef} className=\"dc:relative dc:w-full dc:h-full dc:flex dc:flex-col\" style={{ height }}>\n {/* Sankey Diagram */}\n <div className=\"dc:flex-1 dc:min-h-0\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <Sankey\n data={flowData}\n nodeWidth={nodeWidth}\n nodePadding={nodePadding}\n margin={{ top: 20, right: 20, bottom: 20, left: 20 }}\n link={{\n stroke: 'var(--dc-border)',\n strokeOpacity: linkOpacity,\n }}\n node={(props: any) => (\n <SankeyNode {...props} containerWidth={containerWidth} showLabels={showNodeLabels} />\n )}\n >\n <Tooltip content={<SankeyTooltip />} />\n </Sankey>\n </ResponsiveContainer>\n </div>\n\n {/* Summary Footer */}\n {!(displayConfigAny?.hideSummaryFooter) && summaryStats && (\n <div className=\"dc:flex-shrink-0 dc:px-4 dc:py-2 dc:border-t border-dc-border bg-dc-surface-secondary\">\n <div className=\"dc:flex dc:items-center dc:justify-between dc:text-sm\">\n <div className=\"text-dc-text-muted\">\n <span className=\"dc:font-medium\">{summaryStats.nodeCount}</span> events\n </div>\n <div className=\"text-dc-text\">\n <span className=\"text-dc-text-muted\">{t('chart.runtime.flow.paths')}</span>{' '}\n <span className=\"dc:font-medium\">{summaryStats.linkCount}</span>\n </div>\n <div className=\"text-dc-text-muted\">\n <span className=\"dc:font-medium\">{summaryStats.totalEntities.toLocaleString()}</span> starting entities\n </div>\n </div>\n </div>\n )}\n </div>\n )\n})\n\nexport default SankeyChart\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-sankey-tK7Oz1bC.js","names":[],"sources":["../../../src/client/types/flow.ts","../../../src/client/components/charts/SankeyChart.tsx"],"sourcesContent":["/**\n * Flow Analysis Types\n *\n * Types for Flow analysis mode which visualizes user journeys using Sankey diagrams.\n * Flow analysis explores paths BEFORE and AFTER a defined starting step (bidirectional),\n * unlike funnel which only tracks linear forward progression.\n */\n\nimport type { Filter } from '../types.js'\nimport type { FunnelBindingKey } from './funnel.js'\n\n// ============================================================================\n// Starting Step Definition\n// ============================================================================\n\n/**\n * Starting step definition for flow analysis\n * The starting step is the anchor point from which we explore paths\n * in both directions (before and after)\n */\nexport interface FlowStartingStep {\n /** Display name for the starting step */\n name: string\n /** Filters that define which events qualify as the starting step */\n filters: Filter[]\n}\n\n// ============================================================================\n// Server Query Format\n// ============================================================================\n\n/**\n * Server flow query format\n * This is the shape sent to the server for execution\n * Wrapped in { flow: {...} } similar to funnel queries\n */\nexport interface ServerFlowQuery {\n flow: FlowQueryConfig\n}\n\n/**\n * Flow query configuration\n * Contains all parameters needed for server-side flow analysis\n */\nexport interface FlowQueryConfig {\n /**\n * Binding key that identifies individual entities (e.g., userId)\n * Can be a single string like 'Events.userId' or array for multi-cube\n */\n bindingKey: string | { cube: string; dimension: string }[]\n\n /**\n * Time dimension used for ordering events\n * Can be a single string like 'Events.timestamp' or array for multi-cube\n */\n timeDimension: string | { cube: string; dimension: string }[]\n\n /**\n * The starting step from which we explore paths\n * Defines the anchor point for bidirectional flow analysis\n */\n startingStep: {\n /** Display name for the starting step */\n name: string\n /** Filter(s) that identify events for this starting step */\n filter?: Filter | Filter[]\n }\n\n /** Number of steps to explore BEFORE the starting step (0-5) */\n stepsBefore: number\n\n /** Number of steps to explore AFTER the starting step (0-5) */\n stepsAfter: number\n\n /**\n * Event dimension that categorizes events (e.g., 'Events.eventType')\n * This dimension's values become the node labels in the Sankey diagram\n */\n eventDimension: string\n\n /**\n * Optional limit on the number of entities to process\n * Useful for performance on large datasets\n */\n entityLimit?: number\n\n /**\n * Output mode for flow data aggregation\n * - 'sankey': Aggregate by (layer, event_type) - standard flow visualization where paths can converge\n * - 'sunburst': Path-qualified nodes for hierarchical tree visualization where each path is unique\n * @default 'sankey'\n */\n outputMode?: 'sankey' | 'sunburst'\n\n /**\n * Join strategy for fetching steps\n * - 'auto' (default): use lateral when supported, otherwise window\n * - 'lateral': force lateral joins\n * - 'window': force window function strategy\n */\n joinStrategy: 'auto' | 'lateral' | 'window'\n}\n\n// ============================================================================\n// Sankey Result Types\n// ============================================================================\n\n/**\n * A node in the Sankey diagram\n * Represents an event type at a specific layer (distance from starting step)\n */\nexport interface SankeyNode {\n /**\n * Unique identifier for this node\n * Format: \"before_{depth}_{eventType}\" or \"after_{depth}_{eventType}\" or \"start_{eventType}\"\n * Examples: \"before_2_Signup\", \"start_Purchase\", \"after_1_Checkout\"\n */\n id: string\n\n /** Display name (typically the event type value) */\n name: string\n\n /**\n * Layer position in the Sankey diagram\n * Negative for steps before starting step, 0 for starting step, positive for after\n * Example: -2, -1, 0, 1, 2 for a flow with 2 steps before and 2 after\n */\n layer: number\n\n /** Total count of entities passing through this node */\n value?: number\n}\n\n/**\n * A link (edge) in the Sankey diagram\n * Represents a transition between two nodes\n */\nexport interface SankeyLink {\n /** Source node ID */\n source: string\n\n /** Target node ID */\n target: string\n\n /** Count of entities that follow this path */\n value: number\n}\n\n/**\n * Complete flow result row returned from server\n * Contains the full Sankey diagram data\n */\nexport interface FlowResultRow {\n nodes: SankeyNode[]\n links: SankeyLink[]\n}\n\n/**\n * Chart-ready flow data format\n * Same structure as FlowResultRow, used for chart components\n */\nexport interface FlowChartData {\n nodes: SankeyNode[]\n links: SankeyLink[]\n}\n\n// ============================================================================\n// Flow Slice State (for Zustand store)\n// ============================================================================\n\n/**\n * Flow mode state for the AnalysisBuilder store\n * Contains all UI state needed to configure a flow analysis\n */\nexport interface FlowSliceState {\n /** Selected cube for flow analysis (must be an eventStream cube) */\n flowCube: string | null\n\n /** Binding key that identifies entities (reuses funnel binding key type) */\n flowBindingKey: FunnelBindingKey | null\n\n /** Time dimension for ordering events */\n flowTimeDimension: string | null\n\n /** Starting step configuration */\n startingStep: FlowStartingStep\n\n /** Number of steps to explore before starting step (0-5, default 3) */\n stepsBefore: number\n\n /** Number of steps to explore after starting step (0-5, default 3) */\n stepsAfter: number\n\n /** Event dimension that categorizes events */\n eventDimension: string | null\n\n /** Join strategy for flow execution */\n joinStrategy: 'auto' | 'lateral' | 'window'\n}\n\n/**\n * Flow slice actions for the store\n */\nexport interface FlowSliceActions {\n setFlowCube: (cube: string | null) => void\n setFlowBindingKey: (key: FunnelBindingKey | null) => void\n setFlowTimeDimension: (dim: string | null) => void\n setEventDimension: (dim: string | null) => void\n setStartingStepName: (name: string) => void\n setStartingStepFilters: (filters: Filter[]) => void\n addStartingStepFilter: (filter: Filter) => void\n removeStartingStepFilter: (index: number) => void\n updateStartingStepFilter: (index: number, filter: Filter) => void\n setStepsBefore: (count: number) => void\n setStepsAfter: (count: number) => void\n setJoinStrategy: (strategy: 'auto' | 'lateral' | 'window') => void\n isFlowMode: () => boolean\n isFlowModeEnabled: () => boolean\n buildFlowQuery: () => ServerFlowQuery | null\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard to check if data is Sankey/Flow chart data\n */\nexport function isSankeyData(data: unknown): data is FlowChartData {\n if (!data || typeof data !== 'object') return false\n const d = data as Record<string, unknown>\n return (\n Array.isArray(d.nodes) &&\n Array.isArray(d.links) &&\n (d.nodes.length === 0 ||\n (typeof d.nodes[0] === 'object' &&\n d.nodes[0] !== null &&\n 'id' in d.nodes[0]))\n )\n}\n\n/**\n * Type guard to detect server flow query format\n * Used to distinguish { flow: {...} } from CubeQuery, MultiQueryConfig, or ServerFunnelQuery\n */\nexport function isServerFlowQuery(obj: unknown): obj is ServerFlowQuery {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n 'flow' in obj &&\n typeof (obj as { flow: unknown }).flow === 'object'\n )\n}\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\n/**\n * Default flow slice state for store initialization\n */\nexport const defaultFlowSliceState: FlowSliceState = {\n flowCube: null,\n flowBindingKey: null,\n flowTimeDimension: null,\n startingStep: {\n name: '',\n filters: [],\n },\n stepsBefore: 3,\n stepsAfter: 3,\n eventDimension: null,\n joinStrategy: 'auto',\n}\n\n/**\n * Minimum and maximum values for step depth\n */\nexport const FLOW_MIN_DEPTH = 0\nexport const FLOW_MAX_DEPTH = 5\n","/**\n * SankeyChart Component\n *\n * Visualizes flow data using Sankey diagrams showing paths between states.\n * Works with data from flow queries which provide nodes and links.\n *\n * The chart displays:\n * - Nodes representing events at different layers (before, start, after)\n * - Links showing the flow of entities between adjacent nodes\n * - Values indicating count of entities following each path\n */\n\nimport React, { useMemo, useRef, useState, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { Sankey, Tooltip, ResponsiveContainer } from 'recharts'\nimport { CHART_COLORS } from '../../utils/chartConstants.js'\nimport type { ChartProps } from '../../types.js'\nimport type { FlowChartData } from '../../types/flow.js'\nimport { isSankeyData } from '../../types/flow.js'\n\n/**\n * Color palette for Sankey nodes based on layer\n */\nconst SANKEY_COLORS = {\n before: '#F97316', // orange-500 - for steps before\n start: '#3B82F6', // blue-500 - for starting step\n after: '#10B981', // emerald-500 - for steps after\n}\n\n/**\n * Get color for a node based on its layer\n */\nfunction getNodeColor(layer: number, colorPalette?: string[]): string {\n if (colorPalette && colorPalette.length > 0) {\n // Use palette colors cycling through\n const absLayer = Math.abs(layer)\n return colorPalette[absLayer % colorPalette.length]\n }\n\n if (layer < 0) return SANKEY_COLORS.before\n if (layer === 0) return SANKEY_COLORS.start\n return SANKEY_COLORS.after\n}\n\n/**\n * Transform FlowChartData to Recharts Sankey format\n */\nfunction transformToRechartsFormat(\n data: FlowChartData,\n colorPalette?: string[]\n): {\n nodes: Array<{ name: string; fill: string; layer: number; value?: number }>\n links: Array<{ source: number; target: number; value: number }>\n} | null {\n if (!data.nodes || data.nodes.length === 0) return null\n\n // Create node index map for link resolution\n const nodeIndexMap = new Map<string, number>()\n data.nodes.forEach((node, index) => {\n nodeIndexMap.set(node.id, index)\n })\n\n // Transform nodes\n const nodes = data.nodes.map((node) => ({\n name: node.name,\n fill: getNodeColor(node.layer, colorPalette),\n layer: node.layer,\n value: node.value,\n }))\n\n // Transform links - resolve string IDs to numeric indices\n const links = data.links\n .map((link) => {\n const sourceIndex = nodeIndexMap.get(link.source)\n const targetIndex = nodeIndexMap.get(link.target)\n\n if (sourceIndex === undefined || targetIndex === undefined) {\n console.warn(`Sankey: Could not resolve link ${link.source} -> ${link.target}`)\n return null\n }\n\n return {\n source: sourceIndex,\n target: targetIndex,\n value: link.value,\n }\n })\n .filter((link): link is { source: number; target: number; value: number } => link !== null)\n\n return { nodes, links }\n}\n\n/**\n * Extract FlowChartData from various data formats\n */\nfunction extractFlowData(data: unknown[]): FlowChartData | null {\n if (!data || data.length === 0) return null\n\n // If first element is already FlowChartData (server returns as single-row array)\n if (isSankeyData(data[0])) {\n return data[0] as FlowChartData\n }\n\n // If data itself is FlowChartData shape\n if (isSankeyData(data)) {\n return data as unknown as FlowChartData\n }\n\n // Check if data is an array with nodes and links at top level\n const asAny = data as unknown as Record<string, unknown>\n if (asAny.nodes && asAny.links) {\n return asAny as unknown as FlowChartData\n }\n\n return null\n}\n\n/**\n * Custom node renderer for Sankey chart\n * Displays the node rectangle with label and value\n */\nfunction SankeyNode({\n x,\n y,\n width,\n height,\n payload,\n containerWidth,\n showLabels = true,\n}: {\n x: number\n y: number\n width: number\n height: number\n payload: { name: string; value?: number; fill: string }\n containerWidth: number\n showLabels?: boolean\n}) {\n // Determine if label should be on the left or right based on position\n const isRightSide = x > containerWidth / 2\n const labelX = isRightSide ? x - 6 : x + width + 6\n const textAnchor = isRightSide ? 'end' : 'start'\n\n return (\n <g>\n {/* Node rectangle */}\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={payload.fill}\n rx={2}\n ry={2}\n />\n {/* Node label - only shown if showLabels is true */}\n {showLabels && (\n <text\n x={labelX}\n y={y + height / 2}\n textAnchor={textAnchor}\n dominantBaseline=\"middle\"\n className=\"dc:text-xs dc:fill-dc-text\"\n style={{ fontSize: 11 }}\n >\n {payload.name}\n {payload.value !== undefined && (\n <tspan className=\"dc:fill-dc-text-secondary\" dx={4}>\n ({payload.value.toLocaleString()})\n </tspan>\n )}\n </text>\n )}\n </g>\n )\n}\n\n/** Shared tooltip card wrapper for the Sankey tooltip variants. */\nfunction SankeyTooltipCard({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"bg-dc-surface dc:border border-dc-border dc:rounded-md dc:px-3 dc:py-2 dc:shadow-lg dc:text-sm\">\n {children}\n </div>\n )\n}\n\n/** Entity count row shared by both tooltip variants. */\nfunction SankeyEntityCount({ value }: { value: number }) {\n return (\n <div className=\"text-dc-text-secondary dc:mt-1\">\n <span className=\"dc:font-medium\">{value.toLocaleString()}</span> entities\n </div>\n )\n}\n\ninterface SankeyTooltipDatum {\n name: string\n value: number\n source?: { name: string }\n target?: { name: string }\n}\n\n/**\n * Custom tooltip for Sankey chart. Renders a link variant (source → target)\n * when both endpoints are present, otherwise a node variant.\n */\nfunction SankeyTooltip({ active, payload }: {\n active?: boolean\n payload?: Array<{ payload: SankeyTooltipDatum }>\n}) {\n if (!active || !payload || payload.length === 0) return null\n\n const data = payload[0].payload\n const { source, target } = data\n\n if (source && target) {\n return (\n <SankeyTooltipCard>\n <div className=\"dc:font-medium text-dc-text\">\n {source.name} → {target.name}\n </div>\n <SankeyEntityCount value={data.value} />\n </SankeyTooltipCard>\n )\n }\n\n return (\n <SankeyTooltipCard>\n <div className=\"dc:font-medium text-dc-text\">{data.name}</div>\n {data.value !== undefined && <SankeyEntityCount value={data.value} />}\n </SankeyTooltipCard>\n )\n}\n\n/**\n * SankeyChart Component\n *\n * Renders a Sankey diagram visualization from FlowChartData.\n * Shows flow paths with nodes at each layer and links between them.\n */\nconst SankeyChart = React.memo(function SankeyChart({\n data,\n height = '100%',\n colorPalette,\n displayConfig,\n}: ChartProps) {\n const { t } = useTranslation()\n // Track container width for label positioning\n const containerRef = useRef<HTMLDivElement>(null)\n const [containerWidth, setContainerWidth] = useState(800)\n\n useEffect(() => {\n const updateWidth = () => {\n if (containerRef.current) {\n setContainerWidth(containerRef.current.offsetWidth)\n }\n }\n updateWidth()\n window.addEventListener('resize', updateWidth)\n return () => window.removeEventListener('resize', updateWidth)\n }, [])\n\n // Get display config options\n // Use custom properties from displayConfig if available, otherwise use defaults\n const displayConfigAny = displayConfig as Record<string, unknown> | undefined\n const linkOpacity = parseFloat(String(displayConfigAny?.linkOpacity || '0.5'))\n const nodeWidth = (displayConfigAny?.nodeWidth as number) ?? 10\n const nodePadding = (displayConfigAny?.nodePadding as number) ?? 50\n const showNodeLabels = displayConfigAny?.showNodeLabels !== false // Default true\n\n // Extract and transform data\n const flowData = useMemo(() => {\n const extracted = extractFlowData(data || [])\n if (!extracted) return null\n\n return transformToRechartsFormat(extracted, colorPalette?.colors || CHART_COLORS)\n }, [data, colorPalette])\n\n // Calculate summary stats\n const summaryStats = useMemo(() => {\n const extracted = extractFlowData(data || [])\n if (!extracted) return null\n\n const totalEntities = extracted.nodes\n .filter((n) => n.layer === 0)\n .reduce((sum, n) => sum + (n.value || 0), 0)\n\n const totalPaths = extracted.links.reduce((sum, l) => sum + l.value, 0)\n\n return {\n nodeCount: extracted.nodes.length,\n linkCount: extracted.links.length,\n totalEntities,\n totalPaths,\n }\n }, [data])\n\n // Handle no data\n if (!data || data.length === 0 || !flowData || flowData.nodes.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.flow.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n {t('chart.runtime.noDataHint.flow')}\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <div ref={containerRef} className=\"dc:relative dc:w-full dc:h-full dc:flex dc:flex-col\" style={{ height }}>\n {/* Sankey Diagram */}\n <div className=\"dc:flex-1 dc:min-h-0\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <Sankey\n data={flowData}\n nodeWidth={nodeWidth}\n nodePadding={nodePadding}\n margin={{ top: 20, right: 20, bottom: 20, left: 20 }}\n link={{\n stroke: 'var(--dc-border)',\n strokeOpacity: linkOpacity,\n }}\n node={(props: any) => (\n <SankeyNode {...props} containerWidth={containerWidth} showLabels={showNodeLabels} />\n )}\n >\n <Tooltip content={<SankeyTooltip />} />\n </Sankey>\n </ResponsiveContainer>\n </div>\n\n {/* Summary Footer */}\n {!(displayConfigAny?.hideSummaryFooter) && summaryStats && (\n <div className=\"dc:flex-shrink-0 dc:px-4 dc:py-2 dc:border-t border-dc-border bg-dc-surface-secondary\">\n <div className=\"dc:flex dc:items-center dc:justify-between dc:text-sm\">\n <div className=\"text-dc-text-muted\">\n <span className=\"dc:font-medium\">{summaryStats.nodeCount}</span> events\n </div>\n <div className=\"text-dc-text\">\n <span className=\"text-dc-text-muted\">{t('chart.runtime.flow.paths')}</span>{' '}\n <span className=\"dc:font-medium\">{summaryStats.linkCount}</span>\n </div>\n <div className=\"text-dc-text-muted\">\n <span className=\"dc:font-medium\">{summaryStats.totalEntities.toLocaleString()}</span> starting entities\n </div>\n </div>\n </div>\n )}\n </div>\n )\n})\n\nexport default SankeyChart\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
- import { A as t, D as n, E as r, P as i, S as a, k as o, l as s, s as c, w as l } from "./chart-activity-grid-DDqFVWoa.js";
3
- import { S as u, T as d, b as f, x as p } from "./chart-area-BHxPNsmc.js";
1
+ import { n as e } from "./rolldown-runtime-DArdT4gl.js";
2
+ import { A as t, D as n, E as r, P as i, S as a, k as o, l as s, s as c, w as l } from "./chart-activity-grid-DVOhLgxv.js";
3
+ import { D as u, M as d, O as f, k as p } from "./chart-area-C-5ATxvi.js";
4
4
  import m, { useState as h } from "react";
5
5
  import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
6
6
  import { CartesianGrid as y, Legend as b, Scatter as x, ScatterChart as S, Tooltip as C, XAxis as w, YAxis as T } from "recharts";
@@ -162,17 +162,17 @@ function P({ hasSeries: e, seriesKeys: t, seriesGroups: n, scatterData: r, color
162
162
  var F = /* @__PURE__ */ e({ default: () => I }), I = m.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryObject: r, height: o = "100%", colorPalette: s }) {
163
163
  let { t: c } = i(), [m, g] = h(null), x = a();
164
164
  try {
165
- if (!e || e.length === 0) return /* @__PURE__ */ _(p, {
165
+ if (!e || e.length === 0) return /* @__PURE__ */ _(f, {
166
166
  height: o,
167
167
  hint: c("chart.runtime.noDataHint.scatter")
168
168
  });
169
- let { xAxisField: i, yAxisField: a, seriesFields: u, errorCode: h } = O(t);
170
- if (h) return /* @__PURE__ */ _(f, {
169
+ let { xAxisField: i, yAxisField: a, seriesFields: p, errorCode: h } = O(t);
170
+ if (h) return /* @__PURE__ */ _(u, {
171
171
  height: o,
172
172
  hint: c(`chart.runtime.configErrorHint.${h}`)
173
173
  });
174
- let { scatterData: E, seriesGroups: k } = j(e, i, a, u, (r?.timeDimensions || []).map((e) => e.dimension), r);
175
- if (!E || E.length === 0) return /* @__PURE__ */ _(p, {
174
+ let { scatterData: E, seriesGroups: k } = j(e, i, a, p, (r?.timeDimensions || []).map((e) => e.dimension), r);
175
+ if (!E || E.length === 0) return /* @__PURE__ */ _(f, {
176
176
  height: o,
177
177
  titleKey: "chart.runtime.noValidData",
178
178
  hint: "No valid data points for scatter chart after transformation"
@@ -245,7 +245,7 @@ var F = /* @__PURE__ */ e({ default: () => I }), I = m.memo(function({ data: e,
245
245
  })
246
246
  });
247
247
  } catch (e) {
248
- return /* @__PURE__ */ _(u, {
248
+ return /* @__PURE__ */ _(p, {
249
249
  height: o,
250
250
  chartType: "Scatter Chart",
251
251
  error: e
@@ -255,4 +255,4 @@ var F = /* @__PURE__ */ e({ default: () => I }), I = m.memo(function({ data: e,
255
255
  //#endregion
256
256
  export { F as n, I as t };
257
257
 
258
- //# sourceMappingURL=chart-scatter-CRhGLCcy.js.map
258
+ //# sourceMappingURL=chart-scatter-BtLfAsZb.js.map