@morscherlab/mint-sdk 1.0.0-rc.2 → 1.0.0-rc.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 (443) hide show
  1. package/dist/__tests__/components/AppTopBar.navigation.test.d.ts +1 -0
  2. package/dist/__tests__/components/DoseCalculatorVolumeField.test.d.ts +1 -0
  3. package/dist/__tests__/components/PlateMapEditorToolbarInternal.test.d.ts +1 -0
  4. package/dist/__tests__/components/PluginWorkspaceView.controls.test.d.ts +1 -0
  5. package/dist/__tests__/components/PluginWorkspaceView.navigation.test.d.ts +1 -0
  6. package/dist/__tests__/components/PluginWorkspaceView.shell.test.d.ts +1 -0
  7. package/dist/__tests__/components/ProtocolStep.presentation.test.d.ts +1 -0
  8. package/dist/__tests__/components/ProtocolStepEditor.state.test.d.ts +1 -0
  9. package/dist/__tests__/components/ProtocolStepParameterField.test.d.ts +1 -0
  10. package/dist/__tests__/components/ReagentList.presentation.test.d.ts +1 -0
  11. package/dist/__tests__/components/SampleSelector.colors.test.d.ts +1 -0
  12. package/dist/__tests__/components/SampleSelector.drag.test.d.ts +1 -0
  13. package/dist/__tests__/components/SampleSelector.groups.test.d.ts +1 -0
  14. package/dist/__tests__/components/SampleSelector.selection.test.d.ts +1 -0
  15. package/dist/__tests__/components/SampleSelectorSampleRow.test.d.ts +1 -0
  16. package/dist/__tests__/components/ScheduleCalendar.test.d.ts +1 -0
  17. package/dist/__tests__/components/SettingsModal.schema.test.d.ts +1 -0
  18. package/dist/__tests__/components/WellPlate.colors.test.d.ts +1 -0
  19. package/dist/__tests__/components/WellPlate.conditions.test.d.ts +1 -0
  20. package/dist/__tests__/components/WellPlate.geometry.test.d.ts +1 -0
  21. package/dist/__tests__/components/WellPlate.interaction.test.d.ts +1 -0
  22. package/dist/__tests__/components/WellPlate.legend.test.d.ts +1 -0
  23. package/dist/__tests__/components/WellPlate.rendering.test.d.ts +1 -0
  24. package/dist/__tests__/components/WellPlate.sampleDrop.test.d.ts +1 -0
  25. package/dist/__tests__/composables/autoGroup/classify.test.d.ts +1 -0
  26. package/dist/__tests__/composables/autoGroup/columns.test.d.ts +1 -0
  27. package/dist/__tests__/composables/autoGroup/compose.test.d.ts +1 -0
  28. package/dist/__tests__/composables/autoGroup/cooccurrence.test.d.ts +1 -0
  29. package/dist/__tests__/composables/autoGroup/fingerprint.test.d.ts +1 -0
  30. package/dist/__tests__/composables/autoGroup/integration.test.d.ts +1 -0
  31. package/dist/__tests__/composables/autoGroup/template.test.d.ts +1 -0
  32. package/dist/__tests__/composables/autoGroup/tokenize.test.d.ts +1 -0
  33. package/dist/__tests__/composables/useAutoGroupInputSources.test.d.ts +1 -0
  34. package/dist/__tests__/composables/useScheduleCalendarLayout.test.d.ts +1 -0
  35. package/dist/__tests__/docs/extractDocsComponents.test.d.ts +1 -0
  36. package/dist/__tests__/docs/extractDocsExports.test.d.ts +1 -0
  37. package/dist/__tests__/docs/extractDocsParsing.test.d.ts +1 -0
  38. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +1 -0
  39. package/dist/__tests__/docs/extractDocsTheme.test.d.ts +1 -0
  40. package/dist/components/AppTopBar.navigation.d.ts +11 -0
  41. package/dist/components/BaseButton.vue.d.ts +1 -1
  42. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  43. package/dist/components/BaseInput.vue.d.ts +2 -2
  44. package/dist/components/BasePill.vue.d.ts +1 -1
  45. package/dist/components/BaseRadioGroup.vue.d.ts +1 -1
  46. package/dist/components/BaseSelect.vue.d.ts +1 -1
  47. package/dist/components/BaseSlider.vue.d.ts +2 -2
  48. package/dist/components/BaseTextarea.vue.d.ts +2 -2
  49. package/dist/components/BaseToggle.vue.d.ts +1 -1
  50. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  51. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +1 -1
  52. package/dist/components/ColorSlider.vue.d.ts +2 -2
  53. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  54. package/dist/components/DatePicker.vue.d.ts +1 -1
  55. package/dist/components/DateTimePicker.vue.d.ts +2 -2
  56. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +15 -0
  57. package/dist/components/DropdownButton.vue.d.ts +1 -1
  58. package/dist/components/FileUploader.vue.d.ts +2 -2
  59. package/dist/components/FormulaInput.vue.d.ts +2 -2
  60. package/dist/components/IconButton.vue.d.ts +1 -1
  61. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  62. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  63. package/dist/components/MultiSelect.vue.d.ts +1 -1
  64. package/dist/components/NumberInput.vue.d.ts +1 -1
  65. package/dist/components/PlateMapEditor.vue.d.ts +6 -6
  66. package/dist/components/PluginWorkspaceView.controls.d.ts +28 -0
  67. package/dist/components/PluginWorkspaceView.navigation.d.ts +29 -0
  68. package/dist/components/PluginWorkspaceView.props.d.ts +151 -0
  69. package/dist/components/PluginWorkspaceView.shell.d.ts +19 -0
  70. package/dist/components/PluginWorkspaceView.vue.d.ts +46 -195
  71. package/dist/components/ProgressBar.vue.d.ts +1 -1
  72. package/dist/components/ProtocolStep.presentation.d.ts +4 -0
  73. package/dist/components/ProtocolStepEditor.state.d.ts +18 -0
  74. package/dist/components/ProtocolStepParameterField.vue.d.ts +12 -0
  75. package/dist/components/ReagentList.presentation.d.ts +16 -0
  76. package/dist/components/ResourceCard.vue.d.ts +1 -1
  77. package/dist/components/SampleSelector.colors.d.ts +13 -0
  78. package/dist/components/SampleSelector.drag.d.ts +24 -0
  79. package/dist/components/SampleSelector.groups.d.ts +15 -0
  80. package/dist/components/SampleSelector.selection.d.ts +26 -0
  81. package/dist/components/SampleSelector.vue.d.ts +4 -1
  82. package/dist/components/SampleSelectorSampleRow.vue.d.ts +21 -0
  83. package/dist/components/SegmentedControl.vue.d.ts +1 -1
  84. package/dist/components/SequenceInput.vue.d.ts +2 -2
  85. package/dist/components/SequenceProgressBar.vue.d.ts +1 -1
  86. package/dist/components/SettingsModal.schema.d.ts +9 -0
  87. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  88. package/dist/components/TagsInput.vue.d.ts +2 -2
  89. package/dist/components/TimePicker.vue.d.ts +2 -2
  90. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  91. package/dist/components/UnitInput.vue.d.ts +2 -2
  92. package/dist/components/WellPlate.colors.d.ts +9 -0
  93. package/dist/components/WellPlate.conditions.d.ts +26 -0
  94. package/dist/components/WellPlate.geometry.d.ts +23 -0
  95. package/dist/components/WellPlate.interaction.d.ts +71 -0
  96. package/dist/components/WellPlate.legend.d.ts +2 -0
  97. package/dist/components/WellPlate.rendering.d.ts +24 -0
  98. package/dist/components/WellPlate.sampleDrop.d.ts +8 -0
  99. package/dist/components/WellPlate.vue.d.ts +1 -1
  100. package/dist/components/index.js +2 -2
  101. package/dist/components/internal/ActionItemInternal.vue.d.ts +1 -1
  102. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +28 -0
  103. package/dist/{components-BhK-dW99.js → components-DtHA2bgp.js} +3754 -2991
  104. package/dist/components-DtHA2bgp.js.map +1 -0
  105. package/dist/composables/autoGroup/classKey.d.ts +4 -0
  106. package/dist/composables/autoGroup/classify.d.ts +28 -0
  107. package/dist/composables/autoGroup/colors.d.ts +2 -0
  108. package/dist/composables/autoGroup/columns.d.ts +10 -0
  109. package/dist/composables/autoGroup/compose.d.ts +8 -0
  110. package/dist/composables/autoGroup/cooccurrence.d.ts +2 -0
  111. package/dist/composables/autoGroup/csv-shim.d.ts +2 -0
  112. package/dist/composables/autoGroup/fingerprint.d.ts +3 -0
  113. package/dist/composables/autoGroup/index.d.ts +16 -0
  114. package/dist/composables/autoGroup/replicatePreGroup.d.ts +38 -0
  115. package/dist/composables/autoGroup/template.d.ts +15 -0
  116. package/dist/composables/autoGroup/tokenize.d.ts +8 -0
  117. package/dist/composables/autoGroupConstants.d.ts +1 -0
  118. package/dist/composables/autoGroupGrouping.d.ts +3 -0
  119. package/dist/composables/controlComponentBindings.d.ts +7 -0
  120. package/dist/composables/controlSchemaAdapters.d.ts +20 -0
  121. package/dist/composables/controlSchemaDoseDesign.d.ts +11 -0
  122. package/dist/composables/controlSchemaFormFields.d.ts +3 -0
  123. package/dist/composables/controlSchemaLayout.d.ts +7 -0
  124. package/dist/composables/controlSchemaModel.d.ts +5 -0
  125. package/dist/composables/controlSchemaNormalize.d.ts +15 -0
  126. package/dist/composables/controlSchemaTypes.d.ts +305 -0
  127. package/dist/composables/controlSchemaUtils.d.ts +9 -0
  128. package/dist/composables/controlWorkspaceOptions.d.ts +2 -0
  129. package/dist/composables/formBuilderSchema.d.ts +18 -0
  130. package/dist/composables/index.js +3 -3
  131. package/dist/composables/pluginEndpointBuilder.d.ts +13 -0
  132. package/dist/composables/protocolTemplateCatalog.d.ts +26 -0
  133. package/dist/composables/useAutoGroup.d.ts +61 -74
  134. package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
  135. package/dist/composables/useBioTemplateControls.d.ts +1 -1
  136. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +1 -1
  137. package/dist/composables/useBioTemplateWorkspace.d.ts +1 -1
  138. package/dist/composables/useControlSchema.d.ts +8 -346
  139. package/dist/composables/useControlWorkspace.d.ts +5 -0
  140. package/dist/composables/useForm.d.ts +2 -33
  141. package/dist/composables/useFormBuilder.d.ts +2 -9
  142. package/dist/composables/useFormValidation.d.ts +34 -0
  143. package/dist/composables/usePluginClient.d.ts +1 -4
  144. package/dist/composables/useProtocolTemplates.d.ts +2 -24
  145. package/dist/composables/useScheduleCalendarLayout.d.ts +49 -0
  146. package/dist/{composables-Bg7CFuNz.js → composables-Dlg8jenH.js} +33 -31
  147. package/dist/composables-Dlg8jenH.js.map +1 -0
  148. package/dist/index.js +4 -4
  149. package/dist/install.js +2 -2
  150. package/dist/styles.css +547 -516
  151. package/dist/templates/adapters.d.ts +14 -47
  152. package/dist/templates/assayLookups.d.ts +3 -0
  153. package/dist/templates/assayMatrixAdapters.d.ts +6 -0
  154. package/dist/templates/assayMatrixBuilder.d.ts +2 -0
  155. package/dist/templates/assayNormalizers.d.ts +4 -0
  156. package/dist/templates/builderDefaults.d.ts +1 -0
  157. package/dist/templates/builderIdUtils.d.ts +4 -0
  158. package/dist/templates/builderPresetControls.d.ts +10 -0
  159. package/dist/templates/builderReadUtils.d.ts +8 -0
  160. package/dist/templates/builders.d.ts +26 -67
  161. package/dist/templates/calibrationCurveAdapters.d.ts +4 -0
  162. package/dist/templates/calibrationCurveBuilder.d.ts +2 -0
  163. package/dist/templates/calibrationNormalizers.d.ts +5 -0
  164. package/dist/templates/componentBindingCatalog.d.ts +25 -0
  165. package/dist/templates/componentBindingHelpers.d.ts +17 -0
  166. package/dist/templates/componentDoseResponseProps.d.ts +3 -0
  167. package/dist/templates/componentGenericProps.d.ts +8 -0
  168. package/dist/templates/componentPlateHelpers.d.ts +5 -0
  169. package/dist/templates/componentPlateMapProps.d.ts +3 -0
  170. package/dist/templates/componentPropsFactory.d.ts +3 -0
  171. package/dist/templates/componentQpcrPlateProps.d.ts +3 -0
  172. package/dist/templates/componentTargetResolvers.d.ts +5 -0
  173. package/dist/templates/componentTemplateProps.d.ts +3 -0
  174. package/dist/templates/controlSchemaClone.d.ts +4 -0
  175. package/dist/templates/controlSchemaConstants.d.ts +10 -0
  176. package/dist/templates/controlSchemaMerge.d.ts +3 -0
  177. package/dist/templates/controlSchemaTargets.d.ts +17 -0
  178. package/dist/templates/controlSchemaTypes.d.ts +4 -0
  179. package/dist/templates/controlSchemas.d.ts +4 -4
  180. package/dist/templates/defaultBioTemplateBuilder.d.ts +2 -0
  181. package/dist/templates/doseResponseAdapters.d.ts +4 -0
  182. package/dist/templates/doseResponseBuilder.d.ts +2 -0
  183. package/dist/templates/elisaAssayCollectionBuilder.d.ts +2 -0
  184. package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +2 -0
  185. package/dist/templates/flowCytometryPanelBuilder.d.ts +2 -0
  186. package/dist/templates/flowNormalizers.d.ts +8 -0
  187. package/dist/templates/flowPanelAdapters.d.ts +4 -0
  188. package/dist/templates/index.js +1 -1
  189. package/dist/templates/instrumentRunAdapterHelpers.d.ts +8 -0
  190. package/dist/templates/instrumentRunAdapters.d.ts +8 -0
  191. package/dist/templates/instrumentRunBuilder.d.ts +2 -0
  192. package/dist/templates/lcmsBatchCollectionBuilder.d.ts +2 -0
  193. package/dist/templates/plateGeometry.d.ts +4 -0
  194. package/dist/templates/plateMapAdapters.d.ts +3 -0
  195. package/dist/templates/plateMapBuilder.d.ts +2 -0
  196. package/dist/templates/presetControlSchemas.d.ts +534 -0
  197. package/dist/templates/protocolAdapters.d.ts +5 -0
  198. package/dist/templates/protocolNormalizers.d.ts +6 -0
  199. package/dist/templates/protocolStepsBuilder.d.ts +2 -0
  200. package/dist/templates/qpcrAdapters.d.ts +5 -0
  201. package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +2 -0
  202. package/dist/templates/qpcrPlateBuilder.d.ts +2 -0
  203. package/dist/templates/reagentAdapters.d.ts +5 -0
  204. package/dist/templates/reagentListBuilder.d.ts +2 -0
  205. package/dist/templates/runNormalizers.d.ts +10 -0
  206. package/dist/templates/sampleNormalizers.d.ts +4 -0
  207. package/dist/templates/samplePrepAdapters.d.ts +4 -0
  208. package/dist/templates/samplePrepBuilder.d.ts +2 -0
  209. package/dist/templates/sampleSheetAdapters.d.ts +5 -0
  210. package/dist/templates/sampleSheetBuilder.d.ts +2 -0
  211. package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +2 -0
  212. package/dist/templates/targetedMetabolomicsHelpers.d.ts +5 -0
  213. package/dist/templates/templateAdapterTypes.d.ts +48 -0
  214. package/dist/templates/templateControlSchemas.d.ts +400 -0
  215. package/dist/templates/templateCreateOptions.d.ts +165 -0
  216. package/dist/templates/templateEnvelopes.d.ts +9 -0
  217. package/dist/templates/templatePackCollectionBuilder.d.ts +2 -0
  218. package/dist/templates/templatePresetCollectionBuilder.d.ts +18 -0
  219. package/dist/templates/templateQpcrTypes.d.ts +42 -0
  220. package/dist/templates/templateValidators.d.ts +13 -0
  221. package/dist/templates/timeCourseAdapters.d.ts +5 -0
  222. package/dist/templates/timeCourseBuilder.d.ts +2 -0
  223. package/dist/templates/types.d.ts +5 -250
  224. package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +2 -0
  225. package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +2 -0
  226. package/dist/{templates-BorLR_7p.js → templates-DtdUvJ4c.js} +3565 -3411
  227. package/dist/templates-DtdUvJ4c.js.map +1 -0
  228. package/dist/types/auto-group.d.ts +79 -9
  229. package/dist/types/componentLabTypes.d.ts +161 -0
  230. package/dist/types/componentWorkflowTypes.d.ts +150 -0
  231. package/dist/types/components.d.ts +2 -311
  232. package/dist/{useProtocolTemplates-n6AJqSqv.js → useProtocolTemplates-Bm5vyH4_.js} +1220 -454
  233. package/dist/useProtocolTemplates-Bm5vyH4_.js.map +1 -0
  234. package/package.json +1 -1
  235. package/src/__tests__/components/AppTopBar.navigation.test.ts +70 -0
  236. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
  237. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
  238. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
  239. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
  240. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +41 -0
  241. package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
  242. package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
  243. package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
  244. package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
  245. package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
  246. package/src/__tests__/components/SampleSelector.drag.test.ts +100 -0
  247. package/src/__tests__/components/SampleSelector.groups.test.ts +81 -0
  248. package/src/__tests__/components/SampleSelector.selection.test.ts +70 -0
  249. package/src/__tests__/components/SampleSelector.test.ts +32 -0
  250. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +37 -0
  251. package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
  252. package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
  253. package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
  254. package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
  255. package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
  256. package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
  257. package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
  258. package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
  259. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
  260. package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
  261. package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
  262. package/src/__tests__/composables/autoGroup/compose.test.ts +227 -0
  263. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
  264. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +50 -0
  265. package/src/__tests__/composables/autoGroup/integration.test.ts +79 -0
  266. package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
  267. package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
  268. package/src/__tests__/composables/useAutoGroup.test.ts +129 -625
  269. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +107 -0
  270. package/src/__tests__/composables/useControlSchema.test.ts +23 -0
  271. package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
  272. package/src/__tests__/docs/extractDocsComponents.test.ts +142 -0
  273. package/src/__tests__/docs/extractDocsExports.test.ts +77 -0
  274. package/src/__tests__/docs/extractDocsParsing.test.ts +69 -0
  275. package/src/__tests__/docs/extractDocsTemplates.test.ts +54 -0
  276. package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
  277. package/src/__tests__/docs/frontendDocsCatalog.test.ts +1 -1
  278. package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
  279. package/src/components/AppSidebar.vue +2 -6
  280. package/src/components/AppTopBar.navigation.ts +62 -0
  281. package/src/components/AppTopBar.vue +17 -44
  282. package/src/components/AutoGroupModal.story.vue +50 -0
  283. package/src/components/AutoGroupModal.vue +441 -158
  284. package/src/components/ControlWorkspaceView.vue +2 -6
  285. package/src/components/DoseCalculator.vue +13 -73
  286. package/src/components/DoseCalculatorVolumeField.vue +61 -0
  287. package/src/components/ExperimentTimeline.vue +6 -31
  288. package/src/components/FormBuilder.vue +2 -7
  289. package/src/components/PlateMapEditor.vue +32 -106
  290. package/src/components/PluginWorkspaceView.controls.ts +182 -0
  291. package/src/components/PluginWorkspaceView.navigation.ts +106 -0
  292. package/src/components/PluginWorkspaceView.props.ts +174 -0
  293. package/src/components/PluginWorkspaceView.shell.ts +66 -0
  294. package/src/components/PluginWorkspaceView.vue +85 -404
  295. package/src/components/ProtocolStep.presentation.ts +31 -0
  296. package/src/components/ProtocolStepEditor.state.ts +104 -0
  297. package/src/components/ProtocolStepEditor.vue +48 -179
  298. package/src/components/ProtocolStepParameterField.vue +134 -0
  299. package/src/components/ReagentList.presentation.ts +105 -0
  300. package/src/components/ReagentList.vue +16 -79
  301. package/src/components/SampleSelector.colors.ts +43 -0
  302. package/src/components/SampleSelector.drag.ts +164 -0
  303. package/src/components/SampleSelector.groups.ts +109 -0
  304. package/src/components/SampleSelector.selection.ts +103 -0
  305. package/src/components/SampleSelector.vue +82 -349
  306. package/src/components/SampleSelectorSampleRow.vue +64 -0
  307. package/src/components/ScheduleCalendar.vue +44 -199
  308. package/src/components/SettingsModal.schema.ts +71 -0
  309. package/src/components/SettingsModal.vue +16 -46
  310. package/src/components/WellPlate.colors.ts +56 -0
  311. package/src/components/WellPlate.conditions.ts +100 -0
  312. package/src/components/WellPlate.geometry.ts +91 -0
  313. package/src/components/WellPlate.interaction.ts +272 -0
  314. package/src/components/WellPlate.legend.ts +8 -0
  315. package/src/components/WellPlate.rendering.ts +105 -0
  316. package/src/components/WellPlate.sampleDrop.ts +73 -0
  317. package/src/components/WellPlate.vue +102 -550
  318. package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
  319. package/src/composables/autoGroup/classKey.ts +5 -0
  320. package/src/composables/autoGroup/classify.ts +205 -0
  321. package/src/composables/autoGroup/colors.ts +6 -0
  322. package/src/composables/autoGroup/columns.ts +226 -0
  323. package/src/composables/autoGroup/compose.ts +156 -0
  324. package/src/composables/autoGroup/cooccurrence.ts +46 -0
  325. package/src/composables/autoGroup/csv-shim.ts +44 -0
  326. package/src/composables/autoGroup/fingerprint.ts +49 -0
  327. package/src/composables/autoGroup/index.ts +20 -0
  328. package/src/composables/autoGroup/replicatePreGroup.ts +90 -0
  329. package/src/composables/autoGroup/template.ts +126 -0
  330. package/src/composables/autoGroup/tokenize.ts +41 -0
  331. package/src/composables/autoGroup/vocab.json +67 -0
  332. package/src/composables/autoGroupConstants.ts +4 -0
  333. package/src/composables/autoGroupGrouping.ts +148 -0
  334. package/src/composables/controlComponentBindings.ts +80 -0
  335. package/src/composables/controlSchemaAdapters.ts +196 -0
  336. package/src/composables/controlSchemaDoseDesign.ts +215 -0
  337. package/src/composables/controlSchemaFormFields.ts +61 -0
  338. package/src/composables/controlSchemaLayout.ts +59 -0
  339. package/src/composables/controlSchemaModel.ts +163 -0
  340. package/src/composables/controlSchemaNormalize.ts +101 -0
  341. package/src/composables/controlSchemaTypes.ts +364 -0
  342. package/src/composables/controlSchemaUtils.ts +36 -0
  343. package/src/composables/controlWorkspaceOptions.ts +21 -0
  344. package/src/composables/formBuilderSchema.ts +153 -0
  345. package/src/composables/pluginEndpointBuilder.ts +203 -0
  346. package/src/composables/protocolTemplateCatalog.ts +325 -0
  347. package/src/composables/useAutoGroup.ts +395 -549
  348. package/src/composables/useAutoGroupInputSources.ts +147 -0
  349. package/src/composables/useBioTemplateControls.ts +1 -1
  350. package/src/composables/useBioTemplatePresetWorkspace.ts +1 -1
  351. package/src/composables/useBioTemplateWorkspace.ts +1 -1
  352. package/src/composables/useControlSchema.ts +64 -1312
  353. package/src/composables/useControlWorkspace.ts +201 -0
  354. package/src/composables/useForm.ts +5 -187
  355. package/src/composables/useFormBuilder.ts +11 -153
  356. package/src/composables/useFormValidation.ts +154 -0
  357. package/src/composables/usePluginClient.ts +10 -193
  358. package/src/composables/useProtocolTemplates.ts +10 -328
  359. package/src/composables/useScheduleCalendarLayout.ts +287 -0
  360. package/src/styles/components/auto-group-modal.css +248 -310
  361. package/src/templates/adapters.ts +89 -930
  362. package/src/templates/assayLookups.ts +33 -0
  363. package/src/templates/assayMatrixAdapters.ts +78 -0
  364. package/src/templates/assayMatrixBuilder.ts +59 -0
  365. package/src/templates/assayNormalizers.ts +34 -0
  366. package/src/templates/builderDefaults.ts +11 -0
  367. package/src/templates/builderIdUtils.ts +20 -0
  368. package/src/templates/builderPresetControls.ts +165 -0
  369. package/src/templates/builderReadUtils.ts +57 -0
  370. package/src/templates/builders.ts +122 -2350
  371. package/src/templates/calibrationCurveAdapters.ts +59 -0
  372. package/src/templates/calibrationCurveBuilder.ts +99 -0
  373. package/src/templates/calibrationNormalizers.ts +60 -0
  374. package/src/templates/componentBindingCatalog.ts +90 -0
  375. package/src/templates/componentBindingHelpers.ts +93 -0
  376. package/src/templates/componentBindings.ts +12 -461
  377. package/src/templates/componentDoseResponseProps.ts +42 -0
  378. package/src/templates/componentGenericProps.ts +77 -0
  379. package/src/templates/componentPlateHelpers.ts +29 -0
  380. package/src/templates/componentPlateMapProps.ts +32 -0
  381. package/src/templates/componentPropsFactory.ts +21 -0
  382. package/src/templates/componentQpcrPlateProps.ts +28 -0
  383. package/src/templates/componentTargetResolvers.ts +69 -0
  384. package/src/templates/componentTemplateProps.ts +78 -0
  385. package/src/templates/controlSchemaClone.ts +32 -0
  386. package/src/templates/controlSchemaConstants.ts +11 -0
  387. package/src/templates/controlSchemaMerge.ts +40 -0
  388. package/src/templates/controlSchemaTargets.ts +87 -0
  389. package/src/templates/controlSchemaTypes.ts +20 -0
  390. package/src/templates/controlSchemas.ts +22 -704
  391. package/src/templates/defaultBioTemplateBuilder.ts +124 -0
  392. package/src/templates/doseResponseAdapters.ts +45 -0
  393. package/src/templates/doseResponseBuilder.ts +44 -0
  394. package/src/templates/elisaAssayCollectionBuilder.ts +62 -0
  395. package/src/templates/flowCytometryAssayCollectionBuilder.ts +41 -0
  396. package/src/templates/flowCytometryPanelBuilder.ts +53 -0
  397. package/src/templates/flowNormalizers.ts +58 -0
  398. package/src/templates/flowPanelAdapters.ts +58 -0
  399. package/src/templates/instrumentRunAdapterHelpers.ts +94 -0
  400. package/src/templates/instrumentRunAdapters.ts +163 -0
  401. package/src/templates/instrumentRunBuilder.ts +97 -0
  402. package/src/templates/lcmsBatchCollectionBuilder.ts +38 -0
  403. package/src/templates/plateGeometry.ts +62 -0
  404. package/src/templates/plateMapAdapters.ts +36 -0
  405. package/src/templates/plateMapBuilder.ts +43 -0
  406. package/src/templates/presetControlSchemas.ts +258 -0
  407. package/src/templates/protocolAdapters.ts +69 -0
  408. package/src/templates/protocolNormalizers.ts +37 -0
  409. package/src/templates/protocolStepsBuilder.ts +36 -0
  410. package/src/templates/qpcrAdapters.ts +104 -0
  411. package/src/templates/qpcrExpressionCollectionBuilder.ts +33 -0
  412. package/src/templates/qpcrPlateBuilder.ts +96 -0
  413. package/src/templates/reagentAdapters.ts +77 -0
  414. package/src/templates/reagentListBuilder.ts +30 -0
  415. package/src/templates/runNormalizers.ts +63 -0
  416. package/src/templates/sampleNormalizers.ts +58 -0
  417. package/src/templates/samplePrepAdapters.ts +63 -0
  418. package/src/templates/samplePrepBuilder.ts +51 -0
  419. package/src/templates/sampleSheetAdapters.ts +75 -0
  420. package/src/templates/sampleSheetBuilder.ts +23 -0
  421. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +79 -0
  422. package/src/templates/targetedMetabolomicsHelpers.ts +102 -0
  423. package/src/templates/templateAdapterTypes.ts +58 -0
  424. package/src/templates/templateControlSchemas.ts +320 -0
  425. package/src/templates/templateCreateOptions.ts +208 -0
  426. package/src/templates/templateEnvelopes.ts +137 -0
  427. package/src/templates/templatePackCollectionBuilder.ts +23 -0
  428. package/src/templates/templatePresetCollectionBuilder.ts +139 -0
  429. package/src/templates/templateQpcrTypes.ts +48 -0
  430. package/src/templates/templateValidators.ts +414 -0
  431. package/src/templates/timeCourseAdapters.ts +73 -0
  432. package/src/templates/timeCourseBuilder.ts +64 -0
  433. package/src/templates/types.ts +79 -275
  434. package/src/templates/wellPlateScreenCollectionBuilder.ts +36 -0
  435. package/src/templates/westernBlotAssayCollectionBuilder.ts +68 -0
  436. package/src/types/auto-group.ts +107 -9
  437. package/src/types/componentLabTypes.ts +235 -0
  438. package/src/types/componentWorkflowTypes.ts +190 -0
  439. package/src/types/components.ts +74 -424
  440. package/dist/components-BhK-dW99.js.map +0 -1
  441. package/dist/composables-Bg7CFuNz.js.map +0 -1
  442. package/dist/templates-BorLR_7p.js.map +0 -1
  443. package/dist/useProtocolTemplates-n6AJqSqv.js.map +0 -1
@@ -1,191 +1,32 @@
1
1
  <script setup lang="ts">
2
2
  /** Standard plugin workspace shell that combines AppLayout, AppTopBar, and AppSidebar with LEAF-style defaults. */
3
- import { computed, reactive, ref, useSlots, watch } from 'vue'
3
+ import { computed, useSlots } from 'vue'
4
4
  import type {
5
5
  AccountMenuItem,
6
6
  ExperimentSummary,
7
7
  PageSelectorItem,
8
- PageSelectorItemInput,
9
8
  PillNavItem,
10
- PillNavItemInput,
11
- PluginSwitcherInfo,
12
9
  PluginSwitcherPlugin,
13
- SidebarToolSection,
14
- TopBarSettingsConfig,
15
10
  PillNavOption,
16
- TopBarVariant,
17
11
  } from '../types'
18
- import type { FormEnhancements, FormSchema } from '../types/form-builder'
19
- import type {
20
- ControlComponentBinding,
21
- ControlComponentBindingsById,
22
- ControlComponentBindingsConfig,
23
- ControlComponentPropsByIdMap,
24
- ControlComponentPropsMap,
25
- ControlModel,
26
- ControlModelBinding,
27
- ControlSchema,
28
- ControlWorkspaceOptions,
29
- } from '../composables/useControlSchema'
30
- import {
31
- controlValuesToComponentBindings,
32
- controlValuesToComponentBindingsById,
33
- controlValuesToComponentProps,
34
- controlsToViewItems,
35
- defineControlModel,
36
- getDefaultControlView,
37
- getControlDefaults,
38
- mergeControlWorkspaceOptions,
39
- } from '../composables/useControlSchema'
40
- import {
41
- useAppExperiment,
42
- type AppExperimentRecord,
43
- } from '../composables/useAppExperiment'
12
+ import { useAppExperiment } from '../composables/useAppExperiment'
44
13
  import AppLayout from './AppLayout.vue'
45
14
  import AppSidebar from './AppSidebar.vue'
46
15
  import AppTopBar from './AppTopBar.vue'
16
+ import { usePluginWorkspaceControls } from './PluginWorkspaceView.controls'
17
+ import { usePluginWorkspaceNavigation } from './PluginWorkspaceView.navigation'
18
+ import {
19
+ getPluginWorkspaceSidebarSlotNames,
20
+ getPluginWorkspaceTopBarSlotNames,
21
+ hasPluginWorkspaceSidebarSurface,
22
+ } from './PluginWorkspaceView.shell'
23
+ import type {
24
+ PluginWorkspaceForwardedSlotProps,
25
+ PluginWorkspaceSlotProps,
26
+ PluginWorkspaceViewProps,
27
+ } from './PluginWorkspaceView.props'
47
28
 
48
- type SidebarVariant = 'default' | 'analysis'
49
-
50
- interface Props {
51
- /** App or plugin title shown in the top bar. */
52
- title?: string
53
- /** Secondary copy shown under the title. */
54
- subtitle?: string
55
- /** Top bar visual treatment. */
56
- topBarVariant?: TopBarVariant
57
- /** Home link used by the top bar brand icon. */
58
- homePath?: string
59
- /** Show the default MINT logo when no icon/logo slot is provided. */
60
- showLogo?: boolean
61
- /** Preferred route-level page selector entries. */
62
- pageSelector?: PageSelectorItemInput[]
63
- /** Active page selector id. Defaults to activeView. */
64
- currentPageSelectorId?: string
65
- /** Optional plugin switcher shown in the left navigation position. */
66
- pluginSwitcher?: PluginSwitcherInfo
67
- /** Preferred centered navigation for local modes inside the current route. */
68
- pillNav?: PillNavItemInput[]
69
- /** Active centered pill id. Defaults to activeView. */
70
- currentPillId?: string
71
- /** Show the theme toggle button. */
72
- showThemeToggle?: boolean
73
- /** Show the settings button and modal. */
74
- showSettings?: boolean
75
- /** Built-in settings modal configuration. */
76
- settingsConfig?: TopBarSettingsConfig
77
- /** Show the standalone badge when not integrated into the platform. */
78
- showStandaloneLabel?: boolean
79
- /** Custom standalone badge label. */
80
- standaloneLabel?: string
81
- /** Account dropdown entries. */
82
- accountMenu?: AccountMenuItem[]
83
- /** Show the notifications icon button. */
84
- showNotifications?: boolean
85
- /** Draw a notification dot on the notifications icon. */
86
- hasNotificationDot?: boolean
87
- /** Show the classic admin shortcut. */
88
- showAdmin?: boolean
89
- /** Route used by the classic admin shortcut. */
90
- adminPath?: string
91
- /** Show the classic profile button when accountMenu is not provided. */
92
- showProfile?: boolean
93
- /** Classic profile display name. */
94
- userName?: string
95
- /** Explicit classic profile initial. */
96
- userInitial?: string
97
- /** Classic profile email. */
98
- userEmail?: string
99
- /** Enable the built-in AppTopBar experiment popover and selector flow. */
100
- experimentShell?: boolean
101
- /** Current experiment mirrored into the AppTopBar experiment chip when experimentShell is enabled. */
102
- experiment?: AppExperimentRecord | null
103
- /** Save handler used by the AppTopBar experiment chip. Return a message to flash success. */
104
- experimentSave?: () => string | null | Promise<string | null>
105
- /** Disable the experiment save action. */
106
- experimentSaveDisabled?: boolean
107
- /** Tooltip shown when the experiment save action is disabled. */
108
- experimentSaveDisabledMessage?: string
109
-
110
- /** Active workspace view used by top bar navigation and sidebar panels. */
111
- activeView?: string
112
- /** Initial active view when activeView is uncontrolled. */
113
- defaultActiveView?: string
114
- /** Map of view IDs to sidebar tool sections. */
115
- panels?: Record<string, SidebarToolSection[]>
116
- /** Optional FormBuilder schemas keyed by section ID. */
117
- forms?: Record<string, FormSchema>
118
- /** Sidebar chrome title. */
119
- sidebarTitle?: string
120
- /** Sidebar chrome subtitle. */
121
- sidebarSubtitle?: string
122
- /** Optional compact badge/count rendered in the sidebar header. */
123
- sidebarBadge?: string | number
124
- /** AppSidebar visual preset. `analysis` matches the LEAF-style MINT analysis sidebar language. */
125
- sidebarVariant?: SidebarVariant
126
- /** Sidebar CSS width. Defaults to AppSidebar's variant width. */
127
- sidebarWidth?: string
128
- /** Sidebar position in AppLayout. */
129
- sidebarPosition?: 'left' | 'right'
130
- /** Convert the sidebar into an SDK-owned mobile overlay below the AppLayout breakpoint. */
131
- responsiveSidebar?: boolean
132
- /** Render the sidebar shell even when no panel matches the active view. */
133
- showSidebarWhenEmpty?: boolean
134
- /** Disable the built-in sidebar surface entirely. */
135
- showSidebar?: boolean
136
- /** DOM id for the AppSidebar scrollable content area. Use with route/tab-owned Teleport sidebars. */
137
- sidebarContentId?: string
138
- /** Compact AppSidebar density. */
139
- dense?: boolean
140
- /** Show a built-in collapse/expand button in the sidebar chrome. Defaults to AppSidebar's variant behavior. */
141
- sidebarCollapsible?: boolean
142
- /** Sidebar width when collapsed. */
143
- sidebarCollapsedWidth?: string
144
- /** Accessible label for the sidebar collapse action. */
145
- sidebarCollapseButtonLabel?: string
146
- /** Accessible label for the sidebar expand action. */
147
- sidebarExpandButtonLabel?: string
148
- /** Floating AppLayout style. */
149
- floating?: boolean
150
- /** Optional compact control model for generated sidebar forms. */
151
- model?: ControlModel | ControlModelBinding
152
- /** Compact control schema for generated sidebar forms. */
153
- controls?: ControlSchema
154
- /** Options passed to compact control schema generation. */
155
- controlOptions?: ControlWorkspaceOptions
156
- /** Optional SDK component bindings exposed to the default slot with resolved props. */
157
- componentBindings?: ControlComponentBindingsConfig
158
- /** Optional mapping from workspace values to component props exposed to the default slot. */
159
- componentProps?: ControlComponentPropsMap
160
- /** Optional named mappings from workspace values to component props exposed to the default slot. */
161
- componentPropsById?: ControlComponentPropsByIdMap
162
- /** Shared values for auto-rendered sidebar forms. Supports default v-model. */
163
- modelValue?: Record<string, unknown>
164
- /** Shared values for auto-rendered sidebar forms. */
165
- values?: Record<string, unknown>
166
- /** Runtime FormBuilder enhancements for auto-rendered sidebar forms. */
167
- formEnhancements?: FormEnhancements<Record<string, unknown>>
168
- /** Show submit/cancel actions inside auto-rendered sidebar forms. */
169
- showFormActions?: boolean
170
- /** Loading/saving state for auto-rendered sidebar forms. */
171
- formLoading?: boolean
172
- /** Disabled state for auto-rendered sidebar forms. */
173
- formDisabled?: boolean
174
- /** Readonly state for auto-rendered sidebar forms. */
175
- formReadonly?: boolean
176
- /** Size passed to auto-rendered sidebar forms. */
177
- formSize?: 'sm' | 'md' | 'lg'
178
- /** Controlled sidebar collapsed state. */
179
- sidebarCollapsed?: boolean
180
- /** Initial sidebar collapsed state when uncontrolled. */
181
- defaultSidebarCollapsed?: boolean
182
- /** Accessible label for the mobile sidebar toggle. */
183
- sidebarToggleLabel?: string
184
- /** Accessible label used when the mobile sidebar is open. */
185
- sidebarCloseLabel?: string
186
- }
187
-
188
- const props = withDefaults(defineProps<Props>(), {
29
+ const props = withDefaults(defineProps<PluginWorkspaceViewProps>(), {
189
30
  title: 'Workspace',
190
31
  subtitle: undefined,
191
32
  topBarVariant: 'card',
@@ -278,58 +119,26 @@ const emit = defineEmits<{
278
119
  'form-cancel': [sectionId: string]
279
120
  }>()
280
121
 
281
- interface PluginWorkspaceSlotProps {
282
- activeView: string
283
- setActiveView: (viewId: string) => void
284
- values: Record<string, unknown>
285
- componentBindings: ControlComponentBinding[]
286
- componentBindingsById: ControlComponentBindingsById
287
- componentProps: Record<string, unknown>
288
- componentPropsById: Record<string, Record<string, unknown>>
289
- }
290
-
291
- type ForwardedSlotProps = Record<string, unknown>
292
-
293
122
  defineSlots<{
294
123
  default?: (props: PluginWorkspaceSlotProps) => unknown
295
124
  topbar?: (props: PluginWorkspaceSlotProps) => unknown
296
125
  sidebar?: (props: PluginWorkspaceSlotProps) => unknown
297
- icon?: (props: ForwardedSlotProps) => unknown
298
- logo?: (props: ForwardedSlotProps) => unknown
299
- 'page-selector-icon'?: (props: ForwardedSlotProps) => unknown
300
- 'page-selector-item-icon'?: (props: ForwardedSlotProps) => unknown
301
- nav?: (props: ForwardedSlotProps) => unknown
302
- center?: (props: ForwardedSlotProps) => unknown
303
- actions?: (props: ForwardedSlotProps) => unknown
304
- 'account-menu-items'?: (props: ForwardedSlotProps) => unknown
305
- 'account-menu-item-icon'?: (props: ForwardedSlotProps) => unknown
306
- 'settings-appearance'?: (props: ForwardedSlotProps) => unknown
307
- header?: (props: ForwardedSlotProps) => unknown
308
- collapsed?: (props: ForwardedSlotProps) => unknown
309
- footer?: (props: ForwardedSlotProps) => unknown
126
+ icon?: (props: PluginWorkspaceForwardedSlotProps) => unknown
127
+ logo?: (props: PluginWorkspaceForwardedSlotProps) => unknown
128
+ 'page-selector-icon'?: (props: PluginWorkspaceForwardedSlotProps) => unknown
129
+ 'page-selector-item-icon'?: (props: PluginWorkspaceForwardedSlotProps) => unknown
130
+ nav?: (props: PluginWorkspaceForwardedSlotProps) => unknown
131
+ center?: (props: PluginWorkspaceForwardedSlotProps) => unknown
132
+ actions?: (props: PluginWorkspaceForwardedSlotProps) => unknown
133
+ 'account-menu-items'?: (props: PluginWorkspaceForwardedSlotProps) => unknown
134
+ 'account-menu-item-icon'?: (props: PluginWorkspaceForwardedSlotProps) => unknown
135
+ 'settings-appearance'?: (props: PluginWorkspaceForwardedSlotProps) => unknown
136
+ header?: (props: PluginWorkspaceForwardedSlotProps) => unknown
137
+ collapsed?: (props: PluginWorkspaceForwardedSlotProps) => unknown
138
+ footer?: (props: PluginWorkspaceForwardedSlotProps) => unknown
310
139
  }>()
311
140
 
312
- const topBarForwardedSlots = new Set([
313
- 'icon',
314
- 'logo',
315
- 'page-selector-icon',
316
- 'page-selector-item-icon',
317
- 'nav',
318
- 'center',
319
- 'actions',
320
- 'account-menu-items',
321
- 'account-menu-item-icon',
322
- 'settings-appearance',
323
- ])
324
-
325
- const sidebarForwardedSlots = new Set([
326
- 'header',
327
- 'collapsed',
328
- 'footer',
329
- ])
330
-
331
141
  const slots = useSlots()
332
- const internalActiveView = ref(props.defaultActiveView)
333
142
 
334
143
  if (props.experimentShell) {
335
144
  useAppExperiment({
@@ -343,171 +152,77 @@ if (props.experimentShell) {
343
152
  }
344
153
 
345
154
  const topBarSlotNames = computed<string[]>(() =>
346
- Object.keys(slots).filter(name =>
347
- topBarForwardedSlots.has(name) || name.startsWith('settings-tab-'),
348
- ),
155
+ getPluginWorkspaceTopBarSlotNames(slots),
349
156
  )
350
157
 
351
158
  const sidebarSlotNames = computed<string[]>(() =>
352
- Object.keys(slots).filter(name =>
353
- sidebarForwardedSlots.has(name) || name.startsWith('section-'),
354
- ),
159
+ getPluginWorkspaceSidebarSlotNames(slots),
355
160
  )
356
161
 
357
- const resolvedModel = computed<ControlModelBinding | undefined>(() => {
358
- if (props.model === undefined) return undefined
359
- return isControlModelBinding(props.model) ? props.model : defineControlModel(props.model)
360
- })
361
-
362
- const resolvedControls = computed<ControlSchema | undefined>(() =>
363
- props.controls ?? resolvedModel.value?.controls,
364
- )
365
-
366
- const resolvedControlOptions = computed<ControlWorkspaceOptions>(() =>
367
- mergeControlWorkspaceOptions(resolvedModel.value?.controlOptions ?? {}, props.controlOptions),
368
- )
369
-
370
- const externalControlValues = computed(() => props.modelValue ?? props.values)
371
- const internalControlValues = reactive<Record<string, unknown>>({})
372
- let syncingControlValues = false
373
-
374
- const generatedControlDefaults = computed<Record<string, unknown>>(() => {
375
- if (!resolvedControls.value) return {}
376
- return {
377
- ...getControlDefaults(resolvedControls.value),
378
- ...(resolvedControlOptions.value.initialValues ?? {}),
379
- }
380
- })
381
-
382
- syncResolvedControlValues()
383
-
384
- watch(
385
- [generatedControlDefaults, externalControlValues],
386
- syncResolvedControlValues,
387
- { deep: true },
388
- )
389
-
390
- watch(
162
+ const {
163
+ generatedPillNav,
164
+ generatedDefaultView,
391
165
  internalControlValues,
392
- () => {
393
- if (syncingControlValues) return
394
- emitControlValues()
166
+ resolvedComponentBindings,
167
+ resolvedComponentBindingsById,
168
+ resolvedComponentProps,
169
+ resolvedComponentPropsById,
170
+ handleControlValuesUpdate,
171
+ } = usePluginWorkspaceControls({
172
+ model: () => props.model,
173
+ controls: () => props.controls,
174
+ controlOptions: () => props.controlOptions,
175
+ modelValue: () => props.modelValue,
176
+ values: () => props.values,
177
+ componentBindings: () => props.componentBindings,
178
+ componentProps: () => props.componentProps,
179
+ componentPropsById: () => props.componentPropsById,
180
+ emitValues: (values) => {
181
+ emit('update:modelValue', values)
182
+ emit('update:values', values)
395
183
  },
396
- { deep: true, flush: 'sync' },
397
- )
398
-
399
- const resolvedComponentBindings = computed(() =>
400
- controlValuesToComponentBindings(
401
- internalControlValues,
402
- props.componentBindings ?? resolvedModel.value?.componentBindings,
403
- ),
404
- )
405
-
406
- const resolvedComponentBindingsById = computed(() =>
407
- controlValuesToComponentBindingsById(
408
- internalControlValues,
409
- props.componentBindings ?? resolvedModel.value?.componentBindings,
410
- ),
411
- )
412
-
413
- const resolvedComponentProps = computed(() => {
414
- const mapping = props.componentProps ?? resolvedModel.value?.componentProps
415
- return mapping === undefined ? {} : controlValuesToComponentProps(internalControlValues, mapping)
416
- })
417
-
418
- const resolvedComponentPropsById = computed(() => {
419
- const mappings = props.componentPropsById ?? resolvedModel.value?.componentPropsById
420
- if (mappings === undefined) return {}
421
-
422
- return Object.fromEntries(
423
- Object.entries(mappings).map(([id, mapping]) => [
424
- id,
425
- controlValuesToComponentProps(internalControlValues, mapping),
426
- ]),
427
- )
428
184
  })
429
185
 
430
- const generatedPillNav = computed<PillNavItem[]>(() => {
431
- if (!resolvedControls.value) return []
432
- return controlsToViewItems(resolvedControls.value, resolvedControlOptions.value)
186
+ const {
187
+ resolvedPillNav,
188
+ resolvedActiveView,
189
+ resolvedCurrentPillId,
190
+ resolvedCurrentPageSelectorId,
191
+ setActiveView,
192
+ handlePageSelectorSelect,
193
+ handlePillSelect,
194
+ } = usePluginWorkspaceNavigation({
195
+ activeView: () => props.activeView,
196
+ defaultActiveView: () => props.defaultActiveView,
197
+ currentPillId: () => props.currentPillId,
198
+ currentPageSelectorId: () => props.currentPageSelectorId,
199
+ pillNav: () => props.pillNav,
200
+ pageSelector: () => props.pageSelector,
201
+ panelIds: () => Object.keys(props.panels),
202
+ generatedPillNav,
203
+ generatedDefaultView,
204
+ emitActiveView: (viewId) => emit('update:activeView', viewId),
205
+ emitPageSelectorSelect: (page) => emit('page-selector-select', page),
206
+ emitPillSelect: (item) => emit('pill-select', item),
433
207
  })
434
208
 
435
- const generatedDefaultView = computed(() => {
436
- if (!resolvedControls.value) return ''
437
- return getDefaultControlView(resolvedControls.value, resolvedControlOptions.value)
438
- })
439
-
440
- const resolvedPillNav = computed<PillNavItemInput[] | undefined>(() => {
441
- if (props.pillNav !== undefined) return props.pillNav
442
- return generatedPillNav.value.length > 0 ? generatedPillNav.value : undefined
443
- })
444
-
445
- const firstConfiguredViewId = computed(() =>
446
- props.defaultActiveView
447
- ?? firstItemId(props.pillNav)
448
- ?? generatedDefaultView.value
449
- ?? firstItemId(props.pageSelector)
450
- ?? Object.keys(props.panels)[0]
451
- ?? '',
452
- )
453
-
454
- const resolvedActiveView = computed({
455
- get: () =>
456
- props.activeView
457
- ?? props.currentPillId
458
- ?? props.currentPageSelectorId
459
- ?? internalActiveView.value
460
- ?? firstConfiguredViewId.value,
461
- set: (value: string) => {
462
- internalActiveView.value = value
463
- emit('update:activeView', value)
464
- },
465
- })
466
-
467
- const resolvedCurrentPillId = computed(() => props.currentPillId ?? resolvedActiveView.value)
468
- const resolvedCurrentPageSelectorId = computed(() => props.currentPageSelectorId ?? resolvedActiveView.value)
469
-
470
209
  const hasSidebarSurface = computed(() => {
471
- if (!props.showSidebar) return false
472
- return (
473
- Object.keys(props.panels).length > 0
474
- || Object.keys(props.forms).length > 0
475
- || props.model !== undefined
476
- || props.controls !== undefined
477
- || props.showSidebarWhenEmpty
478
- || props.sidebarContentId !== undefined
479
- || props.sidebarTitle !== undefined
480
- || props.sidebarSubtitle !== undefined
481
- || props.sidebarBadge !== undefined
482
- || Boolean(slots.sidebar)
483
- || sidebarSlotNames.value.length > 0
484
- )
210
+ return hasPluginWorkspaceSidebarSurface({
211
+ showSidebar: props.showSidebar,
212
+ panels: props.panels,
213
+ forms: props.forms,
214
+ model: props.model,
215
+ controls: props.controls,
216
+ showSidebarWhenEmpty: props.showSidebarWhenEmpty,
217
+ sidebarContentId: props.sidebarContentId,
218
+ sidebarTitle: props.sidebarTitle,
219
+ sidebarSubtitle: props.sidebarSubtitle,
220
+ sidebarBadge: props.sidebarBadge,
221
+ hasSidebarSlot: Boolean(slots.sidebar),
222
+ sidebarSlotCount: sidebarSlotNames.value.length,
223
+ })
485
224
  })
486
225
 
487
- function firstItemId(items?: readonly (string | { id: string })[]): string | undefined {
488
- const item = items?.[0]
489
- if (item === undefined) return undefined
490
- return typeof item === 'string' ? item : item.id
491
- }
492
-
493
- function isControlModelBinding(model: ControlModel | ControlModelBinding): model is ControlModelBinding {
494
- return 'controls' in model && 'controlOptions' in model
495
- }
496
-
497
- function setActiveView(viewId: string) {
498
- resolvedActiveView.value = viewId
499
- }
500
-
501
- function handlePageSelectorSelect(page: PageSelectorItem) {
502
- setActiveView(page.id)
503
- emit('page-selector-select', page)
504
- }
505
-
506
- function handlePillSelect(item: PillNavItem) {
507
- setActiveView(item.id)
508
- emit('pill-select', item)
509
- }
510
-
511
226
  function handlePillOptionSelect(option: PillNavOption, item: PillNavItem) {
512
227
  emit('pill-option-select', option, item)
513
228
  }
@@ -516,16 +231,6 @@ function handleToggle(sectionId: string, value: boolean) {
516
231
  emit('update:toggle', sectionId, value)
517
232
  }
518
233
 
519
- function handleControlValuesUpdate(values: Record<string, unknown>) {
520
- syncingControlValues = true
521
- replaceControlValues({
522
- ...generatedControlDefaults.value,
523
- ...values,
524
- })
525
- syncingControlValues = false
526
- emitControlValues()
527
- }
528
-
529
234
  function handleFormSubmit(sectionId: string, values: Record<string, unknown>) {
530
235
  emit('form-submit', sectionId, values)
531
236
  }
@@ -534,30 +239,6 @@ function handleFormCancel(sectionId: string) {
534
239
  emit('form-cancel', sectionId)
535
240
  }
536
241
 
537
- function syncResolvedControlValues() {
538
- syncingControlValues = true
539
- replaceControlValues({
540
- ...generatedControlDefaults.value,
541
- ...(externalControlValues.value === undefined ? internalControlValues : externalControlValues.value),
542
- })
543
- syncingControlValues = false
544
- }
545
-
546
- function replaceControlValues(values: Record<string, unknown>) {
547
- for (const key of Object.keys(internalControlValues)) {
548
- if (!(key in values)) {
549
- delete internalControlValues[key]
550
- }
551
- }
552
- Object.assign(internalControlValues, values)
553
- }
554
-
555
- function emitControlValues() {
556
- const nextValues = { ...internalControlValues }
557
- emit('update:modelValue', nextValues)
558
- emit('update:values', nextValues)
559
- }
560
-
561
242
  </script>
562
243
 
563
244
  <template>
@@ -0,0 +1,31 @@
1
+ import type { ProtocolStepType } from '../types'
2
+
3
+ export const PROTOCOL_STEP_TYPE_ICONS: Record<ProtocolStepType, string> = {
4
+ incubation: 'M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z',
5
+ wash: 'M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z',
6
+ addition: 'M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z',
7
+ measurement: 'M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z',
8
+ transfer: 'M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4',
9
+ centrifuge: 'M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15',
10
+ mix: 'M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z',
11
+ custom: 'M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z',
12
+ }
13
+
14
+ export const PROTOCOL_STEP_TYPE_COLORS: Record<ProtocolStepType, string> = {
15
+ incubation: '#F59E0B',
16
+ wash: '#06B6D4',
17
+ addition: '#10B981',
18
+ measurement: '#8B5CF6',
19
+ transfer: '#3B82F6',
20
+ centrifuge: '#6B7280',
21
+ mix: '#F97316',
22
+ custom: '#EC4899',
23
+ }
24
+
25
+ export function formatProtocolDuration(minutes: number | undefined): string {
26
+ if (minutes === undefined) return ''
27
+ if (minutes < 60) return `${minutes}m`
28
+ const hours = Math.floor(minutes / 60)
29
+ const mins = minutes % 60
30
+ return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`
31
+ }
@@ -0,0 +1,104 @@
1
+ import type { ProtocolStep, ProtocolStepStatus } from '../types'
2
+ import type { ParameterDefinition, StepTemplate } from '../composables/useProtocolTemplates'
3
+
4
+ export interface ProtocolStepEditorFields {
5
+ name: string
6
+ description: string
7
+ duration?: number
8
+ parameters: Record<string, unknown>
9
+ }
10
+
11
+ export interface InitializedProtocolStepEditorState {
12
+ selectedTemplateId: string | null
13
+ fields: ProtocolStepEditorFields
14
+ }
15
+
16
+ export type ProtocolParameterFormatter = (
17
+ value: unknown,
18
+ parameter: ParameterDefinition
19
+ ) => string
20
+
21
+ export function buildProtocolTemplateDefaults(
22
+ template: StepTemplate
23
+ ): ProtocolStepEditorFields {
24
+ const parameters: Record<string, unknown> = {}
25
+ for (const parameter of template.parameters) {
26
+ if (parameter.default !== undefined) {
27
+ parameters[parameter.key] = parameter.default
28
+ }
29
+ }
30
+
31
+ return {
32
+ name: template.name,
33
+ description: template.description || '',
34
+ duration: template.defaultDuration,
35
+ parameters,
36
+ }
37
+ }
38
+
39
+ export function buildProtocolStepEditorState(
40
+ step: ProtocolStep,
41
+ getTemplateByType: (type: ProtocolStep['type']) => StepTemplate | undefined
42
+ ): InitializedProtocolStepEditorState {
43
+ const template = getTemplateByType(step.type)
44
+
45
+ return {
46
+ selectedTemplateId: template?.id || null,
47
+ fields: {
48
+ name: step.name,
49
+ description: step.description || '',
50
+ duration: step.duration,
51
+ parameters: { ...(step.parameters || {}) },
52
+ },
53
+ }
54
+ }
55
+
56
+ export function buildProtocolStepPreview(
57
+ template: StepTemplate,
58
+ fields: ProtocolStepEditorFields,
59
+ sourceStep?: ProtocolStep
60
+ ): ProtocolStep {
61
+ return {
62
+ id: sourceStep?.id || 'preview',
63
+ type: template.type,
64
+ name: fields.name || template.name,
65
+ description: fields.description,
66
+ duration: fields.duration ?? template.defaultDuration,
67
+ status: (sourceStep?.status || 'pending') as ProtocolStepStatus,
68
+ parameters: { ...fields.parameters },
69
+ order: sourceStep?.order || 0,
70
+ }
71
+ }
72
+
73
+ export function buildProtocolPreviewParams(
74
+ template: StepTemplate,
75
+ parameters: Record<string, unknown>,
76
+ formatParameterValue: ProtocolParameterFormatter
77
+ ): string {
78
+ return template.parameters
79
+ .filter((parameter) => (
80
+ parameters[parameter.key] !== undefined
81
+ && parameters[parameter.key] !== ''
82
+ ))
83
+ .map((parameter) => formatParameterValue(parameters[parameter.key], parameter))
84
+ .join(', ')
85
+ }
86
+
87
+ export function buildCustomProtocolTemplate(
88
+ template: StepTemplate,
89
+ fields: ProtocolStepEditorFields,
90
+ templateId = `custom-${Date.now()}`
91
+ ): StepTemplate {
92
+ return {
93
+ id: templateId,
94
+ type: template.type,
95
+ name: fields.name || template.name,
96
+ description: fields.description,
97
+ defaultDuration: fields.duration,
98
+ parameters: template.parameters.map((parameter) => ({
99
+ ...parameter,
100
+ default: fields.parameters[parameter.key],
101
+ })),
102
+ isBuiltIn: false,
103
+ }
104
+ }