@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
@@ -38,10 +38,14 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
38
38
  route_prefix: string;
39
39
  api_prefix: string;
40
40
  nav_items?: {
41
- id: string;
41
+ id?: string | undefined;
42
42
  label: string;
43
43
  path: string;
44
44
  icon?: string | undefined;
45
+ description?: string | undefined;
46
+ requiresAuth?: boolean | undefined;
47
+ requiresAdmin?: boolean | undefined;
48
+ requiresFeature?: string | undefined;
45
49
  children?: /*elided*/ any[] | undefined;
46
50
  }[] | undefined;
47
51
  settings?: import('..').PluginSettings | undefined;
@@ -57,7 +61,9 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
57
61
  theme: "light" | "dark" | "system";
58
62
  allowedExperimentTypes?: string[] | null | undefined;
59
63
  features?: {
64
+ admin?: boolean | undefined;
60
65
  experiments?: boolean | undefined;
66
+ samples?: boolean | undefined;
61
67
  passkey?: boolean | undefined;
62
68
  multiUser?: boolean | undefined;
63
69
  } | undefined;
@@ -73,10 +79,14 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
73
79
  route_prefix: string;
74
80
  api_prefix: string;
75
81
  nav_items?: {
76
- id: string;
82
+ id?: string | undefined;
77
83
  label: string;
78
84
  path: string;
79
85
  icon?: string | undefined;
86
+ description?: string | undefined;
87
+ requiresAuth?: boolean | undefined;
88
+ requiresAdmin?: boolean | undefined;
89
+ requiresFeature?: string | undefined;
80
90
  children?: /*elided*/ any[] | undefined;
81
91
  }[] | undefined;
82
92
  settings?: import('..').PluginSettings | undefined;
@@ -92,7 +102,9 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
92
102
  theme: "light" | "dark" | "system";
93
103
  allowedExperimentTypes?: string[] | null | undefined;
94
104
  features?: {
105
+ admin?: boolean | undefined;
95
106
  experiments?: boolean | undefined;
107
+ samples?: boolean | undefined;
96
108
  passkey?: boolean | undefined;
97
109
  multiUser?: boolean | undefined;
98
110
  } | undefined;
@@ -108,10 +120,14 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
108
120
  route_prefix: string;
109
121
  api_prefix: string;
110
122
  nav_items?: {
111
- id: string;
123
+ id?: string | undefined;
112
124
  label: string;
113
125
  path: string;
114
126
  icon?: string | undefined;
127
+ description?: string | undefined;
128
+ requiresAuth?: boolean | undefined;
129
+ requiresAdmin?: boolean | undefined;
130
+ requiresFeature?: string | undefined;
115
131
  children?: /*elided*/ any[] | undefined;
116
132
  }[] | undefined;
117
133
  settings?: import('..').PluginSettings | undefined;
@@ -124,7 +140,9 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
124
140
  } | undefined>;
125
141
  theme: import('vue').ComputedRef<"light" | "dark" | "system">;
126
142
  features: import('vue').ComputedRef<{
143
+ admin?: boolean | undefined;
127
144
  experiments?: boolean | undefined;
145
+ samples?: boolean | undefined;
128
146
  passkey?: boolean | undefined;
129
147
  multiUser?: boolean | undefined;
130
148
  } | undefined>;
@@ -0,0 +1,112 @@
1
+ import { ComputedRef, Ref } from 'vue';
2
+ import { ExperimentSummary, PageSelectorItem } from '../types';
3
+ export type PluginHttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete';
4
+ export interface PluginEndpointContract {
5
+ name: string;
6
+ method: PluginHttpMethod;
7
+ path: string;
8
+ pathParams?: string[];
9
+ queryParams?: PluginEndpointParamContract[];
10
+ requestType?: string | null;
11
+ responseType?: string | null;
12
+ }
13
+ export interface PluginEndpointParamContract {
14
+ name: string;
15
+ fieldName: string;
16
+ type?: string;
17
+ required?: boolean;
18
+ }
19
+ export interface PluginNavItemContract {
20
+ path: string;
21
+ label: string;
22
+ id?: string;
23
+ icon?: string;
24
+ description?: string;
25
+ requiresAuth?: boolean;
26
+ requiresAdmin?: boolean;
27
+ requiresFeature?: string;
28
+ }
29
+ export interface PluginContract {
30
+ schemaVersion: number;
31
+ plugin: {
32
+ name?: string;
33
+ packageName?: string;
34
+ version?: string;
35
+ description?: string;
36
+ routesPrefix: string;
37
+ apiPrefix: string;
38
+ type: 'analysis' | 'experiment-design' | string;
39
+ analysisType?: string;
40
+ icon?: string;
41
+ color?: string;
42
+ navItems?: PluginNavItemContract[];
43
+ capabilities?: Record<string, unknown>;
44
+ };
45
+ endpoints: PluginEndpointContract[];
46
+ hash: string;
47
+ }
48
+ export interface PluginEndpointDefinition {
49
+ method: PluginHttpMethod;
50
+ path: string;
51
+ pathParams?: string[];
52
+ queryParams?: PluginEndpointParamDefinition[];
53
+ hasBody?: boolean;
54
+ }
55
+ export type PluginEndpointParamDefinition = string | {
56
+ name: string;
57
+ fieldName?: string;
58
+ type?: string;
59
+ required?: boolean;
60
+ };
61
+ export interface CreatePluginClientOptions {
62
+ endpoints: Record<string, PluginEndpointDefinition>;
63
+ baseUrl?: string;
64
+ }
65
+ export interface BuildPluginEndpointUrlOptions {
66
+ /** Override the generated or platform-injected API base URL. */
67
+ baseUrl?: string;
68
+ /** Return only the endpoint path and query string instead of base URL + path. */
69
+ includeBaseUrl?: boolean;
70
+ }
71
+ export interface UseCurrentExperimentOptions {
72
+ apiBaseUrl?: string;
73
+ immediate?: boolean;
74
+ }
75
+ export interface UseCurrentExperimentReturn<TExperiment = ExperimentSummary> {
76
+ /** Current experiment id resolved from platform injection or URL conventions. */
77
+ experimentId: ComputedRef<number | undefined>;
78
+ /** Whether a current experiment id is available. */
79
+ hasExperiment: ComputedRef<boolean>;
80
+ /** Current experiment payload, if injected or successfully fetched. */
81
+ experiment: Ref<TExperiment | undefined>;
82
+ /** Whether the current experiment is currently loading. */
83
+ isLoading: Ref<boolean>;
84
+ /** Error message from the last failed current-experiment fetch, or null. */
85
+ error: Ref<string | null>;
86
+ /** Timestamp of the last successful current-experiment fetch, or null. */
87
+ lastLoadedAt: Ref<Date | null>;
88
+ /** Return the current experiment id or throw a clear SDK error when absent. */
89
+ requireExperimentId: () => number;
90
+ /** Fetch a specific experiment id, defaulting to the current experiment id. */
91
+ fetch: (experimentId?: number) => Promise<TExperiment | undefined>;
92
+ /** Refetch the currently resolved experiment id. */
93
+ refresh: () => Promise<TExperiment | undefined>;
94
+ }
95
+ export type PluginEndpointCaller = (payload?: unknown) => Promise<unknown>;
96
+ export type GeneratedPluginClient = Record<string, (...args: any[]) => Promise<any>>;
97
+ /** Convert PluginMetadata.nav_items into AppTopBar pageSelector items for topbar page switches, homepage PluginCards, and fallback views. */
98
+ export declare function getPluginPageSelectorItems(contract: PluginContract): PageSelectorItem[];
99
+ /** Resolve the runtime plugin API base URL from env, explicit options, platform injection, or contract metadata. */
100
+ export declare function resolvePluginBaseUrl(contract: PluginContract, explicitBaseUrl?: string): string;
101
+ /** Build the concrete URL for a generated plugin endpoint without making a request. */
102
+ export declare function buildPluginEndpointUrl(contract: PluginContract, endpoint: PluginEndpointDefinition, payload?: unknown, options?: BuildPluginEndpointUrlOptions): string;
103
+ /** Create a typed plugin API client from a generated MINT plugin contract. */
104
+ export declare function createPluginClient<TClient extends object = GeneratedPluginClient>(contract: PluginContract, options: CreatePluginClientOptions): TClient;
105
+ /** Return a generated plugin client from setup code with a stable typed identity. */
106
+ export declare function usePluginClient<TClient>(client: TClient): TClient;
107
+ /** Read plugin settings exposed through the platform context. */
108
+ export declare function usePluginSettings<TSettings = Record<string, unknown>>(): {
109
+ settings: ComputedRef<TSettings | undefined>;
110
+ };
111
+ /** Read and optionally load the current platform experiment for integrated plugin views. */
112
+ export declare function useCurrentExperiment<TExperiment = ExperimentSummary>(options?: UseCurrentExperimentOptions): UseCurrentExperimentReturn<TExperiment>;
@@ -1,12 +1,24 @@
1
1
  import { Ref, ComputedRef } from 'vue';
2
2
  export interface UsePluginConfigReturn {
3
+ /** Editable plugin configuration values. */
3
4
  config: Ref<Record<string, unknown>>;
5
+ /** Whether the config is currently loading. */
4
6
  isLoading: Ref<boolean>;
7
+ /** Whether the config is currently saving. */
5
8
  isSaving: Ref<boolean>;
9
+ /** Error message from the last failed operation, or null. */
6
10
  error: Ref<string | null>;
11
+ /** Timestamp of the last successful load, or null. */
12
+ lastLoadedAt: Ref<Date | null>;
13
+ /** Timestamp of the last successful save, or null. */
14
+ lastSavedAt: Ref<Date | null>;
15
+ /** Whether local config differs from the last loaded or saved snapshot. */
7
16
  isDirty: ComputedRef<boolean>;
17
+ /** Load plugin configuration from the platform. */
8
18
  load: () => Promise<void>;
19
+ /** Save plugin configuration to the platform. */
9
20
  save: () => Promise<boolean>;
21
+ /** Restore the last loaded or saved configuration snapshot. */
10
22
  reset: () => void;
11
23
  }
12
24
  /** Loads, saves, and tracks dirty state for a plugin's persistent configuration via the platform API. */
@@ -0,0 +1,34 @@
1
+ import { Ref } from 'vue';
2
+ export type RequestSyncSuccessKind = 'load' | 'save' | 'run';
3
+ export interface RequestSyncRunOptions {
4
+ success?: RequestSyncSuccessKind;
5
+ errorMessage?: string;
6
+ }
7
+ export interface UseRequestSyncStateReturn {
8
+ /** Whether a request is in progress. */
9
+ loading: Ref<boolean>;
10
+ /** Message from the last failed request, or null. */
11
+ error: Ref<string | null>;
12
+ /** Timestamp of the last successful load operation, or null. */
13
+ lastLoadedAt: Ref<Date | null>;
14
+ /** Timestamp of the last successful save operation, or null. */
15
+ lastSavedAt: Ref<Date | null>;
16
+ /** Timestamp of the last successful run operation, or null. */
17
+ lastRunAt: Ref<Date | null>;
18
+ /** Clear the current error without changing loading or timestamps. */
19
+ clearError: () => void;
20
+ /** Convert thrown values into a developer-facing error message. */
21
+ readErrorMessage: (value: unknown, fallback?: string) => string;
22
+ /** Store and return a normalized error message. */
23
+ setError: (value: unknown, fallback?: string) => string;
24
+ /** Mark the resource as successfully loaded. */
25
+ markLoaded: (date?: Date) => void;
26
+ /** Mark the resource as successfully saved. */
27
+ markSaved: (date?: Date) => void;
28
+ /** Mark the operation as successfully run. */
29
+ markRun: (date?: Date) => void;
30
+ /** Run a request with shared loading/error handling and optional sync marking. */
31
+ run: <T>(operation: () => Promise<T>, options?: RequestSyncRunOptions) => Promise<T>;
32
+ }
33
+ /** Shared loading/error/timestamp state for generated plugin request helpers. */
34
+ export declare function useRequestSyncState(defaultErrorMessage?: string): UseRequestSyncStateReturn;
@@ -0,0 +1,32 @@
1
+ import { ComputedRef, Ref } from 'vue';
2
+ import { SampleGroup } from '../types';
3
+ export type SampleGroupSource<T> = T | Ref<T> | ComputedRef<T> | (() => T);
4
+ export interface DisplaySampleSubGroup extends SampleGroup {
5
+ displayColor: string;
6
+ displayBg: string;
7
+ displayBorder: string;
8
+ }
9
+ export interface SampleMajorGroup {
10
+ name: string;
11
+ color: string;
12
+ subGroups: DisplaySampleSubGroup[];
13
+ allSamples: string[];
14
+ }
15
+ export interface UseSampleGroupsOptions {
16
+ groups: SampleGroupSource<readonly SampleGroup[]>;
17
+ samples?: SampleGroupSource<readonly string[]>;
18
+ separator?: SampleGroupSource<string | null | undefined>;
19
+ fallbackColor?: SampleGroupSource<string | null | undefined>;
20
+ }
21
+ export interface UseSampleGroupsReturn {
22
+ groups: ComputedRef<SampleGroup[]>;
23
+ separator: ComputedRef<string>;
24
+ hierarchicalGroups: ComputedRef<SampleMajorGroup[]>;
25
+ showHierarchy: ComputedRef<boolean>;
26
+ groupedSamples: ComputedRef<Set<string>>;
27
+ ungroupedSamples: ComputedRef<string[]>;
28
+ findGroup: (groupName: string) => SampleGroup | undefined;
29
+ getGroupColor: (groupName: string) => string;
30
+ }
31
+ /** Shared sample-group hierarchy, color, and ungrouped-sample derivation for lab selectors. */
32
+ export declare function useSampleGroups(options: UseSampleGroupsOptions): UseSampleGroupsReturn;
@@ -0,0 +1,17 @@
1
+ import { ComputedRef, Ref } from 'vue';
2
+ export type SelectionLimitSource<T> = T | Ref<T> | ComputedRef<T> | (() => T);
3
+ export interface UseSelectionLimitOptions {
4
+ count: SelectionLimitSource<number>;
5
+ max?: SelectionLimitSource<number | null | undefined>;
6
+ }
7
+ export interface UseSelectionLimitReturn {
8
+ count: ComputedRef<number>;
9
+ max: ComputedRef<number | undefined>;
10
+ isLimited: ComputedRef<boolean>;
11
+ isAtLimit: ComputedRef<boolean>;
12
+ canAddMore: ComputedRef<boolean>;
13
+ remaining: ComputedRef<number | undefined>;
14
+ canAdd: (amount?: number, fromCount?: number) => boolean;
15
+ }
16
+ /** Shared cap logic for chip, tag, and multi-select controls. */
17
+ export declare function useSelectionLimit(options: UseSelectionLimitOptions): UseSelectionLimitReturn;
@@ -0,0 +1,32 @@
1
+ import { ComputedRef, Ref } from 'vue';
2
+ export type SortedItemsSource<T> = T | Ref<T> | ComputedRef<T> | (() => T);
3
+ export type SortOrder = 'asc' | 'desc';
4
+ export interface SortDescriptor<TKey extends string = string> {
5
+ key: TKey;
6
+ direction?: SortOrder | null;
7
+ }
8
+ export interface CompareSortValuesOptions {
9
+ caseSensitive?: boolean;
10
+ }
11
+ export interface SortComparatorContext<TItem, TKey extends string = string> {
12
+ key: TKey;
13
+ direction: SortOrder;
14
+ a: TItem;
15
+ b: TItem;
16
+ }
17
+ export type SortComparator<TItem, TKey extends string = string> = (aValue: unknown, bValue: unknown, context: SortComparatorContext<TItem, TKey>) => number;
18
+ export interface UseSortedItemsOptions<TItem, TKey extends string = string> {
19
+ items: SortedItemsSource<readonly TItem[]>;
20
+ sort: SortedItemsSource<SortDescriptor<TKey> | null | undefined>;
21
+ enabled?: SortedItemsSource<boolean | null | undefined>;
22
+ caseSensitive?: SortedItemsSource<boolean | null | undefined>;
23
+ getValue: (item: TItem, key: TKey) => unknown;
24
+ compare?: SortComparator<TItem, TKey>;
25
+ }
26
+ export interface UseSortedItemsReturn<TItem, TKey extends string = string> {
27
+ sort: ComputedRef<SortDescriptor<TKey> | null | undefined>;
28
+ sortedItems: ComputedRef<TItem[]>;
29
+ }
30
+ /** Shared sorting for SDK tables and lists with stable empty-value handling. */
31
+ export declare function useSortedItems<TItem, TKey extends string = string>(options: UseSortedItemsOptions<TItem, TKey>): UseSortedItemsReturn<TItem, TKey>;
32
+ export declare function compareSortValues(aValue: unknown, bValue: unknown, direction?: SortOrder, options?: CompareSortValuesOptions): number;
@@ -0,0 +1,58 @@
1
+ import { ComputedRef, Ref } from 'vue';
2
+ import { UseExperimentSaveOptions } from './useExperimentSave';
3
+ import { BioTemplateEnvelope, TemplateCollection, TemplateCollectionEnvelope } from '../templates';
4
+ export type TemplateCollectionInput = TemplateCollectionEnvelope | BioTemplateEnvelope<unknown> | Array<BioTemplateEnvelope<unknown>>;
5
+ export interface UseTemplateCollectionOptions extends UseExperimentSaveOptions {
6
+ /** Initial template collection or factory; defaults to an empty collection. */
7
+ initial?: TemplateCollectionInput | (() => TemplateCollectionInput);
8
+ }
9
+ export interface UseTemplateCollectionReturn {
10
+ /** Current experiment id from platform injection, URL query, or URL path. */
11
+ currentExperimentId: ComputedRef<number | undefined>;
12
+ /** Whether a current experiment id is available. */
13
+ hasCurrentExperiment: ComputedRef<boolean>;
14
+ /** Full template collection envelope ready to save into design_data. */
15
+ templateCollection: Ref<TemplateCollectionEnvelope>;
16
+ /** Template map keyed by template_id. */
17
+ templates: ComputedRef<TemplateCollection>;
18
+ /** Collection-level metadata, or an empty object. */
19
+ metadata: ComputedRef<Record<string, unknown>>;
20
+ /** Template ids currently present in the collection. */
21
+ templateIds: ComputedRef<string[]>;
22
+ /** Whether the collection contains at least one template. */
23
+ hasTemplates: ComputedRef<boolean>;
24
+ /** Whether a load or delete operation is in progress. */
25
+ isLoading: Ref<boolean>;
26
+ /** Whether a save operation is in progress. */
27
+ isSaving: Ref<boolean>;
28
+ /** Error message from the last failed operation, or null. */
29
+ error: Ref<string | null>;
30
+ /** Timestamp of the last successful load, or null. */
31
+ lastLoadedAt: Ref<Date | null>;
32
+ /** Timestamp of the last successful save, or null. */
33
+ lastSavedAt: Ref<Date | null>;
34
+ /** Replace local state from a template envelope, collection envelope, or raw design_data. */
35
+ apply: (value: unknown, metadata?: Record<string, unknown>) => TemplateCollectionEnvelope;
36
+ /** Reset local state to the configured initial collection. */
37
+ reset: () => TemplateCollectionEnvelope;
38
+ /** Add or replace one template in the local collection. */
39
+ setTemplate: (template: BioTemplateEnvelope<unknown>) => TemplateCollectionEnvelope;
40
+ /** Remove one template from the local collection. */
41
+ removeTemplate: (templateId: string) => boolean;
42
+ /** Read one template from the local collection, returning null when missing. */
43
+ getTemplate: <TTemplate extends BioTemplateEnvelope<unknown> = BioTemplateEnvelope<unknown>>(templateId: string) => TTemplate | null;
44
+ /** Read one template from the local collection, throwing when missing or mismatched. */
45
+ requireTemplate: <TTemplate extends BioTemplateEnvelope<unknown> = BioTemplateEnvelope<unknown>>(templateId: string) => TTemplate;
46
+ /** Load template design_data for an experiment and apply it locally. */
47
+ load: (experimentId: number) => Promise<TemplateCollectionEnvelope | null>;
48
+ /** Load template design_data for the current experiment and apply it locally. */
49
+ loadCurrent: () => Promise<TemplateCollectionEnvelope | null>;
50
+ /** Save the local template collection as experiment design_data. */
51
+ save: (experimentId: number) => Promise<boolean>;
52
+ /** Save the local template collection as current experiment design_data. */
53
+ saveCurrent: () => Promise<boolean>;
54
+ /** Require and return the current experiment id, or throw when missing. */
55
+ requireCurrentExperimentId: () => number;
56
+ }
57
+ /** Manages a biology template collection in the current experiment's design_data. */
58
+ export declare function useTemplateCollection(options?: UseTemplateCollectionOptions): UseTemplateCollectionReturn;
@@ -0,0 +1,18 @@
1
+ import { ComputedRef, Ref } from 'vue';
2
+ export type TextSearchSource<T> = T | Ref<T> | ComputedRef<T> | (() => T);
3
+ export type TextSearchCandidate = unknown | readonly unknown[];
4
+ export interface UseTextSearchOptions<TItem> {
5
+ items: TextSearchSource<readonly TItem[]>;
6
+ query: TextSearchSource<string | null | undefined>;
7
+ enabled?: TextSearchSource<boolean | null | undefined>;
8
+ getText: (item: TItem) => TextSearchCandidate;
9
+ }
10
+ export interface UseTextSearchReturn<TItem> {
11
+ query: ComputedRef<string>;
12
+ filteredItems: ComputedRef<TItem[]>;
13
+ matches: (item: TItem, query?: string | null | undefined) => boolean;
14
+ }
15
+ /** Shared text-search filtering for tables, lists, selectors, and chip inputs. */
16
+ export declare function useTextSearch<TItem>(options: UseTextSearchOptions<TItem>): UseTextSearchReturn<TItem>;
17
+ export declare function normalizeSearchQuery(value: string | null | undefined): string;
18
+ export declare function candidateMatchesSearch(candidate: TextSearchCandidate, query: string): boolean;
@@ -4,6 +4,7 @@ export declare function parseTime(time: string): {
4
4
  minute: number;
5
5
  };
6
6
  export declare function formatTime(hour: number, minute: number, format?: '12h' | '24h'): string;
7
+ export declare function formatTimeSlot(time: string, format?: '12h' | '24h'): string;
7
8
  export declare function generateTimeSlots(start: string, end: string, stepMinutes: number): string[];
8
9
  export declare function rangesOverlap(a: TimeRange, b: TimeRange): boolean;
9
10
  export declare function durationMinutes(start: string, end: string): number;
@@ -13,10 +14,14 @@ export declare function findAvailableSlots(dayStart: string, dayEnd: string, occ
13
14
  export declare function snapToSlot(time: string, stepMinutes: number): string;
14
15
  export declare function addMinutes(time: string, minutes: number): string;
15
16
  export declare function compareTime(a: string, b: string): number;
17
+ export declare function findNearestTimeSlotIndex(time: string, slots: readonly string[]): number;
18
+ export declare function toMinutes(time: string): number;
19
+ export declare function fromMinutes(total: number): string;
16
20
  /** Time utility helpers for parsing, formatting, comparing, and snapping HH:MM strings. */
17
21
  export declare function useTimeUtils(): {
18
22
  parseTime: typeof parseTime;
19
23
  formatTime: typeof formatTime;
24
+ formatTimeSlot: typeof formatTimeSlot;
20
25
  generateTimeSlots: typeof generateTimeSlots;
21
26
  rangesOverlap: typeof rangesOverlap;
22
27
  durationMinutes: typeof durationMinutes;
@@ -26,4 +31,7 @@ export declare function useTimeUtils(): {
26
31
  snapToSlot: typeof snapToSlot;
27
32
  addMinutes: typeof addMinutes;
28
33
  compareTime: typeof compareTime;
34
+ findNearestTimeSlotIndex: typeof findNearestTimeSlotIndex;
35
+ toMinutes: typeof toMinutes;
36
+ fromMinutes: typeof fromMinutes;
29
37
  };