@carto/ps-react-ui 4.20.2 → 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 +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 +3 -3
- 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 +5 -4
- 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/utils/chart-config/option-builders.ts +5 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download-BT6qBamM.js","names":["html2canvas","DownloadHandle","url","revoke","CSV_FORMULA_PREFIX","toCsvString","rows","escape","cell","value","String","JSON","stringify","test","replace","map","row","join","downloadToCSV","csv","blob","Blob","type","URL","createObjectURL","revokeObjectURL","UNSAFE_FILENAME_CHARS","MAX_FILENAME_LENGTH","sanitizeFilename","name","slice","triggerLinkDownload","args","filename","a","document","createElement","href","download","style","display","body","appendChild","click","remove","DownloadDOMToPNGOptions","element","HTMLElement","pixelRatio","backgroundColor","downloadDOMToPNG","opts","Promise","canvas","scale","useCORS","logging","resolve","reject","toBlob","Error","DownloadLabels","trigger","loading","error","DEFAULT_DOWNLOAD_LABELS","useCallback","useState","ComponentType","CircularProgress","IconButton","ListItemIcon","ListItemText","Menu","MenuItem","SvgIconProps","FileDownload","DownloadIcon","Tooltip","triggerLinkDownload","DownloadItem","DEFAULT_DOWNLOAD_LABELS","DownloadLabels","DownloadProps","items","labels","Partial","icon","iconProps","onError","err","Error","Download","t0","$","_c","t1","Icon","undefined","t2","_labels","anchorEl","setAnchorEl","isDownloading","setIsDownloading","error","setError","t3","Symbol","for","e","currentTarget","open","t4","close","t5","item","disabled","resolve","then","t6","url","filename","revoke","setTimeout","catch","e_0","String","finally","onSelect","triggerLabel","loading","trigger","triggerActive","Boolean","t7","t8","t9","length","t10","t11","t12","t13","t14","t15","t16","vertical","horizontal","t17","t18","item_0","id","color","label","map","t19","SvgIcon","SvgIconProps","ArticleOutlined","ImageOutlined","PNGIcon","props","$","_c","t0","MarkdownIcon","CSVIcon","Symbol","for","t1","DOWNLOAD_ITEM_IDS","png","csv","markdown","const","DownloadItemId","DOWNLOAD_ITEM_IDS","downloadDOMToPNG","PNGIcon","DownloadItem","BuildPngDownloadItemArgs","filename","getCaptureEl","HTMLElement","pixelRatio","backgroundColor","label","buildPngDownloadItem","args","id","png","icon","resolve","el","Error","handle","element","url","revoke","DOWNLOAD_ITEM_IDS","downloadToCSV","CSVIcon","DownloadItem","BuildCsvDownloadItemBase","filename","label","BuildCsvDownloadItemArgs","getRows","getCsv","buildCsvDownloadItem","args","id","csv","icon","resolve","blob","Blob","type","url","URL","createObjectURL","Promise","revoke","revokeObjectURL","handle"],"sources":["../src/widgets-v2/actions/download/exports.ts","../src/widgets-v2/actions/download/labels.ts","../src/widgets-v2/actions/download/download.tsx","../src/widgets-v2/actions/download/icons.tsx","../src/widgets-v2/actions/download/constants.ts","../src/widgets-v2/actions/download/png-item.tsx","../src/widgets-v2/actions/download/csv-item.tsx"],"sourcesContent":["/**\n * Pure download helpers — no React, no DOM lifecycle outside the link click.\n * Component layer in {@link ./download.tsx} orchestrates these.\n */\n\nimport html2canvas from 'html2canvas'\n\nexport interface DownloadHandle {\n url: string\n revoke: () => void\n}\n\n// Leading characters that Excel / Sheets / Numbers interpret as a formula\n// when the CSV is opened. Prefixing the cell with a single quote forces the\n// spreadsheet app to render it as plain text. Tab and CR are included\n// because some tooling strips leading whitespace before formula evaluation.\nconst CSV_FORMULA_PREFIX = /^[=+\\-@\\t\\r]/\n\nexport function toCsvString(rows: readonly (readonly unknown[])[]): string {\n const escape = (cell: unknown): string => {\n if (cell == null) return ''\n let value =\n typeof cell === 'string'\n ? cell\n : typeof cell === 'number' || typeof cell === 'boolean'\n ? String(cell)\n : JSON.stringify(cell)\n if (CSV_FORMULA_PREFIX.test(value)) value = `'${value}`\n if (/[\",\\n\\r]/.test(value)) return `\"${value.replace(/\"/g, '\"\"')}\"`\n return value\n }\n return rows.map((row) => row.map(escape).join(',')).join('\\n')\n}\n\nexport function downloadToCSV(\n rows: readonly (readonly unknown[])[],\n): DownloadHandle {\n const csv = toCsvString(rows)\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n return { url, revoke: () => URL.revokeObjectURL(url) }\n}\n\n// Path separators, NUL, and ASCII control chars. Filenames containing these\n// can confuse the browser download stack and historically enabled\n// Content-Disposition-style trickery.\n// eslint-disable-next-line no-control-regex\nconst UNSAFE_FILENAME_CHARS = /[\\\\/\\x00-\\x1f\\x7f]/g\nconst MAX_FILENAME_LENGTH = 200\n\nexport function sanitizeFilename(name: string): string {\n return (\n (name ?? '')\n .replace(UNSAFE_FILENAME_CHARS, '_')\n .slice(0, MAX_FILENAME_LENGTH) || 'download'\n )\n}\n\n/**\n * Triggers a browser download for the given URL by synthesizing an anchor,\n * clicking it, and removing it. Pure DOM — no React. The filename is run\n * through {@link sanitizeFilename} before being assigned to `a.download`.\n */\nexport function triggerLinkDownload(args: {\n url: string\n filename: string\n}): void {\n const { url, filename } = args\n const a = document.createElement('a')\n a.href = url\n a.download = sanitizeFilename(filename)\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n a.remove()\n}\n\nexport interface DownloadDOMToPNGOptions {\n element: HTMLElement\n /** html2canvas `scale`. Default 2 — crisp on hi-DPI displays. */\n pixelRatio?: number\n /**\n * html2canvas `backgroundColor`. Default `null` (transparent) so the PNG\n * inherits whatever surface it lands on when the user pastes it.\n */\n backgroundColor?: string | null\n}\n\n/**\n * Rasterise an HTMLElement to PNG via `html2canvas` and wrap the result in\n * a `DownloadHandle`. The caller is responsible for calling `handle.revoke`\n * after the link click is dispatched. Used by per-widget download configs\n * to power the PNG menu item.\n */\nexport async function downloadDOMToPNG(\n opts: DownloadDOMToPNGOptions,\n): Promise<DownloadHandle> {\n const { element, pixelRatio = 2, backgroundColor = null } = opts\n const canvas = await html2canvas(element, {\n scale: pixelRatio,\n backgroundColor,\n useCORS: true,\n logging: false,\n })\n return new Promise<DownloadHandle>((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (!blob) {\n reject(new Error('[widgets-v2] toBlob() returned null'))\n return\n }\n const url = URL.createObjectURL(blob)\n resolve({ url, revoke: () => URL.revokeObjectURL(url) })\n }, 'image/png')\n })\n}\n","export interface DownloadLabels {\n trigger: string\n /** Tooltip / aria-label shown on the trigger while a download is in flight. */\n loading: string\n /**\n * Tooltip / aria-label shown on the trigger after a download failed. Cleared\n * the next time the menu opens.\n */\n error: string\n}\n\nexport const DEFAULT_DOWNLOAD_LABELS: DownloadLabels = {\n trigger: 'Download',\n loading: 'Downloading…',\n error: 'Download failed',\n}\n","import { useCallback, useState, type ComponentType } from 'react'\nimport {\n CircularProgress,\n IconButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n type SvgIconProps,\n} from '@mui/material'\nimport { FileDownload as DownloadIcon } from '@mui/icons-material'\nimport { Tooltip } from '../../../components'\nimport { triggerLinkDownload } from './exports'\nimport type { DownloadItem } from './types'\nimport { DEFAULT_DOWNLOAD_LABELS, type DownloadLabels } from './labels'\n\nexport interface DownloadProps {\n items: readonly DownloadItem[]\n labels?: Partial<DownloadLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Fires when an item's `resolve()` rejects (or any step in the click-through\n * path throws). The error is normalised to a real `Error` first. Surface\n * to your telemetry / toast layer here; the trigger already shows a visual\n * error indicator independently.\n */\n onError?: (err: Error) => void\n}\n\nexport function Download({\n items,\n labels,\n icon: Icon = DownloadIcon,\n iconProps,\n onError,\n}: DownloadProps) {\n const _labels = { ...DEFAULT_DOWNLOAD_LABELS, ...labels }\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n const [isDownloading, setIsDownloading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const open = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {\n // Clear any prior error when the user re-engages the menu — the next\n // attempt is a fresh interaction, not a continuation of the failed one.\n setError(null)\n setAnchorEl(e.currentTarget)\n }, [])\n const close = useCallback(() => setAnchorEl(null), [])\n\n const onSelect = useCallback(\n (item: DownloadItem) => {\n // Single-flight: ignore re-entry while a download is already in flight.\n // The trigger is `disabled` and the menu is closed during that window,\n // so this guard mostly defends against future call sites that bypass\n // the menu (e.g. keyboard shortcuts).\n if (item.disabled || isDownloading) return\n close()\n setIsDownloading(true)\n setError(null)\n item\n .resolve()\n .then(({ url, filename, revoke }) => {\n // `item.filename` overrides what `resolve()` returns — lets consumers\n // template the filename with widget metadata declaratively.\n triggerLinkDownload({ url, filename: item.filename ?? filename })\n // Defer revoke past the current task so Safari / Firefox-on-slow-disk\n // can dispatch the download before the blob URL is invalidated.\n // Synchronous revoke here can silently cancel the download.\n if (revoke) setTimeout(revoke, 0)\n })\n .catch((err: unknown) => {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n onError?.(e)\n })\n .finally(() => {\n setIsDownloading(false)\n })\n },\n [close, isDownloading, onError],\n )\n\n const triggerLabel = isDownloading\n ? _labels.loading\n : error\n ? _labels.error\n : _labels.trigger\n const triggerActive = Boolean(anchorEl) || isDownloading\n\n return (\n <>\n <Tooltip title={triggerLabel}>\n <IconButton\n size='small'\n aria-label={triggerLabel}\n aria-haspopup='true'\n aria-expanded={anchorEl ? 'true' : undefined}\n aria-busy={isDownloading || undefined}\n data-error={error ? 'true' : undefined}\n disabled={isDownloading || items.length === 0}\n onClick={open}\n className={triggerActive ? 'active' : undefined}\n >\n {isDownloading ? (\n <CircularProgress size={18} color='inherit' />\n ) : (\n <Icon fontSize='small' {...iconProps} />\n )}\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={close}\n variant='menu'\n elevation={8}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n {items.map((item) => (\n <MenuItem\n key={item.id}\n disabled={item.disabled}\n onClick={() => void onSelect(item)}\n >\n {item.icon && (\n <ListItemIcon sx={{ color: 'text.primary' }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText>{item.label}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>\n )\n}\n","import { SvgIcon, type SvgIconProps } from '@mui/material'\nimport { ArticleOutlined, ImageOutlined } from '@mui/icons-material'\n\n/**\n * Generic \"image\" glyph used for the PNG download item. Wraps MUI's\n * `ImageOutlined` so callers can swap it via the per-widget download\n * config's `icon` override without pulling MUI directly.\n */\nexport function PNGIcon(props: SvgIconProps) {\n return <ImageOutlined {...props} />\n}\n\n/**\n * Generic \"document\" glyph used for the Markdown download item. Wraps MUI's\n * `ArticleOutlined`, mirroring {@link PNGIcon}, so the Markdown menu item\n * carries an icon consistent with the other download formats.\n */\nexport function MarkdownIcon(props: SvgIconProps) {\n return <ArticleOutlined {...props} />\n}\n\n/**\n * \"CSV\" rectangle with the letters spelled inside — matches v1 visual and is\n * easier to recognise in a download menu than a generic table glyph.\n */\nexport function CSVIcon(props: SvgIconProps) {\n return (\n <SvgIcon viewBox='0 0 18 18' {...props}>\n <path\n fill='currentColor'\n d='M4.313 11.25h2.25v-1.125H4.688v-2.25h1.875V6.75h-2.25a.726.726 0 0 0-.535.216.726.726 0 0 0-.216.534v3c0 .213.072.39.216.534a.726.726 0 0 0 .534.216Zm2.925 0h2.25c.212 0 .39-.072.534-.216a.726.726 0 0 0 .216-.534V9.375a.931.931 0 0 0-.216-.59.658.658 0 0 0-.534-.273H8.363v-.637h1.875V6.75h-2.25a.726.726 0 0 0-.535.216.726.726 0 0 0-.216.534v1.125c0 .213.072.403.216.572a.675.675 0 0 0 .534.253h1.126v.675H7.238v1.125Zm4.95 0h1.124l1.313-4.5H13.5l-.75 2.588L12 6.75h-1.125l1.313 4.5ZM3 15c-.413 0-.766-.147-1.06-.44a1.445 1.445 0 0 1-.44-1.06v-9c0-.412.147-.766.44-1.06C2.235 3.148 2.588 3 3 3h12c.412 0 .766.147 1.06.44.293.294.44.648.44 1.06v9c0 .412-.147.766-.44 1.06-.294.293-.647.44-1.06.44H3Zm0-1.5h12v-9H3v9Z'\n />\n </SvgIcon>\n )\n}\n","/**\n * Canonical `DownloadItem.id`s for the built-in download formats. Centralised\n * so the per-format builders — and anything that keys off the id (menu logic,\n * tests) — reference one source of truth instead of re-typing string literals.\n * The Markdown format keeps the short `'md'` id to match its `.md` extension.\n */\nexport const DOWNLOAD_ITEM_IDS = {\n png: 'png',\n csv: 'csv',\n markdown: 'md',\n} as const\n\nexport type DownloadItemId =\n (typeof DOWNLOAD_ITEM_IDS)[keyof typeof DOWNLOAD_ITEM_IDS]\n","import { DOWNLOAD_ITEM_IDS } from './constants'\nimport { downloadDOMToPNG } from './exports'\nimport { PNGIcon } from './icons'\nimport type { DownloadItem } from './types'\n\nexport interface BuildPngDownloadItemArgs {\n /** Base filename (without extension). The item appends `.png`. */\n filename: string\n /**\n * Reads the capture element to rasterise. Called at click time so the\n * download config doesn't capture a stale reference. Wire it to\n * `() => getCaptureEl(id)` from `widgets-v2/stores`.\n */\n getCaptureEl: () => HTMLElement | null\n /** html2canvas `scale`. Default 2. */\n pixelRatio?: number\n /** html2canvas `backgroundColor`. Default transparent (`null`). */\n backgroundColor?: string | null\n /** Override the menu label. Default `'PNG'`. */\n label?: string\n}\n\n/**\n * Builds the standard PNG `DownloadItem` used by every per-widget download\n * config. Centralised so the menu label, icon, error message, and filename\n * suffix stay consistent across widgets without each `create*DownloadConfig`\n * re-deriving the same shape.\n */\nexport function buildPngDownloadItem(\n args: BuildPngDownloadItemArgs,\n): DownloadItem {\n return {\n id: DOWNLOAD_ITEM_IDS.png,\n label: args.label ?? 'PNG',\n icon: <PNGIcon fontSize='small' />,\n resolve: async () => {\n const el = args.getCaptureEl()\n if (!el) {\n throw new Error('[widgets-v2] No PNG capture element available')\n }\n const handle = await downloadDOMToPNG({\n element: el,\n pixelRatio: args.pixelRatio,\n backgroundColor: args.backgroundColor,\n })\n return {\n url: handle.url,\n filename: `${args.filename}.png`,\n revoke: handle.revoke,\n }\n },\n }\n}\n","import { DOWNLOAD_ITEM_IDS } from './constants'\nimport { downloadToCSV } from './exports'\nimport { CSVIcon } from './icons'\nimport type { DownloadItem } from './types'\n\ninterface BuildCsvDownloadItemBase {\n /** Base filename (without extension). The item appends `.csv`. */\n filename: string\n /** Override the menu label. Default `'CSV'`. */\n label?: string\n}\n\n/**\n * Args for {@link buildCsvDownloadItem}. A discriminated union: a caller must\n * supply exactly one content source — `getRows` (rows serialised through the\n * shared `toCsvString`) or `getCsv` (a pre-built CSV string). The `?: never`\n * arms make passing both — or neither — a compile-time error.\n */\nexport type BuildCsvDownloadItemArgs =\n | (BuildCsvDownloadItemBase & {\n /**\n * Builds the CSV rows at click time. Used by most widgets — rows are run\n * through `toCsvString` so escaping (incl. the spreadsheet\n * formula-injection guard) stays consistent across widgets.\n */\n getRows: () => readonly (readonly unknown[])[]\n getCsv?: never\n })\n | (BuildCsvDownloadItemBase & {\n /**\n * Returns a pre-built CSV string at click time. Escape hatch for widgets\n * (e.g. Table) that already serialise their own CSV with bespoke\n * header/cell handling.\n */\n getCsv: () => string\n getRows?: never\n })\n\n/**\n * Builds the standard CSV `DownloadItem` used by every per-widget download\n * config. Centralised so the menu label, icon, and `.csv` filename suffix stay\n * consistent across widgets — mirrors {@link buildPngDownloadItem} so neither\n * format can drift again.\n */\nexport function buildCsvDownloadItem(\n args: BuildCsvDownloadItemArgs,\n): DownloadItem {\n return {\n id: DOWNLOAD_ITEM_IDS.csv,\n label: args.label ?? 'CSV',\n icon: <CSVIcon fontSize='small' />,\n resolve: () => {\n if (args.getCsv) {\n const csv = args.getCsv()\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n return Promise.resolve({\n url,\n filename: `${args.filename}.csv`,\n revoke: () => URL.revokeObjectURL(url),\n })\n }\n const handle = downloadToCSV(args.getRows())\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"download-C7he8mSh.js","names":["html2canvas","DownloadHandle","url","revoke","CSV_FORMULA_PREFIX","toCsvString","rows","escape","cell","value","String","JSON","stringify","test","replace","map","row","join","downloadToCSV","csv","blob","Blob","type","URL","createObjectURL","revokeObjectURL","UNSAFE_FILENAME_CHARS","MAX_FILENAME_LENGTH","sanitizeFilename","name","slice","triggerLinkDownload","args","filename","a","document","createElement","href","download","style","display","body","appendChild","click","remove","DownloadDOMToPNGOptions","element","HTMLElement","pixelRatio","backgroundColor","downloadDOMToPNG","opts","Promise","canvas","scale","useCORS","logging","resolve","reject","toBlob","Error","DownloadLabels","trigger","loading","error","DEFAULT_DOWNLOAD_LABELS","useCallback","useState","ComponentType","CircularProgress","IconButton","ListItemIcon","ListItemText","Menu","MenuItem","SvgIconProps","FileDownload","DownloadIcon","Tooltip","triggerLinkDownload","DownloadItem","DEFAULT_DOWNLOAD_LABELS","DownloadLabels","DownloadProps","items","labels","Partial","icon","iconProps","onError","err","Error","Download","t0","$","_c","t1","Icon","undefined","t2","_labels","anchorEl","setAnchorEl","isDownloading","setIsDownloading","error","setError","t3","Symbol","for","e","currentTarget","open","t4","close","t5","item","disabled","resolve","then","t6","url","filename","revoke","setTimeout","catch","e_0","String","finally","onSelect","triggerLabel","loading","trigger","triggerActive","Boolean","t7","t8","t9","length","t10","t11","t12","t13","t14","t15","t16","vertical","horizontal","t17","t18","item_0","id","color","label","map","t19","SvgIcon","SvgIconProps","ArticleOutlined","ImageOutlined","PNGIcon","props","$","_c","t0","MarkdownIcon","CSVIcon","Symbol","for","t1","DOWNLOAD_ITEM_IDS","png","csv","markdown","const","DownloadItemId","DOWNLOAD_ITEM_IDS","downloadDOMToPNG","PNGIcon","DownloadItem","BuildPngDownloadItemArgs","filename","getCaptureEl","HTMLElement","pixelRatio","backgroundColor","label","buildPngDownloadItem","args","id","png","icon","resolve","el","Error","handle","element","url","revoke","DOWNLOAD_ITEM_IDS","downloadToCSV","CSVIcon","DownloadItem","BuildCsvDownloadItemBase","filename","label","BuildCsvDownloadItemArgs","getRows","getCsv","buildCsvDownloadItem","args","id","csv","icon","resolve","blob","Blob","type","url","URL","createObjectURL","Promise","revoke","revokeObjectURL","handle"],"sources":["../src/widgets-v2/actions/download/exports.ts","../src/widgets-v2/actions/download/labels.ts","../src/widgets-v2/actions/download/download.tsx","../src/widgets-v2/actions/download/icons.tsx","../src/widgets-v2/actions/download/constants.ts","../src/widgets-v2/actions/download/png-item.tsx","../src/widgets-v2/actions/download/csv-item.tsx"],"sourcesContent":["/**\n * Pure download helpers — no React, no DOM lifecycle outside the link click.\n * Component layer in {@link ./download.tsx} orchestrates these.\n */\n\nimport html2canvas from 'html2canvas'\n\nexport interface DownloadHandle {\n url: string\n revoke: () => void\n}\n\n// Leading characters that Excel / Sheets / Numbers interpret as a formula\n// when the CSV is opened. Prefixing the cell with a single quote forces the\n// spreadsheet app to render it as plain text. Tab and CR are included\n// because some tooling strips leading whitespace before formula evaluation.\nconst CSV_FORMULA_PREFIX = /^[=+\\-@\\t\\r]/\n\nexport function toCsvString(rows: readonly (readonly unknown[])[]): string {\n const escape = (cell: unknown): string => {\n if (cell == null) return ''\n let value =\n typeof cell === 'string'\n ? cell\n : typeof cell === 'number' || typeof cell === 'boolean'\n ? String(cell)\n : JSON.stringify(cell)\n if (CSV_FORMULA_PREFIX.test(value)) value = `'${value}`\n if (/[\",\\n\\r]/.test(value)) return `\"${value.replace(/\"/g, '\"\"')}\"`\n return value\n }\n return rows.map((row) => row.map(escape).join(',')).join('\\n')\n}\n\nexport function downloadToCSV(\n rows: readonly (readonly unknown[])[],\n): DownloadHandle {\n const csv = toCsvString(rows)\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n return { url, revoke: () => URL.revokeObjectURL(url) }\n}\n\n// Path separators, NUL, and ASCII control chars. Filenames containing these\n// can confuse the browser download stack and historically enabled\n// Content-Disposition-style trickery.\n// eslint-disable-next-line no-control-regex\nconst UNSAFE_FILENAME_CHARS = /[\\\\/\\x00-\\x1f\\x7f]/g\nconst MAX_FILENAME_LENGTH = 200\n\nexport function sanitizeFilename(name: string): string {\n return (\n (name ?? '')\n .replace(UNSAFE_FILENAME_CHARS, '_')\n .slice(0, MAX_FILENAME_LENGTH) || 'download'\n )\n}\n\n/**\n * Triggers a browser download for the given URL by synthesizing an anchor,\n * clicking it, and removing it. Pure DOM — no React. The filename is run\n * through {@link sanitizeFilename} before being assigned to `a.download`.\n */\nexport function triggerLinkDownload(args: {\n url: string\n filename: string\n}): void {\n const { url, filename } = args\n const a = document.createElement('a')\n a.href = url\n a.download = sanitizeFilename(filename)\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n a.remove()\n}\n\nexport interface DownloadDOMToPNGOptions {\n element: HTMLElement\n /** html2canvas `scale`. Default 2 — crisp on hi-DPI displays. */\n pixelRatio?: number\n /**\n * html2canvas `backgroundColor`. Default `null` (transparent) so the PNG\n * inherits whatever surface it lands on when the user pastes it.\n */\n backgroundColor?: string | null\n}\n\n/**\n * Rasterise an HTMLElement to PNG via `html2canvas` and wrap the result in\n * a `DownloadHandle`. The caller is responsible for calling `handle.revoke`\n * after the link click is dispatched. Used by per-widget download configs\n * to power the PNG menu item.\n */\nexport async function downloadDOMToPNG(\n opts: DownloadDOMToPNGOptions,\n): Promise<DownloadHandle> {\n const { element, pixelRatio = 2, backgroundColor = null } = opts\n const canvas = await html2canvas(element, {\n scale: pixelRatio,\n backgroundColor,\n useCORS: true,\n logging: false,\n })\n return new Promise<DownloadHandle>((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (!blob) {\n reject(new Error('[widgets-v2] toBlob() returned null'))\n return\n }\n const url = URL.createObjectURL(blob)\n resolve({ url, revoke: () => URL.revokeObjectURL(url) })\n }, 'image/png')\n })\n}\n","export interface DownloadLabels {\n trigger: string\n /** Tooltip / aria-label shown on the trigger while a download is in flight. */\n loading: string\n /**\n * Tooltip / aria-label shown on the trigger after a download failed. Cleared\n * the next time the menu opens.\n */\n error: string\n}\n\nexport const DEFAULT_DOWNLOAD_LABELS: DownloadLabels = {\n trigger: 'Download',\n loading: 'Downloading…',\n error: 'Download failed',\n}\n","import { useCallback, useState, type ComponentType } from 'react'\nimport {\n CircularProgress,\n IconButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n type SvgIconProps,\n} from '@mui/material'\nimport { FileDownload as DownloadIcon } from '@mui/icons-material'\nimport { Tooltip } from '../../../components'\nimport { triggerLinkDownload } from './exports'\nimport type { DownloadItem } from './types'\nimport { DEFAULT_DOWNLOAD_LABELS, type DownloadLabels } from './labels'\n\nexport interface DownloadProps {\n items: readonly DownloadItem[]\n labels?: Partial<DownloadLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Fires when an item's `resolve()` rejects (or any step in the click-through\n * path throws). The error is normalised to a real `Error` first. Surface\n * to your telemetry / toast layer here; the trigger already shows a visual\n * error indicator independently.\n */\n onError?: (err: Error) => void\n}\n\nexport function Download({\n items,\n labels,\n icon: Icon = DownloadIcon,\n iconProps,\n onError,\n}: DownloadProps) {\n const _labels = { ...DEFAULT_DOWNLOAD_LABELS, ...labels }\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n const [isDownloading, setIsDownloading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const open = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {\n // Clear any prior error when the user re-engages the menu — the next\n // attempt is a fresh interaction, not a continuation of the failed one.\n setError(null)\n setAnchorEl(e.currentTarget)\n }, [])\n const close = useCallback(() => setAnchorEl(null), [])\n\n const onSelect = useCallback(\n (item: DownloadItem) => {\n // Single-flight: ignore re-entry while a download is already in flight.\n // The trigger is `disabled` and the menu is closed during that window,\n // so this guard mostly defends against future call sites that bypass\n // the menu (e.g. keyboard shortcuts).\n if (item.disabled || isDownloading) return\n close()\n setIsDownloading(true)\n setError(null)\n item\n .resolve()\n .then(({ url, filename, revoke }) => {\n // `item.filename` overrides what `resolve()` returns — lets consumers\n // template the filename with widget metadata declaratively.\n triggerLinkDownload({ url, filename: item.filename ?? filename })\n // Defer revoke past the current task so Safari / Firefox-on-slow-disk\n // can dispatch the download before the blob URL is invalidated.\n // Synchronous revoke here can silently cancel the download.\n if (revoke) setTimeout(revoke, 0)\n })\n .catch((err: unknown) => {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n onError?.(e)\n })\n .finally(() => {\n setIsDownloading(false)\n })\n },\n [close, isDownloading, onError],\n )\n\n const triggerLabel = isDownloading\n ? _labels.loading\n : error\n ? _labels.error\n : _labels.trigger\n const triggerActive = Boolean(anchorEl) || isDownloading\n\n return (\n <>\n <Tooltip title={triggerLabel}>\n <IconButton\n size='small'\n aria-label={triggerLabel}\n aria-haspopup='true'\n aria-expanded={anchorEl ? 'true' : undefined}\n aria-busy={isDownloading || undefined}\n data-error={error ? 'true' : undefined}\n disabled={isDownloading || items.length === 0}\n onClick={open}\n className={triggerActive ? 'active' : undefined}\n >\n {isDownloading ? (\n <CircularProgress size={18} color='inherit' />\n ) : (\n <Icon fontSize='small' {...iconProps} />\n )}\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={close}\n variant='menu'\n elevation={8}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n {items.map((item) => (\n <MenuItem\n key={item.id}\n disabled={item.disabled}\n onClick={() => void onSelect(item)}\n >\n {item.icon && (\n <ListItemIcon sx={{ color: 'text.primary' }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText>{item.label}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>\n )\n}\n","import { SvgIcon, type SvgIconProps } from '@mui/material'\nimport { ArticleOutlined, ImageOutlined } from '@mui/icons-material'\n\n/**\n * Generic \"image\" glyph used for the PNG download item. Wraps MUI's\n * `ImageOutlined` so callers can swap it via the per-widget download\n * config's `icon` override without pulling MUI directly.\n */\nexport function PNGIcon(props: SvgIconProps) {\n return <ImageOutlined {...props} />\n}\n\n/**\n * Generic \"document\" glyph used for the Markdown download item. Wraps MUI's\n * `ArticleOutlined`, mirroring {@link PNGIcon}, so the Markdown menu item\n * carries an icon consistent with the other download formats.\n */\nexport function MarkdownIcon(props: SvgIconProps) {\n return <ArticleOutlined {...props} />\n}\n\n/**\n * \"CSV\" rectangle with the letters spelled inside — matches v1 visual and is\n * easier to recognise in a download menu than a generic table glyph.\n */\nexport function CSVIcon(props: SvgIconProps) {\n return (\n <SvgIcon viewBox='0 0 18 18' {...props}>\n <path\n fill='currentColor'\n d='M4.313 11.25h2.25v-1.125H4.688v-2.25h1.875V6.75h-2.25a.726.726 0 0 0-.535.216.726.726 0 0 0-.216.534v3c0 .213.072.39.216.534a.726.726 0 0 0 .534.216Zm2.925 0h2.25c.212 0 .39-.072.534-.216a.726.726 0 0 0 .216-.534V9.375a.931.931 0 0 0-.216-.59.658.658 0 0 0-.534-.273H8.363v-.637h1.875V6.75h-2.25a.726.726 0 0 0-.535.216.726.726 0 0 0-.216.534v1.125c0 .213.072.403.216.572a.675.675 0 0 0 .534.253h1.126v.675H7.238v1.125Zm4.95 0h1.124l1.313-4.5H13.5l-.75 2.588L12 6.75h-1.125l1.313 4.5ZM3 15c-.413 0-.766-.147-1.06-.44a1.445 1.445 0 0 1-.44-1.06v-9c0-.412.147-.766.44-1.06C2.235 3.148 2.588 3 3 3h12c.412 0 .766.147 1.06.44.293.294.44.648.44 1.06v9c0 .412-.147.766-.44 1.06-.294.293-.647.44-1.06.44H3Zm0-1.5h12v-9H3v9Z'\n />\n </SvgIcon>\n )\n}\n","/**\n * Canonical `DownloadItem.id`s for the built-in download formats. Centralised\n * so the per-format builders — and anything that keys off the id (menu logic,\n * tests) — reference one source of truth instead of re-typing string literals.\n * The Markdown format keeps the short `'md'` id to match its `.md` extension.\n */\nexport const DOWNLOAD_ITEM_IDS = {\n png: 'png',\n csv: 'csv',\n markdown: 'md',\n} as const\n\nexport type DownloadItemId =\n (typeof DOWNLOAD_ITEM_IDS)[keyof typeof DOWNLOAD_ITEM_IDS]\n","import { DOWNLOAD_ITEM_IDS } from './constants'\nimport { downloadDOMToPNG } from './exports'\nimport { PNGIcon } from './icons'\nimport type { DownloadItem } from './types'\n\nexport interface BuildPngDownloadItemArgs {\n /** Base filename (without extension). The item appends `.png`. */\n filename: string\n /**\n * Reads the capture element to rasterise. Called at click time so the\n * download config doesn't capture a stale reference. Wire it to\n * `() => getCaptureEl(id)` from `widgets-v2/stores`.\n */\n getCaptureEl: () => HTMLElement | null\n /** html2canvas `scale`. Default 2. */\n pixelRatio?: number\n /** html2canvas `backgroundColor`. Default transparent (`null`). */\n backgroundColor?: string | null\n /** Override the menu label. Default `'PNG'`. */\n label?: string\n}\n\n/**\n * Builds the standard PNG `DownloadItem` used by every per-widget download\n * config. Centralised so the menu label, icon, error message, and filename\n * suffix stay consistent across widgets without each `create*DownloadConfig`\n * re-deriving the same shape.\n */\nexport function buildPngDownloadItem(\n args: BuildPngDownloadItemArgs,\n): DownloadItem {\n return {\n id: DOWNLOAD_ITEM_IDS.png,\n label: args.label ?? 'PNG',\n icon: <PNGIcon fontSize='small' />,\n resolve: async () => {\n const el = args.getCaptureEl()\n if (!el) {\n throw new Error('[widgets-v2] No PNG capture element available')\n }\n const handle = await downloadDOMToPNG({\n element: el,\n pixelRatio: args.pixelRatio,\n backgroundColor: args.backgroundColor,\n })\n return {\n url: handle.url,\n filename: `${args.filename}.png`,\n revoke: handle.revoke,\n }\n },\n }\n}\n","import { DOWNLOAD_ITEM_IDS } from './constants'\nimport { downloadToCSV } from './exports'\nimport { CSVIcon } from './icons'\nimport type { DownloadItem } from './types'\n\ninterface BuildCsvDownloadItemBase {\n /** Base filename (without extension). The item appends `.csv`. */\n filename: string\n /** Override the menu label. Default `'CSV'`. */\n label?: string\n}\n\n/**\n * Args for {@link buildCsvDownloadItem}. A discriminated union: a caller must\n * supply exactly one content source — `getRows` (rows serialised through the\n * shared `toCsvString`) or `getCsv` (a pre-built CSV string). The `?: never`\n * arms make passing both — or neither — a compile-time error.\n */\nexport type BuildCsvDownloadItemArgs =\n | (BuildCsvDownloadItemBase & {\n /**\n * Builds the CSV rows at click time. Used by most widgets — rows are run\n * through `toCsvString` so escaping (incl. the spreadsheet\n * formula-injection guard) stays consistent across widgets.\n */\n getRows: () => readonly (readonly unknown[])[]\n getCsv?: never\n })\n | (BuildCsvDownloadItemBase & {\n /**\n * Returns a pre-built CSV string at click time. Escape hatch for widgets\n * (e.g. Table) that already serialise their own CSV with bespoke\n * header/cell handling.\n */\n getCsv: () => string\n getRows?: never\n })\n\n/**\n * Builds the standard CSV `DownloadItem` used by every per-widget download\n * config. Centralised so the menu label, icon, and `.csv` filename suffix stay\n * consistent across widgets — mirrors {@link buildPngDownloadItem} so neither\n * format can drift again.\n */\nexport function buildCsvDownloadItem(\n args: BuildCsvDownloadItemArgs,\n): DownloadItem {\n return {\n id: DOWNLOAD_ITEM_IDS.csv,\n label: args.label ?? 'CSV',\n icon: <CSVIcon fontSize='small' />,\n resolve: () => {\n if (args.getCsv) {\n const csv = args.getCsv()\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n return Promise.resolve({\n url,\n filename: `${args.filename}.csv`,\n revoke: () => URL.revokeObjectURL(url),\n })\n }\n const handle = downloadToCSV(args.getRows())\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as e } from "./use-widget-selector-VSPhfhNm.js";
|
|
2
|
-
import { _ as t, v as n } from "./actions-
|
|
2
|
+
import { _ as t, v as n } from "./actions-DZGaL_uT.js";
|
|
3
3
|
import { t as r } from "./formatter-wVO81tYk.js";
|
|
4
4
|
import { t as i } from "./hooks-zf5gKZYq.js";
|
|
5
5
|
import { n as a, t as o } from "./row-CvVGBuy_.js";
|
|
@@ -187,4 +187,4 @@ function E(e) {
|
|
|
187
187
|
//#endregion
|
|
188
188
|
export { S as a, v as c, h as d, C as i, _ as l, E as n, x as o, w as r, b as s, T as t, g as u };
|
|
189
189
|
|
|
190
|
-
//# sourceMappingURL=formula-
|
|
190
|
+
//# sourceMappingURL=formula-BNuRXsmh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formula-Bk9CBzm2.js","names":["Typography","ItemProps","styles","Item","props","$","_c","t0","TypographyProps","children","disabled","item","FormulaWidgetState","ValueProps","Item","defaultFormatter","useWidgetSelector","Value","t0","$","_c","id","props","t1","index","undefined","t2","w","widget","value","data","color","formatter","t3","t4","t5","t6","FormulaWidgetState","ValueProps","Item","useWidgetSelector","Prefix","t0","$","_c","id","props","t1","index","undefined","t2","w","data","prefix","t3","FormulaWidgetState","ValueProps","Item","Theme","useWidgetSelector","Suffix","t0","$","_c","id","props","t1","index","undefined","t2","w","data","suffix","t3","Symbol","for","color","_temp","t4","theme","palette","text","secondary","Avatar","FormulaWidgetState","ValueProps","useWidgetSelector","Series","t0","$","_c","id","index","t1","undefined","t2","w","series","serie","name","color","t3","theme","palette","getContrastText","t4","bgcolor","width","height","fontSize","fontWeight","t5","charAt","toUpperCase","t6","downloadToCSV","downloadToPNG","ConfigProps","FormulaDownloadConfig","FormulaWidgetConfig","formulaDownloadConfig","refUI","modifier","data","formulaData","map","item","value","formulaConfig","series","FormulaUIProps","Row","Value","Prefix","Suffix","Series","useWidgetRef","Box","FormulaUI","props","$","_c","ref","id","t0","t1","index","t2","Box","Skeleton","styles","FormulaSkeleton","$","_c","t0","Symbol","for","row","DataItem","sanitizeDataItem","item","prefix","undefined","suffix","sanitizeDataItems","items","map"],"sources":["../src/widgets/formula/components/item.tsx","../src/widgets/formula/components/value.tsx","../src/widgets/formula/components/prefix.tsx","../src/widgets/formula/components/suffix.tsx","../src/widgets/formula/components/series.tsx","../src/widgets/formula/config.ts","../src/widgets/formula/formula-ui.tsx","../src/widgets/formula/skeleton.tsx","../src/widgets/formula/serializer.ts"],"sourcesContent":["import { Typography } from '@mui/material'\nimport type { ItemProps } from '../types'\nimport { styles } from '../style'\n\n/**\n * Base typography wrapper used by formula sub-components (Value, Prefix, Suffix) to render styled text.\n */\nexport function Item(props: ItemProps) {\n return (\n <Typography\n sx={styles.item}\n variant='h5'\n fontWeight='medium'\n data-disabled={props.disabled}\n color='default'\n {...props.TypographyProps}\n >\n {props.children}\n </Typography>\n )\n}\n","import { type FormulaWidgetState, type ValueProps } from '../types'\nimport { Item } from './item'\nimport { defaultFormatter } from '../../utils/formatter'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Displays the formatted numeric value for a formula widget data item, applying the widget's formatter and color.\n */\nexport function Value({ id, index = 0, ...props }: ValueProps) {\n const { value, color, formatter } = useWidgetSelector(id, (w) => {\n const widget = w as FormulaWidgetState | undefined\n return {\n value: widget?.data?.[index]?.value,\n color: widget?.data?.[index]?.color,\n formatter: widget?.formatter ?? defaultFormatter,\n }\n })\n\n return (\n <Item TypographyProps={{ color }} {...props}>\n {formatter(value ?? 0)}\n </Item>\n )\n}\n","import { type FormulaWidgetState, type ValueProps } from '../types'\nimport { Item } from './item'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Renders the prefix content (e.g., currency symbol) before a formula value, if defined in the data item.\n */\nexport function Prefix({ id, index = 0, ...props }: ValueProps) {\n const prefix = useWidgetSelector(\n id,\n (w) => (w as FormulaWidgetState | undefined)?.data?.[index]?.prefix,\n )\n\n if (!prefix) {\n return null\n }\n\n return <Item {...props}>{prefix}</Item>\n}\n","import { type FormulaWidgetState, type ValueProps } from '../types'\nimport { Item } from './item'\nimport type { Theme } from '@mui/material'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Renders the suffix content (e.g., unit label) after a formula value, if defined in the data item.\n */\nexport function Suffix({ id, index = 0, ...props }: ValueProps) {\n const suffix = useWidgetSelector(\n id,\n (w) => (w as FormulaWidgetState | undefined)?.data?.[index]?.suffix,\n )\n\n if (!suffix) {\n return null\n }\n\n return (\n <Item\n TypographyProps={{\n color: (theme: Theme) => theme.palette.text.secondary,\n }}\n {...props}\n >\n {suffix}\n </Item>\n )\n}\n","import { Avatar } from '@mui/material'\nimport type { FormulaWidgetState, ValueProps } from '../types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Renders a colored avatar badge showing the first letter of the series name for multi-value formula widgets.\n */\nexport function Series({ id, index = 0 }: Pick<ValueProps, 'id' | 'index'>) {\n const serie = useWidgetSelector(\n id,\n (w) => (w as FormulaWidgetState | undefined)?.series?.[index],\n )\n if (!serie) {\n return null\n }\n\n const { name, color } = serie\n\n return (\n <Avatar\n sx={{\n bgcolor: color,\n width: 32,\n height: 32,\n fontSize: '0.875rem',\n fontWeight: 'medium',\n ...(color && {\n color: (theme) => theme.palette.getContrastText(color),\n }),\n }}\n >\n {name.charAt(0).toUpperCase()}\n </Avatar>\n )\n}\n","import { downloadToCSV, downloadToPNG } from '../actions'\nimport type { ConfigProps } from '../loader/types'\nimport type { FormulaDownloadConfig, FormulaWidgetConfig } from './types'\n\n/**\n * Creates download configuration for formula widgets, supporting PNG (screenshot) and CSV (data) exports.\n *\n * @param props - Configuration with `refUI` reference for PNG export.\n * @returns Array of download items for use with the Download action.\n */\nexport function formulaDownloadConfig({\n refUI,\n}: ConfigProps): FormulaDownloadConfig {\n return [\n {\n ...downloadToPNG,\n modifier: () => downloadToPNG.modifier(refUI),\n },\n {\n ...downloadToCSV,\n modifier: async (data) => {\n const formulaData = [data?.map((item) => item.value) ?? []]\n return downloadToCSV.modifier(formulaData)\n },\n },\n ]\n}\n\n/**\n * Returns the default configuration for formula (single or multiple numeric value) widgets.\n *\n * @returns Default formula widget config with empty series.\n */\nexport function formulaConfig(): FormulaWidgetConfig {\n return {\n series: [],\n }\n}\n","import type { FormulaUIProps } from './types'\nimport { Row } from './components/row'\nimport { Value } from './components/value'\nimport { Prefix } from './components/prefix'\nimport { Suffix } from './components/suffix'\nimport { Series } from './components/series'\nimport { useWidgetRef } from '../../hooks'\nimport { Box } from '@mui/material'\n\n/**\n * Renders a formula widget displaying one or more KPI values with optional prefixes, suffixes, and series indicators.\n */\nexport function FormulaUI(props: FormulaUIProps) {\n const { ref } = useWidgetRef(props.id)\n\n return (\n <Box ref={ref}>\n <Row id={props.id}>\n {({ index }) => (\n <>\n <Series id={props.id} index={index} />\n <Prefix id={props.id} index={index} />\n <Value id={props.id} index={index} />\n <Suffix id={props.id} index={index} />\n </>\n )}\n </Row>\n </Box>\n )\n}\n","import { Box, Skeleton } from '@mui/material'\nimport { styles } from './style'\n\nexport function FormulaSkeleton() {\n return (\n <Box sx={styles.row} aria-label='Formula skeleton'>\n <Skeleton width={120} height={32} />\n </Box>\n )\n}\n","import type { DataItem } from './types'\n\n/**\n * Sanitizes DataItem by converting ReactNode prefix/suffix values to undefined.\n * This ensures only string values are stored in the widget state.\n *\n * @param item - The DataItem to sanitize\n * @returns A new DataItem with ReactNode prefix/suffix values converted to undefined\n */\nexport function sanitizeDataItem(item: DataItem): DataItem {\n return {\n ...item,\n prefix: typeof item.prefix === 'string' ? item.prefix : undefined,\n suffix: typeof item.suffix === 'string' ? item.suffix : undefined,\n }\n}\n\n/**\n * Sanitizes an array of DataItems by converting ReactNode prefix/suffix values to undefined.\n *\n * @param items - Array of DataItems to sanitize\n * @returns A new array with sanitized DataItems\n */\nexport function sanitizeDataItems(\n items: DataItem[] | undefined,\n): DataItem[] | undefined {\n return items?.map(sanitizeDataItem)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formula-BNuRXsmh.js","names":["Typography","ItemProps","styles","Item","props","$","_c","t0","TypographyProps","children","disabled","item","FormulaWidgetState","ValueProps","Item","defaultFormatter","useWidgetSelector","Value","t0","$","_c","id","props","t1","index","undefined","t2","w","widget","value","data","color","formatter","t3","t4","t5","t6","FormulaWidgetState","ValueProps","Item","useWidgetSelector","Prefix","t0","$","_c","id","props","t1","index","undefined","t2","w","data","prefix","t3","FormulaWidgetState","ValueProps","Item","Theme","useWidgetSelector","Suffix","t0","$","_c","id","props","t1","index","undefined","t2","w","data","suffix","t3","Symbol","for","color","_temp","t4","theme","palette","text","secondary","Avatar","FormulaWidgetState","ValueProps","useWidgetSelector","Series","t0","$","_c","id","index","t1","undefined","t2","w","series","serie","name","color","t3","theme","palette","getContrastText","t4","bgcolor","width","height","fontSize","fontWeight","t5","charAt","toUpperCase","t6","downloadToCSV","downloadToPNG","ConfigProps","FormulaDownloadConfig","FormulaWidgetConfig","formulaDownloadConfig","refUI","modifier","data","formulaData","map","item","value","formulaConfig","series","FormulaUIProps","Row","Value","Prefix","Suffix","Series","useWidgetRef","Box","FormulaUI","props","$","_c","ref","id","t0","t1","index","t2","Box","Skeleton","styles","FormulaSkeleton","$","_c","t0","Symbol","for","row","DataItem","sanitizeDataItem","item","prefix","undefined","suffix","sanitizeDataItems","items","map"],"sources":["../src/widgets/formula/components/item.tsx","../src/widgets/formula/components/value.tsx","../src/widgets/formula/components/prefix.tsx","../src/widgets/formula/components/suffix.tsx","../src/widgets/formula/components/series.tsx","../src/widgets/formula/config.ts","../src/widgets/formula/formula-ui.tsx","../src/widgets/formula/skeleton.tsx","../src/widgets/formula/serializer.ts"],"sourcesContent":["import { Typography } from '@mui/material'\nimport type { ItemProps } from '../types'\nimport { styles } from '../style'\n\n/**\n * Base typography wrapper used by formula sub-components (Value, Prefix, Suffix) to render styled text.\n */\nexport function Item(props: ItemProps) {\n return (\n <Typography\n sx={styles.item}\n variant='h5'\n fontWeight='medium'\n data-disabled={props.disabled}\n color='default'\n {...props.TypographyProps}\n >\n {props.children}\n </Typography>\n )\n}\n","import { type FormulaWidgetState, type ValueProps } from '../types'\nimport { Item } from './item'\nimport { defaultFormatter } from '../../utils/formatter'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Displays the formatted numeric value for a formula widget data item, applying the widget's formatter and color.\n */\nexport function Value({ id, index = 0, ...props }: ValueProps) {\n const { value, color, formatter } = useWidgetSelector(id, (w) => {\n const widget = w as FormulaWidgetState | undefined\n return {\n value: widget?.data?.[index]?.value,\n color: widget?.data?.[index]?.color,\n formatter: widget?.formatter ?? defaultFormatter,\n }\n })\n\n return (\n <Item TypographyProps={{ color }} {...props}>\n {formatter(value ?? 0)}\n </Item>\n )\n}\n","import { type FormulaWidgetState, type ValueProps } from '../types'\nimport { Item } from './item'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Renders the prefix content (e.g., currency symbol) before a formula value, if defined in the data item.\n */\nexport function Prefix({ id, index = 0, ...props }: ValueProps) {\n const prefix = useWidgetSelector(\n id,\n (w) => (w as FormulaWidgetState | undefined)?.data?.[index]?.prefix,\n )\n\n if (!prefix) {\n return null\n }\n\n return <Item {...props}>{prefix}</Item>\n}\n","import { type FormulaWidgetState, type ValueProps } from '../types'\nimport { Item } from './item'\nimport type { Theme } from '@mui/material'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Renders the suffix content (e.g., unit label) after a formula value, if defined in the data item.\n */\nexport function Suffix({ id, index = 0, ...props }: ValueProps) {\n const suffix = useWidgetSelector(\n id,\n (w) => (w as FormulaWidgetState | undefined)?.data?.[index]?.suffix,\n )\n\n if (!suffix) {\n return null\n }\n\n return (\n <Item\n TypographyProps={{\n color: (theme: Theme) => theme.palette.text.secondary,\n }}\n {...props}\n >\n {suffix}\n </Item>\n )\n}\n","import { Avatar } from '@mui/material'\nimport type { FormulaWidgetState, ValueProps } from '../types'\nimport { useWidgetSelector } from '../../stores/use-widget-selector'\n\n/**\n * Renders a colored avatar badge showing the first letter of the series name for multi-value formula widgets.\n */\nexport function Series({ id, index = 0 }: Pick<ValueProps, 'id' | 'index'>) {\n const serie = useWidgetSelector(\n id,\n (w) => (w as FormulaWidgetState | undefined)?.series?.[index],\n )\n if (!serie) {\n return null\n }\n\n const { name, color } = serie\n\n return (\n <Avatar\n sx={{\n bgcolor: color,\n width: 32,\n height: 32,\n fontSize: '0.875rem',\n fontWeight: 'medium',\n ...(color && {\n color: (theme) => theme.palette.getContrastText(color),\n }),\n }}\n >\n {name.charAt(0).toUpperCase()}\n </Avatar>\n )\n}\n","import { downloadToCSV, downloadToPNG } from '../actions'\nimport type { ConfigProps } from '../loader/types'\nimport type { FormulaDownloadConfig, FormulaWidgetConfig } from './types'\n\n/**\n * Creates download configuration for formula widgets, supporting PNG (screenshot) and CSV (data) exports.\n *\n * @param props - Configuration with `refUI` reference for PNG export.\n * @returns Array of download items for use with the Download action.\n */\nexport function formulaDownloadConfig({\n refUI,\n}: ConfigProps): FormulaDownloadConfig {\n return [\n {\n ...downloadToPNG,\n modifier: () => downloadToPNG.modifier(refUI),\n },\n {\n ...downloadToCSV,\n modifier: async (data) => {\n const formulaData = [data?.map((item) => item.value) ?? []]\n return downloadToCSV.modifier(formulaData)\n },\n },\n ]\n}\n\n/**\n * Returns the default configuration for formula (single or multiple numeric value) widgets.\n *\n * @returns Default formula widget config with empty series.\n */\nexport function formulaConfig(): FormulaWidgetConfig {\n return {\n series: [],\n }\n}\n","import type { FormulaUIProps } from './types'\nimport { Row } from './components/row'\nimport { Value } from './components/value'\nimport { Prefix } from './components/prefix'\nimport { Suffix } from './components/suffix'\nimport { Series } from './components/series'\nimport { useWidgetRef } from '../../hooks'\nimport { Box } from '@mui/material'\n\n/**\n * Renders a formula widget displaying one or more KPI values with optional prefixes, suffixes, and series indicators.\n */\nexport function FormulaUI(props: FormulaUIProps) {\n const { ref } = useWidgetRef(props.id)\n\n return (\n <Box ref={ref}>\n <Row id={props.id}>\n {({ index }) => (\n <>\n <Series id={props.id} index={index} />\n <Prefix id={props.id} index={index} />\n <Value id={props.id} index={index} />\n <Suffix id={props.id} index={index} />\n </>\n )}\n </Row>\n </Box>\n )\n}\n","import { Box, Skeleton } from '@mui/material'\nimport { styles } from './style'\n\nexport function FormulaSkeleton() {\n return (\n <Box sx={styles.row} aria-label='Formula skeleton'>\n <Skeleton width={120} height={32} />\n </Box>\n )\n}\n","import type { DataItem } from './types'\n\n/**\n * Sanitizes DataItem by converting ReactNode prefix/suffix values to undefined.\n * This ensures only string values are stored in the widget state.\n *\n * @param item - The DataItem to sanitize\n * @returns A new DataItem with ReactNode prefix/suffix values converted to undefined\n */\nexport function sanitizeDataItem(item: DataItem): DataItem {\n return {\n ...item,\n prefix: typeof item.prefix === 'string' ? item.prefix : undefined,\n suffix: typeof item.suffix === 'string' ? item.suffix : undefined,\n }\n}\n\n/**\n * Sanitizes an array of DataItems by converting ReactNode prefix/suffix values to undefined.\n *\n * @param items - Array of DataItems to sanitize\n * @returns A new array with sanitized DataItems\n */\nexport function sanitizeDataItems(\n items: DataItem[] | undefined,\n): DataItem[] | undefined {\n return items?.map(sanitizeDataItem)\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { C as e, T as t } from "./stores-BVFMfgyo.js";
|
|
2
|
-
import { n, t as r } from "./download-
|
|
2
|
+
import { n, t as r } from "./download-C7he8mSh.js";
|
|
3
3
|
import { c as i } from "react/compiler-runtime";
|
|
4
4
|
import { Avatar as a, Box as o, Chip as s, Skeleton as c, Typography as l } from "@mui/material";
|
|
5
5
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
@@ -282,4 +282,4 @@ function A(e) {
|
|
|
282
282
|
//#endregion
|
|
283
283
|
export { S as a, v as c, m as d, C as i, _ as l, O as n, x as o, E as r, b as s, A as t, g as u };
|
|
284
284
|
|
|
285
|
-
//# sourceMappingURL=formula-
|
|
285
|
+
//# sourceMappingURL=formula-Cqj84ZGX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formula-Dsru_p-g.js","names":["Chip","ChipProps","DeltaSeverity","DeltaProps","value","label","severity","format","defaultPercentFormatter","Intl","NumberFormat","undefined","style","signDisplay","maximumFractionDigits","SEVERITY_TO_COLOR","Record","positive","negative","neutral","Delta","t0","$","_c","chipProps","resolvedSeverity","inferSeverity","t1","text","t2","t3","Symbol","for","fontWeight","t4","Typography","TypographyProps","ReactNode","NoteProps","children","Note","t0","$","_c","t1","Symbol","for","m","t2","Typography","TypographyProps","ReactNode","PrefixProps","children","Prefix","t0","$","_c","t1","Symbol","for","fontWeight","color","lineHeight","t2","Avatar","AvatarProps","Theme","SeriesProps","name","color","size","Series","t0","$","_c","t1","avatarProps","undefined","t2","charAt","toUpperCase","letter","t3","t4","t5","theme","palette","getContrastText","toCssColor","t6","width","height","fontSize","fontWeight","bgcolor","t7","value","includes","parts","split","cur","p","Record","Typography","TypographyProps","ReactNode","SuffixProps","children","Suffix","t0","$","_c","t1","Symbol","for","fontWeight","color","lineHeight","t2","Typography","TypographyProps","ReactNode","ValueProps","children","color","Value","t0","$","_c","t1","t2","fontWeight","lineHeight","t3","SxProps","Theme","styles","root","display","flexDirection","gap","alignItems","row","body","flex","minWidth","valueRow","delta","alignSelf","flexShrink","Record","Box","Ref","FormulaDataItem","Delta","Note","Prefix","Series","Suffix","Value","styles","FormulaUIProps","items","formatter","value","ref","HTMLDivElement","FormulaUI","t0","$","_c","t1","t2","item","i","series","name","prefix","suffix","row","color","body","valueRow","String","note","delta","label","severity","map","root","useWidgetId","useWidgetShallow","FormulaUI","FormulaWidgetData","FormulaSlice","data","formatter","value","EMPTY_DATA","Object","freeze","formulaSelector","s","Formula","$","_c","id","slice","t0","Box","Skeleton","SxProps","Theme","styles","root","display","gap","alignItems","minHeight","py","block","width","height","Record","FormulaSkeletonProps","count","FormulaSkeleton","t0","$","_c","t1","undefined","t2","Array","from","length","map","_temp","_","i","buildCsvDownloadItem","buildPngDownloadItem","DownloadItem","FormulaWidgetData","FormulaDownloadConfigArgs","filename","getData","getCaptureEl","HTMLElement","pngPixelRatio","pngBackgroundColor","createFormulaDownloadConfig","args","items","push","pixelRatio","backgroundColor","getRows","data","rows","d","series","name","prefix","value","suffix","note","delta"],"sources":["../src/widgets-v2/formula/delta.tsx","../src/widgets-v2/formula/note.tsx","../src/widgets-v2/formula/prefix.tsx","../src/widgets-v2/formula/series.tsx","../src/widgets-v2/formula/suffix.tsx","../src/widgets-v2/formula/value.tsx","../src/widgets-v2/formula/style.ts","../src/widgets-v2/formula/formula-ui.tsx","../src/widgets-v2/formula/formula.tsx","../src/widgets-v2/formula/skeleton.tsx","../src/widgets-v2/formula/download.tsx"],"sourcesContent":["import { Chip, type ChipProps } from '@mui/material'\nimport type { DeltaSeverity } from './types'\n\nexport interface DeltaProps {\n /** Numeric magnitude. Used for the default percent label and severity inference. */\n value: number\n /** Pre-formatted label override; skips the default percent formatter. */\n label?: string\n /**\n * Visual treatment. When omitted it's derived from the sign of `value`:\n * `>0 → 'positive'`, `<0 → 'negative'`, `=0 → 'neutral'`.\n */\n severity?: DeltaSeverity\n /** Override the default `Intl.NumberFormat({style:'percent'})` formatter. */\n format?: (value: number) => string\n ChipProps?: ChipProps\n}\n\nconst defaultPercentFormatter = new Intl.NumberFormat(undefined, {\n style: 'percent',\n signDisplay: 'always',\n maximumFractionDigits: 1,\n})\n\nconst SEVERITY_TO_COLOR: Record<DeltaSeverity, ChipProps['color']> = {\n positive: 'success',\n negative: 'error',\n neutral: 'default',\n}\n\n/**\n * Comparative delta rendered as a small filled chip. Colour is driven by\n * `severity` (or the sign of `value`); content is `label`, the result of\n * `format(value)`, or the default percent format.\n */\nexport function Delta({\n value,\n label,\n severity,\n format,\n ChipProps: chipProps,\n}: DeltaProps) {\n const resolvedSeverity = severity ?? inferSeverity(value)\n const text =\n label ?? (format ? format(value) : defaultPercentFormatter.format(value))\n return (\n <Chip\n size='small'\n color={SEVERITY_TO_COLOR[resolvedSeverity]}\n label={text}\n sx={{ fontWeight: 600 }}\n {...chipProps}\n />\n )\n}\n\nfunction inferSeverity(value: number): DeltaSeverity {\n if (value > 0) return 'positive'\n if (value < 0) return 'negative'\n return 'neutral'\n}\n","import { Typography, type TypographyProps } from '@mui/material'\nimport type { ReactNode } from 'react'\n\nexport interface NoteProps {\n children: ReactNode\n TypographyProps?: TypographyProps\n}\n\n/**\n * Small subdued caption rendered below a Formula value. Use for short\n * descriptive text (e.g. \"Last 7 days\", \"Excludes refunds\").\n */\nexport function Note({ children, TypographyProps }: NoteProps) {\n return (\n <Typography\n variant='caption'\n component='p'\n color='text.secondary'\n sx={{ m: 0 }}\n {...TypographyProps}\n >\n {children}\n </Typography>\n )\n}\n","import { Typography, type TypographyProps } from '@mui/material'\nimport type { ReactNode } from 'react'\n\nexport interface PrefixProps {\n children: ReactNode\n TypographyProps?: TypographyProps\n}\n\n/**\n * Prefix slot for a Formula KPI — large, bold, muted (`text.secondary`).\n * Composable building block for custom formula layouts; the canonical\n * {@link FormulaUI} renders one of these per item when `prefix` is set.\n */\nexport function Prefix({ children, TypographyProps }: PrefixProps) {\n return (\n <Typography\n variant='h5'\n component='span'\n sx={{ fontWeight: 600, color: 'text.secondary', lineHeight: 1 }}\n {...TypographyProps}\n >\n {children}\n </Typography>\n )\n}\n","import { Avatar, type AvatarProps, type Theme } from '@mui/material'\n\nexport interface SeriesProps {\n /** Used for the avatar's first-letter glyph and as accessible label. */\n name: string\n /** Avatar background colour (any MUI palette path or CSS colour). */\n color?: string\n /** Diameter in px. Default `24`. */\n size?: number\n AvatarProps?: AvatarProps\n}\n\n/**\n * Series indicator — circular avatar showing the first letter of `name`.\n * Background colour is `color` (consumer-supplied) or a neutral disabled\n * colour, with text colour computed for contrast against it.\n */\nexport function Series({\n name,\n color,\n size = 24,\n AvatarProps: avatarProps,\n}: SeriesProps) {\n const letter = name.charAt(0).toUpperCase()\n return (\n <Avatar\n aria-label={name}\n sx={{\n width: size,\n height: size,\n fontSize: size * 0.5,\n fontWeight: 600,\n bgcolor: color ?? 'action.disabledBackground',\n color: color\n ? (theme: Theme) =>\n theme.palette.getContrastText(toCssColor(theme, color))\n : 'text.primary',\n }}\n {...avatarProps}\n >\n {letter}\n </Avatar>\n )\n}\n\n/**\n * Resolve a palette path (e.g. `\"primary.main\"`) to a hex/rgb string so that\n * `getContrastText` — which doesn't accept dotted paths — produces a sensible\n * text colour. Non-palette strings (raw `#hex`, `rgb(...)`) pass through.\n */\nfunction toCssColor(theme: Theme, value: string): string {\n if (!value.includes('.')) return value\n const parts = value.split('.')\n let cur: unknown = theme.palette\n for (const p of parts) {\n if (\n cur &&\n typeof cur === 'object' &&\n p in (cur as Record<string, unknown>)\n ) {\n cur = (cur as Record<string, unknown>)[p]\n } else {\n return value\n }\n }\n return typeof cur === 'string' ? cur : value\n}\n","import { Typography, type TypographyProps } from '@mui/material'\nimport type { ReactNode } from 'react'\n\nexport interface SuffixProps {\n children: ReactNode\n TypographyProps?: TypographyProps\n}\n\n/**\n * Suffix slot for a Formula KPI — large, bold, muted (`text.secondary`).\n * Composable building block for custom formula layouts; the canonical\n * {@link FormulaUI} renders one of these per item when `suffix` is set.\n */\nexport function Suffix({ children, TypographyProps }: SuffixProps) {\n return (\n <Typography\n variant='h5'\n component='span'\n sx={{ fontWeight: 600, color: 'text.secondary', lineHeight: 1 }}\n {...TypographyProps}\n >\n {children}\n </Typography>\n )\n}\n","import { Typography, type TypographyProps } from '@mui/material'\nimport type { ReactNode } from 'react'\n\nexport interface ValueProps {\n children: ReactNode\n /** Override the default `text.primary` color — useful for sparkline tints. */\n color?: string\n TypographyProps?: TypographyProps\n}\n\n/**\n * Value slot for a Formula KPI — large, bold, primary text color. Composable\n * building block for custom formula layouts; the canonical {@link FormulaUI}\n * renders one of these per item.\n */\nexport function Value({ children, color, TypographyProps }: ValueProps) {\n return (\n <Typography\n variant='h5'\n component='span'\n sx={{\n fontWeight: 600,\n color: color ?? 'text.primary',\n lineHeight: 1,\n }}\n {...TypographyProps}\n >\n {children}\n </Typography>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n alignItems: 'stretch',\n },\n row: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 1.5,\n },\n body: {\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 0.25,\n },\n valueRow: {\n display: 'inline-flex',\n alignItems: 'baseline',\n gap: 0.25,\n },\n delta: {\n alignSelf: 'center',\n flexShrink: 0,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box } from '@mui/material'\nimport type { Ref } from 'react'\nimport type { FormulaDataItem } from './types'\nimport { Delta } from './delta'\nimport { Note } from './note'\nimport { Prefix } from './prefix'\nimport { Series } from './series'\nimport { Suffix } from './suffix'\nimport { Value } from './value'\nimport { styles } from './style'\n\nexport interface FormulaUIProps {\n items: readonly FormulaDataItem[]\n /** Number formatter — applied to each item's `value`. */\n formatter?: (value: number) => string\n /** Forwarded to the root `<Box>` so consumers can capture the DOM (PNG export). */\n ref?: Ref<HTMLDivElement>\n}\n\n/**\n * Pure presentational component for the Formula widget. Each item renders as\n * a row containing (in order): optional `Series` avatar, a body with\n * `[prefix] value [suffix]` plus optional `Note`, and an optional `Delta`\n * chip pushed to the right edge.\n *\n * For fully custom layouts, compose {@link Series}, {@link Prefix},\n * {@link Value}, {@link Suffix}, {@link Note}, and {@link Delta} directly\n * instead of passing `items`.\n */\nexport function FormulaUI({ items, formatter, ref }: FormulaUIProps) {\n return (\n <Box ref={ref} sx={styles.root}>\n {items.map((item, i) => (\n // Series name is the closest stable id; fall back to the literal\n // value (numeric KPIs rarely repeat with the same prefix/suffix).\n <Box\n key={`formula-${item.series?.name ?? `${item.prefix ?? ''}${item.value}${item.suffix ?? ''}`}-${i}`}\n sx={styles.row}\n >\n {item.series ? (\n <Series name={item.series.name} color={item.series.color} />\n ) : null}\n <Box sx={styles.body}>\n <Box sx={styles.valueRow}>\n {item.prefix ? <Prefix>{item.prefix}</Prefix> : null}\n <Value color={item.color}>\n {formatter ? formatter(item.value) : String(item.value)}\n </Value>\n {item.suffix ? <Suffix>{item.suffix}</Suffix> : null}\n </Box>\n {item.note ? <Note>{item.note}</Note> : null}\n </Box>\n {item.delta ? (\n <Box sx={styles.delta}>\n <Delta\n value={item.delta.value}\n label={item.delta.label}\n severity={item.delta.severity}\n />\n </Box>\n ) : null}\n </Box>\n ))}\n </Box>\n )\n}\n","import { useWidgetId, useWidgetShallow } from '../stores'\nimport { FormulaUI } from './formula-ui'\nimport type { FormulaWidgetData } from './types'\n\ninterface FormulaSlice {\n data: FormulaWidgetData\n formatter?: (value: number) => string\n}\n\n// Stable empty-data sentinel — keeps the slice's `data` reference stable\n// when the underlying store value is null/undefined so the shallow-equality\n// gate in `useWidgetShallow` doesn't re-render every commit.\nconst EMPTY_DATA: FormulaWidgetData = Object.freeze([]) as FormulaWidgetData\n\nconst formulaSelector = (s: {\n data: unknown\n formatter?: (value: number) => string\n}): FormulaSlice => ({\n data: (s.data ?? EMPTY_DATA) as FormulaWidgetData,\n formatter: s.formatter,\n})\n\n/**\n * Stateful Formula bridge — reads `data` (post-pipeline) and `formatter` from\n * the per-widget store and forwards them to the pure {@link FormulaUI}. Sits\n * inside `<Widget.Provider>`. Demonstrates that the composition shell\n * (Provider, Wrapper, State) doesn't care whether the rendered child is\n * ECharts (Bar) or a custom DOM tree (Formula).\n */\nexport function Formula() {\n const id = useWidgetId()\n const slice = useWidgetShallow(id, formulaSelector)\n return <FormulaUI items={slice.data} formatter={slice.formatter} />\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n gap: 3,\n alignItems: 'baseline',\n minHeight: 64,\n py: 1,\n },\n block: { width: 120, height: 36 },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface FormulaSkeletonProps {\n count?: number\n}\n\nexport function FormulaSkeleton({ count = 1 }: FormulaSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={`row-${i}`} variant='rectangular' sx={styles.block} />\n ))}\n </Box>\n )\n}\n","import {\n buildCsvDownloadItem,\n buildPngDownloadItem,\n type DownloadItem,\n} from '../actions/download'\nimport type { FormulaWidgetData } from './types'\n\nexport interface FormulaDownloadConfigArgs {\n filename: string\n getData: () => FormulaWidgetData\n /**\n * Optional getter for the widget's capture element (registered by\n * `Widget.State`). When provided, a PNG item is prepended.\n */\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}\n\n/**\n * Builds download items for the Formula widget. Always includes a CSV item\n * with one row per KPI (`prefix`, `value`, `suffix`, `note`, `delta`).\n * When `getCaptureEl` is supplied, prepends a PNG item that rasterises the\n * captured element via `html2canvas`.\n */\nexport function createFormulaDownloadConfig(\n args: FormulaDownloadConfigArgs,\n): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push(\n buildCsvDownloadItem({\n filename: args.filename,\n getRows: () => {\n const data = args.getData()\n const rows: unknown[][] = [\n ['series', 'prefix', 'value', 'suffix', 'note', 'delta'],\n ]\n for (const d of data) {\n rows.push([\n d.series?.name ?? '',\n d.prefix ?? '',\n d.value,\n d.suffix ?? '',\n d.note ?? '',\n d.delta?.value ?? '',\n ])\n }\n return rows\n },\n }),\n )\n return items\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formula-Cqj84ZGX.js","names":["Chip","ChipProps","DeltaSeverity","DeltaProps","value","label","severity","format","defaultPercentFormatter","Intl","NumberFormat","undefined","style","signDisplay","maximumFractionDigits","SEVERITY_TO_COLOR","Record","positive","negative","neutral","Delta","t0","$","_c","chipProps","resolvedSeverity","inferSeverity","t1","text","t2","t3","Symbol","for","fontWeight","t4","Typography","TypographyProps","ReactNode","NoteProps","children","Note","t0","$","_c","t1","Symbol","for","m","t2","Typography","TypographyProps","ReactNode","PrefixProps","children","Prefix","t0","$","_c","t1","Symbol","for","fontWeight","color","lineHeight","t2","Avatar","AvatarProps","Theme","SeriesProps","name","color","size","Series","t0","$","_c","t1","avatarProps","undefined","t2","charAt","toUpperCase","letter","t3","t4","t5","theme","palette","getContrastText","toCssColor","t6","width","height","fontSize","fontWeight","bgcolor","t7","value","includes","parts","split","cur","p","Record","Typography","TypographyProps","ReactNode","SuffixProps","children","Suffix","t0","$","_c","t1","Symbol","for","fontWeight","color","lineHeight","t2","Typography","TypographyProps","ReactNode","ValueProps","children","color","Value","t0","$","_c","t1","t2","fontWeight","lineHeight","t3","SxProps","Theme","styles","root","display","flexDirection","gap","alignItems","row","body","flex","minWidth","valueRow","delta","alignSelf","flexShrink","Record","Box","Ref","FormulaDataItem","Delta","Note","Prefix","Series","Suffix","Value","styles","FormulaUIProps","items","formatter","value","ref","HTMLDivElement","FormulaUI","t0","$","_c","t1","t2","item","i","series","name","prefix","suffix","row","color","body","valueRow","String","note","delta","label","severity","map","root","useWidgetId","useWidgetShallow","FormulaUI","FormulaWidgetData","FormulaSlice","data","formatter","value","EMPTY_DATA","Object","freeze","formulaSelector","s","Formula","$","_c","id","slice","t0","Box","Skeleton","SxProps","Theme","styles","root","display","gap","alignItems","minHeight","py","block","width","height","Record","FormulaSkeletonProps","count","FormulaSkeleton","t0","$","_c","t1","undefined","t2","Array","from","length","map","_temp","_","i","buildCsvDownloadItem","buildPngDownloadItem","DownloadItem","FormulaWidgetData","FormulaDownloadConfigArgs","filename","getData","getCaptureEl","HTMLElement","pngPixelRatio","pngBackgroundColor","createFormulaDownloadConfig","args","items","push","pixelRatio","backgroundColor","getRows","data","rows","d","series","name","prefix","value","suffix","note","delta"],"sources":["../src/widgets-v2/formula/delta.tsx","../src/widgets-v2/formula/note.tsx","../src/widgets-v2/formula/prefix.tsx","../src/widgets-v2/formula/series.tsx","../src/widgets-v2/formula/suffix.tsx","../src/widgets-v2/formula/value.tsx","../src/widgets-v2/formula/style.ts","../src/widgets-v2/formula/formula-ui.tsx","../src/widgets-v2/formula/formula.tsx","../src/widgets-v2/formula/skeleton.tsx","../src/widgets-v2/formula/download.tsx"],"sourcesContent":["import { Chip, type ChipProps } from '@mui/material'\nimport type { DeltaSeverity } from './types'\n\nexport interface DeltaProps {\n /** Numeric magnitude. Used for the default percent label and severity inference. */\n value: number\n /** Pre-formatted label override; skips the default percent formatter. */\n label?: string\n /**\n * Visual treatment. When omitted it's derived from the sign of `value`:\n * `>0 → 'positive'`, `<0 → 'negative'`, `=0 → 'neutral'`.\n */\n severity?: DeltaSeverity\n /** Override the default `Intl.NumberFormat({style:'percent'})` formatter. */\n format?: (value: number) => string\n ChipProps?: ChipProps\n}\n\nconst defaultPercentFormatter = new Intl.NumberFormat(undefined, {\n style: 'percent',\n signDisplay: 'always',\n maximumFractionDigits: 1,\n})\n\nconst SEVERITY_TO_COLOR: Record<DeltaSeverity, ChipProps['color']> = {\n positive: 'success',\n negative: 'error',\n neutral: 'default',\n}\n\n/**\n * Comparative delta rendered as a small filled chip. Colour is driven by\n * `severity` (or the sign of `value`); content is `label`, the result of\n * `format(value)`, or the default percent format.\n */\nexport function Delta({\n value,\n label,\n severity,\n format,\n ChipProps: chipProps,\n}: DeltaProps) {\n const resolvedSeverity = severity ?? inferSeverity(value)\n const text =\n label ?? (format ? format(value) : defaultPercentFormatter.format(value))\n return (\n <Chip\n size='small'\n color={SEVERITY_TO_COLOR[resolvedSeverity]}\n label={text}\n sx={{ fontWeight: 600 }}\n {...chipProps}\n />\n )\n}\n\nfunction inferSeverity(value: number): DeltaSeverity {\n if (value > 0) return 'positive'\n if (value < 0) return 'negative'\n return 'neutral'\n}\n","import { Typography, type TypographyProps } from '@mui/material'\nimport type { ReactNode } from 'react'\n\nexport interface NoteProps {\n children: ReactNode\n TypographyProps?: TypographyProps\n}\n\n/**\n * Small subdued caption rendered below a Formula value. Use for short\n * descriptive text (e.g. \"Last 7 days\", \"Excludes refunds\").\n */\nexport function Note({ children, TypographyProps }: NoteProps) {\n return (\n <Typography\n variant='caption'\n component='p'\n color='text.secondary'\n sx={{ m: 0 }}\n {...TypographyProps}\n >\n {children}\n </Typography>\n )\n}\n","import { Typography, type TypographyProps } from '@mui/material'\nimport type { ReactNode } from 'react'\n\nexport interface PrefixProps {\n children: ReactNode\n TypographyProps?: TypographyProps\n}\n\n/**\n * Prefix slot for a Formula KPI — large, bold, muted (`text.secondary`).\n * Composable building block for custom formula layouts; the canonical\n * {@link FormulaUI} renders one of these per item when `prefix` is set.\n */\nexport function Prefix({ children, TypographyProps }: PrefixProps) {\n return (\n <Typography\n variant='h5'\n component='span'\n sx={{ fontWeight: 600, color: 'text.secondary', lineHeight: 1 }}\n {...TypographyProps}\n >\n {children}\n </Typography>\n )\n}\n","import { Avatar, type AvatarProps, type Theme } from '@mui/material'\n\nexport interface SeriesProps {\n /** Used for the avatar's first-letter glyph and as accessible label. */\n name: string\n /** Avatar background colour (any MUI palette path or CSS colour). */\n color?: string\n /** Diameter in px. Default `24`. */\n size?: number\n AvatarProps?: AvatarProps\n}\n\n/**\n * Series indicator — circular avatar showing the first letter of `name`.\n * Background colour is `color` (consumer-supplied) or a neutral disabled\n * colour, with text colour computed for contrast against it.\n */\nexport function Series({\n name,\n color,\n size = 24,\n AvatarProps: avatarProps,\n}: SeriesProps) {\n const letter = name.charAt(0).toUpperCase()\n return (\n <Avatar\n aria-label={name}\n sx={{\n width: size,\n height: size,\n fontSize: size * 0.5,\n fontWeight: 600,\n bgcolor: color ?? 'action.disabledBackground',\n color: color\n ? (theme: Theme) =>\n theme.palette.getContrastText(toCssColor(theme, color))\n : 'text.primary',\n }}\n {...avatarProps}\n >\n {letter}\n </Avatar>\n )\n}\n\n/**\n * Resolve a palette path (e.g. `\"primary.main\"`) to a hex/rgb string so that\n * `getContrastText` — which doesn't accept dotted paths — produces a sensible\n * text colour. Non-palette strings (raw `#hex`, `rgb(...)`) pass through.\n */\nfunction toCssColor(theme: Theme, value: string): string {\n if (!value.includes('.')) return value\n const parts = value.split('.')\n let cur: unknown = theme.palette\n for (const p of parts) {\n if (\n cur &&\n typeof cur === 'object' &&\n p in (cur as Record<string, unknown>)\n ) {\n cur = (cur as Record<string, unknown>)[p]\n } else {\n return value\n }\n }\n return typeof cur === 'string' ? cur : value\n}\n","import { Typography, type TypographyProps } from '@mui/material'\nimport type { ReactNode } from 'react'\n\nexport interface SuffixProps {\n children: ReactNode\n TypographyProps?: TypographyProps\n}\n\n/**\n * Suffix slot for a Formula KPI — large, bold, muted (`text.secondary`).\n * Composable building block for custom formula layouts; the canonical\n * {@link FormulaUI} renders one of these per item when `suffix` is set.\n */\nexport function Suffix({ children, TypographyProps }: SuffixProps) {\n return (\n <Typography\n variant='h5'\n component='span'\n sx={{ fontWeight: 600, color: 'text.secondary', lineHeight: 1 }}\n {...TypographyProps}\n >\n {children}\n </Typography>\n )\n}\n","import { Typography, type TypographyProps } from '@mui/material'\nimport type { ReactNode } from 'react'\n\nexport interface ValueProps {\n children: ReactNode\n /** Override the default `text.primary` color — useful for sparkline tints. */\n color?: string\n TypographyProps?: TypographyProps\n}\n\n/**\n * Value slot for a Formula KPI — large, bold, primary text color. Composable\n * building block for custom formula layouts; the canonical {@link FormulaUI}\n * renders one of these per item.\n */\nexport function Value({ children, color, TypographyProps }: ValueProps) {\n return (\n <Typography\n variant='h5'\n component='span'\n sx={{\n fontWeight: 600,\n color: color ?? 'text.primary',\n lineHeight: 1,\n }}\n {...TypographyProps}\n >\n {children}\n </Typography>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n alignItems: 'stretch',\n },\n row: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 1.5,\n },\n body: {\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 0.25,\n },\n valueRow: {\n display: 'inline-flex',\n alignItems: 'baseline',\n gap: 0.25,\n },\n delta: {\n alignSelf: 'center',\n flexShrink: 0,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box } from '@mui/material'\nimport type { Ref } from 'react'\nimport type { FormulaDataItem } from './types'\nimport { Delta } from './delta'\nimport { Note } from './note'\nimport { Prefix } from './prefix'\nimport { Series } from './series'\nimport { Suffix } from './suffix'\nimport { Value } from './value'\nimport { styles } from './style'\n\nexport interface FormulaUIProps {\n items: readonly FormulaDataItem[]\n /** Number formatter — applied to each item's `value`. */\n formatter?: (value: number) => string\n /** Forwarded to the root `<Box>` so consumers can capture the DOM (PNG export). */\n ref?: Ref<HTMLDivElement>\n}\n\n/**\n * Pure presentational component for the Formula widget. Each item renders as\n * a row containing (in order): optional `Series` avatar, a body with\n * `[prefix] value [suffix]` plus optional `Note`, and an optional `Delta`\n * chip pushed to the right edge.\n *\n * For fully custom layouts, compose {@link Series}, {@link Prefix},\n * {@link Value}, {@link Suffix}, {@link Note}, and {@link Delta} directly\n * instead of passing `items`.\n */\nexport function FormulaUI({ items, formatter, ref }: FormulaUIProps) {\n return (\n <Box ref={ref} sx={styles.root}>\n {items.map((item, i) => (\n // Series name is the closest stable id; fall back to the literal\n // value (numeric KPIs rarely repeat with the same prefix/suffix).\n <Box\n key={`formula-${item.series?.name ?? `${item.prefix ?? ''}${item.value}${item.suffix ?? ''}`}-${i}`}\n sx={styles.row}\n >\n {item.series ? (\n <Series name={item.series.name} color={item.series.color} />\n ) : null}\n <Box sx={styles.body}>\n <Box sx={styles.valueRow}>\n {item.prefix ? <Prefix>{item.prefix}</Prefix> : null}\n <Value color={item.color}>\n {formatter ? formatter(item.value) : String(item.value)}\n </Value>\n {item.suffix ? <Suffix>{item.suffix}</Suffix> : null}\n </Box>\n {item.note ? <Note>{item.note}</Note> : null}\n </Box>\n {item.delta ? (\n <Box sx={styles.delta}>\n <Delta\n value={item.delta.value}\n label={item.delta.label}\n severity={item.delta.severity}\n />\n </Box>\n ) : null}\n </Box>\n ))}\n </Box>\n )\n}\n","import { useWidgetId, useWidgetShallow } from '../stores'\nimport { FormulaUI } from './formula-ui'\nimport type { FormulaWidgetData } from './types'\n\ninterface FormulaSlice {\n data: FormulaWidgetData\n formatter?: (value: number) => string\n}\n\n// Stable empty-data sentinel — keeps the slice's `data` reference stable\n// when the underlying store value is null/undefined so the shallow-equality\n// gate in `useWidgetShallow` doesn't re-render every commit.\nconst EMPTY_DATA: FormulaWidgetData = Object.freeze([]) as FormulaWidgetData\n\nconst formulaSelector = (s: {\n data: unknown\n formatter?: (value: number) => string\n}): FormulaSlice => ({\n data: (s.data ?? EMPTY_DATA) as FormulaWidgetData,\n formatter: s.formatter,\n})\n\n/**\n * Stateful Formula bridge — reads `data` (post-pipeline) and `formatter` from\n * the per-widget store and forwards them to the pure {@link FormulaUI}. Sits\n * inside `<Widget.Provider>`. Demonstrates that the composition shell\n * (Provider, Wrapper, State) doesn't care whether the rendered child is\n * ECharts (Bar) or a custom DOM tree (Formula).\n */\nexport function Formula() {\n const id = useWidgetId()\n const slice = useWidgetShallow(id, formulaSelector)\n return <FormulaUI items={slice.data} formatter={slice.formatter} />\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n gap: 3,\n alignItems: 'baseline',\n minHeight: 64,\n py: 1,\n },\n block: { width: 120, height: 36 },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface FormulaSkeletonProps {\n count?: number\n}\n\nexport function FormulaSkeleton({ count = 1 }: FormulaSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={`row-${i}`} variant='rectangular' sx={styles.block} />\n ))}\n </Box>\n )\n}\n","import {\n buildCsvDownloadItem,\n buildPngDownloadItem,\n type DownloadItem,\n} from '../actions/download'\nimport type { FormulaWidgetData } from './types'\n\nexport interface FormulaDownloadConfigArgs {\n filename: string\n getData: () => FormulaWidgetData\n /**\n * Optional getter for the widget's capture element (registered by\n * `Widget.State`). When provided, a PNG item is prepended.\n */\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}\n\n/**\n * Builds download items for the Formula widget. Always includes a CSV item\n * with one row per KPI (`prefix`, `value`, `suffix`, `note`, `delta`).\n * When `getCaptureEl` is supplied, prepends a PNG item that rasterises the\n * captured element via `html2canvas`.\n */\nexport function createFormulaDownloadConfig(\n args: FormulaDownloadConfigArgs,\n): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push(\n buildCsvDownloadItem({\n filename: args.filename,\n getRows: () => {\n const data = args.getData()\n const rows: unknown[][] = [\n ['series', 'prefix', 'value', 'suffix', 'note', 'delta'],\n ]\n for (const d of data) {\n rows.push([\n d.series?.name ?? '',\n d.prefix ?? '',\n d.value,\n d.suffix ?? '',\n d.note ?? '',\n d.delta?.value ?? '',\n ])\n }\n return rows\n },\n }),\n )\n return items\n}\n"],"mappings":"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"}
|
package/dist/legend.js
CHANGED
|
@@ -636,6 +636,7 @@ function Ve(e) {
|
|
|
636
636
|
}), c.subtitle && !D && /* @__PURE__ */ V(z, {
|
|
637
637
|
variant: "caption",
|
|
638
638
|
color: "text.secondary",
|
|
639
|
+
component: "p",
|
|
639
640
|
children: c.subtitle
|
|
640
641
|
})]
|
|
641
642
|
}),
|
|
@@ -659,6 +660,7 @@ function Ve(e) {
|
|
|
659
660
|
children: typeof c.helperText == "string" ? /* @__PURE__ */ V(z, {
|
|
660
661
|
variant: "caption",
|
|
661
662
|
color: "text.secondary",
|
|
663
|
+
component: "p",
|
|
662
664
|
children: c.helperText
|
|
663
665
|
}) : c.helperText
|
|
664
666
|
})]
|