@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
@@ -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
+ }
@@ -0,0 +1,337 @@
1
+ import {
2
+ computed,
3
+ reactive,
4
+ ref,
5
+ watch,
6
+ type ComputedRef,
7
+ type Ref,
8
+ } from 'vue'
9
+ import type { PillNavItem } from '../types'
10
+ import {
11
+ createBioTemplatePresetCollectionFromControls,
12
+ getBioTemplatePresetInfo,
13
+ type BioTemplateControlValues,
14
+ type BioTemplatePresetEntry,
15
+ type TemplateCollectionEnvelope,
16
+ type TemplatePresetId,
17
+ } from '../templates'
18
+ import type {
19
+ ControlWorkspaceAppTopBarPillBinding,
20
+ ControlWorkspaceAppTopBarTabsBinding,
21
+ ControlWorkspaceOptions,
22
+ ControlWorkspaceFormBinding,
23
+ ControlWorkspacePillNavBinding,
24
+ ControlWorkspaceSidebarBinding,
25
+ ControlWorkspaceTopBarBinding,
26
+ ControlWorkspaceTopBarSettingsBinding,
27
+ UseControlSchemaReturn,
28
+ } from './useControlSchema'
29
+ import {
30
+ useTemplateCollection,
31
+ type UseTemplateCollectionOptions,
32
+ type UseTemplateCollectionReturn,
33
+ } from './useTemplateCollection'
34
+ import {
35
+ useBioTemplateWorkspace,
36
+ type BioTemplateRendererBinding,
37
+ type UseBioTemplateWorkspaceReturn,
38
+ } from './useBioTemplateWorkspace'
39
+ import type {
40
+ BioTemplateComponentBinding,
41
+ BioTemplateComponentImport,
42
+ BioTemplateComponentPropsByComponent,
43
+ BioTemplateComponentPropsBinding,
44
+ BioTemplateComponentPropsById,
45
+ BioTemplateComponentSnippet,
46
+ BioTemplateComponentUsage,
47
+ } from './useBioTemplateComponents'
48
+ import type {
49
+ BioTemplateControlSchema,
50
+ } from './useBioTemplateControls'
51
+
52
+ export interface UseBioTemplatePresetWorkspaceOptions extends UseTemplateCollectionOptions {
53
+ /** Optional schema-rendering options for the generated FormBuilder/AppSidebar controls. */
54
+ controlOptions?: ControlWorkspaceOptions
55
+ /** Initial control values for the generated preset. Merged over controlOptions.initialValues. */
56
+ initialValues?: BioTemplateControlValues
57
+ }
58
+
59
+ export interface UseBioTemplatePresetWorkspaceReturn {
60
+ presetId: TemplatePresetId
61
+ presetInfo: ComputedRef<BioTemplatePresetEntry | undefined>
62
+ presetLabel: ComputedRef<string>
63
+ collection: Ref<TemplateCollectionEnvelope>
64
+ templates: UseTemplateCollectionReturn['templates']
65
+ templateIds: UseTemplateCollectionReturn['templateIds']
66
+ currentExperimentId: UseTemplateCollectionReturn['currentExperimentId']
67
+ hasCurrentExperiment: UseTemplateCollectionReturn['hasCurrentExperiment']
68
+ saving: UseTemplateCollectionReturn['isSaving']
69
+ error: UseTemplateCollectionReturn['error']
70
+ lastSavedAt: UseTemplateCollectionReturn['lastSavedAt']
71
+ controls: UseControlSchemaReturn<BioTemplateControlSchema>
72
+ controlSchema: BioTemplateControlSchema
73
+ controlValues: Ref<BioTemplateControlValues>
74
+ controlViewIds: ComputedRef<string[]>
75
+ controlViewItems: ComputedRef<PillNavItem[]>
76
+ activeControlView: Ref<string>
77
+ form: ControlWorkspaceFormBinding
78
+ sidebar: ControlWorkspaceSidebarBinding
79
+ topBar: ControlWorkspaceTopBarBinding
80
+ pillNav: ControlWorkspacePillNavBinding
81
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
82
+ bindings: BioTemplatePresetWorkspaceBindings
83
+ renderer: ComputedRef<BioTemplateRendererBinding>
84
+ workspace: ComputedRef<UseBioTemplateWorkspaceReturn>
85
+ componentBindings: ComputedRef<BioTemplateComponentBinding[]>
86
+ componentImports: ComputedRef<BioTemplateComponentImport[]>
87
+ componentProps: ComputedRef<BioTemplateComponentPropsBinding[]>
88
+ componentPropsById: ComputedRef<BioTemplateComponentPropsById>
89
+ componentPropsByComponent: ComputedRef<BioTemplateComponentPropsByComponent>
90
+ componentSnippets: ComputedRef<BioTemplateComponentSnippet[]>
91
+ componentUsage: ComputedRef<BioTemplateComponentUsage | null>
92
+ getComponentProps: UseBioTemplateWorkspaceReturn['getComponentProps']
93
+ setActiveControlView: (viewId: string) => void
94
+ setControlValues: (values: BioTemplateControlValues) => TemplateCollectionEnvelope
95
+ updateControlValues: (values: Partial<BioTemplateControlValues>) => TemplateCollectionEnvelope
96
+ applyCollection: (value: TemplateCollectionEnvelope) => TemplateCollectionEnvelope
97
+ resetToDefaultCollection: () => TemplateCollectionEnvelope
98
+ save: UseTemplateCollectionReturn['save']
99
+ saveCurrent: UseTemplateCollectionReturn['saveCurrent']
100
+ }
101
+
102
+ export interface BioTemplatePresetWorkspaceBindings {
103
+ renderer: ComputedRef<BioTemplateRendererBinding>
104
+ form: ControlWorkspaceFormBinding
105
+ sidebar: ControlWorkspaceSidebarBinding
106
+ topBar: ComputedRef<ControlWorkspaceAppTopBarPillBinding>
107
+ topBarTabs: ComputedRef<ControlWorkspaceAppTopBarTabsBinding>
108
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
109
+ pillNav: ControlWorkspacePillNavBinding
110
+ componentBindings: ComputedRef<BioTemplateComponentBinding[]>
111
+ componentProps: ComputedRef<BioTemplateComponentPropsBinding[]>
112
+ componentPropsById: ComputedRef<BioTemplateComponentPropsById>
113
+ componentPropsByComponent: ComputedRef<BioTemplateComponentPropsByComponent>
114
+ componentSnippets: ComputedRef<BioTemplateComponentSnippet[]>
115
+ componentUsage: ComputedRef<BioTemplateComponentUsage | null>
116
+ getComponentProps: UseBioTemplateWorkspaceReturn['getComponentProps']
117
+ }
118
+
119
+ /** Create a complete editable WellPlate/DoseCalculator workspace for dose design from a built-in biology template preset with current-experiment save wiring. */
120
+ export function useBioTemplatePresetWorkspace(
121
+ presetId: TemplatePresetId,
122
+ options: UseBioTemplatePresetWorkspaceOptions = {},
123
+ ): UseBioTemplatePresetWorkspaceReturn {
124
+ const { controlOptions, initialValues, ...collectionOptions } = options
125
+ const resolvedControlOptions = mergeInitialValues(controlOptions, initialValues)
126
+ const presetWorkspace = useBioTemplateWorkspace(presetId, resolvedControlOptions)
127
+ const presetInfo = computed(() => getBioTemplatePresetInfo(presetId))
128
+ const presetLabel = computed(() => presetInfo.value?.label ?? humanizePresetId(presetId))
129
+ const controls = presetWorkspace.controls
130
+ const controlValues = ref<BioTemplateControlValues>({ ...controls.initialValues })
131
+ const controlViewIds = computed(() => controls.viewIds)
132
+ const controlViewItems = computed(() => controls.viewItems)
133
+ const activeControlView = ref(controls.defaultView)
134
+ const templateCollection = useTemplateCollection({
135
+ ...collectionOptions,
136
+ initial: createDefaultCollection,
137
+ })
138
+ const collection = templateCollection.templateCollection
139
+ const workspace = computed(() => useBioTemplateWorkspace(collection.value, resolvedControlOptions))
140
+ const renderer = computed<BioTemplateRendererBinding>(() => ({ target: collection.value }))
141
+ const componentBindings = computed(() => workspace.value.componentBindings)
142
+ const componentImports = computed(() => workspace.value.componentImports)
143
+ const componentProps = computed(() => workspace.value.componentProps)
144
+ const componentPropsById = computed(() => workspace.value.componentPropsById)
145
+ const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent)
146
+ const componentSnippets = computed(() => workspace.value.componentSnippets)
147
+ const componentUsage = computed(() => workspace.value.componentUsage)
148
+ const form = reactive({
149
+ ...controls.form,
150
+ modelValue: controlValues.value,
151
+ 'onUpdate:modelValue': setControlValues,
152
+ }) as ControlWorkspaceFormBinding
153
+ const sidebar = reactive({
154
+ ...controls.sidebar,
155
+ activeView: activeControlView.value,
156
+ modelValue: controlValues.value,
157
+ 'onUpdate:modelValue': setControlValues,
158
+ values: controlValues.value,
159
+ 'onUpdate:values': setControlValues,
160
+ }) as ControlWorkspaceSidebarBinding
161
+ const topBar = reactive({
162
+ tabs: controls.topBarTabs,
163
+ currentTabId: activeControlView.value,
164
+ onTabSelect: (tab: { id: string }) => setActiveControlView(tab.id),
165
+ }) as ControlWorkspaceTopBarBinding
166
+ const pillNav = reactive({
167
+ items: controls.viewItems,
168
+ currentItemId: activeControlView.value,
169
+ onSelect: (item: { id: string }) => setActiveControlView(item.id),
170
+ }) as ControlWorkspacePillNavBinding
171
+ const topBarSettings = reactive({
172
+ showSettings: true,
173
+ settingsConfig: {
174
+ ...controls.topBarSettingsConfig,
175
+ values: controlValues.value,
176
+ },
177
+ onSettingsValuesChange: setControlValues,
178
+ }) as ControlWorkspaceTopBarSettingsBinding
179
+ const topBarProps = computed<ControlWorkspaceAppTopBarPillBinding>(() => ({
180
+ pillNav: pillNav.items,
181
+ currentPillId: pillNav.currentItemId,
182
+ onPillSelect: pillNav.onSelect,
183
+ ...topBarSettings,
184
+ }))
185
+ const topBarTabsProps = computed<ControlWorkspaceAppTopBarTabsBinding>(() => ({
186
+ tabs: topBar.tabs,
187
+ currentTabId: topBar.currentTabId,
188
+ onTabSelect: topBar.onTabSelect,
189
+ ...topBarSettings,
190
+ }))
191
+
192
+ function getComponentProps(
193
+ component: string,
194
+ options?: Parameters<UseBioTemplateWorkspaceReturn['getComponentProps']>[1],
195
+ ) {
196
+ return workspace.value.getComponentProps(component, options)
197
+ }
198
+
199
+ const bindings: BioTemplatePresetWorkspaceBindings = {
200
+ renderer,
201
+ form,
202
+ sidebar,
203
+ topBar: topBarProps,
204
+ topBarTabs: topBarTabsProps,
205
+ topBarSettings,
206
+ pillNav,
207
+ componentBindings,
208
+ componentProps,
209
+ componentPropsById,
210
+ componentPropsByComponent,
211
+ componentSnippets,
212
+ componentUsage,
213
+ getComponentProps,
214
+ }
215
+
216
+ function createDefaultCollection(): TemplateCollectionEnvelope {
217
+ return createBioTemplatePresetCollectionFromControls(presetId, controls.initialValues)
218
+ }
219
+
220
+ watch(
221
+ controlValues,
222
+ (values) => {
223
+ syncControlValueBindings(values)
224
+ templateCollection.apply(createBioTemplatePresetCollectionFromControls(presetId, values))
225
+ },
226
+ { deep: true },
227
+ )
228
+
229
+ watch(activeControlView, (viewId) => {
230
+ sidebar.activeView = viewId
231
+ topBar.currentTabId = viewId
232
+ pillNav.currentItemId = viewId
233
+ }, { flush: 'sync' })
234
+ watch(() => sidebar.activeView, setActiveControlView, { flush: 'sync' })
235
+ watch(() => topBar.currentTabId, setActiveControlView, { flush: 'sync' })
236
+ watch(() => pillNav.currentItemId, setActiveControlView, { flush: 'sync' })
237
+
238
+ function applyCollection(value: TemplateCollectionEnvelope): TemplateCollectionEnvelope {
239
+ return templateCollection.apply(value)
240
+ }
241
+
242
+ function setActiveControlView(viewId: string): void {
243
+ if (!controlViewIds.value.includes(viewId)) return
244
+ activeControlView.value = viewId
245
+ }
246
+
247
+ function setControlValues(values: BioTemplateControlValues): TemplateCollectionEnvelope {
248
+ const nextValues = { ...values }
249
+ controlValues.value = nextValues
250
+ syncControlValueBindings(nextValues)
251
+ return templateCollection.apply(createBioTemplatePresetCollectionFromControls(presetId, nextValues))
252
+ }
253
+
254
+ function updateControlValues(values: Partial<BioTemplateControlValues>): TemplateCollectionEnvelope {
255
+ return setControlValues({
256
+ ...controlValues.value,
257
+ ...values,
258
+ })
259
+ }
260
+
261
+ function resetToDefaultCollection(): TemplateCollectionEnvelope {
262
+ return setControlValues({ ...controls.initialValues })
263
+ }
264
+
265
+ function syncControlValueBindings(values: BioTemplateControlValues): void {
266
+ form.modelValue = values
267
+ sidebar.modelValue = values
268
+ sidebar.values = values
269
+ topBarSettings.settingsConfig = {
270
+ ...topBarSettings.settingsConfig,
271
+ values,
272
+ }
273
+ }
274
+
275
+ return {
276
+ presetId,
277
+ presetInfo,
278
+ presetLabel,
279
+ collection,
280
+ templates: templateCollection.templates,
281
+ templateIds: templateCollection.templateIds,
282
+ currentExperimentId: templateCollection.currentExperimentId,
283
+ hasCurrentExperiment: templateCollection.hasCurrentExperiment,
284
+ saving: templateCollection.isSaving,
285
+ error: templateCollection.error,
286
+ lastSavedAt: templateCollection.lastSavedAt,
287
+ controls,
288
+ controlSchema: controls.controls,
289
+ controlValues,
290
+ controlViewIds,
291
+ controlViewItems,
292
+ activeControlView,
293
+ form,
294
+ sidebar,
295
+ topBar,
296
+ pillNav,
297
+ topBarSettings,
298
+ bindings,
299
+ renderer,
300
+ workspace,
301
+ componentBindings,
302
+ componentImports,
303
+ componentProps,
304
+ componentPropsById,
305
+ componentPropsByComponent,
306
+ componentSnippets,
307
+ componentUsage,
308
+ getComponentProps,
309
+ setActiveControlView,
310
+ setControlValues,
311
+ updateControlValues,
312
+ applyCollection,
313
+ resetToDefaultCollection,
314
+ save: templateCollection.save,
315
+ saveCurrent: templateCollection.saveCurrent,
316
+ }
317
+ }
318
+
319
+ function humanizePresetId(value: string): string {
320
+ return value
321
+ .replace(/[-_]+/g, ' ')
322
+ .replace(/\b\w/g, match => match.toUpperCase())
323
+ }
324
+
325
+ function mergeInitialValues(
326
+ controlOptions: ControlWorkspaceOptions | undefined,
327
+ initialValues: BioTemplateControlValues | undefined,
328
+ ): ControlWorkspaceOptions | undefined {
329
+ if (initialValues === undefined) return controlOptions
330
+ return {
331
+ ...(controlOptions ?? {}),
332
+ initialValues: {
333
+ ...(controlOptions?.initialValues ?? {}),
334
+ ...initialValues,
335
+ },
336
+ }
337
+ }
@@ -0,0 +1,139 @@
1
+ import type {
2
+ BioTemplateEnvelope,
3
+ TemplateCollectionEnvelope,
4
+ } from '../templates'
5
+ import type {
6
+ ControlWorkspaceFormBinding,
7
+ ControlWorkspaceOptions,
8
+ ControlWorkspacePillNavBinding,
9
+ ControlWorkspaceSidebarBinding,
10
+ ControlWorkspaceTopBarBinding,
11
+ ControlWorkspaceTopBarSettingsBinding,
12
+ UseControlSchemaReturn,
13
+ UseControlWorkspaceReturn,
14
+ } from './useControlSchema'
15
+ import {
16
+ useControlWorkspace,
17
+ } from './useControlSchema'
18
+ import {
19
+ useBioTemplateControls,
20
+ type BioTemplateControlSchema,
21
+ type BioTemplateControlTarget,
22
+ } from './useBioTemplateControls'
23
+ import {
24
+ useBioTemplateComponents,
25
+ type BioTemplateComponentBinding,
26
+ type BioTemplateComponentImport,
27
+ type BioTemplateComponentPropsByComponent,
28
+ type BioTemplateComponentPropsBinding,
29
+ type BioTemplateComponentPropsById,
30
+ type BioTemplateComponentSnippet,
31
+ type BioTemplateComponentUsage,
32
+ type UseBioTemplateComponentsReturn,
33
+ } from './useBioTemplateComponents'
34
+
35
+ export type BioTemplateWorkspaceTarget = BioTemplateControlTarget
36
+
37
+ export interface BioTemplateRendererBinding {
38
+ target: BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope
39
+ }
40
+
41
+ export interface BioTemplateWorkspaceBindings {
42
+ renderer: BioTemplateRendererBinding | null
43
+ form: ControlWorkspaceFormBinding
44
+ sidebar: ControlWorkspaceSidebarBinding
45
+ topBar: UseControlWorkspaceReturn<BioTemplateControlSchema>['bindings']['topBar']
46
+ topBarTabs: UseControlWorkspaceReturn<BioTemplateControlSchema>['bindings']['topBarTabs']
47
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
48
+ pillNav: ControlWorkspacePillNavBinding
49
+ componentBindings: BioTemplateComponentBinding[]
50
+ componentProps: BioTemplateComponentPropsBinding[]
51
+ componentPropsById: BioTemplateComponentPropsById
52
+ componentPropsByComponent: BioTemplateComponentPropsByComponent
53
+ componentSnippets: BioTemplateComponentSnippet[]
54
+ componentUsage: BioTemplateComponentUsage | null
55
+ getComponentProps: UseBioTemplateComponentsReturn['getComponentProps']
56
+ }
57
+
58
+ export interface UseBioTemplateWorkspaceReturn {
59
+ target: BioTemplateWorkspaceTarget
60
+ controls: UseControlSchemaReturn<BioTemplateControlSchema>
61
+ workspace: UseControlWorkspaceReturn<BioTemplateControlSchema>
62
+ controlSchema: BioTemplateControlSchema
63
+ components: UseBioTemplateComponentsReturn
64
+ values: UseControlWorkspaceReturn<BioTemplateControlSchema>['values']
65
+ activeView: UseControlWorkspaceReturn<BioTemplateControlSchema>['activeView']
66
+ form: ControlWorkspaceFormBinding
67
+ sidebar: ControlWorkspaceSidebarBinding
68
+ topBar: ControlWorkspaceTopBarBinding
69
+ pillNav: ControlWorkspacePillNavBinding
70
+ topBarSettings: ControlWorkspaceTopBarSettingsBinding
71
+ bindings: BioTemplateWorkspaceBindings
72
+ renderer: BioTemplateRendererBinding | null
73
+ componentBindings: BioTemplateComponentBinding[]
74
+ componentImports: BioTemplateComponentImport[]
75
+ componentProps: BioTemplateComponentPropsBinding[]
76
+ componentPropsById: BioTemplateComponentPropsById
77
+ componentPropsByComponent: BioTemplateComponentPropsByComponent
78
+ componentSnippets: BioTemplateComponentSnippet[]
79
+ componentUsage: BioTemplateComponentUsage | null
80
+ getComponentProps: UseBioTemplateComponentsReturn['getComponentProps']
81
+ }
82
+
83
+ /** One-stop wiring for BioTemplateRenderer, FormBuilder, AppSidebar, and template-aware SDK components. */
84
+ export function useBioTemplateWorkspace(
85
+ target: BioTemplateWorkspaceTarget,
86
+ options: ControlWorkspaceOptions = {}
87
+ ): UseBioTemplateWorkspaceReturn {
88
+ const controls = useBioTemplateControls(target, options)
89
+ const workspace = useControlWorkspace(controls.controls, options)
90
+ const components = useBioTemplateComponents(target)
91
+ const renderer = isTemplateObjectTarget(target) ? { target } : null
92
+ const bindings: BioTemplateWorkspaceBindings = {
93
+ renderer,
94
+ form: workspace.bindings.form,
95
+ sidebar: workspace.bindings.sidebar,
96
+ topBar: workspace.bindings.topBar,
97
+ topBarTabs: workspace.bindings.topBarTabs,
98
+ topBarSettings: workspace.bindings.topBarSettings,
99
+ pillNav: workspace.bindings.pillNav,
100
+ componentBindings: components.bindings,
101
+ componentProps: components.componentProps,
102
+ componentPropsById: components.componentPropsById,
103
+ componentPropsByComponent: components.componentPropsByComponent,
104
+ componentSnippets: components.snippets,
105
+ componentUsage: components.usage,
106
+ getComponentProps: components.getComponentProps,
107
+ }
108
+
109
+ return {
110
+ target,
111
+ controls,
112
+ workspace,
113
+ controlSchema: controls.controls,
114
+ components,
115
+ values: workspace.values,
116
+ activeView: workspace.activeView,
117
+ form: workspace.form,
118
+ sidebar: workspace.sidebar,
119
+ topBar: workspace.topBar,
120
+ pillNav: workspace.pillNav,
121
+ topBarSettings: workspace.topBarSettings,
122
+ bindings,
123
+ renderer,
124
+ componentBindings: components.bindings,
125
+ componentImports: components.imports,
126
+ componentProps: components.componentProps,
127
+ componentPropsById: components.componentPropsById,
128
+ componentPropsByComponent: components.componentPropsByComponent,
129
+ componentSnippets: components.snippets,
130
+ componentUsage: components.usage,
131
+ getComponentProps: components.getComponentProps,
132
+ }
133
+ }
134
+
135
+ function isTemplateObjectTarget(
136
+ target: BioTemplateWorkspaceTarget
137
+ ): target is BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope {
138
+ return typeof target !== 'string'
139
+ }