@sqlrooms/mosaic 0.29.0-rc.1 → 0.29.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +161 -2
- package/dist/MosaicChart.d.ts +20 -0
- package/dist/MosaicChart.d.ts.map +1 -0
- package/dist/MosaicChart.js +25 -0
- package/dist/MosaicChart.js.map +1 -0
- package/dist/MosaicChartBuilder.d.ts +67 -0
- package/dist/MosaicChartBuilder.d.ts.map +1 -0
- package/dist/MosaicChartBuilder.js +33 -0
- package/dist/MosaicChartBuilder.js.map +1 -0
- package/dist/MosaicColorLegend.d.ts +18 -0
- package/dist/MosaicColorLegend.d.ts.map +1 -0
- package/dist/MosaicColorLegend.js +117 -0
- package/dist/MosaicColorLegend.js.map +1 -0
- package/dist/MosaicSlice.d.ts +27 -13
- package/dist/MosaicSlice.d.ts.map +1 -1
- package/dist/MosaicSlice.js +140 -42
- package/dist/MosaicSlice.js.map +1 -1
- package/dist/ResponsivePlot.d.ts +23 -0
- package/dist/ResponsivePlot.d.ts.map +1 -0
- package/dist/ResponsivePlot.js +43 -0
- package/dist/ResponsivePlot.js.map +1 -0
- package/dist/VgPlotChart.d.ts +24 -0
- package/dist/VgPlotChart.d.ts.map +1 -1
- package/dist/VgPlotChart.js +127 -21
- package/dist/VgPlotChart.js.map +1 -1
- package/dist/chart-builders/ChartBuilderActions.d.ts +6 -0
- package/dist/chart-builders/ChartBuilderActions.d.ts.map +1 -0
- package/dist/chart-builders/ChartBuilderActions.js +28 -0
- package/dist/chart-builders/ChartBuilderActions.js.map +1 -0
- package/dist/chart-builders/ChartBuilderContent.d.ts +28 -0
- package/dist/chart-builders/ChartBuilderContent.d.ts.map +1 -0
- package/dist/chart-builders/ChartBuilderContent.js +28 -0
- package/dist/chart-builders/ChartBuilderContent.js.map +1 -0
- package/dist/chart-builders/ChartBuilderContext.d.ts +16 -0
- package/dist/chart-builders/ChartBuilderContext.d.ts.map +1 -0
- package/dist/chart-builders/ChartBuilderContext.js +15 -0
- package/dist/chart-builders/ChartBuilderContext.js.map +1 -0
- package/dist/chart-builders/ChartBuilderDialog.d.ts +48 -0
- package/dist/chart-builders/ChartBuilderDialog.d.ts.map +1 -0
- package/dist/chart-builders/ChartBuilderDialog.js +30 -0
- package/dist/chart-builders/ChartBuilderDialog.js.map +1 -0
- package/dist/chart-builders/ChartBuilderFields.d.ts +6 -0
- package/dist/chart-builders/ChartBuilderFields.d.ts.map +1 -0
- package/dist/chart-builders/ChartBuilderFields.js +25 -0
- package/dist/chart-builders/ChartBuilderFields.js.map +1 -0
- package/dist/chart-builders/ChartBuilderRoot.d.ts +27 -0
- package/dist/chart-builders/ChartBuilderRoot.d.ts.map +1 -0
- package/dist/chart-builders/ChartBuilderRoot.js +61 -0
- package/dist/chart-builders/ChartBuilderRoot.js.map +1 -0
- package/dist/chart-builders/ChartBuilderTypeGrid.d.ts +7 -0
- package/dist/chart-builders/ChartBuilderTypeGrid.d.ts.map +1 -0
- package/dist/chart-builders/ChartBuilderTypeGrid.js +23 -0
- package/dist/chart-builders/ChartBuilderTypeGrid.js.map +1 -0
- package/dist/chart-builders/FieldSelectorInput.d.ts +13 -0
- package/dist/chart-builders/FieldSelectorInput.d.ts.map +1 -0
- package/dist/chart-builders/FieldSelectorInput.js +19 -0
- package/dist/chart-builders/FieldSelectorInput.js.map +1 -0
- package/dist/chart-builders/builders.d.ts +34 -0
- package/dist/chart-builders/builders.d.ts.map +1 -0
- package/dist/chart-builders/builders.js +51 -0
- package/dist/chart-builders/builders.js.map +1 -0
- package/dist/chart-builders/chartSpecTitle.d.ts +6 -0
- package/dist/chart-builders/chartSpecTitle.d.ts.map +1 -0
- package/dist/chart-builders/chartSpecTitle.js +8 -0
- package/dist/chart-builders/chartSpecTitle.js.map +1 -0
- package/dist/chart-builders/chartTypeUtils.d.ts +17 -0
- package/dist/chart-builders/chartTypeUtils.d.ts.map +1 -0
- package/dist/chart-builders/chartTypeUtils.js +55 -0
- package/dist/chart-builders/chartTypeUtils.js.map +1 -0
- package/dist/chart-builders/constants.d.ts +7 -0
- package/dist/chart-builders/constants.d.ts.map +1 -0
- package/dist/chart-builders/constants.js +34 -0
- package/dist/chart-builders/constants.js.map +1 -0
- package/dist/chart-builders/createChartBuilderStore.d.ts +11 -0
- package/dist/chart-builders/createChartBuilderStore.d.ts.map +1 -0
- package/dist/chart-builders/createChartBuilderStore.js +26 -0
- package/dist/chart-builders/createChartBuilderStore.js.map +1 -0
- package/dist/chart-builders/describeChartSpecs.d.ts +9 -0
- package/dist/chart-builders/describeChartSpecs.d.ts.map +1 -0
- package/dist/chart-builders/describeChartSpecs.js +41 -0
- package/dist/chart-builders/describeChartSpecs.js.map +1 -0
- package/dist/chart-builders/hooks/useChartFieldForm.d.ts +13 -0
- package/dist/chart-builders/hooks/useChartFieldForm.d.ts.map +1 -0
- package/dist/chart-builders/hooks/useChartFieldForm.js +12 -0
- package/dist/chart-builders/hooks/useChartFieldForm.js.map +1 -0
- package/dist/chart-builders/types.d.ts +23 -0
- package/dist/chart-builders/types.d.ts.map +1 -0
- package/dist/chart-builders/types.js +17 -0
- package/dist/chart-builders/types.js.map +1 -0
- package/dist/chart-types/base-types.d.ts +54 -0
- package/dist/chart-types/base-types.d.ts.map +1 -0
- package/dist/chart-types/base-types.js +6 -0
- package/dist/chart-types/base-types.js.map +1 -0
- package/dist/chart-types/box-plot/definition.d.ts +4 -0
- package/dist/chart-types/box-plot/definition.d.ts.map +1 -0
- package/dist/chart-types/box-plot/definition.js +45 -0
- package/dist/chart-types/box-plot/definition.js.map +1 -0
- package/dist/chart-types/box-plot/index.d.ts +3 -0
- package/dist/chart-types/box-plot/index.d.ts.map +1 -0
- package/dist/chart-types/box-plot/index.js +3 -0
- package/dist/chart-types/box-plot/index.js.map +1 -0
- package/dist/chart-types/box-plot/schema.d.ts +17 -0
- package/dist/chart-types/box-plot/schema.d.ts.map +1 -0
- package/dist/chart-types/box-plot/schema.js +12 -0
- package/dist/chart-types/box-plot/schema.js.map +1 -0
- package/dist/chart-types/bubble-chart/definition.d.ts +4 -0
- package/dist/chart-types/bubble-chart/definition.d.ts.map +1 -0
- package/dist/chart-types/bubble-chart/definition.js +48 -0
- package/dist/chart-types/bubble-chart/definition.js.map +1 -0
- package/dist/chart-types/bubble-chart/index.d.ts +3 -0
- package/dist/chart-types/bubble-chart/index.d.ts.map +1 -0
- package/dist/chart-types/bubble-chart/index.js +3 -0
- package/dist/chart-types/bubble-chart/index.js.map +1 -0
- package/dist/chart-types/bubble-chart/schema.d.ts +17 -0
- package/dist/chart-types/bubble-chart/schema.d.ts.map +1 -0
- package/dist/chart-types/bubble-chart/schema.js +12 -0
- package/dist/chart-types/bubble-chart/schema.js.map +1 -0
- package/dist/chart-types/count-plot/definition.d.ts +4 -0
- package/dist/chart-types/count-plot/definition.d.ts.map +1 -0
- package/dist/chart-types/count-plot/definition.js +50 -0
- package/dist/chart-types/count-plot/definition.js.map +1 -0
- package/dist/chart-types/count-plot/index.d.ts +3 -0
- package/dist/chart-types/count-plot/index.d.ts.map +1 -0
- package/dist/chart-types/count-plot/index.js +3 -0
- package/dist/chart-types/count-plot/index.js.map +1 -0
- package/dist/chart-types/count-plot/schema.d.ts +15 -0
- package/dist/chart-types/count-plot/schema.d.ts.map +1 -0
- package/dist/chart-types/count-plot/schema.js +11 -0
- package/dist/chart-types/count-plot/schema.js.map +1 -0
- package/dist/chart-types/custom-spec/definition.d.ts +4 -0
- package/dist/chart-types/custom-spec/definition.d.ts.map +1 -0
- package/dist/chart-types/custom-spec/definition.js +28 -0
- package/dist/chart-types/custom-spec/definition.js.map +1 -0
- package/dist/chart-types/custom-spec/index.d.ts +3 -0
- package/dist/chart-types/custom-spec/index.d.ts.map +1 -0
- package/dist/chart-types/custom-spec/index.js +3 -0
- package/dist/chart-types/custom-spec/index.js.map +1 -0
- package/dist/chart-types/custom-spec/schema.d.ts +11 -0
- package/dist/chart-types/custom-spec/schema.d.ts.map +1 -0
- package/dist/chart-types/custom-spec/schema.js +9 -0
- package/dist/chart-types/custom-spec/schema.js.map +1 -0
- package/dist/chart-types/ecdf/definition.d.ts +4 -0
- package/dist/chart-types/ecdf/definition.d.ts.map +1 -0
- package/dist/chart-types/ecdf/definition.js +47 -0
- package/dist/chart-types/ecdf/definition.js.map +1 -0
- package/dist/chart-types/ecdf/index.d.ts +3 -0
- package/dist/chart-types/ecdf/index.d.ts.map +1 -0
- package/dist/chart-types/ecdf/index.js +3 -0
- package/dist/chart-types/ecdf/index.js.map +1 -0
- package/dist/chart-types/ecdf/schema.d.ts +15 -0
- package/dist/chart-types/ecdf/schema.d.ts.map +1 -0
- package/dist/chart-types/ecdf/schema.js +11 -0
- package/dist/chart-types/ecdf/schema.js.map +1 -0
- package/dist/chart-types/heatmap/definition.d.ts +4 -0
- package/dist/chart-types/heatmap/definition.d.ts.map +1 -0
- package/dist/chart-types/heatmap/definition.js +49 -0
- package/dist/chart-types/heatmap/definition.js.map +1 -0
- package/dist/chart-types/heatmap/index.d.ts +3 -0
- package/dist/chart-types/heatmap/index.d.ts.map +1 -0
- package/dist/chart-types/heatmap/index.js +3 -0
- package/dist/chart-types/heatmap/index.js.map +1 -0
- package/dist/chart-types/heatmap/schema.d.ts +17 -0
- package/dist/chart-types/heatmap/schema.d.ts.map +1 -0
- package/dist/chart-types/heatmap/schema.js +12 -0
- package/dist/chart-types/heatmap/schema.js.map +1 -0
- package/dist/chart-types/histogram/definition.d.ts +4 -0
- package/dist/chart-types/histogram/definition.d.ts.map +1 -0
- package/dist/chart-types/histogram/definition.js +49 -0
- package/dist/chart-types/histogram/definition.js.map +1 -0
- package/dist/chart-types/histogram/index.d.ts +3 -0
- package/dist/chart-types/histogram/index.d.ts.map +1 -0
- package/dist/chart-types/histogram/index.js +3 -0
- package/dist/chart-types/histogram/index.js.map +1 -0
- package/dist/chart-types/histogram/schema.d.ts +15 -0
- package/dist/chart-types/histogram/schema.d.ts.map +1 -0
- package/dist/chart-types/histogram/schema.js +11 -0
- package/dist/chart-types/histogram/schema.js.map +1 -0
- package/dist/chart-types/index.d.ts +109 -0
- package/dist/chart-types/index.d.ts.map +1 -0
- package/dist/chart-types/index.js +70 -0
- package/dist/chart-types/index.js.map +1 -0
- package/dist/chart-types/line-chart/definition.d.ts +4 -0
- package/dist/chart-types/line-chart/definition.d.ts.map +1 -0
- package/dist/chart-types/line-chart/definition.js +46 -0
- package/dist/chart-types/line-chart/definition.js.map +1 -0
- package/dist/chart-types/line-chart/index.d.ts +3 -0
- package/dist/chart-types/line-chart/index.d.ts.map +1 -0
- package/dist/chart-types/line-chart/index.js +3 -0
- package/dist/chart-types/line-chart/index.js.map +1 -0
- package/dist/chart-types/line-chart/schema.d.ts +17 -0
- package/dist/chart-types/line-chart/schema.d.ts.map +1 -0
- package/dist/chart-types/line-chart/schema.js +12 -0
- package/dist/chart-types/line-chart/schema.js.map +1 -0
- package/dist/chart-types/registry.d.ts +5 -0
- package/dist/chart-types/registry.d.ts.map +1 -0
- package/dist/chart-types/registry.js +28 -0
- package/dist/chart-types/registry.js.map +1 -0
- package/dist/dashboard/DashboardPanelErrorBoundary.d.ts +17 -0
- package/dist/dashboard/DashboardPanelErrorBoundary.d.ts.map +1 -0
- package/dist/dashboard/DashboardPanelErrorBoundary.js +21 -0
- package/dist/dashboard/DashboardPanelErrorBoundary.js.map +1 -0
- package/dist/dashboard/MosaicDashboard.d.ts +18 -0
- package/dist/dashboard/MosaicDashboard.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboard.js +91 -0
- package/dist/dashboard/MosaicDashboard.js.map +1 -0
- package/dist/dashboard/MosaicDashboardContext.d.ts +12 -0
- package/dist/dashboard/MosaicDashboardContext.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardContext.js +10 -0
- package/dist/dashboard/MosaicDashboardContext.js.map +1 -0
- package/dist/dashboard/MosaicDashboardPanel.d.ts +3 -0
- package/dist/dashboard/MosaicDashboardPanel.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardPanel.js +26 -0
- package/dist/dashboard/MosaicDashboardPanel.js.map +1 -0
- package/dist/dashboard/MosaicDashboardPanelDragOverlay.d.ts +8 -0
- package/dist/dashboard/MosaicDashboardPanelDragOverlay.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardPanelDragOverlay.js +17 -0
- package/dist/dashboard/MosaicDashboardPanelDragOverlay.js.map +1 -0
- package/dist/dashboard/MosaicDashboardPanelHeader.d.ts +13 -0
- package/dist/dashboard/MosaicDashboardPanelHeader.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardPanelHeader.js +30 -0
- package/dist/dashboard/MosaicDashboardPanelHeader.js.map +1 -0
- package/dist/dashboard/MosaicDashboardPanelLayout.d.ts +10 -0
- package/dist/dashboard/MosaicDashboardPanelLayout.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardPanelLayout.js +25 -0
- package/dist/dashboard/MosaicDashboardPanelLayout.js.map +1 -0
- package/dist/dashboard/MosaicDashboardPanels.d.ts +2 -0
- package/dist/dashboard/MosaicDashboardPanels.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardPanels.js +52 -0
- package/dist/dashboard/MosaicDashboardPanels.js.map +1 -0
- package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.d.ts +3 -0
- package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.js +32 -0
- package/dist/dashboard/MosaicDashboardProfilerPanelRenderer.js.map +1 -0
- package/dist/dashboard/MosaicDashboardSlice.d.ts +523 -0
- package/dist/dashboard/MosaicDashboardSlice.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardSlice.js +615 -0
- package/dist/dashboard/MosaicDashboardSlice.js.map +1 -0
- package/dist/dashboard/MosaicDashboardToolbar.d.ts +3 -0
- package/dist/dashboard/MosaicDashboardToolbar.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardToolbar.js +81 -0
- package/dist/dashboard/MosaicDashboardToolbar.js.map +1 -0
- package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.d.ts +4 -0
- package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.js +29 -0
- package/dist/dashboard/MosaicDashboardVgPlotHeaderActions.js.map +1 -0
- package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.d.ts +3 -0
- package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.js +68 -0
- package/dist/dashboard/MosaicDashboardVgPlotPanelRenderer.js.map +1 -0
- package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts +8 -0
- package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts.map +1 -0
- package/dist/dashboard/VgPlotSpecPopoverEditor.js +40 -0
- package/dist/dashboard/VgPlotSpecPopoverEditor.js.map +1 -0
- package/dist/dashboard/chart-settings/ChartSettings.d.ts +39 -0
- package/dist/dashboard/chart-settings/ChartSettings.d.ts.map +1 -0
- package/dist/dashboard/chart-settings/ChartSettings.js +90 -0
- package/dist/dashboard/chart-settings/ChartSettings.js.map +1 -0
- package/dist/dashboard/chart-settings/ChartSettingsContext.d.ts +20 -0
- package/dist/dashboard/chart-settings/ChartSettingsContext.d.ts.map +1 -0
- package/dist/dashboard/chart-settings/ChartSettingsContext.js +14 -0
- package/dist/dashboard/chart-settings/ChartSettingsContext.js.map +1 -0
- package/dist/dashboard/chart-settings/ChartSettingsPanel.d.ts +11 -0
- package/dist/dashboard/chart-settings/ChartSettingsPanel.d.ts.map +1 -0
- package/dist/dashboard/chart-settings/ChartSettingsPanel.js +8 -0
- package/dist/dashboard/chart-settings/ChartSettingsPanel.js.map +1 -0
- package/dist/dashboard/chart-settings/ChartTypeSelector.d.ts +11 -0
- package/dist/dashboard/chart-settings/ChartTypeSelector.d.ts.map +1 -0
- package/dist/dashboard/chart-settings/ChartTypeSelector.js +17 -0
- package/dist/dashboard/chart-settings/ChartTypeSelector.js.map +1 -0
- package/dist/dashboard/chart-settings/DynamicChartSettings.d.ts +11 -0
- package/dist/dashboard/chart-settings/DynamicChartSettings.d.ts.map +1 -0
- package/dist/dashboard/chart-settings/DynamicChartSettings.js +19 -0
- package/dist/dashboard/chart-settings/DynamicChartSettings.js.map +1 -0
- package/dist/dashboard/chart-settings/index.d.ts +6 -0
- package/dist/dashboard/chart-settings/index.d.ts.map +1 -0
- package/dist/dashboard/chart-settings/index.js +6 -0
- package/dist/dashboard/chart-settings/index.js.map +1 -0
- package/dist/dashboard/chart-settings/useTableColumns.d.ts +3 -0
- package/dist/dashboard/chart-settings/useTableColumns.d.ts.map +1 -0
- package/dist/dashboard/chart-settings/useTableColumns.js +12 -0
- package/dist/dashboard/chart-settings/useTableColumns.js.map +1 -0
- package/dist/dashboard/defaultPanelRenderers.d.ts +3 -0
- package/dist/dashboard/defaultPanelRenderers.d.ts.map +1 -0
- package/dist/dashboard/defaultPanelRenderers.js +11 -0
- package/dist/dashboard/defaultPanelRenderers.js.map +1 -0
- package/dist/dashboard/generateMosaicChartSpec.d.ts +15 -0
- package/dist/dashboard/generateMosaicChartSpec.d.ts.map +1 -0
- package/dist/dashboard/generateMosaicChartSpec.js +30 -0
- package/dist/dashboard/generateMosaicChartSpec.js.map +1 -0
- package/dist/editor/MosaicChartContainer.d.ts +51 -0
- package/dist/editor/MosaicChartContainer.d.ts.map +1 -0
- package/dist/editor/MosaicChartContainer.js +39 -0
- package/dist/editor/MosaicChartContainer.js.map +1 -0
- package/dist/editor/MosaicChartDisplay.d.ts +18 -0
- package/dist/editor/MosaicChartDisplay.d.ts.map +1 -0
- package/dist/editor/MosaicChartDisplay.js +26 -0
- package/dist/editor/MosaicChartDisplay.js.map +1 -0
- package/dist/editor/MosaicChartEditorActions.d.ts +20 -0
- package/dist/editor/MosaicChartEditorActions.d.ts.map +1 -0
- package/dist/editor/MosaicChartEditorActions.js +18 -0
- package/dist/editor/MosaicChartEditorActions.js.map +1 -0
- package/dist/editor/MosaicCodeMirrorEditor.d.ts +15 -0
- package/dist/editor/MosaicCodeMirrorEditor.d.ts.map +1 -0
- package/dist/editor/MosaicCodeMirrorEditor.js +26 -0
- package/dist/editor/MosaicCodeMirrorEditor.js.map +1 -0
- package/dist/editor/MosaicEditorContext.d.ts +8 -0
- package/dist/editor/MosaicEditorContext.d.ts.map +1 -0
- package/dist/editor/MosaicEditorContext.js +14 -0
- package/dist/editor/MosaicEditorContext.js.map +1 -0
- package/dist/editor/MosaicSpecEditorPanel.d.ts +20 -0
- package/dist/editor/MosaicSpecEditorPanel.d.ts.map +1 -0
- package/dist/editor/MosaicSpecEditorPanel.js +25 -0
- package/dist/editor/MosaicSpecEditorPanel.js.map +1 -0
- package/dist/editor/mosaicSchema.d.ts +20 -0
- package/dist/editor/mosaicSchema.d.ts.map +1 -0
- package/dist/editor/mosaicSchema.js +57 -0
- package/dist/editor/mosaicSchema.js.map +1 -0
- package/dist/editor/types.d.ts +72 -0
- package/dist/editor/types.d.ts.map +1 -0
- package/dist/editor/types.js +2 -0
- package/dist/editor/types.js.map +1 -0
- package/dist/editor/useMosaicChartEditor.d.ts +9 -0
- package/dist/editor/useMosaicChartEditor.d.ts.map +1 -0
- package/dist/editor/useMosaicChartEditor.js +199 -0
- package/dist/editor/useMosaicChartEditor.js.map +1 -0
- package/dist/index.d.ts +53 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -1
- package/dist/index.js.map +1 -1
- package/dist/profiler/MosaicProfiler.d.ts +32 -0
- package/dist/profiler/MosaicProfiler.d.ts.map +1 -0
- package/dist/profiler/MosaicProfiler.js +57 -0
- package/dist/profiler/MosaicProfiler.js.map +1 -0
- package/dist/profiler/MosaicProfilerHeader.d.ts +7 -0
- package/dist/profiler/MosaicProfilerHeader.d.ts.map +1 -0
- package/dist/profiler/MosaicProfilerHeader.js +196 -0
- package/dist/profiler/MosaicProfilerHeader.js.map +1 -0
- package/dist/profiler/MosaicProfilerRows.d.ts +9 -0
- package/dist/profiler/MosaicProfilerRows.d.ts.map +1 -0
- package/dist/profiler/MosaicProfilerRows.js +65 -0
- package/dist/profiler/MosaicProfilerRows.js.map +1 -0
- package/dist/profiler/MosaicProfilerStatusBar.d.ts +9 -0
- package/dist/profiler/MosaicProfilerStatusBar.d.ts.map +1 -0
- package/dist/profiler/MosaicProfilerStatusBar.js +28 -0
- package/dist/profiler/MosaicProfilerStatusBar.js.map +1 -0
- package/dist/profiler/ProfilerCategoryClient.d.ts +50 -0
- package/dist/profiler/ProfilerCategoryClient.d.ts.map +1 -0
- package/dist/profiler/ProfilerCategoryClient.js +121 -0
- package/dist/profiler/ProfilerCategoryClient.js.map +1 -0
- package/dist/profiler/ProfilerCountClient.d.ts +28 -0
- package/dist/profiler/ProfilerCountClient.d.ts.map +1 -0
- package/dist/profiler/ProfilerCountClient.js +51 -0
- package/dist/profiler/ProfilerCountClient.js.map +1 -0
- package/dist/profiler/ProfilerHistogramClient.d.ts +69 -0
- package/dist/profiler/ProfilerHistogramClient.d.ts.map +1 -0
- package/dist/profiler/ProfilerHistogramClient.js +179 -0
- package/dist/profiler/ProfilerHistogramClient.js.map +1 -0
- package/dist/profiler/ProfilerPageClient.d.ts +37 -0
- package/dist/profiler/ProfilerPageClient.d.ts.map +1 -0
- package/dist/profiler/ProfilerPageClient.js +65 -0
- package/dist/profiler/ProfilerPageClient.js.map +1 -0
- package/dist/profiler/ProfilerUnsupportedSummaryClient.d.ts +24 -0
- package/dist/profiler/ProfilerUnsupportedSummaryClient.d.ts.map +1 -0
- package/dist/profiler/ProfilerUnsupportedSummaryClient.js +51 -0
- package/dist/profiler/ProfilerUnsupportedSummaryClient.js.map +1 -0
- package/dist/profiler/createProfilerStore.d.ts +45 -0
- package/dist/profiler/createProfilerStore.d.ts.map +1 -0
- package/dist/profiler/createProfilerStore.js +120 -0
- package/dist/profiler/createProfilerStore.js.map +1 -0
- package/dist/profiler/layout.d.ts +7 -0
- package/dist/profiler/layout.d.ts.map +1 -0
- package/dist/profiler/layout.js +13 -0
- package/dist/profiler/layout.js.map +1 -0
- package/dist/profiler/profilerController.d.ts +64 -0
- package/dist/profiler/profilerController.d.ts.map +1 -0
- package/dist/profiler/profilerController.js +123 -0
- package/dist/profiler/profilerController.js.map +1 -0
- package/dist/profiler/types.d.ts +86 -0
- package/dist/profiler/types.d.ts.map +1 -0
- package/dist/profiler/types.js +2 -0
- package/dist/profiler/types.js.map +1 -0
- package/dist/profiler/useMosaicProfiler.d.ts +7 -0
- package/dist/profiler/useMosaicProfiler.d.ts.map +1 -0
- package/dist/profiler/useMosaicProfiler.js +339 -0
- package/dist/profiler/useMosaicProfiler.js.map +1 -0
- package/dist/profiler/utils.d.ts +61 -0
- package/dist/profiler/utils.d.ts.map +1 -0
- package/dist/profiler/utils.js +347 -0
- package/dist/profiler/utils.js.map +1 -0
- package/dist/tableInterop.d.ts +30 -0
- package/dist/tableInterop.d.ts.map +1 -0
- package/dist/tableInterop.js +85 -0
- package/dist/tableInterop.js.map +1 -0
- package/dist/useMosaicClient.d.ts +5 -15
- package/dist/useMosaicClient.d.ts.map +1 -1
- package/dist/useMosaicClient.js +22 -6
- package/dist/useMosaicClient.js.map +1 -1
- package/package.json +30 -6
package/README.md
CHANGED
|
@@ -41,6 +41,36 @@ export const {roomStore, useRoomStore} = createRoomStore<RoomState>(
|
|
|
41
41
|
);
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
+
Mosaic's pre-aggregation optimization creates `preagg_*` cache tables lazily
|
|
45
|
+
when users interact with cross-filtered selections. By default Mosaic writes
|
|
46
|
+
those tables to the persistent `mosaic` schema. If the DuckDB database is a user
|
|
47
|
+
project file, point pre-aggregates at an attached cache database or disable them:
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
const mosaicCacheDatabase = '__sqlrooms_mosaic_cache';
|
|
51
|
+
|
|
52
|
+
const connector = createWebSocketDuckDbConnector({
|
|
53
|
+
initializationQuery: [
|
|
54
|
+
`ATTACH IF NOT EXISTS ':memory:' AS ${mosaicCacheDatabase}`,
|
|
55
|
+
`CREATE SCHEMA IF NOT EXISTS ${mosaicCacheDatabase}.mosaic`,
|
|
56
|
+
].join('; '),
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
export const {roomStore, useRoomStore} = createRoomStore<RoomState>(
|
|
60
|
+
(set, get, store) => ({
|
|
61
|
+
// ... db slice using connector
|
|
62
|
+
...createMosaicSlice({
|
|
63
|
+
preagg: {
|
|
64
|
+
schema: `${mosaicCacheDatabase}.mosaic`,
|
|
65
|
+
},
|
|
66
|
+
})(set, get, store),
|
|
67
|
+
}),
|
|
68
|
+
);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Set `preagg.enabled` to `false` when you prefer to avoid pre-aggregate tables
|
|
72
|
+
entirely.
|
|
73
|
+
|
|
44
74
|
The Mosaic connection is automatically initialized when the DuckDB connector is ready. You can check the connection status:
|
|
45
75
|
|
|
46
76
|
```tsx
|
|
@@ -68,10 +98,9 @@ The `useMosaicClient` hook creates a Mosaic client that automatically queries da
|
|
|
68
98
|
|
|
69
99
|
```tsx
|
|
70
100
|
import {Query, useMosaicClient} from '@sqlrooms/mosaic';
|
|
71
|
-
import {Table} from 'apache-arrow';
|
|
72
101
|
|
|
73
102
|
function MapView() {
|
|
74
|
-
const {data, isLoading, client} = useMosaicClient
|
|
103
|
+
const {data, isLoading, client} = useMosaicClient({
|
|
75
104
|
selectionName: 'brush', // Named selection for cross-filtering
|
|
76
105
|
query: (filter: any) => {
|
|
77
106
|
return Query.from('earthquakes')
|
|
@@ -89,6 +118,11 @@ function MapView() {
|
|
|
89
118
|
}
|
|
90
119
|
```
|
|
91
120
|
|
|
121
|
+
`useMosaicClient` returns an Apache Arrow table. Mosaic still uses its native
|
|
122
|
+
table runtime internally, but that detail is hidden at the hook boundary so
|
|
123
|
+
custom SQLRooms views can work with the same Arrow shape used by the DuckDB and
|
|
124
|
+
deck packages.
|
|
125
|
+
|
|
92
126
|
The hook accepts the following options:
|
|
93
127
|
|
|
94
128
|
- `id` - Optional unique identifier for this client (auto-generated if not provided)
|
|
@@ -98,6 +132,131 @@ The hook accepts the following options:
|
|
|
98
132
|
- `queryResult` - Optional callback when query results are received
|
|
99
133
|
- `enabled` - Whether to automatically connect when mosaic is ready (default: `true`)
|
|
100
134
|
|
|
135
|
+
### Mosaic Profiler Primitives
|
|
136
|
+
|
|
137
|
+
The profiler primitives let you build a Quake-style cross-filtered table with
|
|
138
|
+
per-column summaries on top of `MosaicSlice`.
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
import {MosaicProfiler} from '@sqlrooms/mosaic';
|
|
142
|
+
import {ScrollArea} from '@sqlrooms/ui';
|
|
143
|
+
import {useMemo} from 'react';
|
|
144
|
+
import {useRoomStore} from './store';
|
|
145
|
+
|
|
146
|
+
function EarthquakeProfiler() {
|
|
147
|
+
const mosaic = useRoomStore((state) => state.mosaic);
|
|
148
|
+
const brush = useMemo(() => mosaic.getSelection('brush'), [mosaic]);
|
|
149
|
+
|
|
150
|
+
return (
|
|
151
|
+
<MosaicProfiler tableName="earthquakes" selection={brush} pageSize={25}>
|
|
152
|
+
<div className="flex min-h-0 flex-col border">
|
|
153
|
+
<ScrollArea className="min-h-0 flex-1">
|
|
154
|
+
<MosaicProfiler.Table>
|
|
155
|
+
<MosaicProfiler.Header />
|
|
156
|
+
<MosaicProfiler.Rows />
|
|
157
|
+
</MosaicProfiler.Table>
|
|
158
|
+
</ScrollArea>
|
|
159
|
+
<MosaicProfiler.StatusBar />
|
|
160
|
+
</div>
|
|
161
|
+
</MosaicProfiler>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
For the common case, prefer the compound `MosaicProfiler` API. `useMosaicProfiler`
|
|
167
|
+
is still available when you need direct access to the profiler state for custom
|
|
168
|
+
layout, sizing, or advanced composition.
|
|
169
|
+
|
|
170
|
+
### Mosaic Dashboard Panels
|
|
171
|
+
|
|
172
|
+
`MosaicDashboard` is a compound dashboard surface backed by generic dashboard
|
|
173
|
+
panels instead of a chart-only list. Configure supported panel renderers and
|
|
174
|
+
runtime add-panel actions when creating the dashboard slice.
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
import {
|
|
178
|
+
createDefaultMosaicDashboardPanelRenderers,
|
|
179
|
+
createMosaicDashboardProfilerPanelConfig,
|
|
180
|
+
createMosaicDashboardSlice,
|
|
181
|
+
createMosaicDashboardVgPlotPanelConfig,
|
|
182
|
+
MosaicDashboard,
|
|
183
|
+
} from '@sqlrooms/mosaic';
|
|
184
|
+
|
|
185
|
+
const dashboardSlice = createMosaicDashboardSlice({
|
|
186
|
+
panelRenderers: createDefaultMosaicDashboardPanelRenderers(),
|
|
187
|
+
// Optional: pass chartTypes/chartBuilders to customize Add Chart.
|
|
188
|
+
// Optional: pass addPanelActions to add app-specific menu entries.
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
function Dashboard() {
|
|
192
|
+
return <MosaicDashboard dashboardId="main" />;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function addProfiler(store: RoomStore) {
|
|
196
|
+
store.getState().mosaicDashboard.addPanel(
|
|
197
|
+
'main',
|
|
198
|
+
createMosaicDashboardProfilerPanelConfig({
|
|
199
|
+
source: {tableName: 'earthquakes'},
|
|
200
|
+
}),
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Dashboards have a creation-time `layoutType` of either `dock` or `grid`.
|
|
206
|
+
Existing persisted dashboards default to `dock`; pass `'grid'` to
|
|
207
|
+
`createDashboard(title, 'grid')` or `ensureDashboard(id, title, 'grid')` when
|
|
208
|
+
creating a dashboard that should use the scrollable grid renderer. Re-ensuring
|
|
209
|
+
an existing dashboard does not convert between layout types.
|
|
210
|
+
|
|
211
|
+
Dashboard panel sources may specify a `tableName` or trusted `sqlQuery`; when a
|
|
212
|
+
panel omits a source it falls back to the dashboard selected table. Panel renderer
|
|
213
|
+
definitions and chart builder definitions are runtime-only and intentionally
|
|
214
|
+
live outside persisted dashboard config.
|
|
215
|
+
|
|
216
|
+
### Chart Builder Compound Components
|
|
217
|
+
|
|
218
|
+
The chart builder UI can be used as a compound component API for flexible composition:
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
import {
|
|
222
|
+
ChartBuilderRoot,
|
|
223
|
+
ChartBuilderTrigger,
|
|
224
|
+
ChartBuilderDialogContent,
|
|
225
|
+
ChartBuilderContent,
|
|
226
|
+
} from '@sqlrooms/mosaic';
|
|
227
|
+
|
|
228
|
+
function MyDashboard() {
|
|
229
|
+
const columns = [...]; // Your table columns
|
|
230
|
+
|
|
231
|
+
return (
|
|
232
|
+
<ChartBuilderRoot
|
|
233
|
+
tableName="earthquakes"
|
|
234
|
+
columns={columns}
|
|
235
|
+
onCreateChart={(spec, title) => {
|
|
236
|
+
// Handle chart creation
|
|
237
|
+
}}
|
|
238
|
+
>
|
|
239
|
+
<ChartBuilderTrigger />
|
|
240
|
+
<ChartBuilderDialogContent>
|
|
241
|
+
<ChartBuilderContent />
|
|
242
|
+
</ChartBuilderDialogContent>
|
|
243
|
+
</ChartBuilderRoot>
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Available compound components:
|
|
249
|
+
|
|
250
|
+
- `ChartBuilderRoot` - Context provider and dialog wrapper
|
|
251
|
+
- `ChartBuilderTrigger` - Button to open the dialog
|
|
252
|
+
- `ChartBuilderDialogContent` - Dialog content wrapper
|
|
253
|
+
- `ChartBuilderContent` - Main chart builder UI (type grid + fields + actions)
|
|
254
|
+
- `ChartBuilderTypeGrid` - Chart type selector grid
|
|
255
|
+
- `ChartBuilderFields` - Field selector inputs
|
|
256
|
+
- `ChartBuilderActions` - Back/Create buttons
|
|
257
|
+
|
|
258
|
+
For simpler use cases, the legacy `ChartBuilderDialog` component is still available but deprecated.
|
|
259
|
+
|
|
101
260
|
### Working with Selections
|
|
102
261
|
|
|
103
262
|
Selections enable cross-filtering between multiple visualizations. You can get or create a named selection from the store:
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compound component for composable Mosaic chart editing.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* <MosaicChart.Container spec={mySpec} onSpecChange={save}>
|
|
7
|
+
* <MosaicChart.Display />
|
|
8
|
+
* <MosaicChart.SpecEditor />
|
|
9
|
+
* <MosaicChart.Actions />
|
|
10
|
+
* </MosaicChart.Container>
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare const MosaicChart: {
|
|
14
|
+
readonly Container: import("react").FC<import(".").MosaicChartContainerProps>;
|
|
15
|
+
readonly Display: import("react").FC<import(".").MosaicChartDisplayProps>;
|
|
16
|
+
readonly SpecEditor: import("react").FC<import(".").MosaicSpecEditorPanelProps>;
|
|
17
|
+
readonly Actions: import("react").FC<import(".").MosaicChartEditorActionsProps>;
|
|
18
|
+
readonly CodeMirrorEditor: import("react").FC<import(".").MosaicCodeMirrorEditorProps>;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=MosaicChart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MosaicChart.d.ts","sourceRoot":"","sources":["../src/MosaicChart.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { MosaicChartContainer } from './editor/MosaicChartContainer';
|
|
2
|
+
import { MosaicChartDisplay } from './editor/MosaicChartDisplay';
|
|
3
|
+
import { MosaicSpecEditorPanel } from './editor/MosaicSpecEditorPanel';
|
|
4
|
+
import { MosaicChartEditorActions } from './editor/MosaicChartEditorActions';
|
|
5
|
+
import { MosaicCodeMirrorEditor } from './editor/MosaicCodeMirrorEditor';
|
|
6
|
+
/**
|
|
7
|
+
* Compound component for composable Mosaic chart editing.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* <MosaicChart.Container spec={mySpec} onSpecChange={save}>
|
|
12
|
+
* <MosaicChart.Display />
|
|
13
|
+
* <MosaicChart.SpecEditor />
|
|
14
|
+
* <MosaicChart.Actions />
|
|
15
|
+
* </MosaicChart.Container>
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export const MosaicChart = {
|
|
19
|
+
Container: MosaicChartContainer,
|
|
20
|
+
Display: MosaicChartDisplay,
|
|
21
|
+
SpecEditor: MosaicSpecEditorPanel,
|
|
22
|
+
Actions: MosaicChartEditorActions,
|
|
23
|
+
CodeMirrorEditor: MosaicCodeMirrorEditor,
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=MosaicChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MosaicChart.js","sourceRoot":"","sources":["../src/MosaicChart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAC,kBAAkB,EAAC,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAC,wBAAwB,EAAC,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAC,sBAAsB,EAAC,MAAM,iCAAiC,CAAC;AAEvE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,SAAS,EAAE,oBAAoB;IAC/B,OAAO,EAAE,kBAAkB;IAC3B,UAAU,EAAE,qBAAqB;IACjC,OAAO,EAAE,wBAAwB;IACjC,gBAAgB,EAAE,sBAAsB;CAChC,CAAC","sourcesContent":["import {MosaicChartContainer} from './editor/MosaicChartContainer';\nimport {MosaicChartDisplay} from './editor/MosaicChartDisplay';\nimport {MosaicSpecEditorPanel} from './editor/MosaicSpecEditorPanel';\nimport {MosaicChartEditorActions} from './editor/MosaicChartEditorActions';\nimport {MosaicCodeMirrorEditor} from './editor/MosaicCodeMirrorEditor';\n\n/**\n * Compound component for composable Mosaic chart editing.\n *\n * @example\n * ```tsx\n * <MosaicChart.Container spec={mySpec} onSpecChange={save}>\n * <MosaicChart.Display />\n * <MosaicChart.SpecEditor />\n * <MosaicChart.Actions />\n * </MosaicChart.Container>\n * ```\n */\nexport const MosaicChart = {\n Container: MosaicChartContainer,\n Display: MosaicChartDisplay,\n SpecEditor: MosaicSpecEditorPanel,\n Actions: MosaicChartEditorActions,\n CodeMirrorEditor: MosaicCodeMirrorEditor,\n} as const;\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import { mosaicChartBuilders } from './chart-builders/builders';
|
|
3
|
+
import { mosaicChartTypes } from './chart-types';
|
|
4
|
+
import { ChartBuilderActions } from './chart-builders/ChartBuilderActions';
|
|
5
|
+
import { ChartBuilderContent } from './chart-builders/ChartBuilderContent';
|
|
6
|
+
import { ChartBuilderDialog, ChartBuilderDialogContent, ChartBuilderTrigger } from './chart-builders/ChartBuilderDialog';
|
|
7
|
+
import { ChartBuilderRoot, type ChartBuilderRootProps } from './chart-builders/ChartBuilderRoot';
|
|
8
|
+
import { ChartBuilderFields } from './chart-builders/ChartBuilderFields';
|
|
9
|
+
import { ChartBuilderTypeGrid } from './chart-builders/ChartBuilderTypeGrid';
|
|
10
|
+
import { FieldSelectorInput } from './chart-builders/FieldSelectorInput';
|
|
11
|
+
/**
|
|
12
|
+
* Compound component for building Mosaic charts from templates.
|
|
13
|
+
*
|
|
14
|
+
* Use `<MosaicChartBuilder>` as the root; it provides context and wraps a
|
|
15
|
+
* Radix Dialog.
|
|
16
|
+
*
|
|
17
|
+
* @example Compound usage (recommended)
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <MosaicChartBuilder
|
|
20
|
+
* tableName="my_table"
|
|
21
|
+
* columns={columns}
|
|
22
|
+
* onCreateChart={handleCreate}
|
|
23
|
+
* >
|
|
24
|
+
* <MosaicChartBuilder.Trigger />
|
|
25
|
+
* <MosaicChartBuilder.Dialog />
|
|
26
|
+
* </MosaicChartBuilder>
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example Custom trigger button
|
|
30
|
+
* ```tsx
|
|
31
|
+
* <MosaicChartBuilder
|
|
32
|
+
* tableName="my_table"
|
|
33
|
+
* columns={columns}
|
|
34
|
+
* onCreateChart={handleCreate}
|
|
35
|
+
* >
|
|
36
|
+
* <MosaicChartBuilder.Trigger variant="ghost" size="icon">
|
|
37
|
+
* <PlusIcon />
|
|
38
|
+
* </MosaicChartBuilder.Trigger>
|
|
39
|
+
* <MosaicChartBuilder.Dialog />
|
|
40
|
+
* </MosaicChartBuilder>
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @example Inline builder (no dialog)
|
|
44
|
+
* ```tsx
|
|
45
|
+
* <MosaicChartBuilder.Content
|
|
46
|
+
* tableName="my_table"
|
|
47
|
+
* columns={columns}
|
|
48
|
+
* onCreateChart={handleCreate}
|
|
49
|
+
* />
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
type MosaicChartBuilderCompoundComponent = ((props: ChartBuilderRootProps) => ReactElement) & {
|
|
53
|
+
Root: typeof ChartBuilderRoot;
|
|
54
|
+
chartTypes: typeof mosaicChartTypes;
|
|
55
|
+
chartBuilders: typeof mosaicChartBuilders;
|
|
56
|
+
Trigger: typeof ChartBuilderTrigger;
|
|
57
|
+
Dialog: typeof ChartBuilderDialogContent;
|
|
58
|
+
Content: typeof ChartBuilderContent;
|
|
59
|
+
TypeGrid: typeof ChartBuilderTypeGrid;
|
|
60
|
+
Fields: typeof ChartBuilderFields;
|
|
61
|
+
Actions: typeof ChartBuilderActions;
|
|
62
|
+
FieldSelector: typeof FieldSelectorInput;
|
|
63
|
+
LegacyDialog: typeof ChartBuilderDialog;
|
|
64
|
+
};
|
|
65
|
+
export declare const MosaicChartBuilder: MosaicChartBuilderCompoundComponent;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=MosaicChartBuilder.d.ts.map
|
|
@@ -0,0 +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,2BAA2B,CAAC;AAC9D,OAAO,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAC/C,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,UAAU,EAAE,OAAO,gBAAgB,CAAC;IACpC,aAAa,EAAE,OAAO,mBAAmB,CAAC;IAC1C,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,mCA0B9B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { mosaicChartBuilders } from './chart-builders/builders';
|
|
2
|
+
import { mosaicChartTypes } from './chart-types';
|
|
3
|
+
import { ChartBuilderActions } from './chart-builders/ChartBuilderActions';
|
|
4
|
+
import { ChartBuilderContent } from './chart-builders/ChartBuilderContent';
|
|
5
|
+
import { ChartBuilderDialog, ChartBuilderDialogContent, ChartBuilderTrigger, } from './chart-builders/ChartBuilderDialog';
|
|
6
|
+
import { ChartBuilderRoot, } from './chart-builders/ChartBuilderRoot';
|
|
7
|
+
import { ChartBuilderFields } from './chart-builders/ChartBuilderFields';
|
|
8
|
+
import { ChartBuilderTypeGrid } from './chart-builders/ChartBuilderTypeGrid';
|
|
9
|
+
import { FieldSelectorInput } from './chart-builders/FieldSelectorInput';
|
|
10
|
+
export const MosaicChartBuilder = Object.assign(ChartBuilderRoot, {
|
|
11
|
+
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
|
+
/** Default trigger button; customize via ButtonProps or children. */
|
|
17
|
+
Trigger: ChartBuilderTrigger,
|
|
18
|
+
/** Dialog content pane with chart-builder steps. */
|
|
19
|
+
Dialog: ChartBuilderDialogContent,
|
|
20
|
+
/** Standalone builder UI (no dialog wrapper). */
|
|
21
|
+
Content: ChartBuilderContent,
|
|
22
|
+
/** Built-in chart-type picker grid. */
|
|
23
|
+
TypeGrid: ChartBuilderTypeGrid,
|
|
24
|
+
/** Field selectors for the currently selected chart type. */
|
|
25
|
+
Fields: ChartBuilderFields,
|
|
26
|
+
/** Back/Create actions for the current chart type selection. */
|
|
27
|
+
Actions: ChartBuilderActions,
|
|
28
|
+
/** Field selector primitive. */
|
|
29
|
+
FieldSelector: FieldSelectorInput,
|
|
30
|
+
/** Legacy one-shot dialog (backward-compatible). */
|
|
31
|
+
LegacyDialog: ChartBuilderDialog,
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=MosaicChartBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MosaicChartBuilder.js","sourceRoot":"","sources":["../src/MosaicChartBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,mBAAmB,EAAC,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAC/C,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;AA4DvE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,MAAM,CAAC,MAAM,CACX,gBAAkE,EAClE;IACE,IAAI,EAAE,gBAAgB;IACtB,6CAA6C;IAC7C,UAAU,EAAE,gBAAgB;IAC5B,oEAAoE;IACpE,aAAa,EAAE,mBAAmB;IAClC,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 {mosaicChartBuilders} from './chart-builders/builders';\nimport {mosaicChartTypes} from './chart-types';\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 chartTypes: typeof mosaicChartTypes;\n chartBuilders: typeof mosaicChartBuilders;\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 /** Named built-in chart-type definitions. */\n chartTypes: mosaicChartTypes,\n /** Named built-in chart templates (same objects as default set). */\n chartBuilders: mosaicChartBuilders,\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"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ColorScaleConfig } from '@sqlrooms/color-scales';
|
|
2
|
+
import { Selection } from '@uwdata/mosaic-core';
|
|
3
|
+
type LegendDomainValue = string | number | Date;
|
|
4
|
+
type CreateMosaicColorLegendPlotOptions = {
|
|
5
|
+
colorScale: ColorScaleConfig;
|
|
6
|
+
selection?: Selection;
|
|
7
|
+
domain?: ReadonlyArray<LegendDomainValue>;
|
|
8
|
+
title?: string;
|
|
9
|
+
width?: number;
|
|
10
|
+
tickFormat?: string;
|
|
11
|
+
};
|
|
12
|
+
export type MosaicColorLegendProps = CreateMosaicColorLegendPlotOptions & {
|
|
13
|
+
className?: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function createMosaicColorLegendPlot({ colorScale, selection, domain, title, width, tickFormat, }: CreateMosaicColorLegendPlotOptions): any;
|
|
16
|
+
export declare function MosaicColorLegend({ colorScale, selection, domain, title, width, tickFormat, className, }: MosaicColorLegendProps): import("react/jsx-runtime").JSX.Element | null;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=MosaicColorLegend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MosaicColorLegend.d.ts","sourceRoot":"","sources":["../src/MosaicColorLegend.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAG7D,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAK9C,KAAK,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAEhD,KAAK,kCAAkC,GAAG;IACxC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,kCAAkC,GAAG;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAuDF,wBAAgB,2BAA2B,CAAC,EAC1C,UAAU,EACV,SAAS,EACT,MAAM,EACN,KAAK,EACL,KAAW,EACX,UAAkB,GACnB,EAAE,kCAAkC,OAiDpC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,SAAS,EACT,MAAM,EACN,KAAK,EACL,KAAK,EACL,UAAU,EACV,SAAS,GACV,EAAE,sBAAsB,kDAgDxB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { resolveColorLegendTitle } from '@sqlrooms/color-scales';
|
|
3
|
+
import { cn, getResolvedTheme, useTheme } from '@sqlrooms/ui';
|
|
4
|
+
import * as vg from '@uwdata/vgplot';
|
|
5
|
+
import { useMemo } from 'react';
|
|
6
|
+
import { VgPlotChart } from './VgPlotChart';
|
|
7
|
+
function isExplicitNumericDomain(domain) {
|
|
8
|
+
return domain !== 'auto';
|
|
9
|
+
}
|
|
10
|
+
function resolveLegendDomain(colorScale, domain) {
|
|
11
|
+
if ((colorScale.type === 'sequential' ||
|
|
12
|
+
colorScale.type === 'diverging' ||
|
|
13
|
+
colorScale.type === 'quantize') &&
|
|
14
|
+
isExplicitNumericDomain(colorScale.domain)) {
|
|
15
|
+
return colorScale.domain;
|
|
16
|
+
}
|
|
17
|
+
return domain;
|
|
18
|
+
}
|
|
19
|
+
function getVgColorScaleType(colorScale) {
|
|
20
|
+
switch (colorScale.type) {
|
|
21
|
+
case 'sequential':
|
|
22
|
+
return 'linear';
|
|
23
|
+
case 'diverging':
|
|
24
|
+
return 'diverging';
|
|
25
|
+
case 'quantize':
|
|
26
|
+
return 'quantize';
|
|
27
|
+
case 'quantile':
|
|
28
|
+
return 'quantile';
|
|
29
|
+
case 'threshold':
|
|
30
|
+
return 'threshold';
|
|
31
|
+
case 'categorical':
|
|
32
|
+
return 'categorical';
|
|
33
|
+
default: {
|
|
34
|
+
const _exhaustive = colorScale;
|
|
35
|
+
throw new Error(`Unknown color scale type: ${_exhaustive.type}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function supportsInteractiveLegend(colorScale) {
|
|
40
|
+
return (colorScale.type === 'sequential' ||
|
|
41
|
+
colorScale.type === 'diverging' ||
|
|
42
|
+
colorScale.type === 'categorical');
|
|
43
|
+
}
|
|
44
|
+
export function createMosaicColorLegendPlot({ colorScale, selection, domain, title, width = 220, tickFormat = '.1f', }) {
|
|
45
|
+
const resolvedDomain = resolveLegendDomain(colorScale, domain);
|
|
46
|
+
const legendTitle = resolveColorLegendTitle(colorScale, title);
|
|
47
|
+
const plotAttributes = [
|
|
48
|
+
vg.colorScale(getVgColorScaleType(colorScale)),
|
|
49
|
+
vg.colorScheme(colorScale.scheme),
|
|
50
|
+
vg.colorLabel(legendTitle),
|
|
51
|
+
vg.marginTop(0),
|
|
52
|
+
vg.marginRight(0),
|
|
53
|
+
vg.marginBottom(0),
|
|
54
|
+
vg.marginLeft(0),
|
|
55
|
+
];
|
|
56
|
+
if ('clamp' in colorScale && colorScale.clamp !== undefined) {
|
|
57
|
+
plotAttributes.push(vg.colorClamp(colorScale.clamp));
|
|
58
|
+
}
|
|
59
|
+
if ('reverse' in colorScale && colorScale.reverse !== undefined) {
|
|
60
|
+
plotAttributes.push(vg.colorReverse(colorScale.reverse));
|
|
61
|
+
}
|
|
62
|
+
if (colorScale.type === 'diverging') {
|
|
63
|
+
if (Array.isArray(resolvedDomain) && resolvedDomain.length === 3) {
|
|
64
|
+
plotAttributes.push(vg.colorDomain([resolvedDomain[0], resolvedDomain[2]]), vg.colorPivot(resolvedDomain[1]));
|
|
65
|
+
}
|
|
66
|
+
else if (Array.isArray(resolvedDomain) && resolvedDomain.length === 2) {
|
|
67
|
+
plotAttributes.push(vg.colorDomain(resolvedDomain));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (colorScale.type === 'threshold') {
|
|
71
|
+
plotAttributes.push(vg.colorDomain(colorScale.thresholds));
|
|
72
|
+
}
|
|
73
|
+
else if (resolvedDomain) {
|
|
74
|
+
plotAttributes.push(vg.colorDomain(resolvedDomain));
|
|
75
|
+
}
|
|
76
|
+
if (colorScale.type === 'quantize' || colorScale.type === 'quantile') {
|
|
77
|
+
plotAttributes.push(vg.colorN(colorScale.bins ?? 5));
|
|
78
|
+
}
|
|
79
|
+
const backingPlot = vg.plot(...plotAttributes);
|
|
80
|
+
return vg.colorLegend({
|
|
81
|
+
for: backingPlot,
|
|
82
|
+
as: supportsInteractiveLegend(colorScale) ? selection : undefined,
|
|
83
|
+
field: colorScale.field,
|
|
84
|
+
width,
|
|
85
|
+
tickFormat,
|
|
86
|
+
label: legendTitle,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
export function MosaicColorLegend({ colorScale, selection, domain, title, width, tickFormat, className, }) {
|
|
90
|
+
const { theme } = useTheme();
|
|
91
|
+
const resolvedTheme = getResolvedTheme(theme);
|
|
92
|
+
const legendSpecKey = JSON.stringify({
|
|
93
|
+
colorScale,
|
|
94
|
+
domain,
|
|
95
|
+
title,
|
|
96
|
+
width,
|
|
97
|
+
tickFormat,
|
|
98
|
+
});
|
|
99
|
+
// eslint-disable-next-line react-hooks/preserve-manual-memoization
|
|
100
|
+
const plot = useMemo(() => createMosaicColorLegendPlot({
|
|
101
|
+
colorScale,
|
|
102
|
+
selection,
|
|
103
|
+
domain,
|
|
104
|
+
title,
|
|
105
|
+
width,
|
|
106
|
+
tickFormat,
|
|
107
|
+
}),
|
|
108
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- deep-equal via serialized key instead of object refs
|
|
109
|
+
[legendSpecKey, selection]);
|
|
110
|
+
if (!plot) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return (_jsx("div", { className: cn('pointer-events-auto rounded-md border px-3 py-2 shadow-lg backdrop-blur-sm', 'border-slate-200 bg-white/95 text-slate-900', 'dark:border-slate-700 dark:bg-[#1f1d1b]/90 dark:text-slate-100', '[&_svg]:block [&_svg]:overflow-visible', '[&_svg_line]:stroke-current [&_svg_path]:stroke-current [&_svg_text]:fill-current', resolvedTheme === 'dark' &&
|
|
114
|
+
'[&_svg_.domain]:stroke-slate-500 [&_svg_line]:stroke-slate-500', resolvedTheme === 'light' &&
|
|
115
|
+
'[&_svg_.domain]:stroke-slate-400 [&_svg_line]:stroke-slate-400', className), children: _jsx(VgPlotChart, { plot: plot }) }));
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=MosaicColorLegend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MosaicColorLegend.js","sourceRoot":"","sources":["../src/MosaicColorLegend.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {ColorScaleConfig} from '@sqlrooms/color-scales';\nimport {resolveColorLegendTitle} from '@sqlrooms/color-scales';\nimport {cn, getResolvedTheme, useTheme} from '@sqlrooms/ui';\nimport {Selection} from '@uwdata/mosaic-core';\nimport * as vg from '@uwdata/vgplot';\nimport {useMemo} from 'react';\nimport {VgPlotChart} from './VgPlotChart';\n\ntype LegendDomainValue = string | number | Date;\n\ntype CreateMosaicColorLegendPlotOptions = {\n colorScale: ColorScaleConfig;\n selection?: Selection;\n domain?: ReadonlyArray<LegendDomainValue>;\n title?: string;\n width?: number;\n tickFormat?: string;\n};\n\nexport type MosaicColorLegendProps = CreateMosaicColorLegendPlotOptions & {\n className?: string;\n};\n\nfunction isExplicitNumericDomain(\n domain: 'auto' | [number, number] | [number, number, number],\n): domain is [number, number] | [number, number, number] {\n return domain !== 'auto';\n}\n\nfunction resolveLegendDomain(\n colorScale: ColorScaleConfig,\n domain?: ReadonlyArray<LegendDomainValue>,\n) {\n if (\n (colorScale.type === 'sequential' ||\n colorScale.type === 'diverging' ||\n colorScale.type === 'quantize') &&\n isExplicitNumericDomain(colorScale.domain)\n ) {\n return colorScale.domain;\n }\n\n return domain;\n}\n\nfunction getVgColorScaleType(colorScale: ColorScaleConfig) {\n switch (colorScale.type) {\n case 'sequential':\n return 'linear';\n case 'diverging':\n return 'diverging';\n case 'quantize':\n return 'quantize';\n case 'quantile':\n return 'quantile';\n case 'threshold':\n return 'threshold';\n case 'categorical':\n return 'categorical';\n default: {\n const _exhaustive: never = colorScale;\n throw new Error(\n `Unknown color scale type: ${(_exhaustive as ColorScaleConfig).type}`,\n );\n }\n }\n}\n\nfunction supportsInteractiveLegend(colorScale: ColorScaleConfig) {\n return (\n colorScale.type === 'sequential' ||\n colorScale.type === 'diverging' ||\n colorScale.type === 'categorical'\n );\n}\n\nexport function createMosaicColorLegendPlot({\n colorScale,\n selection,\n domain,\n title,\n width = 220,\n tickFormat = '.1f',\n}: CreateMosaicColorLegendPlotOptions) {\n const resolvedDomain = resolveLegendDomain(colorScale, domain);\n const legendTitle = resolveColorLegendTitle(colorScale, title);\n const plotAttributes: Array<(plot: any) => void> = [\n vg.colorScale(getVgColorScaleType(colorScale)),\n vg.colorScheme(colorScale.scheme),\n vg.colorLabel(legendTitle),\n vg.marginTop(0),\n vg.marginRight(0),\n vg.marginBottom(0),\n vg.marginLeft(0),\n ];\n\n if ('clamp' in colorScale && colorScale.clamp !== undefined) {\n plotAttributes.push(vg.colorClamp(colorScale.clamp));\n }\n\n if ('reverse' in colorScale && colorScale.reverse !== undefined) {\n plotAttributes.push(vg.colorReverse(colorScale.reverse));\n }\n\n if (colorScale.type === 'diverging') {\n if (Array.isArray(resolvedDomain) && resolvedDomain.length === 3) {\n plotAttributes.push(\n vg.colorDomain([resolvedDomain[0], resolvedDomain[2]]),\n vg.colorPivot(resolvedDomain[1]),\n );\n } else if (Array.isArray(resolvedDomain) && resolvedDomain.length === 2) {\n plotAttributes.push(vg.colorDomain(resolvedDomain));\n }\n } else if (colorScale.type === 'threshold') {\n plotAttributes.push(vg.colorDomain(colorScale.thresholds));\n } else if (resolvedDomain) {\n plotAttributes.push(vg.colorDomain(resolvedDomain));\n }\n\n if (colorScale.type === 'quantize' || colorScale.type === 'quantile') {\n plotAttributes.push(vg.colorN(colorScale.bins ?? 5));\n }\n\n const backingPlot = vg.plot(...plotAttributes);\n return vg.colorLegend({\n for: backingPlot,\n as: supportsInteractiveLegend(colorScale) ? selection : undefined,\n field: colorScale.field,\n width,\n tickFormat,\n label: legendTitle,\n });\n}\n\nexport function MosaicColorLegend({\n colorScale,\n selection,\n domain,\n title,\n width,\n tickFormat,\n className,\n}: MosaicColorLegendProps) {\n const {theme} = useTheme();\n const resolvedTheme = getResolvedTheme(theme);\n const legendSpecKey = JSON.stringify({\n colorScale,\n domain,\n title,\n width,\n tickFormat,\n });\n\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n const plot = useMemo(\n () =>\n createMosaicColorLegendPlot({\n colorScale,\n selection,\n domain,\n title,\n width,\n tickFormat,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- deep-equal via serialized key instead of object refs\n [legendSpecKey, selection],\n );\n\n if (!plot) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'pointer-events-auto rounded-md border px-3 py-2 shadow-lg backdrop-blur-sm',\n 'border-slate-200 bg-white/95 text-slate-900',\n 'dark:border-slate-700 dark:bg-[#1f1d1b]/90 dark:text-slate-100',\n '[&_svg]:block [&_svg]:overflow-visible',\n '[&_svg_line]:stroke-current [&_svg_path]:stroke-current [&_svg_text]:fill-current',\n resolvedTheme === 'dark' &&\n '[&_svg_.domain]:stroke-slate-500 [&_svg_line]:stroke-slate-500',\n resolvedTheme === 'light' &&\n '[&_svg_.domain]:stroke-slate-400 [&_svg_line]:stroke-slate-400',\n className,\n )}\n >\n <VgPlotChart plot={plot} />\n </div>\n );\n}\n"]}
|
package/dist/MosaicSlice.d.ts
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import { DuckDbSliceState } from '@sqlrooms/duckdb';
|
|
1
|
+
import { type DuckDbSliceState } from '@sqlrooms/duckdb';
|
|
2
2
|
import { type SliceFunctions } from '@sqlrooms/room-store';
|
|
3
3
|
import { Connector, Coordinator, makeClient, Selection } from '@uwdata/mosaic-core';
|
|
4
4
|
import { Query } from '@uwdata/mosaic-sql';
|
|
5
|
+
import type { Table as ArrowTable } from 'apache-arrow';
|
|
5
6
|
import { z } from 'zod';
|
|
6
7
|
export declare const MosaicSliceConfig: z.ZodObject<{}, z.core.$strip>;
|
|
7
8
|
export type MosaicSliceConfig = z.infer<typeof MosaicSliceConfig>;
|
|
8
|
-
export type
|
|
9
|
+
export type MosaicPreAggregateOptions = {
|
|
10
|
+
/** Database schema/namespace for Mosaic pre-aggregate tables. */
|
|
11
|
+
schema?: string;
|
|
12
|
+
/** Enable or disable Mosaic's pre-aggregation optimization. */
|
|
13
|
+
enabled?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export type MosaicClientOptions = {
|
|
9
16
|
/** Unique identifier for this client */
|
|
10
17
|
id?: string;
|
|
11
18
|
/** Selection name for cross-filtering (will create if doesn't exist) */
|
|
@@ -15,16 +22,19 @@ export type MosaicClientOptions<T = unknown> = {
|
|
|
15
22
|
/** Query builder function that receives the current filter */
|
|
16
23
|
query: (filter: unknown) => ReturnType<typeof Query.from>;
|
|
17
24
|
/** Callback when query results are received */
|
|
18
|
-
queryResult?: (result:
|
|
25
|
+
queryResult?: (result: ArrowTable) => void;
|
|
26
|
+
/** Callback when query execution fails */
|
|
27
|
+
queryError?: (error: Error) => void;
|
|
19
28
|
};
|
|
20
|
-
export type TrackedClient
|
|
29
|
+
export type TrackedClient = {
|
|
21
30
|
id: string;
|
|
22
31
|
client: ReturnType<typeof makeClient>;
|
|
23
32
|
createdAt: number;
|
|
24
33
|
isLoading: boolean;
|
|
25
|
-
data:
|
|
34
|
+
data: unknown | null;
|
|
35
|
+
error?: Error;
|
|
26
36
|
selection?: Selection;
|
|
27
|
-
queryResultCallback?: (result:
|
|
37
|
+
queryResultCallback?: (result: ArrowTable) => void;
|
|
28
38
|
};
|
|
29
39
|
export type MosaicSliceState = {
|
|
30
40
|
mosaic: SliceFunctions & {
|
|
@@ -32,7 +42,7 @@ export type MosaicSliceState = {
|
|
|
32
42
|
status: 'idle' | 'loading';
|
|
33
43
|
} | {
|
|
34
44
|
status: 'ready';
|
|
35
|
-
connector
|
|
45
|
+
connector?: Connector;
|
|
36
46
|
coordinator: Coordinator;
|
|
37
47
|
} | {
|
|
38
48
|
status: 'error';
|
|
@@ -40,18 +50,19 @@ export type MosaicSliceState = {
|
|
|
40
50
|
};
|
|
41
51
|
config: MosaicSliceConfig;
|
|
42
52
|
/** Record of registered clients by id */
|
|
43
|
-
clients: Record<string, TrackedClient
|
|
53
|
+
clients: Record<string, TrackedClient>;
|
|
44
54
|
/** Named selections for cross-filtering (e.g., 'brush', 'hover') */
|
|
45
55
|
selections: Record<string, Selection>;
|
|
46
56
|
initialize: () => Promise<void>;
|
|
47
57
|
/** Get or create a named selection for cross-filtering */
|
|
48
58
|
getSelection: (name: string, type?: 'crossfilter' | 'single' | 'union') => Selection;
|
|
49
59
|
/** Create a mosaic client and register it */
|
|
50
|
-
createClient:
|
|
60
|
+
createClient: (options: MosaicClientOptions) => string;
|
|
51
61
|
/** Ensure a client exists with given options (idempotent - creates or updates as needed) */
|
|
52
|
-
ensureClient:
|
|
62
|
+
ensureClient: (options: MosaicClientOptions & {
|
|
53
63
|
id: string;
|
|
54
|
-
onQueryResult?: (result:
|
|
64
|
+
onQueryResult?: (result: ArrowTable) => void;
|
|
65
|
+
onQueryError?: (error: Error) => void;
|
|
55
66
|
}) => void;
|
|
56
67
|
/** Disconnect and remove a client by id */
|
|
57
68
|
destroyClient: (id: string) => void;
|
|
@@ -60,9 +71,12 @@ export type MosaicSliceState = {
|
|
|
60
71
|
};
|
|
61
72
|
};
|
|
62
73
|
export declare function createDefaultMosaicConfig(props?: Partial<MosaicSliceConfig>): MosaicSliceConfig;
|
|
63
|
-
export
|
|
74
|
+
export type CreateMosaicSliceProps = {
|
|
64
75
|
config?: Partial<MosaicSliceConfig>;
|
|
65
|
-
|
|
76
|
+
coordinator?: Coordinator;
|
|
77
|
+
preagg?: MosaicPreAggregateOptions;
|
|
78
|
+
};
|
|
79
|
+
export declare function createMosaicSlice(props?: CreateMosaicSliceProps): import("zustand").StateCreator<MosaicSliceState>;
|
|
66
80
|
export type DuckDbSliceStateWithMosaic = DuckDbSliceState & MosaicSliceState;
|
|
67
81
|
export declare function useStoreWithMosaic<T>(selector: (state: DuckDbSliceStateWithMosaic) => T): T;
|
|
68
82
|
//# sourceMappingURL=MosaicSlice.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MosaicSlice.d.ts","sourceRoot":"","sources":["../src/MosaicSlice.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
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,gBAAgB,GAAG;IAC7B,MAAM,EAAE,cAAc,GAAG;QACvB,UAAU,EACN;YAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;SAAC,GAC5B;YAAC,MAAM,EAAE,OAAO,CAAC;YAAC,SAAS,CAAC,EAAE,SAAS,CAAC;YAAC,WAAW,EAAE,WAAW,CAAA;SAAC,GAClE;YAAC,MAAM,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAC,CAAC;QACtC,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,oDAoTnE;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"}
|