@sqlrooms/mosaic 0.29.0-rc.3 → 0.29.0-rc.4
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.
- package/README.md +90 -1
- package/dist/MosaicChartBuilder.d.ts +0 -4
- package/dist/MosaicChartBuilder.d.ts.map +1 -1
- package/dist/MosaicChartBuilder.js +0 -6
- package/dist/MosaicChartBuilder.js.map +1 -1
- package/dist/MosaicSlice.d.ts +17 -10
- package/dist/MosaicSlice.d.ts.map +1 -1
- package/dist/MosaicSlice.js +4 -1
- package/dist/MosaicSlice.js.map +1 -1
- package/dist/boxplot/BoxPlotClient.d.ts +58 -0
- package/dist/boxplot/BoxPlotClient.d.ts.map +1 -0
- package/dist/boxplot/BoxPlotClient.js +264 -0
- package/dist/boxplot/BoxPlotClient.js.map +1 -0
- package/dist/chart/MosaicDashboardChart.d.ts +14 -0
- package/dist/chart/MosaicDashboardChart.d.ts.map +1 -0
- package/dist/chart/MosaicDashboardChart.js +21 -0
- package/dist/chart/MosaicDashboardChart.js.map +1 -0
- package/dist/chart/MosaicDashboardChartContent.d.ts +16 -0
- package/dist/chart/MosaicDashboardChartContent.d.ts.map +1 -0
- package/dist/chart/MosaicDashboardChartContent.js +18 -0
- package/dist/chart/MosaicDashboardChartContent.js.map +1 -0
- package/dist/chart/MosaicDashboardChartHeaderActions.d.ts +4 -0
- package/dist/chart/MosaicDashboardChartHeaderActions.d.ts.map +1 -0
- package/dist/chart/MosaicDashboardChartHeaderActions.js +16 -0
- package/dist/chart/MosaicDashboardChartHeaderActions.js.map +1 -0
- package/dist/chart/MosaicDashboardChartRenderer.d.ts +3 -0
- package/dist/chart/MosaicDashboardChartRenderer.d.ts.map +1 -0
- package/dist/chart/MosaicDashboardChartRenderer.js +31 -0
- package/dist/chart/MosaicDashboardChartRenderer.js.map +1 -0
- package/dist/chart/MosaicDashboardComponentChart.d.ts +14 -0
- package/dist/chart/MosaicDashboardComponentChart.d.ts.map +1 -0
- package/dist/chart/MosaicDashboardComponentChart.js +11 -0
- package/dist/chart/MosaicDashboardComponentChart.js.map +1 -0
- package/dist/chart/MosaicDashboardVgPlotChart.d.ts +10 -0
- package/dist/chart/MosaicDashboardVgPlotChart.d.ts.map +1 -0
- package/dist/chart/MosaicDashboardVgPlotChart.js +10 -0
- package/dist/chart/MosaicDashboardVgPlotChart.js.map +1 -0
- package/dist/chart/MosaicDashboardVgPlotError.d.ts +8 -0
- package/dist/chart/MosaicDashboardVgPlotError.d.ts.map +1 -0
- package/dist/chart/MosaicDashboardVgPlotError.js +11 -0
- package/dist/chart/MosaicDashboardVgPlotError.js.map +1 -0
- package/dist/{dashboard → chart}/chart-settings/ChartSettings.d.ts +12 -7
- package/dist/chart/chart-settings/ChartSettings.d.ts.map +1 -0
- package/dist/chart/chart-settings/ChartSettings.js +71 -0
- package/dist/chart/chart-settings/ChartSettings.js.map +1 -0
- package/dist/chart/chart-settings/ChartSettingsContent.d.ts +13 -0
- package/dist/chart/chart-settings/ChartSettingsContent.d.ts.map +1 -0
- package/dist/chart/chart-settings/ChartSettingsContent.js +18 -0
- package/dist/chart/chart-settings/ChartSettingsContent.js.map +1 -0
- package/dist/chart/chart-settings/ChartSettingsContext.d.ts +27 -0
- package/dist/chart/chart-settings/ChartSettingsContext.d.ts.map +1 -0
- package/dist/chart/chart-settings/ChartSettingsContext.js +35 -0
- package/dist/chart/chart-settings/ChartSettingsContext.js.map +1 -0
- package/dist/chart/chart-settings/ChartSettingsPanel.d.ts +14 -0
- package/dist/chart/chart-settings/ChartSettingsPanel.d.ts.map +1 -0
- package/dist/chart/chart-settings/ChartSettingsPanel.js +17 -0
- package/dist/chart/chart-settings/ChartSettingsPanel.js.map +1 -0
- package/dist/chart/chart-settings/ChartSpecViewerPanel.d.ts +9 -0
- package/dist/chart/chart-settings/ChartSpecViewerPanel.d.ts.map +1 -0
- package/dist/chart/chart-settings/ChartSpecViewerPanel.js +11 -0
- package/dist/chart/chart-settings/ChartSpecViewerPanel.js.map +1 -0
- package/dist/chart/chart-settings/ChartTypeSelector.d.ts +9 -0
- package/dist/chart/chart-settings/ChartTypeSelector.d.ts.map +1 -0
- package/dist/chart/chart-settings/ChartTypeSelector.js +16 -0
- package/dist/chart/chart-settings/ChartTypeSelector.js.map +1 -0
- package/dist/chart/chart-settings/useTableColumns.d.ts.map +1 -0
- package/dist/{dashboard → chart}/chart-settings/useTableColumns.js +1 -1
- package/dist/chart/chart-settings/useTableColumns.js.map +1 -0
- package/dist/chart/useBrushSelectionParams.d.ts +3 -0
- package/dist/chart/useBrushSelectionParams.d.ts.map +1 -0
- package/dist/chart/useBrushSelectionParams.js +16 -0
- package/dist/chart/useBrushSelectionParams.js.map +1 -0
- package/dist/chart/useChartRetainer.d.ts +3 -0
- package/dist/chart/useChartRetainer.d.ts.map +1 -0
- package/dist/chart/useChartRetainer.js +11 -0
- package/dist/chart/useChartRetainer.js.map +1 -0
- package/dist/chart/useGenerateSpec.d.ts +13 -0
- package/dist/chart/useGenerateSpec.d.ts.map +1 -0
- package/dist/chart/useGenerateSpec.js +32 -0
- package/dist/chart/useGenerateSpec.js.map +1 -0
- package/dist/chart-builders/AggregationSelector.d.ts +11 -0
- package/dist/chart-builders/AggregationSelector.d.ts.map +1 -0
- package/dist/chart-builders/AggregationSelector.js +9 -0
- package/dist/chart-builders/AggregationSelector.js.map +1 -0
- package/dist/chart-builders/ChartBuilderActions.d.ts +2 -2
- package/dist/chart-builders/ChartBuilderActions.d.ts.map +1 -1
- package/dist/chart-builders/ChartBuilderActions.js +24 -16
- package/dist/chart-builders/ChartBuilderActions.js.map +1 -1
- package/dist/chart-builders/ChartBuilderContent.d.ts +4 -6
- package/dist/chart-builders/ChartBuilderContent.d.ts.map +1 -1
- package/dist/chart-builders/ChartBuilderContent.js.map +1 -1
- package/dist/chart-builders/ChartBuilderContext.d.ts +5 -6
- package/dist/chart-builders/ChartBuilderContext.d.ts.map +1 -1
- package/dist/chart-builders/ChartBuilderContext.js.map +1 -1
- package/dist/chart-builders/ChartBuilderDialog.d.ts +7 -10
- package/dist/chart-builders/ChartBuilderDialog.d.ts.map +1 -1
- package/dist/chart-builders/ChartBuilderDialog.js +1 -1
- package/dist/chart-builders/ChartBuilderDialog.js.map +1 -1
- package/dist/chart-builders/ChartBuilderFields.d.ts +2 -2
- package/dist/chart-builders/ChartBuilderFields.d.ts.map +1 -1
- package/dist/chart-builders/ChartBuilderFields.js +28 -14
- package/dist/chart-builders/ChartBuilderFields.js.map +1 -1
- package/dist/chart-builders/ChartBuilderRoot.d.ts +4 -6
- package/dist/chart-builders/ChartBuilderRoot.d.ts.map +1 -1
- package/dist/chart-builders/ChartBuilderRoot.js +9 -28
- package/dist/chart-builders/ChartBuilderRoot.js.map +1 -1
- package/dist/chart-builders/ColumnSelector.d.ts +15 -0
- package/dist/chart-builders/ColumnSelector.d.ts.map +1 -0
- package/dist/chart-builders/ColumnSelector.js +31 -0
- package/dist/chart-builders/ColumnSelector.js.map +1 -0
- package/dist/chart-builders/Field.d.ts +11 -0
- package/dist/chart-builders/Field.d.ts.map +1 -0
- package/dist/chart-builders/Field.js +9 -0
- package/dist/chart-builders/Field.js.map +1 -0
- package/dist/chart-builders/FieldSelectorInput.d.ts +2 -1
- package/dist/chart-builders/FieldSelectorInput.d.ts.map +1 -1
- package/dist/chart-builders/FieldSelectorInput.js +5 -5
- package/dist/chart-builders/FieldSelectorInput.js.map +1 -1
- package/dist/chart-builders/MultiFieldSelector.d.ts +14 -0
- package/dist/chart-builders/MultiFieldSelector.d.ts.map +1 -0
- package/dist/chart-builders/MultiFieldSelector.js +53 -0
- package/dist/chart-builders/MultiFieldSelector.js.map +1 -0
- package/dist/chart-builders/TemporalGranularitySelector.d.ts +10 -0
- package/dist/chart-builders/TemporalGranularitySelector.d.ts.map +1 -0
- package/dist/chart-builders/TemporalGranularitySelector.js +37 -0
- package/dist/chart-builders/TemporalGranularitySelector.js.map +1 -0
- package/dist/chart-builders/chartSpecTitle.d.ts +1 -1
- package/dist/chart-builders/chartSpecTitle.d.ts.map +1 -1
- package/dist/chart-builders/chartSpecTitle.js.map +1 -1
- package/dist/chart-builders/chartTypeUtils.d.ts +5 -9
- package/dist/chart-builders/chartTypeUtils.d.ts.map +1 -1
- package/dist/chart-builders/chartTypeUtils.js +24 -32
- package/dist/chart-builders/chartTypeUtils.js.map +1 -1
- package/dist/chart-builders/constants.d.ts +5 -0
- package/dist/chart-builders/constants.d.ts.map +1 -1
- package/dist/chart-builders/constants.js +13 -0
- package/dist/chart-builders/constants.js.map +1 -1
- package/dist/chart-builders/createChartBuilderStore.d.ts +5 -5
- package/dist/chart-builders/createChartBuilderStore.d.ts.map +1 -1
- package/dist/chart-builders/createChartBuilderStore.js.map +1 -1
- package/dist/chart-types/base-types.d.ts +112 -18
- package/dist/chart-types/base-types.d.ts.map +1 -1
- package/dist/chart-types/base-types.js +6 -1
- package/dist/chart-types/base-types.js.map +1 -1
- package/dist/chart-types/box-plot/BoxPlotSettings.d.ts +3 -0
- package/dist/chart-types/box-plot/BoxPlotSettings.d.ts.map +1 -0
- package/dist/chart-types/box-plot/BoxPlotSettings.js +9 -0
- package/dist/chart-types/box-plot/BoxPlotSettings.js.map +1 -0
- package/dist/chart-types/box-plot/definition.d.ts +3 -3
- package/dist/chart-types/box-plot/definition.d.ts.map +1 -1
- package/dist/chart-types/box-plot/definition.js +10 -36
- package/dist/chart-types/box-plot/definition.js.map +1 -1
- package/dist/chart-types/box-plot/renderer/BoxPlotErrorBoundary.d.ts +18 -0
- package/dist/chart-types/box-plot/renderer/BoxPlotErrorBoundary.d.ts.map +1 -0
- package/dist/chart-types/box-plot/renderer/BoxPlotErrorBoundary.js +28 -0
- package/dist/chart-types/box-plot/renderer/BoxPlotErrorBoundary.js.map +1 -0
- package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.d.ts +9 -0
- package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.d.ts.map +1 -0
- package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.js +115 -0
- package/dist/chart-types/box-plot/renderer/BoxPlotPanelRenderer.js.map +1 -0
- package/dist/chart-types/box-plot/renderer/constants.d.ts +24 -0
- package/dist/chart-types/box-plot/renderer/constants.d.ts.map +1 -0
- package/dist/chart-types/box-plot/renderer/constants.js +17 -0
- package/dist/chart-types/box-plot/renderer/constants.js.map +1 -0
- package/dist/chart-types/box-plot/renderer/plot.d.ts +14 -0
- package/dist/chart-types/box-plot/renderer/plot.d.ts.map +1 -0
- package/dist/chart-types/box-plot/renderer/plot.js +91 -0
- package/dist/chart-types/box-plot/renderer/plot.js.map +1 -0
- package/dist/chart-types/box-plot/renderer/useBoxPlotClient.d.ts +14 -0
- package/dist/chart-types/box-plot/renderer/useBoxPlotClient.d.ts.map +1 -0
- package/dist/chart-types/box-plot/renderer/useBoxPlotClient.js +45 -0
- package/dist/chart-types/box-plot/renderer/useBoxPlotClient.js.map +1 -0
- package/dist/chart-types/box-plot/renderer/utils.d.ts +6 -0
- package/dist/chart-types/box-plot/renderer/utils.d.ts.map +1 -0
- package/dist/chart-types/box-plot/renderer/utils.js +34 -0
- package/dist/chart-types/box-plot/renderer/utils.js.map +1 -0
- package/dist/chart-types/box-plot/schema.d.ts +4 -5
- package/dist/chart-types/box-plot/schema.d.ts.map +1 -1
- package/dist/chart-types/box-plot/schema.js +2 -3
- package/dist/chart-types/box-plot/schema.js.map +1 -1
- package/dist/chart-types/box-plot/tool.d.ts +44 -0
- package/dist/chart-types/box-plot/tool.d.ts.map +1 -0
- package/dist/chart-types/box-plot/tool.js +59 -0
- package/dist/chart-types/box-plot/tool.js.map +1 -0
- package/dist/chart-types/bubble-chart/BubbleChartSettings.d.ts +3 -0
- package/dist/chart-types/bubble-chart/BubbleChartSettings.d.ts.map +1 -0
- package/dist/chart-types/bubble-chart/BubbleChartSettings.js +9 -0
- package/dist/chart-types/bubble-chart/BubbleChartSettings.js.map +1 -0
- package/dist/chart-types/bubble-chart/definition.d.ts +3 -3
- package/dist/chart-types/bubble-chart/definition.d.ts.map +1 -1
- package/dist/chart-types/bubble-chart/definition.js +10 -39
- package/dist/chart-types/bubble-chart/definition.js.map +1 -1
- package/dist/chart-types/bubble-chart/schema.d.ts +2 -1
- package/dist/chart-types/bubble-chart/schema.d.ts.map +1 -1
- package/dist/chart-types/bubble-chart/schema.js +6 -3
- package/dist/chart-types/bubble-chart/schema.js.map +1 -1
- package/dist/chart-types/bubble-chart/spec.d.ts +4 -0
- package/dist/chart-types/bubble-chart/spec.d.ts.map +1 -0
- package/dist/chart-types/bubble-chart/spec.js +31 -0
- package/dist/chart-types/bubble-chart/spec.js.map +1 -0
- package/dist/chart-types/bubble-chart/tool.d.ts +46 -0
- package/dist/chart-types/bubble-chart/tool.d.ts.map +1 -0
- package/dist/chart-types/bubble-chart/tool.js +58 -0
- package/dist/chart-types/bubble-chart/tool.js.map +1 -0
- package/dist/chart-types/chart-config.d.ts +92 -0
- package/dist/chart-types/chart-config.d.ts.map +1 -0
- package/dist/chart-types/chart-config.js +47 -0
- package/dist/chart-types/chart-config.js.map +1 -0
- package/dist/chart-types/count-plot/CountPlotSettings.d.ts +3 -0
- package/dist/chart-types/count-plot/CountPlotSettings.d.ts.map +1 -0
- package/dist/chart-types/count-plot/CountPlotSettings.js +9 -0
- package/dist/chart-types/count-plot/CountPlotSettings.js.map +1 -0
- package/dist/chart-types/count-plot/definition.d.ts +3 -3
- package/dist/chart-types/count-plot/definition.d.ts.map +1 -1
- package/dist/chart-types/count-plot/definition.js +10 -41
- package/dist/chart-types/count-plot/definition.js.map +1 -1
- package/dist/chart-types/count-plot/schema.d.ts +0 -1
- package/dist/chart-types/count-plot/schema.d.ts.map +1 -1
- package/dist/chart-types/count-plot/schema.js +4 -2
- package/dist/chart-types/count-plot/schema.js.map +1 -1
- package/dist/chart-types/count-plot/spec.d.ts +4 -0
- package/dist/chart-types/count-plot/spec.d.ts.map +1 -0
- package/dist/chart-types/count-plot/spec.js +49 -0
- package/dist/chart-types/count-plot/spec.js.map +1 -0
- package/dist/chart-types/count-plot/tool.d.ts +42 -0
- package/dist/chart-types/count-plot/tool.d.ts.map +1 -0
- package/dist/chart-types/count-plot/tool.js +55 -0
- package/dist/chart-types/count-plot/tool.js.map +1 -0
- package/dist/chart-types/custom-spec/CustomSpecSettings.d.ts +7 -0
- package/dist/chart-types/custom-spec/CustomSpecSettings.d.ts.map +1 -0
- package/dist/chart-types/custom-spec/CustomSpecSettings.js +30 -0
- package/dist/chart-types/custom-spec/CustomSpecSettings.js.map +1 -0
- package/dist/chart-types/custom-spec/definition.d.ts +3 -3
- package/dist/chart-types/custom-spec/definition.d.ts.map +1 -1
- package/dist/chart-types/custom-spec/definition.js +8 -19
- package/dist/chart-types/custom-spec/definition.js.map +1 -1
- package/dist/chart-types/custom-spec/schema.d.ts +6 -3
- package/dist/chart-types/custom-spec/schema.d.ts.map +1 -1
- package/dist/chart-types/custom-spec/schema.js +3 -2
- package/dist/chart-types/custom-spec/schema.js.map +1 -1
- package/dist/chart-types/custom-spec/spec.d.ts +4 -0
- package/dist/chart-types/custom-spec/spec.d.ts.map +1 -0
- package/dist/chart-types/custom-spec/spec.js +24 -0
- package/dist/chart-types/custom-spec/spec.js.map +1 -0
- package/dist/chart-types/errors.d.ts +23 -0
- package/dist/chart-types/errors.d.ts.map +1 -0
- package/dist/chart-types/errors.js +26 -0
- package/dist/chart-types/errors.js.map +1 -0
- package/dist/chart-types/heatmap/HeatmapSettings.d.ts +3 -0
- package/dist/chart-types/heatmap/HeatmapSettings.d.ts.map +1 -0
- package/dist/chart-types/heatmap/HeatmapSettings.js +9 -0
- package/dist/chart-types/heatmap/HeatmapSettings.js.map +1 -0
- package/dist/chart-types/heatmap/definition.d.ts +3 -3
- package/dist/chart-types/heatmap/definition.d.ts.map +1 -1
- package/dist/chart-types/heatmap/definition.js +10 -40
- package/dist/chart-types/heatmap/definition.js.map +1 -1
- package/dist/chart-types/heatmap/schema.d.ts +0 -1
- package/dist/chart-types/heatmap/schema.d.ts.map +1 -1
- package/dist/chart-types/heatmap/schema.js +2 -3
- package/dist/chart-types/heatmap/schema.js.map +1 -1
- package/dist/chart-types/heatmap/spec.d.ts +4 -0
- package/dist/chart-types/heatmap/spec.d.ts.map +1 -0
- package/dist/chart-types/heatmap/spec.js +32 -0
- package/dist/chart-types/heatmap/spec.js.map +1 -0
- package/dist/chart-types/heatmap/tool.d.ts +44 -0
- package/dist/chart-types/heatmap/tool.d.ts.map +1 -0
- package/dist/chart-types/heatmap/tool.js +59 -0
- package/dist/chart-types/heatmap/tool.js.map +1 -0
- package/dist/chart-types/histogram/HistogramSettings.d.ts +3 -0
- package/dist/chart-types/histogram/HistogramSettings.d.ts.map +1 -0
- package/dist/chart-types/histogram/HistogramSettings.js +9 -0
- package/dist/chart-types/histogram/HistogramSettings.js.map +1 -0
- package/dist/chart-types/histogram/definition.d.ts +3 -3
- package/dist/chart-types/histogram/definition.d.ts.map +1 -1
- package/dist/chart-types/histogram/definition.js +10 -40
- package/dist/chart-types/histogram/definition.js.map +1 -1
- package/dist/chart-types/histogram/schema.d.ts +0 -1
- package/dist/chart-types/histogram/schema.d.ts.map +1 -1
- package/dist/chart-types/histogram/schema.js +4 -2
- package/dist/chart-types/histogram/schema.js.map +1 -1
- package/dist/chart-types/histogram/spec.d.ts +4 -0
- package/dist/chart-types/histogram/spec.d.ts.map +1 -0
- package/dist/chart-types/histogram/spec.js +36 -0
- package/dist/chart-types/histogram/spec.js.map +1 -0
- package/dist/chart-types/histogram/tool.d.ts +42 -0
- package/dist/chart-types/histogram/tool.d.ts.map +1 -0
- package/dist/chart-types/histogram/tool.js +55 -0
- package/dist/chart-types/histogram/tool.js.map +1 -0
- package/dist/chart-types/index.d.ts +102 -96
- package/dist/chart-types/index.d.ts.map +1 -1
- package/dist/chart-types/index.js +71 -41
- package/dist/chart-types/index.js.map +1 -1
- package/dist/chart-types/line-chart/LineChartSettings.d.ts +7 -0
- package/dist/chart-types/line-chart/LineChartSettings.d.ts.map +1 -0
- package/dist/chart-types/line-chart/LineChartSettings.js +22 -0
- package/dist/chart-types/line-chart/LineChartSettings.js.map +1 -0
- package/dist/chart-types/line-chart/definition.d.ts +3 -3
- package/dist/chart-types/line-chart/definition.d.ts.map +1 -1
- package/dist/chart-types/line-chart/definition.js +10 -37
- package/dist/chart-types/line-chart/definition.js.map +1 -1
- package/dist/chart-types/line-chart/schema.d.ts +69 -3
- package/dist/chart-types/line-chart/schema.d.ts.map +1 -1
- package/dist/chart-types/line-chart/schema.js +30 -3
- package/dist/chart-types/line-chart/schema.js.map +1 -1
- package/dist/chart-types/line-chart/spec.d.ts +4 -0
- package/dist/chart-types/line-chart/spec.d.ts.map +1 -0
- package/dist/chart-types/line-chart/spec.js +91 -0
- package/dist/chart-types/line-chart/spec.js.map +1 -0
- package/dist/chart-types/line-chart/tool.d.ts +68 -0
- package/dist/chart-types/line-chart/tool.d.ts.map +1 -0
- package/dist/chart-types/line-chart/tool.js +66 -0
- package/dist/chart-types/line-chart/tool.js.map +1 -0
- package/dist/chart-types/tool-schemas.d.ts +8 -0
- package/dist/chart-types/tool-schemas.d.ts.map +1 -0
- package/dist/chart-types/tool-schemas.js +18 -0
- package/dist/chart-types/tool-schemas.js.map +1 -0
- package/dist/chart-types/tool-types.d.ts +26 -0
- package/dist/chart-types/tool-types.d.ts.map +1 -0
- package/dist/chart-types/tool-types.js +2 -0
- package/dist/chart-types/tool-types.js.map +1 -0
- package/dist/chart-types/tool-validation.d.ts +3 -0
- package/dist/chart-types/tool-validation.d.ts.map +1 -0
- package/dist/chart-types/tool-validation.js +11 -0
- package/dist/chart-types/tool-validation.js.map +1 -0
- package/dist/chart-types/useChartTypeDefinition.d.ts +3 -0
- package/dist/chart-types/useChartTypeDefinition.d.ts.map +1 -0
- package/dist/chart-types/useChartTypeDefinition.js +8 -0
- package/dist/chart-types/useChartTypeDefinition.js.map +1 -0
- package/dist/dashboard/MosaicDashboard.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboard.js +7 -11
- package/dist/dashboard/MosaicDashboard.js.map +1 -1
- package/dist/dashboard/MosaicDashboardEmptyState.d.ts +2 -0
- package/dist/dashboard/MosaicDashboardEmptyState.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardEmptyState.js +50 -0
- package/dist/dashboard/MosaicDashboardEmptyState.js.map +1 -0
- package/dist/dashboard/MosaicDashboardPanelLayout.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardPanelLayout.js +23 -2
- package/dist/dashboard/MosaicDashboardPanelLayout.js.map +1 -1
- package/dist/dashboard/MosaicDashboardPanels.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardPanels.js +2 -1
- package/dist/dashboard/MosaicDashboardPanels.js.map +1 -1
- package/dist/dashboard/MosaicDashboardSlice.d.ts +212 -87
- package/dist/dashboard/MosaicDashboardSlice.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardSlice.js +65 -18
- package/dist/dashboard/MosaicDashboardSlice.js.map +1 -1
- package/dist/dashboard/MosaicDashboardToolbar.d.ts.map +1 -1
- package/dist/dashboard/MosaicDashboardToolbar.js +9 -4
- package/dist/dashboard/MosaicDashboardToolbar.js.map +1 -1
- package/dist/dashboard/defaultPanelRenderers.d.ts.map +1 -1
- package/dist/dashboard/defaultPanelRenderers.js +6 -4
- package/dist/dashboard/defaultPanelRenderers.js.map +1 -1
- package/dist/dashboard/utils.d.ts +3 -0
- package/dist/dashboard/utils.d.ts.map +1 -0
- package/dist/dashboard/utils.js +16 -0
- package/dist/dashboard/utils.js.map +1 -0
- package/dist/index.d.ts +6 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -7
- package/dist/index.js.map +1 -1
- package/dist/{dashboard → profiler}/MosaicDashboardProfilerPanelRenderer.d.ts +1 -1
- package/dist/profiler/MosaicDashboardProfilerPanelRenderer.d.ts.map +1 -0
- package/dist/{dashboard → profiler}/MosaicDashboardProfilerPanelRenderer.js +2 -2
- package/dist/profiler/MosaicDashboardProfilerPanelRenderer.js.map +1 -0
- package/dist/text/MosaicDashboardTextRenderer.d.ts +3 -0
- package/dist/text/MosaicDashboardTextRenderer.d.ts.map +1 -0
- package/dist/text/MosaicDashboardTextRenderer.js +46 -0
- package/dist/text/MosaicDashboardTextRenderer.js.map +1 -0
- package/package.json +38 -35
- package/dist/chart-builders/builders.d.ts +0 -34
- package/dist/chart-builders/builders.d.ts.map +0 -1
- package/dist/chart-builders/builders.js +0 -51
- package/dist/chart-builders/builders.js.map +0 -1
- package/dist/chart-builders/describeChartSpecs.d.ts +0 -9
- package/dist/chart-builders/describeChartSpecs.d.ts.map +0 -1
- package/dist/chart-builders/describeChartSpecs.js +0 -41
- package/dist/chart-builders/describeChartSpecs.js.map +0 -1
- package/dist/chart-builders/hooks/useChartFieldForm.d.ts +0 -13
- package/dist/chart-builders/hooks/useChartFieldForm.d.ts.map +0 -1
- package/dist/chart-builders/hooks/useChartFieldForm.js +0 -12
- package/dist/chart-builders/hooks/useChartFieldForm.js.map +0 -1
- package/dist/chart-builders/types.d.ts +0 -23
- package/dist/chart-builders/types.d.ts.map +0 -1
- package/dist/chart-builders/types.js +0 -17
- package/dist/chart-builders/types.js.map +0 -1
- package/dist/chart-types/box-plot/index.d.ts +0 -3
- package/dist/chart-types/box-plot/index.d.ts.map +0 -1
- package/dist/chart-types/box-plot/index.js +0 -3
- package/dist/chart-types/box-plot/index.js.map +0 -1
- package/dist/chart-types/bubble-chart/index.d.ts +0 -3
- package/dist/chart-types/bubble-chart/index.d.ts.map +0 -1
- package/dist/chart-types/bubble-chart/index.js +0 -3
- package/dist/chart-types/bubble-chart/index.js.map +0 -1
- package/dist/chart-types/count-plot/index.d.ts +0 -3
- package/dist/chart-types/count-plot/index.d.ts.map +0 -1
- package/dist/chart-types/count-plot/index.js +0 -3
- package/dist/chart-types/count-plot/index.js.map +0 -1
- package/dist/chart-types/custom-spec/index.d.ts +0 -3
- package/dist/chart-types/custom-spec/index.d.ts.map +0 -1
- package/dist/chart-types/custom-spec/index.js +0 -3
- package/dist/chart-types/custom-spec/index.js.map +0 -1
- package/dist/chart-types/ecdf/definition.d.ts +0 -4
- package/dist/chart-types/ecdf/definition.d.ts.map +0 -1
- package/dist/chart-types/ecdf/definition.js +0 -47
- package/dist/chart-types/ecdf/definition.js.map +0 -1
- package/dist/chart-types/ecdf/index.d.ts +0 -3
- package/dist/chart-types/ecdf/index.d.ts.map +0 -1
- package/dist/chart-types/ecdf/index.js +0 -3
- package/dist/chart-types/ecdf/index.js.map +0 -1
- package/dist/chart-types/ecdf/schema.d.ts +0 -15
- package/dist/chart-types/ecdf/schema.d.ts.map +0 -1
- package/dist/chart-types/ecdf/schema.js +0 -11
- package/dist/chart-types/ecdf/schema.js.map +0 -1
- package/dist/chart-types/heatmap/index.d.ts +0 -3
- package/dist/chart-types/heatmap/index.d.ts.map +0 -1
- package/dist/chart-types/heatmap/index.js +0 -3
- package/dist/chart-types/heatmap/index.js.map +0 -1
- package/dist/chart-types/histogram/index.d.ts +0 -3
- package/dist/chart-types/histogram/index.d.ts.map +0 -1
- package/dist/chart-types/histogram/index.js +0 -3
- package/dist/chart-types/histogram/index.js.map +0 -1
- package/dist/chart-types/line-chart/index.d.ts +0 -3
- package/dist/chart-types/line-chart/index.d.ts.map +0 -1
- package/dist/chart-types/line-chart/index.js +0 -3
- package/dist/chart-types/line-chart/index.js.map +0 -1
- package/dist/chart-types/registry.d.ts +0 -5
- package/dist/chart-types/registry.d.ts.map +0 -1
- package/dist/chart-types/registry.js +0 -28
- package/dist/chart-types/registry.js.map +0 -1
- package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.d.ts.map +0 -1
- package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.js.map +0 -1
- package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.d.ts +0 -4
- package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.d.ts.map +0 -1
- package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.js +0 -29
- package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.js.map +0 -1
- package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.d.ts +0 -3
- package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.d.ts.map +0 -1
- package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.js +0 -68
- package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.js.map +0 -1
- package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts +0 -8
- package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts.map +0 -1
- package/dist/dashboard/VgPlotSpecPopoverEditor.js +0 -40
- package/dist/dashboard/VgPlotSpecPopoverEditor.js.map +0 -1
- package/dist/dashboard/chart-settings/ChartSettings.d.ts.map +0 -1
- package/dist/dashboard/chart-settings/ChartSettings.js +0 -90
- package/dist/dashboard/chart-settings/ChartSettings.js.map +0 -1
- package/dist/dashboard/chart-settings/ChartSettingsContext.d.ts +0 -20
- package/dist/dashboard/chart-settings/ChartSettingsContext.d.ts.map +0 -1
- package/dist/dashboard/chart-settings/ChartSettingsContext.js +0 -14
- package/dist/dashboard/chart-settings/ChartSettingsContext.js.map +0 -1
- package/dist/dashboard/chart-settings/ChartSettingsPanel.d.ts +0 -11
- package/dist/dashboard/chart-settings/ChartSettingsPanel.d.ts.map +0 -1
- package/dist/dashboard/chart-settings/ChartSettingsPanel.js +0 -8
- package/dist/dashboard/chart-settings/ChartSettingsPanel.js.map +0 -1
- package/dist/dashboard/chart-settings/ChartTypeSelector.d.ts +0 -11
- package/dist/dashboard/chart-settings/ChartTypeSelector.d.ts.map +0 -1
- package/dist/dashboard/chart-settings/ChartTypeSelector.js +0 -17
- package/dist/dashboard/chart-settings/ChartTypeSelector.js.map +0 -1
- package/dist/dashboard/chart-settings/DynamicChartSettings.d.ts +0 -11
- package/dist/dashboard/chart-settings/DynamicChartSettings.d.ts.map +0 -1
- package/dist/dashboard/chart-settings/DynamicChartSettings.js +0 -19
- package/dist/dashboard/chart-settings/DynamicChartSettings.js.map +0 -1
- package/dist/dashboard/chart-settings/index.d.ts +0 -6
- package/dist/dashboard/chart-settings/index.d.ts.map +0 -1
- package/dist/dashboard/chart-settings/index.js +0 -6
- package/dist/dashboard/chart-settings/index.js.map +0 -1
- package/dist/dashboard/chart-settings/useTableColumns.d.ts.map +0 -1
- package/dist/dashboard/chart-settings/useTableColumns.js.map +0 -1
- package/dist/dashboard/generateMosaicChartSpec.d.ts +0 -15
- package/dist/dashboard/generateMosaicChartSpec.d.ts.map +0 -1
- package/dist/dashboard/generateMosaicChartSpec.js +0 -30
- package/dist/dashboard/generateMosaicChartSpec.js.map +0 -1
- /package/dist/{dashboard → chart}/chart-settings/useTableColumns.d.ts +0 -0
package/README.md
CHANGED
|
@@ -177,8 +177,8 @@ runtime add-panel actions when creating the dashboard slice.
|
|
|
177
177
|
import {
|
|
178
178
|
createDefaultMosaicDashboardPanelRenderers,
|
|
179
179
|
createMosaicDashboardProfilerPanelConfig,
|
|
180
|
+
createMosaicDashboardChartPanelConfig,
|
|
180
181
|
createMosaicDashboardSlice,
|
|
181
|
-
createMosaicDashboardVgPlotPanelConfig,
|
|
182
182
|
MosaicDashboard,
|
|
183
183
|
} from '@sqlrooms/mosaic';
|
|
184
184
|
|
|
@@ -200,6 +200,19 @@ function addProfiler(store: RoomStore) {
|
|
|
200
200
|
}),
|
|
201
201
|
);
|
|
202
202
|
}
|
|
203
|
+
|
|
204
|
+
function addBoxPlotChart(store: RoomStore) {
|
|
205
|
+
store.getState().mosaicDashboard.addPanel(
|
|
206
|
+
'main',
|
|
207
|
+
createMosaicDashboardChartPanelConfig('Magnitude by Region', {
|
|
208
|
+
chartType: 'box-plot',
|
|
209
|
+
settings: {
|
|
210
|
+
x: 'region',
|
|
211
|
+
y: 'magnitude',
|
|
212
|
+
},
|
|
213
|
+
}),
|
|
214
|
+
);
|
|
215
|
+
}
|
|
203
216
|
```
|
|
204
217
|
|
|
205
218
|
Dashboards have a creation-time `layoutType` of either `dock` or `grid`.
|
|
@@ -213,6 +226,79 @@ panel omits a source it falls back to the dashboard selected table. Panel render
|
|
|
213
226
|
definitions and chart builder definitions are runtime-only and intentionally
|
|
214
227
|
live outside persisted dashboard config.
|
|
215
228
|
|
|
229
|
+
### AI Chart Tools
|
|
230
|
+
|
|
231
|
+
`createChartTools` generates assistant tools for the built-in chart types. The
|
|
232
|
+
injected `ChartToolDeps.resolveResources(params, context)` callback receives the
|
|
233
|
+
tool execution context as its second argument. Client apps should prefer
|
|
234
|
+
execution-scoped context, such as a captured AI run context, over live UI state
|
|
235
|
+
when resolving implicit dashboard targets. Explicit `params.artifactId` should
|
|
236
|
+
still take precedence.
|
|
237
|
+
|
|
238
|
+
```ts
|
|
239
|
+
import {
|
|
240
|
+
createChartTools,
|
|
241
|
+
createDefaultChartTypes,
|
|
242
|
+
type ChartToolDeps,
|
|
243
|
+
} from '@sqlrooms/mosaic';
|
|
244
|
+
|
|
245
|
+
const deps: ChartToolDeps = {
|
|
246
|
+
resolveResources: (params, context) => {
|
|
247
|
+
const sessionId = context?.sessionId;
|
|
248
|
+
const runContext = context?.aiRunContext;
|
|
249
|
+
const contextArtifactId = getDashboardArtifactIdFromRunContext(
|
|
250
|
+
runContext,
|
|
251
|
+
sessionId,
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
// Prefer execution-scoped context over live UI state for implicit targets.
|
|
255
|
+
// Explicit tool input still wins over anything derived from context.
|
|
256
|
+
const artifactId =
|
|
257
|
+
params.artifactId ??
|
|
258
|
+
contextArtifactId ??
|
|
259
|
+
getCurrentDashboardArtifactId();
|
|
260
|
+
const tableName = params.tableName ?? getSelectedTableName(artifactId);
|
|
261
|
+
|
|
262
|
+
return {
|
|
263
|
+
artifactId,
|
|
264
|
+
tableName,
|
|
265
|
+
columns: getTableColumns(tableName),
|
|
266
|
+
};
|
|
267
|
+
},
|
|
268
|
+
createChart: ({artifactId, tableName, title, config}) =>
|
|
269
|
+
addChartPanel({artifactId, tableName, title, config}),
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
const chartTools = createChartTools(
|
|
273
|
+
createDefaultChartTypes({includeCustomSpec: false}),
|
|
274
|
+
deps,
|
|
275
|
+
);
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Box Plot Chart Type
|
|
279
|
+
|
|
280
|
+
The built-in Box Plot chart type (`'box-plot'`) is a specialized chart that uses
|
|
281
|
+
a custom renderer instead of Vega-Lite. It calculates quartiles, whiskers, and
|
|
282
|
+
outliers directly in DuckDB using SQL queries, then renders them with Observable
|
|
283
|
+
Plot primitives. This approach provides better performance and more accurate
|
|
284
|
+
statistical calculations than Observable Plot's built-in `boxY` mark.
|
|
285
|
+
|
|
286
|
+
Box plots support:
|
|
287
|
+
|
|
288
|
+
- Grouped box plots by categorical variable (x-axis)
|
|
289
|
+
- Y-axis brushing for interactive filtering
|
|
290
|
+
- Cross-filtering integration with other dashboard charts
|
|
291
|
+
- Custom quartile calculation using DuckDB's `quantile_cont` function
|
|
292
|
+
|
|
293
|
+
The renderer is modular and organized in the `chart-types/box-plot/renderer/`
|
|
294
|
+
directory with separate concerns:
|
|
295
|
+
|
|
296
|
+
- **BoxPlotPanelRenderer.tsx** - Main React component with drag interactions
|
|
297
|
+
- **BoxPlotClient.ts** - Mosaic client for SQL-based data queries
|
|
298
|
+
- **plot.ts** - Observable Plot rendering logic
|
|
299
|
+
- **utils.ts** - Statistical calculations and coordinate transformations
|
|
300
|
+
- **constants.ts** - Theme colors and layout constants
|
|
301
|
+
|
|
216
302
|
### Chart Builder Compound Components
|
|
217
303
|
|
|
218
304
|
The chart builder UI can be used as a compound component API for flexible composition:
|
|
@@ -235,6 +321,9 @@ function MyDashboard() {
|
|
|
235
321
|
onCreateChart={(spec, title) => {
|
|
236
322
|
// Handle chart creation
|
|
237
323
|
}}
|
|
324
|
+
onCreateChartOutput={(output, title) => {
|
|
325
|
+
// Optional: handle non-spec outputs such as dashboard panel chart types.
|
|
326
|
+
}}
|
|
238
327
|
>
|
|
239
328
|
<ChartBuilderTrigger />
|
|
240
329
|
<ChartBuilderDialogContent>
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import type { ReactElement } from 'react';
|
|
2
|
-
import { mosaicChartBuilders } from './chart-builders/builders';
|
|
3
|
-
import { mosaicChartTypes } from './chart-types';
|
|
4
2
|
import { ChartBuilderActions } from './chart-builders/ChartBuilderActions';
|
|
5
3
|
import { ChartBuilderContent } from './chart-builders/ChartBuilderContent';
|
|
6
4
|
import { ChartBuilderDialog, ChartBuilderDialogContent, ChartBuilderTrigger } from './chart-builders/ChartBuilderDialog';
|
|
@@ -51,8 +49,6 @@ import { FieldSelectorInput } from './chart-builders/FieldSelectorInput';
|
|
|
51
49
|
*/
|
|
52
50
|
type MosaicChartBuilderCompoundComponent = ((props: ChartBuilderRootProps) => ReactElement) & {
|
|
53
51
|
Root: typeof ChartBuilderRoot;
|
|
54
|
-
chartTypes: typeof mosaicChartTypes;
|
|
55
|
-
chartBuilders: typeof mosaicChartBuilders;
|
|
56
52
|
Trigger: typeof ChartBuilderTrigger;
|
|
57
53
|
Dialog: typeof ChartBuilderDialogContent;
|
|
58
54
|
Content: typeof ChartBuilderContent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicChartBuilder.d.ts","sourceRoot":"","sources":["../src/MosaicChartBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,OAAO,CAAC;AACxC,OAAO,EAAC,mBAAmB,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"MosaicChartBuilder.d.ts","sourceRoot":"","sources":["../src/MosaicChartBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,OAAO,CAAC;AACxC,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAC;AACzE,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC3B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAC,kBAAkB,EAAC,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAC,oBAAoB,EAAC,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAC,kBAAkB,EAAC,MAAM,qCAAqC,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,KAAK,mCAAmC,GAAG,CAAC,CAC1C,KAAK,EAAE,qBAAqB,KACzB,YAAY,CAAC,GAAG;IACnB,IAAI,EAAE,OAAO,gBAAgB,CAAC;IAC9B,OAAO,EAAE,OAAO,mBAAmB,CAAC;IACpC,MAAM,EAAE,OAAO,yBAAyB,CAAC;IACzC,OAAO,EAAE,OAAO,mBAAmB,CAAC;IACpC,QAAQ,EAAE,OAAO,oBAAoB,CAAC;IACtC,MAAM,EAAE,OAAO,kBAAkB,CAAC;IAClC,OAAO,EAAE,OAAO,mBAAmB,CAAC;IACpC,aAAa,EAAE,OAAO,kBAAkB,CAAC;IACzC,YAAY,EAAE,OAAO,kBAAkB,CAAC;CACzC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,mCAsB9B,CAAC"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { mosaicChartBuilders } from './chart-builders/builders';
|
|
2
|
-
import { mosaicChartTypes } from './chart-types';
|
|
3
1
|
import { ChartBuilderActions } from './chart-builders/ChartBuilderActions';
|
|
4
2
|
import { ChartBuilderContent } from './chart-builders/ChartBuilderContent';
|
|
5
3
|
import { ChartBuilderDialog, ChartBuilderDialogContent, ChartBuilderTrigger, } from './chart-builders/ChartBuilderDialog';
|
|
@@ -9,10 +7,6 @@ import { ChartBuilderTypeGrid } from './chart-builders/ChartBuilderTypeGrid';
|
|
|
9
7
|
import { FieldSelectorInput } from './chart-builders/FieldSelectorInput';
|
|
10
8
|
export const MosaicChartBuilder = Object.assign(ChartBuilderRoot, {
|
|
11
9
|
Root: ChartBuilderRoot,
|
|
12
|
-
/** Named built-in chart-type definitions. */
|
|
13
|
-
chartTypes: mosaicChartTypes,
|
|
14
|
-
/** Named built-in chart templates (same objects as default set). */
|
|
15
|
-
chartBuilders: mosaicChartBuilders,
|
|
16
10
|
/** Default trigger button; customize via ButtonProps or children. */
|
|
17
11
|
Trigger: ChartBuilderTrigger,
|
|
18
12
|
/** Dialog content pane with chart-builder steps. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicChartBuilder.js","sourceRoot":"","sources":["../src/MosaicChartBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,mBAAmB,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"MosaicChartBuilder.js","sourceRoot":"","sources":["../src/MosaicChartBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAC,mBAAmB,EAAC,MAAM,sCAAsC,CAAC;AACzE,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,gBAAgB,GAEjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAC,kBAAkB,EAAC,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAC,oBAAoB,EAAC,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAC,kBAAkB,EAAC,MAAM,qCAAqC,CAAC;AA0DvE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,MAAM,CAAC,MAAM,CACX,gBAAkE,EAClE;IACE,IAAI,EAAE,gBAAgB;IACtB,qEAAqE;IACrE,OAAO,EAAE,mBAAmB;IAC5B,oDAAoD;IACpD,MAAM,EAAE,yBAAyB;IACjC,iDAAiD;IACjD,OAAO,EAAE,mBAAmB;IAC5B,uCAAuC;IACvC,QAAQ,EAAE,oBAAoB;IAC9B,6DAA6D;IAC7D,MAAM,EAAE,kBAAkB;IAC1B,gEAAgE;IAChE,OAAO,EAAE,mBAAmB;IAC5B,gCAAgC;IAChC,aAAa,EAAE,kBAAkB;IACjC,oDAAoD;IACpD,YAAY,EAAE,kBAAkB;CACjC,CACF,CAAC","sourcesContent":["import type {ReactElement} from 'react';\nimport {ChartBuilderActions} from './chart-builders/ChartBuilderActions';\nimport {ChartBuilderContent} from './chart-builders/ChartBuilderContent';\nimport {\n ChartBuilderDialog,\n ChartBuilderDialogContent,\n ChartBuilderTrigger,\n} from './chart-builders/ChartBuilderDialog';\nimport {\n ChartBuilderRoot,\n type ChartBuilderRootProps,\n} from './chart-builders/ChartBuilderRoot';\nimport {ChartBuilderFields} from './chart-builders/ChartBuilderFields';\nimport {ChartBuilderTypeGrid} from './chart-builders/ChartBuilderTypeGrid';\nimport {FieldSelectorInput} from './chart-builders/FieldSelectorInput';\n\n/**\n * Compound component for building Mosaic charts from templates.\n *\n * Use `<MosaicChartBuilder>` as the root; it provides context and wraps a\n * Radix Dialog.\n *\n * @example Compound usage (recommended)\n * ```tsx\n * <MosaicChartBuilder\n * tableName=\"my_table\"\n * columns={columns}\n * onCreateChart={handleCreate}\n * >\n * <MosaicChartBuilder.Trigger />\n * <MosaicChartBuilder.Dialog />\n * </MosaicChartBuilder>\n * ```\n *\n * @example Custom trigger button\n * ```tsx\n * <MosaicChartBuilder\n * tableName=\"my_table\"\n * columns={columns}\n * onCreateChart={handleCreate}\n * >\n * <MosaicChartBuilder.Trigger variant=\"ghost\" size=\"icon\">\n * <PlusIcon />\n * </MosaicChartBuilder.Trigger>\n * <MosaicChartBuilder.Dialog />\n * </MosaicChartBuilder>\n * ```\n *\n * @example Inline builder (no dialog)\n * ```tsx\n * <MosaicChartBuilder.Content\n * tableName=\"my_table\"\n * columns={columns}\n * onCreateChart={handleCreate}\n * />\n * ```\n */\n\ntype MosaicChartBuilderCompoundComponent = ((\n props: ChartBuilderRootProps,\n) => ReactElement) & {\n Root: typeof ChartBuilderRoot;\n Trigger: typeof ChartBuilderTrigger;\n Dialog: typeof ChartBuilderDialogContent;\n Content: typeof ChartBuilderContent;\n TypeGrid: typeof ChartBuilderTypeGrid;\n Fields: typeof ChartBuilderFields;\n Actions: typeof ChartBuilderActions;\n FieldSelector: typeof FieldSelectorInput;\n LegacyDialog: typeof ChartBuilderDialog;\n};\n\nexport const MosaicChartBuilder: MosaicChartBuilderCompoundComponent =\n Object.assign(\n ChartBuilderRoot as (props: ChartBuilderRootProps) => ReactElement,\n {\n Root: ChartBuilderRoot,\n /** Default trigger button; customize via ButtonProps or children. */\n Trigger: ChartBuilderTrigger,\n /** Dialog content pane with chart-builder steps. */\n Dialog: ChartBuilderDialogContent,\n /** Standalone builder UI (no dialog wrapper). */\n Content: ChartBuilderContent,\n /** Built-in chart-type picker grid. */\n TypeGrid: ChartBuilderTypeGrid,\n /** Field selectors for the currently selected chart type. */\n Fields: ChartBuilderFields,\n /** Back/Create actions for the current chart type selection. */\n Actions: ChartBuilderActions,\n /** Field selector primitive. */\n FieldSelector: FieldSelectorInput,\n /** Legacy one-shot dialog (backward-compatible). */\n LegacyDialog: ChartBuilderDialog,\n },\n );\n"]}
|
package/dist/MosaicSlice.d.ts
CHANGED
|
@@ -36,18 +36,25 @@ export type TrackedClient = {
|
|
|
36
36
|
selection?: Selection;
|
|
37
37
|
queryResultCallback?: (result: ArrowTable) => void;
|
|
38
38
|
};
|
|
39
|
+
export type MosaicIdleConnection = {
|
|
40
|
+
status: 'idle';
|
|
41
|
+
};
|
|
42
|
+
export type MosaicLoadingConnection = {
|
|
43
|
+
status: 'loading';
|
|
44
|
+
};
|
|
45
|
+
export type MosaicReadyConnection = {
|
|
46
|
+
status: 'ready';
|
|
47
|
+
connector?: Connector;
|
|
48
|
+
coordinator: Coordinator;
|
|
49
|
+
};
|
|
50
|
+
export type MosaicErrorConnection = {
|
|
51
|
+
status: 'error';
|
|
52
|
+
error: unknown;
|
|
53
|
+
};
|
|
54
|
+
export type MosaicConnection = MosaicIdleConnection | MosaicLoadingConnection | MosaicReadyConnection | MosaicErrorConnection;
|
|
39
55
|
export type MosaicSliceState = {
|
|
40
56
|
mosaic: SliceFunctions & {
|
|
41
|
-
connection:
|
|
42
|
-
status: 'idle' | 'loading';
|
|
43
|
-
} | {
|
|
44
|
-
status: 'ready';
|
|
45
|
-
connector?: Connector;
|
|
46
|
-
coordinator: Coordinator;
|
|
47
|
-
} | {
|
|
48
|
-
status: 'error';
|
|
49
|
-
error: unknown;
|
|
50
|
-
};
|
|
57
|
+
connection: MosaicConnection;
|
|
51
58
|
config: MosaicSliceConfig;
|
|
52
59
|
/** Record of registered clients by id */
|
|
53
60
|
clients: Record<string, TrackedClient>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicSlice.d.ts","sourceRoot":"","sources":["../src/MosaicSlice.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,SAAS,EACT,WAAW,EAEX,UAAU,EACV,SAAS,EAEV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AACzC,OAAO,KAAK,EAAC,KAAK,IAAI,UAAU,EAAC,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAMtB,eAAO,MAAM,iBAAiB,gCAAe,CAAC;AAC9C,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,MAAM,MAAM,yBAAyB,GAAG;IACtC,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAGF,MAAM,MAAM,mBAAmB,GAAG;IAChC,wCAAwC;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8DAA8D;IAC9D,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,UAAU,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,+CAA+C;IAC/C,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC3C,0CAA0C;IAC1C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC,CAAC;AAGF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"MosaicSlice.d.ts","sourceRoot":"","sources":["../src/MosaicSlice.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,SAAS,EACT,WAAW,EAEX,UAAU,EACV,SAAS,EAEV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AACzC,OAAO,KAAK,EAAC,KAAK,IAAI,UAAU,EAAC,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAMtB,eAAO,MAAM,iBAAiB,gCAAe,CAAC;AAC9C,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,MAAM,MAAM,yBAAyB,GAAG;IACtC,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAGF,MAAM,MAAM,mBAAmB,GAAG;IAChC,wCAAwC;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8DAA8D;IAC9D,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,UAAU,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,+CAA+C;IAC/C,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC3C,0CAA0C;IAC1C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC,CAAC;AAGF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC;AACpD,MAAM,MAAM,uBAAuB,GAAG;IAAC,MAAM,EAAE,SAAS,CAAA;CAAC,CAAC;AAC1D,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,EAAE,WAAW,CAAC;CAC1B,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAC,CAAC;AAEtE,MAAM,MAAM,gBAAgB,GACxB,oBAAoB,GACpB,uBAAuB,GACvB,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,cAAc,GAAG;QACvB,UAAU,EAAE,gBAAgB,CAAC;QAC7B,MAAM,EAAE,iBAAiB,CAAC;QAC1B,yCAAyC;QACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACvC,oEAAoE;QACpE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACtC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,0DAA0D;QAC1D,YAAY,EAAE,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,KACtC,SAAS,CAAC;QACf,6CAA6C;QAC7C,YAAY,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,MAAM,CAAC;QACvD,4FAA4F;QAC5F,YAAY,EAAE,CACZ,OAAO,EAAE,mBAAmB,GAAG;YAC7B,EAAE,EAAE,MAAM,CAAC;YACX,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;YAC7C,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;SACvC,KACE,IAAI,CAAC;QACV,2CAA2C;QAC3C,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;QACpC,kDAAkD;QAClD,iBAAiB,EAAE,MAAM,IAAI,CAAC;KAC/B,CAAC;CACH,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,KAAK,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACjC,iBAAiB,CAInB;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,GAAE,sBAA2B,oDAuTnE;AAiBD,MAAM,MAAM,0BAA0B,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAE7E,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,CAAC,GACjD,CAAC,CAIH"}
|
package/dist/MosaicSlice.js
CHANGED
|
@@ -34,8 +34,11 @@ export function createMosaicSlice(props = {}) {
|
|
|
34
34
|
resolvedCoordinator = coordinator();
|
|
35
35
|
mosaicConnector = isWasmDuckDbConnector(dbConnector)
|
|
36
36
|
? await wasmConnector({
|
|
37
|
-
//
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
38
|
+
// @ts-ignore - We might be using a different version of duckdb-wasm than mosaic expects
|
|
38
39
|
duckDb: dbConnector.getDb(),
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
41
|
+
// @ts-ignore - same version mismatch
|
|
39
42
|
connection: dbConnector.getConnection(),
|
|
40
43
|
})
|
|
41
44
|
: createDuckDbMosaicConnector(dbConnector);
|
package/dist/MosaicSlice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicSlice.js","sourceRoot":"","sources":["../src/MosaicSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n isWasmDuckDbConnector,\n type DuckDbConnector,\n type DuckDbSliceState,\n} from '@sqlrooms/duckdb';\nimport {\n BaseRoomStoreState,\n createSlice,\n useBaseRoomStore,\n type SliceFunctions,\n} from '@sqlrooms/room-store';\nimport type {\n ArrowQueryRequest,\n ExecQueryRequest,\n JSONQueryRequest,\n} from '@uwdata/mosaic-core';\nimport {\n Connector,\n Coordinator,\n coordinator,\n makeClient,\n Selection,\n wasmConnector,\n} from '@uwdata/mosaic-core';\nimport {Query} from '@uwdata/mosaic-sql';\nimport type {Table as ArrowTable} from 'apache-arrow';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {\n createMosaicTableFromArrowTable,\n toArrowClientResult,\n} from './tableInterop';\n\nexport const MosaicSliceConfig = z.object({});\nexport type MosaicSliceConfig = z.infer<typeof MosaicSliceConfig>;\n\nexport type MosaicPreAggregateOptions = {\n /** Database schema/namespace for Mosaic pre-aggregate tables. */\n schema?: string;\n /** Enable or disable Mosaic's pre-aggregation optimization. */\n enabled?: boolean;\n};\n\n// Client configuration options\nexport type MosaicClientOptions = {\n /** Unique identifier for this client */\n id?: string;\n /** Selection name for cross-filtering (will create if doesn't exist) */\n selectionName?: string;\n /** The selection to subscribe to for cross-filtering */\n selection?: Selection;\n /** Query builder function that receives the current filter */\n query: (filter: unknown) => ReturnType<typeof Query.from>;\n /** Callback when query results are received */\n queryResult?: (result: ArrowTable) => void;\n /** Callback when query execution fails */\n queryError?: (error: Error) => void;\n};\n\n// Tracked client info\nexport type TrackedClient = {\n id: string;\n client: ReturnType<typeof makeClient>;\n createdAt: number;\n isLoading: boolean;\n data: unknown | null;\n error?: Error;\n selection?: Selection; // Track for change detection\n queryResultCallback?: (result: ArrowTable) => void; // External callback\n};\n\nexport type MosaicSliceState = {\n mosaic: SliceFunctions & {\n connection:\n | {status: 'idle' | 'loading'}\n | {status: 'ready'; connector?: Connector; coordinator: Coordinator}\n | {status: 'error'; error: unknown};\n config: MosaicSliceConfig;\n /** Record of registered clients by id */\n clients: Record<string, TrackedClient>;\n /** Named selections for cross-filtering (e.g., 'brush', 'hover') */\n selections: Record<string, Selection>;\n initialize: () => Promise<void>;\n /** Get or create a named selection for cross-filtering */\n getSelection: (\n name: string,\n type?: 'crossfilter' | 'single' | 'union',\n ) => Selection;\n /** Create a mosaic client and register it */\n createClient: (options: MosaicClientOptions) => string;\n /** Ensure a client exists with given options (idempotent - creates or updates as needed) */\n ensureClient: (\n options: MosaicClientOptions & {\n id: string;\n onQueryResult?: (result: ArrowTable) => void;\n onQueryError?: (error: Error) => void;\n },\n ) => void;\n /** Disconnect and remove a client by id */\n destroyClient: (id: string) => void;\n /** Disconnect all clients (useful for cleanup) */\n destroyAllClients: () => void;\n };\n};\n\nexport function createDefaultMosaicConfig(\n props?: Partial<MosaicSliceConfig>,\n): MosaicSliceConfig {\n return {\n ...props,\n } as MosaicSliceConfig;\n}\n\nexport type CreateMosaicSliceProps = {\n config?: Partial<MosaicSliceConfig>;\n coordinator?: Coordinator;\n preagg?: MosaicPreAggregateOptions;\n};\n\nexport function createMosaicSlice(props: CreateMosaicSliceProps = {}) {\n return createSlice<\n MosaicSliceState,\n BaseRoomStoreState & DuckDbSliceState & MosaicSliceState\n >((set, get, store) => ({\n mosaic: {\n config: createDefaultMosaicConfig(props?.config),\n connection: {status: 'idle'},\n clients: {},\n selections: {},\n\n async initialize() {\n let mosaicConnector: Connector | undefined;\n let resolvedCoordinator!: Coordinator;\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {status: 'loading'};\n }),\n );\n try {\n if (props.coordinator) {\n resolvedCoordinator = props.coordinator;\n applyMosaicPreAggregateOptions(resolvedCoordinator, props.preagg);\n } else {\n const dbConnector = await get().db.getConnector();\n resolvedCoordinator = coordinator();\n mosaicConnector = isWasmDuckDbConnector(dbConnector)\n ? await wasmConnector({\n // @ts-expect-error - We install a different version of duckdb-wasm\n duckDb: dbConnector.getDb(),\n connection: dbConnector.getConnection(),\n })\n : createDuckDbMosaicConnector(dbConnector);\n applyMosaicPreAggregateOptions(resolvedCoordinator, props.preagg);\n resolvedCoordinator.databaseConnector(mosaicConnector);\n }\n } catch (error) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {status: 'error', error};\n }),\n );\n throw error;\n }\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {\n status: 'ready',\n connector: mosaicConnector,\n coordinator: resolvedCoordinator,\n };\n }),\n );\n },\n\n async destroy() {\n get().mosaic.destroyAllClients();\n },\n\n setConfig(config: MosaicSliceConfig) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.config = config;\n }),\n );\n },\n\n getSelection(\n name: string,\n type: 'crossfilter' | 'single' | 'union' = 'crossfilter',\n ) {\n const existing = get().mosaic.selections[name];\n if (existing) return existing;\n\n const selection =\n type === 'crossfilter'\n ? Selection.crossfilter()\n : type === 'single'\n ? Selection.single()\n : Selection.union();\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.selections[name] = selection;\n }),\n );\n return selection;\n },\n\n createClient(options: MosaicClientOptions) {\n const {connection} = get().mosaic;\n if (connection.status !== 'ready') {\n throw new Error('Mosaic connection not ready');\n }\n\n const id = options.id ?? createId();\n\n // Determine which selection to use\n const selection =\n options.selection ??\n (options.selectionName\n ? get().mosaic.getSelection(options.selectionName)\n : undefined);\n\n // Wrap queryResult to update store state AND call external callback\n const wrappedQueryResult = (data: unknown) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.data = data;\n tracked.isLoading = false;\n tracked.error = undefined;\n }\n }),\n );\n // Call external callback if provided\n options.queryResult?.(toArrowClientResult(data));\n };\n const wrappedQueryPending = () => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.isLoading = true;\n tracked.error = undefined;\n }\n }),\n );\n };\n const wrappedQueryError = (error: Error) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.isLoading = false;\n tracked.error = error;\n }\n }),\n );\n client.enabled = false;\n options.queryError?.(error);\n };\n\n const client = makeClient({\n coordinator: connection.coordinator,\n selection,\n query: options.query,\n queryResult: wrappedQueryResult,\n queryPending: wrappedQueryPending,\n queryError: wrappedQueryError,\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients[id] = {\n id,\n client,\n createdAt: Date.now(),\n isLoading: true,\n data: null,\n error: undefined,\n selection,\n queryResultCallback: options.queryResult\n ? (result: unknown) =>\n options.queryResult!(toArrowClientResult(result))\n : undefined,\n };\n }),\n );\n\n return id;\n },\n\n ensureClient(\n options: MosaicClientOptions & {\n id: string;\n onQueryResult?: (result: ArrowTable) => void;\n onQueryError?: (error: Error) => void;\n },\n ) {\n const {connection, clients} = get().mosaic;\n if (connection.status !== 'ready') {\n return; // Silently return if not ready - hook will handle retry\n }\n\n const existing = clients[options.id];\n\n // Determine which selection to use\n const selection =\n options.selection ??\n (options.selectionName\n ? get().mosaic.getSelection(options.selectionName)\n : undefined);\n\n // Check if client exists and selection matches\n // Note: If query or callback changes, we recreate the client to ensure\n // the latest versions are used. This is simpler than trying to update\n // the bound queryResult callback in makeClient.\n if (existing && existing.selection === selection) {\n return; // No-op - client already exists with same selection\n }\n\n // If exists but selection changed, destroy it first\n if (existing) {\n get().mosaic.destroyClient(options.id);\n }\n\n // Create new client with wrapped queryResult that calls both store update and external callback\n const wrappedQueryResult = (data: unknown) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.data = data;\n tracked.isLoading = false;\n tracked.error = undefined;\n }\n }),\n );\n const arrowData = toArrowClientResult(data);\n // Call external callback if provided\n options.onQueryResult?.(arrowData);\n // Also call original queryResult if provided\n options.queryResult?.(arrowData);\n };\n const wrappedQueryPending = () => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.isLoading = true;\n tracked.error = undefined;\n }\n }),\n );\n };\n const wrappedQueryError = (error: Error) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.isLoading = false;\n tracked.error = error;\n }\n }),\n );\n client.enabled = false;\n options.onQueryError?.(error);\n options.queryError?.(error);\n };\n\n const client = makeClient({\n coordinator: connection.coordinator,\n selection,\n query: options.query,\n queryResult: wrappedQueryResult,\n queryPending: wrappedQueryPending,\n queryError: wrappedQueryError,\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients[options.id] = {\n id: options.id,\n client,\n createdAt: Date.now(),\n isLoading: true,\n data: null,\n error: undefined,\n selection,\n queryResultCallback: options.onQueryResult\n ? (result: unknown) =>\n options.onQueryResult!(toArrowClientResult(result))\n : undefined,\n };\n }),\n );\n },\n\n destroyClient(id: string) {\n const {clients} = get().mosaic;\n const tracked = clients[id];\n if (!tracked) return;\n\n tracked.client.destroy();\n\n set((state) =>\n produce(state, (draft) => {\n delete draft.mosaic.clients[id];\n }),\n );\n },\n\n destroyAllClients() {\n const {clients} = get().mosaic;\n Object.values(clients).forEach((tracked) => {\n tracked.client.destroy();\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients = {};\n }),\n );\n },\n },\n }));\n}\n\nfunction applyMosaicPreAggregateOptions(\n mosaicCoordinator: Coordinator,\n options?: MosaicPreAggregateOptions,\n) {\n if (!options) {\n return;\n }\n if (options.schema !== undefined) {\n mosaicCoordinator.preaggregator.schema = options.schema;\n }\n if (options.enabled !== undefined) {\n mosaicCoordinator.preaggregator.enabled = options.enabled;\n }\n}\n\nexport type DuckDbSliceStateWithMosaic = DuckDbSliceState & MosaicSliceState;\n\nexport function useStoreWithMosaic<T>(\n selector: (state: DuckDbSliceStateWithMosaic) => T,\n): T {\n return useBaseRoomStore<BaseRoomStoreState, T>((state) =>\n selector(state as unknown as DuckDbSliceStateWithMosaic),\n );\n}\n\n/**\n * Adapts a {@link DuckDbConnector} to the Mosaic {@link Connector} interface.\n *\n * For `'arrow'` queries the Apache Arrow table returned by the connector is\n * converted via {@link createMosaicTableFromArrowTable} into a flechette\n * `Table`, which is the shape Mosaic consumers expect (with `.toColumns()`).\n * For `'json'` queries, rows are materialized with {@link Array.from} which\n * may have performance/memory implications for very large result sets.\n * The `as any` casts on the return type are an intentional adapter trade-off\n * to satisfy the polymorphic {@link Connector['query']} signature.\n */\nfunction createDuckDbMosaicConnector(connector: DuckDbConnector): Connector {\n return {\n query: (async (\n query: ArrowQueryRequest | ExecQueryRequest | JSONQueryRequest,\n ) => {\n const queryType = query.type ?? 'arrow';\n if (queryType === 'exec') {\n await connector.execute(query.sql);\n return undefined as any;\n }\n if (queryType === 'json') {\n const rows = await connector.queryJson<Record<string, unknown>>(\n query.sql,\n );\n return Array.from(rows) as any;\n }\n if (queryType === 'arrow') {\n const arrowTable = await connector.query(query.sql);\n return createMosaicTableFromArrowTable(arrowTable) as any;\n }\n throw new Error(`Unsupported Mosaic query type \"${queryType}\".`);\n }) as Connector['query'],\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MosaicSlice.js","sourceRoot":"","sources":["../src/MosaicSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n isWasmDuckDbConnector,\n type DuckDbConnector,\n type DuckDbSliceState,\n} from '@sqlrooms/duckdb';\nimport {\n BaseRoomStoreState,\n createSlice,\n useBaseRoomStore,\n type SliceFunctions,\n} from '@sqlrooms/room-store';\nimport type {\n ArrowQueryRequest,\n ExecQueryRequest,\n JSONQueryRequest,\n} from '@uwdata/mosaic-core';\nimport {\n Connector,\n Coordinator,\n coordinator,\n makeClient,\n Selection,\n wasmConnector,\n} from '@uwdata/mosaic-core';\nimport {Query} from '@uwdata/mosaic-sql';\nimport type {Table as ArrowTable} from 'apache-arrow';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {\n createMosaicTableFromArrowTable,\n toArrowClientResult,\n} from './tableInterop';\n\nexport const MosaicSliceConfig = z.object({});\nexport type MosaicSliceConfig = z.infer<typeof MosaicSliceConfig>;\n\nexport type MosaicPreAggregateOptions = {\n /** Database schema/namespace for Mosaic pre-aggregate tables. */\n schema?: string;\n /** Enable or disable Mosaic's pre-aggregation optimization. */\n enabled?: boolean;\n};\n\n// Client configuration options\nexport type MosaicClientOptions = {\n /** Unique identifier for this client */\n id?: string;\n /** Selection name for cross-filtering (will create if doesn't exist) */\n selectionName?: string;\n /** The selection to subscribe to for cross-filtering */\n selection?: Selection;\n /** Query builder function that receives the current filter */\n query: (filter: unknown) => ReturnType<typeof Query.from>;\n /** Callback when query results are received */\n queryResult?: (result: ArrowTable) => void;\n /** Callback when query execution fails */\n queryError?: (error: Error) => void;\n};\n\n// Tracked client info\nexport type TrackedClient = {\n id: string;\n client: ReturnType<typeof makeClient>;\n createdAt: number;\n isLoading: boolean;\n data: unknown | null;\n error?: Error;\n selection?: Selection; // Track for change detection\n queryResultCallback?: (result: ArrowTable) => void; // External callback\n};\n\nexport type MosaicIdleConnection = {status: 'idle'};\nexport type MosaicLoadingConnection = {status: 'loading'};\nexport type MosaicReadyConnection = {\n status: 'ready';\n connector?: Connector;\n coordinator: Coordinator;\n};\nexport type MosaicErrorConnection = {status: 'error'; error: unknown};\n\nexport type MosaicConnection =\n | MosaicIdleConnection\n | MosaicLoadingConnection\n | MosaicReadyConnection\n | MosaicErrorConnection;\n\nexport type MosaicSliceState = {\n mosaic: SliceFunctions & {\n connection: MosaicConnection;\n config: MosaicSliceConfig;\n /** Record of registered clients by id */\n clients: Record<string, TrackedClient>;\n /** Named selections for cross-filtering (e.g., 'brush', 'hover') */\n selections: Record<string, Selection>;\n initialize: () => Promise<void>;\n /** Get or create a named selection for cross-filtering */\n getSelection: (\n name: string,\n type?: 'crossfilter' | 'single' | 'union',\n ) => Selection;\n /** Create a mosaic client and register it */\n createClient: (options: MosaicClientOptions) => string;\n /** Ensure a client exists with given options (idempotent - creates or updates as needed) */\n ensureClient: (\n options: MosaicClientOptions & {\n id: string;\n onQueryResult?: (result: ArrowTable) => void;\n onQueryError?: (error: Error) => void;\n },\n ) => void;\n /** Disconnect and remove a client by id */\n destroyClient: (id: string) => void;\n /** Disconnect all clients (useful for cleanup) */\n destroyAllClients: () => void;\n };\n};\n\nexport function createDefaultMosaicConfig(\n props?: Partial<MosaicSliceConfig>,\n): MosaicSliceConfig {\n return {\n ...props,\n } as MosaicSliceConfig;\n}\n\nexport type CreateMosaicSliceProps = {\n config?: Partial<MosaicSliceConfig>;\n coordinator?: Coordinator;\n preagg?: MosaicPreAggregateOptions;\n};\n\nexport function createMosaicSlice(props: CreateMosaicSliceProps = {}) {\n return createSlice<\n MosaicSliceState,\n BaseRoomStoreState & DuckDbSliceState & MosaicSliceState\n >((set, get, store) => ({\n mosaic: {\n config: createDefaultMosaicConfig(props?.config),\n connection: {status: 'idle'},\n clients: {},\n selections: {},\n\n async initialize() {\n let mosaicConnector: Connector | undefined;\n let resolvedCoordinator!: Coordinator;\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {status: 'loading'};\n }),\n );\n try {\n if (props.coordinator) {\n resolvedCoordinator = props.coordinator;\n applyMosaicPreAggregateOptions(resolvedCoordinator, props.preagg);\n } else {\n const dbConnector = await get().db.getConnector();\n resolvedCoordinator = coordinator();\n mosaicConnector = isWasmDuckDbConnector(dbConnector)\n ? await wasmConnector({\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - We might be using a different version of duckdb-wasm than mosaic expects\n duckDb: dbConnector.getDb(),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - same version mismatch\n connection: dbConnector.getConnection(),\n })\n : createDuckDbMosaicConnector(dbConnector);\n applyMosaicPreAggregateOptions(resolvedCoordinator, props.preagg);\n resolvedCoordinator.databaseConnector(mosaicConnector);\n }\n } catch (error) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {status: 'error', error};\n }),\n );\n throw error;\n }\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.connection = {\n status: 'ready',\n connector: mosaicConnector,\n coordinator: resolvedCoordinator,\n };\n }),\n );\n },\n\n async destroy() {\n get().mosaic.destroyAllClients();\n },\n\n setConfig(config: MosaicSliceConfig) {\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.config = config;\n }),\n );\n },\n\n getSelection(\n name: string,\n type: 'crossfilter' | 'single' | 'union' = 'crossfilter',\n ) {\n const existing = get().mosaic.selections[name];\n if (existing) return existing;\n\n const selection =\n type === 'crossfilter'\n ? Selection.crossfilter()\n : type === 'single'\n ? Selection.single()\n : Selection.union();\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.selections[name] = selection;\n }),\n );\n return selection;\n },\n\n createClient(options: MosaicClientOptions) {\n const {connection} = get().mosaic;\n if (connection.status !== 'ready') {\n throw new Error('Mosaic connection not ready');\n }\n\n const id = options.id ?? createId();\n\n // Determine which selection to use\n const selection =\n options.selection ??\n (options.selectionName\n ? get().mosaic.getSelection(options.selectionName)\n : undefined);\n\n // Wrap queryResult to update store state AND call external callback\n const wrappedQueryResult = (data: unknown) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.data = data;\n tracked.isLoading = false;\n tracked.error = undefined;\n }\n }),\n );\n // Call external callback if provided\n options.queryResult?.(toArrowClientResult(data));\n };\n const wrappedQueryPending = () => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.isLoading = true;\n tracked.error = undefined;\n }\n }),\n );\n };\n const wrappedQueryError = (error: Error) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[id];\n if (tracked) {\n tracked.isLoading = false;\n tracked.error = error;\n }\n }),\n );\n client.enabled = false;\n options.queryError?.(error);\n };\n\n const client = makeClient({\n coordinator: connection.coordinator,\n selection,\n query: options.query,\n queryResult: wrappedQueryResult,\n queryPending: wrappedQueryPending,\n queryError: wrappedQueryError,\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients[id] = {\n id,\n client,\n createdAt: Date.now(),\n isLoading: true,\n data: null,\n error: undefined,\n selection,\n queryResultCallback: options.queryResult\n ? (result: unknown) =>\n options.queryResult!(toArrowClientResult(result))\n : undefined,\n };\n }),\n );\n\n return id;\n },\n\n ensureClient(\n options: MosaicClientOptions & {\n id: string;\n onQueryResult?: (result: ArrowTable) => void;\n onQueryError?: (error: Error) => void;\n },\n ) {\n const {connection, clients} = get().mosaic;\n if (connection.status !== 'ready') {\n return; // Silently return if not ready - hook will handle retry\n }\n\n const existing = clients[options.id];\n\n // Determine which selection to use\n const selection =\n options.selection ??\n (options.selectionName\n ? get().mosaic.getSelection(options.selectionName)\n : undefined);\n\n // Check if client exists and selection matches\n // Note: If query or callback changes, we recreate the client to ensure\n // the latest versions are used. This is simpler than trying to update\n // the bound queryResult callback in makeClient.\n if (existing && existing.selection === selection) {\n return; // No-op - client already exists with same selection\n }\n\n // If exists but selection changed, destroy it first\n if (existing) {\n get().mosaic.destroyClient(options.id);\n }\n\n // Create new client with wrapped queryResult that calls both store update and external callback\n const wrappedQueryResult = (data: unknown) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.data = data;\n tracked.isLoading = false;\n tracked.error = undefined;\n }\n }),\n );\n const arrowData = toArrowClientResult(data);\n // Call external callback if provided\n options.onQueryResult?.(arrowData);\n // Also call original queryResult if provided\n options.queryResult?.(arrowData);\n };\n const wrappedQueryPending = () => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.isLoading = true;\n tracked.error = undefined;\n }\n }),\n );\n };\n const wrappedQueryError = (error: Error) => {\n set((state) =>\n produce(state, (draft) => {\n const tracked = draft.mosaic.clients[options.id];\n if (tracked) {\n tracked.isLoading = false;\n tracked.error = error;\n }\n }),\n );\n client.enabled = false;\n options.onQueryError?.(error);\n options.queryError?.(error);\n };\n\n const client = makeClient({\n coordinator: connection.coordinator,\n selection,\n query: options.query,\n queryResult: wrappedQueryResult,\n queryPending: wrappedQueryPending,\n queryError: wrappedQueryError,\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients[options.id] = {\n id: options.id,\n client,\n createdAt: Date.now(),\n isLoading: true,\n data: null,\n error: undefined,\n selection,\n queryResultCallback: options.onQueryResult\n ? (result: unknown) =>\n options.onQueryResult!(toArrowClientResult(result))\n : undefined,\n };\n }),\n );\n },\n\n destroyClient(id: string) {\n const {clients} = get().mosaic;\n const tracked = clients[id];\n if (!tracked) return;\n\n tracked.client.destroy();\n\n set((state) =>\n produce(state, (draft) => {\n delete draft.mosaic.clients[id];\n }),\n );\n },\n\n destroyAllClients() {\n const {clients} = get().mosaic;\n Object.values(clients).forEach((tracked) => {\n tracked.client.destroy();\n });\n\n set((state) =>\n produce(state, (draft) => {\n draft.mosaic.clients = {};\n }),\n );\n },\n },\n }));\n}\n\nfunction applyMosaicPreAggregateOptions(\n mosaicCoordinator: Coordinator,\n options?: MosaicPreAggregateOptions,\n) {\n if (!options) {\n return;\n }\n if (options.schema !== undefined) {\n mosaicCoordinator.preaggregator.schema = options.schema;\n }\n if (options.enabled !== undefined) {\n mosaicCoordinator.preaggregator.enabled = options.enabled;\n }\n}\n\nexport type DuckDbSliceStateWithMosaic = DuckDbSliceState & MosaicSliceState;\n\nexport function useStoreWithMosaic<T>(\n selector: (state: DuckDbSliceStateWithMosaic) => T,\n): T {\n return useBaseRoomStore<BaseRoomStoreState, T>((state) =>\n selector(state as unknown as DuckDbSliceStateWithMosaic),\n );\n}\n\n/**\n * Adapts a {@link DuckDbConnector} to the Mosaic {@link Connector} interface.\n *\n * For `'arrow'` queries the Apache Arrow table returned by the connector is\n * converted via {@link createMosaicTableFromArrowTable} into a flechette\n * `Table`, which is the shape Mosaic consumers expect (with `.toColumns()`).\n * For `'json'` queries, rows are materialized with {@link Array.from} which\n * may have performance/memory implications for very large result sets.\n * The `as any` casts on the return type are an intentional adapter trade-off\n * to satisfy the polymorphic {@link Connector['query']} signature.\n */\nfunction createDuckDbMosaicConnector(connector: DuckDbConnector): Connector {\n return {\n query: (async (\n query: ArrowQueryRequest | ExecQueryRequest | JSONQueryRequest,\n ) => {\n const queryType = query.type ?? 'arrow';\n if (queryType === 'exec') {\n await connector.execute(query.sql);\n return undefined as any;\n }\n if (queryType === 'json') {\n const rows = await connector.queryJson<Record<string, unknown>>(\n query.sql,\n );\n return Array.from(rows) as any;\n }\n if (queryType === 'arrow') {\n const arrowTable = await connector.query(query.sql);\n return createMosaicTableFromArrowTable(arrowTable) as any;\n }\n throw new Error(`Unsupported Mosaic query type \"${queryType}\".`);\n }) as Connector['query'],\n };\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { MosaicClient, type Selection } from '@uwdata/mosaic-core';
|
|
2
|
+
import type { FilterExpr } from '@uwdata/mosaic-sql';
|
|
3
|
+
export type BoxPlotSummaryRow = {
|
|
4
|
+
category: unknown;
|
|
5
|
+
count: number;
|
|
6
|
+
lowerFence: number;
|
|
7
|
+
median: number;
|
|
8
|
+
q1: number;
|
|
9
|
+
q3: number;
|
|
10
|
+
upperFence: number;
|
|
11
|
+
whiskerHigh: number;
|
|
12
|
+
whiskerLow: number;
|
|
13
|
+
};
|
|
14
|
+
export type BoxPlotOutlierRow = {
|
|
15
|
+
category: unknown;
|
|
16
|
+
value: number;
|
|
17
|
+
};
|
|
18
|
+
export type BoxPlotState = {
|
|
19
|
+
error?: Error;
|
|
20
|
+
isLoading: boolean;
|
|
21
|
+
outliers: BoxPlotOutlierRow[];
|
|
22
|
+
summaries: BoxPlotSummaryRow[];
|
|
23
|
+
yBrush?: [number, number];
|
|
24
|
+
};
|
|
25
|
+
export type BoxPlotClientOptions = {
|
|
26
|
+
onStateChange: (state: BoxPlotState) => void;
|
|
27
|
+
selection: Selection;
|
|
28
|
+
tableName: string;
|
|
29
|
+
x: string;
|
|
30
|
+
y: string;
|
|
31
|
+
};
|
|
32
|
+
export declare function buildBoxPlotQuery(args: {
|
|
33
|
+
filter?: FilterExpr | null;
|
|
34
|
+
tableName: string;
|
|
35
|
+
x: string;
|
|
36
|
+
y: string;
|
|
37
|
+
}): string;
|
|
38
|
+
export declare class BoxPlotClient extends MosaicClient {
|
|
39
|
+
private readonly onStateChange;
|
|
40
|
+
private readonly tableName;
|
|
41
|
+
private readonly x;
|
|
42
|
+
private readonly y;
|
|
43
|
+
private readonly selection;
|
|
44
|
+
private state;
|
|
45
|
+
private destroyed;
|
|
46
|
+
constructor(options: BoxPlotClientOptions);
|
|
47
|
+
get filterStable(): boolean;
|
|
48
|
+
fields(): string[];
|
|
49
|
+
private emitState;
|
|
50
|
+
queryPending(): this;
|
|
51
|
+
query(filter?: FilterExpr | null): string;
|
|
52
|
+
queryResult(data: unknown): this;
|
|
53
|
+
queryError(error: Error): this;
|
|
54
|
+
updateYBrush(extent?: [number, number]): void;
|
|
55
|
+
reset(): void;
|
|
56
|
+
destroy(): void;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=BoxPlotClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoxPlotClient.d.ts","sourceRoot":"","sources":["../../src/boxplot/BoxPlotClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAEZ,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAW,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC7C,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAkFF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,GAAG,MAAM,CAiFT;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgC;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,KAAK,CAIX;IACF,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,oBAAoB;IASzC,IAAa,YAAY,IAAI,OAAO,CAEnC;IAED,MAAM,IAAI,MAAM,EAAE;IAIlB,OAAO,CAAC,SAAS;IAQR,YAAY,IAAI,IAAI;IAKpB,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM;IASzC,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IA0DhC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKvC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAStC,KAAK;IAII,OAAO;CAIjB"}
|