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

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 (1063) hide show
  1. package/README.md +8 -2
  2. package/dist/{EmptyState-p90quq8Z.js → EmptyState-NBqf2_8z.js} +3 -1
  3. package/dist/EmptyState-NBqf2_8z.js.map +1 -0
  4. package/dist/{ExperimentPopover-Bn6PIGHE.js → ExperimentPopover-CfOdh5Rm.js} +11 -6
  5. package/dist/ExperimentPopover-CfOdh5Rm.js.map +1 -0
  6. package/dist/{ExperimentSelectorModal-DGhrJSSV.js → ExperimentSelectorModal-DvIagrxY.js} +13 -8
  7. package/dist/ExperimentSelectorModal-DvIagrxY.js.map +1 -0
  8. package/dist/{SettingsModal-wF2btHu6.js → SettingsModal-W3TYfnP9.js} +13 -11
  9. package/dist/SettingsModal-W3TYfnP9.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.internal.test.d.ts +1 -0
  69. package/dist/__tests__/components/PluginWorkspaceView.navigation.test.d.ts +1 -0
  70. package/dist/__tests__/components/PluginWorkspaceView.shell.test.d.ts +1 -0
  71. package/dist/__tests__/components/PluginWorkspaceView.test.d.ts +1 -0
  72. package/dist/__tests__/components/ProgressBar.test.d.ts +1 -0
  73. package/dist/__tests__/components/ProtocolStep.presentation.test.d.ts +1 -0
  74. package/dist/__tests__/components/ProtocolStepEditor.state.test.d.ts +1 -0
  75. package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
  76. package/dist/__tests__/components/ProtocolStepParameterField.test.d.ts +1 -0
  77. package/dist/__tests__/components/RackEditor.test.d.ts +1 -0
  78. package/dist/__tests__/components/ReagentList.presentation.test.d.ts +1 -0
  79. package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
  80. package/dist/__tests__/components/RetiredStyles.test.d.ts +1 -0
  81. package/dist/__tests__/components/RuntimeUpdateNotice.test.d.ts +1 -0
  82. package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
  83. package/dist/__tests__/components/SampleSelector.colors.test.d.ts +1 -0
  84. package/dist/__tests__/components/SampleSelector.drag.test.d.ts +1 -0
  85. package/dist/__tests__/components/SampleSelector.groups.test.d.ts +1 -0
  86. package/dist/__tests__/components/SampleSelector.selection.test.d.ts +1 -0
  87. package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
  88. package/dist/__tests__/components/SampleSelectorSampleRow.test.d.ts +1 -0
  89. package/dist/__tests__/components/ScheduleCalendar.test.d.ts +1 -0
  90. package/dist/__tests__/components/SecretInput.test.d.ts +1 -0
  91. package/dist/__tests__/components/SectionCard.test.d.ts +1 -0
  92. package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
  93. package/dist/__tests__/components/SequenceProgressBar.test.d.ts +1 -0
  94. package/dist/__tests__/components/SettingsModal.schema.test.d.ts +1 -0
  95. package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
  96. package/dist/__tests__/components/SmartGroupFieldRecipe.groups.test.d.ts +1 -0
  97. package/dist/__tests__/components/SmartGroupManual.cohorts.test.d.ts +1 -0
  98. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  99. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  100. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  101. package/dist/__tests__/components/WellEditPopupInternal.test.d.ts +1 -0
  102. package/dist/__tests__/components/WellPlate.colors.test.d.ts +1 -0
  103. package/dist/__tests__/components/WellPlate.conditions.test.d.ts +1 -0
  104. package/dist/__tests__/components/WellPlate.geometry.test.d.ts +1 -0
  105. package/dist/__tests__/components/WellPlate.interaction.test.d.ts +1 -0
  106. package/dist/__tests__/components/WellPlate.legend.test.d.ts +1 -0
  107. package/dist/__tests__/components/WellPlate.rendering.test.d.ts +1 -0
  108. package/dist/__tests__/components/WellPlate.sampleDrop.test.d.ts +1 -0
  109. package/dist/__tests__/composables/analysisArtifactTarget.test.d.ts +1 -0
  110. package/dist/__tests__/composables/autoGroup/classKey.test.d.ts +1 -0
  111. package/dist/__tests__/composables/autoGroup/classify.test.d.ts +1 -0
  112. package/dist/__tests__/composables/autoGroup/columns.test.d.ts +1 -0
  113. package/dist/__tests__/composables/autoGroup/compose.test.d.ts +1 -0
  114. package/dist/__tests__/composables/autoGroup/cooccurrence.test.d.ts +1 -0
  115. package/dist/__tests__/composables/autoGroup/fingerprint.test.d.ts +1 -0
  116. package/dist/__tests__/composables/autoGroup/groupByOrder.test.d.ts +1 -0
  117. package/dist/__tests__/composables/autoGroup/groupTree.test.d.ts +1 -0
  118. package/dist/__tests__/composables/autoGroup/integration.test.d.ts +1 -0
  119. package/dist/__tests__/composables/autoGroup/template.test.d.ts +1 -0
  120. package/dist/__tests__/composables/autoGroup/tokenLength.test.d.ts +1 -0
  121. package/dist/__tests__/composables/autoGroup/tokenize.test.d.ts +1 -0
  122. package/dist/__tests__/composables/experiment-utils.test.d.ts +1 -0
  123. package/dist/__tests__/composables/formBuilderRegistry.test.d.ts +1 -0
  124. package/dist/__tests__/composables/resolvePluginFrontendBase.test.d.ts +1 -0
  125. package/dist/__tests__/composables/useAnalysisArtifacts.test.d.ts +1 -0
  126. package/dist/__tests__/composables/useApi.test.d.ts +1 -0
  127. package/dist/__tests__/composables/useAppExperiment.test.d.ts +1 -0
  128. package/dist/__tests__/composables/useAuth.test.d.ts +1 -0
  129. package/dist/__tests__/composables/useAutoGroup.test.d.ts +1 -0
  130. package/dist/__tests__/composables/useAutoGroupInputSources.test.d.ts +1 -0
  131. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  132. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  133. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  134. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  135. package/dist/__tests__/composables/useCommandHistory.test.d.ts +1 -0
  136. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  137. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  138. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  139. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  140. package/dist/__tests__/composables/useEventStream.test.d.ts +1 -0
  141. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  142. package/dist/__tests__/composables/useExperimentData.test.d.ts +14 -0
  143. package/dist/__tests__/composables/useExperimentSamples.test.d.ts +1 -0
  144. package/dist/__tests__/composables/useExperimentSave.test.d.ts +1 -0
  145. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  146. package/dist/__tests__/composables/useFileImport.test.d.ts +1 -0
  147. package/dist/__tests__/composables/useForm.test.d.ts +1 -0
  148. package/dist/__tests__/composables/useFormBuilder.test.d.ts +1 -0
  149. package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +1 -0
  150. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  151. package/dist/__tests__/composables/useJobsStatusTray.test.d.ts +1 -0
  152. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  153. package/dist/__tests__/composables/useMobileSupportGate.test.d.ts +1 -0
  154. package/dist/__tests__/composables/useOptimisticMutation.test.d.ts +1 -0
  155. package/dist/__tests__/composables/usePlatformContext.test.d.ts +1 -0
  156. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  157. package/dist/__tests__/composables/usePluginConfig.test.d.ts +15 -0
  158. package/dist/__tests__/composables/usePresenceHeartbeat.test.d.ts +1 -0
  159. package/dist/__tests__/composables/useProtocolTemplates.test.d.ts +1 -0
  160. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  161. package/dist/__tests__/composables/useResourceCrud.test.d.ts +1 -0
  162. package/dist/__tests__/composables/useRuntimeAlignment.test.d.ts +1 -0
  163. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  164. package/dist/__tests__/composables/useSampleGroups.tree.test.d.ts +1 -0
  165. package/dist/__tests__/composables/useScheduleCalendarLayout.test.d.ts +1 -0
  166. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  167. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  168. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  169. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  170. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  171. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  172. package/dist/__tests__/composables/useWellPainting.test.d.ts +1 -0
  173. package/dist/__tests__/composables/useWellPlateAdapter.test.d.ts +1 -0
  174. package/dist/__tests__/composables/useWellPlateValidation.test.d.ts +1 -0
  175. package/dist/__tests__/docs/extractDocsComponents.test.d.ts +1 -0
  176. package/dist/__tests__/docs/extractDocsExports.test.d.ts +1 -0
  177. package/dist/__tests__/docs/extractDocsParsing.test.d.ts +1 -0
  178. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +1 -0
  179. package/dist/__tests__/docs/extractDocsTheme.test.d.ts +1 -0
  180. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  181. package/dist/__tests__/generatedUi.test.d.ts +1 -0
  182. package/dist/__tests__/stores/experiment.test.d.ts +1 -0
  183. package/dist/__tests__/stores/settings.test.d.ts +1 -0
  184. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  185. package/dist/__tests__/types/GeneratedJsonSchema.test.d.ts +1 -0
  186. package/dist/__tests__/utils/color.test.d.ts +1 -0
  187. package/dist/__tests__/utils/instrument.test.d.ts +1 -0
  188. package/dist/__tests__/utils/jobs.test.d.ts +1 -0
  189. package/dist/__tests__/utils/lcms.test.d.ts +1 -0
  190. package/dist/__tests__/utils/permissions.test.d.ts +1 -0
  191. package/dist/__tests__/utils/rack.test.d.ts +1 -0
  192. package/dist/{analysisArtifactTypes-ejqR8MX3.js → analysisArtifactTypes-DQ0MjwHZ.js} +2 -0
  193. package/dist/analysisArtifactTypes-DQ0MjwHZ.js.map +1 -0
  194. package/dist/chunk-BoAXSpZd.js +33 -0
  195. package/dist/components/AppAvatarMenu.vue.d.ts +4 -0
  196. package/dist/components/AppSidebar.vue.d.ts +1 -1
  197. package/dist/components/AuditTrail.vue.d.ts +38 -0
  198. package/dist/components/AutoGroupModal.vue.d.ts +1 -1
  199. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  200. package/dist/components/ColorSlider.vue.d.ts +34 -0
  201. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +149 -0
  202. package/dist/components/DropdownButton.vue.d.ts +2 -0
  203. package/dist/components/FitPanel.vue.d.ts +46 -0
  204. package/dist/components/GroupAssigner.vue.d.ts +25 -0
  205. package/dist/components/JobsStatusTray.vue.d.ts +11 -2
  206. package/dist/components/PluginWorkspaceView.props.d.ts +29 -1
  207. package/dist/components/PluginWorkspaceView.vue.d.ts +5 -5
  208. package/dist/components/RackEditor.vue.d.ts +78 -0
  209. package/dist/components/ReagentEditor.vue.d.ts +30 -0
  210. package/dist/components/ResourceCard.vue.d.ts +50 -0
  211. package/dist/components/SampleLegend.vue.d.ts +1 -1
  212. package/dist/components/SampleSelector.vue.d.ts +1 -1
  213. package/dist/components/ScientificNumber.vue.d.ts +14 -0
  214. package/dist/components/SecretInput.vue.d.ts +28 -0
  215. package/dist/components/SettingsModal.vue.d.ts +1 -1
  216. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -3
  217. package/dist/components/SmartGroupManual.vue.d.ts +2 -2
  218. package/dist/components/WellPlate.vue.d.ts +1 -1
  219. package/dist/components/index.d.ts +18 -0
  220. package/dist/components/index.js +8 -8
  221. package/dist/components/internal/WellEditPopupInternal.vue.d.ts +3 -1
  222. package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +23 -0
  223. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +70 -0
  224. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +43 -0
  225. package/dist/{components-DpyzaeIc.js → components-B80gV0P6.js} +3729 -1800
  226. package/dist/components-B80gV0P6.js.map +1 -0
  227. package/dist/composables/autoGroupConstants.d.ts +1 -0
  228. package/dist/composables/autoGroupGrouping.d.ts +3 -0
  229. package/dist/composables/flattenWorkspaceBindings.d.ts +61 -0
  230. package/dist/composables/index.d.ts +15 -2
  231. package/dist/composables/index.js +11 -11
  232. package/dist/composables/pluginWorkspaceModel.d.ts +164 -0
  233. package/dist/composables/useAnalysisArtifacts.d.ts +2 -0
  234. package/dist/composables/useAsync.d.ts +132 -0
  235. package/dist/composables/useAuth.d.ts +2 -0
  236. package/dist/composables/useAutoGroup.d.ts +30 -1
  237. package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
  238. package/dist/composables/useBioTemplateWorkspace.d.ts +4 -20
  239. package/dist/composables/useCommandHistory.d.ts +33 -0
  240. package/dist/composables/useFocusTrap.d.ts +21 -0
  241. package/dist/composables/useGeneratedAnalysis.d.ts +5 -1
  242. package/dist/composables/useGroupAssignment.d.ts +31 -0
  243. package/dist/composables/useJobsStatusTray.d.ts +41 -4
  244. package/dist/composables/useMenuKeyboard.d.ts +29 -0
  245. package/dist/composables/useOptimisticMutation.d.ts +5 -1
  246. package/dist/composables/usePluginClient.d.ts +4 -0
  247. package/dist/composables/usePluginConfig.d.ts +25 -0
  248. package/dist/composables/usePluginWorkspace.d.ts +51 -0
  249. package/dist/composables/useRackEditor.d.ts +31 -0
  250. package/dist/composables/useResourceCrud.d.ts +44 -0
  251. package/dist/composables/useRovingFocus.d.ts +24 -0
  252. package/dist/composables/useWellPainting.d.ts +39 -0
  253. package/dist/composables/useWellPlateAdapter.d.ts +40 -0
  254. package/dist/composables/useWellPlateValidation.d.ts +5 -1
  255. package/dist/composables/workspaceRecipes.d.ts +188 -0
  256. package/dist/{composables-yz8bTkEV.js → composables-C8mmD5ta.js} +821 -68
  257. package/dist/composables-C8mmD5ta.js.map +1 -0
  258. package/dist/{experiment-D08H_TIH.js → experiment-Y9Iz7KYi.js} +3 -1
  259. package/dist/experiment-Y9Iz7KYi.js.map +1 -0
  260. package/dist/{experiment-utils-CLnzPPq5.js → experiment-utils-DV3DrvE_.js} +71 -50
  261. package/dist/experiment-utils-DV3DrvE_.js.map +1 -0
  262. package/dist/histoire.setup.d.ts +1 -0
  263. package/dist/index.d.ts +1 -0
  264. package/dist/index.js +20 -35
  265. package/dist/index.js.map +1 -0
  266. package/dist/install.js +28 -0
  267. package/dist/install.js.map +1 -0
  268. package/dist/jobs.d.ts +15 -1
  269. package/dist/permissions.d.ts +5 -0
  270. package/dist/permissions.js +4 -2
  271. package/dist/permissions.js.map +1 -0
  272. package/dist/plotly.min-c2Sez60c.js +180634 -0
  273. package/dist/plotly.min-c2Sez60c.js.map +1 -0
  274. package/dist/stores/auth.d.ts +6 -0
  275. package/dist/stores/index.js +2 -2
  276. package/dist/styles.css +2917 -300
  277. package/dist/tailwind.preset.js +2 -0
  278. package/dist/tailwind.preset.js.map +1 -0
  279. package/dist/templates/builderReadUtils.d.ts +1 -1
  280. package/dist/templates/catalog.d.ts +4 -4
  281. package/dist/templates/index.js +4 -4
  282. package/dist/templates/presets.d.ts +2 -2
  283. package/dist/{templates-Pbxjdqlh.js → templates-CK72aKO1.js} +34 -26
  284. package/dist/templates-CK72aKO1.js.map +1 -0
  285. package/dist/types/auth.d.ts +1 -0
  286. package/dist/types/auto-group.d.ts +7 -0
  287. package/dist/types/componentWorkflowTypes.d.ts +22 -0
  288. package/dist/types/components.d.ts +1 -1
  289. package/dist/types/form-builder.d.ts +1 -1
  290. package/dist/types/generated-ui.d.ts +11 -2
  291. package/dist/types/index.d.ts +4 -4
  292. package/dist/types/index.js +1 -1
  293. package/dist/types/jobs.d.ts +11 -3
  294. package/dist/{useApi-yE0re8k-.js → useApi-CDBq6z23.js} +15 -0
  295. package/dist/useApi-CDBq6z23.js.map +1 -0
  296. package/dist/{useControlSchema-Ds4VeFxt.js → useControlSchema-_OVhavKq.js} +381 -69
  297. package/dist/useControlSchema-_OVhavKq.js.map +1 -0
  298. package/dist/{useDropdownState-WIGW6Rr-.js → useDropdownState-D5G4UvWd.js} +3 -1
  299. package/dist/useDropdownState-D5G4UvWd.js.map +1 -0
  300. package/dist/{useExperimentSelector-DXqsZuSk.js → useExperimentSelector-DSEckf_g.js} +5 -3
  301. package/dist/useExperimentSelector-DSEckf_g.js.map +1 -0
  302. package/dist/{useFormBuilder-1so6QSQL.js → useFormBuilder-Bd714C7y.js} +3 -1
  303. package/dist/useFormBuilder-Bd714C7y.js.map +1 -0
  304. package/dist/{useProtocolTemplates-Cv0ca1AM.js → useProtocolTemplates-Dq5Pzwyd.js} +1055 -83
  305. package/dist/useProtocolTemplates-Dq5Pzwyd.js.map +1 -0
  306. package/dist/utils/pluginSecrets.d.ts +53 -0
  307. package/dist/utils/records.d.ts +4 -0
  308. package/package.json +8 -2
  309. package/src/__stories__/experiment-helpers.ts +86 -0
  310. package/src/__tests__/components/ActionItem.test.ts +99 -0
  311. package/src/__tests__/components/ActionMenu.test.ts +120 -0
  312. package/src/__tests__/components/AppAvatarMenu.test.ts +161 -0
  313. package/src/__tests__/components/AppLayout.test.ts +207 -0
  314. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  315. package/src/__tests__/components/AppSidebar.test.ts +857 -0
  316. package/src/__tests__/components/AppToastContainer.test.ts +37 -0
  317. package/src/__tests__/components/AppTopBar.navigation.test.ts +68 -0
  318. package/src/__tests__/components/AppTopBar.test.ts +1256 -0
  319. package/src/__tests__/components/AppTopBarPageSelector.test.ts +156 -0
  320. package/src/__tests__/components/AppTopBarPillNav.test.ts +125 -0
  321. package/src/__tests__/components/AppTopBarPresence.test.ts +47 -0
  322. package/src/__tests__/components/ArtifactSaveDialog.test.ts +566 -0
  323. package/src/__tests__/components/ArtifactSelectorModal.test.ts +178 -0
  324. package/src/__tests__/components/AutoGroupModal.adapter.test.ts +204 -0
  325. package/src/__tests__/components/BaseInput.test.ts +99 -0
  326. package/src/__tests__/components/BaseModal.test.ts +133 -0
  327. package/src/__tests__/components/BasePill.test.ts +291 -0
  328. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  329. package/src/__tests__/components/BaseSelect.test.ts +73 -0
  330. package/src/__tests__/components/BaseTabs.test.ts +107 -0
  331. package/src/__tests__/components/BaseToggle.test.ts +40 -0
  332. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  333. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +159 -0
  334. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +192 -0
  335. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +328 -0
  336. package/src/__tests__/components/BioTemplateRenderer.test.ts +96 -0
  337. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  338. package/src/__tests__/components/Calendar.test.ts +566 -0
  339. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  340. package/src/__tests__/components/CollapsibleCard.test.ts +571 -0
  341. package/src/__tests__/components/ComponentBindingRenderer.test.ts +278 -0
  342. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  343. package/src/__tests__/components/ControlWorkspaceView.test.ts +1102 -0
  344. package/src/__tests__/components/DataFrame.test.ts +915 -0
  345. package/src/__tests__/components/DatePicker.test.ts +45 -0
  346. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  347. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
  348. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +185 -0
  349. package/src/__tests__/components/DropdownButton.test.ts +628 -0
  350. package/src/__tests__/components/EmptyState.test.ts +23 -0
  351. package/src/__tests__/components/ExperimentPopover.test.ts +143 -0
  352. package/src/__tests__/components/ExperimentSelectorModal.test.ts +143 -0
  353. package/src/__tests__/components/FormBuilder.test.ts +353 -0
  354. package/src/__tests__/components/GeneratedPathInput.test.ts +132 -0
  355. package/src/__tests__/components/GeneratedPlotlyResult.test.ts +117 -0
  356. package/src/__tests__/components/GeneratedPluginView.test.ts +235 -0
  357. package/src/__tests__/components/GeneratedResultRenderer.test.ts +93 -0
  358. package/src/__tests__/components/GroupAssigner.test.ts +48 -0
  359. package/src/__tests__/components/InstrumentAlertLog.test.ts +59 -0
  360. package/src/__tests__/components/JobsStatusTray.test.ts +165 -0
  361. package/src/__tests__/components/LcmsSequenceTable.test.ts +57 -0
  362. package/src/__tests__/components/MobileSupportGate.test.ts +120 -0
  363. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  364. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
  365. package/src/__tests__/components/PluginIcon.test.ts +215 -0
  366. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
  367. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +230 -0
  368. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
  369. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +43 -0
  370. package/src/__tests__/components/PluginWorkspaceView.test.ts +719 -0
  371. package/src/__tests__/components/ProgressBar.test.ts +18 -0
  372. package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
  373. package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
  374. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  375. package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
  376. package/src/__tests__/components/RackEditor.test.ts +125 -0
  377. package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
  378. package/src/__tests__/components/ReagentList.test.ts +82 -0
  379. package/src/__tests__/components/RetiredStyles.test.ts +82 -0
  380. package/src/__tests__/components/RuntimeUpdateNotice.test.ts +14 -0
  381. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  382. package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
  383. package/src/__tests__/components/SampleSelector.drag.test.ts +126 -0
  384. package/src/__tests__/components/SampleSelector.groups.test.ts +94 -0
  385. package/src/__tests__/components/SampleSelector.selection.test.ts +56 -0
  386. package/src/__tests__/components/SampleSelector.test.ts +466 -0
  387. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +40 -0
  388. package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
  389. package/src/__tests__/components/SecretInput.test.ts +87 -0
  390. package/src/__tests__/components/SectionCard.test.ts +181 -0
  391. package/src/__tests__/components/SegmentedControl.test.ts +69 -0
  392. package/src/__tests__/components/SequenceProgressBar.test.ts +39 -0
  393. package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
  394. package/src/__tests__/components/SettingsModal.test.ts +407 -0
  395. package/src/__tests__/components/SmartGroupFieldRecipe.groups.test.ts +101 -0
  396. package/src/__tests__/components/SmartGroupManual.cohorts.test.ts +97 -0
  397. package/src/__tests__/components/TagsInput.test.ts +75 -0
  398. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  399. package/src/__tests__/components/TimePicker.test.ts +38 -0
  400. package/src/__tests__/components/WellEditPopupInternal.test.ts +108 -0
  401. package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
  402. package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
  403. package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
  404. package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
  405. package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
  406. package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
  407. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
  408. package/src/__tests__/composables/analysisArtifactTarget.test.ts +77 -0
  409. package/src/__tests__/composables/autoGroup/classKey.test.ts +25 -0
  410. package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
  411. package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
  412. package/src/__tests__/composables/autoGroup/compose.test.ts +226 -0
  413. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
  414. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +122 -0
  415. package/src/__tests__/composables/autoGroup/groupByOrder.test.ts +278 -0
  416. package/src/__tests__/composables/autoGroup/groupTree.test.ts +99 -0
  417. package/src/__tests__/composables/autoGroup/integration.test.ts +75 -0
  418. package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
  419. package/src/__tests__/composables/autoGroup/tokenLength.test.ts +85 -0
  420. package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
  421. package/src/__tests__/composables/experiment-utils.test.ts +63 -0
  422. package/src/__tests__/composables/formBuilderRegistry.test.ts +191 -0
  423. package/src/__tests__/composables/resolvePluginFrontendBase.test.ts +65 -0
  424. package/src/__tests__/composables/useAnalysisArtifacts.test.ts +740 -0
  425. package/src/__tests__/composables/useApi.test.ts +157 -0
  426. package/src/__tests__/composables/useAppExperiment.test.ts +899 -0
  427. package/src/__tests__/composables/useAuth.test.ts +233 -0
  428. package/src/__tests__/composables/useAutoGroup.test.ts +524 -0
  429. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +127 -0
  430. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +125 -0
  431. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  432. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +104 -0
  433. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  434. package/src/__tests__/composables/useCommandHistory.test.ts +43 -0
  435. package/src/__tests__/composables/useControlSchema.test.ts +1060 -0
  436. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  437. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  438. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  439. package/src/__tests__/composables/useEventStream.test.ts +140 -0
  440. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  441. package/src/__tests__/composables/useExperimentData.test.ts +154 -0
  442. package/src/__tests__/composables/useExperimentSamples.test.ts +91 -0
  443. package/src/__tests__/composables/useExperimentSave.test.ts +542 -0
  444. package/src/__tests__/composables/useExperimentSelector.test.ts +338 -0
  445. package/src/__tests__/composables/useFileImport.test.ts +44 -0
  446. package/src/__tests__/composables/useForm.test.ts +263 -0
  447. package/src/__tests__/composables/useFormBuilder.test.ts +994 -0
  448. package/src/__tests__/composables/useGeneratedAnalysis.test.ts +1903 -0
  449. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  450. package/src/__tests__/composables/useJobsStatusTray.test.ts +283 -0
  451. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  452. package/src/__tests__/composables/useMobileSupportGate.test.ts +74 -0
  453. package/src/__tests__/composables/useOptimisticMutation.test.ts +40 -0
  454. package/src/__tests__/composables/usePlatformContext.test.ts +148 -0
  455. package/src/__tests__/composables/usePluginClient.test.ts +1912 -0
  456. package/src/__tests__/composables/usePluginConfig.test.ts +497 -0
  457. package/src/__tests__/composables/usePresenceHeartbeat.test.ts +164 -0
  458. package/src/__tests__/composables/useProtocolTemplates.test.ts +64 -0
  459. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  460. package/src/__tests__/composables/useResourceCrud.test.ts +56 -0
  461. package/src/__tests__/composables/useRuntimeAlignment.test.ts +145 -0
  462. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  463. package/src/__tests__/composables/useSampleGroups.tree.test.ts +145 -0
  464. package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
  465. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  466. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  467. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  468. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  469. package/src/__tests__/composables/useTheme.test.ts +91 -0
  470. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  471. package/src/__tests__/composables/useWellPainting.test.ts +52 -0
  472. package/src/__tests__/composables/useWellPlateAdapter.test.ts +50 -0
  473. package/src/__tests__/composables/useWellPlateValidation.test.ts +42 -0
  474. package/src/__tests__/docs/extractDocsComponents.test.ts +156 -0
  475. package/src/__tests__/docs/extractDocsExports.test.ts +92 -0
  476. package/src/__tests__/docs/extractDocsParsing.test.ts +91 -0
  477. package/src/__tests__/docs/extractDocsTemplates.test.ts +53 -0
  478. package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
  479. package/src/__tests__/docs/frontendDocsCatalog.test.ts +436 -0
  480. package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
  481. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  482. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  483. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  484. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  485. package/src/__tests__/generatedUi.test.ts +119 -0
  486. package/src/__tests__/stores/experiment.test.ts +300 -0
  487. package/src/__tests__/stores/settings.test.ts +78 -0
  488. package/src/__tests__/templates/templates.test.ts +1185 -0
  489. package/src/__tests__/types/GeneratedJsonSchema.test.ts +62 -0
  490. package/src/__tests__/utils/color.test.ts +96 -0
  491. package/src/__tests__/utils/instrument.test.ts +47 -0
  492. package/src/__tests__/utils/jobs.test.ts +95 -0
  493. package/src/__tests__/utils/lcms.test.ts +73 -0
  494. package/src/__tests__/utils/permissions.test.ts +62 -0
  495. package/src/__tests__/utils/rack.test.ts +120 -0
  496. package/src/components/ActionMenu.story.vue +26 -0
  497. package/src/components/ActionMenu.vue +209 -0
  498. package/src/components/AlertBox.story.vue +204 -0
  499. package/src/components/AlertBox.vue +88 -0
  500. package/src/components/AppAvatarMenu.story.vue +155 -0
  501. package/src/components/AppAvatarMenu.vue +164 -0
  502. package/src/components/AppContainer.story.vue +104 -0
  503. package/src/components/AppContainer.vue +34 -0
  504. package/src/components/AppLayout.story.vue +331 -0
  505. package/src/components/AppLayout.vue +156 -0
  506. package/src/components/AppPluginSwitcher.vue +137 -0
  507. package/src/components/AppSidebar.story.vue +584 -0
  508. package/src/components/AppSidebar.vue +471 -0
  509. package/src/components/AppToastContainer.story.vue +157 -0
  510. package/src/components/AppToastContainer.vue +62 -0
  511. package/src/components/AppTopBar.navigation.ts +60 -0
  512. package/src/components/AppTopBar.story.vue +280 -0
  513. package/src/components/AppTopBar.vue +474 -0
  514. package/src/components/ArtifactSaveDialog.story.vue +319 -0
  515. package/src/components/ArtifactSaveDialog.vue +434 -0
  516. package/src/components/ArtifactSelectorModal.story.vue +295 -0
  517. package/src/components/ArtifactSelectorModal.vue +333 -0
  518. package/src/components/AuditTrail.story.vue +163 -0
  519. package/src/components/AuditTrail.vue +151 -0
  520. package/src/components/AutoGroupModal.adapter.ts +203 -0
  521. package/src/components/AutoGroupModal.story.vue +458 -0
  522. package/src/components/AutoGroupModal.vue +294 -0
  523. package/src/components/Avatar.story.vue +115 -0
  524. package/src/components/Avatar.vue +79 -0
  525. package/src/components/BaseButton.story.vue +96 -0
  526. package/src/components/BaseButton.vue +75 -0
  527. package/src/components/BaseCheckbox.story.vue +100 -0
  528. package/src/components/BaseCheckbox.vue +131 -0
  529. package/src/components/BaseInput.story.vue +98 -0
  530. package/src/components/BaseInput.vue +76 -0
  531. package/src/components/BaseModal.story.vue +335 -0
  532. package/src/components/BaseModal.vue +280 -0
  533. package/src/components/BasePill.story.vue +142 -0
  534. package/src/components/BasePill.vue +89 -0
  535. package/src/components/BaseRadioGroup.story.vue +145 -0
  536. package/src/components/BaseRadioGroup.vue +128 -0
  537. package/src/components/BaseSelect.story.vue +120 -0
  538. package/src/components/BaseSelect.vue +89 -0
  539. package/src/components/BaseSlider.story.vue +122 -0
  540. package/src/components/BaseSlider.vue +126 -0
  541. package/src/components/BaseTabs.story.vue +127 -0
  542. package/src/components/BaseTabs.vue +107 -0
  543. package/src/components/BaseTextarea.story.vue +91 -0
  544. package/src/components/BaseTextarea.vue +62 -0
  545. package/src/components/BaseToggle.story.vue +108 -0
  546. package/src/components/BaseToggle.vue +143 -0
  547. package/src/components/BatchProgressList.story.vue +92 -0
  548. package/src/components/BatchProgressList.vue +181 -0
  549. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  550. package/src/components/BioTemplateExperimentWorkspaceView.vue +339 -0
  551. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  552. package/src/components/BioTemplatePackWorkspaceView.vue +180 -0
  553. package/src/components/BioTemplatePresetWorkspaceView.story.vue +163 -0
  554. package/src/components/BioTemplatePresetWorkspaceView.vue +403 -0
  555. package/src/components/BioTemplateRenderer.story.vue +57 -0
  556. package/src/components/BioTemplateRenderer.vue +64 -0
  557. package/src/components/Breadcrumb.story.vue +106 -0
  558. package/src/components/Breadcrumb.vue +81 -0
  559. package/src/components/Calendar.story.vue +106 -0
  560. package/src/components/Calendar.vue +367 -0
  561. package/src/components/ChartContainer.story.vue +113 -0
  562. package/src/components/ChartContainer.vue +64 -0
  563. package/src/components/ChemicalFormula.story.vue +102 -0
  564. package/src/components/ChemicalFormula.vue +39 -0
  565. package/src/components/CollapsibleCard.story.vue +135 -0
  566. package/src/components/CollapsibleCard.vue +245 -0
  567. package/src/components/ColorSlider.story.vue +120 -0
  568. package/src/components/ColorSlider.vue +164 -0
  569. package/src/components/ComponentBindingRenderer.story.vue +87 -0
  570. package/src/components/ComponentBindingRenderer.vue +322 -0
  571. package/src/components/ConcentrationInput.story.vue +77 -0
  572. package/src/components/ConcentrationInput.vue +149 -0
  573. package/src/components/ConfirmDialog.story.vue +248 -0
  574. package/src/components/ConfirmDialog.vue +100 -0
  575. package/src/components/ControlWorkspaceView.story.vue +347 -0
  576. package/src/components/ControlWorkspaceView.vue +370 -0
  577. package/src/components/DataFrame.story.vue +148 -0
  578. package/src/components/DataFrame.vue +520 -0
  579. package/src/components/DatePicker.story.vue +119 -0
  580. package/src/components/DatePicker.vue +197 -0
  581. package/src/components/DateTimePicker.story.vue +112 -0
  582. package/src/components/DateTimePicker.vue +271 -0
  583. package/src/components/Divider.story.vue +80 -0
  584. package/src/components/Divider.vue +49 -0
  585. package/src/components/DoseCalculator.story.vue +68 -0
  586. package/src/components/DoseCalculator.vue +416 -0
  587. package/src/components/DoseCalculatorVolumeField.vue +61 -0
  588. package/src/components/DoseDesignWorkspaceView.story.vue +77 -0
  589. package/src/components/DoseDesignWorkspaceView.vue +243 -0
  590. package/src/components/DropdownButton.story.vue +102 -0
  591. package/src/components/DropdownButton.vue +193 -0
  592. package/src/components/EmptyState.story.vue +135 -0
  593. package/src/components/EmptyState.vue +71 -0
  594. package/src/components/ExperimentCodeBadge.story.vue +77 -0
  595. package/src/components/ExperimentCodeBadge.vue +64 -0
  596. package/src/components/ExperimentDataViewer.story.vue +174 -0
  597. package/src/components/ExperimentDataViewer.vue +293 -0
  598. package/src/components/ExperimentPopover.story.vue +442 -0
  599. package/src/components/ExperimentPopover.vue +312 -0
  600. package/src/components/ExperimentSelectorModal.story.vue +381 -0
  601. package/src/components/ExperimentSelectorModal.vue +432 -0
  602. package/src/components/ExperimentTimeline.story.vue +161 -0
  603. package/src/components/ExperimentTimeline.vue +357 -0
  604. package/src/components/FileUploader.story.vue +107 -0
  605. package/src/components/FileUploader.vue +424 -0
  606. package/src/components/FitPanel.story.vue +125 -0
  607. package/src/components/FitPanel.vue +120 -0
  608. package/src/components/FormActions.vue +92 -0
  609. package/src/components/FormBuilder.story.vue +203 -0
  610. package/src/components/FormBuilder.vue +311 -0
  611. package/src/components/FormField.story.vue +132 -0
  612. package/src/components/FormField.vue +59 -0
  613. package/src/components/FormulaInput.story.vue +96 -0
  614. package/src/components/FormulaInput.vue +125 -0
  615. package/src/components/GeneratedPathInput.vue +218 -0
  616. package/src/components/GeneratedPlotlyResult.vue +87 -0
  617. package/src/components/GeneratedPluginView.vue +289 -0
  618. package/src/components/GeneratedResultRenderer.vue +147 -0
  619. package/src/components/GroupAssigner.story.vue +83 -0
  620. package/src/components/GroupAssigner.vue +257 -0
  621. package/src/components/IconButton.story.vue +140 -0
  622. package/src/components/IconButton.vue +73 -0
  623. package/src/components/InstrumentAlertLog.vue +191 -0
  624. package/src/components/InstrumentStateBadge.vue +50 -0
  625. package/src/components/InstrumentStatusCard.vue +188 -0
  626. package/src/components/JobsStatusTray.story.vue +126 -0
  627. package/src/components/JobsStatusTray.vue +407 -0
  628. package/src/components/LcmsSequenceTable.vue +191 -0
  629. package/src/components/LoadingSpinner.story.vue +70 -0
  630. package/src/components/LoadingSpinner.vue +50 -0
  631. package/src/components/MobileSupportGate.story.vue +52 -0
  632. package/src/components/MobileSupportGate.vue +115 -0
  633. package/src/components/MoleculeInput.story.vue +66 -0
  634. package/src/components/MoleculeInput.vue +426 -0
  635. package/src/components/MultiSelect.story.vue +132 -0
  636. package/src/components/MultiSelect.vue +123 -0
  637. package/src/components/NumberInput.story.vue +122 -0
  638. package/src/components/NumberInput.vue +162 -0
  639. package/src/components/PlateMapEditor.story.vue +92 -0
  640. package/src/components/PlateMapEditor.vue +434 -0
  641. package/src/components/PluginIcon.story.vue +103 -0
  642. package/src/components/PluginIcon.vue +158 -0
  643. package/src/components/PluginWorkspaceView.controls.ts +182 -0
  644. package/src/components/PluginWorkspaceView.navigation.ts +106 -0
  645. package/src/components/PluginWorkspaceView.props.ts +207 -0
  646. package/src/components/PluginWorkspaceView.shell.ts +67 -0
  647. package/src/components/PluginWorkspaceView.story.vue +341 -0
  648. package/src/components/PluginWorkspaceView.vue +224 -0
  649. package/src/components/ProgressBar.story.vue +148 -0
  650. package/src/components/ProgressBar.vue +117 -0
  651. package/src/components/ProtocolStep.presentation.ts +31 -0
  652. package/src/components/ProtocolStepEditor.state.ts +104 -0
  653. package/src/components/ProtocolStepEditor.story.vue +69 -0
  654. package/src/components/ProtocolStepEditor.vue +382 -0
  655. package/src/components/ProtocolStepParameterField.vue +134 -0
  656. package/src/components/RackEditor.story.vue +100 -0
  657. package/src/components/RackEditor.vue +442 -0
  658. package/src/components/ReagentEditor.story.vue +153 -0
  659. package/src/components/ReagentEditor.vue +418 -0
  660. package/src/components/ReagentList.presentation.ts +105 -0
  661. package/src/components/ReagentList.story.vue +137 -0
  662. package/src/components/ReagentList.vue +392 -0
  663. package/src/components/ResourceCard.story.vue +150 -0
  664. package/src/components/ResourceCard.vue +161 -0
  665. package/src/components/RuntimeUpdateNotice.vue +51 -0
  666. package/src/components/SampleHierarchyTree.story.vue +161 -0
  667. package/src/components/SampleHierarchyTree.vue +246 -0
  668. package/src/components/SampleLegend.story.vue +91 -0
  669. package/src/components/SampleLegend.vue +119 -0
  670. package/src/components/SampleSelector.colors.ts +48 -0
  671. package/src/components/SampleSelector.drag.ts +164 -0
  672. package/src/components/SampleSelector.groups.ts +109 -0
  673. package/src/components/SampleSelector.selection.ts +64 -0
  674. package/src/components/SampleSelector.story.vue +192 -0
  675. package/src/components/SampleSelector.tree.ts +48 -0
  676. package/src/components/SampleSelector.vue +451 -0
  677. package/src/components/SampleSelectorGroupNode.vue +197 -0
  678. package/src/components/SampleSelectorSampleRow.vue +68 -0
  679. package/src/components/ScheduleCalendar.story.vue +195 -0
  680. package/src/components/ScheduleCalendar.vue +414 -0
  681. package/src/components/ScientificNumber.story.vue +127 -0
  682. package/src/components/ScientificNumber.vue +197 -0
  683. package/src/components/SecretInput.story.vue +79 -0
  684. package/src/components/SecretInput.vue +150 -0
  685. package/src/components/SectionCard.story.vue +163 -0
  686. package/src/components/SectionCard.vue +98 -0
  687. package/src/components/SegmentedControl.story.vue +149 -0
  688. package/src/components/SegmentedControl.vue +94 -0
  689. package/src/components/SequenceInput.story.vue +119 -0
  690. package/src/components/SequenceInput.vue +209 -0
  691. package/src/components/SequenceProgressBar.vue +71 -0
  692. package/src/components/SettingsModal.schema.ts +74 -0
  693. package/src/components/SettingsModal.story.vue +524 -0
  694. package/src/components/SettingsModal.vue +399 -0
  695. package/src/components/Skeleton.story.vue +141 -0
  696. package/src/components/Skeleton.vue +74 -0
  697. package/src/components/SmartGroup.types.ts +98 -0
  698. package/src/components/SmartGroupFieldRecipe.groups.ts +109 -0
  699. package/src/components/SmartGroupFieldRecipe.story.vue +58 -0
  700. package/src/components/SmartGroupFieldRecipe.vue +499 -0
  701. package/src/components/SmartGroupManual.cohorts.ts +112 -0
  702. package/src/components/SmartGroupManual.story.vue +55 -0
  703. package/src/components/SmartGroupManual.vue +398 -0
  704. package/src/components/SmartGroupModal.story.vue +61 -0
  705. package/src/components/SmartGroupModal.vue +61 -0
  706. package/src/components/StatusIndicator.story.vue +99 -0
  707. package/src/components/StatusIndicator.vue +40 -0
  708. package/src/components/StepWizard.story.vue +155 -0
  709. package/src/components/StepWizard.vue +223 -0
  710. package/src/components/TagsInput.story.vue +155 -0
  711. package/src/components/TagsInput.vue +280 -0
  712. package/src/components/ThemeToggle.story.vue +36 -0
  713. package/src/components/ThemeToggle.vue +56 -0
  714. package/src/components/TimePicker.story.vue +96 -0
  715. package/src/components/TimePicker.vue +251 -0
  716. package/src/components/TimeRangeInput.story.vue +104 -0
  717. package/src/components/TimeRangeInput.vue +122 -0
  718. package/src/components/Tooltip.story.vue +138 -0
  719. package/src/components/Tooltip.vue +114 -0
  720. package/src/components/UnitInput.story.vue +194 -0
  721. package/src/components/UnitInput.vue +217 -0
  722. package/src/components/WellPlate.colors.ts +56 -0
  723. package/src/components/WellPlate.conditions.ts +100 -0
  724. package/src/components/WellPlate.geometry.ts +91 -0
  725. package/src/components/WellPlate.interaction.ts +272 -0
  726. package/src/components/WellPlate.legend.ts +8 -0
  727. package/src/components/WellPlate.rendering.ts +105 -0
  728. package/src/components/WellPlate.sampleDrop.ts +73 -0
  729. package/src/components/WellPlate.story.vue +282 -0
  730. package/src/components/WellPlate.vue +497 -0
  731. package/src/components/index.ts +148 -0
  732. package/src/components/internal/ActionItemInternal.vue +82 -0
  733. package/src/components/internal/AppTopBarPageSelectorInternal.vue +127 -0
  734. package/src/components/internal/AppTopBarPillNavInternal.vue +194 -0
  735. package/src/components/internal/CalendarGridPanelInternal.vue +120 -0
  736. package/src/components/internal/FormFieldRendererInternal.vue +68 -0
  737. package/src/components/internal/FormSectionRenderer.vue +78 -0
  738. package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
  739. package/src/components/internal/WellEditPopupInternal.vue +249 -0
  740. package/src/components/internal/WorkspaceControlsInternal.vue +20 -0
  741. package/src/components/internal/WorkspaceShellInternal.vue +125 -0
  742. package/src/components/internal/WorkspaceSidebarInternal.vue +82 -0
  743. package/src/composables/analysisArtifactTarget.ts +53 -0
  744. package/src/composables/autoGroup/classKey.ts +8 -0
  745. package/src/composables/autoGroup/classify.ts +205 -0
  746. package/src/composables/autoGroup/colors.ts +6 -0
  747. package/src/composables/autoGroup/columns.ts +226 -0
  748. package/src/composables/autoGroup/compose.ts +244 -0
  749. package/src/composables/autoGroup/cooccurrence.ts +46 -0
  750. package/src/composables/autoGroup/csv-shim.ts +44 -0
  751. package/src/composables/autoGroup/fingerprint.ts +63 -0
  752. package/src/composables/autoGroup/index.ts +22 -0
  753. package/src/composables/autoGroup/replicatePreGroup.ts +124 -0
  754. package/src/composables/autoGroup/template.ts +126 -0
  755. package/src/composables/autoGroup/tokenLength.ts +53 -0
  756. package/src/composables/autoGroup/tokenize.ts +41 -0
  757. package/src/composables/autoGroup/vocab.json +66 -0
  758. package/src/composables/autoGroupConstants.ts +4 -0
  759. package/src/composables/autoGroupGrouping.ts +148 -0
  760. package/src/composables/controlComponentBindings.ts +80 -0
  761. package/src/composables/controlSchemaAdapters.ts +199 -0
  762. package/src/composables/controlSchemaDoseDesign.ts +222 -0
  763. package/src/composables/controlSchemaFormFields.ts +64 -0
  764. package/src/composables/controlSchemaLayout.ts +59 -0
  765. package/src/composables/controlSchemaModel.ts +172 -0
  766. package/src/composables/controlSchemaNormalize.ts +101 -0
  767. package/src/composables/controlSchemaTypes.ts +372 -0
  768. package/src/composables/controlSchemaUtils.ts +36 -0
  769. package/src/composables/controlWorkspaceOptions.ts +21 -0
  770. package/src/composables/experiment-utils.ts +105 -0
  771. package/src/composables/experimentDesignData.ts +180 -0
  772. package/src/composables/flattenWorkspaceBindings.ts +104 -0
  773. package/src/composables/formBuilderRegistry.ts +86 -0
  774. package/src/composables/formBuilderSchema.ts +153 -0
  775. package/src/composables/index.ts +556 -0
  776. package/src/composables/platformContextHelpers.ts +81 -0
  777. package/src/composables/pluginEndpointBuilder.ts +267 -0
  778. package/src/composables/pluginFrontendBase.ts +22 -0
  779. package/src/composables/pluginWorkspaceModel.ts +182 -0
  780. package/src/composables/protocolTemplateCatalog.ts +325 -0
  781. package/src/composables/useAnalysisArtifacts.ts +361 -0
  782. package/src/composables/useApi.ts +319 -0
  783. package/src/composables/useAppExperiment.ts +228 -0
  784. package/src/composables/useAsync.ts +327 -0
  785. package/src/composables/useAuth.ts +458 -0
  786. package/src/composables/useAutoGroup.ts +682 -0
  787. package/src/composables/useAutoGroupInputSources.ts +147 -0
  788. package/src/composables/useBioTemplateComponents.ts +105 -0
  789. package/src/composables/useBioTemplateControls.ts +41 -0
  790. package/src/composables/useBioTemplatePackWorkspace.ts +199 -0
  791. package/src/composables/useBioTemplatePresetWorkspace.ts +325 -0
  792. package/src/composables/useBioTemplateWorkspace.ts +116 -0
  793. package/src/composables/useCalendarGrid.ts +140 -0
  794. package/src/composables/useChemicalFormula.ts +275 -0
  795. package/src/composables/useCommandHistory.ts +117 -0
  796. package/src/composables/useConcentrationUnits.ts +246 -0
  797. package/src/composables/useControlSchema.ts +135 -0
  798. package/src/composables/useControlWorkspace.ts +209 -0
  799. package/src/composables/useDebouncedWatch.ts +119 -0
  800. package/src/composables/useDoseCalculator.ts +370 -0
  801. package/src/composables/useDropdownState.ts +83 -0
  802. package/src/composables/useEventListener.ts +111 -0
  803. package/src/composables/useEventStream.ts +314 -0
  804. package/src/composables/useExpansionSet.ts +117 -0
  805. package/src/composables/useExperimentData.ts +136 -0
  806. package/src/composables/useExperimentSamples.ts +142 -0
  807. package/src/composables/useExperimentSave.ts +344 -0
  808. package/src/composables/useExperimentSelector.ts +408 -0
  809. package/src/composables/useFileImport.ts +231 -0
  810. package/src/composables/useFocusTrap.ts +91 -0
  811. package/src/composables/useForm.ts +279 -0
  812. package/src/composables/useFormBuilder.ts +292 -0
  813. package/src/composables/useFormValidation.ts +154 -0
  814. package/src/composables/useGeneratedAnalysis.ts +1227 -0
  815. package/src/composables/useGroupAssignment.ts +148 -0
  816. package/src/composables/useJobsStatusTray.ts +493 -0
  817. package/src/composables/useListSelection.ts +158 -0
  818. package/src/composables/useMenuKeyboard.ts +90 -0
  819. package/src/composables/useMobileSupportGate.ts +80 -0
  820. package/src/composables/useOptimisticMutation.ts +111 -0
  821. package/src/composables/usePasskey.ts +216 -0
  822. package/src/composables/usePlatformContext.ts +299 -0
  823. package/src/composables/usePluginClient.ts +1006 -0
  824. package/src/composables/usePluginConfig.ts +250 -0
  825. package/src/composables/usePluginWorkspace.ts +208 -0
  826. package/src/composables/usePresenceHeartbeat.ts +201 -0
  827. package/src/composables/useProtocolTemplates.ts +212 -0
  828. package/src/composables/useRackEditor.ts +223 -0
  829. package/src/composables/useReagentSeries.ts +91 -0
  830. package/src/composables/useRequestSyncState.ts +126 -0
  831. package/src/composables/useResourceCrud.ts +249 -0
  832. package/src/composables/useRovingFocus.ts +66 -0
  833. package/src/composables/useRuntimeAlignment.ts +184 -0
  834. package/src/composables/useSampleGroups.ts +211 -0
  835. package/src/composables/useScheduleCalendarLayout.ts +287 -0
  836. package/src/composables/useScheduleDrag.ts +245 -0
  837. package/src/composables/useSelectionLimit.ts +57 -0
  838. package/src/composables/useSequenceUtils.ts +105 -0
  839. package/src/composables/useSortedItems.ts +118 -0
  840. package/src/composables/useTemplateCollection.ts +229 -0
  841. package/src/composables/useTextSearch.ts +60 -0
  842. package/src/composables/useTheme.ts +32 -0
  843. package/src/composables/useTimeUtils.ts +155 -0
  844. package/src/composables/useToast.ts +40 -0
  845. package/src/composables/useWellPainting.ts +191 -0
  846. package/src/composables/useWellPlateAdapter.ts +151 -0
  847. package/src/composables/useWellPlateEditor.ts +425 -0
  848. package/src/composables/useWellPlateValidation.ts +89 -0
  849. package/src/composables/workspaceRecipes.ts +267 -0
  850. package/src/generated/schema.ts +130 -0
  851. package/src/generated-ui/main.ts +21 -0
  852. package/src/histoire.setup.ts +17 -0
  853. package/src/index.ts +83 -0
  854. package/src/install.ts +39 -0
  855. package/src/instrument.ts +90 -0
  856. package/src/jobs.ts +80 -0
  857. package/src/lcms.ts +108 -0
  858. package/src/permissions.ts +144 -0
  859. package/src/plotly-dist.d.ts +3 -0
  860. package/src/stores/auth.ts +206 -0
  861. package/src/stores/experiment.ts +120 -0
  862. package/src/stores/index.ts +3 -0
  863. package/src/stores/settings.ts +232 -0
  864. package/src/styles/components/action-menu.css +59 -0
  865. package/src/styles/components/alert-box.css +150 -0
  866. package/src/styles/components/app-avatar-menu.css +156 -0
  867. package/src/styles/components/app-container.css +33 -0
  868. package/src/styles/components/app-layout.css +180 -0
  869. package/src/styles/components/app-page-selector.css +212 -0
  870. package/src/styles/components/app-pill-nav.css +133 -0
  871. package/src/styles/components/app-plugin-switcher.css +196 -0
  872. package/src/styles/components/app-sidebar.css +392 -0
  873. package/src/styles/components/app-top-bar.css +249 -0
  874. package/src/styles/components/artifact-save-dialog.css +17 -0
  875. package/src/styles/components/artifact-selector-modal.css +216 -0
  876. package/src/styles/components/audit-trail.css +143 -0
  877. package/src/styles/components/avatar.css +73 -0
  878. package/src/styles/components/batch-progress-list.css +196 -0
  879. package/src/styles/components/breadcrumb.css +64 -0
  880. package/src/styles/components/button.css +192 -0
  881. package/src/styles/components/calendar.css +192 -0
  882. package/src/styles/components/chart-container.css +69 -0
  883. package/src/styles/components/checkbox.css +210 -0
  884. package/src/styles/components/chemical-formula.css +46 -0
  885. package/src/styles/components/collapsible-card.css +393 -0
  886. package/src/styles/components/color-slider.css +110 -0
  887. package/src/styles/components/concentration-input.css +17 -0
  888. package/src/styles/components/confirm-dialog.css +59 -0
  889. package/src/styles/components/dataframe.css +554 -0
  890. package/src/styles/components/date-picker.css +243 -0
  891. package/src/styles/components/datetime-picker.css +229 -0
  892. package/src/styles/components/divider.css +63 -0
  893. package/src/styles/components/dose-calculator.css +297 -0
  894. package/src/styles/components/dropdown-button.css +280 -0
  895. package/src/styles/components/empty-state.css +135 -0
  896. package/src/styles/components/experiment-code-badge.css +33 -0
  897. package/src/styles/components/experiment-data-viewer.css +138 -0
  898. package/src/styles/components/experiment-popover.css +563 -0
  899. package/src/styles/components/experiment-selector-modal.css +341 -0
  900. package/src/styles/components/experiment-timeline.css +529 -0
  901. package/src/styles/components/file-uploader.css +310 -0
  902. package/src/styles/components/fit-panel.css +67 -0
  903. package/src/styles/components/form-builder.css +69 -0
  904. package/src/styles/components/form-field.css +48 -0
  905. package/src/styles/components/formula-input.css +103 -0
  906. package/src/styles/components/group-assigner.css +200 -0
  907. package/src/styles/components/icon-button.css +196 -0
  908. package/src/styles/components/input.css +65 -0
  909. package/src/styles/components/instrument-monitor.css +478 -0
  910. package/src/styles/components/jobs-status-tray.css +420 -0
  911. package/src/styles/components/lcms-sequence-table.css +189 -0
  912. package/src/styles/components/loading-spinner.css +67 -0
  913. package/src/styles/components/mobile-support-gate.css +119 -0
  914. package/src/styles/components/modal.css +646 -0
  915. package/src/styles/components/molecule-input.css +186 -0
  916. package/src/styles/components/multi-select.css +131 -0
  917. package/src/styles/components/number-input.css +199 -0
  918. package/src/styles/components/pill.css +188 -0
  919. package/src/styles/components/plate-map-editor.css +464 -0
  920. package/src/styles/components/plugin-icon.css +46 -0
  921. package/src/styles/components/progress-bar.css +133 -0
  922. package/src/styles/components/protocol-step-editor.css +443 -0
  923. package/src/styles/components/rack-editor.css +265 -0
  924. package/src/styles/components/radio-group.css +240 -0
  925. package/src/styles/components/reagent-editor.css +505 -0
  926. package/src/styles/components/reagent-list.css +407 -0
  927. package/src/styles/components/resource-card.css +360 -0
  928. package/src/styles/components/sample-hierarchy-tree.css +310 -0
  929. package/src/styles/components/sample-legend.css +201 -0
  930. package/src/styles/components/sample-selector.css +682 -0
  931. package/src/styles/components/schedule-calendar.css +472 -0
  932. package/src/styles/components/scientific-number.css +63 -0
  933. package/src/styles/components/secret-input.css +60 -0
  934. package/src/styles/components/section-card.css +161 -0
  935. package/src/styles/components/segmented-control.css +194 -0
  936. package/src/styles/components/select.css +77 -0
  937. package/src/styles/components/sequence-input.css +184 -0
  938. package/src/styles/components/sequence-progress-bar.css +63 -0
  939. package/src/styles/components/settings-modal.css +76 -0
  940. package/src/styles/components/skeleton.css +49 -0
  941. package/src/styles/components/slider.css +74 -0
  942. package/src/styles/components/smart-group.css +734 -0
  943. package/src/styles/components/status-indicator.css +66 -0
  944. package/src/styles/components/step-wizard.css +192 -0
  945. package/src/styles/components/tabs.css +103 -0
  946. package/src/styles/components/tags-input.css +195 -0
  947. package/src/styles/components/textarea.css +81 -0
  948. package/src/styles/components/theme-toggle.css +6 -0
  949. package/src/styles/components/time-picker.css +171 -0
  950. package/src/styles/components/time-range-input.css +42 -0
  951. package/src/styles/components/toast.css +91 -0
  952. package/src/styles/components/toggle.css +226 -0
  953. package/src/styles/components/tooltip.css +91 -0
  954. package/src/styles/components/unit-input.css +123 -0
  955. package/src/styles/components/well-edit-popup.css +258 -0
  956. package/src/styles/components/well-plate.css +286 -0
  957. package/src/styles/index.css +94 -0
  958. package/src/styles/variables.css +1150 -0
  959. package/src/tailwind.preset.ts +66 -0
  960. package/src/templates/adapters.ts +137 -0
  961. package/src/templates/assayLookups.ts +33 -0
  962. package/src/templates/assayMatrixAdapters.ts +78 -0
  963. package/src/templates/assayMatrixBuilder.ts +59 -0
  964. package/src/templates/assayNormalizers.ts +34 -0
  965. package/src/templates/builderDefaults.ts +11 -0
  966. package/src/templates/builderIdUtils.ts +20 -0
  967. package/src/templates/builderPresetControls.ts +165 -0
  968. package/src/templates/builderReadUtils.ts +55 -0
  969. package/src/templates/builders.ts +122 -0
  970. package/src/templates/calibrationCurveAdapters.ts +59 -0
  971. package/src/templates/calibrationCurveBuilder.ts +99 -0
  972. package/src/templates/calibrationNormalizers.ts +60 -0
  973. package/src/templates/catalog.ts +245 -0
  974. package/src/templates/componentBindingCatalog.ts +90 -0
  975. package/src/templates/componentBindingHelpers.ts +93 -0
  976. package/src/templates/componentBindings.ts +253 -0
  977. package/src/templates/componentDoseResponseProps.ts +42 -0
  978. package/src/templates/componentGenericProps.ts +77 -0
  979. package/src/templates/componentPlateHelpers.ts +29 -0
  980. package/src/templates/componentPlateMapProps.ts +32 -0
  981. package/src/templates/componentPropsFactory.ts +21 -0
  982. package/src/templates/componentQpcrPlateProps.ts +28 -0
  983. package/src/templates/componentTargetResolvers.ts +67 -0
  984. package/src/templates/componentTemplateProps.ts +78 -0
  985. package/src/templates/controlSchemaClone.ts +32 -0
  986. package/src/templates/controlSchemaConstants.ts +11 -0
  987. package/src/templates/controlSchemaMerge.ts +40 -0
  988. package/src/templates/controlSchemaTargets.ts +85 -0
  989. package/src/templates/controlSchemaTypes.ts +20 -0
  990. package/src/templates/controlSchemas.ts +104 -0
  991. package/src/templates/defaultBioTemplateBuilder.ts +124 -0
  992. package/src/templates/doseResponseAdapters.ts +45 -0
  993. package/src/templates/doseResponseBuilder.ts +44 -0
  994. package/src/templates/elisaAssayCollectionBuilder.ts +62 -0
  995. package/src/templates/flowCytometryAssayCollectionBuilder.ts +41 -0
  996. package/src/templates/flowCytometryPanelBuilder.ts +53 -0
  997. package/src/templates/flowNormalizers.ts +58 -0
  998. package/src/templates/flowPanelAdapters.ts +58 -0
  999. package/src/templates/index.ts +326 -0
  1000. package/src/templates/instrumentRunAdapterHelpers.ts +94 -0
  1001. package/src/templates/instrumentRunAdapters.ts +163 -0
  1002. package/src/templates/instrumentRunBuilder.ts +97 -0
  1003. package/src/templates/lcmsBatchCollectionBuilder.ts +38 -0
  1004. package/src/templates/lookup.ts +18 -0
  1005. package/src/templates/packs.ts +162 -0
  1006. package/src/templates/plateGeometry.ts +62 -0
  1007. package/src/templates/plateMapAdapters.ts +36 -0
  1008. package/src/templates/plateMapBuilder.ts +43 -0
  1009. package/src/templates/presetControlSchemas.ts +258 -0
  1010. package/src/templates/presets.ts +179 -0
  1011. package/src/templates/protocolAdapters.ts +69 -0
  1012. package/src/templates/protocolNormalizers.ts +37 -0
  1013. package/src/templates/protocolStepsBuilder.ts +36 -0
  1014. package/src/templates/qpcrAdapters.ts +104 -0
  1015. package/src/templates/qpcrExpressionCollectionBuilder.ts +33 -0
  1016. package/src/templates/qpcrPlateBuilder.ts +96 -0
  1017. package/src/templates/reagentAdapters.ts +77 -0
  1018. package/src/templates/reagentListBuilder.ts +30 -0
  1019. package/src/templates/runNormalizers.ts +63 -0
  1020. package/src/templates/sampleNormalizers.ts +58 -0
  1021. package/src/templates/samplePrepAdapters.ts +63 -0
  1022. package/src/templates/samplePrepBuilder.ts +51 -0
  1023. package/src/templates/sampleSheetAdapters.ts +75 -0
  1024. package/src/templates/sampleSheetBuilder.ts +23 -0
  1025. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +79 -0
  1026. package/src/templates/targetedMetabolomicsHelpers.ts +102 -0
  1027. package/src/templates/templateAdapterTypes.ts +58 -0
  1028. package/src/templates/templateControlSchemas.ts +320 -0
  1029. package/src/templates/templateCreateOptions.ts +208 -0
  1030. package/src/templates/templateEnvelopes.ts +137 -0
  1031. package/src/templates/templatePackCollectionBuilder.ts +23 -0
  1032. package/src/templates/templatePresetCollectionBuilder.ts +139 -0
  1033. package/src/templates/templateQpcrTypes.ts +48 -0
  1034. package/src/templates/templateValidators.ts +414 -0
  1035. package/src/templates/timeCourseAdapters.ts +73 -0
  1036. package/src/templates/timeCourseBuilder.ts +64 -0
  1037. package/src/templates/types.ts +493 -0
  1038. package/src/templates/wellPlateScreenCollectionBuilder.ts +36 -0
  1039. package/src/templates/westernBlotAssayCollectionBuilder.ts +68 -0
  1040. package/src/types/analysisArtifactTypes.ts +176 -0
  1041. package/src/types/auth.ts +59 -0
  1042. package/src/types/auto-group.ts +157 -0
  1043. package/src/types/componentLabTypes.ts +235 -0
  1044. package/src/types/componentWorkflowTypes.ts +190 -0
  1045. package/src/types/components.ts +527 -0
  1046. package/src/types/form-builder.ts +208 -0
  1047. package/src/types/generated-ui.ts +189 -0
  1048. package/src/types/index.ts +299 -0
  1049. package/src/types/instrument.ts +62 -0
  1050. package/src/types/jobs.ts +70 -0
  1051. package/src/types/platform.ts +132 -0
  1052. package/src/utils/color.ts +96 -0
  1053. package/src/utils/formModelSync.ts +50 -0
  1054. package/src/utils/items.ts +28 -0
  1055. package/src/utils/options.ts +23 -0
  1056. package/src/utils/pluginIcon.ts +188 -0
  1057. package/src/utils/pluginSecrets.ts +102 -0
  1058. package/src/utils/rack.ts +209 -0
  1059. package/src/utils/records.ts +9 -0
  1060. package/src/utils/sampleGroupPath.ts +19 -0
  1061. package/dist/ExperimentPopover-C1e0cd94.js +0 -3
  1062. package/dist/ExperimentSelectorModal-DCWTFyos.js +0 -4
  1063. package/dist/SettingsModal-Bpybht86.js +0 -5
@@ -1,10 +1,114 @@
1
- import { d as resolveExperimentCode } from "./experiment-utils-CLnzPPq5.js";
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";
7
- import { computed, effectScope, getCurrentScope, inject, onMounted, onScopeDispose, onUnmounted, provide, reactive, readonly, ref, shallowRef, toRaw, toValue, unref, watch } from "vue";
1
+ import { d as resolveExperimentCode } from "./experiment-utils-DV3DrvE_.js";
2
+ import { r as useRequestSyncState } from "./EmptyState-NBqf2_8z.js";
3
+ import { A as useConcentrationUnits, H as parseExperimentId, J as isActiveJobStatus, Q as normalizeJobState, T as getDefaultControlView, U as resolveCurrentExperimentId, V as getInjectedPlatformContext, f as resolveControlModel, g as mergeControlWorkspaceOptions, h as controlValuesToComponentProps, m as controlValuesToComponentBindingsById, p as controlValuesToComponentBindings, r as getControlDefaults, rt as isRecord, u as useControlWorkspace, w as controlsToViewItems } from "./useControlSchema-_OVhavKq.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-CK72aKO1.js";
7
+ import { computed, effectScope, getCurrentScope, inject, nextTick, onMounted, onScopeDispose, onUnmounted, provide, reactive, readonly, ref, shallowRef, toRaw, toValue, unref, watch } from "vue";
8
+ //#region src/composables/useRovingFocus.ts
9
+ /**
10
+ * WAI-ARIA roving-tabindex navigation with automatic activation (the tabs pattern):
11
+ * Left/Right (or Up/Down when `orientation` is `'vertical'`) move to the adjacent item
12
+ * and activate it immediately, wrapping past the ends; Home/End jump to the first/last
13
+ * item. Only the active item should carry `tabindex="0"`; give every other item
14
+ * `tabindex="-1"`. Used by BaseTabs.
15
+ */
16
+ function useRovingFocus(options) {
17
+ const orientation = options.orientation ?? "horizontal";
18
+ const prevKey = orientation === "vertical" ? "ArrowUp" : "ArrowLeft";
19
+ const nextKey = orientation === "vertical" ? "ArrowDown" : "ArrowRight";
20
+ function moveTo(id) {
21
+ if (id === void 0) return;
22
+ options.activate(id);
23
+ nextTick(() => options.getElement(id)?.focus());
24
+ }
25
+ function handleKeydown(event) {
26
+ const ids = options.ids();
27
+ if (ids.length === 0) return;
28
+ const currentIndex = ids.indexOf(options.activeId() ?? "");
29
+ if (event.key === "Home") {
30
+ event.preventDefault();
31
+ moveTo(ids[0]);
32
+ return;
33
+ }
34
+ if (event.key === "End") {
35
+ event.preventDefault();
36
+ moveTo(ids[ids.length - 1]);
37
+ return;
38
+ }
39
+ if (event.key === prevKey) {
40
+ event.preventDefault();
41
+ moveTo(ids[currentIndex <= 0 ? ids.length - 1 : currentIndex - 1]);
42
+ return;
43
+ }
44
+ if (event.key === nextKey) {
45
+ event.preventDefault();
46
+ moveTo(ids[currentIndex === -1 || currentIndex >= ids.length - 1 ? 0 : currentIndex + 1]);
47
+ }
48
+ }
49
+ return { handleKeydown };
50
+ }
51
+ //#endregion
52
+ //#region src/composables/useMenuKeyboard.ts
53
+ /**
54
+ * Shared keyboard contract for menu- and listbox-style disclosure panels (the
55
+ * WAI-ARIA menu button pattern). Used by AppAvatarMenu and DropdownButton; ActionMenu
56
+ * implements the same contract inline.
57
+ */
58
+ function useMenuKeyboard(options) {
59
+ function focusItem(position) {
60
+ nextTick(() => {
61
+ const items = options.items();
62
+ (position === "first" ? items[0] : items[items.length - 1])?.focus();
63
+ });
64
+ }
65
+ function handleTriggerKeydown(event) {
66
+ if (options.isOpen()) return;
67
+ if (event.key === "ArrowDown" || event.key === "Enter" || event.key === " ") {
68
+ event.preventDefault();
69
+ options.open();
70
+ focusItem("first");
71
+ return;
72
+ }
73
+ if (event.key === "ArrowUp") {
74
+ event.preventDefault();
75
+ options.open();
76
+ focusItem("last");
77
+ }
78
+ }
79
+ function handlePanelKeydown(event) {
80
+ const items = options.items();
81
+ const currentIndex = items.indexOf(document.activeElement);
82
+ if (event.key === "Escape") {
83
+ event.preventDefault();
84
+ options.close(true);
85
+ return;
86
+ }
87
+ if (event.key === "Tab") {
88
+ options.close();
89
+ return;
90
+ }
91
+ if (event.key === "Home") {
92
+ event.preventDefault();
93
+ items[0]?.focus();
94
+ return;
95
+ }
96
+ if (event.key === "End") {
97
+ event.preventDefault();
98
+ items[items.length - 1]?.focus();
99
+ return;
100
+ }
101
+ if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return;
102
+ event.preventDefault();
103
+ const direction = event.key === "ArrowDown" ? 1 : -1;
104
+ items[(Math.max(currentIndex, 0) + direction + items.length) % items.length]?.focus();
105
+ }
106
+ return {
107
+ handleTriggerKeydown,
108
+ handlePanelKeydown
109
+ };
110
+ }
111
+ //#endregion
8
112
  //#region src/composables/useSortedItems.ts
9
113
  /** Shared sorting for SDK tables and lists with stable empty-value handling. */
10
114
  function useSortedItems(options) {
@@ -528,32 +632,389 @@ function useMobileSupportGate(options = {}) {
528
632
  };
529
633
  }
530
634
  //#endregion
531
- //#region src/jobs.ts
532
- var ACTIVE_JOB_STATUSES = new Set([
533
- "awaiting_input",
534
- "queued",
535
- "running"
635
+ //#region src/components/PluginWorkspaceView.controls.ts
636
+ function usePluginWorkspaceControls(options) {
637
+ const resolvedModel = computed(() => resolveControlModel(options.model()));
638
+ const resolvedControls = computed(() => options.controls() ?? resolvedModel.value?.controls);
639
+ const resolvedControlOptions = computed(() => mergeControlWorkspaceOptions(resolvedModel.value?.controlOptions ?? {}, options.controlOptions()));
640
+ const externalControlValues = computed(() => options.modelValue() ?? options.values());
641
+ const internalControlValues = reactive({});
642
+ let syncingControlValues = false;
643
+ const generatedControlDefaults = computed(() => {
644
+ if (!resolvedControls.value) return {};
645
+ return {
646
+ ...getControlDefaults(resolvedControls.value),
647
+ ...resolvedControlOptions.value.initialValues ?? {}
648
+ };
649
+ });
650
+ function replaceControlValues(values) {
651
+ for (const key of Object.keys(internalControlValues)) if (!(key in values)) delete internalControlValues[key];
652
+ Object.assign(internalControlValues, values);
653
+ }
654
+ function emitControlValues() {
655
+ options.emitValues({ ...internalControlValues });
656
+ }
657
+ function syncResolvedControlValues() {
658
+ syncingControlValues = true;
659
+ replaceControlValues({
660
+ ...generatedControlDefaults.value,
661
+ ...externalControlValues.value === void 0 ? internalControlValues : externalControlValues.value
662
+ });
663
+ syncingControlValues = false;
664
+ }
665
+ function handleControlValuesUpdate(values) {
666
+ syncingControlValues = true;
667
+ replaceControlValues({
668
+ ...generatedControlDefaults.value,
669
+ ...values
670
+ });
671
+ syncingControlValues = false;
672
+ emitControlValues();
673
+ }
674
+ const resolvedComponentBindings = computed(() => controlValuesToComponentBindings(internalControlValues, options.componentBindings() ?? resolvedModel.value?.componentBindings));
675
+ const resolvedComponentBindingsById = computed(() => controlValuesToComponentBindingsById(internalControlValues, options.componentBindings() ?? resolvedModel.value?.componentBindings));
676
+ const resolvedComponentProps = computed(() => {
677
+ const mapping = options.componentProps() ?? resolvedModel.value?.componentProps;
678
+ return mapping === void 0 ? {} : controlValuesToComponentProps(internalControlValues, mapping);
679
+ });
680
+ const resolvedComponentPropsById = computed(() => {
681
+ const mappings = options.componentPropsById() ?? resolvedModel.value?.componentPropsById;
682
+ if (mappings === void 0) return {};
683
+ return Object.fromEntries(Object.entries(mappings).map(([id, mapping]) => [id, controlValuesToComponentProps(internalControlValues, mapping)]));
684
+ });
685
+ const generatedPillNav = computed(() => {
686
+ if (!resolvedControls.value) return [];
687
+ return controlsToViewItems(resolvedControls.value, resolvedControlOptions.value);
688
+ });
689
+ const generatedDefaultView = computed(() => {
690
+ if (!resolvedControls.value) return "";
691
+ return getDefaultControlView(resolvedControls.value, resolvedControlOptions.value);
692
+ });
693
+ syncResolvedControlValues();
694
+ watch([generatedControlDefaults, externalControlValues], syncResolvedControlValues, { deep: true });
695
+ watch(internalControlValues, () => {
696
+ if (syncingControlValues) return;
697
+ emitControlValues();
698
+ }, {
699
+ deep: true,
700
+ flush: "sync"
701
+ });
702
+ return {
703
+ resolvedModel,
704
+ resolvedControls,
705
+ resolvedControlOptions,
706
+ generatedPillNav,
707
+ generatedDefaultView,
708
+ internalControlValues,
709
+ resolvedComponentBindings,
710
+ resolvedComponentBindingsById,
711
+ resolvedComponentProps,
712
+ resolvedComponentPropsById,
713
+ handleControlValuesUpdate
714
+ };
715
+ }
716
+ //#endregion
717
+ //#region src/components/PluginWorkspaceView.navigation.ts
718
+ function usePluginWorkspaceNavigation(options) {
719
+ const internalActiveView = ref(options.defaultActiveView());
720
+ const resolvedPillNav = computed(() => {
721
+ if (options.pillNav() !== void 0) return options.pillNav();
722
+ return options.generatedPillNav.value.length > 0 ? [...options.generatedPillNav.value] : void 0;
723
+ });
724
+ const firstConfiguredViewId = computed(() => options.defaultActiveView() ?? firstItemId(options.pillNav()) ?? options.generatedDefaultView.value ?? firstItemId(options.pageSelector()) ?? options.panelIds()[0] ?? "");
725
+ const resolvedActiveView = computed({
726
+ get: () => options.activeView() ?? options.currentPillId() ?? options.currentPageSelectorId() ?? internalActiveView.value ?? firstConfiguredViewId.value,
727
+ set: (value) => {
728
+ internalActiveView.value = value;
729
+ options.emitActiveView(value);
730
+ }
731
+ });
732
+ const resolvedCurrentPillId = computed(() => options.currentPillId() ?? resolvedActiveView.value);
733
+ const resolvedCurrentPageSelectorId = computed(() => options.currentPageSelectorId() ?? resolvedActiveView.value);
734
+ function setActiveView(viewId) {
735
+ resolvedActiveView.value = viewId;
736
+ }
737
+ function handlePageSelectorSelect(page) {
738
+ setActiveView(page.id);
739
+ options.emitPageSelectorSelect(page);
740
+ }
741
+ function handlePillSelect(item) {
742
+ setActiveView(item.id);
743
+ options.emitPillSelect(item);
744
+ }
745
+ return {
746
+ resolvedPillNav,
747
+ firstConfiguredViewId,
748
+ resolvedActiveView,
749
+ resolvedCurrentPillId,
750
+ resolvedCurrentPageSelectorId,
751
+ setActiveView,
752
+ handlePageSelectorSelect,
753
+ handlePillSelect
754
+ };
755
+ }
756
+ function firstItemId(items) {
757
+ const item = items?.[0];
758
+ if (item === void 0) return void 0;
759
+ return typeof item === "string" ? item : item.id;
760
+ }
761
+ //#endregion
762
+ //#region src/components/PluginWorkspaceView.shell.ts
763
+ var topBarForwardedSlots = new Set([
764
+ "icon",
765
+ "logo",
766
+ "page-selector-icon",
767
+ "page-selector-item-icon",
768
+ "nav",
769
+ "center",
770
+ "actions",
771
+ "account-menu-items",
772
+ "account-menu-item-icon",
773
+ "settings-appearance"
774
+ ]);
775
+ var sidebarForwardedSlots = new Set([
776
+ "header",
777
+ "collapsed",
778
+ "collapsed-footer",
779
+ "footer"
536
780
  ]);
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));
781
+ function getPluginWorkspaceTopBarSlotNames(slots) {
782
+ return Object.keys(slots).filter((name) => topBarForwardedSlots.has(name) || name.startsWith("settings-tab-"));
541
783
  }
542
- function isActiveJobStatus(status) {
543
- return ACTIVE_JOB_STATUSES.has(status);
784
+ function getPluginWorkspaceSidebarSlotNames(slots) {
785
+ return Object.keys(slots).filter((name) => sidebarForwardedSlots.has(name) || name.startsWith("section-"));
544
786
  }
545
- function jobStatusLabel(status) {
787
+ function hasPluginWorkspaceSidebarSurface(options) {
788
+ if (!options.showSidebar) return false;
789
+ return Object.keys(options.panels).length > 0 || Object.keys(options.forms).length > 0 || options.model !== void 0 || options.controls !== void 0 || options.showSidebarWhenEmpty || options.sidebarContentId !== void 0 || options.sidebarTitle !== void 0 || options.sidebarSubtitle !== void 0 || options.sidebarBadge !== void 0 || options.hasSidebarSlot || options.sidebarSlotCount > 0;
790
+ }
791
+ //#endregion
792
+ //#region src/composables/usePluginWorkspace.ts
793
+ /**
794
+ * Maps PluginWorkspaceView's flat 72-prop surface into the three typed model objects
795
+ * (`shell`, `sidebar`, `controls`) rendered by its internal pieces
796
+ * (WorkspaceShellInternal, WorkspaceSidebarInternal, WorkspaceControlsInternal). Reuses the
797
+ * existing `usePluginWorkspaceControls` / `usePluginWorkspaceNavigation` composables and the
798
+ * PluginWorkspaceView.shell slot-detection helpers, so it changes only how that state is
799
+ * assembled and exposed, not the underlying behavior.
800
+ *
801
+ * @example Recommended
802
+ * ```ts
803
+ * const props = withDefaults(defineProps<PluginWorkspaceViewProps>(), { ... })
804
+ * const emit = defineEmits<PluginWorkspaceViewEmits>()
805
+ * const slots = useSlots()
806
+ * const { shell, sidebar, controls } = usePluginWorkspace({ props, slots, emit })
807
+ * ```
808
+ */
809
+ function usePluginWorkspace(options) {
810
+ const { props, slots, emit } = options;
811
+ const controlsState = usePluginWorkspaceControls({
812
+ model: () => props.model,
813
+ controls: () => props.controls,
814
+ controlOptions: () => props.controlOptions ?? {},
815
+ modelValue: () => props.modelValue,
816
+ values: () => props.values,
817
+ componentBindings: () => props.componentBindings,
818
+ componentProps: () => props.componentProps,
819
+ componentPropsById: () => props.componentPropsById,
820
+ emitValues: (values) => {
821
+ emit("update:modelValue", values);
822
+ emit("update:values", values);
823
+ }
824
+ });
825
+ const navigationState = usePluginWorkspaceNavigation({
826
+ activeView: () => props.activeView,
827
+ defaultActiveView: () => props.defaultActiveView,
828
+ currentPillId: () => props.currentPillId,
829
+ currentPageSelectorId: () => props.currentPageSelectorId,
830
+ pillNav: () => props.pillNav,
831
+ pageSelector: () => props.pageSelector,
832
+ panelIds: () => Object.keys(props.panels ?? {}),
833
+ generatedPillNav: controlsState.generatedPillNav,
834
+ generatedDefaultView: controlsState.generatedDefaultView,
835
+ emitActiveView: (viewId) => emit("update:activeView", viewId),
836
+ emitPageSelectorSelect: (page) => emit("page-selector-select", page),
837
+ emitPillSelect: (item) => emit("pill-select", item)
838
+ });
839
+ const topBarSlotNames = computed(() => getPluginWorkspaceTopBarSlotNames(slots));
840
+ const sidebarSlotNames = computed(() => getPluginWorkspaceSidebarSlotNames(slots));
841
+ const hasSidebarSurface = computed(() => hasPluginWorkspaceSidebarSurface({
842
+ showSidebar: props.showSidebar ?? true,
843
+ panels: props.panels ?? {},
844
+ forms: props.forms ?? {},
845
+ model: props.model,
846
+ controls: props.controls,
847
+ showSidebarWhenEmpty: props.showSidebarWhenEmpty ?? false,
848
+ sidebarContentId: props.sidebarContentId,
849
+ sidebarTitle: props.sidebarTitle,
850
+ sidebarSubtitle: props.sidebarSubtitle,
851
+ sidebarBadge: props.sidebarBadge,
852
+ hasSidebarSlot: Boolean(slots.sidebar),
853
+ sidebarSlotCount: sidebarSlotNames.value.length
854
+ }));
855
+ const controls = computed(() => ({
856
+ activeView: navigationState.resolvedActiveView.value,
857
+ setActiveView: navigationState.setActiveView,
858
+ values: controlsState.internalControlValues,
859
+ componentBindings: controlsState.resolvedComponentBindings.value,
860
+ componentBindingsById: controlsState.resolvedComponentBindingsById.value,
861
+ componentProps: controlsState.resolvedComponentProps.value,
862
+ componentPropsById: controlsState.resolvedComponentPropsById.value
863
+ }));
546
864
  return {
547
- awaiting_input: "Waiting for input",
548
- queued: "Queued",
549
- running: "Running",
550
- completed: "Completed",
551
- failed: "Failed",
552
- cancelled: "Cancelled"
553
- }[status];
865
+ shell: computed(() => ({
866
+ sidebarPosition: props.sidebarPosition ?? "left",
867
+ sidebarWidth: props.sidebarWidth,
868
+ floating: props.floating ?? true,
869
+ responsiveSidebar: props.responsiveSidebar ?? true,
870
+ sidebarToggleLabel: props.sidebarToggleLabel ?? "Open workspace sidebar",
871
+ sidebarCloseLabel: props.sidebarCloseLabel ?? "Close workspace sidebar",
872
+ hasSidebarSurface: hasSidebarSurface.value,
873
+ title: props.title ?? "Workspace",
874
+ subtitle: props.subtitle,
875
+ topBarVariant: props.topBarVariant ?? "card",
876
+ homePath: props.homePath ?? "/",
877
+ showLogo: props.showLogo ?? true,
878
+ pageSelector: props.pageSelector,
879
+ currentPageSelectorId: navigationState.resolvedCurrentPageSelectorId.value,
880
+ pluginSwitcher: props.pluginSwitcher,
881
+ pillNav: navigationState.resolvedPillNav.value,
882
+ currentPillId: navigationState.resolvedCurrentPillId.value,
883
+ showThemeToggle: props.showThemeToggle ?? true,
884
+ showSettings: props.showSettings ?? true,
885
+ settingsConfig: props.settingsConfig,
886
+ showStandaloneLabel: props.showStandaloneLabel ?? false,
887
+ standaloneLabel: props.standaloneLabel ?? "Standalone",
888
+ accountMenu: props.accountMenu,
889
+ showNotifications: props.showNotifications ?? false,
890
+ hasNotificationDot: props.hasNotificationDot ?? false,
891
+ showAdmin: props.showAdmin ?? false,
892
+ adminPath: props.adminPath ?? "/admin",
893
+ userName: props.userName,
894
+ userInitial: props.userInitial,
895
+ userEmail: props.userEmail,
896
+ topBarSlotNames: topBarSlotNames.value,
897
+ controls: controls.value
898
+ })),
899
+ sidebar: computed(() => ({
900
+ title: props.sidebarTitle,
901
+ subtitle: props.sidebarSubtitle,
902
+ badge: props.sidebarBadge,
903
+ variant: props.sidebarVariant ?? "analysis",
904
+ panels: props.panels ?? {},
905
+ activeView: navigationState.resolvedActiveView.value,
906
+ floating: false,
907
+ dense: props.dense ?? true,
908
+ width: props.sidebarWidth,
909
+ side: props.sidebarPosition ?? "left",
910
+ forms: props.forms ?? {},
911
+ contentId: props.sidebarContentId,
912
+ showWhenEmpty: (props.showSidebarWhenEmpty ?? false) || props.sidebarContentId !== void 0,
913
+ model: props.model,
914
+ controlSchema: props.controls,
915
+ controlOptions: props.controlOptions ?? {},
916
+ values: controlsState.internalControlValues,
917
+ formEnhancements: props.formEnhancements,
918
+ showFormActions: props.showFormActions ?? false,
919
+ formLoading: props.formLoading ?? false,
920
+ formDisabled: props.formDisabled ?? false,
921
+ formReadonly: props.formReadonly ?? false,
922
+ formSize: props.formSize ?? "sm",
923
+ collapsible: props.sidebarCollapsible,
924
+ collapsed: props.sidebarCollapsed,
925
+ defaultCollapsed: props.defaultSidebarCollapsed ?? false,
926
+ collapsedWidth: props.sidebarCollapsedWidth ?? "3rem",
927
+ collapseButtonLabel: props.sidebarCollapseButtonLabel ?? "Collapse sidebar",
928
+ expandButtonLabel: props.sidebarExpandButtonLabel ?? "Expand sidebar",
929
+ slotNames: sidebarSlotNames.value
930
+ })),
931
+ controls,
932
+ hasSidebarSurface,
933
+ handleControlValuesUpdate: controlsState.handleControlValuesUpdate,
934
+ handlePageSelectorSelect: navigationState.handlePageSelectorSelect,
935
+ handlePillSelect: navigationState.handlePillSelect
936
+ };
554
937
  }
555
938
  //#endregion
556
939
  //#region src/composables/useJobsStatusTray.ts
940
+ /**
941
+ * Combines independent job runtimes without copying their reactive state.
942
+ *
943
+ * Job ids must be globally unique across the sources. A duplicate id throws
944
+ * when jobs are read or an id-routed action is requested, rather than silently
945
+ * dispatching a mutation to the wrong owner.
946
+ */
947
+ function combinePluginJobSources(sources) {
948
+ const jobs = computed(() => {
949
+ const combined = [];
950
+ const owners = /* @__PURE__ */ new Set();
951
+ for (const source of sources) for (const job of toValue(source.jobs)) {
952
+ if (owners.has(job.job_id)) throw duplicatePluginJobId(job.job_id);
953
+ owners.add(job.job_id);
954
+ combined.push(job);
955
+ }
956
+ return combined;
957
+ });
958
+ function ownerFor(jobId) {
959
+ let owner;
960
+ for (const source of sources) {
961
+ if (!toValue(source.jobs).some((job) => job.job_id === jobId)) continue;
962
+ if (owner) throw duplicatePluginJobId(jobId);
963
+ owner = source;
964
+ }
965
+ if (!owner) throw new Error(`Unknown plugin job id: ${jobId}`);
966
+ return owner;
967
+ }
968
+ const combined = { jobs };
969
+ if (sources.some((source) => source.refreshJobs)) combined.refreshJobs = async () => {
970
+ await Promise.all(sources.map((source) => source.refreshJobs?.()));
971
+ return jobs.value;
972
+ };
973
+ if (sources.some((source) => source.cancelJob)) combined.cancelJob = async (jobId) => {
974
+ const owner = ownerFor(jobId);
975
+ if (!owner.cancelJob) throw new Error(`Job ${jobId} cannot be cancelled by its source`);
976
+ return owner.cancelJob(jobId);
977
+ };
978
+ if (sources.length > 0 && sources.every((source) => source.deleteJob)) combined.deleteJob = async (jobId) => {
979
+ const owner = ownerFor(jobId);
980
+ if (!owner.deleteJob) throw new Error(`Job ${jobId} cannot be deleted by its source`);
981
+ return owner.deleteJob(jobId);
982
+ };
983
+ if (sources.length > 0 && sources.every((source) => source.clearFinishedJobs)) combined.clearFinishedJobs = async () => {
984
+ const results = await Promise.all(sources.map((source) => source.clearFinishedJobs()));
985
+ return results.every((result) => typeof result === "number") ? results.reduce((total, result) => total + result, 0) : void 0;
986
+ };
987
+ if (sources.some((source) => source.dispose)) combined.dispose = () => {
988
+ const errors = [];
989
+ for (const source of sources) try {
990
+ source.dispose?.();
991
+ } catch (cause) {
992
+ errors.push(cause);
993
+ }
994
+ if (errors.length === 1) throw errors[0];
995
+ if (errors.length > 1) throw new PluginJobSourceDisposeError(errors);
996
+ };
997
+ return combined;
998
+ }
999
+ var PluginJobSourceDisposeError = class extends Error {
1000
+ cause;
1001
+ errors;
1002
+ constructor(errors) {
1003
+ super("Failed to dispose plugin job sources");
1004
+ this.name = "PluginJobSourceDisposeError";
1005
+ this.cause = errors[0];
1006
+ this.errors = Object.freeze([...errors]);
1007
+ }
1008
+ };
1009
+ function duplicatePluginJobId(jobId) {
1010
+ return /* @__PURE__ */ new Error(`Duplicate plugin job id across combined sources: ${jobId}`);
1011
+ }
1012
+ function responseJobs(response) {
1013
+ return "jobs" in response ? response.jobs : response;
1014
+ }
1015
+ function isSnapshotPayload(data) {
1016
+ return "jobs" in data && Array.isArray(data.jobs);
1017
+ }
557
1018
  function errorMessage(error, fallback) {
558
1019
  return error instanceof Error ? error.message : fallback;
559
1020
  }
@@ -564,38 +1025,94 @@ function errorMessage(error, fallback) {
564
1025
  * source. The controller never mirrors source jobs into another ref.
565
1026
  */
566
1027
  function usePluginJobCenter(options = {}) {
1028
+ const legacyOverride = shallowRef(null);
567
1029
  const isOpen = ref(false);
568
1030
  const activeTab = ref("active");
569
1031
  const isLoading = ref(false);
570
1032
  const error = shallowRef(null);
571
1033
  const pendingJobIds = ref(/* @__PURE__ */ new Set());
1034
+ const jobRevisions = /* @__PURE__ */ new Map();
1035
+ let stateRevision = 0;
572
1036
  let requestGeneration = 0;
573
1037
  let active = true;
574
1038
  const source = computed(() => toValue(options.source));
575
- const jobs = computed(() => source.value ? [...toValue(source.value.jobs)] : []);
1039
+ const adapter = computed(() => toValue(options.adapter));
1040
+ const jobs = computed(() => {
1041
+ const currentSource = source.value;
1042
+ if (currentSource) return [...toValue(currentSource.jobs)].map(normalizeJobState);
1043
+ const input = toValue(options.jobs);
1044
+ const override = legacyOverride.value;
1045
+ if (override && override.input === input) return override.jobs;
1046
+ return input ? [...input].map(normalizeJobState) : [];
1047
+ });
576
1048
  const activeJobs = computed(() => jobs.value.filter((job) => isActiveJobStatus(job.status)));
577
1049
  const historyJobs = computed(() => jobs.value.filter((job) => !isActiveJobStatus(job.status)));
578
1050
  const deletableJobs = computed(() => historyJobs.value.filter((job) => job.can_delete));
579
1051
  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));
1052
+ const canRefresh = computed(() => Boolean(source.value?.refreshJobs || adapter.value?.listJobs));
1053
+ const canCancel = computed(() => Boolean(source.value?.cancelJob || adapter.value?.cancelJob));
1054
+ const canDelete = computed(() => Boolean(source.value?.deleteJob || adapter.value?.deleteJob));
1055
+ const canClearFinished = computed(() => Boolean(source.value?.clearFinishedJobs || source.value?.deleteJob || adapter.value?.clearFinishedJobs || adapter.value?.deleteJob));
1056
+ function bumpJobRevision(jobId) {
1057
+ jobRevisions.set(jobId, (jobRevisions.get(jobId) ?? 0) + 1);
1058
+ }
1059
+ function replaceLegacyJobs(nextJobs) {
1060
+ const normalized = nextJobs.map(normalizeJobState);
1061
+ new Set([...jobs.value.map((job) => job.job_id), ...normalized.map((job) => job.job_id)]).forEach(bumpJobRevision);
1062
+ legacyOverride.value = {
1063
+ input: toValue(options.jobs),
1064
+ jobs: normalized
1065
+ };
1066
+ stateRevision += 1;
1067
+ }
1068
+ function upsertLegacyJob(nextJob) {
1069
+ const normalized = normalizeJobState(nextJob);
1070
+ const existingIndex = jobs.value.findIndex((job) => job.job_id === normalized.job_id);
1071
+ const nextJobs = [...jobs.value];
1072
+ if (existingIndex === -1) nextJobs.unshift(normalized);
1073
+ else nextJobs[existingIndex] = normalized;
1074
+ legacyOverride.value = {
1075
+ input: toValue(options.jobs),
1076
+ jobs: nextJobs
1077
+ };
1078
+ bumpJobRevision(normalized.job_id);
1079
+ stateRevision += 1;
1080
+ }
1081
+ function removeLegacyJobs(jobIds) {
1082
+ legacyOverride.value = {
1083
+ input: toValue(options.jobs),
1084
+ jobs: jobs.value.filter((job) => !jobIds.has(job.job_id))
1085
+ };
1086
+ jobIds.forEach(bumpJobRevision);
1087
+ stateRevision += 1;
1088
+ }
584
1089
  function setPending(jobId, pending) {
585
1090
  const next = new Set(pendingJobIds.value);
586
1091
  if (pending) next.add(jobId);
587
1092
  else next.delete(jobId);
588
1093
  pendingJobIds.value = next;
589
1094
  }
1095
+ function applyStreamMessage(message) {
1096
+ if (!active || source.value) return;
1097
+ if (message.event === "snapshot" && isSnapshotPayload(message.data)) {
1098
+ replaceLegacyJobs(message.data.jobs);
1099
+ return;
1100
+ }
1101
+ if ((message.event === "job" || message.event === "terminal") && !isSnapshotPayload(message.data)) upsertLegacyJob(message.data);
1102
+ }
590
1103
  async function refresh() {
591
- const refreshJobs = source.value?.refreshJobs;
592
- if (!refreshJobs) return false;
1104
+ const currentSource = source.value;
1105
+ const listJobs = currentSource?.refreshJobs ?? adapter.value?.listJobs;
1106
+ if (!listJobs) return false;
593
1107
  const generation = ++requestGeneration;
1108
+ const revision = stateRevision;
594
1109
  isLoading.value = true;
595
1110
  error.value = null;
596
1111
  try {
597
- await refreshJobs();
598
- return active && generation === requestGeneration;
1112
+ const response = await listJobs();
1113
+ if (!active || generation !== requestGeneration || revision !== stateRevision) return false;
1114
+ if (!currentSource && response) replaceLegacyJobs(responseJobs(response));
1115
+ return true;
599
1116
  } catch (cause) {
600
1117
  if (active && generation === requestGeneration) error.value = errorMessage(cause, "Failed to load jobs");
601
1118
  return false;
@@ -605,12 +1122,17 @@ function usePluginJobCenter(options = {}) {
605
1122
  }
606
1123
  async function cancelJob(job) {
607
1124
  const sourceCancel = source.value?.cancelJob;
608
- if (!job.can_cancel || !sourceCancel || pendingJobIds.value.has(job.job_id)) return false;
1125
+ const adapterCancel = adapter.value?.cancelJob;
1126
+ if (!job.can_cancel || !sourceCancel && !adapterCancel || pendingJobIds.value.has(job.job_id)) return false;
1127
+ const revision = jobRevisions.get(job.job_id) ?? 0;
609
1128
  setPending(job.job_id, true);
610
1129
  error.value = null;
611
1130
  try {
612
- await sourceCancel(job.job_id);
613
- return active;
1131
+ const updated = sourceCancel ? await sourceCancel(job.job_id) : await adapterCancel(job);
1132
+ if (!active) return false;
1133
+ if (!sourceCancel && revision === (jobRevisions.get(job.job_id) ?? 0)) if (updated) upsertLegacyJob(updated);
1134
+ else await refresh();
1135
+ return true;
614
1136
  } catch (cause) {
615
1137
  if (active) error.value = errorMessage(cause, "Failed to cancel job");
616
1138
  return false;
@@ -620,12 +1142,16 @@ function usePluginJobCenter(options = {}) {
620
1142
  }
621
1143
  async function deleteJob(job) {
622
1144
  const sourceDelete = source.value?.deleteJob;
623
- if (!job.can_delete || !sourceDelete || pendingJobIds.value.has(job.job_id)) return false;
1145
+ const adapterDelete = adapter.value?.deleteJob;
1146
+ if (!job.can_delete || !sourceDelete && !adapterDelete || pendingJobIds.value.has(job.job_id)) return false;
624
1147
  setPending(job.job_id, true);
625
1148
  error.value = null;
626
1149
  try {
627
- const deleted = await sourceDelete(job.job_id);
628
- return active && deleted !== false;
1150
+ const deleted = sourceDelete ? await sourceDelete(job.job_id) : await adapterDelete(job);
1151
+ if (!active) return false;
1152
+ if (!sourceDelete) if (deleted === false) await refresh();
1153
+ else removeLegacyJobs(new Set([job.job_id]));
1154
+ return deleted !== false;
629
1155
  } catch (cause) {
630
1156
  if (active) error.value = errorMessage(cause, "Failed to delete job");
631
1157
  return false;
@@ -645,12 +1171,30 @@ function usePluginJobCenter(options = {}) {
645
1171
  return typeof deleted !== "number" || deleted === targets.length;
646
1172
  }
647
1173
  if (currentSource?.deleteJob) return (await Promise.all(targets.map((job) => deleteJob(job)))).every(Boolean);
648
- return false;
1174
+ const currentAdapter = adapter.value;
1175
+ if (currentAdapter?.clearFinishedJobs) {
1176
+ const deleted = await currentAdapter.clearFinishedJobs(targets);
1177
+ if (!active) return false;
1178
+ if (typeof deleted === "number" && deleted !== targets.length) {
1179
+ await refresh();
1180
+ return false;
1181
+ }
1182
+ removeLegacyJobs(new Set(targets.map((job) => job.job_id)));
1183
+ return true;
1184
+ }
1185
+ if (!currentAdapter?.deleteJob) return false;
1186
+ return (await Promise.all(targets.map((job) => deleteJob(job)))).every(Boolean);
649
1187
  } catch (cause) {
650
1188
  if (active) error.value = errorMessage(cause, "Failed to clear jobs");
651
1189
  return false;
652
1190
  }
653
1191
  }
1192
+ if (options.eventStream !== void 0) watch(() => toValue(options.eventStream)?.lastMessage.value ?? null, (message) => {
1193
+ if (message) applyStreamMessage(message);
1194
+ }, { immediate: true });
1195
+ onMounted(() => {
1196
+ if (options.loadOnMount !== false) refresh();
1197
+ });
654
1198
  onUnmounted(() => {
655
1199
  active = false;
656
1200
  requestGeneration += 1;
@@ -680,12 +1224,17 @@ function usePluginJobCenter(options = {}) {
680
1224
  isOpen.value = !isOpen.value;
681
1225
  },
682
1226
  refresh,
1227
+ applyStreamMessage,
683
1228
  cancelJob,
684
1229
  deleteJob,
685
1230
  clearFinished,
686
1231
  isPending: (job) => pendingJobIds.value.has(job.job_id)
687
1232
  };
688
1233
  }
1234
+ /** @deprecated Use `usePluginJobCenter()` for the plugin job-center controller. */
1235
+ function useJobsStatusTray(options = {}) {
1236
+ return usePluginJobCenter(options);
1237
+ }
689
1238
  //#endregion
690
1239
  //#region src/composables/useDoseCalculator.ts
691
1240
  var VOLUME_UNITS = [
@@ -2129,9 +2678,6 @@ function splitByTokenLength(classes, tokenized) {
2129
2678
  }
2130
2679
  //#endregion
2131
2680
  //#region src/composables/experimentDesignData.ts
2132
- function isRecord(value) {
2133
- return value !== null && typeof value === "object" && !Array.isArray(value);
2134
- }
2135
2681
  function isPlatformDesignDataResponse(value) {
2136
2682
  return "data" in value && ("experiment_id" in value || "plugin_id" in value || "schema_version" in value || "updated_at" in value);
2137
2683
  }
@@ -2285,6 +2831,14 @@ function parseCSV(text) {
2285
2831
  //#endregion
2286
2832
  //#region src/composables/useAutoGroup.ts
2287
2833
  var STRUCTURED_MISSING_GROUP = "Outlier";
2834
+ var deprecationWarned = false;
2835
+ var outlierDeprecationWarned = false;
2836
+ function warnDeprecated(api) {
2837
+ if (deprecationWarned) return;
2838
+ if (typeof process !== "undefined" && process.env.NODE_ENV === "production") return;
2839
+ console.warn(`[useAutoGroup] ${api} is deprecated; use the new class-first API (setClassDisposition / toggleGroupBy / setValueOps).`);
2840
+ deprecationWarned = true;
2841
+ }
2288
2842
  function useAutoGroup() {
2289
2843
  const inputMode = ref("paste");
2290
2844
  const rawText = ref("");
@@ -2617,6 +3171,54 @@ function useAutoGroup() {
2617
3171
  document.body.removeChild(a);
2618
3172
  URL.revokeObjectURL(url);
2619
3173
  }
3174
+ /** Test seam — exposes the template content/filename without triggering a browser download. */
3175
+ function composeTemplateForTest(opts) {
3176
+ return composeTemplate(samples.value, opts.mode === "prefilled" ? Object.values(schemas.value) : null, opts.mode === "prefilled" ? classes.value : null, {
3177
+ ...opts,
3178
+ tokenizedSamples: tokenized.value
3179
+ });
3180
+ }
3181
+ const outliers = ref([]);
3182
+ const hasOutliers = computed(() => outliers.value.length > 0);
3183
+ const conformingSamples = computed(() => samples.value);
3184
+ const dominantFieldCount = computed(() => tokenized.value[0]?.length ?? 0);
3185
+ const minFieldCount = computed(() => {
3186
+ if (tokenized.value.length === 0) return 0;
3187
+ return Math.min(...tokenized.value.map((t) => t.length));
3188
+ });
3189
+ const fields = computed(() => activeSchema.value?.columns ?? []);
3190
+ const fieldNames = computed(() => {
3191
+ const out = {};
3192
+ for (const c of fields.value) out[c.index] = c.displayName ?? c.name;
3193
+ return out;
3194
+ });
3195
+ const enabledFields = computed(() => activeSchema.value ? new Set(activeSchema.value.groupBy) : /* @__PURE__ */ new Set());
3196
+ const effectiveColumns = fields;
3197
+ const allSingletons = computed(() => groups.value.length > 1 && groups.value.every((g) => g.samples.length === 1));
3198
+ function setOutlierAction(_, __) {
3199
+ if (!outlierDeprecationWarned) {
3200
+ if (typeof process === "undefined" || process.env.NODE_ENV !== "production") {
3201
+ console.warn("[useAutoGroup] setOutlierAction is deprecated AND inactive in the class-first redesign. Use setClassDisposition('iqc' | 'eqc' | …, 'group' | 'overlay' | 'exclude') instead.");
3202
+ outlierDeprecationWarned = true;
3203
+ }
3204
+ }
3205
+ }
3206
+ function setAllOutlierActions(__) {
3207
+ if (!outlierDeprecationWarned) {
3208
+ if (typeof process === "undefined" || process.env.NODE_ENV !== "production") {
3209
+ console.warn("[useAutoGroup] setAllOutlierActions is deprecated AND inactive in the class-first redesign. Use setClassDisposition('iqc' | 'eqc' | …, 'group' | 'overlay' | 'exclude') instead.");
3210
+ outlierDeprecationWarned = true;
3211
+ }
3212
+ }
3213
+ }
3214
+ function toggleField(index) {
3215
+ warnDeprecated("toggleField");
3216
+ if (activeClassKey.value) toggleGroupBy(activeClassKey.value, index);
3217
+ }
3218
+ function renameField(index, name) {
3219
+ warnDeprecated("renameField");
3220
+ if (activeClassKey.value) setColumnName(activeClassKey.value, index, name);
3221
+ }
2620
3222
  function loadExperimentData(rawData, options = {}) {
2621
3223
  const parsed = extractSamplesFromDesignData(rawData, options);
2622
3224
  if (!parsed) return false;
@@ -2633,6 +3235,7 @@ function useAutoGroup() {
2633
3235
  schemas.value = {};
2634
3236
  activeClassKey.value = "";
2635
3237
  tokenized.value = [];
3238
+ outliers.value = [];
2636
3239
  sampleTypeHints.value = [];
2637
3240
  }
2638
3241
  return {
@@ -2644,6 +3247,8 @@ function useAutoGroup() {
2644
3247
  schemas,
2645
3248
  activeClassKey,
2646
3249
  delimiter,
3250
+ dominantFieldCount,
3251
+ minFieldCount,
2647
3252
  samples,
2648
3253
  tokenized,
2649
3254
  activeSchema,
@@ -2654,6 +3259,14 @@ function useAutoGroup() {
2654
3259
  excludedSamples,
2655
3260
  result,
2656
3261
  fingerprint,
3262
+ fields,
3263
+ fieldNames,
3264
+ enabledFields,
3265
+ effectiveColumns,
3266
+ hasOutliers,
3267
+ outliers,
3268
+ conformingSamples,
3269
+ allSingletons,
2657
3270
  canDownloadTemplate,
2658
3271
  setClassDisposition,
2659
3272
  setClassDispositions,
@@ -2669,8 +3282,13 @@ function useAutoGroup() {
2669
3282
  loadFingerprint,
2670
3283
  parseInput,
2671
3284
  downloadTemplate,
3285
+ composeTemplateForTest,
2672
3286
  loadExperimentData,
2673
- reset
3287
+ reset,
3288
+ setOutlierAction,
3289
+ setAllOutlierActions,
3290
+ toggleField,
3291
+ renameField
2674
3292
  };
2675
3293
  }
2676
3294
  function extractSamplesFromDesignData(rawData, options = {}) {
@@ -3818,6 +4436,57 @@ function useBioTemplateComponents(target) {
3818
4436
  };
3819
4437
  }
3820
4438
  //#endregion
4439
+ //#region src/composables/flattenWorkspaceBindings.ts
4440
+ /**
4441
+ * Pick the shared template-component binding keys off a resolved bio-template workspace
4442
+ * (or its `components` source directly), so composables that build on `useBioTemplateWorkspace`
4443
+ * spread one object instead of re-listing all 9 keys by hand.
4444
+ *
4445
+ * @example Recommended
4446
+ * ```ts
4447
+ * const bindings = { renderer, ...flattenWorkspaceComponentBindings(components) }
4448
+ * ```
4449
+ */
4450
+ function flattenWorkspaceComponentBindings(source) {
4451
+ return {
4452
+ componentBindings: source.componentBindings,
4453
+ componentBindingsById: source.componentBindingsById,
4454
+ componentImports: source.componentImports,
4455
+ componentProps: source.componentProps,
4456
+ componentPropsById: source.componentPropsById,
4457
+ componentPropsByComponent: source.componentPropsByComponent,
4458
+ componentSnippets: source.componentSnippets,
4459
+ componentUsage: source.componentUsage,
4460
+ getComponentProps: source.getComponentProps
4461
+ };
4462
+ }
4463
+ /**
4464
+ * `computed()`-lifted version of {@link flattenWorkspaceComponentBindings} for composables
4465
+ * that hold their resolved workspace behind a `ComputedRef` (e.g. a regenerated workspace
4466
+ * swapped in via `shallowRef`/`effectScope`), so each key stays independently reactive
4467
+ * instead of forcing consumers to unwrap the whole workspace to read one field.
4468
+ * `getComponentProps` stays a plain callable function, matching the un-lifted composables.
4469
+ *
4470
+ * @example Recommended
4471
+ * ```ts
4472
+ * const workspace = computed(() => workspaceRef.value)
4473
+ * const { componentBindings, componentProps, getComponentProps } = liftWorkspaceComponentBindings(workspace)
4474
+ * ```
4475
+ */
4476
+ function liftWorkspaceComponentBindings(workspace) {
4477
+ return {
4478
+ componentBindings: computed(() => workspace.value.componentBindings),
4479
+ componentBindingsById: computed(() => workspace.value.componentBindingsById),
4480
+ componentImports: computed(() => workspace.value.componentImports),
4481
+ componentProps: computed(() => workspace.value.componentProps),
4482
+ componentPropsById: computed(() => workspace.value.componentPropsById),
4483
+ componentPropsByComponent: computed(() => workspace.value.componentPropsByComponent),
4484
+ componentSnippets: computed(() => workspace.value.componentSnippets),
4485
+ componentUsage: computed(() => workspace.value.componentUsage),
4486
+ getComponentProps: (component, options) => workspace.value.getComponentProps(component, options)
4487
+ };
4488
+ }
4489
+ //#endregion
3821
4490
  //#region src/composables/useBioTemplateWorkspace.ts
3822
4491
  /** One-stop wiring for BioTemplateRenderer, FormBuilder, AppSidebar, and template-aware SDK components. */
3823
4492
  function useBioTemplateWorkspace(target, options = {}) {
@@ -3825,21 +4494,25 @@ function useBioTemplateWorkspace(target, options = {}) {
3825
4494
  const workspace = useControlWorkspace(controls.controls, options);
3826
4495
  const components = useBioTemplateComponents(target);
3827
4496
  const renderer = isTemplateObjectTarget(target) ? { target } : null;
3828
- const bindings = {
3829
- renderer,
3830
- form: workspace.bindings.form,
3831
- sidebar: workspace.bindings.sidebar,
3832
- topBar: workspace.bindings.topBar,
3833
- topBarSettings: workspace.bindings.topBarSettings,
3834
- pillNav: workspace.bindings.pillNav,
4497
+ const componentBindings = flattenWorkspaceComponentBindings({
3835
4498
  componentBindings: components.bindings,
3836
4499
  componentBindingsById: components.componentBindingsById,
4500
+ componentImports: components.imports,
3837
4501
  componentProps: components.componentProps,
3838
4502
  componentPropsById: components.componentPropsById,
3839
4503
  componentPropsByComponent: components.componentPropsByComponent,
3840
4504
  componentSnippets: components.snippets,
3841
4505
  componentUsage: components.usage,
3842
4506
  getComponentProps: components.getComponentProps
4507
+ });
4508
+ const bindings = {
4509
+ renderer,
4510
+ form: workspace.bindings.form,
4511
+ sidebar: workspace.bindings.sidebar,
4512
+ topBar: workspace.bindings.topBar,
4513
+ topBarSettings: workspace.bindings.topBarSettings,
4514
+ pillNav: workspace.bindings.pillNav,
4515
+ ...componentBindings
3843
4516
  };
3844
4517
  return {
3845
4518
  target,
@@ -3856,15 +4529,7 @@ function useBioTemplateWorkspace(target, options = {}) {
3856
4529
  topBarSettings: workspace.topBarSettings,
3857
4530
  bindings,
3858
4531
  renderer,
3859
- componentBindings: components.bindings,
3860
- componentBindingsById: components.componentBindingsById,
3861
- componentImports: components.imports,
3862
- componentProps: components.componentProps,
3863
- componentPropsById: components.componentPropsById,
3864
- componentPropsByComponent: components.componentPropsByComponent,
3865
- componentSnippets: components.snippets,
3866
- componentUsage: components.usage,
3867
- getComponentProps: components.getComponentProps
4532
+ ...componentBindings
3868
4533
  };
3869
4534
  }
3870
4535
  function isTemplateObjectTarget(target) {
@@ -3905,14 +4570,7 @@ function useBioTemplatePackWorkspace(packId, options = {}) {
3905
4570
  const pillNav = computed(() => workspace.value.pillNav);
3906
4571
  const topBarSettings = computed(() => workspace.value.topBarSettings);
3907
4572
  const bindings = computed(() => workspace.value.bindings);
3908
- const componentBindings = computed(() => workspace.value.componentBindings);
3909
- const componentBindingsById = computed(() => workspace.value.componentBindingsById);
3910
- const componentImports = computed(() => workspace.value.componentImports);
3911
- const componentProps = computed(() => workspace.value.componentProps);
3912
- const componentPropsById = computed(() => workspace.value.componentPropsById);
3913
- const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent);
3914
- const componentSnippets = computed(() => workspace.value.componentSnippets);
3915
- const componentUsage = computed(() => workspace.value.componentUsage);
4573
+ const { componentBindings, componentBindingsById, componentImports, componentProps, componentPropsById, componentPropsByComponent, componentSnippets, componentUsage, getComponentProps: getWorkspaceComponentProps } = liftWorkspaceComponentBindings(workspace);
3916
4574
  watch(collection, (value) => {
3917
4575
  workspaceRef.value = createWorkspace(value);
3918
4576
  });
@@ -3955,7 +4613,7 @@ function useBioTemplatePackWorkspace(packId, options = {}) {
3955
4613
  componentPropsByComponent,
3956
4614
  componentSnippets,
3957
4615
  componentUsage,
3958
- getComponentProps: (component, options) => workspace.value.getComponentProps(component, options),
4616
+ getComponentProps: getWorkspaceComponentProps,
3959
4617
  applyCollection,
3960
4618
  resetToDefaultCollection,
3961
4619
  save: templateCollection.save,
@@ -3986,14 +4644,7 @@ function useBioTemplatePresetWorkspace(presetId, options = {}) {
3986
4644
  const collection = templateCollection.templateCollection;
3987
4645
  const workspace = computed(() => useBioTemplateWorkspace(collection.value, resolvedControlOptions));
3988
4646
  const renderer = computed(() => ({ target: collection.value }));
3989
- const componentBindings = computed(() => workspace.value.componentBindings);
3990
- const componentBindingsById = computed(() => workspace.value.componentBindingsById);
3991
- const componentImports = computed(() => workspace.value.componentImports);
3992
- const componentProps = computed(() => workspace.value.componentProps);
3993
- const componentPropsById = computed(() => workspace.value.componentPropsById);
3994
- const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent);
3995
- const componentSnippets = computed(() => workspace.value.componentSnippets);
3996
- const componentUsage = computed(() => workspace.value.componentUsage);
4647
+ const { componentBindings, componentBindingsById, componentImports, componentProps, componentPropsById, componentPropsByComponent, componentSnippets, componentUsage, getComponentProps } = liftWorkspaceComponentBindings(workspace);
3997
4648
  const form = reactive({
3998
4649
  ...controls.form,
3999
4650
  modelValue: controlValues.value,
@@ -4026,9 +4677,6 @@ function useBioTemplatePresetWorkspace(presetId, options = {}) {
4026
4677
  onPillSelect: pillNav.onSelect,
4027
4678
  ...topBarSettings
4028
4679
  }));
4029
- function getComponentProps(component, options) {
4030
- return workspace.value.getComponentProps(component, options);
4031
- }
4032
4680
  const bindings = {
4033
4681
  renderer,
4034
4682
  form,
@@ -4147,6 +4795,328 @@ function mergeInitialValues(controlOptions, initialValues) {
4147
4795
  };
4148
4796
  }
4149
4797
  //#endregion
4798
+ //#region src/composables/useRackEditor.ts
4799
+ var SLOT_CYCLE = [
4800
+ "R",
4801
+ "G",
4802
+ "B",
4803
+ "Y"
4804
+ ];
4805
+ var PLATE_CONFIGS = {
4806
+ 6: {
4807
+ rows: 2,
4808
+ cols: 3
4809
+ },
4810
+ 12: {
4811
+ rows: 3,
4812
+ cols: 4
4813
+ },
4814
+ 24: {
4815
+ rows: 4,
4816
+ cols: 6
4817
+ },
4818
+ 48: {
4819
+ rows: 6,
4820
+ cols: 8
4821
+ },
4822
+ 54: {
4823
+ rows: 6,
4824
+ cols: 9
4825
+ },
4826
+ 96: {
4827
+ rows: 8,
4828
+ cols: 12
4829
+ },
4830
+ 384: {
4831
+ rows: 16,
4832
+ cols: 24
4833
+ }
4834
+ };
4835
+ var globalIdCounter = 0;
4836
+ function generateId() {
4837
+ globalIdCounter++;
4838
+ return `rack-${Date.now()}-${globalIdCounter}`;
4839
+ }
4840
+ /** Manages a set of sample racks with well-level assignment, series fill, and multi-rack reordering. */
4841
+ function useRackEditor(initialRacks, options) {
4842
+ const defaultFormat = options?.defaultFormat ?? 54;
4843
+ const defaultInjVol = options?.defaultInjectionVolume ?? 5;
4844
+ const maxRacks = options?.maxRacks ?? 10;
4845
+ const minRacks = options?.minRacks ?? 1;
4846
+ function createDefaultRack(name, slotIndex) {
4847
+ const slot = SLOT_CYCLE[(slotIndex ?? 0) % SLOT_CYCLE.length];
4848
+ return {
4849
+ id: generateId(),
4850
+ name: name ?? `Rack ${racks.value.length + 1}`,
4851
+ format: defaultFormat,
4852
+ slot,
4853
+ injectionVolume: defaultInjVol,
4854
+ wells: {}
4855
+ };
4856
+ }
4857
+ const racks = ref(initialRacks && initialRacks.length > 0 ? initialRacks.map((r) => ({ ...r })) : [createDefaultRack("Rack 1", 0)]);
4858
+ const activeRackId = ref(racks.value[0]?.id ?? "");
4859
+ const activeRack = computed(() => racks.value.find((r) => r.id === activeRackId.value) ?? racks.value[0]);
4860
+ function addRack(name) {
4861
+ if (racks.value.length >= maxRacks) return racks.value[racks.value.length - 1];
4862
+ const rack = createDefaultRack(name, racks.value.length);
4863
+ racks.value.push(rack);
4864
+ activeRackId.value = rack.id;
4865
+ return rack;
4866
+ }
4867
+ function removeRack(rackId) {
4868
+ if (racks.value.length <= minRacks) return;
4869
+ const index = racks.value.findIndex((r) => r.id === rackId);
4870
+ if (index === -1) return;
4871
+ racks.value.splice(index, 1);
4872
+ if (activeRackId.value === rackId && racks.value[0]) activeRackId.value = racks.value[0].id;
4873
+ }
4874
+ function reorderRacks(fromIndex, toIndex) {
4875
+ if (fromIndex < 0 || fromIndex >= racks.value.length) return;
4876
+ if (toIndex < 0 || toIndex >= racks.value.length) return;
4877
+ if (fromIndex === toIndex) return;
4878
+ const [moved] = racks.value.splice(fromIndex, 1);
4879
+ if (moved) racks.value.splice(toIndex, 0, moved);
4880
+ }
4881
+ function updateRack(rackId, data) {
4882
+ const rack = racks.value.find((r) => r.id === rackId);
4883
+ if (!rack) return;
4884
+ if (data.name !== void 0) rack.name = data.name;
4885
+ if (data.format !== void 0) rack.format = data.format;
4886
+ if (data.slot !== void 0) rack.slot = data.slot;
4887
+ if (data.injectionVolume !== void 0) rack.injectionVolume = data.injectionVolume;
4888
+ if (data.wells !== void 0) rack.wells = data.wells;
4889
+ }
4890
+ function setActiveRack(rackId) {
4891
+ if (racks.value.some((r) => r.id === rackId)) activeRackId.value = rackId;
4892
+ }
4893
+ function setWellData(rackId, wellId, data) {
4894
+ const rack = racks.value.find((r) => r.id === rackId);
4895
+ if (!rack) return;
4896
+ rack.wells[wellId] = {
4897
+ ...rack.wells[wellId],
4898
+ ...data
4899
+ };
4900
+ }
4901
+ function clearWell(rackId, wellId) {
4902
+ const rack = racks.value.find((r) => r.id === rackId);
4903
+ if (!rack) return;
4904
+ delete rack.wells[wellId];
4905
+ }
4906
+ function clearAllWells(rackId) {
4907
+ const rack = racks.value.find((r) => r.id === rackId);
4908
+ if (!rack) return;
4909
+ rack.wells = {};
4910
+ }
4911
+ function fillSeries(rackId, prefix = "S") {
4912
+ const rack = racks.value.find((r) => r.id === rackId);
4913
+ if (!rack) return;
4914
+ const config = PLATE_CONFIGS[rack.format];
4915
+ if (!config) return;
4916
+ let counter = 1;
4917
+ for (let row = 0; row < config.rows; row++) for (let col = 0; col < config.cols; col++) {
4918
+ const wellId = `${String.fromCharCode(65 + row)}${col + 1}`;
4919
+ if (!rack.wells[wellId]?.sampleType) {
4920
+ const paddedNum = String(counter).padStart(3, "0");
4921
+ rack.wells[wellId] = {
4922
+ id: wellId,
4923
+ row,
4924
+ col,
4925
+ state: "filled",
4926
+ sampleType: "sample",
4927
+ metadata: {
4928
+ label: `${prefix}${paddedNum}`,
4929
+ injectionVolume: rack.injectionVolume,
4930
+ injectionCount: 1
4931
+ }
4932
+ };
4933
+ }
4934
+ counter++;
4935
+ }
4936
+ }
4937
+ function getAllWells() {
4938
+ const result = [];
4939
+ for (const rack of racks.value) for (const [wellId, well] of Object.entries(rack.wells)) result.push({
4940
+ rackId: rack.id,
4941
+ wellId,
4942
+ well
4943
+ });
4944
+ return result;
4945
+ }
4946
+ const totalSampleCount = computed(() => {
4947
+ let count = 0;
4948
+ for (const rack of racks.value) count += Object.keys(rack.wells).length;
4949
+ return count;
4950
+ });
4951
+ function reset() {
4952
+ const rack = createDefaultRack("Rack 1", 0);
4953
+ racks.value = [rack];
4954
+ activeRackId.value = rack.id;
4955
+ }
4956
+ return {
4957
+ racks,
4958
+ activeRack,
4959
+ activeRackId,
4960
+ addRack,
4961
+ removeRack,
4962
+ reorderRacks,
4963
+ updateRack,
4964
+ setActiveRack,
4965
+ setWellData,
4966
+ clearWell,
4967
+ clearAllWells,
4968
+ fillSeries,
4969
+ getAllWells,
4970
+ totalSampleCount,
4971
+ reset
4972
+ };
4973
+ }
4974
+ //#endregion
4975
+ //#region src/composables/useGroupAssignment.ts
4976
+ /** Shared two-zone group assignment model for control/treatment style workflows. */
4977
+ function useGroupAssignment(options) {
4978
+ const groups = computed(() => [...toValue(options.groups)]);
4979
+ const group1 = computed(() => [...toValue(options.group1)]);
4980
+ const group2 = computed(() => [...toValue(options.group2)]);
4981
+ const label1 = computed(() => toValue(options.label1) || "Control");
4982
+ const label2 = computed(() => toValue(options.label2) || "Treatment");
4983
+ const minPerGroup = computed(() => normalizeMinimum(toValue(options.minPerGroup)));
4984
+ const group1Set = computed(() => new Set(group1.value));
4985
+ const group2Set = computed(() => new Set(group2.value));
4986
+ const unassignedGroups = computed(() => groups.value.filter((group) => !group1Set.value.has(group.name) && !group2Set.value.has(group.name)));
4987
+ const zone1Groups = computed(() => groups.value.filter((group) => group1Set.value.has(group.name)));
4988
+ const zone2Groups = computed(() => groups.value.filter((group) => group2Set.value.has(group.name)));
4989
+ const zone1Count = computed(() => zone1Groups.value.reduce((sum, group) => sum + group.count, 0));
4990
+ const zone2Count = computed(() => zone2Groups.value.reduce((sum, group) => sum + group.count, 0));
4991
+ const isValid = computed(() => group1.value.length >= minPerGroup.value && group2.value.length >= minPerGroup.value);
4992
+ const validationMessage = computed(() => {
4993
+ if (isValid.value) return null;
4994
+ const missing1 = Math.max(0, minPerGroup.value - group1.value.length);
4995
+ const missing2 = Math.max(0, minPerGroup.value - group2.value.length);
4996
+ const parts = [];
4997
+ if (missing1 > 0) parts.push(`${missing1} more to ${label1.value}`);
4998
+ if (missing2 > 0) parts.push(`${missing2} more to ${label2.value}`);
4999
+ return `Add ${parts.join(" and ")}`;
5000
+ });
5001
+ function getZoneForGroup(groupName) {
5002
+ if (group1Set.value.has(groupName)) return "zone1";
5003
+ if (group2Set.value.has(groupName)) return "zone2";
5004
+ return null;
5005
+ }
5006
+ function assignToZone(groupName, zone) {
5007
+ const next = removeFromBoth(groupName);
5008
+ if (zone === "zone1") return {
5009
+ group1: [...next.group1, groupName],
5010
+ group2: next.group2
5011
+ };
5012
+ return {
5013
+ group1: next.group1,
5014
+ group2: [...next.group2, groupName]
5015
+ };
5016
+ }
5017
+ function removeFromZone(groupName, zone) {
5018
+ if (zone === "zone1") return {
5019
+ group1: group1.value.filter((name) => name !== groupName),
5020
+ group2: group2.value
5021
+ };
5022
+ return {
5023
+ group1: group1.value,
5024
+ group2: group2.value.filter((name) => name !== groupName)
5025
+ };
5026
+ }
5027
+ function clearAll() {
5028
+ return {
5029
+ group1: [],
5030
+ group2: []
5031
+ };
5032
+ }
5033
+ function removeFromBoth(groupName) {
5034
+ return {
5035
+ group1: group1.value.filter((name) => name !== groupName),
5036
+ group2: group2.value.filter((name) => name !== groupName)
5037
+ };
5038
+ }
5039
+ return {
5040
+ unassignedGroups,
5041
+ zone1Groups,
5042
+ zone2Groups,
5043
+ zone1Count,
5044
+ zone2Count,
5045
+ isValid,
5046
+ validationMessage,
5047
+ getZoneForGroup,
5048
+ assignToZone,
5049
+ removeFromZone,
5050
+ clearAll
5051
+ };
5052
+ }
5053
+ function normalizeMinimum(value) {
5054
+ if (value === null || value === void 0 || !Number.isFinite(value)) return 1;
5055
+ return Math.max(0, Math.floor(value));
5056
+ }
5057
+ //#endregion
5058
+ //#region src/composables/useReagentSeries.ts
5059
+ var DEFAULT_PRESETS = [
5060
+ {
5061
+ label: "2x",
5062
+ factor: 2
5063
+ },
5064
+ {
5065
+ label: "3x",
5066
+ factor: 3
5067
+ },
5068
+ {
5069
+ label: "½ log",
5070
+ factor: "half-log"
5071
+ },
5072
+ {
5073
+ label: "10x",
5074
+ factor: 10
5075
+ }
5076
+ ];
5077
+ var DEFAULT_UNITS = [
5078
+ "µM",
5079
+ "nM",
5080
+ "mM",
5081
+ "pM"
5082
+ ];
5083
+ function resolveFactor(factor) {
5084
+ return factor === "half-log" ? Math.sqrt(10) : factor;
5085
+ }
5086
+ function roundToSignificant(value, digits = 4) {
5087
+ if (value === 0) return 0;
5088
+ const magnitude = Math.floor(Math.log10(Math.abs(value))) + 1;
5089
+ const factor = Math.pow(10, digits - magnitude);
5090
+ return Math.round(value * factor) / factor;
5091
+ }
5092
+ function generateDilutionSeries(startConcentration, count, factor, defaultReplicates = 1) {
5093
+ if (count < 1 || startConcentration <= 0) return [];
5094
+ const divisor = resolveFactor(factor);
5095
+ const levels = [];
5096
+ for (let i = 0; i < count; i++) levels.push({
5097
+ value: roundToSignificant(startConcentration / Math.pow(divisor, i)),
5098
+ replicates: defaultReplicates
5099
+ });
5100
+ return levels;
5101
+ }
5102
+ /** Generates and sorts geometric dilution series (2x, 3x, ½ log, 10x) for plate-based experiments. */
5103
+ function useReagentSeries() {
5104
+ function generateSeries(start, count, factor, defaultReplicates = 1) {
5105
+ return generateDilutionSeries(start, count, factor, defaultReplicates);
5106
+ }
5107
+ function sortLevels(levels, order = "desc") {
5108
+ return [...levels].sort((a, b) => order === "desc" ? b.value - a.value : a.value - b.value);
5109
+ }
5110
+ function totalPositions(levels) {
5111
+ return levels.reduce((sum, l) => sum + l.replicates, 0);
5112
+ }
5113
+ return {
5114
+ generateSeries,
5115
+ sortLevels,
5116
+ totalPositions
5117
+ };
5118
+ }
5119
+ //#endregion
4150
5120
  //#region src/composables/protocolTemplateCatalog.ts
4151
5121
  var BUILT_IN_PROTOCOL_TEMPLATES = [
4152
5122
  {
@@ -4609,4 +5579,6 @@ function useProtocolTemplates() {
4609
5579
  };
4610
5580
  }
4611
5581
  //#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 };
5582
+ export { useTheme as $, useFileImport as A, useDoseCalculator as B, getSampleGroupParentPath as C, detectDelimiter as D, hslToHex as E, extractSampleNamesFromDesignData as F, DEFAULT_MOBILE_VIEWPORT_QUERY as G, useJobsStatusTray as H, extractSampleOptionsFromDesignData as I, useAppExperiment as J, useMobileSupportGate as K, unwrapExperimentDesignData as L, extractSamplesFromDesignData as M, useAutoGroup as N, parseDelimitedText as O, parseCSV as P, usePresenceHeartbeat as Q, DEFAULT_COLORS as R, getSampleGroupMajorPrefix as S, hexToHsl as T, usePluginJobCenter as U, combinePluginJobSources as V, usePluginWorkspace as W, useRuntimeAlignment as X, getInjectedFrontendRevision as Y, getPresenceClientId as Z, useScheduleDrag as _, useReagentSeries as a, useSortedItems as at, useExpansionSet as b, useBioTemplatePresetWorkspace as c, getBioTemplateComponentProps as d, useToast as et, toBioTemplateComponentPropsByComponent as f, useExperimentSave as g, useTemplateCollection as h, generateDilutionSeries as i, compareSortValues as it, validateImportFile as j, readFileAsText as k, useBioTemplatePackWorkspace as l, useBioTemplateControls as m, DEFAULT_PRESETS as n, normalizeSearchQuery as nt, useGroupAssignment as o, useMenuKeyboard as ot, useBioTemplateComponents as p, APP_EXPERIMENT_KEY as q, DEFAULT_UNITS as r, useTextSearch as rt, useRackEditor as s, useRovingFocus as st, useProtocolTemplates as t, candidateMatchesSearch as tt, useBioTemplateWorkspace as u, useExperimentSamples as v, deriveShade as w, useSampleGroups as x, useExperimentData as y, useWellPlateEditor as z };
5583
+
5584
+ //# sourceMappingURL=useProtocolTemplates-Dq5Pzwyd.js.map