@tetrascience-npm/tetrascience-react-ui 0.7.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -4
- package/dist/ai/attachments.cjs +2 -0
- package/dist/ai/attachments.cjs.map +1 -0
- package/dist/ai/attachments.js +224 -0
- package/dist/ai/attachments.js.map +1 -0
- package/dist/ai/chain-of-thought.cjs +2 -0
- package/dist/ai/chain-of-thought.cjs.map +1 -0
- package/dist/ai/chain-of-thought.js +145 -0
- package/dist/ai/chain-of-thought.js.map +1 -0
- package/dist/ai/confirmation.cjs +2 -0
- package/dist/ai/confirmation.cjs.map +1 -0
- package/dist/ai/confirmation.js +109 -0
- package/dist/ai/confirmation.js.map +1 -0
- package/dist/ai/context.cjs +2 -0
- package/dist/ai/context.cjs.map +1 -0
- package/dist/ai/context.js +267 -0
- package/dist/ai/context.js.map +1 -0
- package/dist/ai/conversation.cjs +4 -0
- package/dist/ai/conversation.cjs.map +1 -0
- package/dist/ai/conversation.js +108 -0
- package/dist/ai/conversation.js.map +1 -0
- package/dist/ai/inline-citation.cjs +2 -0
- package/dist/ai/inline-citation.cjs.map +1 -0
- package/dist/ai/inline-citation.js +182 -0
- package/dist/ai/inline-citation.js.map +1 -0
- package/dist/ai/message.cjs +2 -0
- package/dist/ai/message.cjs.map +1 -0
- package/dist/ai/message.js +237 -0
- package/dist/ai/message.js.map +1 -0
- package/dist/ai/model-selector.cjs +2 -0
- package/dist/ai/model-selector.cjs.map +1 -0
- package/dist/ai/model-selector.js +77 -0
- package/dist/ai/model-selector.js.map +1 -0
- package/dist/ai/prompt-input.cjs +2 -0
- package/dist/ai/prompt-input.cjs.map +1 -0
- package/dist/ai/prompt-input.js +776 -0
- package/dist/ai/prompt-input.js.map +1 -0
- package/dist/ai/queue.cjs +2 -0
- package/dist/ai/queue.cjs.map +1 -0
- package/dist/ai/queue.js +209 -0
- package/dist/ai/queue.js.map +1 -0
- package/dist/ai/reasoning.cjs +2 -0
- package/dist/ai/reasoning.cjs.map +1 -0
- package/dist/ai/reasoning.js +129 -0
- package/dist/ai/reasoning.js.map +1 -0
- package/dist/ai/shimmer.cjs +2 -0
- package/dist/ai/shimmer.cjs.map +1 -0
- package/dist/ai/shimmer.js +49 -0
- package/dist/ai/shimmer.js.map +1 -0
- package/dist/ai/sources.cjs +2 -0
- package/dist/ai/sources.cjs.map +1 -0
- package/dist/ai/sources.js +54 -0
- package/dist/ai/sources.js.map +1 -0
- package/dist/ai/speech-input.cjs +2 -0
- package/dist/ai/speech-input.cjs.map +1 -0
- package/dist/ai/speech-input.js +123 -0
- package/dist/ai/speech-input.js.map +1 -0
- package/dist/ai/stream-status.cjs +2 -0
- package/dist/ai/stream-status.cjs.map +1 -0
- package/dist/ai/stream-status.js +108 -0
- package/dist/ai/stream-status.js.map +1 -0
- package/dist/ai/suggestion.cjs +2 -0
- package/dist/ai/suggestion.cjs.map +1 -0
- package/dist/ai/suggestion.js +38 -0
- package/dist/ai/suggestion.js.map +1 -0
- package/dist/ai/task.cjs +2 -0
- package/dist/ai/task.cjs.map +1 -0
- package/dist/ai/task.js +101 -0
- package/dist/ai/task.js.map +1 -0
- package/dist/ai/tool.cjs +2 -0
- package/dist/ai/tool.cjs.map +1 -0
- package/dist/ai/tool.js +139 -0
- package/dist/ai/tool.js.map +1 -0
- package/dist/charts/AreaPlot.cjs +2 -0
- package/dist/charts/AreaPlot.cjs.map +1 -0
- package/dist/charts/AreaPlot.js +5 -0
- package/dist/charts/AreaPlot.js.map +1 -0
- package/dist/charts/BarChart.cjs +2 -0
- package/dist/charts/BarChart.cjs.map +1 -0
- package/dist/charts/BarChart.js +5 -0
- package/dist/charts/BarChart.js.map +1 -0
- package/dist/charts/BoxPlot.cjs +2 -0
- package/dist/charts/BoxPlot.cjs.map +1 -0
- package/dist/charts/BoxPlot.js +5 -0
- package/dist/charts/BoxPlot.js.map +1 -0
- package/dist/charts/ChartTooltip.cjs +2 -0
- package/dist/charts/ChartTooltip.cjs.map +1 -0
- package/dist/charts/ChartTooltip.js +8 -0
- package/dist/charts/ChartTooltip.js.map +1 -0
- package/dist/charts/Chromatogram.cjs +2 -0
- package/dist/charts/Chromatogram.cjs.map +1 -0
- package/dist/charts/Chromatogram.js +5 -0
- package/dist/charts/Chromatogram.js.map +1 -0
- package/dist/charts/Electropherogram.cjs +2 -0
- package/dist/charts/Electropherogram.cjs.map +1 -0
- package/dist/charts/Electropherogram.js +5 -0
- package/dist/charts/Electropherogram.js.map +1 -0
- package/dist/charts/Histogram.cjs +2 -0
- package/dist/charts/Histogram.cjs.map +1 -0
- package/dist/charts/Histogram.js +5 -0
- package/dist/charts/Histogram.js.map +1 -0
- package/dist/charts/LinePlot.cjs +2 -0
- package/dist/charts/LinePlot.cjs.map +1 -0
- package/dist/charts/LinePlot.js +5 -0
- package/dist/charts/LinePlot.js.map +1 -0
- package/dist/charts/PieChart.cjs +2 -0
- package/dist/charts/PieChart.cjs.map +1 -0
- package/dist/charts/PieChart.js +5 -0
- package/dist/charts/PieChart.js.map +1 -0
- package/dist/charts/PlateMap.cjs +2 -0
- package/dist/charts/PlateMap.cjs.map +1 -0
- package/dist/charts/PlateMap.js +5 -0
- package/dist/charts/PlateMap.js.map +1 -0
- package/dist/charts/ScatterPlot.cjs +2 -0
- package/dist/charts/ScatterPlot.cjs.map +1 -0
- package/dist/charts/ScatterPlot.js +5 -0
- package/dist/charts/ScatterPlot.js.map +1 -0
- package/dist/charts/ScatterPlotInteractive.cjs +2 -0
- package/dist/charts/ScatterPlotInteractive.cjs.map +1 -0
- package/dist/charts/ScatterPlotInteractive.js +14 -0
- package/dist/charts/ScatterPlotInteractive.js.map +1 -0
- package/dist/charts/StackedChromatogram.cjs +2 -0
- package/dist/charts/StackedChromatogram.cjs.map +1 -0
- package/dist/charts/StackedChromatogram.js +7 -0
- package/dist/charts/StackedChromatogram.js.map +1 -0
- package/dist/components/ai/attachments.d.ts +54 -0
- package/dist/components/ai/chain-of-thought.d.ts +56 -0
- package/dist/components/ai/confirmation.d.ts +47 -0
- package/dist/components/ai/context.d.ts +40 -0
- package/dist/components/ai/conversation.d.ts +23 -0
- package/dist/components/ai/inline-citation.d.ts +38 -0
- package/dist/components/ai/message.d.ts +37 -0
- package/dist/components/ai/model-selector.d.ts +36 -0
- package/dist/components/ai/prompt-input.d.ts +158 -0
- package/dist/components/ai/queue.d.ts +72 -0
- package/dist/components/ai/reasoning.d.ts +26 -0
- package/dist/components/ai/shimmer.d.ts +17 -0
- package/dist/components/ai/sources.d.ts +12 -0
- package/dist/components/ai/speech-input.d.ts +54 -0
- package/dist/components/ai/stream-status.d.ts +66 -0
- 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.d.ts +2 -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.d.ts +2 -0
- package/dist/components/ai/streamdown-plugins.js +14 -0
- package/dist/components/ai/streamdown-plugins.js.map +1 -0
- package/dist/components/ai/suggestion.d.ts +9 -0
- package/dist/components/ai/task.d.ts +16 -0
- package/dist/components/ai/tool.d.ts +33 -0
- 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.d.ts +8 -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.d.ts +39 -0
- package/dist/components/charts/AreaPlot/AreaPlot.js +270 -0
- package/dist/components/charts/AreaPlot/AreaPlot.js.map +1 -0
- package/dist/components/charts/AreaPlot/index.d.ts +2 -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.d.ts +44 -0
- package/dist/components/charts/BarChart/BarChart.js +219 -0
- package/dist/components/charts/BarChart/BarChart.js.map +1 -0
- package/dist/components/charts/BarChart/index.d.ts +2 -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.d.ts +33 -0
- package/dist/components/charts/BoxPlot/BoxPlot.js +208 -0
- package/dist/components/charts/BoxPlot/BoxPlot.js.map +1 -0
- package/dist/components/charts/BoxPlot/index.d.ts +2 -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.d.ts +71 -0
- package/dist/components/charts/ChartTooltip/ChartTooltip.js +22 -22
- package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
- package/dist/components/charts/ChartTooltip/index.d.ts +2 -0
- package/dist/components/charts/ChartTooltip/lines.d.ts +54 -0
- 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.d.ts +5 -0
- 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.d.ts +50 -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.d.ts +14 -0
- package/dist/components/charts/Chromatogram/boundaryMarkers.js +34 -0
- package/dist/components/charts/Chromatogram/boundaryMarkers.js.map +1 -0
- package/dist/components/charts/Chromatogram/constants.cjs +2 -0
- package/dist/components/charts/Chromatogram/constants.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/constants.d.ts +46 -0
- package/dist/components/charts/Chromatogram/constants.js +36 -0
- 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.d.ts +49 -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/index.d.ts +2 -0
- package/dist/components/charts/Chromatogram/peakDetection.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/peakDetection.d.ts +33 -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.d.ts +58 -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.d.ts +9 -0
- package/dist/components/charts/Chromatogram/regionOverlays.js +26 -0
- package/dist/components/charts/Chromatogram/regionOverlays.js.map +1 -0
- package/dist/components/charts/Chromatogram/types.d.ts +258 -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.d.ts +22 -0
- package/dist/components/charts/Electropherogram/Electropherogram.js +180 -0
- package/dist/components/charts/Electropherogram/Electropherogram.js.map +1 -0
- package/dist/components/charts/Electropherogram/index.d.ts +2 -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.d.ts +36 -0
- package/dist/components/charts/Histogram/Histogram.js +107 -108
- package/dist/components/charts/Histogram/Histogram.js.map +1 -1
- package/dist/components/charts/Histogram/index.d.ts +2 -0
- 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.d.ts +45 -0
- package/dist/components/charts/LinePlot/LinePlot.js +224 -0
- package/dist/components/charts/LinePlot/LinePlot.js.map +1 -0
- package/dist/components/charts/LinePlot/index.d.ts +2 -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.d.ts +20 -0
- package/dist/components/charts/PieChart/PieChart.js +62 -61
- package/dist/components/charts/PieChart/PieChart.js.map +1 -1
- package/dist/components/charts/PieChart/index.d.ts +2 -0
- 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.d.ts +29 -0
- package/dist/components/charts/PlateMap/PlateMap.js +246 -242
- package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
- package/dist/components/charts/PlateMap/constants.d.ts +75 -0
- package/dist/components/charts/PlateMap/index.d.ts +2 -0
- package/dist/components/charts/PlateMap/types.d.ts +322 -0
- package/dist/components/charts/PlateMap/utils.d.ts +133 -0
- 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.d.ts +43 -0
- package/dist/components/charts/ScatterPlot/ScatterPlot.js +252 -0
- package/dist/components/charts/ScatterPlot/ScatterPlot.js.map +1 -0
- package/dist/components/charts/ScatterPlot/index.d.ts +2 -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.d.ts +25 -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.d.ts +50 -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/index.d.ts +3 -0
- package/dist/components/charts/ScatterPlotInteractive/types.d.ts +226 -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.d.ts +72 -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.d.ts +3 -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/index.d.ts +3 -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.d.ts +9 -0
- package/dist/components/charts/StackedChromatogram/transforms.js +31 -0
- package/dist/components/charts/StackedChromatogram/transforms.js.map +1 -0
- package/dist/components/charts/StackedChromatogram/types.d.ts +26 -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.d.ts +29 -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.d.ts +63 -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.d.ts +15 -0
- package/dist/components/composed/AssistantLayout/dockLayout.js +10 -0
- package/dist/components/composed/AssistantLayout/dockLayout.js.map +1 -0
- package/dist/components/composed/AssistantLayout/index.d.ts +3 -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.d.ts +35 -0
- package/dist/components/composed/Chat/Chat.js +28 -28
- package/dist/components/composed/Chat/Chat.js.map +1 -1
- package/dist/components/composed/Chat/index.d.ts +2 -0
- 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.d.ts +23 -0
- package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +33 -29
- package/dist/components/composed/ConfirmDialog/ConfirmDialog.js.map +1 -1
- package/dist/components/composed/ConfirmDialog/index.d.ts +1 -0
- 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.d.ts +23 -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.d.ts +88 -0
- package/dist/components/composed/DataAppShell/DataAppShell.js +350 -328
- 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.d.ts +64 -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.d.ts +95 -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.d.ts +63 -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.d.ts +20 -0
- package/dist/components/composed/DataAppShell/ShellContext.js +23 -0
- package/dist/components/composed/DataAppShell/ShellContext.js.map +1 -0
- package/dist/components/composed/DataAppShell/index.d.ts +12 -0
- package/dist/components/composed/EmptyState/EmptyState.d.ts +12 -0
- package/dist/components/composed/EmptyState/index.d.ts +2 -0
- package/dist/components/composed/FormPatterns/FormSection.cjs +1 -1
- package/dist/components/composed/FormPatterns/FormSection.cjs.map +1 -1
- package/dist/components/composed/FormPatterns/FormSection.d.ts +7 -0
- package/dist/components/composed/FormPatterns/FormSection.js +2 -2
- package/dist/components/composed/FormPatterns/index.d.ts +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.d.ts +43 -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/index.d.ts +3 -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.d.ts +104 -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.d.ts +29 -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.d.ts +12 -0
- package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +21 -21
- 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.d.ts +22 -0
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +34 -34
- package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapEditor.d.ts +106 -0
- package/dist/components/composed/PlateMapEditor/PlateMapEditor.js +2 -2
- package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapForm.d.ts +30 -0
- package/dist/components/composed/PlateMapEditor/PlateMapForm.js +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapGrid.d.ts +64 -0
- package/dist/components/composed/PlateMapEditor/PlateMapGrid.js +1 -1
- package/dist/components/composed/PlateMapEditor/PlateMapManifest.d.ts +29 -0
- 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.d.ts +19 -0
- package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +11 -11
- 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.d.ts +73 -0
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +1 -1
- package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/PlateZoomControl.d.ts +12 -0
- package/dist/components/composed/PlateMapEditor/PlateZoomControl.js +2 -2
- package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/TemplateIOPanel.d.ts +13 -0
- package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js +4 -4
- 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.d.ts +21 -0
- 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.d.ts +46 -0
- package/dist/components/composed/PlateMapEditor/WellManifestTable.js +10 -10
- package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs +1 -1
- package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs.map +1 -1
- package/dist/components/composed/PlateMapEditor/WellMetadataForm.d.ts +17 -0
- package/dist/components/composed/PlateMapEditor/WellMetadataForm.js +7 -7
- package/dist/components/composed/PlateMapEditor/autoFill.d.ts +26 -0
- package/dist/components/composed/PlateMapEditor/csvPlateTriage.d.ts +4 -0
- package/dist/components/composed/PlateMapEditor/helpers.d.ts +2 -0
- package/dist/components/composed/PlateMapEditor/index.d.ts +31 -0
- package/dist/components/composed/PlateMapEditor/types.d.ts +137 -0
- package/dist/components/composed/PlateMapEditor/wellGrid.d.ts +12 -0
- package/dist/components/composed/ProcessFlow/ProcessFlow.d.ts +32 -0
- package/dist/components/composed/ProcessFlow/ProcessFlow.utils.d.ts +86 -0
- package/dist/components/composed/ProcessFlow/index.d.ts +1 -0
- package/dist/components/composed/RichListItem/RichListItem.cjs +1 -1
- package/dist/components/composed/RichListItem/RichListItem.cjs.map +1 -1
- package/dist/components/composed/RichListItem/RichListItem.d.ts +22 -0
- package/dist/components/composed/RichListItem/RichListItem.js +2 -2
- package/dist/components/composed/RichListItem/index.d.ts +2 -0
- package/dist/components/composed/StatCard/StatCard.cjs +1 -1
- package/dist/components/composed/StatCard/StatCard.cjs.map +1 -1
- package/dist/components/composed/StatCard/StatCard.d.ts +11 -0
- package/dist/components/composed/StatCard/StatCard.js +1 -1
- package/dist/components/composed/StatCard/index.d.ts +1 -0
- package/dist/components/composed/TdpSearch/TdpSearch.cjs +1 -1
- package/dist/components/composed/TdpSearch/TdpSearch.cjs.map +1 -1
- package/dist/components/composed/TdpSearch/TdpSearch.d.ts +21 -0
- package/dist/components/composed/TdpSearch/TdpSearch.js +14 -13
- package/dist/components/composed/TdpSearch/TdpSearch.mocks.d.ts +5 -0
- 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.d.ts +3 -0
- package/dist/components/composed/TdpSearch/components/DefaultFilters.js +4 -4
- package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultResults.cjs +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultResults.cjs.map +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultResults.d.ts +3 -0
- package/dist/components/composed/TdpSearch/components/DefaultResults.js +2 -2
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs.map +1 -1
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.d.ts +3 -0
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js +2 -2
- package/dist/components/composed/TdpSearch/constants.d.ts +3 -0
- package/dist/components/composed/TdpSearch/hooks/useSearch.d.ts +2 -0
- package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.d.ts +14 -0
- package/dist/components/composed/TdpSearch/index.d.ts +3 -0
- package/dist/components/composed/TdpSearch/types.d.ts +128 -0
- package/dist/components/composed/TdpSearch/utils.d.ts +3 -0
- 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.d.ts +25 -0
- package/dist/components/composed/TopBar/TopBar.js +56 -0
- package/dist/components/composed/TopBar/TopBar.js.map +1 -0
- package/dist/components/composed/TopBar/index.d.ts +2 -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.d.ts +53 -0
- package/dist/components/composed/UserMenu/UserMenu.js +99 -0
- package/dist/components/composed/UserMenu/UserMenu.js.map +1 -0
- package/dist/components/composed/UserMenu/index.d.ts +2 -0
- package/dist/components/composed/tdp-link.d.ts +110 -0
- package/dist/components/composed/tdp-url.d.ts +68 -0
- package/dist/components/ui/accordion.d.ts +7 -0
- package/dist/components/ui/alert-dialog.d.ts +18 -0
- package/dist/components/ui/alert.d.ts +10 -0
- package/dist/components/ui/aspect-ratio.d.ts +3 -0
- package/dist/components/ui/avatar.d.ts +11 -0
- package/dist/components/ui/badge.d.ts +9 -0
- package/dist/components/ui/banner.d.ts +19 -0
- package/dist/components/ui/breadcrumb.d.ts +11 -0
- package/dist/components/ui/button-group.d.ts +11 -0
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/calendar.d.ts +10 -0
- package/dist/components/ui/card.d.ts +11 -0
- package/dist/components/ui/carousel.d.ts +28 -0
- package/dist/components/ui/checkbox.d.ts +4 -0
- package/dist/components/ui/code-block.d.ts +45 -0
- package/dist/components/ui/code-editor.d.ts +18 -0
- package/dist/components/ui/collapsible.d.ts +5 -0
- package/dist/components/ui/combobox.d.ts +24 -0
- package/dist/components/ui/command.d.ts +18 -0
- package/dist/components/ui/context-menu.d.ts +31 -0
- 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.d.ts +6 -0
- package/dist/components/ui/data-table/data-table-column-toggle.js +71 -63
- 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.d.ts +9 -0
- package/dist/components/ui/data-table/data-table-filter.js +26 -25
- 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.d.ts +9 -0
- package/dist/components/ui/data-table/data-table-group.js +18 -17
- 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.d.ts +7 -0
- package/dist/components/ui/data-table/data-table-pagination.js +16 -16
- 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.d.ts +82 -0
- 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/data-table/index.d.ts +5 -0
- package/dist/components/ui/dialog.d.ts +18 -0
- package/dist/components/ui/dropdown-menu.d.ts +29 -0
- package/dist/components/ui/field.d.ts +24 -0
- package/dist/components/ui/hover-card.d.ts +6 -0
- package/dist/components/ui/input-group.d.ts +16 -0
- package/dist/components/ui/input.d.ts +3 -0
- package/dist/components/ui/item.d.ts +23 -0
- package/dist/components/ui/kbd.d.ts +3 -0
- package/dist/components/ui/label.d.ts +4 -0
- package/dist/components/ui/menubar.d.ts +30 -0
- package/dist/components/ui/navigation-menu.d.ts +14 -0
- package/dist/components/ui/popover.d.ts +7 -0
- package/dist/components/ui/progress.d.ts +4 -0
- package/dist/components/ui/radio-group.d.ts +5 -0
- package/dist/components/ui/resizable.d.ts +25 -0
- package/dist/components/ui/scroll-area.d.ts +5 -0
- package/dist/components/ui/select.d.ts +15 -0
- package/dist/components/ui/separator.d.ts +4 -0
- package/dist/components/ui/sheet.d.ts +14 -0
- package/dist/components/ui/sidebar.d.ts +69 -0
- package/dist/components/ui/skeleton.d.ts +2 -0
- package/dist/components/ui/slider.d.ts +4 -0
- package/dist/components/ui/snippet.d.ts +18 -0
- package/dist/components/ui/sonner.d.ts +3 -0
- package/dist/components/ui/spinner.d.ts +6 -0
- package/dist/components/ui/switch.d.ts +6 -0
- package/dist/components/ui/table.d.ts +22 -0
- package/dist/components/ui/tabs.d.ts +11 -0
- package/dist/components/ui/tetra-molecule-icon.d.ts +11 -0
- package/dist/components/ui/tetrascience-icon.d.ts +7 -0
- package/dist/components/ui/textarea.d.ts +3 -0
- package/dist/components/ui/toggle-group.d.ts +10 -0
- package/dist/components/ui/toggle.d.ts +9 -0
- package/dist/components/ui/tooltip.d.ts +7 -0
- package/dist/composed/AssistantLayout.cjs +2 -0
- package/dist/composed/AssistantLayout.cjs.map +1 -0
- package/dist/composed/AssistantLayout.js +10 -0
- package/dist/composed/AssistantLayout.js.map +1 -0
- package/dist/composed/Chat.cjs +2 -0
- package/dist/composed/Chat.cjs.map +1 -0
- package/dist/composed/Chat.js +5 -0
- package/dist/composed/Chat.js.map +1 -0
- package/dist/composed/ConfirmDialog.cjs +2 -0
- package/dist/composed/ConfirmDialog.cjs.map +1 -0
- package/dist/composed/ConfirmDialog.js +5 -0
- package/dist/composed/ConfirmDialog.js.map +1 -0
- package/dist/composed/DataAppShell.cjs +2 -0
- package/dist/composed/DataAppShell.cjs.map +1 -0
- package/dist/composed/DataAppShell.js +22 -0
- package/dist/composed/DataAppShell.js.map +1 -0
- package/dist/composed/EmptyState.cjs +2 -0
- package/dist/composed/EmptyState.cjs.map +1 -0
- package/dist/composed/EmptyState.js +5 -0
- package/dist/composed/EmptyState.js.map +1 -0
- package/dist/composed/FormPatterns.cjs +2 -0
- package/dist/composed/FormPatterns.cjs.map +1 -0
- package/dist/composed/FormPatterns.js +5 -0
- package/dist/composed/FormPatterns.js.map +1 -0
- package/dist/composed/MoleculeStructure.cjs +2 -0
- package/dist/composed/MoleculeStructure.cjs.map +1 -0
- package/dist/composed/MoleculeStructure.js +11 -0
- package/dist/composed/MoleculeStructure.js.map +1 -0
- package/dist/composed/PlateMapEditor.cjs +2 -0
- package/dist/composed/PlateMapEditor.cjs.map +1 -0
- package/dist/composed/PlateMapEditor.js +45 -0
- package/dist/composed/PlateMapEditor.js.map +1 -0
- package/dist/composed/ProcessFlow.cjs +2 -0
- package/dist/composed/ProcessFlow.cjs.map +1 -0
- package/dist/composed/ProcessFlow.js +7 -0
- package/dist/composed/ProcessFlow.js.map +1 -0
- package/dist/composed/RichListItem.cjs +2 -0
- package/dist/composed/RichListItem.cjs.map +1 -0
- package/dist/composed/RichListItem.js +6 -0
- package/dist/composed/RichListItem.js.map +1 -0
- package/dist/composed/StatCard.cjs +2 -0
- package/dist/composed/StatCard.cjs.map +1 -0
- package/dist/composed/StatCard.js +5 -0
- package/dist/composed/StatCard.js.map +1 -0
- package/dist/composed/TdpSearch.cjs +2 -0
- package/dist/composed/TdpSearch.cjs.map +1 -0
- package/dist/composed/TdpSearch.js +8 -0
- package/dist/composed/TdpSearch.js.map +1 -0
- package/dist/composed/TopBar.cjs +2 -0
- package/dist/composed/TopBar.cjs.map +1 -0
- package/dist/composed/TopBar.js +6 -0
- package/dist/composed/TopBar.js.map +1 -0
- package/dist/composed/UserMenu.cjs +2 -0
- package/dist/composed/UserMenu.cjs.map +1 -0
- package/dist/composed/UserMenu.js +7 -0
- package/dist/composed/UserMenu.js.map +1 -0
- package/dist/composed/tdp-link.cjs +2 -0
- package/dist/composed/tdp-link.cjs.map +1 -0
- package/dist/composed/tdp-link.js +84 -0
- package/dist/composed/tdp-link.js.map +1 -0
- package/dist/composed/tdp-url.cjs.map +1 -0
- package/dist/composed/tdp-url.js.map +1 -0
- package/dist/hooks/use-code-editor-theme.d.ts +34 -0
- package/dist/hooks/use-element-size.d.ts +25 -0
- package/dist/hooks/use-is-dark.d.ts +12 -0
- package/dist/hooks/use-mobile.d.ts +1 -0
- 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.d.ts +49 -0
- 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 +102 -4404
- package/dist/index.js +698 -659
- package/dist/index.js.map +1 -1
- package/dist/index.tailwind.css +1 -1
- package/dist/jest-setup.cjs +4 -0
- package/dist/jest-setup.cjs.map +1 -0
- package/dist/jest-setup.d.ts +106 -0
- package/dist/jest-setup.js +218 -0
- package/dist/jest-setup.js.map +1 -0
- package/dist/lib/shiki.cjs +2 -0
- package/dist/lib/shiki.cjs.map +1 -0
- package/dist/lib/shiki.d.ts +32 -0
- package/dist/lib/shiki.js +72 -0
- package/dist/lib/shiki.js.map +1 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/server/auth/JwtTokenManager.cjs +1 -1
- package/dist/server/auth/JwtTokenManager.cjs.map +1 -1
- package/dist/server/auth/JwtTokenManager.d.ts +113 -0
- package/dist/server/auth/JwtTokenManager.js +44 -21
- package/dist/server/auth/JwtTokenManager.js.map +1 -1
- package/dist/server/auth/index.d.ts +5 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/providers/AthenaProvider.cjs +1 -1
- package/dist/server/providers/AthenaProvider.cjs.map +1 -1
- package/dist/server/providers/AthenaProvider.d.ts +75 -0
- package/dist/server/providers/DatabricksProvider.cjs +1 -1
- package/dist/server/providers/DatabricksProvider.cjs.map +1 -1
- package/dist/server/providers/DatabricksProvider.d.ts +38 -0
- package/dist/server/providers/SnowflakeProvider.cjs +1 -1
- package/dist/server/providers/SnowflakeProvider.cjs.map +1 -1
- package/dist/server/providers/SnowflakeProvider.d.ts +36 -0
- package/dist/server/providers/buildProvider.d.ts +39 -0
- package/dist/server/providers/entries/athena.d.ts +24 -0
- package/dist/server/providers/entries/databricks.d.ts +25 -0
- package/dist/server/providers/entries/snowflake.d.ts +25 -0
- package/dist/server/providers/exceptions.d.ts +36 -0
- package/dist/server/providers/getProviderConfigurations.d.ts +45 -0
- package/dist/server/providers/index.d.ts +31 -0
- package/dist/server/providers/providerDiscovery.d.ts +81 -0
- package/dist/server/providers/types.d.ts +145 -0
- package/dist/server/search/TdpSearchManager.d.ts +40 -0
- package/dist/server/search/index.d.ts +5 -0
- package/dist/server.d.ts +17 -540
- package/dist/ui/accordion.cjs +2 -0
- package/dist/ui/accordion.cjs.map +1 -0
- package/dist/ui/accordion.js +83 -0
- package/dist/ui/accordion.js.map +1 -0
- package/dist/ui/alert-dialog.cjs +2 -0
- package/dist/ui/alert-dialog.cjs.map +1 -0
- package/dist/ui/alert-dialog.js +181 -0
- package/dist/ui/alert-dialog.js.map +1 -0
- package/dist/ui/alert.cjs +2 -0
- package/dist/ui/alert.cjs.map +1 -0
- package/dist/ui/alert.js +81 -0
- package/dist/ui/alert.js.map +1 -0
- package/dist/ui/aspect-ratio.cjs.map +1 -0
- package/dist/ui/aspect-ratio.js.map +1 -0
- package/dist/ui/avatar.cjs +2 -0
- package/dist/ui/avatar.cjs.map +1 -0
- package/dist/ui/avatar.js +107 -0
- package/dist/ui/avatar.js.map +1 -0
- package/dist/ui/badge.cjs +2 -0
- package/dist/ui/badge.cjs.map +1 -0
- package/dist/ui/badge.js +47 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/banner.cjs +2 -0
- package/dist/ui/banner.cjs.map +1 -0
- package/dist/ui/banner.js +80 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/breadcrumb.cjs +2 -0
- package/dist/ui/breadcrumb.cjs.map +1 -0
- package/dist/ui/breadcrumb.js +118 -0
- package/dist/ui/breadcrumb.js.map +1 -0
- package/dist/ui/button-group.cjs +2 -0
- package/dist/ui/button-group.cjs.map +1 -0
- package/dist/ui/button-group.js +77 -0
- package/dist/ui/button-group.js.map +1 -0
- package/dist/ui/button.cjs +2 -0
- package/dist/ui/button.cjs.map +1 -0
- package/dist/ui/button.js +57 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/calendar.cjs +2 -0
- package/dist/ui/calendar.cjs.map +1 -0
- package/dist/ui/calendar.js +174 -0
- package/dist/ui/calendar.js.map +1 -0
- package/dist/ui/card.cjs +2 -0
- package/dist/ui/card.cjs.map +1 -0
- package/dist/ui/card.js +102 -0
- package/dist/ui/card.js.map +1 -0
- package/dist/ui/carousel.cjs +2 -0
- package/dist/ui/carousel.cjs.map +1 -0
- package/dist/ui/carousel.js +179 -0
- package/dist/ui/carousel.js.map +1 -0
- package/dist/ui/checkbox.cjs +2 -0
- package/dist/ui/checkbox.cjs.map +1 -0
- package/dist/ui/checkbox.js +35 -0
- package/dist/ui/checkbox.js.map +1 -0
- package/dist/ui/code-block.cjs +4 -0
- package/dist/ui/code-block.cjs.map +1 -0
- package/dist/ui/code-block.js +324 -0
- package/dist/ui/code-block.js.map +1 -0
- package/dist/ui/code-editor.cjs +2 -0
- package/dist/ui/code-editor.cjs.map +1 -0
- package/dist/ui/code-editor.js +106 -0
- package/dist/ui/code-editor.js.map +1 -0
- package/dist/ui/collapsible.cjs.map +1 -0
- package/dist/ui/collapsible.js.map +1 -0
- package/dist/ui/combobox.cjs +2 -0
- package/dist/ui/combobox.cjs.map +1 -0
- package/dist/ui/combobox.js +285 -0
- package/dist/ui/combobox.js.map +1 -0
- package/dist/ui/command.cjs +2 -0
- package/dist/ui/command.cjs.map +1 -0
- package/dist/ui/command.js +178 -0
- package/dist/ui/command.js.map +1 -0
- package/dist/ui/context-menu.cjs +2 -0
- package/dist/ui/context-menu.cjs.map +1 -0
- package/dist/ui/context-menu.js +236 -0
- package/dist/ui/context-menu.js.map +1 -0
- package/dist/ui/data-table.cjs +2 -0
- package/dist/ui/data-table.cjs.map +1 -0
- package/dist/ui/data-table.js +16 -0
- package/dist/ui/data-table.js.map +1 -0
- package/dist/ui/dialog.cjs +2 -0
- package/dist/ui/dialog.cjs.map +1 -0
- package/dist/ui/dialog.js +165 -0
- package/dist/ui/dialog.js.map +1 -0
- package/dist/ui/dropdown-menu.cjs +2 -0
- package/dist/ui/dropdown-menu.cjs.map +1 -0
- package/dist/ui/dropdown-menu.js +260 -0
- package/dist/ui/dropdown-menu.js.map +1 -0
- package/dist/ui/field.cjs +2 -0
- package/dist/ui/field.cjs.map +1 -0
- package/dist/ui/field.js +210 -0
- package/dist/ui/field.js.map +1 -0
- package/dist/ui/hover-card.cjs +2 -0
- package/dist/ui/hover-card.cjs.map +1 -0
- package/dist/ui/hover-card.js +39 -0
- package/dist/ui/hover-card.js.map +1 -0
- package/dist/ui/input-group.cjs +2 -0
- package/dist/ui/input-group.cjs.map +1 -0
- package/dist/ui/input-group.js +145 -0
- package/dist/ui/input-group.js.map +1 -0
- package/dist/ui/input.cjs +2 -0
- package/dist/ui/input.cjs.map +1 -0
- package/dist/ui/input.js +20 -0
- package/dist/ui/input.js.map +1 -0
- package/dist/ui/item.cjs +2 -0
- package/dist/ui/item.cjs.map +1 -0
- package/dist/ui/item.js +199 -0
- package/dist/ui/item.js.map +1 -0
- package/dist/ui/kbd.cjs +2 -0
- package/dist/ui/kbd.cjs.map +1 -0
- package/dist/ui/kbd.js +30 -0
- package/dist/ui/kbd.js.map +1 -0
- package/dist/ui/label.cjs +2 -0
- package/dist/ui/label.cjs.map +1 -0
- package/dist/ui/label.js +23 -0
- package/dist/ui/label.js.map +1 -0
- package/dist/ui/menubar.cjs +2 -0
- package/dist/ui/menubar.cjs.map +1 -0
- package/dist/ui/menubar.js +256 -0
- package/dist/ui/menubar.js.map +1 -0
- package/dist/ui/navigation-menu.cjs +2 -0
- package/dist/ui/navigation-menu.cjs.map +1 -0
- package/dist/ui/navigation-menu.js +164 -0
- package/dist/ui/navigation-menu.js.map +1 -0
- package/dist/ui/popover.cjs +2 -0
- package/dist/ui/popover.cjs.map +1 -0
- package/dist/ui/popover.js +45 -0
- package/dist/ui/popover.js.map +1 -0
- package/dist/ui/radio-group.cjs +2 -0
- package/dist/ui/radio-group.cjs.map +1 -0
- package/dist/ui/radio-group.js +45 -0
- package/dist/ui/radio-group.js.map +1 -0
- package/dist/ui/resizable.cjs +2 -0
- package/dist/ui/resizable.cjs.map +1 -0
- package/dist/ui/resizable.js +58 -0
- package/dist/ui/resizable.js.map +1 -0
- package/dist/ui/scroll-area.cjs +2 -0
- package/dist/ui/scroll-area.cjs.map +1 -0
- package/dist/ui/scroll-area.js +61 -0
- package/dist/ui/scroll-area.js.map +1 -0
- package/dist/ui/select.cjs +2 -0
- package/dist/ui/select.cjs.map +1 -0
- package/dist/ui/select.js +184 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/separator.cjs +2 -0
- package/dist/ui/separator.cjs.map +1 -0
- package/dist/ui/separator.js +27 -0
- package/dist/ui/separator.js.map +1 -0
- package/dist/ui/sheet.cjs +2 -0
- package/dist/ui/sheet.cjs.map +1 -0
- package/dist/ui/sheet.js +137 -0
- package/dist/ui/sheet.js.map +1 -0
- package/dist/ui/sidebar.cjs +2 -0
- package/dist/ui/sidebar.cjs.map +1 -0
- package/dist/ui/sidebar.js +579 -0
- package/dist/ui/sidebar.js.map +1 -0
- package/dist/ui/skeleton.cjs +2 -0
- package/dist/ui/skeleton.cjs.map +1 -0
- package/dist/ui/skeleton.js +24 -0
- package/dist/ui/skeleton.js.map +1 -0
- package/dist/ui/slider.cjs +2 -0
- package/dist/ui/slider.cjs.map +1 -0
- package/dist/ui/slider.js +61 -0
- package/dist/ui/slider.js.map +1 -0
- package/dist/ui/sonner.cjs +2 -0
- package/dist/ui/sonner.cjs.map +1 -0
- package/dist/ui/sonner.js +52 -0
- package/dist/ui/sonner.js.map +1 -0
- package/dist/ui/spinner.cjs +2 -0
- package/dist/ui/spinner.cjs.map +1 -0
- package/dist/ui/spinner.js +39 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/switch.cjs +2 -0
- package/dist/ui/switch.cjs.map +1 -0
- package/dist/ui/switch.js +32 -0
- package/dist/ui/switch.js.map +1 -0
- package/dist/ui/table.cjs +2 -0
- package/dist/ui/table.cjs.map +1 -0
- package/dist/ui/table.js +153 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/tabs.cjs +2 -0
- package/dist/ui/tabs.cjs.map +1 -0
- package/dist/ui/tabs.js +92 -0
- package/dist/ui/tabs.js.map +1 -0
- package/dist/ui/tetra-molecule-icon.cjs +2 -0
- package/dist/ui/tetra-molecule-icon.cjs.map +1 -0
- package/dist/ui/tetra-molecule-icon.js +50 -0
- package/dist/ui/tetra-molecule-icon.js.map +1 -0
- package/dist/ui/tetrascience-icon.cjs +2 -0
- package/dist/ui/tetrascience-icon.cjs.map +1 -0
- package/dist/ui/tetrascience-icon.js +47 -0
- package/dist/ui/tetrascience-icon.js.map +1 -0
- package/dist/ui/textarea.cjs +2 -0
- package/dist/ui/textarea.cjs.map +1 -0
- package/dist/ui/textarea.js +19 -0
- package/dist/ui/textarea.js.map +1 -0
- package/dist/ui/toggle-group.cjs +2 -0
- package/dist/ui/toggle-group.cjs.map +1 -0
- package/dist/ui/toggle-group.js +81 -0
- package/dist/ui/toggle-group.js.map +1 -0
- package/dist/ui/toggle.cjs +2 -0
- package/dist/ui/toggle.cjs.map +1 -0
- package/dist/ui/toggle.js +44 -0
- package/dist/ui/toggle.js.map +1 -0
- package/dist/ui/tooltip.cjs +2 -0
- package/dist/ui/tooltip.cjs.map +1 -0
- package/dist/ui/tooltip.js +56 -0
- package/dist/ui/tooltip.js.map +1 -0
- package/dist/utils/colors.d.ts +50 -0
- package/package.json +137 -24
- package/dist/athena.d.ts +0 -167
- package/dist/components/ai/attachments.cjs +0 -2
- package/dist/components/ai/attachments.cjs.map +0 -1
- package/dist/components/ai/attachments.js +0 -224
- package/dist/components/ai/attachments.js.map +0 -1
- package/dist/components/ai/chain-of-thought.cjs +0 -2
- package/dist/components/ai/chain-of-thought.cjs.map +0 -1
- package/dist/components/ai/chain-of-thought.js +0 -145
- package/dist/components/ai/chain-of-thought.js.map +0 -1
- package/dist/components/ai/confirmation.cjs +0 -2
- package/dist/components/ai/confirmation.cjs.map +0 -1
- package/dist/components/ai/confirmation.js +0 -109
- package/dist/components/ai/confirmation.js.map +0 -1
- package/dist/components/ai/context.cjs +0 -2
- package/dist/components/ai/context.cjs.map +0 -1
- package/dist/components/ai/context.js +0 -266
- package/dist/components/ai/context.js.map +0 -1
- package/dist/components/ai/conversation.cjs +0 -4
- package/dist/components/ai/conversation.cjs.map +0 -1
- package/dist/components/ai/conversation.js +0 -108
- package/dist/components/ai/conversation.js.map +0 -1
- package/dist/components/ai/inline-citation.cjs +0 -2
- package/dist/components/ai/inline-citation.cjs.map +0 -1
- package/dist/components/ai/inline-citation.js +0 -182
- package/dist/components/ai/inline-citation.js.map +0 -1
- package/dist/components/ai/message.cjs +0 -2
- package/dist/components/ai/message.cjs.map +0 -1
- package/dist/components/ai/message.js +0 -237
- package/dist/components/ai/message.js.map +0 -1
- package/dist/components/ai/model-selector.cjs +0 -2
- package/dist/components/ai/model-selector.cjs.map +0 -1
- package/dist/components/ai/model-selector.js +0 -77
- package/dist/components/ai/model-selector.js.map +0 -1
- package/dist/components/ai/prompt-input.cjs +0 -2
- package/dist/components/ai/prompt-input.cjs.map +0 -1
- package/dist/components/ai/prompt-input.js +0 -774
- package/dist/components/ai/prompt-input.js.map +0 -1
- package/dist/components/ai/queue.cjs +0 -2
- package/dist/components/ai/queue.cjs.map +0 -1
- package/dist/components/ai/queue.js +0 -209
- package/dist/components/ai/queue.js.map +0 -1
- package/dist/components/ai/reasoning.cjs +0 -2
- package/dist/components/ai/reasoning.cjs.map +0 -1
- package/dist/components/ai/reasoning.js +0 -129
- package/dist/components/ai/reasoning.js.map +0 -1
- package/dist/components/ai/shimmer.cjs +0 -2
- package/dist/components/ai/shimmer.cjs.map +0 -1
- package/dist/components/ai/shimmer.js +0 -49
- package/dist/components/ai/shimmer.js.map +0 -1
- package/dist/components/ai/sources.cjs +0 -2
- package/dist/components/ai/sources.cjs.map +0 -1
- package/dist/components/ai/sources.js +0 -54
- package/dist/components/ai/sources.js.map +0 -1
- package/dist/components/ai/speech-input.cjs +0 -2
- package/dist/components/ai/speech-input.cjs.map +0 -1
- package/dist/components/ai/speech-input.js +0 -123
- package/dist/components/ai/speech-input.js.map +0 -1
- package/dist/components/ai/stream-status.cjs +0 -2
- package/dist/components/ai/stream-status.cjs.map +0 -1
- package/dist/components/ai/stream-status.js +0 -106
- package/dist/components/ai/stream-status.js.map +0 -1
- package/dist/components/ai/suggestion.cjs +0 -2
- package/dist/components/ai/suggestion.cjs.map +0 -1
- package/dist/components/ai/suggestion.js +0 -38
- package/dist/components/ai/suggestion.js.map +0 -1
- package/dist/components/ai/task.cjs +0 -2
- package/dist/components/ai/task.cjs.map +0 -1
- package/dist/components/ai/task.js +0 -94
- package/dist/components/ai/task.js.map +0 -1
- package/dist/components/ai/tool.cjs +0 -2
- package/dist/components/ai/tool.cjs.map +0 -1
- package/dist/components/ai/tool.js +0 -143
- package/dist/components/ai/tool.js.map +0 -1
- 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 +0 -209
- 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 +0 -2
- package/dist/components/charts/ChromatogramChart/constants.cjs.map +0 -1
- package/dist/components/charts/ChromatogramChart/constants.js +0 -30
- 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/composed/tdp-link.cjs +0 -2
- package/dist/components/composed/tdp-link.cjs.map +0 -1
- package/dist/components/composed/tdp-link.js +0 -84
- package/dist/components/composed/tdp-link.js.map +0 -1
- package/dist/components/composed/tdp-url.cjs.map +0 -1
- package/dist/components/composed/tdp-url.js.map +0 -1
- package/dist/components/ui/accordion.cjs +0 -2
- package/dist/components/ui/accordion.cjs.map +0 -1
- package/dist/components/ui/accordion.js +0 -83
- package/dist/components/ui/accordion.js.map +0 -1
- package/dist/components/ui/alert-dialog.cjs +0 -2
- package/dist/components/ui/alert-dialog.cjs.map +0 -1
- package/dist/components/ui/alert-dialog.js +0 -181
- package/dist/components/ui/alert-dialog.js.map +0 -1
- package/dist/components/ui/alert.cjs +0 -2
- package/dist/components/ui/alert.cjs.map +0 -1
- package/dist/components/ui/alert.js +0 -81
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/aspect-ratio.cjs.map +0 -1
- package/dist/components/ui/aspect-ratio.js.map +0 -1
- package/dist/components/ui/avatar.cjs +0 -2
- package/dist/components/ui/avatar.cjs.map +0 -1
- package/dist/components/ui/avatar.js +0 -107
- package/dist/components/ui/avatar.js.map +0 -1
- package/dist/components/ui/badge.cjs +0 -2
- package/dist/components/ui/badge.cjs.map +0 -1
- package/dist/components/ui/badge.js +0 -47
- package/dist/components/ui/badge.js.map +0 -1
- package/dist/components/ui/banner.cjs +0 -2
- package/dist/components/ui/banner.cjs.map +0 -1
- package/dist/components/ui/banner.js +0 -80
- package/dist/components/ui/banner.js.map +0 -1
- package/dist/components/ui/breadcrumb.cjs +0 -2
- package/dist/components/ui/breadcrumb.cjs.map +0 -1
- package/dist/components/ui/breadcrumb.js +0 -118
- package/dist/components/ui/breadcrumb.js.map +0 -1
- package/dist/components/ui/button-group.cjs +0 -2
- package/dist/components/ui/button-group.cjs.map +0 -1
- package/dist/components/ui/button-group.js +0 -77
- package/dist/components/ui/button-group.js.map +0 -1
- package/dist/components/ui/button.cjs +0 -2
- package/dist/components/ui/button.cjs.map +0 -1
- package/dist/components/ui/button.js +0 -57
- package/dist/components/ui/button.js.map +0 -1
- package/dist/components/ui/calendar.cjs +0 -2
- package/dist/components/ui/calendar.cjs.map +0 -1
- package/dist/components/ui/calendar.js +0 -174
- package/dist/components/ui/calendar.js.map +0 -1
- package/dist/components/ui/card.cjs +0 -2
- package/dist/components/ui/card.cjs.map +0 -1
- package/dist/components/ui/card.js +0 -102
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/carousel.cjs +0 -2
- package/dist/components/ui/carousel.cjs.map +0 -1
- package/dist/components/ui/carousel.js +0 -179
- package/dist/components/ui/carousel.js.map +0 -1
- package/dist/components/ui/checkbox.cjs +0 -2
- package/dist/components/ui/checkbox.cjs.map +0 -1
- package/dist/components/ui/checkbox.js +0 -35
- package/dist/components/ui/checkbox.js.map +0 -1
- package/dist/components/ui/code-block.cjs +0 -4
- package/dist/components/ui/code-block.cjs.map +0 -1
- package/dist/components/ui/code-block.js +0 -306
- package/dist/components/ui/code-block.js.map +0 -1
- package/dist/components/ui/code-editor.cjs +0 -2
- package/dist/components/ui/code-editor.cjs.map +0 -1
- package/dist/components/ui/code-editor.js +0 -103
- package/dist/components/ui/code-editor.js.map +0 -1
- package/dist/components/ui/collapsible.cjs.map +0 -1
- package/dist/components/ui/collapsible.js.map +0 -1
- package/dist/components/ui/combobox.cjs +0 -2
- package/dist/components/ui/combobox.cjs.map +0 -1
- package/dist/components/ui/combobox.js +0 -281
- package/dist/components/ui/combobox.js.map +0 -1
- package/dist/components/ui/command.cjs +0 -2
- package/dist/components/ui/command.cjs.map +0 -1
- package/dist/components/ui/command.js +0 -174
- package/dist/components/ui/command.js.map +0 -1
- package/dist/components/ui/context-menu.cjs +0 -2
- package/dist/components/ui/context-menu.cjs.map +0 -1
- package/dist/components/ui/context-menu.js +0 -236
- package/dist/components/ui/context-menu.js.map +0 -1
- package/dist/components/ui/dialog.cjs +0 -2
- package/dist/components/ui/dialog.cjs.map +0 -1
- package/dist/components/ui/dialog.js +0 -165
- package/dist/components/ui/dialog.js.map +0 -1
- package/dist/components/ui/drawer.cjs +0 -2
- package/dist/components/ui/drawer.cjs.map +0 -1
- package/dist/components/ui/drawer.js +0 -125
- package/dist/components/ui/drawer.js.map +0 -1
- package/dist/components/ui/dropdown-menu.cjs +0 -2
- package/dist/components/ui/dropdown-menu.cjs.map +0 -1
- package/dist/components/ui/dropdown-menu.js +0 -252
- package/dist/components/ui/dropdown-menu.js.map +0 -1
- package/dist/components/ui/field.cjs +0 -2
- package/dist/components/ui/field.cjs.map +0 -1
- package/dist/components/ui/field.js +0 -210
- package/dist/components/ui/field.js.map +0 -1
- package/dist/components/ui/hover-card.cjs +0 -2
- package/dist/components/ui/hover-card.cjs.map +0 -1
- package/dist/components/ui/hover-card.js +0 -39
- package/dist/components/ui/hover-card.js.map +0 -1
- package/dist/components/ui/input-group.cjs +0 -2
- package/dist/components/ui/input-group.cjs.map +0 -1
- package/dist/components/ui/input-group.js +0 -145
- package/dist/components/ui/input-group.js.map +0 -1
- package/dist/components/ui/input-otp.cjs +0 -2
- package/dist/components/ui/input-otp.cjs.map +0 -1
- package/dist/components/ui/input-otp.js +0 -82
- package/dist/components/ui/input-otp.js.map +0 -1
- package/dist/components/ui/input.cjs +0 -2
- package/dist/components/ui/input.cjs.map +0 -1
- package/dist/components/ui/input.js +0 -20
- package/dist/components/ui/input.js.map +0 -1
- package/dist/components/ui/item.cjs +0 -2
- package/dist/components/ui/item.cjs.map +0 -1
- package/dist/components/ui/item.js +0 -191
- package/dist/components/ui/item.js.map +0 -1
- package/dist/components/ui/kbd.cjs +0 -2
- package/dist/components/ui/kbd.cjs.map +0 -1
- package/dist/components/ui/kbd.js +0 -30
- package/dist/components/ui/kbd.js.map +0 -1
- package/dist/components/ui/label.cjs +0 -2
- package/dist/components/ui/label.cjs.map +0 -1
- package/dist/components/ui/label.js +0 -23
- package/dist/components/ui/label.js.map +0 -1
- package/dist/components/ui/menubar.cjs +0 -2
- package/dist/components/ui/menubar.cjs.map +0 -1
- package/dist/components/ui/menubar.js +0 -256
- package/dist/components/ui/menubar.js.map +0 -1
- package/dist/components/ui/navigation-menu.cjs +0 -2
- package/dist/components/ui/navigation-menu.cjs.map +0 -1
- package/dist/components/ui/navigation-menu.js +0 -164
- package/dist/components/ui/navigation-menu.js.map +0 -1
- package/dist/components/ui/popover.cjs +0 -2
- package/dist/components/ui/popover.cjs.map +0 -1
- package/dist/components/ui/popover.js +0 -45
- package/dist/components/ui/popover.js.map +0 -1
- package/dist/components/ui/radio-group.cjs +0 -2
- package/dist/components/ui/radio-group.cjs.map +0 -1
- package/dist/components/ui/radio-group.js +0 -45
- package/dist/components/ui/radio-group.js.map +0 -1
- package/dist/components/ui/resizable.cjs +0 -2
- package/dist/components/ui/resizable.cjs.map +0 -1
- package/dist/components/ui/resizable.js +0 -58
- package/dist/components/ui/resizable.js.map +0 -1
- package/dist/components/ui/scroll-area.cjs +0 -2
- package/dist/components/ui/scroll-area.cjs.map +0 -1
- package/dist/components/ui/scroll-area.js +0 -60
- package/dist/components/ui/scroll-area.js.map +0 -1
- package/dist/components/ui/select.cjs +0 -2
- package/dist/components/ui/select.cjs.map +0 -1
- package/dist/components/ui/select.js +0 -184
- package/dist/components/ui/select.js.map +0 -1
- package/dist/components/ui/separator.cjs +0 -2
- package/dist/components/ui/separator.cjs.map +0 -1
- package/dist/components/ui/separator.js +0 -27
- package/dist/components/ui/separator.js.map +0 -1
- package/dist/components/ui/sheet.cjs +0 -2
- package/dist/components/ui/sheet.cjs.map +0 -1
- package/dist/components/ui/sheet.js +0 -137
- package/dist/components/ui/sheet.js.map +0 -1
- package/dist/components/ui/sidebar.cjs +0 -2
- package/dist/components/ui/sidebar.cjs.map +0 -1
- package/dist/components/ui/sidebar.js +0 -579
- package/dist/components/ui/sidebar.js.map +0 -1
- package/dist/components/ui/skeleton.cjs +0 -2
- package/dist/components/ui/skeleton.cjs.map +0 -1
- package/dist/components/ui/skeleton.js +0 -24
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/slider.cjs +0 -2
- package/dist/components/ui/slider.cjs.map +0 -1
- package/dist/components/ui/slider.js +0 -60
- package/dist/components/ui/slider.js.map +0 -1
- package/dist/components/ui/sonner.cjs +0 -2
- package/dist/components/ui/sonner.cjs.map +0 -1
- package/dist/components/ui/sonner.js +0 -37
- package/dist/components/ui/sonner.js.map +0 -1
- package/dist/components/ui/spinner.cjs +0 -2
- package/dist/components/ui/spinner.cjs.map +0 -1
- package/dist/components/ui/spinner.js +0 -39
- package/dist/components/ui/spinner.js.map +0 -1
- package/dist/components/ui/switch.cjs +0 -2
- package/dist/components/ui/switch.cjs.map +0 -1
- package/dist/components/ui/switch.js +0 -32
- package/dist/components/ui/switch.js.map +0 -1
- package/dist/components/ui/table.cjs +0 -2
- package/dist/components/ui/table.cjs.map +0 -1
- package/dist/components/ui/table.js +0 -152
- package/dist/components/ui/table.js.map +0 -1
- package/dist/components/ui/tabs.cjs +0 -2
- package/dist/components/ui/tabs.cjs.map +0 -1
- package/dist/components/ui/tabs.js +0 -92
- package/dist/components/ui/tabs.js.map +0 -1
- package/dist/components/ui/tetrascience-icon.cjs +0 -2
- package/dist/components/ui/tetrascience-icon.cjs.map +0 -1
- package/dist/components/ui/tetrascience-icon.js +0 -46
- package/dist/components/ui/tetrascience-icon.js.map +0 -1
- package/dist/components/ui/textarea.cjs +0 -2
- package/dist/components/ui/textarea.cjs.map +0 -1
- package/dist/components/ui/textarea.js +0 -19
- package/dist/components/ui/textarea.js.map +0 -1
- package/dist/components/ui/toggle-group.cjs +0 -2
- package/dist/components/ui/toggle-group.cjs.map +0 -1
- package/dist/components/ui/toggle-group.js +0 -77
- package/dist/components/ui/toggle-group.js.map +0 -1
- package/dist/components/ui/toggle.cjs +0 -2
- package/dist/components/ui/toggle.cjs.map +0 -1
- package/dist/components/ui/toggle.js +0 -44
- package/dist/components/ui/toggle.js.map +0 -1
- package/dist/components/ui/tooltip.cjs +0 -2
- package/dist/components/ui/tooltip.cjs.map +0 -1
- package/dist/components/ui/tooltip.js +0 -56
- package/dist/components/ui/tooltip.js.map +0 -1
- package/dist/databricks.d.ts +0 -129
- package/dist/providers/athena.d.ts +0 -9
- package/dist/providers/databricks.d.ts +0 -9
- package/dist/providers/snowflake.d.ts +0 -9
- package/dist/snowflake.d.ts +0 -125
- /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.cjs +0 -0
- /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.js +0 -0
- /package/dist/{components/composed → composed}/tdp-url.cjs +0 -0
- /package/dist/{components/composed → composed}/tdp-url.js +0 -0
- /package/dist/{components/ui → ui}/aspect-ratio.cjs +0 -0
- /package/dist/{components/ui → ui}/aspect-ratio.js +0 -0
- /package/dist/{components/ui → ui}/collapsible.cjs +0 -0
- /package/dist/{components/ui → ui}/collapsible.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatePaintGrid.js","sources":["../../../../src/components/composed/PlateMapEditor/PlatePaintGrid.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { parsePos, pos, rectPositions, resolveDimensions, rowLabel } from \"./wellGrid\";\n\nimport type { PlateDimensions, PlateFormat, WellId, WellRecord } from \"./types\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst DEFAULT_CELL = 34;\nconst DEFAULT_MIN_AUTO_CELL = 24;\nconst DEFAULT_MAX_AUTO_CELL = 72;\nconst DEFAULT_MAX_DENSE_AUTO_CELL = 36;\nconst LABEL_PAD = 26;\nconst FRAME_PADDING_PX = 12;\nconst FRAME_BORDER_PX = 1;\nconst LABEL_FONT_SIZE = 16;\nconst LABEL_TEXT_INSET = 9;\nconst LABEL_BASELINE_OFFSET = 5;\nconst WELL_INSET = 1;\nconst STROKE_DEFAULT = 4;\nconst STROKE_SELECTED = 4;\nconst STROKE_HIGHLIGHT = 3;\nconst STROKE_FLASH = 5;\nconst FLASH_DURATION_MS = 650;\nexport const PLATE_MAP_EMPTY_WELL_FILL = \"var(--surface-container)\";\nexport const PLATE_MAP_CELL_BORDER = \"var(--border)\";\n\nexport type WellShape = \"rect\" | \"circle\";\n\nexport interface PlatePaintGridProps<T extends WellRecord = WellRecord> {\n format: PlateFormat;\n rows?: number;\n columns?: number;\n values: Map<WellId, T>;\n selection: Set<WellId>;\n onSelectionChange: (next: Set<WellId>) => void;\n /** Returns the fill color for a given well record (or undefined if empty). */\n colorForWell: (well: T | undefined, wellId: WellId) => string;\n /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */\n emptyWellFillColor?: string | null;\n /** Geometric shape of each well. `\"circle\"` matches scientific plate visuals. Defaults to `\"rect\"`. */\n wellShape?: WellShape;\n /**\n * When true, wraps the grid in a card-like surface (rounded, bordered,\n * padded, soft shadow) so it reads as a physical plate. Pairs well with\n * `wellShape=\"circle\"`.\n */\n framed?: boolean;\n /** Pixel size of each well cell. Defaults to 34 when fixed. */\n cellSize?: number;\n /** Resize wells to fill available width when `cellSize` is not fixed. */\n autoScale?: boolean;\n minCellSize?: number;\n /** Defaults to 72 for 96-well style plates and 36 for denser plates. */\n maxCellSize?: number;\n /** Stroke color for non-selected wells. Defaults to a light border. */\n borderColor?: string;\n /** Stroke color for selected wells. Defaults to the kit primary blue. */\n selectedBorderColor?: string;\n /** Fill color for selected wells. Defaults to the kit primary blue. */\n selectedFillColor?: string;\n /** Selected fill opacity. */\n selectedFillOpacity?: number;\n /** Whether selected wells use the selection fill or keep their assigned well color. */\n selectionFillMode?: \"selection\" | \"well\";\n /** Well id that should briefly flash, usually after a double-click assignment. */\n flashWellId?: WellId;\n /** Changing this value restarts the flash animation for the same well. */\n flashWellKey?: number;\n /**\n * Well ids that should render with a highlight ring. Used for cross-component\n * hover sync (e.g. hovering a legend item to highlight matching wells).\n */\n highlightedWellIds?: ReadonlySet<WellId>;\n /** Stroke color for highlighted wells. Defaults to the kit primary blue. */\n highlightBorderColor?: string;\n onWellHover?: (wellId: WellId | null) => void;\n onWellDoubleClick?: (wellId: WellId) => void;\n /**\n * Optional render-prop invoked once per well. The returned node is placed\n * inside an absolutely-positioned cell on top of the SVG, sized to\n * `cellSize`. The wrapper layer is `pointer-events: none` so the SVG keeps\n * pointer interaction by default; consumers wiring drop targets are expected\n * to set `pointer-events: auto` on their own element while a drag is active.\n */\n wrapWell?: (wellId: WellId, cellSize: number) => React.ReactNode;\n className?: string;\n}\n\ntype DragMode = \"replace\" | \"add\" | \"remove\";\n\ninterface DragState {\n start: { r: number; c: number };\n cur: { r: number; c: number };\n mode: DragMode;\n}\n\nfunction buildColumnLabels(columns: number, cellSize: number): React.ReactNode[] {\n const labels: React.ReactNode[] = [];\n for (let c = 0; c < columns; c++) {\n labels.push(\n <text\n key={`c${c}`}\n x={LABEL_PAD + c * cellSize + cellSize / 2}\n y={LABEL_PAD / 2}\n textAnchor=\"middle\"\n fontSize={LABEL_FONT_SIZE}\n className=\"fill-muted-foreground\"\n >\n {c + 1}\n </text>,\n );\n }\n return labels;\n}\n\nfunction buildRowLabels(rows: number, cellSize: number): React.ReactNode[] {\n const labels: React.ReactNode[] = [];\n for (let r = 0; r < rows; r++) {\n labels.push(\n <text\n key={`r${r}`}\n x={LABEL_PAD - LABEL_TEXT_INSET}\n y={LABEL_PAD + r * cellSize + cellSize / 2 + LABEL_BASELINE_OFFSET}\n textAnchor=\"end\"\n fontSize={LABEL_FONT_SIZE}\n className=\"fill-muted-foreground\"\n >\n {rowLabel(r)}\n </text>,\n );\n }\n return labels;\n}\n\ninterface BuildWellCellsArgs<T extends WellRecord> {\n dims: PlateDimensions;\n cellSize: number;\n values: Map<WellId, T>;\n selection: Set<WellId>;\n dragPositions: Set<WellId>;\n colorForWell: (well: T | undefined, wellId: WellId) => string;\n emptyWellFillColor: string | null;\n borderColor: string;\n selectedBorderColor: string;\n selectedFillColor: string;\n selectedFillOpacity: number;\n selectionFillMode: \"selection\" | \"well\";\n wellShape: WellShape;\n highlightedWellIds: ReadonlySet<WellId>;\n highlightBorderColor: string;\n flashWellId?: WellId;\n flashWellKey?: number;\n}\n\nfunction buildWellCell<T extends WellRecord>(\n args: BuildWellCellsArgs<T>,\n row: number,\n column: number,\n): React.ReactNode {\n const {\n dims,\n cellSize,\n values,\n selection,\n dragPositions,\n colorForWell,\n emptyWellFillColor,\n selectedFillColor,\n selectedFillOpacity,\n selectionFillMode,\n wellShape,\n } = args;\n const id = pos(row, column, dims.columns);\n const entry = values.get(id);\n const isSelected = selection.has(id) || dragPositions.has(id);\n const wellFill = entry === undefined && emptyWellFillColor !== null ? emptyWellFillColor : colorForWell(entry, id);\n const usesWellFill = isSelected && selectionFillMode === \"well\" && entry !== undefined;\n const usesSelectionFill = isSelected && !usesWellFill;\n const fill = usesSelectionFill ? selectedFillColor : wellFill;\n const fillOpacity = usesSelectionFill ? selectedFillOpacity : undefined;\n\n if (wellShape === \"circle\") {\n const cx = LABEL_PAD + column * cellSize + cellSize / 2;\n const cy = LABEL_PAD + row * cellSize + cellSize / 2;\n const r = cellSize / 2 - WELL_INSET;\n return (\n <circle\n key={id}\n cx={cx}\n cy={cy}\n r={r}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke=\"none\"\n data-well={id}\n data-selected={isSelected ? \"true\" : undefined}\n />\n );\n }\n\n return (\n <rect\n key={id}\n x={LABEL_PAD + column * cellSize}\n y={LABEL_PAD + row * cellSize}\n width={cellSize}\n height={cellSize}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke=\"none\"\n data-well={id}\n data-selected={isSelected ? \"true\" : undefined}\n />\n );\n}\n\nfunction buildWellCells<T extends WellRecord>({ dims, ...args }: BuildWellCellsArgs<T>): React.ReactNode[] {\n const cells: React.ReactNode[] = [];\n for (let r = 0; r < dims.rows; r++) {\n for (let c = 0; c < dims.columns; c++) {\n cells.push(buildWellCell({ dims, ...args }, r, c));\n }\n }\n return cells;\n}\n\nfunction buildGridLines(dims: PlateDimensions, cellSize: number, borderColor: string): React.ReactNode[] {\n const lines: React.ReactNode[] = [];\n const left = LABEL_PAD;\n const top = LABEL_PAD;\n const right = LABEL_PAD + dims.columns * cellSize;\n const bottom = LABEL_PAD + dims.rows * cellSize;\n\n for (let c = 0; c <= dims.columns; c++) {\n const x = LABEL_PAD + c * cellSize;\n lines.push(\n <line\n key={`grid-col-${c}`}\n x1={x}\n y1={top}\n x2={x}\n y2={bottom}\n stroke={borderColor}\n strokeWidth={STROKE_DEFAULT}\n vectorEffect=\"non-scaling-stroke\"\n shapeRendering=\"crispEdges\"\n pointerEvents=\"none\"\n data-plate-grid-line={`column-${c}`}\n />,\n );\n }\n\n for (let r = 0; r <= dims.rows; r++) {\n const y = LABEL_PAD + r * cellSize;\n lines.push(\n <line\n key={`grid-row-${r}`}\n x1={left}\n y1={y}\n x2={right}\n y2={y}\n stroke={borderColor}\n strokeWidth={STROKE_DEFAULT}\n vectorEffect=\"non-scaling-stroke\"\n shapeRendering=\"crispEdges\"\n pointerEvents=\"none\"\n data-plate-grid-line={`row-${r}`}\n />,\n );\n }\n\n return lines;\n}\n\nfunction buildWellOverlay<T extends WellRecord>(\n args: BuildWellCellsArgs<T>,\n row: number,\n column: number,\n): React.ReactNode {\n const {\n dims,\n cellSize,\n selection,\n dragPositions,\n selectedBorderColor,\n flashWellId,\n flashWellKey,\n wellShape,\n highlightedWellIds,\n highlightBorderColor,\n } = args;\n const id = pos(row, column, dims.columns);\n const isSelected = selection.has(id) || dragPositions.has(id);\n const isFlashing = flashWellId === id;\n const isHighlighted = !isSelected && highlightedWellIds.has(id);\n\n if (!isSelected && !isFlashing && !isHighlighted) return null;\n\n const x = LABEL_PAD + column * cellSize + WELL_INSET;\n const y = LABEL_PAD + row * cellSize + WELL_INSET;\n const size = cellSize - WELL_INSET * 2;\n const cx = LABEL_PAD + column * cellSize + cellSize / 2;\n const cy = LABEL_PAD + row * cellSize + cellSize / 2;\n const r = cellSize / 2 - WELL_INSET;\n const isCircle = wellShape === \"circle\";\n\n type WellShapeProps = Record<string, string | number | undefined>;\n const shapeProps: WellShapeProps = isCircle\n ? { cx, cy, r }\n : { x, y, width: size, height: size };\n\n const renderShape = (\n extraProps: Record<string, string | number | undefined>,\n children?: React.ReactNode,\n elementKey?: string | number,\n ): React.ReactNode => {\n const props = { ...shapeProps, ...extraProps, pointerEvents: \"none\" as const };\n return isCircle ? (\n <circle key={elementKey} {...props}>\n {children}\n </circle>\n ) : (\n <rect key={elementKey} {...props}>\n {children}\n </rect>\n );\n };\n\n const flashAnimations = (\n <>\n <animate attributeName=\"fill-opacity\" values=\"0.24;0.1;0\" dur={`${FLASH_DURATION_MS}ms`} fill=\"freeze\" />\n <animate attributeName=\"stroke-opacity\" values=\"0.92;0.42;0\" dur={`${FLASH_DURATION_MS}ms`} fill=\"freeze\" />\n <animate\n attributeName=\"stroke-width\"\n values={`${STROKE_FLASH};${STROKE_SELECTED}`}\n dur={`${FLASH_DURATION_MS}ms`}\n fill=\"freeze\"\n />\n </>\n );\n\n return (\n <g key={`overlay-${id}`}>\n {isSelected\n ? renderShape({\n fill: \"none\",\n stroke: selectedBorderColor,\n strokeWidth: STROKE_SELECTED,\n \"data-well-selection\": id,\n })\n : null}\n {isHighlighted\n ? renderShape({\n fill: \"none\",\n stroke: highlightBorderColor,\n strokeWidth: STROKE_HIGHLIGHT,\n \"data-well-highlight\": id,\n })\n : null}\n {isFlashing\n ? renderShape(\n {\n fill: selectedBorderColor,\n fillOpacity: 0.24,\n stroke: selectedBorderColor,\n strokeOpacity: 0.92,\n strokeWidth: STROKE_FLASH,\n \"data-well-flash\": id,\n },\n flashAnimations,\n `${id}-${flashWellKey}`,\n )\n : null}\n </g>\n );\n}\n\nfunction buildWellOverlays<T extends WellRecord>({ dims, ...args }: BuildWellCellsArgs<T>): React.ReactNode[] {\n const overlays: React.ReactNode[] = [];\n for (let r = 0; r < dims.rows; r++) {\n for (let c = 0; c < dims.columns; c++) {\n const overlay = buildWellOverlay({ dims, ...args }, r, c);\n if (overlay) overlays.push(overlay);\n }\n }\n return overlays;\n}\n\n/**\n * Interactive plate grid with drag-rectangle selection.\n * - Click & drag: replace selection\n * - Shift + drag: add to selection\n * - Alt + drag: remove from selection\n */\nexport function PlatePaintGrid<T extends WellRecord = WellRecord>({\n format,\n rows,\n columns,\n values,\n selection,\n onSelectionChange,\n colorForWell,\n emptyWellFillColor = PLATE_MAP_EMPTY_WELL_FILL,\n wellShape = \"rect\",\n framed = false,\n cellSize,\n autoScale = true,\n minCellSize = DEFAULT_MIN_AUTO_CELL,\n maxCellSize,\n borderColor = PLATE_MAP_CELL_BORDER,\n selectedBorderColor = \"var(--color-primary)\",\n selectedFillColor = \"var(--color-primary)\",\n selectedFillOpacity = 0.18,\n selectionFillMode = \"selection\",\n flashWellId,\n flashWellKey,\n highlightedWellIds,\n highlightBorderColor = \"var(--color-primary)\",\n onWellHover,\n onWellDoubleClick,\n wrapWell,\n className,\n}: PlatePaintGridProps<T>) {\n const dims = resolveDimensions(format, rows, columns);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const svgRef = React.useRef<SVGSVGElement>(null);\n const [drag, setDrag] = React.useState<DragState | null>(null);\n const [containerWidth, setContainerWidth] = React.useState<number>();\n\n React.useLayoutEffect(() => {\n const node = containerRef.current;\n if (!node || !autoScale || cellSize !== undefined) return;\n\n const update = () => setContainerWidth(node.clientWidth);\n update();\n\n if (typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver(update);\n observer.observe(node);\n return () => observer.disconnect();\n }, [autoScale, cellSize]);\n\n const resolvedCellSize = React.useMemo(() => {\n if (!autoScale || cellSize !== undefined || !containerWidth) {\n return cellSize ?? DEFAULT_CELL;\n }\n const autoMaxCellSize = maxCellSize ?? (dims.columns > 12 ? DEFAULT_MAX_DENSE_AUTO_CELL : DEFAULT_MAX_AUTO_CELL);\n const frameAdjust = framed ? (FRAME_PADDING_PX + FRAME_BORDER_PX) * 2 : 0;\n const fitSize = Math.floor((containerWidth - LABEL_PAD - frameAdjust) / dims.columns);\n return Math.max(minCellSize, Math.min(autoMaxCellSize, fitSize));\n }, [autoScale, cellSize, containerWidth, dims.columns, framed, maxCellSize, minCellSize]);\n\n const cellAt = React.useCallback(\n (evt: React.MouseEvent): { r: number; c: number } | null => {\n const svg = svgRef.current;\n if (!svg) return null;\n const rect = svg.getBoundingClientRect();\n const x = evt.clientX - rect.left - LABEL_PAD;\n const y = evt.clientY - rect.top - LABEL_PAD;\n const c = Math.floor(x / resolvedCellSize);\n const r = Math.floor(y / resolvedCellSize);\n if (r < 0 || r >= dims.rows || c < 0 || c >= dims.columns) return null;\n return { r, c };\n },\n [resolvedCellSize, dims.rows, dims.columns],\n );\n\n const handleDown = (e: React.MouseEvent) => {\n const cell = cellAt(e);\n if (!cell) return;\n const mode: DragMode = e.shiftKey ? \"add\" : e.altKey ? \"remove\" : \"replace\";\n setDrag({ start: cell, cur: cell, mode });\n };\n\n const handleMove = (e: React.MouseEvent) => {\n const cell = cellAt(e);\n if (cell && onWellHover) {\n onWellHover(pos(cell.r, cell.c, dims.columns));\n }\n if (!drag || !cell) return;\n setDrag({ ...drag, cur: cell });\n };\n\n const commitDrag = React.useCallback(() => {\n if (!drag) return;\n const positions = rectPositions(drag.start.r, drag.start.c, drag.cur.r, drag.cur.c, dims.columns);\n let next: Set<WellId>;\n if (drag.mode === \"replace\") {\n next = new Set(positions);\n } else if (drag.mode === \"add\") {\n next = new Set(selection);\n positions.forEach((p) => next.add(p));\n } else {\n next = new Set(selection);\n positions.forEach((p) => next.delete(p));\n }\n onSelectionChange(next);\n setDrag(null);\n }, [drag, dims.columns, onSelectionChange, selection]);\n\n const handleUp = () => commitDrag();\n const handleLeave = () => {\n commitDrag();\n onWellHover?.(null);\n };\n const handleDoubleClick = (e: React.MouseEvent) => {\n const cell = cellAt(e);\n if (!cell) return;\n onWellDoubleClick?.(pos(cell.r, cell.c, dims.columns));\n };\n\n const dragPositions = React.useMemo(() => {\n if (!drag) return new Set<WellId>();\n return new Set(rectPositions(drag.start.r, drag.start.c, drag.cur.r, drag.cur.c, dims.columns));\n }, [drag, dims.columns]);\n\n // Right and bottom edge strokes sit on the plate boundary; give the SVG room so they are not clipped.\n const edgeStrokePadding = STROKE_DEFAULT;\n const width = dims.columns * resolvedCellSize + LABEL_PAD + edgeStrokePadding;\n const height = dims.rows * resolvedCellSize + LABEL_PAD + edgeStrokePadding;\n\n const colLabels = buildColumnLabels(dims.columns, resolvedCellSize);\n const rowLabels = buildRowLabels(dims.rows, resolvedCellSize);\n const resolvedHighlightedWellIds: ReadonlySet<WellId> = highlightedWellIds ?? new Set();\n const wellRenderArgs = {\n dims,\n cellSize: resolvedCellSize,\n values,\n selection,\n dragPositions,\n colorForWell,\n emptyWellFillColor,\n borderColor,\n selectedBorderColor,\n selectedFillColor,\n selectedFillOpacity,\n selectionFillMode,\n wellShape,\n highlightedWellIds: resolvedHighlightedWellIds,\n highlightBorderColor,\n flashWellId,\n flashWellKey,\n };\n const wellCells = buildWellCells(wellRenderArgs);\n const gridLines = wellShape === \"circle\" ? [] : buildGridLines(dims, resolvedCellSize, borderColor);\n const wellOverlays = buildWellOverlays(wellRenderArgs);\n\n const overlayCells = React.useMemo<React.ReactNode[]>(() => {\n if (!wrapWell) return [];\n const cells: React.ReactNode[] = [];\n for (let r = 0; r < dims.rows; r++) {\n for (let c = 0; c < dims.columns; c++) {\n const id = pos(r, c, dims.columns);\n cells.push(\n <div\n key={id}\n style={{\n position: \"absolute\",\n left: LABEL_PAD + c * resolvedCellSize,\n top: LABEL_PAD + r * resolvedCellSize,\n width: resolvedCellSize,\n height: resolvedCellSize,\n }}\n data-well-id={id}\n >\n {wrapWell(id, resolvedCellSize)}\n </div>,\n );\n }\n }\n return cells;\n }, [wrapWell, dims.rows, dims.columns, resolvedCellSize]);\n\n return (\n <div\n ref={containerRef}\n className={cn(\"relative w-full select-none\", className)}\n data-slot=\"plate-paint-grid\"\n >\n <div\n className={cn(\n \"relative inline-block\",\n framed && \"rounded-xl border bg-card p-3 shadow-sm\",\n )}\n data-slot=\"plate-paint-grid-frame\"\n >\n <svg\n ref={svgRef}\n width={width}\n height={height}\n className=\"block cursor-crosshair\"\n onMouseDown={handleDown}\n onMouseMove={handleMove}\n onMouseUp={handleUp}\n onMouseLeave={handleLeave}\n onDoubleClick={handleDoubleClick}\n role=\"group\"\n aria-label={`${dims.rows} row by ${dims.columns} column plate map. Drag to select wells.`}\n >\n {colLabels}\n {rowLabels}\n {wellCells}\n {gridLines}\n {wellOverlays}\n </svg>\n {wrapWell ? (\n <div\n className=\"pointer-events-none absolute\"\n style={{\n top: framed ? FRAME_PADDING_PX : 0,\n left: framed ? FRAME_PADDING_PX : 0,\n width,\n height,\n }}\n aria-hidden\n data-slot=\"plate-well-overlay\"\n >\n {overlayCells}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport { parsePos };\n"],"names":["DEFAULT_CELL","DEFAULT_MIN_AUTO_CELL","DEFAULT_MAX_AUTO_CELL","DEFAULT_MAX_DENSE_AUTO_CELL","LABEL_PAD","FRAME_PADDING_PX","FRAME_BORDER_PX","LABEL_FONT_SIZE","LABEL_TEXT_INSET","LABEL_BASELINE_OFFSET","WELL_INSET","STROKE_DEFAULT","STROKE_SELECTED","STROKE_HIGHLIGHT","STROKE_FLASH","FLASH_DURATION_MS","PLATE_MAP_EMPTY_WELL_FILL","PLATE_MAP_CELL_BORDER","buildColumnLabels","columns","cellSize","labels","c","jsx","buildRowLabels","rows","r","buildWellCell","args","row","column","dims","values","selection","dragPositions","colorForWell","emptyWellFillColor","selectedFillColor","selectedFillOpacity","selectionFillMode","wellShape","id","pos","entry","isSelected","wellFill","usesSelectionFill","fill","fillOpacity","cx","cy","buildWellCells","cells","buildGridLines","borderColor","lines","left","top","right","bottom","x","y","buildWellOverlay","selectedBorderColor","flashWellId","flashWellKey","highlightedWellIds","highlightBorderColor","isFlashing","isHighlighted","size","isCircle","shapeProps","renderShape","extraProps","children","elementKey","props","flashAnimations","jsxs","Fragment","buildWellOverlays","overlays","overlay","PlatePaintGrid","format","onSelectionChange","framed","autoScale","minCellSize","maxCellSize","onWellHover","onWellDoubleClick","wrapWell","className","resolveDimensions","containerRef","React","svgRef","drag","setDrag","containerWidth","setContainerWidth","node","update","observer","resolvedCellSize","autoMaxCellSize","frameAdjust","fitSize","cellAt","evt","svg","rect","handleDown","e","cell","mode","handleMove","commitDrag","positions","rectPositions","next","p","handleUp","handleLeave","handleDoubleClick","edgeStrokePadding","width","height","colLabels","rowLabels","wellRenderArgs","wellCells","gridLines","wellOverlays","overlayCells","cn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlatePaintGrid.js","sources":["../../../../src/components/composed/PlateMapEditor/PlatePaintGrid.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { parsePos, pos, rectPositions, resolveDimensions, rowLabel } from \"./wellGrid\";\n\nimport type { PlateDimensions, PlateFormat, WellId, WellRecord } from \"./types\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst DEFAULT_CELL = 34;\nconst DEFAULT_MIN_AUTO_CELL = 24;\nconst DEFAULT_MAX_AUTO_CELL = 72;\nconst DEFAULT_MAX_DENSE_AUTO_CELL = 36;\nconst LABEL_PAD = 26;\nconst FRAME_PADDING_PX = 12;\nconst FRAME_BORDER_PX = 1;\nconst LABEL_FONT_SIZE = 16;\nconst LABEL_TEXT_INSET = 9;\nconst LABEL_BASELINE_OFFSET = 5;\nconst WELL_INSET = 1;\nconst STROKE_DEFAULT = 4;\nconst STROKE_SELECTED = 4;\nconst STROKE_HIGHLIGHT = 3;\nconst STROKE_FLASH = 5;\nconst FLASH_DURATION_MS = 650;\nexport const PLATE_MAP_EMPTY_WELL_FILL = \"var(--surface-container)\";\nexport const PLATE_MAP_CELL_BORDER = \"var(--border)\";\n\nexport type WellShape = \"rect\" | \"circle\";\n\nexport interface PlatePaintGridProps<T extends WellRecord = WellRecord> {\n format: PlateFormat;\n rows?: number;\n columns?: number;\n values: Map<WellId, T>;\n selection: Set<WellId>;\n onSelectionChange: (next: Set<WellId>) => void;\n /** Returns the fill color for a given well record (or undefined if empty). */\n colorForWell: (well: T | undefined, wellId: WellId) => string;\n /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */\n emptyWellFillColor?: string | null;\n /** Geometric shape of each well. `\"circle\"` matches scientific plate visuals. Defaults to `\"rect\"`. */\n wellShape?: WellShape;\n /**\n * When true, wraps the grid in a card-like surface (rounded, bordered,\n * padded, soft shadow) so it reads as a physical plate. Pairs well with\n * `wellShape=\"circle\"`.\n */\n framed?: boolean;\n /** Pixel size of each well cell. Defaults to 34 when fixed. */\n cellSize?: number;\n /** Resize wells to fill available width when `cellSize` is not fixed. */\n autoScale?: boolean;\n minCellSize?: number;\n /** Defaults to 72 for 96-well style plates and 36 for denser plates. */\n maxCellSize?: number;\n /** Stroke color for non-selected wells. Defaults to a light border. */\n borderColor?: string;\n /** Stroke color for selected wells. Defaults to the kit primary blue. */\n selectedBorderColor?: string;\n /** Fill color for selected wells. Defaults to the kit primary blue. */\n selectedFillColor?: string;\n /** Selected fill opacity. */\n selectedFillOpacity?: number;\n /** Whether selected wells use the selection fill or keep their assigned well color. */\n selectionFillMode?: \"selection\" | \"well\";\n /** Well id that should briefly flash, usually after a double-click assignment. */\n flashWellId?: WellId;\n /** Changing this value restarts the flash animation for the same well. */\n flashWellKey?: number;\n /**\n * Well ids that should render with a highlight ring. Used for cross-component\n * hover sync (e.g. hovering a legend item to highlight matching wells).\n */\n highlightedWellIds?: ReadonlySet<WellId>;\n /** Stroke color for highlighted wells. Defaults to the kit primary blue. */\n highlightBorderColor?: string;\n onWellHover?: (wellId: WellId | null) => void;\n onWellDoubleClick?: (wellId: WellId) => void;\n /**\n * Optional render-prop invoked once per well. The returned node is placed\n * inside an absolutely-positioned cell on top of the SVG, sized to\n * `cellSize`. The wrapper layer is `pointer-events: none` so the SVG keeps\n * pointer interaction by default; consumers wiring drop targets are expected\n * to set `pointer-events: auto` on their own element while a drag is active.\n */\n wrapWell?: (wellId: WellId, cellSize: number) => React.ReactNode;\n className?: string;\n}\n\ntype DragMode = \"replace\" | \"add\" | \"remove\";\n\ninterface DragState {\n start: { r: number; c: number };\n cur: { r: number; c: number };\n mode: DragMode;\n}\n\nfunction buildColumnLabels(columns: number, cellSize: number): React.ReactNode[] {\n const labels: React.ReactNode[] = [];\n for (let c = 0; c < columns; c++) {\n labels.push(\n <text\n key={`c${c}`}\n x={LABEL_PAD + c * cellSize + cellSize / 2}\n y={LABEL_PAD / 2}\n textAnchor=\"middle\"\n fontSize={LABEL_FONT_SIZE}\n className=\"fill-muted-foreground\"\n >\n {c + 1}\n </text>,\n );\n }\n return labels;\n}\n\nfunction buildRowLabels(rows: number, cellSize: number): React.ReactNode[] {\n const labels: React.ReactNode[] = [];\n for (let r = 0; r < rows; r++) {\n labels.push(\n <text\n key={`r${r}`}\n x={LABEL_PAD - LABEL_TEXT_INSET}\n y={LABEL_PAD + r * cellSize + cellSize / 2 + LABEL_BASELINE_OFFSET}\n textAnchor=\"end\"\n fontSize={LABEL_FONT_SIZE}\n className=\"fill-muted-foreground\"\n >\n {rowLabel(r)}\n </text>,\n );\n }\n return labels;\n}\n\ninterface BuildWellCellsArgs<T extends WellRecord> {\n dims: PlateDimensions;\n cellSize: number;\n values: Map<WellId, T>;\n selection: Set<WellId>;\n dragPositions: Set<WellId>;\n colorForWell: (well: T | undefined, wellId: WellId) => string;\n emptyWellFillColor: string | null;\n borderColor: string;\n selectedBorderColor: string;\n selectedFillColor: string;\n selectedFillOpacity: number;\n selectionFillMode: \"selection\" | \"well\";\n wellShape: WellShape;\n highlightedWellIds: ReadonlySet<WellId>;\n highlightBorderColor: string;\n flashWellId?: WellId;\n flashWellKey?: number;\n}\n\nfunction buildWellCell<T extends WellRecord>(\n args: BuildWellCellsArgs<T>,\n row: number,\n column: number,\n): React.ReactNode {\n const {\n dims,\n cellSize,\n values,\n selection,\n dragPositions,\n colorForWell,\n emptyWellFillColor,\n selectedFillColor,\n selectedFillOpacity,\n selectionFillMode,\n wellShape,\n } = args;\n const id = pos(row, column, dims.columns);\n const entry = values.get(id);\n const isSelected = selection.has(id) || dragPositions.has(id);\n const wellFill = entry === undefined && emptyWellFillColor !== null ? emptyWellFillColor : colorForWell(entry, id);\n const usesWellFill = isSelected && selectionFillMode === \"well\" && entry !== undefined;\n const usesSelectionFill = isSelected && !usesWellFill;\n const fill = usesSelectionFill ? selectedFillColor : wellFill;\n const fillOpacity = usesSelectionFill ? selectedFillOpacity : undefined;\n\n if (wellShape === \"circle\") {\n const cx = LABEL_PAD + column * cellSize + cellSize / 2;\n const cy = LABEL_PAD + row * cellSize + cellSize / 2;\n const r = cellSize / 2 - WELL_INSET;\n return (\n <circle\n key={id}\n cx={cx}\n cy={cy}\n r={r}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke=\"none\"\n data-well={id}\n data-selected={isSelected ? \"true\" : undefined}\n />\n );\n }\n\n return (\n <rect\n key={id}\n x={LABEL_PAD + column * cellSize}\n y={LABEL_PAD + row * cellSize}\n width={cellSize}\n height={cellSize}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke=\"none\"\n data-well={id}\n data-selected={isSelected ? \"true\" : undefined}\n />\n );\n}\n\nfunction buildWellCells<T extends WellRecord>({ dims, ...args }: BuildWellCellsArgs<T>): React.ReactNode[] {\n const cells: React.ReactNode[] = [];\n for (let r = 0; r < dims.rows; r++) {\n for (let c = 0; c < dims.columns; c++) {\n cells.push(buildWellCell({ dims, ...args }, r, c));\n }\n }\n return cells;\n}\n\nfunction buildGridLines(dims: PlateDimensions, cellSize: number, borderColor: string): React.ReactNode[] {\n const lines: React.ReactNode[] = [];\n const left = LABEL_PAD;\n const top = LABEL_PAD;\n const right = LABEL_PAD + dims.columns * cellSize;\n const bottom = LABEL_PAD + dims.rows * cellSize;\n\n for (let c = 0; c <= dims.columns; c++) {\n const x = LABEL_PAD + c * cellSize;\n lines.push(\n <line\n key={`grid-col-${c}`}\n x1={x}\n y1={top}\n x2={x}\n y2={bottom}\n stroke={borderColor}\n strokeWidth={STROKE_DEFAULT}\n vectorEffect=\"non-scaling-stroke\"\n shapeRendering=\"crispEdges\"\n pointerEvents=\"none\"\n data-plate-grid-line={`column-${c}`}\n />,\n );\n }\n\n for (let r = 0; r <= dims.rows; r++) {\n const y = LABEL_PAD + r * cellSize;\n lines.push(\n <line\n key={`grid-row-${r}`}\n x1={left}\n y1={y}\n x2={right}\n y2={y}\n stroke={borderColor}\n strokeWidth={STROKE_DEFAULT}\n vectorEffect=\"non-scaling-stroke\"\n shapeRendering=\"crispEdges\"\n pointerEvents=\"none\"\n data-plate-grid-line={`row-${r}`}\n />,\n );\n }\n\n return lines;\n}\n\nfunction buildWellOverlay<T extends WellRecord>(\n args: BuildWellCellsArgs<T>,\n row: number,\n column: number,\n): React.ReactNode {\n const {\n dims,\n cellSize,\n selection,\n dragPositions,\n selectedBorderColor,\n flashWellId,\n flashWellKey,\n wellShape,\n highlightedWellIds,\n highlightBorderColor,\n } = args;\n const id = pos(row, column, dims.columns);\n const isSelected = selection.has(id) || dragPositions.has(id);\n const isFlashing = flashWellId === id;\n const isHighlighted = !isSelected && highlightedWellIds.has(id);\n\n if (!isSelected && !isFlashing && !isHighlighted) return null;\n\n const x = LABEL_PAD + column * cellSize + WELL_INSET;\n const y = LABEL_PAD + row * cellSize + WELL_INSET;\n const size = cellSize - WELL_INSET * 2;\n const cx = LABEL_PAD + column * cellSize + cellSize / 2;\n const cy = LABEL_PAD + row * cellSize + cellSize / 2;\n const r = cellSize / 2 - WELL_INSET;\n const isCircle = wellShape === \"circle\";\n\n type WellShapeProps = Record<string, string | number | undefined>;\n const shapeProps: WellShapeProps = isCircle\n ? { cx, cy, r }\n : { x, y, width: size, height: size };\n\n const renderShape = (\n extraProps: Record<string, string | number | undefined>,\n children?: React.ReactNode,\n elementKey?: string | number,\n ): React.ReactNode => {\n const props = { ...shapeProps, ...extraProps, pointerEvents: \"none\" as const };\n return isCircle ? (\n <circle key={elementKey} {...props}>\n {children}\n </circle>\n ) : (\n <rect key={elementKey} {...props}>\n {children}\n </rect>\n );\n };\n\n const flashAnimations = (\n <>\n <animate attributeName=\"fill-opacity\" values=\"0.24;0.1;0\" dur={`${FLASH_DURATION_MS}ms`} fill=\"freeze\" />\n <animate attributeName=\"stroke-opacity\" values=\"0.92;0.42;0\" dur={`${FLASH_DURATION_MS}ms`} fill=\"freeze\" />\n <animate\n attributeName=\"stroke-width\"\n values={`${STROKE_FLASH};${STROKE_SELECTED}`}\n dur={`${FLASH_DURATION_MS}ms`}\n fill=\"freeze\"\n />\n </>\n );\n\n return (\n <g key={`overlay-${id}`}>\n {isSelected\n ? renderShape({\n fill: \"none\",\n stroke: selectedBorderColor,\n strokeWidth: STROKE_SELECTED,\n \"data-well-selection\": id,\n })\n : null}\n {isHighlighted\n ? renderShape({\n fill: \"none\",\n stroke: highlightBorderColor,\n strokeWidth: STROKE_HIGHLIGHT,\n \"data-well-highlight\": id,\n })\n : null}\n {isFlashing\n ? renderShape(\n {\n fill: selectedBorderColor,\n fillOpacity: 0.24,\n stroke: selectedBorderColor,\n strokeOpacity: 0.92,\n strokeWidth: STROKE_FLASH,\n \"data-well-flash\": id,\n },\n flashAnimations,\n `${id}-${flashWellKey}`,\n )\n : null}\n </g>\n );\n}\n\nfunction buildWellOverlays<T extends WellRecord>({ dims, ...args }: BuildWellCellsArgs<T>): React.ReactNode[] {\n const overlays: React.ReactNode[] = [];\n for (let r = 0; r < dims.rows; r++) {\n for (let c = 0; c < dims.columns; c++) {\n const overlay = buildWellOverlay({ dims, ...args }, r, c);\n if (overlay) overlays.push(overlay);\n }\n }\n return overlays;\n}\n\n/**\n * Interactive plate grid with drag-rectangle selection.\n * - Click & drag: replace selection\n * - Shift + drag: add to selection\n * - Alt + drag: remove from selection\n */\nexport function PlatePaintGrid<T extends WellRecord = WellRecord>({\n format,\n rows,\n columns,\n values,\n selection,\n onSelectionChange,\n colorForWell,\n emptyWellFillColor = PLATE_MAP_EMPTY_WELL_FILL,\n wellShape = \"rect\",\n framed = false,\n cellSize,\n autoScale = true,\n minCellSize = DEFAULT_MIN_AUTO_CELL,\n maxCellSize,\n borderColor = PLATE_MAP_CELL_BORDER,\n selectedBorderColor = \"var(--color-primary)\",\n selectedFillColor = \"var(--color-primary)\",\n selectedFillOpacity = 0.18,\n selectionFillMode = \"selection\",\n flashWellId,\n flashWellKey,\n highlightedWellIds,\n highlightBorderColor = \"var(--color-primary)\",\n onWellHover,\n onWellDoubleClick,\n wrapWell,\n className,\n}: PlatePaintGridProps<T>) {\n const dims = resolveDimensions(format, rows, columns);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const svgRef = React.useRef<SVGSVGElement>(null);\n const [drag, setDrag] = React.useState<DragState | null>(null);\n const [containerWidth, setContainerWidth] = React.useState<number>();\n\n React.useLayoutEffect(() => {\n const node = containerRef.current;\n if (!node || !autoScale || cellSize !== undefined) return;\n\n const update = () => setContainerWidth(node.clientWidth);\n update();\n\n if (typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver(update);\n observer.observe(node);\n return () => observer.disconnect();\n }, [autoScale, cellSize]);\n\n const resolvedCellSize = React.useMemo(() => {\n if (!autoScale || cellSize !== undefined || !containerWidth) {\n return cellSize ?? DEFAULT_CELL;\n }\n const autoMaxCellSize = maxCellSize ?? (dims.columns > 12 ? DEFAULT_MAX_DENSE_AUTO_CELL : DEFAULT_MAX_AUTO_CELL);\n const frameAdjust = framed ? (FRAME_PADDING_PX + FRAME_BORDER_PX) * 2 : 0;\n const fitSize = Math.floor((containerWidth - LABEL_PAD - frameAdjust) / dims.columns);\n return Math.max(minCellSize, Math.min(autoMaxCellSize, fitSize));\n }, [autoScale, cellSize, containerWidth, dims.columns, framed, maxCellSize, minCellSize]);\n\n const cellAt = React.useCallback(\n (evt: React.MouseEvent): { r: number; c: number } | null => {\n const svg = svgRef.current;\n if (!svg) return null;\n const rect = svg.getBoundingClientRect();\n const x = evt.clientX - rect.left - LABEL_PAD;\n const y = evt.clientY - rect.top - LABEL_PAD;\n const c = Math.floor(x / resolvedCellSize);\n const r = Math.floor(y / resolvedCellSize);\n if (r < 0 || r >= dims.rows || c < 0 || c >= dims.columns) return null;\n return { r, c };\n },\n [resolvedCellSize, dims.rows, dims.columns],\n );\n\n const handleDown = (e: React.MouseEvent) => {\n const cell = cellAt(e);\n if (!cell) return;\n const mode: DragMode = e.shiftKey ? \"add\" : e.altKey ? \"remove\" : \"replace\";\n setDrag({ start: cell, cur: cell, mode });\n };\n\n const handleMove = (e: React.MouseEvent) => {\n const cell = cellAt(e);\n if (cell && onWellHover) {\n onWellHover(pos(cell.r, cell.c, dims.columns));\n }\n if (!drag || !cell) return;\n setDrag({ ...drag, cur: cell });\n };\n\n const commitDrag = React.useCallback(() => {\n if (!drag) return;\n const positions = rectPositions(drag.start.r, drag.start.c, drag.cur.r, drag.cur.c, dims.columns);\n let next: Set<WellId>;\n if (drag.mode === \"replace\") {\n next = new Set(positions);\n } else if (drag.mode === \"add\") {\n next = new Set(selection);\n positions.forEach((p) => next.add(p));\n } else {\n next = new Set(selection);\n positions.forEach((p) => next.delete(p));\n }\n onSelectionChange(next);\n setDrag(null);\n }, [drag, dims.columns, onSelectionChange, selection]);\n\n const handleUp = () => commitDrag();\n const handleLeave = () => {\n commitDrag();\n onWellHover?.(null);\n };\n const handleDoubleClick = (e: React.MouseEvent) => {\n const cell = cellAt(e);\n if (!cell) return;\n onWellDoubleClick?.(pos(cell.r, cell.c, dims.columns));\n };\n\n const dragPositions = React.useMemo(() => {\n if (!drag) return new Set<WellId>();\n return new Set(rectPositions(drag.start.r, drag.start.c, drag.cur.r, drag.cur.c, dims.columns));\n }, [drag, dims.columns]);\n\n // Right and bottom edge strokes sit on the plate boundary; give the SVG room so they are not clipped.\n const edgeStrokePadding = STROKE_DEFAULT;\n const width = dims.columns * resolvedCellSize + LABEL_PAD + edgeStrokePadding;\n const height = dims.rows * resolvedCellSize + LABEL_PAD + edgeStrokePadding;\n\n const colLabels = buildColumnLabels(dims.columns, resolvedCellSize);\n const rowLabels = buildRowLabels(dims.rows, resolvedCellSize);\n const resolvedHighlightedWellIds: ReadonlySet<WellId> = highlightedWellIds ?? new Set();\n const wellRenderArgs = {\n dims,\n cellSize: resolvedCellSize,\n values,\n selection,\n dragPositions,\n colorForWell,\n emptyWellFillColor,\n borderColor,\n selectedBorderColor,\n selectedFillColor,\n selectedFillOpacity,\n selectionFillMode,\n wellShape,\n highlightedWellIds: resolvedHighlightedWellIds,\n highlightBorderColor,\n flashWellId,\n flashWellKey,\n };\n const wellCells = buildWellCells(wellRenderArgs);\n const gridLines = wellShape === \"circle\" ? [] : buildGridLines(dims, resolvedCellSize, borderColor);\n const wellOverlays = buildWellOverlays(wellRenderArgs);\n\n const overlayCells = React.useMemo<React.ReactNode[]>(() => {\n if (!wrapWell) return [];\n const cells: React.ReactNode[] = [];\n for (let r = 0; r < dims.rows; r++) {\n for (let c = 0; c < dims.columns; c++) {\n const id = pos(r, c, dims.columns);\n cells.push(\n <div\n key={id}\n style={{\n position: \"absolute\",\n left: LABEL_PAD + c * resolvedCellSize,\n top: LABEL_PAD + r * resolvedCellSize,\n width: resolvedCellSize,\n height: resolvedCellSize,\n }}\n data-well-id={id}\n >\n {wrapWell(id, resolvedCellSize)}\n </div>,\n );\n }\n }\n return cells;\n }, [wrapWell, dims.rows, dims.columns, resolvedCellSize]);\n\n return (\n <div\n ref={containerRef}\n className={cn(\"relative w-full select-none\", className)}\n data-slot=\"plate-paint-grid\"\n >\n <div\n className={cn(\n \"relative inline-block\",\n framed && \"rounded-xl border bg-card p-3 shadow-elevation-3\",\n )}\n data-slot=\"plate-paint-grid-frame\"\n >\n <svg\n ref={svgRef}\n width={width}\n height={height}\n className=\"block cursor-crosshair\"\n onMouseDown={handleDown}\n onMouseMove={handleMove}\n onMouseUp={handleUp}\n onMouseLeave={handleLeave}\n onDoubleClick={handleDoubleClick}\n role=\"group\"\n aria-label={`${dims.rows} row by ${dims.columns} column plate map. Drag to select wells.`}\n >\n {colLabels}\n {rowLabels}\n {wellCells}\n {gridLines}\n {wellOverlays}\n </svg>\n {wrapWell ? (\n <div\n className=\"pointer-events-none absolute\"\n style={{\n top: framed ? FRAME_PADDING_PX : 0,\n left: framed ? FRAME_PADDING_PX : 0,\n width,\n height,\n }}\n aria-hidden\n data-slot=\"plate-well-overlay\"\n >\n {overlayCells}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport { parsePos };\n"],"names":["DEFAULT_CELL","DEFAULT_MIN_AUTO_CELL","DEFAULT_MAX_AUTO_CELL","DEFAULT_MAX_DENSE_AUTO_CELL","LABEL_PAD","FRAME_PADDING_PX","FRAME_BORDER_PX","LABEL_FONT_SIZE","LABEL_TEXT_INSET","LABEL_BASELINE_OFFSET","WELL_INSET","STROKE_DEFAULT","STROKE_SELECTED","STROKE_HIGHLIGHT","STROKE_FLASH","FLASH_DURATION_MS","PLATE_MAP_EMPTY_WELL_FILL","PLATE_MAP_CELL_BORDER","buildColumnLabels","columns","cellSize","labels","c","jsx","buildRowLabels","rows","r","buildWellCell","args","row","column","dims","values","selection","dragPositions","colorForWell","emptyWellFillColor","selectedFillColor","selectedFillOpacity","selectionFillMode","wellShape","id","pos","entry","isSelected","wellFill","usesSelectionFill","fill","fillOpacity","cx","cy","buildWellCells","cells","buildGridLines","borderColor","lines","left","top","right","bottom","x","y","buildWellOverlay","selectedBorderColor","flashWellId","flashWellKey","highlightedWellIds","highlightBorderColor","isFlashing","isHighlighted","size","isCircle","shapeProps","renderShape","extraProps","children","elementKey","props","flashAnimations","jsxs","Fragment","buildWellOverlays","overlays","overlay","PlatePaintGrid","format","onSelectionChange","framed","autoScale","minCellSize","maxCellSize","onWellHover","onWellDoubleClick","wrapWell","className","resolveDimensions","containerRef","React","svgRef","drag","setDrag","containerWidth","setContainerWidth","node","update","observer","resolvedCellSize","autoMaxCellSize","frameAdjust","fitSize","cellAt","evt","svg","rect","handleDown","e","cell","mode","handleMove","commitDrag","positions","rectPositions","next","p","handleUp","handleLeave","handleDoubleClick","edgeStrokePadding","width","height","colLabels","rowLabels","wellRenderArgs","wellCells","gridLines","wellOverlays","overlayCells","cn"],"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"),a=require("lucide-react"),s=require("
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),a=require("lucide-react"),s=require("../../../ui/button.cjs"),l=require("../../../ui/button-group.cjs"),b=require("../../../lib/utils.cjs"),x=2;function h(t,o,n){return Math.min(n,Math.max(o,t))}function j({zoom:t,onZoomChange:o,step:n=.1,min:r=.5,max:i=2,showReadout:c=!0,className:d}){const u=m=>o(h(Number(m.toFixed(x)),r,i));return e.jsxs(l.ButtonGroup,{className:b.cn(d),"data-slot":"plate-zoom-control",children:[e.jsx(s.Button,{type:"button",variant:"outline",size:"icon-sm","aria-label":"Zoom out",disabled:t<=r,onClick:()=>u(t-n),children:e.jsx(a.ZoomOut,{"aria-hidden":!0})}),c?e.jsxs(l.ButtonGroupText,{className:"min-w-[3.25rem] justify-center text-xs tabular-nums",children:[Math.round(t*100),"%"]}):null,e.jsx(s.Button,{type:"button",variant:"outline",size:"icon-sm","aria-label":"Zoom in",disabled:t>=i,onClick:()=>u(t+n),children:e.jsx(a.ZoomIn,{"aria-hidden":!0})})]})}exports.PlateZoomControl=j;
|
|
2
2
|
//# sourceMappingURL=PlateZoomControl.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlateZoomControl.cjs","sources":["../../../../src/components/composed/PlateMapEditor/PlateZoomControl.tsx"],"sourcesContent":["import { ZoomIn, ZoomOut } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ButtonGroup, ButtonGroupText } from \"@/components/ui/button-group\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface PlateZoomControlProps {\n zoom: number;\n onZoomChange: (next: number) => void;\n /** Increment per click. Defaults to 0.1. */\n step?: number;\n min?: number;\n max?: number;\n /** Render a percentage readout between the buttons. Defaults to true. */\n showReadout?: boolean;\n className?: string;\n}\n\nconst ZOOM_DECIMALS = 2;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function PlateZoomControl({\n zoom,\n onZoomChange,\n step = 0.1,\n min = 0.5,\n max = 2,\n showReadout = true,\n className,\n}: PlateZoomControlProps) {\n const setZoom = (next: number) => onZoomChange(clamp(Number(next.toFixed(ZOOM_DECIMALS)), min, max));\n\n return (\n <ButtonGroup className={cn(className)} data-slot=\"plate-zoom-control\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"Zoom out\"\n disabled={zoom <= min}\n onClick={() => setZoom(zoom - step)}\n >\n <ZoomOut aria-hidden />\n </Button>\n {showReadout ? (\n <ButtonGroupText className=\"min-w-[3.25rem] justify-center text-xs tabular-nums\">\n {Math.round(zoom * 100)}%\n </ButtonGroupText>\n ) : null}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"Zoom in\"\n disabled={zoom >= max}\n onClick={() => setZoom(zoom + step)}\n >\n <ZoomIn aria-hidden />\n </Button>\n </ButtonGroup>\n );\n}\n"],"names":["ZOOM_DECIMALS","clamp","value","min","max","PlateZoomControl","zoom","onZoomChange","step","showReadout","className","setZoom","next","ButtonGroup","cn","jsx","Button","ZoomOut","jsxs","ButtonGroupText","ZoomIn"],"mappings":"
|
|
1
|
+
{"version":3,"file":"PlateZoomControl.cjs","sources":["../../../../src/components/composed/PlateMapEditor/PlateZoomControl.tsx"],"sourcesContent":["import { ZoomIn, ZoomOut } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ButtonGroup, ButtonGroupText } from \"@/components/ui/button-group\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface PlateZoomControlProps {\n zoom: number;\n onZoomChange: (next: number) => void;\n /** Increment per click. Defaults to 0.1. */\n step?: number;\n min?: number;\n max?: number;\n /** Render a percentage readout between the buttons. Defaults to true. */\n showReadout?: boolean;\n className?: string;\n}\n\nconst ZOOM_DECIMALS = 2;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function PlateZoomControl({\n zoom,\n onZoomChange,\n step = 0.1,\n min = 0.5,\n max = 2,\n showReadout = true,\n className,\n}: PlateZoomControlProps) {\n const setZoom = (next: number) => onZoomChange(clamp(Number(next.toFixed(ZOOM_DECIMALS)), min, max));\n\n return (\n <ButtonGroup className={cn(className)} data-slot=\"plate-zoom-control\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"Zoom out\"\n disabled={zoom <= min}\n onClick={() => setZoom(zoom - step)}\n >\n <ZoomOut aria-hidden />\n </Button>\n {showReadout ? (\n <ButtonGroupText className=\"min-w-[3.25rem] justify-center text-xs tabular-nums\">\n {Math.round(zoom * 100)}%\n </ButtonGroupText>\n ) : null}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"Zoom in\"\n disabled={zoom >= max}\n onClick={() => setZoom(zoom + step)}\n >\n <ZoomIn aria-hidden />\n </Button>\n </ButtonGroup>\n );\n}\n"],"names":["ZOOM_DECIMALS","clamp","value","min","max","PlateZoomControl","zoom","onZoomChange","step","showReadout","className","setZoom","next","ButtonGroup","cn","jsx","Button","ZoomOut","jsxs","ButtonGroupText","ZoomIn"],"mappings":"iQAkBMA,EAAgB,EAEtB,SAASC,EAAMC,EAAeC,EAAaC,EAAqB,CAC9D,OAAO,KAAK,IAAIA,EAAK,KAAK,IAAID,EAAKD,CAAK,CAAC,CAC3C,CAEO,SAASG,EAAiB,CAC/B,KAAAC,EACA,aAAAC,EACA,KAAAC,EAAO,GACP,IAAAL,EAAM,GACN,IAAAC,EAAM,EACN,YAAAK,EAAc,GACd,UAAAC,CACF,EAA0B,CACxB,MAAMC,EAAWC,GAAiBL,EAAaN,EAAM,OAAOW,EAAK,QAAQZ,CAAa,CAAC,EAAGG,EAAKC,CAAG,CAAC,EAEnG,cACGS,cAAA,CAAY,UAAWC,EAAAA,GAAGJ,CAAS,EAAG,YAAU,qBAC/C,SAAA,CAAAK,EAAAA,IAACC,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,UACR,KAAK,UACL,aAAW,WACX,SAAUV,GAAQH,EAClB,QAAS,IAAMQ,EAAQL,EAAOE,CAAI,EAElC,SAAAO,EAAAA,IAACE,EAAAA,QAAA,CAAQ,cAAW,EAAA,CAAC,CAAA,CAAA,EAEtBR,EACCS,EAAAA,KAACC,EAAAA,gBAAA,CAAgB,UAAU,sDACxB,SAAA,CAAA,KAAK,MAAMb,EAAO,GAAG,EAAE,GAAA,CAAA,CAC1B,EACE,KACJS,EAAAA,IAACC,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,UACR,KAAK,UACL,aAAW,UACX,SAAUV,GAAQF,EAClB,QAAS,IAAMO,EAAQL,EAAOE,CAAI,EAElC,SAAAO,EAAAA,IAACK,EAAAA,OAAA,CAAO,cAAW,EAAA,CAAC,CAAA,CAAA,CACtB,EACF,CAEJ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface PlateZoomControlProps {
|
|
2
|
+
zoom: number;
|
|
3
|
+
onZoomChange: (next: number) => void;
|
|
4
|
+
/** Increment per click. Defaults to 0.1. */
|
|
5
|
+
step?: number;
|
|
6
|
+
min?: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
/** Render a percentage readout between the buttons. Defaults to true. */
|
|
9
|
+
showReadout?: boolean;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function PlateZoomControl({ zoom, onZoomChange, step, min, max, showReadout, className, }: PlateZoomControlProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs as l, jsx as n } from "react/jsx-runtime";
|
|
2
2
|
import { ZoomOut as d, ZoomIn as p } from "lucide-react";
|
|
3
|
-
import { Button as u } from "
|
|
4
|
-
import { ButtonGroup as h, ButtonGroupText as b } from "
|
|
3
|
+
import { Button as u } from "../../../ui/button.js";
|
|
4
|
+
import { ButtonGroup as h, ButtonGroupText as b } from "../../../ui/button-group.js";
|
|
5
5
|
import { cn as f } from "../../../lib/utils.js";
|
|
6
6
|
const x = 2;
|
|
7
7
|
function Z(t, r, o) {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),j=require("lucide-react"),O=require("react"),q=require("./csvPlateTriage.cjs"),P=require("./helpers.cjs"),m=require("
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),j=require("lucide-react"),O=require("react"),q=require("./csvPlateTriage.cjs"),P=require("./helpers.cjs"),m=require("../../../ui/button.cjs"),k=require("../../../ui/label.cjs"),s=require("../../../ui/select.cjs"),f=require("../../../ui/separator.cjs"),y=require("../../../lib/utils.cjs");function _(t){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const l in t)if(l!=="default"){const n=Object.getOwnPropertyDescriptor(t,l);Object.defineProperty(a,l,n.get?n:{enumerable:!0,get:()=>t[l]})}}return a.default=t,Object.freeze(a)}const g=_(O);function h({label:t,accept:a,onPick:l,disabled:n,triageCsv:o}){const r=g.useRef(null);return e.jsxs(e.Fragment,{children:[e.jsxs(m.Button,{type:"button",variant:"outline",size:"sm",disabled:n,onClick:()=>r.current?.click(),children:[e.jsx(j.Upload,{"aria-hidden":!0})," ",t]}),e.jsx("input",{ref:r,type:"file",accept:a,hidden:!0,onChange:c=>{const u=c.currentTarget,i=c.target.files?.[0];if(!i){u.value="";return}(async()=>{const x=o?await q.triagePlateMapCsvFile(i):void 0;await(x?l(i,x):l(i)),u.value=""})()}})]})}function w({templates:t,templateId:a,onTemplateChange:l,onClearTemplate:n,hasEntries:o,onImportCsv:r,onExportCsv:c,onImportTemplate:u,onExportTemplate:i,className:x,csvAccept:v=".csv,text/csv",templateAccept:b="application/json"}){const S=g.useMemo(()=>P.groupTemplateOptions(t),[t]);return e.jsxs("div",{"data-slot":"template-io-panel",className:y.cn("flex flex-col gap-3",x),children:[e.jsx("div",{className:"text-sm font-medium",children:"Template & import / export"}),t&&l?e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(k.Label,{htmlFor:"plate-template",children:"Template"}),e.jsxs(s.Select,{value:a??"",onValueChange:d=>l(d),children:[e.jsx(s.SelectTrigger,{id:"plate-template",size:"sm",className:"w-full",children:e.jsx(s.SelectValue,{placeholder:"Select template…"})}),e.jsx(s.SelectContent,{children:S.map(([d,N])=>e.jsxs(s.SelectGroup,{children:[d?e.jsx(s.SelectLabel,{children:d}):null,N.map(p=>e.jsx(s.SelectItem,{value:p.id,children:p.label},p.id))]},d||"_"))})]}),n?e.jsx(m.Button,{variant:"outline",size:"sm",onClick:n,disabled:!a&&!o,children:"Clear template"}):null]}):null,u||i?e.jsxs(e.Fragment,{children:[e.jsx(f.Separator,{}),e.jsx("div",{className:"text-xs font-medium text-muted-foreground",children:"Template"}),e.jsxs("div",{className:"flex flex-col gap-2",children:[u?e.jsx(h,{label:"Import template (JSON)",accept:b,onPick:u}):null,i?e.jsxs(m.Button,{variant:"outline",size:"sm",disabled:!o,onClick:i,children:[e.jsx(j.Download,{"aria-hidden":!0})," Export template (JSON)"]}):null]})]}):null,r||c?e.jsxs(e.Fragment,{children:[e.jsx(f.Separator,{}),e.jsx("div",{className:"text-xs font-medium text-muted-foreground",children:"Plate map"}),e.jsxs("div",{className:"flex flex-col gap-2",children:[r?e.jsx(h,{label:"Import plate map (CSV)",accept:v,onPick:r,triageCsv:!0}):null,c?e.jsxs(m.Button,{variant:"outline",size:"sm",disabled:!o,onClick:c,children:[e.jsx(j.Download,{"aria-hidden":!0})," Export plate map (CSV)"]}):null]})]}):null]})}exports.TemplateIOPanel=w;
|
|
2
2
|
//# sourceMappingURL=TemplateIOPanel.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateIOPanel.cjs","sources":["../../../../src/components/composed/PlateMapEditor/TemplateIOPanel.tsx"],"sourcesContent":["import { Download, Upload } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { triagePlateMapCsvFile } from \"./csvPlateTriage\";\nimport { groupTemplateOptions } from \"./helpers\";\n\nimport type { ImportExportHandlers, PlateMapCsvTriage, TemplateOption } from \"./types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface TemplateIOPanelProps extends ImportExportHandlers {\n templates?: TemplateOption[];\n templateId?: string;\n onTemplateChange?: (id: string) => void;\n onClearTemplate?: () => void;\n /** Disable export buttons when there's nothing to export. */\n hasEntries?: boolean;\n className?: string;\n csvAccept?: string;\n templateAccept?: string;\n}\n\ninterface FilePickerButtonProps {\n label: string;\n accept: string;\n onPick: (file: File, triage?: PlateMapCsvTriage) => void | Promise<void>;\n disabled?: boolean;\n triageCsv?: boolean;\n}\n\nfunction FilePickerButton({ label, accept, onPick, disabled, triageCsv }: FilePickerButtonProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n return (\n <>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={disabled} onClick={() => inputRef.current?.click()}>\n <Upload aria-hidden /> {label}\n </Button>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n hidden\n onChange={(e) => {\n const input = e.currentTarget;\n const f = e.target.files?.[0];\n if (!f) {\n input.value = \"\";\n return;\n }\n\n void (async () => {\n const triage = triageCsv ? await triagePlateMapCsvFile(f) : undefined;\n await (triage ? onPick(f, triage) : onPick(f));\n input.value = \"\";\n })();\n }}\n />\n </>\n );\n}\n\nexport function TemplateIOPanel({\n templates,\n templateId,\n onTemplateChange,\n onClearTemplate,\n hasEntries,\n onImportCsv,\n onExportCsv,\n onImportTemplate,\n onExportTemplate,\n className,\n csvAccept = \".csv,text/csv\",\n templateAccept = \"application/json\",\n}: TemplateIOPanelProps) {\n const groups = React.useMemo(() => groupTemplateOptions(templates), [templates]);\n\n return (\n <div data-slot=\"template-io-panel\" className={cn(\"flex flex-col gap-3\", className)}>\n <div className=\"text-sm font-medium\">Template & import / export</div>\n\n {templates && onTemplateChange ? (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"plate-template\">Template</Label>\n <Select value={templateId ?? \"\"} onValueChange={(v) => onTemplateChange(v)}>\n <SelectTrigger id=\"plate-template\" size=\"sm\" className=\"w-full\">\n <SelectValue placeholder=\"Select template…\" />\n </SelectTrigger>\n <SelectContent>\n {groups.map(([group, opts]) => (\n <SelectGroup key={group || \"_\"}>\n {group ? <SelectLabel>{group}</SelectLabel> : null}\n {opts.map((t) => (\n <SelectItem key={t.id} value={t.id}>\n {t.label}\n </SelectItem>\n ))}\n </SelectGroup>\n ))}\n </SelectContent>\n </Select>\n {onClearTemplate ? (\n <Button variant=\"outline\" size=\"sm\" onClick={onClearTemplate} disabled={!templateId && !hasEntries}>\n Clear template\n </Button>\n ) : null}\n </div>\n ) : null}\n\n {onImportTemplate || onExportTemplate ? (\n <>\n <Separator />\n <div className=\"text-xs font-medium text-muted-foreground\">Template</div>\n <div className=\"flex flex-col gap-2\">\n {onImportTemplate ? (\n <FilePickerButton label=\"Import template (JSON)\" accept={templateAccept} onPick={onImportTemplate} />\n ) : null}\n {onExportTemplate ? (\n <Button variant=\"outline\" size=\"sm\" disabled={!hasEntries} onClick={onExportTemplate}>\n <Download aria-hidden /> Export template (JSON)\n </Button>\n ) : null}\n </div>\n </>\n ) : null}\n\n {onImportCsv || onExportCsv ? (\n <>\n <Separator />\n <div className=\"text-xs font-medium text-muted-foreground\">Plate map</div>\n <div className=\"flex flex-col gap-2\">\n {onImportCsv ? (\n <FilePickerButton label=\"Import plate map (CSV)\" accept={csvAccept} onPick={onImportCsv} triageCsv />\n ) : null}\n {onExportCsv ? (\n <Button variant=\"outline\" size=\"sm\" disabled={!hasEntries} onClick={onExportCsv}>\n <Download aria-hidden /> Export plate map (CSV)\n </Button>\n ) : null}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["FilePickerButton","label","accept","onPick","disabled","triageCsv","inputRef","React","jsxs","Fragment","Button","jsx","Upload","e","input","f","triage","triagePlateMapCsvFile","TemplateIOPanel","templates","templateId","onTemplateChange","onClearTemplate","hasEntries","onImportCsv","onExportCsv","onImportTemplate","onExportTemplate","className","csvAccept","templateAccept","groups","groupTemplateOptions","cn","Label","Select","v","SelectTrigger","SelectValue","SelectContent","group","opts","SelectGroup","SelectLabel","t","SelectItem","Separator","Download"],"mappings":"
|
|
1
|
+
{"version":3,"file":"TemplateIOPanel.cjs","sources":["../../../../src/components/composed/PlateMapEditor/TemplateIOPanel.tsx"],"sourcesContent":["import { Download, Upload } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { triagePlateMapCsvFile } from \"./csvPlateTriage\";\nimport { groupTemplateOptions } from \"./helpers\";\n\nimport type { ImportExportHandlers, PlateMapCsvTriage, TemplateOption } from \"./types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface TemplateIOPanelProps extends ImportExportHandlers {\n templates?: TemplateOption[];\n templateId?: string;\n onTemplateChange?: (id: string) => void;\n onClearTemplate?: () => void;\n /** Disable export buttons when there's nothing to export. */\n hasEntries?: boolean;\n className?: string;\n csvAccept?: string;\n templateAccept?: string;\n}\n\ninterface FilePickerButtonProps {\n label: string;\n accept: string;\n onPick: (file: File, triage?: PlateMapCsvTriage) => void | Promise<void>;\n disabled?: boolean;\n triageCsv?: boolean;\n}\n\nfunction FilePickerButton({ label, accept, onPick, disabled, triageCsv }: FilePickerButtonProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n return (\n <>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={disabled} onClick={() => inputRef.current?.click()}>\n <Upload aria-hidden /> {label}\n </Button>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n hidden\n onChange={(e) => {\n const input = e.currentTarget;\n const f = e.target.files?.[0];\n if (!f) {\n input.value = \"\";\n return;\n }\n\n void (async () => {\n const triage = triageCsv ? await triagePlateMapCsvFile(f) : undefined;\n await (triage ? onPick(f, triage) : onPick(f));\n input.value = \"\";\n })();\n }}\n />\n </>\n );\n}\n\nexport function TemplateIOPanel({\n templates,\n templateId,\n onTemplateChange,\n onClearTemplate,\n hasEntries,\n onImportCsv,\n onExportCsv,\n onImportTemplate,\n onExportTemplate,\n className,\n csvAccept = \".csv,text/csv\",\n templateAccept = \"application/json\",\n}: TemplateIOPanelProps) {\n const groups = React.useMemo(() => groupTemplateOptions(templates), [templates]);\n\n return (\n <div data-slot=\"template-io-panel\" className={cn(\"flex flex-col gap-3\", className)}>\n <div className=\"text-sm font-medium\">Template & import / export</div>\n\n {templates && onTemplateChange ? (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"plate-template\">Template</Label>\n <Select value={templateId ?? \"\"} onValueChange={(v) => onTemplateChange(v)}>\n <SelectTrigger id=\"plate-template\" size=\"sm\" className=\"w-full\">\n <SelectValue placeholder=\"Select template…\" />\n </SelectTrigger>\n <SelectContent>\n {groups.map(([group, opts]) => (\n <SelectGroup key={group || \"_\"}>\n {group ? <SelectLabel>{group}</SelectLabel> : null}\n {opts.map((t) => (\n <SelectItem key={t.id} value={t.id}>\n {t.label}\n </SelectItem>\n ))}\n </SelectGroup>\n ))}\n </SelectContent>\n </Select>\n {onClearTemplate ? (\n <Button variant=\"outline\" size=\"sm\" onClick={onClearTemplate} disabled={!templateId && !hasEntries}>\n Clear template\n </Button>\n ) : null}\n </div>\n ) : null}\n\n {onImportTemplate || onExportTemplate ? (\n <>\n <Separator />\n <div className=\"text-xs font-medium text-muted-foreground\">Template</div>\n <div className=\"flex flex-col gap-2\">\n {onImportTemplate ? (\n <FilePickerButton label=\"Import template (JSON)\" accept={templateAccept} onPick={onImportTemplate} />\n ) : null}\n {onExportTemplate ? (\n <Button variant=\"outline\" size=\"sm\" disabled={!hasEntries} onClick={onExportTemplate}>\n <Download aria-hidden /> Export template (JSON)\n </Button>\n ) : null}\n </div>\n </>\n ) : null}\n\n {onImportCsv || onExportCsv ? (\n <>\n <Separator />\n <div className=\"text-xs font-medium text-muted-foreground\">Plate map</div>\n <div className=\"flex flex-col gap-2\">\n {onImportCsv ? (\n <FilePickerButton label=\"Import plate map (CSV)\" accept={csvAccept} onPick={onImportCsv} triageCsv />\n ) : null}\n {onExportCsv ? (\n <Button variant=\"outline\" size=\"sm\" disabled={!hasEntries} onClick={onExportCsv}>\n <Download aria-hidden /> Export plate map (CSV)\n </Button>\n ) : null}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["FilePickerButton","label","accept","onPick","disabled","triageCsv","inputRef","React","jsxs","Fragment","Button","jsx","Upload","e","input","f","triage","triagePlateMapCsvFile","TemplateIOPanel","templates","templateId","onTemplateChange","onClearTemplate","hasEntries","onImportCsv","onExportCsv","onImportTemplate","onExportTemplate","className","csvAccept","templateAccept","groups","groupTemplateOptions","cn","Label","Select","v","SelectTrigger","SelectValue","SelectContent","group","opts","SelectGroup","SelectLabel","t","SelectItem","Separator","Download"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ImportExportHandlers, TemplateOption } from './types';
|
|
2
|
+
export interface TemplateIOPanelProps extends ImportExportHandlers {
|
|
3
|
+
templates?: TemplateOption[];
|
|
4
|
+
templateId?: string;
|
|
5
|
+
onTemplateChange?: (id: string) => void;
|
|
6
|
+
onClearTemplate?: () => void;
|
|
7
|
+
/** Disable export buttons when there's nothing to export. */
|
|
8
|
+
hasEntries?: boolean;
|
|
9
|
+
className?: string;
|
|
10
|
+
csvAccept?: string;
|
|
11
|
+
templateAccept?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function TemplateIOPanel({ templates, templateId, onTemplateChange, onClearTemplate, hasEntries, onImportCsv, onExportCsv, onImportTemplate, onExportTemplate, className, csvAccept, templateAccept, }: TemplateIOPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -3,10 +3,10 @@ import { Download as x, Upload as z } from "lucide-react";
|
|
|
3
3
|
import * as S from "react";
|
|
4
4
|
import { triagePlateMapCsvFile as P } from "./csvPlateTriage.js";
|
|
5
5
|
import { groupTemplateOptions as w } from "./helpers.js";
|
|
6
|
-
import { Button as p } from "
|
|
7
|
-
import { Label as F } from "
|
|
8
|
-
import { Select as O, SelectTrigger as V, SelectValue as j, SelectContent as y, SelectGroup as R, SelectLabel as B, SelectItem as J } from "
|
|
9
|
-
import { Separator as v } from "
|
|
6
|
+
import { Button as p } from "../../../ui/button.js";
|
|
7
|
+
import { Label as F } from "../../../ui/label.js";
|
|
8
|
+
import { Select as O, SelectTrigger as V, SelectValue as j, SelectContent as y, SelectGroup as R, SelectLabel as B, SelectItem as J } from "../../../ui/select.js";
|
|
9
|
+
import { Separator as v } from "../../../ui/separator.js";
|
|
10
10
|
import { cn as L } from "../../../lib/utils.js";
|
|
11
11
|
function g({ label: n, accept: m, onPick: c, disabled: u, triageCsv: d }) {
|
|
12
12
|
const i = S.useRef(null);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),x=require("lucide-react"),g=require("react"),f=require("
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),x=require("lucide-react"),g=require("react"),f=require("../../../ui/button.cjs"),c=require("../../../ui/card.cjs"),a=require("../../../lib/utils.cjs");function b(r){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const l in r)if(l!=="default"){const s=Object.getOwnPropertyDescriptor(r,l);Object.defineProperty(n,l,s.get?s:{enumerable:!0,get:()=>r[l]})}}return n.default=r,Object.freeze(n)}const j=b(g);function p({items:r,renderItem:n,onHoverEnter:l,onHoverLeave:s,onRemove:d,removeLabel:i="Remove",emptyLabel:u="No items",className:o}){return r.length===0?t.jsx("div",{className:a.cn("text-xs text-muted-foreground",o),"data-slot":"well-legend-empty",children:u}):t.jsx("div",{className:a.cn("flex flex-col gap-1.5",o),"data-slot":"well-legend",children:r.map(e=>n?t.jsx(j.Fragment,{children:n(e)},e.id):t.jsx(c.Card,{size:"sm","data-slot":"well-legend-item","data-disabled":e.disabled||void 0,className:a.cn("py-2 hover:bg-accent/40"),onMouseEnter:()=>l?.(e.id),onMouseLeave:()=>s?.(e.id),children:t.jsxs(c.CardContent,{className:"flex items-start gap-2",children:[t.jsx("span",{"aria-hidden":!0,className:a.cn("mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20",e.disabled&&"opacity-50"),style:{backgroundColor:e.color}}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:a.cn("truncate text-xs font-medium",e.disabled&&"text-muted-foreground"),children:e.label}),e.meta?t.jsx("div",{className:"truncate text-[0.65rem] text-muted-foreground",children:e.meta}):null]}),d?t.jsx(f.Button,{type:"button",variant:"ghost",size:"icon-xs","aria-label":`${i} ${typeof e.label=="string"?e.label:e.id}`,onClick:()=>d(e.id),children:t.jsx(x.X,{"aria-hidden":!0})}):null]})},e.id))})}exports.WellLegend=p;
|
|
2
2
|
//# sourceMappingURL=WellLegend.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WellLegend.cjs","sources":["../../../../src/components/composed/PlateMapEditor/WellLegend.tsx"],"sourcesContent":["import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface WellLegendItem {\n id: string;\n label: React.ReactNode;\n color: string;\n /** Optional secondary text shown beneath the label. */\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface WellLegendProps {\n items: WellLegendItem[];\n /** Render-prop for fully custom cards. Bypasses the default card layout. */\n renderItem?: (item: WellLegendItem) => React.ReactNode;\n onHoverEnter?: (id: string) => void;\n onHoverLeave?: (id: string) => void;\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n className?: string;\n}\n\nexport function WellLegend({\n items,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n removeLabel = \"Remove\",\n emptyLabel = \"No items\",\n className,\n}: WellLegendProps) {\n if (items.length === 0) {\n return (\n <div className={cn(\"text-xs text-muted-foreground\", className)} data-slot=\"well-legend-empty\">\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)} data-slot=\"well-legend\">\n {items.map((item) => {\n if (renderItem) return <React.Fragment key={item.id}>{renderItem(item)}</React.Fragment>;\n return (\n <Card\n key={item.id}\n size=\"sm\"\n data-slot=\"well-legend-item\"\n data-disabled={item.disabled || undefined}\n className={cn(\"py-2 hover:bg-accent/40\"
|
|
1
|
+
{"version":3,"file":"WellLegend.cjs","sources":["../../../../src/components/composed/PlateMapEditor/WellLegend.tsx"],"sourcesContent":["import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface WellLegendItem {\n id: string;\n label: React.ReactNode;\n color: string;\n /** Optional secondary text shown beneath the label. */\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface WellLegendProps {\n items: WellLegendItem[];\n /** Render-prop for fully custom cards. Bypasses the default card layout. */\n renderItem?: (item: WellLegendItem) => React.ReactNode;\n onHoverEnter?: (id: string) => void;\n onHoverLeave?: (id: string) => void;\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n className?: string;\n}\n\nexport function WellLegend({\n items,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n removeLabel = \"Remove\",\n emptyLabel = \"No items\",\n className,\n}: WellLegendProps) {\n if (items.length === 0) {\n return (\n <div className={cn(\"text-xs text-muted-foreground\", className)} data-slot=\"well-legend-empty\">\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)} data-slot=\"well-legend\">\n {items.map((item) => {\n if (renderItem) return <React.Fragment key={item.id}>{renderItem(item)}</React.Fragment>;\n return (\n <Card\n key={item.id}\n size=\"sm\"\n data-slot=\"well-legend-item\"\n data-disabled={item.disabled || undefined}\n className={cn(\"py-2 hover:bg-accent/40\")}\n onMouseEnter={() => onHoverEnter?.(item.id)}\n onMouseLeave={() => onHoverLeave?.(item.id)}\n >\n <CardContent className=\"flex items-start gap-2\">\n <span\n aria-hidden\n className={cn(\n \"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20\",\n item.disabled && \"opacity-50\"\n )}\n style={{ backgroundColor: item.color }}\n />\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"truncate text-xs font-medium\",\n item.disabled && \"text-muted-foreground\"\n )}\n >\n {item.label}\n </div>\n {item.meta ? (\n <div className=\"truncate text-[0.65rem] text-muted-foreground\">{item.meta}</div>\n ) : null}\n </div>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={`${removeLabel} ${typeof item.label === \"string\" ? item.label : item.id}`}\n onClick={() => onRemove(item.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </CardContent>\n </Card>\n );\n })}\n </div>\n );\n}\n"],"names":["WellLegend","items","renderItem","onHoverEnter","onHoverLeave","onRemove","removeLabel","emptyLabel","className","jsx","cn","item","React","Card","jsxs","CardContent","Button","X"],"mappings":"siBA4BO,SAASA,EAAW,CACzB,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,aAAAC,EACA,SAAAC,EACA,YAAAC,EAAc,SACd,WAAAC,EAAa,WACb,UAAAC,CACF,EAAoB,CAClB,OAAIP,EAAM,SAAW,EAEjBQ,MAAC,OAAI,UAAWC,EAAAA,GAAG,gCAAiCF,CAAS,EAAG,YAAU,oBACvE,SAAAD,CAAA,CACH,EAKFE,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAAA,GAAG,wBAAyBF,CAAS,EAAG,YAAU,cAC/D,SAAAP,EAAM,IAAKU,GACNT,EAAmBO,MAACG,EAAM,SAAN,CAA8B,SAAAV,EAAWS,CAAI,GAAzBA,EAAK,EAAsB,EAErEF,EAAAA,IAACI,EAAAA,KAAA,CAEC,KAAK,KACL,YAAU,mBACV,gBAAeF,EAAK,UAAY,OAChC,UAAWD,EAAAA,GAAG,yBAAyB,EACvC,aAAc,IAAMP,IAAeQ,EAAK,EAAE,EAC1C,aAAc,IAAMP,IAAeO,EAAK,EAAE,EAE1C,SAAAG,EAAAA,KAACC,EAAAA,YAAA,CAAY,UAAU,yBACrB,SAAA,CAAAN,EAAAA,IAAC,OAAA,CACC,cAAW,GACX,UAAWC,EAAAA,GACT,kEACAC,EAAK,UAAY,YAAA,EAEnB,MAAO,CAAE,gBAAiBA,EAAK,KAAA,CAAM,CAAA,EAEvCG,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAL,EAAAA,IAAC,MAAA,CACC,UAAWC,EAAAA,GACT,+BACAC,EAAK,UAAY,uBAAA,EAGlB,SAAAA,EAAK,KAAA,CAAA,EAEPA,EAAK,KACJF,MAAC,MAAA,CAAI,UAAU,gDAAiD,SAAAE,EAAK,KAAK,EACxE,IAAA,EACN,EACCN,EACCI,EAAAA,IAACO,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,UACL,aAAY,GAAGV,CAAW,IAAI,OAAOK,EAAK,OAAU,SAAWA,EAAK,MAAQA,EAAK,EAAE,GACnF,QAAS,IAAMN,EAASM,EAAK,EAAE,EAE/B,SAAAF,EAAAA,IAACQ,EAAAA,EAAA,CAAE,cAAW,EAAA,CAAC,CAAA,CAAA,EAEf,IAAA,CAAA,CACN,CAAA,EAzCKN,EAAK,EAAA,CA4Cf,CAAA,CACH,CAEJ"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface WellLegendItem {
|
|
3
|
+
id: string;
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
color: string;
|
|
6
|
+
/** Optional secondary text shown beneath the label. */
|
|
7
|
+
meta?: React.ReactNode;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface WellLegendProps {
|
|
11
|
+
items: WellLegendItem[];
|
|
12
|
+
/** Render-prop for fully custom cards. Bypasses the default card layout. */
|
|
13
|
+
renderItem?: (item: WellLegendItem) => React.ReactNode;
|
|
14
|
+
onHoverEnter?: (id: string) => void;
|
|
15
|
+
onHoverLeave?: (id: string) => void;
|
|
16
|
+
onRemove?: (id: string) => void;
|
|
17
|
+
removeLabel?: string;
|
|
18
|
+
emptyLabel?: string;
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function WellLegend({ items, renderItem, onHoverEnter, onHoverLeave, onRemove, removeLabel, emptyLabel, className, }: WellLegendProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { jsx as r, jsxs as
|
|
1
|
+
import { jsx as r, jsxs as n } from "react/jsx-runtime";
|
|
2
2
|
import { X as m } from "lucide-react";
|
|
3
3
|
import * as f from "react";
|
|
4
|
-
import { Button as
|
|
5
|
-
import { Card as
|
|
4
|
+
import { Button as g } from "../../../ui/button.js";
|
|
5
|
+
import { Card as p, CardContent as x } from "../../../ui/card.js";
|
|
6
6
|
import { cn as a } from "../../../lib/utils.js";
|
|
7
7
|
function C({
|
|
8
8
|
items: l,
|
|
@@ -12,32 +12,44 @@ function C({
|
|
|
12
12
|
onRemove: t,
|
|
13
13
|
removeLabel: c = "Remove",
|
|
14
14
|
emptyLabel: u = "No items",
|
|
15
|
-
className:
|
|
15
|
+
className: o
|
|
16
16
|
}) {
|
|
17
|
-
return l.length === 0 ? /* @__PURE__ */ r("div", { className: a("text-xs text-muted-foreground",
|
|
18
|
-
|
|
17
|
+
return l.length === 0 ? /* @__PURE__ */ r("div", { className: a("text-xs text-muted-foreground", o), "data-slot": "well-legend-empty", children: u }) : /* @__PURE__ */ r("div", { className: a("flex flex-col gap-1.5", o), "data-slot": "well-legend", children: l.map((e) => d ? /* @__PURE__ */ r(f.Fragment, { children: d(e) }, e.id) : /* @__PURE__ */ r(
|
|
18
|
+
p,
|
|
19
19
|
{
|
|
20
20
|
size: "sm",
|
|
21
21
|
"data-slot": "well-legend-item",
|
|
22
22
|
"data-disabled": e.disabled || void 0,
|
|
23
|
-
className: a("py-2 hover:bg-accent/40"
|
|
23
|
+
className: a("py-2 hover:bg-accent/40"),
|
|
24
24
|
onMouseEnter: () => s?.(e.id),
|
|
25
25
|
onMouseLeave: () => i?.(e.id),
|
|
26
|
-
children: /* @__PURE__ */
|
|
26
|
+
children: /* @__PURE__ */ n(x, { className: "flex items-start gap-2", children: [
|
|
27
27
|
/* @__PURE__ */ r(
|
|
28
28
|
"span",
|
|
29
29
|
{
|
|
30
30
|
"aria-hidden": !0,
|
|
31
|
-
className:
|
|
31
|
+
className: a(
|
|
32
|
+
"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20",
|
|
33
|
+
e.disabled && "opacity-50"
|
|
34
|
+
),
|
|
32
35
|
style: { backgroundColor: e.color }
|
|
33
36
|
}
|
|
34
37
|
),
|
|
35
|
-
/* @__PURE__ */
|
|
36
|
-
/* @__PURE__ */ r(
|
|
38
|
+
/* @__PURE__ */ n("div", { className: "min-w-0 flex-1", children: [
|
|
39
|
+
/* @__PURE__ */ r(
|
|
40
|
+
"div",
|
|
41
|
+
{
|
|
42
|
+
className: a(
|
|
43
|
+
"truncate text-xs font-medium",
|
|
44
|
+
e.disabled && "text-muted-foreground"
|
|
45
|
+
),
|
|
46
|
+
children: e.label
|
|
47
|
+
}
|
|
48
|
+
),
|
|
37
49
|
e.meta ? /* @__PURE__ */ r("div", { className: "truncate text-[0.65rem] text-muted-foreground", children: e.meta }) : null
|
|
38
50
|
] }),
|
|
39
51
|
t ? /* @__PURE__ */ r(
|
|
40
|
-
|
|
52
|
+
g,
|
|
41
53
|
{
|
|
42
54
|
type: "button",
|
|
43
55
|
variant: "ghost",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WellLegend.js","sources":["../../../../src/components/composed/PlateMapEditor/WellLegend.tsx"],"sourcesContent":["import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface WellLegendItem {\n id: string;\n label: React.ReactNode;\n color: string;\n /** Optional secondary text shown beneath the label. */\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface WellLegendProps {\n items: WellLegendItem[];\n /** Render-prop for fully custom cards. Bypasses the default card layout. */\n renderItem?: (item: WellLegendItem) => React.ReactNode;\n onHoverEnter?: (id: string) => void;\n onHoverLeave?: (id: string) => void;\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n className?: string;\n}\n\nexport function WellLegend({\n items,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n removeLabel = \"Remove\",\n emptyLabel = \"No items\",\n className,\n}: WellLegendProps) {\n if (items.length === 0) {\n return (\n <div className={cn(\"text-xs text-muted-foreground\", className)} data-slot=\"well-legend-empty\">\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)} data-slot=\"well-legend\">\n {items.map((item) => {\n if (renderItem) return <React.Fragment key={item.id}>{renderItem(item)}</React.Fragment>;\n return (\n <Card\n key={item.id}\n size=\"sm\"\n data-slot=\"well-legend-item\"\n data-disabled={item.disabled || undefined}\n className={cn(\"py-2 hover:bg-accent/40\"
|
|
1
|
+
{"version":3,"file":"WellLegend.js","sources":["../../../../src/components/composed/PlateMapEditor/WellLegend.tsx"],"sourcesContent":["import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface WellLegendItem {\n id: string;\n label: React.ReactNode;\n color: string;\n /** Optional secondary text shown beneath the label. */\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface WellLegendProps {\n items: WellLegendItem[];\n /** Render-prop for fully custom cards. Bypasses the default card layout. */\n renderItem?: (item: WellLegendItem) => React.ReactNode;\n onHoverEnter?: (id: string) => void;\n onHoverLeave?: (id: string) => void;\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n className?: string;\n}\n\nexport function WellLegend({\n items,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n removeLabel = \"Remove\",\n emptyLabel = \"No items\",\n className,\n}: WellLegendProps) {\n if (items.length === 0) {\n return (\n <div className={cn(\"text-xs text-muted-foreground\", className)} data-slot=\"well-legend-empty\">\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)} data-slot=\"well-legend\">\n {items.map((item) => {\n if (renderItem) return <React.Fragment key={item.id}>{renderItem(item)}</React.Fragment>;\n return (\n <Card\n key={item.id}\n size=\"sm\"\n data-slot=\"well-legend-item\"\n data-disabled={item.disabled || undefined}\n className={cn(\"py-2 hover:bg-accent/40\")}\n onMouseEnter={() => onHoverEnter?.(item.id)}\n onMouseLeave={() => onHoverLeave?.(item.id)}\n >\n <CardContent className=\"flex items-start gap-2\">\n <span\n aria-hidden\n className={cn(\n \"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20\",\n item.disabled && \"opacity-50\"\n )}\n style={{ backgroundColor: item.color }}\n />\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"truncate text-xs font-medium\",\n item.disabled && \"text-muted-foreground\"\n )}\n >\n {item.label}\n </div>\n {item.meta ? (\n <div className=\"truncate text-[0.65rem] text-muted-foreground\">{item.meta}</div>\n ) : null}\n </div>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={`${removeLabel} ${typeof item.label === \"string\" ? item.label : item.id}`}\n onClick={() => onRemove(item.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </CardContent>\n </Card>\n );\n })}\n </div>\n );\n}\n"],"names":["WellLegend","items","renderItem","onHoverEnter","onHoverLeave","onRemove","removeLabel","emptyLabel","className","jsx","cn","item","React","Card","jsxs","CardContent","Button","X"],"mappings":";;;;;;AA4BO,SAASA,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,YAAAC,IAAa;AAAA,EACb,WAAAC;AACF,GAAoB;AAClB,SAAIP,EAAM,WAAW,IAEjB,gBAAAQ,EAAC,SAAI,WAAWC,EAAG,iCAAiCF,CAAS,GAAG,aAAU,qBACvE,UAAAD,EAAA,CACH,IAKF,gBAAAE,EAAC,OAAA,EAAI,WAAWC,EAAG,yBAAyBF,CAAS,GAAG,aAAU,eAC/D,UAAAP,EAAM,IAAI,CAACU,MACNT,IAAmB,gBAAAO,EAACG,EAAM,UAAN,EAA8B,UAAAV,EAAWS,CAAI,KAAzBA,EAAK,EAAsB,IAErE,gBAAAF;AAAA,IAACI;AAAA,IAAA;AAAA,MAEC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,iBAAeF,EAAK,YAAY;AAAA,MAChC,WAAWD,EAAG,yBAAyB;AAAA,MACvC,cAAc,MAAMP,IAAeQ,EAAK,EAAE;AAAA,MAC1C,cAAc,MAAMP,IAAeO,EAAK,EAAE;AAAA,MAE1C,UAAA,gBAAAG,EAACC,GAAA,EAAY,WAAU,0BACrB,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAWC;AAAA,cACT;AAAA,cACAC,EAAK,YAAY;AAAA,YAAA;AAAA,YAEnB,OAAO,EAAE,iBAAiBA,EAAK,MAAA;AAAA,UAAM;AAAA,QAAA;AAAA,QAEvC,gBAAAG,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,UAAA,gBAAAL;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWC;AAAA,gBACT;AAAA,gBACAC,EAAK,YAAY;AAAA,cAAA;AAAA,cAGlB,UAAAA,EAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAEPA,EAAK,OACJ,gBAAAF,EAAC,OAAA,EAAI,WAAU,iDAAiD,UAAAE,EAAK,MAAK,IACxE;AAAA,QAAA,GACN;AAAA,QACCN,IACC,gBAAAI;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,cAAY,GAAGV,CAAW,IAAI,OAAOK,EAAK,SAAU,WAAWA,EAAK,QAAQA,EAAK,EAAE;AAAA,YACnF,SAAS,MAAMN,EAASM,EAAK,EAAE;AAAA,YAE/B,UAAA,gBAAAF,EAACQ,GAAA,EAAE,eAAW,GAAA,CAAC;AAAA,UAAA;AAAA,QAAA,IAEf;AAAA,MAAA,EAAA,CACN;AAAA,IAAA;AAAA,IAzCKN,EAAK;AAAA,EAAA,CA4Cf,EAAA,CACH;AAEJ;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),T=require("lucide-react"),we=require("react"),ve=require("./ManifestFilterPopover.cjs"),Y=require("../../ui/badge.cjs"),A=require("../../ui/button.cjs"),J=require("../../ui/checkbox.cjs"),b=require("../../ui/combobox.cjs"),Ne=require("../../ui/data-table/data-table.cjs"),ye=require("../../ui/input.cjs"),u=require("../../ui/select.cjs"),ke=require("../../ui/switch.cjs"),f=require("../../ui/table.cjs"),P=require("../../ui/tooltip.cjs"),I=require("../../../lib/utils.cjs");function Te(o){const i=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const c in o)if(c!=="default"){const d=Object.getOwnPropertyDescriptor(o,c);Object.defineProperty(i,c,d.get?d:{enumerable:!0,get:()=>o[c]})}}return i.default=o,Object.freeze(i)}const h=Te(we);function _e({ariaLabel:o,value:i,options:c,placeholder:d,onChange:p}){const j=b.useComboboxAnchor(),g=h.useMemo(()=>{const x=new Map;return c.forEach(C=>x.set(C.value,C.label)),x},[c]);return t.jsxs(b.Combobox,{multiple:!0,items:c.map(x=>x.value),value:i,onValueChange:p,children:[t.jsxs(b.ComboboxChips,{ref:j,className:I.cn("min-h-7 w-full py-0.5",G),children:[t.jsx(b.ComboboxValue,{children:x=>x.map(C=>t.jsx(b.ComboboxChip,{children:g.get(C)??C},C))}),t.jsx(b.ComboboxChipsInput,{"aria-label":o,placeholder:d??"Select…"})]}),t.jsxs(b.ComboboxContent,{anchor:j,children:[t.jsx(b.ComboboxEmpty,{children:"No options."}),t.jsx(b.ComboboxList,{children:x=>t.jsx(b.ComboboxItem,{value:x,children:g.get(x)??x},x)})]})]})}const G="border-transparent shadow-none hover:border-input/40",X=25,Me=50,Ee=100,ze=X,Fe=[X,Me,Ee];function Q(o){return o!=null&&o!==""}const Re={number:"number",integer:"number",date:"date",datetime:"datetime-local",time:"time"};function Ae(o){return Re[o]??"text"}function Pe(o,i){if(i!==""){if(o==="number"){const c=parseFloat(i);return Number.isFinite(c)?c:i}if(o==="integer"){const c=parseInt(i,10);return Number.isFinite(c)?c:i}return i}}function Ie(o,i){const c=new Map;for(const d of o){const p=d.row[i],j=p==null||p===""?"(blank)":String(p),g=c.get(j);g?g.rows.push(d):c.set(j,{key:j,rows:[d]})}return[...c.values()]}function qe(o){return o.filter(i=>!!i.field).map(i=>({columnId:i.field,label:i.header}))}function De({values:o,columns:i,fields:c,selection:d,onSelectionChange:p,onChange:j,emptyEntry:g,isPopulated:x,pageSize:C=ze,pageSizeOptions:ee=Fe,enableFillDown:L=!0,rowProps:te,filterable:q=!1,filterColumns:V,groupable:D=!1,className:ne}){const[F,se]=h.useState(!1),[w,_]=h.useState(0),[S,re]=h.useState(C),[M,le]=h.useState([]),[R,ae]=h.useState(""),[ie,oe]=h.useState(new Set);h.useEffect(()=>{_(0)},[F]);const W=h.useMemo(()=>{const e=new Map;return(c??[]).forEach(n=>e.set(n.key,n)),e},[c]),ce=h.useMemo(()=>V??qe(i),[i,V]),v=h.useMemo(()=>{const e=[...o.entries()].map(([s,r])=>({id:s,row:r}));let n=e;if(!F&&x&&(n=e.filter(s=>x(s.row))),q&&M.length>0&&(n=n.filter(s=>{const r=s.row;return M.every(l=>{const a=r[l.columnId],m=a==null?"":String(a);return Ne.applyFilterCondition(m,l.operator,l.value)})})),d&&d.size>0){const s=new Set(n.map(r=>r.id));d.forEach(r=>{!s.has(r)&&!o.has(r)&&(n=[...n,{id:r,row:g(r)}])})}return n.sort((s,r)=>s.id.localeCompare(r.id))},[o,F,x,d,g,q,M]);h.useEffect(()=>{_(0)},[M]);const B=h.useMemo(()=>v.slice(w*S,w*S+S),[v,w,S]),y=(e,n)=>{const s=new Map(o),r=s.get(e)??g(e);s.set(e,{...r,...n}),j(s)},de=e=>{if(!p)return;const n=new Set(d??[]);n.has(e)?n.delete(e):n.add(e),p(n)},O=e=>{if(!e.field)return null;const n=!!d&&d.size>0,r=n?v.filter(({id:N})=>d.has(N)):D&&!!R?v:B,l=r.findIndex(({row:N})=>Q(N[e.field]));if(l<0)return null;const a=r[l],m=n?r.filter(({id:N})=>N!==a.id):r.slice(l+1);return{field:e.field,source:a,targets:m,value:a.row[e.field]}},ue=e=>{const n=O(e);if(!n||n.targets.length===0)return;const s=new Map(o);n.targets.forEach(({id:r})=>{const l=s.get(r)??g(r);s.set(r,{...l,[n.field]:n.value})}),j(s)},he=(e,n,s,r,l)=>t.jsxs(u.Select,{value:s??"",onValueChange:a=>y(r,{[n]:a}),children:[t.jsx(u.SelectTrigger,{size:"sm",className:I.cn("h-7 w-full",G),"aria-label":l,children:t.jsx(u.SelectValue,{placeholder:e.placeholder??"Select…"})}),t.jsx(u.SelectContent,{children:(e.options??[]).map(a=>t.jsx(u.SelectItem,{value:a.value,children:t.jsxs("span",{className:"inline-flex items-center gap-2",children:[a.swatch?t.jsx("span",{className:"inline-block h-2.5 w-2.5 rounded-sm border border-foreground/20",style:{backgroundColor:a.swatch},"aria-hidden":!0}):null,a.label]})},a.value))})]}),xe=(e,n,s,r,l)=>{const a=!!s;return e.boolStyle==="switch"?t.jsx(ke.Switch,{"aria-label":l,checked:a,onCheckedChange:m=>y(r,{[n]:m})}):t.jsx(J.Checkbox,{"aria-label":l,checked:a,onCheckedChange:m=>y(r,{[n]:m===!0})})},me=(e,n,s,r,l)=>t.jsx(ye.Input,{type:Ae(e.kind),step:e.kind==="integer"?1:void 0,placeholder:e.placeholder,"aria-label":l,className:I.cn("h-7",G),value:s??"",onChange:a=>y(r,{[n]:Pe(e.kind,a.target.value)})}),fe=(e,n,s,r)=>{const l=n.field,a=r[l],m=`${e.label} for ${s}`;if(e.kind==="select")return he(e,l,a,s,m);if(e.kind==="multiselect"){const N=Array.isArray(a)?a:[];return t.jsx(_e,{ariaLabel:m,value:N,options:e.options??[],placeholder:e.placeholder,onChange:K=>y(s,{[l]:K.length===0?void 0:K})})}return e.kind==="boolean"?xe(e,l,a,s,m):me(e,l,a,s,m)},pe=(e,n)=>{if(e?.kind==="select"){const s=(e.options??[]).find(r=>r.value===n);return s?t.jsxs(Y.Badge,{variant:"secondary",children:[s.swatch?t.jsx("span",{className:"size-2 rounded-sm border border-foreground/20",style:{backgroundColor:s.swatch},"aria-hidden":!0}):null,s.label]}):t.jsx("span",{className:"text-muted-foreground",children:"—"})}if(e?.kind==="multiselect"){const s=Array.isArray(n)?n:[];return s.length===0?t.jsx("span",{className:"text-muted-foreground",children:"—"}):t.jsx("div",{className:"flex flex-wrap gap-1",children:s.map(r=>{const l=(e.options??[]).find(a=>a.value===r);return t.jsxs(Y.Badge,{variant:"secondary",children:[l?.swatch?t.jsx("span",{className:"size-2 rounded-sm border border-foreground/20",style:{backgroundColor:l.swatch},"aria-hidden":!0}):null,l?.label??r]},r)})})}return e?.kind==="boolean"?n?t.jsx(T.Check,{"aria-label":"Yes",className:"size-4 text-foreground"}):t.jsx("span",{className:"text-muted-foreground",children:"—"}):Q(n)?String(n):t.jsx("span",{className:"text-muted-foreground",children:"—"})},ge=(e,n,s)=>{if(e.render)return e.render({row:s,wellId:n,update:a=>y(n,a)});if(!e.field)return null;const r=W.get(e.field),l=s[e.field];return r?.editableInTable&&r.kind!=="custom"?fe(r,e,n,s):pe(r,l)},be=e=>{const n=e.field?W.get(e.field):void 0,s=e.icon??n?.icon,r=L?O(e):null,l=!!r&&r.targets.length>0,a=d&&d.size>0?`Fill selected ${e.header} cells from the first selected value`:`Fill visible ${e.header} cells downward from the first value`;return t.jsxs("span",{className:"flex min-w-0 items-center justify-between gap-2",children:[t.jsxs("span",{className:"inline-flex min-w-0 items-center gap-1.5",children:[s?t.jsx("span",{className:"inline-flex text-muted-foreground [&_svg]:size-3.5",children:s}):null,t.jsx("span",{className:"truncate",children:e.header})]}),L&&e.field?t.jsxs(P.Tooltip,{children:[t.jsx(P.TooltipTrigger,{asChild:!0,children:t.jsx(A.Button,{type:"button",variant:"ghost",size:"icon-xs",className:"-mr-1 text-muted-foreground hover:text-foreground",disabled:!l,"aria-label":`Fill down ${e.header}`,onClick:m=>{m.preventDefault(),m.stopPropagation(),ue(e)},children:t.jsx(T.ArrowDownToLine,{})})}),t.jsx(P.TooltipContent,{children:a})]}):null]})},je=h.useMemo(()=>i.filter(e=>!!e.field),[i]),k=D&&R?R:"",E=h.useMemo(()=>k?Ie(v,k):null,[k,v]),z=v.length,$=Math.max(0,Math.ceil(z/S)-1),Ce=d?.size??0,H=i.length+1+(p?1:0),Z=(e,n)=>{const s=d?.has(e),r=te?.({wellId:e,row:n,isSelected:!!s});return t.jsxs(f.TableRow,{...r,children:[p?t.jsx(f.TableCell,{className:"w-10",children:t.jsx(J.Checkbox,{checked:!!s,onCheckedChange:()=>de(e),"aria-label":`Select ${e}`})}):null,t.jsx(f.TableCell,{className:"font-semibold",children:e}),i.map(l=>t.jsx(f.TableCell,{style:l.minWidth?{minWidth:l.minWidth}:void 0,children:ge(l,e,n)},l.id??l.field??l.header))]},e)},U=e=>{oe(n=>{const s=new Set(n);return s.has(e)?s.delete(e):s.add(e),s})},Se=k?i.find(n=>n.field===k)?.header??k:"";return t.jsxs("div",{"data-slot":"well-manifest-table",className:I.cn("flex flex-col gap-2",ne),children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx(A.Button,{variant:"outline",size:"sm",onClick:()=>se(e=>!e),children:F?"Hide empty wells":"Show all wells"}),q?t.jsx(ve.ManifestFilterPopover,{columns:ce,filters:M,onFiltersChange:le}):null,D?t.jsxs("div",{className:"inline-flex items-center gap-1.5",children:[t.jsx(T.Layers,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}),t.jsxs(u.Select,{value:R||"__none",onValueChange:e=>ae(e==="__none"?"":e),children:[t.jsx(u.SelectTrigger,{size:"sm",className:"h-7 min-w-40","aria-label":"Group by",children:t.jsx(u.SelectValue,{placeholder:"Group by…"})}),t.jsxs(u.SelectContent,{children:[t.jsx(u.SelectItem,{value:"__none",children:"No grouping"}),je.map(e=>t.jsx(u.SelectItem,{value:e.field??"",children:e.header},e.id??e.field))]})]})]}):null,t.jsxs("span",{className:"text-xs text-muted-foreground",children:[z," rows · ",Ce," selected"]})]}),t.jsx(P.TooltipProvider,{children:t.jsxs(f.Table,{"data-density":"default",children:[t.jsx(f.TableHeader,{children:t.jsxs(f.TableRow,{children:[p?t.jsx(f.TableHead,{className:"w-10 text-center",children:t.jsxs("span",{className:"inline-flex items-center justify-center text-muted-foreground [&_svg]:size-3.5",children:[t.jsx(T.Check,{"aria-hidden":!0}),t.jsx("span",{className:"sr-only",children:"Selected"})]})}):null,t.jsx(f.TableHead,{style:{minWidth:60},children:"Well"}),i.map(e=>t.jsx(f.TableHead,{style:e.minWidth?{minWidth:e.minWidth}:void 0,children:be(e)},e.id??e.field??e.header))]})}),t.jsxs(f.TableBody,{children:[E?E.map(e=>{const n=ie.has(e.key);return t.jsxs(h.Fragment,{children:[t.jsx(f.TableRow,{className:"cursor-pointer bg-muted/40",onClick:()=>U(e.key),onKeyDown:s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),U(e.key))},role:"button",tabIndex:0,"aria-expanded":!n,children:t.jsx(f.TableCell,{colSpan:H,className:"py-1.5",children:t.jsxs("div",{className:"flex items-center gap-2 text-xs font-medium",children:[n?t.jsx(T.ChevronRight,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}):t.jsx(T.ChevronDown,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}),t.jsxs("span",{children:[Se,": ",e.key]}),t.jsxs("span",{className:"text-muted-foreground",children:["(",e.rows.length," ",e.rows.length===1?"row":"rows",")"]})]})})}),n?null:e.rows.map(({id:s,row:r})=>Z(s,r))]},e.key)}):B.map(({id:e,row:n})=>Z(e,n)),(E?E.length===0:B.length===0)?t.jsx(f.TableRow,{children:t.jsx(f.TableCell,{colSpan:H,className:"text-xs text-muted-foreground",children:"No rows. Paint wells on the plate."})}):null]})]})}),E?null:t.jsxs("div",{className:"flex items-center justify-end gap-3 text-xs text-muted-foreground",children:[t.jsx("span",{className:"text-muted-foreground",children:"Rows per page"}),t.jsxs(u.Select,{value:String(S),onValueChange:e=>{re(parseInt(e,10)),_(0)},children:[t.jsx(u.SelectTrigger,{size:"sm",className:"h-7 w-18","aria-label":"Rows per page",children:t.jsx(u.SelectValue,{})}),t.jsx(u.SelectContent,{children:ee.map(e=>t.jsx(u.SelectItem,{value:String(e),children:e},e))})]}),t.jsx("span",{children:z===0?"0 of 0":`${w*S+1}–${Math.min((w+1)*S,z)} of ${z}`}),t.jsx(A.Button,{variant:"outline",size:"sm",disabled:w===0,onClick:()=>_(e=>Math.max(0,e-1)),children:"Prev"}),t.jsx(A.Button,{variant:"outline",size:"sm",disabled:w>=$,onClick:()=>_(e=>Math.min($,e+1)),children:"Next"})]})]})}exports.WellManifestTable=De;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),T=require("lucide-react"),we=require("react"),ve=require("./ManifestFilterPopover.cjs"),Y=require("../../../ui/badge.cjs"),A=require("../../../ui/button.cjs"),J=require("../../../ui/checkbox.cjs"),b=require("../../../ui/combobox.cjs"),Ne=require("../../ui/data-table/data-table.cjs"),ye=require("../../../ui/input.cjs"),u=require("../../../ui/select.cjs"),ke=require("../../../ui/switch.cjs"),f=require("../../../ui/table.cjs"),P=require("../../../ui/tooltip.cjs"),I=require("../../../lib/utils.cjs");function Te(o){const i=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const c in o)if(c!=="default"){const d=Object.getOwnPropertyDescriptor(o,c);Object.defineProperty(i,c,d.get?d:{enumerable:!0,get:()=>o[c]})}}return i.default=o,Object.freeze(i)}const h=Te(we);function _e({ariaLabel:o,value:i,options:c,placeholder:d,onChange:p}){const j=b.useComboboxAnchor(),g=h.useMemo(()=>{const x=new Map;return c.forEach(C=>x.set(C.value,C.label)),x},[c]);return t.jsxs(b.Combobox,{multiple:!0,items:c.map(x=>x.value),value:i,onValueChange:p,children:[t.jsxs(b.ComboboxChips,{ref:j,className:I.cn("min-h-7 w-full py-0.5",G),children:[t.jsx(b.ComboboxValue,{children:x=>x.map(C=>t.jsx(b.ComboboxChip,{children:g.get(C)??C},C))}),t.jsx(b.ComboboxChipsInput,{"aria-label":o,placeholder:d??"Select…"})]}),t.jsxs(b.ComboboxContent,{anchor:j,children:[t.jsx(b.ComboboxEmpty,{children:"No options."}),t.jsx(b.ComboboxList,{"aria-label":o,children:x=>t.jsx(b.ComboboxItem,{value:x,children:g.get(x)??x},x)})]})]})}const G="border-transparent shadow-none hover:border-input/40",X=25,Me=50,Ee=100,ze=X,Fe=[X,Me,Ee];function Q(o){return o!=null&&o!==""}const Re={number:"number",integer:"number",date:"date",datetime:"datetime-local",time:"time"};function Ae(o){return Re[o]??"text"}function Pe(o,i){if(i!==""){if(o==="number"){const c=parseFloat(i);return Number.isFinite(c)?c:i}if(o==="integer"){const c=parseInt(i,10);return Number.isFinite(c)?c:i}return i}}function Ie(o,i){const c=new Map;for(const d of o){const p=d.row[i],j=p==null||p===""?"(blank)":String(p),g=c.get(j);g?g.rows.push(d):c.set(j,{key:j,rows:[d]})}return[...c.values()]}function qe(o){return o.filter(i=>!!i.field).map(i=>({columnId:i.field,label:i.header}))}function De({values:o,columns:i,fields:c,selection:d,onSelectionChange:p,onChange:j,emptyEntry:g,isPopulated:x,pageSize:C=ze,pageSizeOptions:ee=Fe,enableFillDown:V=!0,rowProps:te,filterable:q=!1,filterColumns:L,groupable:D=!1,className:ne}){const[F,se]=h.useState(!1),[w,_]=h.useState(0),[S,re]=h.useState(C),[M,le]=h.useState([]),[R,ae]=h.useState(""),[ie,oe]=h.useState(new Set);h.useEffect(()=>{_(0)},[F]);const W=h.useMemo(()=>{const e=new Map;return(c??[]).forEach(n=>e.set(n.key,n)),e},[c]),ce=h.useMemo(()=>L??qe(i),[i,L]),v=h.useMemo(()=>{const e=[...o.entries()].map(([s,r])=>({id:s,row:r}));let n=e;if(!F&&x&&(n=e.filter(s=>x(s.row))),q&&M.length>0&&(n=n.filter(s=>{const r=s.row;return M.every(l=>{const a=r[l.columnId],m=a==null?"":String(a);return Ne.applyFilterCondition(m,l.operator,l.value)})})),d&&d.size>0){const s=new Set(n.map(r=>r.id));d.forEach(r=>{!s.has(r)&&!o.has(r)&&(n=[...n,{id:r,row:g(r)}])})}return n.sort((s,r)=>s.id.localeCompare(r.id))},[o,F,x,d,g,q,M]);h.useEffect(()=>{_(0)},[M]);const B=h.useMemo(()=>v.slice(w*S,w*S+S),[v,w,S]),y=(e,n)=>{const s=new Map(o),r=s.get(e)??g(e);s.set(e,{...r,...n}),j(s)},de=e=>{if(!p)return;const n=new Set(d??[]);n.has(e)?n.delete(e):n.add(e),p(n)},O=e=>{if(!e.field)return null;const n=!!d&&d.size>0,r=n?v.filter(({id:N})=>d.has(N)):D&&!!R?v:B,l=r.findIndex(({row:N})=>Q(N[e.field]));if(l<0)return null;const a=r[l],m=n?r.filter(({id:N})=>N!==a.id):r.slice(l+1);return{field:e.field,source:a,targets:m,value:a.row[e.field]}},ue=e=>{const n=O(e);if(!n||n.targets.length===0)return;const s=new Map(o);n.targets.forEach(({id:r})=>{const l=s.get(r)??g(r);s.set(r,{...l,[n.field]:n.value})}),j(s)},he=(e,n,s,r,l)=>t.jsxs(u.Select,{value:s??"",onValueChange:a=>y(r,{[n]:a}),children:[t.jsx(u.SelectTrigger,{size:"sm",className:I.cn("h-7 w-full",G),"aria-label":l,children:t.jsx(u.SelectValue,{placeholder:e.placeholder??"Select…"})}),t.jsx(u.SelectContent,{children:(e.options??[]).map(a=>t.jsx(u.SelectItem,{value:a.value,children:t.jsxs("span",{className:"inline-flex items-center gap-2",children:[a.swatch?t.jsx("span",{className:"inline-block h-2.5 w-2.5 rounded-sm border border-foreground/20",style:{backgroundColor:a.swatch},"aria-hidden":!0}):null,a.label]})},a.value))})]}),xe=(e,n,s,r,l)=>{const a=!!s;return e.boolStyle==="switch"?t.jsx(ke.Switch,{"aria-label":l,checked:a,onCheckedChange:m=>y(r,{[n]:m})}):t.jsx(J.Checkbox,{"aria-label":l,checked:a,onCheckedChange:m=>y(r,{[n]:m===!0})})},me=(e,n,s,r,l)=>t.jsx(ye.Input,{type:Ae(e.kind),step:e.kind==="integer"?1:void 0,placeholder:e.placeholder,"aria-label":l,className:I.cn("h-7",G),value:s??"",onChange:a=>y(r,{[n]:Pe(e.kind,a.target.value)})}),fe=(e,n,s,r)=>{const l=n.field,a=r[l],m=`${e.label} for ${s}`;if(e.kind==="select")return he(e,l,a,s,m);if(e.kind==="multiselect"){const N=Array.isArray(a)?a:[];return t.jsx(_e,{ariaLabel:m,value:N,options:e.options??[],placeholder:e.placeholder,onChange:K=>y(s,{[l]:K.length===0?void 0:K})})}return e.kind==="boolean"?xe(e,l,a,s,m):me(e,l,a,s,m)},pe=(e,n)=>{if(e?.kind==="select"){const s=(e.options??[]).find(r=>r.value===n);return s?t.jsxs(Y.Badge,{variant:"secondary",children:[s.swatch?t.jsx("span",{className:"size-2 rounded-sm border border-foreground/20",style:{backgroundColor:s.swatch},"aria-hidden":!0}):null,s.label]}):t.jsx("span",{className:"text-muted-foreground",children:"—"})}if(e?.kind==="multiselect"){const s=Array.isArray(n)?n:[];return s.length===0?t.jsx("span",{className:"text-muted-foreground",children:"—"}):t.jsx("div",{className:"flex flex-wrap gap-1",children:s.map(r=>{const l=(e.options??[]).find(a=>a.value===r);return t.jsxs(Y.Badge,{variant:"secondary",children:[l?.swatch?t.jsx("span",{className:"size-2 rounded-sm border border-foreground/20",style:{backgroundColor:l.swatch},"aria-hidden":!0}):null,l?.label??r]},r)})})}return e?.kind==="boolean"?n?t.jsx(T.Check,{"aria-label":"Yes",className:"size-4 text-foreground"}):t.jsx("span",{className:"text-muted-foreground",children:"—"}):Q(n)?String(n):t.jsx("span",{className:"text-muted-foreground",children:"—"})},ge=(e,n,s)=>{if(e.render)return e.render({row:s,wellId:n,update:a=>y(n,a)});if(!e.field)return null;const r=W.get(e.field),l=s[e.field];return r?.editableInTable&&r.kind!=="custom"?fe(r,e,n,s):pe(r,l)},be=e=>{const n=e.field?W.get(e.field):void 0,s=e.icon??n?.icon,r=V?O(e):null,l=!!r&&r.targets.length>0,a=d&&d.size>0?`Fill selected ${e.header} cells from the first selected value`:`Fill visible ${e.header} cells downward from the first value`;return t.jsxs("span",{className:"flex min-w-0 items-center justify-between gap-2",children:[t.jsxs("span",{className:"inline-flex min-w-0 items-center gap-1.5",children:[s?t.jsx("span",{className:"inline-flex text-muted-foreground [&_svg]:size-3.5",children:s}):null,t.jsx("span",{className:"truncate",children:e.header})]}),V&&e.field?t.jsxs(P.Tooltip,{children:[t.jsx(P.TooltipTrigger,{asChild:!0,children:t.jsx(A.Button,{type:"button",variant:"ghost",size:"icon-xs",className:"-mr-1 text-muted-foreground hover:text-foreground",disabled:!l,"aria-label":`Fill down ${e.header}`,onClick:m=>{m.preventDefault(),m.stopPropagation(),ue(e)},children:t.jsx(T.ArrowDownToLine,{})})}),t.jsx(P.TooltipContent,{children:a})]}):null]})},je=h.useMemo(()=>i.filter(e=>!!e.field),[i]),k=D&&R?R:"",E=h.useMemo(()=>k?Ie(v,k):null,[k,v]),z=v.length,$=Math.max(0,Math.ceil(z/S)-1),Ce=d?.size??0,H=i.length+1+(p?1:0),Z=(e,n)=>{const s=d?.has(e),r=te?.({wellId:e,row:n,isSelected:!!s});return t.jsxs(f.TableRow,{...r,children:[p?t.jsx(f.TableCell,{className:"w-10",children:t.jsx(J.Checkbox,{checked:!!s,onCheckedChange:()=>de(e),"aria-label":`Select ${e}`})}):null,t.jsx(f.TableCell,{className:"font-semibold",children:e}),i.map(l=>t.jsx(f.TableCell,{style:l.minWidth?{minWidth:l.minWidth}:void 0,children:ge(l,e,n)},l.id??l.field??l.header))]},e)},U=e=>{oe(n=>{const s=new Set(n);return s.has(e)?s.delete(e):s.add(e),s})},Se=k?i.find(n=>n.field===k)?.header??k:"";return t.jsxs("div",{"data-slot":"well-manifest-table",className:I.cn("flex flex-col gap-2",ne),children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx(A.Button,{variant:"outline",size:"sm",onClick:()=>se(e=>!e),children:F?"Hide empty wells":"Show all wells"}),q?t.jsx(ve.ManifestFilterPopover,{columns:ce,filters:M,onFiltersChange:le}):null,D?t.jsxs("div",{className:"inline-flex items-center gap-1.5",children:[t.jsx(T.Layers,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}),t.jsxs(u.Select,{value:R||"__none",onValueChange:e=>ae(e==="__none"?"":e),children:[t.jsx(u.SelectTrigger,{size:"sm",className:"h-7 min-w-40","aria-label":"Group by",children:t.jsx(u.SelectValue,{placeholder:"Group by…"})}),t.jsxs(u.SelectContent,{children:[t.jsx(u.SelectItem,{value:"__none",children:"No grouping"}),je.map(e=>t.jsx(u.SelectItem,{value:e.field??"",children:e.header},e.id??e.field))]})]})]}):null,t.jsxs("span",{className:"text-xs text-muted-foreground",children:[z," rows · ",Ce," selected"]})]}),t.jsx(P.TooltipProvider,{children:t.jsxs(f.Table,{"data-density":"default",children:[t.jsx(f.TableHeader,{children:t.jsxs(f.TableRow,{children:[p?t.jsx(f.TableHead,{className:"w-10 text-center",children:t.jsxs("span",{className:"inline-flex items-center justify-center text-muted-foreground [&_svg]:size-3.5",children:[t.jsx(T.Check,{"aria-hidden":!0}),t.jsx("span",{className:"sr-only",children:"Selected"})]})}):null,t.jsx(f.TableHead,{style:{minWidth:60},children:"Well"}),i.map(e=>t.jsx(f.TableHead,{style:e.minWidth?{minWidth:e.minWidth}:void 0,children:be(e)},e.id??e.field??e.header))]})}),t.jsxs(f.TableBody,{children:[E?E.map(e=>{const n=ie.has(e.key);return t.jsxs(h.Fragment,{children:[t.jsx(f.TableRow,{className:"cursor-pointer bg-muted/40",onClick:()=>U(e.key),onKeyDown:s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),U(e.key))},role:"button",tabIndex:0,"aria-expanded":!n,children:t.jsx(f.TableCell,{colSpan:H,className:"py-1.5",children:t.jsxs("div",{className:"flex items-center gap-2 text-xs font-medium",children:[n?t.jsx(T.ChevronRight,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}):t.jsx(T.ChevronDown,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}),t.jsxs("span",{children:[Se,": ",e.key]}),t.jsxs("span",{className:"text-muted-foreground",children:["(",e.rows.length," ",e.rows.length===1?"row":"rows",")"]})]})})}),n?null:e.rows.map(({id:s,row:r})=>Z(s,r))]},e.key)}):B.map(({id:e,row:n})=>Z(e,n)),(E?E.length===0:B.length===0)?t.jsx(f.TableRow,{children:t.jsx(f.TableCell,{colSpan:H,className:"text-xs text-muted-foreground",children:"No rows. Paint wells on the plate."})}):null]})]})}),E?null:t.jsxs("div",{className:"flex items-center justify-end gap-3 text-xs text-muted-foreground",children:[t.jsx("span",{className:"text-muted-foreground",children:"Rows per page"}),t.jsxs(u.Select,{value:String(S),onValueChange:e=>{re(parseInt(e,10)),_(0)},children:[t.jsx(u.SelectTrigger,{size:"sm",className:"h-7 w-18","aria-label":"Rows per page",children:t.jsx(u.SelectValue,{})}),t.jsx(u.SelectContent,{children:ee.map(e=>t.jsx(u.SelectItem,{value:String(e),children:e},e))})]}),t.jsx("span",{children:z===0?"0 of 0":`${w*S+1}–${Math.min((w+1)*S,z)} of ${z}`}),t.jsx(A.Button,{variant:"outline",size:"sm",disabled:w===0,onClick:()=>_(e=>Math.max(0,e-1)),children:"Prev"}),t.jsx(A.Button,{variant:"outline",size:"sm",disabled:w>=$,onClick:()=>_(e=>Math.min($,e+1)),children:"Next"})]})]})}exports.WellManifestTable=De;
|
|
2
2
|
//# sourceMappingURL=WellManifestTable.cjs.map
|