@tetrascience-npm/tetrascience-react-ui 0.7.0-beta.107.1 → 0.7.0-beta.128.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +2 -2
  2. package/dist/components/ai/chain-of-thought.cjs +1 -1
  3. package/dist/components/ai/chain-of-thought.cjs.map +1 -1
  4. package/dist/components/ai/chain-of-thought.js +1 -1
  5. package/dist/components/ai/chain-of-thought.js.map +1 -1
  6. package/dist/components/ai/confirmation.cjs +1 -1
  7. package/dist/components/ai/confirmation.cjs.map +1 -1
  8. package/dist/components/ai/confirmation.js +1 -1
  9. package/dist/components/ai/confirmation.js.map +1 -1
  10. package/dist/components/ai/context.cjs +1 -1
  11. package/dist/components/ai/context.cjs.map +1 -1
  12. package/dist/components/ai/context.js +36 -35
  13. package/dist/components/ai/context.js.map +1 -1
  14. package/dist/components/ai/message.cjs +1 -1
  15. package/dist/components/ai/message.cjs.map +1 -1
  16. package/dist/components/ai/message.js +68 -68
  17. package/dist/components/ai/message.js.map +1 -1
  18. package/dist/components/ai/prompt-input.cjs +1 -1
  19. package/dist/components/ai/prompt-input.cjs.map +1 -1
  20. package/dist/components/ai/prompt-input.js +4 -2
  21. package/dist/components/ai/prompt-input.js.map +1 -1
  22. package/dist/components/ai/queue.cjs +1 -1
  23. package/dist/components/ai/queue.cjs.map +1 -1
  24. package/dist/components/ai/queue.js +9 -9
  25. package/dist/components/ai/queue.js.map +1 -1
  26. package/dist/components/ai/reasoning.cjs +1 -1
  27. package/dist/components/ai/reasoning.cjs.map +1 -1
  28. package/dist/components/ai/reasoning.js +67 -67
  29. package/dist/components/ai/reasoning.js.map +1 -1
  30. package/dist/components/ai/stream-status.cjs +1 -1
  31. package/dist/components/ai/stream-status.cjs.map +1 -1
  32. package/dist/components/ai/stream-status.js +41 -39
  33. package/dist/components/ai/stream-status.js.map +1 -1
  34. package/dist/components/ai/streamdown-code-plugin.cjs +2 -0
  35. package/dist/components/ai/streamdown-code-plugin.cjs.map +1 -0
  36. package/dist/components/ai/streamdown-code-plugin.js +42 -0
  37. package/dist/components/ai/streamdown-code-plugin.js.map +1 -0
  38. package/dist/components/ai/streamdown-plugins.cjs +2 -0
  39. package/dist/components/ai/streamdown-plugins.cjs.map +1 -0
  40. package/dist/components/ai/streamdown-plugins.js +14 -0
  41. package/dist/components/ai/streamdown-plugins.js.map +1 -0
  42. package/dist/components/ai/task.cjs +1 -1
  43. package/dist/components/ai/task.cjs.map +1 -1
  44. package/dist/components/ai/task.js +18 -11
  45. package/dist/components/ai/task.js.map +1 -1
  46. package/dist/components/ai/tool.cjs +1 -1
  47. package/dist/components/ai/tool.cjs.map +1 -1
  48. package/dist/components/ai/tool.js +51 -55
  49. package/dist/components/ai/tool.js.map +1 -1
  50. package/dist/components/ai/use-streamdown-plugins.cjs +2 -0
  51. package/dist/components/ai/use-streamdown-plugins.cjs.map +1 -0
  52. package/dist/components/ai/use-streamdown-plugins.js +25 -0
  53. package/dist/components/ai/use-streamdown-plugins.js.map +1 -0
  54. package/dist/components/charts/AreaPlot/AreaPlot.cjs +2 -0
  55. package/dist/components/charts/AreaPlot/AreaPlot.cjs.map +1 -0
  56. package/dist/components/charts/AreaPlot/AreaPlot.js +270 -0
  57. package/dist/components/charts/AreaPlot/AreaPlot.js.map +1 -0
  58. package/dist/components/charts/BarChart/BarChart.cjs +2 -0
  59. package/dist/components/charts/BarChart/BarChart.cjs.map +1 -0
  60. package/dist/components/charts/BarChart/BarChart.js +219 -0
  61. package/dist/components/charts/BarChart/BarChart.js.map +1 -0
  62. package/dist/components/charts/BoxPlot/BoxPlot.cjs +2 -0
  63. package/dist/components/charts/BoxPlot/BoxPlot.cjs.map +1 -0
  64. package/dist/components/charts/{Boxplot/Boxplot.js → BoxPlot/BoxPlot.js} +78 -79
  65. package/dist/components/charts/BoxPlot/BoxPlot.js.map +1 -0
  66. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
  67. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
  68. package/dist/components/charts/ChartTooltip/ChartTooltip.js +22 -22
  69. package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
  70. package/dist/components/charts/Chromatogram/Chromatogram.cjs +1 -1
  71. package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -1
  72. package/dist/components/charts/Chromatogram/Chromatogram.js +232 -170
  73. package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -1
  74. package/dist/components/charts/Chromatogram/annotations.cjs +2 -0
  75. package/dist/components/charts/Chromatogram/annotations.cjs.map +1 -0
  76. package/dist/components/charts/Chromatogram/annotations.js +137 -0
  77. package/dist/components/charts/Chromatogram/annotations.js.map +1 -0
  78. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs +2 -0
  79. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs.map +1 -0
  80. package/dist/components/charts/Chromatogram/boundaryMarkers.js +34 -0
  81. package/dist/components/charts/Chromatogram/boundaryMarkers.js.map +1 -0
  82. package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.cjs +1 -1
  83. package/dist/components/charts/Chromatogram/constants.cjs.map +1 -0
  84. package/dist/components/charts/{ChromatogramChart → Chromatogram}/constants.js +11 -5
  85. package/dist/components/charts/Chromatogram/constants.js.map +1 -0
  86. package/dist/components/charts/Chromatogram/dataProcessing.cjs +2 -0
  87. package/dist/components/charts/Chromatogram/dataProcessing.cjs.map +1 -0
  88. package/dist/components/charts/Chromatogram/dataProcessing.js +90 -0
  89. package/dist/components/charts/Chromatogram/dataProcessing.js.map +1 -0
  90. package/dist/components/charts/Chromatogram/peakDetection.cjs.map +1 -0
  91. package/dist/components/charts/Chromatogram/peakDetection.js.map +1 -0
  92. package/dist/components/charts/Chromatogram/plotBuilder.cjs +2 -0
  93. package/dist/components/charts/Chromatogram/plotBuilder.cjs.map +1 -0
  94. package/dist/components/charts/Chromatogram/plotBuilder.js +216 -0
  95. package/dist/components/charts/Chromatogram/plotBuilder.js.map +1 -0
  96. package/dist/components/charts/Chromatogram/regionOverlays.cjs +2 -0
  97. package/dist/components/charts/Chromatogram/regionOverlays.cjs.map +1 -0
  98. package/dist/components/charts/Chromatogram/regionOverlays.js +26 -0
  99. package/dist/components/charts/Chromatogram/regionOverlays.js.map +1 -0
  100. package/dist/components/charts/Electropherogram/Electropherogram.cjs +2 -0
  101. package/dist/components/charts/Electropherogram/Electropherogram.cjs.map +1 -0
  102. package/dist/components/charts/Electropherogram/Electropherogram.js +180 -0
  103. package/dist/components/charts/Electropherogram/Electropherogram.js.map +1 -0
  104. package/dist/components/charts/Histogram/Histogram.cjs +1 -1
  105. package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
  106. package/dist/components/charts/Histogram/Histogram.js +107 -108
  107. package/dist/components/charts/Histogram/Histogram.js.map +1 -1
  108. package/dist/components/charts/LinePlot/LinePlot.cjs +2 -0
  109. package/dist/components/charts/LinePlot/LinePlot.cjs.map +1 -0
  110. package/dist/components/charts/LinePlot/LinePlot.js +224 -0
  111. package/dist/components/charts/LinePlot/LinePlot.js.map +1 -0
  112. package/dist/components/charts/PieChart/PieChart.cjs +1 -1
  113. package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
  114. package/dist/components/charts/PieChart/PieChart.js +62 -61
  115. package/dist/components/charts/PieChart/PieChart.js.map +1 -1
  116. package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
  117. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
  118. package/dist/components/charts/PlateMap/PlateMap.js +246 -242
  119. package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
  120. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +2 -0
  121. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs.map +1 -0
  122. package/dist/components/charts/ScatterPlot/ScatterPlot.js +252 -0
  123. package/dist/components/charts/ScatterPlot/ScatterPlot.js.map +1 -0
  124. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs +2 -0
  125. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs.map +1 -0
  126. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js +215 -0
  127. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js.map +1 -0
  128. package/dist/components/charts/ScatterPlotInteractive/constants.cjs +2 -0
  129. package/dist/components/charts/ScatterPlotInteractive/constants.cjs.map +1 -0
  130. package/dist/components/charts/ScatterPlotInteractive/constants.js +38 -0
  131. package/dist/components/charts/ScatterPlotInteractive/constants.js.map +1 -0
  132. package/dist/components/charts/ScatterPlotInteractive/utils.cjs +2 -0
  133. package/dist/components/charts/ScatterPlotInteractive/utils.cjs.map +1 -0
  134. package/dist/components/charts/ScatterPlotInteractive/utils.js +261 -0
  135. package/dist/components/charts/ScatterPlotInteractive/utils.js.map +1 -0
  136. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs +2 -0
  137. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs.map +1 -0
  138. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js +40 -0
  139. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js.map +1 -0
  140. package/dist/components/charts/StackedChromatogram/transforms.cjs +2 -0
  141. package/dist/components/charts/StackedChromatogram/transforms.cjs.map +1 -0
  142. package/dist/components/charts/StackedChromatogram/transforms.js +31 -0
  143. package/dist/components/charts/StackedChromatogram/transforms.js.map +1 -0
  144. package/dist/components/charts/plotly-loader.cjs +2 -0
  145. package/dist/components/charts/plotly-loader.cjs.map +1 -0
  146. package/dist/components/charts/plotly-loader.js +22 -0
  147. package/dist/components/charts/plotly-loader.js.map +1 -0
  148. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +2 -0
  149. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -0
  150. package/dist/components/composed/AssistantLayout/AssistantLayout.js +142 -0
  151. package/dist/components/composed/AssistantLayout/AssistantLayout.js.map +1 -0
  152. package/dist/components/composed/AssistantLayout/dockLayout.cjs +2 -0
  153. package/dist/components/composed/AssistantLayout/dockLayout.cjs.map +1 -0
  154. package/dist/components/composed/AssistantLayout/dockLayout.js +10 -0
  155. package/dist/components/composed/AssistantLayout/dockLayout.js.map +1 -0
  156. package/dist/components/composed/Chat/Chat.cjs +1 -1
  157. package/dist/components/composed/Chat/Chat.cjs.map +1 -1
  158. package/dist/components/composed/Chat/Chat.js +23 -23
  159. package/dist/components/composed/Chat/Chat.js.map +1 -1
  160. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
  161. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  162. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +33 -29
  163. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js.map +1 -1
  164. package/dist/components/composed/DataAppShell/CollapseButton.cjs +2 -0
  165. package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -0
  166. package/dist/components/composed/DataAppShell/CollapseButton.js +42 -0
  167. package/dist/components/composed/DataAppShell/CollapseButton.js.map +1 -0
  168. package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
  169. package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
  170. package/dist/components/composed/DataAppShell/DataAppShell.js +349 -313
  171. package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
  172. package/dist/components/composed/DataAppShell/PrimaryNav.cjs +2 -0
  173. package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -0
  174. package/dist/components/composed/DataAppShell/PrimaryNav.js +268 -0
  175. package/dist/components/composed/DataAppShell/PrimaryNav.js.map +1 -0
  176. package/dist/components/composed/DataAppShell/RightPanel.cjs +2 -0
  177. package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -0
  178. package/dist/components/composed/DataAppShell/RightPanel.js +282 -0
  179. package/dist/components/composed/DataAppShell/RightPanel.js.map +1 -0
  180. package/dist/components/composed/DataAppShell/SecondaryNav.cjs +2 -0
  181. package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -0
  182. package/dist/components/composed/DataAppShell/SecondaryNav.js +364 -0
  183. package/dist/components/composed/DataAppShell/SecondaryNav.js.map +1 -0
  184. package/dist/components/composed/DataAppShell/ShellContext.cjs +2 -0
  185. package/dist/components/composed/DataAppShell/ShellContext.cjs.map +1 -0
  186. package/dist/components/composed/DataAppShell/ShellContext.js +23 -0
  187. package/dist/components/composed/DataAppShell/ShellContext.js.map +1 -0
  188. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +2 -0
  189. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -0
  190. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +87 -0
  191. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js.map +1 -0
  192. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +2 -0
  193. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -0
  194. package/dist/components/composed/MoleculeStructure/rdkit-loader.js +89 -0
  195. package/dist/components/composed/MoleculeStructure/rdkit-loader.js.map +1 -0
  196. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs +2 -0
  197. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs.map +1 -0
  198. package/dist/components/composed/MoleculeStructure/use-rdkit.js +19 -0
  199. package/dist/components/composed/MoleculeStructure/use-rdkit.js.map +1 -0
  200. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
  201. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
  202. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +17 -17
  203. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -1
  204. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
  205. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
  206. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +33 -33
  207. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -1
  208. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
  209. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
  210. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +7 -7
  211. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -1
  212. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +1 -1
  213. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -1
  214. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +1 -1
  215. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
  216. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  217. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  218. package/dist/components/composed/PlateMapEditor/WellLegend.js +24 -12
  219. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
  220. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
  221. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
  222. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +1 -1
  223. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
  224. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
  225. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
  226. package/dist/components/composed/TdpSearch/components/DefaultFilters.js +3 -3
  227. package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -1
  228. package/dist/components/composed/TopBar/TopBar.cjs +2 -0
  229. package/dist/components/composed/TopBar/TopBar.cjs.map +1 -0
  230. package/dist/components/composed/TopBar/TopBar.js +56 -0
  231. package/dist/components/composed/TopBar/TopBar.js.map +1 -0
  232. package/dist/components/composed/UserMenu/UserMenu.cjs +2 -0
  233. package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -0
  234. package/dist/components/composed/UserMenu/UserMenu.js +99 -0
  235. package/dist/components/composed/UserMenu/UserMenu.js.map +1 -0
  236. package/dist/components/composed/tdp-link.cjs +1 -1
  237. package/dist/components/composed/tdp-link.cjs.map +1 -1
  238. package/dist/components/composed/tdp-link.js +5 -5
  239. package/dist/components/composed/tdp-link.js.map +1 -1
  240. package/dist/components/ui/alert.cjs +1 -1
  241. package/dist/components/ui/alert.cjs.map +1 -1
  242. package/dist/components/ui/alert.js +12 -12
  243. package/dist/components/ui/alert.js.map +1 -1
  244. package/dist/components/ui/badge.cjs +1 -1
  245. package/dist/components/ui/badge.cjs.map +1 -1
  246. package/dist/components/ui/badge.js +14 -14
  247. package/dist/components/ui/badge.js.map +1 -1
  248. package/dist/components/ui/banner.cjs +1 -1
  249. package/dist/components/ui/banner.cjs.map +1 -1
  250. package/dist/components/ui/banner.js +17 -17
  251. package/dist/components/ui/banner.js.map +1 -1
  252. package/dist/components/ui/button.cjs +1 -1
  253. package/dist/components/ui/button.cjs.map +1 -1
  254. package/dist/components/ui/button.js +16 -16
  255. package/dist/components/ui/button.js.map +1 -1
  256. package/dist/components/ui/calendar.cjs +1 -1
  257. package/dist/components/ui/calendar.cjs.map +1 -1
  258. package/dist/components/ui/calendar.js +3 -3
  259. package/dist/components/ui/calendar.js.map +1 -1
  260. package/dist/components/ui/code-block.cjs +3 -3
  261. package/dist/components/ui/code-block.cjs.map +1 -1
  262. package/dist/components/ui/code-block.js +136 -118
  263. package/dist/components/ui/code-block.js.map +1 -1
  264. package/dist/components/ui/code-editor.cjs +1 -1
  265. package/dist/components/ui/code-editor.cjs.map +1 -1
  266. package/dist/components/ui/code-editor.js +14 -12
  267. package/dist/components/ui/code-editor.js.map +1 -1
  268. package/dist/components/ui/combobox.cjs +1 -1
  269. package/dist/components/ui/combobox.cjs.map +1 -1
  270. package/dist/components/ui/combobox.js +33 -29
  271. package/dist/components/ui/combobox.js.map +1 -1
  272. package/dist/components/ui/command.cjs +1 -1
  273. package/dist/components/ui/command.cjs.map +1 -1
  274. package/dist/components/ui/command.js +81 -77
  275. package/dist/components/ui/command.js.map +1 -1
  276. package/dist/components/ui/context-menu.cjs +1 -1
  277. package/dist/components/ui/context-menu.cjs.map +1 -1
  278. package/dist/components/ui/context-menu.js +13 -13
  279. package/dist/components/ui/context-menu.js.map +1 -1
  280. package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
  281. package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
  282. package/dist/components/ui/data-table/data-table-column-toggle.js +70 -62
  283. package/dist/components/ui/data-table/data-table-column-toggle.js.map +1 -1
  284. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  285. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  286. package/dist/components/ui/data-table/data-table-filter.js +24 -23
  287. package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
  288. package/dist/components/ui/data-table/data-table-group.cjs +1 -1
  289. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
  290. package/dist/components/ui/data-table/data-table-group.js +17 -16
  291. package/dist/components/ui/data-table/data-table-group.js.map +1 -1
  292. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  293. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  294. package/dist/components/ui/data-table/data-table-pagination.js +15 -15
  295. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  296. package/dist/components/ui/data-table/data-table.cjs +1 -1
  297. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  298. package/dist/components/ui/data-table/data-table.js +191 -190
  299. package/dist/components/ui/data-table/data-table.js.map +1 -1
  300. package/dist/components/ui/dialog.cjs +1 -1
  301. package/dist/components/ui/dialog.cjs.map +1 -1
  302. package/dist/components/ui/dialog.js +1 -1
  303. package/dist/components/ui/dialog.js.map +1 -1
  304. package/dist/components/ui/dropdown-menu.cjs +1 -1
  305. package/dist/components/ui/dropdown-menu.cjs.map +1 -1
  306. package/dist/components/ui/dropdown-menu.js +12 -4
  307. package/dist/components/ui/dropdown-menu.js.map +1 -1
  308. package/dist/components/ui/hover-card.cjs +1 -1
  309. package/dist/components/ui/hover-card.cjs.map +1 -1
  310. package/dist/components/ui/hover-card.js +3 -3
  311. package/dist/components/ui/hover-card.js.map +1 -1
  312. package/dist/components/ui/item.cjs +1 -1
  313. package/dist/components/ui/item.cjs.map +1 -1
  314. package/dist/components/ui/item.js +44 -36
  315. package/dist/components/ui/item.js.map +1 -1
  316. package/dist/components/ui/menubar.cjs +1 -1
  317. package/dist/components/ui/menubar.cjs.map +1 -1
  318. package/dist/components/ui/menubar.js +2 -2
  319. package/dist/components/ui/menubar.js.map +1 -1
  320. package/dist/components/ui/navigation-menu.cjs +1 -1
  321. package/dist/components/ui/navigation-menu.cjs.map +1 -1
  322. package/dist/components/ui/navigation-menu.js +1 -1
  323. package/dist/components/ui/navigation-menu.js.map +1 -1
  324. package/dist/components/ui/popover.cjs +1 -1
  325. package/dist/components/ui/popover.cjs.map +1 -1
  326. package/dist/components/ui/popover.js +1 -1
  327. package/dist/components/ui/popover.js.map +1 -1
  328. package/dist/components/ui/scroll-area.cjs +1 -1
  329. package/dist/components/ui/scroll-area.cjs.map +1 -1
  330. package/dist/components/ui/scroll-area.js +1 -0
  331. package/dist/components/ui/scroll-area.js.map +1 -1
  332. package/dist/components/ui/select.cjs +1 -1
  333. package/dist/components/ui/select.cjs.map +1 -1
  334. package/dist/components/ui/select.js +1 -1
  335. package/dist/components/ui/select.js.map +1 -1
  336. package/dist/components/ui/sheet.cjs +1 -1
  337. package/dist/components/ui/sheet.cjs.map +1 -1
  338. package/dist/components/ui/sheet.js +5 -5
  339. package/dist/components/ui/sheet.js.map +1 -1
  340. package/dist/components/ui/sidebar.cjs +1 -1
  341. package/dist/components/ui/sidebar.cjs.map +1 -1
  342. package/dist/components/ui/sidebar.js +2 -2
  343. package/dist/components/ui/sidebar.js.map +1 -1
  344. package/dist/components/ui/slider.cjs +1 -1
  345. package/dist/components/ui/slider.cjs.map +1 -1
  346. package/dist/components/ui/slider.js +10 -9
  347. package/dist/components/ui/slider.js.map +1 -1
  348. package/dist/components/ui/sonner.cjs +1 -1
  349. package/dist/components/ui/sonner.cjs.map +1 -1
  350. package/dist/components/ui/sonner.js +25 -10
  351. package/dist/components/ui/sonner.js.map +1 -1
  352. package/dist/components/ui/table.cjs +1 -1
  353. package/dist/components/ui/table.cjs.map +1 -1
  354. package/dist/components/ui/table.js +1 -0
  355. package/dist/components/ui/table.js.map +1 -1
  356. package/dist/components/ui/tabs.cjs +1 -1
  357. package/dist/components/ui/tabs.cjs.map +1 -1
  358. package/dist/components/ui/tabs.js +18 -18
  359. package/dist/components/ui/tabs.js.map +1 -1
  360. package/dist/components/ui/tetra-molecule-icon.cjs +2 -0
  361. package/dist/components/ui/tetra-molecule-icon.cjs.map +1 -0
  362. package/dist/components/ui/tetra-molecule-icon.js +49 -0
  363. package/dist/components/ui/tetra-molecule-icon.js.map +1 -0
  364. package/dist/components/ui/toggle-group.cjs +1 -1
  365. package/dist/components/ui/toggle-group.cjs.map +1 -1
  366. package/dist/components/ui/toggle-group.js +35 -31
  367. package/dist/components/ui/toggle-group.js.map +1 -1
  368. package/dist/hooks/use-plotly-theme.cjs +1 -1
  369. package/dist/hooks/use-plotly-theme.cjs.map +1 -1
  370. package/dist/hooks/use-plotly-theme.js +4 -3
  371. package/dist/hooks/use-plotly-theme.js.map +1 -1
  372. package/dist/index.cjs +1 -1
  373. package/dist/index.css +1 -1
  374. package/dist/index.d.ts +1210 -132
  375. package/dist/index.js +694 -639
  376. package/dist/index.js.map +1 -1
  377. package/dist/index.tailwind.css +1 -1
  378. package/dist/lib/shiki.cjs +2 -0
  379. package/dist/lib/shiki.cjs.map +1 -0
  380. package/dist/lib/shiki.js +72 -0
  381. package/dist/lib/shiki.js.map +1 -0
  382. package/package.json +23 -12
  383. package/dist/components/charts/AreaGraph/AreaGraph.cjs +0 -2
  384. package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +0 -1
  385. package/dist/components/charts/AreaGraph/AreaGraph.js +0 -271
  386. package/dist/components/charts/AreaGraph/AreaGraph.js.map +0 -1
  387. package/dist/components/charts/BarGraph/BarGraph.cjs +0 -2
  388. package/dist/components/charts/BarGraph/BarGraph.cjs.map +0 -1
  389. package/dist/components/charts/BarGraph/BarGraph.js +0 -220
  390. package/dist/components/charts/BarGraph/BarGraph.js.map +0 -1
  391. package/dist/components/charts/Boxplot/Boxplot.cjs +0 -2
  392. package/dist/components/charts/Boxplot/Boxplot.cjs.map +0 -1
  393. package/dist/components/charts/Boxplot/Boxplot.js.map +0 -1
  394. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +0 -2
  395. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +0 -1
  396. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +0 -227
  397. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +0 -1
  398. package/dist/components/charts/ChromatogramChart/annotations.cjs +0 -2
  399. package/dist/components/charts/ChromatogramChart/annotations.cjs.map +0 -1
  400. package/dist/components/charts/ChromatogramChart/annotations.js +0 -73
  401. package/dist/components/charts/ChromatogramChart/annotations.js.map +0 -1
  402. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +0 -2
  403. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +0 -1
  404. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +0 -34
  405. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +0 -1
  406. package/dist/components/charts/ChromatogramChart/constants.cjs.map +0 -1
  407. package/dist/components/charts/ChromatogramChart/constants.js.map +0 -1
  408. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +0 -2
  409. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +0 -1
  410. package/dist/components/charts/ChromatogramChart/dataProcessing.js +0 -79
  411. package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +0 -1
  412. package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +0 -1
  413. package/dist/components/charts/ChromatogramChart/peakDetection.js.map +0 -1
  414. package/dist/components/charts/DotPlot/DotPlot.cjs +0 -2
  415. package/dist/components/charts/DotPlot/DotPlot.cjs.map +0 -1
  416. package/dist/components/charts/DotPlot/DotPlot.js +0 -208
  417. package/dist/components/charts/DotPlot/DotPlot.js.map +0 -1
  418. package/dist/components/charts/Heatmap/Heatmap.cjs +0 -2
  419. package/dist/components/charts/Heatmap/Heatmap.cjs.map +0 -1
  420. package/dist/components/charts/Heatmap/Heatmap.js +0 -67
  421. package/dist/components/charts/Heatmap/Heatmap.js.map +0 -1
  422. package/dist/components/charts/LineGraph/LineGraph.cjs +0 -2
  423. package/dist/components/charts/LineGraph/LineGraph.cjs.map +0 -1
  424. package/dist/components/charts/LineGraph/LineGraph.js +0 -225
  425. package/dist/components/charts/LineGraph/LineGraph.js.map +0 -1
  426. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +0 -2
  427. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +0 -1
  428. package/dist/components/charts/ScatterGraph/ScatterGraph.js +0 -234
  429. package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +0 -1
  430. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.cjs +0 -0
  431. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.js +0 -0
@@ -4,13 +4,13 @@ import * as m from "react";
4
4
  import { triagePlateMapCsvFile as U } from "./csvPlateTriage.js";
5
5
  import { groupTemplateOptions as q } from "./helpers.js";
6
6
  import { Button as K } from "../../ui/button.js";
7
- import { DropdownMenu as Q, DropdownMenuTrigger as W, DropdownMenuContent as X, DropdownMenuGroup as Y, DropdownMenuLabel as Z, DropdownMenuItem as c, DropdownMenuSeparator as w } from "../../ui/dropdown-menu.js";
7
+ import { DropdownMenu as Q, DropdownMenuTrigger as W, DropdownMenuContent as X, DropdownMenuGroup as Y, DropdownMenuLabel as Z, DropdownMenuItem as d, DropdownMenuSeparator as w } from "../../ui/dropdown-menu.js";
8
8
  import { cn as _ } from "../../../lib/utils.js";
9
9
  function D({
10
10
  inputRef: s,
11
11
  accept: o,
12
12
  onPick: h,
13
- triageCsv: l
13
+ triageCsv: t
14
14
  }) {
15
15
  return /* @__PURE__ */ e(
16
16
  "input",
@@ -19,29 +19,29 @@ function D({
19
19
  type: "file",
20
20
  accept: o,
21
21
  hidden: !0,
22
- onChange: (d) => {
23
- const r = d.currentTarget, i = d.target.files?.[0];
22
+ onChange: (c) => {
23
+ const r = c.currentTarget, i = c.target.files?.[0];
24
24
  if (!i) {
25
25
  r.value = "";
26
26
  return;
27
27
  }
28
28
  (async () => {
29
- const t = l ? await U(i) : void 0;
30
- await (t ? h?.(i, t) : h?.(i)), r.value = "";
29
+ const a = t ? await U(i) : void 0;
30
+ await (a ? h?.(i, a) : h?.(i)), r.value = "";
31
31
  })();
32
32
  }
33
33
  }
34
34
  );
35
35
  }
36
- function te({
36
+ function ae({
37
37
  templates: s,
38
38
  templateId: o,
39
39
  onTemplateChange: h,
40
- onClearTemplate: l,
41
- hasEntries: d,
40
+ onClearTemplate: t,
41
+ hasEntries: c,
42
42
  onImportCsv: r,
43
43
  onExportCsv: i,
44
- onImportTemplate: t,
44
+ onImportTemplate: a,
45
45
  onExportTemplate: u,
46
46
  label: N = "Actions",
47
47
  align: R = "start",
@@ -55,9 +55,9 @@ function te({
55
55
  clearLabel: F = "Clear template",
56
56
  className: P
57
57
  }) {
58
- const M = m.useRef(null), b = m.useRef(null), f = m.useMemo(() => q(s), [s]), g = d === !1;
59
- return f.length > 0 || !!t || !!u || !!r || !!i || !!l ? /* @__PURE__ */ n(k, { children: [
60
- /* @__PURE__ */ n(Q, { children: [
58
+ const M = m.useRef(null), b = m.useRef(null), f = m.useMemo(() => q(s), [s]), g = c === !1;
59
+ return f.length > 0 || !!a || !!u || !!r || !!i || !!t ? /* @__PURE__ */ n(k, { children: [
60
+ /* @__PURE__ */ n(Q, { modal: !1, children: [
61
61
  /* @__PURE__ */ e(W, { asChild: !0, children: /* @__PURE__ */ n(K, { type: "button", variant: "outline", size: "sm", className: _("min-w-24 justify-between", P), children: [
62
62
  /* @__PURE__ */ e("span", { children: N }),
63
63
  /* @__PURE__ */ e(G, { "aria-hidden": !0 })
@@ -65,48 +65,48 @@ function te({
65
65
  /* @__PURE__ */ n(X, { align: R, side: v, className: "w-64", children: [
66
66
  f.map(([p, z]) => /* @__PURE__ */ n(Y, { children: [
67
67
  p ? /* @__PURE__ */ e(Z, { children: p }) : null,
68
- z.map((a) => /* @__PURE__ */ n(
69
- c,
68
+ z.map((l) => /* @__PURE__ */ n(
69
+ d,
70
70
  {
71
- disabled: a.disabled,
72
- onClick: () => h?.(a.id),
71
+ disabled: l.disabled,
72
+ onClick: () => h?.(l.id),
73
73
  children: [
74
- a.id === o ? /* @__PURE__ */ e(L, { "aria-hidden": !0 }) : /* @__PURE__ */ e("span", { className: "size-4", "aria-hidden": !0 }),
74
+ l.id === o ? /* @__PURE__ */ e(L, { "aria-hidden": !0 }) : /* @__PURE__ */ e("span", { className: "size-4", "aria-hidden": !0 }),
75
75
  /* @__PURE__ */ n("span", { className: "flex min-w-0 flex-col", children: [
76
- /* @__PURE__ */ e("span", { className: "truncate", children: a.label }),
77
- a.description ? /* @__PURE__ */ e("span", { className: "truncate text-xs text-muted-foreground", children: a.description }) : null
76
+ /* @__PURE__ */ e("span", { className: "truncate", children: l.label }),
77
+ l.description ? /* @__PURE__ */ e("span", { className: "truncate text-xs text-muted-foreground", children: l.description }) : null
78
78
  ] })
79
79
  ]
80
80
  },
81
- a.id
81
+ l.id
82
82
  ))
83
83
  ] }, p || "templates")),
84
- f.length > 0 && (t || u || r || i || l) ? /* @__PURE__ */ e(w, {}) : null,
85
- t ? /* @__PURE__ */ n(c, { onClick: () => M.current?.click(), children: [
84
+ f.length > 0 && (a || u || r || i || t) ? /* @__PURE__ */ e(w, {}) : null,
85
+ a ? /* @__PURE__ */ n(d, { onClick: () => M.current?.click(), children: [
86
86
  /* @__PURE__ */ e(O, { "aria-hidden": !0 }),
87
87
  C
88
88
  ] }) : null,
89
- u ? /* @__PURE__ */ n(c, { disabled: g, onClick: () => u(), children: [
89
+ u ? /* @__PURE__ */ n(d, { disabled: g, onClick: () => u(), children: [
90
90
  /* @__PURE__ */ e(V, { "aria-hidden": !0 }),
91
91
  j
92
92
  ] }) : null,
93
- (t || u) && (r || i) ? /* @__PURE__ */ e(w, {}) : null,
94
- r ? /* @__PURE__ */ n(c, { onClick: () => b.current?.click(), children: [
93
+ (a || u) && (r || i) ? /* @__PURE__ */ e(w, {}) : null,
94
+ r ? /* @__PURE__ */ n(d, { onClick: () => b.current?.click(), children: [
95
95
  /* @__PURE__ */ e(B, { "aria-hidden": !0 }),
96
96
  x
97
97
  ] }) : null,
98
- i ? /* @__PURE__ */ n(c, { disabled: g, onClick: () => i(), children: [
98
+ i ? /* @__PURE__ */ n(d, { disabled: g, onClick: () => i(), children: [
99
99
  /* @__PURE__ */ e(H, { "aria-hidden": !0 }),
100
100
  A
101
101
  ] }) : null,
102
- l ? /* @__PURE__ */ n(k, { children: [
102
+ t ? /* @__PURE__ */ n(k, { children: [
103
103
  /* @__PURE__ */ e(w, {}),
104
104
  /* @__PURE__ */ n(
105
- c,
105
+ d,
106
106
  {
107
107
  variant: "destructive",
108
- disabled: !o && !d,
109
- onClick: () => l(),
108
+ disabled: !o && !c,
109
+ onClick: () => t(),
110
110
  children: [
111
111
  /* @__PURE__ */ e(J, { "aria-hidden": !0 }),
112
112
  F
@@ -116,11 +116,11 @@ function te({
116
116
  ] }) : null
117
117
  ] })
118
118
  ] }),
119
- /* @__PURE__ */ e(D, { inputRef: M, accept: S, onPick: t }),
119
+ /* @__PURE__ */ e(D, { inputRef: M, accept: S, onPick: a }),
120
120
  /* @__PURE__ */ e(D, { inputRef: b, accept: y, onPick: r, triageCsv: !0 })
121
121
  ] }) : null;
122
122
  }
123
123
  export {
124
- te as PlateMapActionsMenu
124
+ ae as PlateMapActionsMenu
125
125
  };
126
126
  //# sourceMappingURL=PlateMapActionsMenu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlateMapActionsMenu.js","sources":["../../../../src/components/composed/PlateMapEditor/PlateMapActionsMenu.tsx"],"sourcesContent":["import { Check, ChevronDown, Download, LayoutTemplate, SaveAll, Trash2, Upload } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { triagePlateMapCsvFile } from \"./csvPlateTriage\";\nimport { groupTemplateOptions } from \"./helpers\";\n\nimport type { ImportExportHandlers, PlateMapCsvTriage, TemplateOption } from \"./types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface PlateMapActionsMenuProps extends ImportExportHandlers {\n templates?: TemplateOption[];\n templateId?: string;\n onTemplateChange?: (id: string) => void;\n onClearTemplate?: () => void;\n /** Disable export/save actions when there is nothing to export. */\n hasEntries?: boolean;\n label?: React.ReactNode;\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n csvAccept?: string;\n templateAccept?: string;\n importTemplateLabel?: string;\n exportTemplateLabel?: string;\n importCsvLabel?: string;\n exportCsvLabel?: string;\n clearLabel?: string;\n className?: string;\n}\n\nfunction HiddenFileInput({\n inputRef,\n accept,\n onPick,\n triageCsv,\n}: {\n inputRef: React.RefObject<HTMLInputElement | null>;\n accept: string;\n onPick?: (file: File, triage?: PlateMapCsvTriage) => void | Promise<void>;\n triageCsv?: boolean;\n}) {\n return (\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n hidden\n onChange={(event) => {\n const input = event.currentTarget;\n const file = event.target.files?.[0];\n if (!file) {\n input.value = \"\";\n return;\n }\n\n void (async () => {\n const triage = triageCsv ? await triagePlateMapCsvFile(file) : undefined;\n await (triage ? onPick?.(file, triage) : onPick?.(file));\n input.value = \"\";\n })();\n }}\n />\n );\n}\n\nexport function PlateMapActionsMenu({\n templates,\n templateId,\n onTemplateChange,\n onClearTemplate,\n hasEntries,\n onImportCsv,\n onExportCsv,\n onImportTemplate,\n onExportTemplate,\n label = \"Actions\",\n align = \"start\",\n side = \"bottom\",\n csvAccept = \".csv,text/csv\",\n templateAccept = \"application/json\",\n importTemplateLabel = \"Import template (JSON)\",\n exportTemplateLabel = \"Save template\",\n importCsvLabel = \"Import plate map (CSV)\",\n exportCsvLabel = \"Export plate map (CSV)\",\n clearLabel = \"Clear template\",\n className,\n}: PlateMapActionsMenuProps) {\n const templateInputRef = React.useRef<HTMLInputElement>(null);\n const csvInputRef = React.useRef<HTMLInputElement>(null);\n const templateGroups = React.useMemo(() => groupTemplateOptions(templates), [templates]);\n const disableEntryExport = hasEntries === false;\n\n const hasMenuItems =\n templateGroups.length > 0 ||\n !!onImportTemplate ||\n !!onExportTemplate ||\n !!onImportCsv ||\n !!onExportCsv ||\n !!onClearTemplate;\n\n if (!hasMenuItems) return null;\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className={cn(\"min-w-24 justify-between\", className)}>\n <span>{label}</span>\n <ChevronDown aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align} side={side} className=\"w-64\">\n {templateGroups.map(([group, options]) => (\n <DropdownMenuGroup key={group || \"templates\"}>\n {group ? <DropdownMenuLabel>{group}</DropdownMenuLabel> : null}\n {options.map((template) => (\n <DropdownMenuItem\n key={template.id}\n disabled={template.disabled}\n onClick={() => onTemplateChange?.(template.id)}\n >\n {template.id === templateId ? <Check aria-hidden /> : <span className=\"size-4\" aria-hidden />}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate\">{template.label}</span>\n {template.description ? (\n <span className=\"truncate text-xs text-muted-foreground\">{template.description}</span>\n ) : null}\n </span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n ))}\n\n {templateGroups.length > 0 &&\n (onImportTemplate || onExportTemplate || onImportCsv || onExportCsv || onClearTemplate) ? (\n <DropdownMenuSeparator />\n ) : null}\n\n {onImportTemplate ? (\n <DropdownMenuItem onClick={() => templateInputRef.current?.click()}>\n <LayoutTemplate aria-hidden />\n {importTemplateLabel}\n </DropdownMenuItem>\n ) : null}\n {onExportTemplate ? (\n <DropdownMenuItem disabled={disableEntryExport} onClick={() => onExportTemplate()}>\n <SaveAll aria-hidden />\n {exportTemplateLabel}\n </DropdownMenuItem>\n ) : null}\n\n {(onImportTemplate || onExportTemplate) && (onImportCsv || onExportCsv) ? <DropdownMenuSeparator /> : null}\n\n {onImportCsv ? (\n <DropdownMenuItem onClick={() => csvInputRef.current?.click()}>\n <Upload aria-hidden />\n {importCsvLabel}\n </DropdownMenuItem>\n ) : null}\n {onExportCsv ? (\n <DropdownMenuItem disabled={disableEntryExport} onClick={() => onExportCsv()}>\n <Download aria-hidden />\n {exportCsvLabel}\n </DropdownMenuItem>\n ) : null}\n\n {onClearTemplate ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n variant=\"destructive\"\n disabled={!templateId && !hasEntries}\n onClick={() => onClearTemplate()}\n >\n <Trash2 aria-hidden />\n {clearLabel}\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n <HiddenFileInput inputRef={templateInputRef} accept={templateAccept} onPick={onImportTemplate} />\n <HiddenFileInput inputRef={csvInputRef} accept={csvAccept} onPick={onImportCsv} triageCsv />\n </>\n );\n}\n"],"names":["HiddenFileInput","inputRef","accept","onPick","triageCsv","jsx","event","input","file","triage","triagePlateMapCsvFile","PlateMapActionsMenu","templates","templateId","onTemplateChange","onClearTemplate","hasEntries","onImportCsv","onExportCsv","onImportTemplate","onExportTemplate","label","align","side","csvAccept","templateAccept","importTemplateLabel","exportTemplateLabel","importCsvLabel","exportCsvLabel","clearLabel","className","templateInputRef","React","csvInputRef","templateGroups","groupTemplateOptions","disableEntryExport","jsxs","Fragment","DropdownMenu","DropdownMenuTrigger","Button","cn","ChevronDown","DropdownMenuContent","group","options","DropdownMenuGroup","DropdownMenuLabel","template","DropdownMenuItem","Check","DropdownMenuSeparator","LayoutTemplate","SaveAll","Upload","Download","Trash2"],"mappings":";;;;;;;;AAwCA,SAASA,EAAgB;AAAA,EACvB,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AACF,GAKG;AACD,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKJ;AAAA,MACL,MAAK;AAAA,MACL,QAAAC;AAAA,MACA,QAAM;AAAA,MACN,UAAU,CAACI,MAAU;AACnB,cAAMC,IAAQD,EAAM,eACdE,IAAOF,EAAM,OAAO,QAAQ,CAAC;AACnC,YAAI,CAACE,GAAM;AACT,UAAAD,EAAM,QAAQ;AACd;AAAA,QACF;AAEA,SAAM,YAAY;AAChB,gBAAME,IAASL,IAAY,MAAMM,EAAsBF,CAAI,IAAI;AAC/D,iBAAOC,IAASN,IAASK,GAAMC,CAAM,IAAIN,IAASK,CAAI,IACtDD,EAAM,QAAQ;AAAA,QAChB,GAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,SAASI,GAAoB;AAAA,EAClC,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AAAA,EACZ,gBAAAC,IAAiB;AAAA,EACjB,qBAAAC,IAAsB;AAAA,EACtB,qBAAAC,IAAsB;AAAA,EACtB,gBAAAC,IAAiB;AAAA,EACjB,gBAAAC,IAAiB;AAAA,EACjB,YAAAC,IAAa;AAAA,EACb,WAAAC;AACF,GAA6B;AAC3B,QAAMC,IAAmBC,EAAM,OAAyB,IAAI,GACtDC,IAAcD,EAAM,OAAyB,IAAI,GACjDE,IAAiBF,EAAM,QAAQ,MAAMG,EAAqBxB,CAAS,GAAG,CAACA,CAAS,CAAC,GACjFyB,IAAqBrB,MAAe;AAU1C,SAPEmB,EAAe,SAAS,KACxB,CAAC,CAAChB,KACF,CAAC,CAACC,KACF,CAAC,CAACH,KACF,CAAC,CAACC,KACF,CAAC,CAACH,IAKF,gBAAAuB,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAD,EAACE,GAAA,EACC,UAAA;AAAA,MAAA,gBAAAnC,EAACoC,GAAA,EAAoB,SAAO,IAC1B,UAAA,gBAAAH,EAACI,KAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,WAAWC,EAAG,4BAA4BZ,CAAS,GACnG,UAAA;AAAA,QAAA,gBAAA1B,EAAC,UAAM,UAAAgB,EAAA,CAAM;AAAA,QACb,gBAAAhB,EAACuC,GAAA,EAAY,eAAW,GAAA,CAAC;AAAA,MAAA,EAAA,CAC3B,EAAA,CACF;AAAA,MACA,gBAAAN,EAACO,GAAA,EAAoB,OAAAvB,GAAc,MAAAC,GAAY,WAAU,QACtD,UAAA;AAAA,QAAAY,EAAe,IAAI,CAAC,CAACW,GAAOC,CAAO,wBACjCC,GAAA,EACE,UAAA;AAAA,UAAAF,IAAQ,gBAAAzC,EAAC4C,GAAA,EAAmB,UAAAH,EAAA,CAAM,IAAuB;AAAA,UACzDC,EAAQ,IAAI,CAACG,MACZ,gBAAAZ;AAAA,YAACa;AAAA,YAAA;AAAA,cAEC,UAAUD,EAAS;AAAA,cACnB,SAAS,MAAMpC,IAAmBoC,EAAS,EAAE;AAAA,cAE5C,UAAA;AAAA,gBAAAA,EAAS,OAAOrC,IAAa,gBAAAR,EAAC+C,GAAA,EAAM,eAAW,GAAA,CAAC,IAAK,gBAAA/C,EAAC,QAAA,EAAK,WAAU,UAAS,eAAW,IAAC;AAAA,gBAC3F,gBAAAiC,EAAC,QAAA,EAAK,WAAU,yBACd,UAAA;AAAA,kBAAA,gBAAAjC,EAAC,QAAA,EAAK,WAAU,YAAY,UAAA6C,EAAS,OAAM;AAAA,kBAC1CA,EAAS,cACR,gBAAA7C,EAAC,QAAA,EAAK,WAAU,0CAA0C,UAAA6C,EAAS,aAAY,IAC7E;AAAA,gBAAA,EAAA,CACN;AAAA,cAAA;AAAA,YAAA;AAAA,YAVKA,EAAS;AAAA,UAAA,CAYjB;AAAA,QAAA,KAhBqBJ,KAAS,WAiBjC,CACD;AAAA,QAEAX,EAAe,SAAS,MACxBhB,KAAoBC,KAAoBH,KAAeC,KAAeH,KACrE,gBAAAV,EAACgD,GAAA,CAAA,CAAsB,IACrB;AAAA,QAEHlC,sBACEgC,GAAA,EAAiB,SAAS,MAAMnB,EAAiB,SAAS,SACzD,UAAA;AAAA,UAAA,gBAAA3B,EAACiD,GAAA,EAAe,eAAW,GAAA,CAAC;AAAA,UAC3B5B;AAAA,QAAA,EAAA,CACH,IACE;AAAA,QACHN,sBACE+B,GAAA,EAAiB,UAAUd,GAAoB,SAAS,MAAMjB,KAC7D,UAAA;AAAA,UAAA,gBAAAf,EAACkD,GAAA,EAAQ,eAAW,GAAA,CAAC;AAAA,UACpB5B;AAAA,QAAA,EAAA,CACH,IACE;AAAA,SAEFR,KAAoBC,OAAsBH,KAAeC,KAAe,gBAAAb,EAACgD,KAAsB,IAAK;AAAA,QAErGpC,sBACEkC,GAAA,EAAiB,SAAS,MAAMjB,EAAY,SAAS,SACpD,UAAA;AAAA,UAAA,gBAAA7B,EAACmD,GAAA,EAAO,eAAW,GAAA,CAAC;AAAA,UACnB5B;AAAA,QAAA,EAAA,CACH,IACE;AAAA,QACHV,sBACEiC,GAAA,EAAiB,UAAUd,GAAoB,SAAS,MAAMnB,KAC7D,UAAA;AAAA,UAAA,gBAAAb,EAACoD,GAAA,EAAS,eAAW,GAAA,CAAC;AAAA,UACrB5B;AAAA,QAAA,EAAA,CACH,IACE;AAAA,QAEHd,IACC,gBAAAuB,EAAAC,GAAA,EACE,UAAA;AAAA,UAAA,gBAAAlC,EAACgD,GAAA,EAAsB;AAAA,UACvB,gBAAAf;AAAA,YAACa;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,UAAU,CAACtC,KAAc,CAACG;AAAA,cAC1B,SAAS,MAAMD,EAAA;AAAA,cAEf,UAAA;AAAA,gBAAA,gBAAAV,EAACqD,GAAA,EAAO,eAAW,GAAA,CAAC;AAAA,gBACnB5B;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,EAAA,CACF,IACE;AAAA,MAAA,EAAA,CACN;AAAA,IAAA,GACF;AAAA,sBACC9B,GAAA,EAAgB,UAAUgC,GAAkB,QAAQP,GAAgB,QAAQN,GAAkB;AAAA,IAC/F,gBAAAd,EAACL,KAAgB,UAAUkC,GAAa,QAAQV,GAAW,QAAQP,GAAa,WAAS,GAAA,CAAC;AAAA,EAAA,GAC5F,IAnFwB;AAqF5B;"}
1
+ {"version":3,"file":"PlateMapActionsMenu.js","sources":["../../../../src/components/composed/PlateMapEditor/PlateMapActionsMenu.tsx"],"sourcesContent":["import { Check, ChevronDown, Download, LayoutTemplate, SaveAll, Trash2, Upload } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { triagePlateMapCsvFile } from \"./csvPlateTriage\";\nimport { groupTemplateOptions } from \"./helpers\";\n\nimport type { ImportExportHandlers, PlateMapCsvTriage, TemplateOption } from \"./types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface PlateMapActionsMenuProps extends ImportExportHandlers {\n templates?: TemplateOption[];\n templateId?: string;\n onTemplateChange?: (id: string) => void;\n onClearTemplate?: () => void;\n /** Disable export/save actions when there is nothing to export. */\n hasEntries?: boolean;\n label?: React.ReactNode;\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n csvAccept?: string;\n templateAccept?: string;\n importTemplateLabel?: string;\n exportTemplateLabel?: string;\n importCsvLabel?: string;\n exportCsvLabel?: string;\n clearLabel?: string;\n className?: string;\n}\n\nfunction HiddenFileInput({\n inputRef,\n accept,\n onPick,\n triageCsv,\n}: {\n inputRef: React.RefObject<HTMLInputElement | null>;\n accept: string;\n onPick?: (file: File, triage?: PlateMapCsvTriage) => void | Promise<void>;\n triageCsv?: boolean;\n}) {\n return (\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n hidden\n onChange={(event) => {\n const input = event.currentTarget;\n const file = event.target.files?.[0];\n if (!file) {\n input.value = \"\";\n return;\n }\n\n void (async () => {\n const triage = triageCsv ? await triagePlateMapCsvFile(file) : undefined;\n await (triage ? onPick?.(file, triage) : onPick?.(file));\n input.value = \"\";\n })();\n }}\n />\n );\n}\n\nexport function PlateMapActionsMenu({\n templates,\n templateId,\n onTemplateChange,\n onClearTemplate,\n hasEntries,\n onImportCsv,\n onExportCsv,\n onImportTemplate,\n onExportTemplate,\n label = \"Actions\",\n align = \"start\",\n side = \"bottom\",\n csvAccept = \".csv,text/csv\",\n templateAccept = \"application/json\",\n importTemplateLabel = \"Import template (JSON)\",\n exportTemplateLabel = \"Save template\",\n importCsvLabel = \"Import plate map (CSV)\",\n exportCsvLabel = \"Export plate map (CSV)\",\n clearLabel = \"Clear template\",\n className,\n}: PlateMapActionsMenuProps) {\n const templateInputRef = React.useRef<HTMLInputElement>(null);\n const csvInputRef = React.useRef<HTMLInputElement>(null);\n const templateGroups = React.useMemo(() => groupTemplateOptions(templates), [templates]);\n const disableEntryExport = hasEntries === false;\n\n const hasMenuItems =\n templateGroups.length > 0 ||\n !!onImportTemplate ||\n !!onExportTemplate ||\n !!onImportCsv ||\n !!onExportCsv ||\n !!onClearTemplate;\n\n if (!hasMenuItems) return null;\n\n return (\n <>\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className={cn(\"min-w-24 justify-between\", className)}>\n <span>{label}</span>\n <ChevronDown aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align} side={side} className=\"w-64\">\n {templateGroups.map(([group, options]) => (\n <DropdownMenuGroup key={group || \"templates\"}>\n {group ? <DropdownMenuLabel>{group}</DropdownMenuLabel> : null}\n {options.map((template) => (\n <DropdownMenuItem\n key={template.id}\n disabled={template.disabled}\n onClick={() => onTemplateChange?.(template.id)}\n >\n {template.id === templateId ? <Check aria-hidden /> : <span className=\"size-4\" aria-hidden />}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate\">{template.label}</span>\n {template.description ? (\n <span className=\"truncate text-xs text-muted-foreground\">{template.description}</span>\n ) : null}\n </span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n ))}\n\n {templateGroups.length > 0 &&\n (onImportTemplate || onExportTemplate || onImportCsv || onExportCsv || onClearTemplate) ? (\n <DropdownMenuSeparator />\n ) : null}\n\n {onImportTemplate ? (\n <DropdownMenuItem onClick={() => templateInputRef.current?.click()}>\n <LayoutTemplate aria-hidden />\n {importTemplateLabel}\n </DropdownMenuItem>\n ) : null}\n {onExportTemplate ? (\n <DropdownMenuItem disabled={disableEntryExport} onClick={() => onExportTemplate()}>\n <SaveAll aria-hidden />\n {exportTemplateLabel}\n </DropdownMenuItem>\n ) : null}\n\n {(onImportTemplate || onExportTemplate) && (onImportCsv || onExportCsv) ? <DropdownMenuSeparator /> : null}\n\n {onImportCsv ? (\n <DropdownMenuItem onClick={() => csvInputRef.current?.click()}>\n <Upload aria-hidden />\n {importCsvLabel}\n </DropdownMenuItem>\n ) : null}\n {onExportCsv ? (\n <DropdownMenuItem disabled={disableEntryExport} onClick={() => onExportCsv()}>\n <Download aria-hidden />\n {exportCsvLabel}\n </DropdownMenuItem>\n ) : null}\n\n {onClearTemplate ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n variant=\"destructive\"\n disabled={!templateId && !hasEntries}\n onClick={() => onClearTemplate()}\n >\n <Trash2 aria-hidden />\n {clearLabel}\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n <HiddenFileInput inputRef={templateInputRef} accept={templateAccept} onPick={onImportTemplate} />\n <HiddenFileInput inputRef={csvInputRef} accept={csvAccept} onPick={onImportCsv} triageCsv />\n </>\n );\n}\n"],"names":["HiddenFileInput","inputRef","accept","onPick","triageCsv","jsx","event","input","file","triage","triagePlateMapCsvFile","PlateMapActionsMenu","templates","templateId","onTemplateChange","onClearTemplate","hasEntries","onImportCsv","onExportCsv","onImportTemplate","onExportTemplate","label","align","side","csvAccept","templateAccept","importTemplateLabel","exportTemplateLabel","importCsvLabel","exportCsvLabel","clearLabel","className","templateInputRef","React","csvInputRef","templateGroups","groupTemplateOptions","disableEntryExport","jsxs","Fragment","DropdownMenu","DropdownMenuTrigger","Button","cn","ChevronDown","DropdownMenuContent","group","options","DropdownMenuGroup","DropdownMenuLabel","template","DropdownMenuItem","Check","DropdownMenuSeparator","LayoutTemplate","SaveAll","Upload","Download","Trash2"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("lucide-react"),f=require("../../ui/badge.cjs"),u=require("../../ui/button.cjs"),s=require("../../ui/dropdown-menu.cjs"),g=require("../../ui/toggle-group.cjs"),x=require("../../../lib/utils.cjs");function w({plate:i,selected:l}){return e.jsx(f.Badge,{variant:l?"info":"outline",className:"max-w-44",children:e.jsx("span",{className:"truncate",children:i.label??i.barcode})})}function M({plates:i=[],activePlateId:l,onPlateChange:a,onAddPlate:r,onRemovePlate:j,addPlateLabel:o="Add Plate",removePlateLabel:v="Remove plate",label:h="Plate",variant:p="dropdown",align:N="start",side:y="bottom",className:m}){const c=i.find(n=>n.id===l)??(l?void 0:i[0]);return p==="tabs"?e.jsxs("div",{className:x.cn("inline-flex flex-wrap items-center gap-1",m),"data-slot":"plate-tabs",children:[e.jsx(g.ToggleGroup,{type:"single",variant:"outline",size:"sm",value:c?.id??"","aria-label":h,onValueChange:n=>{n&&a?.(n)},children:i.map(n=>{const d=n.id===c?.id,b=!!j&&i.length>1;return e.jsxs("div",{className:"inline-flex items-stretch",children:[e.jsxs(g.ToggleGroupItem,{value:n.id,disabled:n.disabled||!a,"aria-label":n.label??n.barcode,className:x.cn(b&&"rounded-r-none border-r-0"),children:[e.jsx("span",{className:"truncate",children:n.label??n.barcode}),n.count===void 0?null:e.jsx(f.Badge,{variant:d?"secondary":"outline",className:"ml-1 h-4 px-1 text-[0.65rem]",children:n.count})]}),b?e.jsx(u.Button,{type:"button",variant:"outline",size:"icon-sm","aria-label":`${v} ${n.label??n.barcode}`,className:"rounded-l-none",onClick:()=>j?.(n.id),children:e.jsx(t.X,{"aria-hidden":!0})}):null]},n.id)})}),r?e.jsx(u.Button,{type:"button",variant:"ghost",size:"icon-sm","aria-label":o,onClick:()=>r(),children:e.jsx(t.Plus,{"aria-hidden":!0})}):null]}):i.length===0?e.jsxs(u.Button,{type:"button",variant:"outline",size:"sm",disabled:!r,"aria-label":o,className:x.cn("min-w-28 justify-start",m),onClick:()=>r?.(),children:[e.jsx(t.Plus,{"aria-hidden":!0}),o]}):e.jsxs(s.DropdownMenu,{children:[e.jsx(s.DropdownMenuTrigger,{asChild:!0,children:e.jsxs(u.Button,{type:"button",variant:"outline",size:"sm","aria-label":h,className:x.cn("min-w-36 justify-between",m),children:[e.jsx("span",{className:"flex min-w-0 items-center gap-1.5",children:c?e.jsx(w,{plate:c,selected:!0}):e.jsx("span",{children:o})}),e.jsx(t.ChevronDown,{"aria-hidden":!0})]})}),e.jsxs(s.DropdownMenuContent,{align:N,side:y,className:"w-64",children:[e.jsx(s.DropdownMenuGroup,{children:i.map(n=>{const d=n.id===c?.id;return e.jsxs(s.DropdownMenuItem,{disabled:n.disabled||!a,onClick:()=>a?.(n.id),children:[d?e.jsx(t.Check,{"aria-hidden":!0}):e.jsx("span",{className:"size-4","aria-hidden":!0}),e.jsxs("span",{className:"flex min-w-0 flex-1 items-center justify-between gap-2",children:[e.jsx(w,{plate:n,selected:d}),n.count===void 0?null:e.jsxs("span",{className:"shrink-0 text-xs text-muted-foreground",children:[n.count," wells"]})]})]},n.id)})}),r?e.jsxs(e.Fragment,{children:[e.jsx(s.DropdownMenuSeparator,{}),e.jsxs(s.DropdownMenuItem,{onClick:()=>r(),children:[e.jsx(t.Plus,{"aria-hidden":!0}),o]})]}):null]})]})}exports.PlateMapPlateSelector=M;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("lucide-react"),f=require("../../ui/badge.cjs"),u=require("../../ui/button.cjs"),i=require("../../ui/dropdown-menu.cjs"),g=require("../../ui/toggle-group.cjs"),x=require("../../../lib/utils.cjs");function w({plate:s,selected:a}){return e.jsx(f.Badge,{variant:a?"info":"outline",className:"max-w-44",children:e.jsx("span",{className:"truncate",children:s.label??s.barcode})})}function M({plates:s=[],activePlateId:a,onPlateChange:c,onAddPlate:r,onRemovePlate:j,addPlateLabel:l="Add Plate",removePlateLabel:v="Remove plate",label:h="Plate",variant:p="dropdown",align:N="start",side:y="bottom",className:m}){const o=s.find(n=>n.id===a)??(a?void 0:s[0]);return p==="tabs"?e.jsxs("div",{className:x.cn("inline-flex flex-wrap items-center gap-1",m),"data-slot":"plate-tabs",children:[e.jsx(g.ToggleGroup,{type:"single",variant:"outline",size:"sm",value:o?.id??"","aria-label":h,onValueChange:n=>{n&&c?.(n)},children:s.map(n=>{const d=n.id===o?.id,b=!!j&&s.length>1;return e.jsxs("div",{className:"inline-flex items-stretch",children:[e.jsxs(g.ToggleGroupItem,{value:n.id,disabled:n.disabled||!c,"aria-label":n.label??n.barcode,className:x.cn(b&&"rounded-r-none border-r-0"),children:[e.jsx("span",{className:"truncate",children:n.label??n.barcode}),n.count===void 0?null:e.jsx(f.Badge,{variant:d?"secondary":"outline",className:"ml-1 h-4 px-1 text-[0.65rem]",children:n.count})]}),b?e.jsx(u.Button,{type:"button",variant:"outline",size:"icon-sm","aria-label":`${v} ${n.label??n.barcode}`,className:"rounded-l-none",onClick:()=>j?.(n.id),children:e.jsx(t.X,{"aria-hidden":!0})}):null]},n.id)})}),r?e.jsx(u.Button,{type:"button",variant:"ghost",size:"icon-sm","aria-label":l,onClick:()=>r(),children:e.jsx(t.Plus,{"aria-hidden":!0})}):null]}):s.length===0?e.jsxs(u.Button,{type:"button",variant:"outline",size:"sm",disabled:!r,"aria-label":l,className:x.cn("min-w-28 justify-start",m),onClick:()=>r?.(),children:[e.jsx(t.Plus,{"aria-hidden":!0}),l]}):e.jsxs(i.DropdownMenu,{modal:!1,children:[e.jsx(i.DropdownMenuTrigger,{asChild:!0,children:e.jsxs(u.Button,{type:"button",variant:"outline",size:"sm","aria-label":h,className:x.cn("min-w-36 justify-between",m),children:[e.jsx("span",{className:"flex min-w-0 items-center gap-1.5",children:o?e.jsx(w,{plate:o,selected:!0}):e.jsx("span",{children:l})}),e.jsx(t.ChevronDown,{"aria-hidden":!0})]})}),e.jsxs(i.DropdownMenuContent,{align:N,side:y,className:"w-64",children:[e.jsx(i.DropdownMenuGroup,{children:s.map(n=>{const d=n.id===o?.id;return e.jsxs(i.DropdownMenuItem,{disabled:n.disabled||!c,onClick:()=>c?.(n.id),children:[d?e.jsx(t.Check,{"aria-hidden":!0}):e.jsx("span",{className:"size-4","aria-hidden":!0}),e.jsxs("span",{className:"flex min-w-0 flex-1 items-center justify-between gap-2",children:[e.jsx(w,{plate:n,selected:d}),n.count===void 0?null:e.jsxs("span",{className:"shrink-0 text-xs text-muted-foreground",children:[n.count," wells"]})]})]},n.id)})}),r?e.jsxs(e.Fragment,{children:[e.jsx(i.DropdownMenuSeparator,{}),e.jsxs(i.DropdownMenuItem,{onClick:()=>r(),children:[e.jsx(t.Plus,{"aria-hidden":!0}),l]})]}):null]})]})}exports.PlateMapPlateSelector=M;
2
2
  //# sourceMappingURL=PlateMapPlateSelector.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlateMapPlateSelector.cjs","sources":["../../../../src/components/composed/PlateMapEditor/PlateMapPlateSelector.tsx"],"sourcesContent":["import { Check, ChevronDown, Plus, X } from \"lucide-react\";\n\nimport type { PlateMapPlateOption } from \"./types\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/lib/utils\";\n\nexport type PlateMapPlateSelectorVariant = \"dropdown\" | \"tabs\";\n\nexport interface PlateMapPlateSelectorProps {\n plates?: PlateMapPlateOption[];\n activePlateId?: string;\n onPlateChange?: (plateId: string) => void;\n onAddPlate?: () => void;\n /** When supplied, the tabs variant renders a delete affordance per plate. */\n onRemovePlate?: (plateId: string) => void;\n addPlateLabel?: string;\n removePlateLabel?: string;\n label?: string;\n /** Layout. `\"dropdown\"` is the default single-trigger menu, `\"tabs\"` is a horizontal tab strip. */\n variant?: PlateMapPlateSelectorVariant;\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n className?: string;\n}\n\nfunction PlatePill({ plate, selected }: { plate: PlateMapPlateOption; selected?: boolean }) {\n return (\n <Badge variant={selected ? \"info\" : \"outline\"} className=\"max-w-44\">\n <span className=\"truncate\">{plate.label ?? plate.barcode}</span>\n </Badge>\n );\n}\n\nexport function PlateMapPlateSelector({\n plates = [],\n activePlateId,\n onPlateChange,\n onAddPlate,\n onRemovePlate,\n addPlateLabel = \"Add Plate\",\n removePlateLabel = \"Remove plate\",\n label = \"Plate\",\n variant = \"dropdown\",\n align = \"start\",\n side = \"bottom\",\n className,\n}: PlateMapPlateSelectorProps) {\n const activePlate = plates.find((plate) => plate.id === activePlateId) ?? (activePlateId ? undefined : plates[0]);\n\n if (variant === \"tabs\") {\n return (\n <div className={cn(\"inline-flex flex-wrap items-center gap-1\", className)} data-slot=\"plate-tabs\">\n <ToggleGroup\n type=\"single\"\n variant=\"outline\"\n size=\"sm\"\n value={activePlate?.id ?? \"\"}\n aria-label={label}\n onValueChange={(value) => {\n if (value) onPlateChange?.(value);\n }}\n >\n {plates.map((plate) => {\n const selected = plate.id === activePlate?.id;\n const canRemove = !!onRemovePlate && plates.length > 1;\n return (\n <div key={plate.id} className=\"inline-flex items-stretch\">\n <ToggleGroupItem\n value={plate.id}\n disabled={plate.disabled || !onPlateChange}\n aria-label={plate.label ?? plate.barcode}\n className={cn(canRemove && \"rounded-r-none border-r-0\")}\n >\n <span className=\"truncate\">{plate.label ?? plate.barcode}</span>\n {plate.count === undefined ? null : (\n <Badge variant={selected ? \"secondary\" : \"outline\"} className=\"ml-1 h-4 px-1 text-[0.65rem]\">\n {plate.count}\n </Badge>\n )}\n </ToggleGroupItem>\n {canRemove ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label={`${removePlateLabel} ${plate.label ?? plate.barcode}`}\n className=\"rounded-l-none\"\n onClick={() => onRemovePlate?.(plate.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </div>\n );\n })}\n </ToggleGroup>\n {onAddPlate ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" aria-label={addPlateLabel} onClick={() => onAddPlate()}>\n <Plus aria-hidden />\n </Button>\n ) : null}\n </div>\n );\n }\n\n if (plates.length === 0) {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={!onAddPlate}\n aria-label={addPlateLabel}\n className={cn(\"min-w-28 justify-start\", className)}\n onClick={() => onAddPlate?.()}\n >\n <Plus aria-hidden />\n {addPlateLabel}\n </Button>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={label}\n className={cn(\"min-w-36 justify-between\", className)}\n >\n <span className=\"flex min-w-0 items-center gap-1.5\">\n {activePlate ? <PlatePill plate={activePlate} selected /> : <span>{addPlateLabel}</span>}\n </span>\n <ChevronDown aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align} side={side} className=\"w-64\">\n <DropdownMenuGroup>\n {plates.map((plate) => {\n const selected = plate.id === activePlate?.id;\n return (\n <DropdownMenuItem\n key={plate.id}\n disabled={plate.disabled || !onPlateChange}\n onClick={() => onPlateChange?.(plate.id)}\n >\n {selected ? <Check aria-hidden /> : <span className=\"size-4\" aria-hidden />}\n <span className=\"flex min-w-0 flex-1 items-center justify-between gap-2\">\n <PlatePill plate={plate} selected={selected} />\n {plate.count === undefined ? null : (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{plate.count} wells</span>\n )}\n </span>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuGroup>\n {onAddPlate ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => onAddPlate()}>\n <Plus aria-hidden />\n {addPlateLabel}\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["PlatePill","plate","selected","Badge","jsx","PlateMapPlateSelector","plates","activePlateId","onPlateChange","onAddPlate","onRemovePlate","addPlateLabel","removePlateLabel","label","variant","align","side","className","activePlate","jsxs","cn","ToggleGroup","value","canRemove","ToggleGroupItem","Button","X","Plus","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","Check","Fragment","DropdownMenuSeparator"],"mappings":"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"}
1
+ {"version":3,"file":"PlateMapPlateSelector.cjs","sources":["../../../../src/components/composed/PlateMapEditor/PlateMapPlateSelector.tsx"],"sourcesContent":["import { Check, ChevronDown, Plus, X } from \"lucide-react\";\n\nimport type { PlateMapPlateOption } from \"./types\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/lib/utils\";\n\nexport type PlateMapPlateSelectorVariant = \"dropdown\" | \"tabs\";\n\nexport interface PlateMapPlateSelectorProps {\n plates?: PlateMapPlateOption[];\n activePlateId?: string;\n onPlateChange?: (plateId: string) => void;\n onAddPlate?: () => void;\n /** When supplied, the tabs variant renders a delete affordance per plate. */\n onRemovePlate?: (plateId: string) => void;\n addPlateLabel?: string;\n removePlateLabel?: string;\n label?: string;\n /** Layout. `\"dropdown\"` is the default single-trigger menu, `\"tabs\"` is a horizontal tab strip. */\n variant?: PlateMapPlateSelectorVariant;\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n className?: string;\n}\n\nfunction PlatePill({ plate, selected }: { plate: PlateMapPlateOption; selected?: boolean }) {\n return (\n <Badge variant={selected ? \"info\" : \"outline\"} className=\"max-w-44\">\n <span className=\"truncate\">{plate.label ?? plate.barcode}</span>\n </Badge>\n );\n}\n\nexport function PlateMapPlateSelector({\n plates = [],\n activePlateId,\n onPlateChange,\n onAddPlate,\n onRemovePlate,\n addPlateLabel = \"Add Plate\",\n removePlateLabel = \"Remove plate\",\n label = \"Plate\",\n variant = \"dropdown\",\n align = \"start\",\n side = \"bottom\",\n className,\n}: PlateMapPlateSelectorProps) {\n const activePlate = plates.find((plate) => plate.id === activePlateId) ?? (activePlateId ? undefined : plates[0]);\n\n if (variant === \"tabs\") {\n return (\n <div className={cn(\"inline-flex flex-wrap items-center gap-1\", className)} data-slot=\"plate-tabs\">\n <ToggleGroup\n type=\"single\"\n variant=\"outline\"\n size=\"sm\"\n value={activePlate?.id ?? \"\"}\n aria-label={label}\n onValueChange={(value) => {\n if (value) onPlateChange?.(value);\n }}\n >\n {plates.map((plate) => {\n const selected = plate.id === activePlate?.id;\n const canRemove = !!onRemovePlate && plates.length > 1;\n return (\n <div key={plate.id} className=\"inline-flex items-stretch\">\n <ToggleGroupItem\n value={plate.id}\n disabled={plate.disabled || !onPlateChange}\n aria-label={plate.label ?? plate.barcode}\n className={cn(canRemove && \"rounded-r-none border-r-0\")}\n >\n <span className=\"truncate\">{plate.label ?? plate.barcode}</span>\n {plate.count === undefined ? null : (\n <Badge variant={selected ? \"secondary\" : \"outline\"} className=\"ml-1 h-4 px-1 text-[0.65rem]\">\n {plate.count}\n </Badge>\n )}\n </ToggleGroupItem>\n {canRemove ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label={`${removePlateLabel} ${plate.label ?? plate.barcode}`}\n className=\"rounded-l-none\"\n onClick={() => onRemovePlate?.(plate.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </div>\n );\n })}\n </ToggleGroup>\n {onAddPlate ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" aria-label={addPlateLabel} onClick={() => onAddPlate()}>\n <Plus aria-hidden />\n </Button>\n ) : null}\n </div>\n );\n }\n\n if (plates.length === 0) {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={!onAddPlate}\n aria-label={addPlateLabel}\n className={cn(\"min-w-28 justify-start\", className)}\n onClick={() => onAddPlate?.()}\n >\n <Plus aria-hidden />\n {addPlateLabel}\n </Button>\n );\n }\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={label}\n className={cn(\"min-w-36 justify-between\", className)}\n >\n <span className=\"flex min-w-0 items-center gap-1.5\">\n {activePlate ? <PlatePill plate={activePlate} selected /> : <span>{addPlateLabel}</span>}\n </span>\n <ChevronDown aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align} side={side} className=\"w-64\">\n <DropdownMenuGroup>\n {plates.map((plate) => {\n const selected = plate.id === activePlate?.id;\n return (\n <DropdownMenuItem\n key={plate.id}\n disabled={plate.disabled || !onPlateChange}\n onClick={() => onPlateChange?.(plate.id)}\n >\n {selected ? <Check aria-hidden /> : <span className=\"size-4\" aria-hidden />}\n <span className=\"flex min-w-0 flex-1 items-center justify-between gap-2\">\n <PlatePill plate={plate} selected={selected} />\n {plate.count === undefined ? null : (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{plate.count} wells</span>\n )}\n </span>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuGroup>\n {onAddPlate ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => onAddPlate()}>\n <Plus aria-hidden />\n {addPlateLabel}\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["PlatePill","plate","selected","Badge","jsx","PlateMapPlateSelector","plates","activePlateId","onPlateChange","onAddPlate","onRemovePlate","addPlateLabel","removePlateLabel","label","variant","align","side","className","activePlate","jsxs","cn","ToggleGroup","value","canRemove","ToggleGroupItem","Button","X","Plus","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","Check","Fragment","DropdownMenuSeparator"],"mappings":"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"}
@@ -13,10 +13,10 @@ function J({
13
13
  activePlateId: l,
14
14
  onPlateChange: s,
15
15
  onAddPlate: o,
16
- onRemovePlate: b,
16
+ onRemovePlate: f,
17
17
  addPlateLabel: t = "Add Plate",
18
18
  removePlateLabel: g = "Remove plate",
19
- label: f = "Plate",
19
+ label: b = "Plate",
20
20
  variant: N = "dropdown",
21
21
  align: y = "start",
22
22
  side: k = "bottom",
@@ -31,12 +31,12 @@ function J({
31
31
  variant: "outline",
32
32
  size: "sm",
33
33
  value: a?.id ?? "",
34
- "aria-label": f,
34
+ "aria-label": b,
35
35
  onValueChange: (e) => {
36
36
  e && s?.(e);
37
37
  },
38
38
  children: r.map((e) => {
39
- const d = e.id === a?.id, p = !!b && r.length > 1;
39
+ const d = e.id === a?.id, p = !!f && r.length > 1;
40
40
  return /* @__PURE__ */ n("div", { className: "inline-flex items-stretch", children: [
41
41
  /* @__PURE__ */ n(
42
42
  F,
@@ -59,7 +59,7 @@ function J({
59
59
  size: "icon-sm",
60
60
  "aria-label": `${g} ${e.label ?? e.barcode}`,
61
61
  className: "rounded-l-none",
62
- onClick: () => b?.(e.id),
62
+ onClick: () => f?.(e.id),
63
63
  children: /* @__PURE__ */ i(D, { "aria-hidden": !0 })
64
64
  }
65
65
  ) : null
@@ -83,14 +83,14 @@ function J({
83
83
  t
84
84
  ]
85
85
  }
86
- ) : /* @__PURE__ */ n(j, { children: [
86
+ ) : /* @__PURE__ */ n(j, { modal: !1, children: [
87
87
  /* @__PURE__ */ i(G, { asChild: !0, children: /* @__PURE__ */ n(
88
88
  c,
89
89
  {
90
90
  type: "button",
91
91
  variant: "outline",
92
92
  size: "sm",
93
- "aria-label": f,
93
+ "aria-label": b,
94
94
  className: u("min-w-36 justify-between", m),
95
95
  children: [
96
96
  /* @__PURE__ */ i("span", { className: "flex min-w-0 items-center gap-1.5", children: a ? /* @__PURE__ */ i(v, { plate: a, selected: !0 }) : /* @__PURE__ */ i("span", { children: t }) }),
@@ -1 +1 @@
1
- {"version":3,"file":"PlateMapPlateSelector.js","sources":["../../../../src/components/composed/PlateMapEditor/PlateMapPlateSelector.tsx"],"sourcesContent":["import { Check, ChevronDown, Plus, X } from \"lucide-react\";\n\nimport type { PlateMapPlateOption } from \"./types\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/lib/utils\";\n\nexport type PlateMapPlateSelectorVariant = \"dropdown\" | \"tabs\";\n\nexport interface PlateMapPlateSelectorProps {\n plates?: PlateMapPlateOption[];\n activePlateId?: string;\n onPlateChange?: (plateId: string) => void;\n onAddPlate?: () => void;\n /** When supplied, the tabs variant renders a delete affordance per plate. */\n onRemovePlate?: (plateId: string) => void;\n addPlateLabel?: string;\n removePlateLabel?: string;\n label?: string;\n /** Layout. `\"dropdown\"` is the default single-trigger menu, `\"tabs\"` is a horizontal tab strip. */\n variant?: PlateMapPlateSelectorVariant;\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n className?: string;\n}\n\nfunction PlatePill({ plate, selected }: { plate: PlateMapPlateOption; selected?: boolean }) {\n return (\n <Badge variant={selected ? \"info\" : \"outline\"} className=\"max-w-44\">\n <span className=\"truncate\">{plate.label ?? plate.barcode}</span>\n </Badge>\n );\n}\n\nexport function PlateMapPlateSelector({\n plates = [],\n activePlateId,\n onPlateChange,\n onAddPlate,\n onRemovePlate,\n addPlateLabel = \"Add Plate\",\n removePlateLabel = \"Remove plate\",\n label = \"Plate\",\n variant = \"dropdown\",\n align = \"start\",\n side = \"bottom\",\n className,\n}: PlateMapPlateSelectorProps) {\n const activePlate = plates.find((plate) => plate.id === activePlateId) ?? (activePlateId ? undefined : plates[0]);\n\n if (variant === \"tabs\") {\n return (\n <div className={cn(\"inline-flex flex-wrap items-center gap-1\", className)} data-slot=\"plate-tabs\">\n <ToggleGroup\n type=\"single\"\n variant=\"outline\"\n size=\"sm\"\n value={activePlate?.id ?? \"\"}\n aria-label={label}\n onValueChange={(value) => {\n if (value) onPlateChange?.(value);\n }}\n >\n {plates.map((plate) => {\n const selected = plate.id === activePlate?.id;\n const canRemove = !!onRemovePlate && plates.length > 1;\n return (\n <div key={plate.id} className=\"inline-flex items-stretch\">\n <ToggleGroupItem\n value={plate.id}\n disabled={plate.disabled || !onPlateChange}\n aria-label={plate.label ?? plate.barcode}\n className={cn(canRemove && \"rounded-r-none border-r-0\")}\n >\n <span className=\"truncate\">{plate.label ?? plate.barcode}</span>\n {plate.count === undefined ? null : (\n <Badge variant={selected ? \"secondary\" : \"outline\"} className=\"ml-1 h-4 px-1 text-[0.65rem]\">\n {plate.count}\n </Badge>\n )}\n </ToggleGroupItem>\n {canRemove ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label={`${removePlateLabel} ${plate.label ?? plate.barcode}`}\n className=\"rounded-l-none\"\n onClick={() => onRemovePlate?.(plate.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </div>\n );\n })}\n </ToggleGroup>\n {onAddPlate ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" aria-label={addPlateLabel} onClick={() => onAddPlate()}>\n <Plus aria-hidden />\n </Button>\n ) : null}\n </div>\n );\n }\n\n if (plates.length === 0) {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={!onAddPlate}\n aria-label={addPlateLabel}\n className={cn(\"min-w-28 justify-start\", className)}\n onClick={() => onAddPlate?.()}\n >\n <Plus aria-hidden />\n {addPlateLabel}\n </Button>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={label}\n className={cn(\"min-w-36 justify-between\", className)}\n >\n <span className=\"flex min-w-0 items-center gap-1.5\">\n {activePlate ? <PlatePill plate={activePlate} selected /> : <span>{addPlateLabel}</span>}\n </span>\n <ChevronDown aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align} side={side} className=\"w-64\">\n <DropdownMenuGroup>\n {plates.map((plate) => {\n const selected = plate.id === activePlate?.id;\n return (\n <DropdownMenuItem\n key={plate.id}\n disabled={plate.disabled || !onPlateChange}\n onClick={() => onPlateChange?.(plate.id)}\n >\n {selected ? <Check aria-hidden /> : <span className=\"size-4\" aria-hidden />}\n <span className=\"flex min-w-0 flex-1 items-center justify-between gap-2\">\n <PlatePill plate={plate} selected={selected} />\n {plate.count === undefined ? null : (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{plate.count} wells</span>\n )}\n </span>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuGroup>\n {onAddPlate ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => onAddPlate()}>\n <Plus aria-hidden />\n {addPlateLabel}\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["PlatePill","plate","selected","Badge","jsx","PlateMapPlateSelector","plates","activePlateId","onPlateChange","onAddPlate","onRemovePlate","addPlateLabel","removePlateLabel","label","variant","align","side","className","activePlate","jsxs","cn","ToggleGroup","value","canRemove","ToggleGroupItem","Button","X","Plus","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","Check","Fragment","DropdownMenuSeparator"],"mappings":"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"}
1
+ {"version":3,"file":"PlateMapPlateSelector.js","sources":["../../../../src/components/composed/PlateMapEditor/PlateMapPlateSelector.tsx"],"sourcesContent":["import { Check, ChevronDown, Plus, X } from \"lucide-react\";\n\nimport type { PlateMapPlateOption } from \"./types\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/lib/utils\";\n\nexport type PlateMapPlateSelectorVariant = \"dropdown\" | \"tabs\";\n\nexport interface PlateMapPlateSelectorProps {\n plates?: PlateMapPlateOption[];\n activePlateId?: string;\n onPlateChange?: (plateId: string) => void;\n onAddPlate?: () => void;\n /** When supplied, the tabs variant renders a delete affordance per plate. */\n onRemovePlate?: (plateId: string) => void;\n addPlateLabel?: string;\n removePlateLabel?: string;\n label?: string;\n /** Layout. `\"dropdown\"` is the default single-trigger menu, `\"tabs\"` is a horizontal tab strip. */\n variant?: PlateMapPlateSelectorVariant;\n align?: \"start\" | \"center\" | \"end\";\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n className?: string;\n}\n\nfunction PlatePill({ plate, selected }: { plate: PlateMapPlateOption; selected?: boolean }) {\n return (\n <Badge variant={selected ? \"info\" : \"outline\"} className=\"max-w-44\">\n <span className=\"truncate\">{plate.label ?? plate.barcode}</span>\n </Badge>\n );\n}\n\nexport function PlateMapPlateSelector({\n plates = [],\n activePlateId,\n onPlateChange,\n onAddPlate,\n onRemovePlate,\n addPlateLabel = \"Add Plate\",\n removePlateLabel = \"Remove plate\",\n label = \"Plate\",\n variant = \"dropdown\",\n align = \"start\",\n side = \"bottom\",\n className,\n}: PlateMapPlateSelectorProps) {\n const activePlate = plates.find((plate) => plate.id === activePlateId) ?? (activePlateId ? undefined : plates[0]);\n\n if (variant === \"tabs\") {\n return (\n <div className={cn(\"inline-flex flex-wrap items-center gap-1\", className)} data-slot=\"plate-tabs\">\n <ToggleGroup\n type=\"single\"\n variant=\"outline\"\n size=\"sm\"\n value={activePlate?.id ?? \"\"}\n aria-label={label}\n onValueChange={(value) => {\n if (value) onPlateChange?.(value);\n }}\n >\n {plates.map((plate) => {\n const selected = plate.id === activePlate?.id;\n const canRemove = !!onRemovePlate && plates.length > 1;\n return (\n <div key={plate.id} className=\"inline-flex items-stretch\">\n <ToggleGroupItem\n value={plate.id}\n disabled={plate.disabled || !onPlateChange}\n aria-label={plate.label ?? plate.barcode}\n className={cn(canRemove && \"rounded-r-none border-r-0\")}\n >\n <span className=\"truncate\">{plate.label ?? plate.barcode}</span>\n {plate.count === undefined ? null : (\n <Badge variant={selected ? \"secondary\" : \"outline\"} className=\"ml-1 h-4 px-1 text-[0.65rem]\">\n {plate.count}\n </Badge>\n )}\n </ToggleGroupItem>\n {canRemove ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label={`${removePlateLabel} ${plate.label ?? plate.barcode}`}\n className=\"rounded-l-none\"\n onClick={() => onRemovePlate?.(plate.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </div>\n );\n })}\n </ToggleGroup>\n {onAddPlate ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" aria-label={addPlateLabel} onClick={() => onAddPlate()}>\n <Plus aria-hidden />\n </Button>\n ) : null}\n </div>\n );\n }\n\n if (plates.length === 0) {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={!onAddPlate}\n aria-label={addPlateLabel}\n className={cn(\"min-w-28 justify-start\", className)}\n onClick={() => onAddPlate?.()}\n >\n <Plus aria-hidden />\n {addPlateLabel}\n </Button>\n );\n }\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={label}\n className={cn(\"min-w-36 justify-between\", className)}\n >\n <span className=\"flex min-w-0 items-center gap-1.5\">\n {activePlate ? <PlatePill plate={activePlate} selected /> : <span>{addPlateLabel}</span>}\n </span>\n <ChevronDown aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align} side={side} className=\"w-64\">\n <DropdownMenuGroup>\n {plates.map((plate) => {\n const selected = plate.id === activePlate?.id;\n return (\n <DropdownMenuItem\n key={plate.id}\n disabled={plate.disabled || !onPlateChange}\n onClick={() => onPlateChange?.(plate.id)}\n >\n {selected ? <Check aria-hidden /> : <span className=\"size-4\" aria-hidden />}\n <span className=\"flex min-w-0 flex-1 items-center justify-between gap-2\">\n <PlatePill plate={plate} selected={selected} />\n {plate.count === undefined ? null : (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{plate.count} wells</span>\n )}\n </span>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuGroup>\n {onAddPlate ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => onAddPlate()}>\n <Plus aria-hidden />\n {addPlateLabel}\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["PlatePill","plate","selected","Badge","jsx","PlateMapPlateSelector","plates","activePlateId","onPlateChange","onAddPlate","onRemovePlate","addPlateLabel","removePlateLabel","label","variant","align","side","className","activePlate","jsxs","cn","ToggleGroup","value","canRemove","ToggleGroupItem","Button","X","Plus","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","Check","Fragment","DropdownMenuSeparator"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),_e=require("react"),v=require("./wellGrid.cjs"),ee=require("../../../lib/utils.cjs");function ye(n){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const o in n)if(o!=="default"){const s=Object.getOwnPropertyDescriptor(n,o);Object.defineProperty(l,o,s.get?s:{enumerable:!0,get:()=>n[o]})}}return l.default=n,Object.freeze(l)}const L=ye(_e),we=34,be=24,xe=72,Ae=36,c=26,X=12,Me=1,oe=16,Pe=9,Te=5,N=1,z=4,te=4,Oe=3,se=5,q=650,ne="var(--surface-container)",le="var(--border)";function Re(n,l){const o=[];for(let s=0;s<n;s++)o.push(u.jsx("text",{x:c+s*l+l/2,y:c/2,textAnchor:"middle",fontSize:oe,className:"fill-muted-foreground",children:s+1},`c${s}`));return o}function je(n,l){const o=[];for(let s=0;s<n;s++)o.push(u.jsx("text",{x:c-Pe,y:c+s*l+l/2+Te,textAnchor:"end",fontSize:oe,className:"fill-muted-foreground",children:v.rowLabel(s)},`r${s}`));return o}function ke(n,l,o){const{dims:s,cellSize:e,values:E,selection:P,dragPositions:_,colorForWell:d,emptyWellFillColor:h,selectedFillColor:y,selectedFillOpacity:b,selectionFillMode:O,wellShape:m}=n,p=v.pos(l,o,s.columns),x=E.get(p),w=P.has(p)||_.has(p),k=x===void 0&&h!==null?h:d(x,p),T=w&&!(w&&O==="well"&&x!==void 0),R=T?y:k,j=T?b:void 0;if(m==="circle"){const F=c+o*e+e/2,A=c+l*e+e/2,S=e/2-N;return u.jsx("circle",{cx:F,cy:A,r:S,fill:R,fillOpacity:j,stroke:"none","data-well":p,"data-selected":w?"true":void 0},p)}return u.jsx("rect",{x:c+o*e,y:c+l*e,width:e,height:e,fill:R,fillOpacity:j,stroke:"none","data-well":p,"data-selected":w?"true":void 0},p)}function Fe({dims:n,...l}){const o=[];for(let s=0;s<n.rows;s++)for(let e=0;e<n.columns;e++)o.push(ke({dims:n,...l},s,e));return o}function Se(n,l,o){const s=[],e=c,E=c,P=c+n.columns*l,_=c+n.rows*l;for(let d=0;d<=n.columns;d++){const h=c+d*l;s.push(u.jsx("line",{x1:h,y1:E,x2:h,y2:_,stroke:o,strokeWidth:z,vectorEffect:"non-scaling-stroke",shapeRendering:"crispEdges",pointerEvents:"none","data-plate-grid-line":`column-${d}`},`grid-col-${d}`))}for(let d=0;d<=n.rows;d++){const h=c+d*l;s.push(u.jsx("line",{x1:e,y1:h,x2:P,y2:h,stroke:o,strokeWidth:z,vectorEffect:"non-scaling-stroke",shapeRendering:"crispEdges",pointerEvents:"none","data-plate-grid-line":`row-${d}`},`grid-row-${d}`))}return s}function De(n,l,o){const{dims:s,cellSize:e,selection:E,dragPositions:P,selectedBorderColor:_,flashWellId:d,flashWellKey:h,wellShape:y,highlightedWellIds:b,highlightBorderColor:O}=n,m=v.pos(l,o,s.columns),p=E.has(m)||P.has(m),x=d===m,w=!p&&b.has(m);if(!p&&!x&&!w)return null;const k=c+o*e+N,I=c+l*e+N,T=e-N*2,R=c+o*e+e/2,j=c+l*e+e/2,F=e/2-N,A=y==="circle",S=A?{cx:R,cy:j,r:F}:{x:k,y:I,width:T,height:T},M=(r,D,C)=>{const a={...S,...r,pointerEvents:"none"};return A?u.jsx("circle",{...a,children:D},C):u.jsx("rect",{...a,children:D},C)},$=u.jsxs(u.Fragment,{children:[u.jsx("animate",{attributeName:"fill-opacity",values:"0.24;0.1;0",dur:`${q}ms`,fill:"freeze"}),u.jsx("animate",{attributeName:"stroke-opacity",values:"0.92;0.42;0",dur:`${q}ms`,fill:"freeze"}),u.jsx("animate",{attributeName:"stroke-width",values:`${se};${te}`,dur:`${q}ms`,fill:"freeze"})]});return u.jsxs("g",{children:[p?M({fill:"none",stroke:_,strokeWidth:te,"data-well-selection":m}):null,w?M({fill:"none",stroke:O,strokeWidth:Oe,"data-well-highlight":m}):null,x?M({fill:_,fillOpacity:.24,stroke:_,strokeOpacity:.92,strokeWidth:se,"data-well-flash":m},$,`${m}-${h}`):null]},`overlay-${m}`)}function Ce({dims:n,...l}){const o=[];for(let s=0;s<n.rows;s++)for(let e=0;e<n.columns;e++){const E=De({dims:n,...l},s,e);E&&o.push(E)}return o}function We({format:n,rows:l,columns:o,values:s,selection:e,onSelectionChange:E,colorForWell:P,emptyWellFillColor:_=ne,wellShape:d="rect",framed:h=!1,cellSize:y,autoScale:b=!0,minCellSize:O=be,maxCellSize:m,borderColor:p=le,selectedBorderColor:x="var(--color-primary)",selectedFillColor:w="var(--color-primary)",selectedFillOpacity:k=.18,selectionFillMode:I="selection",flashWellId:T,flashWellKey:R,highlightedWellIds:j,highlightBorderColor:F="var(--color-primary)",onWellHover:A,onWellDoubleClick:S,wrapWell:M,className:$}){const r=v.resolveDimensions(n,l,o),D=L.useRef(null),C=L.useRef(null),[a,B]=L.useState(null),[U,re]=L.useState();L.useLayoutEffect(()=>{const i=D.current;if(!i||!b||y!==void 0)return;const t=()=>re(i.clientWidth);if(t(),typeof ResizeObserver>"u")return;const f=new ResizeObserver(t);return f.observe(i),()=>f.disconnect()},[b,y]);const g=L.useMemo(()=>{if(!b||y!==void 0||!U)return y??we;const i=m??(r.columns>12?Ae:xe),t=h?(X+Me)*2:0,f=Math.floor((U-c-t)/r.columns);return Math.max(O,Math.min(i,f))},[b,y,U,r.columns,h,m,O]),G=L.useCallback(i=>{const t=C.current;if(!t)return null;const f=t.getBoundingClientRect(),W=i.clientX-f.left-c,ve=i.clientY-f.top-c,H=Math.floor(W/g),K=Math.floor(ve/g);return K<0||K>=r.rows||H<0||H>=r.columns?null:{r:K,c:H}},[g,r.rows,r.columns]),ce=i=>{const t=G(i);if(!t)return;const f=i.shiftKey?"add":i.altKey?"remove":"replace";B({start:t,cur:t,mode:f})},ie=i=>{const t=G(i);t&&A&&A(v.pos(t.r,t.c,r.columns)),!(!a||!t)&&B({...a,cur:t})},Y=L.useCallback(()=>{if(!a)return;const i=v.rectPositions(a.start.r,a.start.c,a.cur.r,a.cur.c,r.columns);let t;a.mode==="replace"?t=new Set(i):a.mode==="add"?(t=new Set(e),i.forEach(f=>t.add(f))):(t=new Set(e),i.forEach(f=>t.delete(f))),E(t),B(null)},[a,r.columns,E,e]),ae=()=>Y(),ue=()=>{Y(),A?.(null)},de=i=>{const t=G(i);t&&S?.(v.pos(t.r,t.c,r.columns))},fe=L.useMemo(()=>a?new Set(v.rectPositions(a.start.r,a.start.c,a.cur.r,a.cur.c,r.columns)):new Set,[a,r.columns]),Z=z,J=r.columns*g+c+Z,Q=r.rows*g+c+Z,he=Re(r.columns,g),pe=je(r.rows,g),V={dims:r,cellSize:g,values:s,selection:e,dragPositions:fe,colorForWell:P,emptyWellFillColor:_,borderColor:p,selectedBorderColor:x,selectedFillColor:w,selectedFillOpacity:k,selectionFillMode:I,wellShape:d,highlightedWellIds:j??new Set,highlightBorderColor:F,flashWellId:T,flashWellKey:R},ge=Fe(V),me=d==="circle"?[]:Se(r,g,p),Ee=Ce(V),Le=L.useMemo(()=>{if(!M)return[];const i=[];for(let t=0;t<r.rows;t++)for(let f=0;f<r.columns;f++){const W=v.pos(t,f,r.columns);i.push(u.jsx("div",{style:{position:"absolute",left:c+f*g,top:c+t*g,width:g,height:g},"data-well-id":W,children:M(W,g)},W))}return i},[M,r.rows,r.columns,g]);return u.jsx("div",{ref:D,className:ee.cn("relative w-full select-none",$),"data-slot":"plate-paint-grid",children:u.jsxs("div",{className:ee.cn("relative inline-block",h&&"rounded-xl border bg-card p-3 shadow-sm"),"data-slot":"plate-paint-grid-frame",children:[u.jsxs("svg",{ref:C,width:J,height:Q,className:"block cursor-crosshair",onMouseDown:ce,onMouseMove:ie,onMouseUp:ae,onMouseLeave:ue,onDoubleClick:de,role:"group","aria-label":`${r.rows} row by ${r.columns} column plate map. Drag to select wells.`,children:[he,pe,ge,me,Ee]}),M?u.jsx("div",{className:"pointer-events-none absolute",style:{top:h?X:0,left:h?X:0,width:J,height:Q},"aria-hidden":!0,"data-slot":"plate-well-overlay",children:Le}):null]})})}exports.parsePos=v.parsePos;exports.PLATE_MAP_CELL_BORDER=le;exports.PLATE_MAP_EMPTY_WELL_FILL=ne;exports.PlatePaintGrid=We;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),_e=require("react"),v=require("./wellGrid.cjs"),ee=require("../../../lib/utils.cjs");function ye(n){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const o in n)if(o!=="default"){const s=Object.getOwnPropertyDescriptor(n,o);Object.defineProperty(l,o,s.get?s:{enumerable:!0,get:()=>n[o]})}}return l.default=n,Object.freeze(l)}const L=ye(_e),we=34,be=24,xe=72,Ae=36,c=26,X=12,Me=1,oe=16,Pe=9,Te=5,N=1,z=4,te=4,Oe=3,se=5,q=650,ne="var(--surface-container)",le="var(--border)";function Re(n,l){const o=[];for(let s=0;s<n;s++)o.push(u.jsx("text",{x:c+s*l+l/2,y:c/2,textAnchor:"middle",fontSize:oe,className:"fill-muted-foreground",children:s+1},`c${s}`));return o}function je(n,l){const o=[];for(let s=0;s<n;s++)o.push(u.jsx("text",{x:c-Pe,y:c+s*l+l/2+Te,textAnchor:"end",fontSize:oe,className:"fill-muted-foreground",children:v.rowLabel(s)},`r${s}`));return o}function ke(n,l,o){const{dims:s,cellSize:e,values:E,selection:P,dragPositions:_,colorForWell:d,emptyWellFillColor:h,selectedFillColor:y,selectedFillOpacity:b,selectionFillMode:O,wellShape:m}=n,p=v.pos(l,o,s.columns),x=E.get(p),w=P.has(p)||_.has(p),k=x===void 0&&h!==null?h:d(x,p),T=w&&!(w&&O==="well"&&x!==void 0),R=T?y:k,j=T?b:void 0;if(m==="circle"){const F=c+o*e+e/2,A=c+l*e+e/2,S=e/2-N;return u.jsx("circle",{cx:F,cy:A,r:S,fill:R,fillOpacity:j,stroke:"none","data-well":p,"data-selected":w?"true":void 0},p)}return u.jsx("rect",{x:c+o*e,y:c+l*e,width:e,height:e,fill:R,fillOpacity:j,stroke:"none","data-well":p,"data-selected":w?"true":void 0},p)}function Fe({dims:n,...l}){const o=[];for(let s=0;s<n.rows;s++)for(let e=0;e<n.columns;e++)o.push(ke({dims:n,...l},s,e));return o}function Se(n,l,o){const s=[],e=c,E=c,P=c+n.columns*l,_=c+n.rows*l;for(let d=0;d<=n.columns;d++){const h=c+d*l;s.push(u.jsx("line",{x1:h,y1:E,x2:h,y2:_,stroke:o,strokeWidth:z,vectorEffect:"non-scaling-stroke",shapeRendering:"crispEdges",pointerEvents:"none","data-plate-grid-line":`column-${d}`},`grid-col-${d}`))}for(let d=0;d<=n.rows;d++){const h=c+d*l;s.push(u.jsx("line",{x1:e,y1:h,x2:P,y2:h,stroke:o,strokeWidth:z,vectorEffect:"non-scaling-stroke",shapeRendering:"crispEdges",pointerEvents:"none","data-plate-grid-line":`row-${d}`},`grid-row-${d}`))}return s}function De(n,l,o){const{dims:s,cellSize:e,selection:E,dragPositions:P,selectedBorderColor:_,flashWellId:d,flashWellKey:h,wellShape:y,highlightedWellIds:b,highlightBorderColor:O}=n,m=v.pos(l,o,s.columns),p=E.has(m)||P.has(m),x=d===m,w=!p&&b.has(m);if(!p&&!x&&!w)return null;const k=c+o*e+N,I=c+l*e+N,T=e-N*2,R=c+o*e+e/2,j=c+l*e+e/2,F=e/2-N,A=y==="circle",S=A?{cx:R,cy:j,r:F}:{x:k,y:I,width:T,height:T},M=(r,D,C)=>{const a={...S,...r,pointerEvents:"none"};return A?u.jsx("circle",{...a,children:D},C):u.jsx("rect",{...a,children:D},C)},$=u.jsxs(u.Fragment,{children:[u.jsx("animate",{attributeName:"fill-opacity",values:"0.24;0.1;0",dur:`${q}ms`,fill:"freeze"}),u.jsx("animate",{attributeName:"stroke-opacity",values:"0.92;0.42;0",dur:`${q}ms`,fill:"freeze"}),u.jsx("animate",{attributeName:"stroke-width",values:`${se};${te}`,dur:`${q}ms`,fill:"freeze"})]});return u.jsxs("g",{children:[p?M({fill:"none",stroke:_,strokeWidth:te,"data-well-selection":m}):null,w?M({fill:"none",stroke:O,strokeWidth:Oe,"data-well-highlight":m}):null,x?M({fill:_,fillOpacity:.24,stroke:_,strokeOpacity:.92,strokeWidth:se,"data-well-flash":m},$,`${m}-${h}`):null]},`overlay-${m}`)}function Ce({dims:n,...l}){const o=[];for(let s=0;s<n.rows;s++)for(let e=0;e<n.columns;e++){const E=De({dims:n,...l},s,e);E&&o.push(E)}return o}function We({format:n,rows:l,columns:o,values:s,selection:e,onSelectionChange:E,colorForWell:P,emptyWellFillColor:_=ne,wellShape:d="rect",framed:h=!1,cellSize:y,autoScale:b=!0,minCellSize:O=be,maxCellSize:m,borderColor:p=le,selectedBorderColor:x="var(--color-primary)",selectedFillColor:w="var(--color-primary)",selectedFillOpacity:k=.18,selectionFillMode:I="selection",flashWellId:T,flashWellKey:R,highlightedWellIds:j,highlightBorderColor:F="var(--color-primary)",onWellHover:A,onWellDoubleClick:S,wrapWell:M,className:$}){const r=v.resolveDimensions(n,l,o),D=L.useRef(null),C=L.useRef(null),[a,B]=L.useState(null),[U,re]=L.useState();L.useLayoutEffect(()=>{const i=D.current;if(!i||!b||y!==void 0)return;const t=()=>re(i.clientWidth);if(t(),typeof ResizeObserver>"u")return;const f=new ResizeObserver(t);return f.observe(i),()=>f.disconnect()},[b,y]);const g=L.useMemo(()=>{if(!b||y!==void 0||!U)return y??we;const i=m??(r.columns>12?Ae:xe),t=h?(X+Me)*2:0,f=Math.floor((U-c-t)/r.columns);return Math.max(O,Math.min(i,f))},[b,y,U,r.columns,h,m,O]),G=L.useCallback(i=>{const t=C.current;if(!t)return null;const f=t.getBoundingClientRect(),W=i.clientX-f.left-c,ve=i.clientY-f.top-c,H=Math.floor(W/g),K=Math.floor(ve/g);return K<0||K>=r.rows||H<0||H>=r.columns?null:{r:K,c:H}},[g,r.rows,r.columns]),ce=i=>{const t=G(i);if(!t)return;const f=i.shiftKey?"add":i.altKey?"remove":"replace";B({start:t,cur:t,mode:f})},ie=i=>{const t=G(i);t&&A&&A(v.pos(t.r,t.c,r.columns)),!(!a||!t)&&B({...a,cur:t})},Y=L.useCallback(()=>{if(!a)return;const i=v.rectPositions(a.start.r,a.start.c,a.cur.r,a.cur.c,r.columns);let t;a.mode==="replace"?t=new Set(i):a.mode==="add"?(t=new Set(e),i.forEach(f=>t.add(f))):(t=new Set(e),i.forEach(f=>t.delete(f))),E(t),B(null)},[a,r.columns,E,e]),ae=()=>Y(),ue=()=>{Y(),A?.(null)},de=i=>{const t=G(i);t&&S?.(v.pos(t.r,t.c,r.columns))},fe=L.useMemo(()=>a?new Set(v.rectPositions(a.start.r,a.start.c,a.cur.r,a.cur.c,r.columns)):new Set,[a,r.columns]),Z=z,J=r.columns*g+c+Z,Q=r.rows*g+c+Z,he=Re(r.columns,g),pe=je(r.rows,g),V={dims:r,cellSize:g,values:s,selection:e,dragPositions:fe,colorForWell:P,emptyWellFillColor:_,borderColor:p,selectedBorderColor:x,selectedFillColor:w,selectedFillOpacity:k,selectionFillMode:I,wellShape:d,highlightedWellIds:j??new Set,highlightBorderColor:F,flashWellId:T,flashWellKey:R},ge=Fe(V),me=d==="circle"?[]:Se(r,g,p),Ee=Ce(V),Le=L.useMemo(()=>{if(!M)return[];const i=[];for(let t=0;t<r.rows;t++)for(let f=0;f<r.columns;f++){const W=v.pos(t,f,r.columns);i.push(u.jsx("div",{style:{position:"absolute",left:c+f*g,top:c+t*g,width:g,height:g},"data-well-id":W,children:M(W,g)},W))}return i},[M,r.rows,r.columns,g]);return u.jsx("div",{ref:D,className:ee.cn("relative w-full select-none",$),"data-slot":"plate-paint-grid",children:u.jsxs("div",{className:ee.cn("relative inline-block",h&&"rounded-xl border bg-card p-3 shadow-elevation-3"),"data-slot":"plate-paint-grid-frame",children:[u.jsxs("svg",{ref:C,width:J,height:Q,className:"block cursor-crosshair",onMouseDown:ce,onMouseMove:ie,onMouseUp:ae,onMouseLeave:ue,onDoubleClick:de,role:"group","aria-label":`${r.rows} row by ${r.columns} column plate map. Drag to select wells.`,children:[he,pe,ge,me,Ee]}),M?u.jsx("div",{className:"pointer-events-none absolute",style:{top:h?X:0,left:h?X:0,width:J,height:Q},"aria-hidden":!0,"data-slot":"plate-well-overlay",children:Le}):null]})})}exports.parsePos=v.parsePos;exports.PLATE_MAP_CELL_BORDER=le;exports.PLATE_MAP_EMPTY_WELL_FILL=ne;exports.PlatePaintGrid=We;
2
2
  //# sourceMappingURL=PlatePaintGrid.cjs.map