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 +1 @@
1
- {"version":3,"file":"chart-gauge-DXQ4r3cb.js","names":["epsilon","pi","tau","constant","tau","pi"],"sources":["../../../node_modules/d3-shape/src/constant.js","../../../node_modules/d3-shape/src/math.js","../../../node_modules/d3-path/src/path.js","../../../node_modules/d3-shape/src/path.js","../../../node_modules/d3-shape/src/arc.js","../../../src/client/components/charts/gaugeChartHelpers.ts","../../../src/client/components/charts/GaugeChart.tsx"],"sourcesContent":["export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export const abs = Math.abs;\nexport const atan2 = Math.atan2;\nexport const cos = Math.cos;\nexport const max = Math.max;\nexport const min = Math.min;\nexport const sin = Math.sin;\nexport const sqrt = Math.sqrt;\n\nexport const epsilon = 1e-12;\nexport const pi = Math.PI;\nexport const halfPi = pi / 2;\nexport const tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n","import constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\nimport {withPath} from \"./path.js\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null,\n path = withPath(arc);\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle. If this\n // intersection fails, it’s probably because the arc is too small, so\n // disable the corner radius entirely.\n if (da < pi) {\n if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n } else {\n rc0 = rc1 = 0;\n }\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","import { arc } from 'd3-shape'\nimport { formatAxisValue } from '../../utils/chartUtils.js'\nimport type { AxisFormatConfig, ThresholdBand } from '../../types.js'\n\n/**\n * Co-located helpers for GaugeChart: pure geometry/value math and threshold\n * parsing extracted from the component so the render body stays flat. Pure\n * extraction — no behaviour change.\n */\n\nexport const START_ANGLE = -Math.PI * 0.75\nexport const END_ANGLE = Math.PI * 0.75\nexport const TRACK_COLOR = '#e2e8f0'\nexport const DEFAULT_FILL = '#6366f1'\n\nexport function parseNum(v: unknown): number | null {\n if (v === undefined || v === null) return null\n const n = typeof v === 'number' ? v : parseFloat(String(v))\n return isNaN(n) ? null : n\n}\n\nexport function clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v))\n}\n\nexport function valueToAngle(value: number, min: number, max: number): number {\n const span = max === min ? 1 : max - min\n const t = clamp((value - min) / span, 0, 1)\n return START_ANGLE + t * (END_ANGLE - START_ANGLE)\n}\n\nexport function resolveColor(fraction: number, thresholds: ThresholdBand[]): string {\n const sorted = [...thresholds].sort((a, b) => a.value - b.value)\n let color = DEFAULT_FILL\n for (const t of sorted) {\n if (fraction >= t.value) color = t.color\n }\n return color\n}\n\nexport function buildArcPath(\n innerRadius: number,\n outerRadius: number,\n startAngle: number,\n endAngle: number\n): string {\n const pathFn = arc()\n return pathFn({ innerRadius, outerRadius, startAngle, endAngle }) ?? ''\n}\n\nfunction isThresholdBand(entry: unknown): entry is ThresholdBand {\n return (\n entry !== null &&\n typeof entry === 'object' &&\n typeof (entry as ThresholdBand).value === 'number' &&\n typeof (entry as ThresholdBand).color === 'string'\n )\n}\n\n/** Parse the displayConfig.thresholds value (array or JSON string) into bands. */\nexport function parseThresholds(raw: unknown): ThresholdBand[] {\n let arr: unknown[] | null = null\n if (Array.isArray(raw)) {\n arr = raw\n } else if (typeof raw === 'string' && raw.trim()) {\n try {\n const parsed = JSON.parse(raw)\n if (Array.isArray(parsed)) arr = parsed\n } catch (e) {\n console.warn('GaugeChart: invalid threshold JSON', e)\n return []\n }\n }\n if (!arr) return []\n return arr.filter(isThresholdBand)\n}\n\nexport interface ThresholdArcBand {\n color: string\n start: number\n end: number\n}\n\n/** Build the outer-ring threshold arc bands (in fraction space 0..1). */\nexport function buildThresholdBands(thresholds: ThresholdBand[]): ThresholdArcBand[] {\n if (thresholds.length === 0) return []\n const sorted = [...thresholds].sort((a, b) => a.value - b.value)\n return sorted.map((t, i) => ({\n color: t.color,\n start: i === 0 ? START_ANGLE : valueToAngle(sorted[i - 1].value, 0, 1),\n end: valueToAngle(t.value, 0, 1)\n }))\n}\n\nexport interface GaugeGeometry {\n effectiveMax: number\n clampedValue: number\n fraction: number\n fillColor: string\n fillAngle: number\n needleAngle: number\n}\n\n/** Compute the gauge's clamped value, fraction, fill colour, and angles. */\nexport function computeGaugeGeometry(\n rawValue: number,\n minValue: number,\n maxValue: number,\n thresholds: ThresholdBand[]\n): GaugeGeometry {\n const effectiveMax = maxValue === minValue ? minValue + 1 : maxValue\n const clampedValue = clamp(rawValue, minValue, effectiveMax)\n const fraction = (clampedValue - minValue) / (effectiveMax - minValue)\n const fillColor = thresholds.length > 0 ? resolveColor(fraction, thresholds) : DEFAULT_FILL\n const angle = valueToAngle(clampedValue, minValue, effectiveMax)\n return { effectiveMax, clampedValue, fraction, fillColor, fillAngle: angle, needleAngle: angle }\n}\n\n/** Format a gauge value with the optional axis format, else locale string. */\nexport function formatGaugeValue(value: number, yAxisFormat?: AxisFormatConfig): string {\n return yAxisFormat ? formatAxisValue(value, yAxisFormat) : value.toLocaleString()\n}\n","import React, { useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport {\n START_ANGLE,\n END_ANGLE,\n TRACK_COLOR,\n parseNum,\n buildArcPath,\n parseThresholds,\n buildThresholdBands,\n computeGaugeGeometry,\n formatGaugeValue\n} from './gaugeChartHelpers.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport type { ChartProps, ThresholdBand } from '../../types.js'\n\nfunction Needle({ angle, radius }: { angle: number; radius: number }) {\n const needleLen = radius * 0.72\n const needleBase = radius * 0.06\n const x = Math.cos(angle - Math.PI / 2) * needleLen\n const y = Math.sin(angle - Math.PI / 2) * needleLen\n return (\n <g data-testid=\"gauge-needle\">\n <circle r={needleBase} fill=\"currentColor\" className=\"text-dc-text-secondary\" />\n <line\n x1={0}\n y1={0}\n x2={x}\n y2={y}\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n className=\"text-dc-text-secondary\"\n />\n </g>\n )\n}\n\nconst GaugeChart = React.memo(function GaugeChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n}: ChartProps) {\n const { t } = useTranslation()\n const getFieldLabel = useCubeFieldLabel()\n const containerRef = useRef<HTMLDivElement>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n\n useLayoutEffect(() => {\n const el = containerRef.current\n if (!el) return\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height: h } = entry.contentRect\n if (width > 0 && h > 0) setDimensions({ width, height: h })\n }\n })\n observer.observe(el)\n const rect = el.getBoundingClientRect()\n if (rect.width > 0 && rect.height > 0) setDimensions({ width: rect.width, height: rect.height })\n return () => observer.disconnect()\n }, [])\n\n const { valueField, maxField, configError } = useMemo(() => {\n const yAxis: string[] = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis\n : []\n\n const valueField = yAxis[0] ?? ''\n const maxField = yAxis[1] ?? ''\n\n if (!valueField) {\n return { valueField, maxField, configError: 'Gauge requires at least 1 measure in Y-Axis (current value)' }\n }\n return { valueField, maxField, configError: null }\n }, [chartConfig])\n\n const thresholds: ThresholdBand[] = useMemo(\n () => parseThresholds(displayConfig?.thresholds),\n [displayConfig?.thresholds]\n )\n\n const thresholdBands = buildThresholdBands(thresholds)\n\n try {\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.gauge')} />\n }\n\n if (configError) {\n return <ChartConfigError height={height} hint={configError} />\n }\n\n const row = (data as Record<string, unknown>[])[0]\n const rawValue = parseNum(row[valueField])\n if (rawValue === null) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint={t('chart.runtime.noValidDataHint.gauge')}\n />\n )\n }\n const minValue = displayConfig?.minValue ?? 0\n const maxFieldValue = maxField ? parseNum(row[maxField]) : null\n const maxValue = displayConfig?.maxValue ?? (maxFieldValue ?? 100)\n\n const { effectiveMax, fraction, fillColor, fillAngle, needleAngle } =\n computeGaugeGeometry(rawValue, minValue, maxValue, thresholds)\n\n const showCenterLabel = displayConfig?.showCenterLabel ?? true\n const showPercentage = displayConfig?.showPercentage ?? false\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const containerW = dimensions.width || 300\n const containerH = typeof height === 'number' ? height : (dimensions.height || 200)\n\n const radius = Math.min(containerW / 2, containerH * 0.9) * 0.85\n const outerR = radius\n const innerR = radius * 0.6\n const cx = containerW / 2\n const cy = containerH * 0.7\n\n const trackPath = buildArcPath(innerR, outerR, START_ANGLE, END_ANGLE)\n const fillPath = buildArcPath(innerR, outerR, START_ANGLE, fillAngle)\n\n const valueLabel = showPercentage\n ? `${(fraction * 100).toFixed(1)}%`\n : formatGaugeValue(rawValue, yAxisFormat)\n\n const fieldLabel = getFieldLabel(valueField)\n return (\n <div ref={containerRef} className=\"dc:relative dc:w-full\" style={{ height }}>\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${containerW} ${containerH}`}\n preserveAspectRatio=\"xMidYMid meet\"\n data-testid=\"gauge-svg\"\n >\n <g transform={`translate(${cx}, ${cy})`}>\n <path\n d={trackPath}\n fill={TRACK_COLOR}\n data-testid=\"gauge-track\"\n />\n\n {thresholdBands.map((band, i) => (\n <path\n key={i}\n d={buildArcPath(outerR + 4, outerR + 8, band.start, band.end)}\n fill={band.color}\n data-testid={`gauge-band-${i}`}\n />\n ))}\n\n <path\n d={fillPath}\n fill={fillColor}\n data-testid=\"gauge-fill\"\n data-fraction={fraction.toFixed(4)}\n />\n\n <Needle angle={needleAngle} radius={radius} />\n\n {showCenterLabel && (\n <g data-testid=\"gauge-label\">\n <text\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={radius * 0.22}\n fontWeight=\"bold\"\n fill=\"currentColor\"\n dy={radius * 0.12}\n data-testid=\"gauge-value-text\"\n >\n {valueLabel}\n </text>\n <text\n textAnchor=\"middle\"\n fontSize={radius * 0.13}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n dy={radius * 0.34}\n >\n {fieldLabel}\n </text>\n </g>\n )}\n\n <text\n x={Math.cos(START_ANGLE - Math.PI / 2) * (outerR + 14)}\n y={Math.sin(START_ANGLE - Math.PI / 2) * (outerR + 14)}\n textAnchor=\"middle\"\n fontSize={radius * 0.12}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n data-testid=\"gauge-min-label\"\n >\n {formatGaugeValue(minValue, yAxisFormat)}\n </text>\n <text\n x={Math.cos(END_ANGLE - Math.PI / 2) * (outerR + 14)}\n y={Math.sin(END_ANGLE - Math.PI / 2) * (outerR + 14)}\n textAnchor=\"middle\"\n fontSize={radius * 0.12}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n data-testid=\"gauge-max-label\"\n >\n {formatGaugeValue(effectiveMax, yAxisFormat)}\n </text>\n </g>\n </svg>\n </div>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Gauge Chart\" error={error} />\n }\n})\n\nexport default GaugeChart\n"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
1
+ {"version":3,"file":"chart-gauge-DHIGq3TH.js","names":["epsilon","pi","tau","constant","tau","pi"],"sources":["../../../node_modules/d3-shape/src/constant.js","../../../node_modules/d3-shape/src/math.js","../../../node_modules/d3-path/src/path.js","../../../node_modules/d3-shape/src/path.js","../../../node_modules/d3-shape/src/arc.js","../../../src/client/components/charts/gaugeChartHelpers.ts","../../../src/client/components/charts/GaugeChart.tsx"],"sourcesContent":["export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export const abs = Math.abs;\nexport const atan2 = Math.atan2;\nexport const cos = Math.cos;\nexport const max = Math.max;\nexport const min = Math.min;\nexport const sin = Math.sin;\nexport const sqrt = Math.sqrt;\n\nexport const epsilon = 1e-12;\nexport const pi = Math.PI;\nexport const halfPi = pi / 2;\nexport const tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n","import constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\nimport {withPath} from \"./path.js\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null,\n path = withPath(arc);\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle. If this\n // intersection fails, it’s probably because the arc is too small, so\n // disable the corner radius entirely.\n if (da < pi) {\n if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n } else {\n rc0 = rc1 = 0;\n }\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","import { arc } from 'd3-shape'\nimport { formatAxisValue } from '../../utils/chartUtils.js'\nimport type { AxisFormatConfig, ThresholdBand } from '../../types.js'\n\n/**\n * Co-located helpers for GaugeChart: pure geometry/value math and threshold\n * parsing extracted from the component so the render body stays flat. Pure\n * extraction — no behaviour change.\n */\n\nexport const START_ANGLE = -Math.PI * 0.75\nexport const END_ANGLE = Math.PI * 0.75\nexport const TRACK_COLOR = '#e2e8f0'\nexport const DEFAULT_FILL = '#6366f1'\n\nexport function parseNum(v: unknown): number | null {\n if (v === undefined || v === null) return null\n const n = typeof v === 'number' ? v : parseFloat(String(v))\n return isNaN(n) ? null : n\n}\n\nexport function clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v))\n}\n\nexport function valueToAngle(value: number, min: number, max: number): number {\n const span = max === min ? 1 : max - min\n const t = clamp((value - min) / span, 0, 1)\n return START_ANGLE + t * (END_ANGLE - START_ANGLE)\n}\n\nexport function resolveColor(fraction: number, thresholds: ThresholdBand[]): string {\n const sorted = [...thresholds].sort((a, b) => a.value - b.value)\n let color = DEFAULT_FILL\n for (const t of sorted) {\n if (fraction >= t.value) color = t.color\n }\n return color\n}\n\nexport function buildArcPath(\n innerRadius: number,\n outerRadius: number,\n startAngle: number,\n endAngle: number\n): string {\n const pathFn = arc()\n return pathFn({ innerRadius, outerRadius, startAngle, endAngle }) ?? ''\n}\n\nfunction isThresholdBand(entry: unknown): entry is ThresholdBand {\n return (\n entry !== null &&\n typeof entry === 'object' &&\n typeof (entry as ThresholdBand).value === 'number' &&\n typeof (entry as ThresholdBand).color === 'string'\n )\n}\n\n/** Parse the displayConfig.thresholds value (array or JSON string) into bands. */\nexport function parseThresholds(raw: unknown): ThresholdBand[] {\n let arr: unknown[] | null = null\n if (Array.isArray(raw)) {\n arr = raw\n } else if (typeof raw === 'string' && raw.trim()) {\n try {\n const parsed = JSON.parse(raw)\n if (Array.isArray(parsed)) arr = parsed\n } catch (e) {\n console.warn('GaugeChart: invalid threshold JSON', e)\n return []\n }\n }\n if (!arr) return []\n return arr.filter(isThresholdBand)\n}\n\nexport interface ThresholdArcBand {\n color: string\n start: number\n end: number\n}\n\n/** Build the outer-ring threshold arc bands (in fraction space 0..1). */\nexport function buildThresholdBands(thresholds: ThresholdBand[]): ThresholdArcBand[] {\n if (thresholds.length === 0) return []\n const sorted = [...thresholds].sort((a, b) => a.value - b.value)\n return sorted.map((t, i) => ({\n color: t.color,\n start: i === 0 ? START_ANGLE : valueToAngle(sorted[i - 1].value, 0, 1),\n end: valueToAngle(t.value, 0, 1)\n }))\n}\n\nexport interface GaugeGeometry {\n effectiveMax: number\n clampedValue: number\n fraction: number\n fillColor: string\n fillAngle: number\n needleAngle: number\n}\n\n/** Compute the gauge's clamped value, fraction, fill colour, and angles. */\nexport function computeGaugeGeometry(\n rawValue: number,\n minValue: number,\n maxValue: number,\n thresholds: ThresholdBand[]\n): GaugeGeometry {\n const effectiveMax = maxValue === minValue ? minValue + 1 : maxValue\n const clampedValue = clamp(rawValue, minValue, effectiveMax)\n const fraction = (clampedValue - minValue) / (effectiveMax - minValue)\n const fillColor = thresholds.length > 0 ? resolveColor(fraction, thresholds) : DEFAULT_FILL\n const angle = valueToAngle(clampedValue, minValue, effectiveMax)\n return { effectiveMax, clampedValue, fraction, fillColor, fillAngle: angle, needleAngle: angle }\n}\n\n/** Format a gauge value with the optional axis format, else locale string. */\nexport function formatGaugeValue(value: number, yAxisFormat?: AxisFormatConfig): string {\n return yAxisFormat ? formatAxisValue(value, yAxisFormat) : value.toLocaleString()\n}\n","import React, { useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates.js'\nimport {\n START_ANGLE,\n END_ANGLE,\n TRACK_COLOR,\n parseNum,\n buildArcPath,\n parseThresholds,\n buildThresholdBands,\n computeGaugeGeometry,\n formatGaugeValue\n} from './gaugeChartHelpers.js'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel.js'\nimport type { ChartProps, ThresholdBand } from '../../types.js'\n\nfunction Needle({ angle, radius }: { angle: number; radius: number }) {\n const needleLen = radius * 0.72\n const needleBase = radius * 0.06\n const x = Math.cos(angle - Math.PI / 2) * needleLen\n const y = Math.sin(angle - Math.PI / 2) * needleLen\n return (\n <g data-testid=\"gauge-needle\">\n <circle r={needleBase} fill=\"currentColor\" className=\"text-dc-text-secondary\" />\n <line\n x1={0}\n y1={0}\n x2={x}\n y2={y}\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n className=\"text-dc-text-secondary\"\n />\n </g>\n )\n}\n\nconst GaugeChart = React.memo(function GaugeChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n}: ChartProps) {\n const { t } = useTranslation()\n const getFieldLabel = useCubeFieldLabel()\n const containerRef = useRef<HTMLDivElement>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n\n useLayoutEffect(() => {\n const el = containerRef.current\n if (!el) return\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height: h } = entry.contentRect\n if (width > 0 && h > 0) setDimensions({ width, height: h })\n }\n })\n observer.observe(el)\n const rect = el.getBoundingClientRect()\n if (rect.width > 0 && rect.height > 0) setDimensions({ width: rect.width, height: rect.height })\n return () => observer.disconnect()\n }, [])\n\n const { valueField, maxField, configError } = useMemo(() => {\n const yAxis: string[] = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis\n : []\n\n const valueField = yAxis[0] ?? ''\n const maxField = yAxis[1] ?? ''\n\n if (!valueField) {\n return { valueField, maxField, configError: 'Gauge requires at least 1 measure in Y-Axis (current value)' }\n }\n return { valueField, maxField, configError: null }\n }, [chartConfig])\n\n const thresholds: ThresholdBand[] = useMemo(\n () => parseThresholds(displayConfig?.thresholds),\n [displayConfig?.thresholds]\n )\n\n const thresholdBands = buildThresholdBands(thresholds)\n\n try {\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.gauge')} />\n }\n\n if (configError) {\n return <ChartConfigError height={height} hint={configError} />\n }\n\n const row = (data as Record<string, unknown>[])[0]\n const rawValue = parseNum(row[valueField])\n if (rawValue === null) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint={t('chart.runtime.noValidDataHint.gauge')}\n />\n )\n }\n const minValue = displayConfig?.minValue ?? 0\n const maxFieldValue = maxField ? parseNum(row[maxField]) : null\n const maxValue = displayConfig?.maxValue ?? (maxFieldValue ?? 100)\n\n const { effectiveMax, fraction, fillColor, fillAngle, needleAngle } =\n computeGaugeGeometry(rawValue, minValue, maxValue, thresholds)\n\n const showCenterLabel = displayConfig?.showCenterLabel ?? true\n const showPercentage = displayConfig?.showPercentage ?? false\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const containerW = dimensions.width || 300\n const containerH = typeof height === 'number' ? height : (dimensions.height || 200)\n\n const radius = Math.min(containerW / 2, containerH * 0.9) * 0.85\n const outerR = radius\n const innerR = radius * 0.6\n const cx = containerW / 2\n const cy = containerH * 0.7\n\n const trackPath = buildArcPath(innerR, outerR, START_ANGLE, END_ANGLE)\n const fillPath = buildArcPath(innerR, outerR, START_ANGLE, fillAngle)\n\n const valueLabel = showPercentage\n ? `${(fraction * 100).toFixed(1)}%`\n : formatGaugeValue(rawValue, yAxisFormat)\n\n const fieldLabel = getFieldLabel(valueField)\n return (\n <div ref={containerRef} className=\"dc:relative dc:w-full\" style={{ height }}>\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${containerW} ${containerH}`}\n preserveAspectRatio=\"xMidYMid meet\"\n data-testid=\"gauge-svg\"\n >\n <g transform={`translate(${cx}, ${cy})`}>\n <path\n d={trackPath}\n fill={TRACK_COLOR}\n data-testid=\"gauge-track\"\n />\n\n {thresholdBands.map((band, i) => (\n <path\n key={i}\n d={buildArcPath(outerR + 4, outerR + 8, band.start, band.end)}\n fill={band.color}\n data-testid={`gauge-band-${i}`}\n />\n ))}\n\n <path\n d={fillPath}\n fill={fillColor}\n data-testid=\"gauge-fill\"\n data-fraction={fraction.toFixed(4)}\n />\n\n <Needle angle={needleAngle} radius={radius} />\n\n {showCenterLabel && (\n <g data-testid=\"gauge-label\">\n <text\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={radius * 0.22}\n fontWeight=\"bold\"\n fill=\"currentColor\"\n dy={radius * 0.12}\n data-testid=\"gauge-value-text\"\n >\n {valueLabel}\n </text>\n <text\n textAnchor=\"middle\"\n fontSize={radius * 0.13}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n dy={radius * 0.34}\n >\n {fieldLabel}\n </text>\n </g>\n )}\n\n <text\n x={Math.cos(START_ANGLE - Math.PI / 2) * (outerR + 14)}\n y={Math.sin(START_ANGLE - Math.PI / 2) * (outerR + 14)}\n textAnchor=\"middle\"\n fontSize={radius * 0.12}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n data-testid=\"gauge-min-label\"\n >\n {formatGaugeValue(minValue, yAxisFormat)}\n </text>\n <text\n x={Math.cos(END_ANGLE - Math.PI / 2) * (outerR + 14)}\n y={Math.sin(END_ANGLE - Math.PI / 2) * (outerR + 14)}\n textAnchor=\"middle\"\n fontSize={radius * 0.12}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n data-testid=\"gauge-max-label\"\n >\n {formatGaugeValue(effectiveMax, yAxisFormat)}\n </text>\n </g>\n </svg>\n </div>\n )\n } catch (error) {\n return <ChartRenderError height={height} chartType=\"Gauge Chart\" error={error} />\n }\n})\n\nexport default GaugeChart\n"],"x_google_ignoreList":[0,1,2,3,4],"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, P as r, w as i } from "./chart-activity-grid-DDqFVWoa.js";
3
- import { x as a } 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, w as i } from "./chart-activity-grid-DVOhLgxv.js";
3
+ import { O as a } from "./chart-area-C-5ATxvi.js";
4
4
  import o, { useMemo as s } from "react";
5
5
  import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
6
6
  import { ResponsiveHeatMap as d } from "@nivo/heatmap";
@@ -233,4 +233,4 @@ var w = /* @__PURE__ */ e({ default: () => T }), T = o.memo(function({ data: e,
233
233
  //#endregion
234
234
  export { w as t };
235
235
 
236
- //# sourceMappingURL=chart-heat-map-Pnk6rhqQ.js.map
236
+ //# sourceMappingURL=chart-heat-map-Bb8L1XQr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-heat-map-Pnk6rhqQ.js","names":[],"sources":["../../../src/client/components/charts/HeatMapChart.helpers.ts","../../../src/client/components/charts/HeatMapCanvas.tsx","../../../src/client/components/charts/HeatMapChart.tsx"],"sourcesContent":["/**\n * Co-located helpers for HeatMapChart.\n *\n * Pure colour math, field resolution, data transformation and nivo config\n * builders extracted from the component. No behaviour change.\n */\nimport { formatTimeValue, formatAxisValue } from '../../utils/chartUtils.js'\nimport type { AxisFormatConfig, ChartDisplayConfig } from '../../types.js'\n\n/**\n * Maximum dimensions for heatmap to prevent browser lockup. 50x50 = 2500 cells.\n */\nexport const MAX_HEATMAP_ROWS = 50\nexport const MAX_HEATMAP_COLS = 50\n\n/** Parse color string (hex or rgb) to RGB values. */\nexport function parseColor(color: string): { r: number; g: number; b: number } | null {\n if (color.startsWith('#')) {\n const hex = color.slice(1)\n return {\n r: parseInt(hex.substring(0, 2), 16),\n g: parseInt(hex.substring(2, 4), 16),\n b: parseInt(hex.substring(4, 6), 16),\n }\n }\n\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/)\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n }\n }\n\n return null\n}\n\n/** Relative luminance of a color (0 black .. 1 white) per WCAG. */\nexport function getLuminance(color: string): number {\n const rgb = parseColor(color)\n if (!rgb) return 0.5 // Default to mid-gray if parsing fails\n\n const r = rgb.r / 255\n const g = rgb.g / 255\n const b = rgb.b / 255\n\n const rLinear = r <= 0.03928 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4)\n const gLinear = g <= 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4)\n const bLinear = b <= 0.03928 ? b / 12.92 : Math.pow((b + 0.055) / 1.055, 2.4)\n\n return 0.2126 * rLinear + 0.7152 * gLinear + 0.0722 * bLinear\n}\n\n/** Contrasting text color (white or dark) based on a background color. */\nexport function getContrastingTextColor(bgColor: string): string {\n const luminance = getLuminance(bgColor)\n return luminance < 0.4 ? '#ffffff' : '#1f2937'\n}\n\ninterface HeatMapDatum {\n x: string\n y: number | null\n}\n\ninterface HeatMapSerie {\n id: string\n data: HeatMapDatum[]\n}\n\nexport interface HeatMapTransformResult {\n data: HeatMapSerie[]\n truncated: boolean\n originalRows: number\n originalCols: number\n}\n\n/**\n * Transform drizzle-cube flat query results to nivo heatmap format.\n *\n * Groups rows by the Y dimension, sorts X chronologically when possible, and\n * truncates to MAX_HEATMAP_ROWS x MAX_HEATMAP_COLS to prevent browser lockup.\n */\nexport function transformToHeatMapFormat(\n data: Record<string, unknown>[],\n xAxisField: string | undefined,\n yAxisField: string | undefined,\n valueField: string | undefined,\n xGranularity?: string,\n yGranularity?: string\n): HeatMapTransformResult {\n if (!xAxisField || !yAxisField || !valueField) {\n return { data: [], truncated: false, originalRows: 0, originalCols: 0 }\n }\n\n const groupedByY = new Map<string, Map<string, number>>()\n const allXValues = new Set<string>()\n const xValueOriginals = new Map<string, unknown>()\n\n for (const row of data) {\n const rawYValue = row[yAxisField]\n const rawXValue = row[xAxisField]\n\n const yValue = formatTimeValue(rawYValue, yGranularity) || String(rawYValue ?? '(empty)')\n const xValue = formatTimeValue(rawXValue, xGranularity) || String(rawXValue ?? '(empty)')\n const value = Number(row[valueField]) || 0\n\n allXValues.add(xValue)\n if (!xValueOriginals.has(xValue)) {\n xValueOriginals.set(xValue, rawXValue)\n }\n\n if (!groupedByY.has(yValue)) {\n groupedByY.set(yValue, new Map())\n }\n groupedByY.get(yValue)!.set(xValue, value)\n }\n\n const xValueArray = Array.from(allXValues).sort((a, b) => {\n const origA = xValueOriginals.get(a)\n const origB = xValueOriginals.get(b)\n if (typeof origA === 'string' && typeof origB === 'string' &&\n origA.match(/^\\d{4}-\\d{2}-\\d{2}/) && origB.match(/^\\d{4}-\\d{2}-\\d{2}/)) {\n return origA.localeCompare(origB)\n }\n return a.localeCompare(b)\n })\n\n const originalRows = groupedByY.size\n const originalCols = xValueArray.length\n const truncated = originalRows > MAX_HEATMAP_ROWS || originalCols > MAX_HEATMAP_COLS\n\n const limitedXValues = xValueArray.slice(0, MAX_HEATMAP_COLS)\n\n const result: HeatMapSerie[] = []\n let rowCount = 0\n for (const [yValue, xMap] of groupedByY) {\n if (rowCount >= MAX_HEATMAP_ROWS) break\n result.push({\n id: yValue,\n data: limitedXValues.map((x) => ({ x, y: xMap.get(x) ?? null })),\n })\n rowCount++\n }\n\n return { data: result, truncated, originalRows, originalCols }\n}\n\n/** Coerce an axis config value (string | array | undefined) to a single field. */\nexport function firstField(value: string | string[] | undefined): string | undefined {\n if (!value) return undefined\n return Array.isArray(value) ? value[0] : value\n}\n\nexport interface HeatMapDisplayOptions {\n showLabels: boolean\n cellShape: 'rect' | 'circle'\n showLegend: boolean\n xAxisFormat?: AxisFormatConfig\n yAxisFormat?: AxisFormatConfig\n valueFormat?: AxisFormatConfig\n}\n\n/** Resolve heatmap display options from the (loosely-typed) display config. */\nexport function resolveHeatMapDisplayOptions(\n displayConfig: ChartDisplayConfig | undefined\n): HeatMapDisplayOptions {\n const cfg = displayConfig as Record<string, unknown> | undefined\n return {\n showLabels: (cfg?.showLabels as boolean) ?? false,\n cellShape: (cfg?.cellShape as 'rect' | 'circle') ?? 'rect',\n showLegend: (cfg?.showLegend as boolean) ?? true,\n xAxisFormat: cfg?.xAxisFormat as AxisFormatConfig | undefined,\n yAxisFormat: cfg?.yAxisFormat as AxisFormatConfig | undefined,\n valueFormat: cfg?.valueFormat as AxisFormatConfig | undefined,\n }\n}\n\n/** Build an axis `format` fn that applies the given axis format config (or none). */\nexport function makeAxisFormatter(\n format: AxisFormatConfig | undefined\n): ((v: string | number) => string) | undefined {\n if (!format) return undefined\n return (v) => {\n const num = parseFloat(String(v))\n return isNaN(num) ? String(v) : formatAxisValue(num, format)\n }\n}\n\n/** Resolve the heatmap value formatter (custom format or nivo default). */\nexport function makeValueFormatter(\n valueFormat: AxisFormatConfig | undefined\n): ((v: number) => string) | string {\n return valueFormat ? (v: number) => formatAxisValue(v, valueFormat) : '>-.2s'\n}\n\n/** Sequential colours config for nivo; falls back to a built-in scheme. */\nexport function resolveHeatMapColors(colors: string[]):\n | { type: 'sequential'; colors: [string, string] }\n | { type: 'sequential'; scheme: 'greens' } {\n return colors.length >= 2\n ? { type: 'sequential', colors: [colors[0], colors[colors.length - 1]] as [string, string] }\n : { type: 'sequential', scheme: 'greens' }\n}\n\n/** Default sequential blue gradient when no palette gradient is supplied. */\nexport const DEFAULT_HEATMAP_COLORS = [\n '#eff3ff', // lightest blue\n '#c6dbef',\n '#9ecae1',\n '#6baed6',\n '#3182bd',\n '#08519c', // darkest blue\n]\n","import { ResponsiveHeatMap } from '@nivo/heatmap'\nimport {\n getContrastingTextColor,\n makeAxisFormatter,\n makeValueFormatter,\n resolveHeatMapColors,\n type HeatMapDisplayOptions\n} from './HeatMapChart.helpers.js'\n\ninterface HeatMapDatum {\n x: string\n y: number | null\n}\ninterface HeatMapSerie {\n id: string\n data: HeatMapDatum[]\n}\n\ninterface HeatMapCanvasProps {\n data: HeatMapSerie[]\n truncated: boolean\n colors: string[]\n options: HeatMapDisplayOptions\n xAxisField: string\n yAxisField: string\n valueField: string\n}\n\nconst NIVO_THEME = {\n text: { fill: 'var(--dc-text)' },\n axis: {\n legend: { text: { fill: 'var(--dc-text)' } },\n ticks: { text: { fill: 'var(--dc-text-secondary)' } },\n },\n legends: {\n text: { fill: 'var(--dc-text-secondary)' },\n title: { text: { fill: 'var(--dc-text)' } },\n },\n tooltip: {\n container: {\n background: 'var(--dc-surface)',\n color: 'var(--dc-text)',\n borderRadius: '4px',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.25)',\n },\n },\n}\n\n/**\n * The nivo `<ResponsiveHeatMap>` for HeatMapChart, with all axis/legend/colour\n * config resolved from helpers. Extracted so the chart component stays a thin\n * orchestrator. Behaviour matches the original inline JSX.\n */\nexport function HeatMapCanvas({\n data,\n truncated,\n colors,\n options,\n xAxisField,\n yAxisField,\n valueField,\n}: HeatMapCanvasProps) {\n const { showLabels, cellShape, showLegend, xAxisFormat, yAxisFormat, valueFormat } = options\n\n return (\n <ResponsiveHeatMap\n data={data}\n margin={{ top: truncated ? 40 : 20, right: 20, bottom: 120, left: 120 }}\n valueFormat={makeValueFormatter(valueFormat)}\n axisTop={null}\n axisRight={null}\n axisBottom={{\n tickSize: 5,\n tickPadding: 5,\n tickRotation: -45,\n legend: xAxisFormat?.label || xAxisField?.split('.').pop() || 'X Axis',\n legendPosition: 'middle',\n legendOffset: 70,\n format: makeAxisFormatter(xAxisFormat),\n }}\n axisLeft={{\n tickSize: 5,\n tickPadding: 5,\n tickRotation: 0,\n legend: yAxisFormat?.label || yAxisField?.split('.').pop() || 'Y Axis',\n legendPosition: 'middle',\n legendOffset: -80,\n format: makeAxisFormatter(yAxisFormat),\n }}\n colors={resolveHeatMapColors(colors)}\n emptyColor=\"var(--dc-surface-tertiary)\"\n cellComponent={cellShape === 'circle' ? 'circle' : 'rect'}\n enableLabels={showLabels}\n labelTextColor={({ color }) => getContrastingTextColor(color)}\n legends={\n showLegend\n ? [\n {\n anchor: 'bottom',\n translateX: 0,\n translateY: 95,\n length: 400,\n thickness: 8,\n direction: 'row',\n tickPosition: 'after',\n tickSize: 3,\n tickSpacing: 4,\n tickOverlap: false,\n title: valueField?.split('.').pop() || 'Value',\n titleAlign: 'start',\n titleOffset: 4,\n },\n ]\n : []\n }\n annotations={[]}\n theme={NIVO_THEME}\n />\n )\n}\n","/**\n * HeatMapChart Component\n *\n * Visualizes intensity across two categorical dimensions using a color matrix.\n * Uses @nivo/heatmap for rendering.\n *\n * The chart displays:\n * - Rows: Y-axis dimension values\n * - Columns: X-axis dimension values\n * - Cell color: Intensity based on measure value\n */\n\nimport React, { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { getFieldGranularity } from '../../utils/chartUtils.js'\nimport { ChartEmptyState } from './ChartStates.js'\nimport { HeatMapCanvas } from './HeatMapCanvas.js'\nimport {\n MAX_HEATMAP_ROWS,\n MAX_HEATMAP_COLS,\n transformToHeatMapFormat,\n firstField,\n resolveHeatMapDisplayOptions,\n DEFAULT_HEATMAP_COLORS,\n} from './HeatMapChart.helpers.js'\nimport type { ChartProps } from '../../types.js'\n\n/**\n * HeatMapChart Component\n *\n * Renders a heatmap visualization from query results.\n * Shows intensity patterns across two categorical dimensions.\n */\nconst HeatMapChart = React.memo(function HeatMapChart({\n data,\n height = '100%',\n chartConfig,\n colorPalette,\n displayConfig,\n queryObject,\n}: ChartProps) {\n const { t } = useTranslation()\n const options = resolveHeatMapDisplayOptions(displayConfig)\n\n // Extract field names from chartConfig (handle both array and string formats)\n const xAxisField = firstField(chartConfig?.xAxis)\n const yAxisField = firstField(chartConfig?.yAxis)\n const valueField = firstField(chartConfig?.valueField)\n\n // Get granularity for time dimensions (only if field is defined)\n const xGranularity = xAxisField ? getFieldGranularity(queryObject, xAxisField) : undefined\n const yGranularity = yAxisField ? getFieldGranularity(queryObject, yAxisField) : undefined\n\n // Transform data to nivo format\n const { data: heatmapData, truncated, originalRows, originalCols } = useMemo(() => {\n if (!data || data.length === 0) {\n return { data: [], truncated: false, originalRows: 0, originalCols: 0 }\n }\n return transformToHeatMapFormat(\n data as Record<string, unknown>[],\n xAxisField,\n yAxisField,\n valueField,\n xGranularity,\n yGranularity\n )\n }, [data, xAxisField, yAxisField, valueField, xGranularity, yGranularity])\n\n // Handle no data or missing config\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.heatmap')} />\n }\n\n if (!xAxisField || !yAxisField || !valueField) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.heatmapConfigRequired\"\n hint={\n <>\n {!xAxisField && t('chart.runtime.heatmapXRequired')}\n {!yAxisField && t('chart.runtime.heatmapYRequired')}\n {!valueField && t('chart.runtime.heatmapValueRequired')}\n </>\n }\n />\n )\n }\n\n if (heatmapData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noDataToDisplay\"\n hint={t('chart.runtime.heatmapNoResults')}\n />\n )\n }\n\n // Use gradient colors from palette, or default sequential blue gradient.\n // Sequential single-hue gradients are ideal for heatmaps showing magnitude.\n const colors = colorPalette?.gradient || DEFAULT_HEATMAP_COLORS\n\n return (\n <div className=\"dc:relative dc:w-full dc:h-full\" style={{ height }}>\n {truncated && (\n <div className=\"dc:absolute dc:top-0 dc:left-0 dc:right-0 dc:z-10 dc:px-3 dc:py-1.5 dc:text-xs bg-dc-warning-bg text-dc-warning dc:border-b border-dc-border\">\n {t('chart.runtime.heatmapTruncated', {\n maxRows: MAX_HEATMAP_ROWS,\n maxCols: MAX_HEATMAP_COLS,\n originalRows,\n originalCols\n })}\n </div>\n )}\n <HeatMapCanvas\n data={heatmapData}\n truncated={truncated}\n colors={colors}\n options={options}\n xAxisField={xAxisField}\n yAxisField={yAxisField}\n valueField={valueField}\n />\n </div>\n )\n})\n\nexport default HeatMapChart\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-heat-map-Bb8L1XQr.js","names":[],"sources":["../../../src/client/components/charts/HeatMapChart.helpers.ts","../../../src/client/components/charts/HeatMapCanvas.tsx","../../../src/client/components/charts/HeatMapChart.tsx"],"sourcesContent":["/**\n * Co-located helpers for HeatMapChart.\n *\n * Pure colour math, field resolution, data transformation and nivo config\n * builders extracted from the component. No behaviour change.\n */\nimport { formatTimeValue, formatAxisValue } from '../../utils/chartUtils.js'\nimport type { AxisFormatConfig, ChartDisplayConfig } from '../../types.js'\n\n/**\n * Maximum dimensions for heatmap to prevent browser lockup. 50x50 = 2500 cells.\n */\nexport const MAX_HEATMAP_ROWS = 50\nexport const MAX_HEATMAP_COLS = 50\n\n/** Parse color string (hex or rgb) to RGB values. */\nexport function parseColor(color: string): { r: number; g: number; b: number } | null {\n if (color.startsWith('#')) {\n const hex = color.slice(1)\n return {\n r: parseInt(hex.substring(0, 2), 16),\n g: parseInt(hex.substring(2, 4), 16),\n b: parseInt(hex.substring(4, 6), 16),\n }\n }\n\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/)\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n }\n }\n\n return null\n}\n\n/** Relative luminance of a color (0 black .. 1 white) per WCAG. */\nexport function getLuminance(color: string): number {\n const rgb = parseColor(color)\n if (!rgb) return 0.5 // Default to mid-gray if parsing fails\n\n const r = rgb.r / 255\n const g = rgb.g / 255\n const b = rgb.b / 255\n\n const rLinear = r <= 0.03928 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4)\n const gLinear = g <= 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4)\n const bLinear = b <= 0.03928 ? b / 12.92 : Math.pow((b + 0.055) / 1.055, 2.4)\n\n return 0.2126 * rLinear + 0.7152 * gLinear + 0.0722 * bLinear\n}\n\n/** Contrasting text color (white or dark) based on a background color. */\nexport function getContrastingTextColor(bgColor: string): string {\n const luminance = getLuminance(bgColor)\n return luminance < 0.4 ? '#ffffff' : '#1f2937'\n}\n\ninterface HeatMapDatum {\n x: string\n y: number | null\n}\n\ninterface HeatMapSerie {\n id: string\n data: HeatMapDatum[]\n}\n\nexport interface HeatMapTransformResult {\n data: HeatMapSerie[]\n truncated: boolean\n originalRows: number\n originalCols: number\n}\n\n/**\n * Transform drizzle-cube flat query results to nivo heatmap format.\n *\n * Groups rows by the Y dimension, sorts X chronologically when possible, and\n * truncates to MAX_HEATMAP_ROWS x MAX_HEATMAP_COLS to prevent browser lockup.\n */\nexport function transformToHeatMapFormat(\n data: Record<string, unknown>[],\n xAxisField: string | undefined,\n yAxisField: string | undefined,\n valueField: string | undefined,\n xGranularity?: string,\n yGranularity?: string\n): HeatMapTransformResult {\n if (!xAxisField || !yAxisField || !valueField) {\n return { data: [], truncated: false, originalRows: 0, originalCols: 0 }\n }\n\n const groupedByY = new Map<string, Map<string, number>>()\n const allXValues = new Set<string>()\n const xValueOriginals = new Map<string, unknown>()\n\n for (const row of data) {\n const rawYValue = row[yAxisField]\n const rawXValue = row[xAxisField]\n\n const yValue = formatTimeValue(rawYValue, yGranularity) || String(rawYValue ?? '(empty)')\n const xValue = formatTimeValue(rawXValue, xGranularity) || String(rawXValue ?? '(empty)')\n const value = Number(row[valueField]) || 0\n\n allXValues.add(xValue)\n if (!xValueOriginals.has(xValue)) {\n xValueOriginals.set(xValue, rawXValue)\n }\n\n if (!groupedByY.has(yValue)) {\n groupedByY.set(yValue, new Map())\n }\n groupedByY.get(yValue)!.set(xValue, value)\n }\n\n const xValueArray = Array.from(allXValues).sort((a, b) => {\n const origA = xValueOriginals.get(a)\n const origB = xValueOriginals.get(b)\n if (typeof origA === 'string' && typeof origB === 'string' &&\n origA.match(/^\\d{4}-\\d{2}-\\d{2}/) && origB.match(/^\\d{4}-\\d{2}-\\d{2}/)) {\n return origA.localeCompare(origB)\n }\n return a.localeCompare(b)\n })\n\n const originalRows = groupedByY.size\n const originalCols = xValueArray.length\n const truncated = originalRows > MAX_HEATMAP_ROWS || originalCols > MAX_HEATMAP_COLS\n\n const limitedXValues = xValueArray.slice(0, MAX_HEATMAP_COLS)\n\n const result: HeatMapSerie[] = []\n let rowCount = 0\n for (const [yValue, xMap] of groupedByY) {\n if (rowCount >= MAX_HEATMAP_ROWS) break\n result.push({\n id: yValue,\n data: limitedXValues.map((x) => ({ x, y: xMap.get(x) ?? null })),\n })\n rowCount++\n }\n\n return { data: result, truncated, originalRows, originalCols }\n}\n\n/** Coerce an axis config value (string | array | undefined) to a single field. */\nexport function firstField(value: string | string[] | undefined): string | undefined {\n if (!value) return undefined\n return Array.isArray(value) ? value[0] : value\n}\n\nexport interface HeatMapDisplayOptions {\n showLabels: boolean\n cellShape: 'rect' | 'circle'\n showLegend: boolean\n xAxisFormat?: AxisFormatConfig\n yAxisFormat?: AxisFormatConfig\n valueFormat?: AxisFormatConfig\n}\n\n/** Resolve heatmap display options from the (loosely-typed) display config. */\nexport function resolveHeatMapDisplayOptions(\n displayConfig: ChartDisplayConfig | undefined\n): HeatMapDisplayOptions {\n const cfg = displayConfig as Record<string, unknown> | undefined\n return {\n showLabels: (cfg?.showLabels as boolean) ?? false,\n cellShape: (cfg?.cellShape as 'rect' | 'circle') ?? 'rect',\n showLegend: (cfg?.showLegend as boolean) ?? true,\n xAxisFormat: cfg?.xAxisFormat as AxisFormatConfig | undefined,\n yAxisFormat: cfg?.yAxisFormat as AxisFormatConfig | undefined,\n valueFormat: cfg?.valueFormat as AxisFormatConfig | undefined,\n }\n}\n\n/** Build an axis `format` fn that applies the given axis format config (or none). */\nexport function makeAxisFormatter(\n format: AxisFormatConfig | undefined\n): ((v: string | number) => string) | undefined {\n if (!format) return undefined\n return (v) => {\n const num = parseFloat(String(v))\n return isNaN(num) ? String(v) : formatAxisValue(num, format)\n }\n}\n\n/** Resolve the heatmap value formatter (custom format or nivo default). */\nexport function makeValueFormatter(\n valueFormat: AxisFormatConfig | undefined\n): ((v: number) => string) | string {\n return valueFormat ? (v: number) => formatAxisValue(v, valueFormat) : '>-.2s'\n}\n\n/** Sequential colours config for nivo; falls back to a built-in scheme. */\nexport function resolveHeatMapColors(colors: string[]):\n | { type: 'sequential'; colors: [string, string] }\n | { type: 'sequential'; scheme: 'greens' } {\n return colors.length >= 2\n ? { type: 'sequential', colors: [colors[0], colors[colors.length - 1]] as [string, string] }\n : { type: 'sequential', scheme: 'greens' }\n}\n\n/** Default sequential blue gradient when no palette gradient is supplied. */\nexport const DEFAULT_HEATMAP_COLORS = [\n '#eff3ff', // lightest blue\n '#c6dbef',\n '#9ecae1',\n '#6baed6',\n '#3182bd',\n '#08519c', // darkest blue\n]\n","import { ResponsiveHeatMap } from '@nivo/heatmap'\nimport {\n getContrastingTextColor,\n makeAxisFormatter,\n makeValueFormatter,\n resolveHeatMapColors,\n type HeatMapDisplayOptions\n} from './HeatMapChart.helpers.js'\n\ninterface HeatMapDatum {\n x: string\n y: number | null\n}\ninterface HeatMapSerie {\n id: string\n data: HeatMapDatum[]\n}\n\ninterface HeatMapCanvasProps {\n data: HeatMapSerie[]\n truncated: boolean\n colors: string[]\n options: HeatMapDisplayOptions\n xAxisField: string\n yAxisField: string\n valueField: string\n}\n\nconst NIVO_THEME = {\n text: { fill: 'var(--dc-text)' },\n axis: {\n legend: { text: { fill: 'var(--dc-text)' } },\n ticks: { text: { fill: 'var(--dc-text-secondary)' } },\n },\n legends: {\n text: { fill: 'var(--dc-text-secondary)' },\n title: { text: { fill: 'var(--dc-text)' } },\n },\n tooltip: {\n container: {\n background: 'var(--dc-surface)',\n color: 'var(--dc-text)',\n borderRadius: '4px',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.25)',\n },\n },\n}\n\n/**\n * The nivo `<ResponsiveHeatMap>` for HeatMapChart, with all axis/legend/colour\n * config resolved from helpers. Extracted so the chart component stays a thin\n * orchestrator. Behaviour matches the original inline JSX.\n */\nexport function HeatMapCanvas({\n data,\n truncated,\n colors,\n options,\n xAxisField,\n yAxisField,\n valueField,\n}: HeatMapCanvasProps) {\n const { showLabels, cellShape, showLegend, xAxisFormat, yAxisFormat, valueFormat } = options\n\n return (\n <ResponsiveHeatMap\n data={data}\n margin={{ top: truncated ? 40 : 20, right: 20, bottom: 120, left: 120 }}\n valueFormat={makeValueFormatter(valueFormat)}\n axisTop={null}\n axisRight={null}\n axisBottom={{\n tickSize: 5,\n tickPadding: 5,\n tickRotation: -45,\n legend: xAxisFormat?.label || xAxisField?.split('.').pop() || 'X Axis',\n legendPosition: 'middle',\n legendOffset: 70,\n format: makeAxisFormatter(xAxisFormat),\n }}\n axisLeft={{\n tickSize: 5,\n tickPadding: 5,\n tickRotation: 0,\n legend: yAxisFormat?.label || yAxisField?.split('.').pop() || 'Y Axis',\n legendPosition: 'middle',\n legendOffset: -80,\n format: makeAxisFormatter(yAxisFormat),\n }}\n colors={resolveHeatMapColors(colors)}\n emptyColor=\"var(--dc-surface-tertiary)\"\n cellComponent={cellShape === 'circle' ? 'circle' : 'rect'}\n enableLabels={showLabels}\n labelTextColor={({ color }) => getContrastingTextColor(color)}\n legends={\n showLegend\n ? [\n {\n anchor: 'bottom',\n translateX: 0,\n translateY: 95,\n length: 400,\n thickness: 8,\n direction: 'row',\n tickPosition: 'after',\n tickSize: 3,\n tickSpacing: 4,\n tickOverlap: false,\n title: valueField?.split('.').pop() || 'Value',\n titleAlign: 'start',\n titleOffset: 4,\n },\n ]\n : []\n }\n annotations={[]}\n theme={NIVO_THEME}\n />\n )\n}\n","/**\n * HeatMapChart Component\n *\n * Visualizes intensity across two categorical dimensions using a color matrix.\n * Uses @nivo/heatmap for rendering.\n *\n * The chart displays:\n * - Rows: Y-axis dimension values\n * - Columns: X-axis dimension values\n * - Cell color: Intensity based on measure value\n */\n\nimport React, { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation.js'\nimport { getFieldGranularity } from '../../utils/chartUtils.js'\nimport { ChartEmptyState } from './ChartStates.js'\nimport { HeatMapCanvas } from './HeatMapCanvas.js'\nimport {\n MAX_HEATMAP_ROWS,\n MAX_HEATMAP_COLS,\n transformToHeatMapFormat,\n firstField,\n resolveHeatMapDisplayOptions,\n DEFAULT_HEATMAP_COLORS,\n} from './HeatMapChart.helpers.js'\nimport type { ChartProps } from '../../types.js'\n\n/**\n * HeatMapChart Component\n *\n * Renders a heatmap visualization from query results.\n * Shows intensity patterns across two categorical dimensions.\n */\nconst HeatMapChart = React.memo(function HeatMapChart({\n data,\n height = '100%',\n chartConfig,\n colorPalette,\n displayConfig,\n queryObject,\n}: ChartProps) {\n const { t } = useTranslation()\n const options = resolveHeatMapDisplayOptions(displayConfig)\n\n // Extract field names from chartConfig (handle both array and string formats)\n const xAxisField = firstField(chartConfig?.xAxis)\n const yAxisField = firstField(chartConfig?.yAxis)\n const valueField = firstField(chartConfig?.valueField)\n\n // Get granularity for time dimensions (only if field is defined)\n const xGranularity = xAxisField ? getFieldGranularity(queryObject, xAxisField) : undefined\n const yGranularity = yAxisField ? getFieldGranularity(queryObject, yAxisField) : undefined\n\n // Transform data to nivo format\n const { data: heatmapData, truncated, originalRows, originalCols } = useMemo(() => {\n if (!data || data.length === 0) {\n return { data: [], truncated: false, originalRows: 0, originalCols: 0 }\n }\n return transformToHeatMapFormat(\n data as Record<string, unknown>[],\n xAxisField,\n yAxisField,\n valueField,\n xGranularity,\n yGranularity\n )\n }, [data, xAxisField, yAxisField, valueField, xGranularity, yGranularity])\n\n // Handle no data or missing config\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.heatmap')} />\n }\n\n if (!xAxisField || !yAxisField || !valueField) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.heatmapConfigRequired\"\n hint={\n <>\n {!xAxisField && t('chart.runtime.heatmapXRequired')}\n {!yAxisField && t('chart.runtime.heatmapYRequired')}\n {!valueField && t('chart.runtime.heatmapValueRequired')}\n </>\n }\n />\n )\n }\n\n if (heatmapData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noDataToDisplay\"\n hint={t('chart.runtime.heatmapNoResults')}\n />\n )\n }\n\n // Use gradient colors from palette, or default sequential blue gradient.\n // Sequential single-hue gradients are ideal for heatmaps showing magnitude.\n const colors = colorPalette?.gradient || DEFAULT_HEATMAP_COLORS\n\n return (\n <div className=\"dc:relative dc:w-full dc:h-full\" style={{ height }}>\n {truncated && (\n <div className=\"dc:absolute dc:top-0 dc:left-0 dc:right-0 dc:z-10 dc:px-3 dc:py-1.5 dc:text-xs bg-dc-warning-bg text-dc-warning dc:border-b border-dc-border\">\n {t('chart.runtime.heatmapTruncated', {\n maxRows: MAX_HEATMAP_ROWS,\n maxCols: MAX_HEATMAP_COLS,\n originalRows,\n originalCols\n })}\n </div>\n )}\n <HeatMapCanvas\n data={heatmapData}\n truncated={truncated}\n colors={colors}\n options={options}\n xAxisField={xAxisField}\n yAxisField={yAxisField}\n valueField={valueField}\n />\n </div>\n )\n})\n\nexport default HeatMapChart\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
- import { D as t, O as n } from "./chart-data-table-BP6DMdom.js";
3
- import { P as r, S as i } from "./chart-activity-grid-DDqFVWoa.js";
1
+ import { n as e } from "./rolldown-runtime-DArdT4gl.js";
2
+ import { D as t, O as n } from "./chart-data-table-SNSqZj9B.js";
3
+ import { P as r, S as i } from "./chart-activity-grid-DVOhLgxv.js";
4
4
  import a, { useEffect as o, useRef as s, useState as c } from "react";
5
5
  import { jsx as l, jsxs as u } from "react/jsx-runtime";
6
6
  //#region src/client/utils/periodUtils.ts
@@ -166,10 +166,10 @@ var w = {
166
166
  borderColor: "var(--dc-warning-border)"
167
167
  }
168
168
  };
169
- function T(e) {
169
+ function T(e, t = "200px") {
170
170
  return {
171
171
  height: e === "100%" ? "100%" : e,
172
- minHeight: e === "100%" ? "200px" : void 0
172
+ minHeight: e === "100%" ? t : void 0
173
173
  };
174
174
  }
175
175
  function E({ height: e, title: t, hint: n, variant: r = "muted", children: i }) {
@@ -196,36 +196,89 @@ function E({ height: e, title: t, hint: n, variant: r = "muted", children: i })
196
196
  });
197
197
  }
198
198
  //#endregion
199
+ //#region src/client/components/charts/KpiCompactLayout.tsx
200
+ var D = a.memo(function({ label: e, labelAdornment: t, value: n, valueColor: r, suffix: i, valueAdornment: a, detail: o, containerRef: s }) {
201
+ return /* @__PURE__ */ u("div", {
202
+ ref: s,
203
+ className: "dc:flex dc:flex-col dc:justify-center dc:w-full dc:h-full dc:px-4 dc:py-3 dc:gap-1.5 dc:overflow-hidden",
204
+ style: {
205
+ height: "100%",
206
+ minHeight: "80px"
207
+ },
208
+ children: [
209
+ /* @__PURE__ */ u("div", {
210
+ className: "dc:flex dc:items-center dc:gap-1 dc:font-bold text-dc-text-secondary",
211
+ style: {
212
+ fontSize: "14px",
213
+ lineHeight: 1.2
214
+ },
215
+ children: [/* @__PURE__ */ l("span", {
216
+ className: "dc:truncate",
217
+ children: e
218
+ }), t]
219
+ }),
220
+ /* @__PURE__ */ u("div", {
221
+ className: "dc:flex dc:items-baseline dc:gap-1.5",
222
+ children: [
223
+ /* @__PURE__ */ l("span", {
224
+ className: "dc:font-semibold dc:leading-none dc:truncate",
225
+ style: {
226
+ fontSize: "30px",
227
+ color: r || "var(--dc-text)"
228
+ },
229
+ children: n
230
+ }),
231
+ i && /* @__PURE__ */ l("span", {
232
+ className: "text-dc-text-muted dc:truncate",
233
+ style: { fontSize: "14px" },
234
+ children: i
235
+ }),
236
+ a
237
+ ]
238
+ }),
239
+ o && /* @__PURE__ */ l("div", {
240
+ className: "text-dc-text-muted dc:truncate",
241
+ style: {
242
+ fontSize: "12px",
243
+ lineHeight: 1.4
244
+ },
245
+ children: o
246
+ })
247
+ ]
248
+ });
249
+ });
250
+ //#endregion
199
251
  //#region src/client/components/charts/KpiDelta.helpers.ts
200
- function D(e) {
252
+ function O(e) {
201
253
  return e ? Array.isArray(e) ? e : [e] : [];
202
254
  }
203
- function O(e, t) {
255
+ function k(e, t) {
204
256
  let n = [...e];
205
257
  return t ? n.sort((e, n) => {
206
258
  let r = e[t], i = n[t];
207
259
  return r < i ? -1 : +(r > i);
208
260
  }) : n;
209
261
  }
210
- function k(e, t) {
262
+ function A(e, t) {
211
263
  return e.map((e) => e[t]).filter((e) => e != null && !isNaN(Number(e))).map((e) => Number(e));
212
264
  }
213
- function A(e) {
265
+ function j(e) {
214
266
  let t = e[e.length - 1], n = e[e.length - 2], r = t - n;
215
267
  return {
216
268
  lastValue: t,
269
+ previousValue: n,
217
270
  absoluteChange: r,
218
271
  percentageChange: n === 0 ? 0 : r / Math.abs(n) * 100,
219
272
  isPositiveChange: r >= 0
220
273
  };
221
274
  }
222
- function j(e, t, n) {
275
+ function M(e, t, n) {
223
276
  return e !== void 0 && t && e >= 0 && e < t.length ? t[e] : n;
224
277
  }
225
278
  //#endregion
226
279
  //#region src/client/components/charts/KpiDelta.tsx
227
- var M = /* @__PURE__ */ e({ default: () => P });
228
- function N({ values: e, lastValue: t, positiveColor: n, negativeColor: r, formatValue: i, width: a, height: o }) {
280
+ var N = /* @__PURE__ */ e({ default: () => F });
281
+ function P({ values: e, lastValue: t, positiveColor: n, negativeColor: r, formatValue: i, width: a, height: o }) {
229
282
  let s = Math.max(10, Math.floor(a / 10)), c = e.length > s ? e.slice(-s) : e, d = c.map((e) => e - t), f = Math.min(...d, 0), p = Math.max(...d, 0);
230
283
  if (Math.max(Math.abs(f), Math.abs(p)) === 0 || d.length === 0) return /* @__PURE__ */ l("div", {
231
284
  className: "dc:flex dc:items-center dc:justify-center bg-dc-bg-secondary dc:rounded-sm dc:border border-dc-border",
@@ -256,11 +309,11 @@ function N({ values: e, lastValue: t, positiveColor: n, negativeColor: r, format
256
309
  zIndex: 1
257
310
  }
258
311
  }), d.map((e, t) => {
259
- let a = Math.abs(e) / g, s = Math.max(2, a * (o - 4)), u = e >= 0, d = t === c.length - 1, f = u ? n : r;
312
+ let a = Math.abs(e) / g, s = Math.max(2, a * (o - 4)), u = e >= 0, d = t === c.length - 1, f = u ? n : r, p = t * (h + 2);
260
313
  return /* @__PURE__ */ l("div", {
261
- className: "dc:absolute rounded-xs",
314
+ className: "dc:absolute dc:rounded-sm",
262
315
  style: {
263
- left: `${t * (h + 2)}px`,
316
+ left: `${p}px`,
264
317
  width: `${h}px`,
265
318
  height: `${s}px`,
266
319
  backgroundColor: f,
@@ -278,7 +331,7 @@ function N({ values: e, lastValue: t, positiveColor: n, negativeColor: r, format
278
331
  })]
279
332
  });
280
333
  }
281
- var P = a.memo(function({ data: e, chartConfig: a, displayConfig: o = {}, queryObject: s, height: c = "100%", colorPalette: d }) {
334
+ var F = a.memo(function({ data: e, chartConfig: a, displayConfig: o = {}, queryObject: s, height: c = "100%", colorPalette: d }) {
282
335
  let { t: f } = r(), p = i(), { containerRef: h, valueRef: g, fontSize: _, textWidth: v } = C({
283
336
  widthDivisor: 4,
284
337
  heightDivisor: 4,
@@ -293,28 +346,56 @@ var P = a.memo(function({ data: e, chartConfig: a, displayConfig: o = {}, queryO
293
346
  if (!e || e.length === 0) return /* @__PURE__ */ l(E, {
294
347
  height: c,
295
348
  title: f("chart.runtime.noData"),
296
- hint: "No data points to display"
349
+ hint: f("chart.runtime.noDataHint.kpi")
297
350
  });
298
- let x = D(a?.yAxis), S = D(a?.xAxis);
351
+ let x = O(a?.yAxis), S = O(a?.xAxis);
299
352
  if (x.length === 0) return /* @__PURE__ */ l(E, {
300
353
  height: c,
301
354
  variant: "danger",
302
355
  title: f("chart.runtime.configError"),
303
356
  hint: f("chart.runtime.configErrorHint.noMeasure")
304
357
  });
305
- let w = x[0], M = S[0], P = O(e, M), { useLastCompletePeriod: F = !0, skipLastPeriod: I = !1 } = o, { filteredData: L, excludedIncompletePeriod: R, skippedLastPeriod: z, granularity: B } = m(P, M, s, F, I), V = k(L, w);
306
- if (V.length < 2) return /* @__PURE__ */ l(E, {
358
+ let w = x[0], N = S[0], F = k(e, N), { useLastCompletePeriod: I = !0, skipLastPeriod: L = !1 } = o, { filteredData: R, excludedIncompletePeriod: z, skippedLastPeriod: B, granularity: V } = m(F, N, s, I, L), H = A(R, w);
359
+ if (H.length < 2) return /* @__PURE__ */ l(E, {
307
360
  height: c,
308
361
  variant: "warning",
309
362
  title: f("chart.runtime.kpiDelta.insufficientData"),
310
363
  hint: f("chart.runtime.kpiDelta.requiresTwoPoints"),
311
364
  children: /* @__PURE__ */ l("div", {
312
365
  className: "dc:text-xs",
313
- children: f("chart.runtime.kpiDelta.currentPoints", { count: V.length })
366
+ children: f("chart.runtime.kpiDelta.currentPoints", { count: H.length })
314
367
  })
315
368
  });
316
- let { lastValue: H, absoluteChange: U, percentageChange: W, isPositiveChange: G } = A(V), K = (e) => y(e, o), q = j(o.positiveColorIndex, d?.colors, "#10b981"), J = j(o.negativeColorIndex, d?.colors, "#ef4444"), Y = G ? q : J;
317
- return /* @__PURE__ */ u("div", {
369
+ let { lastValue: U, previousValue: W, absoluteChange: G, percentageChange: K, isPositiveChange: q } = j(H), J = (e) => y(e, o), Y = M(o.positiveColorIndex, d?.colors, "#10b981"), X = M(o.negativeColorIndex, d?.colors, "#ef4444"), Z = q ? Y : X, Q = z || B ? /* @__PURE__ */ l("span", {
370
+ title: f(B ? "chart.runtime.kpiExcludesLastPeriod" : "chart.runtime.kpiExcludesIncompletePeriod", { period: V || f("chart.runtime.kpiPeriodFallback") }),
371
+ className: "dc:cursor-help",
372
+ children: /* @__PURE__ */ l(n, {
373
+ icon: t,
374
+ className: "dc:w-4 dc:h-4 text-dc-text-muted dc:opacity-70"
375
+ })
376
+ }) : null;
377
+ return o.layout === "compact" ? /* @__PURE__ */ l(D, {
378
+ containerRef: h,
379
+ label: b(p(w), w),
380
+ labelAdornment: Q,
381
+ value: J(U),
382
+ suffix: o.suffix && !o.formatValue ? o.suffix : void 0,
383
+ valueAdornment: /* @__PURE__ */ u("span", {
384
+ className: "dc:font-semibold dc:whitespace-nowrap",
385
+ style: {
386
+ color: Z,
387
+ fontSize: "15px"
388
+ },
389
+ children: [
390
+ q ? "▲" : "▼",
391
+ " ",
392
+ q ? "+" : "",
393
+ K.toFixed(1),
394
+ "%"
395
+ ]
396
+ }),
397
+ detail: o.showBaseline ? `${J(W)} \u2192 ${J(U)}` : void 0
398
+ }) : /* @__PURE__ */ u("div", {
318
399
  ref: h,
319
400
  className: "dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full dc:h-full dc:p-4",
320
401
  style: T(c),
@@ -325,14 +406,7 @@ var P = a.memo(function({ data: e, chartConfig: a, displayConfig: o = {}, queryO
325
406
  fontSize: "14px",
326
407
  lineHeight: "1.2"
327
408
  },
328
- children: [/* @__PURE__ */ l("span", { children: b(p(w), w) }), (R || z) && /* @__PURE__ */ l("span", {
329
- title: z ? `Excludes last ${B || "period"}` : `Excludes current incomplete ${B}`,
330
- className: "dc:cursor-help",
331
- children: /* @__PURE__ */ l(n, {
332
- icon: t,
333
- className: "dc:w-4 dc:h-4 text-dc-text-muted dc:opacity-70"
334
- })
335
- })]
409
+ children: [/* @__PURE__ */ l("span", { children: b(p(w), w) }), Q]
336
410
  }),
337
411
  /* @__PURE__ */ u("div", {
338
412
  className: "dc:flex dc:items-center dc:justify-center dc:space-x-4 dc:mb-2",
@@ -343,35 +417,35 @@ var P = a.memo(function({ data: e, chartConfig: a, displayConfig: o = {}, queryO
343
417
  fontSize: `${_}px`,
344
418
  color: "var(--dc-text)"
345
419
  },
346
- children: K(H)
420
+ children: J(U)
347
421
  }), /* @__PURE__ */ u("div", {
348
422
  className: "dc:flex dc:items-center dc:space-x-1",
349
423
  children: [/* @__PURE__ */ l("div", {
350
424
  className: "dc:font-bold",
351
425
  style: {
352
- color: Y,
426
+ color: Z,
353
427
  fontSize: `${_ * .35}px`
354
428
  },
355
- children: G ? "▲" : "▼"
429
+ children: q ? "▲" : "▼"
356
430
  }), /* @__PURE__ */ u("div", {
357
431
  className: "dc:text-left",
358
432
  children: [/* @__PURE__ */ u("div", {
359
433
  className: "dc:font-bold dc:leading-tight",
360
434
  style: {
361
435
  fontSize: `${_ * .35}px`,
362
- color: Y
436
+ color: Z
363
437
  },
364
- children: [G ? "+" : "", K(U)]
438
+ children: [q ? "+" : "", J(G)]
365
439
  }), /* @__PURE__ */ u("div", {
366
440
  className: "dc:font-semibold dc:leading-tight",
367
441
  style: {
368
442
  fontSize: `${_ * .28}px`,
369
- color: Y,
443
+ color: Z,
370
444
  opacity: .8
371
445
  },
372
446
  children: [
373
- G ? "+" : "",
374
- W.toFixed(1),
447
+ q ? "+" : "",
448
+ K.toFixed(1),
375
449
  "%"
376
450
  ]
377
451
  })]
@@ -387,14 +461,14 @@ var P = a.memo(function({ data: e, chartConfig: a, displayConfig: o = {}, queryO
387
461
  },
388
462
  children: o.suffix
389
463
  }),
390
- o.showHistogram !== !1 && V.length > 2 && /* @__PURE__ */ l("div", {
464
+ o.showHistogram !== !1 && H.length > 2 && /* @__PURE__ */ l("div", {
391
465
  className: "dc:mt-2 dc:w-full dc:flex dc:justify-center dc:overflow-hidden",
392
- children: /* @__PURE__ */ l(N, {
393
- values: V,
394
- lastValue: H,
395
- positiveColor: q,
396
- negativeColor: J,
397
- formatValue: K,
466
+ children: /* @__PURE__ */ l(P, {
467
+ values: H,
468
+ lastValue: U,
469
+ positiveColor: Y,
470
+ negativeColor: X,
471
+ formatValue: J,
398
472
  width: v,
399
473
  height: 64
400
474
  })
@@ -403,6 +477,6 @@ var P = a.memo(function({ data: e, chartConfig: a, displayConfig: o = {}, queryO
403
477
  });
404
478
  });
405
479
  //#endregion
406
- export { v as a, h as c, S as d, g as f, f as g, p as h, C as i, b as l, d as m, E as n, _ as o, m as p, T as r, y as s, M as t, x as u };
480
+ export { f as _, C as a, y as c, x as d, S as f, p as g, d as h, T as i, h as l, m, D as n, v as o, g as p, E as r, _ as s, N as t, b as u };
407
481
 
408
- //# sourceMappingURL=chart-kpi-delta-nXQnRRBr.js.map
482
+ //# sourceMappingURL=chart-kpi-delta-BJCOXE-F.js.map