@tetrascience-npm/tetrascience-react-ui 0.7.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1241) hide show
  1. package/README.md +58 -4
  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.cjs +2 -0
  142. package/dist/components/ai/streamdown-code-plugin.cjs.map +1 -0
  143. package/dist/components/ai/streamdown-code-plugin.d.ts +2 -0
  144. package/dist/components/ai/streamdown-code-plugin.js +42 -0
  145. package/dist/components/ai/streamdown-code-plugin.js.map +1 -0
  146. package/dist/components/ai/streamdown-plugins.cjs +2 -0
  147. package/dist/components/ai/streamdown-plugins.cjs.map +1 -0
  148. package/dist/components/ai/streamdown-plugins.d.ts +2 -0
  149. package/dist/components/ai/streamdown-plugins.js +14 -0
  150. package/dist/components/ai/streamdown-plugins.js.map +1 -0
  151. package/dist/components/ai/suggestion.d.ts +9 -0
  152. package/dist/components/ai/task.d.ts +16 -0
  153. package/dist/components/ai/tool.d.ts +33 -0
  154. package/dist/components/ai/use-streamdown-plugins.cjs +2 -0
  155. package/dist/components/ai/use-streamdown-plugins.cjs.map +1 -0
  156. package/dist/components/ai/use-streamdown-plugins.d.ts +8 -0
  157. package/dist/components/ai/use-streamdown-plugins.js +25 -0
  158. package/dist/components/ai/use-streamdown-plugins.js.map +1 -0
  159. package/dist/components/charts/AreaPlot/AreaPlot.cjs +2 -0
  160. package/dist/components/charts/AreaPlot/AreaPlot.cjs.map +1 -0
  161. package/dist/components/charts/AreaPlot/AreaPlot.d.ts +39 -0
  162. package/dist/components/charts/AreaPlot/AreaPlot.js +270 -0
  163. package/dist/components/charts/AreaPlot/AreaPlot.js.map +1 -0
  164. package/dist/components/charts/AreaPlot/index.d.ts +2 -0
  165. package/dist/components/charts/BarChart/BarChart.cjs +2 -0
  166. package/dist/components/charts/BarChart/BarChart.cjs.map +1 -0
  167. package/dist/components/charts/BarChart/BarChart.d.ts +44 -0
  168. package/dist/components/charts/BarChart/BarChart.js +219 -0
  169. package/dist/components/charts/BarChart/BarChart.js.map +1 -0
  170. package/dist/components/charts/BarChart/index.d.ts +2 -0
  171. package/dist/components/charts/BoxPlot/BoxPlot.cjs +2 -0
  172. package/dist/components/charts/BoxPlot/BoxPlot.cjs.map +1 -0
  173. package/dist/components/charts/BoxPlot/BoxPlot.d.ts +33 -0
  174. package/dist/components/charts/BoxPlot/BoxPlot.js +208 -0
  175. package/dist/components/charts/BoxPlot/BoxPlot.js.map +1 -0
  176. package/dist/components/charts/BoxPlot/index.d.ts +2 -0
  177. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
  178. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
  179. package/dist/components/charts/ChartTooltip/ChartTooltip.d.ts +71 -0
  180. package/dist/components/charts/ChartTooltip/ChartTooltip.js +22 -22
  181. package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
  182. package/dist/components/charts/ChartTooltip/index.d.ts +2 -0
  183. package/dist/components/charts/ChartTooltip/lines.d.ts +54 -0
  184. package/dist/components/charts/Chromatogram/Chromatogram.cjs +1 -1
  185. package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -1
  186. package/dist/components/charts/Chromatogram/Chromatogram.d.ts +5 -0
  187. package/dist/components/charts/Chromatogram/Chromatogram.js +232 -170
  188. package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -1
  189. package/dist/components/charts/Chromatogram/annotations.cjs +2 -0
  190. package/dist/components/charts/Chromatogram/annotations.cjs.map +1 -0
  191. package/dist/components/charts/Chromatogram/annotations.d.ts +50 -0
  192. package/dist/components/charts/Chromatogram/annotations.js +137 -0
  193. package/dist/components/charts/Chromatogram/annotations.js.map +1 -0
  194. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs +2 -0
  195. package/dist/components/charts/Chromatogram/boundaryMarkers.cjs.map +1 -0
  196. package/dist/components/charts/Chromatogram/boundaryMarkers.d.ts +14 -0
  197. package/dist/components/charts/Chromatogram/boundaryMarkers.js +34 -0
  198. package/dist/components/charts/Chromatogram/boundaryMarkers.js.map +1 -0
  199. package/dist/components/charts/Chromatogram/constants.cjs +2 -0
  200. package/dist/components/charts/Chromatogram/constants.cjs.map +1 -0
  201. package/dist/components/charts/Chromatogram/constants.d.ts +46 -0
  202. package/dist/components/charts/Chromatogram/constants.js +36 -0
  203. package/dist/components/charts/Chromatogram/constants.js.map +1 -0
  204. package/dist/components/charts/Chromatogram/dataProcessing.cjs +2 -0
  205. package/dist/components/charts/Chromatogram/dataProcessing.cjs.map +1 -0
  206. package/dist/components/charts/Chromatogram/dataProcessing.d.ts +49 -0
  207. package/dist/components/charts/Chromatogram/dataProcessing.js +90 -0
  208. package/dist/components/charts/Chromatogram/dataProcessing.js.map +1 -0
  209. package/dist/components/charts/Chromatogram/index.d.ts +2 -0
  210. package/dist/components/charts/Chromatogram/peakDetection.cjs.map +1 -0
  211. package/dist/components/charts/Chromatogram/peakDetection.d.ts +33 -0
  212. package/dist/components/charts/Chromatogram/peakDetection.js.map +1 -0
  213. package/dist/components/charts/Chromatogram/plotBuilder.cjs +2 -0
  214. package/dist/components/charts/Chromatogram/plotBuilder.cjs.map +1 -0
  215. package/dist/components/charts/Chromatogram/plotBuilder.d.ts +58 -0
  216. package/dist/components/charts/Chromatogram/plotBuilder.js +216 -0
  217. package/dist/components/charts/Chromatogram/plotBuilder.js.map +1 -0
  218. package/dist/components/charts/Chromatogram/regionOverlays.cjs +2 -0
  219. package/dist/components/charts/Chromatogram/regionOverlays.cjs.map +1 -0
  220. package/dist/components/charts/Chromatogram/regionOverlays.d.ts +9 -0
  221. package/dist/components/charts/Chromatogram/regionOverlays.js +26 -0
  222. package/dist/components/charts/Chromatogram/regionOverlays.js.map +1 -0
  223. package/dist/components/charts/Chromatogram/types.d.ts +258 -0
  224. package/dist/components/charts/Electropherogram/Electropherogram.cjs +2 -0
  225. package/dist/components/charts/Electropherogram/Electropherogram.cjs.map +1 -0
  226. package/dist/components/charts/Electropherogram/Electropherogram.d.ts +22 -0
  227. package/dist/components/charts/Electropherogram/Electropherogram.js +180 -0
  228. package/dist/components/charts/Electropherogram/Electropherogram.js.map +1 -0
  229. package/dist/components/charts/Electropherogram/index.d.ts +2 -0
  230. package/dist/components/charts/Histogram/Histogram.cjs +1 -1
  231. package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
  232. package/dist/components/charts/Histogram/Histogram.d.ts +36 -0
  233. package/dist/components/charts/Histogram/Histogram.js +107 -108
  234. package/dist/components/charts/Histogram/Histogram.js.map +1 -1
  235. package/dist/components/charts/Histogram/index.d.ts +2 -0
  236. package/dist/components/charts/LinePlot/LinePlot.cjs +2 -0
  237. package/dist/components/charts/LinePlot/LinePlot.cjs.map +1 -0
  238. package/dist/components/charts/LinePlot/LinePlot.d.ts +45 -0
  239. package/dist/components/charts/LinePlot/LinePlot.js +224 -0
  240. package/dist/components/charts/LinePlot/LinePlot.js.map +1 -0
  241. package/dist/components/charts/LinePlot/index.d.ts +2 -0
  242. package/dist/components/charts/PieChart/PieChart.cjs +1 -1
  243. package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
  244. package/dist/components/charts/PieChart/PieChart.d.ts +20 -0
  245. package/dist/components/charts/PieChart/PieChart.js +62 -61
  246. package/dist/components/charts/PieChart/PieChart.js.map +1 -1
  247. package/dist/components/charts/PieChart/index.d.ts +2 -0
  248. package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
  249. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
  250. package/dist/components/charts/PlateMap/PlateMap.d.ts +29 -0
  251. package/dist/components/charts/PlateMap/PlateMap.js +246 -242
  252. package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
  253. package/dist/components/charts/PlateMap/constants.d.ts +75 -0
  254. package/dist/components/charts/PlateMap/index.d.ts +2 -0
  255. package/dist/components/charts/PlateMap/types.d.ts +322 -0
  256. package/dist/components/charts/PlateMap/utils.d.ts +133 -0
  257. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs +2 -0
  258. package/dist/components/charts/ScatterPlot/ScatterPlot.cjs.map +1 -0
  259. package/dist/components/charts/ScatterPlot/ScatterPlot.d.ts +43 -0
  260. package/dist/components/charts/ScatterPlot/ScatterPlot.js +252 -0
  261. package/dist/components/charts/ScatterPlot/ScatterPlot.js.map +1 -0
  262. package/dist/components/charts/ScatterPlot/index.d.ts +2 -0
  263. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs +2 -0
  264. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.cjs.map +1 -0
  265. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.d.ts +25 -0
  266. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js +215 -0
  267. package/dist/components/charts/ScatterPlotInteractive/ScatterPlotInteractive.js.map +1 -0
  268. package/dist/components/charts/ScatterPlotInteractive/constants.cjs +2 -0
  269. package/dist/components/charts/ScatterPlotInteractive/constants.cjs.map +1 -0
  270. package/dist/components/charts/ScatterPlotInteractive/constants.d.ts +50 -0
  271. package/dist/components/charts/ScatterPlotInteractive/constants.js +38 -0
  272. package/dist/components/charts/ScatterPlotInteractive/constants.js.map +1 -0
  273. package/dist/components/charts/ScatterPlotInteractive/index.d.ts +3 -0
  274. package/dist/components/charts/ScatterPlotInteractive/types.d.ts +226 -0
  275. package/dist/components/charts/ScatterPlotInteractive/utils.cjs +2 -0
  276. package/dist/components/charts/ScatterPlotInteractive/utils.cjs.map +1 -0
  277. package/dist/components/charts/ScatterPlotInteractive/utils.d.ts +72 -0
  278. package/dist/components/charts/ScatterPlotInteractive/utils.js +261 -0
  279. package/dist/components/charts/ScatterPlotInteractive/utils.js.map +1 -0
  280. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs +2 -0
  281. package/dist/components/charts/StackedChromatogram/StackedChromatogram.cjs.map +1 -0
  282. package/dist/components/charts/StackedChromatogram/StackedChromatogram.d.ts +3 -0
  283. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js +40 -0
  284. package/dist/components/charts/StackedChromatogram/StackedChromatogram.js.map +1 -0
  285. package/dist/components/charts/StackedChromatogram/index.d.ts +3 -0
  286. package/dist/components/charts/StackedChromatogram/transforms.cjs +2 -0
  287. package/dist/components/charts/StackedChromatogram/transforms.cjs.map +1 -0
  288. package/dist/components/charts/StackedChromatogram/transforms.d.ts +9 -0
  289. package/dist/components/charts/StackedChromatogram/transforms.js +31 -0
  290. package/dist/components/charts/StackedChromatogram/transforms.js.map +1 -0
  291. package/dist/components/charts/StackedChromatogram/types.d.ts +26 -0
  292. package/dist/components/charts/plotly-loader.cjs +2 -0
  293. package/dist/components/charts/plotly-loader.cjs.map +1 -0
  294. package/dist/components/charts/plotly-loader.d.ts +29 -0
  295. package/dist/components/charts/plotly-loader.js +22 -0
  296. package/dist/components/charts/plotly-loader.js.map +1 -0
  297. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs +2 -0
  298. package/dist/components/composed/AssistantLayout/AssistantLayout.cjs.map +1 -0
  299. package/dist/components/composed/AssistantLayout/AssistantLayout.d.ts +63 -0
  300. package/dist/components/composed/AssistantLayout/AssistantLayout.js +142 -0
  301. package/dist/components/composed/AssistantLayout/AssistantLayout.js.map +1 -0
  302. package/dist/components/composed/AssistantLayout/dockLayout.cjs +2 -0
  303. package/dist/components/composed/AssistantLayout/dockLayout.cjs.map +1 -0
  304. package/dist/components/composed/AssistantLayout/dockLayout.d.ts +15 -0
  305. package/dist/components/composed/AssistantLayout/dockLayout.js +10 -0
  306. package/dist/components/composed/AssistantLayout/dockLayout.js.map +1 -0
  307. package/dist/components/composed/AssistantLayout/index.d.ts +3 -0
  308. package/dist/components/composed/Chat/Chat.cjs +1 -1
  309. package/dist/components/composed/Chat/Chat.cjs.map +1 -1
  310. package/dist/components/composed/Chat/Chat.d.ts +35 -0
  311. package/dist/components/composed/Chat/Chat.js +28 -28
  312. package/dist/components/composed/Chat/Chat.js.map +1 -1
  313. package/dist/components/composed/Chat/index.d.ts +2 -0
  314. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs +1 -1
  315. package/dist/components/composed/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  316. package/dist/components/composed/ConfirmDialog/ConfirmDialog.d.ts +23 -0
  317. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js +33 -29
  318. package/dist/components/composed/ConfirmDialog/ConfirmDialog.js.map +1 -1
  319. package/dist/components/composed/ConfirmDialog/index.d.ts +1 -0
  320. package/dist/components/composed/DataAppShell/CollapseButton.cjs +2 -0
  321. package/dist/components/composed/DataAppShell/CollapseButton.cjs.map +1 -0
  322. package/dist/components/composed/DataAppShell/CollapseButton.d.ts +23 -0
  323. package/dist/components/composed/DataAppShell/CollapseButton.js +42 -0
  324. package/dist/components/composed/DataAppShell/CollapseButton.js.map +1 -0
  325. package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
  326. package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
  327. package/dist/components/composed/DataAppShell/DataAppShell.d.ts +88 -0
  328. package/dist/components/composed/DataAppShell/DataAppShell.js +350 -328
  329. package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
  330. package/dist/components/composed/DataAppShell/PrimaryNav.cjs +2 -0
  331. package/dist/components/composed/DataAppShell/PrimaryNav.cjs.map +1 -0
  332. package/dist/components/composed/DataAppShell/PrimaryNav.d.ts +64 -0
  333. package/dist/components/composed/DataAppShell/PrimaryNav.js +268 -0
  334. package/dist/components/composed/DataAppShell/PrimaryNav.js.map +1 -0
  335. package/dist/components/composed/DataAppShell/RightPanel.cjs +2 -0
  336. package/dist/components/composed/DataAppShell/RightPanel.cjs.map +1 -0
  337. package/dist/components/composed/DataAppShell/RightPanel.d.ts +95 -0
  338. package/dist/components/composed/DataAppShell/RightPanel.js +282 -0
  339. package/dist/components/composed/DataAppShell/RightPanel.js.map +1 -0
  340. package/dist/components/composed/DataAppShell/SecondaryNav.cjs +2 -0
  341. package/dist/components/composed/DataAppShell/SecondaryNav.cjs.map +1 -0
  342. package/dist/components/composed/DataAppShell/SecondaryNav.d.ts +63 -0
  343. package/dist/components/composed/DataAppShell/SecondaryNav.js +364 -0
  344. package/dist/components/composed/DataAppShell/SecondaryNav.js.map +1 -0
  345. package/dist/components/composed/DataAppShell/ShellContext.cjs +2 -0
  346. package/dist/components/composed/DataAppShell/ShellContext.cjs.map +1 -0
  347. package/dist/components/composed/DataAppShell/ShellContext.d.ts +20 -0
  348. package/dist/components/composed/DataAppShell/ShellContext.js +23 -0
  349. package/dist/components/composed/DataAppShell/ShellContext.js.map +1 -0
  350. package/dist/components/composed/DataAppShell/index.d.ts +12 -0
  351. package/dist/components/composed/EmptyState/EmptyState.d.ts +12 -0
  352. package/dist/components/composed/EmptyState/index.d.ts +2 -0
  353. package/dist/components/composed/FormPatterns/FormSection.cjs +1 -1
  354. package/dist/components/composed/FormPatterns/FormSection.cjs.map +1 -1
  355. package/dist/components/composed/FormPatterns/FormSection.d.ts +7 -0
  356. package/dist/components/composed/FormPatterns/FormSection.js +2 -2
  357. package/dist/components/composed/FormPatterns/index.d.ts +1 -0
  358. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs +2 -0
  359. package/dist/components/composed/MoleculeStructure/MoleculeStructure.cjs.map +1 -0
  360. package/dist/components/composed/MoleculeStructure/MoleculeStructure.d.ts +43 -0
  361. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js +87 -0
  362. package/dist/components/composed/MoleculeStructure/MoleculeStructure.js.map +1 -0
  363. package/dist/components/composed/MoleculeStructure/index.d.ts +3 -0
  364. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs +2 -0
  365. package/dist/components/composed/MoleculeStructure/rdkit-loader.cjs.map +1 -0
  366. package/dist/components/composed/MoleculeStructure/rdkit-loader.d.ts +104 -0
  367. package/dist/components/composed/MoleculeStructure/rdkit-loader.js +89 -0
  368. package/dist/components/composed/MoleculeStructure/rdkit-loader.js.map +1 -0
  369. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs +2 -0
  370. package/dist/components/composed/MoleculeStructure/use-rdkit.cjs.map +1 -0
  371. package/dist/components/composed/MoleculeStructure/use-rdkit.d.ts +29 -0
  372. package/dist/components/composed/MoleculeStructure/use-rdkit.js +19 -0
  373. package/dist/components/composed/MoleculeStructure/use-rdkit.js.map +1 -0
  374. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs +1 -1
  375. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.cjs.map +1 -1
  376. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.d.ts +12 -0
  377. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js +21 -21
  378. package/dist/components/composed/PlateMapEditor/ManifestFilterPopover.js.map +1 -1
  379. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs +1 -1
  380. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.cjs.map +1 -1
  381. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.d.ts +22 -0
  382. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js +34 -34
  383. package/dist/components/composed/PlateMapEditor/PlateMapActionsMenu.js.map +1 -1
  384. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs +1 -1
  385. package/dist/components/composed/PlateMapEditor/PlateMapEditor.cjs.map +1 -1
  386. package/dist/components/composed/PlateMapEditor/PlateMapEditor.d.ts +106 -0
  387. package/dist/components/composed/PlateMapEditor/PlateMapEditor.js +2 -2
  388. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs +1 -1
  389. package/dist/components/composed/PlateMapEditor/PlateMapForm.cjs.map +1 -1
  390. package/dist/components/composed/PlateMapEditor/PlateMapForm.d.ts +30 -0
  391. package/dist/components/composed/PlateMapEditor/PlateMapForm.js +1 -1
  392. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs +1 -1
  393. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs.map +1 -1
  394. package/dist/components/composed/PlateMapEditor/PlateMapGrid.d.ts +64 -0
  395. package/dist/components/composed/PlateMapEditor/PlateMapGrid.js +1 -1
  396. package/dist/components/composed/PlateMapEditor/PlateMapManifest.d.ts +29 -0
  397. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs +1 -1
  398. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.cjs.map +1 -1
  399. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.d.ts +19 -0
  400. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js +11 -11
  401. package/dist/components/composed/PlateMapEditor/PlateMapPlateSelector.js.map +1 -1
  402. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs +1 -1
  403. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.cjs.map +1 -1
  404. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.d.ts +73 -0
  405. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js +1 -1
  406. package/dist/components/composed/PlateMapEditor/PlatePaintGrid.js.map +1 -1
  407. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs +1 -1
  408. package/dist/components/composed/PlateMapEditor/PlateZoomControl.cjs.map +1 -1
  409. package/dist/components/composed/PlateMapEditor/PlateZoomControl.d.ts +12 -0
  410. package/dist/components/composed/PlateMapEditor/PlateZoomControl.js +2 -2
  411. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs +1 -1
  412. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.cjs.map +1 -1
  413. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.d.ts +13 -0
  414. package/dist/components/composed/PlateMapEditor/TemplateIOPanel.js +4 -4
  415. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  416. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  417. package/dist/components/composed/PlateMapEditor/WellLegend.d.ts +21 -0
  418. package/dist/components/composed/PlateMapEditor/WellLegend.js +24 -12
  419. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
  420. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs +1 -1
  421. package/dist/components/composed/PlateMapEditor/WellManifestTable.cjs.map +1 -1
  422. package/dist/components/composed/PlateMapEditor/WellManifestTable.d.ts +46 -0
  423. package/dist/components/composed/PlateMapEditor/WellManifestTable.js +10 -10
  424. package/dist/components/composed/PlateMapEditor/WellManifestTable.js.map +1 -1
  425. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs +1 -1
  426. package/dist/components/composed/PlateMapEditor/WellMetadataForm.cjs.map +1 -1
  427. package/dist/components/composed/PlateMapEditor/WellMetadataForm.d.ts +17 -0
  428. package/dist/components/composed/PlateMapEditor/WellMetadataForm.js +7 -7
  429. package/dist/components/composed/PlateMapEditor/autoFill.d.ts +26 -0
  430. package/dist/components/composed/PlateMapEditor/csvPlateTriage.d.ts +4 -0
  431. package/dist/components/composed/PlateMapEditor/helpers.d.ts +2 -0
  432. package/dist/components/composed/PlateMapEditor/index.d.ts +31 -0
  433. package/dist/components/composed/PlateMapEditor/types.d.ts +137 -0
  434. package/dist/components/composed/PlateMapEditor/wellGrid.d.ts +12 -0
  435. package/dist/components/composed/ProcessFlow/ProcessFlow.d.ts +32 -0
  436. package/dist/components/composed/ProcessFlow/ProcessFlow.utils.d.ts +86 -0
  437. package/dist/components/composed/ProcessFlow/index.d.ts +1 -0
  438. package/dist/components/composed/RichListItem/RichListItem.cjs +1 -1
  439. package/dist/components/composed/RichListItem/RichListItem.cjs.map +1 -1
  440. package/dist/components/composed/RichListItem/RichListItem.d.ts +22 -0
  441. package/dist/components/composed/RichListItem/RichListItem.js +2 -2
  442. package/dist/components/composed/RichListItem/index.d.ts +2 -0
  443. package/dist/components/composed/StatCard/StatCard.cjs +1 -1
  444. package/dist/components/composed/StatCard/StatCard.cjs.map +1 -1
  445. package/dist/components/composed/StatCard/StatCard.d.ts +11 -0
  446. package/dist/components/composed/StatCard/StatCard.js +1 -1
  447. package/dist/components/composed/StatCard/index.d.ts +1 -0
  448. package/dist/components/composed/TdpSearch/TdpSearch.cjs +1 -1
  449. package/dist/components/composed/TdpSearch/TdpSearch.cjs.map +1 -1
  450. package/dist/components/composed/TdpSearch/TdpSearch.d.ts +21 -0
  451. package/dist/components/composed/TdpSearch/TdpSearch.js +14 -13
  452. package/dist/components/composed/TdpSearch/TdpSearch.mocks.d.ts +5 -0
  453. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +1 -1
  454. package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -1
  455. package/dist/components/composed/TdpSearch/components/DefaultFilters.d.ts +3 -0
  456. package/dist/components/composed/TdpSearch/components/DefaultFilters.js +4 -4
  457. package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -1
  458. package/dist/components/composed/TdpSearch/components/DefaultResults.cjs +1 -1
  459. package/dist/components/composed/TdpSearch/components/DefaultResults.cjs.map +1 -1
  460. package/dist/components/composed/TdpSearch/components/DefaultResults.d.ts +3 -0
  461. package/dist/components/composed/TdpSearch/components/DefaultResults.js +2 -2
  462. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs +1 -1
  463. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs.map +1 -1
  464. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.d.ts +3 -0
  465. package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js +2 -2
  466. package/dist/components/composed/TdpSearch/constants.d.ts +3 -0
  467. package/dist/components/composed/TdpSearch/hooks/useSearch.d.ts +2 -0
  468. package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.d.ts +14 -0
  469. package/dist/components/composed/TdpSearch/index.d.ts +3 -0
  470. package/dist/components/composed/TdpSearch/types.d.ts +128 -0
  471. package/dist/components/composed/TdpSearch/utils.d.ts +3 -0
  472. package/dist/components/composed/TopBar/TopBar.cjs +2 -0
  473. package/dist/components/composed/TopBar/TopBar.cjs.map +1 -0
  474. package/dist/components/composed/TopBar/TopBar.d.ts +25 -0
  475. package/dist/components/composed/TopBar/TopBar.js +56 -0
  476. package/dist/components/composed/TopBar/TopBar.js.map +1 -0
  477. package/dist/components/composed/TopBar/index.d.ts +2 -0
  478. package/dist/components/composed/UserMenu/UserMenu.cjs +2 -0
  479. package/dist/components/composed/UserMenu/UserMenu.cjs.map +1 -0
  480. package/dist/components/composed/UserMenu/UserMenu.d.ts +53 -0
  481. package/dist/components/composed/UserMenu/UserMenu.js +99 -0
  482. package/dist/components/composed/UserMenu/UserMenu.js.map +1 -0
  483. package/dist/components/composed/UserMenu/index.d.ts +2 -0
  484. package/dist/components/composed/tdp-link.d.ts +110 -0
  485. package/dist/components/composed/tdp-url.d.ts +68 -0
  486. package/dist/components/ui/accordion.d.ts +7 -0
  487. package/dist/components/ui/alert-dialog.d.ts +18 -0
  488. package/dist/components/ui/alert.d.ts +10 -0
  489. package/dist/components/ui/aspect-ratio.d.ts +3 -0
  490. package/dist/components/ui/avatar.d.ts +11 -0
  491. package/dist/components/ui/badge.d.ts +9 -0
  492. package/dist/components/ui/banner.d.ts +19 -0
  493. package/dist/components/ui/breadcrumb.d.ts +11 -0
  494. package/dist/components/ui/button-group.d.ts +11 -0
  495. package/dist/components/ui/button.d.ts +10 -0
  496. package/dist/components/ui/calendar.d.ts +10 -0
  497. package/dist/components/ui/card.d.ts +11 -0
  498. package/dist/components/ui/carousel.d.ts +28 -0
  499. package/dist/components/ui/checkbox.d.ts +4 -0
  500. package/dist/components/ui/code-block.d.ts +45 -0
  501. package/dist/components/ui/code-editor.d.ts +18 -0
  502. package/dist/components/ui/collapsible.d.ts +5 -0
  503. package/dist/components/ui/combobox.d.ts +24 -0
  504. package/dist/components/ui/command.d.ts +18 -0
  505. package/dist/components/ui/context-menu.d.ts +31 -0
  506. package/dist/components/ui/data-table/data-table-column-toggle.cjs +1 -1
  507. package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -1
  508. package/dist/components/ui/data-table/data-table-column-toggle.d.ts +6 -0
  509. package/dist/components/ui/data-table/data-table-column-toggle.js +71 -63
  510. package/dist/components/ui/data-table/data-table-column-toggle.js.map +1 -1
  511. package/dist/components/ui/data-table/data-table-filter.cjs +1 -1
  512. package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -1
  513. package/dist/components/ui/data-table/data-table-filter.d.ts +9 -0
  514. package/dist/components/ui/data-table/data-table-filter.js +26 -25
  515. package/dist/components/ui/data-table/data-table-filter.js.map +1 -1
  516. package/dist/components/ui/data-table/data-table-group.cjs +1 -1
  517. package/dist/components/ui/data-table/data-table-group.cjs.map +1 -1
  518. package/dist/components/ui/data-table/data-table-group.d.ts +9 -0
  519. package/dist/components/ui/data-table/data-table-group.js +18 -17
  520. package/dist/components/ui/data-table/data-table-group.js.map +1 -1
  521. package/dist/components/ui/data-table/data-table-pagination.cjs +1 -1
  522. package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -1
  523. package/dist/components/ui/data-table/data-table-pagination.d.ts +7 -0
  524. package/dist/components/ui/data-table/data-table-pagination.js +16 -16
  525. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  526. package/dist/components/ui/data-table/data-table.cjs +1 -1
  527. package/dist/components/ui/data-table/data-table.cjs.map +1 -1
  528. package/dist/components/ui/data-table/data-table.d.ts +82 -0
  529. package/dist/components/ui/data-table/data-table.js +191 -190
  530. package/dist/components/ui/data-table/data-table.js.map +1 -1
  531. package/dist/components/ui/data-table/index.d.ts +5 -0
  532. package/dist/components/ui/dialog.d.ts +18 -0
  533. package/dist/components/ui/dropdown-menu.d.ts +29 -0
  534. package/dist/components/ui/field.d.ts +24 -0
  535. package/dist/components/ui/hover-card.d.ts +6 -0
  536. package/dist/components/ui/input-group.d.ts +16 -0
  537. package/dist/components/ui/input.d.ts +3 -0
  538. package/dist/components/ui/item.d.ts +23 -0
  539. package/dist/components/ui/kbd.d.ts +3 -0
  540. package/dist/components/ui/label.d.ts +4 -0
  541. package/dist/components/ui/menubar.d.ts +30 -0
  542. package/dist/components/ui/navigation-menu.d.ts +14 -0
  543. package/dist/components/ui/popover.d.ts +7 -0
  544. package/dist/components/ui/progress.d.ts +4 -0
  545. package/dist/components/ui/radio-group.d.ts +5 -0
  546. package/dist/components/ui/resizable.d.ts +25 -0
  547. package/dist/components/ui/scroll-area.d.ts +5 -0
  548. package/dist/components/ui/select.d.ts +15 -0
  549. package/dist/components/ui/separator.d.ts +4 -0
  550. package/dist/components/ui/sheet.d.ts +14 -0
  551. package/dist/components/ui/sidebar.d.ts +69 -0
  552. package/dist/components/ui/skeleton.d.ts +2 -0
  553. package/dist/components/ui/slider.d.ts +4 -0
  554. package/dist/components/ui/snippet.d.ts +18 -0
  555. package/dist/components/ui/sonner.d.ts +3 -0
  556. package/dist/components/ui/spinner.d.ts +6 -0
  557. package/dist/components/ui/switch.d.ts +6 -0
  558. package/dist/components/ui/table.d.ts +22 -0
  559. package/dist/components/ui/tabs.d.ts +11 -0
  560. package/dist/components/ui/tetra-molecule-icon.d.ts +11 -0
  561. package/dist/components/ui/tetrascience-icon.d.ts +7 -0
  562. package/dist/components/ui/textarea.d.ts +3 -0
  563. package/dist/components/ui/toggle-group.d.ts +10 -0
  564. package/dist/components/ui/toggle.d.ts +9 -0
  565. package/dist/components/ui/tooltip.d.ts +7 -0
  566. package/dist/composed/AssistantLayout.cjs +2 -0
  567. package/dist/composed/AssistantLayout.cjs.map +1 -0
  568. package/dist/composed/AssistantLayout.js +10 -0
  569. package/dist/composed/AssistantLayout.js.map +1 -0
  570. package/dist/composed/Chat.cjs +2 -0
  571. package/dist/composed/Chat.cjs.map +1 -0
  572. package/dist/composed/Chat.js +5 -0
  573. package/dist/composed/Chat.js.map +1 -0
  574. package/dist/composed/ConfirmDialog.cjs +2 -0
  575. package/dist/composed/ConfirmDialog.cjs.map +1 -0
  576. package/dist/composed/ConfirmDialog.js +5 -0
  577. package/dist/composed/ConfirmDialog.js.map +1 -0
  578. package/dist/composed/DataAppShell.cjs +2 -0
  579. package/dist/composed/DataAppShell.cjs.map +1 -0
  580. package/dist/composed/DataAppShell.js +22 -0
  581. package/dist/composed/DataAppShell.js.map +1 -0
  582. package/dist/composed/EmptyState.cjs +2 -0
  583. package/dist/composed/EmptyState.cjs.map +1 -0
  584. package/dist/composed/EmptyState.js +5 -0
  585. package/dist/composed/EmptyState.js.map +1 -0
  586. package/dist/composed/FormPatterns.cjs +2 -0
  587. package/dist/composed/FormPatterns.cjs.map +1 -0
  588. package/dist/composed/FormPatterns.js +5 -0
  589. package/dist/composed/FormPatterns.js.map +1 -0
  590. package/dist/composed/MoleculeStructure.cjs +2 -0
  591. package/dist/composed/MoleculeStructure.cjs.map +1 -0
  592. package/dist/composed/MoleculeStructure.js +11 -0
  593. package/dist/composed/MoleculeStructure.js.map +1 -0
  594. package/dist/composed/PlateMapEditor.cjs +2 -0
  595. package/dist/composed/PlateMapEditor.cjs.map +1 -0
  596. package/dist/composed/PlateMapEditor.js +45 -0
  597. package/dist/composed/PlateMapEditor.js.map +1 -0
  598. package/dist/composed/ProcessFlow.cjs +2 -0
  599. package/dist/composed/ProcessFlow.cjs.map +1 -0
  600. package/dist/composed/ProcessFlow.js +7 -0
  601. package/dist/composed/ProcessFlow.js.map +1 -0
  602. package/dist/composed/RichListItem.cjs +2 -0
  603. package/dist/composed/RichListItem.cjs.map +1 -0
  604. package/dist/composed/RichListItem.js +6 -0
  605. package/dist/composed/RichListItem.js.map +1 -0
  606. package/dist/composed/StatCard.cjs +2 -0
  607. package/dist/composed/StatCard.cjs.map +1 -0
  608. package/dist/composed/StatCard.js +5 -0
  609. package/dist/composed/StatCard.js.map +1 -0
  610. package/dist/composed/TdpSearch.cjs +2 -0
  611. package/dist/composed/TdpSearch.cjs.map +1 -0
  612. package/dist/composed/TdpSearch.js +8 -0
  613. package/dist/composed/TdpSearch.js.map +1 -0
  614. package/dist/composed/TopBar.cjs +2 -0
  615. package/dist/composed/TopBar.cjs.map +1 -0
  616. package/dist/composed/TopBar.js +6 -0
  617. package/dist/composed/TopBar.js.map +1 -0
  618. package/dist/composed/UserMenu.cjs +2 -0
  619. package/dist/composed/UserMenu.cjs.map +1 -0
  620. package/dist/composed/UserMenu.js +7 -0
  621. package/dist/composed/UserMenu.js.map +1 -0
  622. package/dist/composed/tdp-link.cjs +2 -0
  623. package/dist/composed/tdp-link.cjs.map +1 -0
  624. package/dist/composed/tdp-link.js +84 -0
  625. package/dist/composed/tdp-link.js.map +1 -0
  626. package/dist/composed/tdp-url.cjs.map +1 -0
  627. package/dist/composed/tdp-url.js.map +1 -0
  628. package/dist/hooks/use-code-editor-theme.d.ts +34 -0
  629. package/dist/hooks/use-element-size.d.ts +25 -0
  630. package/dist/hooks/use-is-dark.d.ts +12 -0
  631. package/dist/hooks/use-mobile.d.ts +1 -0
  632. package/dist/hooks/use-plotly-theme.cjs +1 -1
  633. package/dist/hooks/use-plotly-theme.cjs.map +1 -1
  634. package/dist/hooks/use-plotly-theme.d.ts +49 -0
  635. package/dist/hooks/use-plotly-theme.js +4 -3
  636. package/dist/hooks/use-plotly-theme.js.map +1 -1
  637. package/dist/index.cjs +1 -1
  638. package/dist/index.css +1 -1
  639. package/dist/index.d.ts +102 -4404
  640. package/dist/index.js +698 -659
  641. package/dist/index.js.map +1 -1
  642. package/dist/index.tailwind.css +1 -1
  643. package/dist/jest-setup.cjs +4 -0
  644. package/dist/jest-setup.cjs.map +1 -0
  645. package/dist/jest-setup.d.ts +106 -0
  646. package/dist/jest-setup.js +218 -0
  647. package/dist/jest-setup.js.map +1 -0
  648. package/dist/lib/shiki.cjs +2 -0
  649. package/dist/lib/shiki.cjs.map +1 -0
  650. package/dist/lib/shiki.d.ts +32 -0
  651. package/dist/lib/shiki.js +72 -0
  652. package/dist/lib/shiki.js.map +1 -0
  653. package/dist/lib/utils.d.ts +2 -0
  654. package/dist/server/auth/JwtTokenManager.cjs +1 -1
  655. package/dist/server/auth/JwtTokenManager.cjs.map +1 -1
  656. package/dist/server/auth/JwtTokenManager.d.ts +113 -0
  657. package/dist/server/auth/JwtTokenManager.js +44 -21
  658. package/dist/server/auth/JwtTokenManager.js.map +1 -1
  659. package/dist/server/auth/index.d.ts +5 -0
  660. package/dist/server/index.d.ts +8 -0
  661. package/dist/server/providers/AthenaProvider.cjs +1 -1
  662. package/dist/server/providers/AthenaProvider.cjs.map +1 -1
  663. package/dist/server/providers/AthenaProvider.d.ts +75 -0
  664. package/dist/server/providers/DatabricksProvider.cjs +1 -1
  665. package/dist/server/providers/DatabricksProvider.cjs.map +1 -1
  666. package/dist/server/providers/DatabricksProvider.d.ts +38 -0
  667. package/dist/server/providers/SnowflakeProvider.cjs +1 -1
  668. package/dist/server/providers/SnowflakeProvider.cjs.map +1 -1
  669. package/dist/server/providers/SnowflakeProvider.d.ts +36 -0
  670. package/dist/server/providers/buildProvider.d.ts +39 -0
  671. package/dist/server/providers/entries/athena.d.ts +24 -0
  672. package/dist/server/providers/entries/databricks.d.ts +25 -0
  673. package/dist/server/providers/entries/snowflake.d.ts +25 -0
  674. package/dist/server/providers/exceptions.d.ts +36 -0
  675. package/dist/server/providers/getProviderConfigurations.d.ts +45 -0
  676. package/dist/server/providers/index.d.ts +31 -0
  677. package/dist/server/providers/providerDiscovery.d.ts +81 -0
  678. package/dist/server/providers/types.d.ts +145 -0
  679. package/dist/server/search/TdpSearchManager.d.ts +40 -0
  680. package/dist/server/search/index.d.ts +5 -0
  681. package/dist/server.d.ts +17 -540
  682. package/dist/ui/accordion.cjs +2 -0
  683. package/dist/ui/accordion.cjs.map +1 -0
  684. package/dist/ui/accordion.js +83 -0
  685. package/dist/ui/accordion.js.map +1 -0
  686. package/dist/ui/alert-dialog.cjs +2 -0
  687. package/dist/ui/alert-dialog.cjs.map +1 -0
  688. package/dist/ui/alert-dialog.js +181 -0
  689. package/dist/ui/alert-dialog.js.map +1 -0
  690. package/dist/ui/alert.cjs +2 -0
  691. package/dist/ui/alert.cjs.map +1 -0
  692. package/dist/ui/alert.js +81 -0
  693. package/dist/ui/alert.js.map +1 -0
  694. package/dist/ui/aspect-ratio.cjs.map +1 -0
  695. package/dist/ui/aspect-ratio.js.map +1 -0
  696. package/dist/ui/avatar.cjs +2 -0
  697. package/dist/ui/avatar.cjs.map +1 -0
  698. package/dist/ui/avatar.js +107 -0
  699. package/dist/ui/avatar.js.map +1 -0
  700. package/dist/ui/badge.cjs +2 -0
  701. package/dist/ui/badge.cjs.map +1 -0
  702. package/dist/ui/badge.js +47 -0
  703. package/dist/ui/badge.js.map +1 -0
  704. package/dist/ui/banner.cjs +2 -0
  705. package/dist/ui/banner.cjs.map +1 -0
  706. package/dist/ui/banner.js +80 -0
  707. package/dist/ui/banner.js.map +1 -0
  708. package/dist/ui/breadcrumb.cjs +2 -0
  709. package/dist/ui/breadcrumb.cjs.map +1 -0
  710. package/dist/ui/breadcrumb.js +118 -0
  711. package/dist/ui/breadcrumb.js.map +1 -0
  712. package/dist/ui/button-group.cjs +2 -0
  713. package/dist/ui/button-group.cjs.map +1 -0
  714. package/dist/ui/button-group.js +77 -0
  715. package/dist/ui/button-group.js.map +1 -0
  716. package/dist/ui/button.cjs +2 -0
  717. package/dist/ui/button.cjs.map +1 -0
  718. package/dist/ui/button.js +57 -0
  719. package/dist/ui/button.js.map +1 -0
  720. package/dist/ui/calendar.cjs +2 -0
  721. package/dist/ui/calendar.cjs.map +1 -0
  722. package/dist/ui/calendar.js +174 -0
  723. package/dist/ui/calendar.js.map +1 -0
  724. package/dist/ui/card.cjs +2 -0
  725. package/dist/ui/card.cjs.map +1 -0
  726. package/dist/ui/card.js +102 -0
  727. package/dist/ui/card.js.map +1 -0
  728. package/dist/ui/carousel.cjs +2 -0
  729. package/dist/ui/carousel.cjs.map +1 -0
  730. package/dist/ui/carousel.js +179 -0
  731. package/dist/ui/carousel.js.map +1 -0
  732. package/dist/ui/checkbox.cjs +2 -0
  733. package/dist/ui/checkbox.cjs.map +1 -0
  734. package/dist/ui/checkbox.js +35 -0
  735. package/dist/ui/checkbox.js.map +1 -0
  736. package/dist/ui/code-block.cjs +4 -0
  737. package/dist/ui/code-block.cjs.map +1 -0
  738. package/dist/ui/code-block.js +324 -0
  739. package/dist/ui/code-block.js.map +1 -0
  740. package/dist/ui/code-editor.cjs +2 -0
  741. package/dist/ui/code-editor.cjs.map +1 -0
  742. package/dist/ui/code-editor.js +106 -0
  743. package/dist/ui/code-editor.js.map +1 -0
  744. package/dist/ui/collapsible.cjs.map +1 -0
  745. package/dist/ui/collapsible.js.map +1 -0
  746. package/dist/ui/combobox.cjs +2 -0
  747. package/dist/ui/combobox.cjs.map +1 -0
  748. package/dist/ui/combobox.js +285 -0
  749. package/dist/ui/combobox.js.map +1 -0
  750. package/dist/ui/command.cjs +2 -0
  751. package/dist/ui/command.cjs.map +1 -0
  752. package/dist/ui/command.js +178 -0
  753. package/dist/ui/command.js.map +1 -0
  754. package/dist/ui/context-menu.cjs +2 -0
  755. package/dist/ui/context-menu.cjs.map +1 -0
  756. package/dist/ui/context-menu.js +236 -0
  757. package/dist/ui/context-menu.js.map +1 -0
  758. package/dist/ui/data-table.cjs +2 -0
  759. package/dist/ui/data-table.cjs.map +1 -0
  760. package/dist/ui/data-table.js +16 -0
  761. package/dist/ui/data-table.js.map +1 -0
  762. package/dist/ui/dialog.cjs +2 -0
  763. package/dist/ui/dialog.cjs.map +1 -0
  764. package/dist/ui/dialog.js +165 -0
  765. package/dist/ui/dialog.js.map +1 -0
  766. package/dist/ui/dropdown-menu.cjs +2 -0
  767. package/dist/ui/dropdown-menu.cjs.map +1 -0
  768. package/dist/ui/dropdown-menu.js +260 -0
  769. package/dist/ui/dropdown-menu.js.map +1 -0
  770. package/dist/ui/field.cjs +2 -0
  771. package/dist/ui/field.cjs.map +1 -0
  772. package/dist/ui/field.js +210 -0
  773. package/dist/ui/field.js.map +1 -0
  774. package/dist/ui/hover-card.cjs +2 -0
  775. package/dist/ui/hover-card.cjs.map +1 -0
  776. package/dist/ui/hover-card.js +39 -0
  777. package/dist/ui/hover-card.js.map +1 -0
  778. package/dist/ui/input-group.cjs +2 -0
  779. package/dist/ui/input-group.cjs.map +1 -0
  780. package/dist/ui/input-group.js +145 -0
  781. package/dist/ui/input-group.js.map +1 -0
  782. package/dist/ui/input.cjs +2 -0
  783. package/dist/ui/input.cjs.map +1 -0
  784. package/dist/ui/input.js +20 -0
  785. package/dist/ui/input.js.map +1 -0
  786. package/dist/ui/item.cjs +2 -0
  787. package/dist/ui/item.cjs.map +1 -0
  788. package/dist/ui/item.js +199 -0
  789. package/dist/ui/item.js.map +1 -0
  790. package/dist/ui/kbd.cjs +2 -0
  791. package/dist/ui/kbd.cjs.map +1 -0
  792. package/dist/ui/kbd.js +30 -0
  793. package/dist/ui/kbd.js.map +1 -0
  794. package/dist/ui/label.cjs +2 -0
  795. package/dist/ui/label.cjs.map +1 -0
  796. package/dist/ui/label.js +23 -0
  797. package/dist/ui/label.js.map +1 -0
  798. package/dist/ui/menubar.cjs +2 -0
  799. package/dist/ui/menubar.cjs.map +1 -0
  800. package/dist/ui/menubar.js +256 -0
  801. package/dist/ui/menubar.js.map +1 -0
  802. package/dist/ui/navigation-menu.cjs +2 -0
  803. package/dist/ui/navigation-menu.cjs.map +1 -0
  804. package/dist/ui/navigation-menu.js +164 -0
  805. package/dist/ui/navigation-menu.js.map +1 -0
  806. package/dist/ui/popover.cjs +2 -0
  807. package/dist/ui/popover.cjs.map +1 -0
  808. package/dist/ui/popover.js +45 -0
  809. package/dist/ui/popover.js.map +1 -0
  810. package/dist/ui/radio-group.cjs +2 -0
  811. package/dist/ui/radio-group.cjs.map +1 -0
  812. package/dist/ui/radio-group.js +45 -0
  813. package/dist/ui/radio-group.js.map +1 -0
  814. package/dist/ui/resizable.cjs +2 -0
  815. package/dist/ui/resizable.cjs.map +1 -0
  816. package/dist/ui/resizable.js +58 -0
  817. package/dist/ui/resizable.js.map +1 -0
  818. package/dist/ui/scroll-area.cjs +2 -0
  819. package/dist/ui/scroll-area.cjs.map +1 -0
  820. package/dist/ui/scroll-area.js +61 -0
  821. package/dist/ui/scroll-area.js.map +1 -0
  822. package/dist/ui/select.cjs +2 -0
  823. package/dist/ui/select.cjs.map +1 -0
  824. package/dist/ui/select.js +184 -0
  825. package/dist/ui/select.js.map +1 -0
  826. package/dist/ui/separator.cjs +2 -0
  827. package/dist/ui/separator.cjs.map +1 -0
  828. package/dist/ui/separator.js +27 -0
  829. package/dist/ui/separator.js.map +1 -0
  830. package/dist/ui/sheet.cjs +2 -0
  831. package/dist/ui/sheet.cjs.map +1 -0
  832. package/dist/ui/sheet.js +137 -0
  833. package/dist/ui/sheet.js.map +1 -0
  834. package/dist/ui/sidebar.cjs +2 -0
  835. package/dist/ui/sidebar.cjs.map +1 -0
  836. package/dist/ui/sidebar.js +579 -0
  837. package/dist/ui/sidebar.js.map +1 -0
  838. package/dist/ui/skeleton.cjs +2 -0
  839. package/dist/ui/skeleton.cjs.map +1 -0
  840. package/dist/ui/skeleton.js +24 -0
  841. package/dist/ui/skeleton.js.map +1 -0
  842. package/dist/ui/slider.cjs +2 -0
  843. package/dist/ui/slider.cjs.map +1 -0
  844. package/dist/ui/slider.js +61 -0
  845. package/dist/ui/slider.js.map +1 -0
  846. package/dist/ui/sonner.cjs +2 -0
  847. package/dist/ui/sonner.cjs.map +1 -0
  848. package/dist/ui/sonner.js +52 -0
  849. package/dist/ui/sonner.js.map +1 -0
  850. package/dist/ui/spinner.cjs +2 -0
  851. package/dist/ui/spinner.cjs.map +1 -0
  852. package/dist/ui/spinner.js +39 -0
  853. package/dist/ui/spinner.js.map +1 -0
  854. package/dist/ui/switch.cjs +2 -0
  855. package/dist/ui/switch.cjs.map +1 -0
  856. package/dist/ui/switch.js +32 -0
  857. package/dist/ui/switch.js.map +1 -0
  858. package/dist/ui/table.cjs +2 -0
  859. package/dist/ui/table.cjs.map +1 -0
  860. package/dist/ui/table.js +153 -0
  861. package/dist/ui/table.js.map +1 -0
  862. package/dist/ui/tabs.cjs +2 -0
  863. package/dist/ui/tabs.cjs.map +1 -0
  864. package/dist/ui/tabs.js +92 -0
  865. package/dist/ui/tabs.js.map +1 -0
  866. package/dist/ui/tetra-molecule-icon.cjs +2 -0
  867. package/dist/ui/tetra-molecule-icon.cjs.map +1 -0
  868. package/dist/ui/tetra-molecule-icon.js +50 -0
  869. package/dist/ui/tetra-molecule-icon.js.map +1 -0
  870. package/dist/ui/tetrascience-icon.cjs +2 -0
  871. package/dist/ui/tetrascience-icon.cjs.map +1 -0
  872. package/dist/ui/tetrascience-icon.js +47 -0
  873. package/dist/ui/tetrascience-icon.js.map +1 -0
  874. package/dist/ui/textarea.cjs +2 -0
  875. package/dist/ui/textarea.cjs.map +1 -0
  876. package/dist/ui/textarea.js +19 -0
  877. package/dist/ui/textarea.js.map +1 -0
  878. package/dist/ui/toggle-group.cjs +2 -0
  879. package/dist/ui/toggle-group.cjs.map +1 -0
  880. package/dist/ui/toggle-group.js +81 -0
  881. package/dist/ui/toggle-group.js.map +1 -0
  882. package/dist/ui/toggle.cjs +2 -0
  883. package/dist/ui/toggle.cjs.map +1 -0
  884. package/dist/ui/toggle.js +44 -0
  885. package/dist/ui/toggle.js.map +1 -0
  886. package/dist/ui/tooltip.cjs +2 -0
  887. package/dist/ui/tooltip.cjs.map +1 -0
  888. package/dist/ui/tooltip.js +56 -0
  889. package/dist/ui/tooltip.js.map +1 -0
  890. package/dist/utils/colors.d.ts +50 -0
  891. package/package.json +137 -24
  892. package/dist/athena.d.ts +0 -167
  893. package/dist/components/ai/attachments.cjs +0 -2
  894. package/dist/components/ai/attachments.cjs.map +0 -1
  895. package/dist/components/ai/attachments.js +0 -224
  896. package/dist/components/ai/attachments.js.map +0 -1
  897. package/dist/components/ai/chain-of-thought.cjs +0 -2
  898. package/dist/components/ai/chain-of-thought.cjs.map +0 -1
  899. package/dist/components/ai/chain-of-thought.js +0 -145
  900. package/dist/components/ai/chain-of-thought.js.map +0 -1
  901. package/dist/components/ai/confirmation.cjs +0 -2
  902. package/dist/components/ai/confirmation.cjs.map +0 -1
  903. package/dist/components/ai/confirmation.js +0 -109
  904. package/dist/components/ai/confirmation.js.map +0 -1
  905. package/dist/components/ai/context.cjs +0 -2
  906. package/dist/components/ai/context.cjs.map +0 -1
  907. package/dist/components/ai/context.js +0 -266
  908. package/dist/components/ai/context.js.map +0 -1
  909. package/dist/components/ai/conversation.cjs +0 -4
  910. package/dist/components/ai/conversation.cjs.map +0 -1
  911. package/dist/components/ai/conversation.js +0 -108
  912. package/dist/components/ai/conversation.js.map +0 -1
  913. package/dist/components/ai/inline-citation.cjs +0 -2
  914. package/dist/components/ai/inline-citation.cjs.map +0 -1
  915. package/dist/components/ai/inline-citation.js +0 -182
  916. package/dist/components/ai/inline-citation.js.map +0 -1
  917. package/dist/components/ai/message.cjs +0 -2
  918. package/dist/components/ai/message.cjs.map +0 -1
  919. package/dist/components/ai/message.js +0 -237
  920. package/dist/components/ai/message.js.map +0 -1
  921. package/dist/components/ai/model-selector.cjs +0 -2
  922. package/dist/components/ai/model-selector.cjs.map +0 -1
  923. package/dist/components/ai/model-selector.js +0 -77
  924. package/dist/components/ai/model-selector.js.map +0 -1
  925. package/dist/components/ai/prompt-input.cjs +0 -2
  926. package/dist/components/ai/prompt-input.cjs.map +0 -1
  927. package/dist/components/ai/prompt-input.js +0 -774
  928. package/dist/components/ai/prompt-input.js.map +0 -1
  929. package/dist/components/ai/queue.cjs +0 -2
  930. package/dist/components/ai/queue.cjs.map +0 -1
  931. package/dist/components/ai/queue.js +0 -209
  932. package/dist/components/ai/queue.js.map +0 -1
  933. package/dist/components/ai/reasoning.cjs +0 -2
  934. package/dist/components/ai/reasoning.cjs.map +0 -1
  935. package/dist/components/ai/reasoning.js +0 -129
  936. package/dist/components/ai/reasoning.js.map +0 -1
  937. package/dist/components/ai/shimmer.cjs +0 -2
  938. package/dist/components/ai/shimmer.cjs.map +0 -1
  939. package/dist/components/ai/shimmer.js +0 -49
  940. package/dist/components/ai/shimmer.js.map +0 -1
  941. package/dist/components/ai/sources.cjs +0 -2
  942. package/dist/components/ai/sources.cjs.map +0 -1
  943. package/dist/components/ai/sources.js +0 -54
  944. package/dist/components/ai/sources.js.map +0 -1
  945. package/dist/components/ai/speech-input.cjs +0 -2
  946. package/dist/components/ai/speech-input.cjs.map +0 -1
  947. package/dist/components/ai/speech-input.js +0 -123
  948. package/dist/components/ai/speech-input.js.map +0 -1
  949. package/dist/components/ai/stream-status.cjs +0 -2
  950. package/dist/components/ai/stream-status.cjs.map +0 -1
  951. package/dist/components/ai/stream-status.js +0 -106
  952. package/dist/components/ai/stream-status.js.map +0 -1
  953. package/dist/components/ai/suggestion.cjs +0 -2
  954. package/dist/components/ai/suggestion.cjs.map +0 -1
  955. package/dist/components/ai/suggestion.js +0 -38
  956. package/dist/components/ai/suggestion.js.map +0 -1
  957. package/dist/components/ai/task.cjs +0 -2
  958. package/dist/components/ai/task.cjs.map +0 -1
  959. package/dist/components/ai/task.js +0 -94
  960. package/dist/components/ai/task.js.map +0 -1
  961. package/dist/components/ai/tool.cjs +0 -2
  962. package/dist/components/ai/tool.cjs.map +0 -1
  963. package/dist/components/ai/tool.js +0 -143
  964. package/dist/components/ai/tool.js.map +0 -1
  965. package/dist/components/charts/AreaGraph/AreaGraph.cjs +0 -2
  966. package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +0 -1
  967. package/dist/components/charts/AreaGraph/AreaGraph.js +0 -271
  968. package/dist/components/charts/AreaGraph/AreaGraph.js.map +0 -1
  969. package/dist/components/charts/BarGraph/BarGraph.cjs +0 -2
  970. package/dist/components/charts/BarGraph/BarGraph.cjs.map +0 -1
  971. package/dist/components/charts/BarGraph/BarGraph.js +0 -220
  972. package/dist/components/charts/BarGraph/BarGraph.js.map +0 -1
  973. package/dist/components/charts/Boxplot/Boxplot.cjs +0 -2
  974. package/dist/components/charts/Boxplot/Boxplot.cjs.map +0 -1
  975. package/dist/components/charts/Boxplot/Boxplot.js +0 -209
  976. package/dist/components/charts/Boxplot/Boxplot.js.map +0 -1
  977. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +0 -2
  978. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +0 -1
  979. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +0 -227
  980. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +0 -1
  981. package/dist/components/charts/ChromatogramChart/annotations.cjs +0 -2
  982. package/dist/components/charts/ChromatogramChart/annotations.cjs.map +0 -1
  983. package/dist/components/charts/ChromatogramChart/annotations.js +0 -73
  984. package/dist/components/charts/ChromatogramChart/annotations.js.map +0 -1
  985. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +0 -2
  986. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +0 -1
  987. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +0 -34
  988. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +0 -1
  989. package/dist/components/charts/ChromatogramChart/constants.cjs +0 -2
  990. package/dist/components/charts/ChromatogramChart/constants.cjs.map +0 -1
  991. package/dist/components/charts/ChromatogramChart/constants.js +0 -30
  992. package/dist/components/charts/ChromatogramChart/constants.js.map +0 -1
  993. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +0 -2
  994. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +0 -1
  995. package/dist/components/charts/ChromatogramChart/dataProcessing.js +0 -79
  996. package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +0 -1
  997. package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +0 -1
  998. package/dist/components/charts/ChromatogramChart/peakDetection.js.map +0 -1
  999. package/dist/components/charts/DotPlot/DotPlot.cjs +0 -2
  1000. package/dist/components/charts/DotPlot/DotPlot.cjs.map +0 -1
  1001. package/dist/components/charts/DotPlot/DotPlot.js +0 -208
  1002. package/dist/components/charts/DotPlot/DotPlot.js.map +0 -1
  1003. package/dist/components/charts/Heatmap/Heatmap.cjs +0 -2
  1004. package/dist/components/charts/Heatmap/Heatmap.cjs.map +0 -1
  1005. package/dist/components/charts/Heatmap/Heatmap.js +0 -67
  1006. package/dist/components/charts/Heatmap/Heatmap.js.map +0 -1
  1007. package/dist/components/charts/LineGraph/LineGraph.cjs +0 -2
  1008. package/dist/components/charts/LineGraph/LineGraph.cjs.map +0 -1
  1009. package/dist/components/charts/LineGraph/LineGraph.js +0 -225
  1010. package/dist/components/charts/LineGraph/LineGraph.js.map +0 -1
  1011. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +0 -2
  1012. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +0 -1
  1013. package/dist/components/charts/ScatterGraph/ScatterGraph.js +0 -234
  1014. package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +0 -1
  1015. package/dist/components/composed/tdp-link.cjs +0 -2
  1016. package/dist/components/composed/tdp-link.cjs.map +0 -1
  1017. package/dist/components/composed/tdp-link.js +0 -84
  1018. package/dist/components/composed/tdp-link.js.map +0 -1
  1019. package/dist/components/composed/tdp-url.cjs.map +0 -1
  1020. package/dist/components/composed/tdp-url.js.map +0 -1
  1021. package/dist/components/ui/accordion.cjs +0 -2
  1022. package/dist/components/ui/accordion.cjs.map +0 -1
  1023. package/dist/components/ui/accordion.js +0 -83
  1024. package/dist/components/ui/accordion.js.map +0 -1
  1025. package/dist/components/ui/alert-dialog.cjs +0 -2
  1026. package/dist/components/ui/alert-dialog.cjs.map +0 -1
  1027. package/dist/components/ui/alert-dialog.js +0 -181
  1028. package/dist/components/ui/alert-dialog.js.map +0 -1
  1029. package/dist/components/ui/alert.cjs +0 -2
  1030. package/dist/components/ui/alert.cjs.map +0 -1
  1031. package/dist/components/ui/alert.js +0 -81
  1032. package/dist/components/ui/alert.js.map +0 -1
  1033. package/dist/components/ui/aspect-ratio.cjs.map +0 -1
  1034. package/dist/components/ui/aspect-ratio.js.map +0 -1
  1035. package/dist/components/ui/avatar.cjs +0 -2
  1036. package/dist/components/ui/avatar.cjs.map +0 -1
  1037. package/dist/components/ui/avatar.js +0 -107
  1038. package/dist/components/ui/avatar.js.map +0 -1
  1039. package/dist/components/ui/badge.cjs +0 -2
  1040. package/dist/components/ui/badge.cjs.map +0 -1
  1041. package/dist/components/ui/badge.js +0 -47
  1042. package/dist/components/ui/badge.js.map +0 -1
  1043. package/dist/components/ui/banner.cjs +0 -2
  1044. package/dist/components/ui/banner.cjs.map +0 -1
  1045. package/dist/components/ui/banner.js +0 -80
  1046. package/dist/components/ui/banner.js.map +0 -1
  1047. package/dist/components/ui/breadcrumb.cjs +0 -2
  1048. package/dist/components/ui/breadcrumb.cjs.map +0 -1
  1049. package/dist/components/ui/breadcrumb.js +0 -118
  1050. package/dist/components/ui/breadcrumb.js.map +0 -1
  1051. package/dist/components/ui/button-group.cjs +0 -2
  1052. package/dist/components/ui/button-group.cjs.map +0 -1
  1053. package/dist/components/ui/button-group.js +0 -77
  1054. package/dist/components/ui/button-group.js.map +0 -1
  1055. package/dist/components/ui/button.cjs +0 -2
  1056. package/dist/components/ui/button.cjs.map +0 -1
  1057. package/dist/components/ui/button.js +0 -57
  1058. package/dist/components/ui/button.js.map +0 -1
  1059. package/dist/components/ui/calendar.cjs +0 -2
  1060. package/dist/components/ui/calendar.cjs.map +0 -1
  1061. package/dist/components/ui/calendar.js +0 -174
  1062. package/dist/components/ui/calendar.js.map +0 -1
  1063. package/dist/components/ui/card.cjs +0 -2
  1064. package/dist/components/ui/card.cjs.map +0 -1
  1065. package/dist/components/ui/card.js +0 -102
  1066. package/dist/components/ui/card.js.map +0 -1
  1067. package/dist/components/ui/carousel.cjs +0 -2
  1068. package/dist/components/ui/carousel.cjs.map +0 -1
  1069. package/dist/components/ui/carousel.js +0 -179
  1070. package/dist/components/ui/carousel.js.map +0 -1
  1071. package/dist/components/ui/checkbox.cjs +0 -2
  1072. package/dist/components/ui/checkbox.cjs.map +0 -1
  1073. package/dist/components/ui/checkbox.js +0 -35
  1074. package/dist/components/ui/checkbox.js.map +0 -1
  1075. package/dist/components/ui/code-block.cjs +0 -4
  1076. package/dist/components/ui/code-block.cjs.map +0 -1
  1077. package/dist/components/ui/code-block.js +0 -306
  1078. package/dist/components/ui/code-block.js.map +0 -1
  1079. package/dist/components/ui/code-editor.cjs +0 -2
  1080. package/dist/components/ui/code-editor.cjs.map +0 -1
  1081. package/dist/components/ui/code-editor.js +0 -103
  1082. package/dist/components/ui/code-editor.js.map +0 -1
  1083. package/dist/components/ui/collapsible.cjs.map +0 -1
  1084. package/dist/components/ui/collapsible.js.map +0 -1
  1085. package/dist/components/ui/combobox.cjs +0 -2
  1086. package/dist/components/ui/combobox.cjs.map +0 -1
  1087. package/dist/components/ui/combobox.js +0 -281
  1088. package/dist/components/ui/combobox.js.map +0 -1
  1089. package/dist/components/ui/command.cjs +0 -2
  1090. package/dist/components/ui/command.cjs.map +0 -1
  1091. package/dist/components/ui/command.js +0 -174
  1092. package/dist/components/ui/command.js.map +0 -1
  1093. package/dist/components/ui/context-menu.cjs +0 -2
  1094. package/dist/components/ui/context-menu.cjs.map +0 -1
  1095. package/dist/components/ui/context-menu.js +0 -236
  1096. package/dist/components/ui/context-menu.js.map +0 -1
  1097. package/dist/components/ui/dialog.cjs +0 -2
  1098. package/dist/components/ui/dialog.cjs.map +0 -1
  1099. package/dist/components/ui/dialog.js +0 -165
  1100. package/dist/components/ui/dialog.js.map +0 -1
  1101. package/dist/components/ui/drawer.cjs +0 -2
  1102. package/dist/components/ui/drawer.cjs.map +0 -1
  1103. package/dist/components/ui/drawer.js +0 -125
  1104. package/dist/components/ui/drawer.js.map +0 -1
  1105. package/dist/components/ui/dropdown-menu.cjs +0 -2
  1106. package/dist/components/ui/dropdown-menu.cjs.map +0 -1
  1107. package/dist/components/ui/dropdown-menu.js +0 -252
  1108. package/dist/components/ui/dropdown-menu.js.map +0 -1
  1109. package/dist/components/ui/field.cjs +0 -2
  1110. package/dist/components/ui/field.cjs.map +0 -1
  1111. package/dist/components/ui/field.js +0 -210
  1112. package/dist/components/ui/field.js.map +0 -1
  1113. package/dist/components/ui/hover-card.cjs +0 -2
  1114. package/dist/components/ui/hover-card.cjs.map +0 -1
  1115. package/dist/components/ui/hover-card.js +0 -39
  1116. package/dist/components/ui/hover-card.js.map +0 -1
  1117. package/dist/components/ui/input-group.cjs +0 -2
  1118. package/dist/components/ui/input-group.cjs.map +0 -1
  1119. package/dist/components/ui/input-group.js +0 -145
  1120. package/dist/components/ui/input-group.js.map +0 -1
  1121. package/dist/components/ui/input-otp.cjs +0 -2
  1122. package/dist/components/ui/input-otp.cjs.map +0 -1
  1123. package/dist/components/ui/input-otp.js +0 -82
  1124. package/dist/components/ui/input-otp.js.map +0 -1
  1125. package/dist/components/ui/input.cjs +0 -2
  1126. package/dist/components/ui/input.cjs.map +0 -1
  1127. package/dist/components/ui/input.js +0 -20
  1128. package/dist/components/ui/input.js.map +0 -1
  1129. package/dist/components/ui/item.cjs +0 -2
  1130. package/dist/components/ui/item.cjs.map +0 -1
  1131. package/dist/components/ui/item.js +0 -191
  1132. package/dist/components/ui/item.js.map +0 -1
  1133. package/dist/components/ui/kbd.cjs +0 -2
  1134. package/dist/components/ui/kbd.cjs.map +0 -1
  1135. package/dist/components/ui/kbd.js +0 -30
  1136. package/dist/components/ui/kbd.js.map +0 -1
  1137. package/dist/components/ui/label.cjs +0 -2
  1138. package/dist/components/ui/label.cjs.map +0 -1
  1139. package/dist/components/ui/label.js +0 -23
  1140. package/dist/components/ui/label.js.map +0 -1
  1141. package/dist/components/ui/menubar.cjs +0 -2
  1142. package/dist/components/ui/menubar.cjs.map +0 -1
  1143. package/dist/components/ui/menubar.js +0 -256
  1144. package/dist/components/ui/menubar.js.map +0 -1
  1145. package/dist/components/ui/navigation-menu.cjs +0 -2
  1146. package/dist/components/ui/navigation-menu.cjs.map +0 -1
  1147. package/dist/components/ui/navigation-menu.js +0 -164
  1148. package/dist/components/ui/navigation-menu.js.map +0 -1
  1149. package/dist/components/ui/popover.cjs +0 -2
  1150. package/dist/components/ui/popover.cjs.map +0 -1
  1151. package/dist/components/ui/popover.js +0 -45
  1152. package/dist/components/ui/popover.js.map +0 -1
  1153. package/dist/components/ui/radio-group.cjs +0 -2
  1154. package/dist/components/ui/radio-group.cjs.map +0 -1
  1155. package/dist/components/ui/radio-group.js +0 -45
  1156. package/dist/components/ui/radio-group.js.map +0 -1
  1157. package/dist/components/ui/resizable.cjs +0 -2
  1158. package/dist/components/ui/resizable.cjs.map +0 -1
  1159. package/dist/components/ui/resizable.js +0 -58
  1160. package/dist/components/ui/resizable.js.map +0 -1
  1161. package/dist/components/ui/scroll-area.cjs +0 -2
  1162. package/dist/components/ui/scroll-area.cjs.map +0 -1
  1163. package/dist/components/ui/scroll-area.js +0 -60
  1164. package/dist/components/ui/scroll-area.js.map +0 -1
  1165. package/dist/components/ui/select.cjs +0 -2
  1166. package/dist/components/ui/select.cjs.map +0 -1
  1167. package/dist/components/ui/select.js +0 -184
  1168. package/dist/components/ui/select.js.map +0 -1
  1169. package/dist/components/ui/separator.cjs +0 -2
  1170. package/dist/components/ui/separator.cjs.map +0 -1
  1171. package/dist/components/ui/separator.js +0 -27
  1172. package/dist/components/ui/separator.js.map +0 -1
  1173. package/dist/components/ui/sheet.cjs +0 -2
  1174. package/dist/components/ui/sheet.cjs.map +0 -1
  1175. package/dist/components/ui/sheet.js +0 -137
  1176. package/dist/components/ui/sheet.js.map +0 -1
  1177. package/dist/components/ui/sidebar.cjs +0 -2
  1178. package/dist/components/ui/sidebar.cjs.map +0 -1
  1179. package/dist/components/ui/sidebar.js +0 -579
  1180. package/dist/components/ui/sidebar.js.map +0 -1
  1181. package/dist/components/ui/skeleton.cjs +0 -2
  1182. package/dist/components/ui/skeleton.cjs.map +0 -1
  1183. package/dist/components/ui/skeleton.js +0 -24
  1184. package/dist/components/ui/skeleton.js.map +0 -1
  1185. package/dist/components/ui/slider.cjs +0 -2
  1186. package/dist/components/ui/slider.cjs.map +0 -1
  1187. package/dist/components/ui/slider.js +0 -60
  1188. package/dist/components/ui/slider.js.map +0 -1
  1189. package/dist/components/ui/sonner.cjs +0 -2
  1190. package/dist/components/ui/sonner.cjs.map +0 -1
  1191. package/dist/components/ui/sonner.js +0 -37
  1192. package/dist/components/ui/sonner.js.map +0 -1
  1193. package/dist/components/ui/spinner.cjs +0 -2
  1194. package/dist/components/ui/spinner.cjs.map +0 -1
  1195. package/dist/components/ui/spinner.js +0 -39
  1196. package/dist/components/ui/spinner.js.map +0 -1
  1197. package/dist/components/ui/switch.cjs +0 -2
  1198. package/dist/components/ui/switch.cjs.map +0 -1
  1199. package/dist/components/ui/switch.js +0 -32
  1200. package/dist/components/ui/switch.js.map +0 -1
  1201. package/dist/components/ui/table.cjs +0 -2
  1202. package/dist/components/ui/table.cjs.map +0 -1
  1203. package/dist/components/ui/table.js +0 -152
  1204. package/dist/components/ui/table.js.map +0 -1
  1205. package/dist/components/ui/tabs.cjs +0 -2
  1206. package/dist/components/ui/tabs.cjs.map +0 -1
  1207. package/dist/components/ui/tabs.js +0 -92
  1208. package/dist/components/ui/tabs.js.map +0 -1
  1209. package/dist/components/ui/tetrascience-icon.cjs +0 -2
  1210. package/dist/components/ui/tetrascience-icon.cjs.map +0 -1
  1211. package/dist/components/ui/tetrascience-icon.js +0 -46
  1212. package/dist/components/ui/tetrascience-icon.js.map +0 -1
  1213. package/dist/components/ui/textarea.cjs +0 -2
  1214. package/dist/components/ui/textarea.cjs.map +0 -1
  1215. package/dist/components/ui/textarea.js +0 -19
  1216. package/dist/components/ui/textarea.js.map +0 -1
  1217. package/dist/components/ui/toggle-group.cjs +0 -2
  1218. package/dist/components/ui/toggle-group.cjs.map +0 -1
  1219. package/dist/components/ui/toggle-group.js +0 -77
  1220. package/dist/components/ui/toggle-group.js.map +0 -1
  1221. package/dist/components/ui/toggle.cjs +0 -2
  1222. package/dist/components/ui/toggle.cjs.map +0 -1
  1223. package/dist/components/ui/toggle.js +0 -44
  1224. package/dist/components/ui/toggle.js.map +0 -1
  1225. package/dist/components/ui/tooltip.cjs +0 -2
  1226. package/dist/components/ui/tooltip.cjs.map +0 -1
  1227. package/dist/components/ui/tooltip.js +0 -56
  1228. package/dist/components/ui/tooltip.js.map +0 -1
  1229. package/dist/databricks.d.ts +0 -129
  1230. package/dist/providers/athena.d.ts +0 -9
  1231. package/dist/providers/databricks.d.ts +0 -9
  1232. package/dist/providers/snowflake.d.ts +0 -9
  1233. package/dist/snowflake.d.ts +0 -125
  1234. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.cjs +0 -0
  1235. /package/dist/components/charts/{ChromatogramChart → Chromatogram}/peakDetection.js +0 -0
  1236. /package/dist/{components/composed → composed}/tdp-url.cjs +0 -0
  1237. /package/dist/{components/composed → composed}/tdp-url.js +0 -0
  1238. /package/dist/{components/ui → ui}/aspect-ratio.cjs +0 -0
  1239. /package/dist/{components/ui → ui}/aspect-ratio.js +0 -0
  1240. /package/dist/{components/ui → ui}/collapsible.cjs +0 -0
  1241. /package/dist/{components/ui → ui}/collapsible.js +0 -0
@@ -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>\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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"}
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,
@@ -31,7 +31,7 @@ function Qe({
31
31
  ] }),
32
32
  /* @__PURE__ */ i(Le, { anchor: b, children: [
33
33
  /* @__PURE__ */ t(Be, { children: "No options." }),
34
- /* @__PURE__ */ t(Ve, { children: (m) => /* @__PURE__ */ t(We, { value: m, children: g.get(m) ?? m }, m) })
34
+ /* @__PURE__ */ t(Ve, { "aria-label": d, children: (m) => /* @__PURE__ */ t(We, { value: m, children: g.get(m) ?? m }, m) })
35
35
  ] })
36
36
  ] });
37
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WellManifestTable.js","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>\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","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","m","f","resolvedFilterColumns","arr","id","row","filtered","record","condition","cellRaw","cellValue","applyFilterCondition","have","r","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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"}
1
+ {"version":3,"file":"WellManifestTable.js","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","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","m","f","resolvedFilterColumns","arr","id","row","filtered","record","condition","cellRaw","cellValue","applyFilterCondition","have","r","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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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),S=require("react"),k=require("../../ui/button.cjs"),q=require("../../ui/checkbox.cjs"),i=require("../../ui/combobox.cjs"),I=require("../../ui/input.cjs"),F=require("../../ui/label.cjs"),x=require("../../ui/select.cjs"),M=require("../../ui/switch.cjs"),_=require("../../../lib/utils.cjs");function $(o){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const r in o)if(r!=="default"){const c=Object.getOwnPropertyDescriptor(o,r);Object.defineProperty(l,r,c.get?c:{enumerable:!0,get:()=>o[r]})}}return l.default=o,Object.freeze(l)}const O=$(S);function T({id:o,value:l,options:r,placeholder:c,onChange:j}){const b=i.useComboboxAnchor(),p=O.useMemo(()=>{const a=new Map;return r.forEach(u=>a.set(u.value,u.label)),a},[r]);return n.jsxs(i.Combobox,{multiple:!0,items:r.map(a=>a.value),value:l,onValueChange:j,children:[n.jsxs(i.ComboboxChips,{ref:b,className:"min-h-9 w-full",children:[n.jsx(i.ComboboxValue,{children:a=>a.map(u=>n.jsx(i.ComboboxChip,{children:p.get(u)??u},u))}),n.jsx(i.ComboboxChipsInput,{id:o,placeholder:c??"Select…"})]}),n.jsxs(i.ComboboxContent,{anchor:b,children:[n.jsx(i.ComboboxEmpty,{children:"No options."}),n.jsx(i.ComboboxList,{children:a=>n.jsx(i.ComboboxItem,{value:a,children:n.jsxs("span",{className:"inline-flex items-center gap-2",children:[(()=>{const u=r.find(g=>g.value===a);return u?.swatch?n.jsx("span",{className:"inline-block h-2.5 w-2.5 rounded-sm border border-foreground/20",style:{backgroundColor:u.swatch},"aria-hidden":!0}):null})(),p.get(a)??a]})},a)})]})]})}const V={number:"number",integer:"number",date:"date",datetime:"datetime-local",time:"time"};function A(o){return V[o]??"text"}function B(o,l){if(l!==""){if(o==="number"){const r=parseFloat(l);return Number.isFinite(r)?r:l}if(o==="integer"){const r=parseInt(l,10);return Number.isFinite(r)?r:l}return l}}function P({fields:o,value:l,onChange:r,selectionSize:c,onApply:j,onClear:b,applyLabel:p="Apply",clearLabel:a="Clear wells",extras:u,className:g}){const d=(e,t)=>{r({...l,[e]:t})},m=e=>n.jsxs(F.Label,{htmlFor:`field-${e.key}`,className:"gap-1.5",children:[e.icon?n.jsx("span",{className:"inline-flex text-muted-foreground [&_svg]:size-3.5",children:e.icon}):null,e.label]}),y=(e,t)=>n.jsxs("div",{className:"flex flex-col gap-1.5",children:[m(e),e.render({value:t,onChange:s=>d(e.key,s),selectionSize:c})]},e.key),C=(e,t)=>n.jsxs("div",{className:"flex flex-col gap-1.5",children:[m(e),n.jsxs(x.Select,{value:t??"",onValueChange:s=>d(e.key,s),children:[n.jsx(x.SelectTrigger,{id:`field-${e.key}`,size:"sm",className:"w-full",children:n.jsx(x.SelectValue,{placeholder:e.placeholder??"Select…"})}),n.jsx(x.SelectContent,{children:(e.options??[]).map(s=>n.jsx(x.SelectItem,{value:s.value,children:n.jsxs("span",{className:"inline-flex items-center gap-2",children:[s.swatch?n.jsx("span",{className:"inline-block h-2.5 w-2.5 rounded-sm border border-foreground/20",style:{backgroundColor:s.swatch},"aria-hidden":!0}):null,s.label]})},s.value))})]})]},e.key),v=(e,t)=>{const s=Array.isArray(t)?t:[];return n.jsxs("div",{className:"flex flex-col gap-1.5",children:[m(e),n.jsx(T,{id:`field-${e.key}`,value:s,options:e.options??[],placeholder:e.placeholder,onChange:h=>d(e.key,h.length===0?void 0:h)})]},e.key)},N=(e,t)=>{const s=!!t;return e.boolStyle==="switch"?n.jsxs("div",{className:"flex items-center justify-between gap-2",children:[m(e),n.jsx(M.Switch,{id:`field-${e.key}`,checked:s,onCheckedChange:h=>d(e.key,h)})]},e.key):n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(q.Checkbox,{id:`field-${e.key}`,checked:s,onCheckedChange:h=>d(e.key,h===!0)}),m(e)]},e.key)},f=(e,t)=>n.jsxs("div",{className:"flex flex-col gap-1.5",children:[m(e),n.jsx(I.Input,{id:`field-${e.key}`,type:A(e.kind),step:e.kind==="integer"?1:void 0,placeholder:e.placeholder,value:t??"",onChange:s=>d(e.key,B(e.kind,s.target.value))})]},e.key),w=e=>{const t=l[e.key];return e.render?y(e,t):e.kind==="select"?C(e,t):e.kind==="multiselect"?v(e,t):e.kind==="boolean"?N(e,t):f(e,t)};return n.jsxs("div",{"data-slot":"well-metadata-form",className:_.cn("flex flex-col gap-3",g),children:[n.jsx("div",{className:"text-sm font-medium",children:c>0?`Apply to ${c} well${c===1?"":"s"}`:"Select wells to edit"}),o.map(w),u,n.jsxs("div",{className:"mt-auto flex gap-2 pt-1",children:[n.jsx(k.Button,{variant:"default",size:"sm",disabled:c===0,onClick:j,children:p}),n.jsx(k.Button,{variant:"outline",size:"sm",disabled:c===0,onClick:b,children:a})]})]})}exports.WellMetadataForm=P;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),w=require("react"),k=require("../../../ui/button.cjs"),S=require("../../../ui/checkbox.cjs"),i=require("../../../ui/combobox.cjs"),q=require("../../../ui/input.cjs"),I=require("../../../ui/label.cjs"),x=require("../../../ui/select.cjs"),F=require("../../../ui/switch.cjs"),M=require("../../../lib/utils.cjs");function $(o){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const r in o)if(r!=="default"){const c=Object.getOwnPropertyDescriptor(o,r);Object.defineProperty(l,r,c.get?c:{enumerable:!0,get:()=>o[r]})}}return l.default=o,Object.freeze(l)}const O=$(w);function T({id:o,value:l,options:r,placeholder:c,onChange:j}){const b=i.useComboboxAnchor(),p=O.useMemo(()=>{const a=new Map;return r.forEach(u=>a.set(u.value,u.label)),a},[r]);return n.jsxs(i.Combobox,{multiple:!0,items:r.map(a=>a.value),value:l,onValueChange:j,children:[n.jsxs(i.ComboboxChips,{ref:b,className:"min-h-9 w-full",children:[n.jsx(i.ComboboxValue,{children:a=>a.map(u=>n.jsx(i.ComboboxChip,{children:p.get(u)??u},u))}),n.jsx(i.ComboboxChipsInput,{id:o,placeholder:c??"Select…"})]}),n.jsxs(i.ComboboxContent,{anchor:b,children:[n.jsx(i.ComboboxEmpty,{children:"No options."}),n.jsx(i.ComboboxList,{children:a=>n.jsx(i.ComboboxItem,{value:a,children:n.jsxs("span",{className:"inline-flex items-center gap-2",children:[(()=>{const u=r.find(g=>g.value===a);return u?.swatch?n.jsx("span",{className:"inline-block h-2.5 w-2.5 rounded-sm border border-foreground/20",style:{backgroundColor:u.swatch},"aria-hidden":!0}):null})(),p.get(a)??a]})},a)})]})]})}const V={number:"number",integer:"number",date:"date",datetime:"datetime-local",time:"time"};function A(o){return V[o]??"text"}function B(o,l){if(l!==""){if(o==="number"){const r=parseFloat(l);return Number.isFinite(r)?r:l}if(o==="integer"){const r=parseInt(l,10);return Number.isFinite(r)?r:l}return l}}function P({fields:o,value:l,onChange:r,selectionSize:c,onApply:j,onClear:b,applyLabel:p="Apply",clearLabel:a="Clear wells",extras:u,className:g}){const d=(e,t)=>{r({...l,[e]:t})},m=e=>n.jsxs(I.Label,{htmlFor:`field-${e.key}`,className:"gap-1.5",children:[e.icon?n.jsx("span",{className:"inline-flex text-muted-foreground [&_svg]:size-3.5",children:e.icon}):null,e.label]}),y=(e,t)=>n.jsxs("div",{className:"flex flex-col gap-1.5",children:[m(e),e.render({value:t,onChange:s=>d(e.key,s),selectionSize:c})]},e.key),C=(e,t)=>n.jsxs("div",{className:"flex flex-col gap-1.5",children:[m(e),n.jsxs(x.Select,{value:t??"",onValueChange:s=>d(e.key,s),children:[n.jsx(x.SelectTrigger,{id:`field-${e.key}`,size:"sm",className:"w-full",children:n.jsx(x.SelectValue,{placeholder:e.placeholder??"Select…"})}),n.jsx(x.SelectContent,{children:(e.options??[]).map(s=>n.jsx(x.SelectItem,{value:s.value,children:n.jsxs("span",{className:"inline-flex items-center gap-2",children:[s.swatch?n.jsx("span",{className:"inline-block h-2.5 w-2.5 rounded-sm border border-foreground/20",style:{backgroundColor:s.swatch},"aria-hidden":!0}):null,s.label]})},s.value))})]})]},e.key),v=(e,t)=>{const s=Array.isArray(t)?t:[];return n.jsxs("div",{className:"flex flex-col gap-1.5",children:[m(e),n.jsx(T,{id:`field-${e.key}`,value:s,options:e.options??[],placeholder:e.placeholder,onChange:h=>d(e.key,h.length===0?void 0:h)})]},e.key)},N=(e,t)=>{const s=!!t;return e.boolStyle==="switch"?n.jsxs("div",{className:"flex items-center justify-between gap-2",children:[m(e),n.jsx(F.Switch,{id:`field-${e.key}`,checked:s,onCheckedChange:h=>d(e.key,h)})]},e.key):n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(S.Checkbox,{id:`field-${e.key}`,checked:s,onCheckedChange:h=>d(e.key,h===!0)}),m(e)]},e.key)},f=(e,t)=>n.jsxs("div",{className:"flex flex-col gap-1.5",children:[m(e),n.jsx(q.Input,{id:`field-${e.key}`,type:A(e.kind),step:e.kind==="integer"?1:void 0,placeholder:e.placeholder,value:t??"",onChange:s=>d(e.key,B(e.kind,s.target.value))})]},e.key),_=e=>{const t=l[e.key];return e.render?y(e,t):e.kind==="select"?C(e,t):e.kind==="multiselect"?v(e,t):e.kind==="boolean"?N(e,t):f(e,t)};return n.jsxs("div",{"data-slot":"well-metadata-form",className:M.cn("flex flex-col gap-3",g),children:[n.jsx("div",{className:"text-sm font-medium",children:c>0?`Apply to ${c} well${c===1?"":"s"}`:"Select wells to edit"}),o.map(_),u,n.jsxs("div",{className:"mt-auto flex gap-2 pt-1",children:[n.jsx(k.Button,{variant:"default",size:"sm",disabled:c===0,onClick:j,children:p}),n.jsx(k.Button,{variant:"outline",size:"sm",disabled:c===0,onClick:b,children:a})]})]})}exports.WellMetadataForm=P;
2
2
  //# sourceMappingURL=WellMetadataForm.cjs.map