@tetrascience-npm/tetrascience-react-ui 0.7.0-beta.129.1 → 0.7.0-beta.131.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 (1042) hide show
  1. package/README.md +49 -0
  2. package/dist/ai/attachments.cjs +2 -0
  3. package/dist/ai/attachments.cjs.map +1 -0
  4. package/dist/ai/attachments.js +224 -0
  5. package/dist/ai/attachments.js.map +1 -0
  6. package/dist/ai/chain-of-thought.cjs +2 -0
  7. package/dist/ai/chain-of-thought.cjs.map +1 -0
  8. package/dist/ai/chain-of-thought.js +145 -0
  9. package/dist/ai/chain-of-thought.js.map +1 -0
  10. package/dist/ai/confirmation.cjs +2 -0
  11. package/dist/ai/confirmation.cjs.map +1 -0
  12. package/dist/ai/confirmation.js +109 -0
  13. package/dist/ai/confirmation.js.map +1 -0
  14. package/dist/ai/context.cjs +2 -0
  15. package/dist/ai/context.cjs.map +1 -0
  16. package/dist/ai/context.js +267 -0
  17. package/dist/ai/context.js.map +1 -0
  18. package/dist/ai/conversation.cjs +4 -0
  19. package/dist/ai/conversation.cjs.map +1 -0
  20. package/dist/ai/conversation.js +108 -0
  21. package/dist/ai/conversation.js.map +1 -0
  22. package/dist/ai/inline-citation.cjs +2 -0
  23. package/dist/ai/inline-citation.cjs.map +1 -0
  24. package/dist/ai/inline-citation.js +182 -0
  25. package/dist/ai/inline-citation.js.map +1 -0
  26. package/dist/ai/message.cjs +2 -0
  27. package/dist/ai/message.cjs.map +1 -0
  28. package/dist/ai/message.js +237 -0
  29. package/dist/ai/message.js.map +1 -0
  30. package/dist/ai/model-selector.cjs +2 -0
  31. package/dist/ai/model-selector.cjs.map +1 -0
  32. package/dist/ai/model-selector.js +77 -0
  33. package/dist/ai/model-selector.js.map +1 -0
  34. package/dist/ai/prompt-input.cjs +2 -0
  35. package/dist/ai/prompt-input.cjs.map +1 -0
  36. package/dist/ai/prompt-input.js +776 -0
  37. package/dist/ai/prompt-input.js.map +1 -0
  38. package/dist/ai/queue.cjs +2 -0
  39. package/dist/ai/queue.cjs.map +1 -0
  40. package/dist/ai/queue.js +209 -0
  41. package/dist/ai/queue.js.map +1 -0
  42. package/dist/ai/reasoning.cjs +2 -0
  43. package/dist/ai/reasoning.cjs.map +1 -0
  44. package/dist/ai/reasoning.js +129 -0
  45. package/dist/ai/reasoning.js.map +1 -0
  46. package/dist/ai/shimmer.cjs +2 -0
  47. package/dist/ai/shimmer.cjs.map +1 -0
  48. package/dist/ai/shimmer.js +49 -0
  49. package/dist/ai/shimmer.js.map +1 -0
  50. package/dist/ai/sources.cjs +2 -0
  51. package/dist/ai/sources.cjs.map +1 -0
  52. package/dist/ai/sources.js +54 -0
  53. package/dist/ai/sources.js.map +1 -0
  54. package/dist/ai/speech-input.cjs +2 -0
  55. package/dist/ai/speech-input.cjs.map +1 -0
  56. package/dist/ai/speech-input.js +123 -0
  57. package/dist/ai/speech-input.js.map +1 -0
  58. package/dist/ai/stream-status.cjs +2 -0
  59. package/dist/ai/stream-status.cjs.map +1 -0
  60. package/dist/ai/stream-status.js +108 -0
  61. package/dist/ai/stream-status.js.map +1 -0
  62. package/dist/ai/suggestion.cjs +2 -0
  63. package/dist/ai/suggestion.cjs.map +1 -0
  64. package/dist/ai/suggestion.js +38 -0
  65. package/dist/ai/suggestion.js.map +1 -0
  66. package/dist/ai/task.cjs +2 -0
  67. package/dist/ai/task.cjs.map +1 -0
  68. package/dist/ai/task.js +101 -0
  69. package/dist/ai/task.js.map +1 -0
  70. package/dist/ai/tool.cjs +2 -0
  71. package/dist/ai/tool.cjs.map +1 -0
  72. package/dist/ai/tool.js +139 -0
  73. package/dist/ai/tool.js.map +1 -0
  74. package/dist/charts/AreaPlot.cjs +2 -0
  75. package/dist/charts/AreaPlot.cjs.map +1 -0
  76. package/dist/charts/AreaPlot.js +5 -0
  77. package/dist/charts/AreaPlot.js.map +1 -0
  78. package/dist/charts/BarChart.cjs +2 -0
  79. package/dist/charts/BarChart.cjs.map +1 -0
  80. package/dist/charts/BarChart.js +5 -0
  81. package/dist/charts/BarChart.js.map +1 -0
  82. package/dist/charts/BoxPlot.cjs +2 -0
  83. package/dist/charts/BoxPlot.cjs.map +1 -0
  84. package/dist/charts/BoxPlot.js +5 -0
  85. package/dist/charts/BoxPlot.js.map +1 -0
  86. package/dist/charts/ChartTooltip.cjs +2 -0
  87. package/dist/charts/ChartTooltip.cjs.map +1 -0
  88. package/dist/charts/ChartTooltip.js +8 -0
  89. package/dist/charts/ChartTooltip.js.map +1 -0
  90. package/dist/charts/Chromatogram.cjs +2 -0
  91. package/dist/charts/Chromatogram.cjs.map +1 -0
  92. package/dist/charts/Chromatogram.js +5 -0
  93. package/dist/charts/Chromatogram.js.map +1 -0
  94. package/dist/charts/Electropherogram.cjs +2 -0
  95. package/dist/charts/Electropherogram.cjs.map +1 -0
  96. package/dist/charts/Electropherogram.js +5 -0
  97. package/dist/charts/Electropherogram.js.map +1 -0
  98. package/dist/charts/Histogram.cjs +2 -0
  99. package/dist/charts/Histogram.cjs.map +1 -0
  100. package/dist/charts/Histogram.js +5 -0
  101. package/dist/charts/Histogram.js.map +1 -0
  102. package/dist/charts/LinePlot.cjs +2 -0
  103. package/dist/charts/LinePlot.cjs.map +1 -0
  104. package/dist/charts/LinePlot.js +5 -0
  105. package/dist/charts/LinePlot.js.map +1 -0
  106. package/dist/charts/PieChart.cjs +2 -0
  107. package/dist/charts/PieChart.cjs.map +1 -0
  108. package/dist/charts/PieChart.js +5 -0
  109. package/dist/charts/PieChart.js.map +1 -0
  110. package/dist/charts/PlateMap.cjs +2 -0
  111. package/dist/charts/PlateMap.cjs.map +1 -0
  112. package/dist/charts/PlateMap.js +5 -0
  113. package/dist/charts/PlateMap.js.map +1 -0
  114. package/dist/charts/ScatterPlot.cjs +2 -0
  115. package/dist/charts/ScatterPlot.cjs.map +1 -0
  116. package/dist/charts/ScatterPlot.js +5 -0
  117. package/dist/charts/ScatterPlot.js.map +1 -0
  118. package/dist/charts/ScatterPlotInteractive.cjs +2 -0
  119. package/dist/charts/ScatterPlotInteractive.cjs.map +1 -0
  120. package/dist/charts/ScatterPlotInteractive.js +14 -0
  121. package/dist/charts/ScatterPlotInteractive.js.map +1 -0
  122. package/dist/charts/StackedChromatogram.cjs +2 -0
  123. package/dist/charts/StackedChromatogram.cjs.map +1 -0
  124. package/dist/charts/StackedChromatogram.js +7 -0
  125. package/dist/charts/StackedChromatogram.js.map +1 -0
  126. package/dist/components/ai/attachments.d.ts +54 -0
  127. package/dist/components/ai/chain-of-thought.d.ts +56 -0
  128. package/dist/components/ai/confirmation.d.ts +47 -0
  129. package/dist/components/ai/context.d.ts +40 -0
  130. package/dist/components/ai/conversation.d.ts +23 -0
  131. package/dist/components/ai/inline-citation.d.ts +38 -0
  132. package/dist/components/ai/message.d.ts +37 -0
  133. package/dist/components/ai/model-selector.d.ts +36 -0
  134. package/dist/components/ai/prompt-input.d.ts +158 -0
  135. package/dist/components/ai/queue.d.ts +72 -0
  136. package/dist/components/ai/reasoning.d.ts +26 -0
  137. package/dist/components/ai/shimmer.d.ts +17 -0
  138. package/dist/components/ai/sources.d.ts +12 -0
  139. package/dist/components/ai/speech-input.d.ts +54 -0
  140. package/dist/components/ai/stream-status.d.ts +66 -0
  141. package/dist/components/ai/streamdown-code-plugin.d.ts +2 -0
  142. package/dist/components/ai/streamdown-plugins.d.ts +2 -0
  143. package/dist/components/ai/suggestion.d.ts +9 -0
  144. package/dist/components/ai/task.d.ts +16 -0
  145. package/dist/components/ai/tool.d.ts +33 -0
  146. package/dist/components/ai/use-streamdown-plugins.d.ts +8 -0
  147. package/dist/components/charts/AreaPlot/AreaPlot.cjs +1 -1
  148. package/dist/components/charts/AreaPlot/AreaPlot.d.ts +39 -0
  149. package/dist/components/charts/AreaPlot/index.d.ts +2 -0
  150. package/dist/components/charts/BarChart/BarChart.cjs +1 -1
  151. package/dist/components/charts/BarChart/BarChart.d.ts +44 -0
  152. package/dist/components/charts/BarChart/index.d.ts +2 -0
  153. package/dist/components/charts/BoxPlot/BoxPlot.cjs +1 -1
  154. package/dist/components/charts/BoxPlot/BoxPlot.d.ts +33 -0
  155. package/dist/components/charts/BoxPlot/index.d.ts +2 -0
  156. package/dist/components/charts/ChartTooltip/ChartTooltip.d.ts +71 -0
  157. package/dist/components/charts/ChartTooltip/index.d.ts +2 -0
  158. package/dist/components/charts/ChartTooltip/lines.d.ts +54 -0
  159. package/dist/components/charts/Chromatogram/Chromatogram.d.ts +5 -0
  160. package/dist/components/charts/Chromatogram/annotations.cjs +1 -1
  161. package/dist/components/charts/Chromatogram/annotations.d.ts +50 -0
  162. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs +1 -1
  163. package/dist/components/charts/Chromatogram/boundaryMarkers.d.ts +14 -0
  164. package/dist/components/charts/Chromatogram/constants.d.ts +46 -0
  165. package/dist/components/charts/Chromatogram/dataProcessing.d.ts +49 -0
  166. package/dist/components/charts/Chromatogram/index.d.ts +2 -0
  167. package/dist/components/charts/Chromatogram/peakDetection.d.ts +33 -0
  168. package/dist/components/charts/Chromatogram/plotBuilder.d.ts +58 -0
  169. package/dist/components/charts/Chromatogram/regionOverlays.cjs +1 -1
  170. package/dist/components/charts/Chromatogram/regionOverlays.d.ts +9 -0
  171. package/dist/components/charts/Chromatogram/types.d.ts +258 -0
  172. package/dist/components/charts/Electropherogram/Electropherogram.cjs +1 -1
  173. package/dist/components/charts/Electropherogram/Electropherogram.d.ts +22 -0
  174. package/dist/components/charts/Electropherogram/index.d.ts +2 -0
  175. package/dist/components/charts/Histogram/Histogram.cjs +1 -1
  176. package/dist/components/charts/Histogram/Histogram.d.ts +36 -0
  177. package/dist/components/charts/Histogram/index.d.ts +2 -0
  178. package/dist/components/charts/LinePlot/LinePlot.cjs +1 -1
  179. package/dist/components/charts/LinePlot/LinePlot.d.ts +45 -0
  180. package/dist/components/charts/LinePlot/index.d.ts +2 -0
  181. package/dist/components/charts/PieChart/PieChart.d.ts +20 -0
  182. package/dist/components/charts/PieChart/index.d.ts +2 -0
  183. package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
  184. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
  185. package/dist/components/charts/PlateMap/PlateMap.d.ts +29 -0
  186. package/dist/components/charts/PlateMap/PlateMap.js +1 -1
  187. package/dist/components/charts/PlateMap/constants.d.ts +75 -0
  188. package/dist/components/charts/PlateMap/index.d.ts +2 -0
  189. package/dist/components/charts/PlateMap/types.d.ts +322 -0
  190. package/dist/components/charts/PlateMap/utils.d.ts +133 -0
  191. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +1 -1
  192. package/dist/components/charts/ScatterPlot/ScatterPlot.d.ts +43 -0
  193. package/dist/components/charts/ScatterPlot/index.d.ts +2 -0
  194. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.d.ts +25 -0
  195. package/dist/components/charts/ScatterPlotInteractive/constants.d.ts +50 -0
  196. package/dist/components/charts/ScatterPlotInteractive/index.d.ts +3 -0
  197. package/dist/components/charts/ScatterPlotInteractive/types.d.ts +226 -0
  198. package/dist/components/charts/ScatterPlotInteractive/utils.d.ts +72 -0
  199. package/dist/components/charts/StackedChromatogram/StackedChromatogram.d.ts +3 -0
  200. package/dist/components/charts/StackedChromatogram/index.d.ts +3 -0
  201. package/dist/components/charts/StackedChromatogram/transforms.d.ts +9 -0
  202. package/dist/components/charts/StackedChromatogram/types.d.ts +26 -0
  203. package/dist/components/charts/plotly-loader.cjs +1 -1
  204. package/dist/components/charts/plotly-loader.cjs.map +1 -1
  205. package/dist/components/charts/plotly-loader.d.ts +29 -0
  206. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +1 -1
  207. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -1
  208. package/dist/components/composed/AssistantLayout/AssistantLayout.d.ts +63 -0
  209. package/dist/components/composed/AssistantLayout/AssistantLayout.js +2 -2
  210. package/dist/components/composed/AssistantLayout/dockLayout.d.ts +15 -0
  211. package/dist/components/composed/AssistantLayout/index.d.ts +3 -0
  212. package/dist/components/composed/Chat/Chat.cjs +1 -1
  213. package/dist/components/composed/Chat/Chat.cjs.map +1 -1
  214. package/dist/components/composed/Chat/Chat.d.ts +35 -0
  215. package/dist/components/composed/Chat/Chat.js +7 -7
  216. package/dist/components/composed/Chat/index.d.ts +2 -0
  217. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
  218. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  219. package/dist/components/composed/ConfirmDialog/ConfirmDialog.d.ts +23 -0
  220. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +4 -4
  221. package/dist/components/composed/ConfirmDialog/index.d.ts +1 -0
  222. package/dist/components/composed/DataAppShell/CollapseButton.cjs +1 -1
  223. package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -1
  224. package/dist/components/composed/DataAppShell/CollapseButton.d.ts +23 -0
  225. package/dist/components/composed/DataAppShell/CollapseButton.js +2 -2
  226. package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
  227. package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
  228. package/dist/components/composed/DataAppShell/DataAppShell.d.ts +88 -0
  229. package/dist/components/composed/DataAppShell/DataAppShell.js +5 -5
  230. package/dist/components/composed/DataAppShell/PrimaryNav.cjs +1 -1
  231. package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -1
  232. package/dist/components/composed/DataAppShell/PrimaryNav.d.ts +64 -0
  233. package/dist/components/composed/DataAppShell/PrimaryNav.js +2 -2
  234. package/dist/components/composed/DataAppShell/RightPanel.cjs +1 -1
  235. package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -1
  236. package/dist/components/composed/DataAppShell/RightPanel.d.ts +95 -0
  237. package/dist/components/composed/DataAppShell/RightPanel.js +2 -2
  238. package/dist/components/composed/DataAppShell/SecondaryNav.cjs +1 -1
  239. package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -1
  240. package/dist/components/composed/DataAppShell/SecondaryNav.d.ts +63 -0
  241. package/dist/components/composed/DataAppShell/SecondaryNav.js +3 -3
  242. package/dist/components/composed/DataAppShell/ShellContext.d.ts +20 -0
  243. package/dist/components/composed/DataAppShell/index.d.ts +12 -0
  244. package/dist/components/composed/EmptyState/EmptyState.d.ts +12 -0
  245. package/dist/components/composed/EmptyState/index.d.ts +2 -0
  246. package/dist/components/composed/FormPatterns/FormSection.cjs +1 -1
  247. package/dist/components/composed/FormPatterns/FormSection.cjs.map +1 -1
  248. package/dist/components/composed/FormPatterns/FormSection.d.ts +7 -0
  249. package/dist/components/composed/FormPatterns/FormSection.js +2 -2
  250. package/dist/components/composed/FormPatterns/index.d.ts +1 -0
  251. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +1 -1
  252. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -1
  253. package/dist/components/composed/MoleculeStructure/MoleculeStructure.d.ts +43 -0
  254. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +1 -1
  255. package/dist/components/composed/MoleculeStructure/index.d.ts +3 -0
  256. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +1 -1
  257. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -1
  258. package/dist/components/composed/MoleculeStructure/rdkit-loader.d.ts +104 -0
  259. package/dist/components/composed/MoleculeStructure/use-rdkit.d.ts +29 -0
  260. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
  261. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
  262. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.d.ts +12 -0
  263. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +4 -4
  264. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
  265. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
  266. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.d.ts +22 -0
  267. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +2 -2
  268. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs +1 -1
  269. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs.map +1 -1
  270. package/dist/components/composed/PlateMapEditor/PlateMapEditor.d.ts +106 -0
  271. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js +2 -2
  272. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs +1 -1
  273. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs.map +1 -1
  274. package/dist/components/composed/PlateMapEditor/PlateMapForm.d.ts +30 -0
  275. package/dist/components/composed/PlateMapEditor/PlateMapForm.js +1 -1
  276. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs +1 -1
  277. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs.map +1 -1
  278. package/dist/components/composed/PlateMapEditor/PlateMapGrid.d.ts +64 -0
  279. package/dist/components/composed/PlateMapEditor/PlateMapGrid.js +1 -1
  280. package/dist/components/composed/PlateMapEditor/PlateMapManifest.d.ts +29 -0
  281. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
  282. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
  283. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.d.ts +19 -0
  284. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +4 -4
  285. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.d.ts +73 -0
  286. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs +1 -1
  287. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs.map +1 -1
  288. package/dist/components/composed/PlateMapEditor/PlateZoomControl.d.ts +12 -0
  289. package/dist/components/composed/PlateMapEditor/PlateZoomControl.js +2 -2
  290. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs +1 -1
  291. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs.map +1 -1
  292. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.d.ts +13 -0
  293. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js +4 -4
  294. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  295. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  296. package/dist/components/composed/PlateMapEditor/WellLegend.d.ts +21 -0
  297. package/dist/components/composed/PlateMapEditor/WellLegend.js +2 -2
  298. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
  299. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
  300. package/dist/components/composed/PlateMapEditor/WellManifestTable.d.ts +46 -0
  301. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +9 -9
  302. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs +1 -1
  303. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs.map +1 -1
  304. package/dist/components/composed/PlateMapEditor/WellMetadataForm.d.ts +17 -0
  305. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js +7 -7
  306. package/dist/components/composed/PlateMapEditor/autoFill.d.ts +26 -0
  307. package/dist/components/composed/PlateMapEditor/csvPlateTriage.d.ts +4 -0
  308. package/dist/components/composed/PlateMapEditor/helpers.d.ts +2 -0
  309. package/dist/components/composed/PlateMapEditor/index.d.ts +31 -0
  310. package/dist/components/composed/PlateMapEditor/types.d.ts +137 -0
  311. package/dist/components/composed/PlateMapEditor/wellGrid.d.ts +12 -0
  312. package/dist/components/composed/ProcessFlow/ProcessFlow.d.ts +32 -0
  313. package/dist/components/composed/ProcessFlow/ProcessFlow.utils.d.ts +86 -0
  314. package/dist/components/composed/ProcessFlow/index.d.ts +1 -0
  315. package/dist/components/composed/RichListItem/RichListItem.cjs +1 -1
  316. package/dist/components/composed/RichListItem/RichListItem.cjs.map +1 -1
  317. package/dist/components/composed/RichListItem/RichListItem.d.ts +22 -0
  318. package/dist/components/composed/RichListItem/RichListItem.js +2 -2
  319. package/dist/components/composed/RichListItem/index.d.ts +2 -0
  320. package/dist/components/composed/StatCard/StatCard.cjs +1 -1
  321. package/dist/components/composed/StatCard/StatCard.cjs.map +1 -1
  322. package/dist/components/composed/StatCard/StatCard.d.ts +11 -0
  323. package/dist/components/composed/StatCard/StatCard.js +1 -1
  324. package/dist/components/composed/StatCard/index.d.ts +1 -0
  325. package/dist/components/composed/TdpSearch/TdpSearch.cjs +1 -1
  326. package/dist/components/composed/TdpSearch/TdpSearch.cjs.map +1 -1
  327. package/dist/components/composed/TdpSearch/TdpSearch.d.ts +21 -0
  328. package/dist/components/composed/TdpSearch/TdpSearch.js +14 -13
  329. package/dist/components/composed/TdpSearch/TdpSearch.mocks.d.ts +5 -0
  330. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
  331. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
  332. package/dist/components/composed/TdpSearch/components/DefaultFilters.d.ts +3 -0
  333. package/dist/components/composed/TdpSearch/components/DefaultFilters.js +1 -1
  334. package/dist/components/composed/TdpSearch/components/DefaultResults.cjs +1 -1
  335. package/dist/components/composed/TdpSearch/components/DefaultResults.cjs.map +1 -1
  336. package/dist/components/composed/TdpSearch/components/DefaultResults.d.ts +3 -0
  337. package/dist/components/composed/TdpSearch/components/DefaultResults.js +2 -2
  338. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs +1 -1
  339. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs.map +1 -1
  340. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.d.ts +3 -0
  341. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js +2 -2
  342. package/dist/components/composed/TdpSearch/constants.d.ts +3 -0
  343. package/dist/components/composed/TdpSearch/hooks/useSearch.d.ts +2 -0
  344. package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.d.ts +14 -0
  345. package/dist/components/composed/TdpSearch/index.d.ts +3 -0
  346. package/dist/components/composed/TdpSearch/types.d.ts +128 -0
  347. package/dist/components/composed/TdpSearch/utils.d.ts +3 -0
  348. package/dist/components/composed/TopBar/TopBar.d.ts +25 -0
  349. package/dist/components/composed/TopBar/index.d.ts +2 -0
  350. package/dist/components/composed/UserMenu/UserMenu.cjs +1 -1
  351. package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -1
  352. package/dist/components/composed/UserMenu/UserMenu.d.ts +53 -0
  353. package/dist/components/composed/UserMenu/UserMenu.js +2 -2
  354. package/dist/components/composed/UserMenu/index.d.ts +2 -0
  355. package/dist/components/composed/tdp-link.d.ts +110 -0
  356. package/dist/components/composed/tdp-url.d.ts +68 -0
  357. package/dist/components/ui/accordion.d.ts +7 -0
  358. package/dist/components/ui/alert-dialog.d.ts +18 -0
  359. package/dist/components/ui/alert.d.ts +10 -0
  360. package/dist/components/ui/aspect-ratio.d.ts +3 -0
  361. package/dist/components/ui/avatar.d.ts +11 -0
  362. package/dist/components/ui/badge.d.ts +9 -0
  363. package/dist/components/ui/banner.d.ts +19 -0
  364. package/dist/components/ui/breadcrumb.d.ts +11 -0
  365. package/dist/components/ui/button-group.d.ts +11 -0
  366. package/dist/components/ui/button.d.ts +10 -0
  367. package/dist/components/ui/calendar.d.ts +10 -0
  368. package/dist/components/ui/card.d.ts +11 -0
  369. package/dist/components/ui/carousel.d.ts +28 -0
  370. package/dist/components/ui/checkbox.d.ts +4 -0
  371. package/dist/components/ui/code-block.d.ts +45 -0
  372. package/dist/components/ui/code-editor.d.ts +18 -0
  373. package/dist/components/ui/collapsible.d.ts +5 -0
  374. package/dist/components/ui/combobox.d.ts +24 -0
  375. package/dist/components/ui/command.d.ts +18 -0
  376. package/dist/components/ui/context-menu.d.ts +31 -0
  377. package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
  378. package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
  379. package/dist/components/ui/data-table/data-table-column-toggle.d.ts +6 -0
  380. package/dist/components/ui/data-table/data-table-column-toggle.js +1 -1
  381. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  382. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  383. package/dist/components/ui/data-table/data-table-filter.d.ts +9 -0
  384. package/dist/components/ui/data-table/data-table-filter.js +3 -3
  385. package/dist/components/ui/data-table/data-table-group.cjs +1 -1
  386. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
  387. package/dist/components/ui/data-table/data-table-group.d.ts +9 -0
  388. package/dist/components/ui/data-table/data-table-group.js +2 -2
  389. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  390. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  391. package/dist/components/ui/data-table/data-table-pagination.d.ts +7 -0
  392. package/dist/components/ui/data-table/data-table-pagination.js +2 -2
  393. package/dist/components/ui/data-table/data-table.cjs +1 -1
  394. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  395. package/dist/components/ui/data-table/data-table.d.ts +82 -0
  396. package/dist/components/ui/data-table/data-table.js +1 -1
  397. package/dist/components/ui/data-table/index.d.ts +5 -0
  398. package/dist/components/ui/dialog.d.ts +18 -0
  399. package/dist/components/ui/dropdown-menu.d.ts +29 -0
  400. package/dist/components/ui/field.d.ts +24 -0
  401. package/dist/components/ui/hover-card.d.ts +6 -0
  402. package/dist/components/ui/input-group.d.ts +16 -0
  403. package/dist/components/ui/input.d.ts +3 -0
  404. package/dist/components/ui/item.d.ts +23 -0
  405. package/dist/components/ui/kbd.d.ts +3 -0
  406. package/dist/components/ui/label.d.ts +4 -0
  407. package/dist/components/ui/menubar.d.ts +30 -0
  408. package/dist/components/ui/navigation-menu.d.ts +14 -0
  409. package/dist/components/ui/popover.d.ts +7 -0
  410. package/dist/components/ui/progress.d.ts +4 -0
  411. package/dist/components/ui/radio-group.d.ts +5 -0
  412. package/dist/components/ui/resizable.d.ts +25 -0
  413. package/dist/components/ui/scroll-area.d.ts +5 -0
  414. package/dist/components/ui/select.d.ts +15 -0
  415. package/dist/components/ui/separator.d.ts +4 -0
  416. package/dist/components/ui/sheet.d.ts +14 -0
  417. package/dist/components/ui/sidebar.d.ts +69 -0
  418. package/dist/components/ui/skeleton.d.ts +2 -0
  419. package/dist/components/ui/slider.d.ts +4 -0
  420. package/dist/components/ui/snippet.d.ts +18 -0
  421. package/dist/components/ui/sonner.d.ts +3 -0
  422. package/dist/components/ui/spinner.d.ts +6 -0
  423. package/dist/components/ui/switch.d.ts +6 -0
  424. package/dist/components/ui/table.d.ts +22 -0
  425. package/dist/components/ui/tabs.d.ts +11 -0
  426. package/dist/components/ui/tetra-molecule-icon.d.ts +11 -0
  427. package/dist/components/ui/tetrascience-icon.d.ts +7 -0
  428. package/dist/components/ui/textarea.d.ts +3 -0
  429. package/dist/components/ui/toggle-group.d.ts +10 -0
  430. package/dist/components/ui/toggle.d.ts +9 -0
  431. package/dist/components/ui/tooltip.d.ts +7 -0
  432. package/dist/composed/AssistantLayout.cjs +2 -0
  433. package/dist/composed/AssistantLayout.cjs.map +1 -0
  434. package/dist/composed/AssistantLayout.js +10 -0
  435. package/dist/composed/AssistantLayout.js.map +1 -0
  436. package/dist/composed/Chat.cjs +2 -0
  437. package/dist/composed/Chat.cjs.map +1 -0
  438. package/dist/composed/Chat.js +5 -0
  439. package/dist/composed/Chat.js.map +1 -0
  440. package/dist/composed/ConfirmDialog.cjs +2 -0
  441. package/dist/composed/ConfirmDialog.cjs.map +1 -0
  442. package/dist/composed/ConfirmDialog.js +5 -0
  443. package/dist/composed/ConfirmDialog.js.map +1 -0
  444. package/dist/composed/DataAppShell.cjs +2 -0
  445. package/dist/composed/DataAppShell.cjs.map +1 -0
  446. package/dist/composed/DataAppShell.js +22 -0
  447. package/dist/composed/DataAppShell.js.map +1 -0
  448. package/dist/composed/EmptyState.cjs +2 -0
  449. package/dist/composed/EmptyState.cjs.map +1 -0
  450. package/dist/composed/EmptyState.js +5 -0
  451. package/dist/composed/EmptyState.js.map +1 -0
  452. package/dist/composed/FormPatterns.cjs +2 -0
  453. package/dist/composed/FormPatterns.cjs.map +1 -0
  454. package/dist/composed/FormPatterns.js +5 -0
  455. package/dist/composed/FormPatterns.js.map +1 -0
  456. package/dist/composed/MoleculeStructure.cjs +2 -0
  457. package/dist/composed/MoleculeStructure.cjs.map +1 -0
  458. package/dist/composed/MoleculeStructure.js +11 -0
  459. package/dist/composed/MoleculeStructure.js.map +1 -0
  460. package/dist/composed/PlateMapEditor.cjs +2 -0
  461. package/dist/composed/PlateMapEditor.cjs.map +1 -0
  462. package/dist/composed/PlateMapEditor.js +45 -0
  463. package/dist/composed/PlateMapEditor.js.map +1 -0
  464. package/dist/composed/ProcessFlow.cjs +2 -0
  465. package/dist/composed/ProcessFlow.cjs.map +1 -0
  466. package/dist/composed/ProcessFlow.js +7 -0
  467. package/dist/composed/ProcessFlow.js.map +1 -0
  468. package/dist/composed/RichListItem.cjs +2 -0
  469. package/dist/composed/RichListItem.cjs.map +1 -0
  470. package/dist/composed/RichListItem.js +6 -0
  471. package/dist/composed/RichListItem.js.map +1 -0
  472. package/dist/composed/StatCard.cjs +2 -0
  473. package/dist/composed/StatCard.cjs.map +1 -0
  474. package/dist/composed/StatCard.js +5 -0
  475. package/dist/composed/StatCard.js.map +1 -0
  476. package/dist/composed/TdpSearch.cjs +2 -0
  477. package/dist/composed/TdpSearch.cjs.map +1 -0
  478. package/dist/composed/TdpSearch.js +8 -0
  479. package/dist/composed/TdpSearch.js.map +1 -0
  480. package/dist/composed/TopBar.cjs +2 -0
  481. package/dist/composed/TopBar.cjs.map +1 -0
  482. package/dist/composed/TopBar.js +6 -0
  483. package/dist/composed/TopBar.js.map +1 -0
  484. package/dist/composed/UserMenu.cjs +2 -0
  485. package/dist/composed/UserMenu.cjs.map +1 -0
  486. package/dist/composed/UserMenu.js +7 -0
  487. package/dist/composed/UserMenu.js.map +1 -0
  488. package/dist/composed/tdp-link.cjs +2 -0
  489. package/dist/composed/tdp-link.cjs.map +1 -0
  490. package/dist/composed/tdp-link.js.map +1 -0
  491. package/dist/composed/tdp-url.cjs.map +1 -0
  492. package/dist/composed/tdp-url.js.map +1 -0
  493. package/dist/hooks/use-code-editor-theme.d.ts +34 -0
  494. package/dist/hooks/use-element-size.d.ts +25 -0
  495. package/dist/hooks/use-is-dark.d.ts +12 -0
  496. package/dist/hooks/use-mobile.d.ts +1 -0
  497. package/dist/hooks/use-plotly-theme.d.ts +49 -0
  498. package/dist/index.cjs +1 -1
  499. package/dist/index.css +1 -1
  500. package/dist/index.d.ts +102 -5448
  501. package/dist/index.js +72 -72
  502. package/dist/jest-setup.cjs +4 -0
  503. package/dist/jest-setup.cjs.map +1 -0
  504. package/dist/jest-setup.d.ts +106 -0
  505. package/dist/jest-setup.js +218 -0
  506. package/dist/jest-setup.js.map +1 -0
  507. package/dist/lib/shiki.cjs +1 -1
  508. package/dist/lib/shiki.cjs.map +1 -1
  509. package/dist/lib/shiki.d.ts +32 -0
  510. package/dist/lib/utils.d.ts +2 -0
  511. package/dist/server/auth/JwtTokenManager.cjs +1 -1
  512. package/dist/server/auth/JwtTokenManager.cjs.map +1 -1
  513. package/dist/server/auth/JwtTokenManager.d.ts +113 -0
  514. package/dist/server/auth/JwtTokenManager.js +44 -21
  515. package/dist/server/auth/JwtTokenManager.js.map +1 -1
  516. package/dist/server/auth/index.d.ts +5 -0
  517. package/dist/server/index.d.ts +8 -0
  518. package/dist/server/providers/AthenaProvider.cjs +1 -1
  519. package/dist/server/providers/AthenaProvider.cjs.map +1 -1
  520. package/dist/server/providers/AthenaProvider.d.ts +75 -0
  521. package/dist/server/providers/DatabricksProvider.cjs +1 -1
  522. package/dist/server/providers/DatabricksProvider.cjs.map +1 -1
  523. package/dist/server/providers/DatabricksProvider.d.ts +38 -0
  524. package/dist/server/providers/SnowflakeProvider.cjs +1 -1
  525. package/dist/server/providers/SnowflakeProvider.cjs.map +1 -1
  526. package/dist/server/providers/SnowflakeProvider.d.ts +36 -0
  527. package/dist/server/providers/buildProvider.d.ts +39 -0
  528. package/dist/server/providers/entries/athena.d.ts +24 -0
  529. package/dist/server/providers/entries/databricks.d.ts +25 -0
  530. package/dist/server/providers/entries/snowflake.d.ts +25 -0
  531. package/dist/server/providers/exceptions.d.ts +36 -0
  532. package/dist/server/providers/getProviderConfigurations.d.ts +45 -0
  533. package/dist/server/providers/index.d.ts +31 -0
  534. package/dist/server/providers/providerDiscovery.d.ts +81 -0
  535. package/dist/server/providers/types.d.ts +145 -0
  536. package/dist/server/search/TdpSearchManager.d.ts +40 -0
  537. package/dist/server/search/index.d.ts +5 -0
  538. package/dist/server.d.ts +17 -540
  539. package/dist/ui/accordion.cjs +2 -0
  540. package/dist/ui/accordion.cjs.map +1 -0
  541. package/dist/ui/accordion.js +83 -0
  542. package/dist/ui/accordion.js.map +1 -0
  543. package/dist/ui/alert-dialog.cjs +2 -0
  544. package/dist/ui/alert-dialog.cjs.map +1 -0
  545. package/dist/ui/alert-dialog.js +181 -0
  546. package/dist/ui/alert-dialog.js.map +1 -0
  547. package/dist/ui/alert.cjs +2 -0
  548. package/dist/ui/alert.cjs.map +1 -0
  549. package/dist/ui/alert.js +81 -0
  550. package/dist/ui/alert.js.map +1 -0
  551. package/dist/ui/aspect-ratio.cjs.map +1 -0
  552. package/dist/ui/aspect-ratio.js.map +1 -0
  553. package/dist/ui/avatar.cjs +2 -0
  554. package/dist/ui/avatar.cjs.map +1 -0
  555. package/dist/ui/avatar.js +107 -0
  556. package/dist/ui/avatar.js.map +1 -0
  557. package/dist/ui/badge.cjs +2 -0
  558. package/dist/ui/badge.cjs.map +1 -0
  559. package/dist/ui/badge.js +47 -0
  560. package/dist/ui/badge.js.map +1 -0
  561. package/dist/ui/banner.cjs +2 -0
  562. package/dist/ui/banner.cjs.map +1 -0
  563. package/dist/ui/banner.js +80 -0
  564. package/dist/ui/banner.js.map +1 -0
  565. package/dist/ui/breadcrumb.cjs +2 -0
  566. package/dist/ui/breadcrumb.cjs.map +1 -0
  567. package/dist/ui/breadcrumb.js +118 -0
  568. package/dist/ui/breadcrumb.js.map +1 -0
  569. package/dist/ui/button-group.cjs +2 -0
  570. package/dist/ui/button-group.cjs.map +1 -0
  571. package/dist/ui/button-group.js +77 -0
  572. package/dist/ui/button-group.js.map +1 -0
  573. package/dist/ui/button.cjs +2 -0
  574. package/dist/ui/button.cjs.map +1 -0
  575. package/dist/ui/button.js +57 -0
  576. package/dist/ui/button.js.map +1 -0
  577. package/dist/ui/calendar.cjs +2 -0
  578. package/dist/ui/calendar.cjs.map +1 -0
  579. package/dist/ui/calendar.js +174 -0
  580. package/dist/ui/calendar.js.map +1 -0
  581. package/dist/ui/card.cjs +2 -0
  582. package/dist/ui/card.cjs.map +1 -0
  583. package/dist/ui/card.js +102 -0
  584. package/dist/ui/card.js.map +1 -0
  585. package/dist/ui/carousel.cjs +2 -0
  586. package/dist/ui/carousel.cjs.map +1 -0
  587. package/dist/ui/carousel.js +179 -0
  588. package/dist/ui/carousel.js.map +1 -0
  589. package/dist/ui/checkbox.cjs +2 -0
  590. package/dist/ui/checkbox.cjs.map +1 -0
  591. package/dist/ui/checkbox.js +35 -0
  592. package/dist/ui/checkbox.js.map +1 -0
  593. package/dist/ui/code-block.cjs +4 -0
  594. package/dist/ui/code-block.cjs.map +1 -0
  595. package/dist/ui/code-block.js +324 -0
  596. package/dist/ui/code-block.js.map +1 -0
  597. package/dist/ui/code-editor.cjs +2 -0
  598. package/dist/ui/code-editor.cjs.map +1 -0
  599. package/dist/ui/code-editor.js +106 -0
  600. package/dist/ui/code-editor.js.map +1 -0
  601. package/dist/ui/collapsible.cjs.map +1 -0
  602. package/dist/ui/collapsible.js.map +1 -0
  603. package/dist/ui/combobox.cjs +2 -0
  604. package/dist/ui/combobox.cjs.map +1 -0
  605. package/dist/ui/combobox.js +285 -0
  606. package/dist/ui/combobox.js.map +1 -0
  607. package/dist/ui/command.cjs +2 -0
  608. package/dist/ui/command.cjs.map +1 -0
  609. package/dist/ui/command.js +178 -0
  610. package/dist/ui/command.js.map +1 -0
  611. package/dist/ui/context-menu.cjs +2 -0
  612. package/dist/ui/context-menu.cjs.map +1 -0
  613. package/dist/ui/context-menu.js +236 -0
  614. package/dist/ui/context-menu.js.map +1 -0
  615. package/dist/ui/data-table.cjs +2 -0
  616. package/dist/ui/data-table.cjs.map +1 -0
  617. package/dist/ui/data-table.js +16 -0
  618. package/dist/ui/data-table.js.map +1 -0
  619. package/dist/ui/dialog.cjs +2 -0
  620. package/dist/ui/dialog.cjs.map +1 -0
  621. package/dist/ui/dialog.js +165 -0
  622. package/dist/ui/dialog.js.map +1 -0
  623. package/dist/ui/dropdown-menu.cjs +2 -0
  624. package/dist/ui/dropdown-menu.cjs.map +1 -0
  625. package/dist/ui/dropdown-menu.js +260 -0
  626. package/dist/ui/dropdown-menu.js.map +1 -0
  627. package/dist/ui/field.cjs +2 -0
  628. package/dist/ui/field.cjs.map +1 -0
  629. package/dist/ui/field.js +210 -0
  630. package/dist/ui/field.js.map +1 -0
  631. package/dist/ui/hover-card.cjs +2 -0
  632. package/dist/ui/hover-card.cjs.map +1 -0
  633. package/dist/ui/hover-card.js +39 -0
  634. package/dist/ui/hover-card.js.map +1 -0
  635. package/dist/ui/input-group.cjs +2 -0
  636. package/dist/ui/input-group.cjs.map +1 -0
  637. package/dist/ui/input-group.js +145 -0
  638. package/dist/ui/input-group.js.map +1 -0
  639. package/dist/ui/input.cjs +2 -0
  640. package/dist/ui/input.cjs.map +1 -0
  641. package/dist/ui/input.js +20 -0
  642. package/dist/ui/input.js.map +1 -0
  643. package/dist/ui/item.cjs +2 -0
  644. package/dist/ui/item.cjs.map +1 -0
  645. package/dist/ui/item.js +199 -0
  646. package/dist/ui/item.js.map +1 -0
  647. package/dist/ui/kbd.cjs +2 -0
  648. package/dist/ui/kbd.cjs.map +1 -0
  649. package/dist/ui/kbd.js +30 -0
  650. package/dist/ui/kbd.js.map +1 -0
  651. package/dist/ui/label.cjs +2 -0
  652. package/dist/ui/label.cjs.map +1 -0
  653. package/dist/ui/label.js +23 -0
  654. package/dist/ui/label.js.map +1 -0
  655. package/dist/ui/menubar.cjs +2 -0
  656. package/dist/ui/menubar.cjs.map +1 -0
  657. package/dist/ui/menubar.js +256 -0
  658. package/dist/ui/menubar.js.map +1 -0
  659. package/dist/ui/navigation-menu.cjs +2 -0
  660. package/dist/ui/navigation-menu.cjs.map +1 -0
  661. package/dist/ui/navigation-menu.js +164 -0
  662. package/dist/ui/navigation-menu.js.map +1 -0
  663. package/dist/ui/popover.cjs +2 -0
  664. package/dist/ui/popover.cjs.map +1 -0
  665. package/dist/ui/popover.js +45 -0
  666. package/dist/ui/popover.js.map +1 -0
  667. package/dist/ui/radio-group.cjs +2 -0
  668. package/dist/ui/radio-group.cjs.map +1 -0
  669. package/dist/ui/radio-group.js +45 -0
  670. package/dist/ui/radio-group.js.map +1 -0
  671. package/dist/ui/resizable.cjs +2 -0
  672. package/dist/ui/resizable.cjs.map +1 -0
  673. package/dist/ui/resizable.js +58 -0
  674. package/dist/ui/resizable.js.map +1 -0
  675. package/dist/ui/scroll-area.cjs +2 -0
  676. package/dist/ui/scroll-area.cjs.map +1 -0
  677. package/dist/ui/scroll-area.js +61 -0
  678. package/dist/ui/scroll-area.js.map +1 -0
  679. package/dist/ui/select.cjs +2 -0
  680. package/dist/ui/select.cjs.map +1 -0
  681. package/dist/ui/select.js +184 -0
  682. package/dist/ui/select.js.map +1 -0
  683. package/dist/ui/separator.cjs +2 -0
  684. package/dist/ui/separator.cjs.map +1 -0
  685. package/dist/ui/separator.js +27 -0
  686. package/dist/ui/separator.js.map +1 -0
  687. package/dist/ui/sheet.cjs +2 -0
  688. package/dist/ui/sheet.cjs.map +1 -0
  689. package/dist/ui/sheet.js +137 -0
  690. package/dist/ui/sheet.js.map +1 -0
  691. package/dist/ui/sidebar.cjs +2 -0
  692. package/dist/ui/sidebar.cjs.map +1 -0
  693. package/dist/ui/sidebar.js +579 -0
  694. package/dist/ui/sidebar.js.map +1 -0
  695. package/dist/ui/skeleton.cjs +2 -0
  696. package/dist/ui/skeleton.cjs.map +1 -0
  697. package/dist/ui/skeleton.js +24 -0
  698. package/dist/ui/skeleton.js.map +1 -0
  699. package/dist/ui/slider.cjs +2 -0
  700. package/dist/ui/slider.cjs.map +1 -0
  701. package/dist/ui/slider.js +61 -0
  702. package/dist/ui/slider.js.map +1 -0
  703. package/dist/ui/sonner.cjs +2 -0
  704. package/dist/ui/sonner.cjs.map +1 -0
  705. package/dist/ui/sonner.js +52 -0
  706. package/dist/ui/sonner.js.map +1 -0
  707. package/dist/ui/spinner.cjs +2 -0
  708. package/dist/ui/spinner.cjs.map +1 -0
  709. package/dist/ui/spinner.js +39 -0
  710. package/dist/ui/spinner.js.map +1 -0
  711. package/dist/ui/switch.cjs +2 -0
  712. package/dist/ui/switch.cjs.map +1 -0
  713. package/dist/ui/switch.js +32 -0
  714. package/dist/ui/switch.js.map +1 -0
  715. package/dist/ui/table.cjs +2 -0
  716. package/dist/ui/table.cjs.map +1 -0
  717. package/dist/ui/table.js +153 -0
  718. package/dist/ui/table.js.map +1 -0
  719. package/dist/ui/tabs.cjs +2 -0
  720. package/dist/ui/tabs.cjs.map +1 -0
  721. package/dist/ui/tabs.js +92 -0
  722. package/dist/ui/tabs.js.map +1 -0
  723. package/dist/ui/tetra-molecule-icon.cjs +2 -0
  724. package/dist/ui/tetra-molecule-icon.cjs.map +1 -0
  725. package/dist/ui/tetra-molecule-icon.js +50 -0
  726. package/dist/ui/tetra-molecule-icon.js.map +1 -0
  727. package/dist/ui/tetrascience-icon.cjs +2 -0
  728. package/dist/ui/tetrascience-icon.cjs.map +1 -0
  729. package/dist/ui/tetrascience-icon.js +47 -0
  730. package/dist/ui/tetrascience-icon.js.map +1 -0
  731. package/dist/ui/textarea.cjs +2 -0
  732. package/dist/ui/textarea.cjs.map +1 -0
  733. package/dist/ui/textarea.js +19 -0
  734. package/dist/ui/textarea.js.map +1 -0
  735. package/dist/ui/toggle-group.cjs +2 -0
  736. package/dist/ui/toggle-group.cjs.map +1 -0
  737. package/dist/ui/toggle-group.js +81 -0
  738. package/dist/ui/toggle-group.js.map +1 -0
  739. package/dist/ui/toggle.cjs +2 -0
  740. package/dist/ui/toggle.cjs.map +1 -0
  741. package/dist/ui/toggle.js +44 -0
  742. package/dist/ui/toggle.js.map +1 -0
  743. package/dist/ui/tooltip.cjs +2 -0
  744. package/dist/ui/tooltip.cjs.map +1 -0
  745. package/dist/ui/tooltip.js +56 -0
  746. package/dist/ui/tooltip.js.map +1 -0
  747. package/dist/utils/colors.d.ts +50 -0
  748. package/package.json +113 -10
  749. package/dist/athena.d.ts +0 -167
  750. package/dist/components/ai/attachments.cjs +0 -2
  751. package/dist/components/ai/attachments.cjs.map +0 -1
  752. package/dist/components/ai/attachments.js +0 -224
  753. package/dist/components/ai/attachments.js.map +0 -1
  754. package/dist/components/ai/chain-of-thought.cjs +0 -2
  755. package/dist/components/ai/chain-of-thought.cjs.map +0 -1
  756. package/dist/components/ai/chain-of-thought.js +0 -145
  757. package/dist/components/ai/chain-of-thought.js.map +0 -1
  758. package/dist/components/ai/confirmation.cjs +0 -2
  759. package/dist/components/ai/confirmation.cjs.map +0 -1
  760. package/dist/components/ai/confirmation.js +0 -109
  761. package/dist/components/ai/confirmation.js.map +0 -1
  762. package/dist/components/ai/context.cjs +0 -2
  763. package/dist/components/ai/context.cjs.map +0 -1
  764. package/dist/components/ai/context.js +0 -267
  765. package/dist/components/ai/context.js.map +0 -1
  766. package/dist/components/ai/conversation.cjs +0 -4
  767. package/dist/components/ai/conversation.cjs.map +0 -1
  768. package/dist/components/ai/conversation.js +0 -108
  769. package/dist/components/ai/conversation.js.map +0 -1
  770. package/dist/components/ai/inline-citation.cjs +0 -2
  771. package/dist/components/ai/inline-citation.cjs.map +0 -1
  772. package/dist/components/ai/inline-citation.js +0 -182
  773. package/dist/components/ai/inline-citation.js.map +0 -1
  774. package/dist/components/ai/message.cjs +0 -2
  775. package/dist/components/ai/message.cjs.map +0 -1
  776. package/dist/components/ai/message.js +0 -237
  777. package/dist/components/ai/message.js.map +0 -1
  778. package/dist/components/ai/model-selector.cjs +0 -2
  779. package/dist/components/ai/model-selector.cjs.map +0 -1
  780. package/dist/components/ai/model-selector.js +0 -77
  781. package/dist/components/ai/model-selector.js.map +0 -1
  782. package/dist/components/ai/prompt-input.cjs +0 -2
  783. package/dist/components/ai/prompt-input.cjs.map +0 -1
  784. package/dist/components/ai/prompt-input.js +0 -776
  785. package/dist/components/ai/prompt-input.js.map +0 -1
  786. package/dist/components/ai/queue.cjs +0 -2
  787. package/dist/components/ai/queue.cjs.map +0 -1
  788. package/dist/components/ai/queue.js +0 -209
  789. package/dist/components/ai/queue.js.map +0 -1
  790. package/dist/components/ai/reasoning.cjs +0 -2
  791. package/dist/components/ai/reasoning.cjs.map +0 -1
  792. package/dist/components/ai/reasoning.js +0 -129
  793. package/dist/components/ai/reasoning.js.map +0 -1
  794. package/dist/components/ai/shimmer.cjs +0 -2
  795. package/dist/components/ai/shimmer.cjs.map +0 -1
  796. package/dist/components/ai/shimmer.js +0 -49
  797. package/dist/components/ai/shimmer.js.map +0 -1
  798. package/dist/components/ai/sources.cjs +0 -2
  799. package/dist/components/ai/sources.cjs.map +0 -1
  800. package/dist/components/ai/sources.js +0 -54
  801. package/dist/components/ai/sources.js.map +0 -1
  802. package/dist/components/ai/speech-input.cjs +0 -2
  803. package/dist/components/ai/speech-input.cjs.map +0 -1
  804. package/dist/components/ai/speech-input.js +0 -123
  805. package/dist/components/ai/speech-input.js.map +0 -1
  806. package/dist/components/ai/stream-status.cjs +0 -2
  807. package/dist/components/ai/stream-status.cjs.map +0 -1
  808. package/dist/components/ai/stream-status.js +0 -108
  809. package/dist/components/ai/stream-status.js.map +0 -1
  810. package/dist/components/ai/suggestion.cjs +0 -2
  811. package/dist/components/ai/suggestion.cjs.map +0 -1
  812. package/dist/components/ai/suggestion.js +0 -38
  813. package/dist/components/ai/suggestion.js.map +0 -1
  814. package/dist/components/ai/task.cjs +0 -2
  815. package/dist/components/ai/task.cjs.map +0 -1
  816. package/dist/components/ai/task.js +0 -101
  817. package/dist/components/ai/task.js.map +0 -1
  818. package/dist/components/ai/tool.cjs +0 -2
  819. package/dist/components/ai/tool.cjs.map +0 -1
  820. package/dist/components/ai/tool.js +0 -139
  821. package/dist/components/ai/tool.js.map +0 -1
  822. package/dist/components/composed/tdp-link.cjs +0 -2
  823. package/dist/components/composed/tdp-link.cjs.map +0 -1
  824. package/dist/components/composed/tdp-link.js.map +0 -1
  825. package/dist/components/composed/tdp-url.cjs.map +0 -1
  826. package/dist/components/composed/tdp-url.js.map +0 -1
  827. package/dist/components/ui/accordion.cjs +0 -2
  828. package/dist/components/ui/accordion.cjs.map +0 -1
  829. package/dist/components/ui/accordion.js +0 -83
  830. package/dist/components/ui/accordion.js.map +0 -1
  831. package/dist/components/ui/alert-dialog.cjs +0 -2
  832. package/dist/components/ui/alert-dialog.cjs.map +0 -1
  833. package/dist/components/ui/alert-dialog.js +0 -181
  834. package/dist/components/ui/alert-dialog.js.map +0 -1
  835. package/dist/components/ui/alert.cjs +0 -2
  836. package/dist/components/ui/alert.cjs.map +0 -1
  837. package/dist/components/ui/alert.js +0 -81
  838. package/dist/components/ui/alert.js.map +0 -1
  839. package/dist/components/ui/aspect-ratio.cjs.map +0 -1
  840. package/dist/components/ui/aspect-ratio.js.map +0 -1
  841. package/dist/components/ui/avatar.cjs +0 -2
  842. package/dist/components/ui/avatar.cjs.map +0 -1
  843. package/dist/components/ui/avatar.js +0 -107
  844. package/dist/components/ui/avatar.js.map +0 -1
  845. package/dist/components/ui/badge.cjs +0 -2
  846. package/dist/components/ui/badge.cjs.map +0 -1
  847. package/dist/components/ui/badge.js +0 -47
  848. package/dist/components/ui/badge.js.map +0 -1
  849. package/dist/components/ui/banner.cjs +0 -2
  850. package/dist/components/ui/banner.cjs.map +0 -1
  851. package/dist/components/ui/banner.js +0 -80
  852. package/dist/components/ui/banner.js.map +0 -1
  853. package/dist/components/ui/breadcrumb.cjs +0 -2
  854. package/dist/components/ui/breadcrumb.cjs.map +0 -1
  855. package/dist/components/ui/breadcrumb.js +0 -118
  856. package/dist/components/ui/breadcrumb.js.map +0 -1
  857. package/dist/components/ui/button-group.cjs +0 -2
  858. package/dist/components/ui/button-group.cjs.map +0 -1
  859. package/dist/components/ui/button-group.js +0 -77
  860. package/dist/components/ui/button-group.js.map +0 -1
  861. package/dist/components/ui/button.cjs +0 -2
  862. package/dist/components/ui/button.cjs.map +0 -1
  863. package/dist/components/ui/button.js +0 -57
  864. package/dist/components/ui/button.js.map +0 -1
  865. package/dist/components/ui/calendar.cjs +0 -2
  866. package/dist/components/ui/calendar.cjs.map +0 -1
  867. package/dist/components/ui/calendar.js +0 -174
  868. package/dist/components/ui/calendar.js.map +0 -1
  869. package/dist/components/ui/card.cjs +0 -2
  870. package/dist/components/ui/card.cjs.map +0 -1
  871. package/dist/components/ui/card.js +0 -102
  872. package/dist/components/ui/card.js.map +0 -1
  873. package/dist/components/ui/carousel.cjs +0 -2
  874. package/dist/components/ui/carousel.cjs.map +0 -1
  875. package/dist/components/ui/carousel.js +0 -179
  876. package/dist/components/ui/carousel.js.map +0 -1
  877. package/dist/components/ui/checkbox.cjs +0 -2
  878. package/dist/components/ui/checkbox.cjs.map +0 -1
  879. package/dist/components/ui/checkbox.js +0 -35
  880. package/dist/components/ui/checkbox.js.map +0 -1
  881. package/dist/components/ui/code-block.cjs +0 -4
  882. package/dist/components/ui/code-block.cjs.map +0 -1
  883. package/dist/components/ui/code-block.js +0 -324
  884. package/dist/components/ui/code-block.js.map +0 -1
  885. package/dist/components/ui/code-editor.cjs +0 -2
  886. package/dist/components/ui/code-editor.cjs.map +0 -1
  887. package/dist/components/ui/code-editor.js +0 -105
  888. package/dist/components/ui/code-editor.js.map +0 -1
  889. package/dist/components/ui/collapsible.cjs.map +0 -1
  890. package/dist/components/ui/collapsible.js.map +0 -1
  891. package/dist/components/ui/combobox.cjs +0 -2
  892. package/dist/components/ui/combobox.cjs.map +0 -1
  893. package/dist/components/ui/combobox.js +0 -285
  894. package/dist/components/ui/combobox.js.map +0 -1
  895. package/dist/components/ui/command.cjs +0 -2
  896. package/dist/components/ui/command.cjs.map +0 -1
  897. package/dist/components/ui/command.js +0 -178
  898. package/dist/components/ui/command.js.map +0 -1
  899. package/dist/components/ui/context-menu.cjs +0 -2
  900. package/dist/components/ui/context-menu.cjs.map +0 -1
  901. package/dist/components/ui/context-menu.js +0 -236
  902. package/dist/components/ui/context-menu.js.map +0 -1
  903. package/dist/components/ui/dialog.cjs +0 -2
  904. package/dist/components/ui/dialog.cjs.map +0 -1
  905. package/dist/components/ui/dialog.js +0 -165
  906. package/dist/components/ui/dialog.js.map +0 -1
  907. package/dist/components/ui/dropdown-menu.cjs +0 -2
  908. package/dist/components/ui/dropdown-menu.cjs.map +0 -1
  909. package/dist/components/ui/dropdown-menu.js +0 -260
  910. package/dist/components/ui/dropdown-menu.js.map +0 -1
  911. package/dist/components/ui/field.cjs +0 -2
  912. package/dist/components/ui/field.cjs.map +0 -1
  913. package/dist/components/ui/field.js +0 -210
  914. package/dist/components/ui/field.js.map +0 -1
  915. package/dist/components/ui/hover-card.cjs +0 -2
  916. package/dist/components/ui/hover-card.cjs.map +0 -1
  917. package/dist/components/ui/hover-card.js +0 -39
  918. package/dist/components/ui/hover-card.js.map +0 -1
  919. package/dist/components/ui/input-group.cjs +0 -2
  920. package/dist/components/ui/input-group.cjs.map +0 -1
  921. package/dist/components/ui/input-group.js +0 -145
  922. package/dist/components/ui/input-group.js.map +0 -1
  923. package/dist/components/ui/input.cjs +0 -2
  924. package/dist/components/ui/input.cjs.map +0 -1
  925. package/dist/components/ui/input.js +0 -20
  926. package/dist/components/ui/input.js.map +0 -1
  927. package/dist/components/ui/item.cjs +0 -2
  928. package/dist/components/ui/item.cjs.map +0 -1
  929. package/dist/components/ui/item.js +0 -199
  930. package/dist/components/ui/item.js.map +0 -1
  931. package/dist/components/ui/kbd.cjs +0 -2
  932. package/dist/components/ui/kbd.cjs.map +0 -1
  933. package/dist/components/ui/kbd.js +0 -30
  934. package/dist/components/ui/kbd.js.map +0 -1
  935. package/dist/components/ui/label.cjs +0 -2
  936. package/dist/components/ui/label.cjs.map +0 -1
  937. package/dist/components/ui/label.js +0 -23
  938. package/dist/components/ui/label.js.map +0 -1
  939. package/dist/components/ui/menubar.cjs +0 -2
  940. package/dist/components/ui/menubar.cjs.map +0 -1
  941. package/dist/components/ui/menubar.js +0 -256
  942. package/dist/components/ui/menubar.js.map +0 -1
  943. package/dist/components/ui/navigation-menu.cjs +0 -2
  944. package/dist/components/ui/navigation-menu.cjs.map +0 -1
  945. package/dist/components/ui/navigation-menu.js +0 -164
  946. package/dist/components/ui/navigation-menu.js.map +0 -1
  947. package/dist/components/ui/popover.cjs +0 -2
  948. package/dist/components/ui/popover.cjs.map +0 -1
  949. package/dist/components/ui/popover.js +0 -45
  950. package/dist/components/ui/popover.js.map +0 -1
  951. package/dist/components/ui/radio-group.cjs +0 -2
  952. package/dist/components/ui/radio-group.cjs.map +0 -1
  953. package/dist/components/ui/radio-group.js +0 -45
  954. package/dist/components/ui/radio-group.js.map +0 -1
  955. package/dist/components/ui/resizable.cjs +0 -2
  956. package/dist/components/ui/resizable.cjs.map +0 -1
  957. package/dist/components/ui/resizable.js +0 -58
  958. package/dist/components/ui/resizable.js.map +0 -1
  959. package/dist/components/ui/scroll-area.cjs +0 -2
  960. package/dist/components/ui/scroll-area.cjs.map +0 -1
  961. package/dist/components/ui/scroll-area.js +0 -61
  962. package/dist/components/ui/scroll-area.js.map +0 -1
  963. package/dist/components/ui/select.cjs +0 -2
  964. package/dist/components/ui/select.cjs.map +0 -1
  965. package/dist/components/ui/select.js +0 -184
  966. package/dist/components/ui/select.js.map +0 -1
  967. package/dist/components/ui/separator.cjs +0 -2
  968. package/dist/components/ui/separator.cjs.map +0 -1
  969. package/dist/components/ui/separator.js +0 -27
  970. package/dist/components/ui/separator.js.map +0 -1
  971. package/dist/components/ui/sheet.cjs +0 -2
  972. package/dist/components/ui/sheet.cjs.map +0 -1
  973. package/dist/components/ui/sheet.js +0 -137
  974. package/dist/components/ui/sheet.js.map +0 -1
  975. package/dist/components/ui/sidebar.cjs +0 -2
  976. package/dist/components/ui/sidebar.cjs.map +0 -1
  977. package/dist/components/ui/sidebar.js +0 -579
  978. package/dist/components/ui/sidebar.js.map +0 -1
  979. package/dist/components/ui/skeleton.cjs +0 -2
  980. package/dist/components/ui/skeleton.cjs.map +0 -1
  981. package/dist/components/ui/skeleton.js +0 -24
  982. package/dist/components/ui/skeleton.js.map +0 -1
  983. package/dist/components/ui/slider.cjs +0 -2
  984. package/dist/components/ui/slider.cjs.map +0 -1
  985. package/dist/components/ui/slider.js +0 -61
  986. package/dist/components/ui/slider.js.map +0 -1
  987. package/dist/components/ui/sonner.cjs +0 -2
  988. package/dist/components/ui/sonner.cjs.map +0 -1
  989. package/dist/components/ui/sonner.js +0 -52
  990. package/dist/components/ui/sonner.js.map +0 -1
  991. package/dist/components/ui/spinner.cjs +0 -2
  992. package/dist/components/ui/spinner.cjs.map +0 -1
  993. package/dist/components/ui/spinner.js +0 -39
  994. package/dist/components/ui/spinner.js.map +0 -1
  995. package/dist/components/ui/switch.cjs +0 -2
  996. package/dist/components/ui/switch.cjs.map +0 -1
  997. package/dist/components/ui/switch.js +0 -32
  998. package/dist/components/ui/switch.js.map +0 -1
  999. package/dist/components/ui/table.cjs +0 -2
  1000. package/dist/components/ui/table.cjs.map +0 -1
  1001. package/dist/components/ui/table.js +0 -153
  1002. package/dist/components/ui/table.js.map +0 -1
  1003. package/dist/components/ui/tabs.cjs +0 -2
  1004. package/dist/components/ui/tabs.cjs.map +0 -1
  1005. package/dist/components/ui/tabs.js +0 -92
  1006. package/dist/components/ui/tabs.js.map +0 -1
  1007. package/dist/components/ui/tetra-molecule-icon.cjs +0 -2
  1008. package/dist/components/ui/tetra-molecule-icon.cjs.map +0 -1
  1009. package/dist/components/ui/tetra-molecule-icon.js +0 -49
  1010. package/dist/components/ui/tetra-molecule-icon.js.map +0 -1
  1011. package/dist/components/ui/tetrascience-icon.cjs +0 -2
  1012. package/dist/components/ui/tetrascience-icon.cjs.map +0 -1
  1013. package/dist/components/ui/tetrascience-icon.js +0 -46
  1014. package/dist/components/ui/tetrascience-icon.js.map +0 -1
  1015. package/dist/components/ui/textarea.cjs +0 -2
  1016. package/dist/components/ui/textarea.cjs.map +0 -1
  1017. package/dist/components/ui/textarea.js +0 -19
  1018. package/dist/components/ui/textarea.js.map +0 -1
  1019. package/dist/components/ui/toggle-group.cjs +0 -2
  1020. package/dist/components/ui/toggle-group.cjs.map +0 -1
  1021. package/dist/components/ui/toggle-group.js +0 -81
  1022. package/dist/components/ui/toggle-group.js.map +0 -1
  1023. package/dist/components/ui/toggle.cjs +0 -2
  1024. package/dist/components/ui/toggle.cjs.map +0 -1
  1025. package/dist/components/ui/toggle.js +0 -44
  1026. package/dist/components/ui/toggle.js.map +0 -1
  1027. package/dist/components/ui/tooltip.cjs +0 -2
  1028. package/dist/components/ui/tooltip.cjs.map +0 -1
  1029. package/dist/components/ui/tooltip.js +0 -56
  1030. package/dist/components/ui/tooltip.js.map +0 -1
  1031. package/dist/databricks.d.ts +0 -129
  1032. package/dist/providers/athena.d.ts +0 -9
  1033. package/dist/providers/databricks.d.ts +0 -9
  1034. package/dist/providers/snowflake.d.ts +0 -9
  1035. package/dist/snowflake.d.ts +0 -125
  1036. /package/dist/{components/composed → composed}/tdp-link.js +0 -0
  1037. /package/dist/{components/composed → composed}/tdp-url.cjs +0 -0
  1038. /package/dist/{components/composed → composed}/tdp-url.js +0 -0
  1039. /package/dist/{components/ui → ui}/aspect-ratio.cjs +0 -0
  1040. /package/dist/{components/ui → ui}/aspect-ratio.js +0 -0
  1041. /package/dist/{components/ui → ui}/collapsible.cjs +0 -0
  1042. /package/dist/{components/ui → ui}/collapsible.js +0 -0
@@ -0,0 +1,12 @@
1
+ export interface PlateZoomControlProps {
2
+ zoom: number;
3
+ onZoomChange: (next: number) => void;
4
+ /** Increment per click. Defaults to 0.1. */
5
+ step?: number;
6
+ min?: number;
7
+ max?: number;
8
+ /** Render a percentage readout between the buttons. Defaults to true. */
9
+ showReadout?: boolean;
10
+ className?: string;
11
+ }
12
+ export declare function PlateZoomControl({ zoom, onZoomChange, step, min, max, showReadout, className, }: PlateZoomControlProps): import("react/jsx-runtime").JSX.Element;
@@ -1,7 +1,7 @@
1
1
  import { jsxs as l, jsx as n } from "react/jsx-runtime";
2
2
  import { ZoomOut as d, ZoomIn as p } from "lucide-react";
3
- import { Button as u } from "../../ui/button.js";
4
- import { ButtonGroup as h, ButtonGroupText as b } from "../../ui/button-group.js";
3
+ import { Button as u } from "../../../ui/button.js";
4
+ import { ButtonGroup as h, ButtonGroupText as b } from "../../../ui/button-group.js";
5
5
  import { cn as f } from "../../../lib/utils.js";
6
6
  const x = 2;
7
7
  function Z(t, r, o) {
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),j=require("lucide-react"),O=require("react"),q=require("./csvPlateTriage.cjs"),P=require("./helpers.cjs"),m=require("../../ui/button.cjs"),k=require("../../ui/label.cjs"),s=require("../../ui/select.cjs"),f=require("../../ui/separator.cjs"),y=require("../../../lib/utils.cjs");function w(t){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const l in t)if(l!=="default"){const i=Object.getOwnPropertyDescriptor(t,l);Object.defineProperty(a,l,i.get?i:{enumerable:!0,get:()=>t[l]})}}return a.default=t,Object.freeze(a)}const g=w(O);function h({label:t,accept:a,onPick:l,disabled:i,triageCsv:o}){const r=g.useRef(null);return e.jsxs(e.Fragment,{children:[e.jsxs(m.Button,{type:"button",variant:"outline",size:"sm",disabled:i,onClick:()=>r.current?.click(),children:[e.jsx(j.Upload,{"aria-hidden":!0})," ",t]}),e.jsx("input",{ref:r,type:"file",accept:a,hidden:!0,onChange:c=>{const u=c.currentTarget,n=c.target.files?.[0];if(!n){u.value="";return}(async()=>{const x=o?await q.triagePlateMapCsvFile(n):void 0;await(x?l(n,x):l(n)),u.value=""})()}})]})}function z({templates:t,templateId:a,onTemplateChange:l,onClearTemplate:i,hasEntries:o,onImportCsv:r,onExportCsv:c,onImportTemplate:u,onExportTemplate:n,className:x,csvAccept:v=".csv,text/csv",templateAccept:b="application/json"}){const S=g.useMemo(()=>P.groupTemplateOptions(t),[t]);return e.jsxs("div",{"data-slot":"template-io-panel",className:y.cn("flex flex-col gap-3",x),children:[e.jsx("div",{className:"text-sm font-medium",children:"Template & import / export"}),t&&l?e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(k.Label,{htmlFor:"plate-template",children:"Template"}),e.jsxs(s.Select,{value:a??"",onValueChange:d=>l(d),children:[e.jsx(s.SelectTrigger,{id:"plate-template",size:"sm",className:"w-full",children:e.jsx(s.SelectValue,{placeholder:"Select template…"})}),e.jsx(s.SelectContent,{children:S.map(([d,N])=>e.jsxs(s.SelectGroup,{children:[d?e.jsx(s.SelectLabel,{children:d}):null,N.map(p=>e.jsx(s.SelectItem,{value:p.id,children:p.label},p.id))]},d||"_"))})]}),i?e.jsx(m.Button,{variant:"outline",size:"sm",onClick:i,disabled:!a&&!o,children:"Clear template"}):null]}):null,u||n?e.jsxs(e.Fragment,{children:[e.jsx(f.Separator,{}),e.jsx("div",{className:"text-xs font-medium text-muted-foreground",children:"Template"}),e.jsxs("div",{className:"flex flex-col gap-2",children:[u?e.jsx(h,{label:"Import template (JSON)",accept:b,onPick:u}):null,n?e.jsxs(m.Button,{variant:"outline",size:"sm",disabled:!o,onClick:n,children:[e.jsx(j.Download,{"aria-hidden":!0})," Export template (JSON)"]}):null]})]}):null,r||c?e.jsxs(e.Fragment,{children:[e.jsx(f.Separator,{}),e.jsx("div",{className:"text-xs font-medium text-muted-foreground",children:"Plate map"}),e.jsxs("div",{className:"flex flex-col gap-2",children:[r?e.jsx(h,{label:"Import plate map (CSV)",accept:v,onPick:r,triageCsv:!0}):null,c?e.jsxs(m.Button,{variant:"outline",size:"sm",disabled:!o,onClick:c,children:[e.jsx(j.Download,{"aria-hidden":!0})," Export plate map (CSV)"]}):null]})]}):null]})}exports.TemplateIOPanel=z;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),j=require("lucide-react"),O=require("react"),q=require("./csvPlateTriage.cjs"),P=require("./helpers.cjs"),m=require("../../../ui/button.cjs"),k=require("../../../ui/label.cjs"),s=require("../../../ui/select.cjs"),f=require("../../../ui/separator.cjs"),y=require("../../../lib/utils.cjs");function _(t){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const l in t)if(l!=="default"){const n=Object.getOwnPropertyDescriptor(t,l);Object.defineProperty(a,l,n.get?n:{enumerable:!0,get:()=>t[l]})}}return a.default=t,Object.freeze(a)}const g=_(O);function h({label:t,accept:a,onPick:l,disabled:n,triageCsv:o}){const r=g.useRef(null);return e.jsxs(e.Fragment,{children:[e.jsxs(m.Button,{type:"button",variant:"outline",size:"sm",disabled:n,onClick:()=>r.current?.click(),children:[e.jsx(j.Upload,{"aria-hidden":!0})," ",t]}),e.jsx("input",{ref:r,type:"file",accept:a,hidden:!0,onChange:c=>{const u=c.currentTarget,i=c.target.files?.[0];if(!i){u.value="";return}(async()=>{const x=o?await q.triagePlateMapCsvFile(i):void 0;await(x?l(i,x):l(i)),u.value=""})()}})]})}function w({templates:t,templateId:a,onTemplateChange:l,onClearTemplate:n,hasEntries:o,onImportCsv:r,onExportCsv:c,onImportTemplate:u,onExportTemplate:i,className:x,csvAccept:v=".csv,text/csv",templateAccept:b="application/json"}){const S=g.useMemo(()=>P.groupTemplateOptions(t),[t]);return e.jsxs("div",{"data-slot":"template-io-panel",className:y.cn("flex flex-col gap-3",x),children:[e.jsx("div",{className:"text-sm font-medium",children:"Template & import / export"}),t&&l?e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(k.Label,{htmlFor:"plate-template",children:"Template"}),e.jsxs(s.Select,{value:a??"",onValueChange:d=>l(d),children:[e.jsx(s.SelectTrigger,{id:"plate-template",size:"sm",className:"w-full",children:e.jsx(s.SelectValue,{placeholder:"Select template…"})}),e.jsx(s.SelectContent,{children:S.map(([d,N])=>e.jsxs(s.SelectGroup,{children:[d?e.jsx(s.SelectLabel,{children:d}):null,N.map(p=>e.jsx(s.SelectItem,{value:p.id,children:p.label},p.id))]},d||"_"))})]}),n?e.jsx(m.Button,{variant:"outline",size:"sm",onClick:n,disabled:!a&&!o,children:"Clear template"}):null]}):null,u||i?e.jsxs(e.Fragment,{children:[e.jsx(f.Separator,{}),e.jsx("div",{className:"text-xs font-medium text-muted-foreground",children:"Template"}),e.jsxs("div",{className:"flex flex-col gap-2",children:[u?e.jsx(h,{label:"Import template (JSON)",accept:b,onPick:u}):null,i?e.jsxs(m.Button,{variant:"outline",size:"sm",disabled:!o,onClick:i,children:[e.jsx(j.Download,{"aria-hidden":!0})," Export template (JSON)"]}):null]})]}):null,r||c?e.jsxs(e.Fragment,{children:[e.jsx(f.Separator,{}),e.jsx("div",{className:"text-xs font-medium text-muted-foreground",children:"Plate map"}),e.jsxs("div",{className:"flex flex-col gap-2",children:[r?e.jsx(h,{label:"Import plate map (CSV)",accept:v,onPick:r,triageCsv:!0}):null,c?e.jsxs(m.Button,{variant:"outline",size:"sm",disabled:!o,onClick:c,children:[e.jsx(j.Download,{"aria-hidden":!0})," Export plate map (CSV)"]}):null]})]}):null]})}exports.TemplateIOPanel=w;
2
2
  //# sourceMappingURL=TemplateIOPanel.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateIOPanel.cjs","sources":["../../../../src/components/composed/PlateMapEditor/TemplateIOPanel.tsx"],"sourcesContent":["import { Download, Upload } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { triagePlateMapCsvFile } from \"./csvPlateTriage\";\nimport { groupTemplateOptions } from \"./helpers\";\n\nimport type { ImportExportHandlers, PlateMapCsvTriage, TemplateOption } from \"./types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface TemplateIOPanelProps extends ImportExportHandlers {\n templates?: TemplateOption[];\n templateId?: string;\n onTemplateChange?: (id: string) => void;\n onClearTemplate?: () => void;\n /** Disable export buttons when there's nothing to export. */\n hasEntries?: boolean;\n className?: string;\n csvAccept?: string;\n templateAccept?: string;\n}\n\ninterface FilePickerButtonProps {\n label: string;\n accept: string;\n onPick: (file: File, triage?: PlateMapCsvTriage) => void | Promise<void>;\n disabled?: boolean;\n triageCsv?: boolean;\n}\n\nfunction FilePickerButton({ label, accept, onPick, disabled, triageCsv }: FilePickerButtonProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n return (\n <>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={disabled} onClick={() => inputRef.current?.click()}>\n <Upload aria-hidden /> {label}\n </Button>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n hidden\n onChange={(e) => {\n const input = e.currentTarget;\n const f = e.target.files?.[0];\n if (!f) {\n input.value = \"\";\n return;\n }\n\n void (async () => {\n const triage = triageCsv ? await triagePlateMapCsvFile(f) : undefined;\n await (triage ? onPick(f, triage) : onPick(f));\n input.value = \"\";\n })();\n }}\n />\n </>\n );\n}\n\nexport function TemplateIOPanel({\n templates,\n templateId,\n onTemplateChange,\n onClearTemplate,\n hasEntries,\n onImportCsv,\n onExportCsv,\n onImportTemplate,\n onExportTemplate,\n className,\n csvAccept = \".csv,text/csv\",\n templateAccept = \"application/json\",\n}: TemplateIOPanelProps) {\n const groups = React.useMemo(() => groupTemplateOptions(templates), [templates]);\n\n return (\n <div data-slot=\"template-io-panel\" className={cn(\"flex flex-col gap-3\", className)}>\n <div className=\"text-sm font-medium\">Template &amp; import / export</div>\n\n {templates && onTemplateChange ? (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"plate-template\">Template</Label>\n <Select value={templateId ?? \"\"} onValueChange={(v) => onTemplateChange(v)}>\n <SelectTrigger id=\"plate-template\" size=\"sm\" className=\"w-full\">\n <SelectValue placeholder=\"Select template…\" />\n </SelectTrigger>\n <SelectContent>\n {groups.map(([group, opts]) => (\n <SelectGroup key={group || \"_\"}>\n {group ? <SelectLabel>{group}</SelectLabel> : null}\n {opts.map((t) => (\n <SelectItem key={t.id} value={t.id}>\n {t.label}\n </SelectItem>\n ))}\n </SelectGroup>\n ))}\n </SelectContent>\n </Select>\n {onClearTemplate ? (\n <Button variant=\"outline\" size=\"sm\" onClick={onClearTemplate} disabled={!templateId && !hasEntries}>\n Clear template\n </Button>\n ) : null}\n </div>\n ) : null}\n\n {onImportTemplate || onExportTemplate ? (\n <>\n <Separator />\n <div className=\"text-xs font-medium text-muted-foreground\">Template</div>\n <div className=\"flex flex-col gap-2\">\n {onImportTemplate ? (\n <FilePickerButton label=\"Import template (JSON)\" accept={templateAccept} onPick={onImportTemplate} />\n ) : null}\n {onExportTemplate ? (\n <Button variant=\"outline\" size=\"sm\" disabled={!hasEntries} onClick={onExportTemplate}>\n <Download aria-hidden /> Export template (JSON)\n </Button>\n ) : null}\n </div>\n </>\n ) : null}\n\n {onImportCsv || onExportCsv ? (\n <>\n <Separator />\n <div className=\"text-xs font-medium text-muted-foreground\">Plate map</div>\n <div className=\"flex flex-col gap-2\">\n {onImportCsv ? (\n <FilePickerButton label=\"Import plate map (CSV)\" accept={csvAccept} onPick={onImportCsv} triageCsv />\n ) : null}\n {onExportCsv ? (\n <Button variant=\"outline\" size=\"sm\" disabled={!hasEntries} onClick={onExportCsv}>\n <Download aria-hidden /> Export plate map (CSV)\n </Button>\n ) : null}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["FilePickerButton","label","accept","onPick","disabled","triageCsv","inputRef","React","jsxs","Fragment","Button","jsx","Upload","e","input","f","triage","triagePlateMapCsvFile","TemplateIOPanel","templates","templateId","onTemplateChange","onClearTemplate","hasEntries","onImportCsv","onExportCsv","onImportTemplate","onExportTemplate","className","csvAccept","templateAccept","groups","groupTemplateOptions","cn","Label","Select","v","SelectTrigger","SelectValue","SelectContent","group","opts","SelectGroup","SelectLabel","t","SelectItem","Separator","Download"],"mappings":"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"}
1
+ {"version":3,"file":"TemplateIOPanel.cjs","sources":["../../../../src/components/composed/PlateMapEditor/TemplateIOPanel.tsx"],"sourcesContent":["import { Download, Upload } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { triagePlateMapCsvFile } from \"./csvPlateTriage\";\nimport { groupTemplateOptions } from \"./helpers\";\n\nimport type { ImportExportHandlers, PlateMapCsvTriage, TemplateOption } from \"./types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface TemplateIOPanelProps extends ImportExportHandlers {\n templates?: TemplateOption[];\n templateId?: string;\n onTemplateChange?: (id: string) => void;\n onClearTemplate?: () => void;\n /** Disable export buttons when there's nothing to export. */\n hasEntries?: boolean;\n className?: string;\n csvAccept?: string;\n templateAccept?: string;\n}\n\ninterface FilePickerButtonProps {\n label: string;\n accept: string;\n onPick: (file: File, triage?: PlateMapCsvTriage) => void | Promise<void>;\n disabled?: boolean;\n triageCsv?: boolean;\n}\n\nfunction FilePickerButton({ label, accept, onPick, disabled, triageCsv }: FilePickerButtonProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n return (\n <>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={disabled} onClick={() => inputRef.current?.click()}>\n <Upload aria-hidden /> {label}\n </Button>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n hidden\n onChange={(e) => {\n const input = e.currentTarget;\n const f = e.target.files?.[0];\n if (!f) {\n input.value = \"\";\n return;\n }\n\n void (async () => {\n const triage = triageCsv ? await triagePlateMapCsvFile(f) : undefined;\n await (triage ? onPick(f, triage) : onPick(f));\n input.value = \"\";\n })();\n }}\n />\n </>\n );\n}\n\nexport function TemplateIOPanel({\n templates,\n templateId,\n onTemplateChange,\n onClearTemplate,\n hasEntries,\n onImportCsv,\n onExportCsv,\n onImportTemplate,\n onExportTemplate,\n className,\n csvAccept = \".csv,text/csv\",\n templateAccept = \"application/json\",\n}: TemplateIOPanelProps) {\n const groups = React.useMemo(() => groupTemplateOptions(templates), [templates]);\n\n return (\n <div data-slot=\"template-io-panel\" className={cn(\"flex flex-col gap-3\", className)}>\n <div className=\"text-sm font-medium\">Template &amp; import / export</div>\n\n {templates && onTemplateChange ? (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"plate-template\">Template</Label>\n <Select value={templateId ?? \"\"} onValueChange={(v) => onTemplateChange(v)}>\n <SelectTrigger id=\"plate-template\" size=\"sm\" className=\"w-full\">\n <SelectValue placeholder=\"Select template…\" />\n </SelectTrigger>\n <SelectContent>\n {groups.map(([group, opts]) => (\n <SelectGroup key={group || \"_\"}>\n {group ? <SelectLabel>{group}</SelectLabel> : null}\n {opts.map((t) => (\n <SelectItem key={t.id} value={t.id}>\n {t.label}\n </SelectItem>\n ))}\n </SelectGroup>\n ))}\n </SelectContent>\n </Select>\n {onClearTemplate ? (\n <Button variant=\"outline\" size=\"sm\" onClick={onClearTemplate} disabled={!templateId && !hasEntries}>\n Clear template\n </Button>\n ) : null}\n </div>\n ) : null}\n\n {onImportTemplate || onExportTemplate ? (\n <>\n <Separator />\n <div className=\"text-xs font-medium text-muted-foreground\">Template</div>\n <div className=\"flex flex-col gap-2\">\n {onImportTemplate ? (\n <FilePickerButton label=\"Import template (JSON)\" accept={templateAccept} onPick={onImportTemplate} />\n ) : null}\n {onExportTemplate ? (\n <Button variant=\"outline\" size=\"sm\" disabled={!hasEntries} onClick={onExportTemplate}>\n <Download aria-hidden /> Export template (JSON)\n </Button>\n ) : null}\n </div>\n </>\n ) : null}\n\n {onImportCsv || onExportCsv ? (\n <>\n <Separator />\n <div className=\"text-xs font-medium text-muted-foreground\">Plate map</div>\n <div className=\"flex flex-col gap-2\">\n {onImportCsv ? (\n <FilePickerButton label=\"Import plate map (CSV)\" accept={csvAccept} onPick={onImportCsv} triageCsv />\n ) : null}\n {onExportCsv ? (\n <Button variant=\"outline\" size=\"sm\" disabled={!hasEntries} onClick={onExportCsv}>\n <Download aria-hidden /> Export plate map (CSV)\n </Button>\n ) : null}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["FilePickerButton","label","accept","onPick","disabled","triageCsv","inputRef","React","jsxs","Fragment","Button","jsx","Upload","e","input","f","triage","triagePlateMapCsvFile","TemplateIOPanel","templates","templateId","onTemplateChange","onClearTemplate","hasEntries","onImportCsv","onExportCsv","onImportTemplate","onExportTemplate","className","csvAccept","templateAccept","groups","groupTemplateOptions","cn","Label","Select","v","SelectTrigger","SelectValue","SelectContent","group","opts","SelectGroup","SelectLabel","t","SelectItem","Separator","Download"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { ImportExportHandlers, TemplateOption } from './types';
2
+ export interface TemplateIOPanelProps extends ImportExportHandlers {
3
+ templates?: TemplateOption[];
4
+ templateId?: string;
5
+ onTemplateChange?: (id: string) => void;
6
+ onClearTemplate?: () => void;
7
+ /** Disable export buttons when there's nothing to export. */
8
+ hasEntries?: boolean;
9
+ className?: string;
10
+ csvAccept?: string;
11
+ templateAccept?: string;
12
+ }
13
+ export declare function TemplateIOPanel({ templates, templateId, onTemplateChange, onClearTemplate, hasEntries, onImportCsv, onExportCsv, onImportTemplate, onExportTemplate, className, csvAccept, templateAccept, }: TemplateIOPanelProps): import("react/jsx-runtime").JSX.Element;
@@ -3,10 +3,10 @@ import { Download as x, Upload as z } from "lucide-react";
3
3
  import * as S from "react";
4
4
  import { triagePlateMapCsvFile as P } from "./csvPlateTriage.js";
5
5
  import { groupTemplateOptions as w } from "./helpers.js";
6
- import { Button as p } from "../../ui/button.js";
7
- import { Label as F } from "../../ui/label.js";
8
- import { Select as O, SelectTrigger as V, SelectValue as j, SelectContent as y, SelectGroup as R, SelectLabel as B, SelectItem as J } from "../../ui/select.js";
9
- import { Separator as v } from "../../ui/separator.js";
6
+ import { Button as p } from "../../../ui/button.js";
7
+ import { Label as F } from "../../../ui/label.js";
8
+ import { Select as O, SelectTrigger as V, SelectValue as j, SelectContent as y, SelectGroup as R, SelectLabel as B, SelectItem as J } from "../../../ui/select.js";
9
+ import { Separator as v } from "../../../ui/separator.js";
10
10
  import { cn as L } from "../../../lib/utils.js";
11
11
  function g({ label: n, accept: m, onPick: c, disabled: u, triageCsv: d }) {
12
12
  const i = S.useRef(null);
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),x=require("lucide-react"),g=require("react"),f=require("../../ui/button.cjs"),c=require("../../ui/card.cjs"),a=require("../../../lib/utils.cjs");function b(r){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const l in r)if(l!=="default"){const s=Object.getOwnPropertyDescriptor(r,l);Object.defineProperty(n,l,s.get?s:{enumerable:!0,get:()=>r[l]})}}return n.default=r,Object.freeze(n)}const j=b(g);function p({items:r,renderItem:n,onHoverEnter:l,onHoverLeave:s,onRemove:d,removeLabel:i="Remove",emptyLabel:u="No items",className:o}){return r.length===0?t.jsx("div",{className:a.cn("text-xs text-muted-foreground",o),"data-slot":"well-legend-empty",children:u}):t.jsx("div",{className:a.cn("flex flex-col gap-1.5",o),"data-slot":"well-legend",children:r.map(e=>n?t.jsx(j.Fragment,{children:n(e)},e.id):t.jsx(c.Card,{size:"sm","data-slot":"well-legend-item","data-disabled":e.disabled||void 0,className:a.cn("py-2 hover:bg-accent/40"),onMouseEnter:()=>l?.(e.id),onMouseLeave:()=>s?.(e.id),children:t.jsxs(c.CardContent,{className:"flex items-start gap-2",children:[t.jsx("span",{"aria-hidden":!0,className:a.cn("mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20",e.disabled&&"opacity-50"),style:{backgroundColor:e.color}}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:a.cn("truncate text-xs font-medium",e.disabled&&"text-muted-foreground"),children:e.label}),e.meta?t.jsx("div",{className:"truncate text-[0.65rem] text-muted-foreground",children:e.meta}):null]}),d?t.jsx(f.Button,{type:"button",variant:"ghost",size:"icon-xs","aria-label":`${i} ${typeof e.label=="string"?e.label:e.id}`,onClick:()=>d(e.id),children:t.jsx(x.X,{"aria-hidden":!0})}):null]})},e.id))})}exports.WellLegend=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),x=require("lucide-react"),g=require("react"),f=require("../../../ui/button.cjs"),c=require("../../../ui/card.cjs"),a=require("../../../lib/utils.cjs");function b(r){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const l in r)if(l!=="default"){const s=Object.getOwnPropertyDescriptor(r,l);Object.defineProperty(n,l,s.get?s:{enumerable:!0,get:()=>r[l]})}}return n.default=r,Object.freeze(n)}const j=b(g);function p({items:r,renderItem:n,onHoverEnter:l,onHoverLeave:s,onRemove:d,removeLabel:i="Remove",emptyLabel:u="No items",className:o}){return r.length===0?t.jsx("div",{className:a.cn("text-xs text-muted-foreground",o),"data-slot":"well-legend-empty",children:u}):t.jsx("div",{className:a.cn("flex flex-col gap-1.5",o),"data-slot":"well-legend",children:r.map(e=>n?t.jsx(j.Fragment,{children:n(e)},e.id):t.jsx(c.Card,{size:"sm","data-slot":"well-legend-item","data-disabled":e.disabled||void 0,className:a.cn("py-2 hover:bg-accent/40"),onMouseEnter:()=>l?.(e.id),onMouseLeave:()=>s?.(e.id),children:t.jsxs(c.CardContent,{className:"flex items-start gap-2",children:[t.jsx("span",{"aria-hidden":!0,className:a.cn("mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20",e.disabled&&"opacity-50"),style:{backgroundColor:e.color}}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:a.cn("truncate text-xs font-medium",e.disabled&&"text-muted-foreground"),children:e.label}),e.meta?t.jsx("div",{className:"truncate text-[0.65rem] text-muted-foreground",children:e.meta}):null]}),d?t.jsx(f.Button,{type:"button",variant:"ghost",size:"icon-xs","aria-label":`${i} ${typeof e.label=="string"?e.label:e.id}`,onClick:()=>d(e.id),children:t.jsx(x.X,{"aria-hidden":!0})}):null]})},e.id))})}exports.WellLegend=p;
2
2
  //# sourceMappingURL=WellLegend.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"WellLegend.cjs","sources":["../../../../src/components/composed/PlateMapEditor/WellLegend.tsx"],"sourcesContent":["import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface WellLegendItem {\n id: string;\n label: React.ReactNode;\n color: string;\n /** Optional secondary text shown beneath the label. */\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface WellLegendProps {\n items: WellLegendItem[];\n /** Render-prop for fully custom cards. Bypasses the default card layout. */\n renderItem?: (item: WellLegendItem) => React.ReactNode;\n onHoverEnter?: (id: string) => void;\n onHoverLeave?: (id: string) => void;\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n className?: string;\n}\n\nexport function WellLegend({\n items,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n removeLabel = \"Remove\",\n emptyLabel = \"No items\",\n className,\n}: WellLegendProps) {\n if (items.length === 0) {\n return (\n <div className={cn(\"text-xs text-muted-foreground\", className)} data-slot=\"well-legend-empty\">\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)} data-slot=\"well-legend\">\n {items.map((item) => {\n if (renderItem) return <React.Fragment key={item.id}>{renderItem(item)}</React.Fragment>;\n return (\n <Card\n key={item.id}\n size=\"sm\"\n data-slot=\"well-legend-item\"\n data-disabled={item.disabled || undefined}\n className={cn(\"py-2 hover:bg-accent/40\")}\n onMouseEnter={() => onHoverEnter?.(item.id)}\n onMouseLeave={() => onHoverLeave?.(item.id)}\n >\n <CardContent className=\"flex items-start gap-2\">\n <span\n aria-hidden\n className={cn(\n \"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20\",\n item.disabled && \"opacity-50\"\n )}\n style={{ backgroundColor: item.color }}\n />\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"truncate text-xs font-medium\",\n item.disabled && \"text-muted-foreground\"\n )}\n >\n {item.label}\n </div>\n {item.meta ? (\n <div className=\"truncate text-[0.65rem] text-muted-foreground\">{item.meta}</div>\n ) : null}\n </div>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={`${removeLabel} ${typeof item.label === \"string\" ? item.label : item.id}`}\n onClick={() => onRemove(item.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </CardContent>\n </Card>\n );\n })}\n </div>\n );\n}\n"],"names":["WellLegend","items","renderItem","onHoverEnter","onHoverLeave","onRemove","removeLabel","emptyLabel","className","jsx","cn","item","React","Card","jsxs","CardContent","Button","X"],"mappings":"giBA4BO,SAASA,EAAW,CACzB,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,aAAAC,EACA,SAAAC,EACA,YAAAC,EAAc,SACd,WAAAC,EAAa,WACb,UAAAC,CACF,EAAoB,CAClB,OAAIP,EAAM,SAAW,EAEjBQ,MAAC,OAAI,UAAWC,EAAAA,GAAG,gCAAiCF,CAAS,EAAG,YAAU,oBACvE,SAAAD,CAAA,CACH,EAKFE,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAAA,GAAG,wBAAyBF,CAAS,EAAG,YAAU,cAC/D,SAAAP,EAAM,IAAKU,GACNT,EAAmBO,MAACG,EAAM,SAAN,CAA8B,SAAAV,EAAWS,CAAI,GAAzBA,EAAK,EAAsB,EAErEF,EAAAA,IAACI,EAAAA,KAAA,CAEC,KAAK,KACL,YAAU,mBACV,gBAAeF,EAAK,UAAY,OAChC,UAAWD,EAAAA,GAAG,yBAAyB,EACvC,aAAc,IAAMP,IAAeQ,EAAK,EAAE,EAC1C,aAAc,IAAMP,IAAeO,EAAK,EAAE,EAE1C,SAAAG,EAAAA,KAACC,EAAAA,YAAA,CAAY,UAAU,yBACrB,SAAA,CAAAN,EAAAA,IAAC,OAAA,CACC,cAAW,GACX,UAAWC,EAAAA,GACT,kEACAC,EAAK,UAAY,YAAA,EAEnB,MAAO,CAAE,gBAAiBA,EAAK,KAAA,CAAM,CAAA,EAEvCG,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAL,EAAAA,IAAC,MAAA,CACC,UAAWC,EAAAA,GACT,+BACAC,EAAK,UAAY,uBAAA,EAGlB,SAAAA,EAAK,KAAA,CAAA,EAEPA,EAAK,KACJF,MAAC,MAAA,CAAI,UAAU,gDAAiD,SAAAE,EAAK,KAAK,EACxE,IAAA,EACN,EACCN,EACCI,EAAAA,IAACO,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,UACL,aAAY,GAAGV,CAAW,IAAI,OAAOK,EAAK,OAAU,SAAWA,EAAK,MAAQA,EAAK,EAAE,GACnF,QAAS,IAAMN,EAASM,EAAK,EAAE,EAE/B,SAAAF,EAAAA,IAACQ,EAAAA,EAAA,CAAE,cAAW,EAAA,CAAC,CAAA,CAAA,EAEf,IAAA,CAAA,CACN,CAAA,EAzCKN,EAAK,EAAA,CA4Cf,CAAA,CACH,CAEJ"}
1
+ {"version":3,"file":"WellLegend.cjs","sources":["../../../../src/components/composed/PlateMapEditor/WellLegend.tsx"],"sourcesContent":["import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface WellLegendItem {\n id: string;\n label: React.ReactNode;\n color: string;\n /** Optional secondary text shown beneath the label. */\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface WellLegendProps {\n items: WellLegendItem[];\n /** Render-prop for fully custom cards. Bypasses the default card layout. */\n renderItem?: (item: WellLegendItem) => React.ReactNode;\n onHoverEnter?: (id: string) => void;\n onHoverLeave?: (id: string) => void;\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n className?: string;\n}\n\nexport function WellLegend({\n items,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n removeLabel = \"Remove\",\n emptyLabel = \"No items\",\n className,\n}: WellLegendProps) {\n if (items.length === 0) {\n return (\n <div className={cn(\"text-xs text-muted-foreground\", className)} data-slot=\"well-legend-empty\">\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)} data-slot=\"well-legend\">\n {items.map((item) => {\n if (renderItem) return <React.Fragment key={item.id}>{renderItem(item)}</React.Fragment>;\n return (\n <Card\n key={item.id}\n size=\"sm\"\n data-slot=\"well-legend-item\"\n data-disabled={item.disabled || undefined}\n className={cn(\"py-2 hover:bg-accent/40\")}\n onMouseEnter={() => onHoverEnter?.(item.id)}\n onMouseLeave={() => onHoverLeave?.(item.id)}\n >\n <CardContent className=\"flex items-start gap-2\">\n <span\n aria-hidden\n className={cn(\n \"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20\",\n item.disabled && \"opacity-50\"\n )}\n style={{ backgroundColor: item.color }}\n />\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"truncate text-xs font-medium\",\n item.disabled && \"text-muted-foreground\"\n )}\n >\n {item.label}\n </div>\n {item.meta ? (\n <div className=\"truncate text-[0.65rem] text-muted-foreground\">{item.meta}</div>\n ) : null}\n </div>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={`${removeLabel} ${typeof item.label === \"string\" ? item.label : item.id}`}\n onClick={() => onRemove(item.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </CardContent>\n </Card>\n );\n })}\n </div>\n );\n}\n"],"names":["WellLegend","items","renderItem","onHoverEnter","onHoverLeave","onRemove","removeLabel","emptyLabel","className","jsx","cn","item","React","Card","jsxs","CardContent","Button","X"],"mappings":"siBA4BO,SAASA,EAAW,CACzB,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,aAAAC,EACA,SAAAC,EACA,YAAAC,EAAc,SACd,WAAAC,EAAa,WACb,UAAAC,CACF,EAAoB,CAClB,OAAIP,EAAM,SAAW,EAEjBQ,MAAC,OAAI,UAAWC,EAAAA,GAAG,gCAAiCF,CAAS,EAAG,YAAU,oBACvE,SAAAD,CAAA,CACH,EAKFE,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAAA,GAAG,wBAAyBF,CAAS,EAAG,YAAU,cAC/D,SAAAP,EAAM,IAAKU,GACNT,EAAmBO,MAACG,EAAM,SAAN,CAA8B,SAAAV,EAAWS,CAAI,GAAzBA,EAAK,EAAsB,EAErEF,EAAAA,IAACI,EAAAA,KAAA,CAEC,KAAK,KACL,YAAU,mBACV,gBAAeF,EAAK,UAAY,OAChC,UAAWD,EAAAA,GAAG,yBAAyB,EACvC,aAAc,IAAMP,IAAeQ,EAAK,EAAE,EAC1C,aAAc,IAAMP,IAAeO,EAAK,EAAE,EAE1C,SAAAG,EAAAA,KAACC,EAAAA,YAAA,CAAY,UAAU,yBACrB,SAAA,CAAAN,EAAAA,IAAC,OAAA,CACC,cAAW,GACX,UAAWC,EAAAA,GACT,kEACAC,EAAK,UAAY,YAAA,EAEnB,MAAO,CAAE,gBAAiBA,EAAK,KAAA,CAAM,CAAA,EAEvCG,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAL,EAAAA,IAAC,MAAA,CACC,UAAWC,EAAAA,GACT,+BACAC,EAAK,UAAY,uBAAA,EAGlB,SAAAA,EAAK,KAAA,CAAA,EAEPA,EAAK,KACJF,MAAC,MAAA,CAAI,UAAU,gDAAiD,SAAAE,EAAK,KAAK,EACxE,IAAA,EACN,EACCN,EACCI,EAAAA,IAACO,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,UACL,aAAY,GAAGV,CAAW,IAAI,OAAOK,EAAK,OAAU,SAAWA,EAAK,MAAQA,EAAK,EAAE,GACnF,QAAS,IAAMN,EAASM,EAAK,EAAE,EAE/B,SAAAF,EAAAA,IAACQ,EAAAA,EAAA,CAAE,cAAW,EAAA,CAAC,CAAA,CAAA,EAEf,IAAA,CAAA,CACN,CAAA,EAzCKN,EAAK,EAAA,CA4Cf,CAAA,CACH,CAEJ"}
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ export interface WellLegendItem {
3
+ id: string;
4
+ label: React.ReactNode;
5
+ color: string;
6
+ /** Optional secondary text shown beneath the label. */
7
+ meta?: React.ReactNode;
8
+ disabled?: boolean;
9
+ }
10
+ export interface WellLegendProps {
11
+ items: WellLegendItem[];
12
+ /** Render-prop for fully custom cards. Bypasses the default card layout. */
13
+ renderItem?: (item: WellLegendItem) => React.ReactNode;
14
+ onHoverEnter?: (id: string) => void;
15
+ onHoverLeave?: (id: string) => void;
16
+ onRemove?: (id: string) => void;
17
+ removeLabel?: string;
18
+ emptyLabel?: string;
19
+ className?: string;
20
+ }
21
+ export declare function WellLegend({ items, renderItem, onHoverEnter, onHoverLeave, onRemove, removeLabel, emptyLabel, className, }: WellLegendProps): import("react/jsx-runtime").JSX.Element;
@@ -1,8 +1,8 @@
1
1
  import { jsx as r, jsxs as n } from "react/jsx-runtime";
2
2
  import { X as m } from "lucide-react";
3
3
  import * as f from "react";
4
- import { Button as g } from "../../ui/button.js";
5
- import { Card as p, CardContent as x } from "../../ui/card.js";
4
+ import { Button as g } from "../../../ui/button.js";
5
+ import { Card as p, CardContent as x } from "../../../ui/card.js";
6
6
  import { cn as a } from "../../../lib/utils.js";
7
7
  function C({
8
8
  items: l,
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),T=require("lucide-react"),we=require("react"),ve=require("./ManifestFilterPopover.cjs"),Y=require("../../ui/badge.cjs"),A=require("../../ui/button.cjs"),J=require("../../ui/checkbox.cjs"),b=require("../../ui/combobox.cjs"),Ne=require("../../ui/data-table/data-table.cjs"),ye=require("../../ui/input.cjs"),u=require("../../ui/select.cjs"),ke=require("../../ui/switch.cjs"),f=require("../../ui/table.cjs"),P=require("../../ui/tooltip.cjs"),I=require("../../../lib/utils.cjs");function Te(o){const i=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const c in o)if(c!=="default"){const d=Object.getOwnPropertyDescriptor(o,c);Object.defineProperty(i,c,d.get?d:{enumerable:!0,get:()=>o[c]})}}return i.default=o,Object.freeze(i)}const h=Te(we);function _e({ariaLabel:o,value:i,options:c,placeholder:d,onChange:p}){const j=b.useComboboxAnchor(),g=h.useMemo(()=>{const x=new Map;return c.forEach(C=>x.set(C.value,C.label)),x},[c]);return t.jsxs(b.Combobox,{multiple:!0,items:c.map(x=>x.value),value:i,onValueChange:p,children:[t.jsxs(b.ComboboxChips,{ref:j,className:I.cn("min-h-7 w-full py-0.5",G),children:[t.jsx(b.ComboboxValue,{children:x=>x.map(C=>t.jsx(b.ComboboxChip,{children:g.get(C)??C},C))}),t.jsx(b.ComboboxChipsInput,{"aria-label":o,placeholder:d??"Select…"})]}),t.jsxs(b.ComboboxContent,{anchor:j,children:[t.jsx(b.ComboboxEmpty,{children:"No options."}),t.jsx(b.ComboboxList,{"aria-label":o,children:x=>t.jsx(b.ComboboxItem,{value:x,children:g.get(x)??x},x)})]})]})}const G="border-transparent shadow-none hover:border-input/40",X=25,Me=50,Ee=100,ze=X,Fe=[X,Me,Ee];function Q(o){return o!=null&&o!==""}const Re={number:"number",integer:"number",date:"date",datetime:"datetime-local",time:"time"};function Ae(o){return Re[o]??"text"}function Pe(o,i){if(i!==""){if(o==="number"){const c=parseFloat(i);return Number.isFinite(c)?c:i}if(o==="integer"){const c=parseInt(i,10);return Number.isFinite(c)?c:i}return i}}function Ie(o,i){const c=new Map;for(const d of o){const p=d.row[i],j=p==null||p===""?"(blank)":String(p),g=c.get(j);g?g.rows.push(d):c.set(j,{key:j,rows:[d]})}return[...c.values()]}function qe(o){return o.filter(i=>!!i.field).map(i=>({columnId:i.field,label:i.header}))}function De({values:o,columns:i,fields:c,selection:d,onSelectionChange:p,onChange:j,emptyEntry:g,isPopulated:x,pageSize:C=ze,pageSizeOptions:ee=Fe,enableFillDown:V=!0,rowProps:te,filterable:q=!1,filterColumns:L,groupable:D=!1,className:ne}){const[F,se]=h.useState(!1),[w,_]=h.useState(0),[S,re]=h.useState(C),[M,le]=h.useState([]),[R,ae]=h.useState(""),[ie,oe]=h.useState(new Set);h.useEffect(()=>{_(0)},[F]);const W=h.useMemo(()=>{const e=new Map;return(c??[]).forEach(n=>e.set(n.key,n)),e},[c]),ce=h.useMemo(()=>L??qe(i),[i,L]),v=h.useMemo(()=>{const e=[...o.entries()].map(([s,r])=>({id:s,row:r}));let n=e;if(!F&&x&&(n=e.filter(s=>x(s.row))),q&&M.length>0&&(n=n.filter(s=>{const r=s.row;return M.every(l=>{const a=r[l.columnId],m=a==null?"":String(a);return Ne.applyFilterCondition(m,l.operator,l.value)})})),d&&d.size>0){const s=new Set(n.map(r=>r.id));d.forEach(r=>{!s.has(r)&&!o.has(r)&&(n=[...n,{id:r,row:g(r)}])})}return n.sort((s,r)=>s.id.localeCompare(r.id))},[o,F,x,d,g,q,M]);h.useEffect(()=>{_(0)},[M]);const B=h.useMemo(()=>v.slice(w*S,w*S+S),[v,w,S]),y=(e,n)=>{const s=new Map(o),r=s.get(e)??g(e);s.set(e,{...r,...n}),j(s)},de=e=>{if(!p)return;const n=new Set(d??[]);n.has(e)?n.delete(e):n.add(e),p(n)},O=e=>{if(!e.field)return null;const n=!!d&&d.size>0,r=n?v.filter(({id:N})=>d.has(N)):D&&!!R?v:B,l=r.findIndex(({row:N})=>Q(N[e.field]));if(l<0)return null;const a=r[l],m=n?r.filter(({id:N})=>N!==a.id):r.slice(l+1);return{field:e.field,source:a,targets:m,value:a.row[e.field]}},ue=e=>{const n=O(e);if(!n||n.targets.length===0)return;const s=new Map(o);n.targets.forEach(({id:r})=>{const l=s.get(r)??g(r);s.set(r,{...l,[n.field]:n.value})}),j(s)},he=(e,n,s,r,l)=>t.jsxs(u.Select,{value:s??"",onValueChange:a=>y(r,{[n]:a}),children:[t.jsx(u.SelectTrigger,{size:"sm",className:I.cn("h-7 w-full",G),"aria-label":l,children:t.jsx(u.SelectValue,{placeholder:e.placeholder??"Select…"})}),t.jsx(u.SelectContent,{children:(e.options??[]).map(a=>t.jsx(u.SelectItem,{value:a.value,children:t.jsxs("span",{className:"inline-flex items-center gap-2",children:[a.swatch?t.jsx("span",{className:"inline-block h-2.5 w-2.5 rounded-sm border border-foreground/20",style:{backgroundColor:a.swatch},"aria-hidden":!0}):null,a.label]})},a.value))})]}),xe=(e,n,s,r,l)=>{const a=!!s;return e.boolStyle==="switch"?t.jsx(ke.Switch,{"aria-label":l,checked:a,onCheckedChange:m=>y(r,{[n]:m})}):t.jsx(J.Checkbox,{"aria-label":l,checked:a,onCheckedChange:m=>y(r,{[n]:m===!0})})},me=(e,n,s,r,l)=>t.jsx(ye.Input,{type:Ae(e.kind),step:e.kind==="integer"?1:void 0,placeholder:e.placeholder,"aria-label":l,className:I.cn("h-7",G),value:s??"",onChange:a=>y(r,{[n]:Pe(e.kind,a.target.value)})}),fe=(e,n,s,r)=>{const l=n.field,a=r[l],m=`${e.label} for ${s}`;if(e.kind==="select")return he(e,l,a,s,m);if(e.kind==="multiselect"){const N=Array.isArray(a)?a:[];return t.jsx(_e,{ariaLabel:m,value:N,options:e.options??[],placeholder:e.placeholder,onChange:K=>y(s,{[l]:K.length===0?void 0:K})})}return e.kind==="boolean"?xe(e,l,a,s,m):me(e,l,a,s,m)},pe=(e,n)=>{if(e?.kind==="select"){const s=(e.options??[]).find(r=>r.value===n);return s?t.jsxs(Y.Badge,{variant:"secondary",children:[s.swatch?t.jsx("span",{className:"size-2 rounded-sm border border-foreground/20",style:{backgroundColor:s.swatch},"aria-hidden":!0}):null,s.label]}):t.jsx("span",{className:"text-muted-foreground",children:"—"})}if(e?.kind==="multiselect"){const s=Array.isArray(n)?n:[];return s.length===0?t.jsx("span",{className:"text-muted-foreground",children:"—"}):t.jsx("div",{className:"flex flex-wrap gap-1",children:s.map(r=>{const l=(e.options??[]).find(a=>a.value===r);return t.jsxs(Y.Badge,{variant:"secondary",children:[l?.swatch?t.jsx("span",{className:"size-2 rounded-sm border border-foreground/20",style:{backgroundColor:l.swatch},"aria-hidden":!0}):null,l?.label??r]},r)})})}return e?.kind==="boolean"?n?t.jsx(T.Check,{"aria-label":"Yes",className:"size-4 text-foreground"}):t.jsx("span",{className:"text-muted-foreground",children:"—"}):Q(n)?String(n):t.jsx("span",{className:"text-muted-foreground",children:"—"})},ge=(e,n,s)=>{if(e.render)return e.render({row:s,wellId:n,update:a=>y(n,a)});if(!e.field)return null;const r=W.get(e.field),l=s[e.field];return r?.editableInTable&&r.kind!=="custom"?fe(r,e,n,s):pe(r,l)},be=e=>{const n=e.field?W.get(e.field):void 0,s=e.icon??n?.icon,r=V?O(e):null,l=!!r&&r.targets.length>0,a=d&&d.size>0?`Fill selected ${e.header} cells from the first selected value`:`Fill visible ${e.header} cells downward from the first value`;return t.jsxs("span",{className:"flex min-w-0 items-center justify-between gap-2",children:[t.jsxs("span",{className:"inline-flex min-w-0 items-center gap-1.5",children:[s?t.jsx("span",{className:"inline-flex text-muted-foreground [&_svg]:size-3.5",children:s}):null,t.jsx("span",{className:"truncate",children:e.header})]}),V&&e.field?t.jsxs(P.Tooltip,{children:[t.jsx(P.TooltipTrigger,{asChild:!0,children:t.jsx(A.Button,{type:"button",variant:"ghost",size:"icon-xs",className:"-mr-1 text-muted-foreground hover:text-foreground",disabled:!l,"aria-label":`Fill down ${e.header}`,onClick:m=>{m.preventDefault(),m.stopPropagation(),ue(e)},children:t.jsx(T.ArrowDownToLine,{})})}),t.jsx(P.TooltipContent,{children:a})]}):null]})},je=h.useMemo(()=>i.filter(e=>!!e.field),[i]),k=D&&R?R:"",E=h.useMemo(()=>k?Ie(v,k):null,[k,v]),z=v.length,$=Math.max(0,Math.ceil(z/S)-1),Ce=d?.size??0,H=i.length+1+(p?1:0),Z=(e,n)=>{const s=d?.has(e),r=te?.({wellId:e,row:n,isSelected:!!s});return t.jsxs(f.TableRow,{...r,children:[p?t.jsx(f.TableCell,{className:"w-10",children:t.jsx(J.Checkbox,{checked:!!s,onCheckedChange:()=>de(e),"aria-label":`Select ${e}`})}):null,t.jsx(f.TableCell,{className:"font-semibold",children:e}),i.map(l=>t.jsx(f.TableCell,{style:l.minWidth?{minWidth:l.minWidth}:void 0,children:ge(l,e,n)},l.id??l.field??l.header))]},e)},U=e=>{oe(n=>{const s=new Set(n);return s.has(e)?s.delete(e):s.add(e),s})},Se=k?i.find(n=>n.field===k)?.header??k:"";return t.jsxs("div",{"data-slot":"well-manifest-table",className:I.cn("flex flex-col gap-2",ne),children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx(A.Button,{variant:"outline",size:"sm",onClick:()=>se(e=>!e),children:F?"Hide empty wells":"Show all wells"}),q?t.jsx(ve.ManifestFilterPopover,{columns:ce,filters:M,onFiltersChange:le}):null,D?t.jsxs("div",{className:"inline-flex items-center gap-1.5",children:[t.jsx(T.Layers,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}),t.jsxs(u.Select,{value:R||"__none",onValueChange:e=>ae(e==="__none"?"":e),children:[t.jsx(u.SelectTrigger,{size:"sm",className:"h-7 min-w-40","aria-label":"Group by",children:t.jsx(u.SelectValue,{placeholder:"Group by…"})}),t.jsxs(u.SelectContent,{children:[t.jsx(u.SelectItem,{value:"__none",children:"No grouping"}),je.map(e=>t.jsx(u.SelectItem,{value:e.field??"",children:e.header},e.id??e.field))]})]})]}):null,t.jsxs("span",{className:"text-xs text-muted-foreground",children:[z," rows · ",Ce," selected"]})]}),t.jsx(P.TooltipProvider,{children:t.jsxs(f.Table,{"data-density":"default",children:[t.jsx(f.TableHeader,{children:t.jsxs(f.TableRow,{children:[p?t.jsx(f.TableHead,{className:"w-10 text-center",children:t.jsxs("span",{className:"inline-flex items-center justify-center text-muted-foreground [&_svg]:size-3.5",children:[t.jsx(T.Check,{"aria-hidden":!0}),t.jsx("span",{className:"sr-only",children:"Selected"})]})}):null,t.jsx(f.TableHead,{style:{minWidth:60},children:"Well"}),i.map(e=>t.jsx(f.TableHead,{style:e.minWidth?{minWidth:e.minWidth}:void 0,children:be(e)},e.id??e.field??e.header))]})}),t.jsxs(f.TableBody,{children:[E?E.map(e=>{const n=ie.has(e.key);return t.jsxs(h.Fragment,{children:[t.jsx(f.TableRow,{className:"cursor-pointer bg-muted/40",onClick:()=>U(e.key),onKeyDown:s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),U(e.key))},role:"button",tabIndex:0,"aria-expanded":!n,children:t.jsx(f.TableCell,{colSpan:H,className:"py-1.5",children:t.jsxs("div",{className:"flex items-center gap-2 text-xs font-medium",children:[n?t.jsx(T.ChevronRight,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}):t.jsx(T.ChevronDown,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}),t.jsxs("span",{children:[Se,": ",e.key]}),t.jsxs("span",{className:"text-muted-foreground",children:["(",e.rows.length," ",e.rows.length===1?"row":"rows",")"]})]})})}),n?null:e.rows.map(({id:s,row:r})=>Z(s,r))]},e.key)}):B.map(({id:e,row:n})=>Z(e,n)),(E?E.length===0:B.length===0)?t.jsx(f.TableRow,{children:t.jsx(f.TableCell,{colSpan:H,className:"text-xs text-muted-foreground",children:"No rows. Paint wells on the plate."})}):null]})]})}),E?null:t.jsxs("div",{className:"flex items-center justify-end gap-3 text-xs text-muted-foreground",children:[t.jsx("span",{className:"text-muted-foreground",children:"Rows per page"}),t.jsxs(u.Select,{value:String(S),onValueChange:e=>{re(parseInt(e,10)),_(0)},children:[t.jsx(u.SelectTrigger,{size:"sm",className:"h-7 w-18","aria-label":"Rows per page",children:t.jsx(u.SelectValue,{})}),t.jsx(u.SelectContent,{children:ee.map(e=>t.jsx(u.SelectItem,{value:String(e),children:e},e))})]}),t.jsx("span",{children:z===0?"0 of 0":`${w*S+1}–${Math.min((w+1)*S,z)} of ${z}`}),t.jsx(A.Button,{variant:"outline",size:"sm",disabled:w===0,onClick:()=>_(e=>Math.max(0,e-1)),children:"Prev"}),t.jsx(A.Button,{variant:"outline",size:"sm",disabled:w>=$,onClick:()=>_(e=>Math.min($,e+1)),children:"Next"})]})]})}exports.WellManifestTable=De;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),T=require("lucide-react"),we=require("react"),ve=require("./ManifestFilterPopover.cjs"),Y=require("../../../ui/badge.cjs"),A=require("../../../ui/button.cjs"),J=require("../../../ui/checkbox.cjs"),b=require("../../../ui/combobox.cjs"),Ne=require("../../ui/data-table/data-table.cjs"),ye=require("../../../ui/input.cjs"),u=require("../../../ui/select.cjs"),ke=require("../../../ui/switch.cjs"),f=require("../../../ui/table.cjs"),P=require("../../../ui/tooltip.cjs"),I=require("../../../lib/utils.cjs");function Te(o){const i=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const c in o)if(c!=="default"){const d=Object.getOwnPropertyDescriptor(o,c);Object.defineProperty(i,c,d.get?d:{enumerable:!0,get:()=>o[c]})}}return i.default=o,Object.freeze(i)}const h=Te(we);function _e({ariaLabel:o,value:i,options:c,placeholder:d,onChange:p}){const j=b.useComboboxAnchor(),g=h.useMemo(()=>{const x=new Map;return c.forEach(C=>x.set(C.value,C.label)),x},[c]);return t.jsxs(b.Combobox,{multiple:!0,items:c.map(x=>x.value),value:i,onValueChange:p,children:[t.jsxs(b.ComboboxChips,{ref:j,className:I.cn("min-h-7 w-full py-0.5",G),children:[t.jsx(b.ComboboxValue,{children:x=>x.map(C=>t.jsx(b.ComboboxChip,{children:g.get(C)??C},C))}),t.jsx(b.ComboboxChipsInput,{"aria-label":o,placeholder:d??"Select…"})]}),t.jsxs(b.ComboboxContent,{anchor:j,children:[t.jsx(b.ComboboxEmpty,{children:"No options."}),t.jsx(b.ComboboxList,{"aria-label":o,children:x=>t.jsx(b.ComboboxItem,{value:x,children:g.get(x)??x},x)})]})]})}const G="border-transparent shadow-none hover:border-input/40",X=25,Me=50,Ee=100,ze=X,Fe=[X,Me,Ee];function Q(o){return o!=null&&o!==""}const Re={number:"number",integer:"number",date:"date",datetime:"datetime-local",time:"time"};function Ae(o){return Re[o]??"text"}function Pe(o,i){if(i!==""){if(o==="number"){const c=parseFloat(i);return Number.isFinite(c)?c:i}if(o==="integer"){const c=parseInt(i,10);return Number.isFinite(c)?c:i}return i}}function Ie(o,i){const c=new Map;for(const d of o){const p=d.row[i],j=p==null||p===""?"(blank)":String(p),g=c.get(j);g?g.rows.push(d):c.set(j,{key:j,rows:[d]})}return[...c.values()]}function qe(o){return o.filter(i=>!!i.field).map(i=>({columnId:i.field,label:i.header}))}function De({values:o,columns:i,fields:c,selection:d,onSelectionChange:p,onChange:j,emptyEntry:g,isPopulated:x,pageSize:C=ze,pageSizeOptions:ee=Fe,enableFillDown:V=!0,rowProps:te,filterable:q=!1,filterColumns:L,groupable:D=!1,className:ne}){const[F,se]=h.useState(!1),[w,_]=h.useState(0),[S,re]=h.useState(C),[M,le]=h.useState([]),[R,ae]=h.useState(""),[ie,oe]=h.useState(new Set);h.useEffect(()=>{_(0)},[F]);const W=h.useMemo(()=>{const e=new Map;return(c??[]).forEach(n=>e.set(n.key,n)),e},[c]),ce=h.useMemo(()=>L??qe(i),[i,L]),v=h.useMemo(()=>{const e=[...o.entries()].map(([s,r])=>({id:s,row:r}));let n=e;if(!F&&x&&(n=e.filter(s=>x(s.row))),q&&M.length>0&&(n=n.filter(s=>{const r=s.row;return M.every(l=>{const a=r[l.columnId],m=a==null?"":String(a);return Ne.applyFilterCondition(m,l.operator,l.value)})})),d&&d.size>0){const s=new Set(n.map(r=>r.id));d.forEach(r=>{!s.has(r)&&!o.has(r)&&(n=[...n,{id:r,row:g(r)}])})}return n.sort((s,r)=>s.id.localeCompare(r.id))},[o,F,x,d,g,q,M]);h.useEffect(()=>{_(0)},[M]);const B=h.useMemo(()=>v.slice(w*S,w*S+S),[v,w,S]),y=(e,n)=>{const s=new Map(o),r=s.get(e)??g(e);s.set(e,{...r,...n}),j(s)},de=e=>{if(!p)return;const n=new Set(d??[]);n.has(e)?n.delete(e):n.add(e),p(n)},O=e=>{if(!e.field)return null;const n=!!d&&d.size>0,r=n?v.filter(({id:N})=>d.has(N)):D&&!!R?v:B,l=r.findIndex(({row:N})=>Q(N[e.field]));if(l<0)return null;const a=r[l],m=n?r.filter(({id:N})=>N!==a.id):r.slice(l+1);return{field:e.field,source:a,targets:m,value:a.row[e.field]}},ue=e=>{const n=O(e);if(!n||n.targets.length===0)return;const s=new Map(o);n.targets.forEach(({id:r})=>{const l=s.get(r)??g(r);s.set(r,{...l,[n.field]:n.value})}),j(s)},he=(e,n,s,r,l)=>t.jsxs(u.Select,{value:s??"",onValueChange:a=>y(r,{[n]:a}),children:[t.jsx(u.SelectTrigger,{size:"sm",className:I.cn("h-7 w-full",G),"aria-label":l,children:t.jsx(u.SelectValue,{placeholder:e.placeholder??"Select…"})}),t.jsx(u.SelectContent,{children:(e.options??[]).map(a=>t.jsx(u.SelectItem,{value:a.value,children:t.jsxs("span",{className:"inline-flex items-center gap-2",children:[a.swatch?t.jsx("span",{className:"inline-block h-2.5 w-2.5 rounded-sm border border-foreground/20",style:{backgroundColor:a.swatch},"aria-hidden":!0}):null,a.label]})},a.value))})]}),xe=(e,n,s,r,l)=>{const a=!!s;return e.boolStyle==="switch"?t.jsx(ke.Switch,{"aria-label":l,checked:a,onCheckedChange:m=>y(r,{[n]:m})}):t.jsx(J.Checkbox,{"aria-label":l,checked:a,onCheckedChange:m=>y(r,{[n]:m===!0})})},me=(e,n,s,r,l)=>t.jsx(ye.Input,{type:Ae(e.kind),step:e.kind==="integer"?1:void 0,placeholder:e.placeholder,"aria-label":l,className:I.cn("h-7",G),value:s??"",onChange:a=>y(r,{[n]:Pe(e.kind,a.target.value)})}),fe=(e,n,s,r)=>{const l=n.field,a=r[l],m=`${e.label} for ${s}`;if(e.kind==="select")return he(e,l,a,s,m);if(e.kind==="multiselect"){const N=Array.isArray(a)?a:[];return t.jsx(_e,{ariaLabel:m,value:N,options:e.options??[],placeholder:e.placeholder,onChange:K=>y(s,{[l]:K.length===0?void 0:K})})}return e.kind==="boolean"?xe(e,l,a,s,m):me(e,l,a,s,m)},pe=(e,n)=>{if(e?.kind==="select"){const s=(e.options??[]).find(r=>r.value===n);return s?t.jsxs(Y.Badge,{variant:"secondary",children:[s.swatch?t.jsx("span",{className:"size-2 rounded-sm border border-foreground/20",style:{backgroundColor:s.swatch},"aria-hidden":!0}):null,s.label]}):t.jsx("span",{className:"text-muted-foreground",children:"—"})}if(e?.kind==="multiselect"){const s=Array.isArray(n)?n:[];return s.length===0?t.jsx("span",{className:"text-muted-foreground",children:"—"}):t.jsx("div",{className:"flex flex-wrap gap-1",children:s.map(r=>{const l=(e.options??[]).find(a=>a.value===r);return t.jsxs(Y.Badge,{variant:"secondary",children:[l?.swatch?t.jsx("span",{className:"size-2 rounded-sm border border-foreground/20",style:{backgroundColor:l.swatch},"aria-hidden":!0}):null,l?.label??r]},r)})})}return e?.kind==="boolean"?n?t.jsx(T.Check,{"aria-label":"Yes",className:"size-4 text-foreground"}):t.jsx("span",{className:"text-muted-foreground",children:"—"}):Q(n)?String(n):t.jsx("span",{className:"text-muted-foreground",children:"—"})},ge=(e,n,s)=>{if(e.render)return e.render({row:s,wellId:n,update:a=>y(n,a)});if(!e.field)return null;const r=W.get(e.field),l=s[e.field];return r?.editableInTable&&r.kind!=="custom"?fe(r,e,n,s):pe(r,l)},be=e=>{const n=e.field?W.get(e.field):void 0,s=e.icon??n?.icon,r=V?O(e):null,l=!!r&&r.targets.length>0,a=d&&d.size>0?`Fill selected ${e.header} cells from the first selected value`:`Fill visible ${e.header} cells downward from the first value`;return t.jsxs("span",{className:"flex min-w-0 items-center justify-between gap-2",children:[t.jsxs("span",{className:"inline-flex min-w-0 items-center gap-1.5",children:[s?t.jsx("span",{className:"inline-flex text-muted-foreground [&_svg]:size-3.5",children:s}):null,t.jsx("span",{className:"truncate",children:e.header})]}),V&&e.field?t.jsxs(P.Tooltip,{children:[t.jsx(P.TooltipTrigger,{asChild:!0,children:t.jsx(A.Button,{type:"button",variant:"ghost",size:"icon-xs",className:"-mr-1 text-muted-foreground hover:text-foreground",disabled:!l,"aria-label":`Fill down ${e.header}`,onClick:m=>{m.preventDefault(),m.stopPropagation(),ue(e)},children:t.jsx(T.ArrowDownToLine,{})})}),t.jsx(P.TooltipContent,{children:a})]}):null]})},je=h.useMemo(()=>i.filter(e=>!!e.field),[i]),k=D&&R?R:"",E=h.useMemo(()=>k?Ie(v,k):null,[k,v]),z=v.length,$=Math.max(0,Math.ceil(z/S)-1),Ce=d?.size??0,H=i.length+1+(p?1:0),Z=(e,n)=>{const s=d?.has(e),r=te?.({wellId:e,row:n,isSelected:!!s});return t.jsxs(f.TableRow,{...r,children:[p?t.jsx(f.TableCell,{className:"w-10",children:t.jsx(J.Checkbox,{checked:!!s,onCheckedChange:()=>de(e),"aria-label":`Select ${e}`})}):null,t.jsx(f.TableCell,{className:"font-semibold",children:e}),i.map(l=>t.jsx(f.TableCell,{style:l.minWidth?{minWidth:l.minWidth}:void 0,children:ge(l,e,n)},l.id??l.field??l.header))]},e)},U=e=>{oe(n=>{const s=new Set(n);return s.has(e)?s.delete(e):s.add(e),s})},Se=k?i.find(n=>n.field===k)?.header??k:"";return t.jsxs("div",{"data-slot":"well-manifest-table",className:I.cn("flex flex-col gap-2",ne),children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx(A.Button,{variant:"outline",size:"sm",onClick:()=>se(e=>!e),children:F?"Hide empty wells":"Show all wells"}),q?t.jsx(ve.ManifestFilterPopover,{columns:ce,filters:M,onFiltersChange:le}):null,D?t.jsxs("div",{className:"inline-flex items-center gap-1.5",children:[t.jsx(T.Layers,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}),t.jsxs(u.Select,{value:R||"__none",onValueChange:e=>ae(e==="__none"?"":e),children:[t.jsx(u.SelectTrigger,{size:"sm",className:"h-7 min-w-40","aria-label":"Group by",children:t.jsx(u.SelectValue,{placeholder:"Group by…"})}),t.jsxs(u.SelectContent,{children:[t.jsx(u.SelectItem,{value:"__none",children:"No grouping"}),je.map(e=>t.jsx(u.SelectItem,{value:e.field??"",children:e.header},e.id??e.field))]})]})]}):null,t.jsxs("span",{className:"text-xs text-muted-foreground",children:[z," rows · ",Ce," selected"]})]}),t.jsx(P.TooltipProvider,{children:t.jsxs(f.Table,{"data-density":"default",children:[t.jsx(f.TableHeader,{children:t.jsxs(f.TableRow,{children:[p?t.jsx(f.TableHead,{className:"w-10 text-center",children:t.jsxs("span",{className:"inline-flex items-center justify-center text-muted-foreground [&_svg]:size-3.5",children:[t.jsx(T.Check,{"aria-hidden":!0}),t.jsx("span",{className:"sr-only",children:"Selected"})]})}):null,t.jsx(f.TableHead,{style:{minWidth:60},children:"Well"}),i.map(e=>t.jsx(f.TableHead,{style:e.minWidth?{minWidth:e.minWidth}:void 0,children:be(e)},e.id??e.field??e.header))]})}),t.jsxs(f.TableBody,{children:[E?E.map(e=>{const n=ie.has(e.key);return t.jsxs(h.Fragment,{children:[t.jsx(f.TableRow,{className:"cursor-pointer bg-muted/40",onClick:()=>U(e.key),onKeyDown:s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),U(e.key))},role:"button",tabIndex:0,"aria-expanded":!n,children:t.jsx(f.TableCell,{colSpan:H,className:"py-1.5",children:t.jsxs("div",{className:"flex items-center gap-2 text-xs font-medium",children:[n?t.jsx(T.ChevronRight,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}):t.jsx(T.ChevronDown,{"aria-hidden":!0,className:"size-3.5 text-muted-foreground"}),t.jsxs("span",{children:[Se,": ",e.key]}),t.jsxs("span",{className:"text-muted-foreground",children:["(",e.rows.length," ",e.rows.length===1?"row":"rows",")"]})]})})}),n?null:e.rows.map(({id:s,row:r})=>Z(s,r))]},e.key)}):B.map(({id:e,row:n})=>Z(e,n)),(E?E.length===0:B.length===0)?t.jsx(f.TableRow,{children:t.jsx(f.TableCell,{colSpan:H,className:"text-xs text-muted-foreground",children:"No rows. Paint wells on the plate."})}):null]})]})}),E?null:t.jsxs("div",{className:"flex items-center justify-end gap-3 text-xs text-muted-foreground",children:[t.jsx("span",{className:"text-muted-foreground",children:"Rows per page"}),t.jsxs(u.Select,{value:String(S),onValueChange:e=>{re(parseInt(e,10)),_(0)},children:[t.jsx(u.SelectTrigger,{size:"sm",className:"h-7 w-18","aria-label":"Rows per page",children:t.jsx(u.SelectValue,{})}),t.jsx(u.SelectContent,{children:ee.map(e=>t.jsx(u.SelectItem,{value:String(e),children:e},e))})]}),t.jsx("span",{children:z===0?"0 of 0":`${w*S+1}–${Math.min((w+1)*S,z)} of ${z}`}),t.jsx(A.Button,{variant:"outline",size:"sm",disabled:w===0,onClick:()=>_(e=>Math.max(0,e-1)),children:"Prev"}),t.jsx(A.Button,{variant:"outline",size:"sm",disabled:w>=$,onClick:()=>_(e=>Math.min($,e+1)),children:"Next"})]})]})}exports.WellManifestTable=De;
2
2
  //# sourceMappingURL=WellManifestTable.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"WellManifestTable.cjs","sources":["../../../../src/components/composed/PlateMapEditor/WellManifestTable.tsx"],"sourcesContent":["import { ArrowDownToLine, Check, ChevronDown, ChevronRight, Layers } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { ManifestFilterPopover } from \"./ManifestFilterPopover\";\n\nimport type { WellColumn, WellField, WellId, WellRecord, WellSelectOption } from \"./types\";\nimport type { FilterColumnConfig, FilterCondition } from \"@/components/ui/data-table/data-table\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n Combobox,\n ComboboxChip,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxItem,\n ComboboxList,\n ComboboxValue,\n useComboboxAnchor,\n} from \"@/components/ui/combobox\";\nimport { applyFilterCondition } from \"@/components/ui/data-table/data-table\";\nimport { Input } from \"@/components/ui/input\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"@/components/ui/table\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nfunction MultiSelectCell({\n ariaLabel,\n value,\n options,\n placeholder,\n onChange,\n}: {\n ariaLabel: string;\n value: string[];\n options: WellSelectOption[];\n placeholder?: string;\n onChange: (next: string[]) => void;\n}) {\n const anchorRef = useComboboxAnchor();\n const labelByValue = React.useMemo(() => {\n const m = new Map<string, string>();\n options.forEach((o) => m.set(o.value, o.label));\n return m;\n }, [options]);\n\n return (\n <Combobox multiple items={options.map((o) => o.value)} value={value} onValueChange={onChange}>\n <ComboboxChips ref={anchorRef} className={cn(\"min-h-7 w-full py-0.5\", CELL_EDITOR_CLASS)}>\n <ComboboxValue>\n {(items: string[]) =>\n items.map((item) => <ComboboxChip key={item}>{labelByValue.get(item) ?? item}</ComboboxChip>)\n }\n </ComboboxValue>\n <ComboboxChipsInput aria-label={ariaLabel} placeholder={placeholder ?? \"Select…\"} />\n </ComboboxChips>\n <ComboboxContent anchor={anchorRef}>\n <ComboboxEmpty>No options.</ComboboxEmpty>\n <ComboboxList aria-label={ariaLabel}>\n {(item: string) => (\n <ComboboxItem key={item} value={item}>\n {labelByValue.get(item) ?? item}\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n );\n}\n\n/**\n * Cell editors render borderless by default so the table reads flat. The\n * underlying primitives keep their `focus-visible` / `focus-within` rings, so\n * an outline only appears while the user is actively editing the cell.\n */\nconst CELL_EDITOR_CLASS = \"border-transparent shadow-none hover:border-input/40\";\n\nconst PAGE_SIZE_SMALL = 25;\nconst PAGE_SIZE_MEDIUM = 50;\nconst PAGE_SIZE_LARGE = 100;\nconst DEFAULT_PAGE_SIZE = PAGE_SIZE_SMALL;\nconst DEFAULT_PAGE_SIZE_OPTIONS: number[] = [PAGE_SIZE_SMALL, PAGE_SIZE_MEDIUM, PAGE_SIZE_LARGE];\n\nfunction hasFillValue(value: unknown): boolean {\n return value !== undefined && value !== null && value !== \"\";\n}\n\nconst INPUT_TYPE_BY_KIND: Record<string, string> = {\n number: \"number\",\n integer: \"number\",\n date: \"date\",\n datetime: \"datetime-local\",\n time: \"time\",\n};\n\nfunction resolveInputType(kind: string): string {\n return INPUT_TYPE_BY_KIND[kind] ?? \"text\";\n}\n\nfunction parseInputValue(kind: string, raw: string): unknown {\n if (raw === \"\") return undefined;\n if (kind === \"number\") {\n const num = parseFloat(raw);\n return Number.isFinite(num) ? num : raw;\n }\n if (kind === \"integer\") {\n const num = parseInt(raw, 10);\n return Number.isFinite(num) ? num : raw;\n }\n return raw;\n}\n\nexport interface WellManifestTableRowContext<T extends WellRecord = WellRecord> {\n wellId: WellId;\n row: T;\n isSelected: boolean;\n}\n\nexport interface WellManifestTableProps<T extends WellRecord = WellRecord> {\n values: Map<WellId, T>;\n columns: WellColumn<T>[];\n /**\n * Field schema. If a column has `field` matching a `select`-kind field, a\n * Select cell renders automatically with that field's options.\n */\n fields?: WellField<T>[];\n selection?: Set<WellId>;\n onSelectionChange?: (next: Set<WellId>) => void;\n onChange: (next: Map<WellId, T>) => void;\n /** Builds an empty record for a freshly-created row. */\n emptyEntry: (id: WellId) => T;\n /** Filter that controls which empty rows surface. Defaults to `false`. */\n isPopulated?: (row: T) => boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n /** Adds a column header action that copies the first non-empty value downward. */\n enableFillDown?: boolean;\n /**\n * Extra props spread onto each `<tr>` — typically used to attach a DnD\n * library's `setNodeRef`, listeners, and data attributes so rows can act as\n * drag sources. The kit stays DnD-library-agnostic.\n */\n rowProps?: (ctx: WellManifestTableRowContext<T>) => React.ComponentProps<\"tr\"> | undefined;\n /** Enables an inline filter popover above the table. Defaults to false. */\n filterable?: boolean;\n /**\n * Optional override of filterable column configs. When omitted, every column\n * with a `field` becomes filterable using the default operator set from the\n * shared data-table filter system.\n */\n filterColumns?: FilterColumnConfig[];\n /** Enables an inline group-by selector. Defaults to false. */\n groupable?: boolean;\n className?: string;\n}\n\ninterface GroupedRow<T> {\n key: string;\n rows: Array<{ id: WellId; row: T }>;\n}\n\nfunction groupRowsBy<T extends WellRecord>(rows: Array<{ id: WellId; row: T }>, field: string): GroupedRow<T>[] {\n const map = new Map<string, GroupedRow<T>>();\n for (const entry of rows) {\n const raw = (entry.row as Record<string, unknown>)[field];\n const key = raw === undefined || raw === null || raw === \"\" ? \"(blank)\" : String(raw);\n const existing = map.get(key);\n if (existing) existing.rows.push(entry);\n else map.set(key, { key, rows: [entry] });\n }\n return [...map.values()];\n}\n\nfunction inferFilterColumns<T extends WellRecord>(columns: WellColumn<T>[]): FilterColumnConfig[] {\n return columns.filter((col) => !!col.field).map((col) => ({ columnId: col.field as string, label: col.header }));\n}\n\nexport function WellManifestTable<T extends WellRecord = WellRecord>({\n values,\n columns,\n fields,\n selection,\n onSelectionChange,\n onChange,\n emptyEntry,\n isPopulated,\n pageSize: initialPageSize = DEFAULT_PAGE_SIZE,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n enableFillDown = true,\n rowProps,\n filterable = false,\n filterColumns,\n groupable = false,\n className,\n}: WellManifestTableProps<T>) {\n const [showAll, setShowAll] = React.useState(false);\n const [page, setPage] = React.useState(0);\n const [pageSize, setPageSize] = React.useState(initialPageSize);\n const [filters, setFilters] = React.useState<FilterCondition[]>([]);\n const [groupByField, setGroupByField] = React.useState<string>(\"\");\n const [collapsedGroups, setCollapsedGroups] = React.useState<Set<string>>(new Set());\n\n React.useEffect(() => {\n setPage(0);\n }, [showAll]);\n\n const fieldByKey = React.useMemo(() => {\n const m = new Map<string, WellField<T>>();\n (fields ?? []).forEach((f) => m.set(f.key, f));\n return m;\n }, [fields]);\n\n const resolvedFilterColumns = React.useMemo<FilterColumnConfig[]>(\n () => filterColumns ?? inferFilterColumns(columns),\n [columns, filterColumns],\n );\n\n const rows = React.useMemo(() => {\n const arr = [...values.entries()].map(([id, row]) => ({\n id,\n row,\n }));\n let filtered = arr;\n if (!showAll && isPopulated) {\n filtered = arr.filter((r) => isPopulated(r.row));\n }\n if (filterable && filters.length > 0) {\n filtered = filtered.filter((entry) => {\n const record = entry.row as Record<string, unknown>;\n return filters.every((condition) => {\n const cellRaw = record[condition.columnId];\n const cellValue = cellRaw === undefined || cellRaw === null ? \"\" : String(cellRaw);\n return applyFilterCondition(cellValue, condition.operator, condition.value);\n });\n });\n }\n if (selection && selection.size > 0) {\n const have = new Set(filtered.map((r) => r.id));\n selection.forEach((p) => {\n if (!have.has(p) && !values.has(p)) {\n filtered = [...filtered, { id: p, row: emptyEntry(p) }];\n }\n });\n }\n return filtered.sort((a, b) => a.id.localeCompare(b.id));\n }, [values, showAll, isPopulated, selection, emptyEntry, filterable, filters]);\n\n React.useEffect(() => {\n setPage(0);\n }, [filters]);\n\n const pagedRows = React.useMemo(\n () => rows.slice(page * pageSize, page * pageSize + pageSize),\n [rows, page, pageSize],\n );\n\n const updateRow = (wellId: WellId, patch: Partial<T>) => {\n const next = new Map(values);\n const cur = next.get(wellId) ?? emptyEntry(wellId);\n next.set(wellId, { ...cur, ...patch });\n onChange(next);\n };\n\n const toggleSelect = (wellId: WellId) => {\n if (!onSelectionChange) return;\n const s = new Set(selection ?? []);\n if (s.has(wellId)) {\n s.delete(wellId);\n } else {\n s.add(wellId);\n }\n onSelectionChange(s);\n };\n\n const getFillDownPlan = (col: WellColumn<T>) => {\n if (!col.field) return null;\n\n const selectionActive = !!selection && selection.size > 0;\n const groupingActive = groupable && !!groupByField;\n const sourceRows = selectionActive\n ? rows.filter(({ id }) => selection.has(id))\n : groupingActive\n ? rows\n : pagedRows;\n const sourceIndex = sourceRows.findIndex(({ row }) => hasFillValue(row[col.field!]));\n if (sourceIndex < 0) return null;\n\n const source = sourceRows[sourceIndex];\n const targets = selectionActive\n ? sourceRows.filter(({ id }) => id !== source.id)\n : sourceRows.slice(sourceIndex + 1);\n\n return {\n field: col.field,\n source,\n targets,\n value: source.row[col.field],\n };\n };\n\n const fillColumnDown = (col: WellColumn<T>) => {\n const plan = getFillDownPlan(col);\n if (!plan || plan.targets.length === 0) return;\n\n const next = new Map(values);\n plan.targets.forEach(({ id }) => {\n const cur = next.get(id) ?? emptyEntry(id);\n next.set(id, { ...cur, [plan.field]: plan.value } as T);\n });\n onChange(next);\n };\n\n const renderSelectCellEditable = (\n field: WellField<T>,\n fieldKey: keyof T & string,\n value: unknown,\n wellId: WellId,\n ariaLabel: string,\n ) => (\n <Select\n value={(value as string | undefined) ?? \"\"}\n onValueChange={(v) => updateRow(wellId, { [fieldKey]: v } as Partial<T>)}\n >\n <SelectTrigger size=\"sm\" className={cn(\"h-7 w-full\", CELL_EDITOR_CLASS)} aria-label={ariaLabel}>\n <SelectValue placeholder={field.placeholder ?? \"Select…\"} />\n </SelectTrigger>\n <SelectContent>\n {(field.options ?? []).map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n <span className=\"inline-flex items-center gap-2\">\n {opt.swatch ? (\n <span\n className=\"inline-block h-2.5 w-2.5 rounded-sm border border-foreground/20\"\n style={{ backgroundColor: opt.swatch }}\n aria-hidden\n />\n ) : null}\n {opt.label}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n\n const renderBooleanCellEditable = (\n field: WellField<T>,\n fieldKey: keyof T & string,\n value: unknown,\n wellId: WellId,\n ariaLabel: string,\n ) => {\n const checked = !!value;\n if (field.boolStyle === \"switch\") {\n return (\n <Switch\n aria-label={ariaLabel}\n checked={checked}\n onCheckedChange={(c) => updateRow(wellId, { [fieldKey]: c } as Partial<T>)}\n />\n );\n }\n return (\n <Checkbox\n aria-label={ariaLabel}\n checked={checked}\n onCheckedChange={(c) => updateRow(wellId, { [fieldKey]: c === true } as Partial<T>)}\n />\n );\n };\n\n const renderInputCellEditable = (\n field: WellField<T>,\n fieldKey: keyof T & string,\n value: unknown,\n wellId: WellId,\n ariaLabel: string,\n ) => (\n <Input\n type={resolveInputType(field.kind)}\n step={field.kind === \"integer\" ? 1 : undefined}\n placeholder={field.placeholder}\n aria-label={ariaLabel}\n className={cn(\"h-7\", CELL_EDITOR_CLASS)}\n value={(value as string | number | undefined) ?? \"\"}\n onChange={(e) => updateRow(wellId, { [fieldKey]: parseInputValue(field.kind, e.target.value) } as Partial<T>)}\n />\n );\n\n const renderEditableCell = (field: WellField<T>, col: WellColumn<T>, wellId: WellId, row: T) => {\n const fieldKey = col.field!;\n const value = row[fieldKey];\n const ariaLabel = `${field.label} for ${wellId}`;\n\n if (field.kind === \"select\") return renderSelectCellEditable(field, fieldKey, value, wellId, ariaLabel);\n if (field.kind === \"multiselect\") {\n const current = Array.isArray(value) ? (value as string[]) : [];\n return (\n <MultiSelectCell\n ariaLabel={ariaLabel}\n value={current}\n options={field.options ?? []}\n placeholder={field.placeholder}\n onChange={(next) => updateRow(wellId, { [fieldKey]: next.length === 0 ? undefined : next } as Partial<T>)}\n />\n );\n }\n if (field.kind === \"boolean\") return renderBooleanCellEditable(field, fieldKey, value, wellId, ariaLabel);\n return renderInputCellEditable(field, fieldKey, value, wellId, ariaLabel);\n };\n\n const renderReadonlyCell = (field: WellField<T> | undefined, value: unknown) => {\n if (field?.kind === \"select\") {\n const option = (field.options ?? []).find((opt) => opt.value === value);\n if (!option) {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n\n return (\n <Badge variant=\"secondary\">\n {option.swatch ? (\n <span\n className=\"size-2 rounded-sm border border-foreground/20\"\n style={{ backgroundColor: option.swatch }}\n aria-hidden\n />\n ) : null}\n {option.label}\n </Badge>\n );\n }\n\n if (field?.kind === \"multiselect\") {\n const arr = Array.isArray(value) ? (value as string[]) : [];\n if (arr.length === 0) {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n return (\n <div className=\"flex flex-wrap gap-1\">\n {arr.map((v) => {\n const opt = (field.options ?? []).find((o) => o.value === v);\n return (\n <Badge key={v} variant=\"secondary\">\n {opt?.swatch ? (\n <span\n className=\"size-2 rounded-sm border border-foreground/20\"\n style={{ backgroundColor: opt.swatch }}\n aria-hidden\n />\n ) : null}\n {opt?.label ?? v}\n </Badge>\n );\n })}\n </div>\n );\n }\n\n if (field?.kind === \"boolean\") {\n return value ? (\n <Check aria-label=\"Yes\" className=\"size-4 text-foreground\" />\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n );\n }\n\n if (!hasFillValue(value)) {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n\n return String(value);\n };\n\n const renderCell = (col: WellColumn<T>, wellId: WellId, row: T) => {\n if (col.render) {\n return col.render({\n row,\n wellId,\n update: (patch) => updateRow(wellId, patch),\n });\n }\n if (!col.field) return null;\n\n const field = fieldByKey.get(col.field);\n const value = row[col.field];\n\n if (field?.editableInTable && field.kind !== \"custom\") {\n return renderEditableCell(field, col, wellId, row);\n }\n\n return renderReadonlyCell(field, value);\n };\n\n const renderColumnHeader = (col: WellColumn<T>) => {\n const matchingField = col.field ? fieldByKey.get(col.field) : undefined;\n const icon = col.icon ?? matchingField?.icon;\n const fillPlan = enableFillDown ? getFillDownPlan(col) : null;\n const canFillDown = !!fillPlan && fillPlan.targets.length > 0;\n const fillHint =\n selection && selection.size > 0\n ? `Fill selected ${col.header} cells from the first selected value`\n : `Fill visible ${col.header} cells downward from the first value`;\n return (\n <span className=\"flex min-w-0 items-center justify-between gap-2\">\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n {icon ? <span className=\"inline-flex text-muted-foreground [&_svg]:size-3.5\">{icon}</span> : null}\n <span className=\"truncate\">{col.header}</span>\n </span>\n {enableFillDown && col.field ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"-mr-1 text-muted-foreground hover:text-foreground\"\n disabled={!canFillDown}\n aria-label={`Fill down ${col.header}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n fillColumnDown(col);\n }}\n >\n <ArrowDownToLine />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{fillHint}</TooltipContent>\n </Tooltip>\n ) : null}\n </span>\n );\n };\n\n const groupableColumns = React.useMemo(() => columns.filter((col) => !!col.field), [columns]);\n const activeGroupField = groupable && groupByField ? groupByField : \"\";\n const grouped = React.useMemo(\n () => (activeGroupField ? groupRowsBy(rows, activeGroupField) : null),\n [activeGroupField, rows],\n );\n\n const totalRows = rows.length;\n const lastPage = Math.max(0, Math.ceil(totalRows / pageSize) - 1);\n const selSize = selection?.size ?? 0;\n const totalColSpan = columns.length + 1 + (onSelectionChange ? 1 : 0);\n\n const renderDataRow = (id: WellId, row: T) => {\n const isSelected = selection?.has(id);\n const extra = rowProps?.({ wellId: id, row, isSelected: !!isSelected });\n return (\n <TableRow key={id} {...extra}>\n {onSelectionChange ? (\n <TableCell className=\"w-10\">\n <Checkbox checked={!!isSelected} onCheckedChange={() => toggleSelect(id)} aria-label={`Select ${id}`} />\n </TableCell>\n ) : null}\n <TableCell className=\"font-semibold\">{id}</TableCell>\n {columns.map((col) => (\n <TableCell\n key={col.id ?? col.field ?? col.header}\n style={col.minWidth ? { minWidth: col.minWidth } : undefined}\n >\n {renderCell(col, id, row)}\n </TableCell>\n ))}\n </TableRow>\n );\n };\n\n const toggleGroup = (key: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n const groupHeaderLabel = (() => {\n if (!activeGroupField) return \"\";\n const col = columns.find((c) => c.field === activeGroupField);\n return col?.header ?? activeGroupField;\n })();\n\n return (\n <div data-slot=\"well-manifest-table\" className={cn(\"flex flex-col gap-2\", className)}>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowAll((v) => !v)}>\n {showAll ? \"Hide empty wells\" : \"Show all wells\"}\n </Button>\n {filterable ? (\n <ManifestFilterPopover columns={resolvedFilterColumns} filters={filters} onFiltersChange={setFilters} />\n ) : null}\n {groupable ? (\n <div className=\"inline-flex items-center gap-1.5\">\n <Layers aria-hidden className=\"size-3.5 text-muted-foreground\" />\n <Select value={groupByField || \"__none\"} onValueChange={(v) => setGroupByField(v === \"__none\" ? \"\" : v)}>\n <SelectTrigger size=\"sm\" className=\"h-7 min-w-40\" aria-label=\"Group by\">\n <SelectValue placeholder=\"Group by…\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__none\">No grouping</SelectItem>\n {groupableColumns.map((col) => (\n <SelectItem key={col.id ?? col.field} value={col.field ?? \"\"}>\n {col.header}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n <span className=\"text-xs text-muted-foreground\">\n {totalRows} rows · {selSize} selected\n </span>\n </div>\n\n <TooltipProvider>\n <Table data-density=\"default\">\n <TableHeader>\n <TableRow>\n {onSelectionChange ? (\n <TableHead className=\"w-10 text-center\">\n <span className=\"inline-flex items-center justify-center text-muted-foreground [&_svg]:size-3.5\">\n <Check aria-hidden />\n <span className=\"sr-only\">Selected</span>\n </span>\n </TableHead>\n ) : null}\n <TableHead style={{ minWidth: 60 }}>Well</TableHead>\n {columns.map((col) => (\n <TableHead\n key={col.id ?? col.field ?? col.header}\n style={col.minWidth ? { minWidth: col.minWidth } : undefined}\n >\n {renderColumnHeader(col)}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {grouped\n ? grouped.map((group) => {\n const isCollapsed = collapsedGroups.has(group.key);\n return (\n <React.Fragment key={group.key}>\n <TableRow\n className=\"cursor-pointer bg-muted/40\"\n onClick={() => toggleGroup(group.key)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleGroup(group.key);\n }\n }}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!isCollapsed}\n >\n <TableCell colSpan={totalColSpan} className=\"py-1.5\">\n <div className=\"flex items-center gap-2 text-xs font-medium\">\n {isCollapsed ? (\n <ChevronRight aria-hidden className=\"size-3.5 text-muted-foreground\" />\n ) : (\n <ChevronDown aria-hidden className=\"size-3.5 text-muted-foreground\" />\n )}\n <span>\n {groupHeaderLabel}: {group.key}\n </span>\n <span className=\"text-muted-foreground\">\n ({group.rows.length} {group.rows.length === 1 ? \"row\" : \"rows\"})\n </span>\n </div>\n </TableCell>\n </TableRow>\n {isCollapsed ? null : group.rows.map(({ id, row }) => renderDataRow(id, row))}\n </React.Fragment>\n );\n })\n : pagedRows.map(({ id, row }) => renderDataRow(id, row))}\n {(grouped ? grouped.length === 0 : pagedRows.length === 0) ? (\n <TableRow>\n <TableCell colSpan={totalColSpan} className=\"text-xs text-muted-foreground\">\n No rows. Paint wells on the plate.\n </TableCell>\n </TableRow>\n ) : null}\n </TableBody>\n </Table>\n </TooltipProvider>\n\n {grouped ? null : (\n <div className=\"flex items-center justify-end gap-3 text-xs text-muted-foreground\">\n <span className=\"text-muted-foreground\">Rows per page</span>\n <Select\n value={String(pageSize)}\n onValueChange={(v) => {\n setPageSize(parseInt(v, 10));\n setPage(0);\n }}\n >\n <SelectTrigger size=\"sm\" className=\"h-7 w-18\" aria-label=\"Rows per page\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span>\n {totalRows === 0\n ? \"0 of 0\"\n : `${page * pageSize + 1}–${Math.min((page + 1) * pageSize, totalRows)} of ${totalRows}`}\n </span>\n <Button variant=\"outline\" size=\"sm\" disabled={page === 0} onClick={() => setPage((p) => Math.max(0, p - 1))}>\n Prev\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page >= lastPage}\n onClick={() => setPage((p) => Math.min(lastPage, p + 1))}\n >\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n"],"names":["MultiSelectCell","ariaLabel","value","options","placeholder","onChange","anchorRef","useComboboxAnchor","labelByValue","React","m","o","jsxs","Combobox","ComboboxChips","cn","CELL_EDITOR_CLASS","jsx","ComboboxValue","items","item","ComboboxChip","ComboboxChipsInput","ComboboxContent","ComboboxEmpty","ComboboxList","ComboboxItem","PAGE_SIZE_SMALL","PAGE_SIZE_MEDIUM","PAGE_SIZE_LARGE","DEFAULT_PAGE_SIZE","DEFAULT_PAGE_SIZE_OPTIONS","hasFillValue","INPUT_TYPE_BY_KIND","resolveInputType","kind","parseInputValue","raw","num","groupRowsBy","rows","field","map","entry","key","existing","inferFilterColumns","columns","col","WellManifestTable","values","fields","selection","onSelectionChange","emptyEntry","isPopulated","initialPageSize","pageSizeOptions","enableFillDown","rowProps","filterable","filterColumns","groupable","className","showAll","setShowAll","page","setPage","pageSize","setPageSize","filters","setFilters","groupByField","setGroupByField","collapsedGroups","setCollapsedGroups","fieldByKey","f","resolvedFilterColumns","arr","id","row","filtered","r","record","condition","cellRaw","cellValue","applyFilterCondition","have","p","a","b","pagedRows","updateRow","wellId","patch","next","cur","toggleSelect","s","getFillDownPlan","selectionActive","sourceRows","sourceIndex","source","targets","fillColumnDown","plan","renderSelectCellEditable","fieldKey","Select","v","SelectTrigger","SelectValue","SelectContent","opt","SelectItem","renderBooleanCellEditable","checked","Switch","c","Checkbox","renderInputCellEditable","Input","e","renderEditableCell","current","renderReadonlyCell","option","Badge","Check","renderCell","renderColumnHeader","matchingField","icon","fillPlan","canFillDown","fillHint","Tooltip","TooltipTrigger","Button","ArrowDownToLine","TooltipContent","groupableColumns","activeGroupField","grouped","totalRows","lastPage","selSize","totalColSpan","renderDataRow","isSelected","extra","TableRow","TableCell","toggleGroup","prev","groupHeaderLabel","ManifestFilterPopover","Layers","TooltipProvider","Table","TableHeader","TableHead","TableBody","group","isCollapsed","ChevronRight","ChevronDown"],"mappings":"42BA+BA,SAASA,GAAgB,CACvB,UAAAC,EACA,MAAAC,EACA,QAAAC,EACA,YAAAC,EACA,SAAAC,CACF,EAMG,CACD,MAAMC,EAAYC,EAAAA,kBAAA,EACZC,EAAeC,EAAM,QAAQ,IAAM,CACvC,MAAMC,MAAQ,IACd,OAAAP,EAAQ,QAASQ,GAAMD,EAAE,IAAIC,EAAE,MAAOA,EAAE,KAAK,CAAC,EACvCD,CACT,EAAG,CAACP,CAAO,CAAC,EAEZ,OACES,EAAAA,KAACC,EAAAA,SAAA,CAAS,SAAQ,GAAC,MAAOV,EAAQ,IAAKQ,GAAMA,EAAE,KAAK,EAAG,MAAAT,EAAc,cAAeG,EAClF,SAAA,CAAAO,OAACE,EAAAA,eAAc,IAAKR,EAAW,UAAWS,EAAAA,GAAG,wBAAyBC,CAAiB,EACrF,SAAA,CAAAC,MAACC,EAAAA,eACE,SAACC,GACAA,EAAM,IAAKC,GAASH,EAAAA,IAACI,EAAAA,aAAA,CAAyB,SAAAb,EAAa,IAAIY,CAAI,GAAKA,CAAA,EAAjCA,CAAsC,CAAe,EAEhG,QACCE,EAAAA,mBAAA,CAAmB,aAAYrB,EAAW,YAAaG,GAAe,SAAA,CAAW,CAAA,EACpF,EACAQ,EAAAA,KAACW,EAAAA,gBAAA,CAAgB,OAAQjB,EACvB,SAAA,CAAAW,EAAAA,IAACO,EAAAA,eAAc,SAAA,aAAA,CAAW,QACzBC,EAAAA,aAAA,CAAa,aAAYxB,EACvB,SAACmB,GACAH,EAAAA,IAACS,EAAAA,aAAA,CAAwB,MAAON,EAC7B,WAAa,IAAIA,CAAI,GAAKA,GADVA,CAEnB,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAOA,MAAMJ,EAAoB,uDAEpBW,EAAkB,GAClBC,GAAmB,GACnBC,GAAkB,IAClBC,GAAoBH,EACpBI,GAAsC,CAACJ,EAAiBC,GAAkBC,EAAe,EAE/F,SAASG,EAAa9B,EAAyB,CAC7C,OAA8BA,GAAU,MAAQA,IAAU,EAC5D,CAEA,MAAM+B,GAA6C,CACjD,OAAQ,SACR,QAAS,SACT,KAAM,OACN,SAAU,iBACV,KAAM,MACR,EAEA,SAASC,GAAiBC,EAAsB,CAC9C,OAAOF,GAAmBE,CAAI,GAAK,MACrC,CAEA,SAASC,GAAgBD,EAAcE,EAAsB,CAC3D,GAAIA,IAAQ,GACZ,IAAIF,IAAS,SAAU,CACrB,MAAMG,EAAM,WAAWD,CAAG,EAC1B,OAAO,OAAO,SAASC,CAAG,EAAIA,EAAMD,CACtC,CACA,GAAIF,IAAS,UAAW,CACtB,MAAMG,EAAM,SAASD,EAAK,EAAE,EAC5B,OAAO,OAAO,SAASC,CAAG,EAAIA,EAAMD,CACtC,CACA,OAAOA,EACT,CAmDA,SAASE,GAAkCC,EAAqCC,EAAgC,CAC9G,MAAMC,MAAU,IAChB,UAAWC,KAASH,EAAM,CACxB,MAAMH,EAAOM,EAAM,IAAgCF,CAAK,EAClDG,EAA2BP,GAAQ,MAAQA,IAAQ,GAAK,UAAY,OAAOA,CAAG,EAC9EQ,EAAWH,EAAI,IAAIE,CAAG,EACxBC,EAAUA,EAAS,KAAK,KAAKF,CAAK,EACjCD,EAAI,IAAIE,EAAK,CAAE,IAAAA,EAAK,KAAM,CAACD,CAAK,EAAG,CAC1C,CACA,MAAO,CAAC,GAAGD,EAAI,QAAQ,CACzB,CAEA,SAASI,GAAyCC,EAAgD,CAChG,OAAOA,EAAQ,OAAQC,GAAQ,CAAC,CAACA,EAAI,KAAK,EAAE,IAAKA,IAAS,CAAE,SAAUA,EAAI,MAAiB,MAAOA,EAAI,QAAS,CACjH,CAEO,SAASC,GAAqD,CACnE,OAAAC,EACA,QAAAH,EACA,OAAAI,EACA,UAAAC,EACA,kBAAAC,EACA,SAAAhD,EACA,WAAAiD,EACA,YAAAC,EACA,SAAUC,EAAkB1B,GAC5B,gBAAA2B,GAAkB1B,GAClB,eAAA2B,EAAiB,GACjB,SAAAC,GACA,WAAAC,EAAa,GACb,cAAAC,EACA,UAAAC,EAAY,GACZ,UAAAC,EACF,EAA8B,CAC5B,KAAM,CAACC,EAASC,EAAU,EAAIxD,EAAM,SAAS,EAAK,EAC5C,CAACyD,EAAMC,CAAO,EAAI1D,EAAM,SAAS,CAAC,EAClC,CAAC2D,EAAUC,EAAW,EAAI5D,EAAM,SAAS+C,CAAe,EACxD,CAACc,EAASC,EAAU,EAAI9D,EAAM,SAA4B,CAAA,CAAE,EAC5D,CAAC+D,EAAcC,EAAe,EAAIhE,EAAM,SAAiB,EAAE,EAC3D,CAACiE,GAAiBC,EAAkB,EAAIlE,EAAM,SAAsB,IAAI,GAAK,EAEnFA,EAAM,UAAU,IAAM,CACpB0D,EAAQ,CAAC,CACX,EAAG,CAACH,CAAO,CAAC,EAEZ,MAAMY,EAAanE,EAAM,QAAQ,IAAM,CACrC,MAAMC,MAAQ,IACd,OAACyC,GAAU,CAAA,GAAI,QAAS0B,GAAMnE,EAAE,IAAImE,EAAE,IAAKA,CAAC,CAAC,EACtCnE,CACT,EAAG,CAACyC,CAAM,CAAC,EAEL2B,GAAwBrE,EAAM,QAClC,IAAMoD,GAAiBf,GAAmBC,CAAO,EACjD,CAACA,EAASc,CAAa,CAAA,EAGnBrB,EAAO/B,EAAM,QAAQ,IAAM,CAC/B,MAAMsE,EAAM,CAAC,GAAG7B,EAAO,QAAA,CAAS,EAAE,IAAI,CAAC,CAAC8B,EAAIC,CAAG,KAAO,CACpD,GAAAD,EACA,IAAAC,CAAA,EACA,EACF,IAAIC,EAAWH,EAcf,GAbI,CAACf,GAAWT,IACd2B,EAAWH,EAAI,OAAQI,GAAM5B,EAAY4B,EAAE,GAAG,CAAC,GAE7CvB,GAAcU,EAAQ,OAAS,IACjCY,EAAWA,EAAS,OAAQvC,GAAU,CACpC,MAAMyC,EAASzC,EAAM,IACrB,OAAO2B,EAAQ,MAAOe,GAAc,CAClC,MAAMC,EAAUF,EAAOC,EAAU,QAAQ,EACnCE,EAAqCD,GAAY,KAAO,GAAK,OAAOA,CAAO,EACjF,OAAOE,GAAAA,qBAAqBD,EAAWF,EAAU,SAAUA,EAAU,KAAK,CAC5E,CAAC,CACH,CAAC,GAECjC,GAAaA,EAAU,KAAO,EAAG,CACnC,MAAMqC,EAAO,IAAI,IAAIP,EAAS,IAAK,GAAM,EAAE,EAAE,CAAC,EAC9C9B,EAAU,QAASsC,GAAM,CACnB,CAACD,EAAK,IAAIC,CAAC,GAAK,CAACxC,EAAO,IAAIwC,CAAC,IAC/BR,EAAW,CAAC,GAAGA,EAAU,CAAE,GAAIQ,EAAG,IAAKpC,EAAWoC,CAAC,EAAG,EAE1D,CAAC,CACH,CACA,OAAOR,EAAS,KAAK,CAACS,EAAGC,IAAMD,EAAE,GAAG,cAAcC,EAAE,EAAE,CAAC,CACzD,EAAG,CAAC1C,EAAQc,EAAST,EAAaH,EAAWE,EAAYM,EAAYU,CAAO,CAAC,EAE7E7D,EAAM,UAAU,IAAM,CACpB0D,EAAQ,CAAC,CACX,EAAG,CAACG,CAAO,CAAC,EAEZ,MAAMuB,EAAYpF,EAAM,QACtB,IAAM+B,EAAK,MAAM0B,EAAOE,EAAUF,EAAOE,EAAWA,CAAQ,EAC5D,CAAC5B,EAAM0B,EAAME,CAAQ,CAAA,EAGjB0B,EAAY,CAACC,EAAgBC,IAAsB,CACvD,MAAMC,EAAO,IAAI,IAAI/C,CAAM,EACrBgD,EAAMD,EAAK,IAAIF,CAAM,GAAKzC,EAAWyC,CAAM,EACjDE,EAAK,IAAIF,EAAQ,CAAE,GAAGG,EAAK,GAAGF,EAAO,EACrC3F,EAAS4F,CAAI,CACf,EAEME,GAAgBJ,GAAmB,CACvC,GAAI,CAAC1C,EAAmB,OACxB,MAAM+C,EAAI,IAAI,IAAIhD,GAAa,CAAA,CAAE,EAC7BgD,EAAE,IAAIL,CAAM,EACdK,EAAE,OAAOL,CAAM,EAEfK,EAAE,IAAIL,CAAM,EAEd1C,EAAkB+C,CAAC,CACrB,EAEMC,EAAmBrD,GAAuB,CAC9C,GAAI,CAACA,EAAI,MAAO,OAAO,KAEvB,MAAMsD,EAAkB,CAAC,CAAClD,GAAaA,EAAU,KAAO,EAElDmD,EAAaD,EACf9D,EAAK,OAAO,CAAC,CAAE,GAAAwC,CAAA,IAAS5B,EAAU,IAAI4B,CAAE,CAAC,EAFtBlB,GAAa,CAAC,CAACU,EAIhChC,EACAqD,EACAW,EAAcD,EAAW,UAAU,CAAC,CAAE,IAAAtB,KAAUjD,EAAaiD,EAAIjC,EAAI,KAAM,CAAC,CAAC,EACnF,GAAIwD,EAAc,EAAG,OAAO,KAE5B,MAAMC,EAASF,EAAWC,CAAW,EAC/BE,EAAUJ,EACZC,EAAW,OAAO,CAAC,CAAE,GAAAvB,CAAA,IAASA,IAAOyB,EAAO,EAAE,EAC9CF,EAAW,MAAMC,EAAc,CAAC,EAEpC,MAAO,CACL,MAAOxD,EAAI,MACX,OAAAyD,EACA,QAAAC,EACA,MAAOD,EAAO,IAAIzD,EAAI,KAAK,CAAA,CAE/B,EAEM2D,GAAkB3D,GAAuB,CAC7C,MAAM4D,EAAOP,EAAgBrD,CAAG,EAChC,GAAI,CAAC4D,GAAQA,EAAK,QAAQ,SAAW,EAAG,OAExC,MAAMX,EAAO,IAAI,IAAI/C,CAAM,EAC3B0D,EAAK,QAAQ,QAAQ,CAAC,CAAE,GAAA5B,KAAS,CAC/B,MAAMkB,EAAMD,EAAK,IAAIjB,CAAE,GAAK1B,EAAW0B,CAAE,EACzCiB,EAAK,IAAIjB,EAAI,CAAE,GAAGkB,EAAK,CAACU,EAAK,KAAK,EAAGA,EAAK,MAAY,CACxD,CAAC,EACDvG,EAAS4F,CAAI,CACf,EAEMY,GAA2B,CAC/BpE,EACAqE,EACA5G,EACA6F,EACA9F,IAEAW,EAAAA,KAACmG,EAAAA,OAAA,CACC,MAAQ7G,GAAgC,GACxC,cAAgB8G,GAAMlB,EAAUC,EAAQ,CAAE,CAACe,CAAQ,EAAGE,EAAiB,EAEvE,SAAA,CAAA/F,MAACgG,EAAAA,eAAc,KAAK,KAAK,UAAWlG,EAAAA,GAAG,aAAcC,CAAiB,EAAG,aAAYf,EACnF,eAACiH,EAAAA,YAAA,CAAY,YAAazE,EAAM,aAAe,UAAW,EAC5D,QACC0E,EAAAA,cAAA,CACG,UAAA1E,EAAM,SAAW,IAAI,IAAK2E,GAC1BnG,EAAAA,IAACoG,EAAAA,YAA2B,MAAOD,EAAI,MACrC,SAAAxG,OAAC,OAAA,CAAK,UAAU,iCACb,SAAA,CAAAwG,EAAI,OACHnG,EAAAA,IAAC,OAAA,CACC,UAAU,kEACV,MAAO,CAAE,gBAAiBmG,EAAI,MAAA,EAC9B,cAAW,EAAA,CAAA,EAEX,KACHA,EAAI,KAAA,CAAA,CACP,CAAA,EAVeA,EAAI,KAWrB,CACD,CAAA,CACH,CAAA,CAAA,CAAA,EAIEE,GAA4B,CAChC7E,EACAqE,EACA5G,EACA6F,EACA9F,IACG,CACH,MAAMsH,EAAU,CAAC,CAACrH,EAClB,OAAIuC,EAAM,YAAc,SAEpBxB,EAAAA,IAACuG,GAAAA,OAAA,CACC,aAAYvH,EACZ,QAAAsH,EACA,gBAAkBE,GAAM3B,EAAUC,EAAQ,CAAE,CAACe,CAAQ,EAAGW,CAAA,CAAiB,CAAA,CAAA,EAK7ExG,EAAAA,IAACyG,EAAAA,SAAA,CACC,aAAYzH,EACZ,QAAAsH,EACA,gBAAkBE,GAAM3B,EAAUC,EAAQ,CAAE,CAACe,CAAQ,EAAGW,IAAM,EAAA,CAAoB,CAAA,CAAA,CAGxF,EAEME,GAA0B,CAC9BlF,EACAqE,EACA5G,EACA6F,EACA9F,IAEAgB,EAAAA,IAAC2G,GAAAA,MAAA,CACC,KAAM1F,GAAiBO,EAAM,IAAI,EACjC,KAAMA,EAAM,OAAS,UAAY,EAAI,OACrC,YAAaA,EAAM,YACnB,aAAYxC,EACZ,UAAWc,EAAAA,GAAG,MAAOC,CAAiB,EACtC,MAAQd,GAAyC,GACjD,SAAW2H,GAAM/B,EAAUC,EAAQ,CAAE,CAACe,CAAQ,EAAG1E,GAAgBK,EAAM,KAAMoF,EAAE,OAAO,KAAK,EAAiB,CAAA,CAAA,EAI1GC,GAAqB,CAACrF,EAAqBO,EAAoB+C,EAAgBd,IAAW,CAC9F,MAAM6B,EAAW9D,EAAI,MACf9C,EAAQ+E,EAAI6B,CAAQ,EACpB7G,EAAY,GAAGwC,EAAM,KAAK,QAAQsD,CAAM,GAE9C,GAAItD,EAAM,OAAS,SAAU,OAAOoE,GAAyBpE,EAAOqE,EAAU5G,EAAO6F,EAAQ9F,CAAS,EACtG,GAAIwC,EAAM,OAAS,cAAe,CAChC,MAAMsF,EAAU,MAAM,QAAQ7H,CAAK,EAAKA,EAAqB,CAAA,EAC7D,OACEe,EAAAA,IAACjB,GAAA,CACC,UAAAC,EACA,MAAO8H,EACP,QAAStF,EAAM,SAAW,CAAA,EAC1B,YAAaA,EAAM,YACnB,SAAWwD,GAASH,EAAUC,EAAQ,CAAE,CAACe,CAAQ,EAAGb,EAAK,SAAW,EAAI,OAAYA,EAAoB,CAAA,CAAA,CAG9G,CACA,OAAIxD,EAAM,OAAS,UAAkB6E,GAA0B7E,EAAOqE,EAAU5G,EAAO6F,EAAQ9F,CAAS,EACjG0H,GAAwBlF,EAAOqE,EAAU5G,EAAO6F,EAAQ9F,CAAS,CAC1E,EAEM+H,GAAqB,CAACvF,EAAiCvC,IAAmB,CAC9E,GAAIuC,GAAO,OAAS,SAAU,CAC5B,MAAMwF,GAAUxF,EAAM,SAAW,CAAA,GAAI,KAAM2E,GAAQA,EAAI,QAAUlH,CAAK,EACtE,OAAK+H,EAKHrH,EAAAA,KAACsH,EAAAA,MAAA,CAAM,QAAQ,YACZ,SAAA,CAAAD,EAAO,OACNhH,EAAAA,IAAC,OAAA,CACC,UAAU,gDACV,MAAO,CAAE,gBAAiBgH,EAAO,MAAA,EACjC,cAAW,EAAA,CAAA,EAEX,KACHA,EAAO,KAAA,EACV,EAbOhH,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,IAAC,CAepD,CAEA,GAAIwB,GAAO,OAAS,cAAe,CACjC,MAAMsC,EAAM,MAAM,QAAQ7E,CAAK,EAAKA,EAAqB,CAAA,EACzD,OAAI6E,EAAI,SAAW,EACV9D,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,IAAC,QAG/C,MAAA,CAAI,UAAU,uBACZ,SAAA8D,EAAI,IAAKiC,GAAM,CACd,MAAMI,GAAO3E,EAAM,SAAW,CAAA,GAAI,KAAM9B,GAAMA,EAAE,QAAUqG,CAAC,EAC3D,OACEpG,EAAAA,KAACsH,EAAAA,MAAA,CAAc,QAAQ,YACpB,SAAA,CAAAd,GAAK,OACJnG,EAAAA,IAAC,OAAA,CACC,UAAU,gDACV,MAAO,CAAE,gBAAiBmG,EAAI,MAAA,EAC9B,cAAW,EAAA,CAAA,EAEX,KACHA,GAAK,OAASJ,CAAA,CAAA,EARLA,CASZ,CAEJ,CAAC,CAAA,CACH,CAEJ,CAEA,OAAIvE,GAAO,OAAS,UACXvC,EACLe,EAAAA,IAACkH,EAAAA,MAAA,CAAM,aAAW,MAAM,UAAU,wBAAA,CAAyB,EAE3DlH,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,IAAC,EAIxCe,EAAa9B,CAAK,EAIhB,OAAOA,CAAK,EAHVe,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,IAAC,CAIpD,EAEMmH,GAAa,CAACpF,EAAoB+C,EAAgBd,IAAW,CACjE,GAAIjC,EAAI,OACN,OAAOA,EAAI,OAAO,CAChB,IAAAiC,EACA,OAAAc,EACA,OAASC,GAAUF,EAAUC,EAAQC,CAAK,CAAA,CAC3C,EAEH,GAAI,CAAChD,EAAI,MAAO,OAAO,KAEvB,MAAMP,EAAQmC,EAAW,IAAI5B,EAAI,KAAK,EAChC9C,EAAQ+E,EAAIjC,EAAI,KAAK,EAE3B,OAAIP,GAAO,iBAAmBA,EAAM,OAAS,SACpCqF,GAAmBrF,EAAOO,EAAK+C,EAAQd,CAAG,EAG5C+C,GAAmBvF,EAAOvC,CAAK,CACxC,EAEMmI,GAAsBrF,GAAuB,CACjD,MAAMsF,EAAgBtF,EAAI,MAAQ4B,EAAW,IAAI5B,EAAI,KAAK,EAAI,OACxDuF,EAAOvF,EAAI,MAAQsF,GAAe,KAClCE,EAAW9E,EAAiB2C,EAAgBrD,CAAG,EAAI,KACnDyF,EAAc,CAAC,CAACD,GAAYA,EAAS,QAAQ,OAAS,EACtDE,EACJtF,GAAaA,EAAU,KAAO,EAC1B,iBAAiBJ,EAAI,MAAM,uCAC3B,gBAAgBA,EAAI,MAAM,uCAChC,OACEpC,EAAAA,KAAC,OAAA,CAAK,UAAU,kDACd,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,2CACb,SAAA,CAAA2H,EAAOtH,EAAAA,IAAC,OAAA,CAAK,UAAU,qDAAsD,WAAK,EAAU,KAC7FA,EAAAA,IAAC,OAAA,CAAK,UAAU,WAAY,WAAI,MAAA,CAAO,CAAA,EACzC,EACCyC,GAAkBV,EAAI,MACrBpC,EAAAA,KAAC+H,EAAAA,QAAA,CACC,SAAA,CAAA1H,EAAAA,IAAC2H,EAAAA,eAAA,CAAe,QAAO,GACrB,SAAA3H,EAAAA,IAAC4H,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,UACL,UAAU,oDACV,SAAU,CAACJ,EACX,aAAY,aAAazF,EAAI,MAAM,GACnC,QAAU6E,GAAM,CACdA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFlB,GAAe3D,CAAG,CACpB,EAEA,eAAC8F,EAAAA,gBAAA,CAAA,CAAgB,CAAA,CAAA,EAErB,EACA7H,EAAAA,IAAC8H,EAAAA,gBAAgB,SAAAL,CAAA,CAAS,CAAA,CAAA,CAC5B,EACE,IAAA,EACN,CAEJ,EAEMM,GAAmBvI,EAAM,QAAQ,IAAMsC,EAAQ,OAAQC,GAAQ,CAAC,CAACA,EAAI,KAAK,EAAG,CAACD,CAAO,CAAC,EACtFkG,EAAmBnF,GAAaU,EAAeA,EAAe,GAC9D0E,EAAUzI,EAAM,QACpB,IAAOwI,EAAmB1G,GAAYC,EAAMyG,CAAgB,EAAI,KAChE,CAACA,EAAkBzG,CAAI,CAAA,EAGnB2G,EAAY3G,EAAK,OACjB4G,EAAW,KAAK,IAAI,EAAG,KAAK,KAAKD,EAAY/E,CAAQ,EAAI,CAAC,EAC1DiF,GAAUjG,GAAW,MAAQ,EAC7BkG,EAAevG,EAAQ,OAAS,GAAKM,EAAoB,EAAI,GAE7DkG,EAAgB,CAACvE,EAAYC,IAAW,CAC5C,MAAMuE,EAAapG,GAAW,IAAI4B,CAAE,EAC9ByE,EAAQ9F,KAAW,CAAE,OAAQqB,EAAI,IAAAC,EAAK,WAAY,CAAC,CAACuE,EAAY,EACtE,OACE5I,EAAAA,KAAC8I,EAAAA,SAAA,CAAmB,GAAGD,EACpB,SAAA,CAAApG,EACCpC,EAAAA,IAAC0I,aAAU,UAAU,OACnB,eAACjC,EAAAA,SAAA,CAAS,QAAS,CAAC,CAAC8B,EAAY,gBAAiB,IAAMrD,GAAanB,CAAE,EAAG,aAAY,UAAUA,CAAE,GAAI,EACxG,EACE,KACJ/D,EAAAA,IAAC0I,EAAAA,UAAA,CAAU,UAAU,gBAAiB,SAAA3E,EAAG,EACxCjC,EAAQ,IAAKC,GACZ/B,EAAAA,IAAC0I,EAAAA,UAAA,CAEC,MAAO3G,EAAI,SAAW,CAAE,SAAUA,EAAI,UAAa,OAElD,SAAAoF,GAAWpF,EAAKgC,EAAIC,CAAG,CAAA,EAHnBjC,EAAI,IAAMA,EAAI,OAASA,EAAI,MAAA,CAKnC,CAAA,CAAA,EAdYgC,CAef,CAEJ,EAEM4E,EAAehH,GAAgB,CACnC+B,GAAoBkF,GAAS,CAC3B,MAAM5D,EAAO,IAAI,IAAI4D,CAAI,EACzB,OAAI5D,EAAK,IAAIrD,CAAG,EAAGqD,EAAK,OAAOrD,CAAG,EAC7BqD,EAAK,IAAIrD,CAAG,EACVqD,CACT,CAAC,CACH,EAEM6D,GACCb,EACOlG,EAAQ,KAAM0E,GAAMA,EAAE,QAAUwB,CAAgB,GAChD,QAAUA,EAFQ,GAKhC,OACErI,OAAC,OAAI,YAAU,sBAAsB,UAAWG,EAAAA,GAAG,sBAAuBgD,EAAS,EACjF,SAAA,CAAAnD,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAK,EAAAA,IAAC4H,EAAAA,OAAA,CAAO,QAAQ,UAAU,KAAK,KAAK,QAAS,IAAM5E,GAAY+C,GAAM,CAACA,CAAC,EACpE,SAAAhD,EAAU,mBAAqB,iBAClC,EACCJ,QACEmG,GAAAA,sBAAA,CAAsB,QAASjF,GAAuB,QAAAR,EAAkB,gBAAiBC,GAAY,EACpG,KACHT,EACClD,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACb,SAAA,CAAAK,EAAAA,IAAC+I,EAAAA,OAAA,CAAO,cAAW,GAAC,UAAU,iCAAiC,EAC/DpJ,EAAAA,KAACmG,EAAAA,OAAA,CAAO,MAAOvC,GAAgB,SAAU,cAAgBwC,GAAMvC,GAAgBuC,IAAM,SAAW,GAAKA,CAAC,EACpG,SAAA,CAAA/F,EAAAA,IAACgG,EAAAA,cAAA,CAAc,KAAK,KAAK,UAAU,eAAe,aAAW,WAC3D,SAAAhG,EAAAA,IAACiG,EAAAA,YAAA,CAAY,YAAY,WAAA,CAAY,EACvC,SACCC,EAAAA,cAAA,CACC,SAAA,CAAAlG,EAAAA,IAACoG,EAAAA,WAAA,CAAW,MAAM,SAAS,SAAA,cAAW,EACrC2B,GAAiB,IAAKhG,GACrB/B,EAAAA,IAACoG,cAAqC,MAAOrE,EAAI,OAAS,GACvD,WAAI,MAAA,EADUA,EAAI,IAAMA,EAAI,KAE/B,CACD,CAAA,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CACF,EACE,KACJpC,EAAAA,KAAC,OAAA,CAAK,UAAU,gCACb,SAAA,CAAAuI,EAAU,WAASE,GAAQ,WAAA,CAAA,CAC9B,CAAA,EACF,EAEApI,MAACgJ,EAAAA,gBAAA,CACC,SAAArJ,EAAAA,KAACsJ,EAAAA,MAAA,CAAM,eAAa,UAClB,SAAA,CAAAjJ,EAAAA,IAACkJ,EAAAA,YAAA,CACC,gBAACT,EAAAA,SAAA,CACE,SAAA,CAAArG,QACE+G,YAAA,CAAU,UAAU,mBACnB,SAAAxJ,EAAAA,KAAC,OAAA,CAAK,UAAU,iFACd,SAAA,CAAAK,EAAAA,IAACkH,EAAAA,MAAA,CAAM,cAAW,EAAA,CAAC,EACnBlH,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAU,SAAA,UAAA,CAAQ,CAAA,CAAA,CACpC,EACF,EACE,WACHmJ,EAAAA,UAAA,CAAU,MAAO,CAAE,SAAU,EAAA,EAAM,SAAA,OAAI,EACvCrH,EAAQ,IAAKC,GACZ/B,EAAAA,IAACmJ,EAAAA,UAAA,CAEC,MAAOpH,EAAI,SAAW,CAAE,SAAUA,EAAI,UAAa,OAElD,YAAmBA,CAAG,CAAA,EAHlBA,EAAI,IAAMA,EAAI,OAASA,EAAI,MAAA,CAKnC,CAAA,CAAA,CACH,CAAA,CACF,SACCqH,EAAAA,UAAA,CACE,SAAA,CAAAnB,EACGA,EAAQ,IAAKoB,GAAU,CACrB,MAAMC,EAAc7F,GAAgB,IAAI4F,EAAM,GAAG,EACjD,OACE1J,OAACH,EAAM,SAAN,CACC,SAAA,CAAAQ,EAAAA,IAACyI,EAAAA,SAAA,CACC,UAAU,6BACV,QAAS,IAAME,EAAYU,EAAM,GAAG,EACpC,UAAYzC,GAAM,EACZA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAA,EACF+B,EAAYU,EAAM,GAAG,EAEzB,EACA,KAAK,SACL,SAAU,EACV,gBAAe,CAACC,EAEhB,SAAAtJ,EAAAA,IAAC0I,EAAAA,WAAU,QAASL,EAAc,UAAU,SAC1C,SAAA1I,EAAAA,KAAC,MAAA,CAAI,UAAU,8CACZ,SAAA,CAAA2J,EACCtJ,EAAAA,IAACuJ,EAAAA,aAAA,CAAa,cAAW,GAAC,UAAU,gCAAA,CAAiC,EAErEvJ,EAAAA,IAACwJ,EAAAA,YAAA,CAAY,cAAW,GAAC,UAAU,iCAAiC,SAErE,OAAA,CACE,SAAA,CAAAX,GAAiB,KAAGQ,EAAM,GAAA,EAC7B,EACA1J,EAAAA,KAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,CAAA,IACpC0J,EAAM,KAAK,OAAO,IAAEA,EAAM,KAAK,SAAW,EAAI,MAAQ,OAAO,GAAA,CAAA,CACjE,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,EAEDC,EAAc,KAAOD,EAAM,KAAK,IAAI,CAAC,CAAE,GAAAtF,EAAI,IAAAC,CAAA,IAAUsE,EAAcvE,EAAIC,CAAG,CAAC,CAAA,CAAA,EA9BzDqF,EAAM,GA+B3B,CAEJ,CAAC,EACDzE,EAAU,IAAI,CAAC,CAAE,GAAAb,EAAI,IAAAC,CAAA,IAAUsE,EAAcvE,EAAIC,CAAG,CAAC,GACvDiE,EAAUA,EAAQ,SAAW,EAAIrD,EAAU,SAAW,GACtD5E,MAACyI,EAAAA,SAAA,CACC,SAAAzI,EAAAA,IAAC0I,EAAAA,WAAU,QAASL,EAAc,UAAU,gCAAgC,SAAA,qCAE5E,EACF,EACE,IAAA,CAAA,CACN,CAAA,CAAA,CACF,CAAA,CACF,EAECJ,EAAU,KACTtI,OAAC,MAAA,CAAI,UAAU,oEACb,SAAA,CAAAK,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,gBAAa,EACrDL,EAAAA,KAACmG,EAAAA,OAAA,CACC,MAAO,OAAO3C,CAAQ,EACtB,cAAgB4C,GAAM,CACpB3C,GAAY,SAAS2C,EAAG,EAAE,CAAC,EAC3B7C,EAAQ,CAAC,CACX,EAEA,SAAA,CAAAlD,EAAAA,IAACgG,EAAAA,cAAA,CAAc,KAAK,KAAK,UAAU,WAAW,aAAW,gBACvD,SAAAhG,EAAAA,IAACiG,EAAAA,YAAA,CAAA,CAAY,CAAA,CACf,EACAjG,EAAAA,IAACkG,EAAAA,cAAA,CACE,SAAA1D,GAAgB,IAAK2C,GACpBnF,MAACoG,EAAAA,WAAA,CAAmB,MAAO,OAAOjB,CAAC,EAChC,SAAAA,CAAA,EADcA,CAEjB,CACD,CAAA,CACH,CAAA,CAAA,CAAA,QAED,OAAA,CACE,SAAA+C,IAAc,EACX,SACA,GAAGjF,EAAOE,EAAW,CAAC,IAAI,KAAK,KAAKF,EAAO,GAAKE,EAAU+E,CAAS,CAAC,OAAOA,CAAS,GAC1F,EACAlI,MAAC4H,EAAAA,QAAO,QAAQ,UAAU,KAAK,KAAK,SAAU3E,IAAS,EAAG,QAAS,IAAMC,EAASuB,GAAM,KAAK,IAAI,EAAGA,EAAI,CAAC,CAAC,EAAG,SAAA,OAE7G,EACAzE,EAAAA,IAAC4H,EAAAA,OAAA,CACC,QAAQ,UACR,KAAK,KACL,SAAU3E,GAAQkF,EAClB,QAAS,IAAMjF,EAASuB,GAAM,KAAK,IAAI0D,EAAU1D,EAAI,CAAC,CAAC,EACxD,SAAA,MAAA,CAAA,CAED,CAAA,CACF,CAAA,EAEJ,CAEJ"}
1
+ {"version":3,"file":"WellManifestTable.cjs","sources":["../../../../src/components/composed/PlateMapEditor/WellManifestTable.tsx"],"sourcesContent":["import { ArrowDownToLine, Check, ChevronDown, ChevronRight, Layers } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { ManifestFilterPopover } from \"./ManifestFilterPopover\";\n\nimport type { WellColumn, WellField, WellId, WellRecord, WellSelectOption } from \"./types\";\nimport type { FilterColumnConfig, FilterCondition } from \"@/components/ui/data-table/data-table\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n Combobox,\n ComboboxChip,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxItem,\n ComboboxList,\n ComboboxValue,\n useComboboxAnchor,\n} from \"@/components/ui/combobox\";\nimport { applyFilterCondition } from \"@/components/ui/data-table/data-table\";\nimport { Input } from \"@/components/ui/input\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"@/components/ui/table\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nfunction MultiSelectCell({\n ariaLabel,\n value,\n options,\n placeholder,\n onChange,\n}: {\n ariaLabel: string;\n value: string[];\n options: WellSelectOption[];\n placeholder?: string;\n onChange: (next: string[]) => void;\n}) {\n const anchorRef = useComboboxAnchor();\n const labelByValue = React.useMemo(() => {\n const m = new Map<string, string>();\n options.forEach((o) => m.set(o.value, o.label));\n return m;\n }, [options]);\n\n return (\n <Combobox multiple items={options.map((o) => o.value)} value={value} onValueChange={onChange}>\n <ComboboxChips ref={anchorRef} className={cn(\"min-h-7 w-full py-0.5\", CELL_EDITOR_CLASS)}>\n <ComboboxValue>\n {(items: string[]) =>\n items.map((item) => <ComboboxChip key={item}>{labelByValue.get(item) ?? item}</ComboboxChip>)\n }\n </ComboboxValue>\n <ComboboxChipsInput aria-label={ariaLabel} placeholder={placeholder ?? \"Select…\"} />\n </ComboboxChips>\n <ComboboxContent anchor={anchorRef}>\n <ComboboxEmpty>No options.</ComboboxEmpty>\n <ComboboxList aria-label={ariaLabel}>\n {(item: string) => (\n <ComboboxItem key={item} value={item}>\n {labelByValue.get(item) ?? item}\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n );\n}\n\n/**\n * Cell editors render borderless by default so the table reads flat. The\n * underlying primitives keep their `focus-visible` / `focus-within` rings, so\n * an outline only appears while the user is actively editing the cell.\n */\nconst CELL_EDITOR_CLASS = \"border-transparent shadow-none hover:border-input/40\";\n\nconst PAGE_SIZE_SMALL = 25;\nconst PAGE_SIZE_MEDIUM = 50;\nconst PAGE_SIZE_LARGE = 100;\nconst DEFAULT_PAGE_SIZE = PAGE_SIZE_SMALL;\nconst DEFAULT_PAGE_SIZE_OPTIONS: number[] = [PAGE_SIZE_SMALL, PAGE_SIZE_MEDIUM, PAGE_SIZE_LARGE];\n\nfunction hasFillValue(value: unknown): boolean {\n return value !== undefined && value !== null && value !== \"\";\n}\n\nconst INPUT_TYPE_BY_KIND: Record<string, string> = {\n number: \"number\",\n integer: \"number\",\n date: \"date\",\n datetime: \"datetime-local\",\n time: \"time\",\n};\n\nfunction resolveInputType(kind: string): string {\n return INPUT_TYPE_BY_KIND[kind] ?? \"text\";\n}\n\nfunction parseInputValue(kind: string, raw: string): unknown {\n if (raw === \"\") return undefined;\n if (kind === \"number\") {\n const num = parseFloat(raw);\n return Number.isFinite(num) ? num : raw;\n }\n if (kind === \"integer\") {\n const num = parseInt(raw, 10);\n return Number.isFinite(num) ? num : raw;\n }\n return raw;\n}\n\nexport interface WellManifestTableRowContext<T extends WellRecord = WellRecord> {\n wellId: WellId;\n row: T;\n isSelected: boolean;\n}\n\nexport interface WellManifestTableProps<T extends WellRecord = WellRecord> {\n values: Map<WellId, T>;\n columns: WellColumn<T>[];\n /**\n * Field schema. If a column has `field` matching a `select`-kind field, a\n * Select cell renders automatically with that field's options.\n */\n fields?: WellField<T>[];\n selection?: Set<WellId>;\n onSelectionChange?: (next: Set<WellId>) => void;\n onChange: (next: Map<WellId, T>) => void;\n /** Builds an empty record for a freshly-created row. */\n emptyEntry: (id: WellId) => T;\n /** Filter that controls which empty rows surface. Defaults to `false`. */\n isPopulated?: (row: T) => boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n /** Adds a column header action that copies the first non-empty value downward. */\n enableFillDown?: boolean;\n /**\n * Extra props spread onto each `<tr>` — typically used to attach a DnD\n * library's `setNodeRef`, listeners, and data attributes so rows can act as\n * drag sources. The kit stays DnD-library-agnostic.\n */\n rowProps?: (ctx: WellManifestTableRowContext<T>) => React.ComponentProps<\"tr\"> | undefined;\n /** Enables an inline filter popover above the table. Defaults to false. */\n filterable?: boolean;\n /**\n * Optional override of filterable column configs. When omitted, every column\n * with a `field` becomes filterable using the default operator set from the\n * shared data-table filter system.\n */\n filterColumns?: FilterColumnConfig[];\n /** Enables an inline group-by selector. Defaults to false. */\n groupable?: boolean;\n className?: string;\n}\n\ninterface GroupedRow<T> {\n key: string;\n rows: Array<{ id: WellId; row: T }>;\n}\n\nfunction groupRowsBy<T extends WellRecord>(rows: Array<{ id: WellId; row: T }>, field: string): GroupedRow<T>[] {\n const map = new Map<string, GroupedRow<T>>();\n for (const entry of rows) {\n const raw = (entry.row as Record<string, unknown>)[field];\n const key = raw === undefined || raw === null || raw === \"\" ? \"(blank)\" : String(raw);\n const existing = map.get(key);\n if (existing) existing.rows.push(entry);\n else map.set(key, { key, rows: [entry] });\n }\n return [...map.values()];\n}\n\nfunction inferFilterColumns<T extends WellRecord>(columns: WellColumn<T>[]): FilterColumnConfig[] {\n return columns.filter((col) => !!col.field).map((col) => ({ columnId: col.field as string, label: col.header }));\n}\n\nexport function WellManifestTable<T extends WellRecord = WellRecord>({\n values,\n columns,\n fields,\n selection,\n onSelectionChange,\n onChange,\n emptyEntry,\n isPopulated,\n pageSize: initialPageSize = DEFAULT_PAGE_SIZE,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n enableFillDown = true,\n rowProps,\n filterable = false,\n filterColumns,\n groupable = false,\n className,\n}: WellManifestTableProps<T>) {\n const [showAll, setShowAll] = React.useState(false);\n const [page, setPage] = React.useState(0);\n const [pageSize, setPageSize] = React.useState(initialPageSize);\n const [filters, setFilters] = React.useState<FilterCondition[]>([]);\n const [groupByField, setGroupByField] = React.useState<string>(\"\");\n const [collapsedGroups, setCollapsedGroups] = React.useState<Set<string>>(new Set());\n\n React.useEffect(() => {\n setPage(0);\n }, [showAll]);\n\n const fieldByKey = React.useMemo(() => {\n const m = new Map<string, WellField<T>>();\n (fields ?? []).forEach((f) => m.set(f.key, f));\n return m;\n }, [fields]);\n\n const resolvedFilterColumns = React.useMemo<FilterColumnConfig[]>(\n () => filterColumns ?? inferFilterColumns(columns),\n [columns, filterColumns],\n );\n\n const rows = React.useMemo(() => {\n const arr = [...values.entries()].map(([id, row]) => ({\n id,\n row,\n }));\n let filtered = arr;\n if (!showAll && isPopulated) {\n filtered = arr.filter((r) => isPopulated(r.row));\n }\n if (filterable && filters.length > 0) {\n filtered = filtered.filter((entry) => {\n const record = entry.row as Record<string, unknown>;\n return filters.every((condition) => {\n const cellRaw = record[condition.columnId];\n const cellValue = cellRaw === undefined || cellRaw === null ? \"\" : String(cellRaw);\n return applyFilterCondition(cellValue, condition.operator, condition.value);\n });\n });\n }\n if (selection && selection.size > 0) {\n const have = new Set(filtered.map((r) => r.id));\n selection.forEach((p) => {\n if (!have.has(p) && !values.has(p)) {\n filtered = [...filtered, { id: p, row: emptyEntry(p) }];\n }\n });\n }\n return filtered.sort((a, b) => a.id.localeCompare(b.id));\n }, [values, showAll, isPopulated, selection, emptyEntry, filterable, filters]);\n\n React.useEffect(() => {\n setPage(0);\n }, [filters]);\n\n const pagedRows = React.useMemo(\n () => rows.slice(page * pageSize, page * pageSize + pageSize),\n [rows, page, pageSize],\n );\n\n const updateRow = (wellId: WellId, patch: Partial<T>) => {\n const next = new Map(values);\n const cur = next.get(wellId) ?? emptyEntry(wellId);\n next.set(wellId, { ...cur, ...patch });\n onChange(next);\n };\n\n const toggleSelect = (wellId: WellId) => {\n if (!onSelectionChange) return;\n const s = new Set(selection ?? []);\n if (s.has(wellId)) {\n s.delete(wellId);\n } else {\n s.add(wellId);\n }\n onSelectionChange(s);\n };\n\n const getFillDownPlan = (col: WellColumn<T>) => {\n if (!col.field) return null;\n\n const selectionActive = !!selection && selection.size > 0;\n const groupingActive = groupable && !!groupByField;\n const sourceRows = selectionActive\n ? rows.filter(({ id }) => selection.has(id))\n : groupingActive\n ? rows\n : pagedRows;\n const sourceIndex = sourceRows.findIndex(({ row }) => hasFillValue(row[col.field!]));\n if (sourceIndex < 0) return null;\n\n const source = sourceRows[sourceIndex];\n const targets = selectionActive\n ? sourceRows.filter(({ id }) => id !== source.id)\n : sourceRows.slice(sourceIndex + 1);\n\n return {\n field: col.field,\n source,\n targets,\n value: source.row[col.field],\n };\n };\n\n const fillColumnDown = (col: WellColumn<T>) => {\n const plan = getFillDownPlan(col);\n if (!plan || plan.targets.length === 0) return;\n\n const next = new Map(values);\n plan.targets.forEach(({ id }) => {\n const cur = next.get(id) ?? emptyEntry(id);\n next.set(id, { ...cur, [plan.field]: plan.value } as T);\n });\n onChange(next);\n };\n\n const renderSelectCellEditable = (\n field: WellField<T>,\n fieldKey: keyof T & string,\n value: unknown,\n wellId: WellId,\n ariaLabel: string,\n ) => (\n <Select\n value={(value as string | undefined) ?? \"\"}\n onValueChange={(v) => updateRow(wellId, { [fieldKey]: v } as Partial<T>)}\n >\n <SelectTrigger size=\"sm\" className={cn(\"h-7 w-full\", CELL_EDITOR_CLASS)} aria-label={ariaLabel}>\n <SelectValue placeholder={field.placeholder ?? \"Select…\"} />\n </SelectTrigger>\n <SelectContent>\n {(field.options ?? []).map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n <span className=\"inline-flex items-center gap-2\">\n {opt.swatch ? (\n <span\n className=\"inline-block h-2.5 w-2.5 rounded-sm border border-foreground/20\"\n style={{ backgroundColor: opt.swatch }}\n aria-hidden\n />\n ) : null}\n {opt.label}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n\n const renderBooleanCellEditable = (\n field: WellField<T>,\n fieldKey: keyof T & string,\n value: unknown,\n wellId: WellId,\n ariaLabel: string,\n ) => {\n const checked = !!value;\n if (field.boolStyle === \"switch\") {\n return (\n <Switch\n aria-label={ariaLabel}\n checked={checked}\n onCheckedChange={(c) => updateRow(wellId, { [fieldKey]: c } as Partial<T>)}\n />\n );\n }\n return (\n <Checkbox\n aria-label={ariaLabel}\n checked={checked}\n onCheckedChange={(c) => updateRow(wellId, { [fieldKey]: c === true } as Partial<T>)}\n />\n );\n };\n\n const renderInputCellEditable = (\n field: WellField<T>,\n fieldKey: keyof T & string,\n value: unknown,\n wellId: WellId,\n ariaLabel: string,\n ) => (\n <Input\n type={resolveInputType(field.kind)}\n step={field.kind === \"integer\" ? 1 : undefined}\n placeholder={field.placeholder}\n aria-label={ariaLabel}\n className={cn(\"h-7\", CELL_EDITOR_CLASS)}\n value={(value as string | number | undefined) ?? \"\"}\n onChange={(e) => updateRow(wellId, { [fieldKey]: parseInputValue(field.kind, e.target.value) } as Partial<T>)}\n />\n );\n\n const renderEditableCell = (field: WellField<T>, col: WellColumn<T>, wellId: WellId, row: T) => {\n const fieldKey = col.field!;\n const value = row[fieldKey];\n const ariaLabel = `${field.label} for ${wellId}`;\n\n if (field.kind === \"select\") return renderSelectCellEditable(field, fieldKey, value, wellId, ariaLabel);\n if (field.kind === \"multiselect\") {\n const current = Array.isArray(value) ? (value as string[]) : [];\n return (\n <MultiSelectCell\n ariaLabel={ariaLabel}\n value={current}\n options={field.options ?? []}\n placeholder={field.placeholder}\n onChange={(next) => updateRow(wellId, { [fieldKey]: next.length === 0 ? undefined : next } as Partial<T>)}\n />\n );\n }\n if (field.kind === \"boolean\") return renderBooleanCellEditable(field, fieldKey, value, wellId, ariaLabel);\n return renderInputCellEditable(field, fieldKey, value, wellId, ariaLabel);\n };\n\n const renderReadonlyCell = (field: WellField<T> | undefined, value: unknown) => {\n if (field?.kind === \"select\") {\n const option = (field.options ?? []).find((opt) => opt.value === value);\n if (!option) {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n\n return (\n <Badge variant=\"secondary\">\n {option.swatch ? (\n <span\n className=\"size-2 rounded-sm border border-foreground/20\"\n style={{ backgroundColor: option.swatch }}\n aria-hidden\n />\n ) : null}\n {option.label}\n </Badge>\n );\n }\n\n if (field?.kind === \"multiselect\") {\n const arr = Array.isArray(value) ? (value as string[]) : [];\n if (arr.length === 0) {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n return (\n <div className=\"flex flex-wrap gap-1\">\n {arr.map((v) => {\n const opt = (field.options ?? []).find((o) => o.value === v);\n return (\n <Badge key={v} variant=\"secondary\">\n {opt?.swatch ? (\n <span\n className=\"size-2 rounded-sm border border-foreground/20\"\n style={{ backgroundColor: opt.swatch }}\n aria-hidden\n />\n ) : null}\n {opt?.label ?? v}\n </Badge>\n );\n })}\n </div>\n );\n }\n\n if (field?.kind === \"boolean\") {\n return value ? (\n <Check aria-label=\"Yes\" className=\"size-4 text-foreground\" />\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n );\n }\n\n if (!hasFillValue(value)) {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n\n return String(value);\n };\n\n const renderCell = (col: WellColumn<T>, wellId: WellId, row: T) => {\n if (col.render) {\n return col.render({\n row,\n wellId,\n update: (patch) => updateRow(wellId, patch),\n });\n }\n if (!col.field) return null;\n\n const field = fieldByKey.get(col.field);\n const value = row[col.field];\n\n if (field?.editableInTable && field.kind !== \"custom\") {\n return renderEditableCell(field, col, wellId, row);\n }\n\n return renderReadonlyCell(field, value);\n };\n\n const renderColumnHeader = (col: WellColumn<T>) => {\n const matchingField = col.field ? fieldByKey.get(col.field) : undefined;\n const icon = col.icon ?? matchingField?.icon;\n const fillPlan = enableFillDown ? getFillDownPlan(col) : null;\n const canFillDown = !!fillPlan && fillPlan.targets.length > 0;\n const fillHint =\n selection && selection.size > 0\n ? `Fill selected ${col.header} cells from the first selected value`\n : `Fill visible ${col.header} cells downward from the first value`;\n return (\n <span className=\"flex min-w-0 items-center justify-between gap-2\">\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n {icon ? <span className=\"inline-flex text-muted-foreground [&_svg]:size-3.5\">{icon}</span> : null}\n <span className=\"truncate\">{col.header}</span>\n </span>\n {enableFillDown && col.field ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"-mr-1 text-muted-foreground hover:text-foreground\"\n disabled={!canFillDown}\n aria-label={`Fill down ${col.header}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n fillColumnDown(col);\n }}\n >\n <ArrowDownToLine />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{fillHint}</TooltipContent>\n </Tooltip>\n ) : null}\n </span>\n );\n };\n\n const groupableColumns = React.useMemo(() => columns.filter((col) => !!col.field), [columns]);\n const activeGroupField = groupable && groupByField ? groupByField : \"\";\n const grouped = React.useMemo(\n () => (activeGroupField ? groupRowsBy(rows, activeGroupField) : null),\n [activeGroupField, rows],\n );\n\n const totalRows = rows.length;\n const lastPage = Math.max(0, Math.ceil(totalRows / pageSize) - 1);\n const selSize = selection?.size ?? 0;\n const totalColSpan = columns.length + 1 + (onSelectionChange ? 1 : 0);\n\n const renderDataRow = (id: WellId, row: T) => {\n const isSelected = selection?.has(id);\n const extra = rowProps?.({ wellId: id, row, isSelected: !!isSelected });\n return (\n <TableRow key={id} {...extra}>\n {onSelectionChange ? (\n <TableCell className=\"w-10\">\n <Checkbox checked={!!isSelected} onCheckedChange={() => toggleSelect(id)} aria-label={`Select ${id}`} />\n </TableCell>\n ) : null}\n <TableCell className=\"font-semibold\">{id}</TableCell>\n {columns.map((col) => (\n <TableCell\n key={col.id ?? col.field ?? col.header}\n style={col.minWidth ? { minWidth: col.minWidth } : undefined}\n >\n {renderCell(col, id, row)}\n </TableCell>\n ))}\n </TableRow>\n );\n };\n\n const toggleGroup = (key: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n const groupHeaderLabel = (() => {\n if (!activeGroupField) return \"\";\n const col = columns.find((c) => c.field === activeGroupField);\n return col?.header ?? activeGroupField;\n })();\n\n return (\n <div data-slot=\"well-manifest-table\" className={cn(\"flex flex-col gap-2\", className)}>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowAll((v) => !v)}>\n {showAll ? \"Hide empty wells\" : \"Show all wells\"}\n </Button>\n {filterable ? (\n <ManifestFilterPopover columns={resolvedFilterColumns} filters={filters} onFiltersChange={setFilters} />\n ) : null}\n {groupable ? (\n <div className=\"inline-flex items-center gap-1.5\">\n <Layers aria-hidden className=\"size-3.5 text-muted-foreground\" />\n <Select value={groupByField || \"__none\"} onValueChange={(v) => setGroupByField(v === \"__none\" ? \"\" : v)}>\n <SelectTrigger size=\"sm\" className=\"h-7 min-w-40\" aria-label=\"Group by\">\n <SelectValue placeholder=\"Group by…\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__none\">No grouping</SelectItem>\n {groupableColumns.map((col) => (\n <SelectItem key={col.id ?? col.field} value={col.field ?? \"\"}>\n {col.header}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n <span className=\"text-xs text-muted-foreground\">\n {totalRows} rows · {selSize} selected\n </span>\n </div>\n\n <TooltipProvider>\n <Table data-density=\"default\">\n <TableHeader>\n <TableRow>\n {onSelectionChange ? (\n <TableHead className=\"w-10 text-center\">\n <span className=\"inline-flex items-center justify-center text-muted-foreground [&_svg]:size-3.5\">\n <Check aria-hidden />\n <span className=\"sr-only\">Selected</span>\n </span>\n </TableHead>\n ) : null}\n <TableHead style={{ minWidth: 60 }}>Well</TableHead>\n {columns.map((col) => (\n <TableHead\n key={col.id ?? col.field ?? col.header}\n style={col.minWidth ? { minWidth: col.minWidth } : undefined}\n >\n {renderColumnHeader(col)}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {grouped\n ? grouped.map((group) => {\n const isCollapsed = collapsedGroups.has(group.key);\n return (\n <React.Fragment key={group.key}>\n <TableRow\n className=\"cursor-pointer bg-muted/40\"\n onClick={() => toggleGroup(group.key)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleGroup(group.key);\n }\n }}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!isCollapsed}\n >\n <TableCell colSpan={totalColSpan} className=\"py-1.5\">\n <div className=\"flex items-center gap-2 text-xs font-medium\">\n {isCollapsed ? (\n <ChevronRight aria-hidden className=\"size-3.5 text-muted-foreground\" />\n ) : (\n <ChevronDown aria-hidden className=\"size-3.5 text-muted-foreground\" />\n )}\n <span>\n {groupHeaderLabel}: {group.key}\n </span>\n <span className=\"text-muted-foreground\">\n ({group.rows.length} {group.rows.length === 1 ? \"row\" : \"rows\"})\n </span>\n </div>\n </TableCell>\n </TableRow>\n {isCollapsed ? null : group.rows.map(({ id, row }) => renderDataRow(id, row))}\n </React.Fragment>\n );\n })\n : pagedRows.map(({ id, row }) => renderDataRow(id, row))}\n {(grouped ? grouped.length === 0 : pagedRows.length === 0) ? (\n <TableRow>\n <TableCell colSpan={totalColSpan} className=\"text-xs text-muted-foreground\">\n No rows. Paint wells on the plate.\n </TableCell>\n </TableRow>\n ) : null}\n </TableBody>\n </Table>\n </TooltipProvider>\n\n {grouped ? null : (\n <div className=\"flex items-center justify-end gap-3 text-xs text-muted-foreground\">\n <span className=\"text-muted-foreground\">Rows per page</span>\n <Select\n value={String(pageSize)}\n onValueChange={(v) => {\n setPageSize(parseInt(v, 10));\n setPage(0);\n }}\n >\n <SelectTrigger size=\"sm\" className=\"h-7 w-18\" aria-label=\"Rows per page\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span>\n {totalRows === 0\n ? \"0 of 0\"\n : `${page * pageSize + 1}–${Math.min((page + 1) * pageSize, totalRows)} of ${totalRows}`}\n </span>\n <Button variant=\"outline\" size=\"sm\" disabled={page === 0} onClick={() => setPage((p) => Math.max(0, p - 1))}>\n Prev\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page >= lastPage}\n onClick={() => setPage((p) => Math.min(lastPage, p + 1))}\n >\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n"],"names":["MultiSelectCell","ariaLabel","value","options","placeholder","onChange","anchorRef","useComboboxAnchor","labelByValue","React","m","o","jsxs","Combobox","ComboboxChips","cn","CELL_EDITOR_CLASS","jsx","ComboboxValue","items","item","ComboboxChip","ComboboxChipsInput","ComboboxContent","ComboboxEmpty","ComboboxList","ComboboxItem","PAGE_SIZE_SMALL","PAGE_SIZE_MEDIUM","PAGE_SIZE_LARGE","DEFAULT_PAGE_SIZE","DEFAULT_PAGE_SIZE_OPTIONS","hasFillValue","INPUT_TYPE_BY_KIND","resolveInputType","kind","parseInputValue","raw","num","groupRowsBy","rows","field","map","entry","key","existing","inferFilterColumns","columns","col","WellManifestTable","values","fields","selection","onSelectionChange","emptyEntry","isPopulated","initialPageSize","pageSizeOptions","enableFillDown","rowProps","filterable","filterColumns","groupable","className","showAll","setShowAll","page","setPage","pageSize","setPageSize","filters","setFilters","groupByField","setGroupByField","collapsedGroups","setCollapsedGroups","fieldByKey","f","resolvedFilterColumns","arr","id","row","filtered","r","record","condition","cellRaw","cellValue","applyFilterCondition","have","p","a","b","pagedRows","updateRow","wellId","patch","next","cur","toggleSelect","s","getFillDownPlan","selectionActive","sourceRows","sourceIndex","source","targets","fillColumnDown","plan","renderSelectCellEditable","fieldKey","Select","v","SelectTrigger","SelectValue","SelectContent","opt","SelectItem","renderBooleanCellEditable","checked","Switch","c","Checkbox","renderInputCellEditable","Input","e","renderEditableCell","current","renderReadonlyCell","option","Badge","Check","renderCell","renderColumnHeader","matchingField","icon","fillPlan","canFillDown","fillHint","Tooltip","TooltipTrigger","Button","ArrowDownToLine","TooltipContent","groupableColumns","activeGroupField","grouped","totalRows","lastPage","selSize","totalColSpan","renderDataRow","isSelected","extra","TableRow","TableCell","toggleGroup","prev","groupHeaderLabel","ManifestFilterPopover","Layers","TooltipProvider","Table","TableHeader","TableHead","TableBody","group","isCollapsed","ChevronRight","ChevronDown"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { WellColumn, WellField, WellId, WellRecord } from './types';
2
+ import { FilterColumnConfig } from '../../ui/data-table/data-table';
3
+ import * as React from "react";
4
+ export interface WellManifestTableRowContext<T extends WellRecord = WellRecord> {
5
+ wellId: WellId;
6
+ row: T;
7
+ isSelected: boolean;
8
+ }
9
+ export interface WellManifestTableProps<T extends WellRecord = WellRecord> {
10
+ values: Map<WellId, T>;
11
+ columns: WellColumn<T>[];
12
+ /**
13
+ * Field schema. If a column has `field` matching a `select`-kind field, a
14
+ * Select cell renders automatically with that field's options.
15
+ */
16
+ fields?: WellField<T>[];
17
+ selection?: Set<WellId>;
18
+ onSelectionChange?: (next: Set<WellId>) => void;
19
+ onChange: (next: Map<WellId, T>) => void;
20
+ /** Builds an empty record for a freshly-created row. */
21
+ emptyEntry: (id: WellId) => T;
22
+ /** Filter that controls which empty rows surface. Defaults to `false`. */
23
+ isPopulated?: (row: T) => boolean;
24
+ pageSize?: number;
25
+ pageSizeOptions?: number[];
26
+ /** Adds a column header action that copies the first non-empty value downward. */
27
+ enableFillDown?: boolean;
28
+ /**
29
+ * Extra props spread onto each `<tr>` — typically used to attach a DnD
30
+ * library's `setNodeRef`, listeners, and data attributes so rows can act as
31
+ * drag sources. The kit stays DnD-library-agnostic.
32
+ */
33
+ rowProps?: (ctx: WellManifestTableRowContext<T>) => React.ComponentProps<"tr"> | undefined;
34
+ /** Enables an inline filter popover above the table. Defaults to false. */
35
+ filterable?: boolean;
36
+ /**
37
+ * Optional override of filterable column configs. When omitted, every column
38
+ * with a `field` becomes filterable using the default operator set from the
39
+ * shared data-table filter system.
40
+ */
41
+ filterColumns?: FilterColumnConfig[];
42
+ /** Enables an inline group-by selector. Defaults to false. */
43
+ groupable?: boolean;
44
+ className?: string;
45
+ }
46
+ export declare function WellManifestTable<T extends WellRecord = WellRecord>({ values, columns, fields, selection, onSelectionChange, onChange, emptyEntry, isPopulated, pageSize: initialPageSize, pageSizeOptions, enableFillDown, rowProps, filterable, filterColumns, groupable, className, }: WellManifestTableProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -2,16 +2,16 @@ import { jsxs as i, jsx as t } from "react/jsx-runtime";
2
2
  import { Layers as _e, Check as ee, ChevronRight as ze, ChevronDown as Me, ArrowDownToLine as Te } from "lucide-react";
3
3
  import * as h from "react";
4
4
  import { ManifestFilterPopover as Ae } from "./ManifestFilterPopover.js";
5
- import { Badge as ne } from "../../ui/badge.js";
6
- import { Button as F } from "../../ui/button.js";
7
- import { Checkbox as te } from "../../ui/checkbox.js";
8
- import { useComboboxAnchor as Fe, Combobox as Pe, ComboboxChips as Re, ComboboxValue as Ie, ComboboxChip as De, ComboboxChipsInput as Ge, ComboboxContent as Le, ComboboxEmpty as Be, ComboboxList as Ve, ComboboxItem as We } from "../../ui/combobox.js";
5
+ import { Badge as ne } from "../../../ui/badge.js";
6
+ import { Button as F } from "../../../ui/button.js";
7
+ import { Checkbox as te } from "../../../ui/checkbox.js";
8
+ import { useComboboxAnchor as Fe, Combobox as Pe, ComboboxChips as Re, ComboboxValue as Ie, ComboboxChip as De, ComboboxChipsInput as Ge, ComboboxContent as Le, ComboboxEmpty as Be, ComboboxList as Ve, ComboboxItem as We } from "../../../ui/combobox.js";
9
9
  import { applyFilterCondition as $e } from "../../ui/data-table/data-table.js";
10
- import { Input as He } from "../../ui/input.js";
11
- import { Select as B, SelectTrigger as V, SelectValue as W, SelectContent as $, SelectItem as P } from "../../ui/select.js";
12
- import { Switch as je } from "../../ui/switch.js";
13
- import { Table as Ze, TableHeader as Ue, TableRow as R, TableHead as H, TableBody as Ke, TableCell as M } from "../../ui/table.js";
14
- import { TooltipProvider as Oe, Tooltip as Ye, TooltipTrigger as qe, TooltipContent as Je } from "../../ui/tooltip.js";
10
+ import { Input as He } from "../../../ui/input.js";
11
+ import { Select as B, SelectTrigger as V, SelectValue as W, SelectContent as $, SelectItem as P } from "../../../ui/select.js";
12
+ import { Switch as je } from "../../../ui/switch.js";
13
+ import { Table as Ze, TableHeader as Ue, TableRow as R, TableHead as H, TableBody as Ke, TableCell as M } from "../../../ui/table.js";
14
+ import { TooltipProvider as Oe, Tooltip as Ye, TooltipTrigger as qe, TooltipContent as Je } from "../../../ui/tooltip.js";
15
15
  import { cn as I } from "../../../lib/utils.js";
16
16
  function Qe({
17
17
  ariaLabel: d,