@sqlrooms/mosaic 0.29.0-rc.1 → 0.29.0-rc.3

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 (398) hide show
  1. package/README.md +161 -2
  2. package/dist/MosaicChart.d.ts +20 -0
  3. package/dist/MosaicChart.d.ts.map +1 -0
  4. package/dist/MosaicChart.js +25 -0
  5. package/dist/MosaicChart.js.map +1 -0
  6. package/dist/MosaicChartBuilder.d.ts +67 -0
  7. package/dist/MosaicChartBuilder.d.ts.map +1 -0
  8. package/dist/MosaicChartBuilder.js +33 -0
  9. package/dist/MosaicChartBuilder.js.map +1 -0
  10. package/dist/MosaicColorLegend.d.ts +18 -0
  11. package/dist/MosaicColorLegend.d.ts.map +1 -0
  12. package/dist/MosaicColorLegend.js +117 -0
  13. package/dist/MosaicColorLegend.js.map +1 -0
  14. package/dist/MosaicSlice.d.ts +27 -13
  15. package/dist/MosaicSlice.d.ts.map +1 -1
  16. package/dist/MosaicSlice.js +140 -42
  17. package/dist/MosaicSlice.js.map +1 -1
  18. package/dist/ResponsivePlot.d.ts +23 -0
  19. package/dist/ResponsivePlot.d.ts.map +1 -0
  20. package/dist/ResponsivePlot.js +43 -0
  21. package/dist/ResponsivePlot.js.map +1 -0
  22. package/dist/VgPlotChart.d.ts +24 -0
  23. package/dist/VgPlotChart.d.ts.map +1 -1
  24. package/dist/VgPlotChart.js +127 -21
  25. package/dist/VgPlotChart.js.map +1 -1
  26. package/dist/chart-builders/ChartBuilderActions.d.ts +6 -0
  27. package/dist/chart-builders/ChartBuilderActions.d.ts.map +1 -0
  28. package/dist/chart-builders/ChartBuilderActions.js +28 -0
  29. package/dist/chart-builders/ChartBuilderActions.js.map +1 -0
  30. package/dist/chart-builders/ChartBuilderContent.d.ts +28 -0
  31. package/dist/chart-builders/ChartBuilderContent.d.ts.map +1 -0
  32. package/dist/chart-builders/ChartBuilderContent.js +28 -0
  33. package/dist/chart-builders/ChartBuilderContent.js.map +1 -0
  34. package/dist/chart-builders/ChartBuilderContext.d.ts +16 -0
  35. package/dist/chart-builders/ChartBuilderContext.d.ts.map +1 -0
  36. package/dist/chart-builders/ChartBuilderContext.js +15 -0
  37. package/dist/chart-builders/ChartBuilderContext.js.map +1 -0
  38. package/dist/chart-builders/ChartBuilderDialog.d.ts +48 -0
  39. package/dist/chart-builders/ChartBuilderDialog.d.ts.map +1 -0
  40. package/dist/chart-builders/ChartBuilderDialog.js +30 -0
  41. package/dist/chart-builders/ChartBuilderDialog.js.map +1 -0
  42. package/dist/chart-builders/ChartBuilderFields.d.ts +6 -0
  43. package/dist/chart-builders/ChartBuilderFields.d.ts.map +1 -0
  44. package/dist/chart-builders/ChartBuilderFields.js +25 -0
  45. package/dist/chart-builders/ChartBuilderFields.js.map +1 -0
  46. package/dist/chart-builders/ChartBuilderRoot.d.ts +27 -0
  47. package/dist/chart-builders/ChartBuilderRoot.d.ts.map +1 -0
  48. package/dist/chart-builders/ChartBuilderRoot.js +61 -0
  49. package/dist/chart-builders/ChartBuilderRoot.js.map +1 -0
  50. package/dist/chart-builders/ChartBuilderTypeGrid.d.ts +7 -0
  51. package/dist/chart-builders/ChartBuilderTypeGrid.d.ts.map +1 -0
  52. package/dist/chart-builders/ChartBuilderTypeGrid.js +23 -0
  53. package/dist/chart-builders/ChartBuilderTypeGrid.js.map +1 -0
  54. package/dist/chart-builders/FieldSelectorInput.d.ts +13 -0
  55. package/dist/chart-builders/FieldSelectorInput.d.ts.map +1 -0
  56. package/dist/chart-builders/FieldSelectorInput.js +19 -0
  57. package/dist/chart-builders/FieldSelectorInput.js.map +1 -0
  58. package/dist/chart-builders/builders.d.ts +34 -0
  59. package/dist/chart-builders/builders.d.ts.map +1 -0
  60. package/dist/chart-builders/builders.js +51 -0
  61. package/dist/chart-builders/builders.js.map +1 -0
  62. package/dist/chart-builders/chartSpecTitle.d.ts +6 -0
  63. package/dist/chart-builders/chartSpecTitle.d.ts.map +1 -0
  64. package/dist/chart-builders/chartSpecTitle.js +8 -0
  65. package/dist/chart-builders/chartSpecTitle.js.map +1 -0
  66. package/dist/chart-builders/chartTypeUtils.d.ts +17 -0
  67. package/dist/chart-builders/chartTypeUtils.d.ts.map +1 -0
  68. package/dist/chart-builders/chartTypeUtils.js +55 -0
  69. package/dist/chart-builders/chartTypeUtils.js.map +1 -0
  70. package/dist/chart-builders/constants.d.ts +7 -0
  71. package/dist/chart-builders/constants.d.ts.map +1 -0
  72. package/dist/chart-builders/constants.js +34 -0
  73. package/dist/chart-builders/constants.js.map +1 -0
  74. package/dist/chart-builders/createChartBuilderStore.d.ts +11 -0
  75. package/dist/chart-builders/createChartBuilderStore.d.ts.map +1 -0
  76. package/dist/chart-builders/createChartBuilderStore.js +26 -0
  77. package/dist/chart-builders/createChartBuilderStore.js.map +1 -0
  78. package/dist/chart-builders/describeChartSpecs.d.ts +9 -0
  79. package/dist/chart-builders/describeChartSpecs.d.ts.map +1 -0
  80. package/dist/chart-builders/describeChartSpecs.js +41 -0
  81. package/dist/chart-builders/describeChartSpecs.js.map +1 -0
  82. package/dist/chart-builders/hooks/useChartFieldForm.d.ts +13 -0
  83. package/dist/chart-builders/hooks/useChartFieldForm.d.ts.map +1 -0
  84. package/dist/chart-builders/hooks/useChartFieldForm.js +12 -0
  85. package/dist/chart-builders/hooks/useChartFieldForm.js.map +1 -0
  86. package/dist/chart-builders/types.d.ts +23 -0
  87. package/dist/chart-builders/types.d.ts.map +1 -0
  88. package/dist/chart-builders/types.js +17 -0
  89. package/dist/chart-builders/types.js.map +1 -0
  90. package/dist/chart-types/base-types.d.ts +54 -0
  91. package/dist/chart-types/base-types.d.ts.map +1 -0
  92. package/dist/chart-types/base-types.js +6 -0
  93. package/dist/chart-types/base-types.js.map +1 -0
  94. package/dist/chart-types/box-plot/definition.d.ts +4 -0
  95. package/dist/chart-types/box-plot/definition.d.ts.map +1 -0
  96. package/dist/chart-types/box-plot/definition.js +45 -0
  97. package/dist/chart-types/box-plot/definition.js.map +1 -0
  98. package/dist/chart-types/box-plot/index.d.ts +3 -0
  99. package/dist/chart-types/box-plot/index.d.ts.map +1 -0
  100. package/dist/chart-types/box-plot/index.js +3 -0
  101. package/dist/chart-types/box-plot/index.js.map +1 -0
  102. package/dist/chart-types/box-plot/schema.d.ts +17 -0
  103. package/dist/chart-types/box-plot/schema.d.ts.map +1 -0
  104. package/dist/chart-types/box-plot/schema.js +12 -0
  105. package/dist/chart-types/box-plot/schema.js.map +1 -0
  106. package/dist/chart-types/bubble-chart/definition.d.ts +4 -0
  107. package/dist/chart-types/bubble-chart/definition.d.ts.map +1 -0
  108. package/dist/chart-types/bubble-chart/definition.js +48 -0
  109. package/dist/chart-types/bubble-chart/definition.js.map +1 -0
  110. package/dist/chart-types/bubble-chart/index.d.ts +3 -0
  111. package/dist/chart-types/bubble-chart/index.d.ts.map +1 -0
  112. package/dist/chart-types/bubble-chart/index.js +3 -0
  113. package/dist/chart-types/bubble-chart/index.js.map +1 -0
  114. package/dist/chart-types/bubble-chart/schema.d.ts +17 -0
  115. package/dist/chart-types/bubble-chart/schema.d.ts.map +1 -0
  116. package/dist/chart-types/bubble-chart/schema.js +12 -0
  117. package/dist/chart-types/bubble-chart/schema.js.map +1 -0
  118. package/dist/chart-types/count-plot/definition.d.ts +4 -0
  119. package/dist/chart-types/count-plot/definition.d.ts.map +1 -0
  120. package/dist/chart-types/count-plot/definition.js +50 -0
  121. package/dist/chart-types/count-plot/definition.js.map +1 -0
  122. package/dist/chart-types/count-plot/index.d.ts +3 -0
  123. package/dist/chart-types/count-plot/index.d.ts.map +1 -0
  124. package/dist/chart-types/count-plot/index.js +3 -0
  125. package/dist/chart-types/count-plot/index.js.map +1 -0
  126. package/dist/chart-types/count-plot/schema.d.ts +15 -0
  127. package/dist/chart-types/count-plot/schema.d.ts.map +1 -0
  128. package/dist/chart-types/count-plot/schema.js +11 -0
  129. package/dist/chart-types/count-plot/schema.js.map +1 -0
  130. package/dist/chart-types/custom-spec/definition.d.ts +4 -0
  131. package/dist/chart-types/custom-spec/definition.d.ts.map +1 -0
  132. package/dist/chart-types/custom-spec/definition.js +28 -0
  133. package/dist/chart-types/custom-spec/definition.js.map +1 -0
  134. package/dist/chart-types/custom-spec/index.d.ts +3 -0
  135. package/dist/chart-types/custom-spec/index.d.ts.map +1 -0
  136. package/dist/chart-types/custom-spec/index.js +3 -0
  137. package/dist/chart-types/custom-spec/index.js.map +1 -0
  138. package/dist/chart-types/custom-spec/schema.d.ts +11 -0
  139. package/dist/chart-types/custom-spec/schema.d.ts.map +1 -0
  140. package/dist/chart-types/custom-spec/schema.js +9 -0
  141. package/dist/chart-types/custom-spec/schema.js.map +1 -0
  142. package/dist/chart-types/ecdf/definition.d.ts +4 -0
  143. package/dist/chart-types/ecdf/definition.d.ts.map +1 -0
  144. package/dist/chart-types/ecdf/definition.js +47 -0
  145. package/dist/chart-types/ecdf/definition.js.map +1 -0
  146. package/dist/chart-types/ecdf/index.d.ts +3 -0
  147. package/dist/chart-types/ecdf/index.d.ts.map +1 -0
  148. package/dist/chart-types/ecdf/index.js +3 -0
  149. package/dist/chart-types/ecdf/index.js.map +1 -0
  150. package/dist/chart-types/ecdf/schema.d.ts +15 -0
  151. package/dist/chart-types/ecdf/schema.d.ts.map +1 -0
  152. package/dist/chart-types/ecdf/schema.js +11 -0
  153. package/dist/chart-types/ecdf/schema.js.map +1 -0
  154. package/dist/chart-types/heatmap/definition.d.ts +4 -0
  155. package/dist/chart-types/heatmap/definition.d.ts.map +1 -0
  156. package/dist/chart-types/heatmap/definition.js +49 -0
  157. package/dist/chart-types/heatmap/definition.js.map +1 -0
  158. package/dist/chart-types/heatmap/index.d.ts +3 -0
  159. package/dist/chart-types/heatmap/index.d.ts.map +1 -0
  160. package/dist/chart-types/heatmap/index.js +3 -0
  161. package/dist/chart-types/heatmap/index.js.map +1 -0
  162. package/dist/chart-types/heatmap/schema.d.ts +17 -0
  163. package/dist/chart-types/heatmap/schema.d.ts.map +1 -0
  164. package/dist/chart-types/heatmap/schema.js +12 -0
  165. package/dist/chart-types/heatmap/schema.js.map +1 -0
  166. package/dist/chart-types/histogram/definition.d.ts +4 -0
  167. package/dist/chart-types/histogram/definition.d.ts.map +1 -0
  168. package/dist/chart-types/histogram/definition.js +49 -0
  169. package/dist/chart-types/histogram/definition.js.map +1 -0
  170. package/dist/chart-types/histogram/index.d.ts +3 -0
  171. package/dist/chart-types/histogram/index.d.ts.map +1 -0
  172. package/dist/chart-types/histogram/index.js +3 -0
  173. package/dist/chart-types/histogram/index.js.map +1 -0
  174. package/dist/chart-types/histogram/schema.d.ts +15 -0
  175. package/dist/chart-types/histogram/schema.d.ts.map +1 -0
  176. package/dist/chart-types/histogram/schema.js +11 -0
  177. package/dist/chart-types/histogram/schema.js.map +1 -0
  178. package/dist/chart-types/index.d.ts +109 -0
  179. package/dist/chart-types/index.d.ts.map +1 -0
  180. package/dist/chart-types/index.js +70 -0
  181. package/dist/chart-types/index.js.map +1 -0
  182. package/dist/chart-types/line-chart/definition.d.ts +4 -0
  183. package/dist/chart-types/line-chart/definition.d.ts.map +1 -0
  184. package/dist/chart-types/line-chart/definition.js +46 -0
  185. package/dist/chart-types/line-chart/definition.js.map +1 -0
  186. package/dist/chart-types/line-chart/index.d.ts +3 -0
  187. package/dist/chart-types/line-chart/index.d.ts.map +1 -0
  188. package/dist/chart-types/line-chart/index.js +3 -0
  189. package/dist/chart-types/line-chart/index.js.map +1 -0
  190. package/dist/chart-types/line-chart/schema.d.ts +17 -0
  191. package/dist/chart-types/line-chart/schema.d.ts.map +1 -0
  192. package/dist/chart-types/line-chart/schema.js +12 -0
  193. package/dist/chart-types/line-chart/schema.js.map +1 -0
  194. package/dist/chart-types/registry.d.ts +5 -0
  195. package/dist/chart-types/registry.d.ts.map +1 -0
  196. package/dist/chart-types/registry.js +28 -0
  197. package/dist/chart-types/registry.js.map +1 -0
  198. package/dist/dashboard/DashboardPanelErrorBoundary.d.ts +17 -0
  199. package/dist/dashboard/DashboardPanelErrorBoundary.d.ts.map +1 -0
  200. package/dist/dashboard/DashboardPanelErrorBoundary.js +21 -0
  201. package/dist/dashboard/DashboardPanelErrorBoundary.js.map +1 -0
  202. package/dist/dashboard/MosaicDashboard.d.ts +18 -0
  203. package/dist/dashboard/MosaicDashboard.d.ts.map +1 -0
  204. package/dist/dashboard/MosaicDashboard.js +91 -0
  205. package/dist/dashboard/MosaicDashboard.js.map +1 -0
  206. package/dist/dashboard/MosaicDashboardContext.d.ts +12 -0
  207. package/dist/dashboard/MosaicDashboardContext.d.ts.map +1 -0
  208. package/dist/dashboard/MosaicDashboardContext.js +10 -0
  209. package/dist/dashboard/MosaicDashboardContext.js.map +1 -0
  210. package/dist/dashboard/MosaicDashboardPanel.d.ts +3 -0
  211. package/dist/dashboard/MosaicDashboardPanel.d.ts.map +1 -0
  212. package/dist/dashboard/MosaicDashboardPanel.js +26 -0
  213. package/dist/dashboard/MosaicDashboardPanel.js.map +1 -0
  214. package/dist/dashboard/MosaicDashboardPanelDragOverlay.d.ts +8 -0
  215. package/dist/dashboard/MosaicDashboardPanelDragOverlay.d.ts.map +1 -0
  216. package/dist/dashboard/MosaicDashboardPanelDragOverlay.js +17 -0
  217. package/dist/dashboard/MosaicDashboardPanelDragOverlay.js.map +1 -0
  218. package/dist/dashboard/MosaicDashboardPanelHeader.d.ts +13 -0
  219. package/dist/dashboard/MosaicDashboardPanelHeader.d.ts.map +1 -0
  220. package/dist/dashboard/MosaicDashboardPanelHeader.js +30 -0
  221. package/dist/dashboard/MosaicDashboardPanelHeader.js.map +1 -0
  222. package/dist/dashboard/MosaicDashboardPanelLayout.d.ts +10 -0
  223. package/dist/dashboard/MosaicDashboardPanelLayout.d.ts.map +1 -0
  224. package/dist/dashboard/MosaicDashboardPanelLayout.js +25 -0
  225. package/dist/dashboard/MosaicDashboardPanelLayout.js.map +1 -0
  226. package/dist/dashboard/MosaicDashboardPanels.d.ts +2 -0
  227. package/dist/dashboard/MosaicDashboardPanels.d.ts.map +1 -0
  228. package/dist/dashboard/MosaicDashboardPanels.js +52 -0
  229. package/dist/dashboard/MosaicDashboardPanels.js.map +1 -0
  230. package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.d.ts +3 -0
  231. package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.d.ts.map +1 -0
  232. package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.js +32 -0
  233. package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.js.map +1 -0
  234. package/dist/dashboard/MosaicDashboardSlice.d.ts +523 -0
  235. package/dist/dashboard/MosaicDashboardSlice.d.ts.map +1 -0
  236. package/dist/dashboard/MosaicDashboardSlice.js +615 -0
  237. package/dist/dashboard/MosaicDashboardSlice.js.map +1 -0
  238. package/dist/dashboard/MosaicDashboardToolbar.d.ts +3 -0
  239. package/dist/dashboard/MosaicDashboardToolbar.d.ts.map +1 -0
  240. package/dist/dashboard/MosaicDashboardToolbar.js +81 -0
  241. package/dist/dashboard/MosaicDashboardToolbar.js.map +1 -0
  242. package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.d.ts +4 -0
  243. package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.d.ts.map +1 -0
  244. package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.js +29 -0
  245. package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.js.map +1 -0
  246. package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.d.ts +3 -0
  247. package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.d.ts.map +1 -0
  248. package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.js +68 -0
  249. package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.js.map +1 -0
  250. package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts +8 -0
  251. package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts.map +1 -0
  252. package/dist/dashboard/VgPlotSpecPopoverEditor.js +40 -0
  253. package/dist/dashboard/VgPlotSpecPopoverEditor.js.map +1 -0
  254. package/dist/dashboard/chart-settings/ChartSettings.d.ts +39 -0
  255. package/dist/dashboard/chart-settings/ChartSettings.d.ts.map +1 -0
  256. package/dist/dashboard/chart-settings/ChartSettings.js +90 -0
  257. package/dist/dashboard/chart-settings/ChartSettings.js.map +1 -0
  258. package/dist/dashboard/chart-settings/ChartSettingsContext.d.ts +20 -0
  259. package/dist/dashboard/chart-settings/ChartSettingsContext.d.ts.map +1 -0
  260. package/dist/dashboard/chart-settings/ChartSettingsContext.js +14 -0
  261. package/dist/dashboard/chart-settings/ChartSettingsContext.js.map +1 -0
  262. package/dist/dashboard/chart-settings/ChartSettingsPanel.d.ts +11 -0
  263. package/dist/dashboard/chart-settings/ChartSettingsPanel.d.ts.map +1 -0
  264. package/dist/dashboard/chart-settings/ChartSettingsPanel.js +8 -0
  265. package/dist/dashboard/chart-settings/ChartSettingsPanel.js.map +1 -0
  266. package/dist/dashboard/chart-settings/ChartTypeSelector.d.ts +11 -0
  267. package/dist/dashboard/chart-settings/ChartTypeSelector.d.ts.map +1 -0
  268. package/dist/dashboard/chart-settings/ChartTypeSelector.js +17 -0
  269. package/dist/dashboard/chart-settings/ChartTypeSelector.js.map +1 -0
  270. package/dist/dashboard/chart-settings/DynamicChartSettings.d.ts +11 -0
  271. package/dist/dashboard/chart-settings/DynamicChartSettings.d.ts.map +1 -0
  272. package/dist/dashboard/chart-settings/DynamicChartSettings.js +19 -0
  273. package/dist/dashboard/chart-settings/DynamicChartSettings.js.map +1 -0
  274. package/dist/dashboard/chart-settings/index.d.ts +6 -0
  275. package/dist/dashboard/chart-settings/index.d.ts.map +1 -0
  276. package/dist/dashboard/chart-settings/index.js +6 -0
  277. package/dist/dashboard/chart-settings/index.js.map +1 -0
  278. package/dist/dashboard/chart-settings/useTableColumns.d.ts +3 -0
  279. package/dist/dashboard/chart-settings/useTableColumns.d.ts.map +1 -0
  280. package/dist/dashboard/chart-settings/useTableColumns.js +12 -0
  281. package/dist/dashboard/chart-settings/useTableColumns.js.map +1 -0
  282. package/dist/dashboard/defaultPanelRenderers.d.ts +3 -0
  283. package/dist/dashboard/defaultPanelRenderers.d.ts.map +1 -0
  284. package/dist/dashboard/defaultPanelRenderers.js +11 -0
  285. package/dist/dashboard/defaultPanelRenderers.js.map +1 -0
  286. package/dist/dashboard/generateMosaicChartSpec.d.ts +15 -0
  287. package/dist/dashboard/generateMosaicChartSpec.d.ts.map +1 -0
  288. package/dist/dashboard/generateMosaicChartSpec.js +30 -0
  289. package/dist/dashboard/generateMosaicChartSpec.js.map +1 -0
  290. package/dist/editor/MosaicChartContainer.d.ts +51 -0
  291. package/dist/editor/MosaicChartContainer.d.ts.map +1 -0
  292. package/dist/editor/MosaicChartContainer.js +39 -0
  293. package/dist/editor/MosaicChartContainer.js.map +1 -0
  294. package/dist/editor/MosaicChartDisplay.d.ts +18 -0
  295. package/dist/editor/MosaicChartDisplay.d.ts.map +1 -0
  296. package/dist/editor/MosaicChartDisplay.js +26 -0
  297. package/dist/editor/MosaicChartDisplay.js.map +1 -0
  298. package/dist/editor/MosaicChartEditorActions.d.ts +20 -0
  299. package/dist/editor/MosaicChartEditorActions.d.ts.map +1 -0
  300. package/dist/editor/MosaicChartEditorActions.js +18 -0
  301. package/dist/editor/MosaicChartEditorActions.js.map +1 -0
  302. package/dist/editor/MosaicCodeMirrorEditor.d.ts +15 -0
  303. package/dist/editor/MosaicCodeMirrorEditor.d.ts.map +1 -0
  304. package/dist/editor/MosaicCodeMirrorEditor.js +26 -0
  305. package/dist/editor/MosaicCodeMirrorEditor.js.map +1 -0
  306. package/dist/editor/MosaicEditorContext.d.ts +8 -0
  307. package/dist/editor/MosaicEditorContext.d.ts.map +1 -0
  308. package/dist/editor/MosaicEditorContext.js +14 -0
  309. package/dist/editor/MosaicEditorContext.js.map +1 -0
  310. package/dist/editor/MosaicSpecEditorPanel.d.ts +20 -0
  311. package/dist/editor/MosaicSpecEditorPanel.d.ts.map +1 -0
  312. package/dist/editor/MosaicSpecEditorPanel.js +25 -0
  313. package/dist/editor/MosaicSpecEditorPanel.js.map +1 -0
  314. package/dist/editor/mosaicSchema.d.ts +20 -0
  315. package/dist/editor/mosaicSchema.d.ts.map +1 -0
  316. package/dist/editor/mosaicSchema.js +57 -0
  317. package/dist/editor/mosaicSchema.js.map +1 -0
  318. package/dist/editor/types.d.ts +72 -0
  319. package/dist/editor/types.d.ts.map +1 -0
  320. package/dist/editor/types.js +2 -0
  321. package/dist/editor/types.js.map +1 -0
  322. package/dist/editor/useMosaicChartEditor.d.ts +9 -0
  323. package/dist/editor/useMosaicChartEditor.d.ts.map +1 -0
  324. package/dist/editor/useMosaicChartEditor.js +199 -0
  325. package/dist/editor/useMosaicChartEditor.js.map +1 -0
  326. package/dist/index.d.ts +53 -2
  327. package/dist/index.d.ts.map +1 -1
  328. package/dist/index.js +37 -1
  329. package/dist/index.js.map +1 -1
  330. package/dist/profiler/MosaicProfiler.d.ts +32 -0
  331. package/dist/profiler/MosaicProfiler.d.ts.map +1 -0
  332. package/dist/profiler/MosaicProfiler.js +57 -0
  333. package/dist/profiler/MosaicProfiler.js.map +1 -0
  334. package/dist/profiler/MosaicProfilerHeader.d.ts +7 -0
  335. package/dist/profiler/MosaicProfilerHeader.d.ts.map +1 -0
  336. package/dist/profiler/MosaicProfilerHeader.js +196 -0
  337. package/dist/profiler/MosaicProfilerHeader.js.map +1 -0
  338. package/dist/profiler/MosaicProfilerRows.d.ts +9 -0
  339. package/dist/profiler/MosaicProfilerRows.d.ts.map +1 -0
  340. package/dist/profiler/MosaicProfilerRows.js +65 -0
  341. package/dist/profiler/MosaicProfilerRows.js.map +1 -0
  342. package/dist/profiler/MosaicProfilerStatusBar.d.ts +9 -0
  343. package/dist/profiler/MosaicProfilerStatusBar.d.ts.map +1 -0
  344. package/dist/profiler/MosaicProfilerStatusBar.js +28 -0
  345. package/dist/profiler/MosaicProfilerStatusBar.js.map +1 -0
  346. package/dist/profiler/ProfilerCategoryClient.d.ts +50 -0
  347. package/dist/profiler/ProfilerCategoryClient.d.ts.map +1 -0
  348. package/dist/profiler/ProfilerCategoryClient.js +121 -0
  349. package/dist/profiler/ProfilerCategoryClient.js.map +1 -0
  350. package/dist/profiler/ProfilerCountClient.d.ts +28 -0
  351. package/dist/profiler/ProfilerCountClient.d.ts.map +1 -0
  352. package/dist/profiler/ProfilerCountClient.js +51 -0
  353. package/dist/profiler/ProfilerCountClient.js.map +1 -0
  354. package/dist/profiler/ProfilerHistogramClient.d.ts +69 -0
  355. package/dist/profiler/ProfilerHistogramClient.d.ts.map +1 -0
  356. package/dist/profiler/ProfilerHistogramClient.js +179 -0
  357. package/dist/profiler/ProfilerHistogramClient.js.map +1 -0
  358. package/dist/profiler/ProfilerPageClient.d.ts +37 -0
  359. package/dist/profiler/ProfilerPageClient.d.ts.map +1 -0
  360. package/dist/profiler/ProfilerPageClient.js +65 -0
  361. package/dist/profiler/ProfilerPageClient.js.map +1 -0
  362. package/dist/profiler/ProfilerUnsupportedSummaryClient.d.ts +24 -0
  363. package/dist/profiler/ProfilerUnsupportedSummaryClient.d.ts.map +1 -0
  364. package/dist/profiler/ProfilerUnsupportedSummaryClient.js +51 -0
  365. package/dist/profiler/ProfilerUnsupportedSummaryClient.js.map +1 -0
  366. package/dist/profiler/createProfilerStore.d.ts +45 -0
  367. package/dist/profiler/createProfilerStore.d.ts.map +1 -0
  368. package/dist/profiler/createProfilerStore.js +120 -0
  369. package/dist/profiler/createProfilerStore.js.map +1 -0
  370. package/dist/profiler/layout.d.ts +7 -0
  371. package/dist/profiler/layout.d.ts.map +1 -0
  372. package/dist/profiler/layout.js +13 -0
  373. package/dist/profiler/layout.js.map +1 -0
  374. package/dist/profiler/profilerController.d.ts +64 -0
  375. package/dist/profiler/profilerController.d.ts.map +1 -0
  376. package/dist/profiler/profilerController.js +123 -0
  377. package/dist/profiler/profilerController.js.map +1 -0
  378. package/dist/profiler/types.d.ts +86 -0
  379. package/dist/profiler/types.d.ts.map +1 -0
  380. package/dist/profiler/types.js +2 -0
  381. package/dist/profiler/types.js.map +1 -0
  382. package/dist/profiler/useMosaicProfiler.d.ts +7 -0
  383. package/dist/profiler/useMosaicProfiler.d.ts.map +1 -0
  384. package/dist/profiler/useMosaicProfiler.js +339 -0
  385. package/dist/profiler/useMosaicProfiler.js.map +1 -0
  386. package/dist/profiler/utils.d.ts +61 -0
  387. package/dist/profiler/utils.d.ts.map +1 -0
  388. package/dist/profiler/utils.js +347 -0
  389. package/dist/profiler/utils.js.map +1 -0
  390. package/dist/tableInterop.d.ts +30 -0
  391. package/dist/tableInterop.d.ts.map +1 -0
  392. package/dist/tableInterop.js +85 -0
  393. package/dist/tableInterop.js.map +1 -0
  394. package/dist/useMosaicClient.d.ts +5 -15
  395. package/dist/useMosaicClient.d.ts.map +1 -1
  396. package/dist/useMosaicClient.js +22 -6
  397. package/dist/useMosaicClient.js.map +1 -1
  398. package/package.json +30 -6
@@ -1,12 +1,64 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { astToDOM, parseSpec } from '@uwdata/mosaic-spec';
3
- import { useEffect, useRef } from 'react';
3
+ import { memo, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
4
+ import { ResponsivePlot } from './ResponsivePlot';
5
+ function areEquivalentParams(left, right) {
6
+ if (left === right) {
7
+ return true;
8
+ }
9
+ if (!left || !right || left.size !== right.size) {
10
+ return false;
11
+ }
12
+ for (const [key, value] of left) {
13
+ if (right.get(key) !== value) {
14
+ return false;
15
+ }
16
+ }
17
+ return true;
18
+ }
4
19
  export function isSpecProps(props) {
5
20
  return 'spec' in props;
6
21
  }
7
22
  export function isPlotProps(props) {
8
23
  return 'plot' in props;
9
24
  }
25
+ export function destroyRetainedVgPlotChart(chart) {
26
+ const plot = getPlotInstance(chart.element);
27
+ plot?.marks?.forEach((mark) => {
28
+ mark.destroy?.();
29
+ });
30
+ }
31
+ function getPlotInstance(element) {
32
+ const plot = element.value;
33
+ return plot && typeof plot === 'object' ? plot : null;
34
+ }
35
+ function resizeChartElement(element, size) {
36
+ const plot = getPlotInstance(element);
37
+ if (!plot?.setAttribute || !plot.render) {
38
+ return false;
39
+ }
40
+ const widthChanged = plot.setAttribute('width', size.width);
41
+ const heightChanged = plot.setAttribute('height', size.height);
42
+ if (widthChanged || heightChanged) {
43
+ void plot.render();
44
+ }
45
+ return true;
46
+ }
47
+ async function createSpecChartElement(spec, size, params) {
48
+ const sizedSpec = {
49
+ ...spec,
50
+ width: size.width,
51
+ height: size.height,
52
+ };
53
+ const ast = await parseSpec(sizedSpec);
54
+ const options = params
55
+ ? { params: params }
56
+ : undefined;
57
+ return (await astToDOM(ast, options)).element;
58
+ }
59
+ function asPlotDomElement(element) {
60
+ return element;
61
+ }
10
62
  /**
11
63
  * Renders a Vega-Lite chart using the Mosaic library.
12
64
  *
@@ -14,27 +66,81 @@ export function isPlotProps(props) {
14
66
  * @param {Spec} props.spec - The Vega-Lite specification for the chart.
15
67
  * @returns {React.ReactElement} The rendered chart component.
16
68
  */
17
- export const VgPlotChart = (props) => {
69
+ export const VgPlotChart = memo((props) => {
70
+ const [containerSize, setContainerSize] = useState(null);
18
71
  const containerRef = useRef(null);
72
+ const localSpecChartRef = useRef(null);
73
+ const renderVersionRef = useRef(0);
74
+ const specKey = useMemo(() => (isSpecProps(props) ? JSON.stringify(props.spec) : null), [props]);
75
+ const handleResize = useCallback((size) => {
76
+ setContainerSize((prev) => {
77
+ if (prev && prev.width === size.width && prev.height === size.height) {
78
+ return prev;
79
+ }
80
+ return size;
81
+ });
82
+ }, []);
19
83
  useEffect(() => {
20
- (async () => {
21
- if (containerRef.current) {
22
- let element;
23
- if (isPlotProps(props)) {
24
- element = props.plot;
25
- }
26
- else if (isSpecProps(props)) {
27
- const ast = await parseSpec(props.spec);
28
- element = (await astToDOM(ast)).element;
29
- }
30
- else {
31
- element = document.createElement('div');
32
- element.innerHTML = 'Error: Invalid props provided to VgPlotChart';
33
- }
34
- containerRef.current?.replaceChildren(element);
84
+ const container = containerRef.current;
85
+ if (!container) {
86
+ return;
87
+ }
88
+ if (isPlotProps(props)) {
89
+ container.replaceChildren(props.plot);
90
+ return;
91
+ }
92
+ if (!containerSize) {
93
+ return;
94
+ }
95
+ const cached = props.retention?.chart;
96
+ const current = localSpecChartRef.current &&
97
+ localSpecChartRef.current.specKey === specKey &&
98
+ areEquivalentParams(localSpecChartRef.current.params, props.params)
99
+ ? localSpecChartRef.current
100
+ : cached &&
101
+ cached.specKey === specKey &&
102
+ areEquivalentParams(cached.params, props.params)
103
+ ? cached
104
+ : null;
105
+ if (current) {
106
+ localSpecChartRef.current = current;
107
+ container.replaceChildren(asPlotDomElement(current.element));
108
+ resizeChartElement(current.element, containerSize);
109
+ return;
110
+ }
111
+ const renderVersion = ++renderVersionRef.current;
112
+ let cancelled = false;
113
+ void createSpecChartElement(props.spec, containerSize, props.params).then((element) => {
114
+ if (cancelled ||
115
+ renderVersion !== renderVersionRef.current ||
116
+ !containerRef.current) {
117
+ return;
35
118
  }
36
- })();
37
- }, [props, containerRef]);
38
- return _jsx("div", { ref: containerRef });
39
- };
119
+ const nextChart = {
120
+ element,
121
+ params: props.params,
122
+ specKey: specKey ?? JSON.stringify(props.spec),
123
+ };
124
+ localSpecChartRef.current = nextChart;
125
+ props.retention?.setChart(nextChart);
126
+ containerRef.current.replaceChildren(element);
127
+ });
128
+ return () => {
129
+ cancelled = true;
130
+ };
131
+ }, [containerSize, props, specKey]);
132
+ return (_jsx(ResponsivePlot, { ref: containerRef, onResize: handleResize, className: "h-full w-full" }));
133
+ }, (prevProps, nextProps) => {
134
+ if (isPlotProps(prevProps) && isPlotProps(nextProps)) {
135
+ return prevProps.plot === nextProps.plot;
136
+ }
137
+ if (isSpecProps(prevProps) && isSpecProps(nextProps)) {
138
+ const specEqual = JSON.stringify(prevProps.spec) === JSON.stringify(nextProps.spec);
139
+ const paramsEqual = areEquivalentParams(prevProps.params, nextProps.params);
140
+ const retentionEqual = prevProps.retention === nextProps.retention;
141
+ return specEqual && paramsEqual && retentionEqual;
142
+ }
143
+ return false;
144
+ });
145
+ VgPlotChart.displayName = 'VgPlotChart';
40
146
  //# sourceMappingURL=VgPlotChart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VgPlotChart.js","sourceRoot":"","sources":["../src/VgPlotChart.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAO,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAK,SAAS,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AAM5C,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,OAAO,MAAM,IAAI,KAAK,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,OAAO,MAAM,IAAI,KAAK,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,KAAK,EAAE,EAAE;IACzD,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,SAAS,CAAC,GAAG,EAAE;QACb,CAAC,KAAK,IAAI,EAAE;YACV,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,OAAoC,CAAC;gBACzC,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;gBACvB,CAAC;qBAAM,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACxC,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBACxC,OAAO,CAAC,SAAS,GAAG,8CAA8C,CAAC;gBACrE,CAAC;gBACD,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IAE1B,OAAO,cAAK,GAAG,EAAE,YAAY,GAAI,CAAC;AACpC,CAAC,CAAC","sourcesContent":["import {astToDOM, parseSpec, Spec} from '@uwdata/mosaic-spec';\nimport {FC, useEffect, useRef} from 'react';\n\ntype SpecProps = {spec: Spec};\ntype PlotProps = {plot: HTMLElement | SVGSVGElement};\ntype VgPlotChartProps = SpecProps | PlotProps;\n\nexport function isSpecProps(props: VgPlotChartProps): props is SpecProps {\n return 'spec' in props;\n}\n\nexport function isPlotProps(props: VgPlotChartProps): props is PlotProps {\n return 'plot' in props;\n}\n\n/**\n * Renders a Vega-Lite chart using the Mosaic library.\n *\n * @param {VgPlotChartProps} props - The component props.\n * @param {Spec} props.spec - The Vega-Lite specification for the chart.\n * @returns {React.ReactElement} The rendered chart component.\n */\nexport const VgPlotChart: FC<VgPlotChartProps> = (props) => {\n const containerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n (async () => {\n if (containerRef.current) {\n let element: HTMLElement | SVGSVGElement;\n if (isPlotProps(props)) {\n element = props.plot;\n } else if (isSpecProps(props)) {\n const ast = await parseSpec(props.spec);\n element = (await astToDOM(ast)).element;\n } else {\n element = document.createElement('div');\n element.innerHTML = 'Error: Invalid props provided to VgPlotChart';\n }\n containerRef.current?.replaceChildren(element);\n }\n })();\n }, [props, containerRef]);\n\n return <div ref={containerRef} />;\n};\n"]}
1
+ {"version":3,"file":"VgPlotChart.js","sourceRoot":"","sources":["../src/VgPlotChart.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Param, Selection} from '@uwdata/mosaic-core';\nimport {astToDOM, parseSpec, Spec} from '@uwdata/mosaic-spec';\nimport {\n FC,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {PlotSize, ResponsivePlot} from './ResponsivePlot';\n\ntype SpecProps = {\n spec: Spec;\n /**\n * Pre-defined params/selections to inject when rendering the spec.\n * Keys are param names (without $), values are Param or Selection instances.\n * This allows multiple independently-rendered specs to share the same\n * Selection objects for cross-filtering.\n */\n params?: Map<string, Param<any> | Selection>;\n /**\n * Optional retention adapter for preserving the underlying vgplot\n * instance across temporary unmount/remount cycles, such as dashboard tab\n * switches.\n */\n retention?: VgPlotChartRetention;\n};\ntype PlotProps = {plot: HTMLElement | SVGSVGElement};\ntype VgPlotChartProps = SpecProps | PlotProps;\ntype PlotDomElement = HTMLElement | SVGSVGElement;\n\nexport type RetainedVgPlotChart = {\n element: object;\n params?: Map<string, Param<any> | Selection>;\n specKey: string;\n};\n\nexport type VgPlotChartRetention = {\n chart?: RetainedVgPlotChart;\n setChart: (chart: RetainedVgPlotChart) => void;\n};\n\ntype PlotInstance = {\n marks?: Array<{destroy?: () => void}>;\n render?: () => Promise<unknown> | unknown;\n setAttribute?: (name: string, value: unknown) => boolean;\n};\n\nfunction areEquivalentParams(\n left?: Map<string, Param<any> | Selection>,\n right?: Map<string, Param<any> | Selection>,\n) {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.size !== right.size) {\n return false;\n }\n for (const [key, value] of left) {\n if (right.get(key) !== value) {\n return false;\n }\n }\n return true;\n}\n\nexport function isSpecProps(props: VgPlotChartProps): props is SpecProps {\n return 'spec' in props;\n}\n\nexport function isPlotProps(props: VgPlotChartProps): props is PlotProps {\n return 'plot' in props;\n}\n\nexport function destroyRetainedVgPlotChart(chart: RetainedVgPlotChart) {\n const plot = getPlotInstance(chart.element);\n plot?.marks?.forEach((mark) => {\n mark.destroy?.();\n });\n}\n\nfunction getPlotInstance(element: object): PlotInstance | null {\n const plot = (element as HTMLElement & {value?: unknown}).value;\n return plot && typeof plot === 'object' ? (plot as PlotInstance) : null;\n}\n\nfunction resizeChartElement(element: object, size: PlotSize): boolean {\n const plot = getPlotInstance(element);\n if (!plot?.setAttribute || !plot.render) {\n return false;\n }\n\n const widthChanged = plot.setAttribute('width', size.width);\n const heightChanged = plot.setAttribute('height', size.height);\n if (widthChanged || heightChanged) {\n void plot.render();\n }\n return true;\n}\n\nasync function createSpecChartElement(\n spec: Spec,\n size: PlotSize,\n params?: Map<string, Param<any> | Selection>,\n): Promise<PlotDomElement> {\n const sizedSpec = {\n ...spec,\n width: size.width,\n height: size.height,\n } as Spec;\n\n const ast = await parseSpec(sizedSpec);\n const options = params\n ? {params: params as unknown as Map<string, Param<any>>}\n : undefined;\n\n return (await astToDOM(ast, options)).element;\n}\n\nfunction asPlotDomElement(element: object): PlotDomElement {\n return element as PlotDomElement;\n}\n\n/**\n * Renders a Vega-Lite chart using the Mosaic library.\n *\n * @param {VgPlotChartProps} props - The component props.\n * @param {Spec} props.spec - The Vega-Lite specification for the chart.\n * @returns {React.ReactElement} The rendered chart component.\n */\nexport const VgPlotChart: FC<VgPlotChartProps> = memo(\n (props) => {\n const [containerSize, setContainerSize] = useState<PlotSize | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const localSpecChartRef = useRef<RetainedVgPlotChart | null>(null);\n const renderVersionRef = useRef(0);\n const specKey = useMemo(\n () => (isSpecProps(props) ? JSON.stringify(props.spec) : null),\n [props],\n );\n\n const handleResize = useCallback((size: PlotSize) => {\n setContainerSize((prev) => {\n if (prev && prev.width === size.width && prev.height === size.height) {\n return prev;\n }\n return size;\n });\n }, []);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n if (isPlotProps(props)) {\n container.replaceChildren(props.plot);\n return;\n }\n\n if (!containerSize) {\n return;\n }\n\n const cached = props.retention?.chart;\n const current =\n localSpecChartRef.current &&\n localSpecChartRef.current.specKey === specKey &&\n areEquivalentParams(localSpecChartRef.current.params, props.params)\n ? localSpecChartRef.current\n : cached &&\n cached.specKey === specKey &&\n areEquivalentParams(cached.params, props.params)\n ? cached\n : null;\n\n if (current) {\n localSpecChartRef.current = current;\n container.replaceChildren(asPlotDomElement(current.element));\n resizeChartElement(current.element, containerSize);\n return;\n }\n\n const renderVersion = ++renderVersionRef.current;\n let cancelled = false;\n\n void createSpecChartElement(props.spec, containerSize, props.params).then(\n (element) => {\n if (\n cancelled ||\n renderVersion !== renderVersionRef.current ||\n !containerRef.current\n ) {\n return;\n }\n\n const nextChart = {\n element,\n params: props.params,\n specKey: specKey ?? JSON.stringify(props.spec),\n } satisfies RetainedVgPlotChart;\n\n localSpecChartRef.current = nextChart;\n props.retention?.setChart(nextChart);\n containerRef.current.replaceChildren(element);\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [containerSize, props, specKey]);\n\n return (\n <ResponsivePlot\n ref={containerRef}\n onResize={handleResize}\n className=\"h-full w-full\"\n />\n );\n },\n (prevProps, nextProps) => {\n if (isPlotProps(prevProps) && isPlotProps(nextProps)) {\n return prevProps.plot === nextProps.plot;\n }\n if (isSpecProps(prevProps) && isSpecProps(nextProps)) {\n const specEqual =\n JSON.stringify(prevProps.spec) === JSON.stringify(nextProps.spec);\n const paramsEqual = areEquivalentParams(\n prevProps.params,\n nextProps.params,\n );\n const retentionEqual = prevProps.retention === nextProps.retention;\n return specEqual && paramsEqual && retentionEqual;\n }\n return false;\n },\n);\n\nVgPlotChart.displayName = 'VgPlotChart';\n"]}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface ChartBuilderActionsProps {
3
+ className?: string;
4
+ }
5
+ export declare const ChartBuilderActions: React.FC<ChartBuilderActionsProps>;
6
+ //# sourceMappingURL=ChartBuilderActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderActions.d.ts","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderActions.tsx"],"names":[],"mappings":"AACA,OAAO,KAAgB,MAAM,OAAO,CAAC;AAOrC,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAgDlE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, cn } from '@sqlrooms/ui';
3
+ import { useMemo } from 'react';
4
+ import { useChartBuilderContext, useChartBuilderStore, } from './ChartBuilderContext';
5
+ import { buildChartTypeTitle, canCreateChartFromType } from './chartTypeUtils';
6
+ export const ChartBuilderActions = ({ className, }) => {
7
+ const { columns, onCreateChart, tableName, templates } = useChartBuilderContext();
8
+ const selectedTemplateId = useChartBuilderStore((state) => state.selectedTemplateId);
9
+ const fieldValues = useChartBuilderStore((state) => state.fieldValues);
10
+ const reset = useChartBuilderStore((state) => state.reset);
11
+ const selectedTemplate = useMemo(() => templates.find((template) => template.id === selectedTemplateId), [templates, selectedTemplateId]);
12
+ const canCreate = canCreateChartFromType(selectedTemplate, fieldValues, columns);
13
+ if (!selectedTemplate)
14
+ return null;
15
+ return (_jsxs("div", { className: cn('flex items-center justify-end gap-2', className), children: [_jsx(Button, { variant: "outline", size: "sm", onClick: reset, children: "Back" }), _jsx(Button, { size: "sm", onClick: () => {
16
+ if (!selectedTemplate || !canCreate || !selectedTemplateId)
17
+ return;
18
+ const spec = selectedTemplate.createSpec(tableName, fieldValues);
19
+ const title = buildChartTypeTitle(selectedTemplate, fieldValues);
20
+ onCreateChart(title, {
21
+ chartType: selectedTemplateId,
22
+ settings: fieldValues,
23
+ vgplot: spec,
24
+ });
25
+ reset();
26
+ }, disabled: !canCreate, children: "Create" })] }));
27
+ };
28
+ //# sourceMappingURL=ChartBuilderActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderActions.js","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderActions.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,MAAM,EAAE,EAAE,EAAC,MAAM,cAAc,CAAC;AACxC,OAAc,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,mBAAmB,EAAE,sBAAsB,EAAC,MAAM,kBAAkB,CAAC;AAM7E,MAAM,CAAC,MAAM,mBAAmB,GAAuC,CAAC,EACtE,SAAS,GACV,EAAE,EAAE;IACH,MAAM,EAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAC,GAClD,sBAAsB,EAAE,CAAC;IAC3B,MAAM,kBAAkB,GAAG,oBAAoB,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CACpC,CAAC;IACF,MAAM,WAAW,GAAG,oBAAoB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,oBAAoB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE3D,MAAM,gBAAgB,GAAG,OAAO,CAC9B,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,kBAAkB,CAAC,EACtE,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAChC,CAAC;IAEF,MAAM,SAAS,GAAG,sBAAsB,CACtC,gBAAgB,EAChB,WAAW,EACX,OAAO,CACR,CAAC;IAEF,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,qCAAqC,EAAE,SAAS,CAAC,aAClE,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,KAAK,qBAEzC,EACT,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS,IAAI,CAAC,kBAAkB;wBAAE,OAAO;oBACnE,MAAM,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;oBACjE,MAAM,KAAK,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;oBACjE,aAAa,CAAC,KAAK,EAAE;wBACnB,SAAS,EAAE,kBAAkB;wBAC7B,QAAQ,EAAE,WAAW;wBACrB,MAAM,EAAE,IAAI;qBACb,CAAC,CAAC;oBACH,KAAK,EAAE,CAAC;gBACV,CAAC,EACD,QAAQ,EAAE,CAAC,SAAS,uBAGb,IACL,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {Button, cn} from '@sqlrooms/ui';\nimport React, {useMemo} from 'react';\nimport {\n useChartBuilderContext,\n useChartBuilderStore,\n} from './ChartBuilderContext';\nimport {buildChartTypeTitle, canCreateChartFromType} from './chartTypeUtils';\n\nexport interface ChartBuilderActionsProps {\n className?: string;\n}\n\nexport const ChartBuilderActions: React.FC<ChartBuilderActionsProps> = ({\n className,\n}) => {\n const {columns, onCreateChart, tableName, templates} =\n useChartBuilderContext();\n const selectedTemplateId = useChartBuilderStore(\n (state) => state.selectedTemplateId,\n );\n const fieldValues = useChartBuilderStore((state) => state.fieldValues);\n const reset = useChartBuilderStore((state) => state.reset);\n\n const selectedTemplate = useMemo(\n () => templates.find((template) => template.id === selectedTemplateId),\n [templates, selectedTemplateId],\n );\n\n const canCreate = canCreateChartFromType(\n selectedTemplate,\n fieldValues,\n columns,\n );\n\n if (!selectedTemplate) return null;\n\n return (\n <div className={cn('flex items-center justify-end gap-2', className)}>\n <Button variant=\"outline\" size=\"sm\" onClick={reset}>\n Back\n </Button>\n <Button\n size=\"sm\"\n onClick={() => {\n if (!selectedTemplate || !canCreate || !selectedTemplateId) return;\n const spec = selectedTemplate.createSpec(tableName, fieldValues);\n const title = buildChartTypeTitle(selectedTemplate, fieldValues);\n onCreateChart(title, {\n chartType: selectedTemplateId,\n settings: fieldValues,\n vgplot: spec,\n });\n reset();\n }}\n disabled={!canCreate}\n >\n Create\n </Button>\n </div>\n );\n};\n"]}
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import type { VgPlotChartConfig } from '../chart-types';
3
+ import { type ChartBuilderRootProps } from './ChartBuilderRoot';
4
+ import type { ChartBuilderColumn, ChartBuilderTemplate, ChartTypeDefinition } from './types';
5
+ type StandaloneChartBuilderContentProps = {
6
+ /** Table name to use in generated specs */
7
+ tableName: string;
8
+ /** Available columns for field selectors */
9
+ columns: ChartBuilderColumn[];
10
+ /** Callback when a chart spec is created */
11
+ onCreateChart: (title: string, config: VgPlotChartConfig) => void;
12
+ /** Preferred shared chart-type customization surface */
13
+ chartTypes?: ChartTypeDefinition[];
14
+ /** Backward-compatible UI template customization surface */
15
+ builders?: ChartBuilderTemplate[];
16
+ /** Custom class name */
17
+ className?: string;
18
+ };
19
+ export type ChartBuilderContentProps = Partial<Omit<ChartBuilderRootProps, 'children'>> & Pick<StandaloneChartBuilderContentProps, 'className'>;
20
+ /**
21
+ * Standalone chart builder UI for creating Mosaic charts from templates.
22
+ *
23
+ * Can be used directly with props, or inside `<MosaicChartBuilder>` where it
24
+ * consumes the surrounding builder context.
25
+ */
26
+ export declare const ChartBuilderContent: React.FC<ChartBuilderContentProps>;
27
+ export {};
28
+ //# sourceMappingURL=ChartBuilderContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderContent.d.ts","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderContent.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,gBAAgB,CAAC;AAItD,OAAO,EAAmB,KAAK,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AAEhF,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB,KAAK,kCAAkC,GAAG;IACxC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,4CAA4C;IAC5C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClE,wDAAwD;IACxD,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAClC,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAC5C,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAC,CACxC,GACC,IAAI,CAAC,kCAAkC,EAAE,WAAW,CAAC,CAAC;AAoBxD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAalE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '@sqlrooms/ui';
3
+ import { ChartBuilderActions } from './ChartBuilderActions';
4
+ import { useChartBuilderContext } from './ChartBuilderContext';
5
+ import { ChartBuilderFields } from './ChartBuilderFields';
6
+ import { ChartBuilderRoot } from './ChartBuilderRoot';
7
+ import { ChartBuilderTypeGrid } from './ChartBuilderTypeGrid';
8
+ function isStandaloneProps(props) {
9
+ return Boolean(props.tableName && props.columns && props.onCreateChart);
10
+ }
11
+ function ChartBuilderContentBody({ className }) {
12
+ useChartBuilderContext();
13
+ return (_jsxs("div", { className: cn('flex flex-col gap-2', className), children: [_jsx(ChartBuilderTypeGrid, {}), _jsx(ChartBuilderFields, {}), _jsx(ChartBuilderActions, {})] }));
14
+ }
15
+ /**
16
+ * Standalone chart builder UI for creating Mosaic charts from templates.
17
+ *
18
+ * Can be used directly with props, or inside `<MosaicChartBuilder>` where it
19
+ * consumes the surrounding builder context.
20
+ */
21
+ export const ChartBuilderContent = (props) => {
22
+ if (isStandaloneProps(props)) {
23
+ const { className, ...rootProps } = props;
24
+ return (_jsx(ChartBuilderRoot, { ...rootProps, children: _jsx(ChartBuilderContentBody, { className: className }) }));
25
+ }
26
+ return _jsx(ChartBuilderContentBody, { className: props.className });
27
+ };
28
+ //# sourceMappingURL=ChartBuilderContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderContent.js","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderContent.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAGhC,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAC,sBAAsB,EAAC,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,gBAAgB,EAA6B,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AA2B5D,SAAS,iBAAiB,CACxB,KAA+B;IAE/B,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,uBAAuB,CAAC,EAAC,SAAS,EAAuB;IAChE,sBAAsB,EAAE,CAAC;IAEzB,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,aAClD,KAAC,oBAAoB,KAAG,EACxB,KAAC,kBAAkB,KAAG,EACtB,KAAC,mBAAmB,KAAG,IACnB,CACP,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAuC,CACrE,KAAK,EACL,EAAE;IACF,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,EAAC,SAAS,EAAE,GAAG,SAAS,EAAC,GAAG,KAAK,CAAC;QACxC,OAAO,CACL,KAAC,gBAAgB,OAAK,SAAS,YAC7B,KAAC,uBAAuB,IAAC,SAAS,EAAE,SAAS,GAAI,GAChC,CACpB,CAAC;IACJ,CAAC;IAED,OAAO,KAAC,uBAAuB,IAAC,SAAS,EAAE,KAAK,CAAC,SAAS,GAAI,CAAC;AACjE,CAAC,CAAC","sourcesContent":["import {cn} from '@sqlrooms/ui';\nimport React from 'react';\nimport type {VgPlotChartConfig} from '../chart-types';\nimport {ChartBuilderActions} from './ChartBuilderActions';\nimport {useChartBuilderContext} from './ChartBuilderContext';\nimport {ChartBuilderFields} from './ChartBuilderFields';\nimport {ChartBuilderRoot, type ChartBuilderRootProps} from './ChartBuilderRoot';\nimport {ChartBuilderTypeGrid} from './ChartBuilderTypeGrid';\nimport type {\n ChartBuilderColumn,\n ChartBuilderTemplate,\n ChartTypeDefinition,\n} from './types';\n\ntype StandaloneChartBuilderContentProps = {\n /** Table name to use in generated specs */\n tableName: string;\n /** Available columns for field selectors */\n columns: ChartBuilderColumn[];\n /** Callback when a chart spec is created */\n onCreateChart: (title: string, config: VgPlotChartConfig) => void;\n /** Preferred shared chart-type customization surface */\n chartTypes?: ChartTypeDefinition[];\n /** Backward-compatible UI template customization surface */\n builders?: ChartBuilderTemplate[];\n /** Custom class name */\n className?: string;\n};\n\nexport type ChartBuilderContentProps = Partial<\n Omit<ChartBuilderRootProps, 'children'>\n> &\n Pick<StandaloneChartBuilderContentProps, 'className'>;\n\nfunction isStandaloneProps(\n props: ChartBuilderContentProps,\n): props is StandaloneChartBuilderContentProps {\n return Boolean(props.tableName && props.columns && props.onCreateChart);\n}\n\nfunction ChartBuilderContentBody({className}: {className?: string}) {\n useChartBuilderContext();\n\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n <ChartBuilderTypeGrid />\n <ChartBuilderFields />\n <ChartBuilderActions />\n </div>\n );\n}\n\n/**\n * Standalone chart builder UI for creating Mosaic charts from templates.\n *\n * Can be used directly with props, or inside `<MosaicChartBuilder>` where it\n * consumes the surrounding builder context.\n */\nexport const ChartBuilderContent: React.FC<ChartBuilderContentProps> = (\n props,\n) => {\n if (isStandaloneProps(props)) {\n const {className, ...rootProps} = props;\n return (\n <ChartBuilderRoot {...rootProps}>\n <ChartBuilderContentBody className={className} />\n </ChartBuilderRoot>\n );\n }\n\n return <ChartBuilderContentBody className={props.className} />;\n};\n"]}
@@ -0,0 +1,16 @@
1
+ import type { VgPlotChartConfig } from '../chart-types';
2
+ import type { ChartBuilderStore, ChartBuilderStoreState } from './createChartBuilderStore';
3
+ import type { ChartBuilderColumn, ChartBuilderTemplate, ChartTypeDefinition } from './types';
4
+ export type ChartBuilderContextValue = {
5
+ tableName: string;
6
+ columns: ChartBuilderColumn[];
7
+ onCreateChart: (title: string, config: VgPlotChartConfig) => void;
8
+ templates: ChartBuilderTemplate[];
9
+ availableChartTypes: ChartTypeDefinition[];
10
+ availableTemplates: ChartBuilderTemplate[];
11
+ store: ChartBuilderStore;
12
+ };
13
+ export declare const ChartBuilderContext: import("react").Context<ChartBuilderContextValue | null>;
14
+ export declare function useChartBuilderContext(): ChartBuilderContextValue;
15
+ export declare function useChartBuilderStore<T>(selector: (state: ChartBuilderStoreState) => T): T;
16
+ //# sourceMappingURL=ChartBuilderContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderContext.d.ts","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClE,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;IAC3C,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;IAC3C,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,0DACsB,CAAC;AAEvD,wBAAgB,sBAAsB,IAAI,wBAAwB,CAQjE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,CAAC,GAC7C,CAAC,CAGH"}
@@ -0,0 +1,15 @@
1
+ import { createContext, useContext } from 'react';
2
+ import { useStore } from 'zustand';
3
+ export const ChartBuilderContext = createContext(null);
4
+ export function useChartBuilderContext() {
5
+ const ctx = useContext(ChartBuilderContext);
6
+ if (!ctx) {
7
+ throw new Error('ChartBuilder compound components must be rendered inside <MosaicChartBuilder>.');
8
+ }
9
+ return ctx;
10
+ }
11
+ export function useChartBuilderStore(selector) {
12
+ const { store } = useChartBuilderContext();
13
+ return useStore(store, selector);
14
+ }
15
+ //# sourceMappingURL=ChartBuilderContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderContext.js","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,UAAU,EAAC,MAAM,OAAO,CAAC;AAChD,OAAO,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AAsBjC,MAAM,CAAC,MAAM,mBAAmB,GAC9B,aAAa,CAAkC,IAAI,CAAC,CAAC;AAEvD,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAA8C;IAE9C,MAAM,EAAC,KAAK,EAAC,GAAG,sBAAsB,EAAE,CAAC;IACzC,OAAO,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import {createContext, useContext} from 'react';\nimport {useStore} from 'zustand';\nimport type {VgPlotChartConfig} from '../chart-types';\nimport type {\n ChartBuilderStore,\n ChartBuilderStoreState,\n} from './createChartBuilderStore';\nimport type {\n ChartBuilderColumn,\n ChartBuilderTemplate,\n ChartTypeDefinition,\n} from './types';\n\nexport type ChartBuilderContextValue = {\n tableName: string;\n columns: ChartBuilderColumn[];\n onCreateChart: (title: string, config: VgPlotChartConfig) => void;\n templates: ChartBuilderTemplate[];\n availableChartTypes: ChartTypeDefinition[];\n availableTemplates: ChartBuilderTemplate[];\n store: ChartBuilderStore;\n};\n\nexport const ChartBuilderContext =\n createContext<ChartBuilderContextValue | null>(null);\n\nexport function useChartBuilderContext(): ChartBuilderContextValue {\n const ctx = useContext(ChartBuilderContext);\n if (!ctx) {\n throw new Error(\n 'ChartBuilder compound components must be rendered inside <MosaicChartBuilder>.',\n );\n }\n return ctx;\n}\n\nexport function useChartBuilderStore<T>(\n selector: (state: ChartBuilderStoreState) => T,\n): T {\n const {store} = useChartBuilderContext();\n return useStore(store, selector);\n}\n"]}
@@ -0,0 +1,48 @@
1
+ import { type ButtonProps } from '@sqlrooms/ui';
2
+ import React from 'react';
3
+ import type { VgPlotChartConfig } from '../chart-types';
4
+ import type { ChartBuilderColumn, ChartBuilderTemplate, ChartTypeDefinition } from './types';
5
+ export type ChartBuilderTriggerProps = ButtonProps;
6
+ export declare const ChartBuilderTrigger: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
7
+ export interface ChartBuilderDialogContentProps {
8
+ /** Override dialog title (default "Add Chart") */
9
+ title?: string;
10
+ /** Override dialog description */
11
+ description?: string;
12
+ className?: string;
13
+ children?: React.ReactNode;
14
+ }
15
+ /**
16
+ * The dialog content pane that renders the chart-builder steps.
17
+ * Must be rendered inside `<MosaicChartBuilder>`.
18
+ */
19
+ export declare const ChartBuilderDialogContent: React.FC<ChartBuilderDialogContentProps>;
20
+ export interface ChartBuilderDialogProps {
21
+ /** Whether the dialog is open */
22
+ open: boolean;
23
+ /** Callback when dialog open state changes */
24
+ onOpenChange: (open: boolean) => void;
25
+ /** Table name to use in generated specs */
26
+ tableName: string;
27
+ /** Available columns for field selectors */
28
+ columns: ChartBuilderColumn[];
29
+ /** Callback when a chart spec is created */
30
+ onCreateChart: (title: string, config: VgPlotChartConfig) => void;
31
+ /** Preferred shared chart-type customization surface */
32
+ chartTypes?: ChartTypeDefinition[];
33
+ /** Backward-compatible UI template customization surface */
34
+ builders?: ChartBuilderTemplate[];
35
+ }
36
+ /**
37
+ * Dialog wrapper for the chart builder (legacy API).
38
+ *
39
+ * @deprecated Prefer the compound form:
40
+ * ```tsx
41
+ * <MosaicChartBuilder tableName={…} columns={…} onCreateChart={…}>
42
+ * <MosaicChartBuilder.Trigger />
43
+ * <MosaicChartBuilder.Dialog />
44
+ * </MosaicChartBuilder>
45
+ * ```
46
+ */
47
+ export declare const ChartBuilderDialog: React.FC<ChartBuilderDialogProps>;
48
+ //# sourceMappingURL=ChartBuilderDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderDialog.d.ts","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAMjB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,gBAAgB,CAAC;AAGtD,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAC;AAEnD,eAAO,MAAM,mBAAmB,uFAgB9B,CAAC;AAGH,MAAM,WAAW,8BAA8B;IAC7C,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAC9C,8BAA8B,CAgB/B,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,4CAA4C;IAC5C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClE,wDAAwD;IACxD,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAoBhE,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from '@sqlrooms/ui';
3
+ import { Plus } from 'lucide-react';
4
+ import React from 'react';
5
+ import { ChartBuilderContent } from './ChartBuilderContent';
6
+ import { ChartBuilderRoot } from './ChartBuilderRoot';
7
+ export const ChartBuilderTrigger = React.forwardRef(({ children, ...props }, ref) => {
8
+ return (_jsx(DialogTrigger, { asChild: true, children: _jsx(Button, { ref: ref, variant: "outline", size: "sm", ...props, children: children ?? (_jsxs(_Fragment, { children: [_jsx(Plus, { className: "mr-1 h-4 w-4" }), "Add Chart"] })) }) }));
9
+ });
10
+ ChartBuilderTrigger.displayName = 'ChartBuilderTrigger';
11
+ /**
12
+ * The dialog content pane that renders the chart-builder steps.
13
+ * Must be rendered inside `<MosaicChartBuilder>`.
14
+ */
15
+ export const ChartBuilderDialogContent = ({ title = 'Add Chart', description = 'Select a chart type to create.', className, children, }) => {
16
+ return (_jsxs(DialogContent, { className: className ?? 'sm:max-w-lg', children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: title }), _jsx(DialogDescription, { children: description })] }), children ?? _jsx(ChartBuilderContent, {})] }));
17
+ };
18
+ /**
19
+ * Dialog wrapper for the chart builder (legacy API).
20
+ *
21
+ * @deprecated Prefer the compound form:
22
+ * ```tsx
23
+ * <MosaicChartBuilder tableName={…} columns={…} onCreateChart={…}>
24
+ * <MosaicChartBuilder.Trigger />
25
+ * <MosaicChartBuilder.Dialog />
26
+ * </MosaicChartBuilder>
27
+ * ```
28
+ */
29
+ export const ChartBuilderDialog = ({ open, onOpenChange, tableName, columns, onCreateChart, chartTypes, builders, }) => (_jsx(ChartBuilderRoot, { open: open, onOpenChange: onOpenChange, tableName: tableName, columns: columns, onCreateChart: onCreateChart, chartTypes: chartTypes, builders: builders, children: _jsx(ChartBuilderDialogContent, {}) }));
30
+ //# sourceMappingURL=ChartBuilderDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderDialog.js","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderDialog.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,MAAM,EAEN,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,IAAI,EAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AASpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC,UAAU,CAGjD,CAAC,EAAC,QAAQ,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE;IAC9B,OAAO,CACL,KAAC,aAAa,IAAC,OAAO,kBACpB,KAAC,MAAM,IAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,KAAK,KAAK,YACpD,QAAQ,IAAI,CACX,8BACE,KAAC,IAAI,IAAC,SAAS,EAAC,cAAc,GAAG,iBAEhC,CACJ,GACM,GACK,CACjB,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,mBAAmB,CAAC,WAAW,GAAG,qBAAqB,CAAC;AAWxD;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAElC,CAAC,EACH,KAAK,GAAG,WAAW,EACnB,WAAW,GAAG,gCAAgC,EAC9C,SAAS,EACT,QAAQ,GACT,EAAE,EAAE;IACH,OAAO,CACL,MAAC,aAAa,IAAC,SAAS,EAAE,SAAS,IAAI,aAAa,aAClD,MAAC,YAAY,eACX,KAAC,WAAW,cAAE,KAAK,GAAe,EAClC,KAAC,iBAAiB,cAAE,WAAW,GAAqB,IACvC,EACd,QAAQ,IAAI,KAAC,mBAAmB,KAAG,IACtB,CACjB,CAAC;AACJ,CAAC,CAAC;AAmBF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAsC,CAAC,EACpE,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,aAAa,EACb,UAAU,EACV,QAAQ,GACT,EAAE,EAAE,CAAC,CACJ,KAAC,gBAAgB,IACf,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,YAElB,KAAC,yBAAyB,KAAG,GACZ,CACpB,CAAC","sourcesContent":["import {\n Button,\n type ButtonProps,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@sqlrooms/ui';\nimport {Plus} from 'lucide-react';\nimport React from 'react';\nimport type {VgPlotChartConfig} from '../chart-types';\nimport {ChartBuilderContent} from './ChartBuilderContent';\nimport {ChartBuilderRoot} from './ChartBuilderRoot';\nimport type {\n ChartBuilderColumn,\n ChartBuilderTemplate,\n ChartTypeDefinition,\n} from './types';\n\nexport type ChartBuilderTriggerProps = ButtonProps;\n\nexport const ChartBuilderTrigger = React.forwardRef<\n HTMLButtonElement,\n ChartBuilderTriggerProps\n>(({children, ...props}, ref) => {\n return (\n <DialogTrigger asChild>\n <Button ref={ref} variant=\"outline\" size=\"sm\" {...props}>\n {children ?? (\n <>\n <Plus className=\"mr-1 h-4 w-4\" />\n Add Chart\n </>\n )}\n </Button>\n </DialogTrigger>\n );\n});\nChartBuilderTrigger.displayName = 'ChartBuilderTrigger';\n\nexport interface ChartBuilderDialogContentProps {\n /** Override dialog title (default \"Add Chart\") */\n title?: string;\n /** Override dialog description */\n description?: string;\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * The dialog content pane that renders the chart-builder steps.\n * Must be rendered inside `<MosaicChartBuilder>`.\n */\nexport const ChartBuilderDialogContent: React.FC<\n ChartBuilderDialogContentProps\n> = ({\n title = 'Add Chart',\n description = 'Select a chart type to create.',\n className,\n children,\n}) => {\n return (\n <DialogContent className={className ?? 'sm:max-w-lg'}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n {children ?? <ChartBuilderContent />}\n </DialogContent>\n );\n};\n\nexport interface ChartBuilderDialogProps {\n /** Whether the dialog is open */\n open: boolean;\n /** Callback when dialog open state changes */\n onOpenChange: (open: boolean) => void;\n /** Table name to use in generated specs */\n tableName: string;\n /** Available columns for field selectors */\n columns: ChartBuilderColumn[];\n /** Callback when a chart spec is created */\n onCreateChart: (title: string, config: VgPlotChartConfig) => void;\n /** Preferred shared chart-type customization surface */\n chartTypes?: ChartTypeDefinition[];\n /** Backward-compatible UI template customization surface */\n builders?: ChartBuilderTemplate[];\n}\n\n/**\n * Dialog wrapper for the chart builder (legacy API).\n *\n * @deprecated Prefer the compound form:\n * ```tsx\n * <MosaicChartBuilder tableName={…} columns={…} onCreateChart={…}>\n * <MosaicChartBuilder.Trigger />\n * <MosaicChartBuilder.Dialog />\n * </MosaicChartBuilder>\n * ```\n */\nexport const ChartBuilderDialog: React.FC<ChartBuilderDialogProps> = ({\n open,\n onOpenChange,\n tableName,\n columns,\n onCreateChart,\n chartTypes,\n builders,\n}) => (\n <ChartBuilderRoot\n open={open}\n onOpenChange={onOpenChange}\n tableName={tableName}\n columns={columns}\n onCreateChart={onCreateChart}\n chartTypes={chartTypes}\n builders={builders}\n >\n <ChartBuilderDialogContent />\n </ChartBuilderRoot>\n);\n"]}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface ChartBuilderFieldsProps {
3
+ className?: string;
4
+ }
5
+ export declare const ChartBuilderFields: React.FC<ChartBuilderFieldsProps>;
6
+ //# sourceMappingURL=ChartBuilderFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderFields.d.ts","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderFields.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA8ChE,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '@sqlrooms/ui';
3
+ import React from 'react';
4
+ import { useChartBuilderContext, useChartBuilderStore, } from './ChartBuilderContext';
5
+ import { FieldSelectorInput } from './FieldSelectorInput';
6
+ import { useChartFieldForm } from './hooks/useChartFieldForm';
7
+ export const ChartBuilderFields = ({ className, }) => {
8
+ const { columns, templates } = useChartBuilderContext();
9
+ const selectedTemplateId = useChartBuilderStore((state) => state.selectedTemplateId);
10
+ const fieldValues = useChartBuilderStore((state) => state.fieldValues);
11
+ const setFieldValue = useChartBuilderStore((state) => state.setFieldValue);
12
+ const selectedTemplate = React.useMemo(() => templates.find((template) => template.id === selectedTemplateId), [templates, selectedTemplateId]);
13
+ const { fields, handleFieldChange } = useChartFieldForm({
14
+ fields: selectedTemplate?.fields || [],
15
+ values: fieldValues,
16
+ onChange: (key, value) => setFieldValue(key, value),
17
+ });
18
+ if (!selectedTemplate)
19
+ return null;
20
+ if (fields.length === 0) {
21
+ return (_jsx("p", { className: cn('text-muted-foreground py-2 text-sm', className), children: "This chart type has no configurable fields. A starter spec will be created that you can edit manually." }));
22
+ }
23
+ return (_jsx("div", { className: cn('flex flex-col gap-4 py-2', className), children: fields.map((field) => (_jsx(FieldSelectorInput, { field: field, columns: columns, value: fieldValues[field.key], onChange: (value) => handleFieldChange(field.key, value) }, field.key))) }));
24
+ };
25
+ //# sourceMappingURL=ChartBuilderFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderFields.js","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderFields.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAM5D,MAAM,CAAC,MAAM,kBAAkB,GAAsC,CAAC,EACpE,SAAS,GACV,EAAE,EAAE;IACH,MAAM,EAAC,OAAO,EAAE,SAAS,EAAC,GAAG,sBAAsB,EAAE,CAAC;IACtD,MAAM,kBAAkB,GAAG,oBAAoB,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CACpC,CAAC;IACF,MAAM,WAAW,GAAG,oBAAoB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,oBAAoB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAE3E,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CACpC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,kBAAkB,CAAC,EACtE,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAChC,CAAC;IAEF,MAAM,EAAC,MAAM,EAAE,iBAAiB,EAAC,GAAG,iBAAiB,CAAC;QACpD,MAAM,EAAE,gBAAgB,EAAE,MAAM,IAAI,EAAE;QACtC,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,CAAC,GAAW,EAAE,KAAc,EAAE,EAAE,CACxC,aAAa,CAAC,GAAG,EAAE,KAAe,CAAC;KACtC,CAAC,CAAC;IAEH,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CACL,YAAG,SAAS,EAAE,EAAE,CAAC,oCAAoC,EAAE,SAAS,CAAC,uHAG7D,CACL,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,0BAA0B,EAAE,SAAS,CAAC,YACtD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,KAAC,kBAAkB,IAEjB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,EAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAJnD,KAAK,CAAC,GAAG,CAKd,CACH,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {cn} from '@sqlrooms/ui';\nimport React from 'react';\nimport {\n useChartBuilderContext,\n useChartBuilderStore,\n} from './ChartBuilderContext';\nimport {FieldSelectorInput} from './FieldSelectorInput';\nimport {useChartFieldForm} from './hooks/useChartFieldForm';\n\nexport interface ChartBuilderFieldsProps {\n className?: string;\n}\n\nexport const ChartBuilderFields: React.FC<ChartBuilderFieldsProps> = ({\n className,\n}) => {\n const {columns, templates} = useChartBuilderContext();\n const selectedTemplateId = useChartBuilderStore(\n (state) => state.selectedTemplateId,\n );\n const fieldValues = useChartBuilderStore((state) => state.fieldValues);\n const setFieldValue = useChartBuilderStore((state) => state.setFieldValue);\n\n const selectedTemplate = React.useMemo(\n () => templates.find((template) => template.id === selectedTemplateId),\n [templates, selectedTemplateId],\n );\n\n const {fields, handleFieldChange} = useChartFieldForm({\n fields: selectedTemplate?.fields || [],\n values: fieldValues,\n onChange: (key: string, value: unknown) =>\n setFieldValue(key, value as string),\n });\n\n if (!selectedTemplate) return null;\n\n if (fields.length === 0) {\n return (\n <p className={cn('text-muted-foreground py-2 text-sm', className)}>\n This chart type has no configurable fields. A starter spec will be\n created that you can edit manually.\n </p>\n );\n }\n\n return (\n <div className={cn('flex flex-col gap-4 py-2', className)}>\n {fields.map((field) => (\n <FieldSelectorInput\n key={field.key}\n field={field}\n columns={columns}\n value={fieldValues[field.key]}\n onChange={(value) => handleFieldChange(field.key, value)}\n />\n ))}\n </div>\n );\n};\n"]}
@@ -0,0 +1,27 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+ import type { VgPlotChartConfig } from '../chart-types';
3
+ import type { ChartBuilderColumn, ChartBuilderTemplate, ChartTypeDefinition } from './types';
4
+ export type ChartBuilderRootProps = PropsWithChildren<{
5
+ /** Table name to use in generated specs */
6
+ tableName: string;
7
+ /** Available columns for field selectors */
8
+ columns: ChartBuilderColumn[];
9
+ /** Callback when a chart spec is created */
10
+ onCreateChart: (title: string, metadata: VgPlotChartConfig) => void;
11
+ /** Preferred shared chart-type customization surface */
12
+ chartTypes?: ChartTypeDefinition[];
13
+ /** Backward-compatible UI template customization surface */
14
+ builders?: ChartBuilderTemplate[];
15
+ /** Controlled open state */
16
+ open?: boolean;
17
+ /** Callback when open state changes */
18
+ onOpenChange?: (open: boolean) => void;
19
+ }>;
20
+ /**
21
+ * Compound-component root that provides shared chart-builder state via context
22
+ * and renders a Radix `Dialog`.
23
+ *
24
+ * Supports both controlled (`open`/`onOpenChange`) and uncontrolled usage.
25
+ */
26
+ export declare const ChartBuilderRoot: React.FC<ChartBuilderRootProps>;
27
+ //# sourceMappingURL=ChartBuilderRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBuilderRoot.d.ts","sourceRoot":"","sources":["../../src/chart-builders/ChartBuilderRoot.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EACZ,iBAAiB,EAKlB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,gBAAgB,CAAC;AAQtD,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;IACpD,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,4CAA4C;IAC5C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpE,wDAAwD;IACxD,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAClC,4BAA4B;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC,CAAC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAyF5D,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Dialog } from '@sqlrooms/ui';
3
+ import { useCallback, useEffect, useMemo, useState, } from 'react';
4
+ import { createChartBuilderTemplates, createDefaultChartBuilders, } from './builders';
5
+ import { ChartBuilderContext } from './ChartBuilderContext';
6
+ import { createChartBuilderStore } from './createChartBuilderStore';
7
+ import { getAvailableChartTypes } from './chartTypeUtils';
8
+ /**
9
+ * Compound-component root that provides shared chart-builder state via context
10
+ * and renders a Radix `Dialog`.
11
+ *
12
+ * Supports both controlled (`open`/`onOpenChange`) and uncontrolled usage.
13
+ */
14
+ export const ChartBuilderRoot = ({ tableName, columns, onCreateChart, chartTypes, builders, open, onOpenChange, children, }) => {
15
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
16
+ const [store] = useState(() => createChartBuilderStore());
17
+ const isControlled = open !== undefined;
18
+ const resolvedOpen = isControlled ? open : uncontrolledOpen;
19
+ const resolvedOnOpenChange = useMemo(() => (isControlled ? (onOpenChange ?? (() => { })) : setUncontrolledOpen), [isControlled, onOpenChange]);
20
+ const resolvedTemplates = useMemo(() => {
21
+ if (chartTypes) {
22
+ return createChartBuilderTemplates(chartTypes);
23
+ }
24
+ if (builders) {
25
+ return builders;
26
+ }
27
+ return createDefaultChartBuilders();
28
+ }, [builders, chartTypes]);
29
+ const availableChartTypes = useMemo(() => getAvailableChartTypes(resolvedTemplates, columns), [columns, resolvedTemplates]);
30
+ const availableTemplates = useMemo(() => resolvedTemplates.filter((template) => availableChartTypes.some((chartType) => chartType.id === template.id)), [availableChartTypes, resolvedTemplates]);
31
+ useEffect(() => {
32
+ const { selectedTemplateId, reset } = store.getState();
33
+ if (selectedTemplateId &&
34
+ !availableTemplates.some((template) => template.id === selectedTemplateId)) {
35
+ reset();
36
+ }
37
+ }, [availableTemplates, store]);
38
+ const handleCreateChart = useCallback((title, config) => {
39
+ onCreateChart(title, config);
40
+ resolvedOnOpenChange(false);
41
+ }, [onCreateChart, resolvedOnOpenChange]);
42
+ const ctx = useMemo(() => ({
43
+ tableName,
44
+ columns,
45
+ onCreateChart: handleCreateChart,
46
+ templates: resolvedTemplates,
47
+ availableChartTypes,
48
+ availableTemplates,
49
+ store,
50
+ }), [
51
+ availableChartTypes,
52
+ availableTemplates,
53
+ columns,
54
+ handleCreateChart,
55
+ resolvedTemplates,
56
+ store,
57
+ tableName,
58
+ ]);
59
+ return (_jsx(ChartBuilderContext.Provider, { value: ctx, children: _jsx(Dialog, { open: resolvedOpen, onOpenChange: resolvedOnOpenChange, children: children }) }));
60
+ };
61
+ //# sourceMappingURL=ChartBuilderRoot.js.map