drizzle-cube 0.6.7 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/dist/adapters/ActivityGridChart.config-DaYILvFZ.cjs +1 -0
  2. package/dist/adapters/ActivityGridChart.config-_SyTBEyR.js +2 -0
  3. package/dist/adapters/AreaChart.config-BKh6fY1_.cjs +1 -0
  4. package/dist/adapters/AreaChart.config-CJoxLP3Y.js +2 -0
  5. package/dist/adapters/BarChart.config-Bm1bfRbI.cjs +1 -0
  6. package/dist/adapters/BarChart.config-CGu2Bqrx.js +2 -0
  7. package/dist/adapters/BoxPlotChart.config-B7M9CQaE.js +2 -0
  8. package/dist/adapters/BoxPlotChart.config-CXQel8Hk.cjs +1 -0
  9. package/dist/adapters/BubbleChart.config-BJ36IuVS.cjs +1 -0
  10. package/dist/adapters/BubbleChart.config-CWoXeLdm.js +2 -0
  11. package/dist/adapters/CandlestickChart.config-CGMLZVIy.cjs +1 -0
  12. package/dist/adapters/CandlestickChart.config-CzOcfF1e.js +2 -0
  13. package/dist/adapters/DataTable.config-CdAzueTs.cjs +1 -0
  14. package/dist/adapters/DataTable.config-D_KmPyxV.js +2 -0
  15. package/dist/adapters/FunnelChart.config-D1QAUuYl.cjs +1 -0
  16. package/dist/adapters/FunnelChart.config-DCRHQoFc.js +2 -0
  17. package/dist/adapters/GaugeChart.config-DAybRXP3.js +2 -0
  18. package/dist/adapters/GaugeChart.config-WUPfyLP-.cjs +1 -0
  19. package/dist/adapters/HeatMapChart.config-CziltPnC.cjs +1 -0
  20. package/dist/adapters/HeatMapChart.config-DHpXNONW.js +2 -0
  21. package/dist/adapters/KpiDelta.config-Bw5o0ocY.js +2 -0
  22. package/dist/adapters/KpiDelta.config-CdAmE1pw.cjs +1 -0
  23. package/dist/adapters/KpiNumber.config-CQ_wq2gx.js +2 -0
  24. package/dist/adapters/KpiNumber.config-wxN8x4DC.cjs +1 -0
  25. package/dist/adapters/KpiText.config-DIRIC97F.cjs +1 -0
  26. package/dist/adapters/KpiText.config-eODcP6Hn.js +2 -0
  27. package/dist/adapters/LineChart.config-32-9zA2V.js +2 -0
  28. package/dist/adapters/LineChart.config-BukeFp6z.cjs +1 -0
  29. package/dist/adapters/MarkdownChart.config-BVsR5LDy.js +2 -0
  30. package/dist/adapters/MarkdownChart.config-j4veYjcZ.cjs +1 -0
  31. package/dist/adapters/MeasureProfileChart.config-BRDYx1hw.js +2 -0
  32. package/dist/adapters/MeasureProfileChart.config-CIosBxco.cjs +1 -0
  33. package/dist/adapters/PieChart.config-Bj8KiA0n.cjs +1 -0
  34. package/dist/adapters/PieChart.config-DgAj3y-I.js +2 -0
  35. package/dist/adapters/ProportionBarChart.config-BfFOppHY.js +2 -0
  36. package/dist/adapters/ProportionBarChart.config-c8GGE1aK.cjs +1 -0
  37. package/dist/adapters/RadarChart.config-D7iHY1v9.js +2 -0
  38. package/dist/adapters/RadarChart.config-ghlANG2-.cjs +1 -0
  39. package/dist/adapters/RadialBarChart.config-CsXIz-0v.js +2 -0
  40. package/dist/adapters/RadialBarChart.config-Dsvu2CPV.cjs +1 -0
  41. package/dist/adapters/RetentionCombinedChart.config-CdT1kXC7.js +2 -0
  42. package/dist/adapters/RetentionCombinedChart.config-sDjFKH9K.cjs +1 -0
  43. package/dist/adapters/RetentionHeatmap.config-CvKBvQmu.cjs +1 -0
  44. package/dist/adapters/RetentionHeatmap.config-DbM3ICwc.js +2 -0
  45. package/dist/adapters/SankeyChart.config-BNBcIHaD.js +2 -0
  46. package/dist/adapters/SankeyChart.config-DZscz3kh.cjs +1 -0
  47. package/dist/adapters/ScatterChart.config-BNYIddyM.cjs +1 -0
  48. package/dist/adapters/ScatterChart.config-CEhtoLWc.js +2 -0
  49. package/dist/adapters/SunburstChart.config-ClseCzji.cjs +1 -0
  50. package/dist/adapters/SunburstChart.config-nnphNoVO.js +2 -0
  51. package/dist/adapters/TreeMapChart.config-C8-75muA.js +2 -0
  52. package/dist/adapters/TreeMapChart.config-DoXeUg9Y.cjs +1 -0
  53. package/dist/adapters/WaterfallChart.config-BOF1qxY3.cjs +1 -0
  54. package/dist/adapters/WaterfallChart.config-uW5YyOji.js +2 -0
  55. package/dist/adapters/{compiler-CGJQlQ6Q.cjs → compiler-DAyodAnH.cjs} +1 -1
  56. package/dist/adapters/{compiler-mz2Uudwd.js → compiler-Dq04wAjm.js} +1 -1
  57. package/dist/adapters/core/index.cjs +1 -1
  58. package/dist/adapters/core/index.js +1 -1
  59. package/dist/adapters/{core-4WY4M7hp.js → core-BjxfG6Uf.js} +2 -2
  60. package/dist/adapters/{core-FpI2NfHt.cjs → core-zV2w0hO2.cjs} +1 -1
  61. package/dist/adapters/express/index.cjs +1 -1
  62. package/dist/adapters/express/index.js +5 -5
  63. package/dist/adapters/fastify/index.cjs +1 -1
  64. package/dist/adapters/fastify/index.js +5 -5
  65. package/dist/adapters/{handler-g8k2CZG2.cjs → handler-C6Hj6_Yk.cjs} +3 -3
  66. package/dist/adapters/{handler-PjEeNmXY.js → handler-ox6qxLw5.js} +29 -29
  67. package/dist/adapters/hono/index.cjs +1 -1
  68. package/dist/adapters/hono/index.js +4 -4
  69. package/dist/adapters/mcp-tools.cjs +1 -1
  70. package/dist/adapters/mcp-tools.js +2 -2
  71. package/dist/adapters/mcp-transport-C_t_p0wU.cjs +40 -0
  72. package/dist/adapters/mcp-transport-DFH9e6de.js +603 -0
  73. package/dist/adapters/nextjs/index.cjs +1 -1
  74. package/dist/adapters/nextjs/index.js +5 -5
  75. package/dist/adapters/{openai-DnWF0wCU.cjs → openai-BffpdO4n.cjs} +1 -1
  76. package/dist/adapters/{openai-DHjN2OwG.js → openai-C9LNhHfK.js} +1 -1
  77. package/dist/adapters/{openai-CcY2fW3E.js → openai-CmyXJWti.js} +1 -1
  78. package/dist/adapters/{openai-7xjDI7R2.cjs → openai-DlT-0VRC.cjs} +1 -1
  79. package/dist/adapters/utils-C5FLHK04.cjs +128 -0
  80. package/dist/adapters/{utils-G52pPkce.js → utils-tjiwXFnP.js} +18 -0
  81. package/dist/adapters/utils.cjs +1 -1
  82. package/dist/adapters/utils.js +1 -1
  83. package/dist/cjs/client/components/DashboardPortletCard.d.ts +1 -1
  84. package/dist/cjs/client/components/PortletGroupCard.d.ts +18 -0
  85. package/dist/cjs/client/components/RowManagedLayout.d.ts +15 -3
  86. package/dist/cjs/client/components/dashboard/DashboardContext.d.ts +5 -1
  87. package/dist/cjs/client/components/dashboard/dashboardGridUtils.d.ts +2 -4
  88. package/dist/cjs/client/components/dashboardPortletCard/EditActionButtons.d.ts +34 -0
  89. package/dist/cjs/client/components/dashboardPortletCard/PortletCardHeader.d.ts +2 -12
  90. package/dist/cjs/client/components/dashboardPortletCard/PortletFloatingActions.d.ts +24 -0
  91. package/dist/cjs/client/components/dashboardPortletCard/cardStyles.d.ts +5 -0
  92. package/dist/cjs/client/components/dashboardPortletCard/propsEqual.d.ts +2 -0
  93. package/dist/cjs/client/components/mobileStackedLayout/memberDisplay.d.ts +21 -0
  94. package/dist/cjs/client/components.d.ts +1 -1
  95. package/dist/cjs/client/hooks/dashboard/groupGeometry.d.ts +23 -0
  96. package/dist/cjs/client/hooks/dashboard/groupUtils.d.ts +57 -0
  97. package/dist/cjs/client/hooks/dashboard/layoutUtils.d.ts +34 -3
  98. package/dist/cjs/client/hooks/dashboard/useDashboardController.d.ts +11 -3
  99. package/dist/cjs/client/hooks/dashboard/useRowLayoutEngine.d.ts +12 -2
  100. package/dist/cjs/client/hooks/useDashboardHook.d.ts +14 -1
  101. package/dist/cjs/client/index.d.ts +1 -1
  102. package/dist/cjs/client/stores/dashboardStore.d.ts +11 -1
  103. package/dist/cjs/client/types.d.ts +30 -1
  104. package/dist/client/charts.js +12 -12
  105. package/dist/client/chunks/{DashboardEditModal-BEG0d7wI.js → DashboardEditModal-ByXLlXZD.js} +3289 -2370
  106. package/dist/client/chunks/DashboardEditModal-ByXLlXZD.js.map +1 -0
  107. package/dist/client/chunks/{ProportionBarChart-xLX6XD4W.js → ProportionBarChart-lOeVz8ZC.js} +3 -3
  108. package/dist/client/chunks/{ProportionBarChart-xLX6XD4W.js.map → ProportionBarChart-lOeVz8ZC.js.map} +1 -1
  109. package/dist/client/chunks/{RetentionCombinedChart-DeFz5wJh.js → RetentionCombinedChart-Mcm7zHFx.js} +3 -3
  110. package/dist/client/chunks/{RetentionCombinedChart-DeFz5wJh.js.map → RetentionCombinedChart-Mcm7zHFx.js.map} +1 -1
  111. package/dist/client/chunks/{RetentionHeatmap-DkJOiNwz.js → RetentionHeatmap-4VJx5KDM.js} +2 -2
  112. package/dist/client/chunks/{RetentionHeatmap-DkJOiNwz.js.map → RetentionHeatmap-4VJx5KDM.js.map} +1 -1
  113. package/dist/client/chunks/{analysis-builder-BWLL6ztg.js → analysis-builder-CWTJQQtL.js} +9 -9
  114. package/dist/client/chunks/{analysis-builder-BWLL6ztg.js.map → analysis-builder-CWTJQQtL.js.map} +1 -1
  115. package/dist/client/chunks/{analysis-builder-shared-Ba3JsRNw.js → analysis-builder-shared-l-4WKVS1.js} +9 -9
  116. package/dist/client/chunks/{analysis-builder-shared-Ba3JsRNw.js.map → analysis-builder-shared-l-4WKVS1.js.map} +1 -1
  117. package/dist/client/chunks/{chart-activity-grid-CyVDJSAI.js → chart-activity-grid-DVOhLgxv.js} +20 -2
  118. package/dist/client/chunks/{chart-activity-grid-CyVDJSAI.js.map → chart-activity-grid-DVOhLgxv.js.map} +1 -1
  119. package/dist/client/chunks/{chart-area-b5UAS6NZ.js → chart-area-C-5ATxvi.js} +2 -2
  120. package/dist/client/chunks/{chart-area-b5UAS6NZ.js.map → chart-area-C-5ATxvi.js.map} +1 -1
  121. package/dist/client/chunks/{chart-bar-aVNonvWw.js → chart-bar-CPiLaXHP.js} +3 -3
  122. package/dist/client/chunks/{chart-bar-aVNonvWw.js.map → chart-bar-CPiLaXHP.js.map} +1 -1
  123. package/dist/client/chunks/{chart-box-plot-Bx6M97VL.js → chart-box-plot-Bae5O9xC.js} +2 -2
  124. package/dist/client/chunks/{chart-box-plot-Bx6M97VL.js.map → chart-box-plot-Bae5O9xC.js.map} +1 -1
  125. package/dist/client/chunks/{chart-bubble-EWd4_ucG.js → chart-bubble-BFN5WIpf.js} +2 -2
  126. package/dist/client/chunks/{chart-bubble-EWd4_ucG.js.map → chart-bubble-BFN5WIpf.js.map} +1 -1
  127. package/dist/client/chunks/{chart-candlestick-CG5EX67b.js → chart-candlestick-PBQKp_z7.js} +2 -2
  128. package/dist/client/chunks/{chart-candlestick-CG5EX67b.js.map → chart-candlestick-PBQKp_z7.js.map} +1 -1
  129. package/dist/client/chunks/{chart-data-table-D6Cu86m_.js → chart-data-table-SNSqZj9B.js} +2 -2
  130. package/dist/client/chunks/{chart-data-table-D6Cu86m_.js.map → chart-data-table-SNSqZj9B.js.map} +1 -1
  131. package/dist/client/chunks/{chart-funnel-CLRYMbFj.js → chart-funnel-CkHSXp6h.js} +2 -2
  132. package/dist/client/chunks/{chart-funnel-CLRYMbFj.js.map → chart-funnel-CkHSXp6h.js.map} +1 -1
  133. package/dist/client/chunks/{chart-gauge-BRqb8eNU.js → chart-gauge-DHIGq3TH.js} +3 -3
  134. package/dist/client/chunks/{chart-gauge-BRqb8eNU.js.map → chart-gauge-DHIGq3TH.js.map} +1 -1
  135. package/dist/client/chunks/{chart-heat-map-BCfr3nYJ.js → chart-heat-map-Bb8L1XQr.js} +3 -3
  136. package/dist/client/chunks/{chart-heat-map-BCfr3nYJ.js.map → chart-heat-map-Bb8L1XQr.js.map} +1 -1
  137. package/dist/client/chunks/{chart-kpi-delta-ISxzG6g_.js → chart-kpi-delta-BJCOXE-F.js} +3 -3
  138. package/dist/client/chunks/{chart-kpi-delta-ISxzG6g_.js.map → chart-kpi-delta-BJCOXE-F.js.map} +1 -1
  139. package/dist/client/chunks/{chart-kpi-number-OmRCPf7D.js → chart-kpi-number-Cdqgv20g.js} +5 -5
  140. package/dist/client/chunks/{chart-kpi-number-OmRCPf7D.js.map → chart-kpi-number-Cdqgv20g.js.map} +1 -1
  141. package/dist/client/chunks/{chart-kpi-text-BUm932QA.js → chart-kpi-text-B10ZHCsI.js} +3 -3
  142. package/dist/client/chunks/{chart-kpi-text-BUm932QA.js.map → chart-kpi-text-B10ZHCsI.js.map} +1 -1
  143. package/dist/client/chunks/{chart-line-BM_DrpQW.js → chart-line-CzvVL3Be.js} +3 -3
  144. package/dist/client/chunks/{chart-line-BM_DrpQW.js.map → chart-line-CzvVL3Be.js.map} +1 -1
  145. package/dist/client/chunks/{chart-markdown-BNrsZpqM.js → chart-markdown-C0xxBW81.js} +2 -2
  146. package/dist/client/chunks/{chart-markdown-BNrsZpqM.js.map → chart-markdown-C0xxBW81.js.map} +1 -1
  147. package/dist/client/chunks/{chart-measure-profile-DttUWxIu.js → chart-measure-profile-BSUPFZCR.js} +3 -3
  148. package/dist/client/chunks/{chart-measure-profile-DttUWxIu.js.map → chart-measure-profile-BSUPFZCR.js.map} +1 -1
  149. package/dist/client/chunks/{chart-pie-D7pxCMll.js → chart-pie-CwRfwWWZ.js} +3 -3
  150. package/dist/client/chunks/{chart-pie-D7pxCMll.js.map → chart-pie-CwRfwWWZ.js.map} +1 -1
  151. package/dist/client/chunks/{chart-radar-sUnyHn3a.js → chart-radar-Dfql2E7i.js} +3 -3
  152. package/dist/client/chunks/{chart-radar-sUnyHn3a.js.map → chart-radar-Dfql2E7i.js.map} +1 -1
  153. package/dist/client/chunks/{chart-radial-bar-Df9zbhst.js → chart-radial-bar-oE9OZ1IX.js} +3 -3
  154. package/dist/client/chunks/{chart-radial-bar-Df9zbhst.js.map → chart-radial-bar-oE9OZ1IX.js.map} +1 -1
  155. package/dist/client/chunks/{chart-sankey-d_iS5fjB.js → chart-sankey-tK7Oz1bC.js} +2 -2
  156. package/dist/client/chunks/{chart-sankey-d_iS5fjB.js.map → chart-sankey-tK7Oz1bC.js.map} +1 -1
  157. package/dist/client/chunks/{chart-scatter-DD5v7r4K.js → chart-scatter-BtLfAsZb.js} +3 -3
  158. package/dist/client/chunks/{chart-scatter-DD5v7r4K.js.map → chart-scatter-BtLfAsZb.js.map} +1 -1
  159. package/dist/client/chunks/{chart-sunburst-jL5f9PiB.js → chart-sunburst-B7ryWwQ1.js} +3 -3
  160. package/dist/client/chunks/{chart-sunburst-jL5f9PiB.js.map → chart-sunburst-B7ryWwQ1.js.map} +1 -1
  161. package/dist/client/chunks/{chart-tree-map-DK-pNvh4.js → chart-tree-map-DU5M3-qe.js} +3 -3
  162. package/dist/client/chunks/{chart-tree-map-DK-pNvh4.js.map → chart-tree-map-DU5M3-qe.js.map} +1 -1
  163. package/dist/client/chunks/{chart-waterfall-CBGewe2Z.js → chart-waterfall-CAwutpzd.js} +3 -3
  164. package/dist/client/chunks/{chart-waterfall-CBGewe2Z.js.map → chart-waterfall-CAwutpzd.js.map} +1 -1
  165. package/dist/client/chunks/{charts-core-BHjcM-rm.js → charts-core-BxBB2zBE.js} +2 -2
  166. package/dist/client/chunks/{charts-core-BHjcM-rm.js.map → charts-core-BxBB2zBE.js.map} +1 -1
  167. package/dist/client/chunks/charts-loader-0avVzeDd.js +85 -0
  168. package/dist/client/chunks/{charts-loader-FXj1JiQZ.js.map → charts-loader-0avVzeDd.js.map} +1 -1
  169. package/dist/client/chunks/{nl-NL-B1MNDJT-.js → nl-NL-BSMhprPr.js} +19 -1
  170. package/dist/client/chunks/{nl-NL-B1MNDJT-.js.map → nl-NL-BSMhprPr.js.map} +1 -1
  171. package/dist/client/chunks/{schema-visualization-BXdd320w.js → schema-visualization-CGbnbzj_.js} +3 -3
  172. package/dist/client/chunks/{schema-visualization-BXdd320w.js.map → schema-visualization-CGbnbzj_.js.map} +1 -1
  173. package/dist/client/chunks/{useDirtyStateTracking-CFgSTyny.js → useDirtyStateTracking-Dc-Si4db.js} +4 -4
  174. package/dist/client/chunks/{useDirtyStateTracking-CFgSTyny.js.map → useDirtyStateTracking-Dc-Si4db.js.map} +1 -1
  175. package/dist/client/chunks/{useExplainAI-CisDjZNp.js → useExplainAI-DJbc7Lu4.js} +4 -4
  176. package/dist/client/chunks/{useExplainAI-CisDjZNp.js.map → useExplainAI-DJbc7Lu4.js.map} +1 -1
  177. package/dist/client/chunks/{vendor-D5xADz_A.js → vendor-cTfe9Kho.js} +2 -2
  178. package/dist/client/chunks/{vendor-D5xADz_A.js.map → vendor-cTfe9Kho.js.map} +1 -1
  179. package/dist/client/components/DashboardPortletCard.d.ts +1 -1
  180. package/dist/client/components/PortletGroupCard.d.ts +18 -0
  181. package/dist/client/components/RowManagedLayout.d.ts +15 -3
  182. package/dist/client/components/dashboard/DashboardContext.d.ts +5 -1
  183. package/dist/client/components/dashboard/dashboardGridUtils.d.ts +2 -4
  184. package/dist/client/components/dashboardPortletCard/EditActionButtons.d.ts +34 -0
  185. package/dist/client/components/dashboardPortletCard/PortletCardHeader.d.ts +2 -12
  186. package/dist/client/components/dashboardPortletCard/PortletFloatingActions.d.ts +24 -0
  187. package/dist/client/components/dashboardPortletCard/cardStyles.d.ts +5 -0
  188. package/dist/client/components/dashboardPortletCard/propsEqual.d.ts +2 -0
  189. package/dist/client/components/mobileStackedLayout/memberDisplay.d.ts +21 -0
  190. package/dist/client/components.d.ts +1 -1
  191. package/dist/client/components.js +1 -1
  192. package/dist/client/hooks/dashboard/groupGeometry.d.ts +23 -0
  193. package/dist/client/hooks/dashboard/groupUtils.d.ts +57 -0
  194. package/dist/client/hooks/dashboard/layoutUtils.d.ts +34 -3
  195. package/dist/client/hooks/dashboard/useDashboardController.d.ts +11 -3
  196. package/dist/client/hooks/dashboard/useRowLayoutEngine.d.ts +12 -2
  197. package/dist/client/hooks/useDashboardHook.d.ts +14 -1
  198. package/dist/client/hooks.js +3 -3
  199. package/dist/client/icons.js +1 -1
  200. package/dist/client/index.d.ts +1 -1
  201. package/dist/client/index.js +13 -13
  202. package/dist/client/providers.js +1 -1
  203. package/dist/client/schema.js +1 -1
  204. package/dist/client/stores/dashboardStore.d.ts +11 -1
  205. package/dist/client/styles.css +1 -1
  206. package/dist/client/types.d.ts +30 -1
  207. package/dist/client/utils.js +4 -4
  208. package/dist/client-bundle-stats.html +1 -1
  209. package/dist/mcp-app/mcp-app.html +3 -3
  210. package/dist/server/index.cjs +1 -1
  211. package/dist/server/index.js +18 -0
  212. package/package.json +1 -1
  213. package/dist/adapters/ActivityGridChart.config-CA4DWvoH.js +0 -2
  214. package/dist/adapters/ActivityGridChart.config-DC2PXV56.cjs +0 -1
  215. package/dist/adapters/AreaChart.config-BY4hUUJY.js +0 -2
  216. package/dist/adapters/AreaChart.config-CPwW53vL.cjs +0 -1
  217. package/dist/adapters/BarChart.config-Be-PGzp5.js +0 -2
  218. package/dist/adapters/BarChart.config-CfdsJtHY.cjs +0 -1
  219. package/dist/adapters/BoxPlotChart.config-BYwJZm4S.js +0 -2
  220. package/dist/adapters/BoxPlotChart.config-BoZN94lR.cjs +0 -1
  221. package/dist/adapters/BubbleChart.config-DX9aSqMD.js +0 -2
  222. package/dist/adapters/BubbleChart.config-ijpB_fme.cjs +0 -1
  223. package/dist/adapters/CandlestickChart.config-C3iEXUN1.js +0 -2
  224. package/dist/adapters/CandlestickChart.config-DIGeboSZ.cjs +0 -1
  225. package/dist/adapters/DataTable.config-BjFTY-Md.js +0 -2
  226. package/dist/adapters/DataTable.config-ClJZRtsp.cjs +0 -1
  227. package/dist/adapters/FunnelChart.config-DYDd9Y2z.cjs +0 -1
  228. package/dist/adapters/FunnelChart.config-cVxnY9hD.js +0 -2
  229. package/dist/adapters/GaugeChart.config-BxWKW2b5.js +0 -2
  230. package/dist/adapters/GaugeChart.config-DsmevM9y.cjs +0 -1
  231. package/dist/adapters/HeatMapChart.config-BhO-Wj54.js +0 -2
  232. package/dist/adapters/HeatMapChart.config-HWcgNRuG.cjs +0 -1
  233. package/dist/adapters/KpiDelta.config-D3JOnd5n.js +0 -2
  234. package/dist/adapters/KpiDelta.config-DmLmTPSH.cjs +0 -1
  235. package/dist/adapters/KpiNumber.config-CVghzBbF.cjs +0 -1
  236. package/dist/adapters/KpiNumber.config-aK-Ueuhk.js +0 -2
  237. package/dist/adapters/KpiText.config-DLl8NWit.js +0 -2
  238. package/dist/adapters/KpiText.config-DbWJ42vd.cjs +0 -1
  239. package/dist/adapters/LineChart.config-C3i3Tgro.cjs +0 -1
  240. package/dist/adapters/LineChart.config-El3XPCFT.js +0 -2
  241. package/dist/adapters/MarkdownChart.config-D39QzWHW.js +0 -2
  242. package/dist/adapters/MarkdownChart.config-e_9gUs93.cjs +0 -1
  243. package/dist/adapters/MeasureProfileChart.config-BWQ82qcV.js +0 -2
  244. package/dist/adapters/MeasureProfileChart.config-l9WITF80.cjs +0 -1
  245. package/dist/adapters/PieChart.config-CO3Gib0h.js +0 -2
  246. package/dist/adapters/PieChart.config-yqXTNkix.cjs +0 -1
  247. package/dist/adapters/ProportionBarChart.config-B7CtjFwg.cjs +0 -1
  248. package/dist/adapters/ProportionBarChart.config-tGjQou_c.js +0 -2
  249. package/dist/adapters/RadarChart.config-B2YZnD_e.js +0 -2
  250. package/dist/adapters/RadarChart.config-DwJmHK8y.cjs +0 -1
  251. package/dist/adapters/RadialBarChart.config-B9XP-cQ1.cjs +0 -1
  252. package/dist/adapters/RadialBarChart.config-y2riBDwJ.js +0 -2
  253. package/dist/adapters/RetentionCombinedChart.config-Fzxwm_WV.cjs +0 -1
  254. package/dist/adapters/RetentionCombinedChart.config-ohy-zQbu.js +0 -2
  255. package/dist/adapters/RetentionHeatmap.config-0ykBWgUp.js +0 -2
  256. package/dist/adapters/RetentionHeatmap.config-DF_4ARr0.cjs +0 -1
  257. package/dist/adapters/SankeyChart.config-ChdkKqAn.cjs +0 -1
  258. package/dist/adapters/SankeyChart.config-Cl8kxpKq.js +0 -2
  259. package/dist/adapters/ScatterChart.config-BIqh_Z8u.cjs +0 -1
  260. package/dist/adapters/ScatterChart.config-D4v0Z_w4.js +0 -2
  261. package/dist/adapters/SunburstChart.config-CGMw6hSr.cjs +0 -1
  262. package/dist/adapters/SunburstChart.config-CmK6DVYQ.js +0 -2
  263. package/dist/adapters/TreeMapChart.config-B6WC-TVm.js +0 -2
  264. package/dist/adapters/TreeMapChart.config-q-kBddZC.cjs +0 -1
  265. package/dist/adapters/WaterfallChart.config-BiOMGjjF.cjs +0 -1
  266. package/dist/adapters/WaterfallChart.config-C_K8zN09.js +0 -2
  267. package/dist/adapters/mcp-transport-OBc8jVG5.js +0 -603
  268. package/dist/adapters/mcp-transport-n1r1Kqzn.cjs +0 -40
  269. package/dist/adapters/utils-DJ0_72_G.cjs +0 -128
  270. package/dist/client/chunks/DashboardEditModal-BEG0d7wI.js.map +0 -1
  271. package/dist/client/chunks/charts-loader-FXj1JiQZ.js +0 -85
@@ -1439,11 +1439,29 @@ var e = Object.create, t = Object.defineProperty, n = Object.getOwnPropertyDescr
1439
1439
  "dashboard.deletePortletConfirm": "Are you sure you want to delete",
1440
1440
  "dashboard.deletePortletSuffix": "? This action cannot be undone.",
1441
1441
  "dashboard.thisPortlet": "this portlet",
1442
+ "dashboard.portlet.action.edit": "Edit portlet",
1443
+ "dashboard.portlet.action.duplicate": "Duplicate portlet",
1444
+ "dashboard.portlet.action.delete": "Delete portlet",
1445
+ "dashboard.portlet.action.refresh": "Refresh portlet",
1446
+ "dashboard.portlet.action.drag": "Drag portlet",
1447
+ "dashboard.portlet.action.filterConfig": "Configure dashboard filters",
1448
+ "dashboard.portlet.action.filterConfigActive": "Configure dashboard filters ({count} active)",
1449
+ "dashboard.group.rename": "Rename group",
1450
+ "dashboard.group.drag": "Drag group",
1451
+ "dashboard.group.titlePlaceholder": "Group title",
1452
+ "dashboard.group.ungroup": "Ungroup",
1453
+ "dashboard.group.delete": "Delete group",
1454
+ "dashboard.group.deleteTitle": "Delete Group",
1455
+ "dashboard.group.deleteConfirm": "Are you sure you want to delete this group and all {count} portlets inside it? This action cannot be undone.",
1442
1456
  "dashboard.editModal.dashboardName": "Dashboard Name",
1443
1457
  "dashboard.editModal.enterDashboardName": "Enter dashboard name...",
1444
1458
  "dashboard.editModal.descriptionOptional": "Description (optional)",
1445
1459
  "dashboard.editModal.enterDescription": "Enter description...",
1446
1460
  "portlet.configRequired": "Configuration Required",
1461
+ "portlet.copyToClipboard": "Copy chart to clipboard",
1462
+ "portlet.copied": "Copied!",
1463
+ "portlet.downloadXlsx": "Download data as XLSX",
1464
+ "portlet.exporting": "Exporting...",
1447
1465
  "portlet.configRequiredHint": "Please configure this chart",
1448
1466
  "portlet.queryError": "Query Error",
1449
1467
  "portlet.queryWithFilters": "Query (with filters applied)",
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./utils-DJ0_72_G.cjs");exports.buildTransformedQuery=e.t,exports.calculateQueryComplexity=e.n,exports.formatCubeResponse=e.r,exports.formatErrorResponse=e.i,exports.formatMetaResponse=e.a,exports.formatSqlResponse=e.o,exports.formatSqlString=e.S,exports.generateRequestId=e.s,exports.getDatabaseType=e.c,exports.handleBatchRequest=e.l,exports.handleDiscover=e.p,exports.handleDryRun=e.u,exports.handleLoad=e.m,exports.handleSuggest=e.d,exports.handleValidate=e.f,exports.normalizeQueryFields=e.h;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./utils-C5FLHK04.cjs");exports.buildTransformedQuery=e.t,exports.calculateQueryComplexity=e.n,exports.formatCubeResponse=e.r,exports.formatErrorResponse=e.i,exports.formatMetaResponse=e.a,exports.formatSqlResponse=e.o,exports.formatSqlString=e.S,exports.generateRequestId=e.s,exports.getDatabaseType=e.c,exports.handleBatchRequest=e.l,exports.handleDiscover=e.p,exports.handleDryRun=e.u,exports.handleLoad=e.m,exports.handleSuggest=e.d,exports.handleValidate=e.f,exports.normalizeQueryFields=e.h;
@@ -1,2 +1,2 @@
1
- import { S as e, a as t, c as n, d as r, f as i, h as a, i as o, l as s, m as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h } from "./utils-G52pPkce.js";
1
+ import { S as e, a as t, c as n, d as r, f as i, h as a, i as o, l as s, m as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h } from "./utils-tjiwXFnP.js";
2
2
  export { m as buildTransformedQuery, l as calculateQueryComplexity, f as formatCubeResponse, o as formatErrorResponse, t as formatMetaResponse, u as formatSqlResponse, e as formatSqlString, p as generateRequestId, n as getDatabaseType, s as handleBatchRequest, d as handleDiscover, h as handleDryRun, c as handleLoad, r as handleSuggest, i as handleValidate, a as normalizeQueryFields };
@@ -1,4 +1,4 @@
1
1
  import { default as React } from 'react';
2
2
  import { DashboardPortletCardProps } from './dashboardPortletCard/propsEqual.js';
3
- declare const DashboardPortletCard: React.MemoExoticComponent<({ portlet, editable, layoutMode, dashboardFilters, configEagerLoad, loadingComponent, colorPalette, containerProps, headerProps, setPortletRef, setPortletComponentRef, callbacks, icons }: DashboardPortletCardProps) => React.JSX.Element>;
3
+ declare const DashboardPortletCard: React.MemoExoticComponent<({ portlet, editable, layoutMode, dashboardFilters, configEagerLoad, loadingComponent, colorPalette, containerProps, headerProps, variant, setPortletRef, setPortletComponentRef, callbacks, icons }: DashboardPortletCardProps) => React.JSX.Element>;
4
4
  export default DashboardPortletCard;
@@ -0,0 +1,18 @@
1
+ import { DragEvent, HTMLAttributes, ReactNode } from 'react';
2
+ import { PortletConfig, PortletGroup } from '../types.js';
3
+ export interface PortletGroupCardProps {
4
+ group: PortletGroup;
5
+ portlets: Map<string, PortletConfig>;
6
+ canEdit: boolean;
7
+ /** Renders one child portlet with group chrome (no border, no header). */
8
+ renderChild: (portlet: PortletConfig, wrapperProps: HTMLAttributes<HTMLDivElement>) => ReactNode;
9
+ onRename: (groupId: string, title: string) => void;
10
+ onUngroup: (groupId: string) => void;
11
+ onDelete: (groupId: string) => void;
12
+ /** Fired when a child starts being dragged out of, or around within, the group. */
13
+ onChildDragStart: (groupId: string, portletId: string, event: DragEvent<HTMLDivElement>) => void;
14
+ onChildDragEnd: () => void;
15
+ /** Snap bands rendered inside each child; supplied by the row layout. */
16
+ renderSnapBands?: (portletId: string) => ReactNode;
17
+ }
18
+ export default function PortletGroupCard({ group, portlets, canEdit, renderChild, onRename, onUngroup, onDelete, onChildDragStart, onChildDragEnd, renderSnapBands }: PortletGroupCardProps): import("react").JSX.Element;
@@ -1,19 +1,31 @@
1
1
  import { HTMLAttributes, ReactNode, MouseEvent, DragEvent } from 'react';
2
- import { DashboardGridSettings, PortletConfig, RowLayout } from '../types.js';
2
+ import { DashboardGridSettings, PortletConfig, PortletGroup, RowLayout } from '../types.js';
3
+ import { SnapEdge } from '../hooks/dashboard/groupUtils.js';
3
4
  interface RowManagedLayoutProps {
4
5
  rows: RowLayout[];
5
6
  portlets: PortletConfig[];
7
+ groups?: PortletGroup[];
6
8
  gridSettings: DashboardGridSettings;
7
9
  gridWidth: number;
8
10
  canEdit: boolean;
9
11
  isDragging: boolean;
10
12
  onRowResize: (rowIndex: number, event: MouseEvent<HTMLDivElement>) => void;
11
13
  onColumnResize: (rowIndex: number, columnIndex: number, event: MouseEvent<HTMLDivElement>) => void;
12
- onPortletDragStart: (rowIndex: number, columnIndex: number, portletId: string, event: DragEvent<HTMLDivElement>) => void;
14
+ onPortletDragStart: (rowIndex: number, columnIndex: number, portletId: string, event: DragEvent<HTMLDivElement>,
15
+ /** Set when the whole column is a group being moved, not a single portlet. */
16
+ groupId?: string) => void;
13
17
  onPortletDragEnd: () => void;
14
18
  onRowDrop: (rowIndex: number, insertIndex: number | null) => void;
15
19
  onNewRowDrop: (insertIndex: number) => void;
20
+ /** Snap the dragged portlet against `edge` of `targetPortletId`. */
21
+ onSnapDrop?: (targetPortletId: string, edge: SnapEdge) => void;
22
+ /** Id of the portlet currently being dragged, so it can ignore its own bands. */
23
+ draggingPortletId?: string | null;
24
+ /** Id of the group currently being dragged, so its members ignore their bands. */
25
+ draggingGroupId?: string | null;
16
26
  renderPortlet: (portlet: PortletConfig, containerProps?: HTMLAttributes<HTMLDivElement>, headerProps?: HTMLAttributes<HTMLDivElement>) => ReactNode;
27
+ /** Renders a group column. Omitted in contexts that have no groups. */
28
+ renderGroup?: (group: PortletGroup, renderSnapBands: (portletId: string) => ReactNode) => ReactNode;
17
29
  }
18
- export default function RowManagedLayout({ rows, portlets, gridSettings, gridWidth, canEdit, isDragging, onRowResize, onColumnResize, onPortletDragStart, onPortletDragEnd, onRowDrop, onNewRowDrop, renderPortlet }: RowManagedLayoutProps): import("react").JSX.Element;
30
+ export default function RowManagedLayout({ rows, portlets, groups, gridSettings, gridWidth, canEdit, isDragging, onRowResize, onColumnResize, onPortletDragStart, onPortletDragEnd, onRowDrop, onNewRowDrop, onSnapDrop, draggingPortletId, draggingGroupId, renderPortlet, renderGroup }: RowManagedLayoutProps): import("react").JSX.Element;
19
31
  export {};
@@ -3,7 +3,7 @@ import { LayoutItem, Layout } from 'react-grid-layout';
3
3
  import { UseDashboardActions } from '../../hooks/useDashboardHook.js';
4
4
  import { DashboardDisplayMode } from '../../hooks/useResponsiveDashboard.js';
5
5
  import { ColorPalette } from '../../utils/colorPalettes.js';
6
- import { DashboardConfig, PortletConfig, DashboardFilter, DashboardFilterMapping, CubeMeta, DashboardLayoutMode, DashboardGridSettings, RowLayout, FeaturesConfig } from '../../types.js';
6
+ import { DashboardConfig, PortletConfig, DashboardFilter, DashboardFilterMapping, CubeMeta, DashboardLayoutMode, DashboardGridSettings, RowLayout, PortletGroup, FeaturesConfig } from '../../types.js';
7
7
  /**
8
8
  * Props accepted by DashboardProvider (the public composable entry point).
9
9
  * Mirrors the former DashboardGridProps plus `hideToolbar` and `children`.
@@ -55,6 +55,7 @@ export interface DashboardContextValue {
55
55
  isFilterConfigModalOpen: boolean;
56
56
  filterConfigPortlet: PortletConfig | null;
57
57
  deleteConfirmPortletId: string | null;
58
+ deleteConfirmGroupId: string | null;
58
59
  draftRows: RowLayout[] | null;
59
60
  isDraggingPortlet: boolean;
60
61
  isInitialized: boolean;
@@ -62,8 +63,11 @@ export interface DashboardContextValue {
62
63
  canChangeLayoutMode: boolean;
63
64
  selectedFilter: DashboardFilter | null;
64
65
  resolvedRows: RowLayout[];
66
+ resolvedGroups: PortletGroup[];
65
67
  layoutMode: DashboardLayoutMode;
66
68
  allowedModes: DashboardLayoutMode[];
69
+ /** Modes the toggle should offer; a subset of allowedModes. */
70
+ selectableModes: DashboardLayoutMode[];
67
71
  actions: UseDashboardActions;
68
72
  displayMode: DashboardDisplayMode;
69
73
  scaleFactor: number;
@@ -1,10 +1,8 @@
1
1
  import { CSSProperties } from 'react';
2
- import { DashboardConfig, DashboardGridSettings, RowLayoutColumn } from '../../types.js';
2
+ import { DashboardConfig, DashboardGridSettings } from '../../types.js';
3
3
  export declare const DEFAULT_GRID_SETTINGS: DashboardGridSettings;
4
- export declare const createRowId: () => string;
4
+ export { createRowId, equalizeRowColumns, equalizeColumns, adjustRowWidths, adjustInsertIndexForRemovedRow } from '../../hooks/dashboard/layoutUtils.js';
5
5
  export declare const getGridSettings: (config: DashboardConfig) => DashboardGridSettings;
6
- export declare const equalizeRowColumns: (portletIds: string[], gridSettings: DashboardGridSettings) => RowLayoutColumn[];
7
- export declare const adjustRowWidths: (columns: RowLayoutColumn[], gridSettings: DashboardGridSettings) => RowLayoutColumn[];
8
6
  /**
9
7
  * Finds the nearest scrollable ancestor of an element.
10
8
  * Used to detect scroll container for lazy loading IntersectionObserver.
@@ -0,0 +1,34 @@
1
+ import { default as React, CSSProperties, ComponentType } from 'react';
2
+ import { PortletConfig } from '../../types.js';
3
+ export declare const ICON_STYLE: CSSProperties;
4
+ export interface CardIcons {
5
+ RefreshIcon: ComponentType<{
6
+ className?: string;
7
+ style?: CSSProperties;
8
+ }>;
9
+ EditIcon: ComponentType<{
10
+ className?: string;
11
+ style?: CSSProperties;
12
+ }>;
13
+ DeleteIcon: ComponentType<{
14
+ className?: string;
15
+ style?: CSSProperties;
16
+ }>;
17
+ CopyIcon: ComponentType<{
18
+ className?: string;
19
+ style?: CSSProperties;
20
+ }>;
21
+ FilterIcon: ComponentType<{
22
+ className?: string;
23
+ style?: CSSProperties;
24
+ }>;
25
+ }
26
+ export interface EditActionButtonsProps {
27
+ portlet: PortletConfig;
28
+ icons: CardIcons;
29
+ onOpenFilterConfig: () => void;
30
+ onDuplicate: () => void;
31
+ onEdit: () => void;
32
+ onDelete: () => void;
33
+ }
34
+ export default function EditActionButtons({ portlet, icons, onOpenFilterConfig, onDuplicate, onEdit, onDelete }: EditActionButtonsProps): React.JSX.Element;
@@ -1,17 +1,7 @@
1
- import { default as React, CSSProperties, ComponentType } from 'react';
1
+ import { default as React, CSSProperties } from 'react';
2
2
  import { PortletConfig } from '../../types.js';
3
3
  import { PortletDebugDataEntry } from '../../stores/dashboardStore.js';
4
- type IconComponent = ComponentType<{
5
- className?: string;
6
- style?: CSSProperties;
7
- }>;
8
- interface CardIcons {
9
- RefreshIcon: IconComponent;
10
- EditIcon: IconComponent;
11
- DeleteIcon: IconComponent;
12
- CopyIcon: IconComponent;
13
- FilterIcon: IconComponent;
14
- }
4
+ import { CardIcons } from './EditActionButtons.js';
15
5
  interface PortletCardHeaderProps {
16
6
  portlet: PortletConfig;
17
7
  className: string;
@@ -0,0 +1,24 @@
1
+ import { default as React } from 'react';
2
+ import { PortletConfig } from '../../types.js';
3
+ import { CardIcons } from './EditActionButtons.js';
4
+ interface PortletFloatingActionsProps {
5
+ portlet: PortletConfig;
6
+ icons: CardIcons;
7
+ /** Show the edit-only actions (drag, filter config, duplicate, edit, delete). */
8
+ showEditActions: boolean;
9
+ copyAvailable: boolean;
10
+ copySuccess: boolean;
11
+ xlsExportAvailable: boolean;
12
+ exportInProgress: boolean;
13
+ onRefresh: (options?: {
14
+ bustCache?: boolean;
15
+ }) => void;
16
+ onCopyToClipboard: (event: React.MouseEvent | React.TouchEvent) => void;
17
+ onExportXlsx: (event: React.MouseEvent | React.TouchEvent) => void;
18
+ onOpenFilterConfig: () => void;
19
+ onDuplicate: () => void;
20
+ onEdit: () => void;
21
+ onDelete: () => void;
22
+ }
23
+ export default function PortletFloatingActions({ portlet, icons, showEditActions, copyAvailable, copySuccess, xlsExportAvailable, exportInProgress, onRefresh, onCopyToClipboard, onExportXlsx, onOpenFilterConfig, onDuplicate, onEdit, onDelete }: PortletFloatingActionsProps): React.JSX.Element;
24
+ export {};
@@ -1,5 +1,7 @@
1
1
  import { CSSProperties } from 'react';
2
2
  import { ChartType, ChartDisplayConfig } from '../../types.js';
3
+ /** How much chrome a card draws. Group children are frameless and headerless. */
4
+ export type PortletCardVariant = 'standalone' | 'groupChild';
3
5
  export interface PortletDisplayModes {
4
6
  isMarkdownAutoHeight: boolean;
5
7
  isTransparentContent: boolean;
@@ -17,12 +19,14 @@ export declare function resolveDisplayModes(params: {
17
19
  layoutMode: string;
18
20
  isEditMode: boolean;
19
21
  portletTitle?: string;
22
+ variant?: PortletCardVariant;
20
23
  }): PortletDisplayModes;
21
24
  export declare function buildContainerClassName(params: {
22
25
  isTransparent: boolean;
23
26
  isMarkdownAutoHeight: boolean;
24
27
  isInSelectionMode: boolean;
25
28
  extraClassName?: string;
29
+ variant?: PortletCardVariant;
26
30
  }): string;
27
31
  export declare function buildHeaderClassName(isEditMode: boolean, extraClassName?: string): string;
28
32
  export declare function buildContainerStyle(params: {
@@ -30,4 +34,5 @@ export declare function buildContainerStyle(params: {
30
34
  isInSelectionMode: boolean;
31
35
  hasSelectedFilter: boolean;
32
36
  containerStyle?: CSSProperties;
37
+ variant?: PortletCardVariant;
33
38
  }): CSSProperties;
@@ -1,10 +1,12 @@
1
1
  import { HTMLAttributes, ReactNode, ComponentType, CSSProperties } from 'react';
2
2
  import { ChartType, DashboardFilter, DashboardLayoutMode, PortletConfig } from '../../types.js';
3
+ import { PortletCardVariant } from './cardStyles.js';
3
4
  import { ColorPalette } from '../../utils/colorPalettes.js';
4
5
  export interface DashboardPortletCardProps {
5
6
  portlet: PortletConfig;
6
7
  editable: boolean;
7
8
  layoutMode?: DashboardLayoutMode;
9
+ variant?: PortletCardVariant;
8
10
  dashboardFilters?: DashboardFilter[];
9
11
  configEagerLoad?: boolean;
10
12
  loadingComponent?: ReactNode;
@@ -0,0 +1,21 @@
1
+ import { ChartAxisConfig, ChartDisplayConfig, ChartType, PortletConfig } from '../../types.js';
2
+ export interface MobilePortletDisplay {
3
+ query: string;
4
+ chartType: ChartType;
5
+ chartConfig?: ChartAxisConfig;
6
+ displayConfig?: ChartDisplayConfig;
7
+ isTransparent: boolean;
8
+ isAutoHeight: boolean;
9
+ shouldHideHeader: boolean;
10
+ /** Outer height in px; `isAutoHeight` callers ignore it. */
11
+ height: number;
12
+ /** Height available to the chart once header and padding are removed. */
13
+ contentHeight: number;
14
+ }
15
+ export declare function resolveMobilePortletDisplay(params: {
16
+ portlet: PortletConfig;
17
+ /** False for a portlet inside a group card, which supplies its own frame. */
18
+ framed: boolean;
19
+ /** How many portlets share the group card, so its height can be shared out. */
20
+ memberCount: number;
21
+ }): MobilePortletDisplay;
@@ -14,4 +14,4 @@ export { default as DashboardEditModal } from './components/DashboardEditModal.j
14
14
  export { default as Modal } from './components/Modal.js';
15
15
  export { default as AnalysisDisplayConfigPanel } from './components/AnalysisBuilder/AnalysisDisplayConfigPanel.js';
16
16
  export { createDashboardLayout, generateResponsiveLayouts, generatePortletId, findNextPosition, validateCubeQuery, createSamplePortlet } from './utils/index.js';
17
- export type { PortletConfig, DashboardConfig } from './types.js';
17
+ export type { PortletConfig, DashboardConfig, PortletGroup, PortletGroupCell } from './types.js';
@@ -0,0 +1,23 @@
1
+ import { PortletGroup } from '../../types.js';
2
+ /** Edge of a card a drag can be dropped against. Lives here, not in
3
+ * `groupUtils`, so `layoutUtils` can name it without importing back. */
4
+ export type SnapEdge = 'top' | 'right' | 'bottom' | 'left';
5
+ /**
6
+ * Split `total` integer units across `weights` using largest-remainder, never
7
+ * handing out less than 1. When `total < weights.length` every entry still gets
8
+ * 1 and the result overflows - callers accept that rather than dropping a
9
+ * portlet to zero size.
10
+ */
11
+ export declare function partitionUnits(total: number, weights: number[]): number[];
12
+ /**
13
+ * Grid-unit rectangle for every portlet in a group, given the rectangle the
14
+ * group itself occupies. Written back onto the portlets so grid mode, the
15
+ * mobile stack and thumbnails keep working without knowing groups exist.
16
+ */
17
+ export declare function deriveGroupGeometry(group: PortletGroup, x: number, y: number, w: number, h: number): Array<{
18
+ portletId: string;
19
+ x: number;
20
+ y: number;
21
+ w: number;
22
+ h: number;
23
+ }>;
@@ -0,0 +1,57 @@
1
+ import { DashboardGridSettings, PortletConfig, PortletGroup, RowLayout } from '../../types.js';
2
+ import { SnapEdge } from './groupGeometry.js';
3
+ export { deriveGroupGeometry, partitionUnits } from './groupGeometry.js';
4
+ export type { SnapEdge } from './groupGeometry.js';
5
+ export interface GroupLayoutState {
6
+ rows: RowLayout[];
7
+ groups: PortletGroup[];
8
+ }
9
+ /** Where a portlet currently lives within the rows/groups structure. */
10
+ export interface PortletLocation {
11
+ rowIndex: number;
12
+ colIndex: number;
13
+ /** Set when the portlet lives inside a group rather than owning its column. */
14
+ groupId?: string;
15
+ cellIndex?: number;
16
+ stackIndex?: number;
17
+ }
18
+ export declare const createGroupId: () => string;
19
+ /** Portlet ids in visual order: cells along the main axis, stacks within each. */
20
+ export declare const groupPortletIds: (group: PortletGroup) => string[];
21
+ /** Locate a portlet across rows and groups. Returns null when it is unplaced. */
22
+ export declare function findPortletLocation(rows: RowLayout[], groups: PortletGroup[], portletId: string): PortletLocation | null;
23
+ /** Remove a portlet from whichever group holds it. Empty cells/groups are pruned. */
24
+ export declare function removeFromGroup(groups: PortletGroup[], portletId: string): {
25
+ groups: PortletGroup[];
26
+ groupId: string | null;
27
+ };
28
+ /**
29
+ * Reconcile groups against the portlets that exist and the rows that host them.
30
+ *
31
+ * Returns rows as well as groups, because the two are coupled: collapsing a
32
+ * one-portlet group has to rewrite its column back to a plain `portletId`, and
33
+ * pruning a group has to remove its column. **Always run this before
34
+ * `normalizeRows`** - otherwise `normalizeRows` sees a `groupId` column whose
35
+ * group has just been emptied and renders a blank card.
36
+ */
37
+ export declare function normalizeGroups(groups: PortletGroup[] | undefined, portlets: PortletConfig[], rows: RowLayout[], gridSettings: DashboardGridSettings): GroupLayoutState;
38
+ /**
39
+ * Snap `movedPortletId` against an edge of `targetPortletId`.
40
+ *
41
+ * Left/right build a `row` group, top/bottom a `column` group. When the target
42
+ * is already grouped, a snap along the group's main axis adds a cell, and a
43
+ * perpendicular snap joins the target's stack (the depth-2 clamp).
44
+ *
45
+ * Returns null when the move is a no-op.
46
+ */
47
+ export declare function snapIntoGroup(state: GroupLayoutState, movedPortletId: string, targetPortletId: string, edge: SnapEdge, gridSettings: DashboardGridSettings): GroupLayoutState | null;
48
+ /**
49
+ * Dissolve a group, replacing its column with one column per member portlet in
50
+ * visual order. The row is re-equalised afterwards.
51
+ */
52
+ export declare function ungroup(state: GroupLayoutState, groupId: string, gridSettings: DashboardGridSettings): GroupLayoutState;
53
+ /** Remove a group and every portlet id it holds. Callers delete the portlets. */
54
+ export declare function deleteGroup(state: GroupLayoutState, groupId: string, gridSettings: DashboardGridSettings): {
55
+ state: GroupLayoutState;
56
+ removedPortletIds: string[];
57
+ };
@@ -1,7 +1,38 @@
1
- import { DashboardGridSettings, PortletConfig, RowLayout, RowLayoutColumn } from '../../types.js';
1
+ import { DashboardGridSettings, PortletConfig, PortletGroup, RowLayout, RowLayoutColumn } from '../../types.js';
2
2
  export declare const createRowId: () => string;
3
+ /**
4
+ * Correct a row insertion index for a source row that the move emptied.
5
+ *
6
+ * Splicing the source row out shifts every later index up by one, so an
7
+ * unadjusted index lands the row one position too low. `handleRowDrop` has
8
+ * always done this for column moves; new-row drops need it too, and hit it more
9
+ * often, because a group is usually the only column in its row.
10
+ */
11
+ export declare const adjustInsertIndexForRemovedRow: (insertIndex: number, sourceRowIndex: number, sourceRowRemoved: boolean) => number;
12
+ /**
13
+ * Distribute `cols` evenly across the given columns, preserving each column's
14
+ * identity (`portletId` **or** `groupId`) so re-equalisation never drops a group
15
+ * reference. This is the function to use; `equalizeRowColumns` below is the
16
+ * legacy id-only wrapper.
17
+ */
18
+ export declare const equalizeColumns: (columns: RowLayoutColumn[], gridSettings: DashboardGridSettings) => RowLayoutColumn[];
19
+ /**
20
+ * @deprecated Loses `groupId`. Use {@link equalizeColumns} with the real columns.
21
+ */
3
22
  export declare const equalizeRowColumns: (portletIds: string[], gridSettings: DashboardGridSettings) => RowLayoutColumn[];
4
23
  export declare const adjustRowWidths: (columns: RowLayoutColumn[], gridSettings: DashboardGridSettings) => RowLayoutColumn[];
5
24
  export declare const convertPortletsToRows: (portlets: PortletConfig[], gridSettings: DashboardGridSettings) => RowLayout[];
6
- export declare const normalizeRows: (rows: RowLayout[], portlets: PortletConfig[], gridSettings: DashboardGridSettings) => RowLayout[];
7
- export declare const convertRowsToPortlets: (rows: RowLayout[], portlets: PortletConfig[]) => PortletConfig[];
25
+ /**
26
+ * Drop columns whose target no longer exists, clamp row height, re-balance
27
+ * widths. `groups` must be the already-normalized group list - a column
28
+ * referencing a group is kept only when that group survives, so run
29
+ * `normalizeGroups` first.
30
+ */
31
+ export declare const normalizeRows: (rows: RowLayout[], portlets: PortletConfig[], gridSettings: DashboardGridSettings, groups?: PortletGroup[]) => RowLayout[];
32
+ /**
33
+ * Re-derive every portlet's x/y/w/h from the row layout. Group columns are
34
+ * subdivided via `deriveGroupGeometry`, so grouped children get real grid
35
+ * coordinates too - that is what keeps grid mode, the mobile stack and
36
+ * thumbnails working without any knowledge of groups.
37
+ */
38
+ export declare const convertRowsToPortlets: (rows: RowLayout[], portlets: PortletConfig[], groups?: PortletGroup[]) => PortletConfig[];
@@ -1,22 +1,26 @@
1
1
  import { MutableRefObject, RefObject } from 'react';
2
2
  import { StoreApi } from 'zustand';
3
- import { DashboardConfig, DashboardFilterMapping, DashboardGridSettings, DashboardLayoutMode, PortletConfig, RowLayout, ThumbnailFeatureConfig } from '../../types.js';
3
+ import { DashboardConfig, DashboardFilterMapping, DashboardGridSettings, DashboardLayoutMode, PortletConfig, PortletGroup, RowLayout, ThumbnailFeatureConfig } from '../../types.js';
4
4
  import { DashboardStore, DashboardStoreActions } from '../../stores/dashboardStore.js';
5
+ import { LayoutUpdate } from './useRowLayoutEngine.js';
6
+ import { SnapEdge } from './groupUtils.js';
5
7
  interface UseDashboardControllerOptions {
6
8
  allowedModes: DashboardLayoutMode[];
7
9
  canChangeLayoutMode: boolean;
8
10
  isResponsiveEditable: boolean;
9
11
  layoutMode: DashboardLayoutMode;
10
12
  resolvedRows: RowLayout[];
13
+ resolvedGroups: PortletGroup[];
11
14
  gridSettings: DashboardGridSettings;
12
15
  thumbnailConfig?: ThumbnailFeatureConfig;
13
16
  dashboardRef?: RefObject<HTMLElement | null>;
14
17
  storeApi: StoreApi<DashboardStore>;
15
- storeActions: Pick<DashboardStoreActions, 'setEditMode' | 'exitFilterSelectionMode' | 'openPortletModal' | 'closePortletModal' | 'openTextModal' | 'closeTextModal' | 'openFilterConfigModal' | 'closeFilterConfigModal' | 'openDeleteConfirm' | 'closeDeleteConfirm' | 'setThumbnailDirty'>;
18
+ storeActions: Pick<DashboardStoreActions, 'setEditMode' | 'exitFilterSelectionMode' | 'openPortletModal' | 'closePortletModal' | 'openTextModal' | 'closeTextModal' | 'openFilterConfigModal' | 'closeFilterConfigModal' | 'openDeleteConfirm' | 'openDeleteGroupConfirm' | 'setDraftGroups' | 'closeDeleteConfirm' | 'setThumbnailDirty'>;
16
19
  configRef: MutableRefObject<DashboardConfig>;
17
20
  onConfigChangeRef: MutableRefObject<((config: DashboardConfig) => void) | undefined>;
18
21
  onSaveRef: MutableRefObject<((config: DashboardConfig) => Promise<void> | void) | undefined>;
19
22
  onSaveThumbnailRef: MutableRefObject<((thumbnailData: string) => Promise<string | void>) | undefined>;
23
+ updateLayout: (next: LayoutUpdate, save?: boolean) => Promise<void>;
20
24
  updateRowLayout: (rows: RowLayout[], save?: boolean, portletsOverride?: PortletConfig[]) => Promise<void>;
21
25
  portletComponentRefs?: MutableRefObject<Record<string, {
22
26
  refresh: (options?: {
@@ -27,7 +31,7 @@ interface UseDashboardControllerOptions {
27
31
  bustCache?: boolean;
28
32
  }) => void;
29
33
  }
30
- export declare function useDashboardController({ allowedModes, canChangeLayoutMode, isResponsiveEditable, layoutMode, resolvedRows, gridSettings, thumbnailConfig, dashboardRef, storeApi, storeActions, configRef, onConfigChangeRef, onSaveRef, onSaveThumbnailRef, updateRowLayout, portletComponentRefs, onPortletRefresh, }: UseDashboardControllerOptions): {
34
+ export declare function useDashboardController({ allowedModes, canChangeLayoutMode, isResponsiveEditable, layoutMode, resolvedRows, resolvedGroups, gridSettings, thumbnailConfig, dashboardRef, storeApi, storeActions, configRef, onConfigChangeRef, onSaveRef, onSaveThumbnailRef, updateLayout, updateRowLayout, portletComponentRefs, onPortletRefresh, }: UseDashboardControllerOptions): {
31
35
  enterEditMode: () => void;
32
36
  exitEditMode: () => void;
33
37
  toggleEditMode: () => void;
@@ -49,5 +53,9 @@ export declare function useDashboardController({ allowedModes, canChangeLayoutMo
49
53
  selectAllForFilter: (filterId: string) => Promise<void>;
50
54
  saveFilterConfig: (mapping: DashboardFilterMapping) => Promise<void>;
51
55
  handlePaletteChange: (paletteName: string) => Promise<void>;
56
+ snapPortletIntoGroup: (movedPortletId: string, targetPortletId: string, edge: SnapEdge) => Promise<void>;
57
+ ungroupGroup: (groupId: string) => Promise<void>;
58
+ deleteGroup: (groupId: string) => void;
59
+ renameGroup: (groupId: string, title: string) => Promise<void>;
52
60
  };
53
61
  export {};
@@ -1,18 +1,28 @@
1
1
  import { MutableRefObject } from 'react';
2
- import { DashboardConfig, DashboardGridSettings, DashboardLayoutMode, PortletConfig, RowLayout } from '../../types.js';
2
+ import { DashboardConfig, DashboardGridSettings, DashboardLayoutMode, PortletConfig, PortletGroup, RowLayout } from '../../types.js';
3
+ /** A single layout commit. Rows and groups are coupled, so they travel together. */
4
+ export interface LayoutUpdate {
5
+ rows: RowLayout[];
6
+ groups?: PortletGroup[];
7
+ portlets?: PortletConfig[];
8
+ }
3
9
  interface UseRowLayoutEngineOptions {
4
10
  layoutMode: DashboardLayoutMode;
5
11
  draftRows: RowLayout[] | null;
12
+ draftGroups: PortletGroup[] | null;
6
13
  config: DashboardConfig;
7
14
  gridSettings: DashboardGridSettings;
8
15
  configRef: MutableRefObject<DashboardConfig>;
9
16
  onConfigChangeRef: MutableRefObject<((config: DashboardConfig) => void) | undefined>;
10
17
  onSaveRef: MutableRefObject<((config: DashboardConfig) => Promise<void> | void) | undefined>;
11
18
  setDraftRows: (rows: RowLayout[] | null) => void;
19
+ setDraftGroups: (groups: PortletGroup[] | null) => void;
12
20
  setThumbnailDirty: (dirty: boolean) => void;
13
21
  }
14
- export declare function useRowLayoutEngine({ layoutMode, draftRows, config, gridSettings, configRef, onConfigChangeRef, onSaveRef, setDraftRows, setThumbnailDirty, }: UseRowLayoutEngineOptions): {
22
+ export declare function useRowLayoutEngine({ layoutMode, draftRows, draftGroups, config, gridSettings, configRef, onConfigChangeRef, onSaveRef, setDraftRows, setDraftGroups, setThumbnailDirty, }: UseRowLayoutEngineOptions): {
15
23
  resolvedRows: RowLayout[];
24
+ resolvedGroups: PortletGroup[];
25
+ updateLayout: (next: LayoutUpdate, save?: boolean) => Promise<void>;
16
26
  updateRowLayout: (rows: RowLayout[], save?: boolean, portletsOverride?: PortletConfig[]) => Promise<void>;
17
27
  };
18
28
  export {};
@@ -1,7 +1,9 @@
1
1
  import { default as React } from 'react';
2
2
  import { PortletDebugDataEntry } from '../stores/dashboardStore.js';
3
3
  import { LayoutItem } from 'react-grid-layout';
4
- import { DashboardConfig, PortletConfig, RowLayout, DashboardFilter, DashboardFilterMapping, DashboardGridSettings, DashboardLayoutMode } from '../types.js';
4
+ import { DashboardConfig, PortletConfig, RowLayout, PortletGroup, DashboardFilter, DashboardFilterMapping, DashboardGridSettings, DashboardLayoutMode } from '../types.js';
5
+ import { SnapEdge } from './dashboard/groupUtils.js';
6
+ import { LayoutUpdate } from './dashboard/useRowLayoutEngine.js';
5
7
  export interface UseDashboardOptions {
6
8
  /** Dashboard configuration */
7
9
  config: DashboardConfig;
@@ -55,6 +57,7 @@ export interface UseDashboardResult {
55
57
  filterConfigPortlet: PortletConfig | null;
56
58
  /** Portlet ID pending delete confirmation */
57
59
  deleteConfirmPortletId: string | null;
60
+ deleteConfirmGroupId: string | null;
58
61
  /** Draft rows during drag operations */
59
62
  draftRows: RowLayout[] | null;
60
63
  /** Whether a portlet is being dragged */
@@ -71,6 +74,9 @@ export interface UseDashboardResult {
71
74
  selectedFilter: DashboardFilter | null;
72
75
  /** Resolved rows for row-based layout */
73
76
  resolvedRows: RowLayout[];
77
+ resolvedGroups: PortletGroup[];
78
+ /** Modes the toggle should offer; a subset of allowedModes. */
79
+ selectableModes: DashboardLayoutMode[];
74
80
  /** Current layout mode */
75
81
  layoutMode: DashboardLayoutMode;
76
82
  /** Allowed layout modes */
@@ -92,6 +98,7 @@ export interface UseDashboardActions {
92
98
  openFilterConfig: (portlet: PortletConfig) => void;
93
99
  closeFilterConfig: () => void;
94
100
  setDraftRows: (rows: RowLayout[] | null) => void;
101
+ setDraftGroups: (groups: PortletGroup[] | null) => void;
95
102
  setIsDraggingPortlet: (isDragging: boolean) => void;
96
103
  setLastKnownLayout: (layout: LayoutItem[]) => void;
97
104
  setIsInitialized: (initialized: boolean) => void;
@@ -102,6 +109,7 @@ export interface UseDashboardActions {
102
109
  } | null) => void;
103
110
  clearDragState: () => void;
104
111
  hasLayoutActuallyChanged: (newLayout: LayoutItem[]) => boolean;
112
+ updateLayout: (next: LayoutUpdate, save?: boolean) => Promise<void>;
105
113
  updateRowLayout: (rows: RowLayout[], save?: boolean, portletsOverride?: PortletConfig[]) => Promise<void>;
106
114
  handleLayoutModeChange: (mode: DashboardLayoutMode) => Promise<void>;
107
115
  savePortlet: (portletData: PortletConfig | Omit<PortletConfig, 'id' | 'x' | 'y'>) => Promise<string | null>;
@@ -114,6 +122,11 @@ export interface UseDashboardActions {
114
122
  selectAllForFilter: (filterId: string) => Promise<void>;
115
123
  saveFilterConfig: (mapping: DashboardFilterMapping) => Promise<void>;
116
124
  handlePaletteChange: (paletteName: string) => Promise<void>;
125
+ snapPortletIntoGroup: (movedPortletId: string, targetPortletId: string, edge: SnapEdge) => Promise<void>;
126
+ ungroupGroup: (groupId: string) => Promise<void>;
127
+ deleteGroup: (groupId: string) => void;
128
+ renameGroup: (groupId: string, title: string) => Promise<void>;
129
+ openDeleteGroupConfirm: (groupId: string) => void;
117
130
  openDeleteConfirm: (portletId: string) => void;
118
131
  closeDeleteConfirm: () => void;
119
132
  confirmDelete: () => Promise<void>;
@@ -55,7 +55,7 @@ export { useTheme } from './hooks/useTheme.js';
55
55
  export { useScrollDetection } from './hooks/useScrollDetection.js';
56
56
  export { useElementVisibility } from './hooks/useElementVisibility.js';
57
57
  export { useDrillInteraction } from './hooks/useDrillInteraction.js';
58
- export type { PortletConfig, ChartType, BuiltInChartType, ChartAxisConfig, ChartDisplayConfig, ChartProps, ColorPalette, CubeQuery, CubeQueryOptions, CubeApiOptions, DashboardConfig, FeaturesConfig, XlsExportFeatureConfig, ThumbnailFeatureConfig, MultiQueryConfig, QueryMergeStrategy, FunnelBindingKey, FunnelBindingKeyMapping, FunnelStep, FunnelConfig, FunnelStepResult, FunnelExecutionResult, FunnelChartData, FunnelValidationError, FunnelValidationResult, UseFunnelQueryOptions, UseFunnelQueryResult, ServerFlowQuery, FlowQueryConfig, FlowChartData, FlowSliceState, SankeyNode, SankeyLink, FlowStartingStep, FlowResultRow, } from './types.js';
58
+ export type { PortletConfig, ChartType, BuiltInChartType, ChartAxisConfig, ChartDisplayConfig, ChartProps, ColorPalette, CubeQuery, CubeQueryOptions, CubeApiOptions, DashboardConfig, PortletGroup, PortletGroupCell, FeaturesConfig, XlsExportFeatureConfig, ThumbnailFeatureConfig, MultiQueryConfig, QueryMergeStrategy, FunnelBindingKey, FunnelBindingKeyMapping, FunnelStep, FunnelConfig, FunnelStepResult, FunnelExecutionResult, FunnelChartData, FunnelValidationError, FunnelValidationResult, UseFunnelQueryOptions, UseFunnelQueryResult, ServerFlowQuery, FlowQueryConfig, FlowChartData, FlowSliceState, SankeyNode, SankeyLink, FlowStartingStep, FlowResultRow, } from './types.js';
59
59
  export { isQueryConfig, isFunnelConfig, isFlowConfig, isRetentionConfig, isMultiQuery, isSingleQuery, isValidAnalysisConfig, createDefaultQueryConfig, createDefaultFunnelConfig, createDefaultFlowConfig, createDefaultRetentionConfig, createDefaultConfig, isValidAnalysisWorkspace, createDefaultWorkspace } from './types/analysisConfig.js';
60
60
  export type { AnalysisConfig, QueryAnalysisConfig, FunnelAnalysisConfig, FlowAnalysisConfig, RetentionAnalysisConfig, AnalysisWorkspace } from './types/analysisConfig.js';
61
61
  export { isMultiQueryConfig, isServerFunnelQuery, isServerFlowQuery, isSankeyData } from './types.js';