@morscherlab/mint-sdk 1.0.0-beta.1 → 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 (421) 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/PluginIcon.test.d.ts +1 -0
  30. package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
  31. package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
  32. package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
  33. package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
  34. package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
  35. package/dist/__tests__/components/SettingsButton.test.d.ts +1 -0
  36. package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
  37. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  38. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  39. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  40. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  41. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  42. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  43. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  44. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  45. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  46. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  47. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  48. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  49. package/dist/__tests__/composables/useExperimentData.test.d.ts +1 -0
  50. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  51. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  52. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  53. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  54. package/dist/__tests__/composables/usePluginConfig.test.d.ts +1 -0
  55. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  56. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  57. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  58. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  59. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  60. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  61. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  62. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  63. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  64. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  65. package/dist/{auth-DsI0rQ7_.js → auth-QQj2kkze.js} +12 -5
  66. package/dist/auth-QQj2kkze.js.map +1 -0
  67. package/dist/components/ActionItem.vue.d.ts +32 -0
  68. package/dist/components/AppAvatarMenu.vue.d.ts +2 -7
  69. package/dist/components/AppPageSelector.vue.d.ts +3 -6
  70. package/dist/components/AppPillNav.vue.d.ts +2 -2
  71. package/dist/components/AppSidebar.vue.d.ts +56 -3
  72. package/dist/components/AppToastContainer.vue.d.ts +2 -0
  73. package/dist/components/AppTopBar.vue.d.ts +43 -10
  74. package/dist/components/BaseButton.vue.d.ts +2 -2
  75. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  76. package/dist/components/BaseInput.vue.d.ts +2 -2
  77. package/dist/components/BasePill.vue.d.ts +3 -3
  78. package/dist/components/BaseRadioGroup.vue.d.ts +4 -4
  79. package/dist/components/BaseSelect.vue.d.ts +4 -4
  80. package/dist/components/BaseSlider.vue.d.ts +1 -1
  81. package/dist/components/BaseTabs.vue.d.ts +2 -2
  82. package/dist/components/BaseTextarea.vue.d.ts +2 -2
  83. package/dist/components/BaseToggle.vue.d.ts +1 -1
  84. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +117 -0
  85. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +92 -0
  86. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +82 -0
  87. package/dist/components/BioTemplateRenderer.vue.d.ts +29 -0
  88. package/dist/components/Breadcrumb.vue.d.ts +2 -2
  89. package/dist/components/Calendar.vue.d.ts +1 -1
  90. package/dist/components/CalendarGridPanel.vue.d.ts +25 -0
  91. package/dist/components/CollapsibleCard.vue.d.ts +1 -1
  92. package/dist/components/ColorSlider.vue.d.ts +1 -1
  93. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  94. package/dist/components/ConfirmDialog.vue.d.ts +2 -2
  95. package/dist/components/ControlWorkspaceView.vue.d.ts +130 -0
  96. package/dist/components/DatePicker.vue.d.ts +2 -2
  97. package/dist/components/DateTimePicker.vue.d.ts +3 -3
  98. package/dist/components/DropdownButton.vue.d.ts +4 -4
  99. package/dist/components/EmptyState.vue.d.ts +1 -2
  100. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  101. package/dist/components/ExperimentTimeline.vue.d.ts +2 -2
  102. package/dist/components/FileUploader.vue.d.ts +2 -2
  103. package/dist/components/FitPanel.vue.d.ts +1 -1
  104. package/dist/components/FormActions.vue.d.ts +4 -4
  105. package/dist/components/FormBuilder.vue.d.ts +22 -8
  106. package/dist/components/FormFieldRenderer.vue.d.ts +7 -10
  107. package/dist/components/FormSection.vue.d.ts +11 -24
  108. package/dist/components/FormulaInput.vue.d.ts +2 -2
  109. package/dist/components/IconButton.vue.d.ts +1 -1
  110. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  111. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  112. package/dist/components/MultiSelect.vue.d.ts +3 -3
  113. package/dist/components/NumberInput.vue.d.ts +2 -2
  114. package/dist/components/PluginIcon.vue.d.ts +11 -0
  115. package/dist/components/ProgressBar.vue.d.ts +2 -2
  116. package/dist/components/ProtocolStepEditor.vue.d.ts +3 -1
  117. package/dist/components/RackEditor.vue.d.ts +2 -2
  118. package/dist/components/ReagentEditor.vue.d.ts +1 -1
  119. package/dist/components/ResourceCard.vue.d.ts +1 -1
  120. package/dist/components/SampleLegend.vue.d.ts +2 -2
  121. package/dist/components/SampleSelector.vue.d.ts +1 -1
  122. package/dist/components/ScheduleCalendar.vue.d.ts +2 -2
  123. package/dist/components/ScientificNumber.vue.d.ts +1 -1
  124. package/dist/components/SegmentedControl.vue.d.ts +3 -3
  125. package/dist/components/SequenceInput.vue.d.ts +3 -3
  126. package/dist/components/SettingsButton.vue.d.ts +2 -2
  127. package/dist/components/SettingsModal.vue.d.ts +32 -4
  128. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  129. package/dist/components/TagsInput.vue.d.ts +3 -2
  130. package/dist/components/TimePicker.vue.d.ts +3 -3
  131. package/dist/components/TimeRangeInput.vue.d.ts +2 -2
  132. package/dist/components/UnitInput.vue.d.ts +2 -2
  133. package/dist/components/WellPlate.vue.d.ts +8 -8
  134. package/dist/components/index.d.ts +12 -1
  135. package/dist/components/index.js +3 -3
  136. package/dist/components/internal/FormFieldRendererInternal.vue.d.ts +31 -0
  137. package/dist/components/internal/FormSectionRenderer.vue.d.ts +43 -0
  138. package/dist/{components-CzbQQPCb.js → components-D_Sr0adg.js} +9629 -8647
  139. package/dist/components-D_Sr0adg.js.map +1 -0
  140. package/dist/composables/index.d.ts +21 -2
  141. package/dist/composables/index.js +4 -3
  142. package/dist/composables/platformContextHelpers.d.ts +14 -0
  143. package/dist/composables/useBioTemplateComponents.d.ts +20 -0
  144. package/dist/composables/useBioTemplateControls.d.ts +6 -0
  145. package/dist/composables/useBioTemplatePackWorkspace.d.ts +45 -0
  146. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +74 -0
  147. package/dist/composables/useBioTemplateWorkspace.d.ts +50 -0
  148. package/dist/composables/useCalendarGrid.d.ts +26 -0
  149. package/dist/composables/useControlSchema.d.ts +321 -0
  150. package/dist/composables/useDebouncedWatch.d.ts +20 -0
  151. package/dist/composables/useDropdownState.d.ts +19 -0
  152. package/dist/composables/useEventListener.d.ts +13 -0
  153. package/dist/composables/useExpansionSet.d.ts +21 -0
  154. package/dist/composables/useExperimentData.d.ts +10 -0
  155. package/dist/composables/useExperimentSave.d.ts +31 -2
  156. package/dist/composables/useExperimentSelector.d.ts +20 -0
  157. package/dist/composables/useForm.d.ts +2 -0
  158. package/dist/composables/useGroupAssignment.d.ts +31 -0
  159. package/dist/composables/useListSelection.d.ts +35 -0
  160. package/dist/composables/usePlatformContext.d.ts +24 -3
  161. package/dist/composables/usePluginApi.d.ts +7 -14
  162. package/dist/composables/usePluginClient.d.ts +109 -0
  163. package/dist/composables/usePluginConfig.d.ts +12 -0
  164. package/dist/composables/useRequestSyncState.d.ts +34 -0
  165. package/dist/composables/useSampleGroups.d.ts +32 -0
  166. package/dist/composables/useSelectionLimit.d.ts +17 -0
  167. package/dist/composables/useSortedItems.d.ts +32 -0
  168. package/dist/composables/useTemplateCollection.d.ts +58 -0
  169. package/dist/composables/useTextSearch.d.ts +18 -0
  170. package/dist/composables/useTimeUtils.d.ts +8 -0
  171. package/dist/{composables-BXklV5ii.js → composables-C3dpXQN5.js} +228 -146
  172. package/dist/composables-C3dpXQN5.js.map +1 -0
  173. package/dist/index.d.ts +12 -3
  174. package/dist/index.js +6 -5
  175. package/dist/install.d.ts +7 -2
  176. package/dist/install.js +2 -2
  177. package/dist/install.js.map +1 -1
  178. package/dist/stores/auth.d.ts +1 -1
  179. package/dist/stores/index.js +1 -1
  180. package/dist/stores/settings.d.ts +4 -1
  181. package/dist/styles.css +5255 -5654
  182. package/dist/templates/adapters.d.ts +43 -0
  183. package/dist/templates/builders.d.ts +63 -0
  184. package/dist/templates/catalog.d.ts +188 -0
  185. package/dist/templates/componentBindings.d.ts +58 -0
  186. package/dist/templates/controlSchemas.d.ts +25 -0
  187. package/dist/templates/index.d.ts +15 -0
  188. package/dist/templates/index.js +2 -0
  189. package/dist/templates/lookup.d.ts +4 -0
  190. package/dist/templates/packs.d.ts +18 -0
  191. package/dist/templates/presets.d.ts +90 -0
  192. package/dist/templates/types.d.ts +531 -0
  193. package/dist/templates-50NPjaxL.js +9333 -0
  194. package/dist/templates-50NPjaxL.js.map +1 -0
  195. package/dist/types/components.d.ts +62 -1
  196. package/dist/types/form-builder.d.ts +6 -8
  197. package/dist/types/index.d.ts +2 -2
  198. package/dist/types/platform.d.ts +8 -1
  199. package/dist/useScheduleDrag-D4oWdh41.js +4371 -0
  200. package/dist/useScheduleDrag-D4oWdh41.js.map +1 -0
  201. package/dist/utils/formModelSync.d.ts +5 -0
  202. package/dist/utils/items.d.ts +8 -0
  203. package/dist/utils/options.d.ts +6 -0
  204. package/dist/utils/pluginIcon.d.ts +9 -0
  205. package/package.json +7 -2
  206. package/src/__tests__/components/ActionItem.test.ts +99 -0
  207. package/src/__tests__/components/AppAvatarMenu.test.ts +27 -0
  208. package/src/__tests__/components/AppPageSelector.test.ts +134 -0
  209. package/src/__tests__/components/AppPillNav.test.ts +78 -0
  210. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  211. package/src/__tests__/components/AppSidebar.test.ts +370 -0
  212. package/src/__tests__/components/AppToastContainer.test.ts +48 -0
  213. package/src/__tests__/components/AppTopBar.test.ts +414 -13
  214. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  215. package/src/__tests__/components/BaseSelect.test.ts +21 -0
  216. package/src/__tests__/components/BaseTabs.test.ts +25 -0
  217. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  218. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +153 -0
  219. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +161 -0
  220. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +281 -0
  221. package/src/__tests__/components/BioTemplateRenderer.test.ts +71 -0
  222. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  223. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  224. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  225. package/src/__tests__/components/ControlWorkspaceView.test.ts +1031 -0
  226. package/src/__tests__/components/DataFrame.test.ts +11 -0
  227. package/src/__tests__/components/DatePicker.test.ts +45 -0
  228. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  229. package/src/__tests__/components/DropdownButton.test.ts +23 -0
  230. package/src/__tests__/components/EmptyState.test.ts +23 -0
  231. package/src/__tests__/components/ExperimentPopover.test.ts +56 -0
  232. package/src/__tests__/components/FormBuilder.test.ts +296 -0
  233. package/src/__tests__/components/FormCompatibility.test.ts +94 -0
  234. package/src/__tests__/components/GroupAssigner.test.ts +30 -0
  235. package/src/__tests__/components/GroupingModal.test.ts +73 -0
  236. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  237. package/src/__tests__/components/PluginIcon.test.ts +119 -0
  238. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  239. package/src/__tests__/components/ReagentList.test.ts +82 -0
  240. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  241. package/src/__tests__/components/SampleSelector.test.ts +60 -0
  242. package/src/__tests__/components/SegmentedControl.test.ts +24 -0
  243. package/src/__tests__/components/SettingsButton.test.ts +44 -0
  244. package/src/__tests__/components/SettingsModal.test.ts +296 -0
  245. package/src/__tests__/components/TagsInput.test.ts +75 -0
  246. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  247. package/src/__tests__/components/TimePicker.test.ts +38 -0
  248. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +122 -0
  249. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  250. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +99 -0
  251. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  252. package/src/__tests__/composables/useControlSchema.test.ts +919 -0
  253. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  254. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  255. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  256. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  257. package/src/__tests__/composables/useExperimentData.test.ts +4 -0
  258. package/src/__tests__/composables/useExperimentSave.test.ts +203 -8
  259. package/src/__tests__/composables/useExperimentSelector.test.ts +164 -0
  260. package/src/__tests__/composables/useForm.test.ts +58 -0
  261. package/src/__tests__/composables/useFormBuilder.test.ts +77 -0
  262. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  263. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  264. package/src/__tests__/composables/usePluginClient.test.ts +444 -0
  265. package/src/__tests__/composables/usePluginConfig.test.ts +5 -0
  266. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  267. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  268. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  269. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  270. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  271. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  272. package/src/__tests__/composables/useTheme.test.ts +91 -0
  273. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  274. package/src/__tests__/docs/frontendDocsCatalog.test.ts +229 -0
  275. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  276. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  277. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  278. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  279. package/src/__tests__/templates/templates.test.ts +1043 -0
  280. package/src/components/ActionItem.vue +82 -0
  281. package/src/components/AppAvatarMenu.vue +15 -69
  282. package/src/components/AppLayout.story.vue +25 -25
  283. package/src/components/AppPageSelector.vue +63 -94
  284. package/src/components/AppPillNav.vue +44 -39
  285. package/src/components/AppPluginSwitcher.vue +41 -145
  286. package/src/components/AppSidebar.story.vue +94 -0
  287. package/src/components/AppSidebar.vue +187 -12
  288. package/src/components/{ToastNotification.story.vue → AppToastContainer.story.vue} +6 -6
  289. package/src/components/AppToastContainer.vue +62 -0
  290. package/src/components/AppTopBar.story.vue +7 -30
  291. package/src/components/AppTopBar.vue +283 -84
  292. package/src/components/BaseModal.vue +3 -5
  293. package/src/components/BaseRadioGroup.vue +7 -3
  294. package/src/components/BaseSelect.vue +11 -7
  295. package/src/components/BaseTabs.vue +6 -4
  296. package/src/components/BatchProgressList.vue +5 -8
  297. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  298. package/src/components/BioTemplateExperimentWorkspaceView.vue +337 -0
  299. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  300. package/src/components/BioTemplatePackWorkspaceView.vue +176 -0
  301. package/src/components/BioTemplatePresetWorkspaceView.story.vue +151 -0
  302. package/src/components/BioTemplatePresetWorkspaceView.vue +392 -0
  303. package/src/components/BioTemplateRenderer.story.vue +57 -0
  304. package/src/components/BioTemplateRenderer.vue +269 -0
  305. package/src/components/Breadcrumb.vue +14 -8
  306. package/src/components/CalendarGridPanel.vue +120 -0
  307. package/src/components/ConcentrationInput.vue +27 -64
  308. package/src/components/ControlWorkspaceView.story.vue +336 -0
  309. package/src/components/ControlWorkspaceView.vue +347 -0
  310. package/src/components/DataFrame.vue +34 -50
  311. package/src/components/DatePicker.vue +59 -192
  312. package/src/components/DateTimePicker.vue +50 -171
  313. package/src/components/DropdownButton.vue +14 -32
  314. package/src/components/EmptyState.vue +4 -2
  315. package/src/components/ExperimentPopover.vue +5 -22
  316. package/src/components/FormBuilder.vue +124 -27
  317. package/src/components/FormFieldRenderer.vue +15 -38
  318. package/src/components/FormSection.vue +20 -73
  319. package/src/components/GroupAssigner.vue +24 -56
  320. package/src/components/GroupingModal.story.vue +3 -3
  321. package/src/components/GroupingModal.vue +30 -391
  322. package/src/components/MultiSelect.vue +17 -12
  323. package/src/components/PlateMapEditor.vue +3 -8
  324. package/src/components/PluginIcon.story.vue +71 -0
  325. package/src/components/PluginIcon.vue +68 -0
  326. package/src/components/ProtocolStepEditor.vue +13 -22
  327. package/src/components/ReagentList.vue +25 -33
  328. package/src/components/SampleHierarchyTree.vue +12 -23
  329. package/src/components/SampleSelector.vue +42 -122
  330. package/src/components/SegmentedControl.vue +7 -3
  331. package/src/components/SettingsButton.story.vue +1 -1
  332. package/src/components/SettingsButton.vue +15 -27
  333. package/src/components/SettingsModal.story.vue +337 -45
  334. package/src/components/SettingsModal.vue +344 -66
  335. package/src/components/TagsInput.vue +29 -14
  336. package/src/components/ThemeToggle.vue +9 -7
  337. package/src/components/TimePicker.vue +19 -41
  338. package/src/components/ToastNotification.vue +4 -57
  339. package/src/components/Tooltip.vue +7 -12
  340. package/src/components/WellEditPopup.vue +3 -8
  341. package/src/components/WellPlate.vue +4 -10
  342. package/src/components/index.ts +12 -1
  343. package/src/components/internal/FormFieldRendererInternal.vue +50 -0
  344. package/src/components/internal/FormSectionRenderer.vue +78 -0
  345. package/src/composables/index.ts +212 -0
  346. package/src/composables/platformContextHelpers.ts +74 -0
  347. package/src/composables/useBioTemplateComponents.ts +93 -0
  348. package/src/composables/useBioTemplateControls.ts +41 -0
  349. package/src/composables/useBioTemplatePackWorkspace.ts +181 -0
  350. package/src/composables/useBioTemplatePresetWorkspace.ts +337 -0
  351. package/src/composables/useBioTemplateWorkspace.ts +139 -0
  352. package/src/composables/useCalendarGrid.ts +140 -0
  353. package/src/composables/useControlSchema.ts +1274 -0
  354. package/src/composables/useDebouncedWatch.ts +119 -0
  355. package/src/composables/useDropdownState.ts +83 -0
  356. package/src/composables/useEventListener.ts +111 -0
  357. package/src/composables/useExpansionSet.ts +117 -0
  358. package/src/composables/useExperimentData.ts +20 -11
  359. package/src/composables/useExperimentSave.ts +202 -50
  360. package/src/composables/useExperimentSelector.ts +86 -72
  361. package/src/composables/useForm.ts +49 -4
  362. package/src/composables/useFormBuilder.ts +93 -42
  363. package/src/composables/useGroupAssignment.ts +148 -0
  364. package/src/composables/useListSelection.ts +158 -0
  365. package/src/composables/usePluginApi.ts +7 -14
  366. package/src/composables/usePluginClient.ts +425 -0
  367. package/src/composables/usePluginConfig.ts +34 -13
  368. package/src/composables/useRequestSyncState.ts +126 -0
  369. package/src/composables/useSampleGroups.ts +126 -0
  370. package/src/composables/useSelectionLimit.ts +57 -0
  371. package/src/composables/useSortedItems.ts +118 -0
  372. package/src/composables/useTemplateCollection.ts +229 -0
  373. package/src/composables/useTextSearch.ts +60 -0
  374. package/src/composables/useTheme.ts +2 -28
  375. package/src/composables/useTimeUtils.ts +26 -2
  376. package/src/composables/useWellPlateEditor.ts +13 -9
  377. package/src/index.ts +228 -4
  378. package/src/install.ts +11 -4
  379. package/src/stores/settings.ts +13 -9
  380. package/src/styles/components/app-page-selector.css +23 -0
  381. package/src/styles/components/app-pill-nav.css +8 -2
  382. package/src/styles/components/app-top-bar.css +35 -2
  383. package/src/styles/components/button.css +3 -7
  384. package/src/styles/components/concentration-input.css +3 -142
  385. package/src/styles/components/dropdown-button.css +4 -4
  386. package/src/styles/components/empty-state.css +0 -16
  387. package/src/styles/components/input.css +4 -5
  388. package/src/styles/components/number-input.css +3 -3
  389. package/src/styles/components/plugin-icon.css +38 -0
  390. package/src/styles/components/segmented-control.css +4 -7
  391. package/src/styles/components/settings-button.css +3 -66
  392. package/src/styles/components/settings-modal.css +184 -0
  393. package/src/styles/components/tabs.css +1 -2
  394. package/src/styles/components/textarea.css +4 -5
  395. package/src/styles/components/theme-toggle.css +3 -66
  396. package/src/styles/components/unit-input.css +3 -3
  397. package/src/styles/index.css +0 -1
  398. package/src/templates/adapters.ts +785 -0
  399. package/src/templates/builders.ts +2149 -0
  400. package/src/templates/catalog.ts +245 -0
  401. package/src/templates/componentBindings.ts +615 -0
  402. package/src/templates/controlSchemas.ts +718 -0
  403. package/src/templates/index.ts +314 -0
  404. package/src/templates/lookup.ts +18 -0
  405. package/src/templates/packs.ts +156 -0
  406. package/src/templates/presets.ts +146 -0
  407. package/src/templates/types.ts +668 -0
  408. package/src/types/components.ts +80 -1
  409. package/src/types/form-builder.ts +7 -2
  410. package/src/types/index.ts +17 -0
  411. package/src/types/platform.ts +8 -1
  412. package/src/utils/formModelSync.ts +52 -0
  413. package/src/utils/items.ts +28 -0
  414. package/src/utils/options.ts +23 -0
  415. package/src/utils/pluginIcon.ts +30 -0
  416. package/dist/auth-DsI0rQ7_.js.map +0 -1
  417. package/dist/components-CzbQQPCb.js.map +0 -1
  418. package/dist/composables-BXklV5ii.js.map +0 -1
  419. package/dist/useScheduleDrag-CxBeqYcu.js +0 -7181
  420. package/dist/useScheduleDrag-CxBeqYcu.js.map +0 -1
  421. package/src/styles/components/grouping-modal.css +0 -323
@@ -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
+ }
@@ -0,0 +1,181 @@
1
+ import {
2
+ computed,
3
+ effectScope,
4
+ getCurrentScope,
5
+ onScopeDispose,
6
+ shallowRef,
7
+ watch,
8
+ type ComputedRef,
9
+ type EffectScope,
10
+ type Ref,
11
+ } from 'vue'
12
+ import {
13
+ createBioTemplatePackCollection,
14
+ getBioTemplatePackInfo,
15
+ type BioTemplatePackEntry,
16
+ type TemplateCollectionEnvelope,
17
+ type TemplatePackId,
18
+ } from '../templates'
19
+ import {
20
+ useTemplateCollection,
21
+ type UseTemplateCollectionOptions,
22
+ type UseTemplateCollectionReturn,
23
+ } from './useTemplateCollection'
24
+ import {
25
+ useBioTemplateWorkspace,
26
+ type BioTemplateRendererBinding,
27
+ type BioTemplateWorkspaceBindings,
28
+ type UseBioTemplateWorkspaceReturn,
29
+ } from './useBioTemplateWorkspace'
30
+ import type {
31
+ BioTemplateComponentBinding,
32
+ BioTemplateComponentImport,
33
+ BioTemplateComponentPropsByComponent,
34
+ BioTemplateComponentPropsBinding,
35
+ BioTemplateComponentPropsById,
36
+ BioTemplateComponentSnippet,
37
+ BioTemplateComponentUsage,
38
+ } from './useBioTemplateComponents'
39
+
40
+ export type UseBioTemplatePackWorkspaceOptions = UseTemplateCollectionOptions
41
+
42
+ export interface UseBioTemplatePackWorkspaceReturn {
43
+ packId: TemplatePackId
44
+ pack: BioTemplatePackEntry
45
+ collection: Ref<TemplateCollectionEnvelope>
46
+ templates: UseTemplateCollectionReturn['templates']
47
+ templateIds: UseTemplateCollectionReturn['templateIds']
48
+ currentExperimentId: UseTemplateCollectionReturn['currentExperimentId']
49
+ hasCurrentExperiment: UseTemplateCollectionReturn['hasCurrentExperiment']
50
+ loading: UseTemplateCollectionReturn['isLoading']
51
+ saving: UseTemplateCollectionReturn['isSaving']
52
+ error: UseTemplateCollectionReturn['error']
53
+ lastLoadedAt: UseTemplateCollectionReturn['lastLoadedAt']
54
+ lastSavedAt: UseTemplateCollectionReturn['lastSavedAt']
55
+ renderer: ComputedRef<BioTemplateRendererBinding>
56
+ workspace: ComputedRef<UseBioTemplateWorkspaceReturn>
57
+ form: ComputedRef<UseBioTemplateWorkspaceReturn['form']>
58
+ sidebar: ComputedRef<UseBioTemplateWorkspaceReturn['sidebar']>
59
+ topBar: ComputedRef<UseBioTemplateWorkspaceReturn['topBar']>
60
+ pillNav: ComputedRef<UseBioTemplateWorkspaceReturn['pillNav']>
61
+ topBarSettings: ComputedRef<UseBioTemplateWorkspaceReturn['topBarSettings']>
62
+ bindings: ComputedRef<BioTemplateWorkspaceBindings>
63
+ componentBindings: ComputedRef<BioTemplateComponentBinding[]>
64
+ componentImports: ComputedRef<BioTemplateComponentImport[]>
65
+ componentProps: ComputedRef<BioTemplateComponentPropsBinding[]>
66
+ componentPropsById: ComputedRef<BioTemplateComponentPropsById>
67
+ componentPropsByComponent: ComputedRef<BioTemplateComponentPropsByComponent>
68
+ componentSnippets: ComputedRef<BioTemplateComponentSnippet[]>
69
+ componentUsage: ComputedRef<BioTemplateComponentUsage | null>
70
+ getComponentProps: UseBioTemplateWorkspaceReturn['getComponentProps']
71
+ applyCollection: (value: unknown, metadata?: Record<string, unknown>) => TemplateCollectionEnvelope
72
+ resetToDefaultCollection: () => TemplateCollectionEnvelope
73
+ save: UseTemplateCollectionReturn['save']
74
+ saveCurrent: UseTemplateCollectionReturn['saveCurrent']
75
+ load: UseTemplateCollectionReturn['load']
76
+ loadCurrent: UseTemplateCollectionReturn['loadCurrent']
77
+ requireCurrentExperimentId: UseTemplateCollectionReturn['requireCurrentExperimentId']
78
+ }
79
+
80
+ /** Create a complete workspace for a curated biology template pack from a single pack id. */
81
+ export function useBioTemplatePackWorkspace(
82
+ packId: TemplatePackId | string,
83
+ options: UseBioTemplatePackWorkspaceOptions = {},
84
+ ): UseBioTemplatePackWorkspaceReturn {
85
+ const pack = getBioTemplatePackInfo(packId)
86
+ if (!pack) {
87
+ throw new Error(`Unknown template pack '${packId}'.`)
88
+ }
89
+ const resolvedPack = pack
90
+
91
+ const templateCollection = useTemplateCollection({
92
+ ...options,
93
+ initial: createDefaultCollection,
94
+ })
95
+ const collection = templateCollection.templateCollection
96
+ let workspaceScope: EffectScope | undefined
97
+
98
+ function createWorkspace(value: TemplateCollectionEnvelope): UseBioTemplateWorkspaceReturn {
99
+ workspaceScope?.stop()
100
+ workspaceScope = effectScope()
101
+ return workspaceScope.run(() => useBioTemplateWorkspace(value))!
102
+ }
103
+
104
+ const workspaceRef = shallowRef<UseBioTemplateWorkspaceReturn>(createWorkspace(collection.value))
105
+ const workspace = computed(() => workspaceRef.value)
106
+ const renderer = computed<BioTemplateRendererBinding>(() => ({ target: collection.value }))
107
+ const form = computed(() => workspace.value.form)
108
+ const sidebar = computed(() => workspace.value.sidebar)
109
+ const topBar = computed(() => workspace.value.topBar)
110
+ const pillNav = computed(() => workspace.value.pillNav)
111
+ const topBarSettings = computed(() => workspace.value.topBarSettings)
112
+ const bindings = computed(() => workspace.value.bindings)
113
+ const componentBindings = computed(() => workspace.value.componentBindings)
114
+ const componentImports = computed(() => workspace.value.componentImports)
115
+ const componentProps = computed(() => workspace.value.componentProps)
116
+ const componentPropsById = computed(() => workspace.value.componentPropsById)
117
+ const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent)
118
+ const componentSnippets = computed(() => workspace.value.componentSnippets)
119
+ const componentUsage = computed(() => workspace.value.componentUsage)
120
+
121
+ watch(collection, value => {
122
+ workspaceRef.value = createWorkspace(value)
123
+ })
124
+
125
+ if (getCurrentScope()) {
126
+ onScopeDispose(() => workspaceScope?.stop())
127
+ }
128
+
129
+ function createDefaultCollection(): TemplateCollectionEnvelope {
130
+ return createBioTemplatePackCollection(resolvedPack.name)
131
+ }
132
+
133
+ function applyCollection(
134
+ value: unknown,
135
+ metadata?: Record<string, unknown>,
136
+ ): TemplateCollectionEnvelope {
137
+ return templateCollection.apply(value, metadata)
138
+ }
139
+
140
+ function resetToDefaultCollection(): TemplateCollectionEnvelope {
141
+ return templateCollection.apply(createDefaultCollection())
142
+ }
143
+
144
+ return {
145
+ packId: resolvedPack.name,
146
+ pack: resolvedPack,
147
+ collection,
148
+ templates: templateCollection.templates,
149
+ templateIds: templateCollection.templateIds,
150
+ currentExperimentId: templateCollection.currentExperimentId,
151
+ hasCurrentExperiment: templateCollection.hasCurrentExperiment,
152
+ loading: templateCollection.isLoading,
153
+ saving: templateCollection.isSaving,
154
+ error: templateCollection.error,
155
+ lastLoadedAt: templateCollection.lastLoadedAt,
156
+ lastSavedAt: templateCollection.lastSavedAt,
157
+ renderer,
158
+ workspace,
159
+ form,
160
+ sidebar,
161
+ topBar,
162
+ pillNav,
163
+ topBarSettings,
164
+ bindings,
165
+ componentBindings,
166
+ componentImports,
167
+ componentProps,
168
+ componentPropsById,
169
+ componentPropsByComponent,
170
+ componentSnippets,
171
+ componentUsage,
172
+ getComponentProps: (component, options) => workspace.value.getComponentProps(component, options),
173
+ applyCollection,
174
+ resetToDefaultCollection,
175
+ save: templateCollection.save,
176
+ saveCurrent: templateCollection.saveCurrent,
177
+ load: templateCollection.load,
178
+ loadCurrent: templateCollection.loadCurrent,
179
+ requireCurrentExperimentId: templateCollection.requireCurrentExperimentId,
180
+ }
181
+ }