@sqlrooms/mosaic 0.29.0-rc.7 → 0.29.0-rc.8

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 (344) hide show
  1. package/LICENSE.md +2 -1
  2. package/README.md +134 -0
  3. package/dist/MosaicSlice.d.ts +1 -0
  4. package/dist/MosaicSlice.d.ts.map +1 -1
  5. package/dist/MosaicSlice.js.map +1 -1
  6. package/dist/VgPlotChart.d.ts.map +1 -1
  7. package/dist/VgPlotChart.js +9 -3
  8. package/dist/VgPlotChart.js.map +1 -1
  9. package/dist/ai/ai.d.ts +9 -4
  10. package/dist/ai/ai.d.ts.map +1 -1
  11. package/dist/ai/ai.js +91 -49
  12. package/dist/ai/ai.js.map +1 -1
  13. package/dist/ai.d.ts.map +1 -1
  14. package/dist/ai.js.map +1 -1
  15. package/dist/charts/MosaicChart.d.ts +3 -1
  16. package/dist/charts/MosaicChart.d.ts.map +1 -1
  17. package/dist/charts/MosaicChart.js +2 -2
  18. package/dist/charts/MosaicChart.js.map +1 -1
  19. package/dist/charts/MosaicChartError.d.ts +8 -2
  20. package/dist/charts/MosaicChartError.d.ts.map +1 -1
  21. package/dist/charts/MosaicChartError.js +29 -3
  22. package/dist/charts/MosaicChartError.js.map +1 -1
  23. package/dist/charts/MosaicChartSettingsButton.d.ts +15 -0
  24. package/dist/charts/MosaicChartSettingsButton.d.ts.map +1 -0
  25. package/dist/charts/MosaicChartSettingsButton.js +7 -0
  26. package/dist/charts/MosaicChartSettingsButton.js.map +1 -0
  27. package/dist/charts/MosaicChartView.d.ts +2 -0
  28. package/dist/charts/MosaicChartView.d.ts.map +1 -1
  29. package/dist/charts/MosaicChartView.js +20 -7
  30. package/dist/charts/MosaicChartView.js.map +1 -1
  31. package/dist/charts/chart-settings/MosaicChartSettings.d.ts.map +1 -1
  32. package/dist/charts/chart-settings/MosaicChartSettings.js +3 -3
  33. package/dist/charts/chart-settings/MosaicChartSettings.js.map +1 -1
  34. package/dist/charts/chart-settings/MosaicChartSettingsPanel.js +1 -1
  35. package/dist/charts/chart-settings/MosaicChartSettingsPanel.js.map +1 -1
  36. package/dist/charts/chart-settings/MosaicChartTypeSelector.d.ts.map +1 -1
  37. package/dist/charts/chart-settings/MosaicChartTypeSelector.js +11 -4
  38. package/dist/charts/chart-settings/MosaicChartTypeSelector.js.map +1 -1
  39. package/dist/charts/chart-types/base-types.d.ts +17 -6
  40. package/dist/charts/chart-types/base-types.d.ts.map +1 -1
  41. package/dist/charts/chart-types/base-types.js +3 -0
  42. package/dist/charts/chart-types/base-types.js.map +1 -1
  43. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.d.ts.map +1 -1
  44. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.js +3 -8
  45. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.js.map +1 -1
  46. package/dist/charts/chart-types/chart-config.d.ts +3 -1
  47. package/dist/charts/chart-types/chart-config.d.ts.map +1 -1
  48. package/dist/charts/chart-types/chart-config.js +2 -2
  49. package/dist/charts/chart-types/chart-config.js.map +1 -1
  50. package/dist/charts/chart-types/count-plot/spec.d.ts +2 -1
  51. package/dist/charts/chart-types/count-plot/spec.d.ts.map +1 -1
  52. package/dist/charts/chart-types/count-plot/spec.js +65 -34
  53. package/dist/charts/chart-types/count-plot/spec.js.map +1 -1
  54. package/dist/charts/chart-types/count-plot/tool.js +1 -1
  55. package/dist/charts/chart-types/count-plot/tool.js.map +1 -1
  56. package/dist/charts/chart-types/createDefaultChartTypes.js +2 -2
  57. package/dist/charts/chart-types/createDefaultChartTypes.js.map +1 -1
  58. package/dist/charts/chart-types/custom-spec/spec.d.ts +2 -1
  59. package/dist/charts/chart-types/custom-spec/spec.d.ts.map +1 -1
  60. package/dist/charts/chart-types/custom-spec/spec.js +16 -12
  61. package/dist/charts/chart-types/custom-spec/spec.js.map +1 -1
  62. package/dist/charts/chart-types/errors.d.ts +25 -0
  63. package/dist/charts/chart-types/errors.d.ts.map +1 -1
  64. package/dist/charts/chart-types/errors.js +38 -0
  65. package/dist/charts/chart-types/errors.js.map +1 -1
  66. package/dist/charts/chart-types/heatmap/spec.d.ts +2 -1
  67. package/dist/charts/chart-types/heatmap/spec.d.ts.map +1 -1
  68. package/dist/charts/chart-types/heatmap/spec.js +53 -21
  69. package/dist/charts/chart-types/heatmap/spec.js.map +1 -1
  70. package/dist/charts/chart-types/heatmap/tool.js +2 -2
  71. package/dist/charts/chart-types/heatmap/tool.js.map +1 -1
  72. package/dist/charts/chart-types/histogram/HistogramSettings.d.ts.map +1 -1
  73. package/dist/charts/chart-types/histogram/HistogramSettings.js +3 -1
  74. package/dist/charts/chart-types/histogram/HistogramSettings.js.map +1 -1
  75. package/dist/charts/chart-types/histogram/schema.d.ts +2 -0
  76. package/dist/charts/chart-types/histogram/schema.d.ts.map +1 -1
  77. package/dist/charts/chart-types/histogram/schema.js +1 -0
  78. package/dist/charts/chart-types/histogram/schema.js.map +1 -1
  79. package/dist/charts/chart-types/histogram/spec.d.ts +2 -1
  80. package/dist/charts/chart-types/histogram/spec.d.ts.map +1 -1
  81. package/dist/charts/chart-types/histogram/spec.js +50 -27
  82. package/dist/charts/chart-types/histogram/spec.js.map +1 -1
  83. package/dist/charts/chart-types/histogram/tool.d.ts +2 -0
  84. package/dist/charts/chart-types/histogram/tool.d.ts.map +1 -1
  85. package/dist/charts/chart-types/histogram/tool.js +1 -1
  86. package/dist/charts/chart-types/histogram/tool.js.map +1 -1
  87. package/dist/charts/chart-types/index.d.ts +4 -4
  88. package/dist/charts/chart-types/index.js +4 -4
  89. package/dist/charts/chart-types/index.js.map +1 -1
  90. package/dist/charts/chart-types/line-chart/LineChartSettings.d.ts.map +1 -1
  91. package/dist/charts/chart-types/line-chart/LineChartSettings.js +4 -13
  92. package/dist/charts/chart-types/line-chart/LineChartSettings.js.map +1 -1
  93. package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.d.ts +7 -0
  94. package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.d.ts.map +1 -0
  95. package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.js +22 -0
  96. package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.js.map +1 -0
  97. package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.d.ts +7 -0
  98. package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.d.ts.map +1 -0
  99. package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.js +42 -0
  100. package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.js.map +1 -0
  101. package/dist/charts/chart-types/line-chart/schema.d.ts +2 -0
  102. package/dist/charts/chart-types/line-chart/schema.d.ts.map +1 -1
  103. package/dist/charts/chart-types/line-chart/schema.js +5 -0
  104. package/dist/charts/chart-types/line-chart/schema.js.map +1 -1
  105. package/dist/charts/chart-types/line-chart/spec.d.ts +2 -1
  106. package/dist/charts/chart-types/line-chart/spec.d.ts.map +1 -1
  107. package/dist/charts/chart-types/line-chart/spec.js +97 -65
  108. package/dist/charts/chart-types/line-chart/spec.js.map +1 -1
  109. package/dist/charts/chart-types/line-chart/tool.d.ts +2 -0
  110. package/dist/charts/chart-types/line-chart/tool.d.ts.map +1 -1
  111. package/dist/charts/chart-types/line-chart/tool.js +1 -1
  112. package/dist/charts/chart-types/line-chart/tool.js.map +1 -1
  113. package/dist/charts/chart-types/line-chart/utils.d.ts +7 -0
  114. package/dist/charts/chart-types/line-chart/utils.d.ts.map +1 -0
  115. package/dist/charts/chart-types/line-chart/utils.js +17 -0
  116. package/dist/charts/chart-types/line-chart/utils.js.map +1 -0
  117. package/dist/charts/chart-types/mosaicChartTypes.d.ts +4 -2
  118. package/dist/charts/chart-types/mosaicChartTypes.d.ts.map +1 -1
  119. package/dist/charts/chart-types/mosaicChartTypes.js +2 -2
  120. package/dist/charts/chart-types/mosaicChartTypes.js.map +1 -1
  121. package/dist/charts/chart-types/scatter-plot/ScatterPlotSettings.d.ts +3 -0
  122. package/dist/charts/chart-types/scatter-plot/ScatterPlotSettings.d.ts.map +1 -0
  123. package/dist/charts/chart-types/{bubble-chart/BubbleChartSettings.js → scatter-plot/ScatterPlotSettings.js} +4 -4
  124. package/dist/charts/chart-types/scatter-plot/ScatterPlotSettings.js.map +1 -0
  125. package/dist/charts/chart-types/scatter-plot/definition.d.ts +4 -0
  126. package/dist/charts/chart-types/scatter-plot/definition.d.ts.map +1 -0
  127. package/dist/charts/chart-types/scatter-plot/definition.js +24 -0
  128. package/dist/charts/chart-types/scatter-plot/definition.js.map +1 -0
  129. package/dist/charts/chart-types/{bubble-chart → scatter-plot}/schema.d.ts +5 -5
  130. package/dist/charts/chart-types/scatter-plot/schema.d.ts.map +1 -0
  131. package/dist/charts/chart-types/{bubble-chart → scatter-plot}/schema.js +5 -5
  132. package/dist/charts/chart-types/scatter-plot/schema.js.map +1 -0
  133. package/dist/charts/chart-types/scatter-plot/spec.d.ts +5 -0
  134. package/dist/charts/chart-types/scatter-plot/spec.d.ts.map +1 -0
  135. package/dist/charts/chart-types/scatter-plot/spec.js +81 -0
  136. package/dist/charts/chart-types/scatter-plot/spec.js.map +1 -0
  137. package/dist/charts/chart-types/{bubble-chart → scatter-plot}/tool.d.ts +3 -3
  138. package/dist/charts/chart-types/{bubble-chart → scatter-plot}/tool.d.ts.map +1 -1
  139. package/dist/charts/chart-types/{bubble-chart → scatter-plot}/tool.js +17 -13
  140. package/dist/charts/chart-types/scatter-plot/tool.js.map +1 -0
  141. package/dist/charts/dashboard/MosaicDashboardChartHeaderActions.d.ts.map +1 -1
  142. package/dist/charts/dashboard/MosaicDashboardChartHeaderActions.js +12 -5
  143. package/dist/charts/dashboard/MosaicDashboardChartHeaderActions.js.map +1 -1
  144. package/dist/charts/dashboard/MosaicDashboardChartRenderer.d.ts.map +1 -1
  145. package/dist/charts/dashboard/MosaicDashboardChartRenderer.js +2 -2
  146. package/dist/charts/dashboard/MosaicDashboardChartRenderer.js.map +1 -1
  147. package/dist/charts/useChartDataPolicy.d.ts.map +1 -1
  148. package/dist/charts/useChartDataPolicy.js +2 -1
  149. package/dist/charts/useChartDataPolicy.js.map +1 -1
  150. package/dist/charts/useChartPanelClients.d.ts +8 -0
  151. package/dist/charts/useChartPanelClients.d.ts.map +1 -0
  152. package/dist/charts/useChartPanelClients.js +22 -0
  153. package/dist/charts/useChartPanelClients.js.map +1 -0
  154. package/dist/charts/useMosaicChartRenderContext.d.ts +2 -3
  155. package/dist/charts/useMosaicChartRenderContext.d.ts.map +1 -1
  156. package/dist/charts/useMosaicChartRenderContext.js +15 -15
  157. package/dist/charts/useMosaicChartRenderContext.js.map +1 -1
  158. package/dist/charts/worksheet/ChartBlockHeader.d.ts.map +1 -1
  159. package/dist/charts/worksheet/ChartBlockHeader.js +4 -3
  160. package/dist/charts/worksheet/ChartBlockHeader.js.map +1 -1
  161. package/dist/charts/worksheet/ChartBlockRenderer.d.ts.map +1 -1
  162. package/dist/charts/worksheet/ChartBlockRenderer.js +3 -13
  163. package/dist/charts/worksheet/ChartBlockRenderer.js.map +1 -1
  164. package/dist/column-types-utils.d.ts.map +1 -1
  165. package/dist/column-types-utils.js +12 -4
  166. package/dist/column-types-utils.js.map +1 -1
  167. package/dist/components/AggregationSelector.d.ts.map +1 -1
  168. package/dist/components/AggregationSelector.js +9 -2
  169. package/dist/components/AggregationSelector.js.map +1 -1
  170. package/dist/components/BlockCaptionEditor.d.ts +20 -0
  171. package/dist/components/BlockCaptionEditor.d.ts.map +1 -0
  172. package/dist/components/BlockCaptionEditor.js +15 -0
  173. package/dist/components/BlockCaptionEditor.js.map +1 -0
  174. package/dist/components/ColorSelector.d.ts +12 -0
  175. package/dist/components/ColorSelector.d.ts.map +1 -0
  176. package/dist/components/ColorSelector.js +14 -0
  177. package/dist/components/ColorSelector.js.map +1 -0
  178. package/dist/components/ColumnSelector.d.ts +1 -0
  179. package/dist/components/ColumnSelector.d.ts.map +1 -1
  180. package/dist/components/ColumnSelector.js +2 -2
  181. package/dist/components/ColumnSelector.js.map +1 -1
  182. package/dist/components/Combobox.d.ts +45 -0
  183. package/dist/components/Combobox.d.ts.map +1 -0
  184. package/dist/components/Combobox.js +58 -0
  185. package/dist/components/Combobox.js.map +1 -0
  186. package/dist/components/FieldSelectorInput.d.ts +1 -0
  187. package/dist/components/FieldSelectorInput.d.ts.map +1 -1
  188. package/dist/components/FieldSelectorInput.js +4 -9
  189. package/dist/components/FieldSelectorInput.js.map +1 -1
  190. package/dist/components/MultiFieldSelector.d.ts +4 -1
  191. package/dist/components/MultiFieldSelector.d.ts.map +1 -1
  192. package/dist/components/MultiFieldSelector.js +4 -13
  193. package/dist/components/MultiFieldSelector.js.map +1 -1
  194. package/dist/components/TemporalGranularitySelector.d.ts.map +1 -1
  195. package/dist/components/TemporalGranularitySelector.js +13 -9
  196. package/dist/components/TemporalGranularitySelector.js.map +1 -1
  197. package/dist/components/useCombobox.d.ts +23 -0
  198. package/dist/components/useCombobox.d.ts.map +1 -0
  199. package/dist/components/useCombobox.js +26 -0
  200. package/dist/components/useCombobox.js.map +1 -0
  201. package/dist/constants/chart-colors.d.ts +3 -0
  202. package/dist/constants/chart-colors.d.ts.map +1 -0
  203. package/dist/constants/chart-colors.js +5 -0
  204. package/dist/constants/chart-colors.js.map +1 -0
  205. package/dist/dashboard/DefaultMosaicDashboardBlock.d.ts +2 -1
  206. package/dist/dashboard/DefaultMosaicDashboardBlock.d.ts.map +1 -1
  207. package/dist/dashboard/DefaultMosaicDashboardBlock.js +1 -1
  208. package/dist/dashboard/DefaultMosaicDashboardBlock.js.map +1 -1
  209. package/dist/dashboard/MosaicDashboardSlice.d.ts +22 -4
  210. package/dist/dashboard/MosaicDashboardSlice.d.ts.map +1 -1
  211. package/dist/dashboard/MosaicDashboardSlice.js +55 -0
  212. package/dist/dashboard/MosaicDashboardSlice.js.map +1 -1
  213. package/dist/dashboard/components/ResetFiltersButton.d.ts +14 -0
  214. package/dist/dashboard/components/ResetFiltersButton.d.ts.map +1 -0
  215. package/dist/dashboard/components/ResetFiltersButton.js +15 -0
  216. package/dist/dashboard/components/ResetFiltersButton.js.map +1 -0
  217. package/dist/dashboard/dashboard-types.d.ts +9 -3
  218. package/dist/dashboard/dashboard-types.d.ts.map +1 -1
  219. package/dist/dashboard/hooks/useDashboardResetFilters.d.ts +14 -0
  220. package/dist/dashboard/hooks/useDashboardResetFilters.d.ts.map +1 -0
  221. package/dist/dashboard/hooks/useDashboardResetFilters.js +39 -0
  222. package/dist/dashboard/hooks/useDashboardResetFilters.js.map +1 -0
  223. package/dist/dashboard/hooks/usePanelResetFilters.d.ts +16 -0
  224. package/dist/dashboard/hooks/usePanelResetFilters.d.ts.map +1 -0
  225. package/dist/dashboard/hooks/usePanelResetFilters.js +47 -0
  226. package/dist/dashboard/hooks/usePanelResetFilters.js.map +1 -0
  227. package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.d.ts.map +1 -1
  228. package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.js +3 -3
  229. package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.js.map +1 -1
  230. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.d.ts +7 -0
  231. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.d.ts.map +1 -0
  232. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.js +18 -0
  233. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.js.map +1 -0
  234. package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.d.ts.map +1 -1
  235. package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.js +4 -32
  236. package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.js.map +1 -1
  237. package/dist/dashboard/toolbar/MosaicDashboardToolbar.d.ts +2 -2
  238. package/dist/dashboard/toolbar/MosaicDashboardToolbar.d.ts.map +1 -1
  239. package/dist/dashboard/toolbar/MosaicDashboardToolbar.js +12 -10
  240. package/dist/dashboard/toolbar/MosaicDashboardToolbar.js.map +1 -1
  241. package/dist/dashboard/usePanelClientRegistration.d.ts +7 -0
  242. package/dist/dashboard/usePanelClientRegistration.d.ts.map +1 -0
  243. package/dist/dashboard/usePanelClientRegistration.js +30 -0
  244. package/dist/dashboard/usePanelClientRegistration.js.map +1 -0
  245. package/dist/dashboard/usePanelClients.d.ts +7 -0
  246. package/dist/dashboard/usePanelClients.d.ts.map +1 -0
  247. package/dist/dashboard/usePanelClients.js +13 -0
  248. package/dist/dashboard/usePanelClients.js.map +1 -0
  249. package/dist/data-table-explorer/DataTableExplorer.d.ts +4 -2
  250. package/dist/data-table-explorer/DataTableExplorer.d.ts.map +1 -1
  251. package/dist/data-table-explorer/DataTableExplorer.js +4 -4
  252. package/dist/data-table-explorer/DataTableExplorer.js.map +1 -1
  253. package/dist/data-table-explorer/DataTableExplorerCategoryClient.d.ts.map +1 -1
  254. package/dist/data-table-explorer/DataTableExplorerCategoryClient.js +1 -0
  255. package/dist/data-table-explorer/DataTableExplorerCategoryClient.js.map +1 -1
  256. package/dist/data-table-explorer/createDataTableExplorerStore.d.ts +3 -0
  257. package/dist/data-table-explorer/createDataTableExplorerStore.d.ts.map +1 -1
  258. package/dist/data-table-explorer/createDataTableExplorerStore.js +6 -0
  259. package/dist/data-table-explorer/createDataTableExplorerStore.js.map +1 -1
  260. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.d.ts +4 -0
  261. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.d.ts.map +1 -0
  262. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.js +13 -0
  263. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.js.map +1 -0
  264. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.d.ts.map +1 -1
  265. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.js +22 -7
  266. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.js.map +1 -1
  267. package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.d.ts +13 -0
  268. package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.d.ts.map +1 -0
  269. package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.js +32 -0
  270. package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.js.map +1 -0
  271. package/dist/data-table-explorer/dataTableExplorerController.d.ts +5 -1
  272. package/dist/data-table-explorer/dataTableExplorerController.d.ts.map +1 -1
  273. package/dist/data-table-explorer/dataTableExplorerController.js +5 -2
  274. package/dist/data-table-explorer/dataTableExplorerController.js.map +1 -1
  275. package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.d.ts +12 -0
  276. package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.d.ts.map +1 -0
  277. package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.js +19 -0
  278. package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.js.map +1 -0
  279. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.d.ts +30 -0
  280. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.d.ts.map +1 -0
  281. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.js +120 -0
  282. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.js.map +1 -0
  283. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.d.ts +28 -0
  284. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.d.ts.map +1 -0
  285. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.js +40 -0
  286. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.js.map +1 -0
  287. package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.d.ts +13 -0
  288. package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.d.ts.map +1 -0
  289. package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.js +40 -0
  290. package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.js.map +1 -0
  291. package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.d.ts +18 -0
  292. package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.d.ts.map +1 -0
  293. package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.js +23 -0
  294. package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.js.map +1 -0
  295. package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.d.ts +27 -0
  296. package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.d.ts.map +1 -0
  297. package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.js +28 -0
  298. package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.js.map +1 -0
  299. package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.d.ts +15 -0
  300. package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.d.ts.map +1 -0
  301. package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.js +21 -0
  302. package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.js.map +1 -0
  303. package/dist/data-table-explorer/types.d.ts +6 -3
  304. package/dist/data-table-explorer/types.d.ts.map +1 -1
  305. package/dist/data-table-explorer/types.js.map +1 -1
  306. package/dist/data-table-explorer/useDataTableExplorer.d.ts.map +1 -1
  307. package/dist/data-table-explorer/useDataTableExplorer.js +12 -275
  308. package/dist/data-table-explorer/useDataTableExplorer.js.map +1 -1
  309. package/dist/data-table-explorer/worksheet/DataTableBlockHeader.d.ts +1 -0
  310. package/dist/data-table-explorer/worksheet/DataTableBlockHeader.d.ts.map +1 -1
  311. package/dist/data-table-explorer/worksheet/DataTableBlockHeader.js +4 -2
  312. package/dist/data-table-explorer/worksheet/DataTableBlockHeader.js.map +1 -1
  313. package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.d.ts.map +1 -1
  314. package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.js +3 -3
  315. package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.js.map +1 -1
  316. package/dist/index.d.ts +8 -4
  317. package/dist/index.d.ts.map +1 -1
  318. package/dist/index.js +7 -3
  319. package/dist/index.js.map +1 -1
  320. package/dist/useVgPlotChartRender.d.ts.map +1 -1
  321. package/dist/useVgPlotChartRender.js +125 -24
  322. package/dist/useVgPlotChartRender.js.map +1 -1
  323. package/dist/useVgPlotChartRetention.d.ts +11 -0
  324. package/dist/useVgPlotChartRetention.d.ts.map +1 -1
  325. package/dist/useVgPlotChartRetention.js.map +1 -1
  326. package/package.json +14 -14
  327. package/dist/charts/chart-types/bubble-chart/BubbleChartSettings.d.ts +0 -3
  328. package/dist/charts/chart-types/bubble-chart/BubbleChartSettings.d.ts.map +0 -1
  329. package/dist/charts/chart-types/bubble-chart/BubbleChartSettings.js.map +0 -1
  330. package/dist/charts/chart-types/bubble-chart/definition.d.ts +0 -4
  331. package/dist/charts/chart-types/bubble-chart/definition.d.ts.map +0 -1
  332. package/dist/charts/chart-types/bubble-chart/definition.js +0 -24
  333. package/dist/charts/chart-types/bubble-chart/definition.js.map +0 -1
  334. package/dist/charts/chart-types/bubble-chart/schema.d.ts.map +0 -1
  335. package/dist/charts/chart-types/bubble-chart/schema.js.map +0 -1
  336. package/dist/charts/chart-types/bubble-chart/spec.d.ts +0 -4
  337. package/dist/charts/chart-types/bubble-chart/spec.d.ts.map +0 -1
  338. package/dist/charts/chart-types/bubble-chart/spec.js +0 -31
  339. package/dist/charts/chart-types/bubble-chart/spec.js.map +0 -1
  340. package/dist/charts/chart-types/bubble-chart/tool.js.map +0 -1
  341. package/dist/hooks/useDataTable.d.ts +0 -3
  342. package/dist/hooks/useDataTable.d.ts.map +0 -1
  343. package/dist/hooks/useDataTable.js +0 -28
  344. package/dist/hooks/useDataTable.js.map +0 -1
@@ -32,6 +32,7 @@ export declare const LineChartSettings: z.ZodObject<{
32
32
  avg: "avg";
33
33
  }>>>;
34
34
  }, z.core.$strip>>>;
35
+ showLegend: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
35
36
  }, z.core.$strip>;
36
37
  export type LineChartSettings = z.infer<typeof LineChartSettings>;
37
38
  export declare const LineChartConfig: z.ZodObject<{
@@ -58,6 +59,7 @@ export declare const LineChartConfig: z.ZodObject<{
58
59
  avg: "avg";
59
60
  }>>>;
60
61
  }, z.core.$strip>>>;
62
+ showLegend: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
61
63
  }, z.core.$strip>;
62
64
  settingsOpen: z.ZodOptional<z.ZodBoolean>;
63
65
  dataPolicy: z.ZodOptional<z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAKtB,eAAO,MAAM,YAAY;;;;;;;;;iBAMvB,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;iBAY5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAK1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAKtB,eAAO,MAAM,YAAY;;;;;;;;;iBAMvB,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;iBAiB5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAK1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -19,6 +19,11 @@ export const LineChartSettings = z.object({
19
19
  .array(YFieldConfig)
20
20
  .optional()
21
21
  .describe('Array of Y fields to plot, supports multiple lines'),
22
+ showLegend: z
23
+ .boolean()
24
+ .optional()
25
+ .default(true)
26
+ .describe('Show interactive legend for toggling line visibility'),
22
27
  });
23
28
  export const LineChartConfig = z.object({
24
29
  chartType: z.literal('line-chart'),
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,6BAA6B,EAAC,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAErE,wBAAwB;AACxB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACnE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACrE,SAAS,EAAE,iBAAiB,CAAC,QAAQ,EAAE;SACpC,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,6CAA6C,CAAC;CAC3D,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,CAAC,EAAE,CAAC;SACD,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mDAAmD,CAAC;IAChE,SAAS,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC7C,yDAAyD,CAC1D;IACD,OAAO,EAAE,CAAC;SACP,KAAK,CAAC,YAAY,CAAC;SACnB,QAAQ,EAAE;SACV,QAAQ,CAAC,oDAAoD,CAAC;CAClE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAClC,QAAQ,EAAE,iBAAiB;IAC3B,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACpC,UAAU,EAAE,6BAA6B,CAAC,QAAQ,EAAE;CACrD,CAAC,CAAC","sourcesContent":["import {z} from 'zod';\nimport {ChartDataPolicyOverrideConfig} from '../data-policy-schema';\nimport {TemporalInterval, AggregateFunction} from '../../../schemas';\n\n// Y-field configuration\nexport const YFieldConfig = z.object({\n field: z.string().describe('Numeric column name to plot on Y axis'),\n color: z.string().optional().describe('Optional color for this line'),\n aggregate: AggregateFunction.optional()\n .default('sum')\n .describe('Aggregation function: sum, avg, min, or max'),\n});\nexport type YFieldConfig = z.infer<typeof YFieldConfig>;\n\nexport const LineChartSettings = z.object({\n x: z\n .string()\n .optional()\n .describe('Column for X axis, typically temporal (date/time)'),\n xInterval: TemporalInterval.optional().describe(\n 'Temporal binning interval: year, month, day, hour, etc.',\n ),\n yFields: z\n .array(YFieldConfig)\n .optional()\n .describe('Array of Y fields to plot, supports multiple lines'),\n});\n\nexport type LineChartSettings = z.infer<typeof LineChartSettings>;\n\nexport const LineChartConfig = z.object({\n chartType: z.literal('line-chart'),\n settings: LineChartSettings,\n settingsOpen: z.boolean().optional(),\n dataPolicy: ChartDataPolicyOverrideConfig.optional(),\n});\n\nexport type LineChartConfig = z.infer<typeof LineChartConfig>;\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,6BAA6B,EAAC,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAErE,wBAAwB;AACxB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACnE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACrE,SAAS,EAAE,iBAAiB,CAAC,QAAQ,EAAE;SACpC,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,6CAA6C,CAAC;CAC3D,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,CAAC,EAAE,CAAC;SACD,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mDAAmD,CAAC;IAChE,SAAS,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC7C,yDAAyD,CAC1D;IACD,OAAO,EAAE,CAAC;SACP,KAAK,CAAC,YAAY,CAAC;SACnB,QAAQ,EAAE;SACV,QAAQ,CAAC,oDAAoD,CAAC;IACjE,UAAU,EAAE,CAAC;SACV,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,sDAAsD,CAAC;CACpE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAClC,QAAQ,EAAE,iBAAiB;IAC3B,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACpC,UAAU,EAAE,6BAA6B,CAAC,QAAQ,EAAE;CACrD,CAAC,CAAC","sourcesContent":["import {z} from 'zod';\nimport {ChartDataPolicyOverrideConfig} from '../data-policy-schema';\nimport {TemporalInterval, AggregateFunction} from '../../../schemas';\n\n// Y-field configuration\nexport const YFieldConfig = z.object({\n field: z.string().describe('Numeric column name to plot on Y axis'),\n color: z.string().optional().describe('Optional color for this line'),\n aggregate: AggregateFunction.optional()\n .default('sum')\n .describe('Aggregation function: sum, avg, min, or max'),\n});\nexport type YFieldConfig = z.infer<typeof YFieldConfig>;\n\nexport const LineChartSettings = z.object({\n x: z\n .string()\n .optional()\n .describe('Column for X axis, typically temporal (date/time)'),\n xInterval: TemporalInterval.optional().describe(\n 'Temporal binning interval: year, month, day, hour, etc.',\n ),\n yFields: z\n .array(YFieldConfig)\n .optional()\n .describe('Array of Y fields to plot, supports multiple lines'),\n showLegend: z\n .boolean()\n .optional()\n .default(true)\n .describe('Show interactive legend for toggling line visibility'),\n});\n\nexport type LineChartSettings = z.infer<typeof LineChartSettings>;\n\nexport const LineChartConfig = z.object({\n chartType: z.literal('line-chart'),\n settings: LineChartSettings,\n settingsOpen: z.boolean().optional(),\n dataPolicy: ChartDataPolicyOverrideConfig.optional(),\n});\n\nexport type LineChartConfig = z.infer<typeof LineChartConfig>;\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { Spec } from '@uwdata/mosaic-spec';
2
2
  import { LineChartSettings } from './schema';
3
- export declare function createLineChartSpec(tableName: string, { x, yFields, xInterval }: LineChartSettings): Spec;
3
+ import { CreateSpecOptions } from '../base-types';
4
+ export declare function createLineChartSpec(options: CreateSpecOptions<LineChartSettings>): Spec;
4
5
  //# sourceMappingURL=spec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAC,iBAAiB,EAAC,MAAM,UAAU,CAAC;AAuB3C,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,EAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAC,EAAE,iBAAiB,GACzC,IAAI,CAgFN"}
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAC,iBAAiB,EAAC,MAAM,UAAU,CAAC;AAM3C,OAAO,EAAC,iBAAiB,EAAyB,MAAM,eAAe,CAAC;AAoBxE,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,GAC5C,IAAI,CAyFN"}
@@ -1,91 +1,123 @@
1
- import { ChartSpecError } from '../errors';
2
- // Chart color palette matching theme colors from tailwind-preset.css
3
- const CHART_COLORS = [
4
- '#ea7c5c', // chart-1: hsl(12, 76%, 61%)
5
- '#2a9d8f', // chart-2: hsl(173, 58%, 39%)
6
- '#264653', // chart-3: hsl(197, 37%, 24%)
7
- '#e9c46a', // chart-4: hsl(43, 74%, 66%)
8
- '#f4a261', // chart-5: hsl(27, 87%, 67%)
9
- ];
10
- function getLineColor(fieldConfig, index) {
11
- if (fieldConfig.color) {
12
- return fieldConfig.color;
1
+ import { InvalidColumnTypeError, MissingColumnsError, RequiredFieldsError, } from '../errors';
2
+ import { getChartTableReference } from '../base-types';
3
+ import { isNumericType, isQuantitativeType, isTemporalType, } from '../../../column-types-utils';
4
+ import { DEFAULT_CHART_FALLBACK_COLOR } from '../../../constants/chart-colors';
5
+ function getLegendLabel(yColumn, hasAggregation) {
6
+ if (hasAggregation && yColumn.aggregate) {
7
+ return `${yColumn.field} (${yColumn.aggregate.toUpperCase()})`;
13
8
  }
14
- // CHART_COLORS is non-empty, so this is always defined
15
- return CHART_COLORS[index % CHART_COLORS.length];
9
+ return yColumn.field;
16
10
  }
17
- export function createLineChartSpec(tableName, { x, yFields, xInterval }) {
18
- if (!x) {
19
- throw new ChartSpecError('X field is required for line chart');
20
- }
21
- if (!yFields || yFields.length === 0) {
22
- throw new ChartSpecError('At least one Y field is required for line chart');
23
- }
11
+ export function createLineChartSpec(options) {
12
+ const { dataTable, selectionName, settings } = options;
13
+ const { xColumn, yColumns, xInterval } = validateLineChartSettings(options);
14
+ const isXTemporal = isTemporalType(xColumn.type);
24
15
  const plotMarks = [];
25
- // When temporal aggregation is active, use SQL binning
26
- const dataSource = xInterval
27
- ? {
28
- from: tableName,
29
- filterBy: '$brush',
30
- }
31
- : { from: tableName, filterBy: '$brush' };
32
- // Generate lineY and text marks for each Y field
33
- yFields.forEach((fieldConfig, index) => {
34
- const color = getLineColor(fieldConfig, index);
35
- const aggregate = fieldConfig.aggregate || 'sum';
16
+ // Data source always includes filterBy for brush
17
+ const dataSource = {
18
+ from: getChartTableReference(dataTable),
19
+ filterBy: '$brush',
20
+ };
21
+ // Generate lineY marks for each Y field
22
+ yColumns.forEach((yColumn) => {
23
+ const color = yColumn.color ?? DEFAULT_CHART_FALLBACK_COLOR;
24
+ const aggregate = yColumn.aggregate ?? 'sum';
36
25
  // When temporal aggregation is active, use bin for X and aggregation for Y
37
- if (xInterval) {
26
+ if (isXTemporal && xInterval) {
38
27
  // Use bin syntax for temporal aggregation
39
28
  plotMarks.push({
40
29
  mark: 'lineY',
41
30
  data: dataSource,
42
- x: { bin: x, interval: xInterval },
43
- y: { [aggregate]: fieldConfig.field },
31
+ x: { bin: xColumn.name, interval: xInterval },
32
+ y: { [aggregate]: yColumn.column.name },
44
33
  stroke: color,
45
34
  });
46
- // Text label with aggregation info
47
- plotMarks.push({
48
- mark: 'text',
49
- data: dataSource,
50
- x: { bin: x, interval: xInterval },
51
- y: { [aggregate]: fieldConfig.field },
52
- text: [`${fieldConfig.field} (${aggregate})`],
53
- fill: color,
54
- dx: 5,
55
- dy: -5,
56
- });
57
35
  }
58
36
  else {
59
37
  // No aggregation - direct field references
60
38
  plotMarks.push({
61
39
  mark: 'lineY',
62
40
  data: dataSource,
63
- x,
64
- y: fieldConfig.field,
41
+ x: xColumn.name,
42
+ y: yColumn.column.name,
65
43
  stroke: color,
66
44
  });
67
- plotMarks.push({
68
- mark: 'text',
69
- data: dataSource,
70
- x,
71
- y: fieldConfig.field,
72
- text: [fieldConfig.field],
73
- fill: color,
74
- dx: 5,
75
- dy: -5,
76
- });
77
45
  }
78
46
  });
79
- // Add brush
80
- plotMarks.push({ select: 'intervalX', as: '$brush' });
81
- return {
47
+ // Add brush control only if selectionName is provided
48
+ if (selectionName) {
49
+ plotMarks.push({ select: 'intervalX', as: '$brush' });
50
+ }
51
+ const showLegend = settings.showLegend ?? true;
52
+ const plotSpec = {
82
53
  plot: plotMarks,
83
- xLabel: x,
54
+ name: 'lineChart',
55
+ xLabel: xColumn.name,
84
56
  yLabel: undefined,
85
- height: 250,
86
- width: 380,
87
- margins: { left: 50, right: 20, top: 20, bottom: 50 },
57
+ margins: {
58
+ left: 50,
59
+ right: 20,
60
+ top: 20,
61
+ bottom: 50,
62
+ },
63
+ colorDomain: yColumns.map((yColumn) => getLegendLabel({ field: yColumn.column.name, aggregate: yColumn.aggregate }, Boolean(isXTemporal && xInterval))),
64
+ colorRange: yColumns.map((yColumn) => yColumn.color ?? DEFAULT_CHART_FALLBACK_COLOR),
65
+ };
66
+ if (!showLegend) {
67
+ return {
68
+ ...plotSpec,
69
+ params: { brush: { select: 'crossfilter' } },
70
+ };
71
+ }
72
+ return {
73
+ vconcat: [
74
+ plotSpec,
75
+ {
76
+ legend: 'color',
77
+ for: 'lineChart',
78
+ columns: yColumns.length,
79
+ },
80
+ ],
88
81
  params: { brush: { select: 'crossfilter' } },
89
82
  };
90
83
  }
84
+ function validateLineChartSettings({ dataTable, settings: { x, yFields = [], xInterval }, }) {
85
+ // Basic validation for required fields
86
+ if (!x || yFields.length === 0) {
87
+ throw new RequiredFieldsError([
88
+ ...(x ? [] : ['X-axis']),
89
+ ...(yFields.length > 0 ? [] : ['Y-axis']),
90
+ ]);
91
+ }
92
+ // Validate X and Y field existence
93
+ const xColumn = dataTable.columns.find((col) => col.name === x);
94
+ const yColumns = yFields.map((y) => ({
95
+ field: y.field,
96
+ column: dataTable.columns.find((col) => col.name === y.field),
97
+ aggregate: y.aggregate,
98
+ color: y.color,
99
+ }));
100
+ const missingYColumns = yColumns.filter((y) => !y.column);
101
+ if (!xColumn || missingYColumns.length > 0) {
102
+ throw new MissingColumnsError([
103
+ ...(xColumn ? [] : ['X-axis']),
104
+ ...missingYColumns.map((y) => y.field),
105
+ ]);
106
+ }
107
+ // Validate X and Y field types
108
+ if (!isQuantitativeType(xColumn.type)) {
109
+ throw new InvalidColumnTypeError(xColumn.name, 'quantitative');
110
+ }
111
+ const invalidYFields = yColumns.filter((y) => {
112
+ return y.column && !isNumericType(y.column.type);
113
+ });
114
+ if (invalidYFields.length > 0) {
115
+ throw new InvalidColumnTypeError(invalidYFields.map(({ field }) => field), 'numeric');
116
+ }
117
+ return {
118
+ xColumn,
119
+ yColumns,
120
+ xInterval,
121
+ };
122
+ }
91
123
  //# sourceMappingURL=spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/spec.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Spec} from '@uwdata/mosaic-spec';\nimport {LineChartSettings} from './schema';\nimport {ChartSpecError} from '../errors';\n\n// Chart color palette matching theme colors from tailwind-preset.css\nconst CHART_COLORS = [\n '#ea7c5c', // chart-1: hsl(12, 76%, 61%)\n '#2a9d8f', // chart-2: hsl(173, 58%, 39%)\n '#264653', // chart-3: hsl(197, 37%, 24%)\n '#e9c46a', // chart-4: hsl(43, 74%, 66%)\n '#f4a261', // chart-5: hsl(27, 87%, 67%)\n];\n\nfunction getLineColor(\n fieldConfig: {field: string; color?: string},\n index: number,\n): string {\n if (fieldConfig.color) {\n return fieldConfig.color;\n }\n // CHART_COLORS is non-empty, so this is always defined\n return CHART_COLORS[index % CHART_COLORS.length]!;\n}\n\nexport function createLineChartSpec(\n tableName: string,\n {x, yFields, xInterval}: LineChartSettings,\n): Spec {\n if (!x) {\n throw new ChartSpecError('X field is required for line chart');\n }\n if (!yFields || yFields.length === 0) {\n throw new ChartSpecError('At least one Y field is required for line chart');\n }\n\n const plotMarks: any[] = [];\n\n // When temporal aggregation is active, use SQL binning\n const dataSource = xInterval\n ? {\n from: tableName,\n filterBy: '$brush',\n }\n : {from: tableName, filterBy: '$brush'};\n\n // Generate lineY and text marks for each Y field\n yFields.forEach((fieldConfig, index) => {\n const color = getLineColor(fieldConfig, index);\n const aggregate = fieldConfig.aggregate || 'sum';\n\n // When temporal aggregation is active, use bin for X and aggregation for Y\n if (xInterval) {\n // Use bin syntax for temporal aggregation\n plotMarks.push({\n mark: 'lineY',\n data: dataSource,\n x: {bin: x, interval: xInterval},\n y: {[aggregate]: fieldConfig.field},\n stroke: color,\n });\n\n // Text label with aggregation info\n plotMarks.push({\n mark: 'text',\n data: dataSource,\n x: {bin: x, interval: xInterval},\n y: {[aggregate]: fieldConfig.field},\n text: [`${fieldConfig.field} (${aggregate})`],\n fill: color,\n dx: 5,\n dy: -5,\n });\n } else {\n // No aggregation - direct field references\n plotMarks.push({\n mark: 'lineY',\n data: dataSource,\n x,\n y: fieldConfig.field,\n stroke: color,\n });\n\n plotMarks.push({\n mark: 'text',\n data: dataSource,\n x,\n y: fieldConfig.field,\n text: [fieldConfig.field],\n fill: color,\n dx: 5,\n dy: -5,\n });\n }\n });\n\n // Add brush\n plotMarks.push({select: 'intervalX', as: '$brush'});\n\n return {\n plot: plotMarks,\n xLabel: x,\n yLabel: undefined,\n height: 250,\n width: 380,\n margins: {left: 50, right: 20, top: 20, bottom: 50},\n params: {brush: {select: 'crossfilter'}},\n } as Spec;\n}\n"]}
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/spec.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAoB,sBAAsB,EAAC,MAAM,eAAe,CAAC;AACxE,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,cAAc,GACf,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAC,4BAA4B,EAAC,MAAM,iCAAiC,CAAC;AAE7E,SAAS,cAAc,CACrB,OAAuD,EACvD,cAAuB;IAEvB,IAAI,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACxC,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAA6C;IAE7C,MAAM,EAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAC,GAAG,OAAO,CAAC;IAErD,MAAM,EAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAC,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAE1E,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD,MAAM,SAAS,GAAc,EAAE,CAAC;IAEhC,iDAAiD;IACjD,MAAM,UAAU,GAAG;QACjB,IAAI,EAAE,sBAAsB,CAAC,SAAS,CAAC;QACvC,QAAQ,EAAE,QAAQ;KACnB,CAAC;IAEF,wCAAwC;IACxC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,4BAA4B,CAAC;QAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;QAE7C,2EAA2E;QAC3E,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;YAC7B,0CAA0C;YAC1C,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,UAAU;gBAChB,CAAC,EAAE,EAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAC;gBAC3C,CAAC,EAAE,EAAC,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAC;gBACrC,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,UAAU;gBAChB,CAAC,EAAE,OAAO,CAAC,IAAI;gBACf,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;gBACtB,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC;IAE/C,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,OAAO,CAAC,IAAI;QACpB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE;YACP,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YACT,GAAG,EAAE,EAAE;YACP,MAAM,EAAE,EAAE;SACX;QACD,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACpC,cAAc,CACZ,EAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAC,EAC1D,OAAO,CAAC,WAAW,IAAI,SAAS,CAAC,CAClC,CACF;QACD,UAAU,EAAE,QAAQ,CAAC,GAAG,CACtB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,4BAA4B,CAC3D;KACF,CAAC;IAEF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,GAAG,QAAQ;YACX,MAAM,EAAE,EAAC,KAAK,EAAE,EAAC,MAAM,EAAE,aAAa,EAAC,EAAC;SACjC,CAAC;IACZ,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP,QAAQ;YACR;gBACE,MAAM,EAAE,OAAO;gBACf,GAAG,EAAE,WAAW;gBAChB,OAAO,EAAE,QAAQ,CAAC,MAAM;aACzB;SACF;QACD,MAAM,EAAE,EAAC,KAAK,EAAE,EAAC,MAAM,EAAE,aAAa,EAAC,EAAC;KACjC,CAAC;AACZ,CAAC;AAaD,SAAS,yBAAyB,CAAC,EACjC,SAAS,EACT,QAAQ,EAAE,EAAC,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,SAAS,EAAC,GACD;IACrC,uCAAuC;IACvC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,mBAAmB,CAAC;YAC5B,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACxB,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC;QAC7D,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC,CAAC;IAEJ,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE1D,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,mBAAmB,CAAC;YAC5B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC9B,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3C,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,sBAAsB,CAC9B,cAAc,CAAC,GAAG,CAAC,CAAC,EAAC,KAAK,EAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EACtC,SAAS,CACV,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO;QACP,QAAQ;QACR,SAAS;KACoB,CAAC;AAClC,CAAC","sourcesContent":["import type {Spec} from '@uwdata/mosaic-spec';\nimport {LineChartSettings} from './schema';\nimport {\n InvalidColumnTypeError,\n MissingColumnsError,\n RequiredFieldsError,\n} from '../errors';\nimport {CreateSpecOptions, getChartTableReference} from '../base-types';\nimport {\n isNumericType,\n isQuantitativeType,\n isTemporalType,\n} from '../../../column-types-utils';\nimport {TableColumn} from '@sqlrooms/db';\nimport {AggregateFunction, TemporalInterval} from '../../../schemas';\nimport {DEFAULT_CHART_FALLBACK_COLOR} from '../../../constants/chart-colors';\n\nfunction getLegendLabel(\n yColumn: {field: string; aggregate?: AggregateFunction},\n hasAggregation: boolean,\n): string {\n if (hasAggregation && yColumn.aggregate) {\n return `${yColumn.field} (${yColumn.aggregate.toUpperCase()})`;\n }\n return yColumn.field;\n}\n\nexport function createLineChartSpec(\n options: CreateSpecOptions<LineChartSettings>,\n): Spec {\n const {dataTable, selectionName, settings} = options;\n\n const {xColumn, yColumns, xInterval} = validateLineChartSettings(options);\n\n const isXTemporal = isTemporalType(xColumn.type);\n\n const plotMarks: unknown[] = [];\n\n // Data source always includes filterBy for brush\n const dataSource = {\n from: getChartTableReference(dataTable),\n filterBy: '$brush',\n };\n\n // Generate lineY marks for each Y field\n yColumns.forEach((yColumn) => {\n const color = yColumn.color ?? DEFAULT_CHART_FALLBACK_COLOR;\n const aggregate = yColumn.aggregate ?? 'sum';\n\n // When temporal aggregation is active, use bin for X and aggregation for Y\n if (isXTemporal && xInterval) {\n // Use bin syntax for temporal aggregation\n plotMarks.push({\n mark: 'lineY',\n data: dataSource,\n x: {bin: xColumn.name, interval: xInterval},\n y: {[aggregate]: yColumn.column.name},\n stroke: color,\n });\n } else {\n // No aggregation - direct field references\n plotMarks.push({\n mark: 'lineY',\n data: dataSource,\n x: xColumn.name,\n y: yColumn.column.name,\n stroke: color,\n });\n }\n });\n\n // Add brush control only if selectionName is provided\n if (selectionName) {\n plotMarks.push({select: 'intervalX', as: '$brush'});\n }\n\n const showLegend = settings.showLegend ?? true;\n\n const plotSpec = {\n plot: plotMarks,\n name: 'lineChart',\n xLabel: xColumn.name,\n yLabel: undefined,\n margins: {\n left: 50,\n right: 20,\n top: 20,\n bottom: 50,\n },\n colorDomain: yColumns.map((yColumn) =>\n getLegendLabel(\n {field: yColumn.column.name, aggregate: yColumn.aggregate},\n Boolean(isXTemporal && xInterval),\n ),\n ),\n colorRange: yColumns.map(\n (yColumn) => yColumn.color ?? DEFAULT_CHART_FALLBACK_COLOR,\n ),\n };\n\n if (!showLegend) {\n return {\n ...plotSpec,\n params: {brush: {select: 'crossfilter'}},\n } as Spec;\n }\n\n return {\n vconcat: [\n plotSpec,\n {\n legend: 'color',\n for: 'lineChart',\n columns: yColumns.length,\n },\n ],\n params: {brush: {select: 'crossfilter'}},\n } as Spec;\n}\n\ntype ValidatedLineChartSettings = {\n xColumn: TableColumn;\n yColumns: {\n field: string;\n column: TableColumn;\n aggregate?: AggregateFunction;\n color?: string;\n }[];\n xInterval?: TemporalInterval;\n};\n\nfunction validateLineChartSettings({\n dataTable,\n settings: {x, yFields = [], xInterval},\n}: CreateSpecOptions<LineChartSettings>): ValidatedLineChartSettings {\n // Basic validation for required fields\n if (!x || yFields.length === 0) {\n throw new RequiredFieldsError([\n ...(x ? [] : ['X-axis']),\n ...(yFields.length > 0 ? [] : ['Y-axis']),\n ]);\n }\n\n // Validate X and Y field existence\n const xColumn = dataTable.columns.find((col) => col.name === x);\n const yColumns = yFields.map((y) => ({\n field: y.field,\n column: dataTable.columns.find((col) => col.name === y.field),\n aggregate: y.aggregate,\n color: y.color,\n }));\n\n const missingYColumns = yColumns.filter((y) => !y.column);\n\n if (!xColumn || missingYColumns.length > 0) {\n throw new MissingColumnsError([\n ...(xColumn ? [] : ['X-axis']),\n ...missingYColumns.map((y) => y.field),\n ]);\n }\n\n // Validate X and Y field types\n if (!isQuantitativeType(xColumn.type)) {\n throw new InvalidColumnTypeError(xColumn.name, 'quantitative');\n }\n\n const invalidYFields = yColumns.filter((y) => {\n return y.column && !isNumericType(y.column.type);\n });\n\n if (invalidYFields.length > 0) {\n throw new InvalidColumnTypeError(\n invalidYFields.map(({field}) => field),\n 'numeric',\n );\n }\n\n return {\n xColumn,\n yColumns,\n xInterval,\n } as ValidatedLineChartSettings;\n}\n"]}
@@ -28,6 +28,7 @@ export declare const LineChartToolParameters: z.ZodObject<{
28
28
  avg: "avg";
29
29
  }>>>;
30
30
  }, z.core.$strip>>>>;
31
+ showLegend: z.ZodNonOptional<z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
31
32
  }, z.core.$strip>;
32
33
  }, z.core.$strip>;
33
34
  export type LineChartToolParams = z.infer<typeof LineChartToolParameters>;
@@ -42,6 +43,7 @@ export declare function createLineChartAiTool(deps: DashboardToolDeps): import("
42
43
  aggregate: "sum" | "max" | "min" | "avg";
43
44
  color?: string | undefined;
44
45
  }[];
46
+ showLegend: boolean;
45
47
  };
46
48
  artifactId?: string | undefined;
47
49
  tableName?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAItB,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAYrD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAElC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE1E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkF5D"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAItB,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAYrD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAElC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE1E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkF5D"}
@@ -28,7 +28,7 @@ NOTE: Line charts with aggregation (xInterval or aggregate functions) handle lar
28
28
 
29
29
  To UPDATE an existing line chart: provide the panelId parameter. Otherwise creates new panel.
30
30
 
31
- Do NOT use for: single point distributions (use histogram), categorical counts (use count-plot), two-variable correlations (use bubble-chart).`,
31
+ Do NOT use for: single point distributions (use histogram), categorical counts (use count-plot), two-variable correlations (use scatter-plot).`,
32
32
  inputSchema: LineChartToolParameters,
33
33
  execute: async (params, context) => {
34
34
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import {tool} from 'ai';\nimport {z} from 'zod';\nimport {LineChartSettings} from './schema';\nimport {AggregateFunction, TemporalInterval} from '../../../schemas';\nimport {BaseChartToolParameters} from '../../../ai/tool-schemas';\nimport type {DashboardToolDeps} from '../base-types';\nimport {validateColumnExists} from '../../../ai/tool-validation';\nimport {\n NUMERIC_COLUMN_TYPES,\n QUANTITATIVE_COLUMN_TYPES,\n TEMPORAL_COLUMN_TYPES,\n} from '../../../column-types-utils';\nimport {createOrUpdateChartPanel} from '../../../ai/tool-helpers';\n\nconst AGGREGATE_FUNCTIONS = AggregateFunction.options;\nconst TEMPORAL_INTERVALS = TemporalInterval.options;\n\nexport const LineChartToolParameters = BaseChartToolParameters.extend({\n settings: LineChartSettings.required(),\n});\n\nexport type LineChartToolParams = z.infer<typeof LineChartToolParameters>;\n\nexport function createLineChartAiTool(deps: DashboardToolDeps) {\n return tool({\n description: `Line chart: shows trends and changes over time or ordered continuous variable. Connects data points to show progression.\n\nUse when: user asks about \"trend\", \"over time\", \"changes in\", \"time series\", \"progression of\", \"track X over Y\".\nExample queries: \"population growth over time\", \"temperature trend by month\", \"show land development over years\", \"elevation changes along route\", \"average precipitation by season\".\n\nRequired:\n- x: quantitative column (${QUANTITATIVE_COLUMN_TYPES.join(', ')})\n- yFields: array of {field: string (numeric: ${NUMERIC_COLUMN_TYPES.join(', ')}), aggregate?: ${AGGREGATE_FUNCTIONS.join('|')}}\n\nOptional: xInterval for temporal grouping (${TEMPORAL_INTERVALS.join(', ')}) when x is temporal (${TEMPORAL_COLUMN_TYPES.join(', ')}).\nMultiple yFields create multi-line chart for comparing metrics.\n\nNOTE: Line charts with aggregation (xInterval or aggregate functions) handle large datasets well. Without aggregation, line charts plot individual points and should not be used for tables with more than ${deps.maxDataPoints.toLocaleString()} rows - use aggregated visualizations instead.\n\nTo UPDATE an existing line chart: provide the panelId parameter. Otherwise creates new panel.\n\nDo NOT use for: single point distributions (use histogram), categorical counts (use count-plot), two-variable correlations (use bubble-chart).`,\n inputSchema: LineChartToolParameters,\n execute: async (params, context) => {\n try {\n const artifactId = deps.resolveArtifact(\n params.artifactId,\n params.createArtifactIfMissing,\n context,\n );\n const {tableName, columns} = deps.resolveTable(\n artifactId,\n params.tableName,\n );\n\n // Validate settings\n validateColumnExists(\n params.settings.x,\n QUANTITATIVE_COLUMN_TYPES,\n columns,\n 'x',\n );\n\n for (const yField of params.settings.yFields) {\n validateColumnExists(\n yField.field,\n NUMERIC_COLUMN_TYPES,\n columns,\n 'yFields',\n );\n }\n\n const result = createOrUpdateChartPanel(deps, {\n panelId: params.panelId,\n dashboardId: artifactId,\n tableName,\n title: params.settings.x\n ? `Line chart - ${params.settings.yFields?.map((f) => f.field).join(', ') || ''} over ${params.settings.x}`\n : 'Line chart',\n config: {\n chartType: 'line-chart',\n settings: params.settings,\n },\n });\n\n return {\n llmResult: {\n success: true,\n details: params.panelId\n ? `Updated line chart \"${result.title}\".`\n : `Created line chart \"${result.title}\".`,\n data: result,\n },\n };\n } catch (error) {\n return {\n llmResult: {\n success: false,\n errorMessage:\n error instanceof Error ? error.message : String(error),\n },\n };\n }\n },\n });\n}\n"]}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import {tool} from 'ai';\nimport {z} from 'zod';\nimport {LineChartSettings} from './schema';\nimport {AggregateFunction, TemporalInterval} from '../../../schemas';\nimport {BaseChartToolParameters} from '../../../ai/tool-schemas';\nimport type {DashboardToolDeps} from '../base-types';\nimport {validateColumnExists} from '../../../ai/tool-validation';\nimport {\n NUMERIC_COLUMN_TYPES,\n QUANTITATIVE_COLUMN_TYPES,\n TEMPORAL_COLUMN_TYPES,\n} from '../../../column-types-utils';\nimport {createOrUpdateChartPanel} from '../../../ai/tool-helpers';\n\nconst AGGREGATE_FUNCTIONS = AggregateFunction.options;\nconst TEMPORAL_INTERVALS = TemporalInterval.options;\n\nexport const LineChartToolParameters = BaseChartToolParameters.extend({\n settings: LineChartSettings.required(),\n});\n\nexport type LineChartToolParams = z.infer<typeof LineChartToolParameters>;\n\nexport function createLineChartAiTool(deps: DashboardToolDeps) {\n return tool({\n description: `Line chart: shows trends and changes over time or ordered continuous variable. Connects data points to show progression.\n\nUse when: user asks about \"trend\", \"over time\", \"changes in\", \"time series\", \"progression of\", \"track X over Y\".\nExample queries: \"population growth over time\", \"temperature trend by month\", \"show land development over years\", \"elevation changes along route\", \"average precipitation by season\".\n\nRequired:\n- x: quantitative column (${QUANTITATIVE_COLUMN_TYPES.join(', ')})\n- yFields: array of {field: string (numeric: ${NUMERIC_COLUMN_TYPES.join(', ')}), aggregate?: ${AGGREGATE_FUNCTIONS.join('|')}}\n\nOptional: xInterval for temporal grouping (${TEMPORAL_INTERVALS.join(', ')}) when x is temporal (${TEMPORAL_COLUMN_TYPES.join(', ')}).\nMultiple yFields create multi-line chart for comparing metrics.\n\nNOTE: Line charts with aggregation (xInterval or aggregate functions) handle large datasets well. Without aggregation, line charts plot individual points and should not be used for tables with more than ${deps.maxDataPoints.toLocaleString()} rows - use aggregated visualizations instead.\n\nTo UPDATE an existing line chart: provide the panelId parameter. Otherwise creates new panel.\n\nDo NOT use for: single point distributions (use histogram), categorical counts (use count-plot), two-variable correlations (use scatter-plot).`,\n inputSchema: LineChartToolParameters,\n execute: async (params, context) => {\n try {\n const artifactId = deps.resolveArtifact(\n params.artifactId,\n params.createArtifactIfMissing,\n context,\n );\n const {tableName, columns} = deps.resolveTable(\n artifactId,\n params.tableName,\n );\n\n // Validate settings\n validateColumnExists(\n params.settings.x,\n QUANTITATIVE_COLUMN_TYPES,\n columns,\n 'x',\n );\n\n for (const yField of params.settings.yFields) {\n validateColumnExists(\n yField.field,\n NUMERIC_COLUMN_TYPES,\n columns,\n 'yFields',\n );\n }\n\n const result = createOrUpdateChartPanel(deps, {\n panelId: params.panelId,\n dashboardId: artifactId,\n tableName,\n title: params.settings.x\n ? `Line chart - ${params.settings.yFields?.map((f) => f.field).join(', ') || ''} over ${params.settings.x}`\n : 'Line chart',\n config: {\n chartType: 'line-chart',\n settings: params.settings,\n },\n });\n\n return {\n llmResult: {\n success: true,\n details: params.panelId\n ? `Updated line chart \"${result.title}\".`\n : `Created line chart \"${result.title}\".`,\n data: result,\n },\n };\n } catch (error) {\n return {\n llmResult: {\n success: false,\n errorMessage:\n error instanceof Error ? error.message : String(error),\n },\n };\n }\n },\n });\n}\n"]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Find the first unused color from the palette.
3
+ * Scans the used colors and returns the first palette color not in the set.
4
+ * If all colors are used, returns the first color.
5
+ */
6
+ export declare function getUnusedColor(colors: readonly string[], usedColors: string[]): string;
7
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,UAAU,EAAE,MAAM,EAAE,GACnB,MAAM,CAYR"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Find the first unused color from the palette.
3
+ * Scans the used colors and returns the first palette color not in the set.
4
+ * If all colors are used, returns the first color.
5
+ */
6
+ export function getUnusedColor(colors, usedColors) {
7
+ const usedSet = new Set(usedColors);
8
+ // Find first unused color
9
+ for (const color of colors) {
10
+ if (!usedSet.has(color)) {
11
+ return color;
12
+ }
13
+ }
14
+ // All colors used, fallback to first color
15
+ return colors[0];
16
+ }
17
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/charts/chart-types/line-chart/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAyB,EACzB,UAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAEpC,0BAA0B;IAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,OAAO,MAAM,CAAC,CAAC,CAAE,CAAC;AACpB,CAAC","sourcesContent":["/**\n * Find the first unused color from the palette.\n * Scans the used colors and returns the first palette color not in the set.\n * If all colors are used, returns the first color.\n */\nexport function getUnusedColor(\n colors: readonly string[],\n usedColors: string[],\n): string {\n const usedSet = new Set(usedColors);\n\n // Find first unused color\n for (const color of colors) {\n if (!usedSet.has(color)) {\n return color;\n }\n }\n\n // All colors used, fallback to first color\n return colors[0]!;\n}\n"]}
@@ -7,6 +7,7 @@ export declare const mosaicChartTypes: {
7
7
  settings: {
8
8
  field?: string | undefined;
9
9
  maxBins?: number | undefined;
10
+ color?: string | undefined;
10
11
  };
11
12
  settingsOpen?: boolean | undefined;
12
13
  dataPolicy?: {
@@ -30,6 +31,7 @@ export declare const mosaicChartTypes: {
30
31
  readonly lineChart: import("./base-types").SpecChartTypeDefinition<{
31
32
  chartType: "line-chart";
32
33
  settings: {
34
+ showLegend: boolean;
33
35
  x?: string | undefined;
34
36
  xInterval?: "second" | "minute" | "hour" | "day" | "week" | "month" | "quarter" | "year" | undefined;
35
37
  yFields?: {
@@ -71,8 +73,8 @@ export declare const mosaicChartTypes: {
71
73
  reason?: string | undefined;
72
74
  } | undefined;
73
75
  }>;
74
- readonly bubbleChart: import("./base-types").SpecChartTypeDefinition<{
75
- chartType: "bubble-chart";
76
+ readonly scatterPlot: import("./base-types").SpecChartTypeDefinition<{
77
+ chartType: "scatter-plot";
76
78
  settings: {
77
79
  x?: string | undefined;
78
80
  y?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"mosaicChartTypes.d.ts","sourceRoot":"","sources":["../../../src/charts/chart-types/mosaicChartTypes.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQnB,CAAC"}
1
+ {"version":3,"file":"mosaicChartTypes.d.ts","sourceRoot":"","sources":["../../../src/charts/chart-types/mosaicChartTypes.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQnB,CAAC"}
@@ -3,7 +3,7 @@ import { lineChartChartType } from './line-chart/definition';
3
3
  import { countPlotChartType } from './count-plot/definition';
4
4
  import { heatmapChartType } from './heatmap/definition';
5
5
  import { boxPlotChartType } from './box-plot/definition';
6
- import { bubbleChartChartType } from './bubble-chart/definition';
6
+ import { scatterPlotChartType } from './scatter-plot/definition';
7
7
  import { customSpecChartType } from './custom-spec/definition';
8
8
  /**
9
9
  * Legacy compatibility exports for all available chart types.
@@ -14,7 +14,7 @@ export const mosaicChartTypes = {
14
14
  lineChart: lineChartChartType,
15
15
  heatmap: heatmapChartType,
16
16
  boxPlot: boxPlotChartType,
17
- bubbleChart: bubbleChartChartType,
17
+ scatterPlot: scatterPlotChartType,
18
18
  customSpec: customSpecChartType,
19
19
  };
20
20
  //# sourceMappingURL=mosaicChartTypes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mosaicChartTypes.js","sourceRoot":"","sources":["../../../src/charts/chart-types/mosaicChartTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,kBAAkB;IAC7B,OAAO,EAAE,gBAAgB;IACzB,OAAO,EAAE,gBAAgB;IACzB,WAAW,EAAE,oBAAoB;IACjC,UAAU,EAAE,mBAAmB;CACvB,CAAC","sourcesContent":["import {histogramChartType} from './histogram/definition';\nimport {lineChartChartType} from './line-chart/definition';\nimport {countPlotChartType} from './count-plot/definition';\nimport {heatmapChartType} from './heatmap/definition';\nimport {boxPlotChartType} from './box-plot/definition';\nimport {bubbleChartChartType} from './bubble-chart/definition';\nimport {customSpecChartType} from './custom-spec/definition';\n\n/**\n * Legacy compatibility exports for all available chart types.\n */\nexport const mosaicChartTypes = {\n histogram: histogramChartType,\n countPlot: countPlotChartType,\n lineChart: lineChartChartType,\n heatmap: heatmapChartType,\n boxPlot: boxPlotChartType,\n bubbleChart: bubbleChartChartType,\n customSpec: customSpecChartType,\n} as const;\n"]}
1
+ {"version":3,"file":"mosaicChartTypes.js","sourceRoot":"","sources":["../../../src/charts/chart-types/mosaicChartTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,kBAAkB;IAC7B,OAAO,EAAE,gBAAgB;IACzB,OAAO,EAAE,gBAAgB;IACzB,WAAW,EAAE,oBAAoB;IACjC,UAAU,EAAE,mBAAmB;CACvB,CAAC","sourcesContent":["import {histogramChartType} from './histogram/definition';\nimport {lineChartChartType} from './line-chart/definition';\nimport {countPlotChartType} from './count-plot/definition';\nimport {heatmapChartType} from './heatmap/definition';\nimport {boxPlotChartType} from './box-plot/definition';\nimport {scatterPlotChartType} from './scatter-plot/definition';\nimport {customSpecChartType} from './custom-spec/definition';\n\n/**\n * Legacy compatibility exports for all available chart types.\n */\nexport const mosaicChartTypes = {\n histogram: histogramChartType,\n countPlot: countPlotChartType,\n lineChart: lineChartChartType,\n heatmap: heatmapChartType,\n boxPlot: boxPlotChartType,\n scatterPlot: scatterPlotChartType,\n customSpec: customSpecChartType,\n} as const;\n"]}
@@ -0,0 +1,3 @@
1
+ import { type FC } from 'react';
2
+ export declare const ScatterPlotSettingsComponent: FC;
3
+ //# sourceMappingURL=ScatterPlotSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScatterPlotSettings.d.ts","sourceRoot":"","sources":["../../../../src/charts/chart-types/scatter-plot/ScatterPlotSettings.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,EAAC,MAAM,OAAO,CAAC;AAK9B,eAAO,MAAM,4BAA4B,EAAE,EA6B1C,CAAC"}
@@ -2,8 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Field } from '../../../components/Field';
3
3
  import { ColumnSelector } from '../../../components/ColumnSelector';
4
4
  import { useMosaicChartSettingsContext } from '../../chart-settings/MosaicChartSettingsContext';
5
- export const BubbleChartSettingsComponent = () => {
6
- const { onChangeConfig, config } = useMosaicChartSettingsContext('bubble-chart');
7
- return (_jsxs("div", { className: "space-y-4", children: [_jsx(Field, { label: "X Field", required: true, children: _jsx(ColumnSelector.Numeric, { value: config.settings.x, onChange: (x) => onChangeConfig('x', x) }) }), _jsx(Field, { label: "Y Field", required: true, children: _jsx(ColumnSelector.Numeric, { value: config.settings.y, onChange: (y) => onChangeConfig('y', y) }) })] }));
5
+ export const ScatterPlotSettingsComponent = () => {
6
+ const { onChangeConfig, config } = useMosaicChartSettingsContext('scatter-plot');
7
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(Field, { label: "X Field", required: true, children: _jsx(ColumnSelector.Numeric, { value: config.settings.x, onChange: (x) => onChangeConfig('x', x) }) }), _jsx(Field, { label: "Y Field", required: true, children: _jsx(ColumnSelector.Numeric, { value: config.settings.y, onChange: (y) => onChangeConfig('y', y) }) }), _jsx(Field, { label: "Size Field", children: _jsx(ColumnSelector.Numeric, { value: config.settings.size, onChange: (size) => onChangeConfig('size', size), placeholder: "(optional)" }) })] }));
8
8
  };
9
- //# sourceMappingURL=BubbleChartSettings.js.map
9
+ //# sourceMappingURL=ScatterPlotSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScatterPlotSettings.js","sourceRoot":"","sources":["../../../../src/charts/chart-types/scatter-plot/ScatterPlotSettings.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,KAAK,EAAC,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAC,cAAc,EAAC,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAC,6BAA6B,EAAC,MAAM,iDAAiD,CAAC;AAE9F,MAAM,CAAC,MAAM,4BAA4B,GAAO,GAAG,EAAE;IACnD,MAAM,EAAC,cAAc,EAAE,MAAM,EAAC,GAC5B,6BAA6B,CAAC,cAAc,CAAC,CAAC;IAEhD,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,KAAK,IAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,kBAC7B,KAAC,cAAc,CAAC,OAAO,IACrB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,GACvC,GACI,EAER,KAAC,KAAK,IAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,kBAC7B,KAAC,cAAc,CAAC,OAAO,IACrB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,GACvC,GACI,EAER,KAAC,KAAK,IAAC,KAAK,EAAC,YAAY,YACvB,KAAC,cAAc,CAAC,OAAO,IACrB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,EAChD,WAAW,EAAC,YAAY,GACxB,GACI,IACJ,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {type FC} from 'react';\nimport {Field} from '../../../components/Field';\nimport {ColumnSelector} from '../../../components/ColumnSelector';\nimport {useMosaicChartSettingsContext} from '../../chart-settings/MosaicChartSettingsContext';\n\nexport const ScatterPlotSettingsComponent: FC = () => {\n const {onChangeConfig, config} =\n useMosaicChartSettingsContext('scatter-plot');\n\n return (\n <div className=\"space-y-4\">\n <Field label=\"X Field\" required>\n <ColumnSelector.Numeric\n value={config.settings.x}\n onChange={(x) => onChangeConfig('x', x)}\n />\n </Field>\n\n <Field label=\"Y Field\" required>\n <ColumnSelector.Numeric\n value={config.settings.y}\n onChange={(y) => onChangeConfig('y', y)}\n />\n </Field>\n\n <Field label=\"Size Field\">\n <ColumnSelector.Numeric\n value={config.settings.size}\n onChange={(size) => onChangeConfig('size', size)}\n placeholder=\"(optional)\"\n />\n </Field>\n </div>\n );\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import type { SpecChartTypeDefinition } from '../base-types';
2
+ import { ScatterPlotChartConfig } from './schema';
3
+ export declare const scatterPlotChartType: SpecChartTypeDefinition<ScatterPlotChartConfig>;
4
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../../../src/charts/chart-types/scatter-plot/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAC,sBAAsB,EAA2B,MAAM,UAAU,CAAC;AAU1E,eAAO,MAAM,oBAAoB,EAAE,uBAAuB,CAAC,sBAAsB,CAgB9E,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { ScatterPlotChartSettings } from './schema';
2
+ import { titleFromDescription } from '../../../chart-builders/chartTypeUtils';
3
+ import { ScatterPlotSettingsComponent } from './ScatterPlotSettings';
4
+ import { createScatterPlotAiTool } from './tool';
5
+ import { Workflow } from 'lucide-react';
6
+ import { createScatterPlotSpec } from './spec';
7
+ import { DEFAULT_CHART_MAX_DATA_POINTS } from '../../../chart-runtime';
8
+ const DESCRIPTION = 'Create a scatter plot chart';
9
+ export const scatterPlotChartType = {
10
+ id: 'scatter-plot',
11
+ label: 'Scatter Plot',
12
+ description: DESCRIPTION,
13
+ icon: Workflow,
14
+ schema: ScatterPlotChartSettings,
15
+ settingsComponent: ScatterPlotSettingsComponent,
16
+ buildTitle: titleFromDescription(DESCRIPTION),
17
+ createTool: createScatterPlotAiTool,
18
+ getDataPolicy: () => ({
19
+ maxRows: DEFAULT_CHART_MAX_DATA_POINTS,
20
+ reason: 'Scatter charts render one point per row. Use a heatmap or another aggregated chart for larger datasets.',
21
+ }),
22
+ createSpec: createScatterPlotSpec,
23
+ };
24
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../../src/charts/chart-types/scatter-plot/definition.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,wBAAwB,EAAC,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAC,4BAA4B,EAAC,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAC,uBAAuB,EAAC,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAC;AACtC,OAAO,EAAC,qBAAqB,EAAC,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAC,6BAA6B,EAAC,MAAM,wBAAwB,CAAC;AAErE,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAElD,MAAM,CAAC,MAAM,oBAAoB,GAC/B;IACE,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,WAAW;IACxB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,wBAAwB;IAChC,iBAAiB,EAAE,4BAA4B;IAC/C,UAAU,EAAE,oBAAoB,CAAC,WAAW,CAAC;IAC7C,UAAU,EAAE,uBAAuB;IACnC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;QACpB,OAAO,EAAE,6BAA6B;QACtC,MAAM,EACJ,yGAAyG;KAC5G,CAAC;IACF,UAAU,EAAE,qBAAqB;CAClC,CAAC","sourcesContent":["import type {SpecChartTypeDefinition} from '../base-types';\nimport {ScatterPlotChartConfig, ScatterPlotChartSettings} from './schema';\nimport {titleFromDescription} from '../../../chart-builders/chartTypeUtils';\nimport {ScatterPlotSettingsComponent} from './ScatterPlotSettings';\nimport {createScatterPlotAiTool} from './tool';\nimport {Workflow} from 'lucide-react';\nimport {createScatterPlotSpec} from './spec';\nimport {DEFAULT_CHART_MAX_DATA_POINTS} from '../../../chart-runtime';\n\nconst DESCRIPTION = 'Create a scatter plot chart';\n\nexport const scatterPlotChartType: SpecChartTypeDefinition<ScatterPlotChartConfig> =\n {\n id: 'scatter-plot',\n label: 'Scatter Plot',\n description: DESCRIPTION,\n icon: Workflow,\n schema: ScatterPlotChartSettings,\n settingsComponent: ScatterPlotSettingsComponent,\n buildTitle: titleFromDescription(DESCRIPTION),\n createTool: createScatterPlotAiTool,\n getDataPolicy: () => ({\n maxRows: DEFAULT_CHART_MAX_DATA_POINTS,\n reason:\n 'Scatter charts render one point per row. Use a heatmap or another aggregated chart for larger datasets.',\n }),\n createSpec: createScatterPlotSpec,\n };\n"]}
@@ -1,12 +1,12 @@
1
1
  import { z } from 'zod';
2
- export declare const BubbleChartSettings: z.ZodObject<{
2
+ export declare const ScatterPlotChartSettings: z.ZodObject<{
3
3
  x: z.ZodOptional<z.ZodString>;
4
4
  y: z.ZodOptional<z.ZodString>;
5
5
  size: z.ZodOptional<z.ZodString>;
6
6
  }, z.core.$strip>;
7
- export type BubbleChartSettings = z.infer<typeof BubbleChartSettings>;
8
- export declare const BubbleChartConfig: z.ZodObject<{
9
- chartType: z.ZodLiteral<"bubble-chart">;
7
+ export type ScatterPlotChartSettings = z.infer<typeof ScatterPlotChartSettings>;
8
+ export declare const ScatterPlotChartConfig: z.ZodObject<{
9
+ chartType: z.ZodLiteral<"scatter-plot">;
10
10
  settings: z.ZodObject<{
11
11
  x: z.ZodOptional<z.ZodString>;
12
12
  y: z.ZodOptional<z.ZodString>;
@@ -19,5 +19,5 @@ export declare const BubbleChartConfig: z.ZodObject<{
19
19
  reason: z.ZodOptional<z.ZodString>;
20
20
  }, z.core.$strip>>;
21
21
  }, z.core.$strip>;
22
- export type BubbleChartConfig = z.infer<typeof BubbleChartConfig>;
22
+ export type ScatterPlotChartConfig = z.infer<typeof ScatterPlotChartConfig>;
23
23
  //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/charts/chart-types/scatter-plot/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,wBAAwB;;;;iBAOnC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;iBAKjC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -1,16 +1,16 @@
1
1
  import { z } from 'zod';
2
2
  import { ChartDataPolicyOverrideConfig } from '../data-policy-schema';
3
- export const BubbleChartSettings = z.object({
3
+ export const ScatterPlotChartSettings = z.object({
4
4
  x: z.string().optional().describe('Numeric column for X axis position'),
5
5
  y: z.string().optional().describe('Numeric column for Y axis position'),
6
6
  size: z
7
7
  .string()
8
8
  .optional()
9
- .describe('Numeric column for bubble size (optional)'),
9
+ .describe('Numeric column for point size (optional)'),
10
10
  });
11
- export const BubbleChartConfig = z.object({
12
- chartType: z.literal('bubble-chart'),
13
- settings: BubbleChartSettings,
11
+ export const ScatterPlotChartConfig = z.object({
12
+ chartType: z.literal('scatter-plot'),
13
+ settings: ScatterPlotChartSettings,
14
14
  settingsOpen: z.boolean().optional(),
15
15
  dataPolicy: ChartDataPolicyOverrideConfig.optional(),
16
16
  });