@langchain/macaw-components 1.0.0-beta.0
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/LICENSE +21 -0
- package/README.md +27 -0
- package/dist/_chunks/ErrorState-CmPX01HV.js +13361 -0
- package/dist/_chunks/ErrorState-CmPX01HV.js.map +1 -0
- package/dist/_chunks/LoadingIndicator-DgtU9aqD.js +80 -0
- package/dist/_chunks/LoadingIndicator-DgtU9aqD.js.map +1 -0
- package/dist/base.css +305 -0
- package/dist/catalog.json +1675 -0
- package/dist/components/Avatar/Avatar.d.ts +28 -0
- package/dist/components/Avatar/Avatar.js +47 -0
- package/dist/components/Avatar/Avatar.js.map +1 -0
- package/dist/components/Avatar/index.d.ts +2 -0
- package/dist/components/Avatar/index.js +2 -0
- package/dist/components/Badge/Badge.d.ts +25 -0
- package/dist/components/Badge/Badge.js +82 -0
- package/dist/components/Badge/Badge.js.map +1 -0
- package/dist/components/Badge/index.d.ts +2 -0
- package/dist/components/Badge/index.js +2 -0
- package/dist/components/Banner/Banner.d.ts +15 -0
- package/dist/components/Banner/Banner.js +102 -0
- package/dist/components/Banner/Banner.js.map +1 -0
- package/dist/components/Banner/index.d.ts +2 -0
- package/dist/components/Banner/index.js +2 -0
- package/dist/components/BarChart/AnimatedBar.d.ts +20 -0
- package/dist/components/BarChart/AnimatedBar.js +65 -0
- package/dist/components/BarChart/AnimatedBar.js.map +1 -0
- package/dist/components/BarChart/BarChart.d.ts +25 -0
- package/dist/components/BarChart/BarChart.js +248 -0
- package/dist/components/BarChart/BarChart.js.map +1 -0
- package/dist/components/BarChart/BarChart.types.d.ts +239 -0
- package/dist/components/BarChart/BarChart.types.js +0 -0
- package/dist/components/BarChart/BarChart.utils.d.ts +51 -0
- package/dist/components/BarChart/BarChart.utils.js +215 -0
- package/dist/components/BarChart/BarChart.utils.js.map +1 -0
- package/dist/components/BarChart/BarChartAxes.d.ts +22 -0
- package/dist/components/BarChart/BarChartAxes.js +144 -0
- package/dist/components/BarChart/BarChartAxes.js.map +1 -0
- package/dist/components/BarChart/BarChartGuides.d.ts +22 -0
- package/dist/components/BarChart/BarChartGuides.js +83 -0
- package/dist/components/BarChart/BarChartGuides.js.map +1 -0
- package/dist/components/BarChart/BarChartPlot.d.ts +40 -0
- package/dist/components/BarChart/BarChartPlot.js +262 -0
- package/dist/components/BarChart/BarChartPlot.js.map +1 -0
- package/dist/components/BarChart/constants.d.ts +21 -0
- package/dist/components/BarChart/constants.js +26 -0
- package/dist/components/BarChart/constants.js.map +1 -0
- package/dist/components/BarChart/index.d.ts +3 -0
- package/dist/components/BarChart/index.js +3 -0
- package/dist/components/Button/Button.d.ts +36 -0
- package/dist/components/Button/Button.js +99 -0
- package/dist/components/Button/Button.js.map +1 -0
- package/dist/components/Button/constants.d.ts +26 -0
- package/dist/components/Button/constants.js +31 -0
- package/dist/components/Button/constants.js.map +1 -0
- package/dist/components/Button/index.d.ts +2 -0
- package/dist/components/Button/index.js +2 -0
- package/dist/components/ButtonGroup/ButtonGroup.d.ts +30 -0
- package/dist/components/ButtonGroup/ButtonGroup.js +26 -0
- package/dist/components/ButtonGroup/ButtonGroup.js.map +1 -0
- package/dist/components/ButtonGroup/index.d.ts +2 -0
- package/dist/components/ButtonGroup/index.js +2 -0
- package/dist/components/Card/Card.d.ts +10 -0
- package/dist/components/Card/Card.js +23 -0
- package/dist/components/Card/Card.js.map +1 -0
- package/dist/components/Card/index.d.ts +2 -0
- package/dist/components/Card/index.js +2 -0
- package/dist/components/ChartCard/ChartCard.d.ts +53 -0
- package/dist/components/ChartCard/ChartCard.js +172 -0
- package/dist/components/ChartCard/ChartCard.js.map +1 -0
- package/dist/components/ChartCard/ChartCardSkeleton.d.ts +7 -0
- package/dist/components/ChartCard/ChartCardSkeleton.js +61 -0
- package/dist/components/ChartCard/ChartCardSkeleton.js.map +1 -0
- package/dist/components/ChartCard/index.d.ts +4 -0
- package/dist/components/ChartCard/index.js +3 -0
- package/dist/components/ChartLegend/ChartLegend.d.ts +19 -0
- package/dist/components/ChartLegend/ChartLegend.js +195 -0
- package/dist/components/ChartLegend/ChartLegend.js.map +1 -0
- package/dist/components/ChartLegend/ChartLegendItemRenderer.d.ts +14 -0
- package/dist/components/ChartLegend/ChartLegendItemRenderer.js +90 -0
- package/dist/components/ChartLegend/ChartLegendItemRenderer.js.map +1 -0
- package/dist/components/ChartLegend/index.d.ts +3 -0
- package/dist/components/ChartLegend/index.js +3 -0
- package/dist/components/ChartLegend/useChartLegendActiveItem.d.ts +7 -0
- package/dist/components/ChartLegend/useChartLegendActiveItem.js +35 -0
- package/dist/components/ChartLegend/useChartLegendActiveItem.js.map +1 -0
- package/dist/components/ChartLegend/utils.d.ts +20 -0
- package/dist/components/ChartLegend/utils.js +33 -0
- package/dist/components/ChartLegend/utils.js.map +1 -0
- package/dist/components/ChartTooltip/ChartTooltip.d.ts +23 -0
- package/dist/components/ChartTooltip/ChartTooltip.js +83 -0
- package/dist/components/ChartTooltip/ChartTooltip.js.map +1 -0
- package/dist/components/ChartTooltip/index.d.ts +2 -0
- package/dist/components/ChartTooltip/index.js +2 -0
- package/dist/components/Checkbox/Checkbox.d.ts +58 -0
- package/dist/components/Checkbox/Checkbox.js +50 -0
- package/dist/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/components/Checkbox/constants.d.ts +28 -0
- package/dist/components/Checkbox/constants.js +57 -0
- package/dist/components/Checkbox/constants.js.map +1 -0
- package/dist/components/Checkbox/getCheckedState.d.ts +6 -0
- package/dist/components/Checkbox/getCheckedState.js +14 -0
- package/dist/components/Checkbox/getCheckedState.js.map +1 -0
- package/dist/components/Checkbox/index.d.ts +3 -0
- package/dist/components/Checkbox/index.js +3 -0
- package/dist/components/CircularProgress/CircularProgress.d.ts +54 -0
- package/dist/components/CircularProgress/CircularProgress.js +85 -0
- package/dist/components/CircularProgress/CircularProgress.js.map +1 -0
- package/dist/components/CircularProgress/index.d.ts +2 -0
- package/dist/components/CircularProgress/index.js +2 -0
- package/dist/components/Code/Code.utils.d.ts +24 -0
- package/dist/components/Code/Code.utils.js +160 -0
- package/dist/components/Code/Code.utils.js.map +1 -0
- package/dist/components/Code/CodeLite.d.ts +19 -0
- package/dist/components/Code/CodeLite.js +146 -0
- package/dist/components/Code/CodeLite.js.map +1 -0
- package/dist/components/Code/CodeLite.utils.d.ts +24 -0
- package/dist/components/Code/CodeLite.utils.js +273 -0
- package/dist/components/Code/CodeLite.utils.js.map +1 -0
- package/dist/components/Code/ImageReplacerExtension.d.ts +9 -0
- package/dist/components/Code/ImageReplacerExtension.js +227 -0
- package/dist/components/Code/ImageReplacerExtension.js.map +1 -0
- package/dist/components/Code/JsonHighlighterExtension.d.ts +4 -0
- package/dist/components/Code/JsonHighlighterExtension.js +172 -0
- package/dist/components/Code/JsonHighlighterExtension.js.map +1 -0
- package/dist/components/Code/constants.d.ts +6 -0
- package/dist/components/Code/constants.js +11 -0
- package/dist/components/Code/constants.js.map +1 -0
- package/dist/components/Code/index.d.ts +30 -0
- package/dist/components/Code/index.js +140 -0
- package/dist/components/Code/index.js.map +1 -0
- package/dist/components/Code/languages/json.d.ts +1 -0
- package/dist/components/Code/languages/json.js +7 -0
- package/dist/components/Code/languages/json.js.map +1 -0
- package/dist/components/Code/languages/languages.d.ts +7 -0
- package/dist/components/Code/languages/languages.js +12 -0
- package/dist/components/Code/languages/languages.js.map +1 -0
- package/dist/components/Code/languages/python.d.ts +1 -0
- package/dist/components/Code/languages/python.js +7 -0
- package/dist/components/Code/languages/python.js.map +1 -0
- package/dist/components/Code/languages/shell.d.ts +7 -0
- package/dist/components/Code/languages/shell.js +241 -0
- package/dist/components/Code/languages/shell.js.map +1 -0
- package/dist/components/Code/languages/typescript.d.ts +1 -0
- package/dist/components/Code/languages/typescript.js +7 -0
- package/dist/components/Code/languages/typescript.js.map +1 -0
- package/dist/components/Code/languages/yaml.d.ts +2 -0
- package/dist/components/Code/languages/yaml.js +44 -0
- package/dist/components/Code/languages/yaml.js.map +1 -0
- package/dist/components/Code/types.d.ts +8 -0
- package/dist/components/Code/types.js +0 -0
- package/dist/components/Code/utils.d.ts +4 -0
- package/dist/components/Code/utils.js +27 -0
- package/dist/components/Code/utils.js.map +1 -0
- package/dist/components/Command/Command.d.ts +78 -0
- package/dist/components/Command/Command.js +78 -0
- package/dist/components/Command/Command.js.map +1 -0
- package/dist/components/Command/CommandMenu.d.ts +65 -0
- package/dist/components/Command/CommandMenu.js +101 -0
- package/dist/components/Command/CommandMenu.js.map +1 -0
- package/dist/components/Command/index.d.ts +4 -0
- package/dist/components/Command/index.js +3 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts +9 -0
- package/dist/components/ContextMenu/ContextMenu.js +43 -0
- package/dist/components/ContextMenu/ContextMenu.js.map +1 -0
- package/dist/components/ContextMenu/index.d.ts +1 -0
- package/dist/components/ContextMenu/index.js +2 -0
- package/dist/components/CopyButton/CopyButton.d.ts +24 -0
- package/dist/components/CopyButton/CopyButton.js +121 -0
- package/dist/components/CopyButton/CopyButton.js.map +1 -0
- package/dist/components/CopyButton/copyToClipboard.d.ts +1 -0
- package/dist/components/CopyButton/copyToClipboard.js +29 -0
- package/dist/components/CopyButton/copyToClipboard.js.map +1 -0
- package/dist/components/CopyButton/index.d.ts +4 -0
- package/dist/components/CopyButton/index.js +4 -0
- package/dist/components/CopyButton/useCopy.d.ts +10 -0
- package/dist/components/CopyButton/useCopy.js +46 -0
- package/dist/components/CopyButton/useCopy.js.map +1 -0
- package/dist/components/Dialog/index.d.ts +49 -0
- package/dist/components/Dialog/index.js +130 -0
- package/dist/components/Dialog/index.js.map +1 -0
- package/dist/components/Divider/Divider.d.ts +9 -0
- package/dist/components/Divider/Divider.js +27 -0
- package/dist/components/Divider/Divider.js.map +1 -0
- package/dist/components/Divider/index.d.ts +2 -0
- package/dist/components/Divider/index.js +2 -0
- package/dist/components/DonutChart/DonutChart.d.ts +101 -0
- package/dist/components/DonutChart/DonutChart.js +197 -0
- package/dist/components/DonutChart/DonutChart.js.map +1 -0
- package/dist/components/DonutChart/DonutChart.utils.d.ts +38 -0
- package/dist/components/DonutChart/DonutChart.utils.js +93 -0
- package/dist/components/DonutChart/DonutChart.utils.js.map +1 -0
- package/dist/components/DonutChart/constants.d.ts +7 -0
- package/dist/components/DonutChart/constants.js +12 -0
- package/dist/components/DonutChart/constants.js.map +1 -0
- package/dist/components/DonutChart/index.d.ts +4 -0
- package/dist/components/DonutChart/index.js +4 -0
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +24 -0
- package/dist/components/DropdownMenu/DropdownMenu.js +149 -0
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
- package/dist/components/DropdownMenu/index.d.ts +1 -0
- package/dist/components/DropdownMenu/index.js +2 -0
- package/dist/components/EmptyState/EmptyState.d.ts +26 -0
- package/dist/components/EmptyState/EmptyState.js +85 -0
- package/dist/components/EmptyState/EmptyState.js.map +1 -0
- package/dist/components/EmptyState/index.d.ts +2 -0
- package/dist/components/EmptyState/index.js +2 -0
- package/dist/components/ErrorBoundary.d.ts +35 -0
- package/dist/components/ErrorBoundary.js +41 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/ErrorMessage/ErrorMessage.d.ts +17 -0
- package/dist/components/ErrorMessage/ErrorMessage.js +146 -0
- package/dist/components/ErrorMessage/ErrorMessage.js.map +1 -0
- package/dist/components/ErrorMessage/index.d.ts +2 -0
- package/dist/components/ErrorMessage/index.js +2 -0
- package/dist/components/ErrorState/ErrorState.d.ts +23 -0
- package/dist/components/ErrorState/ErrorState.js +2 -0
- package/dist/components/ErrorState/index.d.ts +2 -0
- package/dist/components/ErrorState/index.js +2 -0
- package/dist/components/GroupedTabs/GroupedTabs.d.ts +31 -0
- package/dist/components/GroupedTabs/GroupedTabs.js +92 -0
- package/dist/components/GroupedTabs/GroupedTabs.js.map +1 -0
- package/dist/components/GroupedTabs/index.d.ts +2 -0
- package/dist/components/GroupedTabs/index.js +2 -0
- package/dist/components/HoverCard.d.ts +4 -0
- package/dist/components/HoverCard.js +34 -0
- package/dist/components/HoverCard.js.map +1 -0
- package/dist/components/Icon/Icon.d.ts +25 -0
- package/dist/components/Icon/Icon.js +57 -0
- package/dist/components/Icon/Icon.js.map +1 -0
- package/dist/components/Icon/index.d.ts +2 -0
- package/dist/components/Icon/index.js +2 -0
- package/dist/components/IconButton/IconButton.d.ts +35 -0
- package/dist/components/IconButton/IconButton.js +73 -0
- package/dist/components/IconButton/IconButton.js.map +1 -0
- package/dist/components/IconButton/index.d.ts +2 -0
- package/dist/components/IconButton/index.js +2 -0
- package/dist/components/Input/Input.d.ts +72 -0
- package/dist/components/Input/Input.js +221 -0
- package/dist/components/Input/Input.js.map +1 -0
- package/dist/components/Input/index.d.ts +2 -0
- package/dist/components/Input/index.js +2 -0
- package/dist/components/Input/inputStyles.d.ts +28 -0
- package/dist/components/Input/inputStyles.js +45 -0
- package/dist/components/Input/inputStyles.js.map +1 -0
- package/dist/components/Kbd/Kbd.d.ts +15 -0
- package/dist/components/Kbd/Kbd.js +30 -0
- package/dist/components/Kbd/Kbd.js.map +1 -0
- package/dist/components/Kbd/index.d.ts +2 -0
- package/dist/components/Kbd/index.js +2 -0
- package/dist/components/LineChart/LineChart.d.ts +8 -0
- package/dist/components/LineChart/LineChart.js +194 -0
- package/dist/components/LineChart/LineChart.js.map +1 -0
- package/dist/components/LineChart/LineChart.types.d.ts +138 -0
- package/dist/components/LineChart/LineChart.types.js +0 -0
- package/dist/components/LineChart/LineChart.utils.d.ts +29 -0
- package/dist/components/LineChart/LineChart.utils.js +123 -0
- package/dist/components/LineChart/LineChart.utils.js.map +1 -0
- package/dist/components/LineChart/LineChartPlot.d.ts +43 -0
- package/dist/components/LineChart/LineChartPlot.js +306 -0
- package/dist/components/LineChart/LineChartPlot.js.map +1 -0
- package/dist/components/LineChart/constants.d.ts +3 -0
- package/dist/components/LineChart/constants.js +8 -0
- package/dist/components/LineChart/constants.js.map +1 -0
- package/dist/components/LineChart/index.d.ts +2 -0
- package/dist/components/LineChart/index.js +2 -0
- package/dist/components/LinearProgress/LinearProgress.d.ts +16 -0
- package/dist/components/LinearProgress/LinearProgress.js +42 -0
- package/dist/components/LinearProgress/LinearProgress.js.map +1 -0
- package/dist/components/LinearProgress/index.d.ts +2 -0
- package/dist/components/LinearProgress/index.js +2 -0
- package/dist/components/Link/Link.d.ts +30 -0
- package/dist/components/Link/Link.js +51 -0
- package/dist/components/Link/Link.js.map +1 -0
- package/dist/components/Link/index.d.ts +2 -0
- package/dist/components/Link/index.js +2 -0
- package/dist/components/Logo/index.d.ts +17 -0
- package/dist/components/Logo/index.js +705 -0
- package/dist/components/Logo/index.js.map +1 -0
- package/dist/components/MetricChart/MetricChart.d.ts +9 -0
- package/dist/components/MetricChart/MetricChart.js +42 -0
- package/dist/components/MetricChart/MetricChart.js.map +1 -0
- package/dist/components/MetricChart/formatters.d.ts +18 -0
- package/dist/components/MetricChart/formatters.js +34 -0
- package/dist/components/MetricChart/formatters.js.map +1 -0
- package/dist/components/MetricChart/index.d.ts +4 -0
- package/dist/components/MetricChart/index.js +3 -0
- package/dist/components/Pane/Pane.d.ts +29 -0
- package/dist/components/Pane/Pane.js +171 -0
- package/dist/components/Pane/Pane.js.map +1 -0
- package/dist/components/Pane/Pane.utils.d.ts +10 -0
- package/dist/components/Pane/Pane.utils.js +7 -0
- package/dist/components/Pane/Pane.utils.js.map +1 -0
- package/dist/components/Pane/index.d.ts +3 -0
- package/dist/components/Pane/index.js +3 -0
- package/dist/components/PlainTextEditor/hooks/useResizeTextEditor.d.ts +9 -0
- package/dist/components/PlainTextEditor/hooks/useResizeTextEditor.js +76 -0
- package/dist/components/PlainTextEditor/hooks/useResizeTextEditor.js.map +1 -0
- package/dist/components/PlainTextEditor/index.d.ts +18 -0
- package/dist/components/PlainTextEditor/index.js +71 -0
- package/dist/components/PlainTextEditor/index.js.map +1 -0
- package/dist/components/Popover/Popover.d.ts +13 -0
- package/dist/components/Popover/Popover.js +48 -0
- package/dist/components/Popover/Popover.js.map +1 -0
- package/dist/components/Popover/constants.d.ts +1 -0
- package/dist/components/Popover/constants.js +6 -0
- package/dist/components/Popover/constants.js.map +1 -0
- package/dist/components/Popover/index.d.ts +1 -0
- package/dist/components/Popover/index.js +2 -0
- package/dist/components/PortalSlot.d.ts +11 -0
- package/dist/components/PortalSlot.js +41 -0
- package/dist/components/PortalSlot.js.map +1 -0
- package/dist/components/ProgressBar/ProgressBar.d.ts +38 -0
- package/dist/components/ProgressBar/ProgressBar.js +82 -0
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
- package/dist/components/ProgressBar/index.d.ts +2 -0
- package/dist/components/ProgressBar/index.js +2 -0
- package/dist/components/RadioButton/RadioButton.d.ts +62 -0
- package/dist/components/RadioButton/RadioButton.js +38 -0
- package/dist/components/RadioButton/RadioButton.js.map +1 -0
- package/dist/components/RadioButton/constants.d.ts +30 -0
- package/dist/components/RadioButton/constants.js +55 -0
- package/dist/components/RadioButton/constants.js.map +1 -0
- package/dist/components/RadioButton/index.d.ts +2 -0
- package/dist/components/RadioButton/index.js +2 -0
- package/dist/components/RadioCard/RadioCard.d.ts +26 -0
- package/dist/components/RadioCard/RadioCard.js +43 -0
- package/dist/components/RadioCard/RadioCard.js.map +1 -0
- package/dist/components/RadioCard/index.d.ts +2 -0
- package/dist/components/RadioCard/index.js +2 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +5 -0
- package/dist/components/RadioGroup/RadioGroup.js +17 -0
- package/dist/components/RadioGroup/RadioGroup.js.map +1 -0
- package/dist/components/RadioGroup/RadioGroupItem.d.ts +5 -0
- package/dist/components/RadioGroup/RadioGroupItem.js +22 -0
- package/dist/components/RadioGroup/RadioGroupItem.js.map +1 -0
- package/dist/components/RadioGroup/index.d.ts +4 -0
- package/dist/components/RadioGroup/index.js +3 -0
- package/dist/components/Select/Select.d.ts +84 -0
- package/dist/components/Select/Select.js +120 -0
- package/dist/components/Select/Select.js.map +1 -0
- package/dist/components/Select/SelectPrimitive.d.ts +17 -0
- package/dist/components/Select/SelectPrimitive.js +126 -0
- package/dist/components/Select/SelectPrimitive.js.map +1 -0
- package/dist/components/Select/index.d.ts +4 -0
- package/dist/components/Select/index.js +3 -0
- package/dist/components/Skeleton/Skeleton.d.ts +13 -0
- package/dist/components/Skeleton/Skeleton.js +25 -0
- package/dist/components/Skeleton/Skeleton.js.map +1 -0
- package/dist/components/Skeleton/index.d.ts +1 -0
- package/dist/components/Skeleton/index.js +2 -0
- package/dist/components/Slider/Slider.d.ts +33 -0
- package/dist/components/Slider/Slider.js +64 -0
- package/dist/components/Slider/Slider.js.map +1 -0
- package/dist/components/Slider/index.d.ts +2 -0
- package/dist/components/Slider/index.js +2 -0
- package/dist/components/SparkLineChart/SparkLineChart.d.ts +14 -0
- package/dist/components/SparkLineChart/SparkLineChart.js +112 -0
- package/dist/components/SparkLineChart/SparkLineChart.js.map +1 -0
- package/dist/components/SparkLineChart/index.d.ts +2 -0
- package/dist/components/SparkLineChart/index.js +2 -0
- package/dist/components/Spinner/Spinner.d.ts +12 -0
- package/dist/components/Spinner/Spinner.js +33 -0
- package/dist/components/Spinner/Spinner.js.map +1 -0
- package/dist/components/Spinner/index.d.ts +1 -0
- package/dist/components/Spinner/index.js +2 -0
- package/dist/components/SplitViewPane/SplitViewPane.d.ts +41 -0
- package/dist/components/SplitViewPane/SplitViewPane.js +314 -0
- package/dist/components/SplitViewPane/SplitViewPane.js.map +1 -0
- package/dist/components/SplitViewPane/SplitViewPaneHeader.d.ts +22 -0
- package/dist/components/SplitViewPane/SplitViewPaneHeader.js +105 -0
- package/dist/components/SplitViewPane/SplitViewPaneHeader.js.map +1 -0
- package/dist/components/SplitViewPane/index.d.ts +2 -0
- package/dist/components/SplitViewPane/index.js +3 -0
- package/dist/components/SplitViewPane/openPaneRegistry.d.ts +2 -0
- package/dist/components/SplitViewPane/openPaneRegistry.js +49 -0
- package/dist/components/SplitViewPane/openPaneRegistry.js.map +1 -0
- package/dist/components/Switch/Switch.d.ts +35 -0
- package/dist/components/Switch/Switch.js +65 -0
- package/dist/components/Switch/Switch.js.map +1 -0
- package/dist/components/Switch/index.d.ts +2 -0
- package/dist/components/Switch/index.js +2 -0
- package/dist/components/Tabs/index.d.ts +27 -0
- package/dist/components/Tabs/index.js +45 -0
- package/dist/components/Tabs/index.js.map +1 -0
- package/dist/components/Text/Text.d.ts +13 -0
- package/dist/components/Text/Text.js +58 -0
- package/dist/components/Text/Text.js.map +1 -0
- package/dist/components/Text/index.d.ts +2 -0
- package/dist/components/Text/index.js +2 -0
- package/dist/components/TextVirtualizer.d.ts +8 -0
- package/dist/components/TextVirtualizer.js +53 -0
- package/dist/components/TextVirtualizer.js.map +1 -0
- package/dist/components/TextWithLinks.d.ts +6 -0
- package/dist/components/TextWithLinks.js +61 -0
- package/dist/components/TextWithLinks.js.map +1 -0
- package/dist/components/Textarea/Textarea.d.ts +47 -0
- package/dist/components/Textarea/Textarea.js +150 -0
- package/dist/components/Textarea/Textarea.js.map +1 -0
- package/dist/components/Textarea/index.d.ts +2 -0
- package/dist/components/Textarea/index.js +2 -0
- package/dist/components/ThinkingState/LoadingIndicator.d.ts +19 -0
- package/dist/components/ThinkingState/LoadingIndicator.js +2 -0
- package/dist/components/ThinkingState/NOTICE +25 -0
- package/dist/components/ThinkingState/ThinkingState.d.ts +21 -0
- package/dist/components/ThinkingState/ThinkingState.js +42 -0
- package/dist/components/ThinkingState/ThinkingState.js.map +1 -0
- package/dist/components/ThinkingState/ThinkingStateTimer.d.ts +9 -0
- package/dist/components/ThinkingState/ThinkingStateTimer.js +43 -0
- package/dist/components/ThinkingState/ThinkingStateTimer.js.map +1 -0
- package/dist/components/ThinkingState/index.d.ts +4 -0
- package/dist/components/ThinkingState/index.js +3 -0
- package/dist/components/Toast/ToastContext.d.ts +5 -0
- package/dist/components/Toast/ToastContext.js +9 -0
- package/dist/components/Toast/ToastContext.js.map +1 -0
- package/dist/components/Toast/index.d.ts +13 -0
- package/dist/components/Toast/index.js +166 -0
- package/dist/components/Toast/index.js.map +1 -0
- package/dist/components/Toast/useToast.d.ts +3 -0
- package/dist/components/Toast/useToast.js +11 -0
- package/dist/components/Toast/useToast.js.map +1 -0
- package/dist/components/Tooltip/Tooltip.d.ts +19 -0
- package/dist/components/Tooltip/Tooltip.js +57 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/components/Tooltip/index.d.ts +3 -0
- package/dist/components/Tooltip/index.js +3 -0
- package/dist/components/TopList/TopList.d.ts +3 -0
- package/dist/components/TopList/TopList.js +186 -0
- package/dist/components/TopList/TopList.js.map +1 -0
- package/dist/components/TopList/TopList.types.d.ts +34 -0
- package/dist/components/TopList/TopList.types.js +0 -0
- package/dist/components/TopList/TopList.utils.d.ts +3 -0
- package/dist/components/TopList/TopList.utils.js +16 -0
- package/dist/components/TopList/TopList.utils.js.map +1 -0
- package/dist/components/TopList/index.d.ts +2 -0
- package/dist/components/TopList/index.js +2 -0
- package/dist/components/Typeahead/Typeahead.d.ts +5 -0
- package/dist/components/Typeahead/Typeahead.js +305 -0
- package/dist/components/Typeahead/Typeahead.js.map +1 -0
- package/dist/components/Typeahead/Typeahead.types.d.ts +99 -0
- package/dist/components/Typeahead/Typeahead.types.js +0 -0
- package/dist/components/Typeahead/Typeahead.utils.d.ts +25 -0
- package/dist/components/Typeahead/Typeahead.utils.js +73 -0
- package/dist/components/Typeahead/Typeahead.utils.js.map +1 -0
- package/dist/components/Typeahead/TypeaheadParts.d.ts +25 -0
- package/dist/components/Typeahead/TypeaheadParts.js +109 -0
- package/dist/components/Typeahead/TypeaheadParts.js.map +1 -0
- package/dist/components/Typeahead/TypeaheadView.d.ts +81 -0
- package/dist/components/Typeahead/TypeaheadView.js +228 -0
- package/dist/components/Typeahead/TypeaheadView.js.map +1 -0
- package/dist/components/Typeahead/index.d.ts +2 -0
- package/dist/components/Typeahead/index.js +2 -0
- package/dist/components/Typeahead/useTypeaheadDomSync.d.ts +15 -0
- package/dist/components/Typeahead/useTypeaheadDomSync.js +43 -0
- package/dist/components/Typeahead/useTypeaheadDomSync.js.map +1 -0
- package/dist/components/Typeahead/useTypeaheadUncontrolledInput.d.ts +11 -0
- package/dist/components/Typeahead/useTypeaheadUncontrolledInput.js +32 -0
- package/dist/components/Typeahead/useTypeaheadUncontrolledInput.js.map +1 -0
- package/dist/components/UnsavedChangesDialog.d.ts +14 -0
- package/dist/components/UnsavedChangesDialog.js +67 -0
- package/dist/components/UnsavedChangesDialog.js.map +1 -0
- package/dist/components/index.d.ts +58 -0
- package/dist/components/index.js +35 -0
- package/dist/components.css +102 -0
- package/dist/contexts/ErrorReporterContext.d.ts +6 -0
- package/dist/contexts/ErrorReporterContext.js +7 -0
- package/dist/contexts/ErrorReporterContext.js.map +1 -0
- package/dist/hooks/AppThemeProvider.d.ts +8 -0
- package/dist/hooks/AppThemeProvider.js +52 -0
- package/dist/hooks/AppThemeProvider.js.map +1 -0
- package/dist/hooks/useColorScheme.d.ts +20 -0
- package/dist/hooks/useColorScheme.js +50 -0
- package/dist/hooks/useColorScheme.js.map +1 -0
- package/dist/icons/LongTailPhosphorIcons.d.ts +51 -0
- package/dist/icons/LongTailPhosphorIcons.js +102 -0
- package/dist/icons/LongTailPhosphorIcons.js.map +1 -0
- package/dist/icons/PaddedPhosphorIcons.d.ts +17 -0
- package/dist/icons/PaddedPhosphorIcons.js +55 -0
- package/dist/icons/PaddedPhosphorIcons.js.map +1 -0
- package/dist/icons/WeightedPhosphorIcons.d.ts +45 -0
- package/dist/icons/WeightedPhosphorIcons.js +96 -0
- package/dist/icons/WeightedPhosphorIcons.js.map +1 -0
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/index.js +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +36 -0
- package/dist/styles.css +10 -0
- package/dist/utilities.css +2 -0
- package/dist/utils/VirtuosoCustomScrollParentContext/index.d.ts +7 -0
- package/dist/utils/VirtuosoCustomScrollParentContext/index.js +15 -0
- package/dist/utils/VirtuosoCustomScrollParentContext/index.js.map +1 -0
- package/dist/utils/VirtuosoCustomScrollParentContext/useScrollParent.d.ts +4 -0
- package/dist/utils/VirtuosoCustomScrollParentContext/useScrollParent.js +10 -0
- package/dist/utils/VirtuosoCustomScrollParentContext/useScrollParent.js.map +1 -0
- package/dist/utils/ZIndexContext.d.ts +5 -0
- package/dist/utils/ZIndexContext.js +13 -0
- package/dist/utils/ZIndexContext.js.map +1 -0
- package/dist/utils/animation.d.ts +37 -0
- package/dist/utils/animation.js +42 -0
- package/dist/utils/animation.js.map +1 -0
- package/dist/utils/chartAxisLayout.d.ts +6 -0
- package/dist/utils/chartAxisLayout.js +8 -0
- package/dist/utils/chartAxisLayout.js.map +1 -0
- package/dist/utils/chartColors.d.ts +38 -0
- package/dist/utils/chartColors.js +78 -0
- package/dist/utils/chartColors.js.map +1 -0
- package/dist/utils/chartConstants.d.ts +10 -0
- package/dist/utils/chartConstants.js +15 -0
- package/dist/utils/chartConstants.js.map +1 -0
- package/dist/utils/chartValues.d.ts +2 -0
- package/dist/utils/chartValues.js +36 -0
- package/dist/utils/chartValues.js.map +1 -0
- package/dist/utils/clamp.d.ts +2 -0
- package/dist/utils/clamp.js +7 -0
- package/dist/utils/clamp.js.map +1 -0
- package/dist/utils/cn.d.ts +2 -0
- package/dist/utils/cn.js +191 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/componentSizes.d.ts +104 -0
- package/dist/utils/componentSizes.js +104 -0
- package/dist/utils/componentSizes.js.map +1 -0
- package/dist/utils/controlIconSizes.d.ts +10 -0
- package/dist/utils/controlIconSizes.js +32 -0
- package/dist/utils/controlIconSizes.js.map +1 -0
- package/dist/utils/csp-nonce.d.ts +11 -0
- package/dist/utils/csp-nonce.js +17 -0
- package/dist/utils/csp-nonce.js.map +1 -0
- package/dist/utils/get-closest-scroll-parent.d.ts +1 -0
- package/dist/utils/get-closest-scroll-parent.js +16 -0
- package/dist/utils/get-closest-scroll-parent.js.map +1 -0
- package/dist/utils/get-color-by-string.d.ts +1 -0
- package/dist/utils/get-color-by-string.js +10 -0
- package/dist/utils/get-color-by-string.js.map +1 -0
- package/dist/utils/getYAxisLeftMargin.d.ts +10 -0
- package/dist/utils/getYAxisLeftMargin.js +20 -0
- package/dist/utils/getYAxisLeftMargin.js.map +1 -0
- package/dist/utils/icon-types.d.ts +8 -0
- package/dist/utils/icon-types.js +0 -0
- package/dist/utils/lazy-codemirror-loader.d.ts +70 -0
- package/dist/utils/lazy-codemirror-loader.js +79 -0
- package/dist/utils/lazy-codemirror-loader.js.map +1 -0
- package/dist/utils/merge-refs.d.ts +2 -0
- package/dist/utils/merge-refs.js +13 -0
- package/dist/utils/merge-refs.js.map +1 -0
- package/dist/utils/parseTextLinks.d.ts +7 -0
- package/dist/utils/parseTextLinks.js +46 -0
- package/dist/utils/parseTextLinks.js.map +1 -0
- package/dist/utils/prettify-error-payload.d.ts +7 -0
- package/dist/utils/prettify-error-payload.js +188 -0
- package/dist/utils/prettify-error-payload.js.map +1 -0
- package/dist/utils/spacing.d.ts +30 -0
- package/dist/utils/spacing.js +34 -0
- package/dist/utils/spacing.js.map +1 -0
- package/dist/utils/useCodeMirror.d.ts +7 -0
- package/dist/utils/useCodeMirror.js +28 -0
- package/dist/utils/useCodeMirror.js.map +1 -0
- package/dist/utils/useZIndex.d.ts +52 -0
- package/dist/utils/useZIndex.js +62 -0
- package/dist/utils/useZIndex.js.map +1 -0
- package/dist/utils/zIndices.d.ts +42 -0
- package/dist/utils/zIndices.js +46 -0
- package/dist/utils/zIndices.js.map +1 -0
- package/docs/DESIGN.md +134 -0
- package/docs/STYLES.md +568 -0
- package/package.json +619 -0
- package/tailwind.preset.cjs +738 -0
- package/tailwind.preset.d.cts +5 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { cn } from "../../utils/cn.js";
|
|
2
|
+
import { Tooltip } from "../Tooltip/Tooltip.js";
|
|
3
|
+
import { Badge } from "../Badge/Badge.js";
|
|
4
|
+
import { SPACE_SCALE_PX } from "../../utils/spacing.js";
|
|
5
|
+
import { Button } from "../Button/Button.js";
|
|
6
|
+
import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from "../Popover/Popover.js";
|
|
7
|
+
import { getChartLegendListColumns, getChartLegendListGridTemplate, widthsMatch } from "./utils.js";
|
|
8
|
+
import { ChartLegendItemRenderer } from "./ChartLegendItemRenderer.js";
|
|
9
|
+
import { useChartLegendActiveItem } from "./useChartLegendActiveItem.js";
|
|
10
|
+
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
11
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
+
//#region packages/components/src/components/ChartLegend/ChartLegend.tsx
|
|
13
|
+
var LEGEND_GAP_PX = SPACE_SCALE_PX[1];
|
|
14
|
+
var VIEW_HIDDEN_TOOLTIP = "Click to view hidden legends";
|
|
15
|
+
var ChartLegendList = ({ items, onItemClick, onItemActiveChange, className, role = "group", "aria-label": ariaLabel = "Chart legend", style, ...props }) => {
|
|
16
|
+
const listColumns = getChartLegendListColumns(items, onItemClick != null);
|
|
17
|
+
const gridTemplateColumns = getChartLegendListGridTemplate(listColumns);
|
|
18
|
+
return /* @__PURE__ */ jsx("div", {
|
|
19
|
+
role,
|
|
20
|
+
"aria-label": ariaLabel,
|
|
21
|
+
className: cn("grid w-full min-w-0", className),
|
|
22
|
+
style: {
|
|
23
|
+
...style,
|
|
24
|
+
gridTemplateColumns
|
|
25
|
+
},
|
|
26
|
+
...props,
|
|
27
|
+
children: items.map((item) => /* @__PURE__ */ jsx(ChartLegendItemRenderer, {
|
|
28
|
+
item,
|
|
29
|
+
layout: "list",
|
|
30
|
+
listColumns,
|
|
31
|
+
onActiveChange: onItemActiveChange,
|
|
32
|
+
onClick: onItemClick == null ? void 0 : () => {
|
|
33
|
+
onItemClick(item);
|
|
34
|
+
}
|
|
35
|
+
}, item.id))
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
var ChartLegendInline = ({ items, onItemClick, onItemActiveChange, className, role = "group", "aria-label": ariaLabel = "Chart legend", ...props }) => {
|
|
39
|
+
const [popoverOpen, setPopoverOpen] = useState(false);
|
|
40
|
+
const [containerWidth, setContainerWidth] = useState(null);
|
|
41
|
+
const [itemWidths, setItemWidths] = useState({});
|
|
42
|
+
const [badgeWidths, setBadgeWidths] = useState({});
|
|
43
|
+
const containerRef = useRef(null);
|
|
44
|
+
const measurementItemRefs = useRef({});
|
|
45
|
+
const measurementBadgeRefs = useRef({});
|
|
46
|
+
const isInteractive = onItemClick != null || onItemActiveChange != null;
|
|
47
|
+
const itemIds = useMemo(() => items.map((item) => item.id), [items]);
|
|
48
|
+
const setMeasurementItemRef = useCallback((id, node) => {
|
|
49
|
+
measurementItemRefs.current[id] = node;
|
|
50
|
+
}, []);
|
|
51
|
+
const setMeasurementBadgeRef = useCallback((count, node) => {
|
|
52
|
+
measurementBadgeRefs.current[String(count)] = node;
|
|
53
|
+
}, []);
|
|
54
|
+
useLayoutEffect(() => {
|
|
55
|
+
const nextItemWidths = {};
|
|
56
|
+
const nextBadgeWidths = {};
|
|
57
|
+
items.forEach((item, index) => {
|
|
58
|
+
const itemWidth = measurementItemRefs.current[item.id]?.offsetWidth;
|
|
59
|
+
if (itemWidth != null) nextItemWidths[item.id] = Math.ceil(itemWidth);
|
|
60
|
+
const hiddenCount = index + 1;
|
|
61
|
+
const badgeWidth = measurementBadgeRefs.current[String(hiddenCount)]?.offsetWidth;
|
|
62
|
+
if (badgeWidth != null) nextBadgeWidths[String(hiddenCount)] = Math.ceil(badgeWidth);
|
|
63
|
+
});
|
|
64
|
+
setItemWidths((current) => widthsMatch(current, nextItemWidths) ? current : nextItemWidths);
|
|
65
|
+
setBadgeWidths((current) => widthsMatch(current, nextBadgeWidths) ? current : nextBadgeWidths);
|
|
66
|
+
}, [isInteractive, items]);
|
|
67
|
+
useLayoutEffect(() => {
|
|
68
|
+
const container = containerRef.current;
|
|
69
|
+
if (container == null) return;
|
|
70
|
+
const updateWidth = (width) => {
|
|
71
|
+
const nextWidth = Math.ceil(width);
|
|
72
|
+
setContainerWidth((current) => current === nextWidth ? current : nextWidth);
|
|
73
|
+
};
|
|
74
|
+
updateWidth(container.clientWidth);
|
|
75
|
+
const observer = new ResizeObserver(([entry]) => {
|
|
76
|
+
updateWidth(entry?.contentRect.width ?? container.clientWidth);
|
|
77
|
+
});
|
|
78
|
+
observer.observe(container);
|
|
79
|
+
return () => observer.disconnect();
|
|
80
|
+
}, []);
|
|
81
|
+
const visibleCount = useMemo(() => {
|
|
82
|
+
if (!(containerWidth != null && itemIds.every((id) => itemWidths[id] != null) && items.every((_, index) => badgeWidths[String(index + 1)] != null)) || containerWidth == null) return items.length;
|
|
83
|
+
if (itemIds.reduce((total, id) => total + (itemWidths[id] ?? 0), Math.max(items.length - 1, 0) * LEGEND_GAP_PX) <= containerWidth) return items.length;
|
|
84
|
+
for (let count = items.length - 1; count >= 0; count -= 1) {
|
|
85
|
+
const hiddenCount = items.length - count;
|
|
86
|
+
if (itemIds.slice(0, count).reduce((total, id) => total + (itemWidths[id] ?? 0), 0) + count * LEGEND_GAP_PX + (badgeWidths[String(hiddenCount)] ?? 0) <= containerWidth) return count;
|
|
87
|
+
}
|
|
88
|
+
return 0;
|
|
89
|
+
}, [
|
|
90
|
+
badgeWidths,
|
|
91
|
+
containerWidth,
|
|
92
|
+
itemIds,
|
|
93
|
+
itemWidths,
|
|
94
|
+
items
|
|
95
|
+
]);
|
|
96
|
+
const hiddenCount = Math.max(items.length - visibleCount, 0);
|
|
97
|
+
const hasOverflow = hiddenCount > 0;
|
|
98
|
+
const visibleItems = items.slice(0, visibleCount);
|
|
99
|
+
const hiddenItems = items.slice(visibleCount);
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
if (!hasOverflow) setPopoverOpen(false);
|
|
102
|
+
}, [hasOverflow]);
|
|
103
|
+
const renderItem = (item) => /* @__PURE__ */ jsx(ChartLegendItemRenderer, {
|
|
104
|
+
item,
|
|
105
|
+
onActiveChange: onItemActiveChange,
|
|
106
|
+
onClick: onItemClick == null ? void 0 : () => {
|
|
107
|
+
onItemClick(item);
|
|
108
|
+
}
|
|
109
|
+
}, item.id);
|
|
110
|
+
return /* @__PURE__ */ jsxs(Popover, {
|
|
111
|
+
open: popoverOpen,
|
|
112
|
+
onOpenChange: setPopoverOpen,
|
|
113
|
+
children: [/* @__PURE__ */ jsx(PopoverAnchor, {
|
|
114
|
+
asChild: true,
|
|
115
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
116
|
+
ref: containerRef,
|
|
117
|
+
role,
|
|
118
|
+
"aria-label": ariaLabel,
|
|
119
|
+
className: cn("relative flex w-full min-w-0 items-center gap-space-1 overflow-clip rounded-xs", className),
|
|
120
|
+
...props,
|
|
121
|
+
children: [
|
|
122
|
+
visibleItems.map(renderItem),
|
|
123
|
+
hasOverflow && /* @__PURE__ */ jsx(Tooltip, {
|
|
124
|
+
title: VIEW_HIDDEN_TOOLTIP,
|
|
125
|
+
children: /* @__PURE__ */ jsx(PopoverTrigger, {
|
|
126
|
+
asChild: true,
|
|
127
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
128
|
+
type: "button",
|
|
129
|
+
size: "xs",
|
|
130
|
+
color: "secondary",
|
|
131
|
+
variant: "plain",
|
|
132
|
+
className: "focus-visible:ring-focus relative rounded-xs border-transparent bg-transparent p-0 shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1",
|
|
133
|
+
"aria-label": `View ${hiddenCount} hidden chart ${hiddenCount === 1 ? "legend" : "legends"}`,
|
|
134
|
+
children: /* @__PURE__ */ jsx(Badge, {
|
|
135
|
+
size: "xxs",
|
|
136
|
+
rounded: "xs",
|
|
137
|
+
children: `+${hiddenCount}`
|
|
138
|
+
})
|
|
139
|
+
})
|
|
140
|
+
})
|
|
141
|
+
}),
|
|
142
|
+
/* @__PURE__ */ jsxs("div", {
|
|
143
|
+
"aria-hidden": "true",
|
|
144
|
+
className: "pointer-events-none invisible absolute left-0 top-0 flex w-max items-center gap-space-1",
|
|
145
|
+
children: [items.map((item) => /* @__PURE__ */ jsx("div", {
|
|
146
|
+
ref: (node) => setMeasurementItemRef(item.id, node),
|
|
147
|
+
className: "shrink-0",
|
|
148
|
+
children: /* @__PURE__ */ jsx(ChartLegendItemRenderer, {
|
|
149
|
+
item,
|
|
150
|
+
onClick: onItemClick == null ? void 0 : () => void 0,
|
|
151
|
+
tabIndex: -1
|
|
152
|
+
})
|
|
153
|
+
}, item.id)), items.map((_, index) => {
|
|
154
|
+
const count = index + 1;
|
|
155
|
+
return /* @__PURE__ */ jsx("div", {
|
|
156
|
+
ref: (node) => setMeasurementBadgeRef(count, node),
|
|
157
|
+
className: "shrink-0",
|
|
158
|
+
children: /* @__PURE__ */ jsx(Badge, {
|
|
159
|
+
size: "xxs",
|
|
160
|
+
rounded: "xs",
|
|
161
|
+
children: `+${count}`
|
|
162
|
+
})
|
|
163
|
+
}, count);
|
|
164
|
+
})]
|
|
165
|
+
})
|
|
166
|
+
]
|
|
167
|
+
})
|
|
168
|
+
}), hasOverflow && /* @__PURE__ */ jsx(PopoverContent, {
|
|
169
|
+
align: "end",
|
|
170
|
+
className: "w-max min-w-48 max-w-[min(24rem,calc(100vw-2rem))] overflow-hidden border border-subtle p-0",
|
|
171
|
+
"aria-label": "Hidden chart legends",
|
|
172
|
+
onInteractOutside: (event) => {
|
|
173
|
+
if (event.target instanceof Node && containerRef.current?.contains(event.target)) event.preventDefault();
|
|
174
|
+
},
|
|
175
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
176
|
+
className: "scroll-mask-t scroll-mask-b flex max-h-[min(300px,70vh)] flex-col gap-space-1 overflow-y-auto overflow-x-hidden p-space-1",
|
|
177
|
+
children: hiddenItems.map(renderItem)
|
|
178
|
+
})
|
|
179
|
+
})]
|
|
180
|
+
});
|
|
181
|
+
};
|
|
182
|
+
var ChartLegend = ({ layout = "inline", items, onItemActiveChange, ...props }) => {
|
|
183
|
+
const handleItemActiveChange = useChartLegendActiveItem(items, onItemActiveChange);
|
|
184
|
+
const activeChangeHandler = onItemActiveChange == null ? void 0 : handleItemActiveChange;
|
|
185
|
+
const legendProps = {
|
|
186
|
+
...props,
|
|
187
|
+
items,
|
|
188
|
+
onItemActiveChange: activeChangeHandler
|
|
189
|
+
};
|
|
190
|
+
return layout === "list" ? /* @__PURE__ */ jsx(ChartLegendList, { ...legendProps }) : /* @__PURE__ */ jsx(ChartLegendInline, { ...legendProps });
|
|
191
|
+
};
|
|
192
|
+
//#endregion
|
|
193
|
+
export { ChartLegend };
|
|
194
|
+
|
|
195
|
+
//# sourceMappingURL=ChartLegend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartLegend.js","names":[],"sources":["../../../src/components/ChartLegend/ChartLegend.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\nimport { SPACE_SCALE_PX } from '../../utils/spacing';\nimport { Badge } from '../Badge';\nimport { Button } from '../Button';\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from '../Popover';\nimport { Tooltip } from '../Tooltip';\nimport { ChartLegendItemRenderer } from './ChartLegendItemRenderer';\nimport {\n type ChartLegendItemActiveChangeHandler,\n useChartLegendActiveItem,\n} from './useChartLegendActiveItem';\nimport {\n getChartLegendListColumns,\n getChartLegendListGridTemplate,\n widthsMatch,\n} from './utils';\n\nconst LEGEND_GAP_PX = SPACE_SCALE_PX[1];\nconst VIEW_HIDDEN_TOOLTIP = 'Click to view hidden legends';\n\nexport type ChartLegendItem = {\n id: string;\n label: ReactNode;\n value?: ReactNode;\n secondaryValue?: ReactNode;\n 'aria-label'?: string;\n markerColor?: string;\n marker?: ReactNode;\n selected?: boolean;\n};\n\nexport type ChartLegendProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children'\n> & {\n items: readonly ChartLegendItem[];\n layout?: 'inline' | 'list';\n onItemClick?: (item: ChartLegendItem) => void;\n /** Reports the legend item under the pointer or keyboard focus. */\n onItemActiveChange?: (item: ChartLegendItem | null) => void;\n};\n\ntype ChartLegendBaseProps = Omit<\n ChartLegendProps,\n 'layout' | 'onItemActiveChange'\n> & {\n onItemActiveChange?: ChartLegendItemActiveChangeHandler<ChartLegendItem>;\n};\n\nconst ChartLegendList = ({\n items,\n onItemClick,\n onItemActiveChange,\n className,\n role = 'group',\n 'aria-label': ariaLabel = 'Chart legend',\n style,\n ...props\n}: ChartLegendBaseProps) => {\n const listColumns = getChartLegendListColumns(items, onItemClick != null);\n const gridTemplateColumns = getChartLegendListGridTemplate(listColumns);\n\n return (\n <div\n role={role}\n aria-label={ariaLabel}\n className={cn('grid w-full min-w-0', className)}\n style={{ ...style, gridTemplateColumns }}\n {...props}\n >\n {items.map((item) => (\n <ChartLegendItemRenderer\n key={item.id}\n item={item}\n layout=\"list\"\n listColumns={listColumns}\n onActiveChange={onItemActiveChange}\n onClick={\n onItemClick == null\n ? undefined\n : () => {\n onItemClick(item);\n }\n }\n />\n ))}\n </div>\n );\n};\n\nconst ChartLegendInline = ({\n items,\n onItemClick,\n onItemActiveChange,\n className,\n role = 'group',\n 'aria-label': ariaLabel = 'Chart legend',\n ...props\n}: ChartLegendBaseProps) => {\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [containerWidth, setContainerWidth] = useState<number | null>(null);\n const [itemWidths, setItemWidths] = useState<Record<string, number>>({});\n const [badgeWidths, setBadgeWidths] = useState<Record<string, number>>({});\n const containerRef = useRef<HTMLDivElement>(null);\n const measurementItemRefs = useRef<Record<string, HTMLDivElement | null>>({});\n const measurementBadgeRefs = useRef<Record<string, HTMLDivElement | null>>(\n {}\n );\n const isInteractive = onItemClick != null || onItemActiveChange != null;\n\n const itemIds = useMemo(() => items.map((item) => item.id), [items]);\n\n const setMeasurementItemRef = useCallback(\n (id: string, node: HTMLDivElement | null) => {\n measurementItemRefs.current[id] = node;\n },\n []\n );\n\n const setMeasurementBadgeRef = useCallback(\n (count: number, node: HTMLDivElement | null) => {\n measurementBadgeRefs.current[String(count)] = node;\n },\n []\n );\n\n useLayoutEffect(() => {\n const nextItemWidths: Record<string, number> = {};\n const nextBadgeWidths: Record<string, number> = {};\n\n items.forEach((item, index) => {\n const itemWidth = measurementItemRefs.current[item.id]?.offsetWidth;\n if (itemWidth != null) {\n nextItemWidths[item.id] = Math.ceil(itemWidth);\n }\n\n const hiddenCount = index + 1;\n const badgeWidth =\n measurementBadgeRefs.current[String(hiddenCount)]?.offsetWidth;\n if (badgeWidth != null) {\n nextBadgeWidths[String(hiddenCount)] = Math.ceil(badgeWidth);\n }\n });\n\n setItemWidths((current) =>\n widthsMatch(current, nextItemWidths) ? current : nextItemWidths\n );\n setBadgeWidths((current) =>\n widthsMatch(current, nextBadgeWidths) ? current : nextBadgeWidths\n );\n }, [isInteractive, items]);\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n\n if (container == null) {\n return;\n }\n\n const updateWidth = (width: number) => {\n const nextWidth = Math.ceil(width);\n setContainerWidth((current) =>\n current === nextWidth ? current : nextWidth\n );\n };\n\n updateWidth(container.clientWidth);\n\n const observer = new ResizeObserver(([entry]) => {\n updateWidth(entry?.contentRect.width ?? container.clientWidth);\n });\n\n observer.observe(container);\n return () => observer.disconnect();\n }, []);\n\n const visibleCount = useMemo(() => {\n const hasMeasurements =\n containerWidth != null &&\n itemIds.every((id) => itemWidths[id] != null) &&\n items.every((_, index) => badgeWidths[String(index + 1)] != null);\n\n if (!hasMeasurements || containerWidth == null) {\n return items.length;\n }\n\n const allItemsWidth = itemIds.reduce(\n (total, id) => total + (itemWidths[id] ?? 0),\n Math.max(items.length - 1, 0) * LEGEND_GAP_PX\n );\n\n if (allItemsWidth <= containerWidth) {\n return items.length;\n }\n\n for (let count = items.length - 1; count >= 0; count -= 1) {\n const hiddenCount = items.length - count;\n const visibleItemsWidth = itemIds\n .slice(0, count)\n .reduce((total, id) => total + (itemWidths[id] ?? 0), 0);\n const gapsWidth = count * LEGEND_GAP_PX;\n const totalWidth =\n visibleItemsWidth + gapsWidth + (badgeWidths[String(hiddenCount)] ?? 0);\n\n if (totalWidth <= containerWidth) {\n return count;\n }\n }\n\n return 0;\n }, [badgeWidths, containerWidth, itemIds, itemWidths, items]);\n\n const hiddenCount = Math.max(items.length - visibleCount, 0);\n const hasOverflow = hiddenCount > 0;\n const visibleItems = items.slice(0, visibleCount);\n const hiddenItems = items.slice(visibleCount);\n\n useEffect(() => {\n if (!hasOverflow) {\n setPopoverOpen(false);\n }\n }, [hasOverflow]);\n\n const renderItem = (item: ChartLegendItem) => (\n <ChartLegendItemRenderer\n key={item.id}\n item={item}\n onActiveChange={onItemActiveChange}\n onClick={\n onItemClick == null\n ? undefined\n : () => {\n onItemClick(item);\n }\n }\n />\n );\n\n return (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverAnchor asChild>\n <div\n ref={containerRef}\n role={role}\n aria-label={ariaLabel}\n className={cn(\n 'relative flex w-full min-w-0 items-center gap-space-1 overflow-clip rounded-xs',\n className\n )}\n {...props}\n >\n {visibleItems.map(renderItem)}\n\n {hasOverflow && (\n <Tooltip title={VIEW_HIDDEN_TOOLTIP}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n size=\"xs\"\n color=\"secondary\"\n variant=\"plain\"\n className=\"focus-visible:ring-focus relative rounded-xs border-transparent bg-transparent p-0 shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1\"\n aria-label={`View ${hiddenCount} hidden chart ${\n hiddenCount === 1 ? 'legend' : 'legends'\n }`}\n >\n <Badge size=\"xxs\" rounded=\"xs\">\n {`+${hiddenCount}`}\n </Badge>\n </Button>\n </PopoverTrigger>\n </Tooltip>\n )}\n\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none invisible absolute left-0 top-0 flex w-max items-center gap-space-1\"\n >\n {items.map((item) => (\n <div\n key={item.id}\n ref={(node) => setMeasurementItemRef(item.id, node)}\n className=\"shrink-0\"\n >\n <ChartLegendItemRenderer\n item={item}\n onClick={onItemClick == null ? undefined : () => undefined}\n tabIndex={-1}\n />\n </div>\n ))}\n {items.map((_, index) => {\n const count = index + 1;\n return (\n <div\n key={count}\n ref={(node) => setMeasurementBadgeRef(count, node)}\n className=\"shrink-0\"\n >\n <Badge size=\"xxs\" rounded=\"xs\">\n {`+${count}`}\n </Badge>\n </div>\n );\n })}\n </div>\n </div>\n </PopoverAnchor>\n\n {hasOverflow && (\n <PopoverContent\n align=\"end\"\n className=\"w-max min-w-48 max-w-[min(24rem,calc(100vw-2rem))] overflow-hidden border border-subtle p-0\"\n aria-label=\"Hidden chart legends\"\n onInteractOutside={(event) => {\n if (\n event.target instanceof Node &&\n containerRef.current?.contains(event.target)\n ) {\n event.preventDefault();\n }\n }}\n >\n <div className=\"scroll-mask-t scroll-mask-b flex max-h-[min(300px,70vh)] flex-col gap-space-1 overflow-y-auto overflow-x-hidden p-space-1\">\n {hiddenItems.map(renderItem)}\n </div>\n </PopoverContent>\n )}\n </Popover>\n );\n};\n\nexport const ChartLegend = ({\n layout = 'inline',\n items,\n onItemActiveChange,\n ...props\n}: ChartLegendProps) => {\n const handleItemActiveChange = useChartLegendActiveItem(\n items,\n onItemActiveChange\n );\n const activeChangeHandler =\n onItemActiveChange == null ? undefined : handleItemActiveChange;\n const legendProps = {\n ...props,\n items,\n onItemActiveChange: activeChangeHandler,\n };\n\n return layout === 'list' ? (\n <ChartLegendList {...legendProps} />\n ) : (\n <ChartLegendInline {...legendProps} />\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ChartLegendItem } from './ChartLegend.js';
|
|
2
|
+
import type { ChartLegendItemActiveChangeHandler } from './useChartLegendActiveItem.js';
|
|
3
|
+
import { type ChartLegendListColumns } from './utils.js';
|
|
4
|
+
type ChartLegendItemRendererProps = {
|
|
5
|
+
item: ChartLegendItem;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
onActiveChange?: ChartLegendItemActiveChangeHandler<ChartLegendItem>;
|
|
8
|
+
className?: string;
|
|
9
|
+
tabIndex?: number;
|
|
10
|
+
layout?: 'inline' | 'list';
|
|
11
|
+
listColumns?: ChartLegendListColumns;
|
|
12
|
+
};
|
|
13
|
+
export declare const ChartLegendItemRenderer: ({ item, onClick, onActiveChange, className, tabIndex, layout, listColumns, }: ChartLegendItemRendererProps) => import("react").JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { cn } from "../../utils/cn.js";
|
|
2
|
+
import { Text } from "../Text/Text.js";
|
|
3
|
+
import { Icon } from "../Icon/Icon.js";
|
|
4
|
+
import { Button } from "../Button/Button.js";
|
|
5
|
+
import { getChartLegendAriaLabel } from "./utils.js";
|
|
6
|
+
import { useEffect, useEffectEvent, useId } from "react";
|
|
7
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { FunnelIcon } from "@phosphor-icons/react/dist/ssr/Funnel";
|
|
9
|
+
//#region packages/components/src/components/ChartLegend/ChartLegendItemRenderer.tsx
|
|
10
|
+
var ChartLegendItemRenderer = ({ item, onClick, onActiveChange, className, tabIndex, layout = "inline", listColumns }) => {
|
|
11
|
+
const labelId = useId();
|
|
12
|
+
const clearActivity = useEffectEvent(() => {
|
|
13
|
+
onActiveChange?.(item, "pointer", false);
|
|
14
|
+
onActiveChange?.(item, "focus", false);
|
|
15
|
+
});
|
|
16
|
+
useEffect(() => () => clearActivity(), []);
|
|
17
|
+
const isList = layout === "list";
|
|
18
|
+
const defaultAriaLabel = getChartLegendAriaLabel(item.label, isList ? item.value : void 0, isList ? item.secondaryValue : void 0);
|
|
19
|
+
const ariaLabel = item["aria-label"] ?? defaultAriaLabel;
|
|
20
|
+
const marker = item.marker ?? (item.markerColor != null ? /* @__PURE__ */ jsx("div", {
|
|
21
|
+
"aria-hidden": true,
|
|
22
|
+
className: "size-2 shrink-0 rounded-full",
|
|
23
|
+
style: { backgroundColor: item.markerColor }
|
|
24
|
+
}) : null);
|
|
25
|
+
const action = onClick != null || item.selected ? /* @__PURE__ */ jsx(Icon, {
|
|
26
|
+
"aria-hidden": "true",
|
|
27
|
+
icon: FunnelIcon,
|
|
28
|
+
weight: item.selected ? "fill" : void 0,
|
|
29
|
+
size: "xs",
|
|
30
|
+
className: cn("size-3 shrink-0 text-icon-tertiary transition-opacity duration-fast", item.selected ? "opacity-100" : "opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100")
|
|
31
|
+
}) : null;
|
|
32
|
+
const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
33
|
+
isList && listColumns?.marker ? marker ?? /* @__PURE__ */ jsx("div", { "aria-hidden": true }) : marker,
|
|
34
|
+
/* @__PURE__ */ jsx(Text, {
|
|
35
|
+
id: labelId,
|
|
36
|
+
as: "span",
|
|
37
|
+
variant: "xs",
|
|
38
|
+
className: cn("min-w-0 flex-1 text-left", isList ? "whitespace-normal break-words" : "truncate"),
|
|
39
|
+
children: item.label
|
|
40
|
+
}),
|
|
41
|
+
isList && listColumns?.value && (item.value != null ? /* @__PURE__ */ jsx(Text, {
|
|
42
|
+
as: "span",
|
|
43
|
+
variant: "xs",
|
|
44
|
+
className: "shrink-0 text-right tabular-nums",
|
|
45
|
+
children: item.value
|
|
46
|
+
}) : /* @__PURE__ */ jsx("div", { "aria-hidden": true })),
|
|
47
|
+
isList && listColumns?.secondaryValue && (item.secondaryValue != null ? /* @__PURE__ */ jsx(Text, {
|
|
48
|
+
as: "span",
|
|
49
|
+
variant: "xs",
|
|
50
|
+
color: "tertiary",
|
|
51
|
+
className: "shrink-0 text-right tabular-nums",
|
|
52
|
+
children: item.secondaryValue
|
|
53
|
+
}) : /* @__PURE__ */ jsx("div", { "aria-hidden": true })),
|
|
54
|
+
isList && listColumns?.action ? action ?? /* @__PURE__ */ jsx("div", { "aria-hidden": true }) : action
|
|
55
|
+
] });
|
|
56
|
+
const styles = cn("group relative min-w-0 items-center rounded-xs py-space-1 text-primary transition-colors duration-fast", isList ? "col-span-full grid w-full grid-cols-subgrid gap-space-2 px-space-2" : "flex max-w-full shrink-0 gap-space-1 px-space-1", item.selected ? "bg-surface-level-3 hover:bg-surface-level-3" : (onClick != null || onActiveChange != null) && "hover:bg-surface-level-1-hover focus-visible:bg-surface-level-1-hover", className);
|
|
57
|
+
if (onClick == null) return /* @__PURE__ */ jsx("div", {
|
|
58
|
+
className: cn(styles, onActiveChange != null && "focus-visible:ring-focus focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset"),
|
|
59
|
+
role: onActiveChange == null ? void 0 : "group",
|
|
60
|
+
"aria-label": onActiveChange == null ? void 0 : ariaLabel,
|
|
61
|
+
"aria-labelledby": onActiveChange != null && ariaLabel == null ? labelId : void 0,
|
|
62
|
+
tabIndex: onActiveChange == null ? tabIndex : tabIndex ?? 0,
|
|
63
|
+
onPointerEnter: () => onActiveChange?.(item, "pointer", true),
|
|
64
|
+
onPointerLeave: () => onActiveChange?.(item, "pointer", false),
|
|
65
|
+
onFocus: () => onActiveChange?.(item, "focus", true),
|
|
66
|
+
onBlur: () => onActiveChange?.(item, "focus", false),
|
|
67
|
+
children: content
|
|
68
|
+
});
|
|
69
|
+
return /* @__PURE__ */ jsx(Button, {
|
|
70
|
+
type: "button",
|
|
71
|
+
size: "xs",
|
|
72
|
+
color: "secondary",
|
|
73
|
+
variant: "plain",
|
|
74
|
+
className: cn(styles, "focus-visible:ring-focus border-transparent shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset", isList && "justify-start", !item.selected && "bg-transparent"),
|
|
75
|
+
"aria-label": ariaLabel,
|
|
76
|
+
"aria-labelledby": ariaLabel == null ? labelId : void 0,
|
|
77
|
+
"aria-pressed": item.selected ?? false,
|
|
78
|
+
tabIndex,
|
|
79
|
+
onPointerEnter: () => onActiveChange?.(item, "pointer", true),
|
|
80
|
+
onPointerLeave: () => onActiveChange?.(item, "pointer", false),
|
|
81
|
+
onFocus: () => onActiveChange?.(item, "focus", true),
|
|
82
|
+
onBlur: () => onActiveChange?.(item, "focus", false),
|
|
83
|
+
onClick,
|
|
84
|
+
children: content
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
//#endregion
|
|
88
|
+
export { ChartLegendItemRenderer };
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=ChartLegendItemRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartLegendItemRenderer.js","names":[],"sources":["../../../src/components/ChartLegend/ChartLegendItemRenderer.tsx"],"sourcesContent":["import { useEffect, useEffectEvent, useId } from 'react';\n\nimport { FunnelIcon } from '@phosphor-icons/react/dist/ssr/Funnel';\n\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Icon } from '../Icon';\nimport { Text } from '../Text';\nimport type { ChartLegendItem } from './ChartLegend';\nimport type { ChartLegendItemActiveChangeHandler } from './useChartLegendActiveItem';\nimport { getChartLegendAriaLabel, type ChartLegendListColumns } from './utils';\n\ntype ChartLegendItemRendererProps = {\n item: ChartLegendItem;\n onClick?: () => void;\n onActiveChange?: ChartLegendItemActiveChangeHandler<ChartLegendItem>;\n className?: string;\n tabIndex?: number;\n layout?: 'inline' | 'list';\n listColumns?: ChartLegendListColumns;\n};\n\nexport const ChartLegendItemRenderer = ({\n item,\n onClick,\n onActiveChange,\n className,\n tabIndex,\n layout = 'inline',\n listColumns,\n}: ChartLegendItemRendererProps) => {\n const labelId = useId();\n const clearActivity = useEffectEvent(() => {\n onActiveChange?.(item, 'pointer', false);\n onActiveChange?.(item, 'focus', false);\n });\n // Removing a focused or hovered row does not fire blur or pointerleave.\n useEffect(() => () => clearActivity(), []);\n\n const isList = layout === 'list';\n const defaultAriaLabel = getChartLegendAriaLabel(\n item.label,\n isList ? item.value : undefined,\n isList ? item.secondaryValue : undefined\n );\n const ariaLabel = item['aria-label'] ?? defaultAriaLabel;\n const marker =\n item.marker ??\n (item.markerColor != null ? (\n <div\n aria-hidden\n className=\"size-2 shrink-0 rounded-full\"\n style={{ backgroundColor: item.markerColor }}\n />\n ) : null);\n const action =\n onClick != null || item.selected ? (\n <Icon\n aria-hidden=\"true\"\n icon={FunnelIcon}\n weight={item.selected ? 'fill' : undefined}\n size=\"xs\"\n className={cn(\n 'size-3 shrink-0 text-icon-tertiary transition-opacity duration-fast',\n item.selected\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100'\n )}\n />\n ) : null;\n const content = (\n <>\n {isList && listColumns?.marker ? (marker ?? <div aria-hidden />) : marker}\n <Text\n id={labelId}\n as=\"span\"\n variant=\"xs\"\n className={cn(\n 'min-w-0 flex-1 text-left',\n isList ? 'whitespace-normal break-words' : 'truncate'\n )}\n >\n {item.label}\n </Text>\n {isList &&\n listColumns?.value &&\n (item.value != null ? (\n <Text\n as=\"span\"\n variant=\"xs\"\n className=\"shrink-0 text-right tabular-nums\"\n >\n {item.value}\n </Text>\n ) : (\n <div aria-hidden />\n ))}\n {isList &&\n listColumns?.secondaryValue &&\n (item.secondaryValue != null ? (\n <Text\n as=\"span\"\n variant=\"xs\"\n color=\"tertiary\"\n className=\"shrink-0 text-right tabular-nums\"\n >\n {item.secondaryValue}\n </Text>\n ) : (\n <div aria-hidden />\n ))}\n {isList && listColumns?.action ? (action ?? <div aria-hidden />) : action}\n </>\n );\n\n const styles = cn(\n 'group relative min-w-0 items-center rounded-xs py-space-1 text-primary transition-colors duration-fast',\n isList\n ? 'col-span-full grid w-full grid-cols-subgrid gap-space-2 px-space-2'\n : 'flex max-w-full shrink-0 gap-space-1 px-space-1',\n item.selected\n ? 'bg-surface-level-3 hover:bg-surface-level-3'\n : (onClick != null || onActiveChange != null) &&\n 'hover:bg-surface-level-1-hover focus-visible:bg-surface-level-1-hover',\n className\n );\n\n if (onClick == null) {\n return (\n <div\n className={cn(\n styles,\n onActiveChange != null &&\n 'focus-visible:ring-focus focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset'\n )}\n role={onActiveChange == null ? undefined : 'group'}\n aria-label={onActiveChange == null ? undefined : ariaLabel}\n aria-labelledby={\n onActiveChange != null && ariaLabel == null ? labelId : undefined\n }\n tabIndex={onActiveChange == null ? tabIndex : (tabIndex ?? 0)}\n onPointerEnter={() => onActiveChange?.(item, 'pointer', true)}\n onPointerLeave={() => onActiveChange?.(item, 'pointer', false)}\n onFocus={() => onActiveChange?.(item, 'focus', true)}\n onBlur={() => onActiveChange?.(item, 'focus', false)}\n >\n {content}\n </div>\n );\n }\n\n return (\n <Button\n type=\"button\"\n size=\"xs\"\n color=\"secondary\"\n variant=\"plain\"\n className={cn(\n styles,\n 'focus-visible:ring-focus border-transparent shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset',\n isList && 'justify-start',\n !item.selected && 'bg-transparent'\n )}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel == null ? labelId : undefined}\n aria-pressed={item.selected ?? false}\n tabIndex={tabIndex}\n onPointerEnter={() => onActiveChange?.(item, 'pointer', true)}\n onPointerLeave={() => onActiveChange?.(item, 'pointer', false)}\n onFocus={() => onActiveChange?.(item, 'focus', true)}\n onBlur={() => onActiveChange?.(item, 'focus', false)}\n onClick={onClick}\n >\n {content}\n </Button>\n );\n};\n"],"mappings":";;;;;;;;;AAsBA,IAAa,2BAA2B,EACtC,MACA,SACA,gBACA,WACA,UACA,SAAS,UACT,kBACkC;CAClC,MAAM,UAAU,MAAM;CACtB,MAAM,gBAAgB,qBAAqB;EACzC,iBAAiB,MAAM,WAAW,KAAK;EACvC,iBAAiB,MAAM,SAAS,KAAK;CACvC,CAAC;CAED,sBAAsB,cAAc,GAAG,CAAC,CAAC;CAEzC,MAAM,SAAS,WAAW;CAC1B,MAAM,mBAAmB,wBACvB,KAAK,OACL,SAAS,KAAK,QAAQ,KAAA,GACtB,SAAS,KAAK,iBAAiB,KAAA,CACjC;CACA,MAAM,YAAY,KAAK,iBAAiB;CACxC,MAAM,SACJ,KAAK,WACJ,KAAK,eAAe,OACnB,oBAAC,OAAD;EACE,eAAA;EACA,WAAU;EACV,OAAO,EAAE,iBAAiB,KAAK,YAAY;CAC5C,CAAA,IACC;CACN,MAAM,SACJ,WAAW,QAAQ,KAAK,WACtB,oBAAC,MAAD;EACE,eAAY;EACZ,MAAM;EACN,QAAQ,KAAK,WAAW,SAAS,KAAA;EACjC,MAAK;EACL,WAAW,GACT,uEACA,KAAK,WACD,gBACA,mEACN;CACD,CAAA,IACC;CACN,MAAM,UACJ,qBAAA,YAAA,EAAA,UAAA;EACG,UAAU,aAAa,SAAU,UAAU,oBAAC,OAAD,EAAK,eAAA,KAAa,CAAA,IAAK;EACnE,oBAAC,MAAD;GACE,IAAI;GACJ,IAAG;GACH,SAAQ;GACR,WAAW,GACT,4BACA,SAAS,kCAAkC,UAC7C;GAEC,UAAA,KAAK;EACF,CAAA;EACL,UACC,aAAa,UACZ,KAAK,SAAS,OACb,oBAAC,MAAD;GACE,IAAG;GACH,SAAQ;GACR,WAAU;GAET,UAAA,KAAK;EACF,CAAA,IAEN,oBAAC,OAAD,EAAK,eAAA,KAAa,CAAA;EAErB,UACC,aAAa,mBACZ,KAAK,kBAAkB,OACtB,oBAAC,MAAD;GACE,IAAG;GACH,SAAQ;GACR,OAAM;GACN,WAAU;GAET,UAAA,KAAK;EACF,CAAA,IAEN,oBAAC,OAAD,EAAK,eAAA,KAAa,CAAA;EAErB,UAAU,aAAa,SAAU,UAAU,oBAAC,OAAD,EAAK,eAAA,KAAa,CAAA,IAAK;CACnE,EAAA,CAAA;CAGJ,MAAM,SAAS,GACb,0GACA,SACI,uEACA,mDACJ,KAAK,WACD,iDACC,WAAW,QAAQ,kBAAkB,SACpC,yEACN,SACF;CAEA,IAAI,WAAW,MACb,OACE,oBAAC,OAAD;EACE,WAAW,GACT,QACA,kBAAkB,QAChB,mGACJ;EACA,MAAM,kBAAkB,OAAO,KAAA,IAAY;EAC3C,cAAY,kBAAkB,OAAO,KAAA,IAAY;EACjD,mBACE,kBAAkB,QAAQ,aAAa,OAAO,UAAU,KAAA;EAE1D,UAAU,kBAAkB,OAAO,WAAY,YAAY;EAC3D,sBAAsB,iBAAiB,MAAM,WAAW,IAAI;EAC5D,sBAAsB,iBAAiB,MAAM,WAAW,KAAK;EAC7D,eAAe,iBAAiB,MAAM,SAAS,IAAI;EACnD,cAAc,iBAAiB,MAAM,SAAS,KAAK;EAElD,UAAA;CACE,CAAA;CAIT,OACE,oBAAC,QAAD;EACE,MAAK;EACL,MAAK;EACL,OAAM;EACN,SAAQ;EACR,WAAW,GACT,QACA,oIACA,UAAU,iBACV,CAAC,KAAK,YAAY,gBACpB;EACA,cAAY;EACZ,mBAAiB,aAAa,OAAO,UAAU,KAAA;EAC/C,gBAAc,KAAK,YAAY;EACrB;EACV,sBAAsB,iBAAiB,MAAM,WAAW,IAAI;EAC5D,sBAAsB,iBAAiB,MAAM,WAAW,KAAK;EAC7D,eAAe,iBAAiB,MAAM,SAAS,IAAI;EACnD,cAAc,iBAAiB,MAAM,SAAS,KAAK;EAC1C;EAER,UAAA;CACK,CAAA;AAEZ"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type ChartLegendActiveSource = 'pointer' | 'focus';
|
|
2
|
+
export type ChartLegendItemActiveChangeHandler<T extends {
|
|
3
|
+
id: string;
|
|
4
|
+
}> = (item: T, source: ChartLegendActiveSource, active: boolean) => void;
|
|
5
|
+
export declare const useChartLegendActiveItem: <T extends {
|
|
6
|
+
id: string;
|
|
7
|
+
}>(items: readonly T[], onActiveItemChange?: (item: T | null) => void, disabled?: boolean) => ChartLegendItemActiveChangeHandler<T>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
2
|
+
//#region packages/components/src/components/ChartLegend/useChartLegendActiveItem.ts
|
|
3
|
+
var useChartLegendActiveItem = (items, onActiveItemChange, disabled = false) => {
|
|
4
|
+
const pointerItemRef = useRef(null);
|
|
5
|
+
const focusItemRef = useRef(null);
|
|
6
|
+
const reportedItemIdRef = useRef(null);
|
|
7
|
+
const onActiveItemChangeRef = useRef(onActiveItemChange);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
onActiveItemChangeRef.current = onActiveItemChange;
|
|
10
|
+
}, [onActiveItemChange]);
|
|
11
|
+
const reportActiveItem = useCallback((item, source, active) => {
|
|
12
|
+
const activeItemRef = source === "pointer" ? pointerItemRef : focusItemRef;
|
|
13
|
+
if (active) activeItemRef.current = item;
|
|
14
|
+
else if (activeItemRef.current?.id === item.id) activeItemRef.current = null;
|
|
15
|
+
const activeItem = disabled ? null : pointerItemRef.current ?? focusItemRef.current;
|
|
16
|
+
const activeItemId = activeItem?.id ?? null;
|
|
17
|
+
if (reportedItemIdRef.current === activeItemId) return;
|
|
18
|
+
reportedItemIdRef.current = activeItemId;
|
|
19
|
+
onActiveItemChange?.(activeItem);
|
|
20
|
+
}, [disabled, onActiveItemChange]);
|
|
21
|
+
const clearActiveItem = useCallback(() => {
|
|
22
|
+
const hadActiveItem = reportedItemIdRef.current != null;
|
|
23
|
+
pointerItemRef.current = null;
|
|
24
|
+
focusItemRef.current = null;
|
|
25
|
+
reportedItemIdRef.current = null;
|
|
26
|
+
if (hadActiveItem) onActiveItemChangeRef.current?.(null);
|
|
27
|
+
}, []);
|
|
28
|
+
const itemIdsKey = disabled ? "" : JSON.stringify(items.map((item) => item.id).sort());
|
|
29
|
+
useEffect(() => () => clearActiveItem(), [itemIdsKey, clearActiveItem]);
|
|
30
|
+
return reportActiveItem;
|
|
31
|
+
};
|
|
32
|
+
//#endregion
|
|
33
|
+
export { useChartLegendActiveItem };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=useChartLegendActiveItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChartLegendActiveItem.js","names":[],"sources":["../../../src/components/ChartLegend/useChartLegendActiveItem.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nexport type ChartLegendActiveSource = 'pointer' | 'focus';\n\nexport type ChartLegendItemActiveChangeHandler<T extends { id: string }> = (\n item: T,\n source: ChartLegendActiveSource,\n active: boolean\n) => void;\n\nexport const useChartLegendActiveItem = <T extends { id: string }>(\n items: readonly T[],\n onActiveItemChange?: (item: T | null) => void,\n disabled = false\n) => {\n const pointerItemRef = useRef<T | null>(null);\n const focusItemRef = useRef<T | null>(null);\n const reportedItemIdRef = useRef<string | null>(null);\n // Keep cleanup subscribed to the latest handler without requiring React 19.2.\n const onActiveItemChangeRef = useRef(onActiveItemChange);\n useEffect(() => {\n onActiveItemChangeRef.current = onActiveItemChange;\n }, [onActiveItemChange]);\n\n const reportActiveItem = useCallback<ChartLegendItemActiveChangeHandler<T>>(\n (item, source, active) => {\n const activeItemRef =\n source === 'pointer' ? pointerItemRef : focusItemRef;\n\n if (active) activeItemRef.current = item;\n else if (activeItemRef.current?.id === item.id)\n activeItemRef.current = null;\n\n const activeItem = disabled\n ? null\n : (pointerItemRef.current ?? focusItemRef.current);\n const activeItemId = activeItem?.id ?? null;\n if (reportedItemIdRef.current === activeItemId) return;\n\n reportedItemIdRef.current = activeItemId;\n onActiveItemChange?.(activeItem);\n },\n [disabled, onActiveItemChange]\n );\n\n const clearActiveItem = useCallback(() => {\n const hadActiveItem = reportedItemIdRef.current != null;\n pointerItemRef.current = null;\n focusItemRef.current = null;\n reportedItemIdRef.current = null;\n if (hadActiveItem) onActiveItemChangeRef.current?.(null);\n }, []);\n const itemIdsKey = disabled\n ? ''\n : JSON.stringify(items.map((item) => item.id).sort());\n\n useEffect(() => () => clearActiveItem(), [itemIdsKey, clearActiveItem]);\n\n return reportActiveItem;\n};\n"],"mappings":";;AAUA,IAAa,4BACX,OACA,oBACA,WAAW,UACR;CACH,MAAM,iBAAiB,OAAiB,IAAI;CAC5C,MAAM,eAAe,OAAiB,IAAI;CAC1C,MAAM,oBAAoB,OAAsB,IAAI;CAEpD,MAAM,wBAAwB,OAAO,kBAAkB;CACvD,gBAAgB;EACd,sBAAsB,UAAU;CAClC,GAAG,CAAC,kBAAkB,CAAC;CAEvB,MAAM,mBAAmB,aACtB,MAAM,QAAQ,WAAW;EACxB,MAAM,gBACJ,WAAW,YAAY,iBAAiB;EAE1C,IAAI,QAAQ,cAAc,UAAU;OAC/B,IAAI,cAAc,SAAS,OAAO,KAAK,IAC1C,cAAc,UAAU;EAE1B,MAAM,aAAa,WACf,OACC,eAAe,WAAW,aAAa;EAC5C,MAAM,eAAe,YAAY,MAAM;EACvC,IAAI,kBAAkB,YAAY,cAAc;EAEhD,kBAAkB,UAAU;EAC5B,qBAAqB,UAAU;CACjC,GACA,CAAC,UAAU,kBAAkB,CAC/B;CAEA,MAAM,kBAAkB,kBAAkB;EACxC,MAAM,gBAAgB,kBAAkB,WAAW;EACnD,eAAe,UAAU;EACzB,aAAa,UAAU;EACvB,kBAAkB,UAAU;EAC5B,IAAI,eAAe,sBAAsB,UAAU,IAAI;CACzD,GAAG,CAAC,CAAC;CACL,MAAM,aAAa,WACf,KACA,KAAK,UAAU,MAAM,KAAK,SAAS,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;CAEtD,sBAAsB,gBAAgB,GAAG,CAAC,YAAY,eAAe,CAAC;CAEtE,OAAO;AACT"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
type ChartLegendListItem = {
|
|
3
|
+
marker?: ReactNode;
|
|
4
|
+
markerColor?: string;
|
|
5
|
+
value?: ReactNode;
|
|
6
|
+
secondaryValue?: ReactNode;
|
|
7
|
+
selected?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export type ChartLegendListColumns = {
|
|
10
|
+
marker: boolean;
|
|
11
|
+
value: boolean;
|
|
12
|
+
secondaryValue: boolean;
|
|
13
|
+
action: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare const getAccessibleText: (value: ReactNode) => string | undefined;
|
|
16
|
+
export declare const getChartLegendAriaLabel: (label: ReactNode, value?: ReactNode, secondaryValue?: ReactNode) => string | undefined;
|
|
17
|
+
export declare const getChartLegendListColumns: (items: readonly ChartLegendListItem[], hasItemClick: boolean) => ChartLegendListColumns;
|
|
18
|
+
export declare const getChartLegendListGridTemplate: (columns: ChartLegendListColumns) => string;
|
|
19
|
+
export declare const widthsMatch: (current: Record<string, number>, next: Record<string, number>) => boolean;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//#region packages/components/src/components/ChartLegend/utils.ts
|
|
2
|
+
var getAccessibleText = (value) => typeof value === "string" || typeof value === "number" || typeof value === "bigint" ? String(value) : void 0;
|
|
3
|
+
var getChartLegendAriaLabel = (label, value, secondaryValue) => {
|
|
4
|
+
const labelText = getAccessibleText(label);
|
|
5
|
+
if (labelText == null) return void 0;
|
|
6
|
+
return [
|
|
7
|
+
labelText,
|
|
8
|
+
getAccessibleText(value),
|
|
9
|
+
getAccessibleText(secondaryValue)
|
|
10
|
+
].filter((item) => item != null).join(", ");
|
|
11
|
+
};
|
|
12
|
+
var getChartLegendListColumns = (items, hasItemClick) => ({
|
|
13
|
+
marker: items.some((item) => item.marker != null || item.markerColor != null),
|
|
14
|
+
value: items.some((item) => item.value != null),
|
|
15
|
+
secondaryValue: items.some((item) => item.secondaryValue != null),
|
|
16
|
+
action: hasItemClick || items.some((item) => item.selected)
|
|
17
|
+
});
|
|
18
|
+
var getChartLegendListGridTemplate = (columns) => [
|
|
19
|
+
...columns.marker ? ["auto"] : [],
|
|
20
|
+
"minmax(0, 1fr)",
|
|
21
|
+
...columns.value ? ["auto"] : [],
|
|
22
|
+
...columns.secondaryValue ? ["auto"] : [],
|
|
23
|
+
...columns.action ? ["auto"] : []
|
|
24
|
+
].join(" ");
|
|
25
|
+
var widthsMatch = (current, next) => {
|
|
26
|
+
const currentKeys = Object.keys(current);
|
|
27
|
+
const nextKeys = Object.keys(next);
|
|
28
|
+
return currentKeys.length === nextKeys.length && nextKeys.every((key) => current[key] === next[key]);
|
|
29
|
+
};
|
|
30
|
+
//#endregion
|
|
31
|
+
export { getAccessibleText, getChartLegendAriaLabel, getChartLegendListColumns, getChartLegendListGridTemplate, widthsMatch };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../../src/components/ChartLegend/utils.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\ntype ChartLegendListItem = {\n marker?: ReactNode;\n markerColor?: string;\n value?: ReactNode;\n secondaryValue?: ReactNode;\n selected?: boolean;\n};\n\nexport type ChartLegendListColumns = {\n marker: boolean;\n value: boolean;\n secondaryValue: boolean;\n action: boolean;\n};\n\nexport const getAccessibleText = (value: ReactNode) =>\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'bigint'\n ? String(value)\n : undefined;\n\nexport const getChartLegendAriaLabel = (\n label: ReactNode,\n value?: ReactNode,\n secondaryValue?: ReactNode\n) => {\n const labelText = getAccessibleText(label);\n if (labelText == null) return undefined;\n\n return [\n labelText,\n getAccessibleText(value),\n getAccessibleText(secondaryValue),\n ]\n .filter((item) => item != null)\n .join(', ');\n};\n\nexport const getChartLegendListColumns = (\n items: readonly ChartLegendListItem[],\n hasItemClick: boolean\n): ChartLegendListColumns => ({\n marker: items.some((item) => item.marker != null || item.markerColor != null),\n value: items.some((item) => item.value != null),\n secondaryValue: items.some((item) => item.secondaryValue != null),\n action: hasItemClick || items.some((item) => item.selected),\n});\n\nexport const getChartLegendListGridTemplate = (\n columns: ChartLegendListColumns\n) =>\n [\n ...(columns.marker ? ['auto'] : []),\n 'minmax(0, 1fr)',\n ...(columns.value ? ['auto'] : []),\n ...(columns.secondaryValue ? ['auto'] : []),\n ...(columns.action ? ['auto'] : []),\n ].join(' ');\n\nexport const widthsMatch = (\n current: Record<string, number>,\n next: Record<string, number>\n) => {\n const currentKeys = Object.keys(current);\n const nextKeys = Object.keys(next);\n\n return (\n currentKeys.length === nextKeys.length &&\n nextKeys.every((key) => current[key] === next[key])\n );\n};\n"],"mappings":";AAiBA,IAAa,qBAAqB,UAChC,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACb,OAAO,KAAK,IACZ,KAAA;AAEN,IAAa,2BACX,OACA,OACA,mBACG;CACH,MAAM,YAAY,kBAAkB,KAAK;CACzC,IAAI,aAAa,MAAM,OAAO,KAAA;CAE9B,OAAO;EACL;EACA,kBAAkB,KAAK;EACvB,kBAAkB,cAAc;CAClC,CAAC,CACE,QAAQ,SAAS,QAAQ,IAAI,CAAC,CAC9B,KAAK,IAAI;AACd;AAEA,IAAa,6BACX,OACA,kBAC4B;CAC5B,QAAQ,MAAM,MAAM,SAAS,KAAK,UAAU,QAAQ,KAAK,eAAe,IAAI;CAC5E,OAAO,MAAM,MAAM,SAAS,KAAK,SAAS,IAAI;CAC9C,gBAAgB,MAAM,MAAM,SAAS,KAAK,kBAAkB,IAAI;CAChE,QAAQ,gBAAgB,MAAM,MAAM,SAAS,KAAK,QAAQ;AAC5D;AAEA,IAAa,kCACX,YAEA;CACE,GAAI,QAAQ,SAAS,CAAC,MAAM,IAAI,CAAC;CACjC;CACA,GAAI,QAAQ,QAAQ,CAAC,MAAM,IAAI,CAAC;CAChC,GAAI,QAAQ,iBAAiB,CAAC,MAAM,IAAI,CAAC;CACzC,GAAI,QAAQ,SAAS,CAAC,MAAM,IAAI,CAAC;AACnC,CAAC,CAAC,KAAK,GAAG;AAEZ,IAAa,eACX,SACA,SACG;CACH,MAAM,cAAc,OAAO,KAAK,OAAO;CACvC,MAAM,WAAW,OAAO,KAAK,IAAI;CAEjC,OACE,YAAY,WAAW,SAAS,UAChC,SAAS,OAAO,QAAQ,QAAQ,SAAS,KAAK,IAAI;AAEtD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
export type ChartTooltipProps = HTMLAttributes<HTMLDivElement>;
|
|
3
|
+
export declare const ChartTooltip: import("react").ForwardRefExoticComponent<ChartTooltipProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
4
|
+
export interface ChartTooltipHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
5
|
+
title: ReactNode;
|
|
6
|
+
value?: ReactNode;
|
|
7
|
+
leading?: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export declare function ChartTooltipHeader({ title, value, leading, className, ...props }: ChartTooltipHeaderProps): import("react").JSX.Element;
|
|
10
|
+
export type ChartTooltipBodyProps = HTMLAttributes<HTMLDivElement>;
|
|
11
|
+
export declare function ChartTooltipBody({ className, children, ...props }: ChartTooltipBodyProps): import("react").JSX.Element;
|
|
12
|
+
export interface ChartTooltipRowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
|
|
13
|
+
label: ReactNode;
|
|
14
|
+
value?: ReactNode;
|
|
15
|
+
secondaryValue?: ReactNode;
|
|
16
|
+
markerColor?: string;
|
|
17
|
+
marker?: ReactNode;
|
|
18
|
+
/** Highlights the row matching the currently hovered or focused chart mark. Defaults to false. */
|
|
19
|
+
highlighted?: boolean;
|
|
20
|
+
variant?: 'default' | 'total';
|
|
21
|
+
action?: ReactNode;
|
|
22
|
+
}
|
|
23
|
+
export declare function ChartTooltipRow({ label, value, secondaryValue, markerColor, marker, highlighted, variant, action, className, ...props }: ChartTooltipRowProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { cn } from "../../utils/cn.js";
|
|
2
|
+
import { Text } from "../Text/Text.js";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region packages/components/src/components/ChartTooltip/ChartTooltip.tsx
|
|
6
|
+
var ChartTooltip = forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx("div", {
|
|
7
|
+
ref,
|
|
8
|
+
role: "tooltip",
|
|
9
|
+
className: cn("flex w-max max-w-[24rem] flex-col rounded-md border border-subtle bg-elevated p-space-1 text-primary shadow-md", className),
|
|
10
|
+
...props,
|
|
11
|
+
children
|
|
12
|
+
}));
|
|
13
|
+
ChartTooltip.displayName = "ChartTooltip";
|
|
14
|
+
function ChartTooltipHeader({ title, value, leading, className, ...props }) {
|
|
15
|
+
return /* @__PURE__ */ jsx("div", {
|
|
16
|
+
className,
|
|
17
|
+
...props,
|
|
18
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
19
|
+
className: "flex min-w-0 items-center gap-space-6 px-space-2 py-space-1",
|
|
20
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
21
|
+
className: "flex min-w-0 flex-1 items-center gap-space-2",
|
|
22
|
+
children: [leading, /* @__PURE__ */ jsx(Text, {
|
|
23
|
+
variant: "xs",
|
|
24
|
+
weight: "medium",
|
|
25
|
+
className: "min-w-0 flex-1 truncate",
|
|
26
|
+
children: title
|
|
27
|
+
})]
|
|
28
|
+
}), value != null && /* @__PURE__ */ jsx(Text, {
|
|
29
|
+
variant: "xs",
|
|
30
|
+
weight: "semibold",
|
|
31
|
+
className: "shrink-0 tabular-nums",
|
|
32
|
+
children: value
|
|
33
|
+
})]
|
|
34
|
+
})
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function ChartTooltipBody({ className, children, ...props }) {
|
|
38
|
+
return /* @__PURE__ */ jsx("div", {
|
|
39
|
+
className: cn("scroll-mask-t scroll-mask-b flex max-h-[min(300px,70vh)] flex-col overflow-y-auto overflow-x-hidden", className),
|
|
40
|
+
...props,
|
|
41
|
+
children
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function ChartTooltipRow({ label, value, secondaryValue, markerColor, marker, highlighted = false, variant = "default", action, className, ...props }) {
|
|
45
|
+
const isTotal = variant === "total";
|
|
46
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [isTotal && /* @__PURE__ */ jsx("div", {
|
|
47
|
+
"aria-hidden": true,
|
|
48
|
+
className: "mx-space-2 my-space-1 border-t border-subtle"
|
|
49
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
50
|
+
className: cn("flex min-w-0 items-center gap-space-2 rounded-xs px-space-2 py-space-1", highlighted && "bg-surface-level-2", className),
|
|
51
|
+
...props,
|
|
52
|
+
children: [
|
|
53
|
+
marker ?? (markerColor != null && /* @__PURE__ */ jsx("div", {
|
|
54
|
+
"aria-hidden": true,
|
|
55
|
+
className: "size-2 shrink-0 rounded-full",
|
|
56
|
+
style: { backgroundColor: markerColor }
|
|
57
|
+
})),
|
|
58
|
+
/* @__PURE__ */ jsx(Text, {
|
|
59
|
+
variant: "xs",
|
|
60
|
+
weight: isTotal ? "semibold" : "normal",
|
|
61
|
+
className: "min-w-0 flex-1 whitespace-normal break-words",
|
|
62
|
+
children: label
|
|
63
|
+
}),
|
|
64
|
+
value != null && /* @__PURE__ */ jsx(Text, {
|
|
65
|
+
variant: "xs",
|
|
66
|
+
weight: isTotal ? "semibold" : "normal",
|
|
67
|
+
className: "shrink-0 text-right tabular-nums",
|
|
68
|
+
children: value
|
|
69
|
+
}),
|
|
70
|
+
secondaryValue != null && /* @__PURE__ */ jsx(Text, {
|
|
71
|
+
variant: "xs",
|
|
72
|
+
color: "tertiary",
|
|
73
|
+
className: "shrink-0 text-right tabular-nums",
|
|
74
|
+
children: secondaryValue
|
|
75
|
+
}),
|
|
76
|
+
action
|
|
77
|
+
]
|
|
78
|
+
})] });
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { ChartTooltip, ChartTooltipBody, ChartTooltipHeader, ChartTooltipRow };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=ChartTooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartTooltip.js","names":[],"sources":["../../../src/components/ChartTooltip/ChartTooltip.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\nimport { Text } from '../Text';\n\nexport type ChartTooltipProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ChartTooltip = forwardRef<HTMLDivElement, ChartTooltipProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"tooltip\"\n className={cn(\n 'flex w-max max-w-[24rem] flex-col rounded-md border border-subtle bg-elevated p-space-1 text-primary shadow-md',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n);\n\nChartTooltip.displayName = 'ChartTooltip';\n\nexport interface ChartTooltipHeaderProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'title'\n> {\n title: ReactNode;\n value?: ReactNode;\n leading?: ReactNode;\n}\n\nexport function ChartTooltipHeader({\n title,\n value,\n leading,\n className,\n ...props\n}: ChartTooltipHeaderProps) {\n return (\n <div className={className} {...props}>\n <div className=\"flex min-w-0 items-center gap-space-6 px-space-2 py-space-1\">\n <div className=\"flex min-w-0 flex-1 items-center gap-space-2\">\n {leading}\n <Text\n variant=\"xs\"\n weight=\"medium\"\n className=\"min-w-0 flex-1 truncate\"\n >\n {title}\n </Text>\n </div>\n {value != null && (\n <Text\n variant=\"xs\"\n weight=\"semibold\"\n className=\"shrink-0 tabular-nums\"\n >\n {value}\n </Text>\n )}\n </div>\n </div>\n );\n}\n\nexport type ChartTooltipBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ChartTooltipBody({\n className,\n children,\n ...props\n}: ChartTooltipBodyProps) {\n return (\n <div\n className={cn(\n 'scroll-mask-t scroll-mask-b flex max-h-[min(300px,70vh)] flex-col overflow-y-auto overflow-x-hidden',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport interface ChartTooltipRowProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n label: ReactNode;\n value?: ReactNode;\n secondaryValue?: ReactNode;\n markerColor?: string;\n marker?: ReactNode;\n /** Highlights the row matching the currently hovered or focused chart mark. Defaults to false. */\n highlighted?: boolean;\n variant?: 'default' | 'total';\n action?: ReactNode;\n}\n\nexport function ChartTooltipRow({\n label,\n value,\n secondaryValue,\n markerColor,\n marker,\n highlighted = false,\n variant = 'default',\n action,\n className,\n ...props\n}: ChartTooltipRowProps) {\n const isTotal = variant === 'total';\n\n return (\n <>\n {isTotal && (\n <div\n aria-hidden\n className=\"mx-space-2 my-space-1 border-t border-subtle\"\n />\n )}\n <div\n className={cn(\n 'flex min-w-0 items-center gap-space-2 rounded-xs px-space-2 py-space-1',\n highlighted && 'bg-surface-level-2',\n className\n )}\n {...props}\n >\n {marker ??\n (markerColor != null && (\n <div\n aria-hidden\n className=\"size-2 shrink-0 rounded-full\"\n style={{ backgroundColor: markerColor }}\n />\n ))}\n <Text\n variant=\"xs\"\n weight={isTotal ? 'semibold' : 'normal'}\n className=\"min-w-0 flex-1 whitespace-normal break-words\"\n >\n {label}\n </Text>\n {value != null && (\n <Text\n variant=\"xs\"\n weight={isTotal ? 'semibold' : 'normal'}\n className=\"shrink-0 text-right tabular-nums\"\n >\n {value}\n </Text>\n )}\n {secondaryValue != null && (\n <Text\n variant=\"xs\"\n color=\"tertiary\"\n className=\"shrink-0 text-right tabular-nums\"\n >\n {secondaryValue}\n </Text>\n )}\n {action}\n </div>\n </>\n );\n}\n"],"mappings":";;;;;AAOA,IAAa,eAAe,YACzB,EAAE,WAAW,UAAU,GAAG,SAAS,QAClC,oBAAC,OAAD;CACO;CACL,MAAK;CACL,WAAW,GACT,kHACA,SACF;CACA,GAAI;CAEH;AACE,CAAA,CAET;AAEA,aAAa,cAAc;AAW3B,SAAgB,mBAAmB,EACjC,OACA,OACA,SACA,WACA,GAAG,SACuB;CAC1B,OACE,oBAAC,OAAD;EAAgB;EAAW,GAAI;EAC7B,UAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,SACD,oBAAC,MAAD;KACE,SAAQ;KACR,QAAO;KACP,WAAU;KAET,UAAA;IACG,CAAA,CACH;GACJ,CAAA,GAAA,SAAS,QACR,oBAAC,MAAD;IACE,SAAQ;IACR,QAAO;IACP,WAAU;IAET,UAAA;GACG,CAAA,CAEL;;CACF,CAAA;AAET;AAIA,SAAgB,iBAAiB,EAC/B,WACA,UACA,GAAG,SACqB;CACxB,OACE,oBAAC,OAAD;EACE,WAAW,GACT,uGACA,SACF;EACA,GAAI;EAEH;CACE,CAAA;AAET;AAiBA,SAAgB,gBAAgB,EAC9B,OACA,OACA,gBACA,aACA,QACA,cAAc,OACd,UAAU,WACV,QACA,WACA,GAAG,SACoB;CACvB,MAAM,UAAU,YAAY;CAE5B,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,WACC,oBAAC,OAAD;EACE,eAAA;EACA,WAAU;CACX,CAAA,GAEH,qBAAC,OAAD;EACE,WAAW,GACT,0EACA,eAAe,sBACf,SACF;EACA,GAAI;EANN,UAAA;GAQG,WACE,eAAe,QACd,oBAAC,OAAD;IACE,eAAA;IACA,WAAU;IACV,OAAO,EAAE,iBAAiB,YAAY;GACvC,CAAA;GAEL,oBAAC,MAAD;IACE,SAAQ;IACR,QAAQ,UAAU,aAAa;IAC/B,WAAU;IAET,UAAA;GACG,CAAA;GACL,SAAS,QACR,oBAAC,MAAD;IACE,SAAQ;IACR,QAAQ,UAAU,aAAa;IAC/B,WAAU;IAET,UAAA;GACG,CAAA;GAEP,kBAAkB,QACjB,oBAAC,MAAD;IACE,SAAQ;IACR,OAAM;IACN,WAAU;IAET,UAAA;GACG,CAAA;GAEP;EACE;CACL,CAAA,CAAA,EAAA,CAAA;AAEN"}
|