@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,186 @@
|
|
|
1
|
+
import { Text } from "../Text/Text.js";
|
|
2
|
+
import { getFillChartColorForKey } from "../../utils/chartColors.js";
|
|
3
|
+
import { BarChart } from "../BarChart/BarChart.js";
|
|
4
|
+
import { limitTopListItems, sortTopListItems } from "./TopList.utils.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { animated, useReducedMotion, useSpring } from "@react-spring/web";
|
|
7
|
+
import { getStringWidth } from "@visx/text";
|
|
8
|
+
//#region packages/components/src/components/TopList/TopList.tsx
|
|
9
|
+
var TOP_LIST_SERIES_ID = "top-list-values";
|
|
10
|
+
var TOP_LIST_DEFAULT_CATEGORY_LABEL_WIDTH = 112;
|
|
11
|
+
var TOP_LIST_VALUE_LABEL_GAP = 8;
|
|
12
|
+
var TOP_LIST_VALUE_LABEL_FONT_SIZE = 12;
|
|
13
|
+
var numberFormatter = new Intl.NumberFormat("en-US", { maximumFractionDigits: 2 });
|
|
14
|
+
var defaultFormatValue = (value) => numberFormatter.format(value);
|
|
15
|
+
var TopListValueLabel = ({ bar, label, shouldAnimate }) => {
|
|
16
|
+
const isNegative = bar.value < 0;
|
|
17
|
+
const isReducedMotion = (useReducedMotion() ?? false) || !shouldAnimate;
|
|
18
|
+
const targetX = isNegative ? bar.x - TOP_LIST_VALUE_LABEL_GAP : bar.x + bar.width + TOP_LIST_VALUE_LABEL_GAP;
|
|
19
|
+
const targetY = bar.y + bar.height / 2;
|
|
20
|
+
const { x, y } = useSpring({
|
|
21
|
+
from: {
|
|
22
|
+
x: bar.baselinePosition + (isNegative ? -8 : TOP_LIST_VALUE_LABEL_GAP),
|
|
23
|
+
y: targetY
|
|
24
|
+
},
|
|
25
|
+
to: {
|
|
26
|
+
x: targetX,
|
|
27
|
+
y: targetY
|
|
28
|
+
},
|
|
29
|
+
immediate: isReducedMotion
|
|
30
|
+
});
|
|
31
|
+
return /* @__PURE__ */ jsx(animated.text, {
|
|
32
|
+
x,
|
|
33
|
+
y,
|
|
34
|
+
dominantBaseline: "middle",
|
|
35
|
+
textAnchor: isNegative ? "end" : "start",
|
|
36
|
+
className: "fill-current font-mono text-xs text-secondary",
|
|
37
|
+
children: label
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
var TopListOverlay = ({ categories, bandwidth, innerWidth, innerHeight, getCategoryPosition, getItem, categoryLabelWidth, valueLabelPadding, hasNegativeValues, onItemPointerMove, onItemPointerOut, onItemActivate }) => categories.map((category, index) => {
|
|
41
|
+
const item = getItem(category);
|
|
42
|
+
const position = getCategoryPosition(category);
|
|
43
|
+
if (item == null || position == null) return null;
|
|
44
|
+
const previousPosition = index === 0 ? void 0 : getCategoryPosition(categories[index - 1]);
|
|
45
|
+
const nextPosition = index === categories.length - 1 ? void 0 : getCategoryPosition(categories[index + 1]);
|
|
46
|
+
const top = previousPosition == null ? 0 : (previousPosition + position) / 2;
|
|
47
|
+
const bottom = nextPosition == null ? innerHeight : (position + nextPosition) / 2;
|
|
48
|
+
const leftPadding = hasNegativeValues ? valueLabelPadding : 0;
|
|
49
|
+
const isInteractive = onItemPointerMove != null || onItemActivate != null;
|
|
50
|
+
let cursorClassName;
|
|
51
|
+
if (onItemActivate != null) cursorClassName = "cursor-pointer";
|
|
52
|
+
else if (onItemPointerMove != null) cursorClassName = "cursor-crosshair";
|
|
53
|
+
return /* @__PURE__ */ jsxs("g", {
|
|
54
|
+
className: cursorClassName,
|
|
55
|
+
onPointerMove: onItemPointerMove == null ? void 0 : (event) => {
|
|
56
|
+
event.stopPropagation();
|
|
57
|
+
onItemPointerMove(item, event);
|
|
58
|
+
},
|
|
59
|
+
onPointerLeave: onItemPointerOut,
|
|
60
|
+
onPointerUp: onItemActivate == null ? void 0 : (event) => {
|
|
61
|
+
if (event.button !== 0) return;
|
|
62
|
+
event.stopPropagation();
|
|
63
|
+
onItemActivate(item, event);
|
|
64
|
+
},
|
|
65
|
+
children: [isInteractive && /* @__PURE__ */ jsx("rect", {
|
|
66
|
+
x: -categoryLabelWidth - leftPadding,
|
|
67
|
+
y: top,
|
|
68
|
+
width: categoryLabelWidth + leftPadding + innerWidth + valueLabelPadding,
|
|
69
|
+
height: Math.max(0, bottom - top),
|
|
70
|
+
fill: "transparent",
|
|
71
|
+
pointerEvents: "all",
|
|
72
|
+
"aria-hidden": "true"
|
|
73
|
+
}), /* @__PURE__ */ jsx("foreignObject", {
|
|
74
|
+
x: -categoryLabelWidth - leftPadding,
|
|
75
|
+
y: position - bandwidth / 2,
|
|
76
|
+
width: categoryLabelWidth,
|
|
77
|
+
height: bandwidth,
|
|
78
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
79
|
+
className: "flex size-full min-w-0 items-center justify-end overflow-hidden pr-space-3",
|
|
80
|
+
children: /* @__PURE__ */ jsx(Text, {
|
|
81
|
+
as: "span",
|
|
82
|
+
variant: "xs",
|
|
83
|
+
color: "primary",
|
|
84
|
+
className: "block max-w-full truncate",
|
|
85
|
+
title: item.label,
|
|
86
|
+
children: item.label
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
})]
|
|
90
|
+
}, `hitbox:${item.id}`);
|
|
91
|
+
});
|
|
92
|
+
/** Use for ranked top-K data; adapters own data shaping, tooltips, and navigation. */
|
|
93
|
+
var TopList = ({ items, sort = "descending", limit, formatValue = defaultFormatValue, valueAxisLabel, categoryLabelWidth = TOP_LIST_DEFAULT_CATEGORY_LABEL_WIDTH, activeItemId, getItemAriaLabel, isRendering = true, shouldAnimate = true, onItemPointerMove, onItemPointerOut, onItemActivate, onItemFocus, onItemBlur, className, "aria-label": ariaLabel, ...rest }) => {
|
|
94
|
+
const sortedItems = sortTopListItems(items.filter((item) => Number.isFinite(item.value)), sort);
|
|
95
|
+
const visibleItems = limitTopListItems(sortedItems, limit);
|
|
96
|
+
const itemById = new Map(visibleItems.map((item) => [item.id, item]));
|
|
97
|
+
const formattedValueById = new Map(visibleItems.map((item) => [item.id, formatValue(item.value)]));
|
|
98
|
+
const resolvedCategoryLabelWidth = Number.isFinite(categoryLabelWidth) ? Math.max(0, categoryLabelWidth) : TOP_LIST_DEFAULT_CATEGORY_LABEL_WIDTH;
|
|
99
|
+
const valueLabelPadding = Math.ceil(TOP_LIST_VALUE_LABEL_GAP + Math.max(0, ...Array.from(formattedValueById.values(), (value) => Math.max(getStringWidth(value, { fontSize: `${TOP_LIST_VALUE_LABEL_FONT_SIZE}px` }) ?? 0, value.length * 7))));
|
|
100
|
+
const values = sortedItems.map((item) => item.value);
|
|
101
|
+
const valueDomain = values.length === 0 ? void 0 : [Math.min(0, ...values), Math.max(0, ...values)];
|
|
102
|
+
const hasNegativeValues = (valueDomain?.[0] ?? 0) < 0;
|
|
103
|
+
const series = [{
|
|
104
|
+
id: TOP_LIST_SERIES_ID,
|
|
105
|
+
label: valueAxisLabel ?? "Value",
|
|
106
|
+
ariaLabel: valueAxisLabel ?? "Values",
|
|
107
|
+
data: visibleItems.map((item) => ({
|
|
108
|
+
id: item.id,
|
|
109
|
+
category: item.id,
|
|
110
|
+
value: item.value,
|
|
111
|
+
color: item.color ?? getFillChartColorForKey(item.id)
|
|
112
|
+
}))
|
|
113
|
+
}];
|
|
114
|
+
const getItem = (category) => itemById.get(String(category));
|
|
115
|
+
const getDatumItem = (datum) => getItem(datum.category);
|
|
116
|
+
const mapDatumHandlerToItem = (handler) => {
|
|
117
|
+
if (!isRendering || handler == null) return void 0;
|
|
118
|
+
return (datum, event) => {
|
|
119
|
+
const item = getDatumItem(datum);
|
|
120
|
+
if (item != null) handler(item, event);
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
return /* @__PURE__ */ jsx(BarChart, {
|
|
124
|
+
...rest,
|
|
125
|
+
"aria-label": ariaLabel,
|
|
126
|
+
className,
|
|
127
|
+
orientation: "horizontal",
|
|
128
|
+
mode: "grouped",
|
|
129
|
+
series,
|
|
130
|
+
showLegend: false,
|
|
131
|
+
activeBarId: activeItemId,
|
|
132
|
+
isRendering,
|
|
133
|
+
shouldAnimate,
|
|
134
|
+
minimumPlotWidth: 0,
|
|
135
|
+
categoryPadding: {
|
|
136
|
+
inner: .24,
|
|
137
|
+
outer: .24
|
|
138
|
+
},
|
|
139
|
+
categoryAxis: {
|
|
140
|
+
domain: visibleItems.map((item) => item.id),
|
|
141
|
+
thickness: resolvedCategoryLabelWidth
|
|
142
|
+
},
|
|
143
|
+
valueAxes: [{
|
|
144
|
+
id: TOP_LIST_SERIES_ID,
|
|
145
|
+
label: valueAxisLabel,
|
|
146
|
+
domain: valueDomain,
|
|
147
|
+
nice: true,
|
|
148
|
+
formatValue
|
|
149
|
+
}],
|
|
150
|
+
grid: { value: true },
|
|
151
|
+
plotPadding: {
|
|
152
|
+
left: hasNegativeValues ? valueLabelPadding : 0,
|
|
153
|
+
right: valueLabelPadding
|
|
154
|
+
},
|
|
155
|
+
slots: {
|
|
156
|
+
categoryAxis: () => null,
|
|
157
|
+
barLabel: (bar) => /* @__PURE__ */ jsx(TopListValueLabel, {
|
|
158
|
+
bar,
|
|
159
|
+
label: formattedValueById.get(bar.id) ?? formatValue(bar.value),
|
|
160
|
+
shouldAnimate
|
|
161
|
+
}, `${bar.id}:${bar.startValue}:${bar.endValue}`),
|
|
162
|
+
overlay: (slotProps) => isRendering ? /* @__PURE__ */ jsx(TopListOverlay, {
|
|
163
|
+
...slotProps,
|
|
164
|
+
getItem,
|
|
165
|
+
categoryLabelWidth: resolvedCategoryLabelWidth,
|
|
166
|
+
valueLabelPadding,
|
|
167
|
+
hasNegativeValues,
|
|
168
|
+
onItemPointerMove,
|
|
169
|
+
onItemPointerOut,
|
|
170
|
+
onItemActivate
|
|
171
|
+
}) : null
|
|
172
|
+
},
|
|
173
|
+
getCategoryAriaLabel: !isRendering ? void 0 : (datum) => {
|
|
174
|
+
const item = getDatumItem(datum);
|
|
175
|
+
if (item == null) return void 0;
|
|
176
|
+
return getItemAriaLabel?.(item) ?? `${item.label}: ${formattedValueById.get(item.id) ?? formatValue(item.value)}`;
|
|
177
|
+
},
|
|
178
|
+
onDatumActivate: mapDatumHandlerToItem(onItemActivate),
|
|
179
|
+
onDatumFocus: mapDatumHandlerToItem(onItemFocus),
|
|
180
|
+
onDatumBlur: mapDatumHandlerToItem(onItemBlur)
|
|
181
|
+
});
|
|
182
|
+
};
|
|
183
|
+
//#endregion
|
|
184
|
+
export { TopList };
|
|
185
|
+
|
|
186
|
+
//# sourceMappingURL=TopList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopList.js","names":[],"sources":["../../../src/components/TopList/TopList.tsx"],"sourcesContent":["import { animated, useReducedMotion, useSpring } from '@react-spring/web';\nimport { getStringWidth } from '@visx/text';\n\nimport { getFillChartColorForKey } from '../../utils/chartColors';\nimport {\n BarChart,\n type BarChartCategory,\n type BarChartInteractionDatum,\n type BarChartPlotSlotProps,\n type BarChartRenderedBar,\n type BarChartSeries,\n} from '../BarChart';\nimport { Text } from '../Text';\nimport type { TopListItem, TopListProps } from './TopList.types';\nimport { limitTopListItems, sortTopListItems } from './TopList.utils';\n\nconst TOP_LIST_SERIES_ID = 'top-list-values';\nconst TOP_LIST_DEFAULT_CATEGORY_LABEL_WIDTH = 112;\nconst TOP_LIST_VALUE_LABEL_GAP = 8;\nconst TOP_LIST_VALUE_LABEL_FONT_SIZE = 12;\nconst numberFormatter = new Intl.NumberFormat('en-US', {\n maximumFractionDigits: 2,\n});\n\nconst defaultFormatValue = (value: number) => numberFormatter.format(value);\n\nconst TopListValueLabel = ({\n bar,\n label,\n shouldAnimate,\n}: {\n bar: BarChartRenderedBar;\n label: string;\n shouldAnimate: boolean;\n}) => {\n const isNegative = bar.value < 0;\n const isReducedMotion = (useReducedMotion() ?? false) || !shouldAnimate;\n const targetX = isNegative\n ? bar.x - TOP_LIST_VALUE_LABEL_GAP\n : bar.x + bar.width + TOP_LIST_VALUE_LABEL_GAP;\n const targetY = bar.y + bar.height / 2;\n const { x, y } = useSpring({\n from: {\n x:\n bar.baselinePosition +\n (isNegative ? -TOP_LIST_VALUE_LABEL_GAP : TOP_LIST_VALUE_LABEL_GAP),\n y: targetY,\n },\n to: { x: targetX, y: targetY },\n immediate: isReducedMotion,\n });\n\n return (\n <animated.text\n x={x}\n y={y}\n dominantBaseline=\"middle\"\n textAnchor={isNegative ? 'end' : 'start'}\n className=\"fill-current font-mono text-xs text-secondary\"\n >\n {label}\n </animated.text>\n );\n};\n\ntype TopListOverlayProps<Item extends TopListItem> = BarChartPlotSlotProps &\n Pick<\n TopListProps<Item>,\n 'onItemActivate' | 'onItemPointerMove' | 'onItemPointerOut'\n > & {\n getItem: (category: BarChartCategory) => Item | undefined;\n categoryLabelWidth: number;\n valueLabelPadding: number;\n hasNegativeValues: boolean;\n };\n\nconst TopListOverlay = <Item extends TopListItem>({\n categories,\n bandwidth,\n innerWidth,\n innerHeight,\n getCategoryPosition,\n getItem,\n categoryLabelWidth,\n valueLabelPadding,\n hasNegativeValues,\n onItemPointerMove,\n onItemPointerOut,\n onItemActivate,\n}: TopListOverlayProps<Item>) =>\n categories.map((category, index) => {\n const item = getItem(category);\n const position = getCategoryPosition(category);\n if (item == null || position == null) return null;\n\n const previousPosition =\n index === 0 ? undefined : getCategoryPosition(categories[index - 1]);\n const nextPosition =\n index === categories.length - 1\n ? undefined\n : getCategoryPosition(categories[index + 1]);\n const top =\n previousPosition == null ? 0 : (previousPosition + position) / 2;\n const bottom =\n nextPosition == null ? innerHeight : (position + nextPosition) / 2;\n const leftPadding = hasNegativeValues ? valueLabelPadding : 0;\n const isInteractive = onItemPointerMove != null || onItemActivate != null;\n\n let cursorClassName: string | undefined;\n if (onItemActivate != null) {\n cursorClassName = 'cursor-pointer';\n } else if (onItemPointerMove != null) {\n cursorClassName = 'cursor-crosshair';\n }\n\n return (\n <g\n key={`hitbox:${item.id}`}\n className={cursorClassName}\n onPointerMove={\n onItemPointerMove == null\n ? undefined\n : (event) => {\n event.stopPropagation();\n onItemPointerMove(item, event);\n }\n }\n onPointerLeave={onItemPointerOut}\n onPointerUp={\n onItemActivate == null\n ? undefined\n : (event) => {\n if (event.button !== 0) return;\n event.stopPropagation();\n onItemActivate(item, event);\n }\n }\n >\n {isInteractive && (\n <rect\n x={-categoryLabelWidth - leftPadding}\n y={top}\n width={\n categoryLabelWidth + leftPadding + innerWidth + valueLabelPadding\n }\n height={Math.max(0, bottom - top)}\n fill=\"transparent\"\n pointerEvents=\"all\"\n aria-hidden=\"true\"\n />\n )}\n <foreignObject\n x={-categoryLabelWidth - leftPadding}\n y={position - bandwidth / 2}\n width={categoryLabelWidth}\n height={bandwidth}\n >\n <div className=\"flex size-full min-w-0 items-center justify-end overflow-hidden pr-space-3\">\n <Text\n as=\"span\"\n variant=\"xs\"\n color=\"primary\"\n className=\"block max-w-full truncate\"\n title={item.label}\n >\n {item.label}\n </Text>\n </div>\n </foreignObject>\n </g>\n );\n });\n\n/** Use for ranked top-K data; adapters own data shaping, tooltips, and navigation. */\nexport const TopList = <Item extends TopListItem>({\n items,\n sort = 'descending',\n limit,\n formatValue = defaultFormatValue,\n valueAxisLabel,\n categoryLabelWidth = TOP_LIST_DEFAULT_CATEGORY_LABEL_WIDTH,\n activeItemId,\n getItemAriaLabel,\n isRendering = true,\n shouldAnimate = true,\n onItemPointerMove,\n onItemPointerOut,\n onItemActivate,\n onItemFocus,\n onItemBlur,\n className,\n 'aria-label': ariaLabel,\n ...rest\n}: TopListProps<Item>) => {\n const sortedItems = sortTopListItems(\n items.filter((item) => Number.isFinite(item.value)),\n sort\n );\n const visibleItems = limitTopListItems(sortedItems, limit);\n const itemById = new Map(visibleItems.map((item) => [item.id, item]));\n const formattedValueById = new Map(\n visibleItems.map((item) => [item.id, formatValue(item.value)])\n );\n const resolvedCategoryLabelWidth = Number.isFinite(categoryLabelWidth)\n ? Math.max(0, categoryLabelWidth)\n : TOP_LIST_DEFAULT_CATEGORY_LABEL_WIDTH;\n const valueLabelPadding = Math.ceil(\n TOP_LIST_VALUE_LABEL_GAP +\n Math.max(\n 0,\n ...Array.from(formattedValueById.values(), (value) =>\n Math.max(\n getStringWidth(value, {\n fontSize: `${TOP_LIST_VALUE_LABEL_FONT_SIZE}px`,\n }) ?? 0,\n value.length * 7\n )\n )\n )\n );\n const values = sortedItems.map((item) => item.value);\n const valueDomain: readonly [number, number] | undefined =\n values.length === 0\n ? undefined\n : [Math.min(0, ...values), Math.max(0, ...values)];\n const hasNegativeValues = (valueDomain?.[0] ?? 0) < 0;\n const series: readonly BarChartSeries[] = [\n {\n id: TOP_LIST_SERIES_ID,\n label: valueAxisLabel ?? 'Value',\n ariaLabel: valueAxisLabel ?? 'Values',\n data: visibleItems.map((item) => ({\n id: item.id,\n category: item.id,\n value: item.value,\n color: item.color ?? getFillChartColorForKey(item.id),\n })),\n },\n ];\n const getItem = (category: BarChartCategory) =>\n itemById.get(String(category));\n const getDatumItem = (datum: BarChartInteractionDatum) =>\n getItem(datum.category);\n const mapDatumHandlerToItem = <Event,>(\n handler: ((item: Item, event: Event) => void) | undefined\n ) => {\n if (!isRendering || handler == null) return undefined;\n\n return (datum: BarChartInteractionDatum, event: Event) => {\n const item = getDatumItem(datum);\n if (item != null) handler(item, event);\n };\n };\n\n return (\n <BarChart\n {...rest}\n aria-label={ariaLabel}\n className={className}\n orientation=\"horizontal\"\n mode=\"grouped\"\n series={series}\n showLegend={false}\n activeBarId={activeItemId}\n isRendering={isRendering}\n shouldAnimate={shouldAnimate}\n minimumPlotWidth={0}\n categoryPadding={{ inner: 0.24, outer: 0.24 }}\n categoryAxis={{\n domain: visibleItems.map((item) => item.id),\n thickness: resolvedCategoryLabelWidth,\n }}\n valueAxes={[\n {\n id: TOP_LIST_SERIES_ID,\n label: valueAxisLabel,\n domain: valueDomain,\n nice: true,\n formatValue,\n },\n ]}\n grid={{ value: true }}\n plotPadding={{\n left: hasNegativeValues ? valueLabelPadding : 0,\n right: valueLabelPadding,\n }}\n slots={{\n categoryAxis: () => null,\n barLabel: (bar) => (\n <TopListValueLabel\n key={`${bar.id}:${bar.startValue}:${bar.endValue}`}\n bar={bar}\n label={formattedValueById.get(bar.id) ?? formatValue(bar.value)}\n shouldAnimate={shouldAnimate}\n />\n ),\n overlay: (slotProps) =>\n isRendering ? (\n <TopListOverlay\n {...slotProps}\n getItem={getItem}\n categoryLabelWidth={resolvedCategoryLabelWidth}\n valueLabelPadding={valueLabelPadding}\n hasNegativeValues={hasNegativeValues}\n onItemPointerMove={onItemPointerMove}\n onItemPointerOut={onItemPointerOut}\n onItemActivate={onItemActivate}\n />\n ) : null,\n }}\n getCategoryAriaLabel={\n !isRendering\n ? undefined\n : (datum) => {\n const item = getDatumItem(datum);\n if (item == null) return undefined;\n return (\n getItemAriaLabel?.(item) ??\n `${item.label}: ${formattedValueById.get(item.id) ?? formatValue(item.value)}`\n );\n }\n }\n onDatumActivate={mapDatumHandlerToItem(onItemActivate)}\n onDatumFocus={mapDatumHandlerToItem(onItemFocus)}\n onDatumBlur={mapDatumHandlerToItem(onItemBlur)}\n />\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { FocusEvent, HTMLAttributes, KeyboardEvent, PointerEvent } from 'react';
|
|
2
|
+
export type TopListItem = {
|
|
3
|
+
/** Stable identifier. Must be unique within the list. */
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
value: number;
|
|
7
|
+
/** Chart color from `chartColors`. */
|
|
8
|
+
color?: string;
|
|
9
|
+
};
|
|
10
|
+
export type TopListSort<Item extends TopListItem = TopListItem> = 'ascending' | 'descending' | 'none' | ((left: Item, right: Item) => number);
|
|
11
|
+
export type TopListProps<Item extends TopListItem = TopListItem> = Omit<HTMLAttributes<HTMLDivElement>, 'aria-label' | 'children'> & {
|
|
12
|
+
items: readonly Item[];
|
|
13
|
+
/** Sorts before applying `limit`. Defaults to descending value order. */
|
|
14
|
+
sort?: TopListSort<Item>;
|
|
15
|
+
limit?: number;
|
|
16
|
+
/** Formats value-axis ticks, value labels, and default accessible names. */
|
|
17
|
+
formatValue?: (value: number) => string;
|
|
18
|
+
valueAxisLabel?: string;
|
|
19
|
+
/** Reserved width for category labels, in pixels. Defaults to 112. */
|
|
20
|
+
categoryLabelWidth?: number;
|
|
21
|
+
activeItemId?: string | null;
|
|
22
|
+
/** Defaults to `<label>: <formatted value>`. */
|
|
23
|
+
getItemAriaLabel?: (item: Item) => string;
|
|
24
|
+
/** Keeps axes mounted while omitting rows during resize. */
|
|
25
|
+
isRendering?: boolean;
|
|
26
|
+
/** Animates the chart unless reduced motion is preferred. Defaults to true. */
|
|
27
|
+
shouldAnimate?: boolean;
|
|
28
|
+
onItemPointerMove?: (item: Item, event: PointerEvent<SVGElement>) => void;
|
|
29
|
+
onItemPointerOut?: () => void;
|
|
30
|
+
onItemActivate?: (item: Item, event: PointerEvent<SVGElement> | KeyboardEvent<SVGRectElement>) => void;
|
|
31
|
+
onItemFocus?: (item: Item, event: FocusEvent<SVGRectElement>) => void;
|
|
32
|
+
onItemBlur?: (item: Item, event: FocusEvent<SVGRectElement>) => void;
|
|
33
|
+
'aria-label': string;
|
|
34
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { TopListItem, TopListSort } from './TopList.types.js';
|
|
2
|
+
export declare const sortTopListItems: <Item extends TopListItem>(items: readonly Item[], sort: TopListSort<Item>) => readonly Item[];
|
|
3
|
+
export declare const limitTopListItems: <Item extends TopListItem>(items: readonly Item[], limit: number | undefined) => readonly Item[];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region packages/components/src/components/TopList/TopList.utils.ts
|
|
2
|
+
var sortTopListItems = (items, sort) => {
|
|
3
|
+
const sortedItems = [...items];
|
|
4
|
+
if (sort === "none") return sortedItems;
|
|
5
|
+
if (typeof sort === "function") return sortedItems.sort(sort);
|
|
6
|
+
if (sort === "ascending") return sortedItems.sort((left, right) => left.value - right.value);
|
|
7
|
+
return sortedItems.sort((left, right) => right.value - left.value);
|
|
8
|
+
};
|
|
9
|
+
var limitTopListItems = (items, limit) => {
|
|
10
|
+
if (limit == null || !Number.isFinite(limit)) return items;
|
|
11
|
+
return items.slice(0, Math.max(0, Math.floor(limit)));
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { limitTopListItems, sortTopListItems };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=TopList.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopList.utils.js","names":[],"sources":["../../../src/components/TopList/TopList.utils.ts"],"sourcesContent":["import type { TopListItem, TopListSort } from './TopList.types';\n\nexport const sortTopListItems = <Item extends TopListItem>(\n items: readonly Item[],\n sort: TopListSort<Item>\n): readonly Item[] => {\n const sortedItems = [...items];\n if (sort === 'none') return sortedItems;\n\n if (typeof sort === 'function') return sortedItems.sort(sort);\n if (sort === 'ascending') {\n return sortedItems.sort((left, right) => left.value - right.value);\n }\n\n return sortedItems.sort((left, right) => right.value - left.value);\n};\n\nexport const limitTopListItems = <Item extends TopListItem>(\n items: readonly Item[],\n limit: number | undefined\n): readonly Item[] => {\n if (limit == null || !Number.isFinite(limit)) return items;\n return items.slice(0, Math.max(0, Math.floor(limit)));\n};\n"],"mappings":";AAEA,IAAa,oBACX,OACA,SACoB;CACpB,MAAM,cAAc,CAAC,GAAG,KAAK;CAC7B,IAAI,SAAS,QAAQ,OAAO;CAE5B,IAAI,OAAO,SAAS,YAAY,OAAO,YAAY,KAAK,IAAI;CAC5D,IAAI,SAAS,aACX,OAAO,YAAY,MAAM,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK;CAGnE,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAK;AACnE;AAEA,IAAa,qBACX,OACA,UACoB;CACpB,IAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,GAAG,OAAO;CACrD,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACtD"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { defaultOptionLabel, defaultOptionValue, getTypeaheadCreateState, getTypeaheadDisplayInputValue, getTypeaheadListItems, getTypeaheadSelectedSummary, isActiveOptionSelected, isTypeaheadOption } from "./Typeahead.utils.js";
|
|
2
|
+
import { TypeaheadView } from "./TypeaheadView.js";
|
|
3
|
+
import { useTypeaheadDomSync } from "./useTypeaheadDomSync.js";
|
|
4
|
+
import { useTypeaheadUncontrolledInput } from "./useTypeaheadUncontrolledInput.js";
|
|
5
|
+
import { forwardRef, useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
//#region packages/components/src/components/Typeahead/Typeahead.tsx
|
|
8
|
+
function TypeaheadInner({ options, value, onChange, placeholder = "Search...", leftDecorator, showPlaceholderWithValues = false, emptyText = "No results found.", size = "md", disabled = false, isError = false, freeSolo = false, multiple, disableClearable = false, disableCloseOnSelect = false, filterOptions, forcePopupIcon = true, clearOnBlur, clearValueOnInputClear = false, displaySelectedValueWhenInputEmpty = false, maxVisibleOptions, hideEmptyList = false, emptyState, listFooter, onCreateNew, createNewLabel, inputValue: controlledInputValue, onInputChange, getOptionLabel, getOptionValue, getOptionDisabled, renderOption, renderTags, className, inputId, autoFocus, autoComplete, onKeyDown, onBlur, "aria-label": ariaLabel, "data-testid": dataTestId, ...rest }, ref) {
|
|
9
|
+
const generatedId = useId();
|
|
10
|
+
const resolvedInputId = inputId ?? generatedId;
|
|
11
|
+
const listId = `${resolvedInputId}-listbox`;
|
|
12
|
+
const selectedSummaryId = `${resolvedInputId}-selected-summary`;
|
|
13
|
+
const commandLabel = ariaLabel ?? placeholder;
|
|
14
|
+
const inputAriaLabel = ariaLabel ?? (inputId ? void 0 : placeholder);
|
|
15
|
+
const internalInputRef = useRef(null);
|
|
16
|
+
const listRef = useRef(null);
|
|
17
|
+
const popoverContentRef = useRef(null);
|
|
18
|
+
const [open, setOpenState] = useState(false);
|
|
19
|
+
const [uncontrolledInputValue, setUncontrolledInputValue] = useState("");
|
|
20
|
+
const setOpen = useCallback((nextOpen) => {
|
|
21
|
+
if (!disabled || !nextOpen) setOpenState(nextOpen);
|
|
22
|
+
}, [disabled]);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (disabled) setOpenState(false);
|
|
25
|
+
if (autoFocus) requestAnimationFrame(() => internalInputRef.current?.focus());
|
|
26
|
+
}, [autoFocus, disabled]);
|
|
27
|
+
const inputValue = controlledInputValue ?? uncontrolledInputValue;
|
|
28
|
+
const getLabel = useCallback((option) => getOptionLabel ? getOptionLabel(option) : defaultOptionLabel(option), [getOptionLabel]);
|
|
29
|
+
const getValue = useCallback((option) => getOptionValue ? getOptionValue(option) : defaultOptionValue(option), [getOptionValue]);
|
|
30
|
+
const selectedValues = useMemo(() => {
|
|
31
|
+
if (multiple) return Array.isArray(value) ? value : [];
|
|
32
|
+
return value == null ? [] : [value];
|
|
33
|
+
}, [multiple, value]);
|
|
34
|
+
const selectedKeys = useMemo(() => new Set(selectedValues.map((selected) => getValue(selected))), [getValue, selectedValues]);
|
|
35
|
+
const setInputValue = useCallback((nextValue) => {
|
|
36
|
+
if (controlledInputValue === void 0) setUncontrolledInputValue(nextValue);
|
|
37
|
+
onInputChange?.(nextValue);
|
|
38
|
+
}, [controlledInputValue, onInputChange]);
|
|
39
|
+
useTypeaheadUncontrolledInput({
|
|
40
|
+
clearOnBlur,
|
|
41
|
+
controlledInputValue,
|
|
42
|
+
freeSolo,
|
|
43
|
+
getLabel,
|
|
44
|
+
multiple,
|
|
45
|
+
open,
|
|
46
|
+
setUncontrolledInputValue,
|
|
47
|
+
value
|
|
48
|
+
});
|
|
49
|
+
const visibleItems = getTypeaheadListItems({
|
|
50
|
+
options,
|
|
51
|
+
selectedValues,
|
|
52
|
+
inputValue,
|
|
53
|
+
getLabel,
|
|
54
|
+
getValue,
|
|
55
|
+
filterOptions,
|
|
56
|
+
maxVisibleOptions,
|
|
57
|
+
includeSelectedValues: multiple
|
|
58
|
+
});
|
|
59
|
+
const optionIsDisabled = useCallback((item) => {
|
|
60
|
+
if (item.source === "selected") return false;
|
|
61
|
+
const option = item.option;
|
|
62
|
+
return getOptionDisabled?.(option) ?? (isTypeaheadOption(option) ? !!option.disabled : false);
|
|
63
|
+
}, [getOptionDisabled]);
|
|
64
|
+
const { customCreateInputValue, showCreateOption, showFreeSoloCreateOption, trimmedInputValue } = getTypeaheadCreateState(inputValue, options, selectedValues, getLabel, freeSolo, !!onCreateNew);
|
|
65
|
+
const hasPopupContent = visibleItems.length > 0 || showCreateOption || emptyState != null || listFooter != null || !hideEmptyList;
|
|
66
|
+
const popupOpen = open && hasPopupContent;
|
|
67
|
+
const focusInput = useCallback(() => {
|
|
68
|
+
requestAnimationFrame(() => internalInputRef.current?.focus());
|
|
69
|
+
}, []);
|
|
70
|
+
const emitChange = useCallback((next) => onChange(next), [onChange]);
|
|
71
|
+
const selectValue = useCallback((selected) => {
|
|
72
|
+
if (disabled) return;
|
|
73
|
+
if (multiple) {
|
|
74
|
+
const selectedKey = getValue(selected);
|
|
75
|
+
const nextValue = selectedKeys.has(selectedKey) ? selectedValues.filter((item) => getValue(item) !== selectedKey) : [...selectedValues, selected];
|
|
76
|
+
emitChange(nextValue);
|
|
77
|
+
setInputValue("");
|
|
78
|
+
if (disableCloseOnSelect) focusInput();
|
|
79
|
+
else setOpen(false);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
emitChange(selected);
|
|
83
|
+
setInputValue(displaySelectedValueWhenInputEmpty ? "" : getLabel(selected));
|
|
84
|
+
setOpen(false);
|
|
85
|
+
}, [
|
|
86
|
+
disableCloseOnSelect,
|
|
87
|
+
disabled,
|
|
88
|
+
emitChange,
|
|
89
|
+
focusInput,
|
|
90
|
+
getLabel,
|
|
91
|
+
getValue,
|
|
92
|
+
displaySelectedValueWhenInputEmpty,
|
|
93
|
+
multiple,
|
|
94
|
+
selectedKeys,
|
|
95
|
+
selectedValues,
|
|
96
|
+
setInputValue,
|
|
97
|
+
setOpen
|
|
98
|
+
]);
|
|
99
|
+
const createFreeSoloValue = useCallback(() => {
|
|
100
|
+
if (!showFreeSoloCreateOption) return;
|
|
101
|
+
selectValue(trimmedInputValue);
|
|
102
|
+
}, [
|
|
103
|
+
selectValue,
|
|
104
|
+
showFreeSoloCreateOption,
|
|
105
|
+
trimmedInputValue
|
|
106
|
+
]);
|
|
107
|
+
const createCustomValue = useCallback(() => {
|
|
108
|
+
if (!onCreateNew) return;
|
|
109
|
+
onCreateNew(customCreateInputValue);
|
|
110
|
+
setOpen(false);
|
|
111
|
+
}, [
|
|
112
|
+
customCreateInputValue,
|
|
113
|
+
onCreateNew,
|
|
114
|
+
setOpen
|
|
115
|
+
]);
|
|
116
|
+
const removeAtIndex = useCallback((index) => {
|
|
117
|
+
if (!multiple || disabled || index < 0) return;
|
|
118
|
+
emitChange(selectedValues.filter((_, i) => i !== index));
|
|
119
|
+
focusInput();
|
|
120
|
+
}, [
|
|
121
|
+
disabled,
|
|
122
|
+
emitChange,
|
|
123
|
+
focusInput,
|
|
124
|
+
multiple,
|
|
125
|
+
selectedValues
|
|
126
|
+
]);
|
|
127
|
+
const clearValue = useCallback(() => {
|
|
128
|
+
if (disabled || disableClearable) return;
|
|
129
|
+
if (multiple) emitChange([]);
|
|
130
|
+
else emitChange(null);
|
|
131
|
+
setInputValue("");
|
|
132
|
+
setOpen(false);
|
|
133
|
+
focusInput();
|
|
134
|
+
}, [
|
|
135
|
+
disableClearable,
|
|
136
|
+
disabled,
|
|
137
|
+
emitChange,
|
|
138
|
+
focusInput,
|
|
139
|
+
multiple,
|
|
140
|
+
setInputValue,
|
|
141
|
+
setOpen
|
|
142
|
+
]);
|
|
143
|
+
const handleInputValueChange = useCallback((nextValue) => {
|
|
144
|
+
if (disabled) return;
|
|
145
|
+
if (clearValueOnInputClear && !multiple && nextValue.length === 0 && selectedValues.length > 0) emitChange(null);
|
|
146
|
+
setInputValue(nextValue);
|
|
147
|
+
setOpen(true);
|
|
148
|
+
}, [
|
|
149
|
+
clearValueOnInputClear,
|
|
150
|
+
disabled,
|
|
151
|
+
emitChange,
|
|
152
|
+
multiple,
|
|
153
|
+
selectedValues.length,
|
|
154
|
+
setInputValue,
|
|
155
|
+
setOpen
|
|
156
|
+
]);
|
|
157
|
+
const handleKeyDown = useCallback((event) => {
|
|
158
|
+
onKeyDown?.(event);
|
|
159
|
+
if (event.defaultPrevented || disabled) return;
|
|
160
|
+
if (event.key === "Backspace" && multiple && inputValue.length === 0) {
|
|
161
|
+
removeAtIndex(selectedValues.length - 1);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (event.key === "Enter" && multiple && freeSolo && popupOpen && isActiveOptionSelected(listRef.current, selectedValues, getValue)) {
|
|
165
|
+
event.preventDefault();
|
|
166
|
+
if (showFreeSoloCreateOption) createFreeSoloValue();
|
|
167
|
+
else setInputValue("");
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (event.key === "ArrowDown" || event.key === "Enter") {
|
|
171
|
+
if (!open && hasPopupContent) {
|
|
172
|
+
event.preventDefault();
|
|
173
|
+
setOpen(true);
|
|
174
|
+
}
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (event.key === "Escape" && open) {
|
|
178
|
+
if (popupOpen) event.preventDefault();
|
|
179
|
+
setOpen(false);
|
|
180
|
+
}
|
|
181
|
+
}, [
|
|
182
|
+
createFreeSoloValue,
|
|
183
|
+
disabled,
|
|
184
|
+
freeSolo,
|
|
185
|
+
getValue,
|
|
186
|
+
hasPopupContent,
|
|
187
|
+
inputValue.length,
|
|
188
|
+
multiple,
|
|
189
|
+
onKeyDown,
|
|
190
|
+
open,
|
|
191
|
+
popupOpen,
|
|
192
|
+
removeAtIndex,
|
|
193
|
+
selectedValues,
|
|
194
|
+
setInputValue,
|
|
195
|
+
setOpen,
|
|
196
|
+
showFreeSoloCreateOption
|
|
197
|
+
]);
|
|
198
|
+
const handleBlur = useCallback((event) => {
|
|
199
|
+
onBlur?.(event);
|
|
200
|
+
const nextTarget = event.relatedTarget;
|
|
201
|
+
if (!nextTarget || !event.currentTarget.contains(nextTarget) && !popoverContentRef.current?.contains(nextTarget)) setOpen(false);
|
|
202
|
+
}, [onBlur, setOpen]);
|
|
203
|
+
const getTagProps = useCallback(({ index }) => ({
|
|
204
|
+
key: `${getValue(selectedValues[index])}-${index}`,
|
|
205
|
+
tabIndex: -1,
|
|
206
|
+
"data-tag-index": index,
|
|
207
|
+
onDelete: () => removeAtIndex(index)
|
|
208
|
+
}), [
|
|
209
|
+
getValue,
|
|
210
|
+
removeAtIndex,
|
|
211
|
+
selectedValues
|
|
212
|
+
]);
|
|
213
|
+
const hasValue = selectedValues.length > 0;
|
|
214
|
+
const showClearButton = !disabled && !disableClearable && (hasValue || !multiple && inputValue.length > 0);
|
|
215
|
+
const selectedSummary = getTypeaheadSelectedSummary(selectedValues, getLabel, multiple);
|
|
216
|
+
const displayInputValue = getTypeaheadDisplayInputValue(inputValue, selectedValues, getLabel, multiple, displaySelectedValueWhenInputEmpty);
|
|
217
|
+
const setInputNode = useCallback((node) => {
|
|
218
|
+
internalInputRef.current = node;
|
|
219
|
+
}, []);
|
|
220
|
+
useTypeaheadDomSync({
|
|
221
|
+
autoComplete,
|
|
222
|
+
commandLabel,
|
|
223
|
+
inputAriaLabel,
|
|
224
|
+
inputRef: internalInputRef,
|
|
225
|
+
inputValue,
|
|
226
|
+
isError,
|
|
227
|
+
listId,
|
|
228
|
+
listRef,
|
|
229
|
+
multiple,
|
|
230
|
+
open: popupOpen,
|
|
231
|
+
resolvedInputId,
|
|
232
|
+
selectedSummaryId
|
|
233
|
+
});
|
|
234
|
+
return /* @__PURE__ */ jsx(TypeaheadView, {
|
|
235
|
+
root: {
|
|
236
|
+
ref,
|
|
237
|
+
props: rest,
|
|
238
|
+
handleBlur,
|
|
239
|
+
dataTestId,
|
|
240
|
+
className
|
|
241
|
+
},
|
|
242
|
+
state: {
|
|
243
|
+
size,
|
|
244
|
+
disabled,
|
|
245
|
+
isError,
|
|
246
|
+
multiple,
|
|
247
|
+
open: popupOpen,
|
|
248
|
+
setOpen
|
|
249
|
+
},
|
|
250
|
+
ids: {
|
|
251
|
+
commandLabel,
|
|
252
|
+
resolvedInputId,
|
|
253
|
+
listId,
|
|
254
|
+
selectedSummaryId,
|
|
255
|
+
inputAriaLabel
|
|
256
|
+
},
|
|
257
|
+
input: {
|
|
258
|
+
value: displayInputValue,
|
|
259
|
+
onValueChange: handleInputValueChange,
|
|
260
|
+
onKeyDown: handleKeyDown,
|
|
261
|
+
placeholder,
|
|
262
|
+
leftDecorator,
|
|
263
|
+
showPlaceholderWithValues,
|
|
264
|
+
autoFocus,
|
|
265
|
+
autoComplete,
|
|
266
|
+
setNode: setInputNode,
|
|
267
|
+
focus: focusInput
|
|
268
|
+
},
|
|
269
|
+
selection: {
|
|
270
|
+
selectedValues,
|
|
271
|
+
selectedKeys,
|
|
272
|
+
getTagProps,
|
|
273
|
+
renderTags,
|
|
274
|
+
getLabel,
|
|
275
|
+
getValue,
|
|
276
|
+
showClearButton,
|
|
277
|
+
clearValue,
|
|
278
|
+
forcePopupIcon,
|
|
279
|
+
selectedSummary
|
|
280
|
+
},
|
|
281
|
+
list: {
|
|
282
|
+
ref: listRef,
|
|
283
|
+
items: visibleItems,
|
|
284
|
+
emptyText,
|
|
285
|
+
emptyState,
|
|
286
|
+
listFooter,
|
|
287
|
+
hideEmptyList,
|
|
288
|
+
optionIsDisabled,
|
|
289
|
+
selectValue,
|
|
290
|
+
renderOption
|
|
291
|
+
},
|
|
292
|
+
createOption: {
|
|
293
|
+
show: showCreateOption,
|
|
294
|
+
inputValue: onCreateNew ? customCreateInputValue : trimmedInputValue,
|
|
295
|
+
label: createNewLabel?.(customCreateInputValue),
|
|
296
|
+
onCreate: onCreateNew ? createCustomValue : createFreeSoloValue
|
|
297
|
+
},
|
|
298
|
+
popoverContentRef
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
var Typeahead = forwardRef(TypeaheadInner);
|
|
302
|
+
//#endregion
|
|
303
|
+
export { Typeahead };
|
|
304
|
+
|
|
305
|
+
//# sourceMappingURL=Typeahead.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Typeahead.js","names":[],"sources":["../../../src/components/Typeahead/Typeahead.tsx"],"sourcesContent":["import type { FocusEvent, KeyboardEvent, ReactElement, Ref } from 'react';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport type {\n TypeaheadMultipleValue,\n TypeaheadProps,\n TypeaheadSelectedValue,\n TypeaheadSingleValue,\n TypeaheadTagProps,\n} from './Typeahead.types';\nimport {\n defaultOptionLabel,\n defaultOptionValue,\n getTypeaheadCreateState,\n getTypeaheadDisplayInputValue,\n getTypeaheadListItems,\n getTypeaheadSelectedSummary,\n isActiveOptionSelected,\n isTypeaheadOption,\n} from './Typeahead.utils';\nimport { TypeaheadView } from './TypeaheadView';\nimport { useTypeaheadDomSync } from './useTypeaheadDomSync';\nimport { useTypeaheadUncontrolledInput } from './useTypeaheadUncontrolledInput';\n\nfunction TypeaheadInner<TOption = string>(\n {\n options,\n value,\n onChange,\n placeholder = 'Search...',\n leftDecorator,\n showPlaceholderWithValues = false,\n emptyText = 'No results found.',\n size = 'md',\n disabled = false,\n isError = false,\n freeSolo = false,\n multiple,\n disableClearable = false,\n disableCloseOnSelect = false,\n filterOptions,\n forcePopupIcon = true,\n clearOnBlur,\n clearValueOnInputClear = false,\n displaySelectedValueWhenInputEmpty = false,\n maxVisibleOptions,\n hideEmptyList = false,\n emptyState,\n listFooter,\n onCreateNew,\n createNewLabel,\n inputValue: controlledInputValue,\n onInputChange,\n getOptionLabel,\n getOptionValue,\n getOptionDisabled,\n renderOption,\n renderTags,\n className,\n inputId,\n autoFocus,\n autoComplete,\n onKeyDown,\n onBlur,\n 'aria-label': ariaLabel,\n 'data-testid': dataTestId,\n ...rest\n }: TypeaheadProps<TOption>,\n ref: Ref<HTMLDivElement>\n) {\n const generatedId = useId();\n const resolvedInputId = inputId ?? generatedId;\n const listId = `${resolvedInputId}-listbox`;\n const selectedSummaryId = `${resolvedInputId}-selected-summary`;\n const commandLabel = ariaLabel ?? placeholder;\n const inputAriaLabel = ariaLabel ?? (inputId ? undefined : placeholder);\n const internalInputRef = useRef<HTMLInputElement | null>(null);\n const listRef = useRef<HTMLDivElement | null>(null);\n const popoverContentRef = useRef<HTMLDivElement | null>(null);\n const [open, setOpenState] = useState(false);\n const [uncontrolledInputValue, setUncontrolledInputValue] = useState('');\n const setOpen = useCallback(\n (nextOpen: boolean) => {\n if (!disabled || !nextOpen) {\n setOpenState(nextOpen);\n }\n },\n [disabled]\n );\n useEffect(() => {\n if (disabled) setOpenState(false);\n if (autoFocus)\n requestAnimationFrame(() => internalInputRef.current?.focus());\n }, [autoFocus, disabled]);\n\n const inputValue = controlledInputValue ?? uncontrolledInputValue;\n const getLabel = useCallback(\n (option: TypeaheadSelectedValue<TOption>) =>\n getOptionLabel ? getOptionLabel(option) : defaultOptionLabel(option),\n [getOptionLabel]\n );\n const getValue = useCallback(\n (option: TypeaheadSelectedValue<TOption>) =>\n getOptionValue ? getOptionValue(option) : defaultOptionValue(option),\n [getOptionValue]\n );\n\n const selectedValues = useMemo<TypeaheadMultipleValue<TOption>>(() => {\n if (multiple) {\n return Array.isArray(value) ? value : [];\n }\n return value == null ? [] : [value];\n }, [multiple, value]);\n\n const selectedKeys = useMemo(\n () => new Set(selectedValues.map((selected) => getValue(selected))),\n [getValue, selectedValues]\n );\n\n const setInputValue = useCallback(\n (nextValue: string) => {\n if (controlledInputValue === undefined) {\n setUncontrolledInputValue(nextValue);\n }\n onInputChange?.(nextValue);\n },\n [controlledInputValue, onInputChange]\n );\n\n useTypeaheadUncontrolledInput({\n clearOnBlur,\n controlledInputValue,\n freeSolo,\n getLabel,\n multiple,\n open,\n setUncontrolledInputValue,\n value,\n });\n\n const visibleItems = getTypeaheadListItems({\n options,\n selectedValues,\n inputValue,\n getLabel,\n getValue,\n filterOptions,\n maxVisibleOptions,\n includeSelectedValues: multiple,\n });\n\n const optionIsDisabled = useCallback(\n (item: (typeof visibleItems)[number]) => {\n if (item.source === 'selected') return false;\n const option = item.option as TOption;\n return (\n getOptionDisabled?.(option) ??\n (isTypeaheadOption(option) ? !!option.disabled : false)\n );\n },\n [getOptionDisabled]\n );\n\n const {\n customCreateInputValue,\n showCreateOption,\n showFreeSoloCreateOption,\n trimmedInputValue,\n } = getTypeaheadCreateState(\n inputValue,\n options,\n selectedValues,\n getLabel,\n freeSolo,\n !!onCreateNew\n );\n const hasPopupContent =\n visibleItems.length > 0 ||\n showCreateOption ||\n emptyState != null ||\n listFooter != null ||\n !hideEmptyList;\n const popupOpen = open && hasPopupContent;\n const focusInput = useCallback(() => {\n requestAnimationFrame(() => internalInputRef.current?.focus());\n }, []);\n\n // `onChange` can't be narrowed from the single/multiple props union after destructuring; callers below branch on `multiple` first, so funnel both shapes through one callback.\n const emitChange = useCallback(\n (next: TypeaheadSingleValue<TOption> | TypeaheadMultipleValue<TOption>) =>\n (onChange as (value: typeof next) => void)(next),\n [onChange]\n );\n const selectValue = useCallback(\n (selected: TypeaheadSelectedValue<TOption>) => {\n if (disabled) return;\n if (multiple) {\n const selectedKey = getValue(selected);\n const nextValue = selectedKeys.has(selectedKey)\n ? selectedValues.filter((item) => getValue(item) !== selectedKey)\n : [...selectedValues, selected];\n\n emitChange(nextValue);\n setInputValue('');\n if (disableCloseOnSelect) {\n focusInput();\n } else {\n setOpen(false);\n }\n return;\n }\n\n emitChange(selected);\n setInputValue(\n displaySelectedValueWhenInputEmpty ? '' : getLabel(selected)\n );\n setOpen(false);\n },\n [\n disableCloseOnSelect,\n disabled,\n emitChange,\n focusInput,\n getLabel,\n getValue,\n displaySelectedValueWhenInputEmpty,\n multiple,\n selectedKeys,\n selectedValues,\n setInputValue,\n setOpen,\n ]\n );\n\n const createFreeSoloValue = useCallback(() => {\n if (!showFreeSoloCreateOption) return;\n selectValue(trimmedInputValue);\n }, [selectValue, showFreeSoloCreateOption, trimmedInputValue]);\n\n const createCustomValue = useCallback(() => {\n if (!onCreateNew) return;\n onCreateNew(customCreateInputValue);\n setOpen(false);\n }, [customCreateInputValue, onCreateNew, setOpen]);\n\n const removeAtIndex = useCallback(\n (index: number) => {\n if (!multiple || disabled || index < 0) return;\n emitChange(selectedValues.filter((_, i) => i !== index));\n focusInput();\n },\n [disabled, emitChange, focusInput, multiple, selectedValues]\n );\n\n const clearValue = useCallback(() => {\n if (disabled || disableClearable) return;\n if (multiple) {\n emitChange([]);\n } else {\n emitChange(null);\n }\n setInputValue('');\n setOpen(false);\n focusInput();\n }, [\n disableClearable,\n disabled,\n emitChange,\n focusInput,\n multiple,\n setInputValue,\n setOpen,\n ]);\n\n const handleInputValueChange = useCallback(\n (nextValue: string) => {\n if (disabled) return;\n if (\n clearValueOnInputClear &&\n !multiple &&\n nextValue.length === 0 &&\n selectedValues.length > 0\n ) {\n emitChange(null);\n }\n setInputValue(nextValue);\n setOpen(true);\n },\n [\n clearValueOnInputClear,\n disabled,\n emitChange,\n multiple,\n selectedValues.length,\n setInputValue,\n setOpen,\n ]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || disabled) return;\n\n if (event.key === 'Backspace' && multiple && inputValue.length === 0) {\n removeAtIndex(selectedValues.length - 1);\n return;\n }\n\n if (\n event.key === 'Enter' &&\n multiple &&\n freeSolo &&\n popupOpen &&\n isActiveOptionSelected(listRef.current, selectedValues, getValue)\n ) {\n event.preventDefault();\n if (showFreeSoloCreateOption) createFreeSoloValue();\n else setInputValue('');\n return;\n }\n\n // When open, cmdk owns Enter so active options and create rows win over free-solo.\n if (event.key === 'ArrowDown' || event.key === 'Enter') {\n if (!open && hasPopupContent) {\n event.preventDefault();\n setOpen(true);\n }\n return;\n }\n\n if (event.key === 'Escape' && open) {\n if (popupOpen) {\n event.preventDefault();\n }\n setOpen(false);\n }\n },\n [\n createFreeSoloValue,\n disabled,\n freeSolo,\n getValue,\n hasPopupContent,\n inputValue.length,\n multiple,\n onKeyDown,\n open,\n popupOpen,\n removeAtIndex,\n selectedValues,\n setInputValue,\n setOpen,\n showFreeSoloCreateOption,\n ]\n );\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n onBlur?.(event);\n const nextTarget = event.relatedTarget as Node | null;\n if (\n !nextTarget ||\n (!event.currentTarget.contains(nextTarget) &&\n !popoverContentRef.current?.contains(nextTarget))\n ) {\n setOpen(false);\n }\n },\n [onBlur, setOpen]\n );\n\n const getTagProps = useCallback(\n ({ index }: { index: number }): TypeaheadTagProps => ({\n key: `${getValue(selectedValues[index])}-${index}`,\n tabIndex: -1,\n 'data-tag-index': index,\n onDelete: () => removeAtIndex(index),\n }),\n [getValue, removeAtIndex, selectedValues]\n );\n\n const hasValue = selectedValues.length > 0;\n const showClearButton =\n !disabled &&\n !disableClearable &&\n (hasValue || (!multiple && inputValue.length > 0));\n const selectedSummary = getTypeaheadSelectedSummary(\n selectedValues,\n getLabel,\n multiple\n );\n const displayInputValue = getTypeaheadDisplayInputValue(\n inputValue,\n selectedValues,\n getLabel,\n multiple,\n displaySelectedValueWhenInputEmpty\n );\n\n const setInputNode = useCallback((node: HTMLInputElement | null) => {\n internalInputRef.current = node;\n }, []);\n\n useTypeaheadDomSync({\n autoComplete,\n commandLabel,\n inputAriaLabel,\n inputRef: internalInputRef,\n inputValue,\n isError,\n listId,\n listRef,\n multiple,\n open: popupOpen,\n resolvedInputId,\n selectedSummaryId,\n });\n\n return (\n <TypeaheadView\n root={{\n ref,\n props: rest,\n handleBlur,\n dataTestId,\n className,\n }}\n state={{\n size,\n disabled,\n isError,\n multiple,\n open: popupOpen,\n setOpen,\n }}\n ids={{\n commandLabel,\n resolvedInputId,\n listId,\n selectedSummaryId,\n inputAriaLabel,\n }}\n input={{\n value: displayInputValue,\n onValueChange: handleInputValueChange,\n onKeyDown: handleKeyDown,\n placeholder,\n leftDecorator,\n showPlaceholderWithValues,\n autoFocus,\n autoComplete,\n setNode: setInputNode,\n focus: focusInput,\n }}\n selection={{\n selectedValues,\n selectedKeys,\n getTagProps,\n renderTags,\n getLabel,\n getValue,\n showClearButton,\n clearValue,\n forcePopupIcon,\n selectedSummary,\n }}\n list={{\n ref: listRef,\n items: visibleItems,\n emptyText,\n emptyState,\n listFooter,\n hideEmptyList,\n optionIsDisabled,\n selectValue,\n renderOption,\n }}\n createOption={{\n show: showCreateOption,\n inputValue: onCreateNew ? customCreateInputValue : trimmedInputValue,\n label: createNewLabel?.(customCreateInputValue),\n onCreate: onCreateNew ? createCustomValue : createFreeSoloValue,\n }}\n popoverContentRef={popoverContentRef}\n />\n );\n}\n\nexport const Typeahead = forwardRef(TypeaheadInner) as <TOption = string>(\n props: TypeaheadProps<TOption> & { ref?: Ref<HTMLDivElement> }\n) => ReactElement<unknown>;\n"],"mappings":"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"}
|