drizzle-cube 0.5.7 → 0.6.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 (541) hide show
  1. package/README.md +2 -0
  2. package/dist/adapters/adapters/hono/agent-handler.d.ts +9 -0
  3. package/dist/adapters/adapters/hono/mcp-handler.d.ts +37 -0
  4. package/dist/adapters/adapters/mcp-tools-handlers.d.ts +18 -0
  5. package/dist/adapters/adapters/nextjs/mcp-handler.d.ts +36 -0
  6. package/dist/adapters/{utils.d.ts → adapters/utils.d.ts} +6 -81
  7. package/dist/adapters/express/index.cjs +1 -1
  8. package/dist/adapters/express/index.js +50 -50
  9. package/dist/adapters/fastify/index.cjs +1 -1
  10. package/dist/adapters/fastify/index.js +78 -78
  11. package/dist/adapters/google-BOnRIN1w.cjs +2 -0
  12. package/dist/{server/google-CFYljAOF.js → adapters/google-CvKM9yVM.js} +83 -71
  13. package/dist/adapters/{handler-Dz1F4iwf.js → handler-CfgE0JSL.js} +515 -578
  14. package/dist/adapters/handler-Cn0dOctE.cjs +25 -0
  15. package/dist/adapters/hono/index.cjs +2 -2
  16. package/dist/adapters/hono/index.js +208 -178
  17. package/dist/adapters/locale-DDvZDFVn.js +8114 -0
  18. package/dist/adapters/locale-ZLUUNUxr.cjs +166 -0
  19. package/dist/adapters/mcp-tools.cjs +1 -1
  20. package/dist/adapters/mcp-tools.js +49 -38
  21. package/dist/adapters/mcp-transport-Chiaj4ll.cjs +40 -0
  22. package/dist/adapters/mcp-transport-H96VG3WY.js +591 -0
  23. package/dist/adapters/nextjs/index.cjs +1 -1
  24. package/dist/adapters/nextjs/index.js +190 -197
  25. package/dist/{server/openai-y7GhJNdn.js → adapters/openai-B5jEiqiB.js} +776 -719
  26. package/dist/adapters/openai-D0musiYP.cjs +17 -0
  27. package/dist/{server/openai-DiVskd89.js → adapters/openai-cDlFSTk6.js} +61 -59
  28. package/dist/adapters/openai-vXvLni8v.cjs +1 -0
  29. package/dist/adapters/{utils-DosuoabY.js → utils-BPWZsX7k.js} +1285 -1220
  30. package/dist/adapters/utils-_whV4fXL.cjs +128 -0
  31. package/dist/adapters/utils.cjs +1 -1
  32. package/dist/adapters/utils.js +2 -2
  33. package/dist/client/charts/ChartLoader.d.ts +3 -17
  34. package/dist/client/charts/chartComponentRegistry.d.ts +46 -0
  35. package/dist/client/charts/chartConfigHelpers.d.ts +38 -0
  36. package/dist/client/charts.js +14 -13
  37. package/dist/client/chunks/{DashboardEditModal-6KRE36mm.js → DashboardEditModal-okVfH8ZK.js} +5446 -4486
  38. package/dist/client/chunks/DashboardEditModal-okVfH8ZK.js.map +1 -0
  39. package/dist/client/chunks/{RetentionCombinedChart-CCpu0C-s.js → RetentionCombinedChart-BgbDhsPz.js} +10 -10
  40. package/dist/client/chunks/{RetentionCombinedChart-CCpu0C-s.js.map → RetentionCombinedChart-BgbDhsPz.js.map} +1 -1
  41. package/dist/client/chunks/{RetentionHeatmap-B24PiIfr.js → RetentionHeatmap-DjXZaTPq.js} +5 -5
  42. package/dist/client/chunks/{RetentionHeatmap-B24PiIfr.js.map → RetentionHeatmap-DjXZaTPq.js.map} +1 -1
  43. package/dist/client/chunks/analysis-builder-DB88FojM.js +5674 -0
  44. package/dist/client/chunks/analysis-builder-DB88FojM.js.map +1 -0
  45. package/dist/client/chunks/{analysis-builder-shared-x576-O5p.js → analysis-builder-shared-BVK4TYfR.js} +1578 -1292
  46. package/dist/client/chunks/analysis-builder-shared-BVK4TYfR.js.map +1 -0
  47. package/dist/client/chunks/{chart-activity-grid-CiHrLH6Y.js → chart-activity-grid-DX0SJbxs.js} +642 -494
  48. package/dist/client/chunks/chart-activity-grid-DX0SJbxs.js.map +1 -0
  49. package/dist/client/chunks/chart-area-of01_62R.js +775 -0
  50. package/dist/client/chunks/chart-area-of01_62R.js.map +1 -0
  51. package/dist/client/chunks/chart-bar-BqelQE_I.js +194 -0
  52. package/dist/client/chunks/chart-bar-BqelQE_I.js.map +1 -0
  53. package/dist/client/chunks/{chart-box-plot-Bu9hy-17.js → chart-box-plot-kkBixZ27.js} +2 -2
  54. package/dist/client/chunks/{chart-box-plot-Bu9hy-17.js.map → chart-box-plot-kkBixZ27.js.map} +1 -1
  55. package/dist/client/chunks/chart-bubble-B2he1--4.js +221 -0
  56. package/dist/client/chunks/chart-bubble-B2he1--4.js.map +1 -0
  57. package/dist/client/chunks/{chart-candlestick-Dau5AF4E.js → chart-candlestick-DZp19Tzh.js} +2 -2
  58. package/dist/client/chunks/{chart-candlestick-Dau5AF4E.js.map → chart-candlestick-DZp19Tzh.js.map} +1 -1
  59. package/dist/client/chunks/chart-config-area-BNigHUy8.js +124 -0
  60. package/dist/client/chunks/chart-config-area-BNigHUy8.js.map +1 -0
  61. package/dist/client/chunks/chart-config-bar-DSO_LRTx.js +54 -0
  62. package/dist/client/chunks/chart-config-bar-DSO_LRTx.js.map +1 -0
  63. package/dist/client/chunks/{chart-config-box-plot-DJ-dWWXA.js → chart-config-box-plot-oW8axV2q.js} +5 -10
  64. package/dist/client/chunks/chart-config-box-plot-oW8axV2q.js.map +1 -0
  65. package/dist/client/chunks/{chart-config-gauge-DSwC04l0.js → chart-config-gauge-Dq-_H9UN.js} +5 -7
  66. package/dist/client/chunks/chart-config-gauge-Dq-_H9UN.js.map +1 -0
  67. package/dist/client/chunks/{chart-config-kpi-delta-D6BIkHL3.js → chart-config-kpi-delta-DSQbvqu_.js} +5 -10
  68. package/dist/client/chunks/chart-config-kpi-delta-DSQbvqu_.js.map +1 -0
  69. package/dist/client/chunks/{chart-config-kpi-number-Bx-V9a62.js → chart-config-kpi-number-EFSWY1We.js} +5 -7
  70. package/dist/client/chunks/chart-config-kpi-number-EFSWY1We.js.map +1 -0
  71. package/dist/client/chunks/{chart-config-kpi-text-CcqC1u-8.js → chart-config-kpi-text-KM3V5X2u.js} +5 -7
  72. package/dist/client/chunks/chart-config-kpi-text-KM3V5X2u.js.map +1 -0
  73. package/dist/client/chunks/{chart-config-line-Db3jDsWc.js → chart-config-line-D6jG8PCH.js} +9 -36
  74. package/dist/client/chunks/chart-config-line-D6jG8PCH.js.map +1 -0
  75. package/dist/client/chunks/{chart-config-pie-DD4SmRTF.js → chart-config-pie-BhzW-fdn.js} +6 -16
  76. package/dist/client/chunks/chart-config-pie-BhzW-fdn.js.map +1 -0
  77. package/dist/client/chunks/{chart-config-radar-CC2XAaGr.js → chart-config-radar-D7REP1q_.js} +6 -16
  78. package/dist/client/chunks/chart-config-radar-D7REP1q_.js.map +1 -0
  79. package/dist/client/chunks/{chart-config-radial-bar-DmxKx1R0.js → chart-config-radial-bar-Byx6qOPU.js} +6 -16
  80. package/dist/client/chunks/chart-config-radial-bar-Byx6qOPU.js.map +1 -0
  81. package/dist/client/chunks/{chart-config-tree-map-BI-oQStO.js → chart-config-tree-map-DVrvf3yQ.js} +6 -16
  82. package/dist/client/chunks/chart-config-tree-map-DVrvf3yQ.js.map +1 -0
  83. package/dist/client/chunks/{chart-config-waterfall-DSnyixbI.js → chart-config-waterfall-DmFeQdIk.js} +5 -10
  84. package/dist/client/chunks/chart-config-waterfall-DmFeQdIk.js.map +1 -0
  85. package/dist/client/chunks/{chart-data-table-Cm5jrpaw.js → chart-data-table-CKauQXme.js} +1046 -1121
  86. package/dist/client/chunks/chart-data-table-CKauQXme.js.map +1 -0
  87. package/dist/client/chunks/{chart-funnel-Eke8IPtG.js → chart-funnel-CToKSBaL.js} +184 -222
  88. package/dist/client/chunks/chart-funnel-CToKSBaL.js.map +1 -0
  89. package/dist/client/chunks/chart-gauge-DTVezSk7.js +403 -0
  90. package/dist/client/chunks/chart-gauge-DTVezSk7.js.map +1 -0
  91. package/dist/client/chunks/chart-heat-map-DTuUl0BR.js +236 -0
  92. package/dist/client/chunks/chart-heat-map-DTuUl0BR.js.map +1 -0
  93. package/dist/client/chunks/chart-kpi-delta-Dn-jjO-2.js +408 -0
  94. package/dist/client/chunks/chart-kpi-delta-Dn-jjO-2.js.map +1 -0
  95. package/dist/client/chunks/chart-kpi-number-P_WBiO5S.js +244 -0
  96. package/dist/client/chunks/chart-kpi-number-P_WBiO5S.js.map +1 -0
  97. package/dist/client/chunks/chart-kpi-text-C-Y4eb5H.js +185 -0
  98. package/dist/client/chunks/chart-kpi-text-C-Y4eb5H.js.map +1 -0
  99. package/dist/client/chunks/chart-line-DKgrQA6c.js +101 -0
  100. package/dist/client/chunks/chart-line-DKgrQA6c.js.map +1 -0
  101. package/dist/client/chunks/{chart-markdown-BPW-EAm9.js → chart-markdown-CV75S_zL.js} +1359 -1240
  102. package/dist/client/chunks/chart-markdown-CV75S_zL.js.map +1 -0
  103. package/dist/client/chunks/{chart-measure-profile-BI3kADCp.js → chart-measure-profile-Ket8fJyf.js} +7 -7
  104. package/dist/client/chunks/{chart-measure-profile-BI3kADCp.js.map → chart-measure-profile-Ket8fJyf.js.map} +1 -1
  105. package/dist/client/chunks/chart-pie-ByieAX5H.js +119 -0
  106. package/dist/client/chunks/chart-pie-ByieAX5H.js.map +1 -0
  107. package/dist/client/chunks/chart-radar-CiSwHWp4.js +138 -0
  108. package/dist/client/chunks/chart-radar-CiSwHWp4.js.map +1 -0
  109. package/dist/client/chunks/chart-radial-bar-BF6Mhl6f.js +122 -0
  110. package/dist/client/chunks/chart-radial-bar-BF6Mhl6f.js.map +1 -0
  111. package/dist/client/chunks/{chart-sankey-CFzjGvZX.js → chart-sankey-DjrvKw6K.js} +36 -39
  112. package/dist/client/chunks/{chart-sankey-CFzjGvZX.js.map → chart-sankey-DjrvKw6K.js.map} +1 -1
  113. package/dist/client/chunks/chart-scatter-Dd9WFqnS.js +258 -0
  114. package/dist/client/chunks/chart-scatter-Dd9WFqnS.js.map +1 -0
  115. package/dist/client/chunks/{chart-sunburst-91Q2tzaB.js → chart-sunburst-leGpuDj7.js} +3 -3
  116. package/dist/client/chunks/{chart-sunburst-91Q2tzaB.js.map → chart-sunburst-leGpuDj7.js.map} +1 -1
  117. package/dist/client/chunks/chart-tree-map-Ceq5sLZA.js +323 -0
  118. package/dist/client/chunks/chart-tree-map-Ceq5sLZA.js.map +1 -0
  119. package/dist/client/chunks/{chart-waterfall-DcHbbPaG.js → chart-waterfall-DyvQReN5.js} +7 -7
  120. package/dist/client/chunks/{chart-waterfall-DcHbbPaG.js.map → chart-waterfall-DyvQReN5.js.map} +1 -1
  121. package/dist/client/chunks/{charts-core-CrBDYN6N.js → charts-core-DaXSt1Dd.js} +2 -2
  122. package/dist/client/chunks/{charts-core-CrBDYN6N.js.map → charts-core-DaXSt1Dd.js.map} +1 -1
  123. package/dist/client/chunks/charts-loader-DdTeCeNo.js +84 -0
  124. package/dist/client/chunks/charts-loader-DdTeCeNo.js.map +1 -0
  125. package/dist/client/chunks/{core-DsAWNRRv.js → core-D7vPfUIe.js} +2 -2
  126. package/dist/client/chunks/{core-DsAWNRRv.js.map → core-D7vPfUIe.js.map} +1 -1
  127. package/dist/client/chunks/{nl-NL-oyr2wENY.js → nl-NL-2zTAWTej.js} +8 -2
  128. package/dist/client/chunks/{nl-NL-oyr2wENY.js.map → nl-NL-2zTAWTej.js.map} +1 -1
  129. package/dist/client/chunks/retention-ChW9jYdy.js.map +1 -1
  130. package/dist/client/chunks/{schema-visualization-BszcrmZX.js → schema-visualization-Cb_E9_Gd.js} +12 -12
  131. package/dist/client/chunks/{schema-visualization-BszcrmZX.js.map → schema-visualization-Cb_E9_Gd.js.map} +1 -1
  132. package/dist/client/chunks/{useDirtyStateTracking-B5wCDJSj.js → useDirtyStateTracking-MbpxH_v6.js} +95 -84
  133. package/dist/client/chunks/useDirtyStateTracking-MbpxH_v6.js.map +1 -0
  134. package/dist/client/chunks/{useExplainAI-CCeCYzDm.js → useExplainAI-evnZkjCY.js} +14 -14
  135. package/dist/client/chunks/{useExplainAI-CCeCYzDm.js.map → useExplainAI-evnZkjCY.js.map} +1 -1
  136. package/dist/client/chunks/{utils-kqa-JIMg.js → utils-3P6z1vz5.js} +3 -3
  137. package/dist/client/chunks/{utils-kqa-JIMg.js.map → utils-3P6z1vz5.js.map} +1 -1
  138. package/dist/client/chunks/{vendor-0hJNlZXQ.js → vendor-DSpR0IW6.js} +43 -43
  139. package/dist/client/chunks/{vendor-0hJNlZXQ.js.map → vendor-DSpR0IW6.js.map} +1 -1
  140. package/dist/client/components/AgenticNotebook/agentChatParts.d.ts +34 -0
  141. package/dist/client/components/AgenticNotebook/chatMessageParts.d.ts +39 -0
  142. package/dist/client/components/AgenticNotebook/useAgentChatController.d.ts +25 -0
  143. package/dist/client/components/AgenticNotebook/useNotebookAutosave.d.ts +12 -0
  144. package/dist/client/components/AnalysisBuilder/AnalysisAIPanel.d.ts +1 -1
  145. package/dist/client/components/AnalysisBuilder/AnalysisAxisDropZone.d.ts +1 -1
  146. package/dist/client/components/AnalysisBuilder/AnalysisChartConfigPanel.d.ts +1 -1
  147. package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +1 -1
  148. package/dist/client/components/AnalysisBuilder/AnalysisFilterGroup.d.ts +1 -1
  149. package/dist/client/components/AnalysisBuilder/AnalysisFilterItem.d.ts +1 -1
  150. package/dist/client/components/AnalysisBuilder/AnalysisFilterSection.d.ts +1 -1
  151. package/dist/client/components/AnalysisBuilder/AnalysisModeErrorBoundary.d.ts +1 -1
  152. package/dist/client/components/AnalysisBuilder/AnalysisQueryPanelParts.d.ts +64 -0
  153. package/dist/client/components/AnalysisBuilder/AnalysisResultsHeader.d.ts +67 -0
  154. package/dist/client/components/AnalysisBuilder/BreakdownComparisonToggle.d.ts +13 -0
  155. package/dist/client/components/AnalysisBuilder/BreakdownRow.d.ts +26 -0
  156. package/dist/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +10 -0
  157. package/dist/client/components/AnalysisBuilder/ExecutionPlanPanelParts.d.ts +22 -0
  158. package/dist/client/components/AnalysisBuilder/ExplainAIPanel.d.ts +2 -1
  159. package/dist/client/components/AnalysisBuilder/FieldDetailPanel.d.ts +1 -1
  160. package/dist/client/components/AnalysisBuilder/FieldSearchItem.d.ts +1 -1
  161. package/dist/client/components/AnalysisBuilder/FieldSearchModal.d.ts +1 -1
  162. package/dist/client/components/AnalysisBuilder/FieldSearchResults.d.ts +16 -0
  163. package/dist/client/components/AnalysisBuilder/FilterConfigModal.d.ts +2 -1
  164. package/dist/client/components/AnalysisBuilder/FilterValueInput.d.ts +63 -0
  165. package/dist/client/components/AnalysisBuilder/FlowDepthControls.d.ts +10 -0
  166. package/dist/client/components/AnalysisBuilder/FlowVisualizationPicker.d.ts +7 -0
  167. package/dist/client/components/AnalysisBuilder/LegacyBooleanOptions.d.ts +8 -0
  168. package/dist/client/components/AnalysisBuilder/LimitSection.d.ts +1 -1
  169. package/dist/client/components/AnalysisBuilder/MetricRow.d.ts +23 -0
  170. package/dist/client/components/AnalysisBuilder/SectionHeading.d.ts +1 -1
  171. package/dist/client/components/AnalysisBuilder/SortToggleButton.d.ts +13 -0
  172. package/dist/client/components/AnalysisBuilder/StringArrayInput.d.ts +17 -0
  173. package/dist/client/components/AnalysisBuilder/filterConfigModalUtils.d.ts +30 -0
  174. package/dist/client/components/AnalysisBuilder/hooks/useAnalysisBuilderImperativeHandle.d.ts +13 -0
  175. package/dist/client/components/AnalysisBuilder/hooks/useDragReorder.d.ts +25 -0
  176. package/dist/client/components/AnalysisBuilder/hooks/useFieldSearchKeyboard.d.ts +11 -0
  177. package/dist/client/components/AnalysisBuilder/utils/axisConfigUtils.d.ts +23 -0
  178. package/dist/client/components/AnalysisBuilder/utils/executionPlanMarkdown.d.ts +8 -0
  179. package/dist/client/components/AnalysisBuilder/utils/fieldUtils.d.ts +5 -0
  180. package/dist/client/components/AnalysisBuilder/utils/resultsPanelDerive.d.ts +68 -0
  181. package/dist/client/components/AnalysisBuilder/utils/shareStateUtils.d.ts +68 -0
  182. package/dist/client/components/AnalysisBuilder/utils/sortUtils.d.ts +7 -0
  183. package/dist/client/components/AnalyticsDashboard.d.ts +1 -1
  184. package/dist/client/components/AnalyticsPage.d.ts +1 -1
  185. package/dist/client/components/ChartErrorBoundary.d.ts +1 -1
  186. package/dist/client/components/ChartTypeSelector.d.ts +1 -1
  187. package/dist/client/components/ColorPaletteSelector.d.ts +1 -1
  188. package/dist/client/components/DashboardEditModal.d.ts +2 -1
  189. package/dist/client/components/DashboardFilters/CompactFilterBarParts.d.ts +26 -0
  190. package/dist/client/components/DashboardFilters/DashboardFilterConfigModal.d.ts +1 -1
  191. package/dist/client/components/DashboardFilters/DashboardFilterConfigModalParts.d.ts +27 -0
  192. package/dist/client/components/DashboardFilters/DashboardFilterItem.d.ts +1 -1
  193. package/dist/client/components/DashboardFilters/DashboardFilterValueInput.d.ts +39 -0
  194. package/dist/client/components/DashboardFilters/dashboardFilterConfigModalUtils.d.ts +21 -0
  195. package/dist/client/components/DashboardFilters/useCompactFilterBar.d.ts +19 -0
  196. package/dist/client/components/DashboardFilters/useDashboardFilterConfigModal.d.ts +69 -0
  197. package/dist/client/components/DashboardFilters/useDateRangeState.d.ts +19 -0
  198. package/dist/client/components/DashboardFilters/useFilterDropdowns.d.ts +21 -0
  199. package/dist/client/components/DashboardFilters/useFilterValueFetch.d.ts +23 -0
  200. package/dist/client/components/DashboardGrid.d.ts +1 -1
  201. package/dist/client/components/DashboardPortletCard.d.ts +2 -57
  202. package/dist/client/components/DashboardThumbnailPlaceholder.d.ts +1 -1
  203. package/dist/client/components/DataBrowser/DataBrowserSidebar.d.ts +1 -1
  204. package/dist/client/components/DataBrowser/DataBrowserToolbar.d.ts +1 -1
  205. package/dist/client/components/DataBrowser/index.d.ts +1 -1
  206. package/dist/client/components/DataHistogram.d.ts +1 -1
  207. package/dist/client/components/DebugModal.d.ts +1 -1
  208. package/dist/client/components/DrillBreadcrumb.d.ts +2 -1
  209. package/dist/client/components/LoadingIndicator.d.ts +1 -1
  210. package/dist/client/components/MobileStackedLayout.d.ts +1 -1
  211. package/dist/client/components/PortletAnalysisModal.d.ts +1 -1
  212. package/dist/client/components/PortletContainer.d.ts +1 -1
  213. package/dist/client/components/PortletFilterConfigModal.d.ts +6 -4
  214. package/dist/client/components/RowManagedLayout.d.ts +1 -1
  215. package/dist/client/components/ScaledGridWrapper.d.ts +1 -1
  216. package/dist/client/components/SchemaVisualization/CubeNode.d.ts +1 -1
  217. package/dist/client/components/SchemaVisualization/FieldDetailPanel.d.ts +1 -1
  218. package/dist/client/components/SchemaVisualization/RelationshipEdge.d.ts +1 -1
  219. package/dist/client/components/SchemaVisualization/SchemaVisualizationLazy.d.ts +1 -1
  220. package/dist/client/components/SchemaVisualization/index.d.ts +1 -1
  221. package/dist/client/components/TextPortletModal.d.ts +1 -1
  222. package/dist/client/components/analyticsPortlet/PortletChart.d.ts +31 -0
  223. package/dist/client/components/analyticsPortlet/PortletChartView.d.ts +35 -0
  224. package/dist/client/components/analyticsPortlet/PortletStates.d.ts +65 -0
  225. package/dist/client/components/analyticsPortlet/parsePortletQuery.d.ts +22 -0
  226. package/dist/client/components/analyticsPortlet/portletRenderState.d.ts +31 -0
  227. package/dist/client/components/analyticsPortlet/usePortletDebugData.d.ts +37 -0
  228. package/dist/client/components/analyticsPortlet/usePortletDrillState.d.ts +17 -0
  229. package/dist/client/components/analyticsPortlet/usePortletQueryResults.d.ts +37 -0
  230. package/dist/client/components/charts/ActivityGridChart.helpers.d.ts +33 -0
  231. package/dist/client/components/charts/ActivityGridChart.render.d.ts +31 -0
  232. package/dist/client/components/charts/AxisFormatControls.d.ts +5 -3
  233. package/dist/client/components/charts/BarChart.helpers.d.ts +23 -0
  234. package/dist/client/components/charts/BarSeries.d.ts +29 -0
  235. package/dist/client/components/charts/BubbleChart.helpers.d.ts +43 -0
  236. package/dist/client/components/charts/BubbleChart.render.d.ts +21 -0
  237. package/dist/client/components/charts/ChartContainer.d.ts +1 -1
  238. package/dist/client/components/charts/ChartLegend.d.ts +1 -1
  239. package/dist/client/components/charts/ChartStates.d.ts +38 -0
  240. package/dist/client/components/charts/ChartTooltip.d.ts +1 -1
  241. package/dist/client/components/charts/FunnelChart.helpers.d.ts +25 -0
  242. package/dist/client/components/charts/FunnelViews.d.ts +16 -0
  243. package/dist/client/components/charts/HeatMapCanvas.d.ts +25 -0
  244. package/dist/client/components/charts/HeatMapChart.helpers.d.ts +64 -0
  245. package/dist/client/components/charts/KpiDelta.helpers.d.ts +20 -0
  246. package/dist/client/components/charts/KpiNumber.helpers.d.ts +30 -0
  247. package/dist/client/components/charts/KpiStates.d.ts +19 -0
  248. package/dist/client/components/charts/MissingDependencyFallback.d.ts +1 -1
  249. package/dist/client/components/charts/ScatterChart.helpers.d.ts +43 -0
  250. package/dist/client/components/charts/ScatterSeries.d.ts +17 -0
  251. package/dist/client/components/charts/ScatterTooltip.d.ts +21 -0
  252. package/dist/client/components/charts/TreeMapChart.helpers.d.ts +37 -0
  253. package/dist/client/components/charts/TreeMapContent.d.ts +24 -0
  254. package/dist/client/components/charts/TreeMapLegend.d.ts +13 -0
  255. package/dist/client/components/charts/cartesianChartHelpers.d.ts +126 -0
  256. package/dist/client/components/charts/chartAxisResolution.d.ts +32 -0
  257. package/dist/client/components/charts/chartScaffolding.d.ts +77 -0
  258. package/dist/client/components/charts/gaugeChartHelpers.d.ts +36 -0
  259. package/dist/client/components/charts/kpiTextHelpers.d.ts +46 -0
  260. package/dist/client/components/charts/radarChartHelpers.d.ts +14 -0
  261. package/dist/client/components/charts/radialBarChartHelpers.d.ts +22 -0
  262. package/dist/client/components/charts/useChartDimensions.d.ts +20 -0
  263. package/dist/client/components/charts/useKpiDimensions.d.ts +30 -0
  264. package/dist/client/components/dashboard/DashboardContext.d.ts +2 -2
  265. package/dist/client/components/dashboard/DashboardCoordinator.d.ts +1 -1
  266. package/dist/client/components/dashboard/DashboardEditBar.d.ts +5 -0
  267. package/dist/client/components/dashboard/DashboardFilterBar.d.ts +1 -1
  268. package/dist/client/components/dashboard/DashboardGridSurface.d.ts +1 -1
  269. package/dist/client/components/dashboard/DashboardModals.d.ts +1 -1
  270. package/dist/client/components/dashboard/DashboardProvider.d.ts +1 -1
  271. package/dist/client/components/dashboard/DashboardToolbar.d.ts +1 -1
  272. package/dist/client/components/dashboard/LayoutModeToggle.d.ts +10 -0
  273. package/dist/client/components/dashboard/dashboardGridUtils.d.ts +1 -1
  274. package/dist/client/components/dashboardPortletCard/FilterFieldChip.d.ts +12 -0
  275. package/dist/client/components/dashboardPortletCard/PortletCardHeader.d.ts +43 -0
  276. package/dist/client/components/dashboardPortletCard/cardStyles.d.ts +33 -0
  277. package/dist/client/components/dashboardPortletCard/filterField.d.ts +12 -0
  278. package/dist/client/components/dashboardPortletCard/propsEqual.d.ts +55 -0
  279. package/dist/client/components/dashboardPortletCard/usePortletCardActions.d.ts +16 -0
  280. package/dist/client/components/portletAnalysisModal/saveValidation.d.ts +8 -0
  281. package/dist/client/components/shared/dateRangeUtils.d.ts +40 -0
  282. package/dist/client/components/shared/filterDisplayUtils.d.ts +10 -0
  283. package/dist/client/components/shared/filterItem/FilterDateRangeSelector.d.ts +17 -0
  284. package/dist/client/components/shared/filterItem/FilterFieldDropdown.d.ts +16 -0
  285. package/dist/client/components/shared/filterItem/dateRangeSync.d.ts +14 -0
  286. package/dist/client/components/shared/filterItem/fieldVisuals.d.ts +5 -0
  287. package/dist/client/components/shared/filterValueSelector/FilterValueInputs.d.ts +55 -0
  288. package/dist/client/components/shared/filterValueSelector/useFilterValueSelectorState.d.ts +25 -0
  289. package/dist/client/components/shared/queryFieldUtils.d.ts +21 -0
  290. package/dist/client/components/shared/utils.d.ts +4 -43
  291. package/dist/client/components.js +3 -3
  292. package/dist/client/hooks/agentChatStream.d.ts +39 -0
  293. package/dist/client/hooks/analysisQueryExecutionModes.d.ts +133 -0
  294. package/dist/client/hooks/dashboard/useDashboardController.d.ts +2 -2
  295. package/dist/client/hooks/drillNavigation.d.ts +25 -0
  296. package/dist/client/hooks/useDashboardHook.d.ts +2 -2
  297. package/dist/client/hooks.js +3 -3
  298. package/dist/client/icons.d.ts +1 -1
  299. package/dist/client/icons.js +2 -2
  300. package/dist/client/index.js +816 -669
  301. package/dist/client/index.js.map +1 -1
  302. package/dist/client/providers/CubeApiProvider.d.ts +1 -1
  303. package/dist/client/providers/CubeFeaturesProvider.d.ts +1 -1
  304. package/dist/client/providers/CubeMetaProvider.d.ts +1 -1
  305. package/dist/client/providers/CubeProvider.d.ts +1 -1
  306. package/dist/client/providers/I18nProvider.d.ts +1 -1
  307. package/dist/client/providers.js +3 -3
  308. package/dist/client/schema.js +1 -1
  309. package/dist/client/shared/chartConfigBuilders.d.ts +18 -0
  310. package/dist/client/shared/components/QueryAnalysisPanel.sections.d.ts +41 -0
  311. package/dist/client/shared/queryTransforms.d.ts +20 -0
  312. package/dist/client/shared/utils.d.ts +2 -4
  313. package/dist/client/stores/analysisBuilderStore.d.ts +1 -1
  314. package/dist/client/stores/dashboardStore.d.ts +1 -1
  315. package/dist/client/stores/dataBrowserStore.d.ts +1 -1
  316. package/dist/client/stores/notebookStore.d.ts +1 -1
  317. package/dist/client/stores/optionsToAnalysisConfig.d.ts +17 -0
  318. package/dist/client/styles.css +1 -1
  319. package/dist/client/types/drill.d.ts +1 -1
  320. package/dist/client/types.d.ts +7 -2
  321. package/dist/client/utils/axisValueFormatting.d.ts +32 -0
  322. package/dist/client/utils/drillQueryBuilder.d.ts +2 -2
  323. package/dist/client/utils/filterUtils.d.ts +33 -5
  324. package/dist/client/utils/joinReachability.d.ts +27 -0
  325. package/dist/client/utils/timeValueFormatting.d.ts +32 -0
  326. package/dist/client/utils.js +6 -6
  327. package/dist/client-bundle-stats.html +1 -1
  328. package/dist/mcp-app/mcp-app.html +55 -55
  329. package/dist/server/google-BOnRIN1w.cjs +2 -0
  330. package/dist/{adapters/google-CFYljAOF.js → server/google-CvKM9yVM.js} +83 -71
  331. package/dist/server/index.cjs +179 -211
  332. package/dist/server/index.d.ts +2 -5050
  333. package/dist/server/index.js +6360 -6462
  334. package/dist/{adapters/openai-y7GhJNdn.js → server/openai-B5jEiqiB.js} +776 -719
  335. package/dist/server/openai-D0musiYP.cjs +17 -0
  336. package/dist/{adapters/openai-DiVskd89.js → server/openai-cDlFSTk6.js} +61 -59
  337. package/dist/server/openai-vXvLni8v.cjs +1 -0
  338. package/dist/server/server/adapters/base-adapter.d.ts +332 -0
  339. package/dist/server/server/adapters/databend-adapter.d.ts +63 -0
  340. package/dist/server/server/adapters/duckdb-adapter.d.ts +68 -0
  341. package/dist/server/server/adapters/mysql-adapter.d.ts +65 -0
  342. package/dist/server/server/adapters/postgres-adapter.d.ts +55 -0
  343. package/dist/server/server/adapters/singlestore-adapter.d.ts +4 -0
  344. package/dist/server/server/adapters/snowflake-adapter.d.ts +53 -0
  345. package/dist/server/server/adapters/sqlite-adapter.d.ts +120 -0
  346. package/dist/server/server/adapters/window-function-builder.d.ts +11 -0
  347. package/dist/server/server/agent/chart-validation.d.ts +22 -0
  348. package/dist/server/server/agent/handler-steps.d.ts +37 -0
  349. package/dist/server/server/agent/handler.d.ts +25 -0
  350. package/dist/server/server/agent/index.d.ts +11 -0
  351. package/dist/server/server/agent/providers/anthropic.d.ts +24 -0
  352. package/dist/server/server/agent/providers/factory.d.ts +12 -0
  353. package/dist/server/server/agent/providers/google.d.ts +23 -0
  354. package/dist/server/server/agent/providers/index.d.ts +6 -0
  355. package/dist/server/server/agent/providers/openai.d.ts +26 -0
  356. package/dist/server/server/agent/providers/types.d.ts +95 -0
  357. package/dist/server/server/agent/system-prompt.d.ts +5 -0
  358. package/dist/server/server/agent/tools.d.ts +28 -0
  359. package/dist/server/server/agent/types.d.ts +192 -0
  360. package/dist/server/server/ai/discovery-helpers.d.ts +29 -0
  361. package/dist/server/server/ai/discovery.d.ts +66 -0
  362. package/dist/server/server/ai/index.d.ts +10 -0
  363. package/dist/server/server/ai/mcp-prompts.d.ts +83 -0
  364. package/dist/server/server/ai/query-schema.d.ts +258 -0
  365. package/dist/server/server/ai/schemas.d.ts +63 -0
  366. package/dist/server/server/ai/suggestion-helpers.d.ts +33 -0
  367. package/dist/server/server/ai/suggestion.d.ts +16 -0
  368. package/dist/server/server/ai/validation-helpers.d.ts +21 -0
  369. package/dist/server/server/ai/validation.d.ts +31 -0
  370. package/dist/server/server/builders/analysis-utils.d.ts +106 -0
  371. package/dist/server/server/builders/comparison-query-builder.d.ts +70 -0
  372. package/dist/server/server/builders/cte-builder.d.ts +108 -0
  373. package/dist/server/server/builders/date-time-builder.d.ts +34 -0
  374. package/dist/server/server/builders/date-time-helpers.d.ts +34 -0
  375. package/dist/server/server/builders/filter-builder.d.ts +25 -0
  376. package/dist/server/server/builders/filter-operators.d.ts +23 -0
  377. package/dist/server/server/builders/flow-query-builder.d.ts +136 -0
  378. package/dist/server/server/builders/funnel-query-builder.d.ts +145 -0
  379. package/dist/server/server/builders/group-by-builder.d.ts +38 -0
  380. package/dist/server/server/builders/index.d.ts +13 -0
  381. package/dist/server/server/builders/measure-builder.d.ts +185 -0
  382. package/dist/server/server/builders/retention-query-builder.d.ts +98 -0
  383. package/dist/server/server/cache-providers/index.d.ts +5 -0
  384. package/dist/server/server/cache-providers/memory.d.ts +105 -0
  385. package/dist/server/server/cache-utils.d.ts +85 -0
  386. package/dist/server/server/compiler-metadata.d.ts +11 -0
  387. package/dist/server/server/compiler.d.ts +212 -0
  388. package/dist/server/server/cube-utils.d.ts +158 -0
  389. package/dist/server/server/database-utils.d.ts +18 -0
  390. package/dist/server/server/execution/annotation-builder.d.ts +12 -0
  391. package/dist/server/server/execution/filter-cache-preloader.d.ts +19 -0
  392. package/dist/server/server/execution/mode-router.d.ts +25 -0
  393. package/dist/server/server/execution/query-result-cache.d.ts +21 -0
  394. package/dist/server/server/execution/result-post-processor.d.ts +10 -0
  395. package/dist/server/server/executor.d.ts +186 -0
  396. package/dist/server/server/executors/base-executor.d.ts +16 -0
  397. package/dist/server/server/executors/databend-executor.d.ts +33 -0
  398. package/dist/server/server/executors/duckdb-executor.d.ts +33 -0
  399. package/dist/server/server/executors/explain-utils.d.ts +28 -0
  400. package/dist/server/server/executors/index.d.ts +21 -0
  401. package/dist/server/server/executors/mysql-executor.d.ts +27 -0
  402. package/dist/server/server/executors/postgres-executor.d.ts +27 -0
  403. package/dist/server/server/executors/singlestore-executor.d.ts +9 -0
  404. package/dist/server/server/executors/snowflake-executor.d.ts +33 -0
  405. package/dist/server/server/executors/sqlite-executor.d.ts +28 -0
  406. package/dist/server/server/explain/databend-parser.d.ts +16 -0
  407. package/dist/server/server/explain/duckdb-parser.d.ts +28 -0
  408. package/dist/server/server/explain/explain-tree.d.ts +20 -0
  409. package/dist/server/server/explain/index.d.ts +9 -0
  410. package/dist/server/server/explain/mysql-parser.d.ts +38 -0
  411. package/dist/server/server/explain/postgres-parser.d.ts +18 -0
  412. package/dist/server/server/explain/snowflake-parser.d.ts +17 -0
  413. package/dist/server/server/explain/sqlite-parser.d.ts +23 -0
  414. package/dist/server/server/filter-cache.d.ts +73 -0
  415. package/dist/server/server/gap-filler.d.ts +48 -0
  416. package/dist/server/server/index.d.ts +38 -0
  417. package/dist/server/server/logical-plan/cte-planner-helpers.d.ts +37 -0
  418. package/dist/server/server/logical-plan/cte-planner.d.ts +104 -0
  419. package/dist/server/server/logical-plan/filter-propagation.d.ts +44 -0
  420. package/dist/server/server/logical-plan/index.d.ts +19 -0
  421. package/dist/server/server/logical-plan/join-planner.d.ts +27 -0
  422. package/dist/server/server/logical-plan/logical-plan-builder.d.ts +58 -0
  423. package/dist/server/server/logical-plan/logical-planner.d.ts +39 -0
  424. package/dist/server/server/logical-plan/optimiser.d.ts +34 -0
  425. package/dist/server/server/logical-plan/plan-analysis-reporter.d.ts +59 -0
  426. package/dist/server/server/logical-plan/planner-utils.d.ts +20 -0
  427. package/dist/server/server/logical-plan/types.d.ts +199 -0
  428. package/dist/server/server/measure-classification.d.ts +40 -0
  429. package/dist/server/server/physical-plan/drizzle-plan-builder.d.ts +50 -0
  430. package/dist/server/server/physical-plan/drizzle-sql-builder.d.ts +118 -0
  431. package/dist/server/server/physical-plan/index.d.ts +2 -0
  432. package/dist/server/server/physical-plan/processors/cte-processor.d.ts +6 -0
  433. package/dist/server/server/physical-plan/processors/index.d.ts +8 -0
  434. package/dist/server/server/physical-plan/processors/joins-processor.d.ts +6 -0
  435. package/dist/server/server/physical-plan/processors/keys-dedup-processor.d.ts +13 -0
  436. package/dist/server/server/physical-plan/processors/multi-fact-processor.d.ts +13 -0
  437. package/dist/server/server/physical-plan/processors/predicates-processor.d.ts +6 -0
  438. package/dist/server/server/physical-plan/processors/selection-processor.d.ts +6 -0
  439. package/dist/server/server/physical-plan/processors/shared.d.ts +38 -0
  440. package/dist/server/server/physical-plan/processors/window-processor.d.ts +6 -0
  441. package/dist/server/server/prompts/explain-analysis-prompt.d.ts +47 -0
  442. package/dist/server/server/prompts/index.d.ts +27 -0
  443. package/dist/server/server/prompts/single-step-prompt.d.ts +31 -0
  444. package/dist/server/server/prompts/step0-validation-prompt.d.ts +39 -0
  445. package/dist/server/server/prompts/step1-shape-prompt.d.ts +29 -0
  446. package/dist/server/server/prompts/step2-complete-prompt.d.ts +19 -0
  447. package/dist/server/server/prompts/types.d.ts +37 -0
  448. package/dist/server/server/query-handlers.d.ts +79 -0
  449. package/dist/server/server/query-modes.d.ts +28 -0
  450. package/dist/server/server/query-validator.d.ts +9 -0
  451. package/dist/server/server/resolvers/calculated-measure-resolver.d.ts +98 -0
  452. package/dist/server/server/resolvers/index.d.ts +6 -0
  453. package/dist/server/server/resolvers/join-path-resolver.d.ts +158 -0
  454. package/dist/server/server/sql-format.d.ts +11 -0
  455. package/dist/server/server/template-substitution.d.ts +57 -0
  456. package/dist/server/server/types/analysis.d.ts +189 -0
  457. package/dist/server/server/types/cache.d.ts +132 -0
  458. package/dist/server/server/types/core.d.ts +164 -0
  459. package/dist/server/server/types/cube.d.ts +544 -0
  460. package/dist/server/server/types/executor.d.ts +156 -0
  461. package/dist/server/server/types/flow.d.ts +144 -0
  462. package/dist/server/server/types/funnel.d.ts +118 -0
  463. package/dist/server/server/types/index.d.ts +11 -0
  464. package/dist/server/server/types/metadata.d.ts +113 -0
  465. package/dist/server/server/types/query.d.ts +153 -0
  466. package/dist/server/server/types/retention.d.ts +141 -0
  467. package/dist/server/server/types/utils.d.ts +11 -0
  468. package/dist/server/server/types/validation.d.ts +14 -0
  469. package/package.json +15 -8
  470. package/dist/adapters/google-DUlXeeDA.cjs +0 -2
  471. package/dist/adapters/handler-C63rJUUK.cjs +0 -25
  472. package/dist/adapters/locale-CTNwPVZI.cjs +0 -198
  473. package/dist/adapters/locale-gU_d1Wja.js +0 -8249
  474. package/dist/adapters/mcp-transport-C4J4SAcn.cjs +0 -40
  475. package/dist/adapters/mcp-transport-CVUiifEc.js +0 -579
  476. package/dist/adapters/openai-6wrBvAnv.cjs +0 -1
  477. package/dist/adapters/openai-BDwb2u7y.cjs +0 -17
  478. package/dist/adapters/utils-CkEkU8Bo.cjs +0 -128
  479. package/dist/client/chunks/DashboardEditModal-6KRE36mm.js.map +0 -1
  480. package/dist/client/chunks/analysis-builder-shared-x576-O5p.js.map +0 -1
  481. package/dist/client/chunks/analysis-builder-zd48FVJO.js +0 -5367
  482. package/dist/client/chunks/analysis-builder-zd48FVJO.js.map +0 -1
  483. package/dist/client/chunks/chart-activity-grid-CiHrLH6Y.js.map +0 -1
  484. package/dist/client/chunks/chart-area-CXFK-Grv.js +0 -450
  485. package/dist/client/chunks/chart-area-CXFK-Grv.js.map +0 -1
  486. package/dist/client/chunks/chart-bar-DKXfLoGG.js +0 -271
  487. package/dist/client/chunks/chart-bar-DKXfLoGG.js.map +0 -1
  488. package/dist/client/chunks/chart-bubble-DGkTQlxM.js +0 -273
  489. package/dist/client/chunks/chart-bubble-DGkTQlxM.js.map +0 -1
  490. package/dist/client/chunks/chart-config-area-Bq_UsW3x.js +0 -101
  491. package/dist/client/chunks/chart-config-area-Bq_UsW3x.js.map +0 -1
  492. package/dist/client/chunks/chart-config-bar-_JEGZnAu.js +0 -95
  493. package/dist/client/chunks/chart-config-bar-_JEGZnAu.js.map +0 -1
  494. package/dist/client/chunks/chart-config-box-plot-DJ-dWWXA.js.map +0 -1
  495. package/dist/client/chunks/chart-config-gauge-DSwC04l0.js.map +0 -1
  496. package/dist/client/chunks/chart-config-kpi-delta-D6BIkHL3.js.map +0 -1
  497. package/dist/client/chunks/chart-config-kpi-number-Bx-V9a62.js.map +0 -1
  498. package/dist/client/chunks/chart-config-kpi-text-CcqC1u-8.js.map +0 -1
  499. package/dist/client/chunks/chart-config-line-Db3jDsWc.js.map +0 -1
  500. package/dist/client/chunks/chart-config-pie-DD4SmRTF.js.map +0 -1
  501. package/dist/client/chunks/chart-config-radar-CC2XAaGr.js.map +0 -1
  502. package/dist/client/chunks/chart-config-radial-bar-DmxKx1R0.js.map +0 -1
  503. package/dist/client/chunks/chart-config-tree-map-BI-oQStO.js.map +0 -1
  504. package/dist/client/chunks/chart-config-waterfall-DSnyixbI.js.map +0 -1
  505. package/dist/client/chunks/chart-data-table-Cm5jrpaw.js.map +0 -1
  506. package/dist/client/chunks/chart-funnel-Eke8IPtG.js.map +0 -1
  507. package/dist/client/chunks/chart-gauge-DeRZNsyl.js +0 -424
  508. package/dist/client/chunks/chart-gauge-DeRZNsyl.js.map +0 -1
  509. package/dist/client/chunks/chart-heat-map-C86thSJ4.js +0 -231
  510. package/dist/client/chunks/chart-heat-map-C86thSJ4.js.map +0 -1
  511. package/dist/client/chunks/chart-kpi-delta-CxOYD2f1.js +0 -343
  512. package/dist/client/chunks/chart-kpi-delta-CxOYD2f1.js.map +0 -1
  513. package/dist/client/chunks/chart-kpi-number-C6gWz-x4.js +0 -322
  514. package/dist/client/chunks/chart-kpi-number-C6gWz-x4.js.map +0 -1
  515. package/dist/client/chunks/chart-kpi-text-dDONrhS-.js +0 -149
  516. package/dist/client/chunks/chart-kpi-text-dDONrhS-.js.map +0 -1
  517. package/dist/client/chunks/chart-line-r4iWevKZ.js +0 -433
  518. package/dist/client/chunks/chart-line-r4iWevKZ.js.map +0 -1
  519. package/dist/client/chunks/chart-markdown-BPW-EAm9.js.map +0 -1
  520. package/dist/client/chunks/chart-pie-yqH2YVEI.js +0 -172
  521. package/dist/client/chunks/chart-pie-yqH2YVEI.js.map +0 -1
  522. package/dist/client/chunks/chart-radar-B-_3v-rE.js +0 -154
  523. package/dist/client/chunks/chart-radar-B-_3v-rE.js.map +0 -1
  524. package/dist/client/chunks/chart-radial-bar-C0EgzfAF.js +0 -148
  525. package/dist/client/chunks/chart-radial-bar-C0EgzfAF.js.map +0 -1
  526. package/dist/client/chunks/chart-scatter-DZPirzwX.js +0 -255
  527. package/dist/client/chunks/chart-scatter-DZPirzwX.js.map +0 -1
  528. package/dist/client/chunks/chart-tree-map-Bi4axCvh.js +0 -298
  529. package/dist/client/chunks/chart-tree-map-Bi4axCvh.js.map +0 -1
  530. package/dist/client/chunks/useDirtyStateTracking-B5wCDJSj.js.map +0 -1
  531. package/dist/server/google-DUlXeeDA.cjs +0 -2
  532. package/dist/server/openai-6wrBvAnv.cjs +0 -1
  533. package/dist/server/openai-BDwb2u7y.cjs +0 -17
  534. /package/dist/adapters/{express → adapters/express}/index.d.ts +0 -0
  535. /package/dist/adapters/{fastify → adapters/fastify}/index.d.ts +0 -0
  536. /package/dist/adapters/{hono → adapters/hono}/index.d.ts +0 -0
  537. /package/dist/adapters/{locale.d.ts → adapters/locale.d.ts} +0 -0
  538. /package/dist/adapters/{mcp-tools.d.ts → adapters/mcp-tools.d.ts} +0 -0
  539. /package/dist/adapters/{mcp-transport.d.ts → adapters/mcp-transport.d.ts} +0 -0
  540. /package/dist/adapters/{nextjs → adapters/nextjs}/index.d.ts +0 -0
  541. /package/dist/adapters/{types.d.ts → adapters/types.d.ts} +0 -0
@@ -0,0 +1,323 @@
1
+ import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
+ import { D as t, E as n, P as r, S as i, c as a, s as o, w as s } from "./chart-activity-grid-DX0SJbxs.js";
3
+ import { S as c, T as l, b as u, w as d, x as f } from "./chart-area-of01_62R.js";
4
+ import p, { useState as m } from "react";
5
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
6
+ import { Treemap as _ } from "recharts";
7
+ import { scaleOrdinal as v, scaleQuantize as y } from "d3";
8
+ //#region src/client/components/charts/TreeMapChart.helpers.ts
9
+ function b(e) {
10
+ return e ? Array.isArray(e) ? e[0] : e : "";
11
+ }
12
+ function x(e) {
13
+ return typeof e == "string" ? parseFloat(e) : e || 0;
14
+ }
15
+ function S(e) {
16
+ return typeof e == "string" ? parseFloat(e) : e;
17
+ }
18
+ function C(e, r, i, s) {
19
+ let c = b(r.xAxis), l = b(r.yAxis), u = Array.isArray(r.series) ? r.series[0] : r.series, d = t(i, c), f = (e) => n(e[c], d) || String(e[c]) || "Unknown";
20
+ if (!u) return {
21
+ treemapData: e.map((e, t) => ({
22
+ name: f(e),
23
+ size: x(e[l]),
24
+ fill: s?.colors && s.colors[t % s.colors.length] || o[t % o.length]
25
+ })),
26
+ isNumericSeries: !1,
27
+ seriesField: u
28
+ };
29
+ let p = e.map((e) => S(e[u])).filter((e) => !isNaN(e)), m = p.length === e.length && p.every((e) => typeof e == "number");
30
+ if (m) {
31
+ let t = y().domain([Math.min(...p), Math.max(...p)]).range(a);
32
+ return {
33
+ treemapData: e.map((e) => ({
34
+ name: f(e),
35
+ size: x(e[l]),
36
+ fill: t(S(e[u])),
37
+ series: String(e[u])
38
+ })),
39
+ isNumericSeries: m,
40
+ seriesField: u
41
+ };
42
+ }
43
+ let h = [...new Set(e.map((e) => String(e[u])))], g = v().domain(h).range(s?.colors || o);
44
+ return {
45
+ treemapData: e.map((e) => ({
46
+ name: f(e),
47
+ size: x(e[l]),
48
+ fill: g(String(e[u])),
49
+ series: String(e[u])
50
+ })),
51
+ isNumericSeries: m,
52
+ seriesField: u
53
+ };
54
+ }
55
+ function w(e) {
56
+ return typeof e == "boolean" ? e ? "Active" : "Inactive" : e === "true" || e === "false" ? e === "true" ? "Active" : "Inactive" : String(e);
57
+ }
58
+ function T(e, t) {
59
+ let n = e[0], r = Object.keys(n), i = r.find((e) => typeof n[e] == "string" || e.toLowerCase().includes("name") || e.toLowerCase().includes("label") || e.toLowerCase().includes("category")) || r[0], a = r.find((e) => e.toLowerCase().includes("size")) || r.find((e) => typeof n[e] == "number" && e !== i) || r[1];
60
+ return a ? {
61
+ treemapData: e.map((e, n) => ({
62
+ name: w(e[i]),
63
+ size: x(e[a]),
64
+ fill: t?.colors && t.colors[n % t.colors.length] || o[n % o.length]
65
+ })),
66
+ isNumericSeries: !1,
67
+ seriesField: void 0
68
+ } : null;
69
+ }
70
+ function E(e, t, n, r) {
71
+ let i = t?.xAxis && t?.yAxis ? C(e, t, n, r) : T(e, r);
72
+ return i ? {
73
+ ...i,
74
+ treemapData: i.treemapData.filter((e) => e.size != null && e.size > 0)
75
+ } : null;
76
+ }
77
+ function D(e, t) {
78
+ let n = e.map((e) => S(e[t]));
79
+ return {
80
+ min: Math.min(...n),
81
+ max: Math.max(...n)
82
+ };
83
+ }
84
+ function O(e, t) {
85
+ return t ? s(e, t) : e.toFixed(2);
86
+ }
87
+ function k(e, t, n, r, i, s) {
88
+ if (!n || !r) return [];
89
+ if (i) {
90
+ let { min: t, max: n } = D(e, r);
91
+ return a.map((e, r) => {
92
+ let i = r / (a.length - 1);
93
+ return {
94
+ value: O(t + (n - t) * i, s),
95
+ type: "rect",
96
+ color: e
97
+ };
98
+ });
99
+ }
100
+ let c = [...new Set(t.map((e) => e.series).filter(Boolean))];
101
+ return c.length > 1 ? c.map((e, t) => ({
102
+ value: e,
103
+ type: "rect",
104
+ color: o[t % o.length]
105
+ })) : [];
106
+ }
107
+ function A(e, t) {
108
+ return !t || typeof e == "string" && e.includes("%") ? e : typeof e == "number" ? e + 60 : `calc(${e} + 60px)`;
109
+ }
110
+ //#endregion
111
+ //#region src/client/components/charts/TreeMapContent.tsx
112
+ function j(e, t) {
113
+ return e === null ? .8 : e === t ? 1 : .6;
114
+ }
115
+ function M(e, t) {
116
+ return t ? s(e, t) : typeof e == "number" ? e.toLocaleString() : String(e);
117
+ }
118
+ function N({ treemapData: e, colorPalette: t, hoveredIndex: n, setHoveredIndex: r, leftYAxisFormat: i, drillEnabled: a, onDataPointClick: s, queryObject: c, chartConfig: l }) {
119
+ return function(u) {
120
+ let { x: d, y: f, width: p, height: m, index: _, name: v, size: y } = u;
121
+ return p < 20 || m < 20 ? null : /* @__PURE__ */ g("g", { children: [/* @__PURE__ */ h("rect", {
122
+ x: d,
123
+ y: f,
124
+ width: p,
125
+ height: m,
126
+ style: {
127
+ fill: e[_]?.fill || t?.colors && t.colors[_ % t.colors.length] || o[_ % o.length],
128
+ fillOpacity: j(n, _),
129
+ stroke: "#fff",
130
+ strokeWidth: 2,
131
+ cursor: a ? "pointer" : "default",
132
+ pointerEvents: "all"
133
+ },
134
+ onMouseEnter: () => r(_),
135
+ onMouseLeave: () => r(null),
136
+ onClick: a && s ? (t) => {
137
+ t.stopPropagation();
138
+ let n = e[_];
139
+ n && s && s({
140
+ dataPoint: n,
141
+ clickedField: c?.measures?.[0] || l?.yAxis?.[0] || "",
142
+ xValue: v,
143
+ position: {
144
+ x: t.clientX,
145
+ y: t.clientY
146
+ },
147
+ nativeEvent: t
148
+ });
149
+ } : void 0
150
+ }), /* @__PURE__ */ h("foreignObject", {
151
+ x: d,
152
+ y: f,
153
+ width: p,
154
+ height: m,
155
+ style: {
156
+ pointerEvents: "none",
157
+ overflow: "visible"
158
+ },
159
+ children: /* @__PURE__ */ g("div", {
160
+ style: {
161
+ width: "100%",
162
+ height: "100%",
163
+ display: "flex",
164
+ flexDirection: "column",
165
+ alignItems: "center",
166
+ justifyContent: "center",
167
+ padding: "4px",
168
+ boxSizing: "border-box",
169
+ color: "#ffffff",
170
+ textShadow: "0 1px 2px rgba(0,0,0,0.8)",
171
+ fontFamily: "system-ui, -apple-system, sans-serif",
172
+ overflow: "hidden"
173
+ },
174
+ children: [p > 40 && m > 30 && /* @__PURE__ */ h("div", {
175
+ style: {
176
+ fontSize: `${Math.max(10, Math.min(p / 8, m / 8, 16))}px`,
177
+ fontWeight: "600",
178
+ textAlign: "center",
179
+ lineHeight: "1.2",
180
+ marginBottom: p > 60 && m > 45 ? "4px" : "0",
181
+ wordBreak: "break-word",
182
+ hyphens: "auto"
183
+ },
184
+ children: v
185
+ }), p > 60 && m > 45 && /* @__PURE__ */ h("div", {
186
+ style: {
187
+ fontSize: `${Math.max(8, Math.min(p / 10, m / 10, 14))}px`,
188
+ textAlign: "center",
189
+ opacity: .9
190
+ },
191
+ children: M(y, i)
192
+ })]
193
+ })
194
+ })] });
195
+ };
196
+ }
197
+ //#endregion
198
+ //#region src/client/components/charts/TreeMapLegend.tsx
199
+ function P({ seriesLabel: e, data: t, seriesField: n, leftYAxisFormat: r }) {
200
+ let { min: i, max: o } = D(t, n);
201
+ return /* @__PURE__ */ g("div", {
202
+ className: "dc:flex dc:flex-col dc:items-center",
203
+ children: [/* @__PURE__ */ h("div", {
204
+ className: "dc:text-xs dc:font-semibold text-dc-text-primary dc:mb-2",
205
+ children: e
206
+ }), /* @__PURE__ */ g("div", {
207
+ className: "dc:flex dc:items-center dc:gap-2",
208
+ children: [
209
+ /* @__PURE__ */ h("span", {
210
+ className: "dc:text-xs text-dc-text-muted",
211
+ children: O(i, r)
212
+ }),
213
+ /* @__PURE__ */ h("div", {
214
+ className: "dc:h-4 dc:rounded-sm",
215
+ style: {
216
+ width: "200px",
217
+ background: `linear-gradient(to right, ${a.join(", ")})`
218
+ }
219
+ }),
220
+ /* @__PURE__ */ h("span", {
221
+ className: "dc:text-xs text-dc-text-muted",
222
+ children: O(o, r)
223
+ })
224
+ ]
225
+ })]
226
+ });
227
+ }
228
+ function F({ legendPayload: e }) {
229
+ return /* @__PURE__ */ h("div", {
230
+ className: "dc:flex dc:flex-wrap dc:justify-center dc:gap-4",
231
+ children: e.map((e, t) => /* @__PURE__ */ g("div", {
232
+ className: "dc:flex dc:items-center dc:gap-2",
233
+ children: [/* @__PURE__ */ h("div", {
234
+ className: "dc:w-3 dc:h-3 rounded-xs",
235
+ style: { backgroundColor: e.color }
236
+ }), /* @__PURE__ */ h("span", {
237
+ className: "dc:text-xs text-dc-text-muted",
238
+ children: e.value
239
+ })]
240
+ }, t))
241
+ });
242
+ }
243
+ function I({ isNumericSeries: e, seriesField: t, seriesLabel: n, legendPayload: r, data: i, leftYAxisFormat: a }) {
244
+ return /* @__PURE__ */ h("div", {
245
+ className: "dc:flex dc:justify-center dc:items-center dc:mt-4 dc:pb-2",
246
+ children: e && t ? /* @__PURE__ */ h(P, {
247
+ seriesLabel: n,
248
+ data: i,
249
+ seriesField: t,
250
+ leftYAxisFormat: a
251
+ }) : /* @__PURE__ */ h(F, { legendPayload: r })
252
+ });
253
+ }
254
+ //#endregion
255
+ //#region src/client/components/charts/TreeMapChart.tsx
256
+ var L = /* @__PURE__ */ e({ default: () => R }), R = p.memo(function({ data: e, chartConfig: t, displayConfig: n = {}, queryObject: a, height: o = "100%", colorPalette: p, onDataPointClick: v, drillEnabled: y }) {
257
+ let { t: b } = r(), [x, S] = m(null), C = i();
258
+ try {
259
+ let r = {
260
+ showTooltip: n?.showTooltip ?? !0,
261
+ showLegend: n?.showLegend ?? !0,
262
+ leftYAxisFormat: n?.leftYAxisFormat
263
+ };
264
+ if (!e || e.length === 0) return /* @__PURE__ */ h(f, {
265
+ height: o,
266
+ hint: b("chart.runtime.noDataHint.treemap")
267
+ });
268
+ let i = E(e, t, a, p);
269
+ if (!i) return /* @__PURE__ */ h(u, {
270
+ height: o,
271
+ hint: b("chart.runtime.configErrorHint.treemapNumeric")
272
+ });
273
+ let { treemapData: c, isNumericSeries: m, seriesField: w } = i;
274
+ if (c.length === 0) return /* @__PURE__ */ h(f, {
275
+ height: o,
276
+ titleKey: "chart.runtime.noValidData",
277
+ hint: "No valid data points for treemap chart after transformation"
278
+ });
279
+ let T = N({
280
+ treemapData: c,
281
+ colorPalette: p,
282
+ hoveredIndex: x,
283
+ setHoveredIndex: S,
284
+ leftYAxisFormat: r.leftYAxisFormat,
285
+ drillEnabled: y,
286
+ onDataPointClick: v,
287
+ queryObject: a,
288
+ chartConfig: t
289
+ }), D = k(e, c, r.showLegend, w, m, r.leftYAxisFormat), O = r.showLegend && D.length > 0;
290
+ return /* @__PURE__ */ g("div", {
291
+ className: "dc:w-full",
292
+ style: { height: A(o, O) },
293
+ children: [/* @__PURE__ */ h(l, {
294
+ height: O ? "calc(100% - 50px)" : "100%",
295
+ children: /* @__PURE__ */ h(_, {
296
+ data: c,
297
+ dataKey: "size",
298
+ aspectRatio: 4 / 3,
299
+ stroke: "#fff",
300
+ content: /* @__PURE__ */ h(T, {}),
301
+ children: r.showTooltip && /* @__PURE__ */ h(d, { formatter: r.leftYAxisFormat ? (e, t) => [s(e, r.leftYAxisFormat), t] : void 0 })
302
+ })
303
+ }), O && /* @__PURE__ */ h(I, {
304
+ isNumericSeries: m,
305
+ seriesField: w,
306
+ seriesLabel: w ? C(w) : "",
307
+ legendPayload: D,
308
+ data: e,
309
+ leftYAxisFormat: r.leftYAxisFormat
310
+ })]
311
+ });
312
+ } catch (e) {
313
+ return /* @__PURE__ */ h(c, {
314
+ height: o,
315
+ chartType: "TreeMap Chart",
316
+ error: e
317
+ });
318
+ }
319
+ });
320
+ //#endregion
321
+ export { L as n, R as t };
322
+
323
+ //# sourceMappingURL=chart-tree-map-Ceq5sLZA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-tree-map-Ceq5sLZA.js","names":[],"sources":["../../../src/client/components/charts/TreeMapChart.helpers.ts","../../../src/client/components/charts/TreeMapContent.tsx","../../../src/client/components/charts/TreeMapLegend.tsx","../../../src/client/components/charts/TreeMapChart.tsx"],"sourcesContent":["/**\n * Co-located helpers for TreeMapChart.\n *\n * Pure data-shaping + legend computation extracted from the component. No\n * behaviour change — mirrors the original inline logic exactly.\n */\nimport { scaleQuantize, scaleOrdinal } from 'd3'\nimport { CHART_COLORS, CHART_COLORS_GRADIENT } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport type { AxisFormatConfig, ChartAxisConfig, ColorPalette, CubeQuery } from '../../types'\n\nexport interface TreemapDatum {\n name: string\n size: number\n fill?: string\n series?: string\n // Index signature so the rows satisfy recharts' Treemap data + drill payloads\n [key: string]: unknown\n}\n\n/** First element of a config field that may be a string, string[] or undefined. */\nfunction pickField(value: string | string[] | undefined): string {\n if (!value) return ''\n return Array.isArray(value) ? value[0] : value\n}\n\n/** Coerce a possibly-string numeric cell to a number (NaN-safe via fallback). */\nfunction toNumber(value: unknown): number {\n return typeof value === 'string' ? parseFloat(value) : ((value as number) || 0)\n}\n\n/** Numeric value of a series cell (string or number), used for colour scaling. */\nfunction seriesNumber(value: unknown): number {\n return typeof value === 'string' ? parseFloat(value) : (value as number)\n}\n\nexport interface TreemapBuildResult {\n treemapData: TreemapDatum[]\n isNumericSeries: boolean\n seriesField?: string\n}\n\n/** Build treemap rows from the new (configured) chart config format. */\nfunction buildFromConfig(\n data: Record<string, any>[],\n chartConfig: ChartAxisConfig,\n queryObject: CubeQuery | undefined,\n colorPalette: ColorPalette | undefined\n): TreemapBuildResult {\n const xAxisField = pickField(chartConfig.xAxis)\n const yAxisField = pickField(chartConfig.yAxis)\n const seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series\n const granularity = getFieldGranularity(queryObject, xAxisField)\n\n const nameOf = (item: Record<string, any>) =>\n formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown'\n\n if (!seriesField) {\n // No series grouping - use index-based colors\n const treemapData = data.map((item, index) => ({\n name: nameOf(item),\n size: toNumber(item[yAxisField]),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }))\n return { treemapData, isNumericSeries: false, seriesField }\n }\n\n // Check if series field is numeric for color scaling\n const seriesValues = data\n .map((item) => seriesNumber(item[seriesField]))\n .filter((val) => !isNaN(val))\n const isNumericSeries =\n seriesValues.length === data.length && seriesValues.every((val) => typeof val === 'number')\n\n if (isNumericSeries) {\n const colorScale = scaleQuantize<string>()\n .domain([Math.min(...seriesValues), Math.max(...seriesValues)])\n .range(CHART_COLORS_GRADIENT)\n const treemapData = data.map((item) => ({\n name: nameOf(item),\n size: toNumber(item[yAxisField]),\n fill: colorScale(seriesNumber(item[seriesField])),\n series: String(item[seriesField])\n }))\n return { treemapData, isNumericSeries, seriesField }\n }\n\n const uniqueSeriesValues = [...new Set(data.map((item) => String(item[seriesField])))]\n const colorScale = scaleOrdinal<string>()\n .domain(uniqueSeriesValues)\n .range(colorPalette?.colors || CHART_COLORS)\n const treemapData = data.map((item) => ({\n name: nameOf(item),\n size: toNumber(item[yAxisField]),\n fill: colorScale(String(item[seriesField])),\n series: String(item[seriesField])\n }))\n return { treemapData, isNumericSeries, seriesField }\n}\n\n/** Resolve a friendly name for a legacy/auto-detected row. */\nfunction legacyName(value: unknown): string {\n if (typeof value === 'boolean') return value ? 'Active' : 'Inactive'\n if (value === 'true' || value === 'false') return value === 'true' ? 'Active' : 'Inactive'\n return String(value)\n}\n\n/** Build treemap rows by auto-detecting name/size fields (legacy format). */\nfunction buildFromAutoDetect(\n data: Record<string, any>[],\n colorPalette: ColorPalette | undefined\n): TreemapBuildResult | null {\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n\n const nameField =\n keys.find(\n (key) =>\n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n const sizeField =\n keys.find((key) => key.toLowerCase().includes('size')) ||\n keys.find((key) => typeof firstRow[key] === 'number' && key !== nameField) ||\n keys[1]\n\n if (!sizeField) return null\n\n const treemapData = data.map((item, index) => ({\n name: legacyName(item[nameField]),\n size: toNumber(item[sizeField]),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }))\n return { treemapData, isNumericSeries: false, seriesField: undefined }\n}\n\n/**\n * Build treemap data (config or auto-detect), then drop non-positive sizes.\n * Returns `null` when the legacy path can't find a usable size field.\n */\nexport function buildTreemapData(\n data: Record<string, any>[],\n chartConfig: ChartAxisConfig | undefined,\n queryObject: CubeQuery | undefined,\n colorPalette: ColorPalette | undefined\n): TreemapBuildResult | null {\n const result =\n chartConfig?.xAxis && chartConfig?.yAxis\n ? buildFromConfig(data, chartConfig, queryObject, colorPalette)\n : buildFromAutoDetect(data, colorPalette)\n\n if (!result) return null\n\n return {\n ...result,\n treemapData: result.treemapData.filter((item) => item.size != null && item.size > 0)\n }\n}\n\n/** Min/max of the (numeric) series field across the raw rows. */\nexport function seriesMinMax(\n data: Record<string, any>[],\n seriesField: string\n): { min: number; max: number } {\n const values = data.map((item) => seriesNumber(item[seriesField]))\n return { min: Math.min(...values), max: Math.max(...values) }\n}\n\n/** Format a numeric value with the optional axis format (or `.toFixed(2)`). */\nexport function formatSeriesValue(value: number, format: AxisFormatConfig | undefined): string {\n return format ? formatAxisValue(value, format) : value.toFixed(2)\n}\n\nexport interface LegendEntry {\n value: string\n type: 'rect'\n color: string\n}\n\n/**\n * Build the legend entries for the treemap: a gradient ramp for numeric series,\n * or discrete swatches for categorical series. Empty when not applicable.\n */\nexport function buildTreemapLegend(\n data: Record<string, any>[],\n treemapData: TreemapDatum[],\n showLegend: boolean,\n seriesField: string | undefined,\n isNumericSeries: boolean,\n leftYAxisFormat: AxisFormatConfig | undefined\n): LegendEntry[] {\n if (!showLegend || !seriesField) return []\n\n if (isNumericSeries) {\n const { min, max } = seriesMinMax(data, seriesField)\n return CHART_COLORS_GRADIENT.map((color, index) => {\n const ratio = index / (CHART_COLORS_GRADIENT.length - 1)\n const value = min + (max - min) * ratio\n return { value: formatSeriesValue(value, leftYAxisFormat), type: 'rect' as const, color }\n })\n }\n\n const uniqueSeries = [...new Set(treemapData.map((item) => item.series).filter(Boolean))]\n if (uniqueSeries.length > 1) {\n return uniqueSeries.map((series, index) => ({\n value: series as string,\n type: 'rect' as const,\n color: CHART_COLORS[index % CHART_COLORS.length]\n }))\n }\n return []\n}\n\n/** Adjust the outer container height to make room for a legend, if present. */\nexport function adjustHeightForLegend(\n height: string | number,\n hasLegend: boolean\n): string | number {\n if (!hasLegend) return height\n if (typeof height === 'string' && height.includes('%')) return height\n if (typeof height === 'number') return height + 60\n return `calc(${height} + 60px)`\n}\n","import React from 'react'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport type { AxisFormatConfig, ChartAxisConfig, ColorPalette, CubeQuery } from '../../types'\nimport type { ChartDataPointClickEvent } from '../../types/drill'\nimport type { TreemapDatum } from './TreeMapChart.helpers'\n\ninterface TreeMapContentOptions {\n treemapData: TreemapDatum[]\n colorPalette?: ColorPalette\n hoveredIndex: number | null\n setHoveredIndex: (index: number | null) => void\n leftYAxisFormat?: AxisFormatConfig\n drillEnabled?: boolean\n onDataPointClick?: (event: ChartDataPointClickEvent) => void\n queryObject?: CubeQuery\n chartConfig?: ChartAxisConfig\n}\n\n/** Fill opacity for a treemap cell given the currently hovered index. */\nfunction cellOpacity(hoveredIndex: number | null, index: number): number {\n if (hoveredIndex === null) return 0.8\n return hoveredIndex === index ? 1 : 0.6\n}\n\n/** Format the size label shown inside a treemap cell. */\nfunction formatSize(size: unknown, format: AxisFormatConfig | undefined): string {\n if (format) return formatAxisValue(size as number, format)\n return typeof size === 'number' ? size.toLocaleString() : String(size)\n}\n\n/**\n * Build the Recharts `content` renderer for treemap cells.\n *\n * Encapsulates the per-cell rect + foreignObject overlay, hover state and drill\n * click handler that previously lived inline in TreeMapChart (the highest-\n * complexity hot spots). Behaviour is identical to the original.\n */\nexport function makeTreeMapContent({\n treemapData,\n colorPalette,\n hoveredIndex,\n setHoveredIndex,\n leftYAxisFormat,\n drillEnabled,\n onDataPointClick,\n queryObject,\n chartConfig,\n}: TreeMapContentOptions) {\n return function CustomizedContent(props: any) {\n const { x, y, width, height, index, name, size } = props\n\n if (width < 20 || height < 20) return null // Skip very small cells\n\n const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation()\n const cellData = treemapData[index]\n if (cellData && onDataPointClick) {\n // Use query measures for proper field name (chartConfig.yAxis may hold labels)\n const measureField = queryObject?.measures?.[0] || chartConfig?.yAxis?.[0] || ''\n onDataPointClick({\n dataPoint: cellData,\n clickedField: measureField,\n xValue: name,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event\n })\n }\n }\n\n const fill =\n treemapData[index]?.fill ||\n ((colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length])\n\n return (\n <g>\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n style={{\n fill,\n fillOpacity: cellOpacity(hoveredIndex, index),\n stroke: '#fff',\n strokeWidth: 2,\n cursor: drillEnabled ? 'pointer' : 'default',\n pointerEvents: 'all'\n }}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={drillEnabled && onDataPointClick ? handleClick : undefined}\n />\n <foreignObject\n x={x}\n y={y}\n width={width}\n height={height}\n style={{ pointerEvents: 'none', overflow: 'visible' }}\n >\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '4px',\n boxSizing: 'border-box',\n color: '#ffffff',\n textShadow: '0 1px 2px rgba(0,0,0,0.8)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n overflow: 'hidden'\n }}\n >\n {width > 40 && height > 30 && (\n <div\n style={{\n fontSize: `${Math.max(10, Math.min(width / 8, height / 8, 16))}px`,\n fontWeight: '600',\n textAlign: 'center',\n lineHeight: '1.2',\n marginBottom: width > 60 && height > 45 ? '4px' : '0',\n wordBreak: 'break-word',\n hyphens: 'auto'\n }}\n >\n {name}\n </div>\n )}\n {width > 60 && height > 45 && (\n <div\n style={{\n fontSize: `${Math.max(8, Math.min(width / 10, height / 10, 14))}px`,\n textAlign: 'center',\n opacity: 0.9\n }}\n >\n {formatSize(size, leftYAxisFormat)}\n </div>\n )}\n </div>\n </foreignObject>\n </g>\n )\n }\n}\n","import { CHART_COLORS_GRADIENT } from '../../utils/chartConstants'\nimport type { AxisFormatConfig } from '../../types'\nimport {\n seriesMinMax,\n formatSeriesValue,\n type LegendEntry\n} from './TreeMapChart.helpers'\n\ninterface TreeMapLegendProps {\n isNumericSeries: boolean\n seriesField?: string\n seriesLabel: string\n legendPayload: LegendEntry[]\n data: Record<string, any>[]\n leftYAxisFormat?: AxisFormatConfig\n}\n\n/** Gradient ramp legend for a numeric series field. */\nfunction NumericLegend({\n seriesLabel,\n data,\n seriesField,\n leftYAxisFormat,\n}: {\n seriesLabel: string\n data: Record<string, any>[]\n seriesField: string\n leftYAxisFormat?: AxisFormatConfig\n}) {\n const { min, max } = seriesMinMax(data, seriesField)\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center\">\n <div className=\"dc:text-xs dc:font-semibold text-dc-text-primary dc:mb-2\">\n {seriesLabel}\n </div>\n <div className=\"dc:flex dc:items-center dc:gap-2\">\n <span className=\"dc:text-xs text-dc-text-muted\">\n {formatSeriesValue(min, leftYAxisFormat)}\n </span>\n <div\n className=\"dc:h-4 dc:rounded-sm\"\n style={{\n width: '200px',\n background: `linear-gradient(to right, ${CHART_COLORS_GRADIENT.join(', ')})`\n }}\n />\n <span className=\"dc:text-xs text-dc-text-muted\">\n {formatSeriesValue(max, leftYAxisFormat)}\n </span>\n </div>\n </div>\n )\n}\n\n/** Discrete swatch legend for a categorical series field. */\nfunction CategoricalLegend({ legendPayload }: { legendPayload: LegendEntry[] }) {\n return (\n <div className=\"dc:flex dc:flex-wrap dc:justify-center dc:gap-4\">\n {legendPayload.map((item, index) => (\n <div key={index} className=\"dc:flex dc:items-center dc:gap-2\">\n <div className=\"dc:w-3 dc:h-3 rounded-xs\" style={{ backgroundColor: item.color }} />\n <span className=\"dc:text-xs text-dc-text-muted\">{item.value}</span>\n </div>\n ))}\n </div>\n )\n}\n\n/** Treemap legend wrapper — gradient for numeric series, swatches otherwise. */\nexport function TreeMapLegend({\n isNumericSeries,\n seriesField,\n seriesLabel,\n legendPayload,\n data,\n leftYAxisFormat,\n}: TreeMapLegendProps) {\n return (\n <div className=\"dc:flex dc:justify-center dc:items-center dc:mt-4 dc:pb-2\">\n {isNumericSeries && seriesField ? (\n <NumericLegend\n seriesLabel={seriesLabel}\n data={data}\n seriesField={seriesField}\n leftYAxisFormat={leftYAxisFormat}\n />\n ) : (\n <CategoricalLegend legendPayload={legendPayload} />\n )}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { Treemap } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { ChartEmptyState, ChartConfigError, ChartRenderError } from './ChartStates'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport {\n buildTreemapData,\n buildTreemapLegend,\n adjustHeightForLegend\n} from './TreeMapChart.helpers'\nimport { makeTreeMapContent } from './TreeMapContent'\nimport { TreeMapLegend } from './TreeMapLegend'\nimport type { ChartProps } from '../../types'\n\nconst TreeMapChart = React.memo(function TreeMapChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette,\n onDataPointClick,\n drillEnabled\n}: ChartProps) {\n const { t } = useTranslation()\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n try {\n const safeDisplayConfig = {\n showTooltip: displayConfig?.showTooltip ?? true,\n showLegend: displayConfig?.showLegend ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return <ChartEmptyState height={height} hint={t('chart.runtime.noDataHint.treemap')} />\n }\n\n // Build treemap rows (config or auto-detect) — null means no usable size field\n const built = buildTreemapData(data, chartConfig, queryObject, colorPalette)\n if (!built) {\n return <ChartConfigError height={height} hint={t('chart.runtime.configErrorHint.treemapNumeric')} />\n }\n\n const { treemapData, isNumericSeries, seriesField } = built\n\n if (treemapData.length === 0) {\n return (\n <ChartEmptyState\n height={height}\n titleKey=\"chart.runtime.noValidData\"\n hint=\"No valid data points for treemap chart after transformation\"\n />\n )\n }\n\n // Custom content renderer for treemap cells with HTML overlays\n const CustomizedContent = makeTreeMapContent({\n treemapData,\n colorPalette,\n hoveredIndex,\n setHoveredIndex,\n leftYAxisFormat: safeDisplayConfig.leftYAxisFormat,\n drillEnabled,\n onDataPointClick,\n queryObject,\n chartConfig\n })\n\n // Build legend payload (gradient for numeric series, swatches otherwise)\n const legendPayload = buildTreemapLegend(\n data,\n treemapData,\n safeDisplayConfig.showLegend,\n seriesField,\n isNumericSeries,\n safeDisplayConfig.leftYAxisFormat\n )\n\n const hasLegend = safeDisplayConfig.showLegend && legendPayload.length > 0\n const adjustedHeight = adjustHeightForLegend(height, hasLegend)\n\n return (\n <div className=\"dc:w-full\" style={{ height: adjustedHeight }}>\n <ChartContainer height={hasLegend ? `calc(100% - 50px)` : \"100%\"}>\n <Treemap\n data={treemapData}\n dataKey=\"size\"\n aspectRatio={4 / 3}\n stroke=\"#fff\"\n content={<CustomizedContent />}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n </Treemap>\n </ChartContainer>\n\n {/* Custom Legend outside ChartContainer */}\n {hasLegend && (\n <TreeMapLegend\n isNumericSeries={isNumericSeries}\n seriesField={seriesField}\n seriesLabel={seriesField ? getFieldLabel(seriesField) : ''}\n legendPayload={legendPayload}\n data={data}\n leftYAxisFormat={safeDisplayConfig.leftYAxisFormat}\n />\n )}\n </div>\n )\n } catch (error) {\n // 'TreeMapChart rendering error\n return <ChartRenderError height={height} chartType=\"TreeMap Chart\" error={error} />\n }\n})\n\nexport default TreeMapChart\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { n as e } from "./rolldown-runtime-CWhphoD1.js";
2
- import { _ as t, i as n, k as r, y as i } from "./chart-activity-grid-CiHrLH6Y.js";
3
- import { c as a, l as o, s } from "./chart-area-CXFK-Grv.js";
2
+ import { P as t, S as n, l as r, w as i } from "./chart-activity-grid-DX0SJbxs.js";
3
+ import { C as a, T as o, w as s } from "./chart-area-of01_62R.js";
4
4
  import c, { useMemo as l } from "react";
5
5
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
6
6
  import { Bar as f, CartesianGrid as p, Cell as m, ComposedChart as h, LabelList as g, Legend as _, Line as v, XAxis as y, YAxis as b } from "recharts";
@@ -47,7 +47,7 @@ function D(e) {
47
47
  });
48
48
  }
49
49
  var O = c.memo(function({ data: e, chartConfig: c, displayConfig: x = {}, height: O = "100%", onDataPointClick: k, drillEnabled: A }) {
50
- let { t: j } = r(), M = t(), N = x?.showTotal ?? !0, P = x?.showConnectorLine ?? !0, F = x?.showDataLabels ?? !1, I = x?.leftYAxisFormat, { xAxisField: L, yAxisField: R, configError: z } = l(() => {
50
+ let { t: j } = t(), M = n(), N = x?.showTotal ?? !0, P = x?.showConnectorLine ?? !0, F = x?.showDataLabels ?? !1, I = x?.leftYAxisFormat, { xAxisField: L, yAxisField: R, configError: z } = l(() => {
51
51
  let e = Array.isArray(c?.xAxis) ? c.xAxis[0] : c?.x, t = Array.isArray(c?.yAxis) ? c.yAxis[0] : c?.y?.[0];
52
52
  return {
53
53
  xAxisField: e,
@@ -106,7 +106,7 @@ var O = c.memo(function({ data: e, chartConfig: c, displayConfig: x = {}, height
106
106
  children: /* @__PURE__ */ d(h, {
107
107
  data: H,
108
108
  margin: {
109
- ...n,
109
+ ...r,
110
110
  left: 40
111
111
  },
112
112
  accessibilityLayer: !1,
@@ -118,14 +118,14 @@ var O = c.memo(function({ data: e, chartConfig: c, displayConfig: x = {}, height
118
118
  /* @__PURE__ */ u(y, {
119
119
  dataKey: "label",
120
120
  type: "category",
121
- tick: /* @__PURE__ */ u(s, {}),
121
+ tick: /* @__PURE__ */ u(a, {}),
122
122
  height: 60
123
123
  }),
124
124
  /* @__PURE__ */ u(b, {
125
125
  tick: { fontSize: 12 },
126
126
  tickFormatter: I ? (e) => i(e, I) : void 0
127
127
  }),
128
- /* @__PURE__ */ u(a, {
128
+ /* @__PURE__ */ u(s, {
129
129
  formatter: (e, t, n) => {
130
130
  if (t === "_connector") return ["", ""];
131
131
  let r = n?.payload;
@@ -234,4 +234,4 @@ var O = c.memo(function({ data: e, chartConfig: c, displayConfig: x = {}, height
234
234
  //#endregion
235
235
  export { x as t };
236
236
 
237
- //# sourceMappingURL=chart-waterfall-DcHbbPaG.js.map
237
+ //# sourceMappingURL=chart-waterfall-DyvQReN5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-waterfall-DcHbbPaG.js","names":[],"sources":["../../../src/client/components/charts/WaterfallChart.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { ComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid, Cell, LabelList, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport AngledXAxisTick from './AngledXAxisTick'\nimport { CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst POSITIVE_COLOR = '#22c55e'\nconst NEGATIVE_COLOR = '#ef4444'\nconst TOTAL_COLOR = '#6366f1'\nconst CONNECTOR_COLOR = '#94a3b8'\n\ninterface WaterfallDataPoint {\n label: string\n value: number\n runningBase: number\n isTotal: boolean\n isNegative: boolean\n displayValue: number\n originalIndex: number\n}\n\nfunction transformToWaterfall(\n data: Record<string, unknown>[],\n xField: string,\n yField: string,\n showTotal: boolean,\n getFieldLabel: (field: string) => string\n): WaterfallDataPoint[] {\n let running = 0\n const result: WaterfallDataPoint[] = data.map((row, i) => {\n const label = String(row[xField] ?? `Row ${i + 1}`)\n const rawValue = row[yField]\n const parsed = typeof rawValue === 'number' ? rawValue : parseFloat(String(rawValue ?? ''))\n const value = isNaN(parsed) ? 0 : parsed\n const isNegative = value < 0\n const base = isNegative ? running + value : running\n const point: WaterfallDataPoint = {\n label,\n value: Math.abs(value),\n runningBase: base,\n isTotal: false,\n isNegative,\n displayValue: value,\n originalIndex: i,\n }\n running += value\n return point\n })\n\n if (showTotal) {\n const totalLabel = getFieldLabel(yField) || 'Total'\n result.push({\n label: totalLabel,\n value: Math.abs(running),\n runningBase: running >= 0 ? 0 : running,\n isTotal: true,\n isNegative: running < 0,\n displayValue: running,\n originalIndex: result.length,\n })\n }\n\n return result\n}\n\ninterface ValueLabelProps {\n x?: number\n y?: number\n width?: number\n value?: number\n isNegative?: boolean\n displayValue?: number\n}\n\nfunction ValueLabel(props: ValueLabelProps) {\n const { x = 0, y = 0, width = 0, value = 0, isNegative, displayValue } = props\n if (displayValue === undefined || displayValue === null) return null\n const numericValue = Number(displayValue)\n const isNeg = isNegative || numericValue < 0\n const yPos = isNeg ? y + value + 14 : y - 6\n return (\n <text\n x={x + width / 2}\n y={yPos}\n fill=\"currentColor\"\n textAnchor=\"middle\"\n fontSize={11}\n >\n {numericValue >= 0 ? '+' : ''}{numericValue.toLocaleString()}\n </text>\n )\n}\n\nconst WaterfallChart = React.memo(function WaterfallChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n onDataPointClick,\n drillEnabled,\n}: ChartProps) {\n const { t } = useTranslation()\n const getFieldLabel = useCubeFieldLabel()\n\n const showTotal = displayConfig?.showTotal ?? true\n const showConnectorLine = displayConfig?.showConnectorLine ?? true\n const showDataLabels = displayConfig?.showDataLabels ?? false\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const { xAxisField, yAxisField, configError } = useMemo(() => {\n const xAxisField: string | undefined = Array.isArray(chartConfig?.xAxis)\n ? chartConfig.xAxis[0]\n : chartConfig?.x\n const yAxisField: string | undefined = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis[0]\n : chartConfig?.y?.[0]\n const configError =\n !xAxisField || !yAxisField\n ? 'Waterfall chart requires an X-axis dimension and a Y-axis measure'\n : null\n return { xAxisField, yAxisField, configError }\n }, [chartConfig])\n\n const waterfallData = useMemo(() => {\n if (configError || !data || data.length === 0 || !xAxisField || !yAxisField) return []\n return transformToWaterfall(\n data as Record<string, unknown>[],\n xAxisField,\n yAxisField,\n showTotal,\n getFieldLabel\n )\n }, [data, xAxisField, yAxisField, showTotal, getFieldLabel, configError])\n\n const connectorData = useMemo(() => {\n if (!showConnectorLine || waterfallData.length === 0) return []\n return waterfallData.map((d) => {\n const connectorY = d.isNegative ? d.runningBase : d.runningBase + d.value\n return { label: d.label, _connector: connectorY }\n })\n }, [waterfallData, showConnectorLine])\n\n const chartData = useMemo(() => {\n return waterfallData.map((d, i) => ({\n ...d,\n _connector: connectorData[i]?._connector,\n }))\n }, [waterfallData, connectorData])\n\n try {\n if (!data || data.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.noDataHint.waterfall')}</div>\n </div>\n </div>\n )\n }\n\n if (configError) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.configError')}</div>\n <div className=\"dc:text-xs\">{configError}</div>\n </div>\n </div>\n )\n }\n return (\n <div className=\"dc:relative dc:w-full\" style={{ height }}>\n <ChartContainer height=\"100%\">\n <ComposedChart data={chartData} margin={{ ...CHART_MARGINS, left: 40 }} accessibilityLayer={false}>\n <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />\n <XAxis dataKey=\"label\" type=\"category\" tick={<AngledXAxisTick />} height={60} />\n <YAxis\n tick={{ fontSize: 12 }}\n tickFormatter={yAxisFormat ? (v) => formatAxisValue(v, yAxisFormat) : undefined}\n />\n <ChartTooltip\n formatter={(value: any, name: any, props: any) => {\n if (name === '_connector') return ['', '']\n const entry = props?.payload\n if (!entry) return [value, name]\n const displayValue = entry.displayValue ?? value\n return [\n yAxisFormat ? formatAxisValue(displayValue, yAxisFormat) : displayValue?.toLocaleString?.() ?? displayValue,\n entry.isTotal ? 'Total' : entry.isNegative ? 'Decrease' : 'Increase',\n ]\n }}\n labelFormatter={(label: string) => label}\n />\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '8px' }}\n {...{\n payload: [\n { value: 'Increase', type: 'rect' as const, color: POSITIVE_COLOR },\n { value: 'Decrease', type: 'rect' as const, color: NEGATIVE_COLOR },\n ...(showTotal ? [{ value: 'Total', type: 'rect' as const, color: TOTAL_COLOR }] : []),\n ],\n }}\n />\n <Bar dataKey=\"runningBase\" stackId=\"wf\" fill=\"transparent\" legendType=\"none\" isAnimationActive={false} />\n <Bar\n dataKey=\"value\"\n stackId=\"wf\"\n isAnimationActive={false}\n cursor={drillEnabled ? 'pointer' : undefined}\n onClick={(barData: any, _index: number, event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled && barData && !barData.isTotal) {\n onDataPointClick({\n dataPoint: barData,\n clickedField: yAxisField!,\n xValue: barData.label,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event,\n })\n }\n }}\n >\n {showDataLabels && (\n <LabelList\n dataKey=\"displayValue\"\n content={(props: any) => (\n <ValueLabel\n {...props}\n runningBase={chartData[props.index]?.runningBase}\n isNegative={chartData[props.index]?.isNegative}\n displayValue={chartData[props.index]?.displayValue}\n />\n )}\n />\n )}\n {chartData.map((entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={entry.isTotal ? TOTAL_COLOR : entry.isNegative ? NEGATIVE_COLOR : POSITIVE_COLOR}\n />\n ))}\n </Bar>\n {showConnectorLine && (\n <Line\n type=\"stepAfter\"\n dataKey=\"_connector\"\n stroke={CONNECTOR_COLOR}\n strokeWidth={1.5}\n strokeDasharray=\"4 2\"\n dot={false}\n activeDot={false}\n legendType=\"none\"\n isAnimationActive={false}\n />\n )}\n </ComposedChart>\n </ChartContainer>\n </div>\n )\n } catch (error) {\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.chartError', { chartType: 'Waterfall Chart' })}</div>\n <div className=\"dc:text-xs dc:mb-2\">{error instanceof Error ? error.message : t('chart.runtime.unknownError')}</div>\n <div className=\"dc:text-xs text-dc-text-muted\">{t('chart.runtime.checkConfig')}</div>\n </div>\n </div>\n )\n }\n})\n\nexport default WaterfallChart\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-waterfall-DyvQReN5.js","names":[],"sources":["../../../src/client/components/charts/WaterfallChart.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { ComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid, Cell, LabelList, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport AngledXAxisTick from './AngledXAxisTick'\nimport { CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst POSITIVE_COLOR = '#22c55e'\nconst NEGATIVE_COLOR = '#ef4444'\nconst TOTAL_COLOR = '#6366f1'\nconst CONNECTOR_COLOR = '#94a3b8'\n\ninterface WaterfallDataPoint {\n label: string\n value: number\n runningBase: number\n isTotal: boolean\n isNegative: boolean\n displayValue: number\n originalIndex: number\n}\n\nfunction transformToWaterfall(\n data: Record<string, unknown>[],\n xField: string,\n yField: string,\n showTotal: boolean,\n getFieldLabel: (field: string) => string\n): WaterfallDataPoint[] {\n let running = 0\n const result: WaterfallDataPoint[] = data.map((row, i) => {\n const label = String(row[xField] ?? `Row ${i + 1}`)\n const rawValue = row[yField]\n const parsed = typeof rawValue === 'number' ? rawValue : parseFloat(String(rawValue ?? ''))\n const value = isNaN(parsed) ? 0 : parsed\n const isNegative = value < 0\n const base = isNegative ? running + value : running\n const point: WaterfallDataPoint = {\n label,\n value: Math.abs(value),\n runningBase: base,\n isTotal: false,\n isNegative,\n displayValue: value,\n originalIndex: i,\n }\n running += value\n return point\n })\n\n if (showTotal) {\n const totalLabel = getFieldLabel(yField) || 'Total'\n result.push({\n label: totalLabel,\n value: Math.abs(running),\n runningBase: running >= 0 ? 0 : running,\n isTotal: true,\n isNegative: running < 0,\n displayValue: running,\n originalIndex: result.length,\n })\n }\n\n return result\n}\n\ninterface ValueLabelProps {\n x?: number\n y?: number\n width?: number\n value?: number\n isNegative?: boolean\n displayValue?: number\n}\n\nfunction ValueLabel(props: ValueLabelProps) {\n const { x = 0, y = 0, width = 0, value = 0, isNegative, displayValue } = props\n if (displayValue === undefined || displayValue === null) return null\n const numericValue = Number(displayValue)\n const isNeg = isNegative || numericValue < 0\n const yPos = isNeg ? y + value + 14 : y - 6\n return (\n <text\n x={x + width / 2}\n y={yPos}\n fill=\"currentColor\"\n textAnchor=\"middle\"\n fontSize={11}\n >\n {numericValue >= 0 ? '+' : ''}{numericValue.toLocaleString()}\n </text>\n )\n}\n\nconst WaterfallChart = React.memo(function WaterfallChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n onDataPointClick,\n drillEnabled,\n}: ChartProps) {\n const { t } = useTranslation()\n const getFieldLabel = useCubeFieldLabel()\n\n const showTotal = displayConfig?.showTotal ?? true\n const showConnectorLine = displayConfig?.showConnectorLine ?? true\n const showDataLabels = displayConfig?.showDataLabels ?? false\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const { xAxisField, yAxisField, configError } = useMemo(() => {\n const xAxisField: string | undefined = Array.isArray(chartConfig?.xAxis)\n ? chartConfig.xAxis[0]\n : chartConfig?.x\n const yAxisField: string | undefined = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis[0]\n : chartConfig?.y?.[0]\n const configError =\n !xAxisField || !yAxisField\n ? 'Waterfall chart requires an X-axis dimension and a Y-axis measure'\n : null\n return { xAxisField, yAxisField, configError }\n }, [chartConfig])\n\n const waterfallData = useMemo(() => {\n if (configError || !data || data.length === 0 || !xAxisField || !yAxisField) return []\n return transformToWaterfall(\n data as Record<string, unknown>[],\n xAxisField,\n yAxisField,\n showTotal,\n getFieldLabel\n )\n }, [data, xAxisField, yAxisField, showTotal, getFieldLabel, configError])\n\n const connectorData = useMemo(() => {\n if (!showConnectorLine || waterfallData.length === 0) return []\n return waterfallData.map((d) => {\n const connectorY = d.isNegative ? d.runningBase : d.runningBase + d.value\n return { label: d.label, _connector: connectorY }\n })\n }, [waterfallData, showConnectorLine])\n\n const chartData = useMemo(() => {\n return waterfallData.map((d, i) => ({\n ...d,\n _connector: connectorData[i]?._connector,\n }))\n }, [waterfallData, connectorData])\n\n try {\n if (!data || data.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.noData')}</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.noDataHint.waterfall')}</div>\n </div>\n </div>\n )\n }\n\n if (configError) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.configError')}</div>\n <div className=\"dc:text-xs\">{configError}</div>\n </div>\n </div>\n )\n }\n return (\n <div className=\"dc:relative dc:w-full\" style={{ height }}>\n <ChartContainer height=\"100%\">\n <ComposedChart data={chartData} margin={{ ...CHART_MARGINS, left: 40 }} accessibilityLayer={false}>\n <CartesianGrid strokeDasharray=\"3 3\" style={{ pointerEvents: 'none' }} />\n <XAxis dataKey=\"label\" type=\"category\" tick={<AngledXAxisTick />} height={60} />\n <YAxis\n tick={{ fontSize: 12 }}\n tickFormatter={yAxisFormat ? (v) => formatAxisValue(v, yAxisFormat) : undefined}\n />\n <ChartTooltip\n formatter={(value: any, name: any, props: any) => {\n if (name === '_connector') return ['', '']\n const entry = props?.payload\n if (!entry) return [value, name]\n const displayValue = entry.displayValue ?? value\n return [\n yAxisFormat ? formatAxisValue(displayValue, yAxisFormat) : displayValue?.toLocaleString?.() ?? displayValue,\n entry.isTotal ? 'Total' : entry.isNegative ? 'Decrease' : 'Increase',\n ]\n }}\n labelFormatter={(label: string) => label}\n />\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '8px' }}\n {...{\n payload: [\n { value: 'Increase', type: 'rect' as const, color: POSITIVE_COLOR },\n { value: 'Decrease', type: 'rect' as const, color: NEGATIVE_COLOR },\n ...(showTotal ? [{ value: 'Total', type: 'rect' as const, color: TOTAL_COLOR }] : []),\n ],\n }}\n />\n <Bar dataKey=\"runningBase\" stackId=\"wf\" fill=\"transparent\" legendType=\"none\" isAnimationActive={false} />\n <Bar\n dataKey=\"value\"\n stackId=\"wf\"\n isAnimationActive={false}\n cursor={drillEnabled ? 'pointer' : undefined}\n onClick={(barData: any, _index: number, event: React.MouseEvent) => {\n if (onDataPointClick && drillEnabled && barData && !barData.isTotal) {\n onDataPointClick({\n dataPoint: barData,\n clickedField: yAxisField!,\n xValue: barData.label,\n position: { x: event.clientX, y: event.clientY },\n nativeEvent: event,\n })\n }\n }}\n >\n {showDataLabels && (\n <LabelList\n dataKey=\"displayValue\"\n content={(props: any) => (\n <ValueLabel\n {...props}\n runningBase={chartData[props.index]?.runningBase}\n isNegative={chartData[props.index]?.isNegative}\n displayValue={chartData[props.index]?.displayValue}\n />\n )}\n />\n )}\n {chartData.map((entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={entry.isTotal ? TOTAL_COLOR : entry.isNegative ? NEGATIVE_COLOR : POSITIVE_COLOR}\n />\n ))}\n </Bar>\n {showConnectorLine && (\n <Line\n type=\"stepAfter\"\n dataKey=\"_connector\"\n stroke={CONNECTOR_COLOR}\n strokeWidth={1.5}\n strokeDasharray=\"4 2\"\n dot={false}\n activeDot={false}\n legendType=\"none\"\n isAnimationActive={false}\n />\n )}\n </ComposedChart>\n </ChartContainer>\n </div>\n )\n } catch (error) {\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">{t('chart.runtime.chartError', { chartType: 'Waterfall Chart' })}</div>\n <div className=\"dc:text-xs dc:mb-2\">{error instanceof Error ? error.message : t('chart.runtime.unknownError')}</div>\n <div className=\"dc:text-xs text-dc-text-muted\">{t('chart.runtime.checkConfig')}</div>\n </div>\n </div>\n )\n }\n})\n\nexport default WaterfallChart\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { k as e, y as t } from "./chart-activity-grid-CiHrLH6Y.js";
1
+ import { P as e, w as t } from "./chart-activity-grid-DX0SJbxs.js";
2
2
  import { useMemo as n } from "react";
3
3
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
4
  //#region src/client/components/AnalysisBuilder/SectionHeading.tsx
@@ -212,4 +212,4 @@ function c({ value: s, onChange: c, axisLabel: l, previewValue: u = 125e4 }) {
212
212
  //#endregion
213
213
  export { a as n, c as t };
214
214
 
215
- //# sourceMappingURL=charts-core-CrBDYN6N.js.map
215
+ //# sourceMappingURL=charts-core-DaXSt1Dd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"charts-core-CrBDYN6N.js","names":[],"sources":["../../../src/client/components/AnalysisBuilder/SectionHeading.tsx","../../../src/client/components/charts/AxisFormatControls.tsx"],"sourcesContent":["/**\n * SectionHeading Component\n *\n * A reusable section heading for the Analysis Builder panels.\n * Provides consistent styling that can be easily adjusted in one place.\n */\n\nimport type { ReactNode } from 'react'\n\ninterface SectionHeadingProps {\n children: ReactNode\n /** Optional className to add additional styles */\n className?: string\n}\n\n/**\n * Consistent section heading style for Analysis Builder panels.\n * Change the styles here to update all section headings at once.\n */\nexport default function SectionHeading({ children, className = '' }: SectionHeadingProps) {\n return (\n <h3 className={`dc:text-sm dc:font-semibold text-dc-primary dc:uppercase dc:tracking-wide ${className}`}>\n {children}\n </h3>\n )\n}\n","/**\n * AxisFormatControls Component\n *\n * A reusable component for configuring axis number formatting.\n * Provides controls for unit type, abbreviation, decimal places, and custom labels.\n */\n\nimport { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport SectionHeading from '../AnalysisBuilder/SectionHeading'\nimport type { AxisFormatConfig } from '../../types'\nimport { formatAxisValue } from '../../utils/chartUtils'\n\ninterface AxisFormatControlsProps {\n value: AxisFormatConfig\n onChange: (config: AxisFormatConfig) => void\n axisLabel: string // \"X-Axis\", \"Left Y-Axis\", \"Right Y-Axis\"\n /** Sample value for preview (default: 1250000) */\n previewValue?: number\n}\n\n/**\n * Get the currency symbol for the user's locale\n */\nfunction getLocaleCurrencySymbol(): string {\n const locale = typeof navigator !== 'undefined' ? navigator.language : 'en-US'\n // Format a number as currency and extract just the symbol\n const formatted = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: getCurrencyCodeForLocale(locale),\n currencyDisplay: 'narrowSymbol'\n }).format(0)\n // Extract the currency symbol (remove digits, spaces, and common separators)\n return formatted.replace(/[\\d.,\\s]/g, '').trim() || '$'\n}\n\n/**\n * Get the currency code for a given locale (duplicated from chartUtils for component isolation)\n */\nfunction getCurrencyCodeForLocale(locale: string): string {\n const parts = locale.split('-')\n const region = parts[1]?.toUpperCase()\n const currencyMap: Record<string, string> = {\n 'US': 'USD', 'CA': 'CAD', 'GB': 'GBP', 'UK': 'GBP', 'AU': 'AUD', 'NZ': 'NZD',\n 'EU': 'EUR', 'DE': 'EUR', 'FR': 'EUR', 'IT': 'EUR', 'ES': 'EUR', 'NL': 'EUR',\n 'BE': 'EUR', 'AT': 'EUR', 'IE': 'EUR', 'PT': 'EUR', 'FI': 'EUR',\n 'JP': 'JPY', 'CN': 'CNY', 'KR': 'KRW', 'IN': 'INR', 'BR': 'BRL', 'MX': 'MXN',\n 'CH': 'CHF', 'SE': 'SEK', 'NO': 'NOK', 'DK': 'DKK', 'PL': 'PLN', 'RU': 'RUB',\n 'ZA': 'ZAR', 'SG': 'SGD', 'HK': 'HKD', 'TW': 'TWD', 'TH': 'THB', 'MY': 'MYR',\n 'PH': 'PHP', 'ID': 'IDR', 'VN': 'VND', 'AE': 'AED', 'SA': 'SAR', 'IL': 'ILS', 'TR': 'TRY',\n }\n return currencyMap[region] || 'USD'\n}\n\n/**\n * Single axis format control section\n */\nexport function AxisFormatControls({\n value,\n onChange,\n axisLabel,\n previewValue = 1250000\n}: AxisFormatControlsProps) {\n const { t } = useTranslation()\n const config = useMemo(() => value || {}, [value])\n\n // Get locale-aware currency symbol for the button\n const currencySymbol = useMemo(() => getLocaleCurrencySymbol(), [])\n\n // Generate preview of formatted value\n const preview = useMemo(() => {\n return formatAxisValue(previewValue, config)\n }, [previewValue, config])\n\n const handleChange = (updates: Partial<AxisFormatConfig>) => {\n onChange({ ...config, ...updates })\n }\n\n const unitButtons: Array<{ value: AxisFormatConfig['unit']; label: string }> = [\n { value: 'currency', label: currencySymbol },\n { value: 'percent', label: '%' },\n { value: 'number', label: '#' },\n { value: 'custom', label: t('chart.runtime.axisFormat.custom') }\n ]\n\n return (\n <div className=\"dc:space-y-3 dc:pb-4\">\n {/* Axis Header */}\n <SectionHeading>{axisLabel}</SectionHeading>\n\n {/* Label Input */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.label')}</label>\n <input\n type=\"text\"\n value={config.label || ''}\n onChange={(e) => handleChange({ label: e.target.value || undefined })}\n placeholder={t('chart.runtime.axisFormat.autoLabel')}\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n\n {/* Unit Type */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.unit')}</label>\n <div className=\"dc:flex dc:border border-dc-border dc:rounded-sm dc:overflow-hidden\">\n {unitButtons.map((btn) => (\n <button\n key={btn.value}\n type=\"button\"\n onClick={() => handleChange({ unit: btn.value })}\n className={`dc:flex-1 dc:px-2 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${\n config.unit === btn.value\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n {btn.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Custom Prefix/Suffix (only when Custom is selected) */}\n {config.unit === 'custom' && (\n <div className=\"dc:flex dc:gap-2\">\n <div className=\"dc:flex-1 dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.prefix')}</label>\n <input\n type=\"text\"\n value={config.customPrefix || ''}\n onChange={(e) => handleChange({ customPrefix: e.target.value || undefined })}\n placeholder={t('chart.runtime.axisFormat.prefixExample')}\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n <div className=\"dc:flex-1 dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.suffix')}</label>\n <input\n type=\"text\"\n value={config.customSuffix || ''}\n onChange={(e) => handleChange({ customSuffix: e.target.value || undefined })}\n placeholder={t('chart.runtime.axisFormat.suffixExample')}\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n </div>\n )}\n\n {/* Abbreviation Toggle */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.abbreviation')}</label>\n <div className=\"dc:flex dc:border border-dc-border dc:rounded-sm dc:overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => handleChange({ abbreviate: true })}\n className={`dc:flex-1 dc:px-3 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${\n config.abbreviate !== false\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n {t('chart.runtime.axisFormat.yes')}\n </button>\n <button\n type=\"button\"\n onClick={() => handleChange({ abbreviate: false })}\n className={`dc:flex-1 dc:px-3 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${\n config.abbreviate === false\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n {t('chart.runtime.axisFormat.no')}\n </button>\n </div>\n </div>\n\n {/* Decimals */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.decimals')}</label>\n <div className=\"dc:flex dc:gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n const current = config.decimals ?? 2\n if (current > 0) handleChange({ decimals: current - 1 })\n }}\n disabled={(config.decimals ?? 2) <= 0}\n className=\"dc:flex-1 dc:px-3 dc:py-2 dc:text-sm dc:border border-dc-border dc:rounded-sm bg-dc-surface text-dc-text hover:bg-dc-border dc:disabled:opacity-40 dc:disabled:cursor-not-allowed dc:transition-colors\"\n >\n ← .0\n </button>\n <button\n type=\"button\"\n onClick={() => {\n const current = config.decimals ?? 2\n if (current < 4) handleChange({ decimals: current + 1 })\n }}\n disabled={(config.decimals ?? 2) >= 4}\n className=\"dc:flex-1 dc:px-3 dc:py-2 dc:text-sm dc:border border-dc-border dc:rounded-sm bg-dc-surface text-dc-text hover:bg-dc-border dc:disabled:opacity-40 dc:disabled:cursor-not-allowed dc:transition-colors\"\n >\n .00 →\n </button>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.preview')}</label>\n <div className=\"dc:text-sm dc:font-mono text-dc-text\">\n {preview}\n </div>\n </div>\n </div>\n )\n}\n\ninterface MultiAxisFormatControlsProps {\n displayConfig: {\n xAxisFormat?: AxisFormatConfig\n leftYAxisFormat?: AxisFormatConfig\n rightYAxisFormat?: AxisFormatConfig\n }\n onChange: (updates: {\n xAxisFormat?: AxisFormatConfig\n leftYAxisFormat?: AxisFormatConfig\n rightYAxisFormat?: AxisFormatConfig\n }) => void\n /** Which axes to show controls for */\n showAxes?: {\n xAxis?: boolean\n leftYAxis?: boolean\n rightYAxis?: boolean\n }\n}\n\n/**\n * Container component for multiple axis format controls\n */\nexport function MultiAxisFormatControls({\n displayConfig,\n onChange,\n showAxes = { leftYAxis: true, rightYAxis: true }\n}: MultiAxisFormatControlsProps) {\n const { t } = useTranslation()\n return (\n <div className=\"dc:space-y-4\">\n {showAxes.leftYAxis && (\n <AxisFormatControls\n axisLabel={t('chart.runtime.axisFormat.leftYAxis')}\n value={displayConfig.leftYAxisFormat || {}}\n onChange={(config) =>\n onChange({\n ...displayConfig,\n leftYAxisFormat: Object.keys(config).length > 0 ? config : undefined\n })\n }\n />\n )}\n\n {showAxes.rightYAxis && (\n <AxisFormatControls\n axisLabel={t('chart.runtime.axisFormat.rightYAxis')}\n value={displayConfig.rightYAxisFormat || {}}\n onChange={(config) =>\n onChange({\n ...displayConfig,\n rightYAxisFormat: Object.keys(config).length > 0 ? config : undefined\n })\n }\n />\n )}\n\n {showAxes.xAxis && (\n <AxisFormatControls\n axisLabel={t('chart.runtime.axisFormat.xAxis')}\n value={displayConfig.xAxisFormat || {}}\n onChange={(config) =>\n onChange({\n ...displayConfig,\n xAxisFormat: Object.keys(config).length > 0 ? config : undefined\n })\n }\n previewValue={2024} // Use a year-like number for X-axis preview\n />\n )}\n </div>\n )\n}\n\nexport default AxisFormatControls\n"],"mappings":"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"}
1
+ {"version":3,"file":"charts-core-DaXSt1Dd.js","names":[],"sources":["../../../src/client/components/AnalysisBuilder/SectionHeading.tsx","../../../src/client/components/charts/AxisFormatControls.tsx"],"sourcesContent":["/**\n * SectionHeading Component\n *\n * A reusable section heading for the Analysis Builder panels.\n * Provides consistent styling that can be easily adjusted in one place.\n */\n\nimport type { ReactNode } from 'react'\n\ninterface SectionHeadingProps {\n children: ReactNode\n /** Optional className to add additional styles */\n className?: string\n}\n\n/**\n * Consistent section heading style for Analysis Builder panels.\n * Change the styles here to update all section headings at once.\n */\nexport default function SectionHeading({ children, className = '' }: SectionHeadingProps) {\n return (\n <h3 className={`dc:text-sm dc:font-semibold text-dc-primary dc:uppercase dc:tracking-wide ${className}`}>\n {children}\n </h3>\n )\n}\n","/**\n * AxisFormatControls Component\n *\n * A reusable component for configuring axis number formatting.\n * Provides controls for unit type, abbreviation, decimal places, and custom labels.\n */\n\nimport { useMemo } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport SectionHeading from '../AnalysisBuilder/SectionHeading'\nimport type { AxisFormatConfig } from '../../types'\nimport { formatAxisValue } from '../../utils/chartUtils'\n\ninterface AxisFormatControlsProps {\n value: AxisFormatConfig\n onChange: (config: AxisFormatConfig) => void\n axisLabel: string // \"X-Axis\", \"Left Y-Axis\", \"Right Y-Axis\"\n /** Sample value for preview (default: 1250000) */\n previewValue?: number\n}\n\n/**\n * Get the currency symbol for the user's locale\n */\nfunction getLocaleCurrencySymbol(): string {\n const locale = typeof navigator !== 'undefined' ? navigator.language : 'en-US'\n // Format a number as currency and extract just the symbol\n const formatted = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: getCurrencyCodeForLocale(locale),\n currencyDisplay: 'narrowSymbol'\n }).format(0)\n // Extract the currency symbol (remove digits, spaces, and common separators)\n return formatted.replace(/[\\d.,\\s]/g, '').trim() || '$'\n}\n\n/**\n * Get the currency code for a given locale (duplicated from chartUtils for component isolation)\n */\nfunction getCurrencyCodeForLocale(locale: string): string {\n const parts = locale.split('-')\n const region = parts[1]?.toUpperCase()\n const currencyMap: Record<string, string> = {\n 'US': 'USD', 'CA': 'CAD', 'GB': 'GBP', 'UK': 'GBP', 'AU': 'AUD', 'NZ': 'NZD',\n 'EU': 'EUR', 'DE': 'EUR', 'FR': 'EUR', 'IT': 'EUR', 'ES': 'EUR', 'NL': 'EUR',\n 'BE': 'EUR', 'AT': 'EUR', 'IE': 'EUR', 'PT': 'EUR', 'FI': 'EUR',\n 'JP': 'JPY', 'CN': 'CNY', 'KR': 'KRW', 'IN': 'INR', 'BR': 'BRL', 'MX': 'MXN',\n 'CH': 'CHF', 'SE': 'SEK', 'NO': 'NOK', 'DK': 'DKK', 'PL': 'PLN', 'RU': 'RUB',\n 'ZA': 'ZAR', 'SG': 'SGD', 'HK': 'HKD', 'TW': 'TWD', 'TH': 'THB', 'MY': 'MYR',\n 'PH': 'PHP', 'ID': 'IDR', 'VN': 'VND', 'AE': 'AED', 'SA': 'SAR', 'IL': 'ILS', 'TR': 'TRY',\n }\n return currencyMap[region] || 'USD'\n}\n\n/**\n * Single axis format control section\n */\nexport function AxisFormatControls({\n value,\n onChange,\n axisLabel,\n previewValue = 1250000\n}: AxisFormatControlsProps) {\n const { t } = useTranslation()\n const config = useMemo(() => value || {}, [value])\n\n // Get locale-aware currency symbol for the button\n const currencySymbol = useMemo(() => getLocaleCurrencySymbol(), [])\n\n // Generate preview of formatted value\n const preview = useMemo(() => {\n return formatAxisValue(previewValue, config)\n }, [previewValue, config])\n\n const handleChange = (updates: Partial<AxisFormatConfig>) => {\n onChange({ ...config, ...updates })\n }\n\n const unitButtons: Array<{ value: AxisFormatConfig['unit']; label: string }> = [\n { value: 'currency', label: currencySymbol },\n { value: 'percent', label: '%' },\n { value: 'number', label: '#' },\n { value: 'custom', label: t('chart.runtime.axisFormat.custom') }\n ]\n\n return (\n <div className=\"dc:space-y-3 dc:pb-4\">\n {/* Axis Header */}\n <SectionHeading>{axisLabel}</SectionHeading>\n\n {/* Label Input */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.label')}</label>\n <input\n type=\"text\"\n value={config.label || ''}\n onChange={(e) => handleChange({ label: e.target.value || undefined })}\n placeholder={t('chart.runtime.axisFormat.autoLabel')}\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n\n {/* Unit Type */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.unit')}</label>\n <div className=\"dc:flex dc:border border-dc-border dc:rounded-sm dc:overflow-hidden\">\n {unitButtons.map((btn) => (\n <button\n key={btn.value}\n type=\"button\"\n onClick={() => handleChange({ unit: btn.value })}\n className={`dc:flex-1 dc:px-2 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${\n config.unit === btn.value\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n {btn.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Custom Prefix/Suffix (only when Custom is selected) */}\n {config.unit === 'custom' && (\n <div className=\"dc:flex dc:gap-2\">\n <div className=\"dc:flex-1 dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.prefix')}</label>\n <input\n type=\"text\"\n value={config.customPrefix || ''}\n onChange={(e) => handleChange({ customPrefix: e.target.value || undefined })}\n placeholder={t('chart.runtime.axisFormat.prefixExample')}\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n <div className=\"dc:flex-1 dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.suffix')}</label>\n <input\n type=\"text\"\n value={config.customSuffix || ''}\n onChange={(e) => handleChange({ customSuffix: e.target.value || undefined })}\n placeholder={t('chart.runtime.axisFormat.suffixExample')}\n className=\"dc:w-full dc:px-2 dc:py-1 dc:text-sm dc:border border-dc-border dc:rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n </div>\n )}\n\n {/* Abbreviation Toggle */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.abbreviation')}</label>\n <div className=\"dc:flex dc:border border-dc-border dc:rounded-sm dc:overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => handleChange({ abbreviate: true })}\n className={`dc:flex-1 dc:px-3 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${\n config.abbreviate !== false\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n {t('chart.runtime.axisFormat.yes')}\n </button>\n <button\n type=\"button\"\n onClick={() => handleChange({ abbreviate: false })}\n className={`dc:flex-1 dc:px-3 dc:py-1.5 dc:text-sm dc:font-medium dc:transition-colors ${\n config.abbreviate === false\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n {t('chart.runtime.axisFormat.no')}\n </button>\n </div>\n </div>\n\n {/* Decimals */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.decimals')}</label>\n <div className=\"dc:flex dc:gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n const current = config.decimals ?? 2\n if (current > 0) handleChange({ decimals: current - 1 })\n }}\n disabled={(config.decimals ?? 2) <= 0}\n className=\"dc:flex-1 dc:px-3 dc:py-2 dc:text-sm dc:border border-dc-border dc:rounded-sm bg-dc-surface text-dc-text hover:bg-dc-border dc:disabled:opacity-40 dc:disabled:cursor-not-allowed dc:transition-colors\"\n >\n ← .0\n </button>\n <button\n type=\"button\"\n onClick={() => {\n const current = config.decimals ?? 2\n if (current < 4) handleChange({ decimals: current + 1 })\n }}\n disabled={(config.decimals ?? 2) >= 4}\n className=\"dc:flex-1 dc:px-3 dc:py-2 dc:text-sm dc:border border-dc-border dc:rounded-sm bg-dc-surface text-dc-text hover:bg-dc-border dc:disabled:opacity-40 dc:disabled:cursor-not-allowed dc:transition-colors\"\n >\n .00 →\n </button>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"dc:space-y-1\">\n <label className=\"dc:text-xs text-dc-text-secondary\">{t('chart.runtime.axisFormat.preview')}</label>\n <div className=\"dc:text-sm dc:font-mono text-dc-text\">\n {preview}\n </div>\n </div>\n </div>\n )\n}\n\ninterface MultiAxisFormatControlsProps {\n displayConfig: {\n xAxisFormat?: AxisFormatConfig\n leftYAxisFormat?: AxisFormatConfig\n rightYAxisFormat?: AxisFormatConfig\n }\n onChange: (updates: {\n xAxisFormat?: AxisFormatConfig\n leftYAxisFormat?: AxisFormatConfig\n rightYAxisFormat?: AxisFormatConfig\n }) => void\n /** Which axes to show controls for */\n showAxes?: {\n xAxis?: boolean\n leftYAxis?: boolean\n rightYAxis?: boolean\n }\n}\n\ntype AxisKey = 'xAxisFormat' | 'leftYAxisFormat' | 'rightYAxisFormat'\n\ninterface AxisEntry {\n show: boolean | undefined\n key: AxisKey\n labelKey: string\n previewValue?: number\n}\n\n/**\n * Container component for multiple axis format controls. Each configured axis\n * renders an `AxisFormatControls`; the per-axis entries are data-driven so the\n * three branches collapse into a single map.\n */\nexport function MultiAxisFormatControls({\n displayConfig,\n onChange,\n showAxes = { leftYAxis: true, rightYAxis: true }\n}: MultiAxisFormatControlsProps) {\n const { t } = useTranslation()\n\n const entries: AxisEntry[] = [\n { show: showAxes.leftYAxis, key: 'leftYAxisFormat', labelKey: 'chart.runtime.axisFormat.leftYAxis' },\n { show: showAxes.rightYAxis, key: 'rightYAxisFormat', labelKey: 'chart.runtime.axisFormat.rightYAxis' },\n // Use a year-like number for X-axis preview\n { show: showAxes.xAxis, key: 'xAxisFormat', labelKey: 'chart.runtime.axisFormat.xAxis', previewValue: 2024 }\n ]\n\n const updateAxis = (key: AxisKey, config: AxisFormatConfig) =>\n onChange({ ...displayConfig, [key]: Object.keys(config).length > 0 ? config : undefined })\n\n return (\n <div className=\"dc:space-y-4\">\n {entries.filter((entry) => entry.show).map((entry) => (\n <AxisFormatControls\n key={entry.key}\n axisLabel={t(entry.labelKey)}\n value={displayConfig[entry.key] || {}}\n onChange={(config) => updateAxis(entry.key, config)}\n previewValue={entry.previewValue}\n />\n ))}\n </div>\n )\n}\n\nexport default AxisFormatControls\n"],"mappings":"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"}