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

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 (427) hide show
  1. package/README.md +225 -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/ComponentBindingRenderer.test.d.ts +1 -0
  19. package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
  20. package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
  21. package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
  22. package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
  23. package/dist/__tests__/components/DoseDesignWorkspaceView.test.d.ts +1 -0
  24. package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
  25. package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
  26. package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
  27. package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
  28. package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
  29. package/dist/__tests__/components/PluginWorkspaceView.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/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/experiment-utils.test.d.ts +1 -0
  40. package/dist/__tests__/composables/useApi.test.d.ts +1 -0
  41. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  42. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  43. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  44. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  45. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  46. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  47. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  48. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  49. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  50. package/dist/__tests__/composables/useExperimentData.test.d.ts +1 -0
  51. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  52. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  53. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  54. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  55. package/dist/__tests__/composables/usePluginConfig.test.d.ts +1 -0
  56. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  57. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  58. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  59. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  60. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  61. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  62. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  63. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  64. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  65. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  66. package/dist/{auth-DsI0rQ7_.js → auth-QQj2kkze.js} +12 -5
  67. package/dist/auth-QQj2kkze.js.map +1 -0
  68. package/dist/components/AppAvatarMenu.vue.d.ts +2 -7
  69. package/dist/components/AppContainer.vue.d.ts +1 -1
  70. package/dist/components/AppLayout.vue.d.ts +20 -1
  71. package/dist/components/AppSidebar.vue.d.ts +111 -6
  72. package/dist/components/AppTopBar.vue.d.ts +35 -22
  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 +119 -0
  83. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +93 -0
  84. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +87 -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/CollapsibleCard.vue.d.ts +1 -1
  89. package/dist/components/ComponentBindingRenderer.vue.d.ts +44 -0
  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 +147 -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/DoseDesignWorkspaceView.vue.d.ts +149 -0
  97. package/dist/components/DropdownButton.vue.d.ts +3 -3
  98. package/dist/components/EmptyState.vue.d.ts +1 -2
  99. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  100. package/dist/components/ExperimentTimeline.vue.d.ts +2 -2
  101. package/dist/components/FileUploader.vue.d.ts +1 -1
  102. package/dist/components/FitPanel.vue.d.ts +1 -1
  103. package/dist/components/FormActions.vue.d.ts +4 -4
  104. package/dist/components/FormBuilder.vue.d.ts +31 -17
  105. package/dist/components/FormulaInput.vue.d.ts +2 -2
  106. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  107. package/dist/components/MultiSelect.vue.d.ts +3 -3
  108. package/dist/components/NumberInput.vue.d.ts +1 -1
  109. package/dist/components/PlateMapEditor.vue.d.ts +1 -1
  110. package/dist/components/PluginWorkspaceView.vue.d.ts +310 -0
  111. package/dist/components/ProgressBar.vue.d.ts +1 -1
  112. package/dist/components/ProtocolStepEditor.vue.d.ts +3 -1
  113. package/dist/components/RackEditor.vue.d.ts +2 -2
  114. package/dist/components/SampleLegend.vue.d.ts +2 -2
  115. package/dist/components/ScheduleCalendar.vue.d.ts +2 -2
  116. package/dist/components/SegmentedControl.vue.d.ts +2 -2
  117. package/dist/components/SequenceInput.vue.d.ts +3 -3
  118. package/dist/components/SettingsModal.vue.d.ts +14 -6
  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 +6 -6
  125. package/dist/components/index.d.ts +9 -8
  126. package/dist/components/index.js +3 -3
  127. package/dist/components/{SettingsButton.vue.d.ts → internal/ActionItemInternal.vue.d.ts} +11 -9
  128. package/dist/components/{AppPageSelector.vue.d.ts → internal/AppPageSelectorInternal.vue.d.ts} +3 -6
  129. package/dist/components/{AppPillNav.vue.d.ts → internal/AppPillNavInternal.vue.d.ts} +4 -2
  130. package/dist/components/internal/CalendarGridPanelInternal.vue.d.ts +25 -0
  131. package/dist/components/{FormFieldRenderer.vue.d.ts → internal/FormFieldRendererInternal.vue.d.ts} +2 -2
  132. package/dist/components/{FormSection.vue.d.ts → internal/FormSectionRenderer.vue.d.ts} +7 -7
  133. package/dist/components/{WellEditPopup.vue.d.ts → internal/WellEditPopupInternal.vue.d.ts} +1 -1
  134. package/dist/{components-_XqPEhP9.js → components-BkGF4B4y.js} +9760 -8471
  135. package/dist/components-BkGF4B4y.js.map +1 -0
  136. package/dist/composables/experiment-utils.d.ts +8 -0
  137. package/dist/composables/index.d.ts +22 -5
  138. package/dist/composables/index.js +4 -3
  139. package/dist/composables/platformContextHelpers.d.ts +14 -0
  140. package/dist/composables/useAppExperiment.d.ts +31 -2
  141. package/dist/composables/useBioTemplateComponents.d.ts +22 -0
  142. package/dist/composables/useBioTemplateControls.d.ts +6 -0
  143. package/dist/composables/useBioTemplatePackWorkspace.d.ts +46 -0
  144. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +75 -0
  145. package/dist/composables/useBioTemplateWorkspace.d.ts +51 -0
  146. package/dist/composables/useCalendarGrid.d.ts +26 -0
  147. package/dist/composables/useControlSchema.d.ts +343 -0
  148. package/dist/composables/useDebouncedWatch.d.ts +20 -0
  149. package/dist/composables/useDropdownState.d.ts +19 -0
  150. package/dist/composables/useEventListener.d.ts +13 -0
  151. package/dist/composables/useExpansionSet.d.ts +21 -0
  152. package/dist/composables/useExperimentData.d.ts +10 -0
  153. package/dist/composables/useExperimentSave.d.ts +31 -2
  154. package/dist/composables/useExperimentSelector.d.ts +20 -0
  155. package/dist/composables/useForm.d.ts +2 -0
  156. package/dist/composables/useGroupAssignment.d.ts +31 -0
  157. package/dist/composables/useListSelection.d.ts +35 -0
  158. package/dist/composables/usePlatformContext.d.ts +21 -3
  159. package/dist/composables/usePluginClient.d.ts +112 -0
  160. package/dist/composables/usePluginConfig.d.ts +12 -0
  161. package/dist/composables/useRequestSyncState.d.ts +34 -0
  162. package/dist/composables/useSampleGroups.d.ts +32 -0
  163. package/dist/composables/useSelectionLimit.d.ts +17 -0
  164. package/dist/composables/useSortedItems.d.ts +32 -0
  165. package/dist/composables/useTemplateCollection.d.ts +58 -0
  166. package/dist/composables/useTextSearch.d.ts +18 -0
  167. package/dist/composables/useTimeUtils.d.ts +8 -0
  168. package/dist/{composables-tiZqLu1M.js → composables-CHsME9H1.js} +240 -146
  169. package/dist/composables-CHsME9H1.js.map +1 -0
  170. package/dist/index.d.ts +6 -4
  171. package/dist/index.js +6 -5
  172. package/dist/install.d.ts +7 -2
  173. package/dist/install.js +2 -2
  174. package/dist/install.js.map +1 -1
  175. package/dist/stores/index.js +1 -1
  176. package/dist/stores/settings.d.ts +4 -1
  177. package/dist/styles.css +4746 -5514
  178. package/dist/templates/adapters.d.ts +43 -0
  179. package/dist/templates/builders.d.ts +63 -0
  180. package/dist/templates/catalog.d.ts +188 -0
  181. package/dist/templates/componentBindings.d.ts +71 -0
  182. package/dist/templates/controlSchemas.d.ts +25 -0
  183. package/dist/templates/index.d.ts +15 -0
  184. package/dist/templates/index.js +2 -0
  185. package/dist/templates/lookup.d.ts +4 -0
  186. package/dist/templates/packs.d.ts +18 -0
  187. package/dist/templates/presets.d.ts +90 -0
  188. package/dist/templates/types.d.ts +531 -0
  189. package/dist/templates-B5jmTWuk.js +9388 -0
  190. package/dist/templates-B5jmTWuk.js.map +1 -0
  191. package/dist/types/components.d.ts +26 -23
  192. package/dist/types/form-builder.d.ts +6 -8
  193. package/dist/types/index.d.ts +2 -2
  194. package/dist/types/platform.d.ts +7 -1
  195. package/dist/useScheduleDrag-BgzpQT53.js +4414 -0
  196. package/dist/useScheduleDrag-BgzpQT53.js.map +1 -0
  197. package/dist/utils/formModelSync.d.ts +5 -0
  198. package/dist/utils/items.d.ts +8 -0
  199. package/dist/utils/options.d.ts +6 -0
  200. package/dist/utils/pluginIcon.d.ts +9 -0
  201. package/package.json +7 -2
  202. package/src/__tests__/components/ActionItem.test.ts +99 -0
  203. package/src/__tests__/components/AppAvatarMenu.test.ts +27 -0
  204. package/src/__tests__/components/AppLayout.test.ts +44 -0
  205. package/src/__tests__/components/AppPageSelector.test.ts +134 -0
  206. package/src/__tests__/components/AppPillNav.test.ts +125 -0
  207. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  208. package/src/__tests__/components/AppSidebar.test.ts +496 -0
  209. package/src/__tests__/components/AppToastContainer.test.ts +37 -0
  210. package/src/__tests__/components/AppTopBar.test.ts +455 -9
  211. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  212. package/src/__tests__/components/BaseSelect.test.ts +21 -0
  213. package/src/__tests__/components/BaseTabs.test.ts +25 -0
  214. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  215. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +159 -0
  216. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +175 -0
  217. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +306 -0
  218. package/src/__tests__/components/BioTemplateRenderer.test.ts +71 -0
  219. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  220. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  221. package/src/__tests__/components/ComponentBindingRenderer.test.ts +161 -0
  222. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  223. package/src/__tests__/components/ControlWorkspaceView.test.ts +1102 -0
  224. package/src/__tests__/components/DataFrame.test.ts +11 -0
  225. package/src/__tests__/components/DatePicker.test.ts +45 -0
  226. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  227. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +185 -0
  228. package/src/__tests__/components/DropdownButton.test.ts +23 -0
  229. package/src/__tests__/components/EmptyState.test.ts +23 -0
  230. package/src/__tests__/components/ExperimentPopover.test.ts +56 -0
  231. package/src/__tests__/components/FormBuilder.test.ts +296 -0
  232. package/src/__tests__/components/GroupAssigner.test.ts +30 -0
  233. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  234. package/src/__tests__/components/PluginWorkspaceView.test.ts +548 -0
  235. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  236. package/src/__tests__/components/ReagentList.test.ts +82 -0
  237. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  238. package/src/__tests__/components/SampleSelector.test.ts +60 -0
  239. package/src/__tests__/components/SegmentedControl.test.ts +24 -0
  240. package/src/__tests__/components/SettingsModal.test.ts +296 -0
  241. package/src/__tests__/components/TagsInput.test.ts +75 -0
  242. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  243. package/src/__tests__/components/TimePicker.test.ts +38 -0
  244. package/src/__tests__/composables/experiment-utils.test.ts +30 -0
  245. package/src/__tests__/composables/useApi.test.ts +30 -0
  246. package/src/__tests__/composables/useAppExperiment.test.ts +100 -1
  247. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +125 -0
  248. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  249. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +104 -0
  250. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  251. package/src/__tests__/composables/useControlSchema.test.ts +1033 -0
  252. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  253. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  254. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  255. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  256. package/src/__tests__/composables/useExperimentData.test.ts +4 -0
  257. package/src/__tests__/composables/useExperimentSave.test.ts +203 -8
  258. package/src/__tests__/composables/useExperimentSelector.test.ts +164 -0
  259. package/src/__tests__/composables/useForm.test.ts +58 -0
  260. package/src/__tests__/composables/useFormBuilder.test.ts +77 -0
  261. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  262. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  263. package/src/__tests__/composables/usePluginClient.test.ts +541 -0
  264. package/src/__tests__/composables/usePluginConfig.test.ts +5 -0
  265. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  266. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  267. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  268. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  269. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  270. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  271. package/src/__tests__/composables/useTheme.test.ts +91 -0
  272. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  273. package/src/__tests__/docs/frontendDocsCatalog.test.ts +324 -0
  274. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  275. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  276. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  277. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  278. package/src/__tests__/templates/templates.test.ts +1055 -0
  279. package/src/components/AppAvatarMenu.vue +15 -69
  280. package/src/components/AppLayout.story.vue +64 -25
  281. package/src/components/AppLayout.vue +83 -2
  282. package/src/components/AppPluginSwitcher.vue +41 -145
  283. package/src/components/AppSidebar.story.vue +203 -1
  284. package/src/components/AppSidebar.vue +320 -25
  285. package/src/components/{ToastNotification.story.vue → AppToastContainer.story.vue} +6 -6
  286. package/src/components/{ToastNotification.vue → AppToastContainer.vue} +1 -1
  287. package/src/components/AppTopBar.story.vue +7 -33
  288. package/src/components/AppTopBar.vue +104 -300
  289. package/src/components/BaseModal.vue +3 -5
  290. package/src/components/BaseRadioGroup.vue +7 -3
  291. package/src/components/BaseSelect.vue +11 -7
  292. package/src/components/BaseTabs.vue +6 -4
  293. package/src/components/BatchProgressList.vue +5 -8
  294. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  295. package/src/components/BioTemplateExperimentWorkspaceView.vue +343 -0
  296. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  297. package/src/components/BioTemplatePackWorkspaceView.vue +177 -0
  298. package/src/components/BioTemplatePresetWorkspaceView.story.vue +163 -0
  299. package/src/components/BioTemplatePresetWorkspaceView.vue +401 -0
  300. package/src/components/BioTemplateRenderer.story.vue +57 -0
  301. package/src/components/BioTemplateRenderer.vue +57 -0
  302. package/src/components/Breadcrumb.vue +14 -8
  303. package/src/components/ComponentBindingRenderer.story.vue +57 -0
  304. package/src/components/ComponentBindingRenderer.vue +308 -0
  305. package/src/components/ConcentrationInput.vue +27 -64
  306. package/src/components/ControlWorkspaceView.story.vue +347 -0
  307. package/src/components/ControlWorkspaceView.vue +378 -0
  308. package/src/components/DataFrame.vue +34 -50
  309. package/src/components/DatePicker.vue +59 -192
  310. package/src/components/DateTimePicker.vue +50 -171
  311. package/src/components/DoseDesignWorkspaceView.story.vue +77 -0
  312. package/src/components/DoseDesignWorkspaceView.vue +255 -0
  313. package/src/components/DropdownButton.vue +14 -32
  314. package/src/components/EmptyState.vue +4 -2
  315. package/src/components/ExperimentPopover.vue +7 -28
  316. package/src/components/ExperimentSelectorModal.vue +6 -5
  317. package/src/components/FormBuilder.story.vue +190 -0
  318. package/src/components/FormBuilder.vue +124 -27
  319. package/src/components/GroupAssigner.vue +24 -56
  320. package/src/components/MultiSelect.vue +17 -12
  321. package/src/components/PlateMapEditor.vue +3 -8
  322. package/src/components/PluginIcon.vue +2 -22
  323. package/src/components/PluginWorkspaceView.story.vue +334 -0
  324. package/src/components/PluginWorkspaceView.vue +708 -0
  325. package/src/components/ProtocolStepEditor.vue +13 -22
  326. package/src/components/ReagentList.vue +25 -33
  327. package/src/components/SampleHierarchyTree.vue +12 -23
  328. package/src/components/SampleSelector.vue +42 -122
  329. package/src/components/SegmentedControl.vue +7 -3
  330. package/src/components/SettingsModal.story.vue +88 -1
  331. package/src/components/SettingsModal.vue +120 -29
  332. package/src/components/TagsInput.vue +29 -14
  333. package/src/components/ThemeToggle.vue +9 -7
  334. package/src/components/TimePicker.vue +19 -41
  335. package/src/components/Tooltip.vue +7 -12
  336. package/src/components/WellPlate.vue +6 -12
  337. package/src/components/index.ts +9 -8
  338. package/src/components/internal/ActionItemInternal.vue +82 -0
  339. package/src/components/internal/AppPageSelectorInternal.vue +128 -0
  340. package/src/components/internal/AppPillNavInternal.vue +194 -0
  341. package/src/components/internal/CalendarGridPanelInternal.vue +120 -0
  342. package/src/components/{FormFieldRenderer.vue → internal/FormFieldRendererInternal.vue} +4 -12
  343. package/src/components/{FormSection.vue → internal/FormSectionRenderer.vue} +6 -18
  344. package/src/components/{WellEditPopup.vue → internal/WellEditPopupInternal.vue} +5 -10
  345. package/src/composables/experiment-utils.ts +26 -0
  346. package/src/composables/index.ts +229 -3
  347. package/src/composables/platformContextHelpers.ts +74 -0
  348. package/src/composables/useApi.ts +9 -2
  349. package/src/composables/useAppExperiment.ts +85 -13
  350. package/src/composables/useBioTemplateComponents.ts +105 -0
  351. package/src/composables/useBioTemplateControls.ts +41 -0
  352. package/src/composables/useBioTemplatePackWorkspace.ts +185 -0
  353. package/src/composables/useBioTemplatePresetWorkspace.ts +326 -0
  354. package/src/composables/useBioTemplateWorkspace.ts +141 -0
  355. package/src/composables/useCalendarGrid.ts +140 -0
  356. package/src/composables/useControlSchema.ts +1362 -0
  357. package/src/composables/useDebouncedWatch.ts +119 -0
  358. package/src/composables/useDropdownState.ts +83 -0
  359. package/src/composables/useEventListener.ts +111 -0
  360. package/src/composables/useExpansionSet.ts +117 -0
  361. package/src/composables/useExperimentData.ts +20 -11
  362. package/src/composables/useExperimentSave.ts +202 -50
  363. package/src/composables/useExperimentSelector.ts +86 -72
  364. package/src/composables/useForm.ts +49 -4
  365. package/src/composables/useFormBuilder.ts +93 -42
  366. package/src/composables/useGroupAssignment.ts +148 -0
  367. package/src/composables/useListSelection.ts +158 -0
  368. package/src/composables/usePluginClient.ts +466 -0
  369. package/src/composables/usePluginConfig.ts +34 -13
  370. package/src/composables/useRequestSyncState.ts +126 -0
  371. package/src/composables/useSampleGroups.ts +126 -0
  372. package/src/composables/useSelectionLimit.ts +57 -0
  373. package/src/composables/useSortedItems.ts +118 -0
  374. package/src/composables/useTemplateCollection.ts +229 -0
  375. package/src/composables/useTextSearch.ts +60 -0
  376. package/src/composables/useTheme.ts +2 -28
  377. package/src/composables/useTimeUtils.ts +26 -2
  378. package/src/composables/useWellPlateEditor.ts +13 -9
  379. package/src/index.ts +11 -348
  380. package/src/install.ts +11 -4
  381. package/src/stores/settings.ts +13 -9
  382. package/src/styles/components/app-layout.css +82 -0
  383. package/src/styles/components/app-page-selector.css +23 -0
  384. package/src/styles/components/app-pill-nav.css +77 -0
  385. package/src/styles/components/app-sidebar.css +119 -0
  386. package/src/styles/components/app-top-bar.css +0 -201
  387. package/src/styles/components/concentration-input.css +3 -142
  388. package/src/styles/components/empty-state.css +0 -16
  389. package/src/styles/components/theme-toggle.css +3 -66
  390. package/src/styles/index.css +0 -2
  391. package/src/templates/adapters.ts +785 -0
  392. package/src/templates/builders.ts +2149 -0
  393. package/src/templates/catalog.ts +245 -0
  394. package/src/templates/componentBindings.ts +653 -0
  395. package/src/templates/controlSchemas.ts +718 -0
  396. package/src/templates/index.ts +318 -0
  397. package/src/templates/lookup.ts +18 -0
  398. package/src/templates/packs.ts +156 -0
  399. package/src/templates/presets.ts +146 -0
  400. package/src/templates/types.ts +668 -0
  401. package/src/types/components.ts +39 -27
  402. package/src/types/form-builder.ts +7 -2
  403. package/src/types/index.ts +13 -3
  404. package/src/types/platform.ts +7 -1
  405. package/src/utils/formModelSync.ts +52 -0
  406. package/src/utils/items.ts +28 -0
  407. package/src/utils/options.ts +23 -0
  408. package/src/utils/pluginIcon.ts +30 -0
  409. package/dist/__tests__/composables/usePluginApi.test.d.ts +0 -13
  410. package/dist/auth-DsI0rQ7_.js.map +0 -1
  411. package/dist/components/GroupingModal.vue.d.ts +0 -12
  412. package/dist/components-_XqPEhP9.js.map +0 -1
  413. package/dist/composables/usePluginApi.d.ts +0 -29
  414. package/dist/composables-tiZqLu1M.js.map +0 -1
  415. package/dist/useScheduleDrag-CA9sGNJG.js +0 -7181
  416. package/dist/useScheduleDrag-CA9sGNJG.js.map +0 -1
  417. package/src/__tests__/composables/usePluginApi.test.ts +0 -81
  418. package/src/components/AppPageSelector.vue +0 -159
  419. package/src/components/AppPillNav.vue +0 -66
  420. package/src/components/GroupingModal.story.vue +0 -52
  421. package/src/components/GroupingModal.vue +0 -422
  422. package/src/components/SettingsButton.story.vue +0 -58
  423. package/src/components/SettingsButton.vue +0 -76
  424. package/src/composables/usePluginApi.ts +0 -39
  425. package/src/styles/components/grouping-modal.css +0 -323
  426. package/src/styles/components/settings-button.css +0 -94
  427. /package/dist/components/{ToastNotification.vue.d.ts → AppToastContainer.vue.d.ts} +0 -0
@@ -1,11 +1,12 @@
1
1
  <script setup lang="ts">
2
2
  /** Renders a tab bar with underline or pills variant, badges, icons, and disabled tab support. */
3
3
  import { computed } from 'vue'
4
- import type { TabItem } from '../types'
4
+ import type { TabItem, TabItemInput } from '../types'
5
+ import { normalizeItemInput } from '../utils/items'
5
6
 
6
7
  interface Props {
7
8
  modelValue: string
8
- tabs: TabItem[]
9
+ tabs: TabItemInput[]
9
10
  variant?: 'underline' | 'pills'
10
11
  }
11
12
 
@@ -18,9 +19,10 @@ const emit = defineEmits<{
18
19
  }>()
19
20
 
20
21
  const activeTab = computed(() => props.modelValue)
22
+ const normalizedTabs = computed<TabItem[]>(() => props.tabs.map(normalizeItemInput))
21
23
 
22
24
  function selectTab(tabId: string) {
23
- const tab = props.tabs.find(t => t.id === tabId)
25
+ const tab = normalizedTabs.value.find(t => t.id === tabId)
24
26
  if (tab && !tab.disabled) {
25
27
  emit('update:modelValue', tabId)
26
28
  }
@@ -30,7 +32,7 @@ function selectTab(tabId: string) {
30
32
  <template>
31
33
  <div :class="['mint-tabs', `mint-tabs--${variant}`]" role="tablist">
32
34
  <button
33
- v-for="tab in tabs"
35
+ v-for="tab in normalizedTabs"
34
36
  :key="tab.id"
35
37
  type="button"
36
38
  role="tab"
@@ -2,6 +2,7 @@
2
2
  /** Scrollable list tracking per-item status for a batch operation with overall progress summary. */
3
3
  import { computed, ref, watch, nextTick } from 'vue'
4
4
  import type { BatchItem, BatchSummary } from '../types'
5
+ import { useExpansionSet } from '../composables/useExpansionSet'
5
6
 
6
7
  interface Props {
7
8
  items: BatchItem[]
@@ -22,7 +23,7 @@ const emit = defineEmits<{
22
23
  }>()
23
24
 
24
25
  const listRef = ref<HTMLElement | null>(null)
25
- const expandedErrors = ref<Set<string>>(new Set())
26
+ const errorExpansion = useExpansionSet()
26
27
 
27
28
  const summary = computed<BatchSummary>(() => {
28
29
  const total = props.items.length
@@ -36,11 +37,7 @@ const summary = computed<BatchSummary>(() => {
36
37
  })
37
38
 
38
39
  function toggleError(id: string) {
39
- if (expandedErrors.value.has(id)) {
40
- expandedErrors.value.delete(id)
41
- } else {
42
- expandedErrors.value.add(id)
43
- }
40
+ errorExpansion.toggle(id)
44
41
  }
45
42
 
46
43
  watch(
@@ -167,9 +164,9 @@ watch(
167
164
  class="mint-batch-progress__error-toggle"
168
165
  @click.stop="toggleError(item.id)"
169
166
  >
170
- {{ expandedErrors.has(item.id) ? 'Hide error' : 'Show error' }}
167
+ {{ errorExpansion.isExpanded(item.id) ? 'Hide error' : 'Show error' }}
171
168
  </button>
172
- <div v-if="expandedErrors.has(item.id)" class="mint-batch-progress__item-message">
169
+ <div v-if="errorExpansion.isExpanded(item.id)" class="mint-batch-progress__item-message">
173
170
  {{ item.message }}
174
171
  </div>
175
172
  </div>
@@ -0,0 +1,123 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ import BioTemplateExperimentWorkspaceView from './BioTemplateExperimentWorkspaceView.vue'
4
+ import DoseCalculator from './DoseCalculator.vue'
5
+ import WellPlate from './WellPlate.vue'
6
+ import {
7
+ createWellPlateScreenCollection,
8
+ createPlateMapTemplate,
9
+ } from '../templates'
10
+
11
+ const collection = createWellPlateScreenCollection()
12
+ const template = createPlateMapTemplate()
13
+ const error = ref<string | null>(null)
14
+
15
+ function initState() {
16
+ return {
17
+ target: 'collection',
18
+ hasExperiment: true,
19
+ showTemplateSummary: true,
20
+ dense: true,
21
+ }
22
+ }
23
+ </script>
24
+
25
+ <template>
26
+ <Story title="Templates/BioTemplateExperimentWorkspaceView" :init-state="initState">
27
+ <Variant title="Playground">
28
+ <template #default="{ state }">
29
+ <div style="padding: 2rem; min-height: 680px; background: var(--bg-primary, #f8fafc);">
30
+ <BioTemplateExperimentWorkspaceView
31
+ :target="state.target === 'template' ? template : collection"
32
+ :kind="state.target === 'template' ? 'template' : 'collection'"
33
+ :label="state.target === 'template' ? 'Plate Map' : 'Wellplate Screen'"
34
+ :has-experiment="state.hasExperiment"
35
+ :current-experiment-id="state.hasExperiment ? 42 : undefined"
36
+ :error="error"
37
+ :show-template-summary="state.showTemplateSummary"
38
+ :dense="state.dense"
39
+ />
40
+ </div>
41
+ </template>
42
+
43
+ <template #controls="{ state }">
44
+ <HstSelect
45
+ v-model="state.target"
46
+ title="Target"
47
+ :options="[
48
+ { label: 'Collection', value: 'collection' },
49
+ { label: 'Template', value: 'template' },
50
+ ]"
51
+ />
52
+ <HstCheckbox v-model="state.hasExperiment" title="Has experiment" />
53
+ <HstCheckbox v-model="state.showTemplateSummary" title="Template summary" />
54
+ <HstCheckbox v-model="state.dense" title="Dense" />
55
+ </template>
56
+ </Variant>
57
+
58
+ <Variant title="Component Props">
59
+ <div style="padding: 2rem; min-height: 680px; background: var(--bg-primary, #f8fafc);">
60
+ <BioTemplateExperimentWorkspaceView
61
+ :target="collection"
62
+ kind="collection"
63
+ label="Wellplate Screen"
64
+ :has-experiment="true"
65
+ :current-experiment-id="42"
66
+ :show-template-summary="false"
67
+ v-slot="{ bindings }"
68
+ >
69
+ <div class="experiment-component-layout">
70
+ <div class="experiment-component-panel experiment-component-panel--plate">
71
+ <WellPlate
72
+ v-bind="bindings.componentBindingsById['plate-map:WellPlate'].props"
73
+ size="sm"
74
+ readonly
75
+ />
76
+ </div>
77
+ <div class="experiment-component-panel experiment-component-panel--dose">
78
+ <DoseCalculator
79
+ v-bind="bindings.componentBindingsById['dose-response:DoseCalculator'].props"
80
+ />
81
+ </div>
82
+ </div>
83
+ </BioTemplateExperimentWorkspaceView>
84
+ </div>
85
+ </Variant>
86
+ </Story>
87
+ </template>
88
+
89
+ <style scoped>
90
+ .experiment-component-layout {
91
+ display: grid;
92
+ grid-template-columns: minmax(0, 1.35fr) minmax(18rem, 0.65fr);
93
+ gap: 1rem;
94
+ align-items: start;
95
+ min-width: 0;
96
+ }
97
+
98
+ .experiment-component-panel {
99
+ min-width: 0;
100
+ padding: 1rem;
101
+ border: 1px solid var(--border-color);
102
+ border-radius: var(--radius-lg, 0.75rem);
103
+ background: var(--bg-primary);
104
+ }
105
+
106
+ .experiment-component-panel--plate {
107
+ overflow-x: auto;
108
+ }
109
+
110
+ .experiment-component-panel--dose {
111
+ max-width: 24rem;
112
+ }
113
+
114
+ @media (max-width: 960px) {
115
+ .experiment-component-layout {
116
+ grid-template-columns: 1fr;
117
+ }
118
+
119
+ .experiment-component-panel--dose {
120
+ max-width: none;
121
+ }
122
+ }
123
+ </style>
@@ -0,0 +1,343 @@
1
+ <script setup lang="ts">
2
+ /** Current-experiment template workspace with load/save/reset controls and WellPlate/DataFrame/DoseCalculator previews. */
3
+ import { computed } from 'vue'
4
+ import {
5
+ extractTemplateCollection,
6
+ getBioTemplateComponentProps,
7
+ toBioTemplateComponentBindingsById,
8
+ toBioTemplateComponentProps,
9
+ toBioTemplateComponentPropsByComponent,
10
+ toBioTemplateComponentPropsById,
11
+ type BioTemplateEnvelope,
12
+ type BioTemplateComponentPropsLookupOptions,
13
+ type TemplateCollectionEnvelope,
14
+ } from '../templates'
15
+ import AlertBox from './AlertBox.vue'
16
+ import BaseButton from './BaseButton.vue'
17
+ import BioTemplateRenderer from './BioTemplateRenderer.vue'
18
+
19
+ type BioTemplateWorkspaceTarget = BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope
20
+ type WorkspaceKind = 'template' | 'collection'
21
+
22
+ interface TemplateWorkspaceStatus {
23
+ loading?: boolean
24
+ saving?: boolean
25
+ error?: string | null
26
+ hasExperiment?: boolean
27
+ currentExperimentId?: number
28
+ lastLoadedAt?: Date | null
29
+ lastSavedAt?: Date | null
30
+ }
31
+
32
+ interface TemplateWorkspaceActions {
33
+ load?: () => unknown
34
+ reset?: () => unknown
35
+ save?: () => unknown
36
+ }
37
+
38
+ interface Props {
39
+ /** Template envelope or template collection shown in BioTemplateRenderer. */
40
+ target: BioTemplateWorkspaceTarget
41
+ /** Human-readable workspace label. */
42
+ label: string
43
+ /** Grouped request and current-experiment state for generated plugin pages. */
44
+ status?: TemplateWorkspaceStatus
45
+ /** Grouped load/reset/save handlers for generated plugin pages. */
46
+ actions?: TemplateWorkspaceActions
47
+ /** Copy shown in the status banner. */
48
+ message?: string
49
+ /** Whether the load/save request is active. */
50
+ loading?: boolean
51
+ /** Current request error. */
52
+ error?: string | null
53
+ /** Whether a current experiment id is available. */
54
+ hasExperiment?: boolean
55
+ /** Current experiment id displayed in the footer. */
56
+ currentExperimentId?: number
57
+ /** Last successful load timestamp. */
58
+ lastLoadedAt?: Date | null
59
+ /** Last successful save timestamp. */
60
+ lastSavedAt?: Date | null
61
+ /** Template vs collection copy defaults. */
62
+ kind?: WorkspaceKind
63
+ /** Compact preview layout. */
64
+ dense?: boolean
65
+ /** Render preview components in read-only mode. */
66
+ readonly?: boolean
67
+ /** Show load/save timestamps. */
68
+ showStatus?: boolean
69
+ /** Show template id/version cards for collection targets. */
70
+ showTemplateSummary?: boolean
71
+ loadLabel?: string
72
+ resetLabel?: string
73
+ saveLabel?: string
74
+ }
75
+
76
+ const props = withDefaults(defineProps<Props>(), {
77
+ status: undefined,
78
+ actions: undefined,
79
+ message: undefined,
80
+ loading: false,
81
+ error: null,
82
+ hasExperiment: false,
83
+ currentExperimentId: undefined,
84
+ lastLoadedAt: null,
85
+ lastSavedAt: null,
86
+ kind: 'template',
87
+ dense: true,
88
+ readonly: true,
89
+ showStatus: true,
90
+ showTemplateSummary: false,
91
+ loadLabel: 'Load',
92
+ resetLabel: 'Reset defaults',
93
+ saveLabel: 'Save',
94
+ })
95
+
96
+ const emit = defineEmits<{
97
+ load: []
98
+ reset: []
99
+ save: []
100
+ }>()
101
+
102
+ const statusMessage = computed(() => {
103
+ if (props.message) return props.message
104
+ if (props.kind === 'collection') {
105
+ return `${props.label} saves the full template collection to the current experiment.`
106
+ }
107
+ return `${props.label} template data saves to experiment design_data.`
108
+ })
109
+
110
+ const resolvedLoading = computed(() => {
111
+ if (props.status?.loading !== undefined || props.status?.saving !== undefined) {
112
+ return Boolean(props.status.loading) || Boolean(props.status.saving)
113
+ }
114
+ return props.loading
115
+ })
116
+ const resolvedError = computed(() =>
117
+ props.status?.error !== undefined ? props.status.error : props.error,
118
+ )
119
+ const resolvedHasExperiment = computed(() =>
120
+ props.status?.hasExperiment ?? props.hasExperiment,
121
+ )
122
+ const resolvedCurrentExperimentId = computed(() =>
123
+ props.status?.currentExperimentId ?? props.currentExperimentId,
124
+ )
125
+ const resolvedLastLoadedAt = computed(() =>
126
+ props.status?.lastLoadedAt !== undefined ? props.status.lastLoadedAt : props.lastLoadedAt,
127
+ )
128
+ const resolvedLastSavedAt = computed(() =>
129
+ props.status?.lastSavedAt !== undefined ? props.status.lastSavedAt : props.lastSavedAt,
130
+ )
131
+
132
+ const templateSummaries = computed(() =>
133
+ Object.values(extractTemplateCollection(props.target)).map(template => ({
134
+ id: String(template.template_id),
135
+ version: String(template.template_version ?? 'unknown'),
136
+ }))
137
+ )
138
+ const componentProps = computed(() => toBioTemplateComponentProps(props.target))
139
+ const componentBindingsById = computed(() => toBioTemplateComponentBindingsById(props.target))
140
+ const componentPropsById = computed(() => toBioTemplateComponentPropsById(props.target))
141
+ const componentPropsByComponent = computed(() => toBioTemplateComponentPropsByComponent(props.target))
142
+ const renderer = computed(() => ({ target: props.target }))
143
+
144
+ function getComponentProps(component: string, options?: BioTemplateComponentPropsLookupOptions) {
145
+ return getBioTemplateComponentProps(props.target, component, options)
146
+ }
147
+
148
+ interface BioTemplateExperimentWorkspaceBindings {
149
+ renderer: { target: BioTemplateWorkspaceTarget }
150
+ componentProps: ReturnType<typeof toBioTemplateComponentProps>
151
+ componentBindingsById: ReturnType<typeof toBioTemplateComponentBindingsById>
152
+ componentPropsById: ReturnType<typeof toBioTemplateComponentPropsById>
153
+ componentPropsByComponent: ReturnType<typeof toBioTemplateComponentPropsByComponent>
154
+ getComponentProps: typeof getComponentProps
155
+ }
156
+
157
+ const bindings = computed<BioTemplateExperimentWorkspaceBindings>(() => ({
158
+ renderer: renderer.value,
159
+ componentProps: componentProps.value,
160
+ componentBindingsById: componentBindingsById.value,
161
+ componentPropsById: componentPropsById.value,
162
+ componentPropsByComponent: componentPropsByComponent.value,
163
+ getComponentProps,
164
+ }))
165
+
166
+ interface BioTemplateExperimentWorkspaceSlotProps {
167
+ target: BioTemplateWorkspaceTarget
168
+ bindings: BioTemplateExperimentWorkspaceBindings
169
+ componentProps: ReturnType<typeof toBioTemplateComponentProps>
170
+ componentBindingsById: ReturnType<typeof toBioTemplateComponentBindingsById>
171
+ componentPropsById: ReturnType<typeof toBioTemplateComponentPropsById>
172
+ componentPropsByComponent: ReturnType<typeof toBioTemplateComponentPropsByComponent>
173
+ getComponentProps: typeof getComponentProps
174
+ }
175
+
176
+ defineSlots<{
177
+ default?: (props: BioTemplateExperimentWorkspaceSlotProps) => unknown
178
+ }>()
179
+
180
+ function handleLoad() {
181
+ if (props.actions?.load) {
182
+ return props.actions.load()
183
+ }
184
+ emit('load')
185
+ }
186
+
187
+ function handleReset() {
188
+ if (props.actions?.reset) {
189
+ return props.actions.reset()
190
+ }
191
+ emit('reset')
192
+ }
193
+
194
+ function handleSave() {
195
+ if (props.actions?.save) {
196
+ return props.actions.save()
197
+ }
198
+ emit('save')
199
+ }
200
+ </script>
201
+
202
+ <template>
203
+ <div class="mint-bio-template-experiment-workspace">
204
+ <div class="mint-bio-template-experiment-workspace__toolbar">
205
+ <AlertBox type="info" class="mint-bio-template-experiment-workspace__status">
206
+ {{ statusMessage }}
207
+ </AlertBox>
208
+
209
+ <div class="mint-bio-template-experiment-workspace__actions">
210
+ <BaseButton
211
+ variant="secondary"
212
+ :loading="resolvedLoading"
213
+ :disabled="!resolvedHasExperiment"
214
+ @click="handleLoad"
215
+ >
216
+ {{ loadLabel }}
217
+ </BaseButton>
218
+ <BaseButton variant="secondary" :loading="resolvedLoading" @click="handleReset">
219
+ {{ resetLabel }}
220
+ </BaseButton>
221
+ <BaseButton
222
+ variant="primary"
223
+ :loading="resolvedLoading"
224
+ :disabled="!resolvedHasExperiment"
225
+ @click="handleSave"
226
+ >
227
+ {{ saveLabel }}
228
+ </BaseButton>
229
+ </div>
230
+ </div>
231
+
232
+ <AlertBox v-if="resolvedError" type="error">
233
+ {{ resolvedError }}
234
+ </AlertBox>
235
+
236
+ <p v-if="showStatus" class="mint-bio-template-experiment-workspace__meta">
237
+ loaded: {{ resolvedLastLoadedAt?.toLocaleString() ?? 'not loaded' }} -
238
+ saved: {{ resolvedLastSavedAt?.toLocaleString() ?? 'not saved' }}
239
+ </p>
240
+
241
+ <div
242
+ v-if="showTemplateSummary"
243
+ class="mint-bio-template-experiment-workspace__templates"
244
+ >
245
+ <div
246
+ v-for="template in templateSummaries"
247
+ :key="template.id"
248
+ class="mint-bio-template-experiment-workspace__template"
249
+ >
250
+ <p class="mint-bio-template-experiment-workspace__template-id">
251
+ {{ template.id }}
252
+ </p>
253
+ <p class="mint-bio-template-experiment-workspace__template-version">
254
+ v{{ template.version }}
255
+ </p>
256
+ </div>
257
+ </div>
258
+
259
+ <slot
260
+ :target="target"
261
+ :bindings="bindings"
262
+ :component-props="componentProps"
263
+ :component-bindings-by-id="componentBindingsById"
264
+ :component-props-by-id="componentPropsById"
265
+ :component-props-by-component="componentPropsByComponent"
266
+ :get-component-props="getComponentProps"
267
+ >
268
+ <BioTemplateRenderer
269
+ :target="target"
270
+ :dense="dense"
271
+ :readonly="readonly"
272
+ />
273
+ </slot>
274
+
275
+ <p class="mint-bio-template-experiment-workspace__meta">
276
+ experiment: {{ resolvedCurrentExperimentId ?? 'not selected' }}
277
+ </p>
278
+ </div>
279
+ </template>
280
+
281
+ <style scoped>
282
+ .mint-bio-template-experiment-workspace {
283
+ display: flex;
284
+ flex-direction: column;
285
+ gap: 1rem;
286
+ min-width: 0;
287
+ }
288
+
289
+ .mint-bio-template-experiment-workspace__toolbar {
290
+ display: flex;
291
+ align-items: center;
292
+ justify-content: space-between;
293
+ gap: 0.75rem;
294
+ }
295
+
296
+ .mint-bio-template-experiment-workspace__status {
297
+ flex: 1 1 auto;
298
+ min-width: 0;
299
+ }
300
+
301
+ .mint-bio-template-experiment-workspace__actions {
302
+ display: flex;
303
+ flex: 0 0 auto;
304
+ gap: 0.5rem;
305
+ }
306
+
307
+ .mint-bio-template-experiment-workspace__meta,
308
+ .mint-bio-template-experiment-workspace__template-version {
309
+ margin: 0;
310
+ color: var(--text-secondary, #64748b);
311
+ font-family: var(--font-mono, 'Fira Code', monospace);
312
+ font-size: 0.75rem;
313
+ }
314
+
315
+ .mint-bio-template-experiment-workspace__templates {
316
+ display: grid;
317
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 12rem), 1fr));
318
+ gap: 0.75rem;
319
+ }
320
+
321
+ .mint-bio-template-experiment-workspace__template {
322
+ min-width: 0;
323
+ padding: 1rem;
324
+ border: 1px solid var(--border-color, #e5e7eb);
325
+ border-radius: 0.5rem;
326
+ background: var(--bg-primary, #ffffff);
327
+ }
328
+
329
+ .mint-bio-template-experiment-workspace__template-id {
330
+ margin: 0;
331
+ color: var(--text-primary, #0f172a);
332
+ font-family: var(--font-mono, 'Fira Code', monospace);
333
+ font-size: 0.875rem;
334
+ }
335
+
336
+ @media (max-width: 48rem) {
337
+ .mint-bio-template-experiment-workspace__toolbar,
338
+ .mint-bio-template-experiment-workspace__actions {
339
+ align-items: stretch;
340
+ flex-direction: column;
341
+ }
342
+ }
343
+ </style>
@@ -0,0 +1,107 @@
1
+ <script setup lang="ts">
2
+ import BioTemplatePackWorkspaceView from './BioTemplatePackWorkspaceView.vue'
3
+ import DoseCalculator from './DoseCalculator.vue'
4
+ import WellPlate from './WellPlate.vue'
5
+
6
+ function initState() {
7
+ return {
8
+ pack: 'cell-culture-screen',
9
+ hasCustomLayout: false,
10
+ showTemplateSummary: true,
11
+ dense: true,
12
+ }
13
+ }
14
+ </script>
15
+
16
+ <template>
17
+ <Story title="Templates/BioTemplatePackWorkspaceView" :init-state="initState">
18
+ <Variant title="Playground">
19
+ <template #default="{ state }">
20
+ <div style="padding: 2rem; min-height: 720px; background: var(--bg-primary, #f8fafc);">
21
+ <BioTemplatePackWorkspaceView
22
+ v-if="state.hasCustomLayout"
23
+ :pack="state.pack"
24
+ :show-template-summary="state.showTemplateSummary"
25
+ :dense="state.dense"
26
+ v-slot="{ bindings }"
27
+ >
28
+ <div class="pack-component-layout">
29
+ <div class="pack-component-panel pack-component-panel--plate">
30
+ <WellPlate
31
+ v-if="bindings.componentBindingsById['plate-map:WellPlate']"
32
+ v-bind="bindings.componentBindingsById['plate-map:WellPlate'].props"
33
+ size="sm"
34
+ readonly
35
+ />
36
+ </div>
37
+ <div class="pack-component-panel pack-component-panel--dose">
38
+ <DoseCalculator
39
+ v-if="bindings.componentBindingsById['dose-response:DoseCalculator']"
40
+ v-bind="bindings.componentBindingsById['dose-response:DoseCalculator'].props"
41
+ />
42
+ </div>
43
+ </div>
44
+ </BioTemplatePackWorkspaceView>
45
+ <BioTemplatePackWorkspaceView
46
+ v-else
47
+ :pack="state.pack"
48
+ :show-template-summary="state.showTemplateSummary"
49
+ :dense="state.dense"
50
+ />
51
+ </div>
52
+ </template>
53
+
54
+ <template #controls="{ state }">
55
+ <HstSelect
56
+ v-model="state.pack"
57
+ title="Pack"
58
+ :options="[
59
+ { label: 'Cell culture screen', value: 'cell-culture-screen' },
60
+ { label: 'Omics assay', value: 'omics-assay' },
61
+ { label: 'Longitudinal study', value: 'longitudinal-study' },
62
+ { label: 'Molecular assay', value: 'molecular-assay' },
63
+ ]"
64
+ />
65
+ <HstCheckbox v-model="state.hasCustomLayout" title="Custom component layout" />
66
+ <HstCheckbox v-model="state.showTemplateSummary" title="Template summary" />
67
+ <HstCheckbox v-model="state.dense" title="Dense" />
68
+ </template>
69
+ </Variant>
70
+ </Story>
71
+ </template>
72
+
73
+ <style scoped>
74
+ .pack-component-layout {
75
+ display: grid;
76
+ grid-template-columns: minmax(0, 1.35fr) minmax(18rem, 0.65fr);
77
+ gap: 1rem;
78
+ align-items: start;
79
+ min-width: 0;
80
+ }
81
+
82
+ .pack-component-panel {
83
+ min-width: 0;
84
+ padding: 1rem;
85
+ border: 1px solid var(--border-color);
86
+ border-radius: var(--radius-lg, 0.75rem);
87
+ background: var(--bg-primary);
88
+ }
89
+
90
+ .pack-component-panel--plate {
91
+ overflow-x: auto;
92
+ }
93
+
94
+ .pack-component-panel--dose {
95
+ max-width: 24rem;
96
+ }
97
+
98
+ @media (max-width: 960px) {
99
+ .pack-component-layout {
100
+ grid-template-columns: 1fr;
101
+ }
102
+
103
+ .pack-component-panel--dose {
104
+ max-width: none;
105
+ }
106
+ }
107
+ </style>