@morscherlab/mint-sdk 1.2.10 → 1.3.0-beta.10

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 (841) hide show
  1. package/README.md +45 -137
  2. package/dist/ResourcePickerListInternal-CFAw4vTZ.js +605 -0
  3. package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +1 -0
  4. package/dist/__stories__/experiment-helpers.d.ts +12 -1
  5. package/dist/__tests__/components/ScientificNumber.test.d.ts +1 -0
  6. package/dist/__tests__/components/SequenceInput.test.d.ts +1 -0
  7. package/dist/__tests__/components/Skeleton.test.d.ts +1 -0
  8. package/dist/__tests__/components/SmartGroupFieldRecipe.test.d.ts +1 -0
  9. package/dist/__tests__/components/SmartGroupModal.test.d.ts +1 -0
  10. package/dist/__tests__/components/StepWizard.test.d.ts +1 -0
  11. package/dist/__tests__/components/TimeRangeInput.test.d.ts +1 -0
  12. package/dist/__tests__/components/UnitInput.test.d.ts +1 -0
  13. package/dist/__tests__/components/WellPlate.keyboard.test.d.ts +1 -0
  14. package/dist/__tests__/components/WellPlate.sampleTypeIndicator.test.d.ts +1 -0
  15. package/dist/__tests__/composables/useChemicalFormula.test.d.ts +1 -0
  16. package/dist/__tests__/composables/useRackEditor.test.d.ts +1 -0
  17. package/dist/__tests__/composables/useSequenceUtils.test.d.ts +1 -0
  18. package/dist/__tests__/styles/baseControlsRules.test.d.ts +1 -0
  19. package/dist/__tests__/styles/controlRefreshRules.test.d.ts +1 -0
  20. package/dist/__tests__/styles/darkModeRules.test.d.ts +1 -0
  21. package/dist/__tests__/styles/menusShellRefresh.test.d.ts +1 -0
  22. package/dist/__tests__/templates/templatesDeprecation.test.d.ts +1 -0
  23. package/dist/__tests__/utils/plotlyTemplate.test.d.ts +1 -0
  24. package/dist/__tests__/utils/sampleTypeMarker.test.d.ts +1 -0
  25. package/dist/{analysisArtifactTypes-DQ0MjwHZ.js → analysisArtifactTypes-Cy3D0Ipg.js} +1 -1
  26. package/dist/{analysisArtifactTypes-DQ0MjwHZ.js.map → analysisArtifactTypes-Cy3D0Ipg.js.map} +1 -1
  27. package/dist/components/ActionMenu.vue.d.ts +17 -5
  28. package/dist/components/AdductText.vue.d.ts +3 -2
  29. package/dist/components/AlertBox.vue.d.ts +11 -14
  30. package/dist/components/AppAvatarMenu.vue.d.ts +18 -28
  31. package/dist/components/AppContainer.vue.d.ts +7 -11
  32. package/dist/components/AppLayout.vue.d.ts +11 -13
  33. package/dist/components/AppSidebar.vue.d.ts +30 -28
  34. package/dist/components/AppToastContainer.vue.d.ts +2 -1
  35. package/dist/components/AppTopBar.vue.d.ts +45 -44
  36. package/dist/components/ArtifactSaveDialog.vue.d.ts +3 -2
  37. package/dist/components/ArtifactSelectorModal.vue.d.ts +5 -6
  38. package/dist/components/AuditTrail.vue.d.ts +17 -18
  39. package/dist/components/AutoGroupModal.vue.d.ts +4 -3
  40. package/dist/components/Avatar.vue.d.ts +2 -1
  41. package/dist/components/BaseButton.vue.d.ts +11 -13
  42. package/dist/components/BaseCheckbox.vue.d.ts +7 -1
  43. package/dist/components/BaseInput.vue.d.ts +15 -2
  44. package/dist/components/BaseModal.vue.d.ts +20 -23
  45. package/dist/components/BasePill.vue.d.ts +10 -13
  46. package/dist/components/BaseRadioGroup.vue.d.ts +2 -1
  47. package/dist/components/BaseSelect.vue.d.ts +3 -2
  48. package/dist/components/BaseSlider.vue.d.ts +18 -1
  49. package/dist/components/BaseTabs.vue.d.ts +2 -1
  50. package/dist/components/BaseTextarea.vue.d.ts +2 -1
  51. package/dist/components/BaseToggle.vue.d.ts +2 -1
  52. package/dist/components/BatchProgressList.vue.d.ts +22 -26
  53. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +7 -14
  54. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +6 -13
  55. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +7 -14
  56. package/dist/components/BioTemplateRenderer.vue.d.ts +2 -1
  57. package/dist/components/Breadcrumb.vue.d.ts +13 -16
  58. package/dist/components/Calendar.vue.d.ts +21 -23
  59. package/dist/components/ChartContainer.vue.d.ts +19 -25
  60. package/dist/components/ChemicalFormula.vue.d.ts +7 -11
  61. package/dist/components/CollapsibleCard.vue.d.ts +7 -11
  62. package/dist/components/ComponentBindingRenderer.vue.d.ts +2 -1
  63. package/dist/components/ConcentrationInput.vue.d.ts +2 -1
  64. package/dist/components/ConfirmDialog.vue.d.ts +10 -13
  65. package/dist/components/ControlWorkspaceView.vue.d.ts +9 -18
  66. package/dist/components/DataFrame.vue.d.ts +27 -24
  67. package/dist/components/DatePicker.vue.d.ts +3 -6
  68. package/dist/components/DateTimePicker.vue.d.ts +3 -6
  69. package/dist/components/Divider.vue.d.ts +3 -2
  70. package/dist/components/DoseCalculator.vue.d.ts +2 -1
  71. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +2 -1
  72. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +9 -18
  73. package/dist/components/EmptyState.vue.d.ts +9 -12
  74. package/dist/components/ExperimentCodeBadge.vue.d.ts +2 -1
  75. package/dist/components/ExperimentDataViewer.vue.d.ts +13 -15
  76. package/dist/components/ExperimentPopover.vue.d.ts +3 -5
  77. package/dist/components/ExperimentSelectorModal.vue.d.ts +3 -4
  78. package/dist/components/ExperimentTimeline.vue.d.ts +13 -15
  79. package/dist/components/FilePicker.vue.d.ts +10 -5
  80. package/dist/components/FileUploader.vue.d.ts +8 -16
  81. package/dist/components/FitPanel.vue.d.ts +26 -16
  82. package/dist/components/FormActions.vue.d.ts +2 -1
  83. package/dist/components/FormBuilder.vue.d.ts +54 -250
  84. package/dist/components/FormField.vue.d.ts +14 -16
  85. package/dist/components/FormulaInput.vue.d.ts +2 -1
  86. package/dist/components/GeneratedPathInput.vue.d.ts +6 -5
  87. package/dist/components/GeneratedPlotlyResult.vue.d.ts +2 -1
  88. package/dist/components/GeneratedPluginView.vue.d.ts +2 -1
  89. package/dist/components/GeneratedResultRenderer.vue.d.ts +2 -1
  90. package/dist/components/GroupAssigner.vue.d.ts +2 -1
  91. package/dist/components/IconButton.vue.d.ts +7 -11
  92. package/dist/components/InstrumentStateBadge.vue.d.ts +4 -3
  93. package/dist/components/JobsStatusTray.vue.d.ts +13 -29
  94. package/dist/components/LayoutResizeHandle.vue.d.ts +2 -1
  95. package/dist/components/LoadingSpinner.vue.d.ts +2 -1
  96. package/dist/components/MobileSupportGate.vue.d.ts +5 -13
  97. package/dist/components/MoleculeInput.vue.d.ts +3 -4
  98. package/dist/components/MultiSelect.vue.d.ts +2 -1
  99. package/dist/components/NumberInput.vue.d.ts +2 -1
  100. package/dist/components/PlateEditor.vue.d.ts +147 -0
  101. package/dist/components/PlotlyChart.vue.d.ts +21 -31
  102. package/dist/components/PluginIcon.vue.d.ts +2 -1
  103. package/dist/components/PluginWorkspaceView.props.d.ts +2 -6
  104. package/dist/components/PluginWorkspaceView.vue.d.ts +23 -51
  105. package/dist/components/ProgressBar.vue.d.ts +4 -9
  106. package/dist/components/ProtocolStepEditor.vue.d.ts +7 -5
  107. package/dist/components/ProtocolStepParameterField.vue.d.ts +2 -1
  108. package/dist/components/ReagentEditor.vue.d.ts +2 -1
  109. package/dist/components/ReagentList.presentation.d.ts +2 -1
  110. package/dist/components/ReagentList.vue.d.ts +15 -17
  111. package/dist/components/ResourceCard.vue.d.ts +18 -17
  112. package/dist/components/RuntimeUpdateNotice.vue.d.ts +3 -2
  113. package/dist/components/SampleHierarchyTree.vue.d.ts +21 -15
  114. package/dist/components/SampleLegend.vue.d.ts +2 -1
  115. package/dist/components/SampleSelector.vue.d.ts +15 -21
  116. package/dist/components/SampleSelectorGroupNode.vue.d.ts +2 -1
  117. package/dist/components/SampleSelectorSampleRow.vue.d.ts +2 -5
  118. package/dist/components/ScheduleCalendar.vue.d.ts +34 -36
  119. package/dist/components/ScientificNumber.vue.d.ts +3 -2
  120. package/dist/components/SearchableSelect.vue.d.ts +14 -32
  121. package/dist/components/SecretInput.vue.d.ts +2 -1
  122. package/dist/components/SectionCard.vue.d.ts +13 -14
  123. package/dist/components/SegmentedControl.vue.d.ts +2 -1
  124. package/dist/components/SequenceInput.vue.d.ts +10 -21
  125. package/dist/components/SequenceProgressBar.vue.d.ts +2 -1
  126. package/dist/components/SettingsModal.schema.d.ts +1 -1
  127. package/dist/components/SettingsModal.vue.d.ts +28 -25
  128. package/dist/components/Skeleton.vue.d.ts +2 -1
  129. package/dist/components/SmartGroup.types.d.ts +2 -2
  130. package/dist/components/SmartGroupFieldRecipe.groups.d.ts +2 -0
  131. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +4 -7
  132. package/dist/components/SmartGroupManual.vue.d.ts +3 -2
  133. package/dist/components/SmartGroupModal.vue.d.ts +6 -4
  134. package/dist/components/StatusIndicator.vue.d.ts +2 -1
  135. package/dist/components/StepWizard.vue.d.ts +26 -27
  136. package/dist/components/TagsInput.vue.d.ts +3 -5
  137. package/dist/components/ThemeToggle.vue.d.ts +2 -1
  138. package/dist/components/TimePicker.vue.d.ts +6 -6
  139. package/dist/components/TimeRangeInput.vue.d.ts +9 -2
  140. package/dist/components/Tooltip.vue.d.ts +8 -18
  141. package/dist/components/UnitInput.vue.d.ts +2 -1
  142. package/dist/components/WellPlate.colors.d.ts +2 -4
  143. package/dist/components/WellPlate.rendering.d.ts +7 -1
  144. package/dist/components/WellPlate.sampleDrop.d.ts +2 -0
  145. package/dist/components/WellPlate.vue.d.ts +22 -39
  146. package/dist/components/index.d.ts +34 -31
  147. package/dist/components/index.js +5 -8
  148. package/dist/components/internal/ActionItemInternal.vue.d.ts +11 -13
  149. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +14 -23
  150. package/dist/components/internal/AppTopBarPillNavInternal.vue.d.ts +2 -1
  151. package/dist/components/internal/CalendarGridPanelInternal.vue.d.ts +2 -1
  152. package/dist/components/internal/DataStateInternal.vue.d.ts +7 -11
  153. package/dist/components/internal/{FilePickerTreeInternal.vue.d.ts → FilePickerListInternal.vue.d.ts} +9 -6
  154. package/dist/components/internal/FilePickerPreviewInternal.vue.d.ts +4 -3
  155. package/dist/components/internal/FormFieldRendererInternal.vue.d.ts +16 -18
  156. package/dist/components/internal/FormSectionRenderer.vue.d.ts +36 -32
  157. package/dist/components/internal/PlateEditorBindingInternal.vue.d.ts +8 -0
  158. package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +65 -0
  159. package/dist/components/internal/SettingsPaneHeadInternal.vue.d.ts +15 -0
  160. package/dist/components/internal/WellEditPopupInternal.vue.d.ts +12 -4
  161. package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +6 -13
  162. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +19 -42
  163. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +9 -19
  164. package/dist/components/internal/filePickerPresentation.d.ts +8 -0
  165. package/dist/components/internal/generatedJobsApi.d.ts +9 -0
  166. package/dist/{components-Bbg_gtzF.js → components-GDDvof8D.js} +7088 -5955
  167. package/dist/components-GDDvof8D.js.map +1 -0
  168. package/dist/composables/controlSchemaTypes.d.ts +4 -43
  169. package/dist/composables/createFilePickerAdapter.d.ts +5 -1
  170. package/dist/composables/filePicker/usePickerNavigation.d.ts +7 -2
  171. package/dist/composables/index.d.ts +2 -13
  172. package/dist/composables/index.js +7 -11
  173. package/dist/composables/pluginWorkspaceModel.d.ts +1 -3
  174. package/dist/composables/useAutoGroup.d.ts +10 -0
  175. package/dist/composables/useBioTemplateComponents.d.ts +15 -3
  176. package/dist/composables/useBioTemplateControls.d.ts +5 -1
  177. package/dist/composables/useBioTemplatePackWorkspace.d.ts +2 -0
  178. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +5 -1
  179. package/dist/composables/useBioTemplateWorkspace.d.ts +5 -1
  180. package/dist/composables/useChemicalFormula.d.ts +2 -1
  181. package/dist/composables/useDropdownState.d.ts +5 -0
  182. package/dist/composables/useExperimentSave.d.ts +5 -1
  183. package/dist/composables/useFileBrowser.d.ts +3 -2
  184. package/dist/composables/useFilePicker.d.ts +25 -13
  185. package/dist/composables/useFocusTrap.d.ts +2 -1
  186. package/dist/composables/useGroupAssignment.d.ts +5 -1
  187. package/dist/composables/useJobsStatusTray.d.ts +5 -5
  188. package/dist/composables/useMenuKeyboard.d.ts +3 -3
  189. package/dist/composables/usePlatformContext.d.ts +3 -0
  190. package/dist/composables/usePluginClient.d.ts +1 -1
  191. package/dist/composables/useRackEditor.d.ts +36 -1
  192. package/dist/composables/useSequenceUtils.d.ts +8 -0
  193. package/dist/composables/useTemplateCollection.d.ts +5 -1
  194. package/dist/composables/workspaceRecipes.d.ts +1 -0
  195. package/dist/composables-D6uqp0UF.js +591 -0
  196. package/dist/composables-D6uqp0UF.js.map +1 -0
  197. package/dist/{errors-BLuqMee5.js → experiment-DgllIc3I.js} +89 -333
  198. package/dist/experiment-DgllIc3I.js.map +1 -0
  199. package/dist/{experiment-utils-CV2Wza3z.js → experiment-utils-DTANyVKV.js} +68 -37
  200. package/dist/experiment-utils-DTANyVKV.js.map +1 -0
  201. package/dist/index.d.ts +2 -0
  202. package/dist/index.js +122 -17
  203. package/dist/index.js.map +1 -1
  204. package/dist/install.js +1 -2
  205. package/dist/install.js.map +1 -1
  206. package/dist/instrument.d.ts +6 -0
  207. package/dist/lcms.d.ts +11 -0
  208. package/dist/permissions.d.ts +2 -47
  209. package/dist/permissions.js +2 -26
  210. package/dist/permissions.js.map +1 -1
  211. package/dist/settings-BLr8lzw6.js +341 -0
  212. package/dist/settings-BLr8lzw6.js.map +1 -0
  213. package/dist/stores/auth.d.ts +2 -150
  214. package/dist/stores/experiment.d.ts +2 -106
  215. package/dist/stores/index.js +2 -2
  216. package/dist/stores/settings.d.ts +2 -44
  217. package/dist/styles.css +8608 -6950
  218. package/dist/tailwind.preset.js.map +1 -1
  219. package/dist/templates/adapters.d.ts +3 -0
  220. package/dist/templates/assayMatrixAdapters.d.ts +8 -1
  221. package/dist/templates/assayMatrixBuilder.d.ts +1 -0
  222. package/dist/templates/builderPresetControls.d.ts +1 -0
  223. package/dist/templates/calibrationCurveAdapters.d.ts +3 -0
  224. package/dist/templates/calibrationCurveBuilder.d.ts +1 -0
  225. package/dist/templates/catalog.d.ts +6 -2
  226. package/dist/templates/componentBindings.d.ts +31 -5
  227. package/dist/templates/componentPlateHelpers.d.ts +7 -1
  228. package/dist/templates/controlSchemas.d.ts +9 -0
  229. package/dist/templates/defaultBioTemplateBuilder.d.ts +1 -0
  230. package/dist/templates/doseResponseAdapters.d.ts +2 -0
  231. package/dist/templates/doseResponseBuilder.d.ts +1 -0
  232. package/dist/templates/elisaAssayCollectionBuilder.d.ts +1 -0
  233. package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +1 -0
  234. package/dist/templates/flowCytometryPanelBuilder.d.ts +1 -0
  235. package/dist/templates/flowPanelAdapters.d.ts +3 -0
  236. package/dist/templates/index.d.ts +1 -1
  237. package/dist/templates/index.js +2 -3
  238. package/dist/templates/instrumentRunAdapters.d.ts +13 -2
  239. package/dist/templates/instrumentRunBuilder.d.ts +1 -0
  240. package/dist/templates/lcmsBatchCollectionBuilder.d.ts +1 -0
  241. package/dist/templates/packs.d.ts +4 -0
  242. package/dist/templates/plateMapAdapters.d.ts +2 -0
  243. package/dist/templates/plateMapBuilder.d.ts +1 -0
  244. package/dist/templates/presets.d.ts +6 -2
  245. package/dist/templates/protocolAdapters.d.ts +4 -0
  246. package/dist/templates/protocolStepsBuilder.d.ts +1 -0
  247. package/dist/templates/qpcrAdapters.d.ts +4 -0
  248. package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +1 -0
  249. package/dist/templates/qpcrPlateBuilder.d.ts +1 -0
  250. package/dist/templates/reagentAdapters.d.ts +4 -0
  251. package/dist/templates/reagentListBuilder.d.ts +1 -0
  252. package/dist/templates/samplePrepAdapters.d.ts +3 -0
  253. package/dist/templates/samplePrepBuilder.d.ts +1 -0
  254. package/dist/templates/sampleSheetAdapters.d.ts +4 -0
  255. package/dist/templates/sampleSheetBuilder.d.ts +1 -0
  256. package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +1 -0
  257. package/dist/templates/templateEnvelopes.d.ts +8 -0
  258. package/dist/templates/templatePackCollectionBuilder.d.ts +1 -0
  259. package/dist/templates/templatePresetCollectionBuilder.d.ts +2 -0
  260. package/dist/templates/templateValidators.d.ts +12 -0
  261. package/dist/templates/timeCourseAdapters.d.ts +4 -0
  262. package/dist/templates/timeCourseBuilder.d.ts +1 -0
  263. package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +1 -0
  264. package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +1 -0
  265. package/dist/templates-BU1pet28.js +12304 -0
  266. package/dist/templates-BU1pet28.js.map +1 -0
  267. package/dist/types/auth.d.ts +0 -27
  268. package/dist/types/componentLabTypes.d.ts +14 -7
  269. package/dist/types/componentWorkflowTypes.d.ts +26 -0
  270. package/dist/types/components.d.ts +40 -17
  271. package/dist/types/fileBrowserTypes.d.ts +13 -0
  272. package/dist/types/filePicker.d.ts +19 -1
  273. package/dist/types/generated-ui.d.ts +13 -0
  274. package/dist/types/index.d.ts +4 -4
  275. package/dist/types/index.js +1 -1
  276. package/dist/types/instrument.d.ts +43 -15
  277. package/dist/types/platform.d.ts +2 -0
  278. package/dist/utils/color.d.ts +6 -1
  279. package/dist/utils/formModelSync.d.ts +1 -0
  280. package/dist/utils/plotlyTemplate.d.ts +3 -0
  281. package/dist/utils/rack.d.ts +16 -0
  282. package/dist/utils/sampleTypeMarker.d.ts +23 -0
  283. package/dist/{validation-ChMyixAf.js → validation-Dmp9Q5W0.js} +3032 -838
  284. package/dist/validation-Dmp9Q5W0.js.map +1 -0
  285. package/package.json +17 -23
  286. package/src/__stories__/experiment-helpers.ts +8 -4
  287. package/src/__tests__/components/ActionMenu.test.ts +66 -0
  288. package/src/__tests__/components/AlertBox.test.ts +21 -0
  289. package/src/__tests__/components/AppAvatarMenu.test.ts +25 -0
  290. package/src/__tests__/components/AppTopBar.test.ts +79 -0
  291. package/src/__tests__/components/AppTopBarPageSelector.test.ts +20 -0
  292. package/src/__tests__/components/AppTopBarPillNav.test.ts +74 -0
  293. package/src/__tests__/components/ArtifactSelectorModal.test.ts +20 -6
  294. package/src/__tests__/components/AuditTrail.test.ts +38 -0
  295. package/src/__tests__/components/BaseCheckbox.test.ts +43 -0
  296. package/src/__tests__/components/BaseInput.test.ts +43 -0
  297. package/src/__tests__/components/BaseModal.test.ts +90 -0
  298. package/src/__tests__/components/BaseRadioGroup.test.ts +8 -0
  299. package/src/__tests__/components/BaseSlider.test.ts +116 -0
  300. package/src/__tests__/components/BaseToggle.test.ts +7 -0
  301. package/src/__tests__/components/BatchProgressList.test.ts +22 -14
  302. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +4 -4
  303. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +1 -1
  304. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +8 -8
  305. package/src/__tests__/components/BioTemplateRenderer.test.ts +2 -2
  306. package/src/__tests__/components/Breadcrumb.test.ts +45 -0
  307. package/src/__tests__/components/CalendarGridPanel.test.ts +14 -0
  308. package/src/__tests__/components/ChartContainer.test.ts +23 -0
  309. package/src/__tests__/components/ChemicalFormula.test.ts +15 -0
  310. package/src/__tests__/components/CollapsibleCard.test.ts +12 -9
  311. package/src/__tests__/components/ComponentBindingRenderer.test.ts +45 -17
  312. package/src/__tests__/components/ConcentrationInput.test.ts +17 -2
  313. package/src/__tests__/components/DataFrame.test.ts +107 -4
  314. package/src/__tests__/components/DataStates.test.ts +0 -16
  315. package/src/__tests__/components/DatePicker.test.ts +10 -0
  316. package/src/__tests__/components/DoseCalculator.test.ts +47 -0
  317. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +37 -34
  318. package/src/__tests__/components/EmptyState.test.ts +16 -1
  319. package/src/__tests__/components/ExperimentSelectorModal.test.ts +31 -3
  320. package/src/__tests__/components/ExperimentTimeline.test.ts +45 -0
  321. package/src/__tests__/components/FilePicker.state.test.ts +2 -2
  322. package/src/__tests__/components/FilePicker.test.ts +360 -13
  323. package/src/__tests__/components/FileUploader.test.ts +15 -0
  324. package/src/__tests__/components/FitPanel.test.ts +96 -0
  325. package/src/__tests__/components/FormulaInput.test.ts +97 -0
  326. package/src/__tests__/components/GeneratedPathInput.test.ts +168 -41
  327. package/src/__tests__/components/GeneratedPlotlyResult.test.ts +1 -1
  328. package/src/__tests__/components/GeneratedResultRenderer.test.ts +47 -2
  329. package/src/__tests__/components/InstrumentStateBadge.test.ts +50 -0
  330. package/src/__tests__/components/JobsStatusTray.test.ts +27 -0
  331. package/src/__tests__/components/MoleculeInput.test.ts +78 -0
  332. package/src/__tests__/components/MultiSelect.test.ts +6 -0
  333. package/src/__tests__/components/PlateEditor.test.ts +1134 -0
  334. package/src/__tests__/components/PlateEditorBindingInternal.test.ts +64 -0
  335. package/src/__tests__/components/PlotlyChart.test.ts +147 -1
  336. package/src/__tests__/components/ProgressBar.test.ts +18 -0
  337. package/src/__tests__/components/ProtocolStepEditor.test.ts +106 -18
  338. package/src/__tests__/components/ProtocolStepParameterField.test.ts +74 -29
  339. package/src/__tests__/components/ReagentList.presentation.test.ts +10 -5
  340. package/src/__tests__/components/ReagentList.test.ts +23 -0
  341. package/src/__tests__/components/ResourcePickerListInternal.test.ts +141 -0
  342. package/src/__tests__/components/RetiredStyles.test.ts +0 -6
  343. package/src/__tests__/components/SampleHierarchyTree.test.ts +102 -0
  344. package/src/__tests__/components/SampleLegend.test.ts +18 -0
  345. package/src/__tests__/components/SampleSelector.test.ts +92 -1
  346. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +5 -2
  347. package/src/__tests__/components/ScheduleCalendar.test.ts +32 -0
  348. package/src/__tests__/components/ScientificNumber.test.ts +113 -0
  349. package/src/__tests__/components/SearchableSelect.test.ts +21 -0
  350. package/src/__tests__/components/SecretInput.test.ts +6 -0
  351. package/src/__tests__/components/SegmentedControl.test.ts +14 -0
  352. package/src/__tests__/components/SequenceInput.test.ts +81 -0
  353. package/src/__tests__/components/SettingsModal.schema.test.ts +5 -5
  354. package/src/__tests__/components/SettingsModal.test.ts +371 -23
  355. package/src/__tests__/components/Skeleton.test.ts +23 -0
  356. package/src/__tests__/components/SmartGroupFieldRecipe.test.ts +12 -0
  357. package/src/__tests__/components/SmartGroupModal.test.ts +69 -0
  358. package/src/__tests__/components/StepWizard.test.ts +75 -0
  359. package/src/__tests__/components/TagsInput.test.ts +16 -0
  360. package/src/__tests__/components/TimePicker.test.ts +66 -0
  361. package/src/__tests__/components/TimeRangeInput.test.ts +83 -0
  362. package/src/__tests__/components/UnitInput.test.ts +147 -0
  363. package/src/__tests__/components/WellEditPopupInternal.test.ts +434 -2
  364. package/src/__tests__/components/WellPlate.decoration.test.ts +18 -0
  365. package/src/__tests__/components/WellPlate.geometry.test.ts +13 -0
  366. package/src/__tests__/components/WellPlate.interaction.test.ts +213 -0
  367. package/src/__tests__/components/WellPlate.keyboard.test.ts +24 -0
  368. package/src/__tests__/components/WellPlate.rendering.test.ts +38 -19
  369. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +19 -0
  370. package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +58 -0
  371. package/src/__tests__/composables/createFilePickerAdapter.test.ts +114 -1
  372. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +1 -1
  373. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +1 -1
  374. package/src/__tests__/composables/useChemicalFormula.test.ts +60 -0
  375. package/src/__tests__/composables/useControlSchema.test.ts +15 -5
  376. package/src/__tests__/composables/useDropdownState.test.ts +20 -1
  377. package/src/__tests__/composables/useGeneratedAnalysis.test.ts +52 -0
  378. package/src/__tests__/composables/usePickerNavigation.test.ts +61 -1
  379. package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +18 -6
  380. package/src/__tests__/composables/useRackEditor.test.ts +270 -0
  381. package/src/__tests__/composables/useSequenceUtils.test.ts +28 -0
  382. package/src/__tests__/docs/frontendDocsCatalog.test.ts +44 -9
  383. package/src/__tests__/styles/baseControlsRules.test.ts +115 -0
  384. package/src/__tests__/styles/controlRefreshRules.test.ts +218 -0
  385. package/src/__tests__/styles/cssTokens.test.ts +7 -5
  386. package/src/__tests__/styles/darkModeRules.test.ts +47 -0
  387. package/src/__tests__/styles/menusShellRefresh.test.ts +75 -0
  388. package/src/__tests__/templates/templates.test.ts +65 -15
  389. package/src/__tests__/templates/templatesDeprecation.test.ts +78 -0
  390. package/src/__tests__/utils/permissions.test.ts +0 -68
  391. package/src/__tests__/utils/plotlyTemplate.test.ts +69 -0
  392. package/src/__tests__/utils/sampleTypeMarker.test.ts +54 -0
  393. package/src/components/ActionMenu.vue +44 -23
  394. package/src/components/AdductText.story.vue +18 -0
  395. package/src/components/AdductText.vue +7 -1
  396. package/src/components/AlertBox.vue +3 -7
  397. package/src/components/AppAvatarMenu.vue +12 -10
  398. package/src/components/AppSidebar.vue +1 -1
  399. package/src/components/AppTopBar.story.vue +47 -4
  400. package/src/components/AppTopBar.vue +16 -22
  401. package/src/components/ArtifactSelectorModal.story.vue +1 -1
  402. package/src/components/ArtifactSelectorModal.vue +48 -160
  403. package/src/components/AuditTrail.vue +26 -12
  404. package/src/components/AutoGroupModal.vue +1 -1
  405. package/src/components/BaseCheckbox.story.vue +58 -2
  406. package/src/components/BaseCheckbox.vue +21 -3
  407. package/src/components/BaseInput.story.vue +51 -0
  408. package/src/components/BaseInput.vue +62 -1
  409. package/src/components/BaseModal.story.vue +55 -0
  410. package/src/components/BaseModal.vue +83 -50
  411. package/src/components/BaseRadioGroup.vue +1 -1
  412. package/src/components/BaseSlider.story.vue +36 -0
  413. package/src/components/BaseSlider.vue +56 -8
  414. package/src/components/BaseToggle.vue +1 -7
  415. package/src/components/BatchProgressList.vue +50 -52
  416. package/src/components/BioTemplatePresetWorkspaceView.vue +1 -1
  417. package/src/components/Breadcrumb.story.vue +1 -1
  418. package/src/components/Breadcrumb.vue +50 -15
  419. package/src/components/ChartContainer.story.vue +42 -0
  420. package/src/components/ChartContainer.vue +22 -1
  421. package/src/components/ChemicalFormula.story.vue +11 -11
  422. package/src/components/ChemicalFormula.vue +1 -0
  423. package/src/components/CollapsibleCard.vue +12 -32
  424. package/src/components/ComponentBindingRenderer.vue +6 -8
  425. package/src/components/ConcentrationInput.story.vue +1 -1
  426. package/src/components/ConcentrationInput.vue +8 -14
  427. package/src/components/ControlWorkspaceView.vue +1 -1
  428. package/src/components/DataFrame.story.vue +45 -2
  429. package/src/components/DataFrame.vue +28 -13
  430. package/src/components/DatePicker.story.vue +11 -0
  431. package/src/components/DatePicker.vue +5 -5
  432. package/src/components/DateTimePicker.story.vue +1 -1
  433. package/src/components/DateTimePicker.vue +8 -5
  434. package/src/components/Divider.story.vue +1 -1
  435. package/src/components/DoseCalculator.vue +44 -51
  436. package/src/components/DoseCalculatorVolumeField.vue +22 -35
  437. package/src/components/DoseDesignWorkspaceView.vue +1 -1
  438. package/src/components/EmptyState.story.vue +4 -4
  439. package/src/components/EmptyState.vue +4 -2
  440. package/src/components/ExperimentPopover.story.vue +2 -2
  441. package/src/components/ExperimentPopover.vue +6 -4
  442. package/src/components/ExperimentSelectorModal.story.vue +2 -1
  443. package/src/components/ExperimentSelectorModal.vue +91 -261
  444. package/src/components/ExperimentTimeline.story.vue +29 -0
  445. package/src/components/ExperimentTimeline.vue +20 -0
  446. package/src/components/FilePicker.story.vue +65 -10
  447. package/src/components/FilePicker.vue +203 -121
  448. package/src/components/FitPanel.story.vue +72 -6
  449. package/src/components/FitPanel.vue +70 -18
  450. package/src/components/FormField.vue +2 -0
  451. package/src/components/FormulaInput.story.vue +6 -0
  452. package/src/components/FormulaInput.vue +49 -70
  453. package/src/components/GeneratedPathInput.story.vue +121 -8
  454. package/src/components/GeneratedPathInput.vue +155 -86
  455. package/src/components/GeneratedPlotlyResult.vue +1 -1
  456. package/src/components/GeneratedPluginView.vue +4 -4
  457. package/src/components/GeneratedResultRenderer.vue +19 -0
  458. package/src/components/InstrumentStateBadge.story.vue +41 -0
  459. package/src/components/InstrumentStateBadge.vue +24 -14
  460. package/src/components/JobsStatusTray.vue +30 -8
  461. package/src/components/MoleculeInput.vue +12 -7
  462. package/src/components/MultiSelect.vue +3 -3
  463. package/src/components/PlateEditor.story.vue +333 -0
  464. package/src/components/PlateEditor.vue +793 -0
  465. package/src/components/PlotlyChart.story.vue +37 -1
  466. package/src/components/PlotlyChart.vue +86 -16
  467. package/src/components/PluginWorkspaceView.props.ts +1 -7
  468. package/src/components/PluginWorkspaceView.vue +0 -4
  469. package/src/components/ProgressBar.story.vue +0 -30
  470. package/src/components/ProgressBar.vue +3 -53
  471. package/src/components/ProtocolStepEditor.story.vue +8 -0
  472. package/src/components/ProtocolStepEditor.vue +55 -145
  473. package/src/components/ProtocolStepParameterField.vue +55 -93
  474. package/src/components/ReagentList.presentation.ts +7 -6
  475. package/src/components/ReagentList.vue +18 -17
  476. package/src/components/SampleHierarchyTree.story.vue +19 -0
  477. package/src/components/SampleHierarchyTree.vue +47 -14
  478. package/src/components/SampleLegend.vue +12 -4
  479. package/src/components/SampleSelector.story.vue +5 -1
  480. package/src/components/SampleSelector.vue +25 -15
  481. package/src/components/SampleSelectorGroupNode.vue +10 -20
  482. package/src/components/SampleSelectorSampleRow.vue +7 -18
  483. package/src/components/ScheduleCalendar.story.vue +14 -0
  484. package/src/components/ScheduleCalendar.vue +13 -1
  485. package/src/components/ScientificNumber.story.vue +15 -2
  486. package/src/components/ScientificNumber.vue +22 -26
  487. package/src/components/SearchableSelect.vue +14 -9
  488. package/src/components/SecretInput.vue +1 -1
  489. package/src/components/SegmentedControl.story.vue +23 -0
  490. package/src/components/SegmentedControl.vue +6 -1
  491. package/src/components/SequenceInput.story.vue +27 -5
  492. package/src/components/SequenceInput.vue +74 -29
  493. package/src/components/SequenceProgressBar.vue +0 -1
  494. package/src/components/SettingsModal.schema.ts +4 -2
  495. package/src/components/SettingsModal.story.vue +83 -22
  496. package/src/components/SettingsModal.vue +338 -79
  497. package/src/components/Skeleton.vue +6 -35
  498. package/src/components/SmartGroup.types.ts +2 -2
  499. package/src/components/SmartGroupFieldRecipe.groups.ts +4 -1
  500. package/src/components/SmartGroupFieldRecipe.vue +14 -8
  501. package/src/components/SmartGroupManual.vue +14 -11
  502. package/src/components/StepWizard.vue +16 -19
  503. package/src/components/TagsInput.story.vue +16 -11
  504. package/src/components/TagsInput.vue +20 -3
  505. package/src/components/TimePicker.story.vue +38 -3
  506. package/src/components/TimePicker.vue +26 -11
  507. package/src/components/TimeRangeInput.story.vue +50 -1
  508. package/src/components/TimeRangeInput.vue +36 -17
  509. package/src/components/UnitInput.story.vue +1 -1
  510. package/src/components/UnitInput.vue +173 -107
  511. package/src/components/WellPlate.colors.ts +7 -6
  512. package/src/components/WellPlate.geometry.ts +3 -0
  513. package/src/components/WellPlate.interaction.ts +39 -5
  514. package/src/components/WellPlate.rendering.ts +21 -27
  515. package/src/components/WellPlate.sampleDrop.ts +20 -12
  516. package/src/components/WellPlate.story.vue +18 -7
  517. package/src/components/WellPlate.vue +28 -22
  518. package/src/components/index.ts +34 -31
  519. package/src/components/internal/AppTopBarPageSelectorInternal.vue +13 -7
  520. package/src/components/internal/AppTopBarPillNavInternal.vue +12 -7
  521. package/src/components/internal/CalendarGridPanelInternal.vue +1 -1
  522. package/src/components/internal/FilePickerListInternal.vue +318 -0
  523. package/src/components/internal/FilePickerPreviewInternal.vue +54 -52
  524. package/src/components/internal/PlateEditorBindingInternal.vue +37 -0
  525. package/src/components/internal/ResourcePickerListInternal.vue +237 -0
  526. package/src/components/internal/SettingsPaneHeadInternal.vue +41 -0
  527. package/src/components/internal/WellEditPopupInternal.vue +219 -146
  528. package/src/components/internal/WorkspaceShellInternal.vue +0 -6
  529. package/src/components/internal/filePickerPresentation.ts +30 -0
  530. package/src/components/internal/generatedJobsApi.ts +12 -0
  531. package/src/composables/autoGroup/index.ts +3 -0
  532. package/src/composables/controlSchemaAdapters.ts +0 -4
  533. package/src/composables/controlSchemaFormFields.ts +0 -4
  534. package/src/composables/controlSchemaTypes.ts +4 -43
  535. package/src/composables/createFilePickerAdapter.ts +90 -22
  536. package/src/composables/filePicker/localFiles.ts +1 -0
  537. package/src/composables/filePicker/usePickerNavigation.ts +29 -2
  538. package/src/composables/index.ts +2 -71
  539. package/src/composables/pluginWorkspaceModel.ts +0 -3
  540. package/src/composables/useAutoGroup.ts +10 -0
  541. package/src/composables/useBioTemplateComponents.ts +15 -3
  542. package/src/composables/useBioTemplateControls.ts +5 -1
  543. package/src/composables/useBioTemplatePackWorkspace.ts +2 -0
  544. package/src/composables/useBioTemplatePresetWorkspace.ts +5 -1
  545. package/src/composables/useBioTemplateWorkspace.ts +5 -1
  546. package/src/composables/useChemicalFormula.ts +39 -13
  547. package/src/composables/useDropdownState.ts +6 -1
  548. package/src/composables/useExperimentSave.ts +5 -1
  549. package/src/composables/useFileBrowser.ts +3 -2
  550. package/src/composables/useFilePicker.ts +98 -13
  551. package/src/composables/useFocusTrap.ts +9 -6
  552. package/src/composables/useGeneratedAnalysis.ts +38 -0
  553. package/src/composables/useGroupAssignment.ts +5 -1
  554. package/src/composables/useJobsStatusTray.ts +5 -5
  555. package/src/composables/useMenuKeyboard.ts +5 -3
  556. package/src/composables/usePlatformFilePickerAdapter.ts +26 -4
  557. package/src/composables/usePluginClient.ts +1 -1
  558. package/src/composables/usePluginWorkspace.ts +0 -1
  559. package/src/composables/useRackEditor.ts +202 -12
  560. package/src/composables/useSequenceUtils.ts +20 -2
  561. package/src/composables/useTemplateCollection.ts +5 -1
  562. package/src/composables/workspaceRecipes.ts +1 -0
  563. package/src/index.ts +9 -3
  564. package/src/instrument.ts +6 -0
  565. package/src/lcms.ts +11 -0
  566. package/src/permissions.ts +2 -59
  567. package/src/styles/components/action-menu.css +9 -38
  568. package/src/styles/components/adduct-text.css +15 -3
  569. package/src/styles/components/alert-box.css +19 -70
  570. package/src/styles/components/app-avatar-menu.css +22 -57
  571. package/src/styles/components/app-container.css +4 -4
  572. package/src/styles/components/app-layout.css +18 -18
  573. package/src/styles/components/app-page-selector.css +50 -105
  574. package/src/styles/components/app-pill-nav.css +24 -42
  575. package/src/styles/components/app-sidebar.css +2 -2
  576. package/src/styles/components/app-top-bar.css +78 -55
  577. package/src/styles/components/artifact-selector-modal.css +1 -211
  578. package/src/styles/components/audit-trail.css +45 -38
  579. package/src/styles/components/avatar.css +1 -1
  580. package/src/styles/components/batch-progress-list.css +179 -95
  581. package/src/styles/components/breadcrumb.css +34 -15
  582. package/src/styles/components/calendar.css +2 -8
  583. package/src/styles/components/chart-container.css +81 -38
  584. package/src/styles/components/checkbox.css +8 -6
  585. package/src/styles/components/chemical-formula.css +8 -6
  586. package/src/styles/components/collapsible-card.css +6 -46
  587. package/src/styles/components/concentration-input.css +1 -10
  588. package/src/styles/components/dataframe.css +48 -67
  589. package/src/styles/components/date-picker.css +124 -62
  590. package/src/styles/components/datetime-picker.css +81 -47
  591. package/src/styles/components/divider.css +2 -4
  592. package/src/styles/components/dose-calculator.css +9 -135
  593. package/src/styles/components/empty-state.css +26 -35
  594. package/src/styles/components/experiment-code-badge.css +1 -1
  595. package/src/styles/components/experiment-popover.css +16 -83
  596. package/src/styles/components/experiment-selector-modal.css +9 -226
  597. package/src/styles/components/experiment-timeline.css +120 -50
  598. package/src/styles/components/file-picker.css +323 -299
  599. package/src/styles/components/file-uploader.css +4 -6
  600. package/src/styles/components/fit-panel.css +108 -22
  601. package/src/styles/components/form-field.css +6 -4
  602. package/src/styles/components/formula-input.css +121 -48
  603. package/src/styles/components/group-assigner.css +1 -3
  604. package/src/styles/components/icon-button.css +15 -37
  605. package/src/styles/components/input.css +91 -2
  606. package/src/styles/components/instrument-monitor.css +37 -447
  607. package/src/styles/components/jobs-status-tray.css +82 -61
  608. package/src/styles/components/loading-spinner.css +18 -0
  609. package/src/styles/components/mobile-support-gate.css +15 -17
  610. package/src/styles/components/modal.css +44 -33
  611. package/src/styles/components/molecule-input.css +31 -16
  612. package/src/styles/components/multi-select.css +33 -29
  613. package/src/styles/components/number-input.css +1 -1
  614. package/src/styles/components/plate-editor.css +497 -0
  615. package/src/styles/components/popover.css +162 -0
  616. package/src/styles/components/progress-bar.css +1 -70
  617. package/src/styles/components/protocol-step-editor.css +21 -333
  618. package/src/styles/components/radio-group.css +9 -18
  619. package/src/styles/components/reagent-editor.css +3 -7
  620. package/src/styles/components/reagent-list.css +63 -69
  621. package/src/styles/components/resource-card.css +4 -6
  622. package/src/styles/components/resource-picker-list.css +212 -0
  623. package/src/styles/components/sample-hierarchy-tree.css +83 -65
  624. package/src/styles/components/sample-legend.css +18 -7
  625. package/src/styles/components/sample-selector.css +41 -68
  626. package/src/styles/components/schedule-calendar.css +59 -54
  627. package/src/styles/components/scientific-number.css +72 -18
  628. package/src/styles/components/searchable-select.css +17 -26
  629. package/src/styles/components/secret-input.css +20 -23
  630. package/src/styles/components/section-card.css +3 -5
  631. package/src/styles/components/segmented-control.css +14 -1
  632. package/src/styles/components/select.css +19 -8
  633. package/src/styles/components/sequence-input.css +85 -37
  634. package/src/styles/components/sequence-progress-bar.css +18 -37
  635. package/src/styles/components/settings-modal.css +683 -34
  636. package/src/styles/components/skeleton.css +24 -23
  637. package/src/styles/components/slider.css +74 -8
  638. package/src/styles/components/smart-group.css +27 -39
  639. package/src/styles/components/status-indicator.css +1 -1
  640. package/src/styles/components/step-wizard.css +62 -99
  641. package/src/styles/components/tabs.css +2 -6
  642. package/src/styles/components/tags-input.css +64 -54
  643. package/src/styles/components/textarea.css +2 -2
  644. package/src/styles/components/time-picker.css +67 -38
  645. package/src/styles/components/time-range-input.css +16 -18
  646. package/src/styles/components/toast.css +1 -1
  647. package/src/styles/components/toggle.css +21 -31
  648. package/src/styles/components/tooltip.css +13 -15
  649. package/src/styles/components/unit-input.css +86 -36
  650. package/src/styles/components/well-edit-popup.css +111 -189
  651. package/src/styles/components/well-plate.css +7 -7
  652. package/src/styles/index.css +5 -7
  653. package/src/styles/variables.css +35 -7
  654. package/src/templates/adapters.ts +4 -0
  655. package/src/templates/assayMatrixAdapters.ts +8 -1
  656. package/src/templates/assayMatrixBuilder.ts +1 -0
  657. package/src/templates/builderPresetControls.ts +1 -0
  658. package/src/templates/calibrationCurveAdapters.ts +3 -0
  659. package/src/templates/calibrationCurveBuilder.ts +1 -0
  660. package/src/templates/catalog.ts +6 -2
  661. package/src/templates/componentBindingCatalog.ts +1 -1
  662. package/src/templates/componentBindings.ts +31 -5
  663. package/src/templates/componentDoseResponseProps.ts +0 -1
  664. package/src/templates/componentPlateHelpers.ts +22 -1
  665. package/src/templates/componentPlateMapProps.ts +7 -5
  666. package/src/templates/componentQpcrPlateProps.ts +0 -1
  667. package/src/templates/controlSchemas.ts +9 -0
  668. package/src/templates/defaultBioTemplateBuilder.ts +1 -0
  669. package/src/templates/doseResponseAdapters.ts +2 -0
  670. package/src/templates/doseResponseBuilder.ts +1 -0
  671. package/src/templates/elisaAssayCollectionBuilder.ts +1 -0
  672. package/src/templates/flowCytometryAssayCollectionBuilder.ts +1 -0
  673. package/src/templates/flowCytometryPanelBuilder.ts +1 -0
  674. package/src/templates/flowPanelAdapters.ts +3 -0
  675. package/src/templates/index.ts +4 -0
  676. package/src/templates/instrumentRunAdapters.ts +13 -2
  677. package/src/templates/instrumentRunBuilder.ts +1 -0
  678. package/src/templates/lcmsBatchCollectionBuilder.ts +1 -0
  679. package/src/templates/packs.ts +4 -0
  680. package/src/templates/plateMapAdapters.ts +2 -0
  681. package/src/templates/plateMapBuilder.ts +1 -0
  682. package/src/templates/presets.ts +6 -2
  683. package/src/templates/protocolAdapters.ts +4 -0
  684. package/src/templates/protocolStepsBuilder.ts +1 -0
  685. package/src/templates/qpcrAdapters.ts +4 -0
  686. package/src/templates/qpcrExpressionCollectionBuilder.ts +1 -0
  687. package/src/templates/qpcrPlateBuilder.ts +1 -0
  688. package/src/templates/reagentAdapters.ts +4 -0
  689. package/src/templates/reagentListBuilder.ts +1 -0
  690. package/src/templates/samplePrepAdapters.ts +3 -0
  691. package/src/templates/samplePrepBuilder.ts +1 -0
  692. package/src/templates/sampleSheetAdapters.ts +4 -0
  693. package/src/templates/sampleSheetBuilder.ts +1 -0
  694. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +1 -0
  695. package/src/templates/templateEnvelopes.ts +8 -0
  696. package/src/templates/templatePackCollectionBuilder.ts +1 -0
  697. package/src/templates/templatePresetCollectionBuilder.ts +2 -0
  698. package/src/templates/templateValidators.ts +12 -0
  699. package/src/templates/timeCourseAdapters.ts +4 -0
  700. package/src/templates/timeCourseBuilder.ts +1 -0
  701. package/src/templates/wellPlateScreenCollectionBuilder.ts +1 -0
  702. package/src/templates/westernBlotAssayCollectionBuilder.ts +1 -0
  703. package/src/types/auth.ts +0 -37
  704. package/src/types/componentLabTypes.ts +16 -13
  705. package/src/types/componentWorkflowTypes.ts +29 -0
  706. package/src/types/components.ts +43 -20
  707. package/src/types/fileBrowserTypes.ts +15 -0
  708. package/src/types/filePicker.ts +19 -1
  709. package/src/types/generated-ui.ts +15 -0
  710. package/src/types/index.ts +12 -11
  711. package/src/types/instrument.ts +47 -15
  712. package/src/types/platform.ts +2 -0
  713. package/src/utils/color.ts +16 -1
  714. package/src/utils/formModelSync.ts +1 -1
  715. package/src/utils/plotlyTemplate.ts +39 -0
  716. package/src/utils/rack.ts +16 -0
  717. package/src/utils/sampleTypeMarker.ts +44 -0
  718. package/dist/ExperimentPopover-CJdNlCZb.js +0 -451
  719. package/dist/ExperimentPopover-CJdNlCZb.js.map +0 -1
  720. package/dist/ExperimentSelectorModal-DHE9k8TP.js +0 -507
  721. package/dist/ExperimentSelectorModal-DHE9k8TP.js.map +0 -1
  722. package/dist/SettingsModal-DELMkUFR.js +0 -492
  723. package/dist/SettingsModal-DELMkUFR.js.map +0 -1
  724. package/dist/Skeleton-jhF9wUkU.js +0 -485
  725. package/dist/Skeleton-jhF9wUkU.js.map +0 -1
  726. package/dist/__tests__/composables/usePluginConfig.test.d.ts +0 -15
  727. package/dist/chunk-BoAXSpZd.js +0 -33
  728. package/dist/components/AppPluginSwitcher.vue.d.ts +0 -40
  729. package/dist/components/ColorSlider.vue.d.ts +0 -34
  730. package/dist/components/DropdownButton.vue.d.ts +0 -49
  731. package/dist/components/FileBrowserModal.vue.d.ts +0 -99
  732. package/dist/components/InstrumentAlertLog.vue.d.ts +0 -22
  733. package/dist/components/InstrumentStatusCard.vue.d.ts +0 -13
  734. package/dist/components/LcmsSequenceTable.vue.d.ts +0 -54
  735. package/dist/components/PlateMapEditor.vue.d.ts +0 -50
  736. package/dist/components/RackEditor.vue.d.ts +0 -78
  737. package/dist/components/fileBrowserPresentation.d.ts +0 -10
  738. package/dist/components/internal/FileBrowserDialogInternal.vue.d.ts +0 -34
  739. package/dist/components/internal/FileBrowserListingInternal.vue.d.ts +0 -25
  740. package/dist/components/internal/FileBrowserToolbarInternal.vue.d.ts +0 -26
  741. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +0 -28
  742. package/dist/components-Bbg_gtzF.js.map +0 -1
  743. package/dist/composables/useAsync.d.ts +0 -132
  744. package/dist/composables/useAuth.d.ts +0 -47
  745. package/dist/composables/useCommandHistory.d.ts +0 -33
  746. package/dist/composables/useOptimisticMutation.d.ts +0 -32
  747. package/dist/composables/usePasskey.d.ts +0 -10
  748. package/dist/composables/usePluginConfig.d.ts +0 -27
  749. package/dist/composables/useResourceCrud.d.ts +0 -44
  750. package/dist/composables/useWellPainting.d.ts +0 -39
  751. package/dist/composables/useWellPlateAdapter.d.ts +0 -40
  752. package/dist/composables/useWellPlateEditor.d.ts +0 -33
  753. package/dist/composables/useWellPlateValidation.d.ts +0 -31
  754. package/dist/composables-BCbYb2lA.js +0 -2356
  755. package/dist/composables-BCbYb2lA.js.map +0 -1
  756. package/dist/errors-BLuqMee5.js.map +0 -1
  757. package/dist/experiment-CVDRAnqp.js +0 -90
  758. package/dist/experiment-CVDRAnqp.js.map +0 -1
  759. package/dist/experiment-utils-CV2Wza3z.js.map +0 -1
  760. package/dist/plotly.min-c2Sez60c.js +0 -180634
  761. package/dist/plotly.min-c2Sez60c.js.map +0 -1
  762. package/dist/templates-NuaNHohp.js +0 -5260
  763. package/dist/templates-NuaNHohp.js.map +0 -1
  764. package/dist/useControlSchema-vLiRPUmj.js +0 -7301
  765. package/dist/useControlSchema-vLiRPUmj.js.map +0 -1
  766. package/dist/useDropdownState-C7hRiVQf.js +0 -63
  767. package/dist/useDropdownState-C7hRiVQf.js.map +0 -1
  768. package/dist/useExperimentSelector-G_CAOFTX.js +0 -328
  769. package/dist/useExperimentSelector-G_CAOFTX.js.map +0 -1
  770. package/dist/useFormBuilder-D37ajgS8.js +0 -729
  771. package/dist/useFormBuilder-D37ajgS8.js.map +0 -1
  772. package/dist/validation-ChMyixAf.js.map +0 -1
  773. package/src/__tests__/components/AppPluginSwitcher.test.ts +0 -44
  774. package/src/__tests__/components/DropdownButton.test.ts +0 -628
  775. package/src/__tests__/components/FileBrowserModal.test.ts +0 -460
  776. package/src/__tests__/components/InstrumentAlertLog.test.ts +0 -59
  777. package/src/__tests__/components/LcmsSequenceTable.test.ts +0 -79
  778. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +0 -54
  779. package/src/__tests__/components/RackEditor.test.ts +0 -169
  780. package/src/__tests__/composables/useAuth.test.ts +0 -233
  781. package/src/__tests__/composables/useCommandHistory.test.ts +0 -43
  782. package/src/__tests__/composables/useOptimisticMutation.test.ts +0 -40
  783. package/src/__tests__/composables/usePluginConfig.test.ts +0 -497
  784. package/src/__tests__/composables/useResourceCrud.test.ts +0 -56
  785. package/src/__tests__/composables/useWellPainting.test.ts +0 -52
  786. package/src/__tests__/composables/useWellPlateAdapter.test.ts +0 -50
  787. package/src/__tests__/composables/useWellPlateValidation.test.ts +0 -42
  788. package/src/components/AppPluginSwitcher.story.vue +0 -87
  789. package/src/components/AppPluginSwitcher.vue +0 -134
  790. package/src/components/ColorSlider.story.vue +0 -120
  791. package/src/components/ColorSlider.vue +0 -160
  792. package/src/components/DropdownButton.story.vue +0 -102
  793. package/src/components/DropdownButton.vue +0 -181
  794. package/src/components/FileBrowserModal.story.vue +0 -203
  795. package/src/components/FileBrowserModal.vue +0 -384
  796. package/src/components/InstrumentAlertLog.vue +0 -187
  797. package/src/components/InstrumentStatusCard.vue +0 -184
  798. package/src/components/LcmsSequenceTable.vue +0 -222
  799. package/src/components/PlateMapEditor.story.vue +0 -92
  800. package/src/components/PlateMapEditor.vue +0 -423
  801. package/src/components/RackEditor.story.vue +0 -100
  802. package/src/components/RackEditor.vue +0 -429
  803. package/src/components/fileBrowserPresentation.ts +0 -39
  804. package/src/components/internal/FileBrowserDialogInternal.vue +0 -75
  805. package/src/components/internal/FileBrowserListingInternal.vue +0 -197
  806. package/src/components/internal/FileBrowserToolbarInternal.vue +0 -136
  807. package/src/components/internal/FilePickerTreeInternal.vue +0 -238
  808. package/src/components/internal/PlateMapEditorToolbarInternal.vue +0 -128
  809. package/src/composables/useAsync.ts +0 -327
  810. package/src/composables/useAuth.ts +0 -458
  811. package/src/composables/useCommandHistory.ts +0 -117
  812. package/src/composables/useOptimisticMutation.ts +0 -97
  813. package/src/composables/usePasskey.ts +0 -216
  814. package/src/composables/usePluginConfig.ts +0 -252
  815. package/src/composables/useResourceCrud.ts +0 -235
  816. package/src/composables/useWellPainting.ts +0 -167
  817. package/src/composables/useWellPlateAdapter.ts +0 -151
  818. package/src/composables/useWellPlateEditor.ts +0 -415
  819. package/src/composables/useWellPlateValidation.ts +0 -89
  820. package/src/plotly-dist.d.ts +0 -3
  821. package/src/styles/components/app-plugin-switcher.css +0 -196
  822. package/src/styles/components/color-slider.css +0 -110
  823. package/src/styles/components/dropdown-button.css +0 -280
  824. package/src/styles/components/file-browser-modal.css +0 -489
  825. package/src/styles/components/lcms-sequence-table.css +0 -204
  826. package/src/styles/components/plate-map-editor.css +0 -464
  827. package/src/styles/components/rack-editor.css +0 -287
  828. /package/dist/__tests__/components/{AppPluginSwitcher.test.d.ts → AlertBox.test.d.ts} +0 -0
  829. /package/dist/__tests__/components/{DropdownButton.test.d.ts → AuditTrail.test.d.ts} +0 -0
  830. /package/dist/__tests__/components/{FileBrowserModal.test.d.ts → BaseCheckbox.test.d.ts} +0 -0
  831. /package/dist/__tests__/components/{InstrumentAlertLog.test.d.ts → BaseSlider.test.d.ts} +0 -0
  832. /package/dist/__tests__/components/{LcmsSequenceTable.test.d.ts → DoseCalculator.test.d.ts} +0 -0
  833. /package/dist/__tests__/components/{PlateMapEditorToolbarInternal.test.d.ts → FileUploader.test.d.ts} +0 -0
  834. /package/dist/__tests__/components/{RackEditor.test.d.ts → FitPanel.test.d.ts} +0 -0
  835. /package/dist/__tests__/{composables/useAuth.test.d.ts → components/FormulaInput.test.d.ts} +0 -0
  836. /package/dist/__tests__/{composables/useCommandHistory.test.d.ts → components/InstrumentStateBadge.test.d.ts} +0 -0
  837. /package/dist/__tests__/{composables/useOptimisticMutation.test.d.ts → components/MoleculeInput.test.d.ts} +0 -0
  838. /package/dist/__tests__/{composables/useResourceCrud.test.d.ts → components/PlateEditor.test.d.ts} +0 -0
  839. /package/dist/__tests__/{composables/useWellPainting.test.d.ts → components/PlateEditorBindingInternal.test.d.ts} +0 -0
  840. /package/dist/__tests__/{composables/useWellPlateAdapter.test.d.ts → components/ResourcePickerListInternal.test.d.ts} +0 -0
  841. /package/dist/__tests__/{composables/useWellPlateValidation.test.d.ts → components/SampleLegend.test.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
- import { ref, computed, type Ref, type ComputedRef } from 'vue'
2
- import type { Rack, SlotPosition, WellPlateFormat, Well } from '../types'
3
- import { PLATE_CONFIGS, rowLabel as plateRowLabel } from '../components/WellPlate.geometry'
1
+ import { ref, computed, watch, type Ref, type ComputedRef } from 'vue'
2
+ import type { Rack, SlotPosition, WellEditData, WellPlateFormat, WellSampleDropData, Well } from '../types'
3
+ import { PLATE_CONFIGS, rowIndex, rowLabel as plateRowLabel } from '../components/WellPlate.geometry'
4
4
 
5
5
  export interface UseRackEditorOptions {
6
6
  defaultFormat?: WellPlateFormat
@@ -24,14 +24,82 @@ export interface UseRackEditorReturn {
24
24
  clearWell(rackId: string, wellId: string): void
25
25
  clearAllWells(rackId: string): void
26
26
  fillSeries(rackId: string, prefix?: string): void
27
+ /** Swaps two wells (a move when the target is empty). */
28
+ moveWell(rackId: string, sourceWellId: string, targetWellId: string): void
29
+ /** Puts every well in group `groupId` (an empty well becomes a sample); `undefined` empties them. */
30
+ assignWells(rackId: string, wellIds: string[], groupId: string | undefined): void
31
+
32
+ /**
33
+ * Applies every PlateEditor intent to this state, so the component can hold
34
+ * data it never mutates itself:
35
+ * `<PlateEditor :model-value="racks" :active-rack-id="activeRackId" v-on="plateEditorListeners" />`
36
+ */
37
+ plateEditorListeners: PlateEditorListeners
38
+
39
+ /** Steps back through every change to `racks` (at most 50), restoring the plate that was showing. */
40
+ undo(): void
41
+ redo(): void
42
+ canUndo: ComputedRef<boolean>
43
+ canRedo: ComputedRef<boolean>
44
+ /** Forgets every undo and redo step, e.g. after loading unrelated plates. */
45
+ clearHistory(): void
27
46
 
28
47
  getAllWells(): Array<{ rackId: string; wellId: string; well: Partial<Well> }>
29
48
  totalSampleCount: ComputedRef<number>
30
49
  reset(): void
31
50
  }
32
51
 
52
+ /** Handlers for PlateEditor's intent events, keyed by event name (bind with `v-on`). */
53
+ export interface PlateEditorListeners {
54
+ 'update:activeRackId': (rackId: string) => void
55
+ 'rack-add': () => void
56
+ 'rack-remove': (rackId: string) => void
57
+ 'rack-reorder': (rackIds: string[]) => void
58
+ 'update:format': (rackId: string, format: WellPlateFormat) => void
59
+ 'update:slot': (rackId: string, slot: SlotPosition) => void
60
+ 'well-edit': (rackId: string, wellId: string, data: WellEditData) => void
61
+ 'well-clear': (rackId: string, wellId: string) => void
62
+ 'well-move': (rackId: string, sourceWellId: string, targetWellId: string) => void
63
+ 'sample-drop': (rackId: string, wellId: string, data: WellSampleDropData, event: DragEvent) => void
64
+ 'assign': (rackId: string, wellIds: string[], groupId: string | undefined) => void
65
+ 'clear': (rackId: string) => void
66
+ 'fill-series': (rackId: string) => void
67
+ 'undo': () => void
68
+ 'redo': () => void
69
+ }
70
+
71
+ const HISTORY_LIMIT = 50
72
+
33
73
  const SLOT_CYCLE: SlotPosition[] = ['R', 'G', 'B', 'Y']
34
74
 
75
+ function wellFromEditData(data: WellEditData): Partial<Well> {
76
+ return {
77
+ state: 'filled',
78
+ sampleType: data.sampleType || undefined,
79
+ metadata: {
80
+ label: data.label,
81
+ injectionVolume: data.injectionVolume,
82
+ injectionCount: data.injectionCount,
83
+ customMethod: data.customMethod || null,
84
+ },
85
+ }
86
+ }
87
+
88
+ function wellFromDrop(data: WellSampleDropData, rack: Rack): Partial<Well> | null {
89
+ const label = (data.label ?? data.sampleName ?? data.id ?? '').trim()
90
+ if (!label) return null
91
+ return {
92
+ state: 'filled',
93
+ sampleType: data.sampleType ?? 'sample',
94
+ metadata: {
95
+ label,
96
+ injectionVolume: data.injectionVolume ?? rack.injectionVolume,
97
+ injectionCount: data.injectionCount ?? 1,
98
+ customMethod: data.customMethod ?? null,
99
+ },
100
+ }
101
+ }
102
+
35
103
 
36
104
  let globalIdCounter = 0
37
105
 
@@ -64,7 +132,7 @@ export function useRackEditor(
64
132
 
65
133
  const racks = ref<Rack[]>(
66
134
  initialRacks && initialRacks.length > 0
67
- ? initialRacks.map(r => ({ ...r }))
135
+ ? initialRacks.map(r => ({ ...r, wells: { ...r.wells } }))
68
136
  : [createDefaultRack('Rack 1', 0)]
69
137
  ) as Ref<Rack[]>
70
138
 
@@ -170,6 +238,118 @@ export function useRackEditor(
170
238
  }
171
239
  }
172
240
 
241
+ function moveWell(rackId: string, sourceWellId: string, targetWellId: string): void {
242
+ const rack = racks.value.find(r => r.id === rackId)
243
+ if (!rack) return
244
+ const { [sourceWellId]: source, [targetWellId]: target } = rack.wells
245
+ delete rack.wells[sourceWellId]
246
+ delete rack.wells[targetWellId]
247
+ if (target) rack.wells[sourceWellId] = placed(target, sourceWellId)
248
+ if (source) rack.wells[targetWellId] = placed(source, targetWellId)
249
+ }
250
+
251
+ /** A moved well keeps its position fields in step with its new key. */
252
+ function placed(well: Partial<Well>, wellId: string): Partial<Well> {
253
+ if (well.id === undefined) return well
254
+ const [, row = '', col = ''] = /^([A-Z]+)(\d+)$/.exec(wellId) ?? []
255
+ return { ...well, id: wellId, row: rowIndex(row), col: Number(col) - 1 }
256
+ }
257
+
258
+ function assignWells(rackId: string, wellIds: string[], groupId: string | undefined): void {
259
+ const rack = racks.value.find(r => r.id === rackId)
260
+ for (const wellId of wellIds) {
261
+ const sampleType = rack?.wells[wellId]?.sampleType ?? 'sample'
262
+ if (groupId) setWellData(rackId, wellId, { state: 'filled', sampleType, group: groupId })
263
+ else clearWell(rackId, wellId)
264
+ }
265
+ }
266
+
267
+ // History: the serialized racks before each change, with the plate that was showing.
268
+ // Every change counts, not just the intents: each public mutator call is its own step,
269
+ // and a change made outside them (an import assigning `racks`) becomes one at the next
270
+ // tick, so undo never skips past it.
271
+ interface Snapshot { racks: string; activeRackId: string }
272
+ const undoStack = ref<Snapshot[]>([])
273
+ const redoStack = ref<Snapshot[]>([])
274
+ const canUndo = computed(() => undoStack.value.length > 0)
275
+ const canRedo = computed(() => redoStack.value.length > 0)
276
+ /** The racks as the history last saw them. */
277
+ let known = JSON.stringify(racks.value)
278
+
279
+ function pushUndo(snapshot: Snapshot): void {
280
+ undoStack.value = [...undoStack.value, snapshot].slice(-HISTORY_LIMIT)
281
+ redoStack.value = []
282
+ }
283
+
284
+ /** Records a change made since the history last looked, as its own step. */
285
+ function absorb(): void {
286
+ const now = JSON.stringify(racks.value)
287
+ if (now === known) return
288
+ pushUndo({ racks: known, activeRackId: activeRackId.value })
289
+ known = now
290
+ }
291
+ watch(racks, absorb, { deep: true })
292
+
293
+ function step(from: Ref<Snapshot[]>, to: Ref<Snapshot[]>): void {
294
+ absorb()
295
+ const snapshot = from.value.pop()
296
+ if (snapshot === undefined) return
297
+ to.value.push({ racks: known, activeRackId: activeRackId.value })
298
+ racks.value = JSON.parse(snapshot.racks) as Rack[]
299
+ known = snapshot.racks
300
+ activeRackId.value = racks.value.some(rack => rack.id === snapshot.activeRackId)
301
+ ? snapshot.activeRackId
302
+ : racks.value[0]?.id ?? ''
303
+ }
304
+
305
+ const undo = (): void => step(undoStack, redoStack)
306
+ const redo = (): void => step(redoStack, undoStack)
307
+
308
+ function clearHistory(): void {
309
+ undoStack.value = []
310
+ redoStack.value = []
311
+ known = JSON.stringify(racks.value)
312
+ }
313
+
314
+ /** Runs `apply` and records the prior state when it changed anything. */
315
+ function recorded<Args extends unknown[], Result>(apply: (...args: Args) => Result) {
316
+ return (...args: Args): Result => {
317
+ absorb()
318
+ const before = { racks: known, activeRackId: activeRackId.value }
319
+ const result = apply(...args)
320
+ const after = JSON.stringify(racks.value)
321
+ if (after !== known) {
322
+ pushUndo(before)
323
+ known = after
324
+ }
325
+ return result
326
+ }
327
+ }
328
+
329
+ const plateEditorListeners: PlateEditorListeners = {
330
+ 'update:activeRackId': setActiveRack,
331
+ 'rack-add': recorded(() => { addRack() }),
332
+ 'rack-remove': recorded(removeRack),
333
+ 'rack-reorder': recorded((rackIds: string[]) => {
334
+ racks.value = rackIds.flatMap(id => racks.value.filter(rack => rack.id === id))
335
+ }),
336
+ 'update:format': recorded((rackId: string, format: WellPlateFormat) => updateRack(rackId, { format })),
337
+ 'update:slot': recorded((rackId: string, slot: SlotPosition) => updateRack(rackId, { slot })),
338
+ 'well-edit': recorded((rackId: string, wellId: string, data: WellEditData) => setWellData(rackId, wellId, wellFromEditData(data))),
339
+ 'well-clear': recorded(clearWell),
340
+ 'well-move': recorded(moveWell),
341
+ 'sample-drop': recorded((rackId: string, wellId: string, data: WellSampleDropData) => {
342
+ const rack = racks.value.find(r => r.id === rackId)
343
+ const well = rack && wellFromDrop(data, rack)
344
+ if (well) setWellData(rackId, wellId, well)
345
+ }),
346
+ 'assign': recorded(assignWells),
347
+ 'clear': recorded(clearAllWells),
348
+ 'fill-series': recorded((rackId: string) => fillSeries(rackId)),
349
+ 'undo': undo,
350
+ 'redo': redo,
351
+ }
352
+
173
353
  function getAllWells(): Array<{ rackId: string; wellId: string; well: Partial<Well> }> {
174
354
  const result: Array<{ rackId: string; wellId: string; well: Partial<Well> }> = []
175
355
  for (const rack of racks.value) {
@@ -192,21 +372,31 @@ export function useRackEditor(
192
372
  const rack = createDefaultRack('Rack 1', 0)
193
373
  racks.value = [rack]
194
374
  activeRackId.value = rack.id
375
+ clearHistory()
195
376
  }
196
377
 
197
378
  return {
198
379
  racks,
199
380
  activeRack,
200
381
  activeRackId,
201
- addRack,
202
- removeRack,
203
- reorderRacks,
204
- updateRack,
382
+ // Wrapped here, not at the definitions, so assignWells' inner calls stay one step.
383
+ addRack: recorded(addRack),
384
+ removeRack: recorded(removeRack),
385
+ reorderRacks: recorded(reorderRacks),
386
+ updateRack: recorded(updateRack),
205
387
  setActiveRack,
206
- setWellData,
207
- clearWell,
208
- clearAllWells,
209
- fillSeries,
388
+ setWellData: recorded(setWellData),
389
+ clearWell: recorded(clearWell),
390
+ clearAllWells: recorded(clearAllWells),
391
+ fillSeries: recorded(fillSeries),
392
+ moveWell: recorded(moveWell),
393
+ assignWells: recorded(assignWells),
394
+ plateEditorListeners,
395
+ undo,
396
+ redo,
397
+ canUndo,
398
+ canRedo,
399
+ clearHistory,
210
400
  getAllWells,
211
401
  totalSampleCount,
212
402
  reset,
@@ -6,6 +6,14 @@ export interface SequenceStats {
6
6
  molecularWeight?: number
7
7
  }
8
8
 
9
+ /** What `validateSequence` would strip or flag, so a field can report it instead. */
10
+ export interface SequenceProblems {
11
+ /** Ambiguous `N` bases (DNA/RNA only; `N` is asparagine in protein). */
12
+ ambiguousBases: number
13
+ /** Unique characters outside the alphabet, upper-cased, in order of appearance. Whitespace is ignored. */
14
+ invalidCharacters: string[]
15
+ }
16
+
9
17
  const DNA_CHARS = /[^ATCGNatcgn]/g
10
18
  const RNA_CHARS = /[^AUCGNaucgn]/g
11
19
  const PROTEIN_CHARS = /[^ACDEFGHIKLMNPQRSTVWYacdefghiklmnpqrstvwy]/g
@@ -35,8 +43,8 @@ export function useSequenceUtils() {
35
43
  return 'rna'
36
44
  }
37
45
 
38
- // If only contains ATCGN characters, it's DNA
39
- if (/^[ATCGN]+$/i.test(seq)) {
46
+ // If its letters are only ATCGN, it's DNA (line breaks, spaces and digits don't count)
47
+ if (/^[ATCGN]+$/i.test(seq.replace(/[^a-z]/gi, ''))) {
40
48
  return 'dna'
41
49
  }
42
50
 
@@ -58,6 +66,15 @@ export function useSequenceUtils() {
58
66
  }
59
67
  }
60
68
 
69
+ function findSequenceProblems(seq: string, type: 'dna' | 'rna' | 'protein'): SequenceProblems {
70
+ const alphabet = { dna: DNA_CHARS, rna: RNA_CHARS, protein: PROTEIN_CHARS }[type]
71
+ const invalid = seq.replace(/\s/g, '').match(alphabet) ?? []
72
+ return {
73
+ ambiguousBases: type === 'protein' ? 0 : (seq.match(/n/gi) ?? []).length,
74
+ invalidCharacters: [...new Set(invalid.map(ch => ch.toUpperCase()))],
75
+ }
76
+ }
77
+
61
78
  function reverseComplement(seq: string, type: 'dna' | 'rna'): string {
62
79
  const complementMap = type === 'dna' ? DNA_COMPLEMENT : RNA_COMPLEMENT
63
80
 
@@ -98,6 +115,7 @@ export function useSequenceUtils() {
98
115
  return {
99
116
  detectSequenceType,
100
117
  validateSequence,
118
+ findSequenceProblems,
101
119
  reverseComplement,
102
120
  calculateStats,
103
121
  formatFasta,
@@ -72,7 +72,11 @@ export interface UseTemplateCollectionReturn {
72
72
  requireCurrentExperimentId: () => number
73
73
  }
74
74
 
75
- /** Manages a biology template collection in the current experiment's design_data. */
75
+ /**
76
+ * Manages a biology template collection in the current experiment's design_data.
77
+ *
78
+ * @deprecated Scheduled for removal in MINT 1.4; no SDK replacement.
79
+ */
76
80
  export function useTemplateCollection(
77
81
  options: UseTemplateCollectionOptions = {},
78
82
  ): UseTemplateCollectionReturn {
@@ -88,6 +88,7 @@ export interface DoseDesignWorkspacePassthroughProps {
88
88
  subtitle?: string
89
89
  topBarVariant?: TopBarVariant
90
90
  sidebarWidth?: string
91
+ /** @deprecated No-op, removed in MINT 1.4. AppSidebar has one look now. */
91
92
  sidebarVariant?: 'default' | 'analysis'
92
93
  responsiveSidebar?: boolean
93
94
  sidebarPosition?: 'left' | 'right'
package/src/index.ts CHANGED
@@ -25,7 +25,7 @@ export * from './stores'
25
25
  // Permissions
26
26
  export * from './permissions'
27
27
 
28
- // Instrument monitoring
28
+ // Instrument monitoring. Deprecated: scheduled for removal in MINT 1.4 (moves to the mld-ms plugins).
29
29
  export * from './instrument'
30
30
 
31
31
  // Job state helpers
@@ -34,7 +34,7 @@ export * from './jobs'
34
34
  // Experimental generated analysis workspace
35
35
  export * from './generated/schema'
36
36
 
37
- // LCMS sequence helpers
37
+ // LCMS sequence helpers. Deprecated: scheduled for removal in MINT 1.4, no SDK replacement.
38
38
  export * from './lcms'
39
39
 
40
40
  // Utils
@@ -60,6 +60,12 @@ export {
60
60
  type PluginSecretRef,
61
61
  type PluginSecretState,
62
62
  } from './utils/pluginSecrets'
63
+ export {
64
+ sampleTypeMarker,
65
+ type SampleMarkerType,
66
+ type SampleTypeMarker,
67
+ } from './utils/sampleTypeMarker'
68
+ export { mintPlotlyTemplate } from './utils/plotlyTemplate'
63
69
  export {
64
70
  LCMS_DEFAULT_CONTROL_POSITIONS,
65
71
  createLcmsControlWellEditData,
@@ -79,7 +85,7 @@ export {
79
85
  type LcmsPlateType,
80
86
  } from './utils/rack'
81
87
 
82
- // Biology data templates
88
+ // Biology data templates. Deprecated: scheduled for removal from the core SDK in MINT 1.4.
83
89
  export * from './templates'
84
90
 
85
91
  // Types
package/src/instrument.ts CHANGED
@@ -1,15 +1,18 @@
1
1
  import type { SequenceProgress } from './types'
2
2
 
3
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
3
4
  export function sequenceProgressPercent(progress: SequenceProgress | null | undefined): number {
4
5
  if (!progress || progress.total_samples <= 0) return 0
5
6
  return Math.round(clamp((progress.current_sample / progress.total_samples) * 100, 0, 100))
6
7
  }
7
8
 
9
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
8
10
  export function sequenceSamplesRemaining(progress: SequenceProgress | null | undefined): number {
9
11
  if (!progress) return 0
10
12
  return Math.max(0, progress.total_samples - progress.current_sample)
11
13
  }
12
14
 
15
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
13
16
  export function estimateSequenceRemainingSeconds(
14
17
  progress: SequenceProgress | null | undefined,
15
18
  ): number | null {
@@ -31,6 +34,7 @@ export function estimateSequenceRemainingSeconds(
31
34
  return null
32
35
  }
33
36
 
37
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
34
38
  export function estimateSequenceFinishDate(
35
39
  progress: SequenceProgress | null | undefined,
36
40
  now = new Date(),
@@ -45,6 +49,7 @@ export function estimateSequenceFinishDate(
45
49
  return new Date(now.getTime() + remaining * 1000)
46
50
  }
47
51
 
52
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
48
53
  export function formatSequenceRemaining(progress: SequenceProgress | null | undefined): string | null {
49
54
  const remaining = estimateSequenceRemainingSeconds(progress)
50
55
  if (remaining == null || remaining <= 0) return null
@@ -58,6 +63,7 @@ export function formatSequenceRemaining(progress: SequenceProgress | null | unde
58
63
  return mins > 0 ? `~${hours}h ${mins}m left` : `~${hours}h left`
59
64
  }
60
65
 
66
+ /** @deprecated Scheduled for removal in MINT 1.4; instrument monitor helpers move to the mld-ms plugins. */
61
67
  export function formatSequenceEta(
62
68
  progress: SequenceProgress | null | undefined,
63
69
  locale?: Intl.LocalesArgument,
package/src/lcms.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  import type { LcmsPlateCell, LcmsPlateType } from './utils/rack'
2
2
 
3
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
3
4
  export type LcmsPolarity = 'POS' | 'NEG' | 'BOTH'
5
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
4
6
  export type LcmsContainerType = 'VIAL' | 'PLATE'
5
7
 
8
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
6
9
  export interface LcmsSequenceItem {
7
10
  sample_type: string
8
11
  file_name: string
@@ -13,12 +16,14 @@ export interface LcmsSequenceItem {
13
16
  injection_volume: number
14
17
  }
15
18
 
19
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
16
20
  export interface LcmsSequenceTableColumn {
17
21
  key: keyof LcmsSequenceItem | 'index' | 'actions'
18
22
  label: string
19
23
  align?: 'left' | 'right'
20
24
  }
21
25
 
26
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
22
27
  export const DEFAULT_LCMS_SEQUENCE_COLUMNS: LcmsSequenceTableColumn[] = [
23
28
  { key: 'index', label: '#' },
24
29
  { key: 'sample_type', label: 'Type' },
@@ -28,6 +33,7 @@ export const DEFAULT_LCMS_SEQUENCE_COLUMNS: LcmsSequenceTableColumn[] = [
28
33
  { key: 'injection_volume', label: 'Inj Vol', align: 'right' },
29
34
  ]
30
35
 
36
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
31
37
  export function extractLcmsCommonPrefix(fileNames: readonly string[]): string {
32
38
  if (fileNames.length === 0) return ''
33
39
  const stripped = fileNames.map(fileName => fileName.replace(/_\d{3}$/, ''))
@@ -46,6 +52,7 @@ export function extractLcmsCommonPrefix(fileNames: readonly string[]): string {
46
52
  return common
47
53
  }
48
54
 
55
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
49
56
  export function extractLcmsSampleName(fileName: string, prefix = ''): string {
50
57
  let name = fileName.replace(/_\d{3}$/, '')
51
58
  if (prefix && name.startsWith(prefix)) {
@@ -55,10 +62,12 @@ export function extractLcmsSampleName(fileName: string, prefix = ''): string {
55
62
  return name || fileName
56
63
  }
57
64
 
65
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
58
66
  export function lcmsWellIdFromPosition(position: string): string {
59
67
  return position.includes(':') ? position.split(':').pop() ?? position : position
60
68
  }
61
69
 
70
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
62
71
  export function inferLcmsPlateTypeFromWellIds(wellIds: readonly string[]): LcmsPlateType | null {
63
72
  let maxCol = 0
64
73
  let maxRow = 0
@@ -72,6 +81,7 @@ export function inferLcmsPlateTypeFromWellIds(wellIds: readonly string[]): LcmsP
72
81
  return maxCol <= 9 && maxRow <= 6 ? '54vial' : '96well'
73
82
  }
74
83
 
84
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
75
85
  export function reconstructLcmsPlateCellsFromSequenceItems(
76
86
  items: readonly LcmsSequenceItem[],
77
87
  ): { cells: LcmsPlateCell[]; plateType: LcmsPlateType } | null {
@@ -102,6 +112,7 @@ export function reconstructLcmsPlateCellsFromSequenceItems(
102
112
  return { cells, plateType }
103
113
  }
104
114
 
115
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
105
116
  export function basenameFromWindowsPath(path: string | null | undefined): string {
106
117
  if (!path) return ''
107
118
  return path.split(/[\\/]/).pop() ?? path
@@ -40,37 +40,9 @@ export interface AccessPolicy {
40
40
  plugin?: string
41
41
  }
42
42
 
43
- /**
44
- * An object that carries an access rule.
45
- *
46
- * The nested `access` policy is the supported shape. The four flat fields are
47
- * the pre-1.2 spelling of the same four `AccessPolicy` fields; they still work
48
- * but are deprecated, and `normalizeAccessPolicy()` lets the nested policy win
49
- * wherever both are given.
50
- */
43
+ /** An object that carries an access rule in its nested `access` policy. */
51
44
  export interface AccessControlled {
52
- /** The access policy. Preferred over the flat fields below. */
53
45
  access?: AccessPolicy
54
- /**
55
- * @deprecated Since MINT 1.2; use `access.visibleFor` instead. The flat
56
- * duplicate is removed in 1.3.
57
- */
58
- visibleFor?: AccessAudienceInput
59
- /**
60
- * @deprecated Since MINT 1.2; use `access.requiresAdmin` instead. The flat
61
- * duplicate is removed in 1.3.
62
- */
63
- requiresAdmin?: boolean
64
- /**
65
- * @deprecated Since MINT 1.2; use `access.permissions` instead. The flat
66
- * duplicate is removed in 1.3.
67
- */
68
- permissions?: readonly string[]
69
- /**
70
- * @deprecated Since MINT 1.2; use `access.anyPermissions` instead. The flat
71
- * duplicate is removed in 1.3.
72
- */
73
- anyPermissions?: readonly string[]
74
46
  }
75
47
 
76
48
  export function getRoleInfo(user: PermissionUser | null | undefined): RoleInfo | null {
@@ -129,40 +101,11 @@ export function canAccessPlugin(
129
101
  return Array.isArray(access) && access.includes(pluginName)
130
102
  }
131
103
 
132
- /**
133
- * Flatten an access rule — either shape, or a mix of both — into one policy.
134
- *
135
- * ## Precedence
136
- *
137
- * 1. A defined field on the nested `access` policy wins. It is the supported
138
- * spelling, so an object that carries both shapes is read as "the nested
139
- * policy, with the deprecated flat fields as leftovers".
140
- * 2. Otherwise the flat field on the rule itself is used.
141
- * 3. A field set to `undefined` on either side counts as unset and never
142
- * masks the other side.
143
- *
144
- * Only `AccessPolicy` fields the flat shape never had (`audience`,
145
- * `requiresAuth`, `plugin`) can come from the nested policy alone; the four
146
- * duplicated fields are the ones this ordering exists for.
147
- */
148
- export function normalizeAccessPolicy(rule: AccessControlled | AccessPolicy | undefined): AccessPolicy {
149
- if (!rule) return {}
150
- const { access: nested, ...flat } = rule as AccessPolicy & { access?: AccessPolicy }
151
- const policy = { ...flat } as Record<string, unknown>
152
-
153
- for (const [field, value] of Object.entries(nested ?? {})) {
154
- if (value !== undefined) policy[field] = value
155
- }
156
-
157
- return policy as AccessPolicy
158
- }
159
-
160
104
  export function canAccessByPolicy(
161
105
  user: PermissionUser | null | undefined,
162
- rule: AccessControlled | AccessPolicy | undefined,
106
+ policy: AccessPolicy = {},
163
107
  isAuthenticated = user !== null && user !== undefined,
164
108
  ): boolean {
165
- const policy = normalizeAccessPolicy(rule)
166
109
  if (policy.requiresAuth && !isAuthenticated) return false
167
110
  if (policy.requiresAdmin && !isAdminUser(user)) return false
168
111
  if (!audienceAllowsUser(policy.visibleFor ?? policy.audience, user)) return false
@@ -1,4 +1,6 @@
1
- /* ActionMenu — compact square trigger with a teleported, viewport-safe menu. */
1
+ /* ActionMenu — compact square trigger with a teleported, viewport-safe menu.
2
+ Surface and rows come from .mint-popover / .mint-menu-item (popover.css, 2d);
3
+ __panel and __item stay as aliases and own only placement. */
2
4
 
3
5
  .mint-action-menu {
4
6
  display: inline-flex;
@@ -13,47 +15,16 @@
13
15
  .mint-action-menu__panel {
14
16
  position: fixed;
15
17
  z-index: 1000;
16
- display: flex;
17
18
  min-width: 10rem;
18
19
  max-width: min(18rem, calc(100vw - 1rem));
19
- flex-direction: column;
20
- padding: 0.25rem;
21
- border: 1px solid var(--border-color);
22
- border-radius: var(--radius-md);
23
- background: var(--bg-secondary);
24
- box-shadow: var(--shadow-md);
25
20
  }
26
21
 
27
- .mint-action-menu__item {
28
- display: flex;
29
- width: 100%;
30
- align-items: center;
31
- padding: 0.4375rem 0.625rem;
32
- border: 0;
33
- border-radius: 0.375rem;
34
- background: transparent;
35
- color: var(--text-primary);
36
- font-family: inherit;
37
- font-size: 0.78125rem;
38
- line-height: 1.25;
39
- text-align: left;
40
- text-decoration: none;
41
- cursor: pointer;
42
- transition: background-color var(--mint-transition);
43
- }
44
-
45
- .mint-action-menu__item:hover:not(:disabled),
46
- .mint-action-menu__item:focus-visible {
47
- outline: none;
48
- background: var(--bg-hover);
49
- }
50
-
51
- .mint-action-menu__item--danger {
52
- color: var(--mint-error);
22
+ .mint-action-menu__check {
23
+ flex-shrink: 0;
24
+ color: var(--color-primary);
53
25
  }
54
26
 
55
- .mint-action-menu__item:disabled {
56
- color: var(--text-muted);
57
- cursor: not-allowed;
58
- opacity: var(--mint-disabled-opacity);
27
+ /* Unchecked radio rows keep the check's width so labels stay aligned. */
28
+ .mint-action-menu__check--off {
29
+ visibility: hidden;
59
30
  }
@@ -16,7 +16,7 @@
16
16
  .mint-adduct-text--sans { font-family: var(--font-sans); font-feature-settings: 'liga' 1, 'calt' 1; font-weight: 650; }
17
17
 
18
18
  .mint-adduct-text--xs {
19
- font-size: 0.625rem;
19
+ font-size: 0.6875rem;
20
20
  line-height: 1rem;
21
21
  }
22
22
 
@@ -31,12 +31,24 @@
31
31
  background: var(--bg-tertiary);
32
32
  }
33
33
 
34
+ /* On a filled surface the text inherits that surface's ink (9c: the old
35
+ white literal went white-on-white on light cards). */
34
36
  .mint-adduct-text--on-primary {
35
- color: rgb(255 255 255 / 0.82);
37
+ color: inherit;
36
38
  }
37
39
 
38
40
  .mint-adduct-text--badge.mint-adduct-text--on-primary {
39
- background: rgb(255 255 255 / 0.2);
41
+ background: color-mix(in srgb, currentColor 20%, transparent);
42
+ }
43
+
44
+ /* Charge as a superscript by relative offset, so the line box keeps its height. */
45
+ .mint-adduct-text__charge {
46
+ position: relative;
47
+ top: -0.5em;
48
+ font-size: 0.72em;
49
+ line-height: 0;
50
+ vertical-align: baseline;
51
+ color: inherit;
40
52
  }
41
53
 
42
54
  .mint-adduct-text--muted,