@tetrascience-npm/tetrascience-react-ui 0.7.0-beta.107.1 → 0.7.0-beta.128.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/components/ai/chain-of-thought.cjs +1 -1
- package/dist/components/ai/chain-of-thought.cjs.map +1 -1
- package/dist/components/ai/chain-of-thought.js +1 -1
- package/dist/components/ai/chain-of-thought.js.map +1 -1
- package/dist/components/ai/confirmation.cjs +1 -1
- package/dist/components/ai/confirmation.cjs.map +1 -1
- package/dist/components/ai/confirmation.js +1 -1
- package/dist/components/ai/confirmation.js.map +1 -1
- package/dist/components/ai/context.cjs +1 -1
- package/dist/components/ai/context.cjs.map +1 -1
- package/dist/components/ai/context.js +36 -35
- package/dist/components/ai/context.js.map +1 -1
- package/dist/components/ai/message.cjs +1 -1
- package/dist/components/ai/message.cjs.map +1 -1
- package/dist/components/ai/message.js +68 -68
- package/dist/components/ai/message.js.map +1 -1
- package/dist/components/ai/prompt-input.cjs +1 -1
- package/dist/components/ai/prompt-input.cjs.map +1 -1
- package/dist/components/ai/prompt-input.js +4 -2
- package/dist/components/ai/prompt-input.js.map +1 -1
- package/dist/components/ai/queue.cjs +1 -1
- package/dist/components/ai/queue.cjs.map +1 -1
- package/dist/components/ai/queue.js +9 -9
- package/dist/components/ai/queue.js.map +1 -1
- package/dist/components/ai/reasoning.cjs +1 -1
- package/dist/components/ai/reasoning.cjs.map +1 -1
- package/dist/components/ai/reasoning.js +67 -67
- package/dist/components/ai/reasoning.js.map +1 -1
- package/dist/components/ai/stream-status.cjs +1 -1
- package/dist/components/ai/stream-status.cjs.map +1 -1
- package/dist/components/ai/stream-status.js +41 -39
- package/dist/components/ai/stream-status.js.map +1 -1
- package/dist/components/ai/streamdown-code-plugin.cjs +2 -0
- package/dist/components/ai/streamdown-code-plugin.cjs.map +1 -0
- package/dist/components/ai/streamdown-code-plugin.js +42 -0
- package/dist/components/ai/streamdown-code-plugin.js.map +1 -0
- package/dist/components/ai/streamdown-plugins.cjs +2 -0
- package/dist/components/ai/streamdown-plugins.cjs.map +1 -0
- package/dist/components/ai/streamdown-plugins.js +14 -0
- package/dist/components/ai/streamdown-plugins.js.map +1 -0
- package/dist/components/ai/task.cjs +1 -1
- package/dist/components/ai/task.cjs.map +1 -1
- package/dist/components/ai/task.js +18 -11
- package/dist/components/ai/task.js.map +1 -1
- package/dist/components/ai/tool.cjs +1 -1
- package/dist/components/ai/tool.cjs.map +1 -1
- package/dist/components/ai/tool.js +51 -55
- package/dist/components/ai/tool.js.map +1 -1
- package/dist/components/ai/use-streamdown-plugins.cjs +2 -0
- package/dist/components/ai/use-streamdown-plugins.cjs.map +1 -0
- package/dist/components/ai/use-streamdown-plugins.js +25 -0
- package/dist/components/ai/use-streamdown-plugins.js.map +1 -0
- package/dist/components/charts/AreaPlot/AreaPlot.cjs +2 -0
- package/dist/components/charts/AreaPlot/AreaPlot.cjs.map +1 -0
- package/dist/components/charts/AreaPlot/AreaPlot.js +270 -0
- package/dist/components/charts/AreaPlot/AreaPlot.js.map +1 -0
- package/dist/components/charts/BarChart/BarChart.cjs +2 -0
- package/dist/components/charts/BarChart/BarChart.cjs.map +1 -0
- package/dist/components/charts/BarChart/BarChart.js +219 -0
- package/dist/components/charts/BarChart/BarChart.js.map +1 -0
- package/dist/components/charts/BoxPlot/BoxPlot.cjs +2 -0
- package/dist/components/charts/BoxPlot/BoxPlot.cjs.map +1 -0
- package/dist/components/charts/{Boxplot/Boxplot.js → BoxPlot/BoxPlot.js} +78 -79
- package/dist/components/charts/BoxPlot/BoxPlot.js.map +1 -0
- package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
- package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
- package/dist/components/charts/ChartTooltip/ChartTooltip.js +22 -22
- package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
- package/dist/components/charts/Chromatogram/Chromatogram.cjs +1 -1
- package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -1
- package/dist/components/charts/Chromatogram/Chromatogram.js +232 -170
- package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -1
- package/dist/components/charts/Chromatogram/annotations.cjs +2 -0
- package/dist/components/charts/Chromatogram/annotations.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/annotations.js +137 -0
- package/dist/components/charts/Chromatogram/annotations.js.map +1 -0
- package/dist/components/charts/Chromatogram/boundaryMarkers.cjs +2 -0
- package/dist/components/charts/Chromatogram/boundaryMarkers.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/boundaryMarkers.js +34 -0
- package/dist/components/charts/Chromatogram/boundaryMarkers.js.map +1 -0
- package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.cjs +1 -1
- package/dist/components/charts/Chromatogram/constants.cjs.map +1 -0
- package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.js +11 -5
- package/dist/components/charts/Chromatogram/constants.js.map +1 -0
- package/dist/components/charts/Chromatogram/dataProcessing.cjs +2 -0
- package/dist/components/charts/Chromatogram/dataProcessing.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/dataProcessing.js +90 -0
- package/dist/components/charts/Chromatogram/dataProcessing.js.map +1 -0
- package/dist/components/charts/Chromatogram/peakDetection.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/peakDetection.js.map +1 -0
- package/dist/components/charts/Chromatogram/plotBuilder.cjs +2 -0
- package/dist/components/charts/Chromatogram/plotBuilder.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/plotBuilder.js +216 -0
- package/dist/components/charts/Chromatogram/plotBuilder.js.map +1 -0
- package/dist/components/charts/Chromatogram/regionOverlays.cjs +2 -0
- package/dist/components/charts/Chromatogram/regionOverlays.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/regionOverlays.js +26 -0
- package/dist/components/charts/Chromatogram/regionOverlays.js.map +1 -0
- package/dist/components/charts/Electropherogram/Electropherogram.cjs +2 -0
- package/dist/components/charts/Electropherogram/Electropherogram.cjs.map +1 -0
- package/dist/components/charts/Electropherogram/Electropherogram.js +180 -0
- package/dist/components/charts/Electropherogram/Electropherogram.js.map +1 -0
- package/dist/components/charts/Histogram/Histogram.cjs +1 -1
- package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
- package/dist/components/charts/Histogram/Histogram.js +107 -108
- package/dist/components/charts/Histogram/Histogram.js.map +1 -1
- package/dist/components/charts/LinePlot/LinePlot.cjs +2 -0
- package/dist/components/charts/LinePlot/LinePlot.cjs.map +1 -0
- package/dist/components/charts/LinePlot/LinePlot.js +224 -0
- package/dist/components/charts/LinePlot/LinePlot.js.map +1 -0
- package/dist/components/charts/PieChart/PieChart.cjs +1 -1
- package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
- package/dist/components/charts/PieChart/PieChart.js +62 -61
- package/dist/components/charts/PieChart/PieChart.js.map +1 -1
- package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
- package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
- package/dist/components/charts/PlateMap/PlateMap.js +246 -242
- package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
- package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +2 -0
- package/dist/components/charts/ScatterPlot/ScatterPlot.cjs.map +1 -0
- package/dist/components/charts/ScatterPlot/ScatterPlot.js +252 -0
- package/dist/components/charts/ScatterPlot/ScatterPlot.js.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs +2 -0
- package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js +215 -0
- package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/constants.cjs +2 -0
- package/dist/components/charts/ScatterPlotInteractive/constants.cjs.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/constants.js +38 -0
- package/dist/components/charts/ScatterPlotInteractive/constants.js.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/utils.cjs +2 -0
- package/dist/components/charts/ScatterPlotInteractive/utils.cjs.map +1 -0
- package/dist/components/charts/ScatterPlotInteractive/utils.js +261 -0
- package/dist/components/charts/ScatterPlotInteractive/utils.js.map +1 -0
- package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs +2 -0
- package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs.map +1 -0
- package/dist/components/charts/StackedChromatogram/StackedChromatogram.js +40 -0
- package/dist/components/charts/StackedChromatogram/StackedChromatogram.js.map +1 -0
- package/dist/components/charts/StackedChromatogram/transforms.cjs +2 -0
- package/dist/components/charts/StackedChromatogram/transforms.cjs.map +1 -0
- package/dist/components/charts/StackedChromatogram/transforms.js +31 -0
- package/dist/components/charts/StackedChromatogram/transforms.js.map +1 -0
- package/dist/components/charts/plotly-loader.cjs +2 -0
- package/dist/components/charts/plotly-loader.cjs.map +1 -0
- package/dist/components/charts/plotly-loader.js +22 -0
- package/dist/components/charts/plotly-loader.js.map +1 -0
- package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +2 -0
- package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -0
- package/dist/components/composed/AssistantLayout/AssistantLayout.js +142 -0
- package/dist/components/composed/AssistantLayout/AssistantLayout.js.map +1 -0
- package/dist/components/composed/AssistantLayout/dockLayout.cjs +2 -0
- package/dist/components/composed/AssistantLayout/dockLayout.cjs.map +1 -0
- package/dist/components/composed/AssistantLayout/dockLayout.js +10 -0
- package/dist/components/composed/AssistantLayout/dockLayout.js.map +1 -0
- package/dist/components/composed/Chat/Chat.cjs +1 -1
- package/dist/components/composed/Chat/Chat.cjs.map +1 -1
- package/dist/components/composed/Chat/Chat.js +23 -23
- package/dist/components/composed/Chat/Chat.js.map +1 -1
- package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
- package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
- package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +33 -29
- package/dist/components/composed/ConfirmDialog/ConfirmDialog.js.map +1 -1
- package/dist/components/composed/DataAppShell/CollapseButton.cjs +2 -0
- package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -0
- package/dist/components/composed/DataAppShell/CollapseButton.js +42 -0
- package/dist/components/composed/DataAppShell/CollapseButton.js.map +1 -0
- package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
- package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
- package/dist/components/composed/DataAppShell/DataAppShell.js +349 -313
- package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
- package/dist/components/composed/DataAppShell/PrimaryNav.cjs +2 -0
- package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -0
- package/dist/components/composed/DataAppShell/PrimaryNav.js +268 -0
- package/dist/components/composed/DataAppShell/PrimaryNav.js.map +1 -0
- package/dist/components/composed/DataAppShell/RightPanel.cjs +2 -0
- package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -0
- package/dist/components/composed/DataAppShell/RightPanel.js +282 -0
- package/dist/components/composed/DataAppShell/RightPanel.js.map +1 -0
- package/dist/components/composed/DataAppShell/SecondaryNav.cjs +2 -0
- package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -0
- package/dist/components/composed/DataAppShell/SecondaryNav.js +364 -0
- package/dist/components/composed/DataAppShell/SecondaryNav.js.map +1 -0
- package/dist/components/composed/DataAppShell/ShellContext.cjs +2 -0
- package/dist/components/composed/DataAppShell/ShellContext.cjs.map +1 -0
- package/dist/components/composed/DataAppShell/ShellContext.js +23 -0
- package/dist/components/composed/DataAppShell/ShellContext.js.map +1 -0
- package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +2 -0
- package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -0
- package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +87 -0
- package/dist/components/composed/MoleculeStructure/MoleculeStructure.js.map +1 -0
- package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +2 -0
- package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -0
- package/dist/components/composed/MoleculeStructure/rdkit-loader.js +89 -0
- package/dist/components/composed/MoleculeStructure/rdkit-loader.js.map +1 -0
- package/dist/components/composed/MoleculeStructure/use-rdkit.cjs +2 -0
- package/dist/components/composed/MoleculeStructure/use-rdkit.cjs.map +1 -0
- package/dist/components/composed/MoleculeStructure/use-rdkit.js +19 -0
- package/dist/components/composed/MoleculeStructure/use-rdkit.js.map +1 -0
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +17 -17
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +33 -33
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +7 -7
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +1 -1
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellLegend.js +24 -12
- package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellManifestTable.js +1 -1
- package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultFilters.js +3 -3
- package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -1
- package/dist/components/composed/TopBar/TopBar.cjs +2 -0
- package/dist/components/composed/TopBar/TopBar.cjs.map +1 -0
- package/dist/components/composed/TopBar/TopBar.js +56 -0
- package/dist/components/composed/TopBar/TopBar.js.map +1 -0
- package/dist/components/composed/UserMenu/UserMenu.cjs +2 -0
- package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -0
- package/dist/components/composed/UserMenu/UserMenu.js +99 -0
- package/dist/components/composed/UserMenu/UserMenu.js.map +1 -0
- package/dist/components/composed/tdp-link.cjs +1 -1
- package/dist/components/composed/tdp-link.cjs.map +1 -1
- package/dist/components/composed/tdp-link.js +5 -5
- package/dist/components/composed/tdp-link.js.map +1 -1
- package/dist/components/ui/alert.cjs +1 -1
- package/dist/components/ui/alert.cjs.map +1 -1
- package/dist/components/ui/alert.js +12 -12
- package/dist/components/ui/alert.js.map +1 -1
- package/dist/components/ui/badge.cjs +1 -1
- package/dist/components/ui/badge.cjs.map +1 -1
- package/dist/components/ui/badge.js +14 -14
- package/dist/components/ui/badge.js.map +1 -1
- package/dist/components/ui/banner.cjs +1 -1
- package/dist/components/ui/banner.cjs.map +1 -1
- package/dist/components/ui/banner.js +17 -17
- package/dist/components/ui/banner.js.map +1 -1
- package/dist/components/ui/button.cjs +1 -1
- package/dist/components/ui/button.cjs.map +1 -1
- package/dist/components/ui/button.js +16 -16
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/calendar.cjs +1 -1
- package/dist/components/ui/calendar.cjs.map +1 -1
- package/dist/components/ui/calendar.js +3 -3
- package/dist/components/ui/calendar.js.map +1 -1
- package/dist/components/ui/code-block.cjs +3 -3
- package/dist/components/ui/code-block.cjs.map +1 -1
- package/dist/components/ui/code-block.js +136 -118
- package/dist/components/ui/code-block.js.map +1 -1
- package/dist/components/ui/code-editor.cjs +1 -1
- package/dist/components/ui/code-editor.cjs.map +1 -1
- package/dist/components/ui/code-editor.js +14 -12
- package/dist/components/ui/code-editor.js.map +1 -1
- package/dist/components/ui/combobox.cjs +1 -1
- package/dist/components/ui/combobox.cjs.map +1 -1
- package/dist/components/ui/combobox.js +33 -29
- package/dist/components/ui/combobox.js.map +1 -1
- package/dist/components/ui/command.cjs +1 -1
- package/dist/components/ui/command.cjs.map +1 -1
- package/dist/components/ui/command.js +81 -77
- package/dist/components/ui/command.js.map +1 -1
- package/dist/components/ui/context-menu.cjs +1 -1
- package/dist/components/ui/context-menu.cjs.map +1 -1
- package/dist/components/ui/context-menu.js +13 -13
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
- package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table-column-toggle.js +70 -62
- package/dist/components/ui/data-table/data-table-column-toggle.js.map +1 -1
- package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
- package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table-filter.js +24 -23
- package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
- package/dist/components/ui/data-table/data-table-group.cjs +1 -1
- package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table-group.js +17 -16
- package/dist/components/ui/data-table/data-table-group.js.map +1 -1
- package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
- package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table-pagination.js +15 -15
- package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
- package/dist/components/ui/data-table/data-table.cjs +1 -1
- package/dist/components/ui/data-table/data-table.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table.js +191 -190
- package/dist/components/ui/data-table/data-table.js.map +1 -1
- package/dist/components/ui/dialog.cjs +1 -1
- package/dist/components/ui/dialog.cjs.map +1 -1
- package/dist/components/ui/dialog.js +1 -1
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/dropdown-menu.cjs +1 -1
- package/dist/components/ui/dropdown-menu.cjs.map +1 -1
- package/dist/components/ui/dropdown-menu.js +12 -4
- package/dist/components/ui/dropdown-menu.js.map +1 -1
- package/dist/components/ui/hover-card.cjs +1 -1
- package/dist/components/ui/hover-card.cjs.map +1 -1
- package/dist/components/ui/hover-card.js +3 -3
- package/dist/components/ui/hover-card.js.map +1 -1
- package/dist/components/ui/item.cjs +1 -1
- package/dist/components/ui/item.cjs.map +1 -1
- package/dist/components/ui/item.js +44 -36
- package/dist/components/ui/item.js.map +1 -1
- package/dist/components/ui/menubar.cjs +1 -1
- package/dist/components/ui/menubar.cjs.map +1 -1
- package/dist/components/ui/menubar.js +2 -2
- package/dist/components/ui/menubar.js.map +1 -1
- package/dist/components/ui/navigation-menu.cjs +1 -1
- package/dist/components/ui/navigation-menu.cjs.map +1 -1
- package/dist/components/ui/navigation-menu.js +1 -1
- package/dist/components/ui/navigation-menu.js.map +1 -1
- package/dist/components/ui/popover.cjs +1 -1
- package/dist/components/ui/popover.cjs.map +1 -1
- package/dist/components/ui/popover.js +1 -1
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/scroll-area.cjs +1 -1
- package/dist/components/ui/scroll-area.cjs.map +1 -1
- package/dist/components/ui/scroll-area.js +1 -0
- package/dist/components/ui/scroll-area.js.map +1 -1
- package/dist/components/ui/select.cjs +1 -1
- package/dist/components/ui/select.cjs.map +1 -1
- package/dist/components/ui/select.js +1 -1
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/sheet.cjs +1 -1
- package/dist/components/ui/sheet.cjs.map +1 -1
- package/dist/components/ui/sheet.js +5 -5
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/components/ui/sidebar.cjs +1 -1
- package/dist/components/ui/sidebar.cjs.map +1 -1
- package/dist/components/ui/sidebar.js +2 -2
- package/dist/components/ui/sidebar.js.map +1 -1
- package/dist/components/ui/slider.cjs +1 -1
- package/dist/components/ui/slider.cjs.map +1 -1
- package/dist/components/ui/slider.js +10 -9
- package/dist/components/ui/slider.js.map +1 -1
- package/dist/components/ui/sonner.cjs +1 -1
- package/dist/components/ui/sonner.cjs.map +1 -1
- package/dist/components/ui/sonner.js +25 -10
- package/dist/components/ui/sonner.js.map +1 -1
- package/dist/components/ui/table.cjs +1 -1
- package/dist/components/ui/table.cjs.map +1 -1
- package/dist/components/ui/table.js +1 -0
- package/dist/components/ui/table.js.map +1 -1
- package/dist/components/ui/tabs.cjs +1 -1
- package/dist/components/ui/tabs.cjs.map +1 -1
- package/dist/components/ui/tabs.js +18 -18
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/components/ui/tetra-molecule-icon.cjs +2 -0
- package/dist/components/ui/tetra-molecule-icon.cjs.map +1 -0
- package/dist/components/ui/tetra-molecule-icon.js +49 -0
- package/dist/components/ui/tetra-molecule-icon.js.map +1 -0
- package/dist/components/ui/toggle-group.cjs +1 -1
- package/dist/components/ui/toggle-group.cjs.map +1 -1
- package/dist/components/ui/toggle-group.js +35 -31
- package/dist/components/ui/toggle-group.js.map +1 -1
- package/dist/hooks/use-plotly-theme.cjs +1 -1
- package/dist/hooks/use-plotly-theme.cjs.map +1 -1
- package/dist/hooks/use-plotly-theme.js +4 -3
- package/dist/hooks/use-plotly-theme.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +1210 -132
- package/dist/index.js +694 -639
- package/dist/index.js.map +1 -1
- package/dist/index.tailwind.css +1 -1
- package/dist/lib/shiki.cjs +2 -0
- package/dist/lib/shiki.cjs.map +1 -0
- package/dist/lib/shiki.js +72 -0
- package/dist/lib/shiki.js.map +1 -0
- package/package.json +23 -12
- package/dist/components/charts/AreaGraph/AreaGraph.cjs +0 -2
- package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +0 -1
- package/dist/components/charts/AreaGraph/AreaGraph.js +0 -271
- package/dist/components/charts/AreaGraph/AreaGraph.js.map +0 -1
- package/dist/components/charts/BarGraph/BarGraph.cjs +0 -2
- package/dist/components/charts/BarGraph/BarGraph.cjs.map +0 -1
- package/dist/components/charts/BarGraph/BarGraph.js +0 -220
- package/dist/components/charts/BarGraph/BarGraph.js.map +0 -1
- package/dist/components/charts/Boxplot/Boxplot.cjs +0 -2
- package/dist/components/charts/Boxplot/Boxplot.cjs.map +0 -1
- package/dist/components/charts/Boxplot/Boxplot.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +0 -2
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +0 -227
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/annotations.cjs +0 -2
- package/dist/components/charts/ChromatogramChart/annotations.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/annotations.js +0 -73
- package/dist/components/charts/ChromatogramChart/annotations.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +0 -2
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +0 -34
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/constants.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/constants.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +0 -2
- package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/dataProcessing.js +0 -79
- package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +0 -1
- package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/peakDetection.js.map +0 -1
- package/dist/components/charts/DotPlot/DotPlot.cjs +0 -2
- package/dist/components/charts/DotPlot/DotPlot.cjs.map +0 -1
- package/dist/components/charts/DotPlot/DotPlot.js +0 -208
- package/dist/components/charts/DotPlot/DotPlot.js.map +0 -1
- package/dist/components/charts/Heatmap/Heatmap.cjs +0 -2
- package/dist/components/charts/Heatmap/Heatmap.cjs.map +0 -1
- package/dist/components/charts/Heatmap/Heatmap.js +0 -67
- package/dist/components/charts/Heatmap/Heatmap.js.map +0 -1
- package/dist/components/charts/LineGraph/LineGraph.cjs +0 -2
- package/dist/components/charts/LineGraph/LineGraph.cjs.map +0 -1
- package/dist/components/charts/LineGraph/LineGraph.js +0 -225
- package/dist/components/charts/LineGraph/LineGraph.js.map +0 -1
- package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +0 -2
- package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +0 -1
- package/dist/components/charts/ScatterGraph/ScatterGraph.js +0 -234
- package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +0 -1
- /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.cjs +0 -0
- /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.js +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { jsxs as N, jsx as n, Fragment as z } from "react/jsx-runtime";
|
|
2
|
+
import { PanelLeft as D, PanelBottom as C, PanelRight as L } from "lucide-react";
|
|
3
|
+
import * as l from "react";
|
|
4
|
+
import { dockPanels as $ } from "./dockLayout.js";
|
|
5
|
+
import { Button as R } from "../../ui/button.js";
|
|
6
|
+
import { ResizablePanel as P, ResizablePanelGroup as H, ResizableHandle as g } from "../../ui/resizable.js";
|
|
7
|
+
import { cn as d } from "../../../lib/utils.js";
|
|
8
|
+
const y = l.createContext(null);
|
|
9
|
+
function _(s, t) {
|
|
10
|
+
if (typeof window > "u") return t;
|
|
11
|
+
const e = window.localStorage.getItem(`${s}.dock`);
|
|
12
|
+
return e === "right" || e === "bottom" || e === "left" ? e : t;
|
|
13
|
+
}
|
|
14
|
+
function E(s, t) {
|
|
15
|
+
if (typeof window > "u") return t;
|
|
16
|
+
const e = Number(window.localStorage.getItem(`${s}.size`));
|
|
17
|
+
return !Number.isFinite(e) || e <= 0 || e >= 100 ? t : e;
|
|
18
|
+
}
|
|
19
|
+
function G({
|
|
20
|
+
children: s,
|
|
21
|
+
storageKey: t = "ts-ui.assistant",
|
|
22
|
+
defaultDock: e = "left",
|
|
23
|
+
defaultSize: u = 32,
|
|
24
|
+
defaultVisible: m = !0,
|
|
25
|
+
persist: o = !0
|
|
26
|
+
}) {
|
|
27
|
+
const [i, r] = l.useState(
|
|
28
|
+
() => o ? _(t, e) : e
|
|
29
|
+
), [f, a] = l.useState(
|
|
30
|
+
() => o ? E(t, u) : u
|
|
31
|
+
), [b, S] = l.useState(m), w = l.useCallback(
|
|
32
|
+
(c) => {
|
|
33
|
+
r(c), o && typeof window < "u" && window.localStorage.setItem(`${t}.dock`, c);
|
|
34
|
+
},
|
|
35
|
+
[t, o]
|
|
36
|
+
), h = l.useCallback(
|
|
37
|
+
(c) => {
|
|
38
|
+
a(c), o && typeof window < "u" && window.localStorage.setItem(`${t}.size`, String(Math.round(c)));
|
|
39
|
+
},
|
|
40
|
+
[t, o]
|
|
41
|
+
), v = l.useMemo(
|
|
42
|
+
() => ({ dock: i, setDock: w, size: f, setSize: h, visible: b, setVisible: S }),
|
|
43
|
+
[i, w, f, h, b]
|
|
44
|
+
);
|
|
45
|
+
return /* @__PURE__ */ n(y.Provider, { value: v, children: s });
|
|
46
|
+
}
|
|
47
|
+
function I() {
|
|
48
|
+
const s = l.useContext(y);
|
|
49
|
+
if (!s) throw new Error("useAssistantLayout must be used within an AssistantLayoutProvider");
|
|
50
|
+
return s;
|
|
51
|
+
}
|
|
52
|
+
const F = [
|
|
53
|
+
{ value: "left", label: "Dock assistant left", Icon: D },
|
|
54
|
+
{ value: "bottom", label: "Dock assistant bottom", Icon: C },
|
|
55
|
+
{ value: "right", label: "Dock assistant right", Icon: L }
|
|
56
|
+
];
|
|
57
|
+
function q({ label: s = "AI Assistant", className: t }) {
|
|
58
|
+
const { dock: e, setDock: u, visible: m, setVisible: o } = I();
|
|
59
|
+
return /* @__PURE__ */ N("div", { className: d("flex items-center gap-2", t), children: [
|
|
60
|
+
s != null && /* @__PURE__ */ n("span", { className: "text-sm font-medium", children: s }),
|
|
61
|
+
/* @__PURE__ */ n("div", { className: "inline-flex overflow-hidden rounded-lg border border-border", children: F.map(({ value: i, label: r, Icon: f }) => {
|
|
62
|
+
const a = m && e === i;
|
|
63
|
+
return /* @__PURE__ */ n(
|
|
64
|
+
R,
|
|
65
|
+
{
|
|
66
|
+
variant: a ? "secondary" : "ghost",
|
|
67
|
+
size: "icon-sm",
|
|
68
|
+
className: "rounded-none bg-clip-border",
|
|
69
|
+
"aria-label": a ? "Hide AI Assistant" : r,
|
|
70
|
+
"aria-pressed": a,
|
|
71
|
+
title: a ? "Hide AI Assistant" : r,
|
|
72
|
+
onClick: () => {
|
|
73
|
+
a ? o(!1) : (u(i), o(!0));
|
|
74
|
+
},
|
|
75
|
+
children: /* @__PURE__ */ n(f, { className: "size-4" })
|
|
76
|
+
},
|
|
77
|
+
i
|
|
78
|
+
);
|
|
79
|
+
}) })
|
|
80
|
+
] });
|
|
81
|
+
}
|
|
82
|
+
const A = "flex min-h-0 min-w-0 p-2", x = "flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden rounded-lg border border-border bg-card", k = "assistant";
|
|
83
|
+
function J({
|
|
84
|
+
assistant: s,
|
|
85
|
+
children: t,
|
|
86
|
+
minSize: e = 20,
|
|
87
|
+
maxSize: u = 70,
|
|
88
|
+
className: m,
|
|
89
|
+
assistantClassName: o,
|
|
90
|
+
contentClassName: i
|
|
91
|
+
}) {
|
|
92
|
+
const { dock: r, size: f, setSize: a, visible: b } = I(), { orientation: S, assistantFirst: w } = $(r);
|
|
93
|
+
if (!b)
|
|
94
|
+
return /* @__PURE__ */ n(
|
|
95
|
+
"div",
|
|
96
|
+
{
|
|
97
|
+
"data-slot": "assistant-layout",
|
|
98
|
+
className: d("flex min-h-0 flex-1 overflow-hidden", m),
|
|
99
|
+
children: /* @__PURE__ */ n("div", { className: d(A, "flex-1"), children: /* @__PURE__ */ n("div", { "data-slot": "assistant-layout-content", className: d(x, i), children: t }) })
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
const h = /* @__PURE__ */ n(
|
|
103
|
+
P,
|
|
104
|
+
{
|
|
105
|
+
id: k,
|
|
106
|
+
defaultSize: `${f}%`,
|
|
107
|
+
minSize: `${e}%`,
|
|
108
|
+
maxSize: `${u}%`,
|
|
109
|
+
className: A,
|
|
110
|
+
children: /* @__PURE__ */ n("div", { "data-slot": "assistant-layout-assistant", className: d(x, o), children: s })
|
|
111
|
+
}
|
|
112
|
+
), v = /* @__PURE__ */ n(P, { id: "content", className: A, children: /* @__PURE__ */ n("div", { "data-slot": "assistant-layout-content", className: d(x, i), children: t }) });
|
|
113
|
+
return /* @__PURE__ */ n(
|
|
114
|
+
H,
|
|
115
|
+
{
|
|
116
|
+
orientation: S,
|
|
117
|
+
"data-slot": "assistant-layout",
|
|
118
|
+
className: d("min-h-0 flex-1 overflow-hidden", m),
|
|
119
|
+
onLayoutChanged: (c) => {
|
|
120
|
+
const p = c[k];
|
|
121
|
+
typeof p == "number" && a(p);
|
|
122
|
+
},
|
|
123
|
+
children: w ? /* @__PURE__ */ N(z, { children: [
|
|
124
|
+
h,
|
|
125
|
+
/* @__PURE__ */ n(g, { withHandle: !0 }),
|
|
126
|
+
v
|
|
127
|
+
] }) : /* @__PURE__ */ N(z, { children: [
|
|
128
|
+
v,
|
|
129
|
+
/* @__PURE__ */ n(g, { withHandle: !0 }),
|
|
130
|
+
h
|
|
131
|
+
] })
|
|
132
|
+
},
|
|
133
|
+
r
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
export {
|
|
137
|
+
q as AssistantDockControls,
|
|
138
|
+
J as AssistantLayout,
|
|
139
|
+
G as AssistantLayoutProvider,
|
|
140
|
+
I as useAssistantLayout
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=AssistantLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssistantLayout.js","sources":["../../../../src/components/composed/AssistantLayout/AssistantLayout.tsx"],"sourcesContent":["\"use client\"\n\nimport { PanelBottom, PanelLeft, PanelRight } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { dockPanels, type AssistantDock } from \"./dockLayout\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from \"@/components/ui/resizable\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Context + provider\n// ---------------------------------------------------------------------------\n\ninterface AssistantLayoutContextValue {\n /** Where the assistant docks. Persisted. */\n dock: AssistantDock\n setDock: (dock: AssistantDock) => void\n /** Assistant size as a percentage of the layout along the dock axis. Persisted. */\n size: number\n setSize: (size: number) => void\n /** Whether the assistant is shown. In-memory by default (resets to visible on reload). */\n visible: boolean\n setVisible: (visible: boolean) => void\n}\n\nconst AssistantLayoutContext = React.createContext<AssistantLayoutContextValue | null>(null)\n\nexport interface AssistantLayoutProviderProps {\n children: React.ReactNode\n /** localStorage key prefix for the persisted dock + size. */\n storageKey?: string\n /** Default dock when nothing is persisted. */\n defaultDock?: AssistantDock\n /** Default assistant size as a percentage (1–99) of the layout. */\n defaultSize?: number\n /** Whether the assistant starts visible. */\n defaultVisible?: boolean\n /** Persist dock + size to localStorage. Defaults to `true`. */\n persist?: boolean\n}\n\nfunction readDock(key: string, fallback: AssistantDock): AssistantDock {\n if (typeof window === \"undefined\") return fallback\n const v = window.localStorage.getItem(`${key}.dock`)\n return v === \"right\" || v === \"bottom\" || v === \"left\" ? v : fallback\n}\n\nfunction readSize(key: string, fallback: number): number {\n if (typeof window === \"undefined\") return fallback\n const v = Number(window.localStorage.getItem(`${key}.size`))\n // Persisted as a percentage; ignore anything outside the open (0, 100) range.\n if (!Number.isFinite(v) || v <= 0 || v >= 100) return fallback\n return v\n}\n\nexport function AssistantLayoutProvider({\n children,\n storageKey = \"ts-ui.assistant\",\n defaultDock = \"left\",\n defaultSize = 32,\n defaultVisible = true,\n persist = true,\n}: AssistantLayoutProviderProps) {\n const [dock, setDockState] = React.useState<AssistantDock>(() =>\n persist ? readDock(storageKey, defaultDock) : defaultDock\n )\n const [size, setSizeState] = React.useState<number>(() =>\n persist ? readSize(storageKey, defaultSize) : defaultSize\n )\n const [visible, setVisible] = React.useState(defaultVisible)\n\n const setDock = React.useCallback(\n (next: AssistantDock) => {\n setDockState(next)\n if (persist && typeof window !== \"undefined\")\n window.localStorage.setItem(`${storageKey}.dock`, next)\n },\n [storageKey, persist]\n )\n\n const setSize = React.useCallback(\n (next: number) => {\n setSizeState(next)\n if (persist && typeof window !== \"undefined\")\n window.localStorage.setItem(`${storageKey}.size`, String(Math.round(next)))\n },\n [storageKey, persist]\n )\n\n const value = React.useMemo(\n () => ({ dock, setDock, size, setSize, visible, setVisible }),\n [dock, setDock, size, setSize, visible]\n )\n\n return <AssistantLayoutContext.Provider value={value}>{children}</AssistantLayoutContext.Provider>\n}\n\nexport function useAssistantLayout(): AssistantLayoutContextValue {\n const ctx = React.useContext(AssistantLayoutContext)\n if (!ctx) throw new Error(\"useAssistantLayout must be used within an AssistantLayoutProvider\")\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Dock controls (segmented icon control for a top bar)\n// ---------------------------------------------------------------------------\n\nconst DOCK_OPTIONS: { value: AssistantDock; label: string; Icon: typeof PanelLeft }[] = [\n { value: \"left\", label: \"Dock assistant left\", Icon: PanelLeft },\n { value: \"bottom\", label: \"Dock assistant bottom\", Icon: PanelBottom },\n { value: \"right\", label: \"Dock assistant right\", Icon: PanelRight },\n]\n\nexport interface AssistantDockControlsProps {\n /** Label shown before the icons. Pass `null` to hide it. */\n label?: React.ReactNode\n className?: string\n}\n\n/**\n * Segmented control of dock icons. Clicking an inactive icon docks + shows the\n * assistant there; clicking the active icon again hides it.\n */\nexport function AssistantDockControls({ label = \"AI Assistant\", className }: AssistantDockControlsProps) {\n const { dock, setDock, visible, setVisible } = useAssistantLayout()\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n {label != null && <span className=\"text-sm font-medium\">{label}</span>}\n <div className=\"inline-flex overflow-hidden rounded-lg border border-border\">\n {DOCK_OPTIONS.map(({ value, label: optionLabel, Icon }) => {\n const active = visible && dock === value\n return (\n <Button\n key={value}\n variant={active ? \"secondary\" : \"ghost\"}\n size=\"icon-sm\"\n // bg-clip-border so the filled (active/hover) state reaches the\n // cell edge instead of leaving a 1px gap from the button's\n // transparent border + default bg-clip-padding.\n className=\"rounded-none bg-clip-border\"\n aria-label={active ? \"Hide AI Assistant\" : optionLabel}\n aria-pressed={active}\n title={active ? \"Hide AI Assistant\" : optionLabel}\n onClick={() => {\n if (active) setVisible(false)\n else {\n setDock(value)\n setVisible(true)\n }\n }}\n >\n <Icon className=\"size-4\" />\n </Button>\n )\n })}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Layout body\n// ---------------------------------------------------------------------------\n\n// Each panel is padded so the resize handle sits in a comfortable gutter between\n// the cards rather than a hairline seam (SW-2096). The padding lives inside the\n// panel box, so react-resizable-panels' flex sizing is unaffected.\nconst PANEL_PAD = \"flex min-h-0 min-w-0 p-2\"\n// The visible card surface rendered inside each panel.\nconst CARD_CLASS =\n \"flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden rounded-lg border border-border bg-card\"\n\nconst ASSISTANT_PANEL_ID = \"assistant\"\n\nexport interface AssistantLayoutProps {\n /** The AI Assistant panel content (e.g. a `<Chat />`). */\n assistant: React.ReactNode\n /** The main content; fills the remaining space (and the whole body when the assistant is hidden). */\n children: React.ReactNode\n /** Min assistant size as a percentage of the layout. */\n minSize?: number\n /** Max assistant size as a percentage of the layout. */\n maxSize?: number\n className?: string\n assistantClassName?: string\n contentClassName?: string\n}\n\n/**\n * Docks the assistant left / right / bottom of the main content and resizes it\n * with the design-system `Resizable` (react-resizable-panels). Must be rendered\n * inside an `AssistantLayoutProvider`; pair with `AssistantDockControls`.\n *\n * The group is keyed by `dock`, so changing dock remounts the panels. The\n * assistant panel is therefore re-created on redock (its transient state is not\n * preserved across a dock change) — a deliberate trade-off for using the shared\n * resizable primitive rather than a bespoke splitter.\n */\nexport function AssistantLayout({\n assistant,\n children,\n minSize = 20,\n maxSize = 70,\n className,\n assistantClassName,\n contentClassName,\n}: AssistantLayoutProps) {\n const { dock, size, setSize, visible } = useAssistantLayout()\n const { orientation, assistantFirst } = dockPanels(dock)\n\n // Hidden: no resizable group, content fills the whole body.\n if (!visible) {\n return (\n <div\n data-slot=\"assistant-layout\"\n className={cn(\"flex min-h-0 flex-1 overflow-hidden\", className)}\n >\n {/* flex-1 so the lone content panel fills the width (the ResizablePanel\n self-sizes when visible; this plain div needs to be told to grow).\n Padded to match the inset the visible panels carry. */}\n <div className={cn(PANEL_PAD, \"flex-1\")}>\n <div data-slot=\"assistant-layout-content\" className={cn(CARD_CLASS, contentClassName)}>\n {children}\n </div>\n </div>\n </div>\n )\n }\n\n const assistantPanel = (\n <ResizablePanel\n id={ASSISTANT_PANEL_ID}\n defaultSize={`${size}%`}\n minSize={`${minSize}%`}\n maxSize={`${maxSize}%`}\n className={PANEL_PAD}\n >\n <div data-slot=\"assistant-layout-assistant\" className={cn(CARD_CLASS, assistantClassName)}>\n {assistant}\n </div>\n </ResizablePanel>\n )\n\n const contentPanel = (\n <ResizablePanel id=\"content\" className={PANEL_PAD}>\n <div data-slot=\"assistant-layout-content\" className={cn(CARD_CLASS, contentClassName)}>\n {children}\n </div>\n </ResizablePanel>\n )\n\n return (\n <ResizablePanelGroup\n key={dock}\n orientation={orientation}\n data-slot=\"assistant-layout\"\n className={cn(\"min-h-0 flex-1 overflow-hidden\", className)}\n onLayoutChanged={(layout) => {\n const pct = layout[ASSISTANT_PANEL_ID]\n if (typeof pct === \"number\") setSize(pct)\n }}\n >\n {assistantFirst ? (\n <>\n {assistantPanel}\n <ResizableHandle withHandle />\n {contentPanel}\n </>\n ) : (\n <>\n {contentPanel}\n <ResizableHandle withHandle />\n {assistantPanel}\n </>\n )}\n </ResizablePanelGroup>\n )\n}\n"],"names":["AssistantLayoutContext","React","readDock","key","fallback","v","readSize","AssistantLayoutProvider","children","storageKey","defaultDock","defaultSize","defaultVisible","persist","dock","setDockState","size","setSizeState","visible","setVisible","setDock","next","setSize","value","jsx","useAssistantLayout","ctx","DOCK_OPTIONS","PanelLeft","PanelBottom","PanelRight","AssistantDockControls","label","className","cn","optionLabel","Icon","active","Button","PANEL_PAD","CARD_CLASS","ASSISTANT_PANEL_ID","AssistantLayout","assistant","minSize","maxSize","assistantClassName","contentClassName","orientation","assistantFirst","dockPanels","assistantPanel","ResizablePanel","contentPanel","ResizablePanelGroup","layout","pct","jsxs","Fragment","ResizableHandle"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dockLayout.cjs","sources":["../../../../src/components/composed/AssistantLayout/dockLayout.ts"],"sourcesContent":["/** Where the AI Assistant panel docks relative to the main content. */\nexport type AssistantDock = \"left\" | \"right\" | \"bottom\"\n\nexport interface DockPanels {\n /** Resizable group orientation for this dock. */\n orientation: \"horizontal\" | \"vertical\"\n /** Whether the assistant panel renders before the content panel. */\n assistantFirst: boolean\n}\n\n/**\n * Maps a dock position to the resizable group's orientation and panel order.\n * - left → horizontal, assistant first [assistant | content]\n * - right → horizontal, content first [content | assistant]\n * - bottom → vertical, content first [content / assistant]\n */\nexport function dockPanels(dock: AssistantDock): DockPanels {\n return {\n orientation: dock === \"bottom\" ? \"vertical\" : \"horizontal\",\n assistantFirst: dock === \"left\",\n }\n}\n"],"names":["dockPanels","dock"],"mappings":"gFAgBO,SAASA,EAAWC,EAAiC,CAC1D,MAAO,CACL,YAAaA,IAAS,SAAW,WAAa,aAC9C,eAAgBA,IAAS,MAAA,CAE7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dockLayout.js","sources":["../../../../src/components/composed/AssistantLayout/dockLayout.ts"],"sourcesContent":["/** Where the AI Assistant panel docks relative to the main content. */\nexport type AssistantDock = \"left\" | \"right\" | \"bottom\"\n\nexport interface DockPanels {\n /** Resizable group orientation for this dock. */\n orientation: \"horizontal\" | \"vertical\"\n /** Whether the assistant panel renders before the content panel. */\n assistantFirst: boolean\n}\n\n/**\n * Maps a dock position to the resizable group's orientation and panel order.\n * - left → horizontal, assistant first [assistant | content]\n * - right → horizontal, content first [content | assistant]\n * - bottom → vertical, content first [content / assistant]\n */\nexport function dockPanels(dock: AssistantDock): DockPanels {\n return {\n orientation: dock === \"bottom\" ? \"vertical\" : \"horizontal\",\n assistantFirst: dock === \"left\",\n }\n}\n"],"names":["dockPanels","dock"],"mappings":"AAgBO,SAASA,EAAWC,GAAiC;AAC1D,SAAO;AAAA,IACL,aAAaA,MAAS,WAAW,aAAa;AAAA,IAC9C,gBAAgBA,MAAS;AAAA,EAAA;AAE7B;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),v=require("lucide-react"),a=require("react"),j=require("../../ai/conversation.cjs"),t=require("../../ai/message.cjs"),n=require("../../ai/prompt-input.cjs"),M=require("../../ai/reasoning.cjs"),m=require("../../ai/sources.cjs"),L=require("../../ai/stream-status.cjs"),N=require("../../ai/suggestion.cjs"),O=require("../../../lib/utils.cjs"),z=[{id:"claude-sonnet-4-6",name:"Claude Sonnet"},{id:"claude-opus-4-7",name:"Claude Opus"}],V=["Explain quantum entanglement simply","Write a Python script to rename files","Summarise the latest AI research trends","What is the difference between TCP and UDP?"];let k=0;const w=()=>(k+=1,`chat-msg-${k}`),W=3e3,H=({initialMessages:S=[],models:c=z,defaultModel:d,suggestions:i=V,onSend:h,className:C})=>{const u=a.useId(),[x,b]=a.useState(S),[g,y]=a.useState(""),[I,B]=a.useState(d??c[0]?.id??""),[E,_]=a.useState(!1),[p,f]=a.useState("ready"),[P,T]=a.useState(),D=a.useCallback(async s=>{const r=g.trim();if(!r||p==="streaming")return;const l={id:w(),role:"user",content:r};b(o=>[...o,l]),y(""),f("streaming"),T(new Date);try{const o=await h?.(r,I),F={id:w(),role:"assistant",content:o??"I received your message."};b(G=>[...G,F])}finally{f("ready"),setTimeout(()=>T(void 0),W)}},[g,p,I,h]),U=a.useCallback(s=>{y(s)},[]),R=a.useCallback(s=>{navigator.clipboard.writeText(s).catch(()=>{})},[]),q=a.useCallback(s=>{b(r=>{const l=r.findIndex(o=>o.id===s);return l===-1?r:r.slice(0,l)})},[]);return e.jsxs("div",{className:O.cn("mx-auto flex h-full w-full max-w-[980px] flex-col",C),children:[e.jsxs(j.Conversation,{className:"flex-1",children:[e.jsxs(j.ConversationContent,{children:[x.length===0?e.jsx(j.ConversationEmptyState,{description:"Send a message or pick a suggestion below to start.",title:"Start a conversation"}):null,x.map((s,r)=>e.jsxs("div",{className:"space-y-1",children:[s.role==="assistant"&&s.branches&&s.branches.length>1?e.jsxs(t.MessageBranch,{children:[e.jsx(t.MessageBranchContent,{children:s.branches.map((l,o)=>e.jsx(A,{content:l,id:s.id,onCopy:R,onRetry:q,reasoning:o===0?s.reasoning:void 0,sources:o===0?s.sources:void 0},o))}),e.jsx(t.MessageToolbar,{children:e.jsxs(t.MessageBranchSelector,{children:[e.jsx(t.MessageBranchPrevious,{}),e.jsx(t.MessageBranchPage,{}),e.jsx(t.MessageBranchNext,{})]})})]}):s.role==="assistant"?e.jsx(e.Fragment,{children:e.jsx(A,{content:s.content,id:s.id,onCopy:R,onRetry:q,reasoning:s.reasoning,sources:s.sources})}):e.jsx(t.Message,{from:"user",children:e.jsx(t.MessageContent,{children:e.jsx(t.MessageResponse,{children:s.content})})}),r===x.length-1&&P&&e.jsx("div",{className:"mt-3",children:e.jsx(L.StreamStatus,{iconVariant:"loader-circle",isStreaming:p==="streaming",startTime:P})})]},s.id))]}),e.jsx(j.ConversationScrollButton,{})]}),x.length===0&&i.length>0&&e.jsx("div",{className:"px-4 pb-2",children:e.jsx(N.Suggestions,{children:i.map(s=>e.jsx(N.Suggestion,{onClick:U,suggestion:s},s))})}),e.jsx("div",{className:"px-4 pt-3 pb-4",children:e.jsxs(n.PromptInput,{onSubmit:D,children:[e.jsx(n.PromptInputBody,{children:e.jsx(n.PromptInputTextarea,{"aria-labelledby":u,onChange:s=>y(s.target.value),placeholder:"Ask anything...",value:g})}),e.jsxs(n.PromptInputFooter,{children:[e.jsxs(n.PromptInputTools,{children:[c.length>1&&e.jsxs(n.PromptInputSelect,{onValueChange:B,value:I,children:[e.jsx(n.PromptInputSelectTrigger,{children:e.jsx(n.PromptInputSelectValue,{})}),e.jsx(n.PromptInputSelectContent,{children:c.map(s=>e.jsx(n.PromptInputSelectItem,{value:s.id,children:s.name},s.id))})]}),e.jsxs(n.PromptInputButton,{onClick:()=>_(s=>!s),tooltip:{content:"Search the web"},variant:E?"default":"ghost",children:[e.jsx(v.GlobeIcon,{size:16}),e.jsx("span",{children:"Search"})]})]}),e.jsx(n.PromptInputSubmit,{disabled:!g.trim(),status:p})]})]})})]})},A=({id:S,content:c,reasoning:d,sources:i,onCopy:h,onRetry:C})=>e.jsxs("div",{className:"space-y-2",children:[d&&e.jsxs(M.Reasoning,{children:[e.jsx(M.ReasoningTrigger,{}),e.jsx(M.ReasoningContent,{children:d})]}),e.jsx(t.Message,{from:"assistant",children:e.jsx(t.MessageContent,{children:e.jsx(t.MessageResponse,{children:c})})}),i&&i.length>0&&e.jsxs(m.Sources,{children:[e.jsx(m.SourcesTrigger,{count:i.length}),e.jsx(m.SourcesContent,{children:i.map(u=>e.jsx(m.Source,{href:u.href,title:u.title},u.href))})]}),e.jsxs(t.MessageActions,{children:[e.jsx(t.MessageAction,{label:"Copy",onClick:()=>h(c),children:e.jsx(v.CopyIcon,{className:"size-3"})}),e.jsx(t.MessageAction,{label:"Retry",onClick:()=>C(S),children:e.jsx(v.RefreshCcwIcon,{className:"size-3"})})]})]});exports.Chat=H;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),v=require("lucide-react"),a=require("react"),j=require("../../ai/conversation.cjs"),t=require("../../ai/message.cjs"),n=require("../../ai/prompt-input.cjs"),M=require("../../ai/reasoning.cjs"),m=require("../../ai/sources.cjs"),L=require("../../ai/stream-status.cjs"),N=require("../../ai/suggestion.cjs"),O=require("../../../lib/utils.cjs"),z=[{id:"claude-sonnet-4-6",name:"Claude Sonnet"},{id:"claude-opus-4-7",name:"Claude Opus"}],V=["Explain quantum entanglement simply","Write a Python script to rename files","Summarise the latest AI research trends","What is the difference between TCP and UDP?"];let k=0;const w=()=>(k+=1,`chat-msg-${k}`),W=3e3,H=({initialMessages:S=[],models:c=z,defaultModel:d,suggestions:i=V,onSend:h,className:C})=>{const u=a.useId(),[x,b]=a.useState(S),[g,y]=a.useState(""),[I,B]=a.useState(d??c[0]?.id??""),[E,_]=a.useState(!1),[p,f]=a.useState("ready"),[P,T]=a.useState(),D=a.useCallback(async s=>{const r=g.trim();if(!r||p==="streaming")return;const l={id:w(),role:"user",content:r};b(o=>[...o,l]),y(""),f("streaming"),T(new Date);try{const o=await h?.(r,I),F={id:w(),role:"assistant",content:o??"I received your message."};b(G=>[...G,F])}finally{f("ready"),setTimeout(()=>T(void 0),W)}},[g,p,I,h]),U=a.useCallback(s=>{y(s)},[]),R=a.useCallback(s=>{navigator.clipboard.writeText(s).catch(()=>{})},[]),q=a.useCallback(s=>{b(r=>{const l=r.findIndex(o=>o.id===s);return l===-1?r:r.slice(0,l)})},[]);return e.jsxs("div",{className:O.cn("mx-auto flex h-full w-full max-w-[980px] flex-col",C),children:[e.jsxs(j.Conversation,{className:"flex-1",children:[e.jsxs(j.ConversationContent,{children:[x.length===0?e.jsx(j.ConversationEmptyState,{description:"Send a message or pick a suggestion below to start.",title:"Start a conversation"}):null,x.map((s,r)=>e.jsxs("div",{className:"space-y-1",children:[s.role==="assistant"&&s.branches&&s.branches.length>1?e.jsxs(t.MessageBranch,{children:[e.jsx(t.MessageBranchContent,{children:s.branches.map((l,o)=>e.jsx(A,{content:l,id:s.id,onCopy:R,onRetry:q,reasoning:o===0?s.reasoning:void 0,sources:o===0?s.sources:void 0},o))}),e.jsx(t.MessageToolbar,{children:e.jsxs(t.MessageBranchSelector,{children:[e.jsx(t.MessageBranchPrevious,{}),e.jsx(t.MessageBranchPage,{}),e.jsx(t.MessageBranchNext,{})]})})]}):s.role==="assistant"?e.jsx(e.Fragment,{children:e.jsx(A,{content:s.content,id:s.id,onCopy:R,onRetry:q,reasoning:s.reasoning,sources:s.sources})}):e.jsx(t.Message,{from:"user",children:e.jsx(t.MessageContent,{children:e.jsx(t.MessageResponse,{children:s.content})})}),r===x.length-1&&P&&e.jsx("div",{className:"mt-3",children:e.jsx(L.StreamStatus,{iconVariant:"loader-circle",isStreaming:p==="streaming",startTime:P})})]},s.id))]}),e.jsx(j.ConversationScrollButton,{})]}),x.length===0&&i.length>0&&e.jsx("div",{className:"px-4 pb-2",children:e.jsx(N.Suggestions,{children:i.map(s=>e.jsx(N.Suggestion,{onClick:U,suggestion:s},s))})}),e.jsx("div",{className:"px-4 pt-3 pb-4",children:e.jsxs(n.PromptInput,{onSubmit:D,children:[e.jsx(n.PromptInputBody,{children:e.jsx(n.PromptInputTextarea,{"aria-labelledby":u,onChange:s=>y(s.target.value),placeholder:"Ask anything...",value:g})}),e.jsxs(n.PromptInputFooter,{children:[e.jsxs(n.PromptInputTools,{children:[c.length>1&&e.jsxs(n.PromptInputSelect,{onValueChange:B,value:I,children:[e.jsx(n.PromptInputSelectTrigger,{"aria-label":"Select model",children:e.jsx(n.PromptInputSelectValue,{})}),e.jsx(n.PromptInputSelectContent,{children:c.map(s=>e.jsx(n.PromptInputSelectItem,{value:s.id,children:s.name},s.id))})]}),e.jsxs(n.PromptInputButton,{onClick:()=>_(s=>!s),tooltip:{content:"Search the web"},variant:E?"default":"ghost",children:[e.jsx(v.GlobeIcon,{size:16}),e.jsx("span",{children:"Search"})]})]}),e.jsx(n.PromptInputSubmit,{disabled:!g.trim(),status:p})]})]})})]})},A=({id:S,content:c,reasoning:d,sources:i,onCopy:h,onRetry:C})=>e.jsxs("div",{className:"space-y-2",children:[d&&e.jsxs(M.Reasoning,{children:[e.jsx(M.ReasoningTrigger,{}),e.jsx(M.ReasoningContent,{children:d})]}),e.jsx(t.Message,{from:"assistant",children:e.jsx(t.MessageContent,{children:e.jsx(t.MessageResponse,{children:c})})}),i&&i.length>0&&e.jsxs(m.Sources,{children:[e.jsx(m.SourcesTrigger,{count:i.length}),e.jsx(m.SourcesContent,{children:i.map(u=>e.jsx(m.Source,{href:u.href,title:u.title},u.href))})]}),e.jsxs(t.MessageActions,{children:[e.jsx(t.MessageAction,{label:"Copy",onClick:()=>h(c),children:e.jsx(v.CopyIcon,{className:"size-3"})}),e.jsx(t.MessageAction,{label:"Retry",onClick:()=>C(S),children:e.jsx(v.RefreshCcwIcon,{className:"size-3"})})]})]});exports.Chat=H;
|
|
2
2
|
//# sourceMappingURL=Chat.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat.cjs","sources":["../../../../src/components/composed/Chat/Chat.tsx"],"sourcesContent":["import { CopyIcon, GlobeIcon, RefreshCcwIcon } from \"lucide-react\"\nimport { useCallback, useId, useState } from \"react\"\n\nimport {\n Conversation,\n ConversationContent,\n ConversationEmptyState,\n ConversationScrollButton,\n} from \"@/components/ai/conversation\"\nimport {\n Message,\n MessageAction,\n MessageActions,\n MessageBranch,\n MessageBranchContent,\n MessageBranchNext,\n MessageBranchPage,\n MessageBranchPrevious,\n MessageBranchSelector,\n MessageContent,\n MessageResponse,\n MessageToolbar,\n} from \"@/components/ai/message\"\nimport {\n PromptInput,\n PromptInputBody,\n PromptInputButton,\n PromptInputFooter,\n PromptInputSelect,\n PromptInputSelectContent,\n PromptInputSelectItem,\n PromptInputSelectTrigger,\n PromptInputSelectValue,\n PromptInputSubmit,\n PromptInputTextarea,\n PromptInputTools,\n type PromptInputMessage,\n} from \"@/components/ai/prompt-input\"\nimport { Reasoning, ReasoningContent, ReasoningTrigger } from \"@/components/ai/reasoning\"\nimport { Source, Sources, SourcesContent, SourcesTrigger } from \"@/components/ai/sources\"\nimport { StreamStatus } from \"@/components/ai/stream-status\"\nimport { Suggestion, Suggestions } from \"@/components/ai/suggestion\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ChatSource {\n href: string\n title: string\n}\n\nexport interface ChatMessage {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n /** Displayed in a collapsible Reasoning panel above the message content. */\n reasoning?: string\n /** Web sources used to produce this message. */\n sources?: ChatSource[]\n /** Multiple alternative responses (for branching). When provided, the\n * array should include `content` as one of its items. */\n branches?: string[]\n}\n\nexport interface ChatModel {\n id: string\n name: string\n}\n\nexport interface ChatProps {\n /** Initial messages to pre-populate the conversation. */\n initialMessages?: ChatMessage[]\n /** Available models shown in the model-selector dropdown. */\n models?: ChatModel[]\n /** Initial model id. Defaults to the first model in `models`. */\n defaultModel?: string\n /** Suggestion chips shown when the conversation is empty. */\n suggestions?: string[]\n /** Called when the user submits a message. The returned string (if any)\n * will be appended as the assistant's reply. Defaults to a no-op. */\n onSend?: (message: string, model: string) => Promise<string | undefined> | string | undefined\n className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Default values\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MODELS: ChatModel[] = [\n { id: \"claude-sonnet-4-6\", name: \"Claude Sonnet\" },\n { id: \"claude-opus-4-7\", name: \"Claude Opus\" },\n]\n\nconst DEFAULT_SUGGESTIONS = [\n \"Explain quantum entanglement simply\",\n \"Write a Python script to rename files\",\n \"Summarise the latest AI research trends\",\n \"What is the difference between TCP and UDP?\",\n]\n\nlet _idCounter = 0\nconst nextId = () => {\n _idCounter += 1\n return `chat-msg-${_idCounter}`\n}\n\nconst STREAM_STATUS_LINGER_MS = 3000\n\n// ---------------------------------------------------------------------------\n// Chat component\n// ---------------------------------------------------------------------------\n\nexport const Chat = ({\n initialMessages = [],\n models = DEFAULT_MODELS,\n defaultModel,\n suggestions = DEFAULT_SUGGESTIONS,\n onSend,\n className,\n}: ChatProps) => {\n const labelId = useId()\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages)\n const [text, setText] = useState(\"\")\n const [model, setModel] = useState(defaultModel ?? models[0]?.id ?? \"\")\n const [webSearch, setWebSearch] = useState(false)\n const [status, setStatus] = useState<\"ready\" | \"streaming\">(\"ready\")\n const [streamStart, setStreamStart] = useState<Date | undefined>()\n\n const handleSubmit = useCallback(\n async (_msg: PromptInputMessage) => {\n const trimmed = text.trim()\n if (!trimmed || status === \"streaming\") return\n\n const userMsg: ChatMessage = {\n id: nextId(),\n role: \"user\",\n content: trimmed,\n }\n setMessages((prev) => [...prev, userMsg])\n setText(\"\")\n setStatus(\"streaming\")\n setStreamStart(new Date())\n\n try {\n const reply = await onSend?.(trimmed, model)\n const assistantMsg: ChatMessage = {\n id: nextId(),\n role: \"assistant\",\n content: reply ?? \"I received your message.\",\n }\n setMessages((prev) => [...prev, assistantMsg])\n } finally {\n setStatus(\"ready\")\n // Keep streamStart briefly so the bubble-confirm ripple can play out\n setTimeout(() => setStreamStart(undefined), STREAM_STATUS_LINGER_MS)\n }\n },\n [text, status, model, onSend],\n )\n\n const handleSuggestion = useCallback((suggestion: string) => {\n setText(suggestion)\n }, [])\n\n const handleCopy = useCallback((content: string) => {\n navigator.clipboard.writeText(content).catch(() => {})\n }, [])\n\n const handleRetry = useCallback((id: string) => {\n setMessages((prev) => {\n const idx = prev.findIndex((m) => m.id === id)\n if (idx === -1) return prev\n return prev.slice(0, idx)\n })\n }, [])\n\n return (\n <div className={cn(\"mx-auto flex h-full w-full max-w-[980px] flex-col\", className)}>\n {/* Conversation */}\n <Conversation className=\"flex-1\">\n <ConversationContent>\n {messages.length === 0 ? (\n <ConversationEmptyState\n description=\"Send a message or pick a suggestion below to start.\"\n title=\"Start a conversation\"\n />\n ) : null}\n\n {messages.map((msg, index) => (\n <div className=\"space-y-1\" key={msg.id}>\n {/* Branch wrapper — renders alt responses side-by-side when branches exist */}\n {msg.role === \"assistant\" && msg.branches && msg.branches.length > 1 ? (\n <MessageBranch>\n <MessageBranchContent>\n {msg.branches.map((branch, i) => (\n <AssistantMessage\n key={i}\n content={branch}\n id={msg.id}\n onCopy={handleCopy}\n onRetry={handleRetry}\n reasoning={i === 0 ? msg.reasoning : undefined}\n sources={i === 0 ? msg.sources : undefined}\n />\n ))}\n </MessageBranchContent>\n <MessageToolbar>\n <MessageBranchSelector>\n <MessageBranchPrevious />\n <MessageBranchPage />\n <MessageBranchNext />\n </MessageBranchSelector>\n </MessageToolbar>\n </MessageBranch>\n ) : msg.role === \"assistant\" ? (\n <>\n <AssistantMessage\n content={msg.content}\n id={msg.id}\n onCopy={handleCopy}\n onRetry={handleRetry}\n reasoning={msg.reasoning}\n sources={msg.sources}\n />\n </>\n ) : (\n <Message from=\"user\">\n <MessageContent>\n <MessageResponse>{msg.content}</MessageResponse>\n </MessageContent>\n </Message>\n )}\n\n {index === messages.length - 1 && streamStart && (\n <div className=\"mt-3\">\n <StreamStatus\n iconVariant=\"loader-circle\"\n isStreaming={status === \"streaming\"}\n startTime={streamStart}\n />\n </div>\n )}\n </div>\n ))}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n\n {/* Suggestions — only shown when conversation is empty */}\n {messages.length === 0 && suggestions.length > 0 && (\n <div className=\"px-4 pb-2\">\n <Suggestions>\n {suggestions.map((s) => (\n <Suggestion key={s} onClick={handleSuggestion} suggestion={s} />\n ))}\n </Suggestions>\n </div>\n )}\n\n {/* Prompt input */}\n <div className=\"px-4 pt-3 pb-4\">\n <PromptInput onSubmit={handleSubmit}>\n <PromptInputBody>\n <PromptInputTextarea\n aria-labelledby={labelId}\n onChange={(e) => setText(e.target.value)}\n placeholder=\"Ask anything...\"\n value={text}\n />\n </PromptInputBody>\n <PromptInputFooter>\n <PromptInputTools>\n {/* Model selector */}\n {models.length > 1 && (\n <PromptInputSelect onValueChange={setModel} value={model}>\n <PromptInputSelectTrigger>\n <PromptInputSelectValue />\n </PromptInputSelectTrigger>\n <PromptInputSelectContent>\n {models.map((m) => (\n <PromptInputSelectItem key={m.id} value={m.id}>\n {m.name}\n </PromptInputSelectItem>\n ))}\n </PromptInputSelectContent>\n </PromptInputSelect>\n )}\n\n {/* Web search toggle */}\n <PromptInputButton\n onClick={() => setWebSearch((v) => !v)}\n tooltip={{ content: \"Search the web\" }}\n variant={webSearch ? \"default\" : \"ghost\"}\n >\n <GlobeIcon size={16} />\n <span>Search</span>\n </PromptInputButton>\n </PromptInputTools>\n\n <PromptInputSubmit disabled={!text.trim()} status={status} />\n </PromptInputFooter>\n </PromptInput>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Internal sub-component for assistant messages\n// ---------------------------------------------------------------------------\n\ninterface AssistantMessageProps {\n id: string\n content: string\n reasoning?: string\n sources?: ChatSource[]\n onCopy: (content: string) => void\n onRetry: (id: string) => void\n}\n\nconst AssistantMessage = ({ id, content, reasoning, sources, onCopy, onRetry }: AssistantMessageProps) => (\n <div className=\"space-y-2\">\n {reasoning && (\n <Reasoning>\n <ReasoningTrigger />\n <ReasoningContent>{reasoning}</ReasoningContent>\n </Reasoning>\n )}\n\n <Message from=\"assistant\">\n <MessageContent>\n <MessageResponse>{content}</MessageResponse>\n </MessageContent>\n </Message>\n\n {sources && sources.length > 0 && (\n <Sources>\n <SourcesTrigger count={sources.length} />\n <SourcesContent>\n {sources.map((s) => (\n <Source href={s.href} key={s.href} title={s.title} />\n ))}\n </SourcesContent>\n </Sources>\n )}\n\n <MessageActions>\n <MessageAction label=\"Copy\" onClick={() => onCopy(content)}>\n <CopyIcon className=\"size-3\" />\n </MessageAction>\n <MessageAction label=\"Retry\" onClick={() => onRetry(id)}>\n <RefreshCcwIcon className=\"size-3\" />\n </MessageAction>\n </MessageActions>\n </div>\n)\n"],"names":["DEFAULT_MODELS","DEFAULT_SUGGESTIONS","_idCounter","nextId","STREAM_STATUS_LINGER_MS","Chat","initialMessages","models","defaultModel","suggestions","onSend","className","labelId","useId","messages","setMessages","useState","text","setText","model","setModel","webSearch","setWebSearch","status","setStatus","streamStart","setStreamStart","handleSubmit","useCallback","_msg","trimmed","userMsg","prev","reply","assistantMsg","handleSuggestion","suggestion","handleCopy","content","handleRetry","id","idx","m","cn","jsxs","Conversation","ConversationContent","jsx","ConversationEmptyState","msg","index","MessageBranch","MessageBranchContent","branch","i","AssistantMessage","MessageToolbar","MessageBranchSelector","MessageBranchPrevious","MessageBranchPage","MessageBranchNext","Fragment","Message","MessageContent","MessageResponse","StreamStatus","ConversationScrollButton","Suggestions","Suggestion","PromptInput","PromptInputBody","PromptInputTextarea","e","PromptInputFooter","PromptInputTools","PromptInputSelect","PromptInputSelectTrigger","PromptInputSelectValue","PromptInputSelectContent","PromptInputSelectItem","PromptInputButton","v","GlobeIcon","PromptInputSubmit","reasoning","sources","onCopy","onRetry","Reasoning","ReasoningTrigger","ReasoningContent","Sources","SourcesTrigger","SourcesContent","s","Source","MessageActions","MessageAction","CopyIcon","RefreshCcwIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Chat.cjs","sources":["../../../../src/components/composed/Chat/Chat.tsx"],"sourcesContent":["import { CopyIcon, GlobeIcon, RefreshCcwIcon } from \"lucide-react\"\nimport { useCallback, useId, useState } from \"react\"\n\nimport {\n Conversation,\n ConversationContent,\n ConversationEmptyState,\n ConversationScrollButton,\n} from \"@/components/ai/conversation\"\nimport {\n Message,\n MessageAction,\n MessageActions,\n MessageBranch,\n MessageBranchContent,\n MessageBranchNext,\n MessageBranchPage,\n MessageBranchPrevious,\n MessageBranchSelector,\n MessageContent,\n MessageResponse,\n MessageToolbar,\n} from \"@/components/ai/message\"\nimport {\n PromptInput,\n PromptInputBody,\n PromptInputButton,\n PromptInputFooter,\n PromptInputSelect,\n PromptInputSelectContent,\n PromptInputSelectItem,\n PromptInputSelectTrigger,\n PromptInputSelectValue,\n PromptInputSubmit,\n PromptInputTextarea,\n PromptInputTools,\n type PromptInputMessage,\n} from \"@/components/ai/prompt-input\"\nimport { Reasoning, ReasoningContent, ReasoningTrigger } from \"@/components/ai/reasoning\"\nimport { Source, Sources, SourcesContent, SourcesTrigger } from \"@/components/ai/sources\"\nimport { StreamStatus } from \"@/components/ai/stream-status\"\nimport { Suggestion, Suggestions } from \"@/components/ai/suggestion\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ChatSource {\n href: string\n title: string\n}\n\nexport interface ChatMessage {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n /** Displayed in a collapsible Reasoning panel above the message content. */\n reasoning?: string\n /** Web sources used to produce this message. */\n sources?: ChatSource[]\n /** Multiple alternative responses (for branching). When provided, the\n * array should include `content` as one of its items. */\n branches?: string[]\n}\n\nexport interface ChatModel {\n id: string\n name: string\n}\n\nexport interface ChatProps {\n /** Initial messages to pre-populate the conversation. */\n initialMessages?: ChatMessage[]\n /** Available models shown in the model-selector dropdown. */\n models?: ChatModel[]\n /** Initial model id. Defaults to the first model in `models`. */\n defaultModel?: string\n /** Suggestion chips shown when the conversation is empty. */\n suggestions?: string[]\n /** Called when the user submits a message. The returned string (if any)\n * will be appended as the assistant's reply. Defaults to a no-op. */\n onSend?: (message: string, model: string) => Promise<string | undefined> | string | undefined\n className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Default values\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MODELS: ChatModel[] = [\n { id: \"claude-sonnet-4-6\", name: \"Claude Sonnet\" },\n { id: \"claude-opus-4-7\", name: \"Claude Opus\" },\n]\n\nconst DEFAULT_SUGGESTIONS = [\n \"Explain quantum entanglement simply\",\n \"Write a Python script to rename files\",\n \"Summarise the latest AI research trends\",\n \"What is the difference between TCP and UDP?\",\n]\n\nlet _idCounter = 0\nconst nextId = () => {\n _idCounter += 1\n return `chat-msg-${_idCounter}`\n}\n\nconst STREAM_STATUS_LINGER_MS = 3000\n\n// ---------------------------------------------------------------------------\n// Chat component\n// ---------------------------------------------------------------------------\n\nexport const Chat = ({\n initialMessages = [],\n models = DEFAULT_MODELS,\n defaultModel,\n suggestions = DEFAULT_SUGGESTIONS,\n onSend,\n className,\n}: ChatProps) => {\n const labelId = useId()\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages)\n const [text, setText] = useState(\"\")\n const [model, setModel] = useState(defaultModel ?? models[0]?.id ?? \"\")\n const [webSearch, setWebSearch] = useState(false)\n const [status, setStatus] = useState<\"ready\" | \"streaming\">(\"ready\")\n const [streamStart, setStreamStart] = useState<Date | undefined>()\n\n const handleSubmit = useCallback(\n async (_msg: PromptInputMessage) => {\n const trimmed = text.trim()\n if (!trimmed || status === \"streaming\") return\n\n const userMsg: ChatMessage = {\n id: nextId(),\n role: \"user\",\n content: trimmed,\n }\n setMessages((prev) => [...prev, userMsg])\n setText(\"\")\n setStatus(\"streaming\")\n setStreamStart(new Date())\n\n try {\n const reply = await onSend?.(trimmed, model)\n const assistantMsg: ChatMessage = {\n id: nextId(),\n role: \"assistant\",\n content: reply ?? \"I received your message.\",\n }\n setMessages((prev) => [...prev, assistantMsg])\n } finally {\n setStatus(\"ready\")\n // Keep streamStart briefly so the bubble-confirm ripple can play out\n setTimeout(() => setStreamStart(undefined), STREAM_STATUS_LINGER_MS)\n }\n },\n [text, status, model, onSend],\n )\n\n const handleSuggestion = useCallback((suggestion: string) => {\n setText(suggestion)\n }, [])\n\n const handleCopy = useCallback((content: string) => {\n navigator.clipboard.writeText(content).catch(() => {})\n }, [])\n\n const handleRetry = useCallback((id: string) => {\n setMessages((prev) => {\n const idx = prev.findIndex((m) => m.id === id)\n if (idx === -1) return prev\n return prev.slice(0, idx)\n })\n }, [])\n\n return (\n <div className={cn(\"mx-auto flex h-full w-full max-w-[980px] flex-col\", className)}>\n {/* Conversation */}\n <Conversation className=\"flex-1\">\n <ConversationContent>\n {messages.length === 0 ? (\n <ConversationEmptyState\n description=\"Send a message or pick a suggestion below to start.\"\n title=\"Start a conversation\"\n />\n ) : null}\n\n {messages.map((msg, index) => (\n <div className=\"space-y-1\" key={msg.id}>\n {/* Branch wrapper — renders alt responses side-by-side when branches exist */}\n {msg.role === \"assistant\" && msg.branches && msg.branches.length > 1 ? (\n <MessageBranch>\n <MessageBranchContent>\n {msg.branches.map((branch, i) => (\n <AssistantMessage\n key={i}\n content={branch}\n id={msg.id}\n onCopy={handleCopy}\n onRetry={handleRetry}\n reasoning={i === 0 ? msg.reasoning : undefined}\n sources={i === 0 ? msg.sources : undefined}\n />\n ))}\n </MessageBranchContent>\n <MessageToolbar>\n <MessageBranchSelector>\n <MessageBranchPrevious />\n <MessageBranchPage />\n <MessageBranchNext />\n </MessageBranchSelector>\n </MessageToolbar>\n </MessageBranch>\n ) : msg.role === \"assistant\" ? (\n <>\n <AssistantMessage\n content={msg.content}\n id={msg.id}\n onCopy={handleCopy}\n onRetry={handleRetry}\n reasoning={msg.reasoning}\n sources={msg.sources}\n />\n </>\n ) : (\n <Message from=\"user\">\n <MessageContent>\n <MessageResponse>{msg.content}</MessageResponse>\n </MessageContent>\n </Message>\n )}\n\n {index === messages.length - 1 && streamStart && (\n <div className=\"mt-3\">\n <StreamStatus\n iconVariant=\"loader-circle\"\n isStreaming={status === \"streaming\"}\n startTime={streamStart}\n />\n </div>\n )}\n </div>\n ))}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n\n {/* Suggestions — only shown when conversation is empty */}\n {messages.length === 0 && suggestions.length > 0 && (\n <div className=\"px-4 pb-2\">\n <Suggestions>\n {suggestions.map((s) => (\n <Suggestion key={s} onClick={handleSuggestion} suggestion={s} />\n ))}\n </Suggestions>\n </div>\n )}\n\n {/* Prompt input */}\n <div className=\"px-4 pt-3 pb-4\">\n <PromptInput onSubmit={handleSubmit}>\n <PromptInputBody>\n <PromptInputTextarea\n aria-labelledby={labelId}\n onChange={(e) => setText(e.target.value)}\n placeholder=\"Ask anything...\"\n value={text}\n />\n </PromptInputBody>\n <PromptInputFooter>\n <PromptInputTools>\n {/* Model selector */}\n {models.length > 1 && (\n <PromptInputSelect onValueChange={setModel} value={model}>\n <PromptInputSelectTrigger aria-label=\"Select model\">\n <PromptInputSelectValue />\n </PromptInputSelectTrigger>\n <PromptInputSelectContent>\n {models.map((m) => (\n <PromptInputSelectItem key={m.id} value={m.id}>\n {m.name}\n </PromptInputSelectItem>\n ))}\n </PromptInputSelectContent>\n </PromptInputSelect>\n )}\n\n {/* Web search toggle */}\n <PromptInputButton\n onClick={() => setWebSearch((v) => !v)}\n tooltip={{ content: \"Search the web\" }}\n variant={webSearch ? \"default\" : \"ghost\"}\n >\n <GlobeIcon size={16} />\n <span>Search</span>\n </PromptInputButton>\n </PromptInputTools>\n\n <PromptInputSubmit disabled={!text.trim()} status={status} />\n </PromptInputFooter>\n </PromptInput>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Internal sub-component for assistant messages\n// ---------------------------------------------------------------------------\n\ninterface AssistantMessageProps {\n id: string\n content: string\n reasoning?: string\n sources?: ChatSource[]\n onCopy: (content: string) => void\n onRetry: (id: string) => void\n}\n\nconst AssistantMessage = ({ id, content, reasoning, sources, onCopy, onRetry }: AssistantMessageProps) => (\n <div className=\"space-y-2\">\n {reasoning && (\n <Reasoning>\n <ReasoningTrigger />\n <ReasoningContent>{reasoning}</ReasoningContent>\n </Reasoning>\n )}\n\n <Message from=\"assistant\">\n <MessageContent>\n <MessageResponse>{content}</MessageResponse>\n </MessageContent>\n </Message>\n\n {sources && sources.length > 0 && (\n <Sources>\n <SourcesTrigger count={sources.length} />\n <SourcesContent>\n {sources.map((s) => (\n <Source href={s.href} key={s.href} title={s.title} />\n ))}\n </SourcesContent>\n </Sources>\n )}\n\n <MessageActions>\n <MessageAction label=\"Copy\" onClick={() => onCopy(content)}>\n <CopyIcon className=\"size-3\" />\n </MessageAction>\n <MessageAction label=\"Retry\" onClick={() => onRetry(id)}>\n <RefreshCcwIcon className=\"size-3\" />\n </MessageAction>\n </MessageActions>\n </div>\n)\n"],"names":["DEFAULT_MODELS","DEFAULT_SUGGESTIONS","_idCounter","nextId","STREAM_STATUS_LINGER_MS","Chat","initialMessages","models","defaultModel","suggestions","onSend","className","labelId","useId","messages","setMessages","useState","text","setText","model","setModel","webSearch","setWebSearch","status","setStatus","streamStart","setStreamStart","handleSubmit","useCallback","_msg","trimmed","userMsg","prev","reply","assistantMsg","handleSuggestion","suggestion","handleCopy","content","handleRetry","id","idx","m","cn","jsxs","Conversation","ConversationContent","jsx","ConversationEmptyState","msg","index","MessageBranch","MessageBranchContent","branch","i","AssistantMessage","MessageToolbar","MessageBranchSelector","MessageBranchPrevious","MessageBranchPage","MessageBranchNext","Fragment","Message","MessageContent","MessageResponse","StreamStatus","ConversationScrollButton","Suggestions","Suggestion","PromptInput","PromptInputBody","PromptInputTextarea","e","PromptInputFooter","PromptInputTools","PromptInputSelect","PromptInputSelectTrigger","PromptInputSelectValue","PromptInputSelectContent","PromptInputSelectItem","PromptInputButton","v","GlobeIcon","PromptInputSubmit","reasoning","sources","onCopy","onRetry","Reasoning","ReasoningTrigger","ReasoningContent","Sources","SourcesTrigger","SourcesContent","s","Source","MessageActions","MessageAction","CopyIcon","RefreshCcwIcon"],"mappings":"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"}
|
|
@@ -3,9 +3,9 @@ import { GlobeIcon as O, CopyIcon as V, RefreshCcwIcon as W } from "lucide-react
|
|
|
3
3
|
import { useId as j, useState as c, useCallback as g } from "react";
|
|
4
4
|
import { Conversation as q, ConversationContent as $, ConversationEmptyState as H, ConversationScrollButton as J } from "../../ai/conversation.js";
|
|
5
5
|
import { MessageBranch as K, MessageBranchContent as Q, MessageToolbar as X, MessageBranchSelector as Y, MessageBranchPrevious as Z, MessageBranchPage as ee, MessageBranchNext as te, Message as A, MessageContent as B, MessageResponse as E, MessageActions as ne, MessageAction as T } from "../../ai/message.js";
|
|
6
|
-
import { PromptInput as re, PromptInputBody as ae, PromptInputTextarea as
|
|
6
|
+
import { PromptInput as re, PromptInputBody as ae, PromptInputTextarea as oe, PromptInputFooter as se, PromptInputTools as ie, PromptInputSelect as ce, PromptInputSelectTrigger as le, PromptInputSelectValue as de, PromptInputSelectContent as he, PromptInputSelectItem as me, PromptInputButton as pe, PromptInputSubmit as ue } from "../../ai/prompt-input.js";
|
|
7
7
|
import { Reasoning as ge, ReasoningTrigger as Se, ReasoningContent as fe } from "../../ai/reasoning.js";
|
|
8
|
-
import { Sources as Ce, SourcesTrigger as
|
|
8
|
+
import { Sources as Ce, SourcesTrigger as be, SourcesContent as ye, Source as Ie } from "../../ai/sources.js";
|
|
9
9
|
import { StreamStatus as ve } from "../../ai/stream-status.js";
|
|
10
10
|
import { Suggestions as xe, Suggestion as Me } from "../../ai/suggestion.js";
|
|
11
11
|
import { cn as Pe } from "../../../lib/utils.js";
|
|
@@ -21,13 +21,13 @@ const Te = [
|
|
|
21
21
|
let N = 0;
|
|
22
22
|
const R = () => (N += 1, `chat-msg-${N}`), Re = 3e3, ze = ({
|
|
23
23
|
initialMessages: S = [],
|
|
24
|
-
models:
|
|
24
|
+
models: s = Te,
|
|
25
25
|
defaultModel: d,
|
|
26
|
-
suggestions:
|
|
26
|
+
suggestions: o = Ne,
|
|
27
27
|
onSend: h,
|
|
28
28
|
className: f
|
|
29
29
|
}) => {
|
|
30
|
-
const l = j(), [m, C] = c(S), [p,
|
|
30
|
+
const l = j(), [m, C] = c(S), [p, b] = c(""), [y, k] = c(d ?? s[0]?.id ?? ""), [_, D] = c(!1), [u, I] = c("ready"), [v, x] = c(), U = g(
|
|
31
31
|
async (t) => {
|
|
32
32
|
const r = p.trim();
|
|
33
33
|
if (!r || u === "streaming") return;
|
|
@@ -36,21 +36,21 @@ const R = () => (N += 1, `chat-msg-${N}`), Re = 3e3, ze = ({
|
|
|
36
36
|
role: "user",
|
|
37
37
|
content: r
|
|
38
38
|
};
|
|
39
|
-
C((a) => [...a, i]),
|
|
39
|
+
C((a) => [...a, i]), b(""), I("streaming"), x(/* @__PURE__ */ new Date());
|
|
40
40
|
try {
|
|
41
|
-
const a = await h?.(r,
|
|
41
|
+
const a = await h?.(r, y), G = {
|
|
42
42
|
id: R(),
|
|
43
43
|
role: "assistant",
|
|
44
44
|
content: a ?? "I received your message."
|
|
45
45
|
};
|
|
46
46
|
C((L) => [...L, G]);
|
|
47
47
|
} finally {
|
|
48
|
-
|
|
48
|
+
I("ready"), setTimeout(() => x(void 0), Re);
|
|
49
49
|
}
|
|
50
50
|
},
|
|
51
|
-
[p, u,
|
|
51
|
+
[p, u, y, h]
|
|
52
52
|
), F = g((t) => {
|
|
53
|
-
|
|
53
|
+
b(t);
|
|
54
54
|
}, []), M = g((t) => {
|
|
55
55
|
navigator.clipboard.writeText(t).catch(() => {
|
|
56
56
|
});
|
|
@@ -112,22 +112,22 @@ const R = () => (N += 1, `chat-msg-${N}`), Re = 3e3, ze = ({
|
|
|
112
112
|
] }),
|
|
113
113
|
/* @__PURE__ */ e(J, {})
|
|
114
114
|
] }),
|
|
115
|
-
m.length === 0 &&
|
|
115
|
+
m.length === 0 && o.length > 0 && /* @__PURE__ */ e("div", { className: "px-4 pb-2", children: /* @__PURE__ */ e(xe, { children: o.map((t) => /* @__PURE__ */ e(Me, { onClick: F, suggestion: t }, t)) }) }),
|
|
116
116
|
/* @__PURE__ */ e("div", { className: "px-4 pt-3 pb-4", children: /* @__PURE__ */ n(re, { onSubmit: U, children: [
|
|
117
117
|
/* @__PURE__ */ e(ae, { children: /* @__PURE__ */ e(
|
|
118
|
-
|
|
118
|
+
oe,
|
|
119
119
|
{
|
|
120
120
|
"aria-labelledby": l,
|
|
121
|
-
onChange: (t) =>
|
|
121
|
+
onChange: (t) => b(t.target.value),
|
|
122
122
|
placeholder: "Ask anything...",
|
|
123
123
|
value: p
|
|
124
124
|
}
|
|
125
125
|
) }),
|
|
126
|
-
/* @__PURE__ */ n(
|
|
126
|
+
/* @__PURE__ */ n(se, { children: [
|
|
127
127
|
/* @__PURE__ */ n(ie, { children: [
|
|
128
|
-
|
|
129
|
-
/* @__PURE__ */ e(le, { children: /* @__PURE__ */ e(de, {}) }),
|
|
130
|
-
/* @__PURE__ */ e(he, { children:
|
|
128
|
+
s.length > 1 && /* @__PURE__ */ n(ce, { onValueChange: k, value: y, children: [
|
|
129
|
+
/* @__PURE__ */ e(le, { "aria-label": "Select model", children: /* @__PURE__ */ e(de, {}) }),
|
|
130
|
+
/* @__PURE__ */ e(he, { children: s.map((t) => /* @__PURE__ */ e(me, { value: t.id, children: t.name }, t.id)) })
|
|
131
131
|
] }),
|
|
132
132
|
/* @__PURE__ */ n(
|
|
133
133
|
pe,
|
|
@@ -146,18 +146,18 @@ const R = () => (N += 1, `chat-msg-${N}`), Re = 3e3, ze = ({
|
|
|
146
146
|
] })
|
|
147
147
|
] }) })
|
|
148
148
|
] });
|
|
149
|
-
}, w = ({ id: S, content:
|
|
149
|
+
}, w = ({ id: S, content: s, reasoning: d, sources: o, onCopy: h, onRetry: f }) => /* @__PURE__ */ n("div", { className: "space-y-2", children: [
|
|
150
150
|
d && /* @__PURE__ */ n(ge, { children: [
|
|
151
151
|
/* @__PURE__ */ e(Se, {}),
|
|
152
152
|
/* @__PURE__ */ e(fe, { children: d })
|
|
153
153
|
] }),
|
|
154
|
-
/* @__PURE__ */ e(A, { from: "assistant", children: /* @__PURE__ */ e(B, { children: /* @__PURE__ */ e(E, { children:
|
|
155
|
-
|
|
156
|
-
/* @__PURE__ */ e(
|
|
157
|
-
/* @__PURE__ */ e(
|
|
154
|
+
/* @__PURE__ */ e(A, { from: "assistant", children: /* @__PURE__ */ e(B, { children: /* @__PURE__ */ e(E, { children: s }) }) }),
|
|
155
|
+
o && o.length > 0 && /* @__PURE__ */ n(Ce, { children: [
|
|
156
|
+
/* @__PURE__ */ e(be, { count: o.length }),
|
|
157
|
+
/* @__PURE__ */ e(ye, { children: o.map((l) => /* @__PURE__ */ e(Ie, { href: l.href, title: l.title }, l.href)) })
|
|
158
158
|
] }),
|
|
159
159
|
/* @__PURE__ */ n(ne, { children: [
|
|
160
|
-
/* @__PURE__ */ e(T, { label: "Copy", onClick: () => h(
|
|
160
|
+
/* @__PURE__ */ e(T, { label: "Copy", onClick: () => h(s), children: /* @__PURE__ */ e(V, { className: "size-3" }) }),
|
|
161
161
|
/* @__PURE__ */ e(T, { label: "Retry", onClick: () => f(S), children: /* @__PURE__ */ e(W, { className: "size-3" }) })
|
|
162
162
|
] })
|
|
163
163
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat.js","sources":["../../../../src/components/composed/Chat/Chat.tsx"],"sourcesContent":["import { CopyIcon, GlobeIcon, RefreshCcwIcon } from \"lucide-react\"\nimport { useCallback, useId, useState } from \"react\"\n\nimport {\n Conversation,\n ConversationContent,\n ConversationEmptyState,\n ConversationScrollButton,\n} from \"@/components/ai/conversation\"\nimport {\n Message,\n MessageAction,\n MessageActions,\n MessageBranch,\n MessageBranchContent,\n MessageBranchNext,\n MessageBranchPage,\n MessageBranchPrevious,\n MessageBranchSelector,\n MessageContent,\n MessageResponse,\n MessageToolbar,\n} from \"@/components/ai/message\"\nimport {\n PromptInput,\n PromptInputBody,\n PromptInputButton,\n PromptInputFooter,\n PromptInputSelect,\n PromptInputSelectContent,\n PromptInputSelectItem,\n PromptInputSelectTrigger,\n PromptInputSelectValue,\n PromptInputSubmit,\n PromptInputTextarea,\n PromptInputTools,\n type PromptInputMessage,\n} from \"@/components/ai/prompt-input\"\nimport { Reasoning, ReasoningContent, ReasoningTrigger } from \"@/components/ai/reasoning\"\nimport { Source, Sources, SourcesContent, SourcesTrigger } from \"@/components/ai/sources\"\nimport { StreamStatus } from \"@/components/ai/stream-status\"\nimport { Suggestion, Suggestions } from \"@/components/ai/suggestion\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ChatSource {\n href: string\n title: string\n}\n\nexport interface ChatMessage {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n /** Displayed in a collapsible Reasoning panel above the message content. */\n reasoning?: string\n /** Web sources used to produce this message. */\n sources?: ChatSource[]\n /** Multiple alternative responses (for branching). When provided, the\n * array should include `content` as one of its items. */\n branches?: string[]\n}\n\nexport interface ChatModel {\n id: string\n name: string\n}\n\nexport interface ChatProps {\n /** Initial messages to pre-populate the conversation. */\n initialMessages?: ChatMessage[]\n /** Available models shown in the model-selector dropdown. */\n models?: ChatModel[]\n /** Initial model id. Defaults to the first model in `models`. */\n defaultModel?: string\n /** Suggestion chips shown when the conversation is empty. */\n suggestions?: string[]\n /** Called when the user submits a message. The returned string (if any)\n * will be appended as the assistant's reply. Defaults to a no-op. */\n onSend?: (message: string, model: string) => Promise<string | undefined> | string | undefined\n className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Default values\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MODELS: ChatModel[] = [\n { id: \"claude-sonnet-4-6\", name: \"Claude Sonnet\" },\n { id: \"claude-opus-4-7\", name: \"Claude Opus\" },\n]\n\nconst DEFAULT_SUGGESTIONS = [\n \"Explain quantum entanglement simply\",\n \"Write a Python script to rename files\",\n \"Summarise the latest AI research trends\",\n \"What is the difference between TCP and UDP?\",\n]\n\nlet _idCounter = 0\nconst nextId = () => {\n _idCounter += 1\n return `chat-msg-${_idCounter}`\n}\n\nconst STREAM_STATUS_LINGER_MS = 3000\n\n// ---------------------------------------------------------------------------\n// Chat component\n// ---------------------------------------------------------------------------\n\nexport const Chat = ({\n initialMessages = [],\n models = DEFAULT_MODELS,\n defaultModel,\n suggestions = DEFAULT_SUGGESTIONS,\n onSend,\n className,\n}: ChatProps) => {\n const labelId = useId()\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages)\n const [text, setText] = useState(\"\")\n const [model, setModel] = useState(defaultModel ?? models[0]?.id ?? \"\")\n const [webSearch, setWebSearch] = useState(false)\n const [status, setStatus] = useState<\"ready\" | \"streaming\">(\"ready\")\n const [streamStart, setStreamStart] = useState<Date | undefined>()\n\n const handleSubmit = useCallback(\n async (_msg: PromptInputMessage) => {\n const trimmed = text.trim()\n if (!trimmed || status === \"streaming\") return\n\n const userMsg: ChatMessage = {\n id: nextId(),\n role: \"user\",\n content: trimmed,\n }\n setMessages((prev) => [...prev, userMsg])\n setText(\"\")\n setStatus(\"streaming\")\n setStreamStart(new Date())\n\n try {\n const reply = await onSend?.(trimmed, model)\n const assistantMsg: ChatMessage = {\n id: nextId(),\n role: \"assistant\",\n content: reply ?? \"I received your message.\",\n }\n setMessages((prev) => [...prev, assistantMsg])\n } finally {\n setStatus(\"ready\")\n // Keep streamStart briefly so the bubble-confirm ripple can play out\n setTimeout(() => setStreamStart(undefined), STREAM_STATUS_LINGER_MS)\n }\n },\n [text, status, model, onSend],\n )\n\n const handleSuggestion = useCallback((suggestion: string) => {\n setText(suggestion)\n }, [])\n\n const handleCopy = useCallback((content: string) => {\n navigator.clipboard.writeText(content).catch(() => {})\n }, [])\n\n const handleRetry = useCallback((id: string) => {\n setMessages((prev) => {\n const idx = prev.findIndex((m) => m.id === id)\n if (idx === -1) return prev\n return prev.slice(0, idx)\n })\n }, [])\n\n return (\n <div className={cn(\"mx-auto flex h-full w-full max-w-[980px] flex-col\", className)}>\n {/* Conversation */}\n <Conversation className=\"flex-1\">\n <ConversationContent>\n {messages.length === 0 ? (\n <ConversationEmptyState\n description=\"Send a message or pick a suggestion below to start.\"\n title=\"Start a conversation\"\n />\n ) : null}\n\n {messages.map((msg, index) => (\n <div className=\"space-y-1\" key={msg.id}>\n {/* Branch wrapper — renders alt responses side-by-side when branches exist */}\n {msg.role === \"assistant\" && msg.branches && msg.branches.length > 1 ? (\n <MessageBranch>\n <MessageBranchContent>\n {msg.branches.map((branch, i) => (\n <AssistantMessage\n key={i}\n content={branch}\n id={msg.id}\n onCopy={handleCopy}\n onRetry={handleRetry}\n reasoning={i === 0 ? msg.reasoning : undefined}\n sources={i === 0 ? msg.sources : undefined}\n />\n ))}\n </MessageBranchContent>\n <MessageToolbar>\n <MessageBranchSelector>\n <MessageBranchPrevious />\n <MessageBranchPage />\n <MessageBranchNext />\n </MessageBranchSelector>\n </MessageToolbar>\n </MessageBranch>\n ) : msg.role === \"assistant\" ? (\n <>\n <AssistantMessage\n content={msg.content}\n id={msg.id}\n onCopy={handleCopy}\n onRetry={handleRetry}\n reasoning={msg.reasoning}\n sources={msg.sources}\n />\n </>\n ) : (\n <Message from=\"user\">\n <MessageContent>\n <MessageResponse>{msg.content}</MessageResponse>\n </MessageContent>\n </Message>\n )}\n\n {index === messages.length - 1 && streamStart && (\n <div className=\"mt-3\">\n <StreamStatus\n iconVariant=\"loader-circle\"\n isStreaming={status === \"streaming\"}\n startTime={streamStart}\n />\n </div>\n )}\n </div>\n ))}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n\n {/* Suggestions — only shown when conversation is empty */}\n {messages.length === 0 && suggestions.length > 0 && (\n <div className=\"px-4 pb-2\">\n <Suggestions>\n {suggestions.map((s) => (\n <Suggestion key={s} onClick={handleSuggestion} suggestion={s} />\n ))}\n </Suggestions>\n </div>\n )}\n\n {/* Prompt input */}\n <div className=\"px-4 pt-3 pb-4\">\n <PromptInput onSubmit={handleSubmit}>\n <PromptInputBody>\n <PromptInputTextarea\n aria-labelledby={labelId}\n onChange={(e) => setText(e.target.value)}\n placeholder=\"Ask anything...\"\n value={text}\n />\n </PromptInputBody>\n <PromptInputFooter>\n <PromptInputTools>\n {/* Model selector */}\n {models.length > 1 && (\n <PromptInputSelect onValueChange={setModel} value={model}>\n <PromptInputSelectTrigger>\n <PromptInputSelectValue />\n </PromptInputSelectTrigger>\n <PromptInputSelectContent>\n {models.map((m) => (\n <PromptInputSelectItem key={m.id} value={m.id}>\n {m.name}\n </PromptInputSelectItem>\n ))}\n </PromptInputSelectContent>\n </PromptInputSelect>\n )}\n\n {/* Web search toggle */}\n <PromptInputButton\n onClick={() => setWebSearch((v) => !v)}\n tooltip={{ content: \"Search the web\" }}\n variant={webSearch ? \"default\" : \"ghost\"}\n >\n <GlobeIcon size={16} />\n <span>Search</span>\n </PromptInputButton>\n </PromptInputTools>\n\n <PromptInputSubmit disabled={!text.trim()} status={status} />\n </PromptInputFooter>\n </PromptInput>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Internal sub-component for assistant messages\n// ---------------------------------------------------------------------------\n\ninterface AssistantMessageProps {\n id: string\n content: string\n reasoning?: string\n sources?: ChatSource[]\n onCopy: (content: string) => void\n onRetry: (id: string) => void\n}\n\nconst AssistantMessage = ({ id, content, reasoning, sources, onCopy, onRetry }: AssistantMessageProps) => (\n <div className=\"space-y-2\">\n {reasoning && (\n <Reasoning>\n <ReasoningTrigger />\n <ReasoningContent>{reasoning}</ReasoningContent>\n </Reasoning>\n )}\n\n <Message from=\"assistant\">\n <MessageContent>\n <MessageResponse>{content}</MessageResponse>\n </MessageContent>\n </Message>\n\n {sources && sources.length > 0 && (\n <Sources>\n <SourcesTrigger count={sources.length} />\n <SourcesContent>\n {sources.map((s) => (\n <Source href={s.href} key={s.href} title={s.title} />\n ))}\n </SourcesContent>\n </Sources>\n )}\n\n <MessageActions>\n <MessageAction label=\"Copy\" onClick={() => onCopy(content)}>\n <CopyIcon className=\"size-3\" />\n </MessageAction>\n <MessageAction label=\"Retry\" onClick={() => onRetry(id)}>\n <RefreshCcwIcon className=\"size-3\" />\n </MessageAction>\n </MessageActions>\n </div>\n)\n"],"names":["DEFAULT_MODELS","DEFAULT_SUGGESTIONS","_idCounter","nextId","STREAM_STATUS_LINGER_MS","Chat","initialMessages","models","defaultModel","suggestions","onSend","className","labelId","useId","messages","setMessages","useState","text","setText","model","setModel","webSearch","setWebSearch","status","setStatus","streamStart","setStreamStart","handleSubmit","useCallback","_msg","trimmed","userMsg","prev","reply","assistantMsg","handleSuggestion","suggestion","handleCopy","content","handleRetry","id","idx","m","cn","jsxs","Conversation","ConversationContent","jsx","ConversationEmptyState","msg","index","MessageBranch","MessageBranchContent","branch","i","AssistantMessage","MessageToolbar","MessageBranchSelector","MessageBranchPrevious","MessageBranchPage","MessageBranchNext","Fragment","Message","MessageContent","MessageResponse","StreamStatus","ConversationScrollButton","Suggestions","s","Suggestion","PromptInput","PromptInputBody","PromptInputTextarea","e","PromptInputFooter","PromptInputTools","PromptInputSelect","PromptInputSelectTrigger","PromptInputSelectValue","PromptInputSelectContent","PromptInputSelectItem","PromptInputButton","v","GlobeIcon","PromptInputSubmit","reasoning","sources","onCopy","onRetry","Reasoning","ReasoningTrigger","ReasoningContent","Sources","SourcesTrigger","SourcesContent","Source","MessageActions","MessageAction","CopyIcon","RefreshCcwIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Chat.js","sources":["../../../../src/components/composed/Chat/Chat.tsx"],"sourcesContent":["import { CopyIcon, GlobeIcon, RefreshCcwIcon } from \"lucide-react\"\nimport { useCallback, useId, useState } from \"react\"\n\nimport {\n Conversation,\n ConversationContent,\n ConversationEmptyState,\n ConversationScrollButton,\n} from \"@/components/ai/conversation\"\nimport {\n Message,\n MessageAction,\n MessageActions,\n MessageBranch,\n MessageBranchContent,\n MessageBranchNext,\n MessageBranchPage,\n MessageBranchPrevious,\n MessageBranchSelector,\n MessageContent,\n MessageResponse,\n MessageToolbar,\n} from \"@/components/ai/message\"\nimport {\n PromptInput,\n PromptInputBody,\n PromptInputButton,\n PromptInputFooter,\n PromptInputSelect,\n PromptInputSelectContent,\n PromptInputSelectItem,\n PromptInputSelectTrigger,\n PromptInputSelectValue,\n PromptInputSubmit,\n PromptInputTextarea,\n PromptInputTools,\n type PromptInputMessage,\n} from \"@/components/ai/prompt-input\"\nimport { Reasoning, ReasoningContent, ReasoningTrigger } from \"@/components/ai/reasoning\"\nimport { Source, Sources, SourcesContent, SourcesTrigger } from \"@/components/ai/sources\"\nimport { StreamStatus } from \"@/components/ai/stream-status\"\nimport { Suggestion, Suggestions } from \"@/components/ai/suggestion\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ChatSource {\n href: string\n title: string\n}\n\nexport interface ChatMessage {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n /** Displayed in a collapsible Reasoning panel above the message content. */\n reasoning?: string\n /** Web sources used to produce this message. */\n sources?: ChatSource[]\n /** Multiple alternative responses (for branching). When provided, the\n * array should include `content` as one of its items. */\n branches?: string[]\n}\n\nexport interface ChatModel {\n id: string\n name: string\n}\n\nexport interface ChatProps {\n /** Initial messages to pre-populate the conversation. */\n initialMessages?: ChatMessage[]\n /** Available models shown in the model-selector dropdown. */\n models?: ChatModel[]\n /** Initial model id. Defaults to the first model in `models`. */\n defaultModel?: string\n /** Suggestion chips shown when the conversation is empty. */\n suggestions?: string[]\n /** Called when the user submits a message. The returned string (if any)\n * will be appended as the assistant's reply. Defaults to a no-op. */\n onSend?: (message: string, model: string) => Promise<string | undefined> | string | undefined\n className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Default values\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MODELS: ChatModel[] = [\n { id: \"claude-sonnet-4-6\", name: \"Claude Sonnet\" },\n { id: \"claude-opus-4-7\", name: \"Claude Opus\" },\n]\n\nconst DEFAULT_SUGGESTIONS = [\n \"Explain quantum entanglement simply\",\n \"Write a Python script to rename files\",\n \"Summarise the latest AI research trends\",\n \"What is the difference between TCP and UDP?\",\n]\n\nlet _idCounter = 0\nconst nextId = () => {\n _idCounter += 1\n return `chat-msg-${_idCounter}`\n}\n\nconst STREAM_STATUS_LINGER_MS = 3000\n\n// ---------------------------------------------------------------------------\n// Chat component\n// ---------------------------------------------------------------------------\n\nexport const Chat = ({\n initialMessages = [],\n models = DEFAULT_MODELS,\n defaultModel,\n suggestions = DEFAULT_SUGGESTIONS,\n onSend,\n className,\n}: ChatProps) => {\n const labelId = useId()\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages)\n const [text, setText] = useState(\"\")\n const [model, setModel] = useState(defaultModel ?? models[0]?.id ?? \"\")\n const [webSearch, setWebSearch] = useState(false)\n const [status, setStatus] = useState<\"ready\" | \"streaming\">(\"ready\")\n const [streamStart, setStreamStart] = useState<Date | undefined>()\n\n const handleSubmit = useCallback(\n async (_msg: PromptInputMessage) => {\n const trimmed = text.trim()\n if (!trimmed || status === \"streaming\") return\n\n const userMsg: ChatMessage = {\n id: nextId(),\n role: \"user\",\n content: trimmed,\n }\n setMessages((prev) => [...prev, userMsg])\n setText(\"\")\n setStatus(\"streaming\")\n setStreamStart(new Date())\n\n try {\n const reply = await onSend?.(trimmed, model)\n const assistantMsg: ChatMessage = {\n id: nextId(),\n role: \"assistant\",\n content: reply ?? \"I received your message.\",\n }\n setMessages((prev) => [...prev, assistantMsg])\n } finally {\n setStatus(\"ready\")\n // Keep streamStart briefly so the bubble-confirm ripple can play out\n setTimeout(() => setStreamStart(undefined), STREAM_STATUS_LINGER_MS)\n }\n },\n [text, status, model, onSend],\n )\n\n const handleSuggestion = useCallback((suggestion: string) => {\n setText(suggestion)\n }, [])\n\n const handleCopy = useCallback((content: string) => {\n navigator.clipboard.writeText(content).catch(() => {})\n }, [])\n\n const handleRetry = useCallback((id: string) => {\n setMessages((prev) => {\n const idx = prev.findIndex((m) => m.id === id)\n if (idx === -1) return prev\n return prev.slice(0, idx)\n })\n }, [])\n\n return (\n <div className={cn(\"mx-auto flex h-full w-full max-w-[980px] flex-col\", className)}>\n {/* Conversation */}\n <Conversation className=\"flex-1\">\n <ConversationContent>\n {messages.length === 0 ? (\n <ConversationEmptyState\n description=\"Send a message or pick a suggestion below to start.\"\n title=\"Start a conversation\"\n />\n ) : null}\n\n {messages.map((msg, index) => (\n <div className=\"space-y-1\" key={msg.id}>\n {/* Branch wrapper — renders alt responses side-by-side when branches exist */}\n {msg.role === \"assistant\" && msg.branches && msg.branches.length > 1 ? (\n <MessageBranch>\n <MessageBranchContent>\n {msg.branches.map((branch, i) => (\n <AssistantMessage\n key={i}\n content={branch}\n id={msg.id}\n onCopy={handleCopy}\n onRetry={handleRetry}\n reasoning={i === 0 ? msg.reasoning : undefined}\n sources={i === 0 ? msg.sources : undefined}\n />\n ))}\n </MessageBranchContent>\n <MessageToolbar>\n <MessageBranchSelector>\n <MessageBranchPrevious />\n <MessageBranchPage />\n <MessageBranchNext />\n </MessageBranchSelector>\n </MessageToolbar>\n </MessageBranch>\n ) : msg.role === \"assistant\" ? (\n <>\n <AssistantMessage\n content={msg.content}\n id={msg.id}\n onCopy={handleCopy}\n onRetry={handleRetry}\n reasoning={msg.reasoning}\n sources={msg.sources}\n />\n </>\n ) : (\n <Message from=\"user\">\n <MessageContent>\n <MessageResponse>{msg.content}</MessageResponse>\n </MessageContent>\n </Message>\n )}\n\n {index === messages.length - 1 && streamStart && (\n <div className=\"mt-3\">\n <StreamStatus\n iconVariant=\"loader-circle\"\n isStreaming={status === \"streaming\"}\n startTime={streamStart}\n />\n </div>\n )}\n </div>\n ))}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n\n {/* Suggestions — only shown when conversation is empty */}\n {messages.length === 0 && suggestions.length > 0 && (\n <div className=\"px-4 pb-2\">\n <Suggestions>\n {suggestions.map((s) => (\n <Suggestion key={s} onClick={handleSuggestion} suggestion={s} />\n ))}\n </Suggestions>\n </div>\n )}\n\n {/* Prompt input */}\n <div className=\"px-4 pt-3 pb-4\">\n <PromptInput onSubmit={handleSubmit}>\n <PromptInputBody>\n <PromptInputTextarea\n aria-labelledby={labelId}\n onChange={(e) => setText(e.target.value)}\n placeholder=\"Ask anything...\"\n value={text}\n />\n </PromptInputBody>\n <PromptInputFooter>\n <PromptInputTools>\n {/* Model selector */}\n {models.length > 1 && (\n <PromptInputSelect onValueChange={setModel} value={model}>\n <PromptInputSelectTrigger aria-label=\"Select model\">\n <PromptInputSelectValue />\n </PromptInputSelectTrigger>\n <PromptInputSelectContent>\n {models.map((m) => (\n <PromptInputSelectItem key={m.id} value={m.id}>\n {m.name}\n </PromptInputSelectItem>\n ))}\n </PromptInputSelectContent>\n </PromptInputSelect>\n )}\n\n {/* Web search toggle */}\n <PromptInputButton\n onClick={() => setWebSearch((v) => !v)}\n tooltip={{ content: \"Search the web\" }}\n variant={webSearch ? \"default\" : \"ghost\"}\n >\n <GlobeIcon size={16} />\n <span>Search</span>\n </PromptInputButton>\n </PromptInputTools>\n\n <PromptInputSubmit disabled={!text.trim()} status={status} />\n </PromptInputFooter>\n </PromptInput>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Internal sub-component for assistant messages\n// ---------------------------------------------------------------------------\n\ninterface AssistantMessageProps {\n id: string\n content: string\n reasoning?: string\n sources?: ChatSource[]\n onCopy: (content: string) => void\n onRetry: (id: string) => void\n}\n\nconst AssistantMessage = ({ id, content, reasoning, sources, onCopy, onRetry }: AssistantMessageProps) => (\n <div className=\"space-y-2\">\n {reasoning && (\n <Reasoning>\n <ReasoningTrigger />\n <ReasoningContent>{reasoning}</ReasoningContent>\n </Reasoning>\n )}\n\n <Message from=\"assistant\">\n <MessageContent>\n <MessageResponse>{content}</MessageResponse>\n </MessageContent>\n </Message>\n\n {sources && sources.length > 0 && (\n <Sources>\n <SourcesTrigger count={sources.length} />\n <SourcesContent>\n {sources.map((s) => (\n <Source href={s.href} key={s.href} title={s.title} />\n ))}\n </SourcesContent>\n </Sources>\n )}\n\n <MessageActions>\n <MessageAction label=\"Copy\" onClick={() => onCopy(content)}>\n <CopyIcon className=\"size-3\" />\n </MessageAction>\n <MessageAction label=\"Retry\" onClick={() => onRetry(id)}>\n <RefreshCcwIcon className=\"size-3\" />\n </MessageAction>\n </MessageActions>\n </div>\n)\n"],"names":["DEFAULT_MODELS","DEFAULT_SUGGESTIONS","_idCounter","nextId","STREAM_STATUS_LINGER_MS","Chat","initialMessages","models","defaultModel","suggestions","onSend","className","labelId","useId","messages","setMessages","useState","text","setText","model","setModel","webSearch","setWebSearch","status","setStatus","streamStart","setStreamStart","handleSubmit","useCallback","_msg","trimmed","userMsg","prev","reply","assistantMsg","handleSuggestion","suggestion","handleCopy","content","handleRetry","id","idx","m","cn","jsxs","Conversation","ConversationContent","jsx","ConversationEmptyState","msg","index","MessageBranch","MessageBranchContent","branch","i","AssistantMessage","MessageToolbar","MessageBranchSelector","MessageBranchPrevious","MessageBranchPage","MessageBranchNext","Fragment","Message","MessageContent","MessageResponse","StreamStatus","ConversationScrollButton","Suggestions","s","Suggestion","PromptInput","PromptInputBody","PromptInputTextarea","e","PromptInputFooter","PromptInputTools","PromptInputSelect","PromptInputSelectTrigger","PromptInputSelectValue","PromptInputSelectContent","PromptInputSelectItem","PromptInputButton","v","GlobeIcon","PromptInputSubmit","reasoning","sources","onCopy","onRetry","Reasoning","ReasoningTrigger","ReasoningContent","Sources","SourcesTrigger","SourcesContent","Source","MessageActions","MessageAction","CopyIcon","RefreshCcwIcon"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),x=require("../../ui/banner.cjs"),o=require("../../ui/button.cjs"),i=require("../../ui/dialog.cjs"),g=require("../../ui/spinner.cjs");function D({title:l,description:n,variant:r="default",confirmLabel:a="Confirm",cancelLabel:c="Cancel",onConfirm:d,onCancel:u,open:j,onOpenChange:h,trigger:s,loading:t=!1}){return e.jsxs(i.Dialog,{open:j,onOpenChange:h,children:[s&&e.jsx(i.DialogTrigger,{asChild:!0,children:s}),e.jsxs(i.DialogContent,{children:[e.jsxs(i.DialogHeader,{children:[e.jsx(i.DialogTitle,{children:l}),n&&e.jsx(i.DialogDescription,{children:n})]}),r==="destructive"&&e.jsx(x.Banner,{variant:"destructive",description:"This action cannot be undone.",className:"rounded-md"}),e.jsxs(i.DialogFooter,{children:[e.jsx(i.DialogClose,{asChild:!0,children:e.jsx(o.Button,{variant:"outline",onClick:u,children:c})}),e.jsxs(o.Button,{variant:r==="destructive"?"destructive":"default",disabled:t,onClick:d,children:[t&&e.jsx(g.Spinner,{size:"sm",className:"mr-2"}),a]})]})]})]})}exports.ConfirmDialog=D;
|
|
2
2
|
//# sourceMappingURL=ConfirmDialog.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.cjs","sources":["../../../../src/components/composed/ConfirmDialog/ConfirmDialog.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.cjs","sources":["../../../../src/components/composed/ConfirmDialog/ConfirmDialog.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { Banner } from \"@/components/ui/banner\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@/components/ui/dialog\"\nimport { Spinner } from \"@/components/ui/spinner\"\n\ninterface ConfirmDialogBaseProps {\n title: string\n description?: string\n variant?: \"default\" | \"destructive\"\n confirmLabel?: string\n cancelLabel?: string\n onConfirm?: () => void\n onCancel?: () => void\n trigger?: React.ReactElement\n loading?: boolean\n}\n\ntype ConfirmDialogControlledProps = ConfirmDialogBaseProps & {\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\ntype ConfirmDialogUncontrolledProps = ConfirmDialogBaseProps & {\n open?: never\n onOpenChange?: never\n}\n\nexport type ConfirmDialogProps =\n | ConfirmDialogControlledProps\n | ConfirmDialogUncontrolledProps\n\nexport function ConfirmDialog({\n title,\n description,\n variant = \"default\",\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n onConfirm,\n onCancel,\n open,\n onOpenChange,\n trigger,\n loading = false,\n}: ConfirmDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n {trigger && <DialogTrigger asChild>{trigger}</DialogTrigger>}\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description && (\n <DialogDescription>{description}</DialogDescription>\n )}\n </DialogHeader>\n {variant === \"destructive\" && (\n <Banner\n variant=\"destructive\"\n description=\"This action cannot be undone.\"\n className=\"rounded-md\"\n />\n )}\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n </DialogClose>\n <Button\n variant={variant === \"destructive\" ? \"destructive\" : \"default\"}\n disabled={loading}\n onClick={onConfirm}\n >\n {loading && <Spinner size=\"sm\" className=\"mr-2\" />}\n {confirmLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n"],"names":["ConfirmDialog","title","description","variant","confirmLabel","cancelLabel","onConfirm","onCancel","open","onOpenChange","trigger","loading","jsxs","Dialog","jsx","DialogTrigger","DialogContent","DialogHeader","DialogTitle","DialogDescription","Banner","DialogFooter","DialogClose","Button","Spinner"],"mappings":"0PA0CO,SAASA,EAAc,CAC5B,MAAAC,EACA,YAAAC,EACA,QAAAC,EAAU,UACV,aAAAC,EAAe,UACf,YAAAC,EAAc,SACd,UAAAC,EACA,SAAAC,EACA,KAAAC,EACA,aAAAC,EACA,QAAAC,EACA,QAAAC,EAAU,EACZ,EAAuB,CACrB,OACEC,EAAAA,KAACC,EAAAA,OAAA,CAAO,KAAAL,EAAY,aAAAC,EACjB,SAAA,CAAAC,GAAWI,EAAAA,IAACC,gBAAA,CAAc,QAAO,GAAE,SAAAL,EAAQ,SAC3CM,EAAAA,cAAA,CACC,SAAA,CAAAJ,OAACK,EAAAA,aAAA,CACC,SAAA,CAAAH,EAAAA,IAACI,EAAAA,aAAa,SAAAjB,CAAA,CAAM,EACnBC,GACCY,EAAAA,IAACK,EAAAA,kBAAA,CAAmB,SAAAjB,CAAA,CAAY,CAAA,EAEpC,EACCC,IAAY,eACXW,EAAAA,IAACM,EAAAA,OAAA,CACC,QAAQ,cACR,YAAY,gCACZ,UAAU,YAAA,CAAA,SAGbC,EAAAA,aAAA,CACC,SAAA,CAAAP,EAAAA,IAACQ,EAAAA,YAAA,CAAY,QAAO,GAClB,SAAAR,EAAAA,IAACS,EAAAA,OAAA,CAAO,QAAQ,UAAU,QAAShB,EAChC,SAAAF,CAAA,CACH,EACF,EACAO,EAAAA,KAACW,EAAAA,OAAA,CACC,QAASpB,IAAY,cAAgB,cAAgB,UACrD,SAAUQ,EACV,QAASL,EAER,SAAA,CAAAK,GAAWG,EAAAA,IAACU,UAAA,CAAQ,KAAK,KAAK,UAAU,OAAO,EAC/CpB,CAAA,CAAA,CAAA,CACH,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ"}
|