@tetrascience-npm/tetrascience-react-ui 0.5.0-beta.20.1 → 0.5.0-beta.21.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/charts/AreaGraph/AreaGraph.cjs +2 -0
- package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +1 -0
- package/dist/components/charts/AreaGraph/AreaGraph.js +209 -0
- package/dist/components/charts/AreaGraph/AreaGraph.js.map +1 -0
- package/dist/components/charts/BarGraph/BarGraph.cjs +2 -0
- package/dist/components/charts/BarGraph/BarGraph.cjs.map +1 -0
- package/dist/components/charts/BarGraph/BarGraph.js +175 -0
- package/dist/components/charts/BarGraph/BarGraph.js.map +1 -0
- package/dist/components/charts/Boxplot/Boxplot.cjs +2 -0
- package/dist/components/charts/Boxplot/Boxplot.cjs.map +1 -0
- package/dist/components/charts/Boxplot/Boxplot.js +171 -0
- package/dist/components/charts/Boxplot/Boxplot.js.map +1 -0
- package/dist/components/charts/Chromatogram/Chromatogram.cjs +2 -0
- package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/Chromatogram.js +164 -0
- package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +219 -0
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/annotations.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/annotations.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/annotations.js +73 -0
- package/dist/components/charts/ChromatogramChart/annotations.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +34 -0
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/constants.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/constants.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/constants.js +24 -0
- package/dist/components/charts/ChromatogramChart/constants.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/dataProcessing.js +90 -0
- package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/peakDetection.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/peakDetection.js +89 -0
- package/dist/components/charts/ChromatogramChart/peakDetection.js.map +1 -0
- package/dist/components/charts/DotPlot/DotPlot.cjs +2 -0
- package/dist/components/charts/DotPlot/DotPlot.cjs.map +1 -0
- package/dist/components/charts/DotPlot/DotPlot.js +184 -0
- package/dist/components/charts/DotPlot/DotPlot.js.map +1 -0
- package/dist/components/charts/Heatmap/Heatmap.cjs +2 -0
- package/dist/components/charts/Heatmap/Heatmap.cjs.map +1 -0
- package/dist/components/charts/Heatmap/Heatmap.js +67 -0
- package/dist/components/charts/Heatmap/Heatmap.js.map +1 -0
- package/dist/components/charts/Histogram/Histogram.cjs +2 -0
- package/dist/components/charts/Histogram/Histogram.cjs.map +1 -0
- package/dist/components/charts/Histogram/Histogram.js +209 -0
- package/dist/components/charts/Histogram/Histogram.js.map +1 -0
- package/dist/components/charts/LineGraph/LineGraph.cjs +2 -0
- package/dist/components/charts/LineGraph/LineGraph.cjs.map +1 -0
- package/dist/components/charts/LineGraph/LineGraph.js +185 -0
- package/dist/components/charts/LineGraph/LineGraph.js.map +1 -0
- package/dist/components/charts/PieChart/PieChart.cjs +2 -0
- package/dist/components/charts/PieChart/PieChart.cjs.map +1 -0
- package/dist/components/charts/PieChart/PieChart.js +106 -0
- package/dist/components/charts/PieChart/PieChart.js.map +1 -0
- package/dist/components/charts/PlateMap/PlateMap.cjs +2 -0
- package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -0
- package/dist/components/charts/PlateMap/PlateMap.js +450 -0
- package/dist/components/charts/PlateMap/PlateMap.js.map +1 -0
- package/dist/components/charts/PlateMap/constants.cjs +2 -0
- package/dist/components/charts/PlateMap/constants.cjs.map +1 -0
- package/dist/components/charts/PlateMap/constants.js +137 -0
- package/dist/components/charts/PlateMap/constants.js.map +1 -0
- package/dist/components/charts/PlateMap/types.cjs +2 -0
- package/dist/components/charts/PlateMap/types.cjs.map +1 -0
- package/dist/components/charts/PlateMap/types.js +8 -0
- package/dist/components/charts/PlateMap/types.js.map +1 -0
- package/dist/components/charts/PlateMap/utils.cjs +2 -0
- package/dist/components/charts/PlateMap/utils.cjs.map +1 -0
- package/dist/components/charts/PlateMap/utils.js +235 -0
- package/dist/components/charts/PlateMap/utils.js.map +1 -0
- package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +2 -0
- package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +1 -0
- package/dist/components/charts/ScatterGraph/ScatterGraph.js +186 -0
- package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +1 -0
- package/dist/components/composed/AppHeader/AppHeader.cjs +2 -0
- package/dist/components/composed/AppHeader/AppHeader.cjs.map +1 -0
- package/dist/components/composed/AppHeader/AppHeader.js +35 -0
- package/dist/components/composed/AppHeader/AppHeader.js.map +1 -0
- package/dist/components/composed/AppLayout/AppLayout.cjs +2 -0
- package/dist/components/composed/AppLayout/AppLayout.cjs.map +1 -0
- package/dist/components/composed/AppLayout/AppLayout.js +65 -0
- package/dist/components/composed/AppLayout/AppLayout.js.map +1 -0
- package/dist/components/composed/AssistantModal/AssistantModal.cjs +2 -0
- package/dist/components/composed/AssistantModal/AssistantModal.cjs.map +1 -0
- package/dist/components/composed/AssistantModal/AssistantModal.js +75 -0
- package/dist/components/composed/AssistantModal/AssistantModal.js.map +1 -0
- package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.cjs +3 -0
- package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.cjs.map +1 -0
- package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.js +74 -0
- package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.js.map +1 -0
- package/dist/components/composed/LaunchContent/LaunchContent.cjs +6 -0
- package/dist/components/composed/LaunchContent/LaunchContent.cjs.map +1 -0
- package/dist/components/composed/LaunchContent/LaunchContent.js +66 -0
- package/dist/components/composed/LaunchContent/LaunchContent.js.map +1 -0
- package/dist/components/composed/Main/LaunchContentPanel.cjs +6 -0
- package/dist/components/composed/Main/LaunchContentPanel.cjs.map +1 -0
- package/dist/components/composed/Main/LaunchContentPanel.js +63 -0
- package/dist/components/composed/Main/LaunchContentPanel.js.map +1 -0
- package/dist/components/composed/Main/Main.cjs +2 -0
- package/dist/components/composed/Main/Main.cjs.map +1 -0
- package/dist/components/composed/Main/Main.js +276 -0
- package/dist/components/composed/Main/Main.js.map +1 -0
- package/dist/components/composed/Main/MainHeader.cjs +2 -0
- package/dist/components/composed/Main/MainHeader.cjs.map +1 -0
- package/dist/components/composed/Main/MainHeader.js +36 -0
- package/dist/components/composed/Main/MainHeader.js.map +1 -0
- package/dist/components/composed/Main/MainNavbar.cjs +2 -0
- package/dist/components/composed/Main/MainNavbar.cjs.map +1 -0
- package/dist/components/composed/Main/MainNavbar.js +25 -0
- package/dist/components/composed/Main/MainNavbar.js.map +1 -0
- package/dist/components/composed/Main/MainSidebar.cjs +2 -0
- package/dist/components/composed/Main/MainSidebar.cjs.map +1 -0
- package/dist/components/composed/Main/MainSidebar.js +12 -0
- package/dist/components/composed/Main/MainSidebar.js.map +1 -0
- package/dist/components/composed/Main/MainTabBar.cjs +2 -0
- package/dist/components/composed/Main/MainTabBar.cjs.map +1 -0
- package/dist/components/composed/Main/MainTabBar.js +7 -0
- package/dist/components/composed/Main/MainTabBar.js.map +1 -0
- package/dist/components/composed/Main/ProtocolConfigurationPanel.cjs +2 -0
- package/dist/components/composed/Main/ProtocolConfigurationPanel.cjs.map +1 -0
- package/dist/components/composed/Main/ProtocolConfigurationPanel.js +30 -0
- package/dist/components/composed/Main/ProtocolConfigurationPanel.js.map +1 -0
- package/dist/components/composed/Main/TemplateSidebarCard.cjs +2 -0
- package/dist/components/composed/Main/TemplateSidebarCard.cjs.map +1 -0
- package/dist/components/composed/Main/TemplateSidebarCard.js +71 -0
- package/dist/components/composed/Main/TemplateSidebarCard.js.map +1 -0
- package/dist/components/composed/Navbar/Navbar.cjs +2 -0
- package/dist/components/composed/Navbar/Navbar.cjs.map +1 -0
- package/dist/components/composed/Navbar/Navbar.js +25 -0
- package/dist/components/composed/Navbar/Navbar.js.map +1 -0
- package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.cjs +2 -0
- package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.cjs.map +1 -0
- package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.js +44 -0
- package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.js.map +1 -0
- package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.cjs +2 -0
- package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.cjs.map +1 -0
- package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.js +53 -0
- package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.js.map +1 -0
- package/dist/components/composed/PythonEditorModal/PythonEditorModal.cjs +2 -0
- package/dist/components/composed/PythonEditorModal/PythonEditorModal.cjs.map +1 -0
- package/dist/components/composed/PythonEditorModal/PythonEditorModal.js +51 -0
- package/dist/components/composed/PythonEditorModal/PythonEditorModal.js.map +1 -0
- package/dist/components/composed/Sidebar/Sidebar.cjs +2 -0
- package/dist/components/composed/Sidebar/Sidebar.cjs.map +1 -0
- package/dist/components/composed/Sidebar/Sidebar.js +46 -0
- package/dist/components/composed/Sidebar/Sidebar.js.map +1 -0
- package/dist/components/composed/TdpSearch/TdpSearch.cjs +2 -0
- package/dist/components/composed/TdpSearch/TdpSearch.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/TdpSearch.js +97 -0
- package/dist/components/composed/TdpSearch/TdpSearch.js.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +2 -0
- package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultFilters.js +31 -0
- package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultResults.cjs +2 -0
- package/dist/components/composed/TdpSearch/components/DefaultResults.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultResults.js +107 -0
- package/dist/components/composed/TdpSearch/components/DefaultResults.js.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs +2 -0
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js +32 -0
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js.map +1 -0
- package/dist/components/composed/TdpSearch/constants.cjs +2 -0
- package/dist/components/composed/TdpSearch/constants.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/constants.js +7 -0
- package/dist/components/composed/TdpSearch/constants.js.map +1 -0
- package/dist/components/composed/TdpSearch/hooks/useSearch.cjs +2 -0
- package/dist/components/composed/TdpSearch/hooks/useSearch.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/hooks/useSearch.js +52 -0
- package/dist/components/composed/TdpSearch/hooks/useSearch.js.map +1 -0
- package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.cjs +2 -0
- package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.js +29 -0
- package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.js.map +1 -0
- package/dist/components/composed/TdpSearch/utils.cjs +2 -0
- package/dist/components/composed/TdpSearch/utils.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/utils.js +15 -0
- package/dist/components/composed/TdpSearch/utils.js.map +1 -0
- package/dist/components/composed/tdp-link.cjs +2 -0
- package/dist/components/composed/tdp-link.cjs.map +1 -0
- package/dist/components/composed/tdp-link.js +84 -0
- package/dist/components/composed/tdp-link.js.map +1 -0
- package/dist/components/composed/tdp-url.cjs +2 -0
- package/dist/components/composed/tdp-url.cjs.map +1 -0
- package/dist/components/composed/tdp-url.js +76 -0
- package/dist/components/composed/tdp-url.js.map +1 -0
- package/dist/components/ui/accordion.cjs +2 -0
- package/dist/components/ui/accordion.cjs.map +1 -0
- package/dist/components/ui/accordion.js +83 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/alert-dialog.cjs +2 -0
- package/dist/components/ui/alert-dialog.cjs.map +1 -0
- package/dist/components/ui/alert-dialog.js +181 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/alert.cjs +2 -0
- package/dist/components/ui/alert.cjs.map +1 -0
- package/dist/components/ui/alert.js +78 -0
- package/dist/components/ui/alert.js.map +1 -0
- package/dist/components/ui/aspect-ratio.cjs +2 -0
- package/dist/components/ui/aspect-ratio.cjs.map +1 -0
- package/dist/components/ui/aspect-ratio.js +11 -0
- package/dist/components/ui/aspect-ratio.js.map +1 -0
- package/dist/components/ui/avatar.cjs +2 -0
- package/dist/components/ui/avatar.cjs.map +1 -0
- package/dist/components/ui/avatar.js +107 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.cjs +2 -0
- package/dist/components/ui/badge.cjs.map +1 -0
- package/dist/components/ui/badge.js +44 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/breadcrumb.cjs +2 -0
- package/dist/components/ui/breadcrumb.cjs.map +1 -0
- package/dist/components/ui/breadcrumb.js +118 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button-group.cjs +2 -0
- package/dist/components/ui/button-group.cjs.map +1 -0
- package/dist/components/ui/button-group.js +77 -0
- package/dist/components/ui/button-group.js.map +1 -0
- package/dist/components/ui/button.cjs +2 -0
- package/dist/components/ui/button.cjs.map +1 -0
- package/dist/components/ui/button.js +57 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/calendar.cjs +2 -0
- package/dist/components/ui/calendar.cjs.map +1 -0
- package/dist/components/ui/calendar.js +174 -0
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.cjs +2 -0
- package/dist/components/ui/card.cjs.map +1 -0
- package/dist/components/ui/card.js +102 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/carousel.cjs +2 -0
- package/dist/components/ui/carousel.cjs.map +1 -0
- package/dist/components/ui/carousel.js +179 -0
- package/dist/components/ui/carousel.js.map +1 -0
- package/dist/components/ui/checkbox.cjs +2 -0
- package/dist/components/ui/checkbox.cjs.map +1 -0
- package/dist/components/ui/checkbox.js +35 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/code-editor.cjs +2 -0
- package/dist/components/ui/code-editor.cjs.map +1 -0
- package/dist/components/ui/code-editor.js +103 -0
- package/dist/components/ui/code-editor.js.map +1 -0
- package/dist/components/ui/collapsible.cjs +2 -0
- package/dist/components/ui/collapsible.cjs.map +1 -0
- package/dist/components/ui/collapsible.js +35 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/combobox.cjs +2 -0
- package/dist/components/ui/combobox.cjs.map +1 -0
- package/dist/components/ui/combobox.js +278 -0
- package/dist/components/ui/combobox.js.map +1 -0
- package/dist/components/ui/command.cjs +2 -0
- package/dist/components/ui/command.cjs.map +1 -0
- package/dist/components/ui/command.js +174 -0
- package/dist/components/ui/command.js.map +1 -0
- package/dist/components/ui/context-menu.cjs +2 -0
- package/dist/components/ui/context-menu.cjs.map +1 -0
- package/dist/components/ui/context-menu.js +236 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/dialog.cjs +2 -0
- package/dist/components/ui/dialog.cjs.map +1 -0
- package/dist/components/ui/dialog.js +154 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/drawer.cjs +2 -0
- package/dist/components/ui/drawer.cjs.map +1 -0
- package/dist/components/ui/drawer.js +125 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.cjs +2 -0
- package/dist/components/ui/dropdown-menu.cjs.map +1 -0
- package/dist/components/ui/dropdown-menu.js +252 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/field.cjs +2 -0
- package/dist/components/ui/field.cjs.map +1 -0
- package/dist/components/ui/field.js +210 -0
- package/dist/components/ui/field.js.map +1 -0
- package/dist/components/ui/hover-card.cjs +2 -0
- package/dist/components/ui/hover-card.cjs.map +1 -0
- package/dist/components/ui/hover-card.js +39 -0
- package/dist/components/ui/hover-card.js.map +1 -0
- package/dist/components/ui/input-group.cjs +2 -0
- package/dist/components/ui/input-group.cjs.map +1 -0
- package/dist/components/ui/input-group.js +145 -0
- package/dist/components/ui/input-group.js.map +1 -0
- package/dist/components/ui/input-otp.cjs +2 -0
- package/dist/components/ui/input-otp.cjs.map +1 -0
- package/dist/components/ui/input-otp.js +82 -0
- package/dist/components/ui/input-otp.js.map +1 -0
- package/dist/components/ui/input.cjs +2 -0
- package/dist/components/ui/input.cjs.map +1 -0
- package/dist/components/ui/input.js +20 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/item.cjs +2 -0
- package/dist/components/ui/item.cjs.map +1 -0
- package/dist/components/ui/item.js +191 -0
- package/dist/components/ui/item.js.map +1 -0
- package/dist/components/ui/kbd.cjs +2 -0
- package/dist/components/ui/kbd.cjs.map +1 -0
- package/dist/components/ui/kbd.js +30 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/label.cjs +2 -0
- package/dist/components/ui/label.cjs.map +1 -0
- package/dist/components/ui/label.js +23 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/menubar.cjs +2 -0
- package/dist/components/ui/menubar.cjs.map +1 -0
- package/dist/components/ui/menubar.js +256 -0
- package/dist/components/ui/menubar.js.map +1 -0
- package/dist/components/ui/navigation-menu.cjs +2 -0
- package/dist/components/ui/navigation-menu.cjs.map +1 -0
- package/dist/components/ui/navigation-menu.js +164 -0
- package/dist/components/ui/navigation-menu.js.map +1 -0
- package/dist/components/ui/radio-group.cjs +2 -0
- package/dist/components/ui/radio-group.cjs.map +1 -0
- package/dist/components/ui/radio-group.js +45 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/resizable.cjs +2 -0
- package/dist/components/ui/resizable.cjs.map +1 -0
- package/dist/components/ui/resizable.js +46 -0
- package/dist/components/ui/resizable.js.map +1 -0
- package/dist/components/ui/scroll-area.cjs +2 -0
- package/dist/components/ui/scroll-area.cjs.map +1 -0
- package/dist/components/ui/scroll-area.js +60 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.cjs +2 -0
- package/dist/components/ui/select.cjs.map +1 -0
- package/dist/components/ui/select.js +184 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/separator.cjs +2 -0
- package/dist/components/ui/separator.cjs.map +1 -0
- package/dist/components/ui/separator.js +27 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.cjs +2 -0
- package/dist/components/ui/sheet.cjs.map +1 -0
- package/dist/components/ui/sheet.js +137 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/sidebar.cjs +2 -0
- package/dist/components/ui/sidebar.cjs.map +1 -0
- package/dist/components/ui/sidebar.js +579 -0
- package/dist/components/ui/sidebar.js.map +1 -0
- package/dist/components/ui/skeleton.cjs +2 -0
- package/dist/components/ui/skeleton.cjs.map +1 -0
- package/dist/components/ui/skeleton.js +16 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/slider.cjs +2 -0
- package/dist/components/ui/slider.cjs.map +1 -0
- package/dist/components/ui/slider.js +60 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/sonner.cjs +2 -0
- package/dist/components/ui/sonner.cjs.map +1 -0
- package/dist/components/ui/sonner.js +37 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/spinner.cjs +2 -0
- package/dist/components/ui/spinner.cjs.map +1 -0
- package/dist/components/ui/spinner.js +10 -0
- package/dist/components/ui/spinner.js.map +1 -0
- package/dist/components/ui/switch.cjs +2 -0
- package/dist/components/ui/switch.cjs.map +1 -0
- package/dist/components/ui/switch.js +32 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/table.cjs +2 -0
- package/dist/components/ui/table.cjs.map +1 -0
- package/dist/components/ui/table.js +115 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.cjs +2 -0
- package/dist/components/ui/tabs.cjs.map +1 -0
- package/dist/components/ui/tabs.js +91 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/tetrascience-icon.cjs +2 -0
- package/dist/components/ui/tetrascience-icon.cjs.map +1 -0
- package/dist/components/ui/tetrascience-icon.js +46 -0
- package/dist/components/ui/tetrascience-icon.js.map +1 -0
- package/dist/components/ui/textarea.cjs +2 -0
- package/dist/components/ui/textarea.cjs.map +1 -0
- package/dist/components/ui/textarea.js +19 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/toggle-group.cjs +2 -0
- package/dist/components/ui/toggle-group.cjs.map +1 -0
- package/dist/components/ui/toggle-group.js +77 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/toggle.cjs +2 -0
- package/dist/components/ui/toggle.cjs.map +1 -0
- package/dist/components/ui/toggle.js +44 -0
- package/dist/components/ui/toggle.js.map +1 -0
- package/dist/components/ui/tooltip.cjs +2 -0
- package/dist/components/ui/tooltip.cjs.map +1 -0
- package/dist/components/ui/tooltip.js +56 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/hooks/use-code-editor-theme.cjs +2 -0
- package/dist/hooks/use-code-editor-theme.cjs.map +1 -0
- package/dist/hooks/use-code-editor-theme.js +31 -0
- package/dist/hooks/use-code-editor-theme.js.map +1 -0
- package/dist/hooks/use-is-dark.cjs +2 -0
- package/dist/hooks/use-is-dark.cjs.map +1 -0
- package/dist/hooks/use-is-dark.js +18 -0
- package/dist/hooks/use-is-dark.js.map +1 -0
- package/dist/hooks/use-mobile.cjs +2 -0
- package/dist/hooks/use-mobile.cjs.map +1 -0
- package/dist/hooks/use-mobile.js +15 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-plotly-theme.cjs +2 -0
- package/dist/hooks/use-plotly-theme.cjs.map +1 -0
- package/dist/hooks/use-plotly-theme.js +33 -0
- package/dist/hooks/use-plotly-theme.js.map +1 -0
- package/dist/index.cjs +1 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +389 -9435
- package/dist/index.js.map +1 -1
- package/dist/lib/utils.cjs +2 -0
- package/dist/lib/utils.cjs.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/providers/athena.cjs +1 -1
- package/dist/providers/athena.cjs.map +1 -1
- package/dist/providers/athena.js +9 -157
- package/dist/providers/athena.js.map +1 -1
- package/dist/providers/databricks.cjs +1 -1
- package/dist/providers/databricks.cjs.map +1 -1
- package/dist/providers/databricks.js +9 -82
- package/dist/providers/databricks.js.map +1 -1
- package/dist/providers/snowflake.cjs +1 -1
- package/dist/providers/snowflake.cjs.map +1 -1
- package/dist/providers/snowflake.js +8 -118
- package/dist/providers/snowflake.js.map +1 -1
- package/dist/server/auth/JwtTokenManager.cjs +2 -0
- package/dist/server/auth/JwtTokenManager.cjs.map +1 -0
- package/dist/server/auth/JwtTokenManager.js +134 -0
- package/dist/server/auth/JwtTokenManager.js.map +1 -0
- package/dist/server/providers/AthenaProvider.cjs +2 -0
- package/dist/server/providers/AthenaProvider.cjs.map +1 -0
- package/dist/server/providers/AthenaProvider.js +154 -0
- package/dist/server/providers/AthenaProvider.js.map +1 -0
- package/dist/server/providers/DatabricksProvider.cjs +2 -0
- package/dist/server/providers/DatabricksProvider.cjs.map +1 -0
- package/dist/server/providers/DatabricksProvider.js +79 -0
- package/dist/server/providers/DatabricksProvider.js.map +1 -0
- package/dist/server/providers/SnowflakeProvider.cjs +2 -0
- package/dist/server/providers/SnowflakeProvider.cjs.map +1 -0
- package/dist/server/providers/SnowflakeProvider.js +116 -0
- package/dist/server/providers/SnowflakeProvider.js.map +1 -0
- package/dist/server/providers/buildProvider.cjs +2 -0
- package/dist/server/providers/buildProvider.cjs.map +1 -0
- package/dist/server/providers/buildProvider.js +22 -0
- package/dist/server/providers/buildProvider.js.map +1 -0
- package/dist/server/providers/exceptions.cjs +2 -0
- package/dist/server/providers/exceptions.cjs.map +1 -0
- package/dist/{exceptions-jCQ6h5C8.js → server/providers/exceptions.js} +11 -11
- package/dist/server/providers/exceptions.js.map +1 -0
- package/dist/server/providers/getProviderConfigurations.cjs +2 -0
- package/dist/server/providers/getProviderConfigurations.cjs.map +1 -0
- package/dist/server/providers/getProviderConfigurations.js +78 -0
- package/dist/server/providers/getProviderConfigurations.js.map +1 -0
- package/dist/server/providers/providerDiscovery.cjs +2 -0
- package/dist/server/providers/providerDiscovery.cjs.map +1 -0
- package/dist/server/providers/providerDiscovery.js +28 -0
- package/dist/server/providers/providerDiscovery.js.map +1 -0
- package/dist/server.cjs +1 -1
- package/dist/server.cjs.map +1 -1
- package/dist/server.js +27 -262
- package/dist/server.js.map +1 -1
- package/dist/utils/colors.cjs +2 -0
- package/dist/utils/colors.cjs.map +1 -0
- package/dist/utils/colors.js +98 -0
- package/dist/utils/colors.js.map +1 -0
- package/package.json +4 -1
- package/dist/exceptions-DN25pCDi.cjs +0 -2
- package/dist/exceptions-DN25pCDi.cjs.map +0 -1
- package/dist/exceptions-jCQ6h5C8.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/lib/utils.ts","../src/components/ui/avatar.tsx","../src/components/ui/button.tsx","../src/components/ui/separator.tsx","../src/components/composed/AppHeader/AppHeader.tsx","../src/components/ui/tooltip.tsx","../src/hooks/use-is-dark.ts","../src/hooks/use-code-editor-theme.ts","../src/components/ui/code-editor.tsx","../src/components/ui/dialog.tsx","../src/components/ui/input.tsx","../src/components/ui/tetrascience-icon.tsx","../src/components/ui/textarea.tsx","../src/components/composed/AssistantModal/AssistantModal.tsx","../src/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.tsx","../src/components/ui/label.tsx","../src/components/ui/select.tsx","../src/components/ui/switch.tsx","../src/components/composed/LaunchContent/LaunchContent.tsx","../src/components/composed/Navbar/Navbar.tsx","../src/components/ui/card.tsx","../src/components/composed/ProtocolConfiguration/ProtocolConfiguration.tsx","../src/components/composed/ProtocolYamlCard/ProtocolYamlCard.tsx","../src/components/composed/PythonEditorModal/PythonEditorModal.tsx","../src/components/composed/Sidebar/Sidebar.tsx","../src/components/composed/TdpSearch/components/DefaultFilters.tsx","../src/components/ui/table.tsx","../src/components/composed/TdpSearch/components/DefaultResults.tsx","../src/components/composed/TdpSearch/components/DefaultSearchBar.tsx","../src/components/composed/TdpSearch/constants.ts","../src/components/composed/TdpSearch/utils.ts","../src/components/composed/TdpSearch/hooks/useSearch.ts","../src/components/composed/TdpSearch/hooks/useTdpCredentials.ts","../src/components/ui/alert.tsx","../src/components/composed/TdpSearch/TdpSearch.tsx","../src/components/composed/tdp-url.ts","../src/components/composed/tdp-link.tsx","../src/components/composed/AppLayout/AppLayout.tsx","../src/hooks/use-plotly-theme.ts","../src/components/charts/AreaGraph/AreaGraph.tsx","../src/components/charts/BarGraph/BarGraph.tsx","../src/components/charts/Boxplot/Boxplot.tsx","../src/components/charts/Chromatogram/Chromatogram.tsx","../src/utils/colors.ts","../src/components/charts/ChromatogramChart/constants.ts","../src/components/charts/ChromatogramChart/annotations.ts","../src/components/charts/ChromatogramChart/boundaryMarkers.ts","../src/components/charts/ChromatogramChart/peakDetection.ts","../src/components/charts/ChromatogramChart/dataProcessing.ts","../src/components/charts/ChromatogramChart/ChromatogramChart.tsx","../src/components/charts/DotPlot/DotPlot.tsx","../src/components/charts/PlateMap/types.ts","../src/components/charts/PlateMap/constants.ts","../src/components/charts/PlateMap/utils.ts","../src/components/charts/PlateMap/PlateMap.tsx","../src/components/charts/Heatmap/Heatmap.tsx","../src/components/charts/Histogram/Histogram.tsx","../src/components/charts/LineGraph/LineGraph.tsx","../src/components/composed/Main/LaunchContentPanel.tsx","../src/components/composed/Main/MainHeader.tsx","../src/components/composed/Main/MainNavbar.tsx","../src/components/ui/scroll-area.tsx","../src/components/composed/Main/MainSidebar.tsx","../src/components/ui/tabs.tsx","../src/components/composed/Main/MainTabBar.tsx","../src/components/composed/Main/ProtocolConfigurationPanel.tsx","../src/components/composed/Main/TemplateSidebarCard.tsx","../src/components/ui/sheet.tsx","../src/components/ui/skeleton.tsx","../src/hooks/use-mobile.ts","../src/components/ui/sidebar.tsx","../src/components/composed/Main/Main.tsx","../src/components/charts/PieChart/PieChart.tsx","../src/components/charts/ScatterGraph/ScatterGraph.tsx","../src/components/ui/accordion.tsx","../src/components/ui/alert-dialog.tsx","../src/components/ui/aspect-ratio.tsx","../src/components/ui/badge.tsx","../src/components/ui/breadcrumb.tsx","../src/components/ui/button-group.tsx","../src/components/ui/calendar.tsx","../src/components/ui/carousel.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/collapsible.tsx","../src/components/ui/input-group.tsx","../src/components/ui/combobox.tsx","../src/components/ui/command.tsx","../src/components/ui/context-menu.tsx","../src/components/ui/drawer.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/field.tsx","../src/components/ui/hover-card.tsx","../src/components/ui/input-otp.tsx","../src/components/ui/item.tsx","../src/components/ui/kbd.tsx","../src/components/ui/menubar.tsx","../src/components/ui/navigation-menu.tsx","../src/components/ui/radio-group.tsx","../src/components/ui/resizable.tsx","../src/components/ui/slider.tsx","../src/components/ui/sonner.tsx","../src/components/ui/spinner.tsx","../src/components/ui/toggle.tsx","../src/components/ui/toggle-group.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { Avatar as AvatarPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square size-full rounded-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n","import { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { Separator as SeparatorPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","import { Settings, Home } from \"lucide-react\";\nimport React from \"react\";\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\nimport { Button } from \"@/components/ui/button\";\nimport { Separator } from \"@/components/ui/separator\";\n\ninterface UserProfileProps {\n name: string;\n avatar?: string;\n}\n\nexport interface AppHeaderProps {\n hostname: string;\n userProfile: UserProfileProps;\n onHomeClick?: () => void;\n onSettingsClick?: () => void;\n onUserProfileClick?: () => void;\n}\n\nconst AppHeader: React.FC<AppHeaderProps> = ({\n hostname,\n userProfile,\n onHomeClick,\n onSettingsClick,\n onUserProfileClick,\n}) => {\n // Get initials for avatar placeholder if no image is provided\n const getInitials = (name: string) => {\n return name\n .split(\" \")\n .map((part) => part.charAt(0))\n .join(\"\")\n .toUpperCase()\n .substring(0, 2);\n };\n\n return (\n <>\n <div className=\"flex items-center justify-between h-auto w-full px-7 py-4 box-border\">\n <div className=\"text-lg font-medium leading-7\">{hostname}</div>\n\n <div className=\"flex items-center gap-3\">\n <Button variant=\"outline\" size=\"icon-sm\" onClick={onHomeClick} aria-label=\"Home\">\n <Home size={20} />\n </Button>\n <Button variant=\"outline\" size=\"icon-sm\" onClick={onSettingsClick} aria-label=\"Settings\">\n <Settings size={20} />\n </Button>\n <Separator orientation=\"vertical\" />\n <Avatar onClick={onUserProfileClick}>\n <AvatarImage src={userProfile.avatar} alt={userProfile.name} />\n <AvatarFallback>{getInitials(userProfile.name)}</AvatarFallback>\n </Avatar>\n <div className=\"text-base font-normal leading-6\">{userProfile.name}</div>{\" \"}\n </div>\n </div>\n <Separator />\n </>\n );\n};\n\nexport default AppHeader;\n","\"use client\"\n\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) rounded-md bg-foreground px-3 py-1.5 text-xs text-background data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","import { useState, useEffect } from \"react\";\n\n/**\n * Generic hook that observes the `.dark` class on the document root element\n * and returns whether dark mode is currently active.\n *\n * Uses a MutationObserver to detect theme changes in real time.\n *\n * @example\n * ```tsx\n * const isDark = useIsDark();\n * ```\n */\nexport function useIsDark(): boolean {\n const [isDark, setIsDark] = useState(() => {\n if (typeof document === \"undefined\") return false;\n return document.documentElement.classList.contains(\"dark\");\n });\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const root = document.documentElement;\n setIsDark(root.classList.contains(\"dark\"));\n\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.attributeName === \"class\") {\n setIsDark(root.classList.contains(\"dark\"));\n }\n }\n });\n\n observer.observe(root, { attributes: true, attributeFilter: [\"class\"] });\n\n return () => observer.disconnect();\n }, []);\n\n return isDark;\n}\n","import { useMemo } from \"react\";\n\nimport { useIsDark } from \"@/hooks/use-is-dark\";\n\n/**\n * Code editor theme configuration returned by useCodeEditorTheme.\n * Use these values to configure Monaco Editor theming.\n */\nexport interface CodeEditorThemeColors {\n /** Monaco theme name to pass to the `theme` prop (\"vs\" | \"vs-dark\") */\n monacoTheme: \"vs\" | \"vs-dark\";\n /** Editor background color */\n editorBg: string;\n /** Editor foreground / text color */\n editorFg: string;\n /** Line number color */\n lineNumberColor: string;\n /** Active line number color */\n lineNumberActiveColor: string;\n /** Selection background color */\n selectionBg: string;\n /** Gutter / line-number area background */\n gutterBg: string;\n /** Editor border color */\n borderColor: string;\n /** Whether dark mode is active */\n isDark: boolean;\n}\n\nconst LIGHT_THEME: CodeEditorThemeColors = {\n monacoTheme: \"vs\",\n editorBg: \"#ffffff\",\n editorFg: \"rgba(26, 26, 26, 1)\",\n lineNumberColor: \"rgba(26, 26, 26, 0.4)\",\n lineNumberActiveColor: \"rgba(26, 26, 26, 0.8)\",\n selectionBg: \"rgba(47, 69, 181, 0.15)\",\n gutterBg: \"#f9fafb\",\n borderColor: \"rgba(229, 231, 235, 1)\",\n isDark: false,\n};\n\nconst DARK_THEME: CodeEditorThemeColors = {\n monacoTheme: \"vs-dark\",\n editorBg: \"rgba(20, 30, 53, 1)\",\n editorFg: \"rgba(255, 255, 255, 0.9)\",\n lineNumberColor: \"rgba(255, 255, 255, 0.35)\",\n lineNumberActiveColor: \"rgba(255, 255, 255, 0.7)\",\n selectionBg: \"rgba(84, 157, 255, 0.2)\",\n gutterBg: \"rgba(29, 40, 57, 1)\",\n borderColor: \"rgba(51, 65, 86, 1)\",\n isDark: true,\n};\n\n/**\n * Hook that returns Monaco Editor color tokens for the current light/dark theme.\n *\n * @example\n * ```tsx\n * const theme = useCodeEditorTheme();\n * <MonacoEditor theme={theme.monacoTheme} />\n * ```\n */\nexport function useCodeEditorTheme(): CodeEditorThemeColors {\n const isDark = useIsDark();\n return useMemo(() => (isDark ? DARK_THEME : LIGHT_THEME), [isDark]);\n}\n","import MonacoEditor from \"@monaco-editor/react\";\nimport { Copy, Rocket } from \"lucide-react\";\nimport React, { useCallback, useRef, useState } from \"react\";\n\nimport type { Monaco, OnChange } from \"@monaco-editor/react\";\nimport type { editor } from \"monaco-editor\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/components/ui/tooltip\";\nimport { useCodeEditorTheme } from \"@/hooks/use-code-editor-theme\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface CodeEditorProps {\n value: string;\n onChange: OnChange;\n language?: string;\n theme?: \"light\" | \"dark\";\n height?: string | number;\n width?: string | number;\n options?: Record<string, unknown>;\n label?: string;\n onCopy?: (code: string) => void;\n onLaunch?: (code: string) => void;\n disabled?: boolean;\n}\n\n// Theme mapping for explicit theme prop overrides\nconst THEME_MAP = {\n light: \"vs\" as const,\n dark: \"vs-dark\" as const,\n};\n\nconst CodeEditor: React.FC<CodeEditorProps> = ({\n value,\n onChange,\n language = \"python\",\n theme: themeProp,\n height = 400,\n width = \"100%\",\n options = {},\n onCopy,\n onLaunch,\n disabled = false,\n}) => {\n const editorTheme = useCodeEditorTheme();\n\n const monacoRef = useRef<Monaco | null>(null);\n const [copyState, setCopyState] = useState<\"Copy\" | \"Copied\">(\"Copy\");\n const [launchState, setLaunchState] = useState<\"Launch\" | \"Launched\">(\n \"Launch\"\n );\n /** Feedback reset delay in milliseconds */\n const FEEDBACK_RESET_DELAY_MS = 1000;\n\n const handleCopy = useCallback(\n (code: string) => {\n if (onCopy && !disabled) {\n onCopy(code);\n setCopyState(\"Copied\");\n setTimeout(() => {\n setCopyState(\"Copy\");\n }, FEEDBACK_RESET_DELAY_MS);\n }\n },\n [onCopy, disabled]\n );\n\n const handleLaunch = useCallback(\n (code: string) => {\n if (onLaunch && !disabled) {\n onLaunch(code);\n setLaunchState(\"Launched\");\n setTimeout(() => {\n setLaunchState(\"Launch\");\n }, FEEDBACK_RESET_DELAY_MS);\n }\n },\n [onLaunch, disabled]\n );\n\n const handleEditorWillMount = async (monaco: Monaco) => {\n monacoRef.current = monaco;\n };\n\n const defaultOptions = {\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n lineNumbers: \"on\" as editor.LineNumbersType,\n padding: { top: 12, bottom: 12, left: 20, right: 20 },\n scrollbar: {\n vertical: \"hidden\" as const,\n verticalScrollbarSize: 0,\n },\n readOnly: disabled,\n ...options,\n };\n\n\n\n return (\n <div className={cn(\"rounded-2xl overflow-hidden relative border\", disabled && \"opacity-60 cursor-not-allowed\")}>\n <div className=\"ml-auto flex gap-2 px-4 py-2 absolute top-0 right-0 z-[1]\">\n {onCopy && (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"w-8 h-8 flex items-center justify-center\">\n <Button\n className=\"w-full h-full\"\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={() => handleCopy(value)}\n disabled={disabled}\n >\n <Copy />\n </Button>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copyState}\n </TooltipContent>\n </Tooltip>\n )}\n {onLaunch && (\n <Tooltip >\n <TooltipTrigger asChild>\n <div className=\"w-8 h-8 flex items-center justify-center\">\n <Button\n className=\"w-full h-full\"\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={() => handleLaunch(value)}\n disabled={disabled}\n >\n <Rocket />\n </Button>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {launchState}\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n <MonacoEditor\n value={value}\n onChange={onChange}\n language={language}\n theme={themeProp ? THEME_MAP[themeProp] : editorTheme.monacoTheme}\n height={height}\n width={width}\n options={defaultOptions}\n beforeMount={handleEditorWillMount}\n />\n </div>\n );\n};\n\nexport { CodeEditor };\nexport default CodeEditor;\n","import { XIcon } from \"lucide-react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-background p-4 text-sm ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-2 right-2\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-base leading-none font-medium\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface TetraScienceIconProps extends React.SVGProps<SVGSVGElement> {\n size?: number | string\n}\n\nconst TetraScienceIcon = React.forwardRef<SVGSVGElement, TetraScienceIconProps>(\n ({ size = 24, className, fill = \"currentColor\", ...props }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={cn(\"shrink-0\", className)}\n {...props}\n >\n <path\n d=\"M22.392 10.5705C21.693 5.4495 17.313 1.5 12 1.5C6.201 1.5 1.5 6.201 1.5 12C1.5 14.064 2.1045 15.9825 3.132 17.6055L1.5 22.5L6.3945 20.868C7.6395 21.657 9.06 22.188 10.584 22.3965\"\n stroke={fill}\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M17.625 12.75L18.75 16.5L22.5 17.625L18.75 18.75L17.625 22.5L16.5 18.75L12.75 17.625L16.5 16.5L17.625 12.75Z\"\n fill={fill}\n stroke={fill}\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n)\n\nTetraScienceIcon.displayName = \"TetraScienceIcon\"\n\nexport { TetraScienceIcon }\nexport default TetraScienceIcon\n\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import { SendHorizontal } from \"lucide-react\";\nimport React, { useState } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CodeEditor } from \"@/components/ui/code-editor\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from \"@/components/ui/dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { TetraScienceIcon as TetrascienceIcon } from \"@/components/ui/tetrascience-icon\";\nimport { Textarea } from \"@/components/ui/textarea\";\n\nexport interface AssistantModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n prompt: string;\n initialCode?: string;\n userQuery?: string;\n onUserQueryChange?: (value: string) => void;\n onCopy: (code: string) => void;\n onLaunch: (code: string) => void;\n onSend: (input: string) => void;\n onCancel?: () => void;\n}\n\nconst AssistantModal: React.FC<AssistantModalProps> = ({\n open,\n onOpenChange,\n title,\n prompt,\n initialCode = \"\",\n userQuery = \"\",\n onUserQueryChange,\n onCopy,\n onLaunch,\n onSend,\n}) => {\n const [code, setCode] = useState<string>(initialCode);\n const [input, setInput] = useState<string>(\"\");\n const [localUserQuery, setLocalUserQuery] = useState<string>(userQuery);\n\n React.useEffect(() => {\n setLocalUserQuery(userQuery);\n }, [userQuery]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"min-w-[600px]\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <TetrascienceIcon fill=\"var(--primary)\" />\n <span className=\"font-semibold text-xl\">{title}</span>\n </DialogTitle>\n </DialogHeader>\n <div className=\"px-6 py-6 text-sm font-normal leading-5\">{prompt}</div>\n <div className=\"mx-6 shadow-sm rounded-lg\">\n <Textarea\n value={localUserQuery}\n onChange={(e) => {\n setLocalUserQuery(e.target.value);\n if (onUserQueryChange) onUserQueryChange(e.target.value);\n }}\n rows={2}\n placeholder=\"Type your question here...\"\n />\n </div>\n <div className=\"px-6 pt-6 pb-0 flex-1\">\n <div className=\"rounded-[20px] overflow-hidden bg-[var(--primary)] min-h-[200px] relative\">\n <CodeEditor\n value={code}\n onChange={(v) => setCode(v ?? \"\")}\n language=\"python\"\n\n height={200}\n onCopy={onCopy}\n onLaunch={onLaunch}\n />\n </div>\n </div>\n <div className=\"flex items-center gap-3 px-6 pt-4 pb-6 rounded-bl-[20px] rounded-br-[20px]\">\n <Input\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Ask us anything related to your work...\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\") onSend(input);\n }}\n />\n <Button className=\"min-w-[100px] flex items-center gap-[6px]\" variant=\"default\" onClick={() => onSend(input)}>\n <SendHorizontal />\n Send\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default AssistantModal;\n","import { Pencil } from \"lucide-react\";\nimport { useCallback, useState } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CodeEditor } from \"@/components/ui/code-editor\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogClose } from \"@/components/ui/dialog\";\n\nexport interface CodeScriptEditorButtonProps {\n initialCode?: string;\n onCodeSave?: (newCode: string) => void;\n language?: string;\n buttonText?: string;\n modalTitle?: string;\n buttonProps?: React.ComponentProps<typeof Button>;\n modalProps?: Omit<React.ComponentProps<typeof Dialog>, \"open\" | \"defaultOpen\" | \"onOpenChange\">;\n disabled?: boolean;\n isEditMode?: boolean;\n}\n\n/**\n * Renders an 'Edit code' button that opens a modal with a Monaco code editor.\n */\nexport const CodeScriptEditorButton = ({\n initialCode = \"\",\n onCodeSave,\n language = \"python\",\n buttonText = \"Edit Code\",\n modalTitle = \"Edit Code\",\n buttonProps,\n modalProps,\n disabled = false,\n}: CodeScriptEditorButtonProps) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [currentCode, setCurrentCode] = useState<string>(initialCode);\n\n const lineCount = currentCode ? currentCode.split(\"\\n\").length : 0;\n const charCount = currentCode.length;\n\n const handleOpenModal = useCallback(() => {\n setCurrentCode(initialCode);\n setIsModalOpen(true);\n }, [initialCode]); // Depend on initialCode\n\n const handleSave = useCallback(() => {\n if (onCodeSave) {\n onCodeSave(currentCode);\n }\n setIsModalOpen(false);\n }, [onCodeSave, currentCode]);\n\n const handleCancel = useCallback(() => {\n setIsModalOpen(false);\n }, []);\n\n const handleCodeChange = useCallback((value: string | undefined) => {\n setCurrentCode(value || \"\");\n }, []);\n\n return (\n <>\n <div className=\"flex items-center flex-row gap-4 flex-wrap w-full\">\n <div className=\"[&>button]:h-[38px]\">\n <Button onClick={handleOpenModal} size=\"sm\" variant=\"secondary\" {...buttonProps} disabled={disabled}>\n <Pencil />\n {buttonText}\n </Button>\n </div>\n <span className=\"text-xs text-muted-foreground\" title={`${lineCount} lines, ${charCount} characters`}>\n {lineCount} lines / {charCount} chars\n </span>\n </div>\n\n <Dialog\n {...modalProps}\n open={isModalOpen}\n onOpenChange={(open) => {\n setIsModalOpen(open);\n if (!open) {\n handleCancel();\n }\n }}\n >\n <DialogContent className=\"min-w-[80%]\">\n <DialogHeader>\n <DialogTitle>{modalTitle}</DialogTitle>\n </DialogHeader>\n <CodeEditor\n height=\"400px\"\n language={language}\n value={currentCode}\n onChange={handleCodeChange}\n options={{\n minimap: { enabled: false },\n }}\n />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\" onClick={handleCancel}>Close</Button>\n </DialogClose>\n <Button onClick={handleSave}>Save changes</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default CodeScriptEditorButton;\n","\"use client\"\n\nimport { Label as LabelPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","\"use client\"\n\nimport { ChevronDownIcon, CheckIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n data-align-trigger={position === \"item-aligned\"}\n className={cn(\"relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", position ===\"popper\"&&\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\", className )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-position={position}\n className={cn(\n \"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)\",\n position === \"popper\" && \"\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-1.5 py-1 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon\n />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon\n />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\"\n\nimport { Switch as SwitchPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n \"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground\"\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n","import React, { useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CodeEditor } from \"@/components/ui/code-editor\";\nimport { Label } from \"@/components/ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { Switch } from \"@/components/ui/switch\";\n\n/** Deploy simulation delay in milliseconds */\nconst DEPLOY_DELAY_MS = 3000;\n\nexport interface LaunchContentProps {\n initialCode?: string;\n onDeploy?: () => void;\n versions?: string[];\n currentVersion?: string;\n onVersionChange?: (version: string) => void;\n}\n\nconst defaultInitialCode = `protocolSchema: v3\nname: v3\ndescription: No description\nconfig: {}\nsteps: []`;\n\nconst LaunchContent: React.FC<LaunchContentProps> = ({\n initialCode = defaultInitialCode,\n onDeploy,\n versions = [\"v0.0.7\", \"v0.0.6\", \"v0.0.5\"],\n currentVersion = \"v0.0.7\",\n}) => {\n const [code, setCode] = useState(initialCode);\n const [overwriteMode, setOverwriteMode] = useState(true);\n const [isDeploying, setIsDeploying] = useState(false);\n\n const handleCodeChange = (value: string | undefined) => {\n if (value !== undefined) {\n setCode(value);\n }\n };\n\n const handleCopy = (code: string) => {\n navigator.clipboard.writeText(code);\n };\n\n const handleLaunch = (code: string) => {\n console.log(\"Launching code:\", code);\n };\n\n const handleDeploy = () => {\n setIsDeploying(true);\n toast.info(\"Building Protocol: Status=IN_PROGRESS, Phase=FINALIZING\");\n\n setTimeout(() => {\n const isSuccess = Math.random() > 0.3;\n\n if (isSuccess) {\n toast.success(\n `Pipeline visual-pipeline-builder-protocol-${currentVersion}-pipeline deployed successfully! Deployment complete`\n );\n } else {\n toast.error(\n `Failed to deploy pipeline visual-pipeline-builder-protocol-${currentVersion}-pipeline. Please try again.`\n );\n }\n\n setIsDeploying(false);\n\n if (onDeploy) onDeploy();\n }, DEPLOY_DELAY_MS);\n };\n\n return (\n <div>\n <div className=\"flex items-center justify-between mb-4\">\n <h1 className=\"text-default text-lg font-semibold leading-7 m-0\">Launch</h1>\n <div className=\"flex items-center gap-4\">\n <Label htmlFor=\"overwrite-switch\">Overwrite Mode</Label>\n <Switch checked={overwriteMode} onCheckedChange={setOverwriteMode} disabled={isDeploying} />\n\n <Separator orientation=\"vertical\" />\n <div className=\"flex items-center\">\n <Select defaultValue=\"workspace\">\n <SelectTrigger size=\"default\">\n <SelectValue placeholder=\"Choose a destination\" />\n </SelectTrigger>\n <SelectContent>\n {versions.map((v) => (<SelectItem key={v} value={v}>{v}</SelectItem>))}\n </SelectContent>\n </Select>\n </div>\n <Button onClick={handleDeploy} disabled={isDeploying}>\n Deploy\n </Button>\n </div>\n </div>\n\n <CodeEditor\n value={code}\n onChange={handleCodeChange}\n language=\"yaml\"\n width=\"100%\"\n onCopy={handleCopy}\n onLaunch={handleLaunch}\n disabled={!overwriteMode}\n />\n </div>\n );\n};\n\nexport default LaunchContent;\n","import { Building, Lamp } from \"lucide-react\";\nimport React from \"react\";\n\n// Types\ninterface OrganizationInfo {\n name: string;\n subtext?: string;\n logo?: React.ReactNode;\n}\n\nexport interface NavbarProps {\n organization: OrganizationInfo;\n}\n\n// Default logo component\nconst DefaultLogo = () => (\n <div className=\"rounded flex items-center justify-center\">\n <Building />\n </div>\n);\n\n// Default project icon\nconst DefaultProjectIcon = () => (\n <Lamp />\n);\n\nconst Navbar: React.FC<NavbarProps> = ({ organization }) => {\n return (\n <div className=\"flex items-center h-20 w-full pt-3 pr-6 pb-3 pl-32 box-border gap-10\">\n <div className=\"flex items-center h-full\">\n <div className=\"flex flex-col\">\n <div className=\"uppercase mb-0.5 text-[10px] font-medium leading-4 tracking-[0.2px]\">\n ORGANIZATION\n </div>\n <div className=\"flex items-center gap-2 w-80\">\n <div className=\"flex items-center justify-center\">\n {organization.logo || <DefaultLogo />}\n </div>\n <div>\n <div className=\"text-sm font-medium leading-[22px]\">\n {organization.name}\n </div>\n {organization.subtext && (\n <div className=\"text-muted-foreground text-xs italic font-medium leading-4\">\n {organization.subtext}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center h-full\">\n <div className=\"flex flex-col\">\n <div className=\"uppercase mb-0.5 text-[10px] font-medium leading-4 tracking-[0.2px]\">\n PROJECT\n </div>\n <div className=\"flex items-center py-1.5 rounded gap-2\">\n <div className=\"flex items-center justify-center\">\n <DefaultProjectIcon />\n </div>\n <div className=\"text-muted-foreground text-sm font-medium leading-[22px]\">\n {\"Not Selected\"}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Navbar;\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-4 group-data-[size=sm]/card:px-3\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/card:p-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","import { Plus } from \"lucide-react\";\nimport React, { useState } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\n\nexport interface ProtocolConfigurationProps {\n className?: string;\n}\n\nconst ProtocolConfiguration: React.FC<ProtocolConfigurationProps> = ({\n className,\n}) => {\n const [isEditMode, setIsEditMode] = useState(false);\n\n return (\n <div className={className}>\n <div className=\"flex items-center justify-between pb-6 rounded-tl-3xl rounded-tr-3xl\">\n <h2 className=\"text-xl font-semibold leading-7 m-0\">Protocol Configuration</h2>\n <div className=\"flex items-center gap-2 text-[15px] font-medium\">\n <Switch\n checked={isEditMode}\n onCheckedChange={() => setIsEditMode((prev) => !prev)}\n />\n <Label htmlFor=\"edit-mode-switch\">Edit Mode</Label>\n </div>\n </div>\n <Card>\n <CardHeader className=\"border-b\">\n <CardTitle>Configuration</CardTitle>\n </CardHeader>\n <CardContent>\n {isEditMode ? (\n <Button\n variant=\"secondary\"\n >\n <Plus />\n Add Input\n </Button>\n ) : (\n <div className=\"flex flex-col items-start gap-4\">\n <div className=\"text-muted-foreground text-sm font-medium\">\n No values, Use the 'edit' button to add values\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n};\n\nexport default ProtocolConfiguration;\n","import React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CodeEditor } from \"@/components/ui/code-editor\";\nimport { Label } from \"@/components/ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\nimport { Switch } from \"@/components/ui/switch\";\n\nexport interface ProtocolYamlCardProps {\n title: string;\n newVersionMode: boolean;\n onToggleNewVersionMode: (checked: boolean) => void;\n versionOptions: { value: string; label: string }[];\n selectedVersion: string;\n onVersionChange: (value: string) => void;\n onDeploy: () => void;\n yaml: string;\n onYamlChange: (value: string) => void;\n}\n\nconst ProtocolYamlCard: React.FC<ProtocolYamlCardProps> = ({\n title,\n newVersionMode,\n onToggleNewVersionMode,\n versionOptions,\n selectedVersion,\n onVersionChange,\n onDeploy,\n yaml,\n onYamlChange,\n}) => {\n return (\n <div className=\"flex flex-col items-start p-0 gap-4 w-[928px] bg-transparent\">\n <div className=\"flex flex-row justify-between items-center w-[928px] h-9\">\n <span className=\"font-semibold text-lg leading-7\">{title}</span>\n <div className=\"flex flex-row items-center gap-4 justify-end\">\n <Switch\n checked={newVersionMode}\n onCheckedChange={onToggleNewVersionMode}\n />\n <Label htmlFor=\"new-version-mode-switch\">New Version Mode</Label>\n <div className=\"w-px h-5\" />\n <Select value={selectedVersion} onValueChange={onVersionChange}>\n <SelectTrigger size=\"default\">\n <SelectValue placeholder=\"Choose a version\" />\n </SelectTrigger>\n <SelectContent>\n {versionOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button onClick={onDeploy}>\n Deploy\n </Button>\n </div>\n </div>\n <div className=\"w-full\">\n <CodeEditor\n value={yaml}\n onChange={(v) => onYamlChange(v ?? \"\")}\n language=\"yaml\"\n onCopy={() => {}}\n onLaunch={() => {}}\n />\n </div>\n </div>\n );\n};\n\nexport default ProtocolYamlCard;\n","import React, { useState } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CodeEditor } from \"@/components/ui/code-editor\";\nimport { Dialog, DialogTitle, DialogContent, DialogHeader, DialogFooter, DialogDescription } from \"@/components/ui/dialog\";\n\nexport interface PythonEditorModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n initialValue?: string;\n title?: string;\n description?: string;\n onSave: (value: string) => void;\n onCancel?: () => void;\n}\n\nconst PythonEditorModal: React.FC<PythonEditorModalProps> = ({\n open,\n onOpenChange,\n initialValue = \"\",\n title = \"\",\n description = \"\",\n onSave,\n onCancel,\n}) => {\n const [code, setCode] = useState<string>(initialValue);\n\n const handleConfirm = () => {\n onSave(code);\n };\n\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"min-w-[600px]\"\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n <div className=\"py-3 flex-1\">\n <CodeEditor\n value={code}\n onChange={(v) => setCode(v ?? \"\")}\n language=\"python\"\n height={300}\n\n onCopy={() => {}}\n onLaunch={() => {}}\n />\n </div>\n <DialogFooter>\n {/* Footer can be used for additional buttons or information if needed */}\n <Button variant=\"outline\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button onClick={handleConfirm}>Save Code</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default PythonEditorModal;\n","import React from \"react\";\n\nimport type { LucideIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface SidebarItemProps {\n icon: LucideIcon;\n label: string;\n active?: boolean;\n onClick?: () => void;\n}\n\nexport interface SidebarProps {\n items: SidebarItemProps[];\n activeItem?: string;\n onItemClick?: (label: string) => void;\n}\n\nconst SidebarItem: React.FC<SidebarItemProps> = ({\n icon: SidebarIcon,\n label,\n active,\n onClick,\n}) => {\n return (\n <div\n className={cn(\n \"w-full inline-flex flex-col rounded items-center py-3 cursor-pointer transition-colors duration-200 ease-in-out hover:bg-primary/50\",\n active ? \"bg-primary\" : \"bg-transparent\"\n )}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n onClick?.();\n }\n }}\n onClick={onClick}\n >\n <div className=\"flex justify-center items-center mb-[10px]\">\n <SidebarIcon size={20} />\n </div>\n <div className=\"text-center text-xs font-medium leading-4 px-2\">\n {label}\n </div>\n </div>\n );\n};\n\nconst Sidebar: React.FC<SidebarProps> = ({\n items,\n activeItem,\n onItemClick,\n}) => {\n const handleItemClick = (label: string) => {\n if (onItemClick) {\n onItemClick(label);\n }\n };\n\n return (\n <div className=\"w-[104px] h-full flex flex-col items-center pl-2 pr-2 gap-1\">\n {items.map((item) => (\n <SidebarItem\n key={item.label}\n icon={item.icon}\n label={item.label}\n active={activeItem === item.label}\n onClick={() => handleItemClick(item.label)}\n />\n ))}\n </div>\n );\n};\n\nexport default Sidebar;\n","import React from \"react\";\n\nimport type { TdpFiltersRenderProps } from \"../types\";\n\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\n\nconst EMPTY_OPTION_SENTINEL_PREFIX = \"__tdp-search-empty__\";\n\nconst getEmptyOptionValue = (filterKey: string) => `${EMPTY_OPTION_SENTINEL_PREFIX}:${filterKey}`;\n\nexport const DefaultFilters: React.FC<TdpFiltersRenderProps> = ({ filters, filterValues, onFilterChange }) => (\n <div className=\"tdp-search__filters-row\">\n {filters.map((filter) => {\n const emptyOptionValue = getEmptyOptionValue(filter.key);\n const hasEmptyOption = filter.options.some((option) => option.value === \"\");\n const selectedValue = filterValues[filter.key] ?? \"\";\n const hasSelectedOption = filter.options.some((option) => option.value === selectedValue);\n const selectValue =\n selectedValue === \"\"\n ? hasEmptyOption\n ? emptyOptionValue\n : undefined\n : hasSelectedOption\n ? selectedValue\n : undefined;\n\n return (\n <div key={filter.key} className=\"tdp-search__filter-wrapper\">\n <label className=\"tdp-search__filter-label\">{filter.label}</label>\n <Select\n value={selectValue}\n onValueChange={(value) => onFilterChange(filter.key, value === emptyOptionValue ? \"\" : value)}\n >\n <SelectTrigger className=\"h-[38px] w-full justify-between rounded-md\">\n <SelectValue placeholder=\"Select an option\" />\n </SelectTrigger>\n <SelectContent>\n {filter.options.map((option) => (\n <SelectItem\n key={`${filter.key}-${option.value || emptyOptionValue}`}\n value={option.value === \"\" ? emptyOptionValue : option.value}\n disabled={option.disabled}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n })}\n </div>\n);\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import { ArrowDown, ArrowUp, ArrowUpDown, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport React, { useCallback, useMemo } from \"react\";\n\nimport type { TdpResultsRenderProps } from \"../types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\n\nexport const DefaultResults: React.FC<TdpResultsRenderProps> = ({\n results,\n total,\n currentPage,\n pageSize,\n columns,\n onPageChange,\n sortKey,\n sortDirection,\n onSort,\n}) => {\n const totalPages = useMemo(() => Math.max(1, Math.ceil(total / pageSize)), [total, pageSize]);\n\n const pageNumbers = useMemo(() => {\n const pages: (number | string)[] = [];\n const maxVisible = 5;\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) pages.push(i);\n } else {\n pages.push(1);\n if (currentPage > 3) pages.push(\"...\");\n const start = Math.max(2, currentPage - 1);\n const end = Math.min(totalPages - 1, currentPage + 1);\n for (let i = start; i <= end; i++) pages.push(i);\n if (currentPage < totalPages - 2) pages.push(\"...\");\n pages.push(totalPages);\n }\n\n return pages;\n }, [totalPages, currentPage]);\n\n const handleSort = useCallback(\n (key: string) => {\n const newDirection = sortKey === key ? (sortDirection === \"asc\" ? \"desc\" : \"asc\") : \"asc\";\n onSort(key, newDirection);\n },\n [sortKey, sortDirection, onSort],\n );\n\n const sortIcon = useCallback(\n (columnKey: string) => {\n if (sortKey !== columnKey) return <ArrowUpDown className=\"ml-1 inline size-3.5 text-muted-foreground\" />;\n return sortDirection === \"asc\" ? (\n <ArrowUp className=\"ml-1 inline size-3.5\" />\n ) : (\n <ArrowDown className=\"ml-1 inline size-3.5\" />\n );\n },\n [sortKey, sortDirection],\n );\n\n return (\n <>\n <div className=\"tdp-search__results-header\">\n <div className=\"tdp-search__results-count\">\n Showing {(currentPage - 1) * pageSize + 1}-{Math.min(currentPage * pageSize, total)} of {total} results\n </div>\n </div>\n\n <div className=\"rounded-lg border\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((col) => (\n <TableHead\n key={col.key}\n style={{ width: col.width, textAlign: col.align }}\n className={col.sortable ? \"cursor-pointer select-none\" : undefined}\n onClick={col.sortable ? () => handleSort(col.key) : undefined}\n >\n {col.header}\n {col.sortable && sortIcon(col.key)}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n\n <TableBody>\n {results.map((row, rowIndex) => (\n <TableRow key={row.id || rowIndex}>\n {columns.map((col) => {\n const value = row[col.key];\n const content = col.render ? col.render(value, row, rowIndex) : value;\n return (\n <TableCell key={col.key} style={{ textAlign: col.align }}>\n {content}\n </TableCell>\n );\n })}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {totalPages > 1 && (\n <div className=\"flex items-center justify-center gap-2 py-2.5\">\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n disabled={currentPage === 1}\n onClick={() => onPageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n >\n <ChevronLeft />\n </Button>\n\n {pageNumbers.map((page, i) =>\n typeof page === \"number\" ? (\n <Button\n key={i}\n variant={page === currentPage ? \"default\" : \"ghost\"}\n size=\"icon-sm\"\n onClick={() => onPageChange(page)}\n >\n {page}\n </Button>\n ) : (\n <span key={i} className=\"px-1 text-sm text-muted-foreground\">\n {page}\n </span>\n ),\n )}\n\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n disabled={currentPage === totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n aria-label=\"Next page\"\n >\n <ChevronRight />\n </Button>\n </div>\n )}\n </>\n );\n};\n","import { Search } from \"lucide-react\";\nimport React from \"react\";\n\nimport type { TdpSearchBarRenderProps } from \"../types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\n\nexport const DefaultSearchBar: React.FC<TdpSearchBarRenderProps> = ({\n query,\n setQuery,\n onSearch,\n isLoading,\n placeholder,\n}) => {\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n onSearch();\n }\n };\n\n return (\n <div className=\"tdp-search__search-bar\">\n <div className=\"tdp-search__search-input-wrapper\">\n <div className=\"relative\">\n <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-2.5 text-muted-foreground\">\n <Search />\n </div>\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className=\"pl-9\"\n />\n </div>\n </div>\n <Button variant=\"default\" onClick={onSearch} disabled={!query.trim() || isLoading}>\n {isLoading ? \"Searching...\" : \"Search\"}\n </Button>\n </div>\n );\n};\n","export const AUTH_TOKEN_HEADER = \"ts-auth-token\";\nexport const ORG_SLUG_HEADER = \"x-org-slug\";\n\nexport const STANDALONE_SEARCH_PATH = \"/v1/datalake/searchEql\";","import type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\n/** Build Elasticsearch-style body from SearchEqlRequest (TDP API does not accept searchTerm key). */\nexport const buildEsBody = (\n searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\">,\n from: number,\n size: number,\n): Record<string, unknown> => {\n const { searchTerm, sort, order, ...rest } = searchRequest;\n const body: Record<string, unknown> = { from, size };\n if (searchTerm !== undefined && searchTerm !== \"\") {\n body.query = {\n simple_query_string: {\n query: searchTerm,\n default_operator: \"and\",\n },\n };\n }\n if (sort !== undefined && sort !== \"\") {\n body.sort = order ? [{ [sort]: order }] : [sort];\n }\n Object.entries(rest).forEach(([k, v]) => {\n if (v !== undefined) body[k] = v;\n });\n return body;\n};\n","import { useState } from \"react\";\n\nimport { AUTH_TOKEN_HEADER, ORG_SLUG_HEADER, STANDALONE_SEARCH_PATH } from \"../constants\";\nimport { buildEsBody } from \"../utils\";\n\nimport type { SearchResult, UseSearchConfig, UseSearchResult } from \"../types\";\nimport type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\nexport function useSearch(config: UseSearchConfig): UseSearchResult {\n const [results, setResults] = useState<SearchResult[]>([]);\n const [total, setTotal] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const executeSearch = async (\n searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\">,\n page: number = 1,\n ): Promise<SearchResult[]> => {\n setIsLoading(true);\n setError(null);\n\n const { pageSize, standalone, baseUrl, apiEndpoint = \"/api/search\", authToken, orgSlug } = config;\n const from = (page - 1) * pageSize;\n\n let url: string;\n let fetchInit: RequestInit;\n\n if (standalone) {\n if (!baseUrl) throw new Error(\"baseUrl is required when standalone is true\");\n url = `${baseUrl.replace(/\\/$/, \"\")}${STANDALONE_SEARCH_PATH}`;\n fetchInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(authToken && { [AUTH_TOKEN_HEADER]: authToken }),\n ...(orgSlug && { [ORG_SLUG_HEADER]: orgSlug }),\n },\n body: JSON.stringify(buildEsBody(searchRequest, from, pageSize)),\n };\n } else {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (authToken && orgSlug) {\n headers[AUTH_TOKEN_HEADER] = authToken;\n headers[ORG_SLUG_HEADER] = orgSlug;\n }\n url = apiEndpoint;\n fetchInit = {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify({ ...searchRequest, size: pageSize, from }),\n };\n }\n\n try {\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: \"Unknown error\" }));\n const message = standalone ? errorData.error?.message || errorData.error : errorData.error;\n throw new Error(message || `HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n const transformedResults: SearchResult[] = (data.hits?.hits || []).map((hit: any) => ({\n id: hit._id,\n ...hit._source,\n _score: hit._score,\n }));\n\n const totalHits = typeof data.hits?.total === \"number\" ? data.hits.total : data.hits?.total?.value || 0;\n\n setResults(transformedResults);\n setTotal(totalHits);\n setCurrentPage(page);\n return transformedResults;\n } catch (err: any) {\n setError(err.message || \"An error occurred while searching\");\n setResults([]);\n setTotal(0);\n return [];\n } finally {\n setIsLoading(false);\n }\n };\n\n return { results, total, currentPage, isLoading, error, executeSearch };\n}\n","/**\n * Resolves TDP auth credentials with the following priority:\n * 1. Explicitly passed props\n * 2. localStorage\n * 3. Browser cookies\n */\n\nimport { AUTH_TOKEN_HEADER, ORG_SLUG_HEADER } from \"../constants\";\n\nfunction readLocalStorage(key: string): string | undefined {\n try {\n return localStorage.getItem(key) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readCookie(name: string): string | undefined {\n try {\n const match = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n return match ? decodeURIComponent(match[1]) : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface TdpCredentials {\n authToken: string | undefined;\n orgSlug: string | undefined;\n}\n\n/**\n * Resolves TDP auth credentials from explicit props → localStorage → cookies\n */\nexport function useTdpCredentials(explicitToken?: string, explicitOrgSlug?: string): TdpCredentials {\n if (explicitToken && explicitOrgSlug) {\n return { authToken: explicitToken, orgSlug: explicitOrgSlug };\n }\n\n const lsToken = readLocalStorage(AUTH_TOKEN_HEADER);\n const lsOrgSlug = readLocalStorage(ORG_SLUG_HEADER);\n if (lsToken && lsOrgSlug) {\n return { authToken: lsToken, orgSlug: lsOrgSlug };\n }\n\n const cookieToken = readCookie(AUTH_TOKEN_HEADER);\n const cookieOrgSlug = readCookie(ORG_SLUG_HEADER);\n if (cookieToken && cookieOrgSlug) {\n return { authToken: cookieToken, orgSlug: cookieOrgSlug };\n }\n\n return { authToken: explicitToken, orgSlug: explicitOrgSlug };\n}\n","import { cva, type VariantProps } from \"class-variance-authority\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst alertVariants = cva(\n \"group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-action\"\n className={cn(\"absolute top-2 right-2\", className)}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertAction }\n","import { AlertCircle, Search } from \"lucide-react\";\nimport React, { useState } from \"react\";\n\nimport { DefaultFilters } from \"./components/DefaultFilters\";\nimport { DefaultResults } from \"./components/DefaultResults\";\nimport { DefaultSearchBar } from \"./components/DefaultSearchBar\";\nimport { useSearch } from \"./hooks/useSearch\";\nimport { useTdpCredentials } from \"./hooks/useTdpCredentials\";\n\nimport type { TdpSearchProps, SearchEqlExpression } from \"./types\";\nimport type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\nimport { Alert, AlertDescription, AlertTitle } from \"@/components/ui/alert\";\n\nimport \"./TdpSearch.scss\";\n\n/**\n * TdpSearch Component\n *\n * A reusable search component for querying the TDP.\n *\n * @example\n * ```tsx\n * <TdpSearch\n * columns={[\n * { key: \"id\", header: \"ID\" },\n * { key: \"filePath\", header: \"File Path\", sortable: true }\n * ]}\n * defaultQuery=\"sample-data\"\n * pageSize={20}\n * />\n * ```\n */\n\nexport const TdpSearch: React.FC<TdpSearchProps> = ({\n defaultQuery = \"\",\n columns,\n filters = [],\n defaultSort,\n advancedSearchParams,\n pageSize = 10,\n searchPlaceholder = \"Enter search term...\",\n className,\n onSearch,\n renderSearchBar,\n renderFilters,\n renderResults,\n ...props\n}) => {\n const { authToken, orgSlug } = useTdpCredentials(props.authToken, props.orgSlug);\n\n const { results, total, currentPage, isLoading, error, executeSearch } = useSearch({\n ...props,\n authToken: authToken ?? \"\",\n orgSlug: orgSlug ?? \"\",\n pageSize,\n });\n\n // UI state\n const [query, setQuery] = useState(defaultQuery);\n const [filterValues, setFilterValues] = useState<Record<string, string>>({});\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortDirection, setSortDirection] = useState<\"asc\" | \"desc\">(\"asc\");\n const [hasSearched, setHasSearched] = useState(false);\n\n // Execute search with current UI state. Optional sortOverride avoids stale state when called from handleSort.\n const handleExecuteSearch = async (\n page: number = 1,\n sortOverride?: { sortKey: string; sortDirection: \"asc\" | \"desc\" },\n ) => {\n if (!query.trim()) {\n return;\n }\n\n setHasSearched(true);\n\n const effectiveSortKey = sortOverride?.sortKey ?? sortKey ?? defaultSort?.field;\n const effectiveOrder =\n sortOverride == null\n ? sortKey\n ? sortDirection\n : (defaultSort?.order ?? sortDirection)\n : sortOverride.sortDirection;\n\n const filterExpressions = Object.entries(filterValues)\n .filter(([, value]) => value !== \"\")\n .map(([key, value]) => ({ field: key, operator: \"eq\", value }));\n\n let expression: SearchEqlExpression | undefined = advancedSearchParams?.expression as\n | SearchEqlExpression\n | undefined;\n\n if (filterExpressions.length > 0) {\n expression = {\n g: \"AND\",\n e: expression ? [...filterExpressions, expression] : filterExpressions,\n };\n }\n\n const searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\"> = {\n searchTerm: query.trim(),\n sort: effectiveSortKey ?? undefined,\n order: effectiveOrder,\n ...advancedSearchParams,\n ...(expression !== undefined && { expression }),\n };\n\n const newResults = await executeSearch(searchRequest, page);\n\n // Call onSearch with the freshly fetched results (not stale state)\n if (onSearch) {\n onSearch({ ...searchRequest, from: (page - 1) * pageSize, size: pageSize }, newResults);\n }\n };\n\n // Handle search button click\n const handleSearch = () => {\n handleExecuteSearch(1);\n };\n\n // Handle filter change\n const handleFilterChange = (filterKey: string, value: string) => {\n setFilterValues((prev) => ({\n ...prev,\n [filterKey]: value,\n }));\n };\n\n // Handle page change\n const handlePageChange = (page: number) => {\n handleExecuteSearch(page);\n };\n\n // Handle sort\n const handleSort = (key: string, direction: \"asc\" | \"desc\") => {\n setSortKey(key);\n setSortDirection(direction);\n handleExecuteSearch(1, { sortKey: key, sortDirection: direction });\n };\n\n const emptyState = (\n <div className=\"tdp-search__empty-state\">\n <div className=\"tdp-search__empty-state-icon\">\n <Search />\n </div>\n <div className=\"tdp-search__empty-state-text\">No results found. Try adjusting your search query or filters.</div>\n </div>\n );\n\n const searchBarProps = { query, setQuery, onSearch: handleSearch, isLoading, placeholder: searchPlaceholder };\n const filtersProps = { filters, filterValues, onFilterChange: handleFilterChange };\n const resultsProps = {\n results,\n total,\n currentPage,\n pageSize,\n columns,\n onPageChange: handlePageChange,\n sortKey,\n sortDirection,\n onSort: handleSort,\n };\n\n return (\n <div className={`tdp-search ${className || \"\"}`}>\n {renderSearchBar ? renderSearchBar(searchBarProps) : <DefaultSearchBar {...searchBarProps} />}\n\n {filters.length > 0 && (renderFilters ? renderFilters(filtersProps) : <DefaultFilters {...filtersProps} />)}\n\n {error && (\n <>\n <Alert variant=\"destructive\">\n <AlertCircle />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n {emptyState}\n </>\n )}\n\n {isLoading && <div className=\"tdp-search__loading-overlay\">Loading results...</div>}\n\n {!isLoading && !hasSearched && (\n <div className=\"tdp-search__empty-state\">\n <div className=\"tdp-search__empty-state-icon\">\n <Search />\n </div>\n <div className=\"tdp-search__empty-state-text\">Enter a search query and click Search to get started.</div>\n </div>\n )}\n\n {!isLoading &&\n !error &&\n hasSearched &&\n results.length > 0 &&\n (renderResults ? renderResults(resultsProps) : <DefaultResults {...resultsProps} />)}\n\n {!isLoading && !error && hasSearched && results.length === 0 && emptyState}\n </div>\n );\n};\n\nexport default TdpSearch;\n","/**\n * TDP Navigation Utilities\n *\n * Pure utility functions for constructing and navigating to TDP URLs.\n * These work independently of React and can be used in any context.\n *\n * Data apps run inside iframes within TDP. These utilities help resolve\n * the TDP base URL from the iframe context and construct navigation URLs.\n */\n\n/**\n * Known TDP route prefixes. When found in a referrer URL's pathname,\n * everything from the prefix onward is stripped to derive the TDP base URL.\n */\nconst TDP_ROUTE_PREFIXES = [\n '/data-workspace',\n '/data-apps',\n '/pipelines',\n '/pipeline-edit/',\n '/pipeline-details/',\n '/pipeline-processing/',\n '/file/',\n '/file-details/',\n '/files',\n '/search',\n '/search-classic',\n '/artifacts/',\n '/admin',\n '/settings',\n '/agent-studio',\n];\n\n/**\n * Extract the TDP base URL from `document.referrer`.\n *\n * In production, data apps run inside iframes within TDP. The browser\n * provides `document.referrer` containing the parent TDP page URL.\n * This function strips the known route path to get the base URL\n * (origin + org slug path prefix).\n *\n * @example\n * // referrer: \"https://tetrascience-uat.com/my-org/data-workspace/abc\"\n * getTdpBaseUrlFromReferrer() // \"https://tetrascience-uat.com/my-org\"\n *\n * @returns The TDP base URL, or null if detection fails\n */\nexport function getTdpBaseUrlFromReferrer(): string | null {\n if (typeof document === 'undefined' || !document.referrer) {\n return null;\n }\n\n try {\n const referrerUrl = new URL(document.referrer);\n const pathname = referrerUrl.pathname;\n\n for (const prefix of TDP_ROUTE_PREFIXES) {\n const prefixIndex = pathname.indexOf(prefix);\n if (prefixIndex !== -1) {\n const basePath = pathname.slice(0, prefixIndex).replace(/\\/$/u, '');\n return `${referrerUrl.origin}${basePath}`;\n }\n }\n\n // No known route matched — return origin (handles TDP root pages)\n return referrerUrl.origin;\n } catch {\n return null;\n }\n}\n\n/**\n * Construct a full TDP URL by joining a base URL with a path.\n *\n * @example\n * buildTdpUrl(\"https://tetrascience.com/my-org\", \"/file/abc-123\")\n * // \"https://tetrascience.com/my-org/file/abc-123\"\n *\n * @param baseUrl - The TDP base URL (origin + optional org prefix)\n * @param path - The TDP page path (e.g., \"/file/abc-123\")\n * @returns The full TDP URL, or null if construction fails\n */\nexport function buildTdpUrl(baseUrl: string, path: string): string | null {\n try {\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(baseUrl);\n url.pathname = `${url.pathname.replace(/\\/$/u, '')}${normalizedPath}`;\n return url.href;\n } catch {\n return null;\n }\n}\n\nexport interface TdpNavigationOptions {\n /** Open in a new tab instead of navigating the parent TDP frame. Default: false */\n newTab?: boolean;\n}\n\n/**\n * Navigate to a TDP URL.\n *\n * - `{ newTab: true }` opens the URL in a new browser tab.\n * - Default: sends a `postMessage` to the parent TDP frame (same-tab navigation\n * when inside an iframe), or navigates the current window (standalone).\n *\n * @param url - Full TDP URL to navigate to\n * @param options - Navigation options\n */\nexport function navigateToTdpUrl(url: string, options: TdpNavigationOptions = {}): void {\n if (options.newTab) {\n window.open(url, '_blank', 'noopener,noreferrer');\n return;\n }\n\n // In a cross-origin iframe (TDP), use postMessage to navigate the parent frame.\n // Same-origin iframes (e.g., Storybook) fall through to direct navigation.\n if (window.parent !== window) {\n try {\n // Accessing window.parent.location.href throws SecurityError if cross-origin\n void window.parent.location.href;\n } catch {\n // Cross-origin iframe — use postMessage to navigate the parent TDP frame\n try {\n const tdpUrl = new URL(url);\n const relativePath = `${tdpUrl.pathname}${tdpUrl.search}${tdpUrl.hash}`;\n window.parent.postMessage({ type: 'navigate', path: relativePath }, '*');\n return;\n } catch {\n // Fall through to direct navigation\n }\n }\n }\n\n // Fallback: direct navigation (local dev or non-iframe)\n window.location.href = url;\n}\n\n/**\n * Convenience helpers for constructing common TDP page paths.\n * Returns path strings for use with `getTdpUrl()` or `buildTdpUrl()`.\n *\n * @example\n * const { getTdpUrl } = useTdpNavigation();\n * const url = getTdpUrl(tdpPaths.fileDetails(\"abc-123\"));\n */\nexport const tdpPaths = {\n fileDetails: (fileId: string) => `/file/${fileId}`,\n pipelineEdit: (pipelineId: string) => `/pipeline-edit/${pipelineId}`,\n pipelineDetails: (pipelineId: string) => `/pipeline-details/${pipelineId}`,\n search: (query?: string) => (query ? `/search?q=${encodeURIComponent(query)}` : '/search'),\n dataWorkspace: () => '/data-workspace',\n dataApps: () => '/data-apps',\n artifact: (type: string, namespace: string, slug: string) => `/artifacts/${type}/${namespace}/${slug}`,\n};\n","import React, { createContext, useContext, useMemo } from 'react';\n\nimport { buildTdpUrl, getTdpBaseUrlFromReferrer, navigateToTdpUrl } from './tdp-url';\n\nimport type { TdpNavigationOptions } from './tdp-url';\n\nexport interface TdpNavigationContextValue {\n /** The resolved TDP base URL (origin + org path prefix), or null if not resolved */\n tdpBaseUrl: string | null;\n /** Construct a full TDP URL from a path. Returns null if base URL is not resolved. */\n getTdpUrl: (path: string) => string | null;\n /** Navigate to a TDP page. */\n navigateToTdp: (path: string, options?: TdpNavigationOptions) => void;\n}\n\nexport const TdpNavigationContext = createContext<TdpNavigationContextValue | null>(null);\n\n/**\n * Access TDP navigation helpers from the nearest TdpNavigationProvider.\n *\n * @throws Error if used outside a TdpNavigationProvider\n *\n * @example\n * ```tsx\n * const { getTdpUrl, navigateToTdp } = useTdpNavigationContext();\n * ```\n */\nexport function useTdpNavigationContext(): TdpNavigationContextValue {\n const context = useContext(TdpNavigationContext);\n if (!context) {\n throw new Error(\n 'useTdpNavigationContext must be used within a TdpNavigationProvider. ' +\n 'Wrap your app with <TdpNavigationProvider> or use the standalone useTdpNavigation() hook instead.',\n );\n }\n return context;\n}\n\n/** Props for the TdpNavigationProvider component */\nexport interface TdpNavigationProviderProps {\n /**\n * Explicit TDP base URL override. Skips auto-detection when provided.\n */\n tdpBaseUrl?: string;\n children: React.ReactNode;\n}\n\n/**\n * Provider that resolves the TDP base URL and exposes navigation helpers.\n *\n * Resolution order:\n * 1. Explicit `tdpBaseUrl` prop (if provided)\n * 2. `document.referrer` parsing (production iframe)\n *\n * @example\n * ```tsx\n * <TdpNavigationProvider tdpBaseUrl=\"https://tetrascience.com/my-org\">\n * <App />\n * </TdpNavigationProvider>\n * ```\n */\nexport const TdpNavigationProvider: React.FC<TdpNavigationProviderProps> = ({\n tdpBaseUrl: explicitBaseUrl,\n children,\n}) => {\n const tdpBaseUrl = useMemo(() => {\n if (explicitBaseUrl) {\n return explicitBaseUrl.replace(/\\/$/u, '');\n }\n return getTdpBaseUrlFromReferrer();\n }, [explicitBaseUrl]);\n\n const contextValue = useMemo<TdpNavigationContextValue>(\n () => ({\n tdpBaseUrl,\n getTdpUrl: (path: string) => {\n if (!tdpBaseUrl) return null;\n return buildTdpUrl(tdpBaseUrl, path);\n },\n navigateToTdp: (path: string, options?: TdpNavigationOptions) => {\n if (!tdpBaseUrl) {\n console.warn('[TdpNavigation] Cannot navigate: TDP base URL not resolved');\n return;\n }\n const url = buildTdpUrl(tdpBaseUrl, path);\n if (url) {\n navigateToTdpUrl(url, options);\n }\n },\n }),\n [tdpBaseUrl],\n );\n\n return <TdpNavigationContext.Provider value={contextValue}>{children}</TdpNavigationContext.Provider>;\n};\n\nexport interface UseTdpNavigationOptions {\n /** Explicit TDP base URL override */\n tdpBaseUrl?: string;\n}\n\nexport interface UseTdpNavigationReturn {\n /** The resolved TDP base URL, or null */\n tdpBaseUrl: string | null;\n /** Construct a full TDP URL from a path */\n getTdpUrl: (path: string) => string | null;\n /** Navigate to a TDP page */\n navigateToTdp: (path: string, options?: TdpNavigationOptions) => void;\n}\n\n/**\n * Standalone hook for TDP navigation (no provider required).\n *\n * For simple use cases where you don't need a TdpNavigationProvider.\n * If multiple components need navigation, prefer the provider approach.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { getTdpUrl, navigateToTdp } = useTdpNavigation({\n * tdpBaseUrl: \"https://tetrascience.com/my-org\",\n * });\n *\n * return (\n * <a href={getTdpUrl(\"/file/abc\") ?? \"#\"} target=\"_blank\" rel=\"noopener noreferrer\">\n * View File\n * </a>\n * );\n * }\n * ```\n */\nexport function useTdpNavigation(options: UseTdpNavigationOptions = {}): UseTdpNavigationReturn {\n const { tdpBaseUrl: explicitBaseUrl } = options;\n\n const tdpBaseUrl = useMemo(() => {\n if (explicitBaseUrl) return explicitBaseUrl.replace(/\\/$/u, '');\n return getTdpBaseUrlFromReferrer();\n }, [explicitBaseUrl]);\n\n return useMemo(\n () => ({\n tdpBaseUrl,\n getTdpUrl: (path: string) => (tdpBaseUrl ? buildTdpUrl(tdpBaseUrl, path) : null),\n navigateToTdp: (path: string, opts?: TdpNavigationOptions) => {\n if (!tdpBaseUrl) {\n console.warn('[useTdpNavigation] Cannot navigate: TDP base URL not resolved');\n return;\n }\n const url = buildTdpUrl(tdpBaseUrl, path);\n if (url) navigateToTdpUrl(url, opts);\n },\n }),\n [tdpBaseUrl],\n );\n}\n\n/** Props for the TDPLink component */\nexport interface TDPLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n /** TDP page path (e.g., \"/file/abc-123\" or use tdpPaths helpers) */\n path: string;\n /** Navigation behavior. Default: { newTab: true } */\n navigationOptions?: TdpNavigationOptions;\n children: React.ReactNode;\n ref?: React.Ref<HTMLAnchorElement>;\n}\n\n/**\n * A link component that navigates to TDP pages.\n *\n * Renders a standard `<a>` tag with the correct href for right-click\n * \"Open in new tab\" support, accessibility, and SEO.\n *\n * Must be used inside a `<TdpNavigationProvider>`.\n *\n * @example\n * ```tsx\n * import { TDPLink, tdpPaths } from '@tetrascience-npm/tetrascience-react-ui';\n *\n * <TDPLink path={tdpPaths.fileDetails(\"abc-123\")}>\n * View File Details\n * </TDPLink>\n *\n * <TDPLink path=\"/search?q=test\" navigationOptions={{ newTab: false }}>\n * Search in TDP (same tab)\n * </TDPLink>\n * ```\n */\nexport const TDPLink: React.FC<TDPLinkProps> = ({\n path,\n navigationOptions = { newTab: true },\n children,\n onClick,\n className,\n ...rest\n}) => {\n const { getTdpUrl, navigateToTdp } = useTdpNavigationContext();\n const href = getTdpUrl(path);\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n // Let modifier-key clicks through for native \"open in new tab\" behavior\n if (e.metaKey || e.ctrlKey || e.shiftKey) {\n return;\n }\n\n e.preventDefault();\n onClick?.(e);\n navigateToTdp(path, navigationOptions);\n };\n\n return (\n <a\n href={href ?? '#'}\n target={navigationOptions.newTab ? '_blank' : undefined}\n rel={navigationOptions.newTab ? 'noopener noreferrer' : undefined}\n onClick={handleClick}\n className={`no-underline cursor-pointer hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:rounded-[2px] ${className ?? ''}`}\n style={{ color: 'var(--primary)', outlineColor: 'var(--border)' }}\n {...rest}\n >\n {children}\n </a>\n );\n};\n","import \"./AppLayout.scss\";\nimport {\n Box,\n CheckCheck,\n Code,\n Database,\n Lamp,\n Monitor,\n PieChart,\n Search,\n SearchCode,\n Settings,\n Workflow,\n} from \"lucide-react\";\nimport React, { useState } from \"react\";\n\nimport { AppHeader } from \"@/components/composed/AppHeader\";\nimport { Navbar } from \"@/components/composed/Navbar\";\nimport { AppSidebar } from \"@/components/composed/Sidebar\";\n\ninterface AppLayoutProps {\n userProfile: {\n name: string;\n avatar?: string;\n };\n hostname: string;\n organization: {\n name: string;\n subtext?: string;\n logo?: React.ReactNode;\n };\n children?: React.ReactNode;\n}\n\nconst AppLayout: React.FC<AppLayoutProps> = ({\n userProfile,\n hostname,\n organization,\n children,\n}) => {\n // Define sidebar items\n const sidebarItems = [\n { icon: Search, label: \"Search\" },\n { icon: SearchCode, label: \"SQL Search\" },\n { icon: Lamp, label: \"Projects\" },\n { icon: Workflow, label: \"Pipelines\" },\n { icon: Monitor, label: \"Data & AI Workspace\" },\n { icon: Box, label: \"Artifacts\" },\n { icon: Database, label: \"Data Sources\" },\n { icon: PieChart, label: \"Health Monitoring\" },\n { icon: CheckCheck, label: \"Bulk Actions\" },\n { icon: Code, label: \"Attribute Management\" },\n { icon: Settings, label: \"Administration\" },\n ];\n\n // State hooks\n const [activeItem, setActiveItem] = useState(\"Pipelines\");\n\n // Handlers\n const handleSidebarItemClick = (label: string) => {\n setActiveItem(label);\n };\n\n const handleHomeClick = () => {\n console.log(\"Home clicked\");\n };\n\n const handleSettingsClick = () => {\n console.log(\"Settings clicked\");\n };\n\n const handleUserProfileClick = () => {\n console.log(\"User profile clicked\");\n };\n\n return (\n <div className=\"app-layout\">\n <Navbar organization={organization} />\n\n <div className=\"content-container\">\n <AppSidebar\n items={sidebarItems}\n activeItem={activeItem}\n onItemClick={handleSidebarItemClick}\n />\n\n <div className=\"main-content\">\n <AppHeader\n hostname={hostname}\n userProfile={userProfile}\n onHomeClick={handleHomeClick}\n onSettingsClick={handleSettingsClick}\n onUserProfileClick={handleUserProfileClick}\n />\n\n <div className=\"main-layout\">{children}</div>\n </div>\n </div>\n </div>\n );\n};\n\nexport { AppLayout };\nexport type { AppLayoutProps };\n","import { useMemo } from \"react\";\n\nimport { useIsDark } from \"@/hooks/use-is-dark\";\n\n/**\n * Plotly theme configuration returned by usePlotlyTheme.\n * Spread into a Plotly layout to apply dark/light mode colors.\n */\nexport interface PlotlyThemeColors {\n /** Background color for the paper area */\n paperBg: string;\n /** Background color for the plot area */\n plotBg: string;\n /** Primary text color (titles, ticks) */\n textColor: string;\n /** Secondary text color (axis titles, subtitles) */\n textSecondary: string;\n /** Grid line color */\n gridColor: string;\n /** Axis line color */\n lineColor: string;\n /** Tick mark color */\n tickColor: string;\n /** Legend text color */\n legendColor: string;\n /** Spike/crosshair line color */\n spikeColor: string;\n /** Whether dark mode is active */\n isDark: boolean;\n}\n\nconst LIGHT_THEME: PlotlyThemeColors = {\n paperBg: \"transparent\",\n plotBg: \"transparent\",\n textColor: \"rgba(26, 26, 26, 1)\",\n textSecondary: \"rgba(26, 26, 26, 0.6)\",\n gridColor: \"rgba(225, 231, 239, 1)\",\n lineColor: \"rgba(26, 26, 26, 1)\",\n tickColor: \"rgba(225, 231, 239, 1)\",\n legendColor: \"rgba(4, 38, 63, 1)\",\n spikeColor: \"rgba(100, 116, 139, 1)\",\n isDark: false,\n};\n\nconst DARK_THEME: PlotlyThemeColors = {\n paperBg: \"transparent\",\n plotBg: \"transparent\",\n textColor: \"rgba(255, 255, 255, 0.9)\",\n textSecondary: \"rgba(255, 255, 255, 0.6)\",\n gridColor: \"rgba(51, 65, 86, 1)\",\n lineColor: \"rgba(158, 172, 192, 1)\",\n tickColor: \"rgba(51, 65, 86, 1)\",\n legendColor: \"rgba(200, 214, 229, 1)\",\n spikeColor: \"rgba(158, 172, 192, 1)\",\n isDark: true,\n};\n\n/**\n * Hook that returns Plotly color tokens for the current light/dark theme.\n *\n * @example\n * ```tsx\n * const theme = usePlotlyTheme();\n * const layout = {\n * paper_bgcolor: theme.paperBg,\n * plot_bgcolor: theme.plotBg,\n * font: { color: theme.textColor },\n * };\n * ```\n */\nexport function usePlotlyTheme(): PlotlyThemeColors {\n const isDark = useIsDark();\n return useMemo(() => (isDark ? DARK_THEME : LIGHT_THEME), [isDark]);\n}\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\n\ninterface AreaDataSeries {\n x: number[];\n y: number[];\n name: string;\n color: string;\n fill?: \"tozeroy\" | \"tonexty\" | \"toself\";\n}\n\ntype AreaGraphVariant = \"normal\" | \"stacked\";\n\ninterface AreaGraphProps {\n dataSeries: AreaDataSeries[];\n width?: number;\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n variant?: AreaGraphVariant;\n xTitle?: string;\n yTitle?: string;\n title?: string;\n}\n\nconst AreaGraph: React.FC<AreaGraphProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n xRange,\n yRange,\n variant = \"normal\",\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n title = \"Area Graph\",\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n\n const { xMin, xMax, yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: variant === \"stacked\" ? 0 : minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries, variant]);\n\n const effectiveXRange = useMemo(\n () => xRange || [xMin, xMax],\n [xRange, xMin, xMax],\n );\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const xTicks = useMemo(() => {\n const range = effectiveXRange[1] - effectiveXRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveXRange[0] / step) * step;\n while (current <= effectiveXRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveXRange]);\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n const titleOptions = useMemo(\n () => ({\n text: title,\n x: 0.5,\n y: 0.95,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n font: {\n size: 32,\n weight: 600,\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n lineheight: 1.2,\n standoff: 30,\n },\n }),\n [title, theme],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n let data;\n\n if (variant === \"stacked\") {\n // For stacked mode, we need to calculate cumulative values\n const cumulativeY = new Array(dataSeries[0]?.x.length || 0).fill(0);\n\n data = dataSeries.map((series, index) => {\n // Calculate cumulative values for this series\n const stackedY = series.y.map((value, i) => {\n const result = cumulativeY[i] + value;\n cumulativeY[i] = result;\n return result;\n });\n\n return {\n x: series.x,\n y: stackedY,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: series.name,\n fill: index === 0 ? (\"tozeroy\" as const) : (\"tonexty\" as const),\n fillcolor: series.color,\n line: {\n color: series.color,\n width: 2,\n },\n };\n });\n } else {\n // Normal mode - each area fills independently from zero\n data = dataSeries.map((series) => ({\n x: series.x,\n y: series.y,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: series.name,\n fill: series.fill || (\"tozeroy\" as const),\n fillcolor: series.color,\n line: {\n color: series.color,\n width: 2,\n },\n }));\n }\n\n const layout = {\n width,\n height: height,\n title: titleOptions,\n margin: { l: 80, r: 40, b: 80, t: 80, pad: 0 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n showgrid: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n ...tickOptions,\n },\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 13,\n color: theme.legendColor,\n family: \"Inter, sans-serif\",\n weight: 500,\n lineheight: 18,\n },\n },\n showlegend: true,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, data, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n // Cleanup function\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [dataSeries, width, height, xRange, yRange, effectiveXRange, effectiveYRange, variant, xTitle, yTitle, titleOptions, tickOptions, xTicks, yTicks, theme]);\n\n return (\n <div className=\"area-graph-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { AreaGraph };\nexport type { AreaDataSeries, AreaGraphVariant, AreaGraphProps };\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\n\ninterface BarDataSeries {\n x: number[];\n y: number[];\n name: string;\n color: string;\n error_y?: {\n type: \"data\";\n array: number[];\n visible: boolean;\n };\n}\n\ntype BarGraphVariant = \"group\" | \"stack\" | \"overlay\";\n\ninterface BarGraphProps {\n dataSeries: BarDataSeries[];\n width?: number;\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n variant?: BarGraphVariant;\n xTitle?: string;\n yTitle?: string;\n title?: string;\n barWidth?: number;\n}\n\nconst BarGraph: React.FC<BarGraphProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n xRange,\n yRange,\n variant = \"group\",\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n title = \"Bar Graph\",\n barWidth = 24,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n\n const { yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: variant === \"stack\" ? 0 : minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries, variant]);\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const xTicks = useMemo(\n () => [...new Set(dataSeries.flatMap((s) => s.x))],\n [dataSeries],\n );\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const barMode = useMemo((): \"group\" | \"stack\" | \"overlay\" => {\n switch (variant) {\n case \"stack\":\n return \"stack\";\n case \"overlay\":\n return \"overlay\";\n case \"group\":\n default:\n return \"group\";\n }\n }, [variant]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const data = dataSeries.map((series) => ({\n x: series.x,\n y: series.y,\n type: \"bar\" as const,\n name: series.name,\n marker: {\n color: series.color,\n },\n width: barWidth,\n error_y: series.error_y,\n }));\n\n const layout = {\n title: {\n text: title,\n font: {\n size: 32,\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n },\n },\n width,\n height,\n margin: { l: 80, r: 30, b: 80, t: 60, pad: 0 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n },\n barmode: barMode,\n bargap: 0.15,\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 32,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n showgrid: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 30,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n ...tickOptions,\n },\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 16,\n color: theme.legendColor,\n family: \"Inter, sans-serif\",\n weight: 500,\n },\n },\n showlegend: dataSeries.length > 1,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, data, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n // Cleanup function\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [dataSeries, width, height, xRange, yRange, xTitle, yTitle, title, barWidth, barMode, tickOptions, xTicks, yTicks, theme]);\n\n return (\n <div className=\"bar-graph-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { BarGraph };\nexport type { BarDataSeries, BarGraphVariant, BarGraphProps };\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\n\n/** Default point position offset from the box edge */\nconst DEFAULT_POINT_POSITION = -1.8;\n\ninterface BoxDataSeries {\n y: number[];\n name: string;\n color: string;\n x?: string[] | number[];\n boxpoints?: \"all\" | \"outliers\" | \"suspectedoutliers\" | false;\n jitter?: number;\n pointpos?: number;\n}\n\ninterface BoxplotProps {\n dataSeries: BoxDataSeries[];\n width?: number;\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n xTitle?: string;\n yTitle?: string;\n title?: string;\n showPoints?: boolean;\n}\n\nconst Boxplot: React.FC<BoxplotProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n xRange,\n yRange,\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n title = \"Boxplot\",\n showPoints = false,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n\n const { yMin, yMax } = useMemo(() => {\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n const titleOptions = useMemo(\n () => ({\n text: title,\n x: 0.5,\n y: 0.95,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n font: {\n size: 32,\n weight: 600,\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n lineheight: 1.2,\n standoff: 30,\n },\n }),\n [title, theme],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const data = dataSeries.map((series) => ({\n y: series.y,\n x: series.x,\n type: \"box\" as const,\n name: series.name,\n marker: {\n color: series.color,\n },\n line: {\n color: series.color,\n },\n fillcolor: series.color + \"40\", // Add transparency\n boxpoints: showPoints ? series.boxpoints || \"outliers\" : (false as const),\n jitter: series.jitter || 0.3,\n pointpos: series.pointpos || DEFAULT_POINT_POSITION,\n }));\n\n const layout = {\n width,\n height: height,\n title: titleOptions,\n margin: { l: 80, r: 40, b: 80, t: 80, pad: 0 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n showgrid: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n ...tickOptions,\n },\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 13,\n color: theme.legendColor,\n family: \"Inter, sans-serif\",\n weight: 500,\n lineheight: 18,\n },\n },\n showlegend: true,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, data, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n // Cleanup function\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [dataSeries, width, height, xRange, yRange, effectiveYRange, xTitle, yTitle, showPoints, titleOptions, tickOptions, yTicks, theme]);\n\n return (\n <div className=\"boxplot-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { Boxplot };\nexport type { BoxDataSeries, BoxplotProps };\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport \"./Chromatogram.scss\";\n\n/** Height offset for the plot area in pixels */\nconst PLOT_HEIGHT_OFFSET = 75;\n/** Scale factor for y-axis range to add padding above max value */\nconst Y_AXIS_PADDING_FACTOR = 1.05;\n\ninterface PeakData {\n position: number;\n base?: string;\n peakA: number;\n peakT: number;\n peakG: number;\n peakC: number;\n}\n\ninterface ChromatogramProps {\n data?: PeakData[];\n width?: number;\n height?: number;\n positionInterval?: number;\n colorA?: string;\n colorT?: string;\n colorG?: string;\n colorC?: string;\n}\n\nconst determineBase = (item: PeakData): string => {\n const peakValues = {\n A: item.peakA,\n T: item.peakT,\n G: item.peakG,\n C: item.peakC,\n };\n\n const values = Object.values(peakValues);\n const allEqual = values.every((val) => val === values[0]);\n\n if (allEqual) {\n return \"\";\n }\n\n let highestBase = \"\";\n let highestValue = 0;\n\n Object.entries(peakValues).forEach(([base, value]) => {\n if (value > highestValue) {\n highestBase = base;\n highestValue = value;\n }\n });\n\n return highestBase;\n};\n\nconst Chromatogram: React.FC<ChromatogramProps> = ({\n data = [],\n width = 900,\n height = 600,\n positionInterval = 10,\n colorA = \"#2D9CDB\",\n colorT = \"#A1C63C\",\n colorG = \"#FF5C64\",\n colorC = \"#FFA62E\",\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n\n const positions = useMemo(() => data.map((item) => item.position), [data]);\n const sequence = useMemo(() => data.map((item) => determineBase(item)), [data]);\n const peakA = useMemo(() => data.map((item) => item.peakA), [data]);\n const peakT = useMemo(() => data.map((item) => item.peakT), [data]);\n const peakG = useMemo(() => data.map((item) => item.peakG), [data]);\n const peakC = useMemo(() => data.map((item) => item.peakC), [data]);\n\n const aTrace = useMemo(\n () => ({\n x: positions,\n y: peakA,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: \"A\",\n line: { color: colorA, width: 2, shape: \"spline\" as const },\n }),\n [positions, peakA, colorA],\n );\n\n const tTrace = useMemo(\n () => ({\n x: positions,\n y: peakT,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: \"T\",\n line: { color: colorT, width: 2, shape: \"spline\" as const },\n }),\n [positions, peakT, colorT],\n );\n\n const gTrace = useMemo(\n () => ({\n x: positions,\n y: peakG,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: \"G\",\n line: { color: colorG, width: 2, shape: \"spline\" as const },\n }),\n [positions, peakG, colorG],\n );\n\n const cTrace = useMemo(\n () => ({\n x: positions,\n y: peakC,\n type: \"scatter\" as const,\n mode: \"lines\" as const,\n name: \"C\",\n line: { color: colorC, width: 2, shape: \"spline\" as const },\n }),\n [positions, peakC, colorC],\n );\n\n const maxValue = useMemo(\n () => Math.max(...peakA, ...peakT, ...peakG, ...peakC),\n [peakA, peakT, peakG, peakC],\n );\n\n useEffect(() => {\n if (!plotRef.current || data.length === 0) return;\n\n const plotData = [aTrace, tTrace, gTrace, cTrace];\n\n const layout: Partial<Plotly.Layout> = {\n width: width,\n height: height - PLOT_HEIGHT_OFFSET,\n margin: { l: 0, r: 0, b: 20, t: 10, pad: 0 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n },\n showlegend: false,\n xaxis: {\n showgrid: false,\n zeroline: false,\n showticklabels: false,\n showline: false,\n range: [Math.min(...positions), Math.max(...positions)],\n fixedrange: true,\n },\n yaxis: {\n showgrid: false,\n zeroline: false,\n showticklabels: false,\n showline: false,\n range: [0, maxValue * Y_AXIS_PADDING_FACTOR],\n fixedrange: true,\n },\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n fillFrame: true,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [data, width, height, aTrace, tTrace, gTrace, cTrace, maxValue, positions, theme]);\n\n if (data.length === 0) {\n return <div className=\"chart-container\">No data available</div>;\n }\n\n const renderSequence = () => {\n const renderSequenceLetters = () => {\n const minPosition = Math.min(...positions);\n const maxPosition = Math.max(...positions);\n const chartWidth = width;\n\n return (\n <div className=\"sequence-letters-container\">\n {sequence.map((base, index) => {\n const position = positions[index];\n const color =\n base === \"A\"\n ? colorA\n : base === \"T\"\n ? colorT\n : base === \"G\"\n ? colorG\n : base === \"C\"\n ? colorC\n : theme.textColor;\n\n const percentage =\n (position - minPosition) / (maxPosition - minPosition);\n const leftPosition = percentage * chartWidth;\n\n return (\n <span\n key={`base-${index}`}\n className=\"sequence-letter\"\n style={{\n left: `${leftPosition}px`,\n color,\n }}\n >\n {base}\n </span>\n );\n })}\n </div>\n );\n };\n\n const renderPositionNumbers = () => {\n const minPosition = Math.min(...positions);\n const maxPosition = Math.max(...positions);\n const chartWidth = width;\n\n const startPos =\n Math.ceil(minPosition / positionInterval) * positionInterval;\n\n const regularPositionLabels: Array<{ position: number; label: string }> =\n [];\n\n for (let pos = startPos; pos <= maxPosition; pos += positionInterval) {\n regularPositionLabels.push({\n position: pos,\n label: pos.toString(),\n });\n }\n\n return (\n <div className=\"position-numbers-container\">\n {regularPositionLabels.map((label) => {\n const percentage =\n (label.position - minPosition) / (maxPosition - minPosition);\n const leftPosition = percentage * chartWidth;\n\n return (\n <span\n key={`pos-${label.position}`}\n className=\"position-number\"\n style={{\n left: `${leftPosition}px`,\n }}\n >\n {label.label}\n </span>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"sequence-header\">\n {renderSequenceLetters()}\n {renderPositionNumbers()}\n </div>\n );\n };\n\n return (\n <div className=\"chromatogram-container\" style={{ width, height }}>\n {renderSequence()}\n <div className=\"chromatogram-chart\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n </div>\n );\n};\n\nexport { Chromatogram };\nexport type { PeakData, ChromatogramProps };\n","/**\n * Centralized color system for TetraScience UI\n * This utility provides access to CSS variables defined in colors.css\n * while maintaining TypeScript support and IntelliSense\n */\n\n/**\n * Get a CSS variable value with optional fallback\n * @param cssVar - The CSS variable name (without --)\n * @param fallback - Optional fallback value\n * @returns The CSS variable value or fallback\n */\nconst getCSSVar = (cssVar: string, fallback?: string): string => {\n if (typeof window !== \"undefined\") {\n const value = getComputedStyle(document.documentElement)\n .getPropertyValue(\"--\" + cssVar)\n .trim();\n return value || fallback || \"\";\n }\n const fallbackSuffix = fallback ? \", \" + fallback : \"\";\n return \"var(--\" + cssVar + fallbackSuffix + \")\";\n};\n\n/**\n * Centralized color tokens that map to CSS variables\n * This provides TypeScript support while leveraging CSS custom properties\n */\nexport const COLORS = {\n // Black scale\n BLACK_50: getCSSVar(\"black-50\", \"rgba(26, 26, 26, 0.05)\"),\n BLACK_100: getCSSVar(\"black-100\", \"rgba(26, 26, 26, 0.1)\"),\n BLACK_200: getCSSVar(\"black-200\", \"rgba(26, 26, 26, 0.2)\"),\n BLACK_300: getCSSVar(\"black-300\", \"rgba(26, 26, 26, 0.3)\"),\n BLACK_400: getCSSVar(\"black-400\", \"rgba(26, 26, 26, 0.4)\"),\n BLACK_500: getCSSVar(\"black-500\", \"rgba(26, 26, 26, 0.5)\"),\n BLACK_600: getCSSVar(\"black-600\", \"rgba(26, 26, 26, 0.6)\"),\n BLACK_700: getCSSVar(\"black-700\", \"rgba(26, 26, 26, 0.7)\"),\n BLACK_800: getCSSVar(\"black-800\", \"rgba(26, 26, 26, 0.8)\"),\n BLACK_900: getCSSVar(\"black-900\", \"rgba(26, 26, 26, 1)\"),\n\n // Legacy aliases for backwards compatibility\n BLACK: getCSSVar(\"black-900\", \"#1a1a1a\"),\n BLACK_OPACITY_20: \"rgba(26, 26, 26, 0.2)\", // Custom opacity not in CSS vars\n\n // White scale\n WHITE_50: getCSSVar(\"white-50\", \"rgba(255, 255, 255, 0.05)\"),\n WHITE_100: getCSSVar(\"white-100\", \"rgba(255, 255, 255, 0.1)\"),\n WHITE_200: getCSSVar(\"white-200\", \"rgba(255, 255, 255, 0.2)\"),\n WHITE_300: getCSSVar(\"white-300\", \"rgba(255, 255, 255, 0.3)\"),\n WHITE_400: getCSSVar(\"white-400\", \"rgba(255, 255, 255, 0.4)\"),\n WHITE_500: getCSSVar(\"white-500\", \"rgba(255, 255, 255, 0.5)\"),\n WHITE_600: getCSSVar(\"white-600\", \"rgba(255, 255, 255, 0.6)\"),\n WHITE_700: getCSSVar(\"white-700\", \"rgba(255, 255, 255, 0.7)\"),\n WHITE_800: getCSSVar(\"white-800\", \"rgba(255, 255, 255, 0.8)\"),\n WHITE_900: getCSSVar(\"white-900\", \"rgba(255, 255, 255, 1)\"),\n\n // Legacy alias\n WHITE: getCSSVar(\"white-900\", \"#ffffff\"),\n\n // Blue scale\n BLUE_50: getCSSVar(\"blue-50\", \"rgba(240, 249, 255, 1)\"),\n BLUE_100: getCSSVar(\"blue-100\", \"rgba(225, 243, 254, 1)\"),\n BLUE_200: getCSSVar(\"blue-200\", \"rgba(185, 229, 252, 1)\"),\n BLUE_300: getCSSVar(\"blue-300\", \"rgba(125, 211, 251, 1)\"),\n BLUE_400: getCSSVar(\"blue-400\", \"rgba(58, 190, 247, 1)\"),\n BLUE_500: getCSSVar(\"blue-500\", \"rgba(27, 173, 240, 1)\"),\n BLUE_600: getCSSVar(\"blue-600\", \"rgba(64, 114, 210, 1)\"),\n BLUE_700: getCSSVar(\"blue-700\", \"rgba(3, 105, 159, 1)\"),\n BLUE_800: getCSSVar(\"blue-800\", \"rgba(5, 69, 103, 1)\"),\n BLUE_900: getCSSVar(\"blue-900\", \"rgba(4, 38, 63, 1)\"),\n\n // Legacy alias\n BLUE: getCSSVar(\"graph-primary-blue\", \"#2D9CDB\"),\n\n // Grey scale\n GREY_50: getCSSVar(\"grey-50\", \"rgba(248, 250, 252, 1)\"),\n GREY_100: getCSSVar(\"grey-100\", \"rgba(241, 245, 249, 1)\"),\n GREY_200: getCSSVar(\"grey-200\", \"rgba(225, 231, 239, 1)\"),\n GREY_300: getCSSVar(\"grey-300\", \"rgba(200, 214, 229, 1)\"),\n GREY_400: getCSSVar(\"grey-400\", \"rgba(158, 172, 192, 1)\"),\n GREY_500: getCSSVar(\"grey-500\", \"rgba(100, 116, 139, 1)\"),\n GREY_600: getCSSVar(\"grey-600\", \"rgba(72, 86, 106, 1)\"),\n GREY_700: getCSSVar(\"grey-700\", \"rgba(51, 65, 86, 1)\"),\n GREY_800: getCSSVar(\"grey-800\", \"rgba(29, 40, 57, 1)\"),\n GREY_900: getCSSVar(\"grey-900\", \"rgba(20, 30, 53, 1)\"),\n\n // Legacy alias\n GREY: getCSSVar(\"grey-400\", \"#CCCCCC\"),\n\n // Graph primary colors\n ORANGE: getCSSVar(\"graph-primary-orange\", \"#FFA62E\"),\n RED: getCSSVar(\"graph-primary-red\", \"#FF5C64\"),\n GREEN: getCSSVar(\"graph-primary-green\", \"#A5C34E\"),\n YELLOW: getCSSVar(\"graph-primary-yellow\", \"#FBED53\"),\n PURPLE: getCSSVar(\"graph-primary-purple\", \"#7A51AB\"),\n\n // Semantic colors\n GREEN_BG: getCSSVar(\"green-bg\", \"rgba(234, 254, 229, 1)\"),\n GREEN_SUCCESS: getCSSVar(\"green-success\", \"rgba(8, 173, 55, 1)\"),\n ORANGE_BG: getCSSVar(\"orange-bg\", \"rgba(254, 250, 229, 1)\"),\n ORANGE_CAUTION: getCSSVar(\"orange-caution\", \"rgba(249, 173, 20, 1)\"),\n RED_BG: getCSSVar(\"red-bg\", \"rgba(254, 234, 229, 1)\"),\n RED_ERROR: getCSSVar(\"red-error\", \"rgba(216, 35, 44, 1)\"),\n\n // Graph secondary colors\n GRAPH_SECONDARY_BROWN: getCSSVar(\"graph-secondary-brown\", \"#AD7942\"),\n GRAPH_SECONDARY_PINK: getCSSVar(\"graph-secondary-pink\", \"#FB90B4\"),\n GRAPH_SECONDARY_TEAL: getCSSVar(\"graph-secondary-teal\", \"#3CCABA\"),\n GRAPH_SECONDARY_DARK_BLUE: getCSSVar(\"graph-secondary-dark-blue\", \"#4072D2\"),\n GRAPH_SECONDARY_BLACK: getCSSVar(\"graph-secondary-black\", \"#424E62\"),\n GRAPH_SECONDARY_GREY: getCSSVar(\"graph-secondary-grey\", \"#B4B4B4\"),\n} as const;\n\n/**\n * Chart color palette for consistent graph styling\n * Uses the primary graph colors from the design system\n */\nexport const CHART_COLORS = [\n COLORS.ORANGE,\n COLORS.RED,\n COLORS.GREEN,\n COLORS.BLUE,\n COLORS.YELLOW,\n COLORS.PURPLE,\n COLORS.GRAPH_SECONDARY_BROWN,\n COLORS.GRAPH_SECONDARY_PINK,\n COLORS.GRAPH_SECONDARY_TEAL,\n COLORS.GRAPH_SECONDARY_DARK_BLUE,\n COLORS.GRAPH_SECONDARY_BLACK,\n COLORS.GRAPH_SECONDARY_GREY,\n] as const;\n\nexport type ColorToken = keyof typeof COLORS;\n","/**\n * Constants for ChromatogramChart component\n */\n\n/**\n * Layout constants for chart margins and spacing\n */\nexport const CHROMATOGRAM_LAYOUT = {\n /** Left margin in pixels */\n MARGIN_LEFT: 70,\n /** Right margin in pixels */\n MARGIN_RIGHT: 30,\n /** Bottom margin in pixels */\n MARGIN_BOTTOM: 60,\n /** Top margin with title in pixels */\n MARGIN_TOP_WITH_TITLE: 50,\n /** Top margin without title in pixels */\n MARGIN_TOP_NO_TITLE: 30,\n /** Padding around plot area */\n MARGIN_PAD: 5,\n} as const;\n\n/**\n * Annotation constants for peak labels and markers\n */\nexport const CHROMATOGRAM_ANNOTATION = {\n /** Default vertical offset for annotation arrows (negative = above point) */\n DEFAULT_ARROW_OFFSET_Y: -30,\n /** Font size for user-defined annotations */\n USER_ANNOTATION_FONT_SIZE: 11,\n /** Font size for auto-detected peak annotations */\n AUTO_ANNOTATION_FONT_SIZE: 10,\n} as const;\n\n","/**\n * Annotation utilities for ChromatogramChart\n */\n\nimport { COLORS, CHART_COLORS } from \"../../../utils/colors\";\n\nimport { CHROMATOGRAM_ANNOTATION } from \"./constants\";\n\nimport type { PeakAnnotation, PeakWithMeta } from \"./types\";\nimport type Plotly from \"plotly.js-dist\";\n\n/**\n * Annotation slot positions for peak labels\n */\nexport const ANNOTATION_SLOTS = {\n default: { ax: 0, ay: -35 },\n overlap: [\n { ax: 50, ay: -35 }, // Right, level 1\n { ax: -60, ay: -35 }, // Left, level 1\n { ax: 70, ay: -55 }, // Right, level 2\n { ax: -80, ay: -55 }, // Left, level 2\n { ax: 50, ay: -75 }, // Right, level 3\n { ax: -60, ay: -75 }, // Left, level 3\n ],\n};\n\n/**\n * Group overlapping peaks by retention time (x) proximity\n */\nexport function groupOverlappingPeaks(\n peaksWithMeta: PeakWithMeta[],\n overlapThreshold: number\n): PeakWithMeta[][] {\n const sorted = [...peaksWithMeta].sort((a, b) => a.peak.x - b.peak.x);\n\n const groups: PeakWithMeta[][] = [];\n let currentGroup: PeakWithMeta[] = [];\n\n for (const current of sorted) {\n if (currentGroup.length === 0) {\n currentGroup.push(current);\n continue;\n }\n\n const lastInGroup = currentGroup[currentGroup.length - 1];\n const timeDiff = Math.abs(current.peak.x - lastInGroup.peak.x);\n\n if (timeDiff < overlapThreshold) {\n currentGroup.push(current);\n } else {\n groups.push(currentGroup);\n currentGroup = [current];\n }\n }\n\n if (currentGroup.length > 0) {\n groups.push(currentGroup);\n }\n\n return groups;\n}\n\n/**\n * Create a Plotly annotation for a peak.\n * seriesIndex of -1 indicates a user-defined annotation (uses grey/black styling).\n */\nexport function createPeakAnnotation(\n peak: PeakAnnotation,\n seriesIndex: number,\n slot: { ax: number; ay: number }\n): Partial<Plotly.Annotations> {\n const isUserDefined = seriesIndex === -1;\n const color = isUserDefined\n ? COLORS.GREY_500\n : CHART_COLORS[seriesIndex % CHART_COLORS.length];\n const textColor = isUserDefined ? COLORS.BLACK_900 : color;\n\n // Use provided text or auto-generate from computed area\n const text = peak.text ?? (peak._computed?.area === undefined ? \"\" : `Area: ${peak._computed.area.toFixed(2)}`);\n\n // For user-defined annotations, respect their ax/ay if provided\n const ax = isUserDefined && peak.ax !== undefined ? peak.ax : slot.ax;\n const ay = isUserDefined && peak.ay !== undefined ? peak.ay : slot.ay;\n\n return {\n x: peak.x,\n y: peak.y,\n text,\n showarrow: true,\n arrowhead: 2,\n arrowsize: 1,\n arrowwidth: 1,\n arrowcolor: color,\n ax,\n ay,\n font: {\n size: isUserDefined\n ? CHROMATOGRAM_ANNOTATION.USER_ANNOTATION_FONT_SIZE\n : CHROMATOGRAM_ANNOTATION.AUTO_ANNOTATION_FONT_SIZE,\n color: textColor,\n family: \"Inter, sans-serif\",\n },\n bgcolor: COLORS.WHITE,\n borderpad: 2,\n bordercolor: isUserDefined ? undefined : color,\n borderwidth: isUserDefined ? 0 : 1,\n };\n}\n\n/**\n * Create annotations for a group of peaks, handling overlap positioning\n */\nexport function createGroupAnnotations(\n group: PeakWithMeta[]\n): Partial<Plotly.Annotations>[] {\n if (group.length === 1) {\n const { peak, seriesIndex } = group[0];\n return [createPeakAnnotation(peak, seriesIndex, ANNOTATION_SLOTS.default)];\n }\n\n // Sort by intensity (y, lowest first) so lower peaks get closer annotations\n const sortedGroup = [...group].sort((a, b) => a.peak.y - b.peak.y);\n\n return sortedGroup.map(({ peak, seriesIndex }, slotIndex) => {\n const slot =\n ANNOTATION_SLOTS.overlap[slotIndex % ANNOTATION_SLOTS.overlap.length];\n return createPeakAnnotation(peak, seriesIndex, slot);\n });\n}\n\n","/**\n * Boundary marker utilities for ChromatogramChart\n */\n\nimport { CHART_COLORS } from \"../../../utils/colors\";\n\nimport type { PeakAnnotation, BoundaryMarkerType } from \"./types\";\nimport type Plotly from \"plotly.js-dist\";\n\n/** Base Y position for start boundary markers (below the x-axis) */\nconst BOUNDARY_MARKER_START_Y = -5;\n/** Y position for end boundary markers (below start markers) */\nconst BOUNDARY_MARKER_END_Y = -12;\n/** Y offset between series to prevent overlap */\nconst BOUNDARY_MARKER_SERIES_OFFSET = -16;\n\n/**\n * Create a marker trace for a boundary point.\n * Markers are placed on the x-axis below 0, staggered by series index.\n */\nfunction createMarkerTrace(\n xPos: number,\n yPos: number,\n markerType: BoundaryMarkerType,\n color: string\n): Plotly.Data[] {\n if (markerType === \"none\") {\n return [];\n }\n\n return [\n {\n x: [xPos],\n y: [yPos],\n type: \"scatter\" as const,\n mode: \"markers\" as const,\n marker: {\n symbol: markerType === \"diamond\" ? (\"diamond\" as const) : (\"triangle-up\" as const),\n size: 8,\n color,\n },\n showlegend: false,\n hoverinfo: \"skip\" as const,\n },\n ];\n}\n\n/**\n * Create boundary marker traces for peaks.\n * Uses per-peak startMarker/endMarker settings with defaults:\n * - startMarker: \"triangle\" (default)\n * - endMarker: \"diamond\" (default)\n */\nexport function createBoundaryMarkerTraces(\n allPeaks: {\n peaks: PeakAnnotation[];\n seriesIndex: number;\n x: number[];\n y: number[];\n }[]\n): Plotly.Data[] {\n const traces: Plotly.Data[] = [];\n\n for (const { peaks, seriesIndex, x } of allPeaks) {\n const color = CHART_COLORS[seriesIndex % CHART_COLORS.length];\n // Separate y positions for start vs end markers to prevent overlap when peaks are adjacent\n // Also stagger by series index to prevent overlap between different traces\n const startMarkerY = BOUNDARY_MARKER_START_Y + seriesIndex * BOUNDARY_MARKER_SERIES_OFFSET;\n const endMarkerY = BOUNDARY_MARKER_END_Y + seriesIndex * BOUNDARY_MARKER_SERIES_OFFSET;\n\n for (const peak of peaks) {\n const startIdx = peak._computed?.startIndex ?? 0;\n const endIdx = peak._computed?.endIndex ?? 0;\n const startX = x[startIdx];\n const endX = x[endIdx];\n\n // Get marker types with defaults: triangle at start, diamond at end\n const startMarkerType = peak.startMarker ?? \"triangle\";\n const endMarkerType = peak.endMarker ?? \"diamond\";\n\n // Create start boundary marker (upper row, staggered by series)\n traces.push(...createMarkerTrace(startX, startMarkerY, startMarkerType, color));\n\n // Create end boundary marker (lower row, staggered by series)\n traces.push(...createMarkerTrace(endX, endMarkerY, endMarkerType, color));\n }\n }\n\n return traces;\n}\n\n","/**\n * Peak detection algorithms for ChromatogramChart\n */\n\nimport type { PeakAnnotation, PeakDetectionOptions } from \"./types\";\n\n/**\n * Calculate prominence of a peak (how much it stands out from neighbors)\n */\nexport function calculateProminence(\n y: number[],\n peakIndex: number,\n searchWindow: number\n): number {\n let leftMin = y[peakIndex];\n let rightMin = y[peakIndex];\n\n for (let j = peakIndex - 1; j >= Math.max(0, peakIndex - searchWindow); j--) {\n leftMin = Math.min(leftMin, y[j]);\n }\n for (\n let j = peakIndex + 1;\n j < Math.min(y.length, peakIndex + searchWindow);\n j++\n ) {\n rightMin = Math.min(rightMin, y[j]);\n }\n\n return y[peakIndex] - Math.max(leftMin, rightMin);\n}\n\n/**\n * Find peak boundary indices by walking outward from peak\n */\nexport function findPeakBoundaries(\n y: number[],\n peakIndex: number\n): { startIndex: number; endIndex: number } {\n let startIndex = peakIndex;\n let endIndex = peakIndex;\n\n // Walk left to find start\n for (let j = peakIndex - 1; j >= 0; j--) {\n if (y[j] <= y[j + 1]) {\n startIndex = j;\n } else {\n break;\n }\n }\n\n // Walk right to find end\n for (let j = peakIndex + 1; j < y.length; j++) {\n if (y[j] <= y[j - 1]) {\n endIndex = j;\n } else {\n break;\n }\n }\n\n return { startIndex, endIndex };\n}\n\n/**\n * Calculate peak area using trapezoidal integration\n */\nexport function calculatePeakArea(\n x: number[],\n y: number[],\n startIndex: number,\n endIndex: number\n): number {\n const baselineY = Math.min(y[startIndex], y[endIndex]);\n let area = 0;\n\n for (let j = startIndex; j < endIndex; j++) {\n const h = x[j + 1] - x[j];\n const y1 = y[j] - baselineY;\n const y2 = y[j + 1] - baselineY;\n area += ((y1 + y2) * h) / 2;\n }\n\n return area;\n}\n\n/**\n * Calculate width at half maximum of a peak\n */\nexport function calculateWidthAtHalfMax(\n x: number[],\n y: number[],\n peakIndex: number,\n startIndex: number,\n endIndex: number\n): number {\n const baselineY = Math.min(y[startIndex], y[endIndex]);\n const halfMax = (y[peakIndex] + baselineY) / 2;\n let leftHalf = peakIndex;\n let rightHalf = peakIndex;\n\n for (let j = peakIndex; j >= startIndex; j--) {\n if (y[j] < halfMax) {\n leftHalf = j;\n break;\n }\n }\n for (let j = peakIndex; j <= endIndex; j++) {\n if (y[j] < halfMax) {\n rightHalf = j;\n break;\n }\n }\n\n return x[rightHalf] - x[leftHalf];\n}\n\n/**\n * Filter peaks by minimum distance, keeping more intense peaks\n */\nexport function filterPeaksByDistance(\n peaks: PeakAnnotation[],\n minDistance: number\n): PeakAnnotation[] {\n const filtered: PeakAnnotation[] = [];\n\n for (const peak of peaks) {\n const tooClose = filtered.some(\n (p) => Math.abs((p._computed?.index ?? 0) - (peak._computed?.index ?? 0)) < minDistance\n );\n if (!tooClose) {\n filtered.push(peak);\n } else if (\n filtered.length > 0 &&\n peak.y > filtered[filtered.length - 1].y\n ) {\n filtered.pop();\n filtered.push(peak);\n }\n }\n\n return filtered.sort((a, b) => a.x - b.x);\n}\n\n/**\n * Detect peaks in signal data using derivative analysis.\n *\n * Default parameters are tuned for typical HPLC chromatograms:\n * - minHeight (0.05 = 5%): Filters noise while detecting small peaks\n * - minDistance (5 points): Prevents detecting noise as multiple peaks\n * - prominence (0.02 = 2%): Ensures peaks stand out from baseline/shoulders\n */\nexport function detectPeaks(\n x: number[],\n y: number[],\n options: PeakDetectionOptions = {}\n): PeakAnnotation[] {\n const {\n minHeight = 0.05,\n minDistance = 5,\n prominence = 0.02,\n relativeThreshold = true,\n } = options;\n\n if (y.length < 3) return [];\n\n const maxY = Math.max(...y);\n const threshold = relativeThreshold ? minHeight * maxY : minHeight;\n const prominenceThreshold = relativeThreshold ? prominence * maxY : prominence;\n const searchWindow = minDistance * 3;\n\n const peaks: PeakAnnotation[] = [];\n\n // Find local maxima\n for (let i = 1; i < y.length - 1; i++) {\n const isLocalMax =\n y[i] > y[i - 1] && y[i] > y[i + 1] && y[i] >= threshold;\n if (!isLocalMax) continue;\n\n const peakProminence = calculateProminence(y, i, searchWindow);\n if (peakProminence < prominenceThreshold) continue;\n\n const { startIndex, endIndex } = findPeakBoundaries(y, i);\n const area = calculatePeakArea(x, y, startIndex, endIndex);\n const widthAtHalfMax = calculateWidthAtHalfMax(\n x,\n y,\n i,\n startIndex,\n endIndex\n );\n\n peaks.push({\n x: x[i],\n y: y[i],\n _computed: {\n area,\n index: i,\n startIndex,\n endIndex,\n widthAtHalfMax,\n },\n });\n }\n\n return filterPeaksByDistance(peaks, minDistance);\n}\n\n","/**\n * Data processing utilities for ChromatogramChart\n */\n\nimport { calculatePeakArea } from \"./peakDetection\";\n\nimport type { BaselineCorrectionMethod, PeakAnnotation } from \"./types\";\n\n/**\n * Data structure for peaks with their associated series data\n */\nexport type PeakDataWithSeries = {\n peaks: PeakAnnotation[];\n seriesIndex: number;\n x: number[];\n y: number[];\n};\n\n/**\n * Find the closest index in an array for a given target value.\n * Uses binary search for efficiency.\n */\nexport function findClosestIndex(arr: number[], target: number): number {\n if (arr.length === 0) return 0;\n if (arr.length === 1) return 0;\n\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (arr[mid] < target) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n // Check if left-1 is closer\n if (left > 0 && Math.abs(arr[left - 1] - target) < Math.abs(arr[left] - target)) {\n return left - 1;\n }\n return left;\n}\n\n/**\n * Process user annotations to convert startX/endX to startIndex/endIndex\n * and compute area if boundaries are provided.\n */\nexport function processUserAnnotations(\n annotations: PeakAnnotation[],\n xArray: number[],\n yArray: number[]\n): PeakAnnotation[] {\n return annotations.map((ann) => {\n // If startX/endX are provided, convert to indices\n if (ann.startX !== undefined && ann.endX !== undefined) {\n const startIndex = findClosestIndex(xArray, ann.startX);\n const endIndex = findClosestIndex(xArray, ann.endX);\n const index = findClosestIndex(xArray, ann.x);\n\n // Calculate area if not provided\n const area = ann._computed?.area ?? calculatePeakArea(xArray, yArray, startIndex, endIndex);\n\n return {\n ...ann,\n _computed: {\n ...ann._computed,\n index,\n startIndex,\n endIndex,\n area,\n },\n };\n }\n return ann;\n });\n}\n\n/**\n * Collect peaks with boundary information from both auto-detected peaks and user-provided annotations.\n * User-provided annotations with startIndex/endIndex or startX/endX are included for boundary marker rendering.\n */\nexport function collectPeaksWithBoundaryData(\n allDetectedPeaks: { peaks: PeakAnnotation[]; seriesIndex: number }[],\n annotations: PeakAnnotation[],\n processedSeries: { x: number[]; y: number[] }[]\n): PeakDataWithSeries[] {\n const peaksWithData: PeakDataWithSeries[] = [];\n\n // Add auto-detected peaks\n allDetectedPeaks.forEach(({ peaks, seriesIndex }) => {\n peaksWithData.push({\n peaks,\n seriesIndex,\n x: processedSeries[seriesIndex].x,\n y: processedSeries[seriesIndex].y,\n });\n });\n\n // Add user-provided annotations that have boundary info (_computed.startIndex and _computed.endIndex)\n // Note: annotations with startX/endX should already be processed to have _computed fields\n const annotationsWithBoundaries = annotations.filter(\n (ann) => ann._computed?.startIndex !== undefined && ann._computed?.endIndex !== undefined\n );\n if (annotationsWithBoundaries.length > 0 && processedSeries.length > 0) {\n peaksWithData.push({\n peaks: annotationsWithBoundaries,\n seriesIndex: 0, // User annotations apply to first series by default\n x: processedSeries[0].x,\n y: processedSeries[0].y,\n });\n }\n\n return peaksWithData;\n}\n\n/**\n * Build the extra content for Plotly hovertemplate from series metadata.\n * Displays all metadata fields as key: value pairs.\n */\nexport function buildHoverExtraContent(\n seriesName: string,\n metadata?: Record<string, unknown>\n): string {\n if (!metadata) return seriesName;\n\n const metaLines: string[] = [];\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== undefined && value !== null && value !== \"\") {\n // Format the key as Title Case (e.g., \"sampleName\" -> \"Sample Name\")\n const formattedKey = key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n metaLines.push(`${formattedKey}: ${String(value)}`);\n }\n }\n\n if (metaLines.length > 0) {\n return `${seriesName}<br>${metaLines.join(\"<br>\")}`;\n }\n return seriesName;\n}\n\n/**\n * Validate and sanitize series data.\n * - Ensures x and y arrays have the same length (truncates to shorter)\n * - Replaces NaN and Infinity values with 0\n */\nexport function validateSeriesData(\n x: number[],\n y: number[]\n): { x: number[]; y: number[] } {\n // Ensure arrays have same length\n const length = Math.min(x.length, y.length);\n const validX = x.slice(0, length);\n const validY = y.slice(0, length);\n\n // Sanitize NaN and Infinity values\n const sanitizedY = validY.map((val) => (Number.isFinite(val) ? val : 0));\n const sanitizedX = validX.map((val) => (Number.isFinite(val) ? val : 0));\n\n return { x: sanitizedX, y: sanitizedY };\n}\n\n/**\n * Apply baseline correction to signal data\n */\nexport function applyBaselineCorrection(\n y: number[],\n method: BaselineCorrectionMethod,\n windowSize: number = 50\n): number[] {\n if (method === \"none\" || y.length === 0) return y;\n\n if (method === \"linear\") {\n // Linear baseline from first to last point\n // Handle single-point case to avoid division by zero\n if (y.length === 1) {\n return [0]; // Single point baseline-corrected to zero\n }\n const slope = (y[y.length - 1] - y[0]) / (y.length - 1);\n return y.map((val, i) => val - (y[0] + slope * i));\n }\n\n if (method === \"rolling\") {\n // Rolling minimum baseline\n const baseline: number[] = [];\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < y.length; i++) {\n const start = Math.max(0, i - halfWindow);\n const end = Math.min(y.length, i + halfWindow + 1);\n const windowSlice = y.slice(start, end);\n baseline.push(Math.min(...windowSlice));\n }\n\n return y.map((val, i) => val - baseline[i]);\n }\n\n return y;\n}\n\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useMemo, useRef } from \"react\";\n\nimport { CHART_COLORS } from \"../../../utils/colors\";\n\n\nimport {\n groupOverlappingPeaks,\n createGroupAnnotations,\n} from \"./annotations\";\nimport { createBoundaryMarkerTraces } from \"./boundaryMarkers\";\nimport { CHROMATOGRAM_LAYOUT } from \"./constants\";\nimport {\n validateSeriesData,\n applyBaselineCorrection,\n buildHoverExtraContent,\n collectPeaksWithBoundaryData,\n processUserAnnotations,\n} from \"./dataProcessing\";\nimport { detectPeaks } from \"./peakDetection\";\n\nimport type {\n ChromatogramSeries,\n PeakAnnotation,\n BaselineCorrectionMethod,\n BoundaryMarkerStyle,\n BoundaryMarkerType,\n PeakDetectionOptions,\n ChromatogramChartProps,\n PeakWithMeta,\n} from \"./types\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\n\n// Re-export types for external use\nexport type {\n ChromatogramSeries,\n PeakAnnotation,\n BaselineCorrectionMethod,\n BoundaryMarkerStyle,\n BoundaryMarkerType,\n PeakDetectionOptions,\n ChromatogramChartProps,\n};\n\n\nconst ChromatogramChart: React.FC<ChromatogramChartProps> = ({\n series,\n width = 900,\n height = 500,\n title,\n xAxisTitle = \"Retention Time (min)\",\n yAxisTitle = \"Signal (mAU)\",\n annotations = [],\n xRange,\n yRange,\n showLegend = true,\n showGridX = true,\n showGridY = true,\n showMarkers = false,\n markerSize = 4,\n showCrosshairs = false,\n baselineCorrection = \"none\",\n baselineWindowSize = 50,\n peakDetectionOptions,\n showPeakAreas = false,\n boundaryMarkers = \"none\",\n annotationOverlapThreshold = 0.4,\n showExportButton = true,\n}) => {\n // Derive peak detection state from options\n const enablePeakDetection = peakDetectionOptions !== undefined;\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n\n // Memoize processed series with baseline correction\n const processedSeries = useMemo(() => {\n return series.map((s) => {\n const validated = validateSeriesData(s.x, s.y);\n return {\n ...s,\n x: validated.x,\n y: applyBaselineCorrection(validated.y, baselineCorrection, baselineWindowSize),\n };\n });\n }, [series, baselineCorrection, baselineWindowSize]);\n\n // Process user annotations to convert startX/endX to indices and compute areas\n const processedAnnotations = useMemo(() => {\n if (annotations.length === 0 || processedSeries.length === 0) {\n return annotations;\n }\n // Use first series data for index lookup (user annotations apply to first series)\n const { x, y } = processedSeries[0];\n return processUserAnnotations(annotations, x, y);\n }, [annotations, processedSeries]);\n\n // Memoize peak detection results\n const allDetectedPeaks = useMemo(() => {\n const peaks: { peaks: PeakAnnotation[]; seriesIndex: number }[] = [];\n if (enablePeakDetection && peakDetectionOptions) {\n processedSeries.forEach((s, index) => {\n const detected = detectPeaks(s.x, s.y, peakDetectionOptions);\n if (detected.length > 0) {\n peaks.push({ peaks: detected, seriesIndex: index });\n }\n });\n }\n return peaks;\n }, [processedSeries, enablePeakDetection, peakDetectionOptions]);\n\n useEffect(() => {\n const currentRef = plotRef.current;\n if (!currentRef || series.length === 0) return;\n\n // Build trace data with auto-assigned colors\n const plotData: Plotly.Data[] = processedSeries.map((s, index) => {\n const traceColor = s.color || CHART_COLORS[index % CHART_COLORS.length];\n const extraContent = buildHoverExtraContent(s.name, s.metadata);\n\n const trace: Plotly.Data = {\n x: s.x,\n y: s.y,\n type: \"scatter\" as const,\n mode: showMarkers ? \"lines+markers\" as const : \"lines\" as const,\n name: s.name,\n line: {\n color: traceColor,\n width: 1.5,\n },\n hovertemplate: `%{x:.2f} ${xAxisTitle}<br>%{y:.2f} ${yAxisTitle}<extra>${extraContent}</extra>`,\n };\n if (showMarkers) {\n trace.marker = {\n size: markerSize,\n color: traceColor,\n };\n }\n return trace;\n });\n\n // Add peak boundary markers if enabled\n if (boundaryMarkers !== \"none\") {\n const peaksWithData = collectPeaksWithBoundaryData(allDetectedPeaks, processedAnnotations, processedSeries);\n if (peaksWithData.length > 0) {\n const boundaryTraces = createBoundaryMarkerTraces(peaksWithData);\n plotData.push(...boundaryTraces);\n }\n }\n\n // Collect all peaks for unified staggering logic\n const allPeaksWithMeta: PeakWithMeta[] = [];\n\n // Add user-defined annotations (seriesIndex -1 indicates user-defined)\n processedAnnotations.forEach((ann) => {\n allPeaksWithMeta.push({ peak: ann, seriesIndex: -1 });\n });\n\n // Add auto-detected peaks if enabled\n if (showPeakAreas && enablePeakDetection) {\n allDetectedPeaks.forEach(({ peaks, seriesIndex }) => {\n peaks.forEach((peak) => {\n allPeaksWithMeta.push({ peak, seriesIndex });\n });\n });\n }\n\n // Group all overlapping peaks and create annotations with staggering\n const groups = groupOverlappingPeaks(allPeaksWithMeta, annotationOverlapThreshold);\n const plotlyAnnotations: Partial<Plotly.Annotations>[] = [];\n\n for (const group of groups) {\n plotlyAnnotations.push(...createGroupAnnotations(group));\n }\n\n const layout: Partial<Plotly.Layout> = {\n title: title\n ? {\n text: title,\n font: {\n size: 20,\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n },\n }\n : undefined,\n width,\n height,\n margin: {\n l: CHROMATOGRAM_LAYOUT.MARGIN_LEFT,\n r: CHROMATOGRAM_LAYOUT.MARGIN_RIGHT,\n b: CHROMATOGRAM_LAYOUT.MARGIN_BOTTOM,\n t: title ? CHROMATOGRAM_LAYOUT.MARGIN_TOP_WITH_TITLE : CHROMATOGRAM_LAYOUT.MARGIN_TOP_NO_TITLE,\n pad: CHROMATOGRAM_LAYOUT.MARGIN_PAD,\n },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: { family: \"Inter, sans-serif\" },\n hovermode: showCrosshairs ? \"x\" as const : \"x unified\" as const,\n dragmode: \"zoom\" as const,\n xaxis: {\n title: {\n text: xAxisTitle,\n font: { size: 14, color: theme.textSecondary, family: \"Inter, sans-serif\" },\n standoff: 15,\n },\n showgrid: showGridX,\n gridcolor: theme.gridColor,\n linecolor: theme.lineColor,\n linewidth: 1,\n range: xRange,\n autorange: !xRange,\n zeroline: false,\n tickfont: { size: 12, color: theme.textColor, family: \"Inter, sans-serif\" },\n showspikes: showCrosshairs,\n spikemode: \"across\" as const,\n spikesnap: \"cursor\" as const,\n spikecolor: theme.spikeColor,\n spikethickness: 1,\n spikedash: \"dot\" as const,\n },\n yaxis: {\n title: {\n text: yAxisTitle,\n font: { size: 14, color: theme.textSecondary, family: \"Inter, sans-serif\" },\n standoff: 10,\n },\n showgrid: showGridY,\n gridcolor: theme.gridColor,\n linecolor: theme.lineColor,\n linewidth: 1,\n range: yRange,\n autorange: !yRange,\n zeroline: false,\n tickfont: { size: 12, color: theme.textColor, family: \"Inter, sans-serif\" },\n showspikes: showCrosshairs,\n spikemode: \"across\" as const,\n spikesnap: \"cursor\" as const,\n spikecolor: theme.spikeColor,\n spikethickness: 1,\n spikedash: \"dot\" as const,\n },\n legend: {\n x: 0.5,\n y: -0.15,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: { size: 12, color: theme.textColor, family: \"Inter, sans-serif\" },\n },\n showlegend: showLegend && series.length > 1,\n annotations: plotlyAnnotations,\n };\n\n const config: Partial<Plotly.Config> = {\n responsive: true,\n displayModeBar: true,\n displaylogo: false,\n modeBarButtonsToRemove: [\n \"lasso2d\",\n \"select2d\",\n ...(showExportButton ? [] : [\"toImage\"] as Plotly.ModeBarDefaultButtons[]),\n ] as Plotly.ModeBarDefaultButtons[],\n ...(showExportButton && {\n toImageButtonOptions: {\n format: \"png\",\n filename: \"chromatogram\",\n width: width,\n height: height,\n },\n }),\n };\n\n Plotly.newPlot(currentRef, plotData, layout, config);\n\n return () => {\n if (currentRef) {\n Plotly.purge(currentRef);\n }\n };\n }, [\n processedSeries, allDetectedPeaks, series.length, width, height, title, xAxisTitle, yAxisTitle,\n processedAnnotations, xRange, yRange, showLegend, showGridX, showGridY, showMarkers, markerSize,\n showCrosshairs, enablePeakDetection, peakDetectionOptions, showPeakAreas, boundaryMarkers,\n annotationOverlapThreshold, showExportButton, theme,\n ]);\n\n return (\n <div className=\"chromatogram-chart-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { ChromatogramChart };\n\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { COLORS } from \"@/utils/colors\";\n\ntype MarkerSymbol =\n | \"circle\"\n | \"square\"\n | \"diamond\"\n | \"triangle-up\"\n | \"triangle-down\"\n | \"star\";\n\ninterface DotPlotDataSeries {\n x: number[];\n y: number[];\n name: string;\n color?: string;\n symbol?: MarkerSymbol;\n size?: number;\n}\n\ntype DotPlotVariant = \"default\" | \"stacked\";\n\ntype DotPlotProps = {\n dataSeries: DotPlotDataSeries | DotPlotDataSeries[];\n width?: number;\n height?: number;\n title?: string;\n xTitle?: string;\n yTitle?: string;\n variant?: DotPlotVariant;\n markerSize?: number;\n};\n\nconst DotPlot: React.FC<DotPlotProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n title = \"Dot Plot\",\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n variant = \"default\",\n markerSize = 8,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const seriesArray = useMemo(\n () => (Array.isArray(dataSeries) ? dataSeries : [dataSeries]),\n [dataSeries],\n );\n\n const defaultColors = useMemo(\n () => [\n COLORS.ORANGE,\n COLORS.RED,\n COLORS.GREEN,\n COLORS.BLUE,\n COLORS.YELLOW,\n COLORS.PURPLE,\n ],\n [],\n );\n\n const defaultSymbols: MarkerSymbol[] = useMemo(\n () => [\n \"circle\",\n \"square\",\n \"diamond\",\n \"triangle-up\",\n \"triangle-down\",\n \"star\",\n ],\n [],\n );\n\n const seriesWithColors = useMemo(() => {\n return seriesArray.map((series, index) => {\n if (variant === \"default\") {\n // Default variant: all circles, use first color or series color\n return {\n ...series,\n color: series.color || defaultColors[0],\n symbol: \"circle\" as MarkerSymbol,\n size: series.size || markerSize,\n };\n } else {\n // Stacked variant: different symbols and colors for each series\n return {\n ...series,\n color: series.color || defaultColors[index % defaultColors.length],\n symbol:\n series.symbol || defaultSymbols[index % defaultSymbols.length],\n size: series.size || markerSize,\n };\n }\n });\n }, [seriesArray, variant, markerSize, defaultColors, defaultSymbols]);\n\n const gridColor = theme.gridColor;\n\n const plotData = useMemo(\n () =>\n seriesWithColors.map((series) => ({\n type: \"scatter\" as const,\n x: series.x,\n y: series.y,\n mode: \"markers\" as const,\n name: series.name,\n marker: {\n color: series.color,\n size: series.size,\n symbol: series.symbol,\n line: {\n color: theme.paperBg,\n width: 1,\n },\n },\n hovertemplate: `${xTitle}: %{x}<br>${yTitle}: %{y}<extra>${series.name}</extra>`,\n })),\n [seriesWithColors, xTitle, yTitle, theme],\n );\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n const titleOptions = useMemo(\n () => ({\n text: title,\n x: 0.5,\n y: 0.95,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n font: {\n size: 32,\n weight: 600,\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n lineheight: 1.2,\n standoff: 30,\n },\n }),\n [title, theme],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const layout = {\n width,\n height,\n font: {\n family: \"Inter, sans-serif\",\n },\n title: titleOptions,\n margin: { l: 80, r: 40, b: 80, t: 80, pad: 0 },\n showlegend: true,\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 13,\n color: theme.legendColor,\n family: \"Inter, sans-serif\",\n weight: 500,\n lineheight: 18,\n },\n },\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: gridColor,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 15,\n },\n gridcolor: gridColor,\n ...tickOptions,\n },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [width, height, xTitle, yTitle, plotData, titleOptions, tickOptions, gridColor, theme]);\n\n return (\n <div className=\"dotplot-container\" style={{ width: width }}>\n <div\n ref={plotRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n margin: \"0\",\n }}\n />\n </div>\n );\n};\n\nexport { DotPlot };\nexport type { DotPlotDataSeries, DotPlotProps, DotPlotVariant, MarkerSymbol };\n","/**\n * Plate format string constants for standard microplate configurations.\n */\nexport const PLATE_FORMAT_96 = \"96\" as const;\nexport const PLATE_FORMAT_384 = \"384\" as const;\nexport const PLATE_FORMAT_1536 = \"1536\" as const;\nexport const PLATE_FORMAT_CUSTOM = \"custom\" as const;\n\n/**\n * Plate format presets for standard microplate configurations.\n * - `\"96\"`: 8 rows × 12 columns (wells A1-H12)\n * - `\"384\"`: 16 rows × 24 columns (wells A1-P24)\n * - `\"1536\"`: 32 rows × 48 columns (wells A1-AF48)\n * - `\"custom\"`: User-defined dimensions via `rows` and `columns` props\n */\nexport type PlateFormat =\n | typeof PLATE_FORMAT_96\n | typeof PLATE_FORMAT_384\n | typeof PLATE_FORMAT_1536\n | typeof PLATE_FORMAT_CUSTOM;\n\n/**\n * Visualization mode for the plate map.\n * - `\"heatmap\"`: Displays quantitative values as a continuous color gradient.\n * Use for OD readings, fluorescence intensity, or other numeric measurements.\n * - `\"categorical\"`: Displays well types with discrete colors.\n * Use for showing sample types, control positions, or experimental conditions.\n */\nexport type VisualizationMode = \"heatmap\" | \"categorical\";\n\n/**\n * Well type for categorical visualization.\n * Common types include:\n * - `\"sample\"`: Test samples (blue by default)\n * - `\"control\"`: Positive/negative controls (red by default)\n * - `\"empty\"`: Unused wells (light gray by default)\n *\n * Custom types can be added and colored via the `categoryColors` prop.\n */\nexport type WellType = \"sample\" | \"control\" | \"empty\" | string;\n\n/**\n * Color scale definition for the heatmap visualization mode.\n *\n * Can be:\n * - A named Plotly colorscale (e.g., \"Viridis\", \"Blues\", \"Hot\")\n * - An array of [position, color] tuples where position is 0-1\n *\n * @example\n * // Named colorscale\n * colorScale=\"Viridis\"\n *\n * @example\n * // Custom gradient\n * colorScale={[\n * [0, \"#313695\"], // Dark blue at min\n * [0.5, \"#ffffbf\"], // Yellow at midpoint\n * [1, \"#a50026\"], // Dark red at max\n * ]}\n */\nexport type ColorScale = string | Array<[number, string]>;\n\n/**\n * Position for the legend display.\n * - `\"right\"`: Legend appears to the right of the plate (default)\n * - `\"bottom\"`: Legend appears below the plate\n * - `\"left\"`: Legend appears to the left of the plate\n * - `\"top\"`: Legend appears above the plate\n */\nexport type LegendPosition = \"right\" | \"bottom\" | \"left\" | \"top\";\n\n/**\n * Well data for individual wells.\n *\n * @example\n * // Well with a single numeric value\n * { wellId: \"A1\", values: { \"Fluorescence\": 1500 } }\n *\n * @example\n * // Well with multiple values (creates multiple layers)\n * { wellId: \"A1\", values: { \"Raw\": 1500, \"Normalized\": 0.85, \"Status\": \"positive\" } }\n *\n * @example\n * // Well with tooltip-only data\n * { wellId: \"A1\", values: { \"Value\": 500 }, tooltipData: { compound: \"Drug A\", concentration: \"10µM\" } }\n */\nexport interface WellData {\n /**\n * Well identifier in standard microplate notation.\n * - Single letter + number for 96/384-well: \"A1\", \"H12\", \"P24\"\n * - Double letter + number for 1536-well: \"A1\", \"AA1\", \"AF48\"\n * Case-insensitive (\"a1\" and \"A1\" are equivalent).\n */\n wellId: string;\n /**\n * Named values for the well. Each key can become a visualization layer.\n *\n * - Numeric values: Displayed using heatmap visualization\n * - String values: Displayed using categorical visualization\n * - null: Empty/no data for that property\n *\n * All values are shown in the tooltip regardless of which layer is active.\n *\n * @example\n * // Well with multiple measurement values (numeric)\n * { wellId: \"A1\", values: { \"Raw\": 1500, \"Normalized\": 0.85, \"Z-Score\": 1.2 } }\n *\n * @example\n * // Well with categorical values (string)\n * { wellId: \"A1\", values: { \"Status\": \"positive\", \"QC\": \"pass\" } }\n *\n * @example\n * // Mixed numeric and categorical\n * { wellId: \"A1\", values: { \"Fluorescence\": 1500, \"Status\": \"positive\" } }\n */\n values?: Record<string, string | number | null>;\n /**\n * Optional data for tooltip display only (not visualized as layers).\n * Keys become labels, values are displayed.\n *\n * @example\n * { tooltipData: { sampleId: \"S001\", compound: \"Drug A\", concentration: \"10µM\" } }\n */\n tooltipData?: Record<string, unknown>;\n}\n\n/**\n * Configuration for auto-generated layers when using WellData with `values`.\n *\n * When wells have multiple values (via the `values` property), layers are\n * auto-generated from the unique keys. Use LayerConfig to customize the\n * display name, visualization mode, and color scale for each layer.\n *\n * @example\n * // Configure layers for wells with { values: { \"Raw\": 100, \"Normalized\": 0.5 } }\n * const layerConfigs: LayerConfig[] = [\n * { id: \"Raw\", name: \"Raw Data\", colorScale: \"Blues\" },\n * { id: \"Normalized\", name: \"Normalized Values\", valueMin: 0, valueMax: 1 },\n * ];\n */\nexport interface LayerConfig {\n /** Layer ID (must match a key in WellData.values) */\n id: string;\n /** Display name for the layer (defaults to id if not provided) */\n name?: string;\n /** Visualization mode for this layer */\n visualizationMode?: VisualizationMode;\n /** Color scale for this layer (for heatmap mode) */\n colorScale?: ColorScale;\n /** Minimum value for color scaling */\n valueMin?: number;\n /** Maximum value for color scaling */\n valueMax?: number;\n /** Value unit suffix for tooltips and colorbar (e.g., \"RFU\", \"%\"). A space is automatically added before the unit. */\n valueUnit?: string;\n /**\n * Custom colors for categorical visualization mode.\n * Keys are category values (strings from `values`), values are hex colors.\n * Merged with DEFAULT_CATEGORY_COLORS.\n */\n categoryColors?: Record<string, string>;\n}\n\n/**\n * Configuration for legend styling and positioning.\n *\n * @example\n * // Legend on the bottom with custom styling\n * legendConfig={{\n * position: \"bottom\",\n * fontSize: 14,\n * itemSpacing: 12,\n * swatchSize: 20,\n * }}\n */\nexport interface LegendConfig {\n /**\n * Position of the legend relative to the plate.\n * @default \"right\"\n */\n position?: LegendPosition;\n /**\n * Font size for legend labels in pixels.\n * @default 12\n */\n fontSize?: number;\n /**\n * Spacing between legend items in pixels.\n * @default 4\n */\n itemSpacing?: number;\n /**\n * Size of the color swatch in pixels.\n * @default 16\n */\n swatchSize?: number;\n /**\n * Title to display above the legend.\n */\n title?: string;\n}\n\n/**\n * A region to highlight on the plate (e.g., controls, sample areas, empty wells)\n */\nexport interface PlateRegion {\n /** Unique identifier for the region */\n id: string;\n /** Display name for the region (shown in legend) */\n name: string;\n /**\n * Wells included in this region using range notation.\n * Format: \"StartWell:EndWell\" (e.g., \"A1:B6\" for a rectangular block from A1 to B6)\n */\n wells: string;\n /** Border color for the region highlight */\n borderColor?: string;\n /** Border width in pixels (default: 2) */\n borderWidth?: number;\n /** Optional fill color with transparency (e.g., \"rgba(255, 0, 0, 0.1)\") */\n fillColor?: string;\n}\n\n/**\n * Props for PlateMap component\n */\nexport interface PlateMapProps {\n /**\n * Well data array as WellData objects with wellId and values.\n *\n * If wells have multiple values (via `values` property), layers are\n * auto-generated for each unique key, enabling layer toggling.\n */\n data?: WellData[];\n\n /**\n * Configuration for auto-generated layers when using WellData with `values`.\n * Use this to customize display names, colors, and ranges for each layer.\n * Only used when `data` contains wells with `values` property.\n */\n layerConfigs?: LayerConfig[];\n\n /**\n * Initial layer ID to display when the component mounts.\n * If not provided, defaults to the first layer.\n */\n initialLayerId?: string;\n\n /**\n * Optional callback notified when the active layer changes.\n * This is purely informational - the component manages layer state internally.\n * Use this for logging, analytics, or syncing with external state.\n */\n onLayerChange?: (layerId: string) => void;\n\n /** Plate format preset (default: \"96\") */\n plateFormat?: PlateFormat;\n\n /** Number of rows for custom format (default: 8 for 96-well, 16 for 384-well) */\n rows?: number;\n\n /** Number of columns for custom format (default: 12 for 96-well, 24 for 384-well) */\n columns?: number;\n\n /**\n * Visualization mode (default: \"heatmap\")\n * - \"heatmap\": Display quantitative values with color gradient\n * - \"categorical\": Display well types with discrete colors\n */\n visualizationMode?: VisualizationMode;\n\n /**\n * Custom colors for categorical visualization mode.\n * Keys are well types, values are hex colors.\n * Merged with DEFAULT_CATEGORY_COLORS.\n */\n categoryColors?: Record<string, string>;\n\n /**\n * Regions to highlight on the plate (e.g., controls, sample areas, empty wells).\n * Each region can specify wells and styling for visual distinction.\n */\n regions?: PlateRegion[];\n\n /** Chart title */\n title?: string;\n\n /** X-axis title (e.g., \"Columns\") */\n xTitle?: string;\n\n /** Y-axis title (e.g., \"Rows\") */\n yTitle?: string;\n\n /** Custom x-axis labels (overrides auto-generated column numbers) */\n xLabels?: string[] | number[];\n\n /** Custom y-axis labels (overrides auto-generated row letters) */\n yLabels?: string[] | number[];\n\n /** Color scale for the heatmap (only used in heatmap mode) */\n colorScale?: ColorScale;\n\n /** Minimum value for color scale (auto-calculated if not provided) */\n valueMin?: number;\n\n /** Maximum value for color scale (auto-calculated if not provided) */\n valueMax?: number;\n\n /** Color for empty/null wells (default: \"#f0f0f0\") */\n emptyWellColor?: string;\n\n /** Show color bar legend for heatmap mode (default: true) */\n showColorBar?: boolean;\n\n /** Show categorical legend for categorical mode (default: true) */\n showLegend?: boolean;\n\n /**\n * Configuration for legend positioning and styling.\n * Applies to both heatmap colorbar and categorical legend.\n *\n * @example\n * // Position legend at bottom with larger text\n * legendConfig={{ position: \"bottom\", fontSize: 14 }}\n */\n legendConfig?: LegendConfig;\n\n /** Chart width in pixels (default: 800) */\n width?: number;\n\n /** Chart height in pixels (default: 500) */\n height?: number;\n\n /** Number of decimal places for values (default: 0) */\n precision?: number;\n\n /**\n * Marker shape for wells (default: \"circle\")\n * - \"circle\": Round markers, ideal for plate-based data\n * - \"square\": Square markers, ideal for generic heatmaps\n */\n markerShape?: \"circle\" | \"square\";\n\n /**\n * Callback when a well/cell is clicked.\n * @param wellData - The full well data object including wellId, values, and tooltipData\n */\n onWellClick?: (wellData: WellData) => void;\n}\n\n/**\n * Result of converting WellData array to grids\n */\nexport interface WellDataGridResult {\n /** 2D grid of numeric values for the active layer */\n grid: (number | null)[][];\n /** 2D grid of string values for categorical visualization */\n categories: (string | null)[][];\n /** Map of wellId -> all values (for tooltip display) */\n allValues: Map<string, Record<string, string | number | null>>;\n /** Map of wellId -> tooltipData */\n tooltipData: Map<string, Record<string, unknown>>;\n}\n\n","import {\n PLATE_FORMAT_96,\n PLATE_FORMAT_384,\n PLATE_FORMAT_1536,\n} from \"./types\";\n\n/**\n * Default category colors for well types in categorical visualization mode.\n * Override these by passing custom colors via the `categoryColors` prop.\n */\nexport const DEFAULT_CATEGORY_COLORS: Record<string, string> = {\n sample: \"#4575b4\", // Blue\n control: \"#d73027\", // Red\n empty: \"#f0f0f0\", // Light gray\n};\n\n/**\n * Plate dimension configurations\n */\nexport const PLATE_CONFIGS: Record<\n typeof PLATE_FORMAT_96 | typeof PLATE_FORMAT_384 | typeof PLATE_FORMAT_1536,\n { rows: number; columns: number }\n> = {\n [PLATE_FORMAT_96]: { rows: 8, columns: 12 },\n [PLATE_FORMAT_384]: { rows: 16, columns: 24 },\n [PLATE_FORMAT_1536]: { rows: 32, columns: 48 },\n};\n\n/**\n * Default color scale (blue to red gradient suitable for plate data)\n */\nexport const DEFAULT_COLOR_SCALE: Array<[number, string]> = [\n [0, \"#313695\"],\n [0.1, \"#4575b4\"],\n [0.2, \"#74add1\"],\n [0.3, \"#abd9e9\"],\n [0.4, \"#e0f3f8\"],\n [0.5, \"#ffffbf\"],\n [0.6, \"#fee090\"],\n [0.7, \"#fdae61\"],\n [0.8, \"#f46d43\"],\n [0.9, \"#d73027\"],\n [1, \"#a50026\"],\n];\n\n/**\n * UI color constants for PlateMap component styling\n */\nexport const COLORS = {\n /** Primary blue color for active states */\n primary: \"#4575b4\",\n /** White background */\n white: \"#fff\",\n /** Light gray for borders */\n borderLight: \"#ccc\",\n /** Dark gray for text */\n textDark: \"#333\",\n /** Default region border color */\n regionBorder: \"#000\",\n /** Default empty well color (light gray) */\n emptyWell: \"#f0f0f0\",\n} as const;\n\n/**\n * Named Plotly colorscales converted to array format.\n * Used to extend colorscales with emptyWellColor when there are null values.\n * Reference: https://plotly.com/javascript/colorscales/\n */\nexport const NAMED_COLORSCALES: Record<string, Array<[number, string]>> = {\n Viridis: [\n [0, \"#440154\"],\n [0.25, \"#414487\"],\n [0.5, \"#2a788e\"],\n [0.75, \"#22a884\"],\n [1, \"#7ad151\"],\n ],\n Blues: [\n [0, \"#f7fbff\"],\n [0.25, \"#c6dbef\"],\n [0.5, \"#6baed6\"],\n [0.75, \"#2171b5\"],\n [1, \"#08306b\"],\n ],\n RdBu: [\n [0, \"#67001f\"],\n [0.25, \"#d6604d\"],\n [0.5, \"#f7f7f7\"],\n [0.75, \"#4393c3\"],\n [1, \"#053061\"],\n ],\n Greens: [\n [0, \"#f7fcf5\"],\n [0.25, \"#c7e9c0\"],\n [0.5, \"#74c476\"],\n [0.75, \"#238b45\"],\n [1, \"#00441b\"],\n ],\n Reds: [\n [0, \"#fff5f0\"],\n [0.25, \"#fcbba1\"],\n [0.5, \"#fb6a4a\"],\n [0.75, \"#cb181d\"],\n [1, \"#67000d\"],\n ],\n Greys: [\n [0, \"#ffffff\"],\n [0.25, \"#d9d9d9\"],\n [0.5, \"#969696\"],\n [0.75, \"#525252\"],\n [1, \"#000000\"],\n ],\n Hot: [\n [0, \"#000000\"],\n [0.33, \"#e60000\"],\n [0.66, \"#ffff00\"],\n [1, \"#ffffff\"],\n ],\n YlGnBu: [\n [0, \"#ffffd9\"],\n [0.25, \"#c7e9b4\"],\n [0.5, \"#41b6c4\"],\n [0.75, \"#225ea8\"],\n [1, \"#081d58\"],\n ],\n YlOrRd: [\n [0, \"#ffffcc\"],\n [0.25, \"#fed976\"],\n [0.5, \"#fd8d3c\"],\n [0.75, \"#e31a1c\"],\n [1, \"#800026\"],\n ],\n Plasma: [\n [0, \"#0d0887\"],\n [0.25, \"#7e03a8\"],\n [0.5, \"#cc4778\"],\n [0.75, \"#f89540\"],\n [1, \"#f0f921\"],\n ],\n};\n\n/**\n * Numeric constants for PlateMap calculations and layout\n */\nexport const PLATEMAP_CONSTANTS = {\n /** Maximum random data value for demonstration */\n MAX_RANDOM_VALUE: 50000,\n /** Sentinel value ratio for empty wells below data range */\n SENTINEL_RATIO: 0.01,\n /** Color scale data start ratio for extended scales */\n COLOR_SCALE_THRESHOLD: 0.99,\n /** Small epsilon for color scale band calculations */\n COLOR_SCALE_EPSILON: 0.001,\n /** Proportions for multi-value well display */\n MULTI_VALUE_PRIMARY_RATIO: 0.575,\n MULTI_VALUE_SECONDARY_RATIO: 0.425,\n /** Font sizes */\n FONT_SIZE_LARGE: 11,\n /** Offset for centering labels */\n LABEL_CENTER_OFFSET: -0.5,\n /** Opacity values */\n HOVER_OPACITY_FAINT: 0.15,\n HOVER_OPACITY_VISIBLE: 0.85,\n /** Layout margins */\n MARGIN_TOP: 70,\n MARGIN_RIGHT: 50,\n MARGIN_BOTTOM: 40,\n MARGIN_LEFT: 80,\n /** Colorbar dimensions */\n COLORBAR_LENGTH: 130,\n COLORBAR_X_OFFSET: 70,\n /** Domain position constants for legend placement */\n DOMAIN_COLORBAR_OFFSET: 0.15,\n DOMAIN_COLORBAR_END: 0.85,\n} as const;\n","import { PLATEMAP_CONSTANTS } from \"./constants\";\n\nimport type { WellData, WellDataGridResult, LayerConfig, LegendPosition } from \"./types\";\n\n/** ASCII code for uppercase 'A' */\nconst ASCII_UPPERCASE_A = 65;\n/** Number of letters in the alphabet */\nconst ALPHABET_LENGTH = 26;\n\n/**\n * Generate row labels (A, B, C, ... for 96-well; A-P for 384-well; A-AF for 1536-well)\n * For rows beyond Z (26), uses AA, AB, AC, etc.\n */\nexport function generateRowLabels(count: number): string[] {\n return Array.from({ length: count }, (_, i) =>\n i < ALPHABET_LENGTH\n ? String.fromCharCode(ASCII_UPPERCASE_A + i)\n : \"A\" + String.fromCharCode(ASCII_UPPERCASE_A + (i - ALPHABET_LENGTH))\n );\n}\n\n/**\n * Generate column labels (1, 2, 3, ...)\n */\nexport function generateColumnLabels(count: number): number[] {\n return Array.from({ length: count }, (_, i) => i + 1);\n}\n\n/**\n * Parse well ID to row and column indices\n * @param wellId - Well identifier (e.g., \"A1\", \"H12\", \"P24\", \"AA1\", \"AF48\")\n * @returns { row, col } zero-indexed\n */\nexport function parseWellId(wellId: string): { row: number; col: number } | null {\n // Match single letter (A-Z) or double letter (AA-AF) followed by 1-2 digits\n const match = wellId.match(/^([A-Z]{1,2})(\\d{1,2})$/i);\n if (!match) return null;\n\n const rowStr = match[1].toUpperCase();\n const row =\n rowStr.length === 1\n ? rowStr.charCodeAt(0) - ASCII_UPPERCASE_A\n : ALPHABET_LENGTH + (rowStr.charCodeAt(1) - ASCII_UPPERCASE_A);\n\n const col = parseInt(match[2], 10) - 1;\n\n return { row, col };\n}\n\n/** Parsed well position */\ninterface ParsedWellPosition {\n row: number;\n col: number;\n}\n\n/**\n * Checks if a parsed well position is within grid bounds.\n */\nfunction isValidWellPosition(\n parsed: ParsedWellPosition | null,\n rows: number,\n columns: number\n): parsed is ParsedWellPosition {\n if (!parsed) return false;\n const { row, col } = parsed;\n // Check bounds including >= 0 to prevent negative indices (e.g., \"A0\" -> col=-1)\n return row >= 0 && col >= 0 && row < rows && col < columns;\n}\n\n/**\n * Extracts the layer value from well values for the specified layer.\n */\nfunction extractLayerValue(\n values: Record<string, string | number | null> | undefined,\n layerId?: string\n): string | number | null {\n if (!values) return null;\n const effectiveLayerId = layerId ?? Object.keys(values)[0];\n return effectiveLayerId ? values[effectiveLayerId] : null;\n}\n\n/**\n * Stores the layer value in the appropriate grid based on its type.\n */\nfunction storeLayerValue(\n layerValue: string | number | null,\n row: number,\n col: number,\n grid: (number | null)[][],\n categories: (string | null)[][]\n): void {\n if (typeof layerValue === \"number\") {\n grid[row][col] = layerValue;\n } else if (typeof layerValue === \"string\") {\n categories[row][col] = layerValue;\n }\n}\n\n/**\n * Convert WellData array to 2D grids for a specific layer\n */\nexport function wellDataToGrid(\n wells: WellData[],\n rows: number,\n columns: number,\n layerId?: string\n): WellDataGridResult {\n // Initialize grids with nulls\n const grid: (number | null)[][] = Array.from({ length: rows }, () =>\n Array(columns).fill(null)\n );\n const categories: (string | null)[][] = Array.from({ length: rows }, () =>\n Array(columns).fill(null)\n );\n const allValues = new Map<string, Record<string, string | number | null>>();\n const tooltipData = new Map<string, Record<string, unknown>>();\n\n for (const well of wells) {\n const parsed = parseWellId(well.wellId);\n if (!isValidWellPosition(parsed, rows, columns)) continue;\n\n const wellIdUpper = well.wellId.toUpperCase();\n\n // Store all values for tooltip\n if (well.values) {\n allValues.set(wellIdUpper, well.values);\n }\n\n // Store tooltipData\n if (well.tooltipData) {\n tooltipData.set(wellIdUpper, well.tooltipData);\n }\n\n // Extract and store the layer value\n const layerValue = extractLayerValue(well.values, layerId);\n storeLayerValue(layerValue, parsed.row, parsed.col, grid, categories);\n }\n\n return { grid, categories, allValues, tooltipData };\n}\n\n/**\n * Calculate min/max values from grid, ignoring nulls\n */\nexport function calculateValueRange(grid: (number | null)[][]): { min: number; max: number } {\n let min = Infinity;\n let max = -Infinity;\n\n for (const row of grid) {\n for (const val of row) {\n if (val !== null && Number.isFinite(val)) {\n min = Math.min(min, val);\n max = Math.max(max, val);\n }\n }\n }\n\n // Handle case where all values are null\n if (!Number.isFinite(min)) min = 0;\n if (!Number.isFinite(max)) max = 1;\n\n // Ensure min < max\n if (min === max) {\n max = min + 1;\n }\n\n return { min, max };\n}\n\n/**\n * Check if WellData array contains multi-value wells (has `values` property)\n */\nexport function hasMultiValueWells(data: WellData[]): boolean {\n return data.some((well) => well.values && Object.keys(well.values).length > 0);\n}\n\n/**\n * Extract unique layer IDs from WellData array with `values`\n */\nexport function extractLayerIds(data: WellData[]): string[] {\n const layerIds = new Set<string>();\n for (const well of data) {\n if (well.values) {\n Object.keys(well.values).forEach((k) => layerIds.add(k));\n }\n }\n return [...layerIds];\n}\n\n/**\n * Check if a layer contains string values (categorical) or numeric values (heatmap)\n */\nexport function isStringValueLayer(data: WellData[], layerId: string): boolean {\n for (const well of data) {\n const val = well.values?.[layerId];\n if (typeof val === \"string\") {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Extract layer configs from multi-value WellData array.\n * Creates a layer entry for each unique key found in the `values` objects.\n * Merges with user-provided layerConfigs to apply custom settings.\n */\nexport function extractLayers(\n data: WellData[],\n layerConfigs?: LayerConfig[]\n): LayerConfig[] {\n const layerIds = extractLayerIds(data);\n\n return layerIds.map((id) => {\n const config = layerConfigs?.find((c) => c.id === id);\n const isStringLayer = isStringValueLayer(data, id);\n\n return {\n id,\n name: config?.name ?? id,\n // Auto-set categorical mode for string layers if not explicitly configured\n visualizationMode: config?.visualizationMode ?? (isStringLayer ? \"categorical\" : undefined),\n colorScale: config?.colorScale,\n valueMin: config?.valueMin,\n valueMax: config?.valueMax,\n valueUnit: config?.valueUnit,\n categoryColors: config?.categoryColors,\n };\n });\n}\n\n/**\n * Parse region wells from range notation like \"A1:B6\"\n * Returns the bounding box coordinates for overlay rendering\n */\nexport function parseRegionWells(\n wells: string,\n rowLabels: readonly (string | number)[],\n colLabels: readonly (string | number)[]\n): { minRow: number; maxRow: number; minCol: number; maxCol: number } | null {\n // Parse range notation like \"A1:B6\"\n const rangeMatch = wells.match(/^([A-Z]{1,2})(\\d{1,2}):([A-Z]{1,2})(\\d{1,2})$/i);\n if (!rangeMatch) {\n return null;\n }\n\n // The regex above guarantees valid well ID format, so parseWellId will always succeed\n const startWell = parseWellId(`${rangeMatch[1]}${rangeMatch[2]}`)!;\n const endWell = parseWellId(`${rangeMatch[3]}${rangeMatch[4]}`)!;\n\n const minRow = Math.min(startWell.row, endWell.row);\n const maxRow = Math.max(startWell.row, endWell.row);\n const minCol = Math.min(startWell.col, endWell.col);\n const maxCol = Math.max(startWell.col, endWell.col);\n\n // Validate bounds against actual labels\n const numRows = rowLabels.length;\n const numCols = colLabels.length;\n if (minRow >= numRows || maxRow >= numRows || minCol >= numCols || maxCol >= numCols) {\n return null;\n }\n\n return { minRow, maxRow, minCol, maxCol };\n}\n\n/** Options for building hover text for a well */\nexport interface BuildHoverTextOptions {\n wellId: string;\n value: number | null;\n allValues: Record<string, number | string | null> | undefined;\n tooltipExtra: Record<string, unknown> | undefined;\n activeLayerId: string | undefined;\n layerConfigMap: Map<string, LayerConfig>;\n precision: number;\n valueUnit: string;\n}\n\n/**\n * Builds the hover text HTML for a single well.\n * Shows all layer values with the active layer marked.\n */\nexport function buildWellHoverText({\n wellId,\n value,\n allValues,\n tooltipExtra,\n activeLayerId,\n layerConfigMap,\n precision,\n valueUnit,\n}: BuildHoverTextOptions): string {\n let text = `Well ${wellId}`;\n\n if (allValues) {\n text += formatAllLayerValues(allValues, activeLayerId, layerConfigMap, precision);\n } else if (value !== null) {\n text += `<br>Value: ${value.toFixed(precision)}${valueUnit}`;\n } else if (activeLayerId) {\n text += `<br>▶ ${activeLayerId}: -`;\n } else {\n text += `<br>No data`;\n }\n\n if (tooltipExtra) {\n text += formatTooltipExtra(tooltipExtra);\n }\n\n return text;\n}\n\n/** Formats all layer values for hover text display */\nfunction formatAllLayerValues(\n allValues: Record<string, number | string | null>,\n activeLayerId: string | undefined,\n layerConfigMap: Map<string, LayerConfig>,\n precision: number\n): string {\n let result = \"\";\n for (const [key, value] of Object.entries(allValues)) {\n const isActiveLayer = key === activeLayerId;\n const prefix = isActiveLayer ? \"▶ \" : \"\";\n const rawLayerUnit = layerConfigMap.get(key)?.valueUnit;\n const layerUnit = rawLayerUnit ? ` ${rawLayerUnit}` : \"\";\n\n if (value === null) {\n result += `<br>${prefix}${key}: -`;\n } else if (typeof value === \"number\") {\n result += `<br>${prefix}${key}: ${value.toFixed(precision)}${layerUnit}`;\n } else {\n result += `<br>${prefix}${key}: ${value.charAt(0).toUpperCase() + value.slice(1)}`;\n }\n }\n return result;\n}\n\n/** Formats tooltip extra data for display */\nfunction formatTooltipExtra(tooltipExtra: Record<string, unknown>): string {\n let result = \"\";\n for (const [key, value] of Object.entries(tooltipExtra)) {\n result += `<br>${key}: ${String(value)}`;\n }\n return result;\n}\n\n/** Colorbar configuration for a specific position */\nexport interface ColorbarConfig {\n orientation?: \"h\" | \"v\";\n thickness: number;\n len: number;\n outlinewidth: number;\n ticksuffix: string;\n x: number;\n xanchor: \"left\" | \"center\" | \"right\";\n y: number;\n yanchor: \"top\" | \"middle\" | \"bottom\";\n title?: { text: string; side: \"top\" | \"bottom\" | \"right\" };\n}\n\n/**\n * Builds the colorbar configuration based on legend position.\n */\nexport function buildColorbarConfig(\n position: LegendPosition,\n valueUnit: string,\n legendTitle?: string\n): ColorbarConfig {\n const title = legendTitle ? { text: legendTitle } : undefined;\n\n switch (position) {\n case \"bottom\":\n return {\n orientation: \"h\",\n thickness: 20,\n len: 0.75,\n outlinewidth: 0,\n ticksuffix: valueUnit,\n y: -0.15,\n yanchor: \"top\",\n x: 0.5,\n xanchor: \"center\",\n title: title ? { ...title, side: \"top\" } : undefined,\n };\n case \"top\":\n return {\n orientation: \"h\",\n thickness: 20,\n len: 0.75,\n outlinewidth: 0,\n ticksuffix: valueUnit,\n y: 1.15,\n yanchor: \"bottom\",\n x: 0.5,\n xanchor: \"center\",\n title: title ? { ...title, side: \"bottom\" } : undefined,\n };\n case \"left\":\n return {\n thickness: 28,\n len: 1,\n outlinewidth: 0,\n ticksuffix: valueUnit,\n y: 0.5,\n yanchor: \"middle\",\n x: -0.15,\n xanchor: \"right\",\n title: title ? { ...title, side: \"right\" } : undefined,\n };\n default:\n // \"right\" (default)\n return {\n thickness: 20,\n len: 0.9,\n outlinewidth: 0,\n ticksuffix: valueUnit,\n x: 0.88,\n xanchor: \"left\",\n y: 0.5,\n yanchor: \"middle\",\n title: title ? { ...title, side: \"right\" } : undefined,\n };\n }\n}\n\n/** Margin configuration for the plot */\nexport interface PlotMargins {\n l: number;\n r: number;\n b: number;\n t: number;\n pad: number;\n}\n\n/**\n * Builds the margin configuration based on legend position and title presence.\n */\nexport function buildPlotMargins(\n position: LegendPosition,\n hasTitle: boolean,\n hasYTitle: boolean\n): PlotMargins {\n const baseLeft = hasYTitle ? PLATEMAP_CONSTANTS.MARGIN_TOP : PLATEMAP_CONSTANTS.MARGIN_RIGHT;\n const baseRight = PLATEMAP_CONSTANTS.MARGIN_RIGHT;\n\n const leftMargin = position === \"left\" ? baseLeft + PLATEMAP_CONSTANTS.MARGIN_RIGHT : baseLeft;\n const rightMargin = position === \"right\" ? baseRight + PLATEMAP_CONSTANTS.MARGIN_RIGHT : baseRight;\n const bottomMargin = position === \"bottom\" ? PLATEMAP_CONSTANTS.MARGIN_LEFT : PLATEMAP_CONSTANTS.MARGIN_RIGHT;\n\n let topMargin: number;\n if (hasTitle) {\n topMargin = position === \"top\" ? PLATEMAP_CONSTANTS.COLORBAR_LENGTH : 100;\n } else {\n topMargin = position === \"top\" ? PLATEMAP_CONSTANTS.MARGIN_TOP : PLATEMAP_CONSTANTS.MARGIN_BOTTOM;\n }\n\n return { l: leftMargin, r: rightMargin, b: bottomMargin, t: topMargin, pad: 5 };\n}\n\n/**\n * Calculates the title X position based on legend position.\n */\nexport function calculateTitleX(position: LegendPosition): number {\n switch (position) {\n case \"left\":\n return PLATEMAP_CONSTANTS.MULTI_VALUE_PRIMARY_RATIO;\n case \"right\":\n return PLATEMAP_CONSTANTS.MULTI_VALUE_SECONDARY_RATIO;\n default:\n return 0.5;\n }\n}\n\n/**\n * Calculates the X-axis domain based on legend position.\n */\nexport function calculateAxisDomain(position: LegendPosition): [number, number] {\n switch (position) {\n case \"left\":\n return [PLATEMAP_CONSTANTS.DOMAIN_COLORBAR_OFFSET, 1];\n case \"right\":\n return [0, PLATEMAP_CONSTANTS.DOMAIN_COLORBAR_END];\n default:\n return [0, 1];\n }\n}\n\n/** Data arrays for scatter plot */\nexport interface ScatterPlotData {\n xData: number[];\n yData: string[];\n colorData: number[];\n textData: string[];\n}\n\n/**\n * Flattens 2D grid data into arrays for scatter plot rendering.\n */\nexport function flattenGridData(\n plotZ: (number | null)[][],\n rowLabels: (string | number)[],\n hoverText: string[][],\n rows: number,\n columns: number,\n plotZMin: number\n): ScatterPlotData {\n const xData: number[] = [];\n const yData: string[] = [];\n const colorData: number[] = [];\n const textData: string[] = [];\n\n for (let rowIdx = 0; rowIdx < rows; rowIdx++) {\n for (let colIdx = 0; colIdx < columns; colIdx++) {\n xData.push(colIdx + 1); // 1-indexed columns\n yData.push(rowLabels[rowIdx] as string);\n const zValue = plotZ[rowIdx][colIdx];\n colorData.push(zValue ?? plotZMin); // Use min value for null wells\n textData.push(hoverText[rowIdx][colIdx]);\n }\n }\n\n return { xData, yData, colorData, textData };\n}\n\n/** Marker size calculation result */\nexport interface MarkerSizeResult {\n markerSize: number;\n}\n\n/** Minimum marker size in pixels */\nconst MIN_MARKER_SIZE = 4;\n/** Size multiplier for square markers (fill entire cell) */\nconst SQUARE_SIZE_MULTIPLIER = 1.0;\n/** Size multiplier for circle markers (leave gaps) */\nconst CIRCLE_SIZE_MULTIPLIER = 0.8;\n/** Default colorbar space reservation */\nconst COLORBAR_SPACE = 100;\n\n/**\n * Calculates the marker size based on plot dimensions and marker shape.\n */\nexport function calculateMarkerSize(\n width: number,\n height: number,\n rows: number,\n columns: number,\n markerShape: \"circle\" | \"square\",\n hasTitle: boolean,\n hasYTitle: boolean\n): number {\n const leftMargin = hasYTitle ? PLATEMAP_CONSTANTS.MARGIN_TOP : PLATEMAP_CONSTANTS.MARGIN_RIGHT;\n const rightMargin = COLORBAR_SPACE; // Always reserve space for colorbar\n const topMargin = hasTitle ? COLORBAR_SPACE : PLATEMAP_CONSTANTS.MARGIN_BOTTOM;\n const bottomMargin = PLATEMAP_CONSTANTS.MARGIN_RIGHT;\n const plotWidth = width - leftMargin - rightMargin;\n const plotHeight = height - topMargin - bottomMargin;\n\n const cellWidth = plotWidth / columns;\n const cellHeight = plotHeight / rows;\n\n // Circles: use smaller dimension; Squares: use larger dimension\n const cellSize = markerShape === \"square\"\n ? Math.max(cellWidth, cellHeight)\n : Math.min(cellWidth, cellHeight);\n\n const sizeMultiplier = markerShape === \"square\" ? SQUARE_SIZE_MULTIPLIER : CIRCLE_SIZE_MULTIPLIER;\n return Math.max(MIN_MARKER_SIZE, cellSize * sizeMultiplier);\n}\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport \"./PlateMap.scss\";\nimport {\n PLATE_CONFIGS,\n DEFAULT_COLOR_SCALE,\n COLORS,\n DEFAULT_CATEGORY_COLORS,\n PLATEMAP_CONSTANTS,\n NAMED_COLORSCALES,\n} from \"./constants\";\nimport {\n PLATE_FORMAT_96,\n PLATE_FORMAT_CUSTOM,\n} from \"./types\";\nimport {\n generateRowLabels,\n generateColumnLabels,\n wellDataToGrid,\n calculateValueRange,\n hasMultiValueWells,\n extractLayers,\n parseRegionWells,\n buildWellHoverText,\n buildColorbarConfig,\n buildPlotMargins,\n calculateTitleX,\n calculateAxisDomain,\n flattenGridData,\n calculateMarkerSize,\n} from \"./utils\";\n\nimport type {\n PlateMapProps,\n LayerConfig,\n WellData,\n} from \"./types\";\n\n// Re-export types and constants for external consumers\nexport * from \"./types\";\nexport { DEFAULT_CATEGORY_COLORS } from \"./constants\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\n\n/**\n * PlateMap component for visualizing well plate data as a heatmap or categorical display.\n *\n * **Supported Plate Formats:**\n * - 96-well (8 rows × 12 columns, wells A1-H12)\n * - 384-well (16 rows × 24 columns, wells A1-P24)\n * - 1536-well (32 rows × 48 columns, wells A1-AF48)\n * - Custom dimensions with user-specified rows/columns\n *\n * **Visualization Modes:**\n * - `\"heatmap\"`: Continuous color gradient for quantitative values\n * - `\"categorical\"`: Discrete colors for well types (sample, control, empty)\n *\n * **Features:**\n * - Multiple data layers with independent visualization settings\n * - Control region highlighting with borders and fill colors\n * - Configurable color scales, tooltips, and click interactions\n * - Support for WellData arrays with multi-layer visualization\n *\n * **Data Format:**\n * - **WellData array**: `[{ wellId: \"A1\", values: { RFU: 100 }, tooltipData: {...} }, ...]`\n *\n */\nconst PlateMap: React.FC<PlateMapProps> = ({\n data,\n layerConfigs,\n initialLayerId,\n onLayerChange,\n plateFormat = PLATE_FORMAT_96,\n rows: customRows,\n columns: customColumns,\n visualizationMode: propVisualizationMode = \"heatmap\",\n categoryColors: customCategoryColors,\n regions,\n title,\n xTitle,\n yTitle,\n xLabels: customXLabels,\n yLabels: customYLabels,\n colorScale: propColorScale = DEFAULT_COLOR_SCALE,\n valueMin: propValueMin,\n valueMax: propValueMax,\n emptyWellColor = COLORS.emptyWell,\n showColorBar = true,\n showLegend = true,\n legendConfig,\n width = 800,\n height = 500,\n precision = 0,\n markerShape = \"circle\",\n onWellClick,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const onWellClickRef = useRef(onWellClick);\n onWellClickRef.current = onWellClick;\n\n // Internal state for layer toggling, initialized with initialLayerId\n const [activeLayerId, setActiveLayerId] = useState<string | undefined>(initialLayerId);\n\n // Determine plate dimensions\n let rows: number;\n let columns: number;\n\n if (plateFormat === PLATE_FORMAT_CUSTOM) {\n rows = customRows ?? 8;\n columns = customColumns ?? 12;\n } else {\n const config = PLATE_CONFIGS[plateFormat];\n rows = config.rows;\n columns = config.columns;\n }\n\n // Auto-generate layers from multi-value WellData\n const effectiveLayers = useMemo((): LayerConfig[] | null => {\n // Check if data contains multi-value wells\n if (Array.isArray(data) && data.length > 0 && \"wellId\" in (data[0] as WellData)) {\n const wellDataArray = data as WellData[];\n if (hasMultiValueWells(wellDataArray)) {\n return extractLayers(wellDataArray, layerConfigs);\n }\n }\n\n return null;\n }, [data, layerConfigs]);\n\n // Handle layer toggling - determine active layer\n const activeLayer = useMemo((): LayerConfig | null => {\n if (!effectiveLayers || effectiveLayers.length === 0) return null;\n if (activeLayerId) {\n return effectiveLayers.find((l) => l.id === activeLayerId) ?? effectiveLayers[0];\n }\n return effectiveLayers[0];\n }, [effectiveLayers, activeLayerId]);\n\n // Get effective props from active layer or default props\n // Data is always the same - we just change which layer is being visualized\n const visualizationMode = activeLayer?.visualizationMode ?? propVisualizationMode;\n const colorScale = activeLayer?.colorScale ?? propColorScale;\n const valueMin = activeLayer?.valueMin ?? propValueMin;\n const valueMax = activeLayer?.valueMax ?? propValueMax;\n // Derive valueUnit from layer config\n const valueUnit = activeLayer?.valueUnit ? ` ${activeLayer.valueUnit}` : \"\";\n\n // Merge custom category colors with defaults, including layer-specific colors\n const categoryColors = useMemo(\n () => ({ ...DEFAULT_CATEGORY_COLORS, ...customCategoryColors, ...activeLayer?.categoryColors }),\n [customCategoryColors, activeLayer?.categoryColors]\n );\n\n // Convert data to grid format - memoize to prevent re-render issues\n // Use activeLayer.id to extract the appropriate value from multi-value wells\n const activeLayerId_ = activeLayer?.id;\n const { grid, categoriesGrid, allValuesMap, tooltipDataMap } = useMemo(() => {\n let resultGrid: (number | null)[][];\n let resultCategories: (string | null)[][] = Array.from({ length: rows }, () =>\n Array(columns).fill(null)\n );\n let resultAllValues = new Map<string, Record<string, string | number | null>>();\n let resultTooltipData = new Map<string, Record<string, unknown>>();\n\n if (Array.isArray(data) && data.length > 0) {\n // WellData array format - pass activeLayerId to extract the right layer\n const result = wellDataToGrid(data, rows, columns, activeLayerId_);\n resultGrid = result.grid;\n resultCategories = result.categories;\n resultAllValues = result.allValues;\n resultTooltipData = result.tooltipData;\n } else {\n // Generate random data for demonstration when no data provided\n resultGrid = Array.from({ length: rows }, () =>\n Array.from({ length: columns }, () => Math.random() * PLATEMAP_CONSTANTS.MAX_RANDOM_VALUE)\n );\n }\n\n return { grid: resultGrid, categoriesGrid: resultCategories, allValuesMap: resultAllValues, tooltipDataMap: resultTooltipData };\n }, [data, rows, columns, activeLayerId_]);\n\n // Generate labels - use custom labels if provided, otherwise auto-generate\n const rowLabels = customYLabels ?? generateRowLabels(rows);\n const colLabels = customXLabels ?? generateColumnLabels(columns);\n\n // Calculate value range if not provided\n const range = calculateValueRange(grid);\n const zMin = valueMin ?? range.min;\n const zMax = valueMax ?? range.max;\n\n // Check if grid has any null values\n const hasNullValues = grid.some(row => row.includes(null));\n\n // Create sentinel value for empty wells (below the data range)\n // This allows us to show emptyWellColor for null cells\n const sentinelValue = zMin - (zMax - zMin) * PLATEMAP_CONSTANTS.SENTINEL_RATIO - 1;\n\n // Replace null values with sentinel for Plotly rendering\n const displayGrid = hasNullValues\n ? grid.map(row => row.map(val => val === null ? sentinelValue : val))\n : grid;\n\n // Extend colorscale to include emptyWellColor at the bottom for null values\n const effectiveColorScale = useMemo(() => {\n if (!hasNullValues) return colorScale;\n\n // Convert colorScale to array format if it's a named string scale\n let arrayColorScale: Array<[number, string]>;\n if (typeof colorScale === \"string\") {\n // Look up the named scale in our mapping\n const namedScale = NAMED_COLORSCALES[colorScale];\n if (namedScale) {\n arrayColorScale = namedScale;\n } else {\n // Unknown named scale - can't extend it, return as-is\n // This is a fallback for custom/unknown Plotly scale names\n return colorScale;\n }\n } else {\n arrayColorScale = colorScale;\n }\n\n // For array colorscales, prepend emptyWellColor at position 0\n // and shift all other positions proportionally\n const totalRange = zMax - sentinelValue;\n const dataStartRatio = (zMin - sentinelValue) / totalRange;\n\n // Create new colorscale with emptyWellColor at the bottom\n const extendedScale: Array<[number, string]> = [\n [0, emptyWellColor],\n [dataStartRatio * PLATEMAP_CONSTANTS.COLOR_SCALE_THRESHOLD, emptyWellColor], // Small band for empty wells\n ];\n\n // Remap original colorscale positions to the remaining range\n for (const [pos, color] of arrayColorScale) {\n const newPos = dataStartRatio + pos * (1 - dataStartRatio);\n extendedScale.push([newPos, color]);\n }\n\n return extendedScale;\n }, [colorScale, hasNullValues, zMin, zMax, sentinelValue, emptyWellColor]);\n\n // Effective zMin includes sentinel value if we have nulls\n const effectiveZMin = hasNullValues ? sentinelValue : zMin;\n\n // Create a lookup map for layer configs to get valueUnit for each layer\n const layerConfigMap = useMemo(() => {\n const map = new Map<string, LayerConfig>();\n if (effectiveLayers) {\n for (const layer of effectiveLayers) {\n map.set(layer.id, layer);\n }\n }\n return map;\n }, [effectiveLayers]);\n\n // Build custom hover text matrix - shows ALL values regardless of active layer\n const hoverText: string[][] = grid.map((row, rowIdx) =>\n row.map((val, colIdx) => {\n const wellId = `${rowLabels[rowIdx]}${colLabels[colIdx]}`;\n const wellIdUpper = String(wellId).toUpperCase();\n return buildWellHoverText({\n wellId,\n value: val,\n allValues: allValuesMap.get(wellIdUpper),\n tooltipExtra: tooltipDataMap.get(wellIdUpper),\n activeLayerId: activeLayer?.id,\n layerConfigMap,\n precision,\n valueUnit,\n });\n })\n );\n\n // Build categorical data for categorical mode\n const { categoricalGrid, categoricalColorScale, uniqueTypes, catMax } = useMemo(() => {\n if (visualizationMode !== \"categorical\") {\n return { categoricalGrid: null, categoricalColorScale: null, uniqueTypes: [], catMax: 0 };\n }\n\n // Collect unique categories from the categoriesGrid\n const typesSet = new Set<string>();\n let hasNullCategory = false;\n for (const row of categoriesGrid) {\n for (const category of row) {\n if (category) {\n typesSet.add(category);\n } else {\n hasNullCategory = true;\n }\n }\n }\n // Only include \"empty\" if there are actual null wells\n if (hasNullCategory) {\n typesSet.add(\"empty\");\n }\n const types = [...typesSet].sort();\n\n // Create numeric grid where each category maps to an index\n const typeToIndex = new Map<string, number>();\n types.forEach((type, idx) => typeToIndex.set(type, idx));\n\n const catGrid: number[][] = categoriesGrid.map((row) =>\n row.map((category) => {\n if (category === null) {\n return typeToIndex.get(\"empty\") ?? 0;\n }\n return typeToIndex.get(category) ?? typeToIndex.get(\"empty\") ?? 0;\n })\n );\n\n // Build discrete colorscale for categories\n // The grid contains integer indices 0, 1, 2, ... (numTypes - 1)\n // With cmin=0 and cmax=numTypes-1, Plotly maps:\n // index 0 -> normalized 0.0\n // index (numTypes-1) -> normalized 1.0\n // We need each index to map to a distinct color band\n const numTypes = types.length;\n const catColorScale: Array<[number, string]> = [];\n\n if (numTypes === 1) {\n // Single type: entire range is one color\n const color = categoryColors[types[0]] || emptyWellColor;\n catColorScale.push([0, color]);\n catColorScale.push([1, color]);\n } else {\n // Multiple types: create bands for each index\n // Index i maps to normalized value i / (numTypes - 1)\n types.forEach((type, idx) => {\n const color = categoryColors[type] || emptyWellColor;\n const normalizedPos = idx / (numTypes - 1);\n // Create a small band around each position\n const bandHalf = 0.5 / (numTypes - 1);\n const start = Math.max(0, normalizedPos - bandHalf);\n const end = Math.min(1, normalizedPos + bandHalf - PLATEMAP_CONSTANTS.COLOR_SCALE_EPSILON);\n catColorScale.push([start, color]);\n catColorScale.push([end, color]);\n });\n }\n\n // cmax should be numTypes - 1 to match the index range\n return { categoricalGrid: catGrid, categoricalColorScale: catColorScale, uniqueTypes: types, catMax: numTypes - 1 };\n }, [visualizationMode, categoriesGrid, categoryColors, emptyWellColor]);\n\n // Build Plotly shapes for highlighted regions\n const regionShapes = useMemo(() => {\n if (!regions || regions.length === 0) {\n return [];\n }\n\n const shapes: Array<Partial<Plotly.Shape>> = [];\n\n for (const region of regions) {\n const bounds = parseRegionWells(region.wells, rowLabels, colLabels);\n if (!bounds) continue;\n\n // Plotly heatmap uses the actual label values for positioning.\n // colLabels are 1-indexed (1, 2, 3, ...), so we need to convert from 0-indexed bounds.\n // Each cell is centered on its label, so we offset by inset to cover the cell.\n // For columns: bounds.minCol=0 means column label 1, so x0 = 1 - inset\n // For rows: bounds.minRow=0 means row index 0, which is correct for y-axis\n //\n // Use 0.49 inset to place boundary just inside cell edge,\n // avoiding line doubling when adjacent regions share a border\n const inset = 0.49;\n const x0 = (bounds.minCol + 1) - inset;\n const x1 = (bounds.maxCol + 1) + inset;\n const y0 = bounds.minRow - inset;\n const y1 = bounds.maxRow + inset;\n\n shapes.push({\n type: \"rect\",\n xref: \"x\",\n yref: \"y\",\n x0,\n x1,\n y0,\n y1,\n line: {\n color: region.borderColor || COLORS.textDark,\n width: region.borderWidth ?? 2,\n },\n fillcolor: region.fillColor || \"transparent\",\n layer: \"above\",\n });\n }\n\n return shapes;\n }, [regions, rowLabels, colLabels]);\n\n useEffect(() => {\n const currentRef = plotRef.current;\n if (!currentRef) return;\n\n // Determine which grid and colorscale to use based on mode\n const isCategorical = visualizationMode === \"categorical\";\n const plotZ = isCategorical && categoricalGrid ? categoricalGrid : displayGrid;\n const plotColorScale = isCategorical && categoricalColorScale ? categoricalColorScale : effectiveColorScale;\n const plotZMin = isCategorical ? 0 : effectiveZMin;\n const plotZMax = isCategorical ? (catMax || 1) : zMax;\n const plotShowScale = isCategorical ? false : showColorBar;\n\n // Flatten 2D grid data into arrays for scatter plot\n const { xData, yData, colorData, textData } = flattenGridData(\n plotZ,\n rowLabels,\n hoverText,\n rows,\n columns,\n plotZMin\n );\n\n // Calculate marker size based on plot dimensions\n const markerSize = calculateMarkerSize(\n width,\n height,\n rows,\n columns,\n markerShape,\n !!title,\n !!yTitle\n );\n\n // Create scatter plot with markers\n const plotData: Plotly.Data[] = [\n {\n x: xData,\n y: yData,\n mode: \"markers\" as const,\n type: \"scatter\" as const,\n marker: {\n symbol: markerShape,\n size: markerSize,\n color: colorData,\n colorscale: plotColorScale,\n cmin: plotZMin,\n cmax: plotZMax,\n showscale: plotShowScale,\n colorbar: buildColorbarConfig(\n legendConfig?.position ?? \"right\",\n valueUnit,\n legendConfig?.title\n ),\n line: {\n color: theme.gridColor,\n width: 1,\n },\n },\n hoverinfo: \"text\" as const,\n text: textData,\n },\n ];\n\n const legendPosition = legendConfig?.position ?? \"right\";\n\n const layout = {\n autosize: false, // Prevent auto-sizing to maintain consistent layout\n title: title\n ? {\n text: title,\n font: {\n family: \"Inter, sans-serif\",\n size: 20,\n color: theme.textSecondary,\n },\n x: calculateTitleX(legendPosition),\n xanchor: \"center\" as const,\n y: 0.98,\n yanchor: \"top\" as const,\n }\n : undefined,\n width,\n height,\n margin: buildPlotMargins(legendPosition, !!title, !!yTitle),\n xaxis: {\n title: {\n text: xTitle || \"\",\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n },\n standoff: 15,\n },\n side: \"top\" as const,\n fixedrange: true,\n dtick: 1,\n range: [0.5, columns + 0.5], // Explicit range to prevent auto-padding\n automargin: false, // Prevent auto margin adjustment\n tickmode: \"array\" as const,\n tickvals: Array.from({ length: columns }, (_, i) => i + 1),\n ticktext: colLabels.map(String),\n tickangle: 0, // Keep labels horizontal\n tickfont: { size: columns > 24 ? 8 : PLATEMAP_CONSTANTS.FONT_SIZE_LARGE }, // Smaller font for high-density plates\n // Adjust domain based on legend position to prevent colorbar overlap\n domain: calculateAxisDomain(legendPosition),\n },\n yaxis: {\n title: {\n text: yTitle || \"\",\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n },\n standoff: 15,\n },\n fixedrange: true,\n dtick: 1,\n range: [rows + PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET, PLATEMAP_CONSTANTS.LABEL_CENTER_OFFSET], // Reversed range: high to low puts row A at top\n automargin: false, // Prevent auto margin adjustment\n tickmode: \"array\" as const,\n tickvals: Array.from({ length: rows }, (_, i) => i),\n ticktext: rowLabels.map(String),\n tickfont: { size: rows > 16 ? 8 : PLATEMAP_CONSTANTS.FONT_SIZE_LARGE }, // Smaller font for high-density plates\n },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n color: theme.textSecondary,\n },\n shapes: regionShapes,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(currentRef, plotData, layout, config);\n\n // Always attach click handler - check onWellClickRef.current inside callback\n // This ensures handler is registered even if onWellClick is provided after initial render\n (currentRef as unknown as Plotly.PlotlyHTMLElement).on(\"plotly_click\", (eventData: Plotly.PlotMouseEvent) => {\n if (!onWellClickRef.current) return;\n const point = eventData.points[0];\n if (point) {\n // Cast labels to handle union type\n const rowLabelsArr = rowLabels as (string | number)[];\n const colLabelsArr = colLabels as (string | number)[];\n const rowIdx = rowLabelsArr.indexOf(point.y as string | number);\n const colIdx = colLabelsArr.indexOf(point.x as string | number);\n if (rowIdx >= 0 && colIdx >= 0) {\n const wellId = `${rowLabelsArr[rowIdx]}${colLabelsArr[colIdx]}`;\n const wellIdUpper = String(wellId).toUpperCase();\n // Get all values and tooltipData for this well\n const allValues = allValuesMap.get(wellIdUpper);\n const tooltipData = tooltipDataMap.get(wellIdUpper);\n const wellData: WellData = {\n wellId,\n values: allValues,\n tooltipData,\n };\n onWellClickRef.current?.(wellData);\n }\n }\n });\n\n return () => {\n if (currentRef) {\n Plotly.purge(currentRef);\n }\n };\n }, [\n displayGrid,\n colLabels,\n rowLabels,\n effectiveColorScale,\n showColorBar,\n effectiveZMin,\n zMax,\n valueUnit,\n title,\n xTitle,\n yTitle,\n width,\n height,\n hoverText,\n precision,\n tooltipDataMap,\n allValuesMap,\n grid,\n visualizationMode,\n categoricalGrid,\n categoricalColorScale,\n uniqueTypes.length,\n catMax,\n regionShapes,\n rows,\n columns,\n legendConfig,\n markerShape,\n theme,\n ]);\n\n // Render layer selector tabs\n const renderLayerSelector = () => {\n if (!effectiveLayers || effectiveLayers.length <= 1) {\n return null;\n }\n\n return (\n <div className=\"platemap-layer-selector\">\n {effectiveLayers.map((layer) => {\n const isActive = activeLayer?.id === layer.id;\n return (\n <Button\n key={layer.id}\n variant={isActive ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => {\n setActiveLayerId(layer.id);\n onLayerChange?.(layer.id);\n }}\n >\n {layer.name}\n </Button>\n );\n })}\n </div>\n );\n };\n\n // Legend configuration with defaults\n const legendPosition = legendConfig?.position ?? \"right\";\n const legendFontSize = legendConfig?.fontSize ?? 12;\n const legendItemSpacing = legendConfig?.itemSpacing ?? 4;\n const legendSwatchSize = legendConfig?.swatchSize ?? 16;\n const legendTitle = legendConfig?.title;\n\n // Fixed width for categorical legend to prevent layout shift\n const legendWidth = 120;\n\n // Determine if legend is horizontal (top/bottom) or vertical (left/right)\n const isHorizontalLegend = legendPosition === \"top\" || legendPosition === \"bottom\";\n\n // Render legend (categorical types and/or regions)\n const renderLegend = () => {\n const hasCategoricalItems = visualizationMode === \"categorical\" && uniqueTypes.length > 0;\n const hasRegions = regions && regions.length > 0;\n\n if (!showLegend || (!hasCategoricalItems && !hasRegions)) {\n // Return empty placeholder to maintain consistent width (only for vertical legends)\n if (!isHorizontalLegend) {\n return <div className=\"platemap-legend-placeholder\" style={{ width: legendWidth }} />;\n }\n return null;\n }\n\n // Build legend class names\n const legendClassNames = [\"platemap-legend\"];\n if (isHorizontalLegend) {\n legendClassNames.push(\"platemap-legend--horizontal\");\n } else if (legendPosition === \"left\") {\n legendClassNames.push(\"platemap-legend--left\");\n } else if (legendPosition === \"right\") {\n legendClassNames.push(\"platemap-legend--right\");\n }\n\n // Dynamic styles that depend on props\n const legendStyle: React.CSSProperties = {\n gap: `${legendItemSpacing}px`,\n width: isHorizontalLegend ? undefined : legendWidth,\n };\n\n return (\n <div className={legendClassNames.join(\" \")} style={legendStyle}>\n {legendTitle && (\n <div\n className={`platemap-legend__title${isHorizontalLegend ? \" platemap-legend__title--horizontal\" : \"\"}`}\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {legendTitle}\n </div>\n )}\n {/* Categorical type items */}\n {hasCategoricalItems &&\n uniqueTypes.map((type) => (\n <div key={type} className=\"platemap-legend__item\">\n <div\n className=\"platemap-legend__swatch\"\n style={{\n width: `${legendSwatchSize}px`,\n height: `${legendSwatchSize}px`,\n backgroundColor: categoryColors[type] || emptyWellColor,\n }}\n />\n <span\n className=\"platemap-legend__label platemap-legend__label--capitalize\"\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {type}\n </span>\n </div>\n ))}\n {/* Region items */}\n {hasRegions &&\n regions.map((region) => (\n <div key={region.id} className=\"platemap-legend__item\">\n <div\n className=\"platemap-legend__swatch platemap-legend__swatch--region\"\n style={{\n width: `${legendSwatchSize}px`,\n height: `${legendSwatchSize}px`,\n backgroundColor: region.fillColor || \"transparent\",\n border: `${region.borderWidth || 2}px solid ${region.borderColor || COLORS.regionBorder}`,\n }}\n />\n <span\n className=\"platemap-legend__label\"\n style={{ fontSize: `${legendFontSize}px` }}\n >\n {region.name}\n </span>\n </div>\n ))}\n </div>\n );\n };\n\n // Build the plot content based on legend position\n const plotContent = <div ref={plotRef} className=\"platemap-plot\" style={{ width, height }} />;\n const legendContent = renderLegend();\n\n const renderPlotWithLegend = () => {\n switch (legendPosition) {\n case \"left\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--vertical\">\n {legendContent}\n {plotContent}\n </div>\n );\n case \"top\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--horizontal\">\n {legendContent}\n {plotContent}\n </div>\n );\n case \"bottom\":\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--horizontal\">\n {plotContent}\n {legendContent}\n </div>\n );\n case \"right\":\n default:\n return (\n <div className=\"platemap-plot-wrapper platemap-plot-wrapper--vertical\">\n {plotContent}\n {legendContent}\n </div>\n );\n }\n };\n\n return (\n <div className=\"platemap-container\" style={{ width: isHorizontalLegend ? undefined : width }}>\n {renderLayerSelector()}\n {renderPlotWithLegend()}\n </div>\n );\n};\n\nexport { PlateMap };","import React, { useMemo } from \"react\";\n\nimport { PlateMap } from \"../PlateMap\";\n\nimport type { ColorScale, WellData } from \"../PlateMap\";\n\n/**\n * Props for the Heatmap component\n * @deprecated Use PlateMap component instead. Heatmap is now a wrapper around PlateMap for backward compatibility.\n */\ninterface HeatmapProps {\n /** 2D array of numeric values */\n data?: number[][];\n /** Custom x-axis labels (column labels) */\n xLabels?: string[] | number[];\n /** Custom y-axis labels (row labels) */\n yLabels?: string[] | number[];\n /** Chart title */\n title?: string;\n /** X-axis title */\n xTitle?: string;\n /** Y-axis title */\n yTitle?: string;\n /** Color scale - string name or array of [position, color] pairs */\n colorscale?: string | Array<[number, string]>;\n /** Chart width in pixels */\n width?: number;\n /** Chart height in pixels */\n height?: number;\n /** Show color scale legend */\n showScale?: boolean;\n /** Number of decimal places for values */\n precision?: number;\n /** Minimum value for color scale */\n zmin?: number;\n /** Maximum value for color scale */\n zmax?: number;\n /** Value unit suffix */\n valueUnit?: string;\n}\n\n/**\n * Heatmap component for 2D data visualization\n * @deprecated Use PlateMap component instead. This component is now a wrapper around PlateMap for backward compatibility.\n *\n * @example\n * ```tsx\n * <Heatmap\n * data={[[1, 2, 3], [4, 5, 6]]}\n * xLabels={['A', 'B', 'C']}\n * yLabels={['Row 1', 'Row 2']}\n * title=\"My Heatmap\"\n * />\n * ```\n */\n/**\n * Normalize jagged 2D array to consistent width (backward compatibility)\n */\nfunction normalizeData(data: number[][]): number[][] {\n if (!data || data.length === 0) return [];\n\n const maxLength = Math.max(...data.map((row) => row.length));\n\n return data.map((row) => {\n if (row.length === maxLength) return row;\n\n const newRow = [...row];\n while (newRow.length < maxLength) {\n newRow.push(0);\n }\n return newRow;\n });\n}\n\nconst Heatmap: React.FC<HeatmapProps> = ({\n data,\n xLabels,\n yLabels,\n title,\n xTitle,\n yTitle,\n colorscale,\n width = 800,\n height = 600,\n showScale = true,\n precision = 0,\n zmin,\n zmax,\n valueUnit = \"\",\n}) => {\n // Normalize jagged arrays to consistent width (backward compatibility)\n const normalizedData = data ? normalizeData(data) : undefined;\n\n // Determine rows and columns from normalized data or labels\n const rows = normalizedData?.length ?? (yLabels?.length ?? 16);\n const columns = normalizedData?.[0]?.length ?? (xLabels?.length ?? 24);\n\n // Convert 2D array to WellData format for PlateMap\n const wellData: WellData[] | undefined = useMemo(() => {\n if (!normalizedData) return;\n\n const defaultRows = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const wells: WellData[] = [];\n\n for (let r = 0; r < normalizedData.length; r++) {\n for (let c = 0; c < normalizedData[r].length; c++) {\n const rowLabel = yLabels?.[r]?.toString() ?? defaultRows[r] ?? `R${r + 1}`;\n const colLabel = xLabels?.[c]?.toString() ?? String(c + 1);\n const wellId = `${rowLabel}${colLabel}`;\n wells.push({ wellId, values: { Value: normalizedData[r][c] } });\n }\n }\n return wells;\n }, [normalizedData, xLabels, yLabels]);\n\n // Pass colorscale directly - PlateMap's ColorScale type supports both string and array formats\n const plateMapColorScale: ColorScale | undefined = colorscale;\n\n return (\n <PlateMap\n data={wellData}\n plateFormat=\"custom\"\n rows={rows}\n columns={columns}\n title={title}\n xTitle={xTitle}\n yTitle={yTitle}\n xLabels={xLabels}\n yLabels={yLabels}\n colorScale={plateMapColorScale}\n valueMin={zmin}\n valueMax={zmax}\n showColorBar={showScale}\n width={width}\n height={height}\n layerConfigs={[{ id: \"Value\", valueUnit }]}\n precision={precision}\n />\n );\n};\n\nexport { Heatmap };\nexport type { HeatmapProps };\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { COLORS } from \"@/utils/colors\";\nimport \"./Histogram.scss\";\n\n/** Exponent coefficient for normal distribution calculation */\nconst NORMAL_DISTRIBUTION_EXPONENT_COEFF = -0.5;\n\ninterface HistogramDataSeries {\n x: number[];\n name: string;\n color?: string;\n autobinx?: boolean;\n xbins?: {\n start: number;\n end: number;\n size: number;\n };\n opacity?: number;\n showDistributionLine?: boolean;\n lineWidth?: number;\n}\n\ntype HistogramProps = {\n dataSeries: HistogramDataSeries | HistogramDataSeries[];\n width?: number;\n height?: number;\n title?: string;\n xTitle?: string;\n yTitle?: string;\n bargap?: number;\n showDistributionLine?: boolean;\n};\n\nconst calculateMean = (data: number[]): number => {\n const sum = data.reduce((acc, val) => acc + val, 0);\n return sum / data.length;\n};\n\nconst calculateStdDev = (data: number[], mean: number): number => {\n const squaredDiffs = data.map((value) => Math.pow(value - mean, 2));\n const variance =\n squaredDiffs.reduce((acc, val) => acc + val, 0) / data.length;\n return Math.sqrt(variance);\n};\n\nconst generateNormalDistributionPoints = (\n mean: number,\n stdDev: number,\n start: number,\n end: number,\n points = 100\n): { x: number[]; y: number[] } => {\n const xValues: number[] = [];\n const yValues: number[] = [];\n\n const step = (end - start) / (points - 1);\n\n for (let i = 0; i < points; i++) {\n const x = start + i * step;\n xValues.push(x);\n\n const exponent = NORMAL_DISTRIBUTION_EXPONENT_COEFF * Math.pow((x - mean) / stdDev, 2);\n const y = (1 / (stdDev * Math.sqrt(2 * Math.PI))) * Math.exp(exponent);\n yValues.push(y);\n }\n\n return { x: xValues, y: yValues };\n};\n\nconst scaleDistributionCurve = (\n yValues: number[],\n histogramData: number[],\n bins: { start: number; end: number; size: number }\n): number[] => {\n const binCount = Math.ceil((bins.end - bins.start) / bins.size);\n const binFrequencies = Array(binCount).fill(0);\n\n histogramData.forEach((value) => {\n if (value >= bins.start && value <= bins.end) {\n const binIndex = Math.floor((value - bins.start) / bins.size);\n binFrequencies[binIndex]++;\n }\n });\n\n const maxBinFrequency = Math.max(...binFrequencies);\n const maxCurveValue = Math.max(...yValues);\n\n const scaleFactor = maxBinFrequency / maxCurveValue;\n\n return yValues.map((y) => y * scaleFactor);\n};\n\nconst Histogram: React.FC<HistogramProps> = ({\n dataSeries,\n width = 480,\n height = 480,\n title = \"Histogram\",\n xTitle = \"X Axis\",\n yTitle = \"Frequency\",\n bargap = 0.2,\n showDistributionLine = false,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n const seriesArray = useMemo(\n () => (Array.isArray(dataSeries) ? dataSeries : [dataSeries]),\n [dataSeries],\n );\n const effectiveBarMode = useMemo<\n \"stack\" | \"group\" | \"overlay\" | \"relative\" | undefined\n >(() => (seriesArray.length > 1 ? \"stack\" : undefined), [seriesArray.length]);\n\n const defaultColors = useMemo(\n () => [\n COLORS.ORANGE,\n COLORS.RED,\n COLORS.BLUE,\n COLORS.GREEN,\n COLORS.PURPLE,\n COLORS.YELLOW,\n ],\n [],\n );\n\n const seriesWithColors = useMemo(() => {\n return seriesArray.map((series, index) => {\n const hasDistributionLine =\n typeof series.showDistributionLine === \"undefined\"\n ? showDistributionLine\n : series.showDistributionLine;\n\n return {\n ...series,\n color: series.color || defaultColors[index % defaultColors.length],\n opacity: hasDistributionLine ? 0.5 : series.opacity || 1,\n showDistributionLine: hasDistributionLine,\n lineWidth: series.lineWidth || 3,\n };\n });\n }, [seriesArray, showDistributionLine, defaultColors]);\n\n const gridColor = theme.gridColor;\n\n const histogramData = useMemo(\n () =>\n seriesWithColors.map((series) => ({\n type: \"histogram\" as const,\n x: series.x,\n name: series.name,\n marker: {\n color: series.color,\n line: {\n color: theme.paperBg,\n width: 1,\n },\n opacity: series.opacity,\n },\n autobinx: series.autobinx,\n xbins: series.xbins,\n hovertemplate: `${xTitle}: %{x}<br>${yTitle}: %{y}<extra>${series.name}</extra>`,\n })),\n [seriesWithColors, xTitle, yTitle, theme],\n );\n\n const distributionLines = useMemo(\n () =>\n seriesWithColors\n .filter((series) => series.showDistributionLine)\n .map((series) => {\n const mean = calculateMean(series.x);\n const stdDev = calculateStdDev(series.x, mean);\n\n const min = Math.min(...series.x);\n const max = Math.max(...series.x);\n const range = max - min;\n const start = min - range * 0.1;\n const end = max + range * 0.1;\n\n const bins = series.xbins || {\n start: start,\n end: end,\n size: range / 10,\n };\n\n const curvePoints = generateNormalDistributionPoints(\n mean,\n stdDev,\n start,\n end,\n 100,\n );\n\n const scaledYValues = scaleDistributionCurve(\n curvePoints.y,\n series.x,\n bins,\n );\n\n return {\n type: \"scatter\" as const,\n x: curvePoints.x,\n y: scaledYValues,\n mode: \"lines\" as const,\n name: `${series.name} Distribution`,\n line: {\n color: series.color,\n width: series.lineWidth,\n },\n hoverinfo: \"none\" as const,\n };\n }),\n [seriesWithColors],\n );\n\n const plotData = useMemo(\n () => [...histogramData, ...distributionLines],\n [histogramData, distributionLines],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const layout = {\n width,\n height,\n font: {\n family: \"Inter, sans-serif\",\n },\n showlegend: false,\n margin: { l: 90, r: 40, b: 80, t: 40 },\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 20,\n },\n gridcolor: gridColor,\n tickcolor: theme.tickColor,\n ticklen: 8,\n tickwidth: 1,\n ticks: \"outside\" as const,\n linecolor: theme.lineColor,\n linewidth: 1,\n zeroline: false,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 20,\n },\n gridcolor: gridColor,\n tickcolor: theme.tickColor,\n ticklen: 8,\n tickwidth: 1,\n ticks: \"outside\" as const,\n linecolor: theme.lineColor,\n linewidth: 1,\n zeroline: false,\n rangemode: \"tozero\" as const,\n },\n barmode: effectiveBarMode,\n bargap: bargap,\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [width, height, xTitle, yTitle, bargap, plotData, effectiveBarMode, gridColor, theme]);\n\n const ChartLegend: React.FC<{\n series: Array<{ name: string; color: string }>;\n }> = ({ series }) => {\n const items = series.map((item, i) => (\n <React.Fragment key={item.name}>\n <div className=\"legend-item\">\n <span className=\"color-box\" style={{ background: item.color }} />\n {item.name}\n {i < series.length - 1 && <span className=\"divider\" />}\n </div>\n </React.Fragment>\n ));\n\n const rows = [];\n const rowSize = 6;\n for (let i = 0; i < items.length; i += rowSize) {\n rows.push(\n <div className=\"legend-row\" key={i}>\n {items.slice(i, i + rowSize)}\n </div>\n );\n }\n\n return <div className=\"legend-container\">{rows}</div>;\n };\n\n return (\n <div className=\"histogram-container\" style={{ width: width }}>\n <div className=\"chart-container\">\n {title && (\n <div className=\"title-container\">\n <h2 className=\"title\">{title}</h2>\n </div>\n )}\n <div\n ref={plotRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n margin: \"0\",\n }}\n />\n <ChartLegend series={seriesWithColors} />\n </div>\n </div>\n );\n};\n\nexport { Histogram };\nexport type { HistogramDataSeries, HistogramProps };\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\n\ntype MarkerSymbol =\n | \"circle\"\n | \"circle-open\"\n | \"circle-dot\"\n | \"circle-open-dot\"\n | \"square\"\n | \"square-open\"\n | \"square-dot\"\n | \"square-open-dot\"\n | \"diamond\"\n | \"diamond-open\"\n | \"diamond-dot\"\n | \"diamond-open-dot\"\n | \"cross\"\n | \"cross-open\"\n | \"cross-dot\"\n | \"cross-open-dot\"\n | \"x\"\n | \"x-open\"\n | \"x-dot\"\n | \"x-open-dot\"\n | \"triangle-up\"\n | \"triangle-up-open\"\n | \"triangle-up-dot\"\n | \"triangle-up-open-dot\"\n | \"triangle-down\"\n | \"triangle-down-open\"\n | \"triangle-down-dot\"\n | \"triangle-down-open-dot\"\n | \"triangle-left\"\n | \"triangle-left-open\"\n | \"triangle-left-dot\"\n | \"triangle-left-open-dot\"\n | \"triangle-right\"\n | \"triangle-right-open\"\n | \"triangle-right-dot\"\n | \"triangle-right-open-dot\"\n | \"triangle-ne\"\n | \"triangle-ne-open\"\n | \"triangle-ne-dot\"\n | \"triangle-ne-open-dot\"\n | \"triangle-se\"\n | \"triangle-se-open\"\n | \"triangle-se-dot\"\n | \"triangle-se-open-dot\"\n | \"triangle-sw\"\n | \"triangle-sw-open\"\n | \"triangle-sw-dot\"\n | \"triangle-sw-open-dot\"\n | \"triangle-nw\"\n | \"triangle-nw-open\"\n | \"triangle-nw-dot\"\n | \"triangle-nw-open-dot\"\n | \"pentagon\"\n | \"pentagon-open\"\n | \"pentagon-dot\"\n | \"pentagon-open-dot\"\n | \"hexagon\"\n | \"hexagon-open\"\n | \"hexagon-dot\"\n | \"hexagon-open-dot\"\n | \"hexagon2\"\n | \"hexagon2-open\"\n | \"hexagon2-dot\"\n | \"hexagon2-open-dot\"\n | \"octagon\"\n | \"octagon-open\"\n | \"octagon-dot\"\n | \"octagon-open-dot\"\n | \"star\"\n | \"star-open\"\n | \"star-dot\"\n | \"star-open-dot\"\n | \"hexagram\"\n | \"hexagram-open\"\n | \"hexagram-dot\"\n | \"hexagram-open-dot\"\n | \"star-triangle-up\"\n | \"star-triangle-up-open\"\n | \"star-triangle-up-dot\"\n | \"star-triangle-up-open-dot\"\n | \"star-triangle-down\"\n | \"star-triangle-down-open\"\n | \"star-triangle-down-dot\"\n | \"star-triangle-down-open-dot\"\n | \"star-square\"\n | \"star-square-open\"\n | \"star-square-dot\"\n | \"star-square-open-dot\"\n | \"star-diamond\"\n | \"star-diamond-open\"\n | \"star-diamond-dot\"\n | \"star-diamond-open-dot\"\n | \"diamond-tall\"\n | \"diamond-tall-open\"\n | \"diamond-tall-dot\"\n | \"diamond-tall-open-dot\"\n | \"diamond-wide\"\n | \"diamond-wide-open\"\n | \"diamond-wide-dot\"\n | \"diamond-wide-open-dot\"\n | \"hourglass\"\n | \"hourglass-open\"\n | \"bowtie\"\n | \"bowtie-open\"\n | \"circle-cross\"\n | \"circle-cross-open\"\n | \"circle-x\"\n | \"circle-x-open\"\n | \"square-cross\"\n | \"square-cross-open\"\n | \"square-x\"\n | \"square-x-open\"\n | \"diamond-cross\"\n | \"diamond-cross-open\"\n | \"diamond-x\"\n | \"diamond-x-open\"\n | \"cross-thin\"\n | \"cross-thin-open\"\n | \"x-thin\"\n | \"x-thin-open\"\n | \"asterisk\"\n | \"asterisk-open\"\n | \"hash\"\n | \"hash-open\"\n | \"hash-dot\"\n | \"hash-open-dot\"\n | \"y-up\"\n | \"y-up-open\"\n | \"y-down\"\n | \"y-down-open\"\n | \"y-left\"\n | \"y-left-open\"\n | \"y-right\"\n | \"y-right-open\"\n | \"line-ew\"\n | \"line-ew-open\"\n | \"line-ns\"\n | \"line-ns-open\"\n | \"line-ne\"\n | \"line-ne-open\"\n | \"line-nw\"\n | \"line-nw-open\"\n | \"arrow\"\n | \"arrow-open\"\n | \"arrow-wide\"\n | \"arrow-wide-open\";\n\ninterface LineDataSeries {\n x: number[];\n y: number[];\n name: string;\n color: string;\n symbol?: MarkerSymbol;\n error_y?: {\n type: \"data\";\n array: number[];\n visible: boolean;\n };\n}\n\ntype LineGraphVariant = \"lines\" | \"lines+markers\" | \"lines+markers+error_bars\";\n\ntype LineGraphProps = {\n dataSeries: LineDataSeries[];\n width?: number;\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n variant?: LineGraphVariant;\n xTitle?: string;\n yTitle?: string;\n title?: string;\n};\n\nconst LineGraph: React.FC<LineGraphProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n xRange,\n yRange,\n variant = \"lines\",\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n title = \"Line Graph\",\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n\n const { yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const xTicks = useMemo(\n () => [...new Set(dataSeries.flatMap((s) => s.x))],\n [dataSeries],\n );\n\n const mode = useMemo((): \"lines\" | \"lines+markers\" => {\n switch (variant) {\n case \"lines+markers\":\n case \"lines+markers+error_bars\":\n return \"lines+markers\";\n default:\n return \"lines\";\n }\n }, [variant]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const plotData = dataSeries.map((series) => ({\n x: series.x,\n y: series.y,\n type: \"scatter\" as const,\n mode: mode,\n name: series.name,\n line: {\n color: series.color,\n width: 1.5,\n },\n marker:\n variant === \"lines\"\n ? { opacity: 0 }\n : {\n color: series.color,\n size: 8,\n symbol: series.symbol || \"triangle-up\",\n },\n error_y:\n variant === \"lines+markers+error_bars\"\n ? series.error_y || {\n type: \"data\" as const,\n array: series.y.map(() => 10),\n visible: true,\n color: series.color,\n thickness: 1,\n width: 5,\n }\n : undefined,\n }));\n\n const layout = {\n title: {\n text: title,\n font: {\n size: 32,\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n },\n },\n width,\n height,\n margin: { l: 80, r: 30, b: 80, t: 60, pad: 10 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 32,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n ticktext: xTicks.map(String),\n showgrid: true,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 30,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n ...tickOptions,\n },\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 16,\n color: theme.legendColor,\n family: \"Inter, sans-serif\",\n weight: 500,\n },\n },\n showlegend: true,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [dataSeries, width, height, xRange, yRange, xTitle, yTitle, title, mode, tickOptions, xTicks, yTicks, effectiveYRange, variant, theme]);\n\n return (\n <div className=\"chart-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { LineGraph };\nexport type { LineDataSeries, LineGraphVariant, LineGraphProps, MarkerSymbol };\n","import React, { useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CodeEditor } from \"@/components/ui/code-editor\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { Switch } from \"@/components/ui/switch\";\n\nconst DEPLOY_DELAY_MS = 3000;\nconst DEFAULT_INITIAL_CODE = `protocolSchema: v3\nname: v3\ndescription: No description\nconfig: {}\nsteps: []`;\n\nexport const LaunchContentPanel: React.FC = () => {\n const versions = [\"v0.0.7\", \"v0.0.6\", \"v0.0.5\"];\n const [code, setCode] = useState(DEFAULT_INITIAL_CODE);\n const [currentVersion, setCurrentVersion] = useState(versions[0]);\n const [overwriteMode, setOverwriteMode] = useState(true);\n const [isDeploying, setIsDeploying] = useState(false);\n\n const handleDeploy = () => {\n setIsDeploying(true);\n toast.info(\"Building Protocol: Status=IN_PROGRESS, Phase=FINALIZING\");\n\n setTimeout(() => {\n const isSuccess = Math.random() > 0.3;\n\n if (isSuccess) {\n toast.success(\n `Pipeline visual-pipeline-builder-protocol-${currentVersion}-pipeline deployed successfully! Deployment complete`\n );\n } else {\n toast.error(\n `Failed to deploy pipeline visual-pipeline-builder-protocol-${currentVersion}-pipeline. Please try again.`\n );\n }\n\n setIsDeploying(false);\n }, DEPLOY_DELAY_MS);\n };\n\n return (\n <div>\n <div className=\"flex items-center justify-between mb-4\">\n <h1 className=\"m-0\">Launch</h1>\n <div className=\"flex items-center gap-4\">\n <Label htmlFor=\"overwrite-switch\">Overwrite Mode</Label>\n <Switch\n checked={overwriteMode}\n onCheckedChange={setOverwriteMode}\n disabled={isDeploying}\n />\n <Separator orientation=\"vertical\" />\n <Select value={currentVersion} onValueChange={setCurrentVersion}>\n <SelectTrigger size=\"default\" className=\"w-[180px]\">\n <SelectValue placeholder=\"Choose a version\" />\n </SelectTrigger>\n <SelectContent>\n {versions.map((version) => (\n <SelectItem key={version} value={version}>\n {version}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button onClick={handleDeploy} disabled={isDeploying}>\n Deploy\n </Button>\n </div>\n </div>\n\n <CodeEditor\n value={code}\n onChange={(value) => setCode(value ?? \"\")}\n language=\"yaml\"\n theme=\"light\"\n width=\"100%\"\n onCopy={(value) => navigator.clipboard.writeText(value)}\n onLaunch={(value) => console.log(\"Launching code:\", value)}\n disabled={!overwriteMode}\n />\n </div>\n );\n};\n","import { Home, Settings } from \"lucide-react\";\nimport React from \"react\";\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@/components/ui/avatar\";\nimport { Button } from \"@/components/ui/button\";\n\nexport interface UserProfileInfo {\n name: string;\n avatar?: string;\n}\n\nexport interface MainHeaderProps {\n hostname: string;\n userProfile: UserProfileInfo;\n onHomeClick?: () => void;\n onSettingsClick?: () => void;\n onUserProfileClick?: () => void;\n}\n\nconst getInitials = (name: string) =>\n name\n .split(\" \")\n .map((part) => part.charAt(0))\n .join(\"\")\n .toUpperCase()\n .substring(0, 2);\n\nexport const MainHeader: React.FC<MainHeaderProps> = ({\n hostname,\n userProfile,\n onHomeClick,\n onSettingsClick,\n onUserProfileClick,\n}) => (\n <div className=\"flex items-center justify-between w-full px-7 py-4 box-border\">\n <div>{hostname}</div>\n\n <div className=\"flex items-center gap-3\">\n <Button variant=\"outline\" size=\"icon-sm\" onClick={onHomeClick} aria-label=\"Home\">\n <Home size={20} />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={onSettingsClick}\n aria-label=\"Settings\"\n >\n <Settings size={20} />\n </Button>\n <div className=\"h-5 w-px\" />\n <Avatar onClick={onUserProfileClick}>\n <AvatarImage src={userProfile.avatar} alt={userProfile.name} />\n <AvatarFallback>{getInitials(userProfile.name)}</AvatarFallback>\n </Avatar>\n <div>{userProfile.name}</div>\n </div>\n </div>\n);\n","import { Building, Lamp } from \"lucide-react\";\nimport React from \"react\";\n\nexport interface OrganizationInfo {\n name: string;\n subtext?: string;\n logo?: React.ReactNode;\n}\n\nexport interface MainNavbarProps {\n organization: OrganizationInfo;\n}\n\nconst DefaultLogo = () => <Building />;\nconst DefaultProjectIcon = () => <Lamp />;\n\nexport const MainNavbar: React.FC<MainNavbarProps> = ({ organization }) => (\n <div className=\"flex items-center h-20 w-full pt-3 pr-6 pb-3 pl-32 box-border gap-10\">\n <div className=\"flex items-center h-full\">\n <div className=\"flex flex-col\">\n <div className=\"uppercase mb-0.5 tracking-[0.2px]\">ORGANIZATION</div>\n <div className=\"flex items-center gap-2 w-80\">\n <div>{organization.logo || <DefaultLogo />}</div>\n <div>\n <div>{organization.name}</div>\n {organization.subtext && (\n <div>{organization.subtext}</div>\n )}\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center h-full\">\n <div className=\"flex flex-col\">\n <div className=\"uppercase mb-0.5 tracking-[0.2px]\">PROJECT</div>\n <div className=\"flex items-center gap-2\">\n <DefaultProjectIcon />\n <div>Not Selected</div>\n </div>\n </div>\n </div>\n </div>\n);\n","\"use client\"\n\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","import React from \"react\";\n\nimport type { LucideIcon } from \"lucide-react\";\n\nimport { AppSidebar } from \"@/components/composed/Sidebar\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\n\ntype MainSidebarIcon = LucideIcon;\n\nexport interface MainSidebarItem {\n icon: MainSidebarIcon;\n label: string;\n}\n\nexport interface MainSidebarProps {\n items: MainSidebarItem[];\n activeItem?: string;\n onItemClick?: (label: string) => void;\n}\n\nexport const MainSidebar: React.FC<MainSidebarProps> = ({\n items,\n activeItem,\n onItemClick,\n}) => (\n <ScrollArea>\n <AppSidebar items={items} activeItem={activeItem} onItemClick={onItemClick} />\n </ScrollArea>\n);","\"use client\"\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Tabs as TabsPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> &\n VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n","import React from \"react\";\n\nimport { Tabs, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\n\nexport interface MainTabItem {\n id: string;\n label: string;\n}\n\nexport interface MainTabBarProps {\n tabs: MainTabItem[];\n value: string;\n onChange: (tabId: string) => void;\n}\n\nexport const MainTabBar: React.FC<MainTabBarProps> = ({ tabs, value, onChange }) => (\n <Tabs className=\"gap-0\" value={value} onValueChange={onChange}>\n <TabsList variant=\"line\" className=\"w-full justify-start gap-6 p-0\">\n {tabs.map((tab) => (\n <TabsTrigger className=\"flex-none pb-3 px-0 pt-0\" key={tab.id} value={tab.id}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n);\n","import { Plus } from \"lucide-react\";\nimport React, { useState } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\n\nexport const ProtocolConfigurationPanel: React.FC = () => {\n const [isEditMode, setIsEditMode] = useState(false);\n\n return (\n <div>\n <div className=\"flex items-center justify-between pb-6\">\n <h2 className=\"m-0 text-xl font-semibold leading-7\">Protocol Configuration</h2>\n <div className=\"flex items-center gap-2 text-[15px] font-medium\">\n <Switch checked={isEditMode} onCheckedChange={setIsEditMode} />\n <Label htmlFor=\"edit-mode-switch\">Edit Mode</Label>\n </div>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Configuration</CardTitle>\n </CardHeader>\n <CardContent>\n {isEditMode ? (\n <Button variant=\"secondary\">\n <Plus />\n Add Input\n </Button>\n ) : (\n <div>No values, Use the 'edit' button to add values</div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n};\n","import React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport type TemplateSidebarCardStatus = \"default\" | \"active\" | \"disabled\";\n\nexport interface TemplateSidebarCardProps {\n title: string;\n description?: string;\n buttonText?: string;\n linkText?: string;\n status?: TemplateSidebarCardStatus;\n onButtonClick?: () => void;\n onLinkClick?: () => void;\n className?: string;\n}\n\nexport const TemplateSidebarCard: React.FC<TemplateSidebarCardProps> = ({\n title,\n description,\n buttonText,\n linkText,\n status = \"default\",\n onButtonClick,\n onLinkClick,\n className,\n}) => {\n const disabled = status === \"disabled\";\n\n return (\n <Card\n className={cn(\n \"hover:bg-secondary/50 transition-colors duration-200 ease-in-out\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n className\n )}\n size=\"sm\"\n >\n <CardContent>\n <h3\n className={cn(\n \"m-0 mb-1 text-base font-semibold leading-6\",\n disabled ? \"text-disabled\" : \"text-default\"\n )}\n >\n {title}\n </h3>\n {description && (\n <p className=\"m-0 mb-4 text-muted-foreground text-[13px] font-normal leading-5\">\n {description}\n </p>\n )}\n {(buttonText || linkText) && (\n <div className=\"flex items-center gap-4\">\n {buttonText && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onButtonClick?.();\n }}\n >\n {buttonText}\n </Button>\n )}\n {linkText && (\n <button\n className={cn(\n \"no-underline text-[13px] font-medium leading-[18px]\",\n disabled\n ? \"text-[var(--muted)] cursor-not-allowed\"\n : \"text-[var(--primary)] cursor-pointer hover:underline\"\n )}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (!disabled) onLinkClick?.();\n }}\n >\n {linkText}\n </button>\n )}\n </div>\n )}\n </CardContent>\n </Card>\n );\n};\n","\"use client\"\n\nimport { XIcon } from \"lucide-react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 duration-100 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-background bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-3 right-3\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-base font-medium text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { cn } from \"@/lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>()\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","import { cva, type VariantProps } from \"class-variance-authority\"\nimport { PanelLeftIcon } from \"lucide-react\"\nimport { Slot } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@/components/ui/sheet\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\"\nimport { useIsMobile } from \"@/hooks/use-mobile\"\nimport { cn } from \"@/lib/utils\"\n\nconst SECONDS_IN_A_MINUTE = 60\nconst HOURS_IN_A_DAY = 24\nconst DAYS_IN_A_WEEK = 7\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = SECONDS_IN_A_MINUTE * SECONDS_IN_A_MINUTE * HOURS_IN_A_DAY * DAYS_IN_A_WEEK\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n // eslint-disable-next-line no-magic-numbers\n return `${Math.floor(Math.random() * 40) + 50}%`\n })\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","// import { ReactFlowProvider } from \"@xyflow/react\";\n// import {PipelineBuilder} from \"./pipeline-builder\";\nimport {\n Box,\n CheckCheck,\n Code,\n Database,\n Inbox,\n Lamp,\n Monitor,\n PieChart,\n Plus,\n Search,\n SearchCode,\n Settings,\n Trash2,\n Workflow,\n} from \"lucide-react\";\nimport React, { useState } from \"react\";\n\nimport { LaunchContentPanel } from \"./LaunchContentPanel\";\nimport { MainHeader, type UserProfileInfo } from \"./MainHeader\";\nimport { MainNavbar, type OrganizationInfo } from \"./MainNavbar\";\nimport { MainSidebar, type MainSidebarItem } from \"./MainSidebar\";\nimport { MainTabBar, type MainTabItem } from \"./MainTabBar\";\nimport { ProtocolConfigurationPanel } from \"./ProtocolConfigurationPanel\";\nimport { TemplateSidebarCard } from \"./TemplateSidebarCard\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { SidebarProvider } from \"@/components/ui/sidebar\";\n\nexport interface MainProps {\n userProfile: UserProfileInfo;\n hostname: string;\n organization: OrganizationInfo;\n}\n\nconst Main: React.FC<MainProps> = ({ userProfile, hostname, organization }) => {\n // Define sidebar items\n const sidebarItems: MainSidebarItem[] = [\n { icon: Search, label: \"Search\" },\n { icon: SearchCode, label: \"SQL Search\" },\n { icon: Lamp, label: \"Projects\" },\n { icon: Workflow, label: \"Pipelines\" },\n { icon: Monitor, label: \"Data & AI Workspace\" },\n { icon: Box, label: \"Artifacts\" },\n { icon: Database, label: \"Data Sources\" },\n { icon: PieChart, label: \"Health Monitoring\" },\n { icon: CheckCheck, label: \"Bulk Actions\" },\n { icon: Code, label: \"Attribute Management\" },\n { icon: Settings, label: \"Administration\" },\n ];\n\n // Tabs for the first tab group (left side)\n const leftTabs: MainTabItem[] = [\n { id: \"templates\", label: \"Templates\" },\n { id: \"protocol\", label: \"Protocol\" },\n { id: \"steps\", label: \"Steps\" },\n ];\n\n // Tabs for the second tab group (right side)\n const rightTabs: MainTabItem[] = [\n { id: \"pipelineBuilder\", label: \"Pipeline Builder\" },\n { id: \"configuration\", label: \"Configuration\" },\n { id: \"launch\", label: \"Launch\" },\n ];\n\n // State hooks\n const [activeItem, setActiveItem] = useState(\"Pipelines\");\n const [activeLeftTab, setActiveLeftTab] = useState(\"templates\");\n const [activeRightTab, setActiveRightTab] = useState(\"pipelineBuilder\");\n const [selectedTemplate, setSelectedTemplate] = useState<string | null>(\"1\");\n\n // Templates data\n const templates = [\n {\n id: \"1\",\n title: \"Tecan D300e and PerkinElmer EnVision to Dotmatics (v1)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"2\",\n title: \"Bruker D8 Andvanced CRD Raw to IDS(Draft)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"3\",\n title: \"Extract and Decorate(Draft)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"4\",\n title: \"Intellict (Que3 Raw to IDS(Draft)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"5\",\n title: \"Leica Aperio RAW to IDS(Draft)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"6\",\n title: \"IDS to Benchling(Draft)\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n {\n id: \"7\",\n title: \"Lorem Ipsum\",\n description: \"c901ejs\",\n buttonText: \"\",\n linkText: \"\",\n },\n ];\n\n const protocol: { id: string; title: string; description: string }[] = [];\n const steps: { id: string; title: string; description: string }[] = [];\n\n // Handlers\n const handleSidebarItemClick = (label: string) => {\n setActiveItem(label);\n };\n\n const handleLeftTabChange = (tabId: string) => {\n setActiveLeftTab(tabId);\n };\n\n const handleRightTabChange = (tabId: string) => {\n setActiveRightTab(tabId);\n };\n\n const handleHomeClick = () => {\n console.log(\"Home clicked\");\n };\n\n const handleSettingsClick = () => {\n console.log(\"Settings clicked\");\n };\n\n const handleUserProfileClick = () => {\n console.log(\"User profile clicked\");\n };\n\n const handleTemplateClick = (templateId: string) => {\n setSelectedTemplate(templateId === selectedTemplate ? null : templateId);\n };\n\n const handleUseTemplate = (templateId: string) => {\n console.log(`Using template: ${templateId}`);\n };\n\n const handleViewTemplate = (templateId: string) => {\n console.log(`Viewing template: ${templateId}`);\n };\n\n return (\n <div className=\"flex flex-col w-screen h-screen\">\n <MainNavbar organization={organization} />\n\n <div className=\"flex flex-1 overflow-hidden\">\n\n <SidebarProvider className=\"min-h-0 flex-1 w-full\">\n <MainSidebar\n items={sidebarItems}\n activeItem={activeItem}\n onItemClick={handleSidebarItemClick}\n />\n\n <div className=\"bg-card rounded-lg flex flex-col flex-1 overflow-hidden\">\n <Separator />\n <MainHeader\n hostname={hostname}\n userProfile={userProfile}\n onHomeClick={handleHomeClick}\n onSettingsClick={handleSettingsClick}\n onUserProfileClick={handleUserProfileClick}\n />\n\n <div className=\"flex flex-col flex-1 overflow-hidden\">\n <div className=\"flex flex-col flex-1 overflow-hidden\">\n <div style={{ display: \"flex\", height: \"100%\" }}>\n <div className=\"w-[360px] h-full flex flex-col py-4 px-6 overflow-hidden max-h-full\">\n <MainTabBar\n tabs={leftTabs}\n value={activeLeftTab}\n onChange={handleLeftTabChange}\n />\n {activeLeftTab === \"templates\" && (\n <>\n <div className=\"flex justify-between items-center py-6\">\n <h2 className=\"text-xl font-medium m-0\">Templates</h2>\n <div className=\"flex gap-2\">\n <Button\n className=\"rounded-[4px] w-8 h-8\"\n variant=\"destructive\"\n size=\"icon-sm\"\n aria-label=\"Delete\"\n >\n <Trash2 size={20} />\n </Button>\n <Button\n className=\"rounded-[4px] w-8 h-8\"\n size=\"icon-sm\"\n aria-label=\"Add\"\n >\n <Plus size={20} />\n </Button>\n </div>\n </div>\n\n <ScrollArea className=\"flex-1 h-full\">\n {templates.length > 0 ? (\n templates.map((template) => (\n <div\n key={template.id}\n className=\"cursor-pointer p-1 last:border-b-0\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n handleTemplateClick(template.id);\n }\n }}\n onClick={() => handleTemplateClick(template.id)}\n >\n <TemplateSidebarCard\n title={template.title}\n description={template.description}\n buttonText={template.buttonText}\n linkText={template.linkText}\n status={\n selectedTemplate === template.id\n ? \"active\"\n : \"default\"\n }\n onButtonClick={() =>\n handleUseTemplate(template.id)\n }\n onLinkClick={() =>\n handleViewTemplate(template.id)\n }\n />\n </div>\n ))\n ) : (\n <div className=\"flex flex-col justify-center items-center gap-4\">\n <Inbox size={40} />\n <div className=\"text-sm font-medium\">No data</div>\n </div>\n )}\n </ScrollArea>\n </>\n )}\n\n {activeLeftTab === \"protocol\" && (\n <>\n <div className=\"flex justify-between items-center py-6\">\n <h2 className=\"text-xl font-medium m-0\">\n Protocol ({protocol.length})\n </h2>\n </div>\n <div className=\"flex flex-col overflow-y-auto flex-1 mt-2 max-h-[calc(100vh-240px)]\">\n {protocol.length > 0 ? (\n protocol.map((template) => (\n <div\n key={template.id}\n className=\"cursor-pointer last:border-b-0\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n handleTemplateClick(template.id);\n }\n }}\n onClick={() => handleTemplateClick(template.id)}\n >\n <TemplateSidebarCard\n title={template.title}\n description={template.description}\n status={\n selectedTemplate === template.id\n ? \"active\"\n : \"default\"\n }\n onButtonClick={() =>\n handleUseTemplate(template.id)\n }\n onLinkClick={() =>\n handleViewTemplate(template.id)\n }\n />\n </div>\n ))\n ) : (\n <div className=\"flex flex-col justify-center items-center gap-4\">\n <Inbox size={40} />\n <div className=\"text-sm font-medium\">No data</div>\n </div>\n )}\n </div>\n </>\n )}\n\n {activeLeftTab === \"steps\" && (\n <>\n <div className=\"flex justify-between items-center py-6\">\n <h2 className=\"text-xl font-medium m-0\">\n Task Scripts ({steps.length})\n </h2>\n </div>\n <div className=\"flex flex-col overflow-y-auto flex-1 mt-2 max-h-[calc(100vh-240px)]\">\n {protocol.length > 0 ? (\n protocol.map((template) => (\n <div\n key={template.id}\n className=\"cursor-pointer last:border-b-0\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n handleTemplateClick(template.id);\n }\n }}\n onClick={() => handleTemplateClick(template.id)}\n >\n <TemplateSidebarCard\n title={template.title}\n description={template.description}\n status={\n selectedTemplate === template.id\n ? \"active\"\n : \"default\"\n }\n onButtonClick={() =>\n handleUseTemplate(template.id)\n }\n onLinkClick={() =>\n handleViewTemplate(template.id)\n }\n />\n </div>\n ))\n ) : (\n <div className=\"flex flex-col justify-center items-center gap-4\">\n <Inbox size={40} />\n <div className=\"text-sm font-medium\">No data</div>\n </div>\n )}\n </div>\n </>\n )}\n </div>\n <div className=\"flex-1 h-full flex flex-col\">\n <div className=\"pt-4 px-6 pb-0\">\n <MainTabBar\n tabs={rightTabs}\n value={activeRightTab}\n onChange={handleRightTabChange}\n />\n </div>\n <div className=\"p-6 -mt-px flex-1\">\n {activeRightTab === \"pipelineBuilder\" && (\n <div className=\"h-full border rounded-lg overflow-hidden\">\n {/* <ReactFlowProvider>\n <PipelineBuilder width=\"100%\" height=\"100%\" />\n </ReactFlowProvider> */}\n </div>\n )}\n {activeRightTab === \"configuration\" && (\n <ProtocolConfigurationPanel />\n )}\n {activeRightTab === \"launch\" && <LaunchContentPanel />}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </SidebarProvider>\n </div>\n </div>\n );\n};\n\nexport default Main;\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\nimport { COLORS } from \"@/utils/colors\";\n\ninterface PieDataSeries {\n labels: string[];\n values: number[];\n name: string;\n colors?: string[];\n}\n\ntype PieTextInfo =\n | \"none\"\n | \"label\"\n | \"percent\"\n | \"value\"\n | \"label+percent\"\n | \"label+value\"\n | \"value+percent\"\n | \"label+value+percent\";\n\ntype PieChartProps = {\n dataSeries: PieDataSeries;\n width?: number;\n height?: number;\n title?: string;\n textInfo?: PieTextInfo;\n hole?: number;\n rotation?: number;\n};\n\nconst DEFAULT_COLORS = [\n COLORS.BLUE,\n COLORS.GREEN,\n COLORS.ORANGE,\n COLORS.RED,\n COLORS.YELLOW,\n COLORS.PURPLE,\n];\n\nconst PieChart: React.FC<PieChartProps> = ({\n dataSeries,\n width = 400,\n height = 400,\n title = \"Pie Chart\",\n textInfo = \"percent\",\n hole = 0,\n rotation = 0,\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n\n const colors = useMemo(() => {\n if (\n dataSeries.colors &&\n dataSeries.colors.length >= dataSeries.labels.length\n ) {\n return dataSeries.colors;\n }\n\n const result = [...(dataSeries.colors || [])];\n const missingColors = dataSeries.labels.length - result.length;\n\n if (missingColors <= 0) return result;\n\n for (let i = 0; i < missingColors; i++) {\n result.push(DEFAULT_COLORS[i % DEFAULT_COLORS.length]);\n }\n\n return result;\n }, [dataSeries.colors, dataSeries.labels.length]);\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const plotData = [\n {\n type: \"pie\" as const,\n labels: dataSeries.labels,\n values: dataSeries.values,\n name: dataSeries.name,\n marker: {\n colors: colors,\n },\n textinfo: textInfo,\n hoverinfo: \"label+text+value\" as const,\n insidetextfont: {\n size: 0,\n family: \"Inter, sans-serif\",\n color: \"transparent\",\n },\n hole: hole,\n rotation: rotation,\n },\n ];\n\n const layout = {\n width,\n height,\n font: {\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n },\n showlegend: false,\n margin: { l: 40, r: 40, b: 40, t: 40 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [colors, dataSeries.labels, dataSeries.name, dataSeries.values, width, height, textInfo, hole, rotation, theme]);\n\n const PieChartLegend: React.FC<{ labels: string[]; colors: string[] }> = ({\n labels,\n colors,\n }) => {\n const items = labels.map((label, i) => (\n <React.Fragment key={label}>\n <div className=\"legend-item\">\n <span className=\"color-box\" style={{ background: colors[i] }} />\n {label}\n {i < labels.length - 1 && <span className=\"divider\" />}\n </div>\n </React.Fragment>\n ));\n\n const rowSize = 6;\n const rows = [];\n for (let i = 0; i < items.length; i += rowSize) {\n rows.push(\n <div className=\"legend-row\" key={i}>\n {items.slice(i, i + rowSize)}\n </div>\n );\n }\n return <div className=\"legend-container\">{rows}</div>;\n };\n\n return (\n <div className=\"card-container\" style={{ width: width }}>\n <div className=\"chart-container\">\n {title && (\n <div className=\"title-container\">\n <h2 className=\"title\">{title}</h2>\n </div>\n )}\n <div\n ref={plotRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n margin: \"0\",\n }}\n />\n <PieChartLegend labels={dataSeries.labels} colors={colors} />\n </div>\n </div>\n );\n};\n\nexport { PieChart };\nexport type { PieDataSeries, PieTextInfo, PieChartProps };\n","import Plotly from \"plotly.js-dist\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\n\nimport { usePlotlyTheme } from \"@/hooks/use-plotly-theme\";\n\ninterface ScatterDataPoint {\n x: number;\n y: number;\n additionalInfo?: Record<string, string | number>;\n}\n\ninterface ScatterDataSeries {\n x: number[];\n y: number[];\n name: string;\n color: string;\n}\n\ninterface ScatterGraphProps {\n dataSeries: ScatterDataSeries[];\n width?: number;\n height?: number;\n xRange?: [number, number];\n yRange?: [number, number];\n xTitle?: string;\n yTitle?: string;\n title?: string;\n}\n\nconst ScatterGraph: React.FC<ScatterGraphProps> = ({\n dataSeries,\n width = 1000,\n height = 600,\n xRange,\n yRange,\n xTitle = \"Columns\",\n yTitle = \"Rows\",\n title = \"Scatter Plot\",\n}) => {\n const plotRef = useRef<HTMLDivElement>(null);\n const theme = usePlotlyTheme();\n\n const { xMin, xMax, yMin, yMax } = useMemo(() => {\n let minX = Number.MAX_VALUE;\n let maxX = Number.MIN_VALUE;\n let minY = Number.MAX_VALUE;\n let maxY = Number.MIN_VALUE;\n\n dataSeries.forEach((series) => {\n series.x.forEach((x) => {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n });\n series.y.forEach((y) => {\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n const xPadding = (maxX - minX) * 0.1;\n const yPadding = (maxY - minY) * 0.1;\n\n return {\n xMin: minX - xPadding,\n xMax: maxX + xPadding,\n yMin: minY - yPadding,\n yMax: maxY + yPadding,\n };\n }, [dataSeries]);\n\n const effectiveXRange = useMemo(\n () => xRange || [xMin, xMax],\n [xRange, xMin, xMax],\n );\n\n const effectiveYRange = useMemo(\n () => yRange || [yMin, yMax],\n [yRange, yMin, yMax],\n );\n\n const xTicks = useMemo(() => {\n const range = effectiveXRange[1] - effectiveXRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveXRange[0] / step) * step;\n while (current <= effectiveXRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveXRange]);\n\n const yTicks = useMemo(() => {\n const range = effectiveYRange[1] - effectiveYRange[0];\n let step = Math.pow(10, Math.floor(Math.log10(range)));\n\n if (range / step > 10) step = step * 2;\n if (range / step < 4) step = step / 2;\n\n const ticks = [];\n let current = Math.ceil(effectiveYRange[0] / step) * step;\n while (current <= effectiveYRange[1]) {\n ticks.push(current);\n current += step;\n }\n return ticks;\n }, [effectiveYRange]);\n\n const tickOptions = useMemo(\n () => ({\n tickcolor: theme.tickColor,\n ticklen: 12,\n tickwidth: 1,\n ticks: \"outside\" as const,\n tickfont: {\n size: 16,\n color: theme.textColor,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n linecolor: theme.lineColor,\n linewidth: 1,\n position: 0,\n zeroline: false,\n }),\n [theme],\n );\n\n const spikeOptions = useMemo(\n () => ({\n showspikes: true,\n spikemode: \"across\" as const,\n spikedash: \"solid\" as const,\n spikecolor: theme.spikeColor,\n spikethickness: 2,\n }),\n [theme],\n );\n\n useEffect(() => {\n if (!plotRef.current) return;\n\n const plotData = dataSeries.map((series) => ({\n x: series.x,\n y: series.y,\n type: \"scatter\" as const,\n mode: \"markers\" as const,\n name: series.name,\n marker: {\n color: series.color,\n size: 10,\n symbol: \"circle\" as const,\n },\n hovertemplate: `${xTitle}: %{x}<br>${yTitle}: %{y}<extra>${series.name}</extra>`,\n }));\n\n const layout = {\n title: {\n text: title,\n font: {\n size: 32,\n family: \"Inter, sans-serif\",\n color: theme.textColor,\n },\n },\n width,\n height,\n margin: { l: 80, r: 30, b: 80, t: 60, pad: 10 },\n paper_bgcolor: theme.paperBg,\n plot_bgcolor: theme.plotBg,\n font: {\n family: \"Inter, sans-serif\",\n },\n dragmode: false as const,\n xaxis: {\n title: {\n text: xTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 32,\n },\n gridcolor: theme.gridColor,\n range: xRange,\n autorange: !xRange,\n tickmode: \"array\" as const,\n tickvals: xTicks,\n ticktext: xTicks.map(String),\n showgrid: true,\n ...spikeOptions,\n ...tickOptions,\n },\n yaxis: {\n title: {\n text: yTitle,\n font: {\n size: 16,\n color: theme.textSecondary,\n family: \"Inter, sans-serif\",\n weight: 400,\n },\n standoff: 30,\n },\n gridcolor: theme.gridColor,\n range: yRange,\n autorange: !yRange,\n tickmode: \"array\" as const,\n tickvals: yTicks,\n showgrid: true,\n ...spikeOptions,\n ...tickOptions,\n },\n legend: {\n x: 0.5,\n y: -0.2,\n xanchor: \"center\" as const,\n yanchor: \"top\" as const,\n orientation: \"h\" as const,\n font: {\n size: 16,\n color: theme.legendColor,\n family: \"Inter, sans-serif\",\n weight: 500,\n },\n },\n showlegend: true,\n hovermode: \"closest\" as const,\n };\n\n const config = {\n responsive: true,\n displayModeBar: false,\n displaylogo: false,\n };\n\n Plotly.newPlot(plotRef.current, plotData, layout, config);\n\n // Capture ref value for cleanup\n const plotElement = plotRef.current;\n\n return () => {\n if (plotElement) {\n Plotly.purge(plotElement);\n }\n };\n }, [dataSeries, width, height, xRange, yRange, xTitle, yTitle, title, effectiveXRange, effectiveYRange, xTicks, yTicks, tickOptions, spikeOptions, theme]);\n\n return (\n <div className=\"chart-container\">\n <div ref={plotRef} style={{ width: \"100%\", height: \"100%\" }} />\n </div>\n );\n};\n\nexport { ScatterGraph };\nexport type { ScatterDataPoint, ScatterDataSeries, ScatterGraphProps };\n","import { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Accordion as AccordionPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction Accordion({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n className={cn(\"flex w-full flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"not-last:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:after:border-ring disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden\" />\n <ChevronUpIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up\"\n {...props}\n >\n <div\n className={cn(\n \"h-(--radix-accordion-content-height) pt-0 pb-2.5 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","import { AlertDialog as AlertDialogPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n )\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {\n size?: \"default\" | \"sm\"\n}) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n data-size={size}\n className={cn(\n \"group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-background p-4 ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\n \"grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogMedia({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-media\"\n className={cn(\n \"mb-2 inline-flex size-10 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\n \"text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\n \"text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogAction({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action> &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Action\n data-slot=\"alert-dialog-action\"\n className={cn(className)}\n {...props}\n />\n </Button>\n )\n}\n\nfunction AlertDialogCancel({\n className,\n variant = \"outline\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Cancel\n data-slot=\"alert-dialog-cancel\"\n className={cn(className)}\n {...props}\n />\n </Button>\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogMedia,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n}\n","\"use client\"\n\nimport { AspectRatio as AspectRatioPrimitive } from \"radix-ui\"\n\nfunction AspectRatio({\n ...props\n}: React.ComponentProps<typeof AspectRatioPrimitive.Root>) {\n return <AspectRatioPrimitive.Root data-slot=\"aspect-ratio\" {...props} />\n}\n\nexport { AspectRatio }\n","import { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline:\n \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","import { ChevronRightIcon, MoreHorizontalIcon } from \"lucide-react\"\nimport { Slot } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n aria-label=\"breadcrumb\"\n data-slot=\"breadcrumb\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 text-sm wrap-break-word text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"transition-colors hover:text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? (\n <ChevronRightIcon />\n )}\n </li>\n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"flex size-5 items-center justify-center [&>svg]:size-4\",\n className\n )}\n {...props}\n >\n <MoreHorizontalIcon\n />\n <span className=\"sr-only\">More</span>\n </span>\n )\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n","import { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { Separator } from \"@/components/ui/separator\"\nimport { cn } from \"@/lib/utils\"\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-lg [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n {\n variants: {\n orientation: {\n horizontal:\n \"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-lg!\",\n vertical:\n \"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-lg!\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\nfunction ButtonGroup({\n className,\n orientation,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"button-group\"\n data-orientation={orientation}\n className={cn(buttonGroupVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupText({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n className={cn(\n \"flex items-center gap-2 rounded-lg border bg-muted px-2.5 text-sm font-medium [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn(\n \"relative self-stretch bg-input data-horizontal:mx-px data-horizontal:w-auto data-vertical:my-px data-vertical:h-auto\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n","import { ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon } from \"lucide-react\"\nimport * as React from \"react\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n type Locale,\n} from \"react-day-picker\"\n\nimport { Button, buttonVariants } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n locale,\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n \"group/calendar bg-background p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent\",\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className\n )}\n captionLayout={captionLayout}\n locale={locale}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(locale?.code, { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"relative flex flex-col gap-4 md:flex-row\",\n defaultClassNames.months\n ),\n month: cn(\"flex w-full flex-col gap-4\", defaultClassNames.month),\n nav: cn(\n \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative rounded-(--cell-radius)\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute inset-0 bg-popover opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"font-medium select-none\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"flex items-center gap-1 rounded-(--cell-radius) text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"mt-2 flex w-full\", defaultClassNames.week),\n week_number_header: cn(\n \"w-(--cell-size) select-none\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] text-muted-foreground select-none\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius)\",\n props.showWeekNumber\n ? \"[&:nth-child(2)[data-selected=true]_button]:rounded-l-(--cell-radius)\"\n : \"[&:first-child[data-selected=true]_button]:rounded-l-(--cell-radius)\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"relative isolate z-0 rounded-l-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:right-0 after:w-4 after:bg-muted\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\n \"relative isolate z-0 rounded-r-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:left-0 after:w-4 after:bg-muted\",\n defaultClassNames.range_end\n ),\n today: cn(\n \"rounded-(--cell-radius) bg-muted text-foreground data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <ChevronLeftIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n if (orientation === \"right\") {\n return (\n <ChevronRightIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n return (\n <ChevronDownIcon className={cn(\"size-4\", className)} {...props} />\n )\n },\n DayButton: ({ ...props }) => (\n <CalendarDayButton locale={locale} {...props} />\n ),\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n locale,\n ...props\n}: React.ComponentProps<typeof DayButton> & { locale?: Partial<Locale> }) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString(locale?.code)}\n data-selected-single={\n modifiers.selected &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n \"relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 border-0 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-r-(--cell-radius) data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground data-[range-start=true]:rounded-(--cell-radius) data-[range-start=true]:rounded-l-(--cell-radius) data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-foreground [&>span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n","\"use client\"\n\nimport useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n opts?: CarouselOptions\n plugins?: CarouselPlugin\n orientation?: \"horizontal\" | \"vertical\"\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n api: ReturnType<typeof useEmblaCarousel>[1]\n scrollPrev: () => void\n scrollNext: () => void\n canScrollPrev: boolean\n canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext)\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\")\n }\n\n return context\n}\n\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return\n setCanScrollPrev(api.canScrollPrev())\n setCanScrollNext(api.canScrollNext())\n }, [])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext]\n )\n\n React.useEffect(() => {\n if (!api || !setApi) return\n setApi(api)\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) return\n onSelect(api)\n api.on(\"reInit\", onSelect)\n api.on(\"select\", onSelect)\n\n return () => {\n api?.off(\"select\", onSelect)\n }\n }, [api, onSelect])\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation:\n orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n <div\n ref={carouselRef}\n className=\"overflow-hidden\"\n data-slot=\"carousel-content\"\n >\n <div\n className={cn(\n \"flex\",\n orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel()\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute touch-manipulation rounded-full\",\n orientation === \"horizontal\"\n ? \"top-1/2 -left-12 -translate-y-1/2\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n )\n}\n\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute touch-manipulation rounded-full\",\n orientation === \"horizontal\"\n ? \"top-1/2 -right-12 -translate-y-1/2\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ChevronRightIcon />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n )\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n useCarousel,\n}\n","import { CheckIcon } from \"lucide-react\"\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction Checkbox({\n className,\n ...props\n}: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input transition-colors outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current transition-none [&>svg]:size-3.5\"\n >\n <CheckIcon\n />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport { Checkbox }\n","\"use client\"\n\nimport { Collapsible as CollapsiblePrimitive } from \"radix-ui\"\n\nfunction Collapsible({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />\n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n )\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n data-slot=\"collapsible-content\"\n {...props}\n />\n )\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","import { cva, type VariantProps } from \"class-variance-authority\"\nimport * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Textarea } from \"@/components/ui/textarea\"\nimport { cn } from \"@/lib/utils\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\":\n \"order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n e.currentTarget.click()\n }\n }}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","\"use client\"\n\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\"\nimport { ChevronDownIcon, XIcon, CheckIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupInput,\n} from \"@/components/ui/input-group\"\nimport { cn } from \"@/lib/utils\"\n\n\nconst Combobox = ComboboxPrimitive.Root\n\nfunction ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {\n return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />\n}\n\nfunction ComboboxTrigger({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Trigger.Props) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n className={cn(\"[&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n </ComboboxPrimitive.Trigger>\n )\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n className={cn(className)}\n {...props}\n >\n <XIcon className=\"pointer-events-none\" />\n </ComboboxPrimitive.Clear>\n )\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n showTrigger = true,\n showClear = false,\n ...props\n}: ComboboxPrimitive.Input.Props & {\n showTrigger?: boolean\n showClear?: boolean\n}) {\n return (\n <InputGroup className={cn(\"w-auto\", className)}>\n <ComboboxPrimitive.Input\n render={<InputGroupInput disabled={disabled} />}\n {...props}\n />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n asChild\n data-slot=\"input-group-button\"\n className=\"group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent\"\n disabled={disabled}\n >\n <ComboboxTrigger />\n </InputGroupButton>\n )}\n {showClear && <ComboboxClear disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n )\n}\n\nfunction ComboboxContent({\n className,\n side = \"bottom\",\n sideOffset = 6,\n align = \"start\",\n alignOffset = 0,\n anchor,\n ...props\n}: ComboboxPrimitive.Popup.Props &\n Pick<\n ComboboxPrimitive.Positioner.Props,\n \"side\" | \"align\" | \"sideOffset\" | \"alignOffset\" | \"anchor\"\n >) {\n return (\n <ComboboxPrimitive.Portal>\n <ComboboxPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"isolate z-50\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n data-chips={!!anchor}\n className={cn(\"group/combobox-content relative max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n )\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {\n return (\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\n \"no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxItem({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Item.Props) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ComboboxPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <CheckIcon className=\"pointer-events-none\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n )\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n return (\n <ComboboxPrimitive.Group\n data-slot=\"combobox-group\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxLabel({\n className,\n ...props\n}: ComboboxPrimitive.GroupLabel.Props) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) {\n return (\n <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />\n )\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n \"hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxSeparator({\n className,\n ...props\n}: ComboboxPrimitive.Separator.Props) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxChips({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> &\n ComboboxPrimitive.Chips.Props) {\n return (\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\n \"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxChip({\n className,\n children,\n showRemove = true,\n ...props\n}: ComboboxPrimitive.Chip.Props & {\n showRemove?: boolean\n}) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n \"flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0\",\n className\n )}\n {...props}\n >\n {children}\n {showRemove && (\n <ComboboxPrimitive.ChipRemove\n render={<Button variant=\"ghost\" size=\"icon-xs\" />}\n className=\"-ml-1 opacity-50 hover:opacity-100\"\n data-slot=\"combobox-chip-remove\"\n >\n <XIcon className=\"pointer-events-none\" />\n </ComboboxPrimitive.ChipRemove>\n )}\n </ComboboxPrimitive.Chip>\n )\n}\n\nfunction ComboboxChipsInput({\n className,\n ...props\n}: ComboboxPrimitive.Input.Props) {\n return (\n <ComboboxPrimitive.Input\n data-slot=\"combobox-chip-input\"\n className={cn(\"min-w-16 flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nfunction useComboboxAnchor() {\n return React.useRef<HTMLDivElement | null>(null)\n}\n\nexport {\n Combobox,\n ComboboxInput,\n ComboboxContent,\n ComboboxList,\n ComboboxItem,\n ComboboxGroup,\n ComboboxLabel,\n ComboboxCollection,\n ComboboxEmpty,\n ComboboxSeparator,\n ComboboxChips,\n ComboboxChip,\n ComboboxChipsInput,\n ComboboxTrigger,\n ComboboxValue,\n useComboboxAnchor,\n}\n","\"use client\"\n\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { SearchIcon, CheckIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\"\nimport {\n InputGroup,\n InputGroupAddon,\n} from \"@/components/ui/input-group\"\nimport { cn } from \"@/lib/utils\"\n\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex size-full flex-col overflow-hidden rounded-xl! bg-popover p-1 text-popover-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n className,\n showCloseButton = false,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\n \"top-1/3 translate-y-0 overflow-hidden rounded-xl! p-0\",\n className\n )}\n showCloseButton={showCloseButton}\n >\n {children}\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div data-slot=\"command-input-wrapper\" className=\"p-1 pb-0\">\n <InputGroup className=\"h-8! rounded-lg! border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:pl-2!\">\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n </InputGroupAddon>\n </InputGroup>\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn(\"py-6 text-center text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <CheckIcon className=\"ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100\" />\n </CommandPrimitive.Item>\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","import { ChevronRightIcon, CheckIcon } from \"lucide-react\"\nimport { ContextMenu as ContextMenuPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction ContextMenu({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />\n}\n\nfunction ContextMenuTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return (\n <ContextMenuPrimitive.Trigger\n data-slot=\"context-menu-trigger\"\n className={cn(\"select-none\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return (\n <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n )\n}\n\nfunction ContextMenuPortal({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n )\n}\n\nfunction ContextMenuSub({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />\n}\n\nfunction ContextMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\"z-50 max-h-(--radix-context-menu-content-available-height) min-w-36 origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n )\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubTrigger>\n )\n}\n\nfunction ContextMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\"z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-lg duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon\n />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon\n />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n )\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Drawer({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />\n}\n\nfunction DrawerTrigger({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Trigger>) {\n return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />\n}\n\nfunction DrawerPortal({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />\n}\n\nfunction DrawerClose({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Close>) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />\n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"group/drawer-content fixed z-50 flex h-auto flex-col bg-background text-sm data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-xl data-[vaul-drawer-direction=bottom]:border-t data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:rounded-r-xl data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:rounded-l-xl data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-xl data-[vaul-drawer-direction=top]:border-b data-[vaul-drawer-direction=left]:sm:max-w-sm data-[vaul-drawer-direction=right]:sm:max-w-sm\",\n className\n )}\n {...props}\n >\n <div className=\"mx-auto mt-4 hidden h-1 w-[100px] shrink-0 rounded-full bg-muted group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n )\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\n \"flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-0.5 md:text-left\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\"text-base font-medium text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n","import { CheckIcon, ChevronRightIcon } from \"lucide-react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\"z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon\n />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon\n />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\"z-50 min-w-[96px] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import { cva, type VariantProps } from \"class-variance-authority\"\nimport { useMemo } from \"react\"\n\nimport { Label } from \"@/components/ui/label\"\nimport { Separator } from \"@/components/ui/separator\"\nimport { cn } from \"@/lib/utils\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-2 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: \"flex-col *:w-full [&>.sr-only]:w-auto\",\n horizontal:\n \"flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n responsive:\n \"flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-0.5 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-left text-sm leading-normal font-normal text-muted-foreground group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5\",\n \"last:mt-0 nth-last-2:-mt-1\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-background px-2 text-muted-foreground\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-sm font-normal text-destructive\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n","import { HoverCard as HoverCardPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n )\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n )\n}\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","\"use client\"\n\nimport { OTPInput, OTPInputContext } from \"input-otp\"\nimport { MinusIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"cn-input-otp flex items-center has-disabled:opacity-50\",\n containerClassName\n )}\n spellCheck={false}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\n \"flex items-center rounded-lg has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 dark:has-aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number\n}) {\n const inputOTPContext = React.useContext(OTPInputContext)\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"relative flex size-8 items-center justify-center border-y border-r border-input text-sm transition-all outline-none first:rounded-l-lg first:border-l last:rounded-r-lg aria-invalid:border-destructive data-[active=true]:z-10 data-[active=true]:border-ring data-[active=true]:ring-3 data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20 dark:bg-input/30 dark:data-[active=true]:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"h-4 w-px animate-caret-blink bg-foreground duration-1000\" />\n </div>\n )}\n </div>\n )\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-separator\"\n className=\"flex items-center [&_svg:not([class*='size-'])]:size-4\"\n role=\"separator\"\n {...props}\n >\n <MinusIcon\n />\n </div>\n )\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n","import { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { Separator } from \"@/components/ui/separator\"\nimport { cn } from \"@/lib/utils\"\n\nfunction ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n role=\"list\"\n data-slot=\"item-group\"\n className={cn(\n \"group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"item-separator\"\n orientation=\"horizontal\"\n className={cn(\"my-2\", className)}\n {...props}\n />\n )\n}\n\nconst itemVariants = cva(\n \"group/item flex w-full flex-wrap items-center rounded-lg border text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted\",\n {\n variants: {\n variant: {\n default: \"border-transparent\",\n outline: \"border-border\",\n muted: \"border-transparent bg-muted/50\",\n },\n size: {\n default: \"gap-2.5 px-3 py-2.5\",\n sm: \"gap-2.5 px-3 py-2.5\",\n xs: \"gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Item({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof itemVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n return (\n <Comp\n data-slot=\"item\"\n data-variant={variant}\n data-size={size}\n className={cn(itemVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nconst itemMediaVariants = cva(\n \"flex shrink-0 items-center justify-center gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"[&_svg:not([class*='size-'])]:size-4\",\n image:\n \"size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction ItemMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemMediaVariants>) {\n return (\n <div\n data-slot=\"item-media\"\n data-variant={variant}\n className={cn(itemMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction ItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-content\"\n className={cn(\n \"flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-title\"\n className={cn(\n \"line-clamp-1 flex w-fit items-center gap-2 text-sm leading-snug font-medium underline-offset-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"item-description\"\n className={cn(\n \"line-clamp-2 text-left text-sm leading-normal font-normal text-muted-foreground group-data-[size=xs]/item:text-xs [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-actions\"\n className={cn(\"flex items-center gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction ItemHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-header\"\n className={cn(\n \"flex basis-full items-center justify-between gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-footer\"\n className={cn(\n \"flex basis-full items-center justify-between gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemActions,\n ItemGroup,\n ItemSeparator,\n ItemTitle,\n ItemDescription,\n ItemHeader,\n ItemFooter,\n}\n","import { cn } from \"@/lib/utils\"\n\nfunction Kbd({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"kbd\"\n className={cn(\n \"pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground select-none in-data-[slot=tooltip-content]:bg-background/20 in-data-[slot=tooltip-content]:text-background dark:in-data-[slot=tooltip-content]:bg-background/10 [&_svg:not([class*='size-'])]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <kbd\n data-slot=\"kbd-group\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nexport { Kbd, KbdGroup }\n","import { CheckIcon, ChevronRightIcon } from \"lucide-react\"\nimport { Menubar as MenubarPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction Menubar({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Root>) {\n return (\n <MenubarPrimitive.Root\n data-slot=\"menubar\"\n className={cn(\n \"flex h-8 items-center gap-0.5 rounded-lg border bg-background p-[3px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarMenu({\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n return <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />\n}\n\nfunction MenubarGroup({\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n return <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />\n}\n\nfunction MenubarPortal({\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n return <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />\n}\n\nfunction MenubarRadioGroup({\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n return (\n <MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />\n )\n}\n\nfunction MenubarTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {\n return (\n <MenubarPrimitive.Trigger\n data-slot=\"menubar-trigger\"\n className={cn(\n \"flex items-center rounded-sm px-1.5 py-[2px] text-sm font-medium outline-hidden select-none hover:bg-muted aria-expanded:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarContent({\n className,\n align = \"start\",\n alignOffset = -4,\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Content>) {\n return (\n <MenubarPortal>\n <MenubarPrimitive.Content\n data-slot=\"menubar-content\"\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\"z-50 min-w-36 origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95\", className )}\n {...props}\n />\n </MenubarPortal>\n )\n}\n\nfunction MenubarItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <MenubarPrimitive.Item\n data-slot=\"menubar-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/menubar-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive!\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <MenubarPrimitive.CheckboxItem\n data-slot=\"menubar-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-1.5 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4\">\n <MenubarPrimitive.ItemIndicator>\n <CheckIcon\n />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n )\n}\n\nfunction MenubarRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <MenubarPrimitive.RadioItem\n data-slot=\"menubar-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-1.5 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4\">\n <MenubarPrimitive.ItemIndicator>\n <CheckIcon\n />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n )\n}\n\nfunction MenubarLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <MenubarPrimitive.Label\n data-slot=\"menubar-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-sm font-medium data-inset:pl-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {\n return (\n <MenubarPrimitive.Separator\n data-slot=\"menubar-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction MenubarShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"menubar-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/menubar-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarSub({\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n return <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />\n}\n\nfunction MenubarSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <MenubarPrimitive.SubTrigger\n data-slot=\"menubar-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-none select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </MenubarPrimitive.SubTrigger>\n )\n}\n\nfunction MenubarSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {\n return (\n <MenubarPrimitive.SubContent\n data-slot=\"menubar-sub-content\"\n className={cn(\"z-50 min-w-32 origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n )\n}\n\nexport {\n Menubar,\n MenubarPortal,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarGroup,\n MenubarSeparator,\n MenubarLabel,\n MenubarItem,\n MenubarShortcut,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarSub,\n MenubarSubTrigger,\n MenubarSubContent,\n}\n","import { cva } from \"class-variance-authority\"\nimport { ChevronDownIcon } from \"lucide-react\"\nimport { NavigationMenu as NavigationMenuPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction NavigationMenu({\n className,\n children,\n viewport = true,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {\n viewport?: boolean\n}) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n data-viewport={viewport}\n className={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className\n )}\n {...props}\n >\n {children}\n {viewport && <NavigationMenuViewport />}\n </NavigationMenuPrimitive.Root>\n )\n}\n\nfunction NavigationMenuList({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn(\n \"group flex flex-1 list-none items-center justify-center gap-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuItem({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item\n data-slot=\"navigation-menu-item\"\n className={cn(\"relative\", className)}\n {...props}\n />\n )\n}\n\nconst navigationMenuTriggerStyle = cva(\n \"group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg bg-background px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted\"\n)\n\nfunction NavigationMenuTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {\n return (\n <NavigationMenuPrimitive.Trigger\n data-slot=\"navigation-menu-trigger\"\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n {...props}\n >\n {children}{\" \"}\n <ChevronDownIcon className=\"relative top-px ml-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180\" aria-hidden=\"true\" />\n </NavigationMenuPrimitive.Trigger>\n )\n}\n\nfunction NavigationMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Content>) {\n return (\n <NavigationMenuPrimitive.Content\n data-slot=\"navigation-menu-content\"\n className={cn(\n \"top-0 left-0 w-full p-1 ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:duration-300 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none md:absolute md:w-auto group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuViewport({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {\n return (\n <div\n className={cn(\n \"absolute top-full left-0 isolate z-50 flex justify-center\"\n )}\n >\n <NavigationMenuPrimitive.Viewport\n data-slot=\"navigation-menu-viewport\"\n className={cn(\n \"origin-top-center relative mt-1.5 h-(--radix-navigation-menu-viewport-height) w-full overflow-hidden rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 duration-100 md:w-(--radix-navigation-menu-viewport-width) data-open:animate-in data-open:zoom-in-90 data-closed:animate-out data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction NavigationMenuLink({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Link>) {\n return (\n <NavigationMenuPrimitive.Link\n data-slot=\"navigation-menu-link\"\n className={cn(\n \"flex items-center gap-2 rounded-lg p-2 text-sm transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuIndicator({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {\n return (\n <NavigationMenuPrimitive.Indicator\n data-slot=\"navigation-menu-indicator\"\n className={cn(\n \"top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in\",\n className\n )}\n {...props}\n >\n <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md\" />\n </NavigationMenuPrimitive.Indicator>\n )\n}\n\nexport {\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n navigationMenuTriggerStyle,\n}\n","\"use client\"\n\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction RadioGroup({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return (\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid w-full gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n className={cn(\n \"group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"flex size-4 items-center justify-center\"\n >\n <span className=\"absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n","import * as ResizablePrimitive from \"react-resizable-panels\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction ResizablePanelGroup({\n className,\n ...props\n}: ResizablePrimitive.GroupProps) {\n return (\n <ResizablePrimitive.Group\n data-slot=\"resizable-panel-group\"\n className={cn(\n \"flex h-full w-full aria-[orientation=vertical]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />\n}\n\nfunction ResizableHandle({\n withHandle,\n className,\n ...props\n}: ResizablePrimitive.SeparatorProps & {\n withHandle?: boolean\n}) {\n return (\n <ResizablePrimitive.Separator\n data-slot=\"resizable-handle\"\n className={cn(\n \"relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90\",\n className\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-6 w-1 shrink-0 rounded-lg bg-border\" />\n )}\n </ResizablePrimitive.Separator>\n )\n}\n\nexport { ResizableHandle, ResizablePanel, ResizablePanelGroup }\n","import { Slider as SliderPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max]\n )\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n className={cn(\n \"relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto data-vertical:flex-col\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"relative grow overflow-hidden rounded-full bg-muted data-horizontal:h-1 data-horizontal:w-full data-vertical:h-full data-vertical:w-1\"\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className=\"absolute bg-primary select-none data-horizontal:h-full data-vertical:w-full\"\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider }\n","import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from \"lucide-react\"\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\"\n\nimport { useIsDark } from \"@/hooks/use-is-dark\";\n\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const isDark = useIsDark();\n const theme = isDark ? \"dark\" : \"light\";\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n icons={{\n success: (\n <CircleCheckIcon className=\"size-4\" />\n ),\n info: (\n <InfoIcon className=\"size-4\" />\n ),\n warning: (\n <TriangleAlertIcon className=\"size-4\" />\n ),\n error: (\n <OctagonXIcon className=\"size-4\" />\n ),\n loading: (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ),\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n toast: \"cn-toast\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n","import { Loader2Icon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <Loader2Icon role=\"status\" aria-label=\"Loading\" className={cn(\"size-4 animate-spin\", className)} {...props} />\n )\n}\n\nexport { Spinner }\n","import { cva, type VariantProps } from \"class-variance-authority\"\nimport { Toggle as TogglePrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst toggleVariants = cva(\n \"group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-muted data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline: \"border border-input bg-transparent hover:bg-muted\",\n },\n size: {\n default: \"h-8 min-w-8 px-2\",\n sm: \"h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-1.5 text-[0.8rem]\",\n lg: \"h-9 min-w-9 px-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","import { type VariantProps } from \"class-variance-authority\"\nimport { ToggleGroup as ToggleGroupPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { toggleVariants } from \"@/components/ui/toggle\"\nimport { cn } from \"@/lib/utils\"\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: \"horizontal\" | \"vertical\"\n }\n>({\n size: \"default\",\n variant: \"default\",\n spacing: 0,\n orientation: \"horizontal\",\n})\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n spacing = 0,\n orientation = \"horizontal\",\n children,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: \"horizontal\" | \"vertical\"\n }) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n data-spacing={spacing}\n data-orientation={orientation}\n style={{ \"--gap\": spacing } as React.CSSProperties}\n className={cn(\n \"group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch\",\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider\n value={{ variant, size, spacing, orientation }}\n >\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>) {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-size={context.size || size}\n data-spacing={context.spacing}\n className={cn(\n \"shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t\",\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n"],"names":["cn","inputs","twMerge","clsx","Avatar","className","size","props","jsx","AvatarPrimitive","AvatarImage","AvatarFallback","AvatarBadge","AvatarGroup","AvatarGroupCount","buttonVariants","cva","Button","variant","asChild","Comp","Slot","Separator","orientation","decorative","SeparatorPrimitive","AppHeader","hostname","userProfile","onHomeClick","onSettingsClick","onUserProfileClick","getInitials","name","part","jsxs","Fragment","Home","Settings","TooltipProvider","delayDuration","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","sideOffset","children","useIsDark","isDark","setIsDark","useState","useEffect","root","observer","mutations","mutation","LIGHT_THEME","DARK_THEME","useCodeEditorTheme","useMemo","THEME_MAP","CodeEditor","value","onChange","language","themeProp","height","width","options","onCopy","onLaunch","disabled","editorTheme","monacoRef","useRef","copyState","setCopyState","launchState","setLaunchState","FEEDBACK_RESET_DELAY_MS","handleCopy","useCallback","code","handleLaunch","handleEditorWillMount","monaco","defaultOptions","Copy","Rocket","MonacoEditor","Dialog","DialogPrimitive","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","DialogContent","showCloseButton","XIcon","DialogHeader","DialogFooter","DialogTitle","DialogDescription","Input","type","TetraScienceIcon","React","fill","ref","Textarea","AssistantModal","open","onOpenChange","title","prompt","initialCode","userQuery","onUserQueryChange","onSend","setCode","input","setInput","localUserQuery","setLocalUserQuery","TetrascienceIcon","e","v","SendHorizontal","CodeScriptEditorButton","onCodeSave","buttonText","modalTitle","buttonProps","modalProps","isModalOpen","setIsModalOpen","currentCode","setCurrentCode","lineCount","charCount","handleOpenModal","handleSave","handleCancel","handleCodeChange","Pencil","Label","LabelPrimitive","Select","SelectPrimitive","SelectGroup","SelectValue","SelectTrigger","ChevronDownIcon","SelectContent","position","align","SelectScrollUpButton","SelectScrollDownButton","SelectLabel","SelectItem","CheckIcon","SelectSeparator","ChevronUpIcon","Switch","SwitchPrimitive","DEPLOY_DELAY_MS","defaultInitialCode","LaunchContent","onDeploy","versions","currentVersion","overwriteMode","setOverwriteMode","isDeploying","setIsDeploying","handleDeploy","toast","DefaultLogo","Building","DefaultProjectIcon","Lamp","Navbar","organization","Card","CardHeader","CardTitle","CardDescription","CardAction","CardContent","CardFooter","ProtocolConfiguration","isEditMode","setIsEditMode","prev","Plus","ProtocolYamlCard","newVersionMode","onToggleNewVersionMode","versionOptions","selectedVersion","onVersionChange","yaml","onYamlChange","option","PythonEditorModal","initialValue","description","onSave","onCancel","SidebarItem","SidebarIcon","label","active","onClick","Sidebar","items","activeItem","onItemClick","handleItemClick","item","EMPTY_OPTION_SENTINEL_PREFIX","getEmptyOptionValue","filterKey","DefaultFilters","filters","filterValues","onFilterChange","filter","emptyOptionValue","hasEmptyOption","selectedValue","hasSelectedOption","selectValue","Table","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","DefaultResults","results","total","currentPage","pageSize","columns","onPageChange","sortKey","sortDirection","onSort","totalPages","pageNumbers","pages","i","start","end","handleSort","key","sortIcon","columnKey","ArrowUpDown","ArrowUp","ArrowDown","col","row","rowIndex","content","ChevronLeft","page","ChevronRight","DefaultSearchBar","query","setQuery","onSearch","isLoading","placeholder","Search","AUTH_TOKEN_HEADER","ORG_SLUG_HEADER","STANDALONE_SEARCH_PATH","buildEsBody","searchRequest","from","searchTerm","sort","order","rest","body","k","useSearch","config","setResults","setTotal","setCurrentPage","setIsLoading","error","setError","standalone","baseUrl","apiEndpoint","authToken","orgSlug","url","fetchInit","headers","response","errorData","message","data","transformedResults","hit","totalHits","err","readLocalStorage","readCookie","match","useTdpCredentials","explicitToken","explicitOrgSlug","lsToken","lsOrgSlug","cookieToken","cookieOrgSlug","alertVariants","Alert","AlertTitle","AlertDescription","AlertAction","TdpSearch","defaultQuery","defaultSort","advancedSearchParams","searchPlaceholder","renderSearchBar","renderFilters","renderResults","executeSearch","setFilterValues","setSortKey","setSortDirection","hasSearched","setHasSearched","handleExecuteSearch","sortOverride","effectiveSortKey","effectiveOrder","filterExpressions","expression","newResults","handleSearch","handleFilterChange","handlePageChange","direction","emptyState","searchBarProps","filtersProps","resultsProps","AlertCircle","TDP_ROUTE_PREFIXES","getTdpBaseUrlFromReferrer","referrerUrl","pathname","prefix","prefixIndex","basePath","buildTdpUrl","path","normalizedPath","navigateToTdpUrl","tdpUrl","relativePath","tdpPaths","fileId","pipelineId","namespace","slug","TdpNavigationContext","createContext","useTdpNavigationContext","context","useContext","TdpNavigationProvider","explicitBaseUrl","tdpBaseUrl","contextValue","useTdpNavigation","opts","TDPLink","navigationOptions","getTdpUrl","navigateToTdp","href","handleClick","AppLayout","sidebarItems","SearchCode","Workflow","Monitor","Box","Database","PieChart","CheckCheck","Code","setActiveItem","AppSidebar","usePlotlyTheme","AreaGraph","dataSeries","xRange","yRange","xTitle","yTitle","plotRef","theme","xMin","xMax","yMin","yMax","minX","maxX","minY","maxY","series","x","y","xPadding","yPadding","effectiveXRange","effectiveYRange","xTicks","range","step","ticks","current","yTicks","tickOptions","titleOptions","cumulativeY","index","stackedY","result","layout","Plotly","plotElement","BarGraph","barWidth","s","barMode","DEFAULT_POINT_POSITION","Boxplot","showPoints","PLOT_HEIGHT_OFFSET","Y_AXIS_PADDING_FACTOR","determineBase","peakValues","values","val","highestBase","highestValue","base","Chromatogram","positionInterval","colorA","colorT","colorG","colorC","positions","sequence","peakA","peakT","peakG","peakC","aTrace","tTrace","gTrace","cTrace","maxValue","plotData","renderSequenceLetters","minPosition","maxPosition","chartWidth","color","leftPosition","renderPositionNumbers","startPos","regularPositionLabels","pos","getCSSVar","cssVar","fallback","fallbackSuffix","COLORS","CHART_COLORS","CHROMATOGRAM_LAYOUT","CHROMATOGRAM_ANNOTATION","ANNOTATION_SLOTS","groupOverlappingPeaks","peaksWithMeta","overlapThreshold","sorted","a","b","groups","currentGroup","lastInGroup","createPeakAnnotation","peak","seriesIndex","slot","isUserDefined","textColor","text","ax","ay","createGroupAnnotations","group","slotIndex","BOUNDARY_MARKER_START_Y","BOUNDARY_MARKER_END_Y","BOUNDARY_MARKER_SERIES_OFFSET","createMarkerTrace","xPos","yPos","markerType","createBoundaryMarkerTraces","allPeaks","traces","peaks","startMarkerY","endMarkerY","startIdx","endIdx","startX","endX","startMarkerType","endMarkerType","calculateProminence","peakIndex","searchWindow","leftMin","rightMin","j","findPeakBoundaries","startIndex","endIndex","calculatePeakArea","baselineY","area","h","y1","y2","calculateWidthAtHalfMax","halfMax","leftHalf","rightHalf","filterPeaksByDistance","minDistance","filtered","p","detectPeaks","minHeight","prominence","relativeThreshold","threshold","prominenceThreshold","widthAtHalfMax","findClosestIndex","arr","target","left","right","mid","processUserAnnotations","annotations","xArray","yArray","ann","collectPeaksWithBoundaryData","allDetectedPeaks","processedSeries","peaksWithData","annotationsWithBoundaries","buildHoverExtraContent","seriesName","metadata","metaLines","formattedKey","validateSeriesData","length","validX","sanitizedY","applyBaselineCorrection","method","windowSize","slope","baseline","halfWindow","windowSlice","ChromatogramChart","xAxisTitle","yAxisTitle","showLegend","showGridX","showGridY","showMarkers","markerSize","showCrosshairs","baselineCorrection","baselineWindowSize","peakDetectionOptions","showPeakAreas","boundaryMarkers","annotationOverlapThreshold","showExportButton","enablePeakDetection","validated","processedAnnotations","detected","currentRef","traceColor","extraContent","trace","boundaryTraces","allPeaksWithMeta","plotlyAnnotations","DotPlot","seriesArray","defaultColors","defaultSymbols","seriesWithColors","gridColor","PLATE_FORMAT_96","PLATE_FORMAT_384","PLATE_FORMAT_1536","PLATE_FORMAT_CUSTOM","DEFAULT_CATEGORY_COLORS","PLATE_CONFIGS","DEFAULT_COLOR_SCALE","NAMED_COLORSCALES","PLATEMAP_CONSTANTS","ASCII_UPPERCASE_A","ALPHABET_LENGTH","generateRowLabels","count","_","generateColumnLabels","parseWellId","wellId","rowStr","isValidWellPosition","parsed","rows","extractLayerValue","layerId","effectiveLayerId","storeLayerValue","layerValue","grid","categories","wellDataToGrid","wells","allValues","tooltipData","well","wellIdUpper","calculateValueRange","min","max","hasMultiValueWells","extractLayerIds","layerIds","isStringValueLayer","extractLayers","layerConfigs","id","c","isStringLayer","parseRegionWells","rowLabels","colLabels","rangeMatch","startWell","endWell","minRow","maxRow","minCol","maxCol","numRows","numCols","buildWellHoverText","tooltipExtra","activeLayerId","layerConfigMap","precision","valueUnit","formatAllLayerValues","formatTooltipExtra","rawLayerUnit","layerUnit","buildColorbarConfig","legendTitle","buildPlotMargins","hasTitle","hasYTitle","baseLeft","baseRight","leftMargin","rightMargin","bottomMargin","topMargin","calculateTitleX","calculateAxisDomain","flattenGridData","plotZ","hoverText","plotZMin","xData","yData","colorData","textData","rowIdx","colIdx","zValue","MIN_MARKER_SIZE","SQUARE_SIZE_MULTIPLIER","CIRCLE_SIZE_MULTIPLIER","COLORBAR_SPACE","calculateMarkerSize","markerShape","plotWidth","plotHeight","cellWidth","cellHeight","cellSize","PlateMap","initialLayerId","onLayerChange","plateFormat","customRows","customColumns","propVisualizationMode","customCategoryColors","regions","customXLabels","customYLabels","propColorScale","propValueMin","propValueMax","emptyWellColor","showColorBar","legendConfig","onWellClick","onWellClickRef","setActiveLayerId","effectiveLayers","wellDataArray","activeLayer","l","visualizationMode","colorScale","valueMin","valueMax","categoryColors","activeLayerId_","categoriesGrid","allValuesMap","tooltipDataMap","resultGrid","resultCategories","resultAllValues","resultTooltipData","zMin","zMax","hasNullValues","sentinelValue","displayGrid","effectiveColorScale","arrayColorScale","namedScale","totalRange","dataStartRatio","extendedScale","newPos","effectiveZMin","map","layer","categoricalGrid","categoricalColorScale","uniqueTypes","catMax","typesSet","hasNullCategory","category","types","typeToIndex","idx","catGrid","numTypes","catColorScale","normalizedPos","bandHalf","regionShapes","shapes","region","bounds","inset","x0","x1","y0","isCategorical","plotColorScale","plotZMax","plotShowScale","legendPosition","eventData","point","rowLabelsArr","colLabelsArr","wellData","renderLayerSelector","isActive","legendFontSize","legendItemSpacing","legendSwatchSize","legendWidth","isHorizontalLegend","renderLegend","hasCategoricalItems","hasRegions","legendClassNames","legendStyle","plotContent","legendContent","renderPlotWithLegend","normalizeData","maxLength","newRow","Heatmap","xLabels","yLabels","colorscale","showScale","zmin","zmax","normalizedData","defaultRows","r","rowLabel","colLabel","NORMAL_DISTRIBUTION_EXPONENT_COEFF","calculateMean","acc","calculateStdDev","mean","variance","generateNormalDistributionPoints","stdDev","points","xValues","yValues","exponent","scaleDistributionCurve","histogramData","bins","binCount","binFrequencies","binIndex","maxBinFrequency","maxCurveValue","scaleFactor","Histogram","bargap","showDistributionLine","effectiveBarMode","hasDistributionLine","distributionLines","curvePoints","scaledYValues","rowSize","LineGraph","mode","DEFAULT_INITIAL_CODE","LaunchContentPanel","setCurrentVersion","version","MainHeader","MainNavbar","ScrollArea","ScrollAreaPrimitive","ScrollBar","MainSidebar","Tabs","TabsPrimitive","tabsListVariants","TabsList","TabsTrigger","TabsContent","MainTabBar","tabs","tab","ProtocolConfigurationPanel","TemplateSidebarCard","linkText","status","onButtonClick","onLinkClick","event","Sheet","SheetPrimitive","SheetTrigger","SheetClose","SheetPortal","SheetOverlay","SheetContent","side","SheetHeader","SheetFooter","SheetTitle","SheetDescription","Skeleton","MOBILE_BREAKPOINT","useIsMobile","isMobile","setIsMobile","mql","SECONDS_IN_A_MINUTE","HOURS_IN_A_DAY","DAYS_IN_A_WEEK","SIDEBAR_COOKIE_NAME","SIDEBAR_COOKIE_MAX_AGE","SIDEBAR_WIDTH","SIDEBAR_WIDTH_MOBILE","SIDEBAR_WIDTH_ICON","SIDEBAR_KEYBOARD_SHORTCUT","SidebarContext","useSidebar","SidebarProvider","defaultOpen","openProp","setOpenProp","style","openMobile","setOpenMobile","_open","_setOpen","setOpen","openState","toggleSidebar","handleKeyDown","state","collapsible","dir","SidebarTrigger","PanelLeftIcon","SidebarRail","SidebarInset","SidebarInput","SidebarHeader","SidebarFooter","SidebarSeparator","SidebarContent","SidebarGroup","SidebarGroupLabel","SidebarGroupAction","SidebarGroupContent","SidebarMenu","SidebarMenuItem","sidebarMenuButtonVariants","SidebarMenuButton","tooltip","button","SidebarMenuAction","showOnHover","SidebarMenuBadge","SidebarMenuSkeleton","showIcon","SidebarMenuSub","SidebarMenuSubItem","SidebarMenuSubButton","Main","leftTabs","rightTabs","activeLeftTab","setActiveLeftTab","activeRightTab","setActiveRightTab","selectedTemplate","setSelectedTemplate","templates","protocol","steps","handleSidebarItemClick","handleLeftTabChange","tabId","handleRightTabChange","handleHomeClick","handleSettingsClick","handleUserProfileClick","handleTemplateClick","templateId","handleUseTemplate","handleViewTemplate","Trash2","template","Inbox","DEFAULT_COLORS","textInfo","hole","rotation","colors","missingColors","labels","ScatterGraph","spikeOptions","Accordion","AccordionPrimitive","AccordionItem","AccordionTrigger","AccordionContent","AlertDialog","AlertDialogPrimitive","AlertDialogTrigger","AlertDialogPortal","AlertDialogOverlay","AlertDialogContent","AlertDialogHeader","AlertDialogFooter","AlertDialogMedia","AlertDialogTitle","AlertDialogDescription","AlertDialogAction","AlertDialogCancel","AspectRatio","AspectRatioPrimitive","badgeVariants","Badge","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbPage","BreadcrumbSeparator","ChevronRightIcon","BreadcrumbEllipsis","MoreHorizontalIcon","buttonGroupVariants","ButtonGroup","ButtonGroupText","ButtonGroupSeparator","Calendar","classNames","showOutsideDays","captionLayout","buttonVariant","locale","formatters","components","defaultClassNames","getDefaultClassNames","DayPicker","date","rootRef","ChevronLeftIcon","CalendarDayButton","day","modifiers","CarouselContext","useCarousel","Carousel","setApi","plugins","carouselRef","api","useEmblaCarousel","canScrollPrev","setCanScrollPrev","canScrollNext","setCanScrollNext","onSelect","scrollPrev","scrollNext","CarouselContent","CarouselItem","CarouselPrevious","CarouselNext","Checkbox","CheckboxPrimitive","Collapsible","CollapsiblePrimitive","CollapsibleTrigger","CollapsibleContent","InputGroup","inputGroupAddonVariants","InputGroupAddon","inputGroupButtonVariants","InputGroupButton","InputGroupText","InputGroupInput","InputGroupTextarea","Combobox","ComboboxPrimitive","ComboboxValue","ComboboxTrigger","ComboboxClear","ComboboxInput","showTrigger","showClear","ComboboxContent","alignOffset","anchor","ComboboxList","ComboboxItem","ComboboxGroup","ComboboxLabel","ComboboxCollection","ComboboxEmpty","ComboboxSeparator","ComboboxChips","ComboboxChip","showRemove","ComboboxChipsInput","useComboboxAnchor","Command","CommandPrimitive","CommandDialog","CommandInput","SearchIcon","CommandList","CommandEmpty","CommandGroup","CommandSeparator","CommandItem","CommandShortcut","ContextMenu","ContextMenuPrimitive","ContextMenuTrigger","ContextMenuGroup","ContextMenuPortal","ContextMenuSub","ContextMenuRadioGroup","ContextMenuContent","ContextMenuItem","ContextMenuSubTrigger","ContextMenuSubContent","ContextMenuCheckboxItem","checked","ContextMenuRadioItem","ContextMenuLabel","ContextMenuSeparator","ContextMenuShortcut","Drawer","DrawerPrimitive","DrawerTrigger","DrawerPortal","DrawerClose","DrawerOverlay","DrawerContent","DrawerHeader","DrawerFooter","DrawerTitle","DrawerDescription","DropdownMenu","DropdownMenuPrimitive","DropdownMenuPortal","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","DropdownMenuCheckboxItem","DropdownMenuRadioGroup","DropdownMenuRadioItem","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","FieldSet","FieldLegend","FieldGroup","fieldVariants","Field","FieldContent","FieldLabel","FieldTitle","FieldDescription","FieldSeparator","FieldError","errors","uniqueErrors","HoverCard","HoverCardPrimitive","HoverCardTrigger","HoverCardContent","InputOTP","containerClassName","OTPInput","InputOTPGroup","InputOTPSlot","inputOTPContext","OTPInputContext","char","hasFakeCaret","InputOTPSeparator","MinusIcon","ItemGroup","ItemSeparator","itemVariants","Item","itemMediaVariants","ItemMedia","ItemContent","ItemTitle","ItemDescription","ItemActions","ItemHeader","ItemFooter","Kbd","KbdGroup","Menubar","MenubarPrimitive","MenubarMenu","MenubarGroup","MenubarPortal","MenubarRadioGroup","MenubarTrigger","MenubarContent","MenubarItem","MenubarCheckboxItem","MenubarRadioItem","MenubarLabel","MenubarSeparator","MenubarShortcut","MenubarSub","MenubarSubTrigger","MenubarSubContent","NavigationMenu","viewport","NavigationMenuPrimitive","NavigationMenuViewport","NavigationMenuList","NavigationMenuItem","navigationMenuTriggerStyle","NavigationMenuTrigger","NavigationMenuContent","NavigationMenuLink","NavigationMenuIndicator","RadioGroup","RadioGroupPrimitive","RadioGroupItem","ResizablePanelGroup","ResizablePrimitive","ResizablePanel","ResizableHandle","withHandle","Slider","defaultValue","_values","SliderPrimitive","Toaster","Sonner","CircleCheckIcon","InfoIcon","TriangleAlertIcon","OctagonXIcon","Loader2Icon","Spinner","toggleVariants","Toggle","TogglePrimitive","ToggleGroupContext","ToggleGroup","spacing","ToggleGroupPrimitive","ToggleGroupItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|