@morscherlab/mint-sdk 1.2.0-beta.3 → 1.2.0-beta.4

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 (1017) hide show
  1. package/README.md +8 -2
  2. package/dist/EmptyState-p90quq8Z.js +2 -0
  3. package/dist/EmptyState-p90quq8Z.js.map +1 -0
  4. package/dist/{ExperimentPopover-Bn6PIGHE.js → ExperimentPopover-tLwJ7XF4.js} +10 -5
  5. package/dist/ExperimentPopover-tLwJ7XF4.js.map +1 -0
  6. package/dist/{ExperimentSelectorModal-DGhrJSSV.js → ExperimentSelectorModal-B6P2msT4.js} +11 -6
  7. package/dist/ExperimentSelectorModal-B6P2msT4.js.map +1 -0
  8. package/dist/{SettingsModal-wF2btHu6.js → SettingsModal-CkNM8qAI.js} +12 -7
  9. package/dist/SettingsModal-CkNM8qAI.js.map +1 -0
  10. package/dist/__stories__/experiment-helpers.d.ts +28 -0
  11. package/dist/__tests__/components/ActionItem.test.d.ts +1 -0
  12. package/dist/__tests__/components/ActionMenu.test.d.ts +1 -0
  13. package/dist/__tests__/components/AppAvatarMenu.test.d.ts +1 -0
  14. package/dist/__tests__/components/AppLayout.test.d.ts +1 -0
  15. package/dist/__tests__/components/AppPluginSwitcher.test.d.ts +1 -0
  16. package/dist/__tests__/components/AppSidebar.test.d.ts +1 -0
  17. package/dist/__tests__/components/AppToastContainer.test.d.ts +1 -0
  18. package/dist/__tests__/components/AppTopBar.navigation.test.d.ts +1 -0
  19. package/dist/__tests__/components/AppTopBar.test.d.ts +1 -0
  20. package/dist/__tests__/components/AppTopBarPageSelector.test.d.ts +1 -0
  21. package/dist/__tests__/components/AppTopBarPillNav.test.d.ts +1 -0
  22. package/dist/__tests__/components/AppTopBarPresence.test.d.ts +1 -0
  23. package/dist/__tests__/components/ArtifactSaveDialog.test.d.ts +1 -0
  24. package/dist/__tests__/components/ArtifactSelectorModal.test.d.ts +1 -0
  25. package/dist/__tests__/components/AutoGroupModal.adapter.test.d.ts +1 -0
  26. package/dist/__tests__/components/BaseInput.test.d.ts +1 -0
  27. package/dist/__tests__/components/BaseModal.test.d.ts +1 -0
  28. package/dist/__tests__/components/BasePill.test.d.ts +1 -0
  29. package/dist/__tests__/components/BaseRadioGroup.test.d.ts +1 -0
  30. package/dist/__tests__/components/BaseSelect.test.d.ts +1 -0
  31. package/dist/__tests__/components/BaseTabs.test.d.ts +1 -0
  32. package/dist/__tests__/components/BaseToggle.test.d.ts +1 -0
  33. package/dist/__tests__/components/BatchProgressList.test.d.ts +1 -0
  34. package/dist/__tests__/components/BioTemplateExperimentWorkspaceView.test.d.ts +1 -0
  35. package/dist/__tests__/components/BioTemplatePackWorkspaceView.test.d.ts +1 -0
  36. package/dist/__tests__/components/BioTemplatePresetWorkspaceView.test.d.ts +1 -0
  37. package/dist/__tests__/components/BioTemplateRenderer.test.d.ts +1 -0
  38. package/dist/__tests__/components/Breadcrumb.test.d.ts +1 -0
  39. package/dist/__tests__/components/Calendar.test.d.ts +1 -0
  40. package/dist/__tests__/components/CalendarGridPanel.test.d.ts +1 -0
  41. package/dist/__tests__/components/CollapsibleCard.test.d.ts +1 -0
  42. package/dist/__tests__/components/ComponentBindingRenderer.test.d.ts +1 -0
  43. package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
  44. package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
  45. package/dist/__tests__/components/DataFrame.test.d.ts +1 -0
  46. package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
  47. package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
  48. package/dist/__tests__/components/DoseCalculatorVolumeField.test.d.ts +1 -0
  49. package/dist/__tests__/components/DoseDesignWorkspaceView.test.d.ts +1 -0
  50. package/dist/__tests__/components/DropdownButton.test.d.ts +1 -0
  51. package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
  52. package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
  53. package/dist/__tests__/components/ExperimentSelectorModal.test.d.ts +1 -0
  54. package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
  55. package/dist/__tests__/components/GeneratedPathInput.test.d.ts +1 -0
  56. package/dist/__tests__/components/GeneratedPlotlyResult.test.d.ts +1 -0
  57. package/dist/__tests__/components/GeneratedPluginView.test.d.ts +1 -0
  58. package/dist/__tests__/components/GeneratedResultRenderer.test.d.ts +1 -0
  59. package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
  60. package/dist/__tests__/components/InstrumentAlertLog.test.d.ts +1 -0
  61. package/dist/__tests__/components/JobsStatusTray.test.d.ts +1 -0
  62. package/dist/__tests__/components/LcmsSequenceTable.test.d.ts +1 -0
  63. package/dist/__tests__/components/MobileSupportGate.test.d.ts +1 -0
  64. package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
  65. package/dist/__tests__/components/PlateMapEditorToolbarInternal.test.d.ts +1 -0
  66. package/dist/__tests__/components/PluginIcon.test.d.ts +1 -0
  67. package/dist/__tests__/components/PluginWorkspaceView.controls.test.d.ts +1 -0
  68. package/dist/__tests__/components/PluginWorkspaceView.navigation.test.d.ts +1 -0
  69. package/dist/__tests__/components/PluginWorkspaceView.shell.test.d.ts +1 -0
  70. package/dist/__tests__/components/PluginWorkspaceView.test.d.ts +1 -0
  71. package/dist/__tests__/components/ProgressBar.test.d.ts +1 -0
  72. package/dist/__tests__/components/ProtocolStep.presentation.test.d.ts +1 -0
  73. package/dist/__tests__/components/ProtocolStepEditor.state.test.d.ts +1 -0
  74. package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
  75. package/dist/__tests__/components/ProtocolStepParameterField.test.d.ts +1 -0
  76. package/dist/__tests__/components/RackEditor.test.d.ts +1 -0
  77. package/dist/__tests__/components/ReagentList.presentation.test.d.ts +1 -0
  78. package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
  79. package/dist/__tests__/components/RetiredStyles.test.d.ts +1 -0
  80. package/dist/__tests__/components/RuntimeUpdateNotice.test.d.ts +1 -0
  81. package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
  82. package/dist/__tests__/components/SampleSelector.colors.test.d.ts +1 -0
  83. package/dist/__tests__/components/SampleSelector.drag.test.d.ts +1 -0
  84. package/dist/__tests__/components/SampleSelector.groups.test.d.ts +1 -0
  85. package/dist/__tests__/components/SampleSelector.selection.test.d.ts +1 -0
  86. package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
  87. package/dist/__tests__/components/SampleSelectorSampleRow.test.d.ts +1 -0
  88. package/dist/__tests__/components/ScheduleCalendar.test.d.ts +1 -0
  89. package/dist/__tests__/components/SectionCard.test.d.ts +1 -0
  90. package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
  91. package/dist/__tests__/components/SequenceProgressBar.test.d.ts +1 -0
  92. package/dist/__tests__/components/SettingsModal.schema.test.d.ts +1 -0
  93. package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
  94. package/dist/__tests__/components/SmartGroupFieldRecipe.groups.test.d.ts +1 -0
  95. package/dist/__tests__/components/SmartGroupManual.cohorts.test.d.ts +1 -0
  96. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  97. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  98. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  99. package/dist/__tests__/components/WellPlate.colors.test.d.ts +1 -0
  100. package/dist/__tests__/components/WellPlate.conditions.test.d.ts +1 -0
  101. package/dist/__tests__/components/WellPlate.geometry.test.d.ts +1 -0
  102. package/dist/__tests__/components/WellPlate.interaction.test.d.ts +1 -0
  103. package/dist/__tests__/components/WellPlate.legend.test.d.ts +1 -0
  104. package/dist/__tests__/components/WellPlate.rendering.test.d.ts +1 -0
  105. package/dist/__tests__/components/WellPlate.sampleDrop.test.d.ts +1 -0
  106. package/dist/__tests__/composables/analysisArtifactTarget.test.d.ts +1 -0
  107. package/dist/__tests__/composables/autoGroup/classKey.test.d.ts +1 -0
  108. package/dist/__tests__/composables/autoGroup/classify.test.d.ts +1 -0
  109. package/dist/__tests__/composables/autoGroup/columns.test.d.ts +1 -0
  110. package/dist/__tests__/composables/autoGroup/compose.test.d.ts +1 -0
  111. package/dist/__tests__/composables/autoGroup/cooccurrence.test.d.ts +1 -0
  112. package/dist/__tests__/composables/autoGroup/fingerprint.test.d.ts +1 -0
  113. package/dist/__tests__/composables/autoGroup/groupByOrder.test.d.ts +1 -0
  114. package/dist/__tests__/composables/autoGroup/groupTree.test.d.ts +1 -0
  115. package/dist/__tests__/composables/autoGroup/integration.test.d.ts +1 -0
  116. package/dist/__tests__/composables/autoGroup/template.test.d.ts +1 -0
  117. package/dist/__tests__/composables/autoGroup/tokenLength.test.d.ts +1 -0
  118. package/dist/__tests__/composables/autoGroup/tokenize.test.d.ts +1 -0
  119. package/dist/__tests__/composables/experiment-utils.test.d.ts +1 -0
  120. package/dist/__tests__/composables/formBuilderRegistry.test.d.ts +1 -0
  121. package/dist/__tests__/composables/resolvePluginFrontendBase.test.d.ts +1 -0
  122. package/dist/__tests__/composables/useAnalysisArtifacts.test.d.ts +1 -0
  123. package/dist/__tests__/composables/useApi.test.d.ts +1 -0
  124. package/dist/__tests__/composables/useAppExperiment.test.d.ts +1 -0
  125. package/dist/__tests__/composables/useAuth.test.d.ts +1 -0
  126. package/dist/__tests__/composables/useAutoGroup.test.d.ts +1 -0
  127. package/dist/__tests__/composables/useAutoGroupInputSources.test.d.ts +1 -0
  128. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  129. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  130. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  131. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  132. package/dist/__tests__/composables/useCommandHistory.test.d.ts +1 -0
  133. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  134. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  135. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  136. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  137. package/dist/__tests__/composables/useEventStream.test.d.ts +1 -0
  138. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  139. package/dist/__tests__/composables/useExperimentData.test.d.ts +14 -0
  140. package/dist/__tests__/composables/useExperimentSamples.test.d.ts +1 -0
  141. package/dist/__tests__/composables/useExperimentSave.test.d.ts +1 -0
  142. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  143. package/dist/__tests__/composables/useFileImport.test.d.ts +1 -0
  144. package/dist/__tests__/composables/useForm.test.d.ts +1 -0
  145. package/dist/__tests__/composables/useFormBuilder.test.d.ts +1 -0
  146. package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +1 -0
  147. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  148. package/dist/__tests__/composables/useJobsStatusTray.test.d.ts +1 -0
  149. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  150. package/dist/__tests__/composables/useMobileSupportGate.test.d.ts +1 -0
  151. package/dist/__tests__/composables/useOptimisticMutation.test.d.ts +1 -0
  152. package/dist/__tests__/composables/usePlatformContext.test.d.ts +1 -0
  153. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  154. package/dist/__tests__/composables/usePluginConfig.test.d.ts +15 -0
  155. package/dist/__tests__/composables/usePresenceHeartbeat.test.d.ts +1 -0
  156. package/dist/__tests__/composables/useProtocolTemplates.test.d.ts +1 -0
  157. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  158. package/dist/__tests__/composables/useResourceCrud.test.d.ts +1 -0
  159. package/dist/__tests__/composables/useRuntimeAlignment.test.d.ts +1 -0
  160. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  161. package/dist/__tests__/composables/useSampleGroups.tree.test.d.ts +1 -0
  162. package/dist/__tests__/composables/useScheduleCalendarLayout.test.d.ts +1 -0
  163. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  164. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  165. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  166. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  167. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  168. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  169. package/dist/__tests__/composables/useWellPainting.test.d.ts +1 -0
  170. package/dist/__tests__/composables/useWellPlateAdapter.test.d.ts +1 -0
  171. package/dist/__tests__/composables/useWellPlateValidation.test.d.ts +1 -0
  172. package/dist/__tests__/docs/extractDocsComponents.test.d.ts +1 -0
  173. package/dist/__tests__/docs/extractDocsExports.test.d.ts +1 -0
  174. package/dist/__tests__/docs/extractDocsParsing.test.d.ts +1 -0
  175. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +1 -0
  176. package/dist/__tests__/docs/extractDocsTheme.test.d.ts +1 -0
  177. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  178. package/dist/__tests__/generatedUi.test.d.ts +1 -0
  179. package/dist/__tests__/stores/experiment.test.d.ts +1 -0
  180. package/dist/__tests__/stores/settings.test.d.ts +1 -0
  181. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  182. package/dist/__tests__/types/GeneratedJsonSchema.test.d.ts +1 -0
  183. package/dist/__tests__/utils/color.test.d.ts +1 -0
  184. package/dist/__tests__/utils/instrument.test.d.ts +1 -0
  185. package/dist/__tests__/utils/jobs.test.d.ts +1 -0
  186. package/dist/__tests__/utils/lcms.test.d.ts +1 -0
  187. package/dist/__tests__/utils/permissions.test.d.ts +1 -0
  188. package/dist/__tests__/utils/rack.test.d.ts +1 -0
  189. package/dist/{analysisArtifactTypes-ejqR8MX3.js → analysisArtifactTypes-DQ0MjwHZ.js} +2 -0
  190. package/dist/analysisArtifactTypes-DQ0MjwHZ.js.map +1 -0
  191. package/dist/chunk-BoAXSpZd.js +33 -0
  192. package/dist/components/AuditTrail.vue.d.ts +38 -0
  193. package/dist/components/AutoGroupModal.vue.d.ts +1 -1
  194. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +1 -1
  195. package/dist/components/ColorSlider.vue.d.ts +34 -0
  196. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +149 -0
  197. package/dist/components/FitPanel.vue.d.ts +46 -0
  198. package/dist/components/GroupAssigner.vue.d.ts +25 -0
  199. package/dist/components/JobsStatusTray.vue.d.ts +11 -2
  200. package/dist/components/RackEditor.vue.d.ts +78 -0
  201. package/dist/components/ReagentEditor.vue.d.ts +30 -0
  202. package/dist/components/ResourceCard.vue.d.ts +50 -0
  203. package/dist/components/SampleLegend.vue.d.ts +1 -1
  204. package/dist/components/SampleSelector.vue.d.ts +1 -1
  205. package/dist/components/ScientificNumber.vue.d.ts +14 -0
  206. package/dist/components/SettingsModal.vue.d.ts +1 -1
  207. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -3
  208. package/dist/components/SmartGroupManual.vue.d.ts +2 -2
  209. package/dist/components/WellPlate.vue.d.ts +1 -1
  210. package/dist/components/index.d.ts +9 -0
  211. package/dist/components/index.js +6 -6
  212. package/dist/{components-DpyzaeIc.js → components-MGNL6tRn.js} +3268 -1353
  213. package/dist/components-MGNL6tRn.js.map +1 -0
  214. package/dist/composables/autoGroupConstants.d.ts +1 -0
  215. package/dist/composables/autoGroupGrouping.d.ts +3 -0
  216. package/dist/composables/index.d.ts +10 -2
  217. package/dist/composables/index.js +9 -9
  218. package/dist/composables/useAnalysisArtifacts.d.ts +2 -0
  219. package/dist/composables/useAsync.d.ts +128 -0
  220. package/dist/composables/useAuth.d.ts +2 -0
  221. package/dist/composables/useAutoGroup.d.ts +30 -1
  222. package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
  223. package/dist/composables/useCommandHistory.d.ts +29 -0
  224. package/dist/composables/useGeneratedAnalysis.d.ts +5 -1
  225. package/dist/composables/useGroupAssignment.d.ts +31 -0
  226. package/dist/composables/useJobsStatusTray.d.ts +41 -4
  227. package/dist/composables/usePluginClient.d.ts +4 -0
  228. package/dist/composables/usePluginConfig.d.ts +25 -0
  229. package/dist/composables/useRackEditor.d.ts +31 -0
  230. package/dist/composables/useResourceCrud.d.ts +40 -0
  231. package/dist/composables/useWellPainting.d.ts +35 -0
  232. package/dist/composables/useWellPlateAdapter.d.ts +36 -0
  233. package/dist/{composables-yz8bTkEV.js → composables-CKxOcvgh.js} +764 -59
  234. package/dist/composables-CKxOcvgh.js.map +1 -0
  235. package/dist/{experiment-D08H_TIH.js → experiment-Y9Iz7KYi.js} +3 -1
  236. package/dist/experiment-Y9Iz7KYi.js.map +1 -0
  237. package/dist/experiment-utils-CLnzPPq5.js +2 -0
  238. package/dist/experiment-utils-CLnzPPq5.js.map +1 -0
  239. package/dist/histoire.setup.d.ts +1 -0
  240. package/dist/index.js +18 -33
  241. package/dist/index.js.map +1 -0
  242. package/dist/install.js +28 -0
  243. package/dist/install.js.map +1 -0
  244. package/dist/jobs.d.ts +15 -1
  245. package/dist/permissions.d.ts +5 -0
  246. package/dist/permissions.js +4 -2
  247. package/dist/permissions.js.map +1 -0
  248. package/dist/plotly.min-c2Sez60c.js +180634 -0
  249. package/dist/plotly.min-c2Sez60c.js.map +1 -0
  250. package/dist/stores/auth.d.ts +6 -0
  251. package/dist/stores/index.js +2 -2
  252. package/dist/styles.css +2836 -270
  253. package/dist/tailwind.preset.js +2 -0
  254. package/dist/tailwind.preset.js.map +1 -0
  255. package/dist/templates/catalog.d.ts +4 -4
  256. package/dist/templates/index.js +2 -2
  257. package/dist/templates/presets.d.ts +2 -2
  258. package/dist/{templates-Pbxjdqlh.js → templates-BTJ9C9Kb.js} +22 -5
  259. package/dist/templates-BTJ9C9Kb.js.map +1 -0
  260. package/dist/types/auth.d.ts +1 -0
  261. package/dist/types/auto-group.d.ts +7 -0
  262. package/dist/types/componentWorkflowTypes.d.ts +22 -0
  263. package/dist/types/components.d.ts +1 -1
  264. package/dist/types/generated-ui.d.ts +11 -2
  265. package/dist/types/index.d.ts +4 -4
  266. package/dist/types/index.js +1 -1
  267. package/dist/types/jobs.d.ts +11 -3
  268. package/dist/{useApi-yE0re8k-.js → useApi-CDBq6z23.js} +15 -0
  269. package/dist/useApi-CDBq6z23.js.map +1 -0
  270. package/dist/{useControlSchema-Ds4VeFxt.js → useControlSchema-CXhxTul7.js} +104 -9
  271. package/dist/useControlSchema-CXhxTul7.js.map +1 -0
  272. package/dist/{useDropdownState-WIGW6Rr-.js → useDropdownState-DSb3BC3N.js} +2 -0
  273. package/dist/useDropdownState-DSb3BC3N.js.map +1 -0
  274. package/dist/{useExperimentSelector-DXqsZuSk.js → useExperimentSelector-D0pjj9WH.js} +3 -1
  275. package/dist/useExperimentSelector-D0pjj9WH.js.map +1 -0
  276. package/dist/{useFormBuilder-1so6QSQL.js → useFormBuilder-CuOFB3aP.js} +3 -1
  277. package/dist/useFormBuilder-CuOFB3aP.js.map +1 -0
  278. package/dist/{useProtocolTemplates-Cv0ca1AM.js → useProtocolTemplates-BWhQIWV5.js} +584 -47
  279. package/dist/useProtocolTemplates-BWhQIWV5.js.map +1 -0
  280. package/package.json +8 -2
  281. package/src/__stories__/experiment-helpers.ts +86 -0
  282. package/src/__tests__/components/ActionItem.test.ts +99 -0
  283. package/src/__tests__/components/ActionMenu.test.ts +120 -0
  284. package/src/__tests__/components/AppAvatarMenu.test.ts +38 -0
  285. package/src/__tests__/components/AppLayout.test.ts +207 -0
  286. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  287. package/src/__tests__/components/AppSidebar.test.ts +857 -0
  288. package/src/__tests__/components/AppToastContainer.test.ts +37 -0
  289. package/src/__tests__/components/AppTopBar.navigation.test.ts +68 -0
  290. package/src/__tests__/components/AppTopBar.test.ts +1256 -0
  291. package/src/__tests__/components/AppTopBarPageSelector.test.ts +156 -0
  292. package/src/__tests__/components/AppTopBarPillNav.test.ts +125 -0
  293. package/src/__tests__/components/AppTopBarPresence.test.ts +47 -0
  294. package/src/__tests__/components/ArtifactSaveDialog.test.ts +566 -0
  295. package/src/__tests__/components/ArtifactSelectorModal.test.ts +178 -0
  296. package/src/__tests__/components/AutoGroupModal.adapter.test.ts +204 -0
  297. package/src/__tests__/components/BaseInput.test.ts +99 -0
  298. package/src/__tests__/components/BaseModal.test.ts +133 -0
  299. package/src/__tests__/components/BasePill.test.ts +291 -0
  300. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  301. package/src/__tests__/components/BaseSelect.test.ts +73 -0
  302. package/src/__tests__/components/BaseTabs.test.ts +40 -0
  303. package/src/__tests__/components/BaseToggle.test.ts +40 -0
  304. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  305. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +159 -0
  306. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +192 -0
  307. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +328 -0
  308. package/src/__tests__/components/BioTemplateRenderer.test.ts +96 -0
  309. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  310. package/src/__tests__/components/Calendar.test.ts +566 -0
  311. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  312. package/src/__tests__/components/CollapsibleCard.test.ts +571 -0
  313. package/src/__tests__/components/ComponentBindingRenderer.test.ts +278 -0
  314. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  315. package/src/__tests__/components/ControlWorkspaceView.test.ts +1102 -0
  316. package/src/__tests__/components/DataFrame.test.ts +915 -0
  317. package/src/__tests__/components/DatePicker.test.ts +45 -0
  318. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  319. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
  320. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +185 -0
  321. package/src/__tests__/components/DropdownButton.test.ts +494 -0
  322. package/src/__tests__/components/EmptyState.test.ts +23 -0
  323. package/src/__tests__/components/ExperimentPopover.test.ts +143 -0
  324. package/src/__tests__/components/ExperimentSelectorModal.test.ts +143 -0
  325. package/src/__tests__/components/FormBuilder.test.ts +353 -0
  326. package/src/__tests__/components/GeneratedPathInput.test.ts +132 -0
  327. package/src/__tests__/components/GeneratedPlotlyResult.test.ts +117 -0
  328. package/src/__tests__/components/GeneratedPluginView.test.ts +235 -0
  329. package/src/__tests__/components/GeneratedResultRenderer.test.ts +93 -0
  330. package/src/__tests__/components/GroupAssigner.test.ts +48 -0
  331. package/src/__tests__/components/InstrumentAlertLog.test.ts +59 -0
  332. package/src/__tests__/components/JobsStatusTray.test.ts +165 -0
  333. package/src/__tests__/components/LcmsSequenceTable.test.ts +57 -0
  334. package/src/__tests__/components/MobileSupportGate.test.ts +120 -0
  335. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  336. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
  337. package/src/__tests__/components/PluginIcon.test.ts +215 -0
  338. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
  339. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
  340. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +43 -0
  341. package/src/__tests__/components/PluginWorkspaceView.test.ts +719 -0
  342. package/src/__tests__/components/ProgressBar.test.ts +18 -0
  343. package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
  344. package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
  345. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  346. package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
  347. package/src/__tests__/components/RackEditor.test.ts +125 -0
  348. package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
  349. package/src/__tests__/components/ReagentList.test.ts +82 -0
  350. package/src/__tests__/components/RetiredStyles.test.ts +82 -0
  351. package/src/__tests__/components/RuntimeUpdateNotice.test.ts +14 -0
  352. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  353. package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
  354. package/src/__tests__/components/SampleSelector.drag.test.ts +126 -0
  355. package/src/__tests__/components/SampleSelector.groups.test.ts +94 -0
  356. package/src/__tests__/components/SampleSelector.selection.test.ts +56 -0
  357. package/src/__tests__/components/SampleSelector.test.ts +466 -0
  358. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +40 -0
  359. package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
  360. package/src/__tests__/components/SectionCard.test.ts +181 -0
  361. package/src/__tests__/components/SegmentedControl.test.ts +69 -0
  362. package/src/__tests__/components/SequenceProgressBar.test.ts +39 -0
  363. package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
  364. package/src/__tests__/components/SettingsModal.test.ts +407 -0
  365. package/src/__tests__/components/SmartGroupFieldRecipe.groups.test.ts +101 -0
  366. package/src/__tests__/components/SmartGroupManual.cohorts.test.ts +97 -0
  367. package/src/__tests__/components/TagsInput.test.ts +75 -0
  368. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  369. package/src/__tests__/components/TimePicker.test.ts +38 -0
  370. package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
  371. package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
  372. package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
  373. package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
  374. package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
  375. package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
  376. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
  377. package/src/__tests__/composables/analysisArtifactTarget.test.ts +77 -0
  378. package/src/__tests__/composables/autoGroup/classKey.test.ts +25 -0
  379. package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
  380. package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
  381. package/src/__tests__/composables/autoGroup/compose.test.ts +226 -0
  382. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
  383. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +122 -0
  384. package/src/__tests__/composables/autoGroup/groupByOrder.test.ts +278 -0
  385. package/src/__tests__/composables/autoGroup/groupTree.test.ts +99 -0
  386. package/src/__tests__/composables/autoGroup/integration.test.ts +75 -0
  387. package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
  388. package/src/__tests__/composables/autoGroup/tokenLength.test.ts +85 -0
  389. package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
  390. package/src/__tests__/composables/experiment-utils.test.ts +63 -0
  391. package/src/__tests__/composables/formBuilderRegistry.test.ts +191 -0
  392. package/src/__tests__/composables/resolvePluginFrontendBase.test.ts +65 -0
  393. package/src/__tests__/composables/useAnalysisArtifacts.test.ts +740 -0
  394. package/src/__tests__/composables/useApi.test.ts +157 -0
  395. package/src/__tests__/composables/useAppExperiment.test.ts +899 -0
  396. package/src/__tests__/composables/useAuth.test.ts +233 -0
  397. package/src/__tests__/composables/useAutoGroup.test.ts +524 -0
  398. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +127 -0
  399. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +125 -0
  400. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  401. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +104 -0
  402. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  403. package/src/__tests__/composables/useCommandHistory.test.ts +43 -0
  404. package/src/__tests__/composables/useControlSchema.test.ts +1060 -0
  405. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  406. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  407. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  408. package/src/__tests__/composables/useEventStream.test.ts +140 -0
  409. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  410. package/src/__tests__/composables/useExperimentData.test.ts +154 -0
  411. package/src/__tests__/composables/useExperimentSamples.test.ts +91 -0
  412. package/src/__tests__/composables/useExperimentSave.test.ts +542 -0
  413. package/src/__tests__/composables/useExperimentSelector.test.ts +338 -0
  414. package/src/__tests__/composables/useFileImport.test.ts +44 -0
  415. package/src/__tests__/composables/useForm.test.ts +263 -0
  416. package/src/__tests__/composables/useFormBuilder.test.ts +994 -0
  417. package/src/__tests__/composables/useGeneratedAnalysis.test.ts +1903 -0
  418. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  419. package/src/__tests__/composables/useJobsStatusTray.test.ts +283 -0
  420. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  421. package/src/__tests__/composables/useMobileSupportGate.test.ts +74 -0
  422. package/src/__tests__/composables/useOptimisticMutation.test.ts +40 -0
  423. package/src/__tests__/composables/usePlatformContext.test.ts +148 -0
  424. package/src/__tests__/composables/usePluginClient.test.ts +1772 -0
  425. package/src/__tests__/composables/usePluginConfig.test.ts +497 -0
  426. package/src/__tests__/composables/usePresenceHeartbeat.test.ts +164 -0
  427. package/src/__tests__/composables/useProtocolTemplates.test.ts +64 -0
  428. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  429. package/src/__tests__/composables/useResourceCrud.test.ts +56 -0
  430. package/src/__tests__/composables/useRuntimeAlignment.test.ts +145 -0
  431. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  432. package/src/__tests__/composables/useSampleGroups.tree.test.ts +145 -0
  433. package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
  434. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  435. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  436. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  437. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  438. package/src/__tests__/composables/useTheme.test.ts +91 -0
  439. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  440. package/src/__tests__/composables/useWellPainting.test.ts +52 -0
  441. package/src/__tests__/composables/useWellPlateAdapter.test.ts +50 -0
  442. package/src/__tests__/composables/useWellPlateValidation.test.ts +42 -0
  443. package/src/__tests__/docs/extractDocsComponents.test.ts +156 -0
  444. package/src/__tests__/docs/extractDocsExports.test.ts +92 -0
  445. package/src/__tests__/docs/extractDocsParsing.test.ts +91 -0
  446. package/src/__tests__/docs/extractDocsTemplates.test.ts +53 -0
  447. package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
  448. package/src/__tests__/docs/frontendDocsCatalog.test.ts +436 -0
  449. package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
  450. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  451. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  452. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  453. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  454. package/src/__tests__/generatedUi.test.ts +119 -0
  455. package/src/__tests__/stores/experiment.test.ts +300 -0
  456. package/src/__tests__/stores/settings.test.ts +78 -0
  457. package/src/__tests__/templates/templates.test.ts +1185 -0
  458. package/src/__tests__/types/GeneratedJsonSchema.test.ts +62 -0
  459. package/src/__tests__/utils/color.test.ts +96 -0
  460. package/src/__tests__/utils/instrument.test.ts +47 -0
  461. package/src/__tests__/utils/jobs.test.ts +95 -0
  462. package/src/__tests__/utils/lcms.test.ts +73 -0
  463. package/src/__tests__/utils/permissions.test.ts +62 -0
  464. package/src/__tests__/utils/rack.test.ts +120 -0
  465. package/src/components/ActionMenu.story.vue +26 -0
  466. package/src/components/ActionMenu.vue +209 -0
  467. package/src/components/AlertBox.story.vue +204 -0
  468. package/src/components/AlertBox.vue +88 -0
  469. package/src/components/AppAvatarMenu.story.vue +155 -0
  470. package/src/components/AppAvatarMenu.vue +133 -0
  471. package/src/components/AppContainer.story.vue +104 -0
  472. package/src/components/AppContainer.vue +34 -0
  473. package/src/components/AppLayout.story.vue +331 -0
  474. package/src/components/AppLayout.vue +156 -0
  475. package/src/components/AppPluginSwitcher.vue +137 -0
  476. package/src/components/AppSidebar.story.vue +584 -0
  477. package/src/components/AppSidebar.vue +471 -0
  478. package/src/components/AppToastContainer.story.vue +157 -0
  479. package/src/components/AppToastContainer.vue +62 -0
  480. package/src/components/AppTopBar.navigation.ts +60 -0
  481. package/src/components/AppTopBar.story.vue +280 -0
  482. package/src/components/AppTopBar.vue +474 -0
  483. package/src/components/ArtifactSaveDialog.story.vue +319 -0
  484. package/src/components/ArtifactSaveDialog.vue +434 -0
  485. package/src/components/ArtifactSelectorModal.story.vue +295 -0
  486. package/src/components/ArtifactSelectorModal.vue +333 -0
  487. package/src/components/AuditTrail.story.vue +163 -0
  488. package/src/components/AuditTrail.vue +151 -0
  489. package/src/components/AutoGroupModal.adapter.ts +203 -0
  490. package/src/components/AutoGroupModal.story.vue +458 -0
  491. package/src/components/AutoGroupModal.vue +294 -0
  492. package/src/components/Avatar.story.vue +115 -0
  493. package/src/components/Avatar.vue +79 -0
  494. package/src/components/BaseButton.story.vue +96 -0
  495. package/src/components/BaseButton.vue +75 -0
  496. package/src/components/BaseCheckbox.story.vue +100 -0
  497. package/src/components/BaseCheckbox.vue +131 -0
  498. package/src/components/BaseInput.story.vue +98 -0
  499. package/src/components/BaseInput.vue +76 -0
  500. package/src/components/BaseModal.story.vue +335 -0
  501. package/src/components/BaseModal.vue +328 -0
  502. package/src/components/BasePill.story.vue +142 -0
  503. package/src/components/BasePill.vue +89 -0
  504. package/src/components/BaseRadioGroup.story.vue +145 -0
  505. package/src/components/BaseRadioGroup.vue +128 -0
  506. package/src/components/BaseSelect.story.vue +120 -0
  507. package/src/components/BaseSelect.vue +89 -0
  508. package/src/components/BaseSlider.story.vue +122 -0
  509. package/src/components/BaseSlider.vue +126 -0
  510. package/src/components/BaseTabs.story.vue +127 -0
  511. package/src/components/BaseTabs.vue +82 -0
  512. package/src/components/BaseTextarea.story.vue +91 -0
  513. package/src/components/BaseTextarea.vue +62 -0
  514. package/src/components/BaseToggle.story.vue +108 -0
  515. package/src/components/BaseToggle.vue +143 -0
  516. package/src/components/BatchProgressList.story.vue +92 -0
  517. package/src/components/BatchProgressList.vue +181 -0
  518. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  519. package/src/components/BioTemplateExperimentWorkspaceView.vue +350 -0
  520. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  521. package/src/components/BioTemplatePackWorkspaceView.vue +184 -0
  522. package/src/components/BioTemplatePresetWorkspaceView.story.vue +163 -0
  523. package/src/components/BioTemplatePresetWorkspaceView.vue +408 -0
  524. package/src/components/BioTemplateRenderer.story.vue +57 -0
  525. package/src/components/BioTemplateRenderer.vue +64 -0
  526. package/src/components/Breadcrumb.story.vue +106 -0
  527. package/src/components/Breadcrumb.vue +81 -0
  528. package/src/components/Calendar.story.vue +106 -0
  529. package/src/components/Calendar.vue +367 -0
  530. package/src/components/ChartContainer.story.vue +113 -0
  531. package/src/components/ChartContainer.vue +64 -0
  532. package/src/components/ChemicalFormula.story.vue +102 -0
  533. package/src/components/ChemicalFormula.vue +39 -0
  534. package/src/components/CollapsibleCard.story.vue +135 -0
  535. package/src/components/CollapsibleCard.vue +245 -0
  536. package/src/components/ColorSlider.story.vue +120 -0
  537. package/src/components/ColorSlider.vue +164 -0
  538. package/src/components/ComponentBindingRenderer.story.vue +87 -0
  539. package/src/components/ComponentBindingRenderer.vue +324 -0
  540. package/src/components/ConcentrationInput.story.vue +77 -0
  541. package/src/components/ConcentrationInput.vue +149 -0
  542. package/src/components/ConfirmDialog.story.vue +248 -0
  543. package/src/components/ConfirmDialog.vue +100 -0
  544. package/src/components/ControlWorkspaceView.story.vue +347 -0
  545. package/src/components/ControlWorkspaceView.vue +381 -0
  546. package/src/components/DataFrame.story.vue +148 -0
  547. package/src/components/DataFrame.vue +520 -0
  548. package/src/components/DatePicker.story.vue +119 -0
  549. package/src/components/DatePicker.vue +197 -0
  550. package/src/components/DateTimePicker.story.vue +112 -0
  551. package/src/components/DateTimePicker.vue +271 -0
  552. package/src/components/Divider.story.vue +80 -0
  553. package/src/components/Divider.vue +49 -0
  554. package/src/components/DoseCalculator.story.vue +68 -0
  555. package/src/components/DoseCalculator.vue +416 -0
  556. package/src/components/DoseCalculatorVolumeField.vue +61 -0
  557. package/src/components/DoseDesignWorkspaceView.story.vue +77 -0
  558. package/src/components/DoseDesignWorkspaceView.vue +262 -0
  559. package/src/components/DropdownButton.story.vue +102 -0
  560. package/src/components/DropdownButton.vue +163 -0
  561. package/src/components/EmptyState.story.vue +135 -0
  562. package/src/components/EmptyState.vue +71 -0
  563. package/src/components/ExperimentCodeBadge.story.vue +77 -0
  564. package/src/components/ExperimentCodeBadge.vue +64 -0
  565. package/src/components/ExperimentDataViewer.story.vue +174 -0
  566. package/src/components/ExperimentDataViewer.vue +293 -0
  567. package/src/components/ExperimentPopover.story.vue +442 -0
  568. package/src/components/ExperimentPopover.vue +312 -0
  569. package/src/components/ExperimentSelectorModal.story.vue +381 -0
  570. package/src/components/ExperimentSelectorModal.vue +432 -0
  571. package/src/components/ExperimentTimeline.story.vue +161 -0
  572. package/src/components/ExperimentTimeline.vue +357 -0
  573. package/src/components/FileUploader.story.vue +107 -0
  574. package/src/components/FileUploader.vue +424 -0
  575. package/src/components/FitPanel.story.vue +125 -0
  576. package/src/components/FitPanel.vue +120 -0
  577. package/src/components/FormActions.vue +92 -0
  578. package/src/components/FormBuilder.story.vue +203 -0
  579. package/src/components/FormBuilder.vue +311 -0
  580. package/src/components/FormField.story.vue +132 -0
  581. package/src/components/FormField.vue +59 -0
  582. package/src/components/FormulaInput.story.vue +96 -0
  583. package/src/components/FormulaInput.vue +125 -0
  584. package/src/components/GeneratedPathInput.vue +218 -0
  585. package/src/components/GeneratedPlotlyResult.vue +87 -0
  586. package/src/components/GeneratedPluginView.vue +289 -0
  587. package/src/components/GeneratedResultRenderer.vue +147 -0
  588. package/src/components/GroupAssigner.story.vue +83 -0
  589. package/src/components/GroupAssigner.vue +257 -0
  590. package/src/components/IconButton.story.vue +140 -0
  591. package/src/components/IconButton.vue +73 -0
  592. package/src/components/InstrumentAlertLog.vue +191 -0
  593. package/src/components/InstrumentStateBadge.vue +50 -0
  594. package/src/components/InstrumentStatusCard.vue +188 -0
  595. package/src/components/JobsStatusTray.story.vue +126 -0
  596. package/src/components/JobsStatusTray.vue +407 -0
  597. package/src/components/LcmsSequenceTable.vue +191 -0
  598. package/src/components/LoadingSpinner.story.vue +70 -0
  599. package/src/components/LoadingSpinner.vue +50 -0
  600. package/src/components/MobileSupportGate.story.vue +52 -0
  601. package/src/components/MobileSupportGate.vue +115 -0
  602. package/src/components/MoleculeInput.story.vue +66 -0
  603. package/src/components/MoleculeInput.vue +426 -0
  604. package/src/components/MultiSelect.story.vue +132 -0
  605. package/src/components/MultiSelect.vue +123 -0
  606. package/src/components/NumberInput.story.vue +122 -0
  607. package/src/components/NumberInput.vue +162 -0
  608. package/src/components/PlateMapEditor.story.vue +92 -0
  609. package/src/components/PlateMapEditor.vue +434 -0
  610. package/src/components/PluginIcon.story.vue +103 -0
  611. package/src/components/PluginIcon.vue +158 -0
  612. package/src/components/PluginWorkspaceView.controls.ts +182 -0
  613. package/src/components/PluginWorkspaceView.navigation.ts +106 -0
  614. package/src/components/PluginWorkspaceView.props.ts +169 -0
  615. package/src/components/PluginWorkspaceView.shell.ts +67 -0
  616. package/src/components/PluginWorkspaceView.story.vue +341 -0
  617. package/src/components/PluginWorkspaceView.vue +395 -0
  618. package/src/components/ProgressBar.story.vue +148 -0
  619. package/src/components/ProgressBar.vue +117 -0
  620. package/src/components/ProtocolStep.presentation.ts +31 -0
  621. package/src/components/ProtocolStepEditor.state.ts +104 -0
  622. package/src/components/ProtocolStepEditor.story.vue +69 -0
  623. package/src/components/ProtocolStepEditor.vue +382 -0
  624. package/src/components/ProtocolStepParameterField.vue +134 -0
  625. package/src/components/RackEditor.story.vue +100 -0
  626. package/src/components/RackEditor.vue +442 -0
  627. package/src/components/ReagentEditor.story.vue +153 -0
  628. package/src/components/ReagentEditor.vue +418 -0
  629. package/src/components/ReagentList.presentation.ts +105 -0
  630. package/src/components/ReagentList.story.vue +137 -0
  631. package/src/components/ReagentList.vue +392 -0
  632. package/src/components/ResourceCard.story.vue +150 -0
  633. package/src/components/ResourceCard.vue +161 -0
  634. package/src/components/RuntimeUpdateNotice.vue +51 -0
  635. package/src/components/SampleHierarchyTree.story.vue +161 -0
  636. package/src/components/SampleHierarchyTree.vue +246 -0
  637. package/src/components/SampleLegend.story.vue +91 -0
  638. package/src/components/SampleLegend.vue +119 -0
  639. package/src/components/SampleSelector.colors.ts +48 -0
  640. package/src/components/SampleSelector.drag.ts +164 -0
  641. package/src/components/SampleSelector.groups.ts +109 -0
  642. package/src/components/SampleSelector.selection.ts +64 -0
  643. package/src/components/SampleSelector.story.vue +192 -0
  644. package/src/components/SampleSelector.tree.ts +48 -0
  645. package/src/components/SampleSelector.vue +451 -0
  646. package/src/components/SampleSelectorGroupNode.vue +197 -0
  647. package/src/components/SampleSelectorSampleRow.vue +68 -0
  648. package/src/components/ScheduleCalendar.story.vue +195 -0
  649. package/src/components/ScheduleCalendar.vue +414 -0
  650. package/src/components/ScientificNumber.story.vue +127 -0
  651. package/src/components/ScientificNumber.vue +197 -0
  652. package/src/components/SectionCard.story.vue +163 -0
  653. package/src/components/SectionCard.vue +98 -0
  654. package/src/components/SegmentedControl.story.vue +149 -0
  655. package/src/components/SegmentedControl.vue +94 -0
  656. package/src/components/SequenceInput.story.vue +119 -0
  657. package/src/components/SequenceInput.vue +209 -0
  658. package/src/components/SequenceProgressBar.vue +71 -0
  659. package/src/components/SettingsModal.schema.ts +74 -0
  660. package/src/components/SettingsModal.story.vue +524 -0
  661. package/src/components/SettingsModal.vue +399 -0
  662. package/src/components/Skeleton.story.vue +141 -0
  663. package/src/components/Skeleton.vue +74 -0
  664. package/src/components/SmartGroup.types.ts +98 -0
  665. package/src/components/SmartGroupFieldRecipe.groups.ts +109 -0
  666. package/src/components/SmartGroupFieldRecipe.story.vue +58 -0
  667. package/src/components/SmartGroupFieldRecipe.vue +499 -0
  668. package/src/components/SmartGroupManual.cohorts.ts +112 -0
  669. package/src/components/SmartGroupManual.story.vue +55 -0
  670. package/src/components/SmartGroupManual.vue +398 -0
  671. package/src/components/SmartGroupModal.story.vue +61 -0
  672. package/src/components/SmartGroupModal.vue +61 -0
  673. package/src/components/StatusIndicator.story.vue +99 -0
  674. package/src/components/StatusIndicator.vue +40 -0
  675. package/src/components/StepWizard.story.vue +155 -0
  676. package/src/components/StepWizard.vue +223 -0
  677. package/src/components/TagsInput.story.vue +155 -0
  678. package/src/components/TagsInput.vue +280 -0
  679. package/src/components/ThemeToggle.story.vue +36 -0
  680. package/src/components/ThemeToggle.vue +56 -0
  681. package/src/components/TimePicker.story.vue +96 -0
  682. package/src/components/TimePicker.vue +251 -0
  683. package/src/components/TimeRangeInput.story.vue +104 -0
  684. package/src/components/TimeRangeInput.vue +122 -0
  685. package/src/components/Tooltip.story.vue +138 -0
  686. package/src/components/Tooltip.vue +114 -0
  687. package/src/components/UnitInput.story.vue +194 -0
  688. package/src/components/UnitInput.vue +217 -0
  689. package/src/components/WellPlate.colors.ts +56 -0
  690. package/src/components/WellPlate.conditions.ts +100 -0
  691. package/src/components/WellPlate.geometry.ts +91 -0
  692. package/src/components/WellPlate.interaction.ts +272 -0
  693. package/src/components/WellPlate.legend.ts +8 -0
  694. package/src/components/WellPlate.rendering.ts +105 -0
  695. package/src/components/WellPlate.sampleDrop.ts +73 -0
  696. package/src/components/WellPlate.story.vue +282 -0
  697. package/src/components/WellPlate.vue +497 -0
  698. package/src/components/index.ts +139 -0
  699. package/src/components/internal/ActionItemInternal.vue +82 -0
  700. package/src/components/internal/AppTopBarPageSelectorInternal.vue +127 -0
  701. package/src/components/internal/AppTopBarPillNavInternal.vue +194 -0
  702. package/src/components/internal/CalendarGridPanelInternal.vue +120 -0
  703. package/src/components/internal/FormFieldRendererInternal.vue +68 -0
  704. package/src/components/internal/FormSectionRenderer.vue +78 -0
  705. package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
  706. package/src/components/internal/WellEditPopupInternal.vue +230 -0
  707. package/src/composables/analysisArtifactTarget.ts +53 -0
  708. package/src/composables/autoGroup/classKey.ts +8 -0
  709. package/src/composables/autoGroup/classify.ts +205 -0
  710. package/src/composables/autoGroup/colors.ts +6 -0
  711. package/src/composables/autoGroup/columns.ts +226 -0
  712. package/src/composables/autoGroup/compose.ts +244 -0
  713. package/src/composables/autoGroup/cooccurrence.ts +46 -0
  714. package/src/composables/autoGroup/csv-shim.ts +44 -0
  715. package/src/composables/autoGroup/fingerprint.ts +63 -0
  716. package/src/composables/autoGroup/index.ts +22 -0
  717. package/src/composables/autoGroup/replicatePreGroup.ts +124 -0
  718. package/src/composables/autoGroup/template.ts +126 -0
  719. package/src/composables/autoGroup/tokenLength.ts +53 -0
  720. package/src/composables/autoGroup/tokenize.ts +41 -0
  721. package/src/composables/autoGroup/vocab.json +66 -0
  722. package/src/composables/autoGroupConstants.ts +4 -0
  723. package/src/composables/autoGroupGrouping.ts +148 -0
  724. package/src/composables/controlComponentBindings.ts +80 -0
  725. package/src/composables/controlSchemaAdapters.ts +199 -0
  726. package/src/composables/controlSchemaDoseDesign.ts +222 -0
  727. package/src/composables/controlSchemaFormFields.ts +64 -0
  728. package/src/composables/controlSchemaLayout.ts +59 -0
  729. package/src/composables/controlSchemaModel.ts +172 -0
  730. package/src/composables/controlSchemaNormalize.ts +101 -0
  731. package/src/composables/controlSchemaTypes.ts +372 -0
  732. package/src/composables/controlSchemaUtils.ts +36 -0
  733. package/src/composables/controlWorkspaceOptions.ts +21 -0
  734. package/src/composables/experiment-utils.ts +105 -0
  735. package/src/composables/experimentDesignData.ts +182 -0
  736. package/src/composables/formBuilderRegistry.ts +81 -0
  737. package/src/composables/formBuilderSchema.ts +153 -0
  738. package/src/composables/index.ts +530 -0
  739. package/src/composables/platformContextHelpers.ts +81 -0
  740. package/src/composables/pluginEndpointBuilder.ts +267 -0
  741. package/src/composables/pluginFrontendBase.ts +22 -0
  742. package/src/composables/protocolTemplateCatalog.ts +325 -0
  743. package/src/composables/useAnalysisArtifacts.ts +361 -0
  744. package/src/composables/useApi.ts +319 -0
  745. package/src/composables/useAppExperiment.ts +228 -0
  746. package/src/composables/useAsync.ts +323 -0
  747. package/src/composables/useAuth.ts +458 -0
  748. package/src/composables/useAutoGroup.ts +682 -0
  749. package/src/composables/useAutoGroupInputSources.ts +147 -0
  750. package/src/composables/useBioTemplateComponents.ts +105 -0
  751. package/src/composables/useBioTemplateControls.ts +41 -0
  752. package/src/composables/useBioTemplatePackWorkspace.ts +193 -0
  753. package/src/composables/useBioTemplatePresetWorkspace.ts +326 -0
  754. package/src/composables/useBioTemplateWorkspace.ts +141 -0
  755. package/src/composables/useCalendarGrid.ts +140 -0
  756. package/src/composables/useChemicalFormula.ts +275 -0
  757. package/src/composables/useCommandHistory.ts +113 -0
  758. package/src/composables/useConcentrationUnits.ts +246 -0
  759. package/src/composables/useControlSchema.ts +135 -0
  760. package/src/composables/useControlWorkspace.ts +209 -0
  761. package/src/composables/useDebouncedWatch.ts +119 -0
  762. package/src/composables/useDoseCalculator.ts +370 -0
  763. package/src/composables/useDropdownState.ts +83 -0
  764. package/src/composables/useEventListener.ts +111 -0
  765. package/src/composables/useEventStream.ts +314 -0
  766. package/src/composables/useExpansionSet.ts +117 -0
  767. package/src/composables/useExperimentData.ts +136 -0
  768. package/src/composables/useExperimentSamples.ts +142 -0
  769. package/src/composables/useExperimentSave.ts +344 -0
  770. package/src/composables/useExperimentSelector.ts +408 -0
  771. package/src/composables/useFileImport.ts +231 -0
  772. package/src/composables/useForm.ts +279 -0
  773. package/src/composables/useFormBuilder.ts +292 -0
  774. package/src/composables/useFormValidation.ts +154 -0
  775. package/src/composables/useGeneratedAnalysis.ts +1227 -0
  776. package/src/composables/useGroupAssignment.ts +148 -0
  777. package/src/composables/useJobsStatusTray.ts +493 -0
  778. package/src/composables/useListSelection.ts +158 -0
  779. package/src/composables/useMobileSupportGate.ts +80 -0
  780. package/src/composables/useOptimisticMutation.ts +107 -0
  781. package/src/composables/usePasskey.ts +216 -0
  782. package/src/composables/usePlatformContext.ts +299 -0
  783. package/src/composables/usePluginClient.ts +968 -0
  784. package/src/composables/usePluginConfig.ts +250 -0
  785. package/src/composables/usePresenceHeartbeat.ts +201 -0
  786. package/src/composables/useProtocolTemplates.ts +212 -0
  787. package/src/composables/useRackEditor.ts +223 -0
  788. package/src/composables/useReagentSeries.ts +91 -0
  789. package/src/composables/useRequestSyncState.ts +126 -0
  790. package/src/composables/useResourceCrud.ts +245 -0
  791. package/src/composables/useRuntimeAlignment.ts +184 -0
  792. package/src/composables/useSampleGroups.ts +211 -0
  793. package/src/composables/useScheduleCalendarLayout.ts +287 -0
  794. package/src/composables/useScheduleDrag.ts +245 -0
  795. package/src/composables/useSelectionLimit.ts +57 -0
  796. package/src/composables/useSequenceUtils.ts +105 -0
  797. package/src/composables/useSortedItems.ts +118 -0
  798. package/src/composables/useTemplateCollection.ts +229 -0
  799. package/src/composables/useTextSearch.ts +60 -0
  800. package/src/composables/useTheme.ts +32 -0
  801. package/src/composables/useTimeUtils.ts +155 -0
  802. package/src/composables/useToast.ts +40 -0
  803. package/src/composables/useWellPainting.ts +187 -0
  804. package/src/composables/useWellPlateAdapter.ts +147 -0
  805. package/src/composables/useWellPlateEditor.ts +425 -0
  806. package/src/composables/useWellPlateValidation.ts +85 -0
  807. package/src/generated/schema.ts +130 -0
  808. package/src/generated-ui/main.ts +21 -0
  809. package/src/histoire.setup.ts +17 -0
  810. package/src/index.ts +67 -0
  811. package/src/install.ts +39 -0
  812. package/src/instrument.ts +90 -0
  813. package/src/jobs.ts +80 -0
  814. package/src/lcms.ts +108 -0
  815. package/src/permissions.ts +144 -0
  816. package/src/plotly-dist.d.ts +3 -0
  817. package/src/stores/auth.ts +206 -0
  818. package/src/stores/experiment.ts +120 -0
  819. package/src/stores/index.ts +3 -0
  820. package/src/stores/settings.ts +232 -0
  821. package/src/styles/components/action-menu.css +59 -0
  822. package/src/styles/components/alert-box.css +150 -0
  823. package/src/styles/components/app-avatar-menu.css +156 -0
  824. package/src/styles/components/app-container.css +33 -0
  825. package/src/styles/components/app-layout.css +180 -0
  826. package/src/styles/components/app-page-selector.css +212 -0
  827. package/src/styles/components/app-pill-nav.css +133 -0
  828. package/src/styles/components/app-plugin-switcher.css +196 -0
  829. package/src/styles/components/app-sidebar.css +392 -0
  830. package/src/styles/components/app-top-bar.css +249 -0
  831. package/src/styles/components/artifact-save-dialog.css +17 -0
  832. package/src/styles/components/artifact-selector-modal.css +216 -0
  833. package/src/styles/components/audit-trail.css +143 -0
  834. package/src/styles/components/avatar.css +73 -0
  835. package/src/styles/components/batch-progress-list.css +196 -0
  836. package/src/styles/components/breadcrumb.css +64 -0
  837. package/src/styles/components/button.css +192 -0
  838. package/src/styles/components/calendar.css +192 -0
  839. package/src/styles/components/chart-container.css +69 -0
  840. package/src/styles/components/checkbox.css +210 -0
  841. package/src/styles/components/chemical-formula.css +46 -0
  842. package/src/styles/components/collapsible-card.css +393 -0
  843. package/src/styles/components/color-slider.css +110 -0
  844. package/src/styles/components/concentration-input.css +17 -0
  845. package/src/styles/components/confirm-dialog.css +59 -0
  846. package/src/styles/components/dataframe.css +554 -0
  847. package/src/styles/components/date-picker.css +243 -0
  848. package/src/styles/components/datetime-picker.css +229 -0
  849. package/src/styles/components/divider.css +63 -0
  850. package/src/styles/components/dose-calculator.css +297 -0
  851. package/src/styles/components/dropdown-button.css +280 -0
  852. package/src/styles/components/empty-state.css +135 -0
  853. package/src/styles/components/experiment-code-badge.css +33 -0
  854. package/src/styles/components/experiment-data-viewer.css +138 -0
  855. package/src/styles/components/experiment-popover.css +563 -0
  856. package/src/styles/components/experiment-selector-modal.css +341 -0
  857. package/src/styles/components/experiment-timeline.css +529 -0
  858. package/src/styles/components/file-uploader.css +310 -0
  859. package/src/styles/components/fit-panel.css +67 -0
  860. package/src/styles/components/form-builder.css +69 -0
  861. package/src/styles/components/form-field.css +48 -0
  862. package/src/styles/components/formula-input.css +103 -0
  863. package/src/styles/components/group-assigner.css +200 -0
  864. package/src/styles/components/icon-button.css +196 -0
  865. package/src/styles/components/input.css +65 -0
  866. package/src/styles/components/instrument-monitor.css +478 -0
  867. package/src/styles/components/jobs-status-tray.css +420 -0
  868. package/src/styles/components/lcms-sequence-table.css +189 -0
  869. package/src/styles/components/loading-spinner.css +67 -0
  870. package/src/styles/components/mobile-support-gate.css +119 -0
  871. package/src/styles/components/modal.css +646 -0
  872. package/src/styles/components/molecule-input.css +186 -0
  873. package/src/styles/components/multi-select.css +131 -0
  874. package/src/styles/components/number-input.css +199 -0
  875. package/src/styles/components/pill.css +188 -0
  876. package/src/styles/components/plate-map-editor.css +464 -0
  877. package/src/styles/components/plugin-icon.css +46 -0
  878. package/src/styles/components/progress-bar.css +133 -0
  879. package/src/styles/components/protocol-step-editor.css +443 -0
  880. package/src/styles/components/rack-editor.css +265 -0
  881. package/src/styles/components/radio-group.css +240 -0
  882. package/src/styles/components/reagent-editor.css +505 -0
  883. package/src/styles/components/reagent-list.css +407 -0
  884. package/src/styles/components/resource-card.css +360 -0
  885. package/src/styles/components/sample-hierarchy-tree.css +310 -0
  886. package/src/styles/components/sample-legend.css +201 -0
  887. package/src/styles/components/sample-selector.css +682 -0
  888. package/src/styles/components/schedule-calendar.css +472 -0
  889. package/src/styles/components/scientific-number.css +63 -0
  890. package/src/styles/components/section-card.css +161 -0
  891. package/src/styles/components/segmented-control.css +194 -0
  892. package/src/styles/components/select.css +77 -0
  893. package/src/styles/components/sequence-input.css +184 -0
  894. package/src/styles/components/sequence-progress-bar.css +63 -0
  895. package/src/styles/components/settings-modal.css +76 -0
  896. package/src/styles/components/skeleton.css +49 -0
  897. package/src/styles/components/slider.css +74 -0
  898. package/src/styles/components/smart-group.css +734 -0
  899. package/src/styles/components/status-indicator.css +66 -0
  900. package/src/styles/components/step-wizard.css +192 -0
  901. package/src/styles/components/tabs.css +103 -0
  902. package/src/styles/components/tags-input.css +195 -0
  903. package/src/styles/components/textarea.css +81 -0
  904. package/src/styles/components/theme-toggle.css +6 -0
  905. package/src/styles/components/time-picker.css +171 -0
  906. package/src/styles/components/time-range-input.css +42 -0
  907. package/src/styles/components/toast.css +91 -0
  908. package/src/styles/components/toggle.css +226 -0
  909. package/src/styles/components/tooltip.css +91 -0
  910. package/src/styles/components/unit-input.css +123 -0
  911. package/src/styles/components/well-edit-popup.css +258 -0
  912. package/src/styles/components/well-plate.css +286 -0
  913. package/src/styles/index.css +93 -0
  914. package/src/styles/variables.css +1150 -0
  915. package/src/tailwind.preset.ts +66 -0
  916. package/src/templates/adapters.ts +137 -0
  917. package/src/templates/assayLookups.ts +33 -0
  918. package/src/templates/assayMatrixAdapters.ts +78 -0
  919. package/src/templates/assayMatrixBuilder.ts +59 -0
  920. package/src/templates/assayNormalizers.ts +34 -0
  921. package/src/templates/builderDefaults.ts +11 -0
  922. package/src/templates/builderIdUtils.ts +20 -0
  923. package/src/templates/builderPresetControls.ts +165 -0
  924. package/src/templates/builderReadUtils.ts +57 -0
  925. package/src/templates/builders.ts +122 -0
  926. package/src/templates/calibrationCurveAdapters.ts +59 -0
  927. package/src/templates/calibrationCurveBuilder.ts +99 -0
  928. package/src/templates/calibrationNormalizers.ts +60 -0
  929. package/src/templates/catalog.ts +245 -0
  930. package/src/templates/componentBindingCatalog.ts +90 -0
  931. package/src/templates/componentBindingHelpers.ts +93 -0
  932. package/src/templates/componentBindings.ts +253 -0
  933. package/src/templates/componentDoseResponseProps.ts +42 -0
  934. package/src/templates/componentGenericProps.ts +77 -0
  935. package/src/templates/componentPlateHelpers.ts +29 -0
  936. package/src/templates/componentPlateMapProps.ts +32 -0
  937. package/src/templates/componentPropsFactory.ts +21 -0
  938. package/src/templates/componentQpcrPlateProps.ts +28 -0
  939. package/src/templates/componentTargetResolvers.ts +69 -0
  940. package/src/templates/componentTemplateProps.ts +78 -0
  941. package/src/templates/controlSchemaClone.ts +32 -0
  942. package/src/templates/controlSchemaConstants.ts +11 -0
  943. package/src/templates/controlSchemaMerge.ts +40 -0
  944. package/src/templates/controlSchemaTargets.ts +87 -0
  945. package/src/templates/controlSchemaTypes.ts +20 -0
  946. package/src/templates/controlSchemas.ts +104 -0
  947. package/src/templates/defaultBioTemplateBuilder.ts +124 -0
  948. package/src/templates/doseResponseAdapters.ts +45 -0
  949. package/src/templates/doseResponseBuilder.ts +44 -0
  950. package/src/templates/elisaAssayCollectionBuilder.ts +62 -0
  951. package/src/templates/flowCytometryAssayCollectionBuilder.ts +41 -0
  952. package/src/templates/flowCytometryPanelBuilder.ts +53 -0
  953. package/src/templates/flowNormalizers.ts +58 -0
  954. package/src/templates/flowPanelAdapters.ts +58 -0
  955. package/src/templates/index.ts +326 -0
  956. package/src/templates/instrumentRunAdapterHelpers.ts +94 -0
  957. package/src/templates/instrumentRunAdapters.ts +163 -0
  958. package/src/templates/instrumentRunBuilder.ts +97 -0
  959. package/src/templates/lcmsBatchCollectionBuilder.ts +38 -0
  960. package/src/templates/lookup.ts +18 -0
  961. package/src/templates/packs.ts +162 -0
  962. package/src/templates/plateGeometry.ts +62 -0
  963. package/src/templates/plateMapAdapters.ts +36 -0
  964. package/src/templates/plateMapBuilder.ts +43 -0
  965. package/src/templates/presetControlSchemas.ts +258 -0
  966. package/src/templates/presets.ts +179 -0
  967. package/src/templates/protocolAdapters.ts +69 -0
  968. package/src/templates/protocolNormalizers.ts +37 -0
  969. package/src/templates/protocolStepsBuilder.ts +36 -0
  970. package/src/templates/qpcrAdapters.ts +104 -0
  971. package/src/templates/qpcrExpressionCollectionBuilder.ts +33 -0
  972. package/src/templates/qpcrPlateBuilder.ts +96 -0
  973. package/src/templates/reagentAdapters.ts +77 -0
  974. package/src/templates/reagentListBuilder.ts +30 -0
  975. package/src/templates/runNormalizers.ts +63 -0
  976. package/src/templates/sampleNormalizers.ts +58 -0
  977. package/src/templates/samplePrepAdapters.ts +63 -0
  978. package/src/templates/samplePrepBuilder.ts +51 -0
  979. package/src/templates/sampleSheetAdapters.ts +75 -0
  980. package/src/templates/sampleSheetBuilder.ts +23 -0
  981. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +79 -0
  982. package/src/templates/targetedMetabolomicsHelpers.ts +102 -0
  983. package/src/templates/templateAdapterTypes.ts +58 -0
  984. package/src/templates/templateControlSchemas.ts +320 -0
  985. package/src/templates/templateCreateOptions.ts +208 -0
  986. package/src/templates/templateEnvelopes.ts +137 -0
  987. package/src/templates/templatePackCollectionBuilder.ts +23 -0
  988. package/src/templates/templatePresetCollectionBuilder.ts +139 -0
  989. package/src/templates/templateQpcrTypes.ts +48 -0
  990. package/src/templates/templateValidators.ts +414 -0
  991. package/src/templates/timeCourseAdapters.ts +73 -0
  992. package/src/templates/timeCourseBuilder.ts +64 -0
  993. package/src/templates/types.ts +493 -0
  994. package/src/templates/wellPlateScreenCollectionBuilder.ts +36 -0
  995. package/src/templates/westernBlotAssayCollectionBuilder.ts +68 -0
  996. package/src/types/analysisArtifactTypes.ts +176 -0
  997. package/src/types/auth.ts +59 -0
  998. package/src/types/auto-group.ts +157 -0
  999. package/src/types/componentLabTypes.ts +235 -0
  1000. package/src/types/componentWorkflowTypes.ts +190 -0
  1001. package/src/types/components.ts +527 -0
  1002. package/src/types/form-builder.ts +207 -0
  1003. package/src/types/generated-ui.ts +189 -0
  1004. package/src/types/index.ts +299 -0
  1005. package/src/types/instrument.ts +62 -0
  1006. package/src/types/jobs.ts +70 -0
  1007. package/src/types/platform.ts +132 -0
  1008. package/src/utils/color.ts +96 -0
  1009. package/src/utils/formModelSync.ts +52 -0
  1010. package/src/utils/items.ts +28 -0
  1011. package/src/utils/options.ts +23 -0
  1012. package/src/utils/pluginIcon.ts +190 -0
  1013. package/src/utils/rack.ts +209 -0
  1014. package/src/utils/sampleGroupPath.ts +19 -0
  1015. package/dist/ExperimentPopover-C1e0cd94.js +0 -3
  1016. package/dist/ExperimentSelectorModal-DCWTFyos.js +0 -4
  1017. package/dist/SettingsModal-Bpybht86.js +0 -5
@@ -1,9 +1,9 @@
1
1
  import { d as resolveExperimentCode } from "./experiment-utils-CLnzPPq5.js";
2
2
  import { r as useRequestSyncState } from "./EmptyState-p90quq8Z.js";
3
- import { A as useConcentrationUnits, H as parseExperimentId, U as resolveCurrentExperimentId, V as getInjectedPlatformContext, u as useControlWorkspace } from "./useControlSchema-Ds4VeFxt.js";
4
- import { o as useSettingsStore, r as useApi } from "./useApi-yE0re8k-.js";
5
- import { t as useExperimentStore } from "./experiment-D08H_TIH.js";
6
- import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps$1, H as toBioTemplateComponentPropsById, Jt as getBioTemplatePresetInfo, L as toBioTemplateComponentBindings, P as getBioTemplateComponentBindings, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, U as toBioTemplateComponentSnippets, V as toBioTemplateComponentPropsByComponent$1, W as toBioTemplateComponentUsage, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, i as createBioTemplateControlToolkit, p as createBioTemplatePackCollection, sn as createTemplateCollection, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, z as toBioTemplateComponentImports } from "./templates-Pbxjdqlh.js";
3
+ import { A as useConcentrationUnits, H as parseExperimentId, J as isActiveJobStatus, Q as normalizeJobState, U as resolveCurrentExperimentId, V as getInjectedPlatformContext, u as useControlWorkspace } from "./useControlSchema-CXhxTul7.js";
4
+ import { o as useSettingsStore, r as useApi } from "./useApi-CDBq6z23.js";
5
+ import { t as useExperimentStore } from "./experiment-Y9Iz7KYi.js";
6
+ import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps$1, H as toBioTemplateComponentPropsById, Jt as getBioTemplatePresetInfo, L as toBioTemplateComponentBindings, P as getBioTemplateComponentBindings, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, U as toBioTemplateComponentSnippets, V as toBioTemplateComponentPropsByComponent$1, W as toBioTemplateComponentUsage, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, i as createBioTemplateControlToolkit, p as createBioTemplatePackCollection, sn as createTemplateCollection, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, z as toBioTemplateComponentImports } from "./templates-BTJ9C9Kb.js";
7
7
  import { computed, effectScope, getCurrentScope, inject, onMounted, onScopeDispose, onUnmounted, provide, reactive, readonly, ref, shallowRef, toRaw, toValue, unref, watch } from "vue";
8
8
  //#region src/composables/useSortedItems.ts
9
9
  /** Shared sorting for SDK tables and lists with stable empty-value handling. */
@@ -528,32 +528,85 @@ function useMobileSupportGate(options = {}) {
528
528
  };
529
529
  }
530
530
  //#endregion
531
- //#region src/jobs.ts
532
- var ACTIVE_JOB_STATUSES = new Set([
533
- "awaiting_input",
534
- "queued",
535
- "running"
536
- ]);
537
- /** Clamp invalid or out-of-range progress values for safe display. */
538
- function normalizeJobPercent(value) {
539
- if (!Number.isFinite(value)) return 0;
540
- return Math.min(100, Math.max(0, value));
541
- }
542
- function isActiveJobStatus(status) {
543
- return ACTIVE_JOB_STATUSES.has(status);
544
- }
545
- function jobStatusLabel(status) {
546
- return {
547
- awaiting_input: "Waiting for input",
548
- queued: "Queued",
549
- running: "Running",
550
- completed: "Completed",
551
- failed: "Failed",
552
- cancelled: "Cancelled"
553
- }[status];
554
- }
555
- //#endregion
556
531
  //#region src/composables/useJobsStatusTray.ts
532
+ /**
533
+ * Combines independent job runtimes without copying their reactive state.
534
+ *
535
+ * Job ids must be globally unique across the sources. A duplicate id throws
536
+ * when jobs are read or an id-routed action is requested, rather than silently
537
+ * dispatching a mutation to the wrong owner.
538
+ */
539
+ function combinePluginJobSources(sources) {
540
+ const jobs = computed(() => {
541
+ const combined = [];
542
+ const owners = /* @__PURE__ */ new Set();
543
+ for (const source of sources) for (const job of toValue(source.jobs)) {
544
+ if (owners.has(job.job_id)) throw duplicatePluginJobId(job.job_id);
545
+ owners.add(job.job_id);
546
+ combined.push(job);
547
+ }
548
+ return combined;
549
+ });
550
+ function ownerFor(jobId) {
551
+ let owner;
552
+ for (const source of sources) {
553
+ if (!toValue(source.jobs).some((job) => job.job_id === jobId)) continue;
554
+ if (owner) throw duplicatePluginJobId(jobId);
555
+ owner = source;
556
+ }
557
+ if (!owner) throw new Error(`Unknown plugin job id: ${jobId}`);
558
+ return owner;
559
+ }
560
+ const combined = { jobs };
561
+ if (sources.some((source) => source.refreshJobs)) combined.refreshJobs = async () => {
562
+ await Promise.all(sources.map((source) => source.refreshJobs?.()));
563
+ return jobs.value;
564
+ };
565
+ if (sources.some((source) => source.cancelJob)) combined.cancelJob = async (jobId) => {
566
+ const owner = ownerFor(jobId);
567
+ if (!owner.cancelJob) throw new Error(`Job ${jobId} cannot be cancelled by its source`);
568
+ return owner.cancelJob(jobId);
569
+ };
570
+ if (sources.length > 0 && sources.every((source) => source.deleteJob)) combined.deleteJob = async (jobId) => {
571
+ const owner = ownerFor(jobId);
572
+ if (!owner.deleteJob) throw new Error(`Job ${jobId} cannot be deleted by its source`);
573
+ return owner.deleteJob(jobId);
574
+ };
575
+ if (sources.length > 0 && sources.every((source) => source.clearFinishedJobs)) combined.clearFinishedJobs = async () => {
576
+ const results = await Promise.all(sources.map((source) => source.clearFinishedJobs()));
577
+ return results.every((result) => typeof result === "number") ? results.reduce((total, result) => total + result, 0) : void 0;
578
+ };
579
+ if (sources.some((source) => source.dispose)) combined.dispose = () => {
580
+ const errors = [];
581
+ for (const source of sources) try {
582
+ source.dispose?.();
583
+ } catch (cause) {
584
+ errors.push(cause);
585
+ }
586
+ if (errors.length === 1) throw errors[0];
587
+ if (errors.length > 1) throw new PluginJobSourceDisposeError(errors);
588
+ };
589
+ return combined;
590
+ }
591
+ var PluginJobSourceDisposeError = class extends Error {
592
+ cause;
593
+ errors;
594
+ constructor(errors) {
595
+ super("Failed to dispose plugin job sources");
596
+ this.name = "PluginJobSourceDisposeError";
597
+ this.cause = errors[0];
598
+ this.errors = Object.freeze([...errors]);
599
+ }
600
+ };
601
+ function duplicatePluginJobId(jobId) {
602
+ return /* @__PURE__ */ new Error(`Duplicate plugin job id across combined sources: ${jobId}`);
603
+ }
604
+ function responseJobs(response) {
605
+ return "jobs" in response ? response.jobs : response;
606
+ }
607
+ function isSnapshotPayload(data) {
608
+ return "jobs" in data && Array.isArray(data.jobs);
609
+ }
557
610
  function errorMessage(error, fallback) {
558
611
  return error instanceof Error ? error.message : fallback;
559
612
  }
@@ -564,38 +617,94 @@ function errorMessage(error, fallback) {
564
617
  * source. The controller never mirrors source jobs into another ref.
565
618
  */
566
619
  function usePluginJobCenter(options = {}) {
620
+ const legacyOverride = shallowRef(null);
567
621
  const isOpen = ref(false);
568
622
  const activeTab = ref("active");
569
623
  const isLoading = ref(false);
570
624
  const error = shallowRef(null);
571
625
  const pendingJobIds = ref(/* @__PURE__ */ new Set());
626
+ const jobRevisions = /* @__PURE__ */ new Map();
627
+ let stateRevision = 0;
572
628
  let requestGeneration = 0;
573
629
  let active = true;
574
630
  const source = computed(() => toValue(options.source));
575
- const jobs = computed(() => source.value ? [...toValue(source.value.jobs)] : []);
631
+ const adapter = computed(() => toValue(options.adapter));
632
+ const jobs = computed(() => {
633
+ const currentSource = source.value;
634
+ if (currentSource) return [...toValue(currentSource.jobs)].map(normalizeJobState);
635
+ const input = toValue(options.jobs);
636
+ const override = legacyOverride.value;
637
+ if (override && override.input === input) return override.jobs;
638
+ return input ? [...input].map(normalizeJobState) : [];
639
+ });
576
640
  const activeJobs = computed(() => jobs.value.filter((job) => isActiveJobStatus(job.status)));
577
641
  const historyJobs = computed(() => jobs.value.filter((job) => !isActiveJobStatus(job.status)));
578
642
  const deletableJobs = computed(() => historyJobs.value.filter((job) => job.can_delete));
579
643
  const featuredJob = computed(() => activeJobs.value[0] ?? historyJobs.value[0] ?? null);
580
- const canRefresh = computed(() => Boolean(source.value?.refreshJobs));
581
- const canCancel = computed(() => Boolean(source.value?.cancelJob));
582
- const canDelete = computed(() => Boolean(source.value?.deleteJob));
583
- const canClearFinished = computed(() => Boolean(source.value?.clearFinishedJobs || source.value?.deleteJob));
644
+ const canRefresh = computed(() => Boolean(source.value?.refreshJobs || adapter.value?.listJobs));
645
+ const canCancel = computed(() => Boolean(source.value?.cancelJob || adapter.value?.cancelJob));
646
+ const canDelete = computed(() => Boolean(source.value?.deleteJob || adapter.value?.deleteJob));
647
+ const canClearFinished = computed(() => Boolean(source.value?.clearFinishedJobs || source.value?.deleteJob || adapter.value?.clearFinishedJobs || adapter.value?.deleteJob));
648
+ function bumpJobRevision(jobId) {
649
+ jobRevisions.set(jobId, (jobRevisions.get(jobId) ?? 0) + 1);
650
+ }
651
+ function replaceLegacyJobs(nextJobs) {
652
+ const normalized = nextJobs.map(normalizeJobState);
653
+ new Set([...jobs.value.map((job) => job.job_id), ...normalized.map((job) => job.job_id)]).forEach(bumpJobRevision);
654
+ legacyOverride.value = {
655
+ input: toValue(options.jobs),
656
+ jobs: normalized
657
+ };
658
+ stateRevision += 1;
659
+ }
660
+ function upsertLegacyJob(nextJob) {
661
+ const normalized = normalizeJobState(nextJob);
662
+ const existingIndex = jobs.value.findIndex((job) => job.job_id === normalized.job_id);
663
+ const nextJobs = [...jobs.value];
664
+ if (existingIndex === -1) nextJobs.unshift(normalized);
665
+ else nextJobs[existingIndex] = normalized;
666
+ legacyOverride.value = {
667
+ input: toValue(options.jobs),
668
+ jobs: nextJobs
669
+ };
670
+ bumpJobRevision(normalized.job_id);
671
+ stateRevision += 1;
672
+ }
673
+ function removeLegacyJobs(jobIds) {
674
+ legacyOverride.value = {
675
+ input: toValue(options.jobs),
676
+ jobs: jobs.value.filter((job) => !jobIds.has(job.job_id))
677
+ };
678
+ jobIds.forEach(bumpJobRevision);
679
+ stateRevision += 1;
680
+ }
584
681
  function setPending(jobId, pending) {
585
682
  const next = new Set(pendingJobIds.value);
586
683
  if (pending) next.add(jobId);
587
684
  else next.delete(jobId);
588
685
  pendingJobIds.value = next;
589
686
  }
687
+ function applyStreamMessage(message) {
688
+ if (!active || source.value) return;
689
+ if (message.event === "snapshot" && isSnapshotPayload(message.data)) {
690
+ replaceLegacyJobs(message.data.jobs);
691
+ return;
692
+ }
693
+ if ((message.event === "job" || message.event === "terminal") && !isSnapshotPayload(message.data)) upsertLegacyJob(message.data);
694
+ }
590
695
  async function refresh() {
591
- const refreshJobs = source.value?.refreshJobs;
592
- if (!refreshJobs) return false;
696
+ const currentSource = source.value;
697
+ const listJobs = currentSource?.refreshJobs ?? adapter.value?.listJobs;
698
+ if (!listJobs) return false;
593
699
  const generation = ++requestGeneration;
700
+ const revision = stateRevision;
594
701
  isLoading.value = true;
595
702
  error.value = null;
596
703
  try {
597
- await refreshJobs();
598
- return active && generation === requestGeneration;
704
+ const response = await listJobs();
705
+ if (!active || generation !== requestGeneration || revision !== stateRevision) return false;
706
+ if (!currentSource && response) replaceLegacyJobs(responseJobs(response));
707
+ return true;
599
708
  } catch (cause) {
600
709
  if (active && generation === requestGeneration) error.value = errorMessage(cause, "Failed to load jobs");
601
710
  return false;
@@ -605,12 +714,17 @@ function usePluginJobCenter(options = {}) {
605
714
  }
606
715
  async function cancelJob(job) {
607
716
  const sourceCancel = source.value?.cancelJob;
608
- if (!job.can_cancel || !sourceCancel || pendingJobIds.value.has(job.job_id)) return false;
717
+ const adapterCancel = adapter.value?.cancelJob;
718
+ if (!job.can_cancel || !sourceCancel && !adapterCancel || pendingJobIds.value.has(job.job_id)) return false;
719
+ const revision = jobRevisions.get(job.job_id) ?? 0;
609
720
  setPending(job.job_id, true);
610
721
  error.value = null;
611
722
  try {
612
- await sourceCancel(job.job_id);
613
- return active;
723
+ const updated = sourceCancel ? await sourceCancel(job.job_id) : await adapterCancel(job);
724
+ if (!active) return false;
725
+ if (!sourceCancel && revision === (jobRevisions.get(job.job_id) ?? 0)) if (updated) upsertLegacyJob(updated);
726
+ else await refresh();
727
+ return true;
614
728
  } catch (cause) {
615
729
  if (active) error.value = errorMessage(cause, "Failed to cancel job");
616
730
  return false;
@@ -620,12 +734,16 @@ function usePluginJobCenter(options = {}) {
620
734
  }
621
735
  async function deleteJob(job) {
622
736
  const sourceDelete = source.value?.deleteJob;
623
- if (!job.can_delete || !sourceDelete || pendingJobIds.value.has(job.job_id)) return false;
737
+ const adapterDelete = adapter.value?.deleteJob;
738
+ if (!job.can_delete || !sourceDelete && !adapterDelete || pendingJobIds.value.has(job.job_id)) return false;
624
739
  setPending(job.job_id, true);
625
740
  error.value = null;
626
741
  try {
627
- const deleted = await sourceDelete(job.job_id);
628
- return active && deleted !== false;
742
+ const deleted = sourceDelete ? await sourceDelete(job.job_id) : await adapterDelete(job);
743
+ if (!active) return false;
744
+ if (!sourceDelete) if (deleted === false) await refresh();
745
+ else removeLegacyJobs(new Set([job.job_id]));
746
+ return deleted !== false;
629
747
  } catch (cause) {
630
748
  if (active) error.value = errorMessage(cause, "Failed to delete job");
631
749
  return false;
@@ -645,12 +763,30 @@ function usePluginJobCenter(options = {}) {
645
763
  return typeof deleted !== "number" || deleted === targets.length;
646
764
  }
647
765
  if (currentSource?.deleteJob) return (await Promise.all(targets.map((job) => deleteJob(job)))).every(Boolean);
648
- return false;
766
+ const currentAdapter = adapter.value;
767
+ if (currentAdapter?.clearFinishedJobs) {
768
+ const deleted = await currentAdapter.clearFinishedJobs(targets);
769
+ if (!active) return false;
770
+ if (typeof deleted === "number" && deleted !== targets.length) {
771
+ await refresh();
772
+ return false;
773
+ }
774
+ removeLegacyJobs(new Set(targets.map((job) => job.job_id)));
775
+ return true;
776
+ }
777
+ if (!currentAdapter?.deleteJob) return false;
778
+ return (await Promise.all(targets.map((job) => deleteJob(job)))).every(Boolean);
649
779
  } catch (cause) {
650
780
  if (active) error.value = errorMessage(cause, "Failed to clear jobs");
651
781
  return false;
652
782
  }
653
783
  }
784
+ if (options.eventStream !== void 0) watch(() => toValue(options.eventStream)?.lastMessage.value ?? null, (message) => {
785
+ if (message) applyStreamMessage(message);
786
+ }, { immediate: true });
787
+ onMounted(() => {
788
+ if (options.loadOnMount !== false) refresh();
789
+ });
654
790
  onUnmounted(() => {
655
791
  active = false;
656
792
  requestGeneration += 1;
@@ -680,12 +816,17 @@ function usePluginJobCenter(options = {}) {
680
816
  isOpen.value = !isOpen.value;
681
817
  },
682
818
  refresh,
819
+ applyStreamMessage,
683
820
  cancelJob,
684
821
  deleteJob,
685
822
  clearFinished,
686
823
  isPending: (job) => pendingJobIds.value.has(job.job_id)
687
824
  };
688
825
  }
826
+ /** @deprecated Use `usePluginJobCenter()` for the plugin job-center controller. */
827
+ function useJobsStatusTray(options = {}) {
828
+ return usePluginJobCenter(options);
829
+ }
689
830
  //#endregion
690
831
  //#region src/composables/useDoseCalculator.ts
691
832
  var VOLUME_UNITS = [
@@ -2285,6 +2426,14 @@ function parseCSV(text) {
2285
2426
  //#endregion
2286
2427
  //#region src/composables/useAutoGroup.ts
2287
2428
  var STRUCTURED_MISSING_GROUP = "Outlier";
2429
+ var deprecationWarned = false;
2430
+ var outlierDeprecationWarned = false;
2431
+ function warnDeprecated(api) {
2432
+ if (deprecationWarned) return;
2433
+ if (typeof process !== "undefined" && process.env.NODE_ENV === "production") return;
2434
+ console.warn(`[useAutoGroup] ${api} is deprecated; use the new class-first API (setClassDisposition / toggleGroupBy / setValueOps).`);
2435
+ deprecationWarned = true;
2436
+ }
2288
2437
  function useAutoGroup() {
2289
2438
  const inputMode = ref("paste");
2290
2439
  const rawText = ref("");
@@ -2617,6 +2766,54 @@ function useAutoGroup() {
2617
2766
  document.body.removeChild(a);
2618
2767
  URL.revokeObjectURL(url);
2619
2768
  }
2769
+ /** Test seam — exposes the template content/filename without triggering a browser download. */
2770
+ function composeTemplateForTest(opts) {
2771
+ return composeTemplate(samples.value, opts.mode === "prefilled" ? Object.values(schemas.value) : null, opts.mode === "prefilled" ? classes.value : null, {
2772
+ ...opts,
2773
+ tokenizedSamples: tokenized.value
2774
+ });
2775
+ }
2776
+ const outliers = ref([]);
2777
+ const hasOutliers = computed(() => outliers.value.length > 0);
2778
+ const conformingSamples = computed(() => samples.value);
2779
+ const dominantFieldCount = computed(() => tokenized.value[0]?.length ?? 0);
2780
+ const minFieldCount = computed(() => {
2781
+ if (tokenized.value.length === 0) return 0;
2782
+ return Math.min(...tokenized.value.map((t) => t.length));
2783
+ });
2784
+ const fields = computed(() => activeSchema.value?.columns ?? []);
2785
+ const fieldNames = computed(() => {
2786
+ const out = {};
2787
+ for (const c of fields.value) out[c.index] = c.displayName ?? c.name;
2788
+ return out;
2789
+ });
2790
+ const enabledFields = computed(() => activeSchema.value ? new Set(activeSchema.value.groupBy) : /* @__PURE__ */ new Set());
2791
+ const effectiveColumns = fields;
2792
+ const allSingletons = computed(() => groups.value.length > 1 && groups.value.every((g) => g.samples.length === 1));
2793
+ function setOutlierAction(_, __) {
2794
+ if (!outlierDeprecationWarned) {
2795
+ if (typeof process === "undefined" || process.env.NODE_ENV !== "production") {
2796
+ console.warn("[useAutoGroup] setOutlierAction is deprecated AND inactive in the class-first redesign. Use setClassDisposition('iqc' | 'eqc' | …, 'group' | 'overlay' | 'exclude') instead.");
2797
+ outlierDeprecationWarned = true;
2798
+ }
2799
+ }
2800
+ }
2801
+ function setAllOutlierActions(__) {
2802
+ if (!outlierDeprecationWarned) {
2803
+ if (typeof process === "undefined" || process.env.NODE_ENV !== "production") {
2804
+ console.warn("[useAutoGroup] setAllOutlierActions is deprecated AND inactive in the class-first redesign. Use setClassDisposition('iqc' | 'eqc' | …, 'group' | 'overlay' | 'exclude') instead.");
2805
+ outlierDeprecationWarned = true;
2806
+ }
2807
+ }
2808
+ }
2809
+ function toggleField(index) {
2810
+ warnDeprecated("toggleField");
2811
+ if (activeClassKey.value) toggleGroupBy(activeClassKey.value, index);
2812
+ }
2813
+ function renameField(index, name) {
2814
+ warnDeprecated("renameField");
2815
+ if (activeClassKey.value) setColumnName(activeClassKey.value, index, name);
2816
+ }
2620
2817
  function loadExperimentData(rawData, options = {}) {
2621
2818
  const parsed = extractSamplesFromDesignData(rawData, options);
2622
2819
  if (!parsed) return false;
@@ -2633,6 +2830,7 @@ function useAutoGroup() {
2633
2830
  schemas.value = {};
2634
2831
  activeClassKey.value = "";
2635
2832
  tokenized.value = [];
2833
+ outliers.value = [];
2636
2834
  sampleTypeHints.value = [];
2637
2835
  }
2638
2836
  return {
@@ -2644,6 +2842,8 @@ function useAutoGroup() {
2644
2842
  schemas,
2645
2843
  activeClassKey,
2646
2844
  delimiter,
2845
+ dominantFieldCount,
2846
+ minFieldCount,
2647
2847
  samples,
2648
2848
  tokenized,
2649
2849
  activeSchema,
@@ -2654,6 +2854,14 @@ function useAutoGroup() {
2654
2854
  excludedSamples,
2655
2855
  result,
2656
2856
  fingerprint,
2857
+ fields,
2858
+ fieldNames,
2859
+ enabledFields,
2860
+ effectiveColumns,
2861
+ hasOutliers,
2862
+ outliers,
2863
+ conformingSamples,
2864
+ allSingletons,
2657
2865
  canDownloadTemplate,
2658
2866
  setClassDisposition,
2659
2867
  setClassDispositions,
@@ -2669,8 +2877,13 @@ function useAutoGroup() {
2669
2877
  loadFingerprint,
2670
2878
  parseInput,
2671
2879
  downloadTemplate,
2880
+ composeTemplateForTest,
2672
2881
  loadExperimentData,
2673
- reset
2882
+ reset,
2883
+ setOutlierAction,
2884
+ setAllOutlierActions,
2885
+ toggleField,
2886
+ renameField
2674
2887
  };
2675
2888
  }
2676
2889
  function extractSamplesFromDesignData(rawData, options = {}) {
@@ -4147,6 +4360,328 @@ function mergeInitialValues(controlOptions, initialValues) {
4147
4360
  };
4148
4361
  }
4149
4362
  //#endregion
4363
+ //#region src/composables/useRackEditor.ts
4364
+ var SLOT_CYCLE = [
4365
+ "R",
4366
+ "G",
4367
+ "B",
4368
+ "Y"
4369
+ ];
4370
+ var PLATE_CONFIGS = {
4371
+ 6: {
4372
+ rows: 2,
4373
+ cols: 3
4374
+ },
4375
+ 12: {
4376
+ rows: 3,
4377
+ cols: 4
4378
+ },
4379
+ 24: {
4380
+ rows: 4,
4381
+ cols: 6
4382
+ },
4383
+ 48: {
4384
+ rows: 6,
4385
+ cols: 8
4386
+ },
4387
+ 54: {
4388
+ rows: 6,
4389
+ cols: 9
4390
+ },
4391
+ 96: {
4392
+ rows: 8,
4393
+ cols: 12
4394
+ },
4395
+ 384: {
4396
+ rows: 16,
4397
+ cols: 24
4398
+ }
4399
+ };
4400
+ var globalIdCounter = 0;
4401
+ function generateId() {
4402
+ globalIdCounter++;
4403
+ return `rack-${Date.now()}-${globalIdCounter}`;
4404
+ }
4405
+ /** Manages a set of sample racks with well-level assignment, series fill, and multi-rack reordering. */
4406
+ function useRackEditor(initialRacks, options) {
4407
+ const defaultFormat = options?.defaultFormat ?? 54;
4408
+ const defaultInjVol = options?.defaultInjectionVolume ?? 5;
4409
+ const maxRacks = options?.maxRacks ?? 10;
4410
+ const minRacks = options?.minRacks ?? 1;
4411
+ function createDefaultRack(name, slotIndex) {
4412
+ const slot = SLOT_CYCLE[(slotIndex ?? 0) % SLOT_CYCLE.length];
4413
+ return {
4414
+ id: generateId(),
4415
+ name: name ?? `Rack ${racks.value.length + 1}`,
4416
+ format: defaultFormat,
4417
+ slot,
4418
+ injectionVolume: defaultInjVol,
4419
+ wells: {}
4420
+ };
4421
+ }
4422
+ const racks = ref(initialRacks && initialRacks.length > 0 ? initialRacks.map((r) => ({ ...r })) : [createDefaultRack("Rack 1", 0)]);
4423
+ const activeRackId = ref(racks.value[0]?.id ?? "");
4424
+ const activeRack = computed(() => racks.value.find((r) => r.id === activeRackId.value) ?? racks.value[0]);
4425
+ function addRack(name) {
4426
+ if (racks.value.length >= maxRacks) return racks.value[racks.value.length - 1];
4427
+ const rack = createDefaultRack(name, racks.value.length);
4428
+ racks.value.push(rack);
4429
+ activeRackId.value = rack.id;
4430
+ return rack;
4431
+ }
4432
+ function removeRack(rackId) {
4433
+ if (racks.value.length <= minRacks) return;
4434
+ const index = racks.value.findIndex((r) => r.id === rackId);
4435
+ if (index === -1) return;
4436
+ racks.value.splice(index, 1);
4437
+ if (activeRackId.value === rackId && racks.value[0]) activeRackId.value = racks.value[0].id;
4438
+ }
4439
+ function reorderRacks(fromIndex, toIndex) {
4440
+ if (fromIndex < 0 || fromIndex >= racks.value.length) return;
4441
+ if (toIndex < 0 || toIndex >= racks.value.length) return;
4442
+ if (fromIndex === toIndex) return;
4443
+ const [moved] = racks.value.splice(fromIndex, 1);
4444
+ if (moved) racks.value.splice(toIndex, 0, moved);
4445
+ }
4446
+ function updateRack(rackId, data) {
4447
+ const rack = racks.value.find((r) => r.id === rackId);
4448
+ if (!rack) return;
4449
+ if (data.name !== void 0) rack.name = data.name;
4450
+ if (data.format !== void 0) rack.format = data.format;
4451
+ if (data.slot !== void 0) rack.slot = data.slot;
4452
+ if (data.injectionVolume !== void 0) rack.injectionVolume = data.injectionVolume;
4453
+ if (data.wells !== void 0) rack.wells = data.wells;
4454
+ }
4455
+ function setActiveRack(rackId) {
4456
+ if (racks.value.some((r) => r.id === rackId)) activeRackId.value = rackId;
4457
+ }
4458
+ function setWellData(rackId, wellId, data) {
4459
+ const rack = racks.value.find((r) => r.id === rackId);
4460
+ if (!rack) return;
4461
+ rack.wells[wellId] = {
4462
+ ...rack.wells[wellId],
4463
+ ...data
4464
+ };
4465
+ }
4466
+ function clearWell(rackId, wellId) {
4467
+ const rack = racks.value.find((r) => r.id === rackId);
4468
+ if (!rack) return;
4469
+ delete rack.wells[wellId];
4470
+ }
4471
+ function clearAllWells(rackId) {
4472
+ const rack = racks.value.find((r) => r.id === rackId);
4473
+ if (!rack) return;
4474
+ rack.wells = {};
4475
+ }
4476
+ function fillSeries(rackId, prefix = "S") {
4477
+ const rack = racks.value.find((r) => r.id === rackId);
4478
+ if (!rack) return;
4479
+ const config = PLATE_CONFIGS[rack.format];
4480
+ if (!config) return;
4481
+ let counter = 1;
4482
+ for (let row = 0; row < config.rows; row++) for (let col = 0; col < config.cols; col++) {
4483
+ const wellId = `${String.fromCharCode(65 + row)}${col + 1}`;
4484
+ if (!rack.wells[wellId]?.sampleType) {
4485
+ const paddedNum = String(counter).padStart(3, "0");
4486
+ rack.wells[wellId] = {
4487
+ id: wellId,
4488
+ row,
4489
+ col,
4490
+ state: "filled",
4491
+ sampleType: "sample",
4492
+ metadata: {
4493
+ label: `${prefix}${paddedNum}`,
4494
+ injectionVolume: rack.injectionVolume,
4495
+ injectionCount: 1
4496
+ }
4497
+ };
4498
+ }
4499
+ counter++;
4500
+ }
4501
+ }
4502
+ function getAllWells() {
4503
+ const result = [];
4504
+ for (const rack of racks.value) for (const [wellId, well] of Object.entries(rack.wells)) result.push({
4505
+ rackId: rack.id,
4506
+ wellId,
4507
+ well
4508
+ });
4509
+ return result;
4510
+ }
4511
+ const totalSampleCount = computed(() => {
4512
+ let count = 0;
4513
+ for (const rack of racks.value) count += Object.keys(rack.wells).length;
4514
+ return count;
4515
+ });
4516
+ function reset() {
4517
+ const rack = createDefaultRack("Rack 1", 0);
4518
+ racks.value = [rack];
4519
+ activeRackId.value = rack.id;
4520
+ }
4521
+ return {
4522
+ racks,
4523
+ activeRack,
4524
+ activeRackId,
4525
+ addRack,
4526
+ removeRack,
4527
+ reorderRacks,
4528
+ updateRack,
4529
+ setActiveRack,
4530
+ setWellData,
4531
+ clearWell,
4532
+ clearAllWells,
4533
+ fillSeries,
4534
+ getAllWells,
4535
+ totalSampleCount,
4536
+ reset
4537
+ };
4538
+ }
4539
+ //#endregion
4540
+ //#region src/composables/useGroupAssignment.ts
4541
+ /** Shared two-zone group assignment model for control/treatment style workflows. */
4542
+ function useGroupAssignment(options) {
4543
+ const groups = computed(() => [...toValue(options.groups)]);
4544
+ const group1 = computed(() => [...toValue(options.group1)]);
4545
+ const group2 = computed(() => [...toValue(options.group2)]);
4546
+ const label1 = computed(() => toValue(options.label1) || "Control");
4547
+ const label2 = computed(() => toValue(options.label2) || "Treatment");
4548
+ const minPerGroup = computed(() => normalizeMinimum(toValue(options.minPerGroup)));
4549
+ const group1Set = computed(() => new Set(group1.value));
4550
+ const group2Set = computed(() => new Set(group2.value));
4551
+ const unassignedGroups = computed(() => groups.value.filter((group) => !group1Set.value.has(group.name) && !group2Set.value.has(group.name)));
4552
+ const zone1Groups = computed(() => groups.value.filter((group) => group1Set.value.has(group.name)));
4553
+ const zone2Groups = computed(() => groups.value.filter((group) => group2Set.value.has(group.name)));
4554
+ const zone1Count = computed(() => zone1Groups.value.reduce((sum, group) => sum + group.count, 0));
4555
+ const zone2Count = computed(() => zone2Groups.value.reduce((sum, group) => sum + group.count, 0));
4556
+ const isValid = computed(() => group1.value.length >= minPerGroup.value && group2.value.length >= minPerGroup.value);
4557
+ const validationMessage = computed(() => {
4558
+ if (isValid.value) return null;
4559
+ const missing1 = Math.max(0, minPerGroup.value - group1.value.length);
4560
+ const missing2 = Math.max(0, minPerGroup.value - group2.value.length);
4561
+ const parts = [];
4562
+ if (missing1 > 0) parts.push(`${missing1} more to ${label1.value}`);
4563
+ if (missing2 > 0) parts.push(`${missing2} more to ${label2.value}`);
4564
+ return `Add ${parts.join(" and ")}`;
4565
+ });
4566
+ function getZoneForGroup(groupName) {
4567
+ if (group1Set.value.has(groupName)) return "zone1";
4568
+ if (group2Set.value.has(groupName)) return "zone2";
4569
+ return null;
4570
+ }
4571
+ function assignToZone(groupName, zone) {
4572
+ const next = removeFromBoth(groupName);
4573
+ if (zone === "zone1") return {
4574
+ group1: [...next.group1, groupName],
4575
+ group2: next.group2
4576
+ };
4577
+ return {
4578
+ group1: next.group1,
4579
+ group2: [...next.group2, groupName]
4580
+ };
4581
+ }
4582
+ function removeFromZone(groupName, zone) {
4583
+ if (zone === "zone1") return {
4584
+ group1: group1.value.filter((name) => name !== groupName),
4585
+ group2: group2.value
4586
+ };
4587
+ return {
4588
+ group1: group1.value,
4589
+ group2: group2.value.filter((name) => name !== groupName)
4590
+ };
4591
+ }
4592
+ function clearAll() {
4593
+ return {
4594
+ group1: [],
4595
+ group2: []
4596
+ };
4597
+ }
4598
+ function removeFromBoth(groupName) {
4599
+ return {
4600
+ group1: group1.value.filter((name) => name !== groupName),
4601
+ group2: group2.value.filter((name) => name !== groupName)
4602
+ };
4603
+ }
4604
+ return {
4605
+ unassignedGroups,
4606
+ zone1Groups,
4607
+ zone2Groups,
4608
+ zone1Count,
4609
+ zone2Count,
4610
+ isValid,
4611
+ validationMessage,
4612
+ getZoneForGroup,
4613
+ assignToZone,
4614
+ removeFromZone,
4615
+ clearAll
4616
+ };
4617
+ }
4618
+ function normalizeMinimum(value) {
4619
+ if (value === null || value === void 0 || !Number.isFinite(value)) return 1;
4620
+ return Math.max(0, Math.floor(value));
4621
+ }
4622
+ //#endregion
4623
+ //#region src/composables/useReagentSeries.ts
4624
+ var DEFAULT_PRESETS = [
4625
+ {
4626
+ label: "2x",
4627
+ factor: 2
4628
+ },
4629
+ {
4630
+ label: "3x",
4631
+ factor: 3
4632
+ },
4633
+ {
4634
+ label: "½ log",
4635
+ factor: "half-log"
4636
+ },
4637
+ {
4638
+ label: "10x",
4639
+ factor: 10
4640
+ }
4641
+ ];
4642
+ var DEFAULT_UNITS = [
4643
+ "µM",
4644
+ "nM",
4645
+ "mM",
4646
+ "pM"
4647
+ ];
4648
+ function resolveFactor(factor) {
4649
+ return factor === "half-log" ? Math.sqrt(10) : factor;
4650
+ }
4651
+ function roundToSignificant(value, digits = 4) {
4652
+ if (value === 0) return 0;
4653
+ const magnitude = Math.floor(Math.log10(Math.abs(value))) + 1;
4654
+ const factor = Math.pow(10, digits - magnitude);
4655
+ return Math.round(value * factor) / factor;
4656
+ }
4657
+ function generateDilutionSeries(startConcentration, count, factor, defaultReplicates = 1) {
4658
+ if (count < 1 || startConcentration <= 0) return [];
4659
+ const divisor = resolveFactor(factor);
4660
+ const levels = [];
4661
+ for (let i = 0; i < count; i++) levels.push({
4662
+ value: roundToSignificant(startConcentration / Math.pow(divisor, i)),
4663
+ replicates: defaultReplicates
4664
+ });
4665
+ return levels;
4666
+ }
4667
+ /** Generates and sorts geometric dilution series (2x, 3x, ½ log, 10x) for plate-based experiments. */
4668
+ function useReagentSeries() {
4669
+ function generateSeries(start, count, factor, defaultReplicates = 1) {
4670
+ return generateDilutionSeries(start, count, factor, defaultReplicates);
4671
+ }
4672
+ function sortLevels(levels, order = "desc") {
4673
+ return [...levels].sort((a, b) => order === "desc" ? b.value - a.value : a.value - b.value);
4674
+ }
4675
+ function totalPositions(levels) {
4676
+ return levels.reduce((sum, l) => sum + l.replicates, 0);
4677
+ }
4678
+ return {
4679
+ generateSeries,
4680
+ sortLevels,
4681
+ totalPositions
4682
+ };
4683
+ }
4684
+ //#endregion
4150
4685
  //#region src/composables/protocolTemplateCatalog.ts
4151
4686
  var BUILT_IN_PROTOCOL_TEMPLATES = [
4152
4687
  {
@@ -4609,4 +5144,6 @@ function useProtocolTemplates() {
4609
5144
  };
4610
5145
  }
4611
5146
  //#endregion
4612
- export { useSortedItems as $, extractSampleOptionsFromDesignData as A, useMobileSupportGate as B, readFileAsText as C, useAutoGroup as D, extractSamplesFromDesignData as E, usePluginJobCenter as F, getPresenceClientId as G, useAppExperiment as H, isActiveJobStatus as I, useToast as J, usePresenceHeartbeat as K, jobStatusLabel as L, DEFAULT_COLORS as M, useWellPlateEditor as N, parseCSV as O, useDoseCalculator as P, compareSortValues as Q, normalizeJobPercent as R, parseDelimitedText as S, validateImportFile as T, getInjectedFrontendRevision as U, APP_EXPERIMENT_KEY as V, useRuntimeAlignment as W, normalizeSearchQuery as X, candidateMatchesSearch as Y, useTextSearch as Z, getSampleGroupParentPath as _, getBioTemplateComponentProps as a, hslToHex as b, useBioTemplateControls as c, useScheduleDrag as d, useExperimentSamples as f, getSampleGroupMajorPrefix as g, useSampleGroups as h, useBioTemplateWorkspace as i, unwrapExperimentDesignData as j, extractSampleNamesFromDesignData as k, useTemplateCollection as l, useExpansionSet as m, useBioTemplatePresetWorkspace as n, toBioTemplateComponentPropsByComponent as o, useExperimentData as p, useTheme as q, useBioTemplatePackWorkspace as r, useBioTemplateComponents as s, useProtocolTemplates as t, useExperimentSave as u, deriveShade as v, useFileImport as w, detectDelimiter as x, hexToHsl as y, DEFAULT_MOBILE_VIEWPORT_QUERY as z };
5147
+ export { useToast as $, useFileImport as A, useDoseCalculator as B, getSampleGroupParentPath as C, detectDelimiter as D, hslToHex as E, extractSampleNamesFromDesignData as F, useMobileSupportGate as G, useJobsStatusTray as H, extractSampleOptionsFromDesignData as I, getInjectedFrontendRevision as J, APP_EXPERIMENT_KEY as K, unwrapExperimentDesignData as L, extractSamplesFromDesignData as M, useAutoGroup as N, parseDelimitedText as O, parseCSV as P, useTheme as Q, DEFAULT_COLORS as R, getSampleGroupMajorPrefix as S, hexToHsl as T, usePluginJobCenter as U, combinePluginJobSources as V, DEFAULT_MOBILE_VIEWPORT_QUERY as W, getPresenceClientId as X, useRuntimeAlignment as Y, usePresenceHeartbeat as Z, useScheduleDrag as _, useReagentSeries as a, useExpansionSet as b, useBioTemplatePresetWorkspace as c, getBioTemplateComponentProps as d, candidateMatchesSearch as et, toBioTemplateComponentPropsByComponent as f, useExperimentSave as g, useTemplateCollection as h, generateDilutionSeries as i, useSortedItems as it, validateImportFile as j, readFileAsText as k, useBioTemplatePackWorkspace as l, useBioTemplateControls as m, DEFAULT_PRESETS as n, useTextSearch as nt, useGroupAssignment as o, useBioTemplateComponents as p, useAppExperiment as q, DEFAULT_UNITS as r, compareSortValues as rt, useRackEditor as s, useProtocolTemplates as t, normalizeSearchQuery as tt, useBioTemplateWorkspace as u, useExperimentSamples as v, deriveShade as w, useSampleGroups as x, useExperimentData as y, useWellPlateEditor as z };
5148
+
5149
+ //# sourceMappingURL=useProtocolTemplates-BWhQIWV5.js.map