@morscherlab/mint-sdk 1.0.0-beta.2 → 1.0.0-beta.3

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 (399) hide show
  1. package/README.md +218 -6
  2. package/dist/__tests__/components/ActionItem.test.d.ts +1 -0
  3. package/dist/__tests__/components/AppAvatarMenu.test.d.ts +1 -0
  4. package/dist/__tests__/components/AppPageSelector.test.d.ts +1 -0
  5. package/dist/__tests__/components/AppPillNav.test.d.ts +1 -0
  6. package/dist/__tests__/components/AppPluginSwitcher.test.d.ts +1 -0
  7. package/dist/__tests__/components/AppToastContainer.test.d.ts +1 -0
  8. package/dist/__tests__/components/BaseRadioGroup.test.d.ts +1 -0
  9. package/dist/__tests__/components/BaseSelect.test.d.ts +1 -0
  10. package/dist/__tests__/components/BaseTabs.test.d.ts +1 -0
  11. package/dist/__tests__/components/BatchProgressList.test.d.ts +1 -0
  12. package/dist/__tests__/components/BioTemplateExperimentWorkspaceView.test.d.ts +1 -0
  13. package/dist/__tests__/components/BioTemplatePackWorkspaceView.test.d.ts +1 -0
  14. package/dist/__tests__/components/BioTemplatePresetWorkspaceView.test.d.ts +1 -0
  15. package/dist/__tests__/components/BioTemplateRenderer.test.d.ts +1 -0
  16. package/dist/__tests__/components/Breadcrumb.test.d.ts +1 -0
  17. package/dist/__tests__/components/CalendarGridPanel.test.d.ts +1 -0
  18. package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
  19. package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
  20. package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
  21. package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
  22. package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
  23. package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
  24. package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
  25. package/dist/__tests__/components/FormCompatibility.test.d.ts +1 -0
  26. package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
  27. package/dist/__tests__/components/GroupingModal.test.d.ts +1 -0
  28. package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
  29. package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
  30. package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
  31. package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
  32. package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
  33. package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
  34. package/dist/__tests__/components/SettingsButton.test.d.ts +1 -0
  35. package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
  36. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  37. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  38. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  39. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  40. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  41. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  42. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  43. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  44. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  45. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  46. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  47. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  48. package/dist/__tests__/composables/useExperimentData.test.d.ts +1 -0
  49. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  50. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  51. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  52. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  53. package/dist/__tests__/composables/usePluginConfig.test.d.ts +1 -0
  54. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  55. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  56. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  57. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  58. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  59. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  60. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  61. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  62. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  63. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  64. package/dist/{auth-DsI0rQ7_.js → auth-QQj2kkze.js} +12 -5
  65. package/dist/auth-QQj2kkze.js.map +1 -0
  66. package/dist/components/ActionItem.vue.d.ts +32 -0
  67. package/dist/components/AppAvatarMenu.vue.d.ts +2 -7
  68. package/dist/components/AppPageSelector.vue.d.ts +3 -6
  69. package/dist/components/AppPillNav.vue.d.ts +2 -2
  70. package/dist/components/AppSidebar.vue.d.ts +56 -3
  71. package/dist/components/AppToastContainer.vue.d.ts +2 -0
  72. package/dist/components/AppTopBar.vue.d.ts +41 -10
  73. package/dist/components/BaseButton.vue.d.ts +1 -1
  74. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  75. package/dist/components/BaseInput.vue.d.ts +2 -2
  76. package/dist/components/BasePill.vue.d.ts +2 -2
  77. package/dist/components/BaseRadioGroup.vue.d.ts +3 -3
  78. package/dist/components/BaseSelect.vue.d.ts +3 -3
  79. package/dist/components/BaseTabs.vue.d.ts +2 -2
  80. package/dist/components/BaseTextarea.vue.d.ts +1 -1
  81. package/dist/components/BaseToggle.vue.d.ts +1 -1
  82. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +117 -0
  83. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +92 -0
  84. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +82 -0
  85. package/dist/components/BioTemplateRenderer.vue.d.ts +29 -0
  86. package/dist/components/Breadcrumb.vue.d.ts +2 -2
  87. package/dist/components/Calendar.vue.d.ts +1 -1
  88. package/dist/components/CalendarGridPanel.vue.d.ts +25 -0
  89. package/dist/components/CollapsibleCard.vue.d.ts +1 -1
  90. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  91. package/dist/components/ConfirmDialog.vue.d.ts +2 -2
  92. package/dist/components/ControlWorkspaceView.vue.d.ts +130 -0
  93. package/dist/components/DatePicker.vue.d.ts +1 -1
  94. package/dist/components/DateTimePicker.vue.d.ts +3 -3
  95. package/dist/components/Divider.vue.d.ts +1 -1
  96. package/dist/components/DropdownButton.vue.d.ts +3 -3
  97. package/dist/components/EmptyState.vue.d.ts +1 -2
  98. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  99. package/dist/components/ExperimentTimeline.vue.d.ts +2 -2
  100. package/dist/components/FileUploader.vue.d.ts +1 -1
  101. package/dist/components/FitPanel.vue.d.ts +1 -1
  102. package/dist/components/FormActions.vue.d.ts +4 -4
  103. package/dist/components/FormBuilder.vue.d.ts +22 -8
  104. package/dist/components/FormFieldRenderer.vue.d.ts +7 -10
  105. package/dist/components/FormSection.vue.d.ts +11 -24
  106. package/dist/components/FormulaInput.vue.d.ts +2 -2
  107. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  108. package/dist/components/MultiSelect.vue.d.ts +3 -3
  109. package/dist/components/NumberInput.vue.d.ts +1 -1
  110. package/dist/components/ProgressBar.vue.d.ts +1 -1
  111. package/dist/components/ProtocolStepEditor.vue.d.ts +3 -1
  112. package/dist/components/RackEditor.vue.d.ts +2 -2
  113. package/dist/components/SampleLegend.vue.d.ts +2 -2
  114. package/dist/components/ScheduleCalendar.vue.d.ts +2 -2
  115. package/dist/components/SegmentedControl.vue.d.ts +2 -2
  116. package/dist/components/SequenceInput.vue.d.ts +3 -3
  117. package/dist/components/SettingsButton.vue.d.ts +2 -2
  118. package/dist/components/SettingsModal.vue.d.ts +13 -5
  119. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  120. package/dist/components/TagsInput.vue.d.ts +3 -2
  121. package/dist/components/TimePicker.vue.d.ts +3 -3
  122. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  123. package/dist/components/UnitInput.vue.d.ts +2 -2
  124. package/dist/components/WellPlate.vue.d.ts +8 -8
  125. package/dist/components/index.d.ts +11 -1
  126. package/dist/components/index.js +3 -3
  127. package/dist/components/internal/FormFieldRendererInternal.vue.d.ts +31 -0
  128. package/dist/components/internal/FormSectionRenderer.vue.d.ts +43 -0
  129. package/dist/{components-_XqPEhP9.js → components-D_Sr0adg.js} +7290 -6518
  130. package/dist/components-D_Sr0adg.js.map +1 -0
  131. package/dist/composables/index.d.ts +21 -2
  132. package/dist/composables/index.js +4 -3
  133. package/dist/composables/platformContextHelpers.d.ts +14 -0
  134. package/dist/composables/useBioTemplateComponents.d.ts +20 -0
  135. package/dist/composables/useBioTemplateControls.d.ts +6 -0
  136. package/dist/composables/useBioTemplatePackWorkspace.d.ts +45 -0
  137. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +74 -0
  138. package/dist/composables/useBioTemplateWorkspace.d.ts +50 -0
  139. package/dist/composables/useCalendarGrid.d.ts +26 -0
  140. package/dist/composables/useControlSchema.d.ts +321 -0
  141. package/dist/composables/useDebouncedWatch.d.ts +20 -0
  142. package/dist/composables/useDropdownState.d.ts +19 -0
  143. package/dist/composables/useEventListener.d.ts +13 -0
  144. package/dist/composables/useExpansionSet.d.ts +21 -0
  145. package/dist/composables/useExperimentData.d.ts +10 -0
  146. package/dist/composables/useExperimentSave.d.ts +31 -2
  147. package/dist/composables/useExperimentSelector.d.ts +20 -0
  148. package/dist/composables/useForm.d.ts +2 -0
  149. package/dist/composables/useGroupAssignment.d.ts +31 -0
  150. package/dist/composables/useListSelection.d.ts +35 -0
  151. package/dist/composables/usePlatformContext.d.ts +21 -3
  152. package/dist/composables/usePluginApi.d.ts +7 -14
  153. package/dist/composables/usePluginClient.d.ts +109 -0
  154. package/dist/composables/usePluginConfig.d.ts +12 -0
  155. package/dist/composables/useRequestSyncState.d.ts +34 -0
  156. package/dist/composables/useSampleGroups.d.ts +32 -0
  157. package/dist/composables/useSelectionLimit.d.ts +17 -0
  158. package/dist/composables/useSortedItems.d.ts +32 -0
  159. package/dist/composables/useTemplateCollection.d.ts +58 -0
  160. package/dist/composables/useTextSearch.d.ts +18 -0
  161. package/dist/composables/useTimeUtils.d.ts +8 -0
  162. package/dist/{composables-tiZqLu1M.js → composables-C3dpXQN5.js} +228 -146
  163. package/dist/composables-C3dpXQN5.js.map +1 -0
  164. package/dist/index.d.ts +12 -3
  165. package/dist/index.js +6 -5
  166. package/dist/install.d.ts +7 -2
  167. package/dist/install.js +2 -2
  168. package/dist/install.js.map +1 -1
  169. package/dist/stores/index.js +1 -1
  170. package/dist/stores/settings.d.ts +4 -1
  171. package/dist/styles.css +5235 -5977
  172. package/dist/templates/adapters.d.ts +43 -0
  173. package/dist/templates/builders.d.ts +63 -0
  174. package/dist/templates/catalog.d.ts +188 -0
  175. package/dist/templates/componentBindings.d.ts +58 -0
  176. package/dist/templates/controlSchemas.d.ts +25 -0
  177. package/dist/templates/index.d.ts +15 -0
  178. package/dist/templates/index.js +2 -0
  179. package/dist/templates/lookup.d.ts +4 -0
  180. package/dist/templates/packs.d.ts +18 -0
  181. package/dist/templates/presets.d.ts +90 -0
  182. package/dist/templates/types.d.ts +531 -0
  183. package/dist/templates-50NPjaxL.js +9333 -0
  184. package/dist/templates-50NPjaxL.js.map +1 -0
  185. package/dist/types/components.d.ts +26 -4
  186. package/dist/types/form-builder.d.ts +6 -8
  187. package/dist/types/index.d.ts +2 -2
  188. package/dist/types/platform.d.ts +7 -1
  189. package/dist/useScheduleDrag-D4oWdh41.js +4371 -0
  190. package/dist/useScheduleDrag-D4oWdh41.js.map +1 -0
  191. package/dist/utils/formModelSync.d.ts +5 -0
  192. package/dist/utils/items.d.ts +8 -0
  193. package/dist/utils/options.d.ts +6 -0
  194. package/dist/utils/pluginIcon.d.ts +9 -0
  195. package/package.json +7 -2
  196. package/src/__tests__/components/ActionItem.test.ts +99 -0
  197. package/src/__tests__/components/AppAvatarMenu.test.ts +27 -0
  198. package/src/__tests__/components/AppPageSelector.test.ts +134 -0
  199. package/src/__tests__/components/AppPillNav.test.ts +78 -0
  200. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  201. package/src/__tests__/components/AppSidebar.test.ts +370 -0
  202. package/src/__tests__/components/AppToastContainer.test.ts +48 -0
  203. package/src/__tests__/components/AppTopBar.test.ts +383 -0
  204. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  205. package/src/__tests__/components/BaseSelect.test.ts +21 -0
  206. package/src/__tests__/components/BaseTabs.test.ts +25 -0
  207. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  208. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +153 -0
  209. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +161 -0
  210. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +281 -0
  211. package/src/__tests__/components/BioTemplateRenderer.test.ts +71 -0
  212. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  213. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  214. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  215. package/src/__tests__/components/ControlWorkspaceView.test.ts +1031 -0
  216. package/src/__tests__/components/DataFrame.test.ts +11 -0
  217. package/src/__tests__/components/DatePicker.test.ts +45 -0
  218. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  219. package/src/__tests__/components/DropdownButton.test.ts +23 -0
  220. package/src/__tests__/components/EmptyState.test.ts +23 -0
  221. package/src/__tests__/components/ExperimentPopover.test.ts +56 -0
  222. package/src/__tests__/components/FormBuilder.test.ts +296 -0
  223. package/src/__tests__/components/FormCompatibility.test.ts +94 -0
  224. package/src/__tests__/components/GroupAssigner.test.ts +30 -0
  225. package/src/__tests__/components/GroupingModal.test.ts +73 -0
  226. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  227. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  228. package/src/__tests__/components/ReagentList.test.ts +82 -0
  229. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  230. package/src/__tests__/components/SampleSelector.test.ts +60 -0
  231. package/src/__tests__/components/SegmentedControl.test.ts +24 -0
  232. package/src/__tests__/components/SettingsButton.test.ts +44 -0
  233. package/src/__tests__/components/SettingsModal.test.ts +296 -0
  234. package/src/__tests__/components/TagsInput.test.ts +75 -0
  235. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  236. package/src/__tests__/components/TimePicker.test.ts +38 -0
  237. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +122 -0
  238. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  239. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +99 -0
  240. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  241. package/src/__tests__/composables/useControlSchema.test.ts +919 -0
  242. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  243. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  244. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  245. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  246. package/src/__tests__/composables/useExperimentData.test.ts +4 -0
  247. package/src/__tests__/composables/useExperimentSave.test.ts +203 -8
  248. package/src/__tests__/composables/useExperimentSelector.test.ts +164 -0
  249. package/src/__tests__/composables/useForm.test.ts +58 -0
  250. package/src/__tests__/composables/useFormBuilder.test.ts +77 -0
  251. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  252. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  253. package/src/__tests__/composables/usePluginClient.test.ts +444 -0
  254. package/src/__tests__/composables/usePluginConfig.test.ts +5 -0
  255. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  256. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  257. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  258. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  259. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  260. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  261. package/src/__tests__/composables/useTheme.test.ts +91 -0
  262. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  263. package/src/__tests__/docs/frontendDocsCatalog.test.ts +229 -0
  264. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  265. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  266. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  267. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  268. package/src/__tests__/templates/templates.test.ts +1043 -0
  269. package/src/components/ActionItem.vue +82 -0
  270. package/src/components/AppAvatarMenu.vue +15 -69
  271. package/src/components/AppLayout.story.vue +25 -25
  272. package/src/components/AppPageSelector.vue +63 -94
  273. package/src/components/AppPillNav.vue +44 -39
  274. package/src/components/AppPluginSwitcher.vue +41 -145
  275. package/src/components/AppSidebar.story.vue +94 -0
  276. package/src/components/AppSidebar.vue +187 -12
  277. package/src/components/{ToastNotification.story.vue → AppToastContainer.story.vue} +6 -6
  278. package/src/components/AppToastContainer.vue +62 -0
  279. package/src/components/AppTopBar.story.vue +7 -30
  280. package/src/components/AppTopBar.vue +251 -57
  281. package/src/components/BaseModal.vue +3 -5
  282. package/src/components/BaseRadioGroup.vue +7 -3
  283. package/src/components/BaseSelect.vue +11 -7
  284. package/src/components/BaseTabs.vue +6 -4
  285. package/src/components/BatchProgressList.vue +5 -8
  286. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  287. package/src/components/BioTemplateExperimentWorkspaceView.vue +337 -0
  288. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  289. package/src/components/BioTemplatePackWorkspaceView.vue +176 -0
  290. package/src/components/BioTemplatePresetWorkspaceView.story.vue +151 -0
  291. package/src/components/BioTemplatePresetWorkspaceView.vue +392 -0
  292. package/src/components/BioTemplateRenderer.story.vue +57 -0
  293. package/src/components/BioTemplateRenderer.vue +269 -0
  294. package/src/components/Breadcrumb.vue +14 -8
  295. package/src/components/CalendarGridPanel.vue +120 -0
  296. package/src/components/ConcentrationInput.vue +27 -64
  297. package/src/components/ControlWorkspaceView.story.vue +336 -0
  298. package/src/components/ControlWorkspaceView.vue +347 -0
  299. package/src/components/DataFrame.vue +34 -50
  300. package/src/components/DatePicker.vue +59 -192
  301. package/src/components/DateTimePicker.vue +50 -171
  302. package/src/components/DropdownButton.vue +14 -32
  303. package/src/components/EmptyState.vue +4 -2
  304. package/src/components/ExperimentPopover.vue +5 -22
  305. package/src/components/FormBuilder.vue +124 -27
  306. package/src/components/FormFieldRenderer.vue +15 -38
  307. package/src/components/FormSection.vue +20 -73
  308. package/src/components/GroupAssigner.vue +24 -56
  309. package/src/components/GroupingModal.story.vue +3 -3
  310. package/src/components/GroupingModal.vue +30 -391
  311. package/src/components/MultiSelect.vue +17 -12
  312. package/src/components/PlateMapEditor.vue +3 -8
  313. package/src/components/PluginIcon.vue +2 -22
  314. package/src/components/ProtocolStepEditor.vue +13 -22
  315. package/src/components/ReagentList.vue +25 -33
  316. package/src/components/SampleHierarchyTree.vue +12 -23
  317. package/src/components/SampleSelector.vue +42 -122
  318. package/src/components/SegmentedControl.vue +7 -3
  319. package/src/components/SettingsButton.story.vue +1 -1
  320. package/src/components/SettingsButton.vue +15 -27
  321. package/src/components/SettingsModal.story.vue +1 -1
  322. package/src/components/SettingsModal.vue +120 -29
  323. package/src/components/TagsInput.vue +29 -14
  324. package/src/components/ThemeToggle.vue +9 -7
  325. package/src/components/TimePicker.vue +19 -41
  326. package/src/components/ToastNotification.vue +4 -57
  327. package/src/components/Tooltip.vue +7 -12
  328. package/src/components/WellEditPopup.vue +3 -8
  329. package/src/components/WellPlate.vue +4 -10
  330. package/src/components/index.ts +11 -1
  331. package/src/components/internal/FormFieldRendererInternal.vue +50 -0
  332. package/src/components/internal/FormSectionRenderer.vue +78 -0
  333. package/src/composables/index.ts +212 -0
  334. package/src/composables/platformContextHelpers.ts +74 -0
  335. package/src/composables/useBioTemplateComponents.ts +93 -0
  336. package/src/composables/useBioTemplateControls.ts +41 -0
  337. package/src/composables/useBioTemplatePackWorkspace.ts +181 -0
  338. package/src/composables/useBioTemplatePresetWorkspace.ts +337 -0
  339. package/src/composables/useBioTemplateWorkspace.ts +139 -0
  340. package/src/composables/useCalendarGrid.ts +140 -0
  341. package/src/composables/useControlSchema.ts +1274 -0
  342. package/src/composables/useDebouncedWatch.ts +119 -0
  343. package/src/composables/useDropdownState.ts +83 -0
  344. package/src/composables/useEventListener.ts +111 -0
  345. package/src/composables/useExpansionSet.ts +117 -0
  346. package/src/composables/useExperimentData.ts +20 -11
  347. package/src/composables/useExperimentSave.ts +202 -50
  348. package/src/composables/useExperimentSelector.ts +86 -72
  349. package/src/composables/useForm.ts +49 -4
  350. package/src/composables/useFormBuilder.ts +93 -42
  351. package/src/composables/useGroupAssignment.ts +148 -0
  352. package/src/composables/useListSelection.ts +158 -0
  353. package/src/composables/usePluginApi.ts +7 -14
  354. package/src/composables/usePluginClient.ts +425 -0
  355. package/src/composables/usePluginConfig.ts +34 -13
  356. package/src/composables/useRequestSyncState.ts +126 -0
  357. package/src/composables/useSampleGroups.ts +126 -0
  358. package/src/composables/useSelectionLimit.ts +57 -0
  359. package/src/composables/useSortedItems.ts +118 -0
  360. package/src/composables/useTemplateCollection.ts +229 -0
  361. package/src/composables/useTextSearch.ts +60 -0
  362. package/src/composables/useTheme.ts +2 -28
  363. package/src/composables/useTimeUtils.ts +26 -2
  364. package/src/composables/useWellPlateEditor.ts +13 -9
  365. package/src/index.ts +224 -4
  366. package/src/install.ts +11 -4
  367. package/src/stores/settings.ts +13 -9
  368. package/src/styles/components/app-page-selector.css +23 -0
  369. package/src/styles/components/app-pill-nav.css +7 -0
  370. package/src/styles/components/app-top-bar.css +34 -0
  371. package/src/styles/components/concentration-input.css +3 -142
  372. package/src/styles/components/empty-state.css +0 -16
  373. package/src/styles/components/settings-button.css +3 -66
  374. package/src/styles/components/theme-toggle.css +3 -66
  375. package/src/styles/index.css +0 -1
  376. package/src/templates/adapters.ts +785 -0
  377. package/src/templates/builders.ts +2149 -0
  378. package/src/templates/catalog.ts +245 -0
  379. package/src/templates/componentBindings.ts +615 -0
  380. package/src/templates/controlSchemas.ts +718 -0
  381. package/src/templates/index.ts +314 -0
  382. package/src/templates/lookup.ts +18 -0
  383. package/src/templates/packs.ts +156 -0
  384. package/src/templates/presets.ts +146 -0
  385. package/src/templates/types.ts +668 -0
  386. package/src/types/components.ts +41 -4
  387. package/src/types/form-builder.ts +7 -2
  388. package/src/types/index.ts +14 -0
  389. package/src/types/platform.ts +7 -1
  390. package/src/utils/formModelSync.ts +52 -0
  391. package/src/utils/items.ts +28 -0
  392. package/src/utils/options.ts +23 -0
  393. package/src/utils/pluginIcon.ts +30 -0
  394. package/dist/auth-DsI0rQ7_.js.map +0 -1
  395. package/dist/components-_XqPEhP9.js.map +0 -1
  396. package/dist/composables-tiZqLu1M.js.map +0 -1
  397. package/dist/useScheduleDrag-CA9sGNJG.js +0 -7181
  398. package/dist/useScheduleDrag-CA9sGNJG.js.map +0 -1
  399. package/src/styles/components/grouping-modal.css +0 -323
@@ -1,7 +1,8 @@
1
1
  <script setup lang="ts">
2
2
  /** Interactive 96/384-well plate grid with drag-to-select, heatmap overlays, per-well editing, and sample-color mapping. */
3
- import { ref, computed, onMounted, onUnmounted } from 'vue'
3
+ import { ref, computed } from 'vue'
4
4
  import type { WellPlateFormat, WellPlateSelectionMode, WellPlateSize, Well, HeatmapConfig, WellShape, WellEditField, WellEditData, WellLegendItem, ColumnCondition, RowCondition } from '../types'
5
+ import { useEventListener } from '../composables/useEventListener'
5
6
  import WellEditPopup from './WellEditPopup.vue'
6
7
 
7
8
  interface Props {
@@ -562,15 +563,8 @@ function handleKeyDown(event: KeyboardEvent) {
562
563
  }
563
564
  }
564
565
 
565
- onMounted(() => {
566
- document.addEventListener('mouseup', handleMouseUp)
567
- document.addEventListener('keydown', handleKeyDown)
568
- })
569
-
570
- onUnmounted(() => {
571
- document.removeEventListener('mouseup', handleMouseUp)
572
- document.removeEventListener('keydown', handleKeyDown)
573
- })
566
+ useEventListener(() => document, 'mouseup', handleMouseUp)
567
+ useEventListener(() => document, 'keydown', handleKeyDown)
574
568
 
575
569
  const containerStyle = computed(() =>
576
570
  isFillMode.value ? {} : {
@@ -27,12 +27,14 @@ export { default as FileUploader } from './FileUploader.vue'
27
27
 
28
28
  // Feedback components
29
29
  export { default as AlertBox } from './AlertBox.vue'
30
+ /** @deprecated Use AppToastContainer instead. */
30
31
  export { default as ToastNotification } from './ToastNotification.vue'
31
- export { default as AppToastContainer } from './ToastNotification.vue'
32
+ export { default as AppToastContainer } from './AppToastContainer.vue'
32
33
 
33
34
  // Action components
34
35
  export { default as IconButton } from './IconButton.vue'
35
36
  export { default as ThemeToggle } from './ThemeToggle.vue'
37
+ /** @deprecated Use AppTopBar instead. */
36
38
  export { default as SettingsButton } from './SettingsButton.vue'
37
39
 
38
40
  // Layout components
@@ -44,6 +46,7 @@ export { default as AppAvatarMenu } from './AppAvatarMenu.vue'
44
46
  export { default as AppPluginSwitcher } from './AppPluginSwitcher.vue'
45
47
  export { default as AppSidebar } from './AppSidebar.vue'
46
48
  export { default as AppLayout } from './AppLayout.vue'
49
+ export { default as ControlWorkspaceView } from './ControlWorkspaceView.vue'
47
50
  export { default as AppContainer } from './AppContainer.vue'
48
51
  export { default as PluginIcon } from './PluginIcon.vue'
49
52
 
@@ -62,6 +65,10 @@ export { default as ChartContainer } from './ChartContainer.vue'
62
65
  export { default as SettingsModal } from './SettingsModal.vue'
63
66
 
64
67
  // Biological experiment components
68
+ export { default as BioTemplateRenderer } from './BioTemplateRenderer.vue'
69
+ export { default as BioTemplateExperimentWorkspaceView } from './BioTemplateExperimentWorkspaceView.vue'
70
+ export { default as BioTemplatePackWorkspaceView } from './BioTemplatePackWorkspaceView.vue'
71
+ export { default as BioTemplatePresetWorkspaceView } from './BioTemplatePresetWorkspaceView.vue'
65
72
  export { default as WellPlate } from './WellPlate.vue'
66
73
  export { default as RackEditor } from './RackEditor.vue'
67
74
  export { default as SampleLegend } from './SampleLegend.vue'
@@ -70,6 +77,7 @@ export { default as ExperimentTimeline } from './ExperimentTimeline.vue'
70
77
 
71
78
  // Sample management components
72
79
  export { default as SampleSelector } from './SampleSelector.vue'
80
+ /** @deprecated Use AutoGroupModal instead. */
73
81
  export { default as GroupingModal } from './GroupingModal.vue'
74
82
  export { default as AutoGroupModal } from './AutoGroupModal.vue'
75
83
  export { default as GroupAssigner } from './GroupAssigner.vue'
@@ -99,8 +107,10 @@ export { default as BatchProgressList } from './BatchProgressList.vue'
99
107
 
100
108
  // Form builder components
101
109
  export { default as FormBuilder } from './FormBuilder.vue'
110
+ /** @deprecated Use FormBuilder instead. */
102
111
  export { default as FormSection } from './FormSection.vue'
103
112
  export { default as FormActions } from './FormActions.vue'
113
+ /** @deprecated Use FormBuilder instead. */
104
114
  export { default as FormFieldRenderer } from './FormFieldRenderer.vue'
105
115
 
106
116
  // Experiment data display components
@@ -0,0 +1,50 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import type { FormFieldSchema } from '../../types/form-builder'
4
+ import type { UseFormReturn } from '../../composables/useForm'
5
+ import { getFieldRegistryEntry } from '../../composables/formBuilderRegistry'
6
+ import FormField from '../FormField.vue'
7
+
8
+ interface Props {
9
+ field: FormFieldSchema
10
+ resolvedProps: Record<string, unknown>
11
+ form: UseFormReturn<Record<string, unknown>>
12
+ }
13
+
14
+ const props = defineProps<Props>()
15
+
16
+ const entry = computed(() => getFieldRegistryEntry(props.field.type))
17
+
18
+ const errorMessage = computed(() => {
19
+ const name = props.field.name
20
+ return props.form.touched[name] ? props.form.errors[name] : null
21
+ })
22
+
23
+ function handleUpload(files: File[]) {
24
+ props.form.setFieldValue(props.field.name, files)
25
+ }
26
+ </script>
27
+
28
+ <template>
29
+ <FormField
30
+ :label="field.label"
31
+ :error="errorMessage ?? undefined"
32
+ :hint="field.hint"
33
+ :required="!!field.validation?.required"
34
+ :html-for="field.name"
35
+ >
36
+ <slot :name="`field:${field.name}`" :field="field" :form="form" :field-props="form.getFieldProps(field.name)">
37
+ <component
38
+ :is="entry.component"
39
+ v-if="entry.vModel"
40
+ v-bind="resolvedProps"
41
+ />
42
+ <component
43
+ :is="entry.component"
44
+ v-else
45
+ v-bind="resolvedProps"
46
+ @upload="handleUpload"
47
+ />
48
+ </slot>
49
+ </FormField>
50
+ </template>
@@ -0,0 +1,78 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import type { FormSectionSchema, UseFormBuilderReturn } from '../../types/form-builder'
4
+ import CollapsibleCard from '../CollapsibleCard.vue'
5
+ import FormFieldRendererInternal from './FormFieldRendererInternal.vue'
6
+
7
+ interface Props {
8
+ section: FormSectionSchema
9
+ builder: UseFormBuilderReturn<Record<string, unknown>>
10
+ }
11
+
12
+ const props = defineProps<Props>()
13
+
14
+ const visibleFields = computed(() =>
15
+ props.section.fields.filter((f) => props.builder.isFieldVisible(f.name)),
16
+ )
17
+
18
+ const gridStyle = computed(() => ({
19
+ gridTemplateColumns: `repeat(${props.section.columns ?? 1}, 1fr)`,
20
+ }))
21
+ </script>
22
+
23
+ <template>
24
+ <div v-if="visibleFields.length > 0" class="mint-form-section">
25
+ <slot :name="`section:${section.id}`" :section="section" :form="builder.form">
26
+ <CollapsibleCard
27
+ v-if="section.collapsible"
28
+ :title="section.title"
29
+ :subtitle="section.description"
30
+ :default-open="section.defaultOpen ?? true"
31
+ >
32
+ <div class="mint-form-section__grid" :style="gridStyle">
33
+ <div
34
+ v-for="field in visibleFields"
35
+ :key="field.name"
36
+ :style="field.colSpan ? { gridColumn: `span ${field.colSpan}` } : undefined"
37
+ >
38
+ <slot :name="`field:${field.name}`" :field="field" :form="builder.form" :field-props="builder.form.getFieldProps(field.name)">
39
+ <FormFieldRendererInternal
40
+ :field="field"
41
+ :resolved-props="builder.getResolvedFieldProps(field)"
42
+ :form="builder.form"
43
+ />
44
+ </slot>
45
+ </div>
46
+ </div>
47
+ </CollapsibleCard>
48
+
49
+ <div v-else class="mint-form-section--static">
50
+ <div v-if="section.title || section.description" class="mint-form-section__header">
51
+ <h3 v-if="section.title" class="mint-form-section__title">{{ section.title }}</h3>
52
+ <p v-if="section.description" class="mint-form-section__description">{{ section.description }}</p>
53
+ </div>
54
+ <div class="mint-form-section__grid" :style="gridStyle">
55
+ <div
56
+ v-for="field in visibleFields"
57
+ :key="field.name"
58
+ :style="field.colSpan ? { gridColumn: `span ${field.colSpan}` } : undefined"
59
+ >
60
+ <slot :name="`field:${field.name}`" :field="field" :form="builder.form" :field-props="builder.form.getFieldProps(field.name)">
61
+ <FormFieldRendererInternal
62
+ :field="field"
63
+ :resolved-props="builder.getResolvedFieldProps(field)"
64
+ :form="builder.form"
65
+ />
66
+ </slot>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ </slot>
71
+
72
+ <slot :name="`section:${section.id}:after`" :form="builder.form" />
73
+ </div>
74
+ </template>
75
+
76
+ <style>
77
+ @import '../../styles/components/form-builder.css';
78
+ </style>
@@ -43,6 +43,7 @@ export {
43
43
  type SerialDilutionParams,
44
44
  type SerialDilutionStep,
45
45
  type SerialDilutionResult,
46
+ type ConversionResult,
46
47
  type WellConcentration,
47
48
  type UseDoseCalculatorReturn,
48
49
  } from './useDoseCalculator'
@@ -75,6 +76,7 @@ export {
75
76
  useTimeUtils,
76
77
  parseTime,
77
78
  formatTime,
79
+ formatTimeSlot,
78
80
  generateTimeSlots,
79
81
  rangesOverlap,
80
82
  durationMinutes,
@@ -84,8 +86,30 @@ export {
84
86
  snapToSlot,
85
87
  addMinutes,
86
88
  compareTime,
89
+ findNearestTimeSlotIndex,
90
+ toMinutes,
91
+ fromMinutes,
87
92
  } from './useTimeUtils'
88
93
  export { useScheduleDrag } from './useScheduleDrag'
94
+ export {
95
+ useEventListener,
96
+ type EventListenerEnabled,
97
+ type EventFor,
98
+ type EventListenerStop,
99
+ type EventMapFor,
100
+ type EventTargetGetter,
101
+ type EventTargetLike,
102
+ type UseEventListenerObjectOptions,
103
+ type UseEventListenerOptions,
104
+ } from './useEventListener'
105
+ export {
106
+ useDebouncedWatch,
107
+ type DebouncedWatchCallback,
108
+ type DebouncedWatchCleanup,
109
+ type DebouncedWatchSource,
110
+ type UseDebouncedWatchOptions,
111
+ type UseDebouncedWatchReturn,
112
+ } from './useDebouncedWatch'
89
113
  export { useFormBuilder, evaluateCondition } from './useFormBuilder'
90
114
  export { useAutoGroup, DEFAULT_COLORS, extractSamplesFromDesignData } from './useAutoGroup'
91
115
  export {
@@ -134,7 +158,195 @@ export {
134
158
  type UseExperimentSaveOptions,
135
159
  type UseExperimentSaveReturn,
136
160
  } from './useExperimentSave'
161
+ export {
162
+ useTemplateCollection,
163
+ type TemplateCollectionInput,
164
+ type UseTemplateCollectionOptions,
165
+ type UseTemplateCollectionReturn,
166
+ } from './useTemplateCollection'
167
+ export {
168
+ useRequestSyncState,
169
+ type RequestSyncRunOptions,
170
+ type RequestSyncSuccessKind,
171
+ type UseRequestSyncStateReturn,
172
+ } from './useRequestSyncState'
173
+ export {
174
+ useSelectionLimit,
175
+ type SelectionLimitSource,
176
+ type UseSelectionLimitOptions,
177
+ type UseSelectionLimitReturn,
178
+ } from './useSelectionLimit'
179
+ export {
180
+ useListSelection,
181
+ type ListSelectionSource,
182
+ type ListSelectionValue,
183
+ type UseListSelectionOptions,
184
+ type UseListSelectionReturn,
185
+ type WidenListSelectionValue,
186
+ } from './useListSelection'
187
+ export {
188
+ useGroupAssignment,
189
+ type GroupAssignmentSource,
190
+ type GroupAssignmentState,
191
+ type GroupAssignmentZone,
192
+ type UseGroupAssignmentOptions,
193
+ type UseGroupAssignmentReturn,
194
+ } from './useGroupAssignment'
195
+ export {
196
+ useSampleGroups,
197
+ type DisplaySampleSubGroup,
198
+ type SampleGroupSource,
199
+ type SampleMajorGroup,
200
+ type UseSampleGroupsOptions,
201
+ type UseSampleGroupsReturn,
202
+ } from './useSampleGroups'
203
+ export {
204
+ useExpansionSet,
205
+ type ExpansionSetSource,
206
+ type UseExpansionSetOptions,
207
+ type UseExpansionSetReturn,
208
+ } from './useExpansionSet'
209
+ export {
210
+ compareSortValues,
211
+ useSortedItems,
212
+ type CompareSortValuesOptions,
213
+ type SortComparator,
214
+ type SortComparatorContext,
215
+ type SortDescriptor,
216
+ type SortedItemsSource,
217
+ type SortOrder,
218
+ type UseSortedItemsOptions,
219
+ type UseSortedItemsReturn,
220
+ } from './useSortedItems'
221
+ export {
222
+ candidateMatchesSearch,
223
+ normalizeSearchQuery,
224
+ useTextSearch,
225
+ type TextSearchCandidate,
226
+ type TextSearchSource,
227
+ type UseTextSearchOptions,
228
+ type UseTextSearchReturn,
229
+ } from './useTextSearch'
230
+ /** @deprecated Use generated plugin clients from `mint sdk generate` instead. */
137
231
  export {
138
232
  usePluginApi,
139
233
  type UsePluginApiOptions,
140
234
  } from './usePluginApi'
235
+ export {
236
+ controlsToFormSchema,
237
+ controlsToSectionFormSchema,
238
+ controlsToSectionFormSchemas,
239
+ controlsToSidebarPanels,
240
+ controlsToSettingsSchema,
241
+ controlsToTopBarSettingsConfig,
242
+ controlsToTopBarTabs,
243
+ controlsToViewIds,
244
+ controlsToViewItems,
245
+ controlValuesToComponentProps,
246
+ defineControlModel,
247
+ defineDoseDesignControlModel,
248
+ defineDoseCalculatorControlProps,
249
+ defineControls,
250
+ defineWellPlateControlProps,
251
+ defineWellPlateDoseControlProps,
252
+ getDefaultControlView,
253
+ getControlDefaults,
254
+ useControlSchema,
255
+ useControlWorkspace,
256
+ type ControlDefinition,
257
+ type ControlComponentPropSource,
258
+ type ControlComponentPropsByIdMap,
259
+ type ControlComponentPropsMap,
260
+ type DoseDesignControlModelOptions,
261
+ type DoseCalculatorControlPropsOptions,
262
+ type ControlFormSchema,
263
+ type ControlInput,
264
+ type ControlModel,
265
+ type ControlModelBinding,
266
+ type ControlModelSectionConfig,
267
+ type ControlModelViewConfig,
268
+ type ControlOption,
269
+ type ControlOptionValue,
270
+ type ControlPrimitive,
271
+ type ControlSchema,
272
+ type ControlSchemaOptions,
273
+ type ControlShorthand,
274
+ type ControlWorkspaceOptions,
275
+ type ControlFormBinding,
276
+ type ControlSettingsBinding,
277
+ type ControlSidebarBinding,
278
+ type ControlSectionConfig,
279
+ type ControlSidebarConfig,
280
+ type ControlTopBarSettingsBinding,
281
+ type ControlViewConfig,
282
+ type ControlValues,
283
+ type UseControlSchemaReturn,
284
+ type ControlWorkspaceAppTopBarPillBinding,
285
+ type ControlWorkspaceAppTopBarTabsBinding,
286
+ type ControlWorkspaceComponentBindings,
287
+ type ControlWorkspaceFormBinding,
288
+ type ControlWorkspacePillNavBinding,
289
+ type ControlWorkspaceSidebarBinding,
290
+ type ControlWorkspaceTopBarBinding,
291
+ type ControlWorkspaceTopBarSettingsBinding,
292
+ type UseControlWorkspaceReturn,
293
+ type WellPlateControlPropsOptions,
294
+ type WellPlateDoseControlPropsOptions,
295
+ } from './useControlSchema'
296
+ export {
297
+ getBioTemplateControlSchema,
298
+ requireBioTemplateControlSchema,
299
+ useBioTemplateControls,
300
+ type BioTemplateControlSchema,
301
+ type BioTemplateControlTarget,
302
+ } from './useBioTemplateControls'
303
+ export {
304
+ getBioTemplateComponentProps,
305
+ getBioTemplateComponentBindings,
306
+ toBioTemplateComponentProps,
307
+ toBioTemplateComponentPropsByComponent,
308
+ toBioTemplateComponentPropsById,
309
+ useBioTemplateComponents,
310
+ type BioTemplateComponentBinding,
311
+ type BioTemplateComponentPropsByComponent,
312
+ type BioTemplateComponentPropsBinding,
313
+ type BioTemplateComponentPropsById,
314
+ type BioTemplateComponentPropsLookupOptions,
315
+ type BioTemplateComponentTarget,
316
+ type UseBioTemplateComponentsReturn,
317
+ } from './useBioTemplateComponents'
318
+ export {
319
+ useBioTemplateWorkspace,
320
+ type BioTemplateRendererBinding,
321
+ type BioTemplateWorkspaceBindings,
322
+ type BioTemplateWorkspaceTarget,
323
+ type UseBioTemplateWorkspaceReturn,
324
+ } from './useBioTemplateWorkspace'
325
+ export {
326
+ useBioTemplatePresetWorkspace,
327
+ type BioTemplatePresetWorkspaceBindings,
328
+ type UseBioTemplatePresetWorkspaceOptions,
329
+ type UseBioTemplatePresetWorkspaceReturn,
330
+ } from './useBioTemplatePresetWorkspace'
331
+ export {
332
+ useBioTemplatePackWorkspace,
333
+ type UseBioTemplatePackWorkspaceOptions,
334
+ type UseBioTemplatePackWorkspaceReturn,
335
+ } from './useBioTemplatePackWorkspace'
336
+ export {
337
+ buildPluginEndpointUrl,
338
+ createPluginClient,
339
+ resolvePluginBaseUrl,
340
+ usePluginClient,
341
+ usePluginSettings,
342
+ useCurrentExperiment,
343
+ type BuildPluginEndpointUrlOptions,
344
+ type PluginContract,
345
+ type PluginEndpointContract,
346
+ type PluginEndpointDefinition,
347
+ type PluginHttpMethod,
348
+ type PluginNavItemContract,
349
+ type CreatePluginClientOptions,
350
+ type UseCurrentExperimentOptions,
351
+ type UseCurrentExperimentReturn,
352
+ } from './usePluginClient'
@@ -0,0 +1,74 @@
1
+ import type { PlatformContext } from '../types'
2
+
3
+ export type ExperimentAwarePlatformContext = PlatformContext & {
4
+ currentExperiment?: unknown
5
+ currentExperimentId?: unknown
6
+ experiment?: unknown
7
+ experimentId?: unknown
8
+ }
9
+
10
+ export function getInjectedPlatformContext(): PlatformContext | undefined {
11
+ if (typeof window === 'undefined') return undefined
12
+ return (window as unknown as { __MINT_PLATFORM__?: PlatformContext }).__MINT_PLATFORM__
13
+ }
14
+
15
+ export function getInjectedExperimentContext(): ExperimentAwarePlatformContext | undefined {
16
+ return getInjectedPlatformContext() as ExperimentAwarePlatformContext | undefined
17
+ }
18
+
19
+ export function currentExperimentFromContext<TExperiment>(
20
+ context: ExperimentAwarePlatformContext | undefined = getInjectedExperimentContext(),
21
+ ): TExperiment | undefined {
22
+ const candidate = context?.currentExperiment ?? context?.experiment
23
+ return candidate && typeof candidate === 'object'
24
+ ? candidate as TExperiment
25
+ : undefined
26
+ }
27
+
28
+ export function currentExperimentIdFromContext(
29
+ context: ExperimentAwarePlatformContext | undefined = getInjectedExperimentContext(),
30
+ ): number | undefined {
31
+ return parseExperimentId(
32
+ context?.currentExperimentId ??
33
+ context?.experimentId ??
34
+ context?.currentExperiment ??
35
+ context?.experiment,
36
+ )
37
+ }
38
+
39
+ export function currentExperimentIdFromUrl(): number | undefined {
40
+ if (typeof window === 'undefined') return undefined
41
+ const params = new URLSearchParams(window.location.search)
42
+ return parseExperimentId(params.get('experimentId') ?? params.get('experiment_id'))
43
+ ?? experimentIdFromPath(window.location.pathname)
44
+ ?? experimentIdFromPath(window.location.hash.replace(/^#\/?/, '/'))
45
+ }
46
+
47
+ export function resolveCurrentExperimentId(
48
+ context: ExperimentAwarePlatformContext | undefined = getInjectedExperimentContext(),
49
+ ): number | undefined {
50
+ return currentExperimentIdFromContext(context) ?? currentExperimentIdFromUrl()
51
+ }
52
+
53
+ export function parseExperimentId(value: unknown): number | undefined {
54
+ if (typeof value === 'number' && Number.isFinite(value)) return value
55
+ if (typeof value === 'string' && value.trim()) {
56
+ const parsed = Number(value)
57
+ return Number.isFinite(parsed) ? parsed : undefined
58
+ }
59
+ if (value && typeof value === 'object' && 'id' in value) {
60
+ return parseExperimentId((value as { id?: unknown }).id)
61
+ }
62
+ return undefined
63
+ }
64
+
65
+ function experimentIdFromPath(path: string): number | undefined {
66
+ const segments = path.split('/').filter(Boolean)
67
+ for (let index = 0; index < segments.length - 1; index += 1) {
68
+ const segment = segments[index]?.toLowerCase()
69
+ if (segment === 'experiment' || segment === 'experiments') {
70
+ return parseExperimentId(decodeURIComponent(segments[index + 1] ?? ''))
71
+ }
72
+ }
73
+ return undefined
74
+ }
@@ -0,0 +1,93 @@
1
+ import {
2
+ getBioTemplateComponentBindings,
3
+ getBioTemplateComponentProps as getTemplateComponentProps,
4
+ toBioTemplateComponentImports,
5
+ toBioTemplateComponentProps,
6
+ toBioTemplateComponentPropsByComponent as toTemplateComponentPropsByComponent,
7
+ toBioTemplateComponentPropsById,
8
+ toBioTemplateComponentSnippets,
9
+ toBioTemplateComponentUsage,
10
+ type BioTemplateComponentBinding,
11
+ type BioTemplateComponentImport,
12
+ type BioTemplateComponentPropsByComponent,
13
+ type BioTemplateComponentPropsBinding,
14
+ type BioTemplateComponentPropsById,
15
+ type BioTemplateComponentPropsLookupOptions,
16
+ type BioTemplateComponentSnippet,
17
+ type BioTemplateComponentTarget,
18
+ type BioTemplateComponentUsage,
19
+ } from '../templates/componentBindings'
20
+ import type {
21
+ BioTemplateEnvelope,
22
+ TemplateCollectionEnvelope,
23
+ } from '../templates/types'
24
+
25
+ export {
26
+ getBioTemplateComponentBindings,
27
+ toBioTemplateComponentImports,
28
+ toBioTemplateComponentProps,
29
+ toBioTemplateComponentPropsById,
30
+ toBioTemplateComponentSnippets,
31
+ toBioTemplateComponentUsage,
32
+ }
33
+
34
+ export type {
35
+ BioTemplateComponentBinding,
36
+ BioTemplateComponentImport,
37
+ BioTemplateComponentPropsByComponent,
38
+ BioTemplateComponentPropsBinding,
39
+ BioTemplateComponentPropsById,
40
+ BioTemplateComponentPropsLookupOptions,
41
+ BioTemplateComponentSnippet,
42
+ BioTemplateComponentTarget,
43
+ BioTemplateComponentUsage,
44
+ }
45
+
46
+ export interface UseBioTemplateComponentsReturn {
47
+ bindings: BioTemplateComponentBinding[]
48
+ imports: BioTemplateComponentImport[]
49
+ componentProps: BioTemplateComponentPropsBinding[]
50
+ componentPropsById: BioTemplateComponentPropsById
51
+ componentPropsByComponent: BioTemplateComponentPropsByComponent
52
+ snippets: BioTemplateComponentSnippet[]
53
+ usage: BioTemplateComponentUsage | null
54
+ getComponentProps: (
55
+ component: string,
56
+ options?: BioTemplateComponentPropsLookupOptions,
57
+ ) => Record<string, unknown> | undefined
58
+ }
59
+
60
+ /** Return component props grouped by SDK component name for direct WellPlate/DoseCalculator binding. */
61
+ export function toBioTemplateComponentPropsByComponent(
62
+ target: BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope,
63
+ ): BioTemplateComponentPropsByComponent {
64
+ return toTemplateComponentPropsByComponent(target)
65
+ }
66
+
67
+ /** Return the first props object for an SDK component, optionally restricted by template id or binding id. */
68
+ export function getBioTemplateComponentProps(
69
+ target: BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope,
70
+ component: string,
71
+ options: BioTemplateComponentPropsLookupOptions = {},
72
+ ): Record<string, unknown> | undefined {
73
+ return getTemplateComponentProps(target, component, options)
74
+ }
75
+
76
+ /** Map built-in biology templates to SDK components such as WellPlate, DataFrame, DoseCalculator, and PlateMapEditor. */
77
+ export function useBioTemplateComponents(
78
+ target: BioTemplateComponentTarget
79
+ ): UseBioTemplateComponentsReturn {
80
+ return {
81
+ bindings: getBioTemplateComponentBindings(target),
82
+ imports: toBioTemplateComponentImports(target),
83
+ componentProps: typeof target === 'string' ? [] : toBioTemplateComponentProps(target),
84
+ componentPropsById: typeof target === 'string' ? {} : toBioTemplateComponentPropsById(target),
85
+ componentPropsByComponent: typeof target === 'string' ? {} : toBioTemplateComponentPropsByComponent(target),
86
+ snippets: typeof target === 'string' ? [] : toBioTemplateComponentSnippets(target),
87
+ usage: typeof target === 'string' ? null : toBioTemplateComponentUsage(target),
88
+ getComponentProps: (component, options) =>
89
+ typeof target === 'string'
90
+ ? undefined
91
+ : getBioTemplateComponentProps(target, component, options),
92
+ }
93
+ }
@@ -0,0 +1,41 @@
1
+ import {
2
+ createBioTemplateControlToolkit,
3
+ getBioTemplateControlSchema,
4
+ requireBioTemplateControlSchema,
5
+ type BioTemplateControlSchema,
6
+ type BioTemplateControlTarget,
7
+ } from '../templates/controlSchemas'
8
+ import type {
9
+ ControlSchemaOptions,
10
+ ControlWorkspaceOptions,
11
+ UseControlSchemaReturn,
12
+ } from './useControlSchema'
13
+
14
+ export {
15
+ getBioTemplateControlSchema,
16
+ requireBioTemplateControlSchema,
17
+ }
18
+
19
+ export type {
20
+ BioTemplateControlSchema,
21
+ BioTemplateControlTarget,
22
+ }
23
+
24
+ /** Build FormBuilder schema, AppSidebar panels, and defaults for a built-in biology template or preset. */
25
+ export function useBioTemplateControls(
26
+ target: BioTemplateControlTarget,
27
+ options: ControlWorkspaceOptions = {},
28
+ ): UseControlSchemaReturn<BioTemplateControlSchema> {
29
+ const { initialValues, topBarSettings: _topBarSettings, ...schemaOptions } = options
30
+ const controls = createBioTemplateControlToolkit(target, schemaOptions as ControlSchemaOptions)
31
+
32
+ if (initialValues === undefined) return controls
33
+
34
+ return {
35
+ ...controls,
36
+ initialValues: {
37
+ ...controls.initialValues,
38
+ ...initialValues,
39
+ },
40
+ }
41
+ }