@carto/ps-react-ui 4.20.1 → 4.21.1
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/dist/{actions-Dy9JVr7F.js → actions-C7ZAO0FG.js} +4 -4
- package/dist/{actions-Dy9JVr7F.js.map → actions-C7ZAO0FG.js.map} +1 -1
- package/dist/{actions-DKX98LlI.js → actions-DZGaL_uT.js} +2 -2
- package/dist/{actions-DKX98LlI.js.map → actions-DZGaL_uT.js.map} +1 -1
- package/dist/{category-DHZscHaS.js → category-DZt6yiST.js} +3 -3
- package/dist/{category-DHZscHaS.js.map → category-DZt6yiST.js.map} +1 -1
- package/dist/{chart-config-BGt7wkK7.js → chart-config-BWxjodlt.js} +2 -2
- package/dist/chart-config-BWxjodlt.js.map +1 -0
- package/dist/chat.js.map +1 -1
- package/dist/{components-DDt4mOQn.js → components-DKjBezcJ.js} +73 -73
- package/dist/components-DKjBezcJ.js.map +1 -0
- package/dist/components.js +1 -1
- package/dist/{download-BT6qBamM.js → download-C7he8mSh.js} +2 -2
- package/dist/{download-BT6qBamM.js.map → download-C7he8mSh.js.map} +1 -1
- package/dist/{formula-Bk9CBzm2.js → formula-BNuRXsmh.js} +2 -2
- package/dist/{formula-Bk9CBzm2.js.map → formula-BNuRXsmh.js.map} +1 -1
- package/dist/{formula-Dsru_p-g.js → formula-Cqj84ZGX.js} +2 -2
- package/dist/{formula-Dsru_p-g.js.map → formula-Cqj84ZGX.js.map} +1 -1
- package/dist/legend.js +2 -0
- package/dist/legend.js.map +1 -1
- package/dist/{markdown-DnSJMPjQ.js → markdown-CV_KP-at.js} +2 -2
- package/dist/{markdown-DnSJMPjQ.js.map → markdown-CV_KP-at.js.map} +1 -1
- package/dist/{spread-Dy8pshpN.js → spread-C8T12Nfh.js} +3 -3
- package/dist/{spread-Dy8pshpN.js.map → spread-C8T12Nfh.js.map} +1 -1
- package/dist/{table-BfTG6rrs.js → table-CNQijNNB.js} +2 -2
- package/dist/{table-BfTG6rrs.js.map → table-CNQijNNB.js.map} +1 -1
- package/dist/types/chat/bubbles/chat-agent-message-markdown.d.ts +1 -1
- package/dist/types/chat/bubbles/chat-agent-message.d.ts +1 -1
- package/dist/types/chat/bubbles/chat-error-message.d.ts +1 -1
- package/dist/types/chat/bubbles/chat-suggestion-button.d.ts +1 -1
- package/dist/types/chat/bubbles/chat-user-message.d.ts +1 -1
- package/dist/types/chat/bubbles/index.d.ts +5 -5
- package/dist/types/chat/bubbles/styles.d.ts +88 -0
- package/dist/types/chat/containers/chat-content.d.ts +1 -1
- package/dist/types/chat/containers/chat-footer.d.ts +1 -1
- package/dist/types/chat/containers/chat-header.d.ts +1 -1
- package/dist/types/chat/containers/chat-starter.d.ts +1 -1
- package/dist/types/chat/containers/index.d.ts +4 -4
- package/dist/types/chat/feedback/chat-actions-container.d.ts +3 -0
- package/dist/types/chat/feedback/chat-loader.d.ts +1 -1
- package/dist/types/chat/feedback/chat-rating-action.d.ts +1 -1
- package/dist/types/chat/feedback/chat-thinking.d.ts +1 -1
- package/dist/types/chat/feedback/chat-tool-code-area.d.ts +1 -1
- package/dist/types/chat/feedback/chat-tool-full-view-dialog.d.ts +1 -1
- package/dist/types/chat/feedback/chat-tool-group.d.ts +1 -1
- package/dist/types/chat/feedback/chat-tool-trace.d.ts +1 -1
- package/dist/types/chat/feedback/get-tool-label.d.ts +1 -1
- package/dist/types/chat/feedback/index.d.ts +8 -8
- package/dist/types/chat/feedback/styles.d.ts +212 -0
- package/dist/types/chat/index.d.ts +21 -21
- package/dist/types/components/basemaps/basemaps.d.ts +1 -1
- package/dist/types/components/basemaps/const.d.ts +1 -1
- package/dist/types/components/basemaps/group.d.ts +1 -1
- package/dist/types/components/basemaps/header.d.ts +1 -1
- package/dist/types/components/copy-button/copy-button.d.ts +1 -1
- package/dist/types/components/geolocation-controls/geolocation-controls.d.ts +1 -1
- package/dist/types/components/index.d.ts +26 -26
- package/dist/types/components/lasso-tool/chip.d.ts +1 -1
- package/dist/types/components/lasso-tool/const.d.ts +2 -2
- package/dist/types/components/lasso-tool/geometry-toolbar.d.ts +1 -1
- package/dist/types/components/lasso-tool/lasso-tool-inline.d.ts +1 -1
- package/dist/types/components/lasso-tool/lasso-tool.d.ts +1 -1
- package/dist/types/components/lasso-tool/layer-filters.d.ts +1 -1
- package/dist/types/components/lasso-tool/message.d.ts +1 -1
- package/dist/types/components/lasso-tool/types.d.ts +1 -1
- package/dist/types/components/list-data/list-data.d.ts +1 -1
- package/dist/types/components/measurement-tools/const.d.ts +2 -2
- package/dist/types/components/measurement-tools/measurement-tools.d.ts +1 -1
- package/dist/types/components/measurement-tools/types.d.ts +1 -1
- package/dist/types/components/responsive-drawer/responsive-drawer.d.ts +10 -3
- package/dist/types/components/types.d.ts +1 -1
- package/dist/types/components/zoom-controls/zoom-controls.d.ts +1 -1
- package/dist/types/hooks/index.d.ts +1 -1
- package/dist/types/legend/components/icons.d.ts +1 -1
- package/dist/types/legend/components/index.d.ts +26 -26
- package/dist/types/legend/components/legend-category/legend-category-ui.d.ts +1 -1
- package/dist/types/legend/components/legend-icon/legend-icon-ui.d.ts +1 -1
- package/dist/types/legend/components/legend-item/legend-item-ui.d.ts +2 -2
- package/dist/types/legend/components/legend-proportion/legend-proportion-ui.d.ts +2 -2
- package/dist/types/legend/components/legend-ramp/legend-ramp-ui.d.ts +2 -2
- package/dist/types/legend/components/legend-sortable/sortable-entity.d.ts +1 -1
- package/dist/types/legend/components/legend-swatch/legend-swatch.d.ts +1 -1
- package/dist/types/legend/components/legend-visibility-toggle/legend-visibility-toggle.d.ts +2 -2
- package/dist/types/legend/components/run-async-menu-action.d.ts +1 -1
- package/dist/types/legend/index.d.ts +41 -41
- package/dist/types/legend/provider/index.d.ts +6 -6
- package/dist/types/legend/provider/legend-config-context.d.ts +1 -1
- package/dist/types/legend/provider/legend-provider.d.ts +2 -2
- package/dist/types/legend/stores/index.d.ts +5 -5
- package/dist/types/legend/stores/legend-store-registry.d.ts +1 -1
- package/dist/types/legend/stores/selectors.d.ts +1 -1
- package/dist/types/widgets/actions/brush-toggle/brush-toggle.d.ts +1 -1
- package/dist/types/widgets/actions/brush-toggle/hit-test.d.ts +1 -1
- package/dist/types/widgets/actions/brush-toggle/types.d.ts +1 -1
- package/dist/types/widgets/actions/change-column/change-column.d.ts +1 -1
- package/dist/types/widgets/actions/change-column/sortable-column-item.d.ts +1 -1
- package/dist/types/widgets/actions/download/download.d.ts +1 -1
- package/dist/types/widgets/actions/download/exports.d.ts +1 -1
- package/dist/types/widgets/actions/download/types.d.ts +1 -1
- package/dist/types/widgets/actions/fullscreen/fullscreen.d.ts +1 -1
- package/dist/types/widgets/actions/fullscreen/types.d.ts +1 -1
- package/dist/types/widgets/actions/index.d.ts +20 -20
- package/dist/types/widgets/actions/lock-selection/lock-selection.d.ts +1 -1
- package/dist/types/widgets/actions/lock-selection/types.d.ts +1 -1
- package/dist/types/widgets/actions/relative-data/relative-data.d.ts +1 -1
- package/dist/types/widgets/actions/relative-data/types.d.ts +1 -1
- package/dist/types/widgets/actions/relative-data/utils.d.ts +1 -1
- package/dist/types/widgets/actions/searcher/searcher-toggle.d.ts +1 -1
- package/dist/types/widgets/actions/searcher/searcher.d.ts +1 -1
- package/dist/types/widgets/actions/searcher/types.d.ts +2 -2
- package/dist/types/widgets/actions/stack-toggle/stack-toggle.d.ts +1 -1
- package/dist/types/widgets/actions/stack-toggle/types.d.ts +1 -1
- package/dist/types/widgets/actions/zoom-toggle/types.d.ts +1 -1
- package/dist/types/widgets/actions/zoom-toggle/zoom-toggle.d.ts +1 -1
- package/dist/types/widgets/bar/config.d.ts +2 -2
- package/dist/types/widgets/bar/index.d.ts +3 -3
- package/dist/types/widgets/bar/types.d.ts +3 -3
- package/dist/types/widgets/category/category-ui.d.ts +1 -1
- package/dist/types/widgets/category/components/category-legend.d.ts +1 -1
- package/dist/types/widgets/category/components/category-row-multi.d.ts +1 -1
- package/dist/types/widgets/category/components/category-row-single.d.ts +1 -1
- package/dist/types/widgets/category/config.d.ts +3 -3
- package/dist/types/widgets/category/index.d.ts +14 -14
- package/dist/types/widgets/category/types.d.ts +3 -3
- package/dist/types/widgets/echart/echart-ui.d.ts +1 -1
- package/dist/types/widgets/echart/echart.d.ts +1 -1
- package/dist/types/widgets/echart/index.d.ts +5 -5
- package/dist/types/widgets/echart/options.d.ts +1 -1
- package/dist/types/widgets/echart/types.d.ts +1 -1
- package/dist/types/widgets/echart/utils.d.ts +1 -1
- package/dist/types/widgets/error/error.d.ts +1 -1
- package/dist/types/widgets/error/index.d.ts +2 -2
- package/dist/types/widgets/error/types.d.ts +1 -1
- package/dist/types/widgets/formula/components/item.d.ts +1 -1
- package/dist/types/widgets/formula/components/prefix.d.ts +1 -1
- package/dist/types/widgets/formula/components/row.d.ts +1 -1
- package/dist/types/widgets/formula/components/series.d.ts +1 -1
- package/dist/types/widgets/formula/components/suffix.d.ts +1 -1
- package/dist/types/widgets/formula/components/value.d.ts +1 -1
- package/dist/types/widgets/formula/config.d.ts +2 -2
- package/dist/types/widgets/formula/formula-ui.d.ts +1 -1
- package/dist/types/widgets/formula/index.d.ts +11 -11
- package/dist/types/widgets/formula/serializer.d.ts +1 -1
- package/dist/types/widgets/formula/types.d.ts +3 -3
- package/dist/types/widgets/histogram/config.d.ts +3 -3
- package/dist/types/widgets/histogram/index.d.ts +4 -4
- package/dist/types/widgets/histogram/types.d.ts +3 -3
- package/dist/types/widgets/loader/index.d.ts +3 -3
- package/dist/types/widgets/loader/loader.d.ts +1 -1
- package/dist/types/widgets/loader/types.d.ts +1 -1
- package/dist/types/widgets/markdown/config.d.ts +2 -2
- package/dist/types/widgets/markdown/index.d.ts +5 -5
- package/dist/types/widgets/markdown/markdown-ui.d.ts +1 -1
- package/dist/types/widgets/markdown/markdown.d.ts +1 -1
- package/dist/types/widgets/markdown/types.d.ts +3 -3
- package/dist/types/widgets/no-data/index.d.ts +2 -2
- package/dist/types/widgets/no-data/no-data.d.ts +1 -1
- package/dist/types/widgets/no-data/types.d.ts +1 -1
- package/dist/types/widgets/note/index.d.ts +2 -2
- package/dist/types/widgets/note/note.d.ts +1 -1
- package/dist/types/widgets/note/types.d.ts +1 -1
- package/dist/types/widgets/pie/config.d.ts +2 -2
- package/dist/types/widgets/pie/index.d.ts +3 -3
- package/dist/types/widgets/pie/types.d.ts +3 -3
- package/dist/types/widgets/range/components/range-item.d.ts +1 -1
- package/dist/types/widgets/range/config.d.ts +1 -1
- package/dist/types/widgets/range/index.d.ts +6 -6
- package/dist/types/widgets/range/range-ui.d.ts +1 -1
- package/dist/types/widgets/range/serializer.d.ts +1 -1
- package/dist/types/widgets/range/types.d.ts +3 -3
- package/dist/types/widgets/scatterplot/config.d.ts +2 -2
- package/dist/types/widgets/scatterplot/index.d.ts +3 -3
- package/dist/types/widgets/scatterplot/types.d.ts +3 -3
- package/dist/types/widgets/selection-summary/index.d.ts +2 -2
- package/dist/types/widgets/selection-summary/selection-summary.d.ts +1 -1
- package/dist/types/widgets/skeleton-loader/index.d.ts +2 -2
- package/dist/types/widgets/skeleton-loader/skeleton-loader.d.ts +1 -1
- package/dist/types/widgets/skeleton-loader/types.d.ts +1 -1
- package/dist/types/widgets/spread/components/max-value.d.ts +1 -1
- package/dist/types/widgets/spread/components/min-value.d.ts +1 -1
- package/dist/types/widgets/spread/components/separator.d.ts +1 -1
- package/dist/types/widgets/spread/config.d.ts +3 -3
- package/dist/types/widgets/spread/index.d.ts +9 -9
- package/dist/types/widgets/spread/spread-ui.d.ts +1 -1
- package/dist/types/widgets/spread/types.d.ts +4 -4
- package/dist/types/widgets/stores/index.d.ts +3 -3
- package/dist/types/widgets/stores/use-widget-selector.d.ts +1 -1
- package/dist/types/widgets/stores/widget-store.d.ts +2 -2
- package/dist/types/widgets/subheader/index.d.ts +2 -2
- package/dist/types/widgets/subheader/subheader.d.ts +1 -1
- package/dist/types/widgets/table/components/cell-header.d.ts +1 -1
- package/dist/types/widgets/table/components/cell.d.ts +1 -1
- package/dist/types/widgets/table/components/pagination-actions.d.ts +1 -1
- package/dist/types/widgets/table/components/pagination.d.ts +1 -1
- package/dist/types/widgets/table/components/row.d.ts +1 -1
- package/dist/types/widgets/table/config.d.ts +2 -2
- package/dist/types/widgets/table/hooks/use-pagination.d.ts +1 -1
- package/dist/types/widgets/table/hooks/use-selection.d.ts +1 -1
- package/dist/types/widgets/table/hooks/use-sort.d.ts +1 -1
- package/dist/types/widgets/table/index.d.ts +17 -17
- package/dist/types/widgets/table/serializer.d.ts +1 -1
- package/dist/types/widgets/table/table-ui.d.ts +8 -8
- package/dist/types/widgets/table/types.d.ts +3 -3
- package/dist/types/widgets/timeseries/config.d.ts +2 -2
- package/dist/types/widgets/timeseries/index.d.ts +3 -3
- package/dist/types/widgets/timeseries/types.d.ts +3 -3
- package/dist/types/widgets/toolbar-actions/index.d.ts +2 -2
- package/dist/types/widgets/toolbar-actions/toolbar-actions.d.ts +1 -1
- package/dist/types/widgets/utils/chart-config/config-factory.d.ts +1 -1
- package/dist/types/widgets/utils/chart-config/download-config.d.ts +2 -2
- package/dist/types/widgets/utils/chart-config/index.d.ts +6 -6
- package/dist/types/widgets/utils/chart-config/option-builders.d.ts +142 -0
- package/dist/types/widgets/utils/index.d.ts +7 -7
- package/dist/types/widgets/utils/skeleton/index.d.ts +1 -1
- package/dist/types/widgets/wrapper/components/actions.d.ts +1 -1
- package/dist/types/widgets/wrapper/components/options.d.ts +1 -1
- package/dist/types/widgets/wrapper/components/title.d.ts +1 -1
- package/dist/types/widgets/wrapper/index.d.ts +6 -6
- package/dist/types/widgets/wrapper/types.d.ts +1 -1
- package/dist/types/widgets/wrapper/wrapper-ui.d.ts +1 -1
- package/dist/types/widgets/wrapper/wrapper.d.ts +1 -1
- package/dist/types/widgets-v2/actions/brush-toggle/brush-toggle.d.ts +1 -1
- package/dist/types/widgets-v2/actions/brush-toggle/index.d.ts +3 -3
- package/dist/types/widgets-v2/actions/change-column/change-column.d.ts +1 -1
- package/dist/types/widgets-v2/actions/change-column/index.d.ts +3 -3
- package/dist/types/widgets-v2/actions/change-column/types.d.ts +1 -1
- package/dist/types/widgets-v2/actions/download/csv-item.d.ts +1 -1
- package/dist/types/widgets-v2/actions/download/download.d.ts +2 -2
- package/dist/types/widgets-v2/actions/download/index.d.ts +8 -8
- package/dist/types/widgets-v2/actions/download/png-item.d.ts +1 -1
- package/dist/types/widgets-v2/actions/fullscreen/fullscreen.d.ts +1 -1
- package/dist/types/widgets-v2/actions/fullscreen/index.d.ts +3 -3
- package/dist/types/widgets-v2/actions/fullscreen/types.d.ts +1 -1
- package/dist/types/widgets-v2/actions/index.d.ts +10 -10
- package/dist/types/widgets-v2/actions/lock-selection/index.d.ts +3 -3
- package/dist/types/widgets-v2/actions/lock-selection/lock-selection.d.ts +1 -1
- package/dist/types/widgets-v2/actions/relative-data/index.d.ts +3 -3
- package/dist/types/widgets-v2/actions/relative-data/relative-data.d.ts +1 -1
- package/dist/types/widgets-v2/actions/searcher/index.d.ts +4 -4
- package/dist/types/widgets-v2/actions/searcher/searcher-toggle.d.ts +1 -1
- package/dist/types/widgets-v2/actions/searcher/searcher.d.ts +1 -1
- package/dist/types/widgets-v2/actions/show-all/index.d.ts +2 -2
- package/dist/types/widgets-v2/actions/show-all/show-all.d.ts +1 -1
- package/dist/types/widgets-v2/actions/stack-toggle/index.d.ts +3 -3
- package/dist/types/widgets-v2/actions/stack-toggle/stack-toggle.d.ts +1 -1
- package/dist/types/widgets-v2/actions/zoom-toggle/index.d.ts +3 -3
- package/dist/types/widgets-v2/actions/zoom-toggle/zoom-toggle.d.ts +2 -2
- package/dist/types/widgets-v2/bar/download.d.ts +2 -2
- package/dist/types/widgets-v2/bar/index.d.ts +4 -4
- package/dist/types/widgets-v2/bar/options.d.ts +2 -2
- package/dist/types/widgets-v2/bar/types.d.ts +1 -1
- package/dist/types/widgets-v2/category/category-ui.d.ts +1 -1
- package/dist/types/widgets-v2/category/category.d.ts +1 -1
- package/dist/types/widgets-v2/category/components/category-bar-stacked.d.ts +1 -1
- package/dist/types/widgets-v2/category/components/category-bar.d.ts +1 -1
- package/dist/types/widgets-v2/category/components/category-legend.d.ts +1 -1
- package/dist/types/widgets-v2/category/components/category-row-multi.d.ts +1 -1
- package/dist/types/widgets-v2/category/components/category-row-single.d.ts +1 -1
- package/dist/types/widgets-v2/category/components/category-row-stacked.d.ts +1 -1
- package/dist/types/widgets-v2/category/download.d.ts +2 -2
- package/dist/types/widgets-v2/category/index.d.ts +10 -10
- package/dist/types/widgets-v2/category/skeleton.d.ts +1 -1
- package/dist/types/widgets-v2/category/style.d.ts +1 -1
- package/dist/types/widgets-v2/category/types.d.ts +1 -1
- package/dist/types/widgets-v2/echart/echart.d.ts +1 -1
- package/dist/types/widgets-v2/echart/index.d.ts +4 -4
- package/dist/types/widgets-v2/echart/use-chart-selection.d.ts +1 -1
- package/dist/types/widgets-v2/formula/delta.d.ts +1 -1
- package/dist/types/widgets-v2/formula/download.d.ts +2 -2
- package/dist/types/widgets-v2/formula/formula-ui.d.ts +1 -1
- package/dist/types/widgets-v2/formula/index.d.ts +11 -11
- package/dist/types/widgets-v2/formula/types.d.ts +1 -1
- package/dist/types/widgets-v2/histogram/download.d.ts +2 -2
- package/dist/types/widgets-v2/histogram/index.d.ts +5 -5
- package/dist/types/widgets-v2/histogram/options.d.ts +3 -3
- package/dist/types/widgets-v2/histogram/types.d.ts +1 -1
- package/dist/types/widgets-v2/index.d.ts +45 -45
- package/dist/types/widgets-v2/markdown/download.d.ts +2 -2
- package/dist/types/widgets-v2/markdown/index.d.ts +6 -6
- package/dist/types/widgets-v2/note/widget-note.d.ts +1 -1
- package/dist/types/widgets-v2/pie/download.d.ts +2 -2
- package/dist/types/widgets-v2/pie/index.d.ts +4 -4
- package/dist/types/widgets-v2/pie/options.d.ts +2 -2
- package/dist/types/widgets-v2/pie/types.d.ts +1 -1
- package/dist/types/widgets-v2/range/index.d.ts +4 -4
- package/dist/types/widgets-v2/range/range-ui.d.ts +1 -1
- package/dist/types/widgets-v2/range/range.d.ts +1 -1
- package/dist/types/widgets-v2/scatterplot/download.d.ts +2 -2
- package/dist/types/widgets-v2/scatterplot/index.d.ts +5 -5
- package/dist/types/widgets-v2/scatterplot/options.d.ts +2 -2
- package/dist/types/widgets-v2/scatterplot/types.d.ts +1 -1
- package/dist/types/widgets-v2/selection-summary/selection-summary.d.ts +1 -1
- package/dist/types/widgets-v2/spread/download.d.ts +2 -2
- package/dist/types/widgets-v2/spread/index.d.ts +7 -7
- package/dist/types/widgets-v2/spread/spread-ui.d.ts +1 -1
- package/dist/types/widgets-v2/spread/types.d.ts +1 -1
- package/dist/types/widgets-v2/state/widget-state.d.ts +1 -1
- package/dist/types/widgets-v2/stores/index.d.ts +8 -8
- package/dist/types/widgets-v2/stores/pipeline-middleware.d.ts +1 -1
- package/dist/types/widgets-v2/stores/transforms.d.ts +1 -1
- package/dist/types/widgets-v2/stores/use-transform.d.ts +1 -1
- package/dist/types/widgets-v2/stores/widget-store-registry.d.ts +1 -1
- package/dist/types/widgets-v2/table/download.d.ts +2 -2
- package/dist/types/widgets-v2/table/helpers.d.ts +1 -1
- package/dist/types/widgets-v2/table/index.d.ts +8 -8
- package/dist/types/widgets-v2/table/table-ui.d.ts +2 -2
- package/dist/types/widgets-v2/table/table.d.ts +2 -2
- package/dist/types/widgets-v2/table/types.d.ts +1 -1
- package/dist/types/widgets-v2/timeseries/download.d.ts +2 -2
- package/dist/types/widgets-v2/timeseries/index.d.ts +5 -5
- package/dist/types/widgets-v2/timeseries/options.d.ts +4 -4
- package/dist/types/widgets-v2/timeseries/types.d.ts +1 -1
- package/dist/types/widgets-v2/toolbox/toolbox.d.ts +1 -1
- package/dist/types/widgets-v2/utils/index.d.ts +3 -3
- package/dist/types/widgets-v2/wrapper/index.d.ts +4 -4
- package/dist/types/widgets-v2/wrapper/widget-wrapper.d.ts +1 -1
- package/dist/{utils-DtvTjjMq.js → utils-ClB6nn4w.js} +2 -2
- package/dist/{utils-DtvTjjMq.js.map → utils-ClB6nn4w.js.map} +1 -1
- package/dist/widgets/actions.js +1 -1
- package/dist/widgets/bar.js +1 -1
- package/dist/widgets/category.js +1 -1
- package/dist/widgets/formula.js +1 -1
- package/dist/widgets/histogram.js +2 -2
- package/dist/widgets/markdown.js +1 -1
- package/dist/widgets/pie.js +1 -1
- package/dist/widgets/scatterplot.js +1 -1
- package/dist/widgets/spread.js +2 -2
- package/dist/widgets/table.js +14 -17
- package/dist/widgets/table.js.map +1 -1
- package/dist/widgets/timeseries.js +1 -1
- package/dist/widgets/utils.js +1 -1
- package/dist/widgets/wrapper.js +1 -1
- package/dist/widgets-v2/actions.js +3 -3
- package/dist/widgets-v2/bar.js +4 -4
- package/dist/widgets-v2/category.js +1 -1
- package/dist/widgets-v2/formula.js +1 -1
- package/dist/widgets-v2/histogram.js +4 -4
- package/dist/widgets-v2/markdown.js +1 -1
- package/dist/widgets-v2/pie.js +10 -10
- package/dist/widgets-v2/pie.js.map +1 -1
- package/dist/widgets-v2/scatterplot.js +4 -4
- package/dist/widgets-v2/spread.js +1 -1
- package/dist/widgets-v2/table.js +1 -1
- package/dist/widgets-v2/timeseries.js +4 -4
- package/dist/widgets-v2/utils.js +1 -1
- package/dist/widgets-v2.js +9 -9
- package/dist/{zoom-toggle-CA0ifG23.js → zoom-toggle-KA63b6-J.js} +2 -2
- package/dist/{zoom-toggle-CA0ifG23.js.map → zoom-toggle-KA63b6-J.js.map} +1 -1
- package/package.json +6 -5
- package/src/chat/bubbles/styles.ts +27 -8
- package/src/chat/feedback/chat-actions-container.tsx +5 -2
- package/src/chat/feedback/styles.ts +8 -5
- package/src/components/basemaps/basemaps.tsx +4 -4
- package/src/components/responsive-drawer/responsive-drawer.test.tsx +37 -23
- package/src/components/responsive-drawer/responsive-drawer.tsx +15 -8
- package/src/legend/components/legend-row/legend-row.test.tsx +19 -0
- package/src/legend/components/legend-row/legend-row.tsx +15 -2
- package/src/widgets/table/components/pagination-actions.tsx +4 -4
- package/src/widgets/utils/chart-config/option-builders.ts +5 -1
- package/src/widgets-v2/pie/options.test.ts +67 -0
- package/src/widgets-v2/pie/options.ts +27 -4
- package/src/widgets-v2/selection-summary/selection-summary.test.tsx +1 -1
- package/src/widgets-v2/toolbox/toolbox.test.tsx +1 -1
- package/dist/chart-config-BGt7wkK7.js.map +0 -1
- package/dist/components-DDt4mOQn.js.map +0 -1
- package/dist/types/legend/stores/legend-store.test.d.ts +0 -1
- package/dist/types/widgets/actions/brush-toggle/hit-test.test.d.ts +0 -1
- package/dist/types/widgets/actions/relative-data/utils.test.d.ts +0 -1
- package/dist/types/widgets/echart/utils.test.d.ts +0 -1
- package/dist/types/widgets/formula/config.test.d.ts +0 -1
- package/dist/types/widgets/loader/utils.test.d.ts +0 -1
- package/dist/types/widgets/range/serializer.test.d.ts +0 -1
- package/dist/types/widgets/stores/widget-store-branches.test.d.ts +0 -1
- package/dist/types/widgets/stores/widget-store-performance.test.d.ts +0 -1
- package/dist/types/widgets/stores/widget-store.test.d.ts +0 -1
- package/dist/types/widgets/table/config.test.d.ts +0 -1
- package/dist/types/widgets/table/helpers.test.d.ts +0 -1
- package/dist/types/widgets/table/hooks/use-pagination.test.d.ts +0 -1
- package/dist/types/widgets/table/hooks/use-selection.test.d.ts +0 -1
- package/dist/types/widgets/table/hooks/use-sort.test.d.ts +0 -1
- package/dist/types/widgets/utils/chart-config/option-builders.test.d.ts +0 -1
- package/dist/types/widgets-v2/actions/brush-toggle/transforms.test.d.ts +0 -1
- package/dist/types/widgets-v2/actions/relative-data/transforms.test.d.ts +0 -1
- package/dist/types/widgets-v2/actions/stack-toggle/transforms.test.d.ts +0 -1
- package/dist/types/widgets-v2/actions/zoom-toggle/transforms.test.d.ts +0 -1
- package/dist/types/widgets-v2/bar/options.test.d.ts +0 -1
- package/dist/types/widgets-v2/category/download.test.d.ts +0 -1
- package/dist/types/widgets-v2/echart/edge-label-clamp.test.d.ts +0 -1
- package/dist/types/widgets-v2/echart/shared-resize-observer.test.d.ts +0 -1
- package/dist/types/widgets-v2/histogram/download.test.d.ts +0 -1
- package/dist/types/widgets-v2/histogram/options.test.d.ts +0 -1
- package/dist/types/widgets-v2/histogram/transforms.test.d.ts +0 -1
- package/dist/types/widgets-v2/markdown/download.test.d.ts +0 -1
- package/dist/types/widgets-v2/pie/download.test.d.ts +0 -1
- package/dist/types/widgets-v2/pie/options.test.d.ts +0 -1
- package/dist/types/widgets-v2/scatterplot/download.test.d.ts +0 -1
- package/dist/types/widgets-v2/scatterplot/options.test.d.ts +0 -1
- package/dist/types/widgets-v2/scatterplot/transforms.test.d.ts +0 -1
- package/dist/types/widgets-v2/spread/band.test.d.ts +0 -1
- package/dist/types/widgets-v2/spread/download.test.d.ts +0 -1
- package/dist/types/widgets-v2/state/labels.test.d.ts +0 -1
- package/dist/types/widgets-v2/stores/pipeline-middleware.test.d.ts +0 -1
- package/dist/types/widgets-v2/stores/transforms.test.d.ts +0 -1
- package/dist/types/widgets-v2/stores/widget-store-registry.test.d.ts +0 -1
- package/dist/types/widgets-v2/table/download.test.d.ts +0 -1
- package/dist/types/widgets-v2/table/helpers.test.d.ts +0 -1
- package/dist/types/widgets-v2/table/transforms.test.d.ts +0 -1
- package/dist/types/widgets-v2/test-utils.d.ts +0 -52
- package/dist/types/widgets-v2/timeseries/download.test.d.ts +0 -1
- package/dist/types/widgets-v2/timeseries/options.test.d.ts +0 -1
- package/dist/types/widgets-v2/timeseries/transforms.test.d.ts +0 -1
- package/dist/types/widgets-v2/utils/merge-options.test.d.ts +0 -1
- package/dist/types/widgets-v2/utils/resolve-theme-color.test.d.ts +0 -1
|
@@ -10,8 +10,8 @@ const theme = createTheme()
|
|
|
10
10
|
describe('ResponsiveDrawer', () => {
|
|
11
11
|
const mockOnChangeCollapsed = vi.fn()
|
|
12
12
|
|
|
13
|
-
// A real anchor element: the desktop Popover only opens when
|
|
14
|
-
// (the open-by-default guard), and positioning needs a DOM node.
|
|
13
|
+
// A real anchor element: the desktop Popover only opens when the anchor is
|
|
14
|
+
// non-null (the open-by-default guard), and positioning needs a DOM node.
|
|
15
15
|
let anchor: HTMLElement
|
|
16
16
|
|
|
17
17
|
const defaultProps = {
|
|
@@ -32,10 +32,20 @@ describe('ResponsiveDrawer', () => {
|
|
|
32
32
|
anchor.remove()
|
|
33
33
|
})
|
|
34
34
|
|
|
35
|
+
test('accepts the anchor through the deprecated `ref` alias', () => {
|
|
36
|
+
render(
|
|
37
|
+
<ThemeProvider theme={theme}>
|
|
38
|
+
<ResponsiveDrawer ref={anchor} {...defaultProps} />
|
|
39
|
+
</ThemeProvider>,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
expect(screen.getByTestId('drawer-content')).toBeDefined()
|
|
43
|
+
})
|
|
44
|
+
|
|
35
45
|
test('renders in desktop mode when isMobile is false', () => {
|
|
36
46
|
const { container } = render(
|
|
37
47
|
<ThemeProvider theme={theme}>
|
|
38
|
-
<ResponsiveDrawer
|
|
48
|
+
<ResponsiveDrawer anchorEl={anchor} {...defaultProps} />
|
|
39
49
|
</ThemeProvider>,
|
|
40
50
|
)
|
|
41
51
|
|
|
@@ -50,12 +60,12 @@ describe('ResponsiveDrawer', () => {
|
|
|
50
60
|
expect(presentationElements.length).toBe(0)
|
|
51
61
|
})
|
|
52
62
|
|
|
53
|
-
test('does not open the desktop popover until the anchor
|
|
54
|
-
// Open-by-default guard: collapsed=false but
|
|
55
|
-
// popover never renders with a null anchorEl.
|
|
63
|
+
test('does not open the desktop popover until the anchor resolves', () => {
|
|
64
|
+
// Open-by-default guard: collapsed=false but anchorEl=null → stays closed so
|
|
65
|
+
// the popover never renders with a null anchorEl.
|
|
56
66
|
render(
|
|
57
67
|
<ThemeProvider theme={theme}>
|
|
58
|
-
<ResponsiveDrawer
|
|
68
|
+
<ResponsiveDrawer anchorEl={null} {...defaultProps} />
|
|
59
69
|
</ThemeProvider>,
|
|
60
70
|
)
|
|
61
71
|
expect(screen.queryByTestId('drawer-content')).toBeNull()
|
|
@@ -64,7 +74,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
64
74
|
test('renders in mobile mode when isMobile is true', () => {
|
|
65
75
|
render(
|
|
66
76
|
<ThemeProvider theme={theme}>
|
|
67
|
-
<ResponsiveDrawer
|
|
77
|
+
<ResponsiveDrawer anchorEl={anchor} {...defaultProps} isMobile={true} />
|
|
68
78
|
</ThemeProvider>,
|
|
69
79
|
)
|
|
70
80
|
|
|
@@ -82,7 +92,11 @@ describe('ResponsiveDrawer', () => {
|
|
|
82
92
|
test('hides content when collapsed is true in desktop mode', () => {
|
|
83
93
|
render(
|
|
84
94
|
<ThemeProvider theme={theme}>
|
|
85
|
-
<ResponsiveDrawer
|
|
95
|
+
<ResponsiveDrawer
|
|
96
|
+
anchorEl={anchor}
|
|
97
|
+
{...defaultProps}
|
|
98
|
+
collapsed={true}
|
|
99
|
+
/>
|
|
86
100
|
</ThemeProvider>,
|
|
87
101
|
)
|
|
88
102
|
|
|
@@ -94,7 +108,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
94
108
|
test('closes drawer when clicking outside in mobile mode', () => {
|
|
95
109
|
const { container } = render(
|
|
96
110
|
<ThemeProvider theme={theme}>
|
|
97
|
-
<ResponsiveDrawer
|
|
111
|
+
<ResponsiveDrawer anchorEl={anchor} {...defaultProps} isMobile={true} />
|
|
98
112
|
</ThemeProvider>,
|
|
99
113
|
)
|
|
100
114
|
|
|
@@ -119,7 +133,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
119
133
|
render(
|
|
120
134
|
<ThemeProvider theme={theme}>
|
|
121
135
|
<ResponsiveDrawer
|
|
122
|
-
|
|
136
|
+
anchorEl={anchor}
|
|
123
137
|
{...defaultProps}
|
|
124
138
|
position={position}
|
|
125
139
|
/>
|
|
@@ -132,7 +146,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
132
146
|
test('modal (default): renders an (invisible) backdrop', () => {
|
|
133
147
|
render(
|
|
134
148
|
<ThemeProvider theme={theme}>
|
|
135
|
-
<ResponsiveDrawer
|
|
149
|
+
<ResponsiveDrawer anchorEl={anchor} {...defaultProps} />
|
|
136
150
|
</ThemeProvider>,
|
|
137
151
|
)
|
|
138
152
|
// The popover portals to document.body, so query the whole document.
|
|
@@ -145,7 +159,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
145
159
|
render(
|
|
146
160
|
<ThemeProvider theme={theme}>
|
|
147
161
|
<ResponsiveDrawer
|
|
148
|
-
|
|
162
|
+
anchorEl={anchor}
|
|
149
163
|
{...defaultProps}
|
|
150
164
|
slotProps={slotProps}
|
|
151
165
|
/>
|
|
@@ -157,7 +171,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
157
171
|
test('defaults to portaling into document.body when container is omitted', () => {
|
|
158
172
|
render(
|
|
159
173
|
<ThemeProvider theme={theme}>
|
|
160
|
-
<ResponsiveDrawer
|
|
174
|
+
<ResponsiveDrawer anchorEl={anchor} {...defaultProps} />
|
|
161
175
|
</ThemeProvider>,
|
|
162
176
|
)
|
|
163
177
|
const content = screen.getByTestId('drawer-content')
|
|
@@ -172,7 +186,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
172
186
|
render(
|
|
173
187
|
<ThemeProvider theme={theme}>
|
|
174
188
|
<ResponsiveDrawer
|
|
175
|
-
|
|
189
|
+
anchorEl={anchor}
|
|
176
190
|
{...defaultProps}
|
|
177
191
|
container={customContainer}
|
|
178
192
|
/>
|
|
@@ -197,7 +211,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
197
211
|
render(
|
|
198
212
|
<ThemeProvider theme={theme}>
|
|
199
213
|
<ResponsiveDrawer
|
|
200
|
-
|
|
214
|
+
anchorEl={anchor}
|
|
201
215
|
{...defaultProps}
|
|
202
216
|
container={customContainer}
|
|
203
217
|
/>
|
|
@@ -225,7 +239,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
225
239
|
test('leaves paper maxHeight unset when no container is given', () => {
|
|
226
240
|
render(
|
|
227
241
|
<ThemeProvider theme={theme}>
|
|
228
|
-
<ResponsiveDrawer
|
|
242
|
+
<ResponsiveDrawer anchorEl={anchor} {...defaultProps} />
|
|
229
243
|
</ThemeProvider>,
|
|
230
244
|
)
|
|
231
245
|
const paper = document.querySelector<HTMLElement>('.MuiPopover-paper')!
|
|
@@ -247,7 +261,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
247
261
|
render(
|
|
248
262
|
<ThemeProvider theme={theme}>
|
|
249
263
|
<ResponsiveDrawer
|
|
250
|
-
|
|
264
|
+
anchorEl={anchor}
|
|
251
265
|
{...defaultProps}
|
|
252
266
|
container={customContainer}
|
|
253
267
|
/>
|
|
@@ -271,7 +285,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
271
285
|
render(
|
|
272
286
|
<ThemeProvider theme={theme}>
|
|
273
287
|
<ResponsiveDrawer
|
|
274
|
-
|
|
288
|
+
anchorEl={anchor}
|
|
275
289
|
{...defaultProps}
|
|
276
290
|
container={customContainer}
|
|
277
291
|
slotProps={
|
|
@@ -297,7 +311,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
297
311
|
render(
|
|
298
312
|
<ThemeProvider theme={theme}>
|
|
299
313
|
<ResponsiveDrawer
|
|
300
|
-
|
|
314
|
+
anchorEl={anchor}
|
|
301
315
|
{...defaultProps}
|
|
302
316
|
sx={{ zIndex: 9999 }}
|
|
303
317
|
/>
|
|
@@ -311,7 +325,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
311
325
|
test('non-modal: renders no backdrop', () => {
|
|
312
326
|
render(
|
|
313
327
|
<ThemeProvider theme={theme}>
|
|
314
|
-
<ResponsiveDrawer
|
|
328
|
+
<ResponsiveDrawer anchorEl={anchor} {...defaultProps} modal={false} />
|
|
315
329
|
</ThemeProvider>,
|
|
316
330
|
)
|
|
317
331
|
expect(document.querySelector('.MuiBackdrop-root')).toBeNull()
|
|
@@ -322,7 +336,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
322
336
|
test('non-modal: Escape does not close the panel', () => {
|
|
323
337
|
render(
|
|
324
338
|
<ThemeProvider theme={theme}>
|
|
325
|
-
<ResponsiveDrawer
|
|
339
|
+
<ResponsiveDrawer anchorEl={anchor} {...defaultProps} modal={false} />
|
|
326
340
|
</ThemeProvider>,
|
|
327
341
|
)
|
|
328
342
|
// Fire on a node inside the Modal root so it reaches the Modal's key handler.
|
|
@@ -336,7 +350,7 @@ describe('ResponsiveDrawer', () => {
|
|
|
336
350
|
test('modal (default): Escape closes the panel', () => {
|
|
337
351
|
render(
|
|
338
352
|
<ThemeProvider theme={theme}>
|
|
339
|
-
<ResponsiveDrawer
|
|
353
|
+
<ResponsiveDrawer anchorEl={anchor} {...defaultProps} />
|
|
340
354
|
</ThemeProvider>,
|
|
341
355
|
)
|
|
342
356
|
fireEvent.keyDown(screen.getByTestId('drawer-content'), {
|
|
@@ -14,10 +14,7 @@ import {
|
|
|
14
14
|
} from 'react'
|
|
15
15
|
|
|
16
16
|
type ResponsiveDrawerPosition =
|
|
17
|
-
| 'top-left'
|
|
18
|
-
| 'top-right'
|
|
19
|
-
| 'bottom-left'
|
|
20
|
-
| 'bottom-right'
|
|
17
|
+
'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'
|
|
21
18
|
|
|
22
19
|
/** Placement of the panel relative to its anchor (desktop popover only). */
|
|
23
20
|
export type ResponsiveDrawerPlacement = 'side' | 'overlay'
|
|
@@ -59,6 +56,7 @@ export function ResponsiveDrawer<
|
|
|
59
56
|
slotProps?: PopoverProps['slotProps']
|
|
60
57
|
},
|
|
61
58
|
>({
|
|
59
|
+
anchorEl,
|
|
62
60
|
ref,
|
|
63
61
|
children,
|
|
64
62
|
collapsed,
|
|
@@ -72,8 +70,15 @@ export function ResponsiveDrawer<
|
|
|
72
70
|
placement = 'side',
|
|
73
71
|
}: Required<Pick<T, 'collapsed' | 'onChangeCollapsed' | 'position'>> &
|
|
74
72
|
Pick<PopoverProps, 'slotProps' | 'sx' | 'container'> & {
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
/** Element the desktop popover is anchored to. */
|
|
74
|
+
anchorEl?: HTMLElement | null
|
|
75
|
+
/**
|
|
76
|
+
* @deprecated Use `anchorEl`. A JSX prop named `ref` is non-reactive under
|
|
77
|
+
* the React Compiler, so a state-held anchor stays frozen at its initial
|
|
78
|
+
* `null` and the popover never opens. Removed in the next major.
|
|
79
|
+
*/
|
|
80
|
+
ref?: HTMLElement | null
|
|
81
|
+
isMobile?: boolean
|
|
77
82
|
children: ReactNode
|
|
78
83
|
/**
|
|
79
84
|
* When `false`, the desktop popover is **non-modal**: no backdrop, clicks
|
|
@@ -91,6 +96,8 @@ export function ResponsiveDrawer<
|
|
|
91
96
|
placement?: ResponsiveDrawerPlacement
|
|
92
97
|
}) {
|
|
93
98
|
// Popover position is frozen on open — re-measure on content resize (callback ref: portal mounts after open).
|
|
99
|
+
const anchor = anchorEl ?? ref ?? null
|
|
100
|
+
|
|
94
101
|
const popoverActions = useRef<PopoverActions>(null)
|
|
95
102
|
const observerRef = useRef<ResizeObserver | null>(null)
|
|
96
103
|
const observeContent = useCallback((el: HTMLDivElement | null) => {
|
|
@@ -191,8 +198,8 @@ export function ResponsiveDrawer<
|
|
|
191
198
|
action={popoverActions}
|
|
192
199
|
sx={sx}
|
|
193
200
|
container={container}
|
|
194
|
-
anchorEl={
|
|
195
|
-
open={!collapsed &&
|
|
201
|
+
anchorEl={anchor}
|
|
202
|
+
open={!collapsed && anchor != null}
|
|
196
203
|
onClose={modal ? () => onChangeCollapsed(true) : undefined}
|
|
197
204
|
hideBackdrop={!modal}
|
|
198
205
|
disableScrollLock={!modal}
|
|
@@ -177,6 +177,25 @@ describe('<LegendRow> composition', () => {
|
|
|
177
177
|
// …and the note renders exactly once, after all variables.
|
|
178
178
|
expect(screen.getAllByText('One note for the whole layer.')).toHaveLength(1)
|
|
179
179
|
})
|
|
180
|
+
|
|
181
|
+
// These render with no ThemeProvider, i.e. MUI's default theme, whose
|
|
182
|
+
// defaultVariantMapping has no `caption` entry and falls back to a `span`.
|
|
183
|
+
// An inline box ignores the line-height, so the type must not depend on a
|
|
184
|
+
// theme-level variantMapping to come out as a block.
|
|
185
|
+
it('renders the note and the subtitle as blocks, not inline', () => {
|
|
186
|
+
renderRow('boxes', [
|
|
187
|
+
{
|
|
188
|
+
id: 'a',
|
|
189
|
+
name: 'A',
|
|
190
|
+
subtitle: 'Zoom 0-12',
|
|
191
|
+
helperText: 'A note.',
|
|
192
|
+
variables: [cat],
|
|
193
|
+
},
|
|
194
|
+
])
|
|
195
|
+
|
|
196
|
+
expect(screen.getByText('A note.').tagName).toBe('P')
|
|
197
|
+
expect(screen.getByText('Zoom 0-12').tagName).toBe('P')
|
|
198
|
+
})
|
|
180
199
|
})
|
|
181
200
|
|
|
182
201
|
describe('<LegendRow> grouped (inside Legend.Group)', () => {
|
|
@@ -112,7 +112,11 @@ export function LegendRow({ layerId, children }: LegendRowProps) {
|
|
|
112
112
|
)}
|
|
113
113
|
</Box>
|
|
114
114
|
{layer.subtitle && !effectivelyCollapsed && (
|
|
115
|
-
<Typography
|
|
115
|
+
<Typography
|
|
116
|
+
variant='caption'
|
|
117
|
+
color='text.secondary'
|
|
118
|
+
component='p'
|
|
119
|
+
>
|
|
116
120
|
{layer.subtitle}
|
|
117
121
|
</Typography>
|
|
118
122
|
)}
|
|
@@ -136,7 +140,16 @@ export function LegendRow({ layerId, children }: LegendRowProps) {
|
|
|
136
140
|
{layer.helperText && (
|
|
137
141
|
<Box sx={[styles.footer, inGroup && styles.footerGrouped]}>
|
|
138
142
|
{typeof layer.helperText === 'string' ? (
|
|
139
|
-
|
|
143
|
+
// `component` is load-bearing: MUI's defaultVariantMapping has
|
|
144
|
+
// no entry for `caption`, so it falls back to a `span` and the
|
|
145
|
+
// line-height stops governing the box. Meridian maps it to `p`
|
|
146
|
+
// by theme, which makes the box type depend on the consumer's
|
|
147
|
+
// theme rather than on this component.
|
|
148
|
+
<Typography
|
|
149
|
+
variant='caption'
|
|
150
|
+
color='text.secondary'
|
|
151
|
+
component='p'
|
|
152
|
+
>
|
|
140
153
|
{layer.helperText}
|
|
141
154
|
</Typography>
|
|
142
155
|
) : (
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Box, IconButton } from '@mui/material'
|
|
2
|
-
import FirstPageIcon from '@mui/icons-material
|
|
3
|
-
import KeyboardArrowLeft from '@mui/icons-material
|
|
4
|
-
import KeyboardArrowRight from '@mui/icons-material
|
|
5
|
-
import LastPageIcon from '@mui/icons-material
|
|
2
|
+
import { FirstPage as FirstPageIcon } from '@mui/icons-material'
|
|
3
|
+
import { KeyboardArrowLeft } from '@mui/icons-material'
|
|
4
|
+
import { KeyboardArrowRight } from '@mui/icons-material'
|
|
5
|
+
import { LastPage as LastPageIcon } from '@mui/icons-material'
|
|
6
6
|
import type { PaginationActionsProps } from '../types'
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -79,7 +79,11 @@ export function buildGridConfig(hasLegend: boolean, theme: Theme) {
|
|
|
79
79
|
* @param theme - MUI theme providing the typography token and palette
|
|
80
80
|
* @returns `{ fontSize, fontFamily, color }` for an ECharts `axisLabel`
|
|
81
81
|
*/
|
|
82
|
-
export function buildAxisLabelStyle(theme: Theme) {
|
|
82
|
+
export function buildAxisLabelStyle(theme: Theme): {
|
|
83
|
+
fontSize: string | number | undefined
|
|
84
|
+
fontFamily: string | undefined
|
|
85
|
+
color: string
|
|
86
|
+
} {
|
|
83
87
|
return {
|
|
84
88
|
fontSize: theme.typography.overlineDelicate?.fontSize,
|
|
85
89
|
fontFamily: theme.typography.overlineDelicate?.fontFamily,
|
|
@@ -391,6 +391,73 @@ describe('createPieOptionFactory — single-series (donut)', () => {
|
|
|
391
391
|
).toBe('')
|
|
392
392
|
})
|
|
393
393
|
|
|
394
|
+
it('label formatter renders EVERY slice when the label is moved off the centre (e.g. PDF outside labels)', () => {
|
|
395
|
+
// `position: 'center'` stacks every label on one anchor, so only the
|
|
396
|
+
// max-valued slice draws. An override that gives each slice its own
|
|
397
|
+
// anchor must label them all — otherwise a PDF/report export shows a
|
|
398
|
+
// single value and orphan leader lines for the rest.
|
|
399
|
+
const merge = createPieOptionFactory({ theme })
|
|
400
|
+
const out = merge(
|
|
401
|
+
{
|
|
402
|
+
series: [
|
|
403
|
+
{
|
|
404
|
+
type: 'pie' as const,
|
|
405
|
+
label: { show: true, position: 'outside' },
|
|
406
|
+
},
|
|
407
|
+
] as unknown as never,
|
|
408
|
+
},
|
|
409
|
+
[
|
|
410
|
+
[
|
|
411
|
+
{ name: 'A', value: 10 },
|
|
412
|
+
{ name: 'B', value: 25 },
|
|
413
|
+
],
|
|
414
|
+
],
|
|
415
|
+
) as {
|
|
416
|
+
series: { label: { formatter: (p: Record<string, unknown>) => string } }[]
|
|
417
|
+
}
|
|
418
|
+
const fmt = out.series[0]!.label.formatter
|
|
419
|
+
expect(
|
|
420
|
+
fmt({
|
|
421
|
+
name: 'A',
|
|
422
|
+
encode: { value: [1] },
|
|
423
|
+
data: { name: 'A', value: 10 },
|
|
424
|
+
}),
|
|
425
|
+
).toBe('{c|10}\n{b|A}')
|
|
426
|
+
expect(
|
|
427
|
+
fmt({
|
|
428
|
+
name: 'B',
|
|
429
|
+
encode: { value: [1] },
|
|
430
|
+
data: { name: 'B', value: 25 },
|
|
431
|
+
}),
|
|
432
|
+
).toBe('{c|25}\n{b|B}')
|
|
433
|
+
})
|
|
434
|
+
|
|
435
|
+
it('keeps the blank-line spacer for centre labels and drops it for off-centre ones', () => {
|
|
436
|
+
const data = [[{ name: 'A', value: 10 }]]
|
|
437
|
+
const params = {
|
|
438
|
+
name: 'A',
|
|
439
|
+
encode: { value: [1] },
|
|
440
|
+
data: { name: 'A', value: 10 },
|
|
441
|
+
}
|
|
442
|
+
interface Out {
|
|
443
|
+
series: { label: { formatter: (p: Record<string, unknown>) => string } }[]
|
|
444
|
+
}
|
|
445
|
+
const centered = createPieOptionFactory({ theme })(
|
|
446
|
+
{},
|
|
447
|
+
data,
|
|
448
|
+
) as unknown as Out
|
|
449
|
+
const outside = createPieOptionFactory({ theme })(
|
|
450
|
+
{
|
|
451
|
+
series: [
|
|
452
|
+
{ type: 'pie' as const, label: { position: 'inside' } },
|
|
453
|
+
] as unknown as never,
|
|
454
|
+
},
|
|
455
|
+
data,
|
|
456
|
+
) as unknown as Out
|
|
457
|
+
expect(centered.series[0]!.label.formatter(params)).toBe('{c|10}\n\n{b|A}')
|
|
458
|
+
expect(outside.series[0]!.label.formatter(params)).toBe('{c|10}\n{b|A}')
|
|
459
|
+
})
|
|
460
|
+
|
|
394
461
|
it('label formatter treats an explicit empty selection as no selection (renders the true max, not blank)', () => {
|
|
395
462
|
const merge = createPieOptionFactory({ theme, selection: [] })
|
|
396
463
|
const out = merge({}, [[{ name: 'A', value: 10 }]]) as {
|
|
@@ -246,6 +246,21 @@ function buildSingleSeriesPieFusion(
|
|
|
246
246
|
: echarts.color.modifyAlpha(base, 0.15)
|
|
247
247
|
}
|
|
248
248
|
|
|
249
|
+
// ECharts anchors EVERY slice's `position: 'center'` label at the same
|
|
250
|
+
// point, so at most one of them can ever be legible — the donut design
|
|
251
|
+
// leans into that (one KPI inside the ring) and picks a single slice
|
|
252
|
+
// below. A consumer that moves the labels off the centre gives each
|
|
253
|
+
// slice its own anchor (`'outside'` with leader lines is what the PDF
|
|
254
|
+
// export uses, `'inside'` / `'insideTop'` … likewise), and there the
|
|
255
|
+
// single-label rule is simply wrong: every slice must render its own
|
|
256
|
+
// label. Read the position off the structural template, which already
|
|
257
|
+
// carries the consumer's `optionsOverride`.
|
|
258
|
+
const templateLabelPosition = (
|
|
259
|
+
broadcastTemplate as { label?: { position?: unknown } }
|
|
260
|
+
).label?.position
|
|
261
|
+
const isCenterLabel =
|
|
262
|
+
templateLabelPosition === undefined || templateLabelPosition === 'center'
|
|
263
|
+
|
|
249
264
|
// Which slice renders the centre value+name: the greatest value among
|
|
250
265
|
// the *included* slices (all of them when there's no active
|
|
251
266
|
// selection), computed locally — no query round-trip. Only that one
|
|
@@ -254,7 +269,8 @@ function buildSingleSeriesPieFusion(
|
|
|
254
269
|
// `typeof value === 'number'` participates — if every included slice's
|
|
255
270
|
// value is non-numeric, `centerMaxName` stays `undefined` and no slice
|
|
256
271
|
// matches it in `labelTextFormatter` below, so the chart renders with no
|
|
257
|
-
// centre label at all (graceful no-op, not a crash).
|
|
272
|
+
// centre label at all (graceful no-op, not a crash). Skipped entirely
|
|
273
|
+
// for off-centre labels, where every slice labels itself.
|
|
258
274
|
const centerData = seriesArr[0] ?? []
|
|
259
275
|
let centerMaxName: string | number | undefined
|
|
260
276
|
let centerMaxValue = -Infinity
|
|
@@ -266,13 +282,14 @@ function buildSingleSeriesPieFusion(
|
|
|
266
282
|
}
|
|
267
283
|
}
|
|
268
284
|
|
|
269
|
-
//
|
|
285
|
+
// Slice label formatter — lives in the merger because it reads
|
|
270
286
|
// reactive `formatter` / `labelFormatter` from ctx. The rich tags
|
|
271
287
|
// `{c|…}` and `{b|…}` reference the rich styles baked into the
|
|
272
288
|
// structural label template.
|
|
273
289
|
const labelTextFormatter = (params: CallbackDataParams): string => {
|
|
274
290
|
const { name } = params
|
|
275
|
-
if (name == null
|
|
291
|
+
if (name == null) return ''
|
|
292
|
+
if (isCenterLabel && name !== centerMaxName) return ''
|
|
276
293
|
const encodeIndex = params.encode?.value?.[0]
|
|
277
294
|
if (encodeIndex === undefined) return ''
|
|
278
295
|
const value = (Object.values(params.data ?? {}) as unknown[]).at(
|
|
@@ -292,7 +309,13 @@ function buildSingleSeriesPieFusion(
|
|
|
292
309
|
const formattedName = labelFormatter
|
|
293
310
|
? String(labelFormatter(name ?? ''))
|
|
294
311
|
: String(name ?? '')
|
|
295
|
-
|
|
312
|
+
// The blank line is what separates the big centre KPI from its
|
|
313
|
+
// caption. Off-centre labels sit next to their own slice and are
|
|
314
|
+
// laid out against their neighbours, so the spacer only inflates
|
|
315
|
+
// each label's bounding box — enough, with a hidden `{b|…}` block,
|
|
316
|
+
// to make ECharts drop colliding labels altogether.
|
|
317
|
+
const separator = isCenterLabel ? '\n\n' : '\n'
|
|
318
|
+
return `{c|${formattedValue}}${separator}{b|${formattedName}}`
|
|
296
319
|
}
|
|
297
320
|
|
|
298
321
|
return {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest'
|
|
2
2
|
import { fireEvent, render, screen } from '@testing-library/react'
|
|
3
|
-
import StarIcon from '@mui/icons-material
|
|
3
|
+
import { Star as StarIcon } from '@mui/icons-material'
|
|
4
4
|
import { SelectionSummary } from './selection-summary'
|
|
5
5
|
|
|
6
6
|
describe('<SelectionSummary>', () => {
|
|
@@ -2,7 +2,7 @@ import { useEffect, useRef } from 'react'
|
|
|
2
2
|
import { describe, it, expect } from 'vitest'
|
|
3
3
|
import { fireEvent, render, screen } from '@testing-library/react'
|
|
4
4
|
import { IconButton } from '@mui/material'
|
|
5
|
-
import StarIcon from '@mui/icons-material
|
|
5
|
+
import { Star as StarIcon } from '@mui/icons-material'
|
|
6
6
|
import { Toolbox } from './toolbox'
|
|
7
7
|
|
|
8
8
|
function makeChildren(n: number) {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chart-config-BGt7wkK7.js","names":["Theme","LegendComponentOption","CallbackDataParams","TopLevelFormatterParams","niceNum","value","absValue","Math","abs","base","pow","floor","log10","rounded","ceil","buildLegendConfig","hasLegend","labelFormatter","show","icon","const","left","bottom","orient","type","formatter","name","String","buildGridConfig","theme","parseInt","spacing","buildAxisLabelStyle","fontSize","typography","overlineDelicate","fontFamily","color","palette","black","text","secondary","createTooltipPositioner","point","_params","_dom","_rect","size","contentSize","viewSize","position","top","Record","right","createAxisLabelFormatter","undefined","applyXAxisFormatter","xAxis","xAxisIsObject","Array","isArray","xAxisTyped","axisLabel","axisFormatter","applyYAxisFormatter","yAxis","yAxisIsObject","yAxisTyped","createTooltipFormatter","callback","item","items","seriesName","marker","params","tooltip","values","map","showMargin","length","marginStyle","formattedValues","join","buildSeriesLabelConfig","encodeKey","label","encodeIndex","encode","dimName","dimensionNames","row","buildHistogramSeriesLabelConfig","downloadToCSV","downloadToPNG","DownloadItem","ConfigProps","createChartDownloadConfig","csvModifier","data","TData","refUI","modifier","rows"],"sources":["../src/widgets/utils/chart-config/option-builders.ts","../src/widgets/utils/chart-config/download-config.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport type { LegendComponentOption } from 'echarts'\nimport type {\n CallbackDataParams,\n TopLevelFormatterParams,\n} from 'echarts/types/dist/shared'\n\n/**\n * Shared EChart configuration builders for chart widgets\n */\n\n/**\n * Rounds a value up to the nearest \"nice\" number.\n * A nice number is a multiple of 10^floor(log10(value)).\n *\n * Examples: 547 → 600, 200 → 200, 1200 → 2000, 18 → 20, 5 → 5, -547 → -500\n */\nexport function niceNum(value: number): number {\n if (value === 0) return 0\n const absValue = Math.abs(value)\n const base = Math.pow(10, Math.floor(Math.log10(absValue)))\n const rounded = Math.ceil(absValue / base) * base\n return value < 0 ? -rounded : rounded\n}\n\n/**\n * Builds standard legend configuration for chart widgets\n *\n * @param params - Legend configuration parameters\n * @param params.hasLegend - Whether to show the legend\n * @param params.labelFormatter - Optional formatter for legend item names\n * @returns Legend configuration object\n */\nexport function buildLegendConfig({\n hasLegend,\n labelFormatter,\n}: {\n hasLegend: boolean\n labelFormatter?: (value: string | number) => string | number\n}): LegendComponentOption {\n return {\n show: hasLegend,\n icon: 'circle' as const,\n left: 0,\n bottom: 0,\n orient: 'horizontal',\n type: 'scroll',\n ...(labelFormatter && {\n formatter: (name: string) => String(labelFormatter(name)),\n }),\n }\n}\n\n/**\n * Builds standard grid configuration with legend-aware spacing\n *\n * @param hasLegend - Whether the chart has a legend\n * @param theme - MUI theme for spacing\n * @param additionalConfig - Additional grid configuration to merge\n * @returns Grid configuration object\n */\nexport function buildGridConfig(hasLegend: boolean, theme: Theme) {\n return {\n ...(!hasLegend && { bottom: parseInt(theme.spacing(3)) }),\n ...(hasLegend && { bottom: parseInt(theme.spacing(7)) }),\n }\n}\n\n/**\n * Builds the shared axis-label text style for chart widgets, matching the\n * design's \"Overline (Delicate)\" token (Inter, 10px) in the secondary text\n * colour (`rgba(44,48,50,0.6)`). Spread into an ECharts `axisLabel` for both\n * x and y axes so every chart's labels stay consistent.\n *\n * Note: the token's `letterSpacing` and `textTransform: uppercase` are not\n * representable in ECharts canvas text, so only font size/family/colour are\n * applied.\n *\n * @param theme - MUI theme providing the typography token and palette\n * @returns `{ fontSize, fontFamily, color }` for an ECharts `axisLabel`\n */\nexport function buildAxisLabelStyle(theme: Theme) {\n return {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n color: theme.palette.black?.[60] ?? theme.palette.text.secondary,\n }\n}\n\n/**\n * Creates a tooltip position calculator that handles overflow\n * Used by bar, histogram, and scatterplot widgets\n *\n * @param theme - MUI theme for spacing\n * @returns Tooltip position function\n */\nexport function createTooltipPositioner(theme: Theme) {\n return function (\n point: [number, number],\n _params: unknown,\n _dom: unknown,\n _rect: unknown,\n size: { contentSize: [number, number]; viewSize: [number, number] },\n ) {\n const position = { top: parseInt(theme.spacing(0.5)) } as Record<\n string,\n number\n >\n\n // Position tooltip left or right based on available space\n if (size.contentSize[0] < size.viewSize[0] - point[0]) {\n position.left = point[0]\n } else {\n position.right = size.viewSize[0] - point[0]\n }\n\n return position\n }\n}\n\n/**\n * Creates an axis label formatter for ECharts\n * Used to format numeric axis labels with a widget formatter\n *\n * @param formatter - Optional formatter function from widget config\n * @returns Axis label formatter function or undefined\n */\nexport function createAxisLabelFormatter(\n formatter?: (value: number) => string,\n) {\n if (!formatter) return undefined\n return (value: number) => formatter(value)\n}\n\n/**\n * Applies labelFormatter to xAxis configuration\n * Applies to any xAxis regardless of axis type (category, value, etc.)\n *\n * @param xAxis - Existing xAxis configuration\n * @param labelFormatter - Optional labelFormatter function from widget config\n * @returns Updated xAxis configuration\n */\nexport function applyXAxisFormatter(\n xAxis: unknown,\n formatter?: (value: string | number) => string | number,\n) {\n const xAxisIsObject = xAxis && !Array.isArray(xAxis)\n const xAxisTyped = xAxis as { type?: string; axisLabel?: unknown }\n\n const axisFormatter =\n formatter && xAxisIsObject\n ? (value: string | number) => String(formatter(value))\n : undefined\n\n return {\n ...xAxisTyped,\n axisLabel: {\n ...(typeof xAxisTyped.axisLabel === 'object' && xAxisTyped.axisLabel\n ? xAxisTyped.axisLabel\n : {}),\n formatter: axisFormatter,\n },\n }\n}\n\n/**\n * Applies formatter to yAxis configuration\n * Only applies to single axis objects (not arrays) with type 'value'\n *\n * @param yAxis - Existing yAxis configuration\n * @param formatter - Optional formatter function from widget config\n * @returns Updated yAxis configuration or undefined if no changes needed\n */\nexport function applyYAxisFormatter(\n yAxis: unknown,\n formatter?: (value: number) => string,\n) {\n let axisFormatter = createAxisLabelFormatter(formatter)\n\n const yAxisIsObject = yAxis && !Array.isArray(yAxis)\n const yAxisTyped = yAxis as { type?: string; axisLabel?: unknown }\n\n if (!yAxisIsObject || yAxisTyped.type !== 'value') {\n axisFormatter = undefined\n }\n\n return {\n ...yAxisTyped,\n axisLabel: {\n ...(typeof yAxisTyped.axisLabel === 'object' && yAxisTyped.axisLabel\n ? yAxisTyped.axisLabel\n : {}),\n formatter: axisFormatter,\n },\n }\n}\n\n/**\n * Creates a tooltip formatter for ECharts\n * Formats numeric values in tooltip using widget formatter\n * Handles both axis trigger (array) and item trigger (object) modes\n *\n * @param formatter - Optional formatter function from widget config\n * @returns Tooltip formatter function or undefined\n */\nexport function createTooltipFormatter(\n callback: (\n item: CallbackDataParams,\n items: CallbackDataParams[],\n ) => {\n name: string\n seriesName: string\n marker: string\n value: string | number\n },\n) {\n return (params: TopLevelFormatterParams) => {\n // Handle both array (axis trigger) and object (item trigger)\n const items = Array.isArray(params) ? params : [params]\n\n const tooltip = (name: string, callback: string) =>\n `<div style=\"margin: 0px 0 0;line-height:1;\">${name ? `<div style=\"font-size:11px;color:#FFFFFF;font-weight:400;line-height:1; margin-bottom: 10px\">${name}</div>` : ''}<div style=\"margin: 0;line-height:1;\">${callback}</div><div style=\"clear:both\"></div></div>`\n\n const values = items.map((item) => {\n const { name, seriesName, marker, value } = callback(item, items)\n return {\n name,\n seriesName,\n marker,\n value,\n }\n })\n\n const name = values[0]?.name ?? ''\n // Show margin if name exists or there are multiple items\n const showMargin = name || items.length > 1\n const marginStyle = showMargin\n ? 'margin: 10px 0 0;line-height:1;'\n : 'margin: 0;line-height:1;'\n\n const formattedValues = values.map(\n ({ seriesName, marker, value }) =>\n `<div style=\"${marginStyle}\"><div style=\"margin: 0px 0 0;line-height:1;\">${marker}${seriesName ? `<span style=\"font-size:11px;color:#FFFFFF;font-weight:400;margin-left:2px;margin-right:10px\">${seriesName}</span>` : ''}<span style=\"float:right;margin-left:10px;font-size:11px;color:#FFFFFF;font-weight:900\">${value}</span></div></div>`,\n )\n\n return tooltip(name, formattedValues.join(''))\n }\n}\n\n/**\n * Builds a series `label` config that applies formatter to the data value\n * extracted from a dataset row using ECharts encode/dimensionNames.\n *\n * Does not set `show` — labels remain hidden by default per ECharts defaults.\n *\n * @param formatter - Optional numeric value formatter\n * @param encodeKey - The encode dimension key to extract ('y' for vertical charts, 'x' for horizontal)\n */\nexport function buildSeriesLabelConfig(\n formatter?: (value: number) => string,\n encodeKey = 'y',\n): { label: { formatter: (params: CallbackDataParams) => string } } | object {\n if (!formatter) return {}\n\n return {\n label: {\n formatter: (params: CallbackDataParams) => {\n const encodeIndex = params.encode?.[encodeKey]?.[0]\n if (encodeIndex === undefined) return ''\n const dimName = params.dimensionNames?.[encodeIndex]\n const row = params.value as Record<string, string | number>\n const value = dimName ? row[dimName] : undefined\n return typeof value === 'number'\n ? formatter(value)\n : String(value ?? '')\n },\n },\n }\n}\n\n/**\n * Builds a series `label` config that applies formatter to a raw numeric value.\n * Used by histogram where series data is number[] (not datasets).\n *\n * Does not set `show` — labels remain hidden by default per ECharts defaults.\n *\n * @param formatter - Optional numeric value formatter\n */\nexport function buildHistogramSeriesLabelConfig(\n formatter?: (value: number) => string,\n): { label: { formatter: (params: CallbackDataParams) => string } } | object {\n if (!formatter) return {}\n\n return {\n label: {\n formatter: (params: CallbackDataParams) => {\n const value = params.value as number\n return typeof value === 'number'\n ? formatter(value)\n : String(value ?? '')\n },\n },\n }\n}\n","import { downloadToCSV, downloadToPNG, type DownloadItem } from '../../actions'\nimport type { ConfigProps } from '../../loader/types'\n\nexport function createChartDownloadConfig<TData>(\n csvModifier: (data: TData) => string[][],\n) {\n return function ({ refUI }: ConfigProps): DownloadItem<TData>[] {\n return [\n {\n ...downloadToPNG,\n modifier: () => downloadToPNG.modifier(refUI),\n },\n {\n ...downloadToCSV,\n modifier: async (data) => {\n const rows = csvModifier(data)\n return downloadToCSV.modifier(rows)\n },\n },\n ]\n }\n}\n"],"mappings":"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"}
|