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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/README.md +218 -6
  2. package/dist/__tests__/components/ActionItem.test.d.ts +1 -0
  3. package/dist/__tests__/components/AppAvatarMenu.test.d.ts +1 -0
  4. package/dist/__tests__/components/AppPageSelector.test.d.ts +1 -0
  5. package/dist/__tests__/components/AppPillNav.test.d.ts +1 -0
  6. package/dist/__tests__/components/AppPluginSwitcher.test.d.ts +1 -0
  7. package/dist/__tests__/components/AppToastContainer.test.d.ts +1 -0
  8. package/dist/__tests__/components/BaseRadioGroup.test.d.ts +1 -0
  9. package/dist/__tests__/components/BaseSelect.test.d.ts +1 -0
  10. package/dist/__tests__/components/BaseTabs.test.d.ts +1 -0
  11. package/dist/__tests__/components/BatchProgressList.test.d.ts +1 -0
  12. package/dist/__tests__/components/BioTemplateExperimentWorkspaceView.test.d.ts +1 -0
  13. package/dist/__tests__/components/BioTemplatePackWorkspaceView.test.d.ts +1 -0
  14. package/dist/__tests__/components/BioTemplatePresetWorkspaceView.test.d.ts +1 -0
  15. package/dist/__tests__/components/BioTemplateRenderer.test.d.ts +1 -0
  16. package/dist/__tests__/components/Breadcrumb.test.d.ts +1 -0
  17. package/dist/__tests__/components/CalendarGridPanel.test.d.ts +1 -0
  18. package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
  19. package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
  20. package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
  21. package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
  22. package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
  23. package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
  24. package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
  25. package/dist/__tests__/components/FormCompatibility.test.d.ts +1 -0
  26. package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
  27. package/dist/__tests__/components/GroupingModal.test.d.ts +1 -0
  28. package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
  29. package/dist/__tests__/components/PluginIcon.test.d.ts +1 -0
  30. package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
  31. package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
  32. package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
  33. package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
  34. package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
  35. package/dist/__tests__/components/SettingsButton.test.d.ts +1 -0
  36. package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
  37. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  38. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  39. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  40. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  41. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  42. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  43. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  44. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  45. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  46. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  47. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  48. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  49. package/dist/__tests__/composables/useExperimentData.test.d.ts +1 -0
  50. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  51. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  52. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  53. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  54. package/dist/__tests__/composables/usePluginConfig.test.d.ts +1 -0
  55. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  56. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  57. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  58. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  59. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  60. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  61. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  62. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  63. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  64. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  65. package/dist/{auth-DsI0rQ7_.js → auth-QQj2kkze.js} +12 -5
  66. package/dist/auth-QQj2kkze.js.map +1 -0
  67. package/dist/components/ActionItem.vue.d.ts +32 -0
  68. package/dist/components/AppAvatarMenu.vue.d.ts +2 -7
  69. package/dist/components/AppPageSelector.vue.d.ts +3 -6
  70. package/dist/components/AppPillNav.vue.d.ts +2 -2
  71. package/dist/components/AppSidebar.vue.d.ts +56 -3
  72. package/dist/components/AppToastContainer.vue.d.ts +2 -0
  73. package/dist/components/AppTopBar.vue.d.ts +43 -10
  74. package/dist/components/BaseButton.vue.d.ts +2 -2
  75. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  76. package/dist/components/BaseInput.vue.d.ts +2 -2
  77. package/dist/components/BasePill.vue.d.ts +3 -3
  78. package/dist/components/BaseRadioGroup.vue.d.ts +4 -4
  79. package/dist/components/BaseSelect.vue.d.ts +4 -4
  80. package/dist/components/BaseSlider.vue.d.ts +1 -1
  81. package/dist/components/BaseTabs.vue.d.ts +2 -2
  82. package/dist/components/BaseTextarea.vue.d.ts +2 -2
  83. package/dist/components/BaseToggle.vue.d.ts +1 -1
  84. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +117 -0
  85. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +92 -0
  86. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +82 -0
  87. package/dist/components/BioTemplateRenderer.vue.d.ts +29 -0
  88. package/dist/components/Breadcrumb.vue.d.ts +2 -2
  89. package/dist/components/Calendar.vue.d.ts +1 -1
  90. package/dist/components/CalendarGridPanel.vue.d.ts +25 -0
  91. package/dist/components/CollapsibleCard.vue.d.ts +1 -1
  92. package/dist/components/ColorSlider.vue.d.ts +1 -1
  93. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  94. package/dist/components/ConfirmDialog.vue.d.ts +2 -2
  95. package/dist/components/ControlWorkspaceView.vue.d.ts +130 -0
  96. package/dist/components/DatePicker.vue.d.ts +2 -2
  97. package/dist/components/DateTimePicker.vue.d.ts +3 -3
  98. package/dist/components/DropdownButton.vue.d.ts +4 -4
  99. package/dist/components/EmptyState.vue.d.ts +1 -2
  100. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  101. package/dist/components/ExperimentTimeline.vue.d.ts +2 -2
  102. package/dist/components/FileUploader.vue.d.ts +2 -2
  103. package/dist/components/FitPanel.vue.d.ts +1 -1
  104. package/dist/components/FormActions.vue.d.ts +4 -4
  105. package/dist/components/FormBuilder.vue.d.ts +22 -8
  106. package/dist/components/FormFieldRenderer.vue.d.ts +7 -10
  107. package/dist/components/FormSection.vue.d.ts +11 -24
  108. package/dist/components/FormulaInput.vue.d.ts +2 -2
  109. package/dist/components/IconButton.vue.d.ts +1 -1
  110. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  111. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  112. package/dist/components/MultiSelect.vue.d.ts +3 -3
  113. package/dist/components/NumberInput.vue.d.ts +2 -2
  114. package/dist/components/PluginIcon.vue.d.ts +11 -0
  115. package/dist/components/ProgressBar.vue.d.ts +2 -2
  116. package/dist/components/ProtocolStepEditor.vue.d.ts +3 -1
  117. package/dist/components/RackEditor.vue.d.ts +2 -2
  118. package/dist/components/ReagentEditor.vue.d.ts +1 -1
  119. package/dist/components/ResourceCard.vue.d.ts +1 -1
  120. package/dist/components/SampleLegend.vue.d.ts +2 -2
  121. package/dist/components/SampleSelector.vue.d.ts +1 -1
  122. package/dist/components/ScheduleCalendar.vue.d.ts +2 -2
  123. package/dist/components/ScientificNumber.vue.d.ts +1 -1
  124. package/dist/components/SegmentedControl.vue.d.ts +3 -3
  125. package/dist/components/SequenceInput.vue.d.ts +3 -3
  126. package/dist/components/SettingsButton.vue.d.ts +2 -2
  127. package/dist/components/SettingsModal.vue.d.ts +32 -4
  128. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  129. package/dist/components/TagsInput.vue.d.ts +3 -2
  130. package/dist/components/TimePicker.vue.d.ts +3 -3
  131. package/dist/components/TimeRangeInput.vue.d.ts +2 -2
  132. package/dist/components/UnitInput.vue.d.ts +2 -2
  133. package/dist/components/WellPlate.vue.d.ts +8 -8
  134. package/dist/components/index.d.ts +12 -1
  135. package/dist/components/index.js +3 -3
  136. package/dist/components/internal/FormFieldRendererInternal.vue.d.ts +31 -0
  137. package/dist/components/internal/FormSectionRenderer.vue.d.ts +43 -0
  138. package/dist/{components-CzbQQPCb.js → components-D_Sr0adg.js} +9629 -8647
  139. package/dist/components-D_Sr0adg.js.map +1 -0
  140. package/dist/composables/index.d.ts +21 -2
  141. package/dist/composables/index.js +4 -3
  142. package/dist/composables/platformContextHelpers.d.ts +14 -0
  143. package/dist/composables/useBioTemplateComponents.d.ts +20 -0
  144. package/dist/composables/useBioTemplateControls.d.ts +6 -0
  145. package/dist/composables/useBioTemplatePackWorkspace.d.ts +45 -0
  146. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +74 -0
  147. package/dist/composables/useBioTemplateWorkspace.d.ts +50 -0
  148. package/dist/composables/useCalendarGrid.d.ts +26 -0
  149. package/dist/composables/useControlSchema.d.ts +321 -0
  150. package/dist/composables/useDebouncedWatch.d.ts +20 -0
  151. package/dist/composables/useDropdownState.d.ts +19 -0
  152. package/dist/composables/useEventListener.d.ts +13 -0
  153. package/dist/composables/useExpansionSet.d.ts +21 -0
  154. package/dist/composables/useExperimentData.d.ts +10 -0
  155. package/dist/composables/useExperimentSave.d.ts +31 -2
  156. package/dist/composables/useExperimentSelector.d.ts +20 -0
  157. package/dist/composables/useForm.d.ts +2 -0
  158. package/dist/composables/useGroupAssignment.d.ts +31 -0
  159. package/dist/composables/useListSelection.d.ts +35 -0
  160. package/dist/composables/usePlatformContext.d.ts +24 -3
  161. package/dist/composables/usePluginApi.d.ts +7 -14
  162. package/dist/composables/usePluginClient.d.ts +109 -0
  163. package/dist/composables/usePluginConfig.d.ts +12 -0
  164. package/dist/composables/useRequestSyncState.d.ts +34 -0
  165. package/dist/composables/useSampleGroups.d.ts +32 -0
  166. package/dist/composables/useSelectionLimit.d.ts +17 -0
  167. package/dist/composables/useSortedItems.d.ts +32 -0
  168. package/dist/composables/useTemplateCollection.d.ts +58 -0
  169. package/dist/composables/useTextSearch.d.ts +18 -0
  170. package/dist/composables/useTimeUtils.d.ts +8 -0
  171. package/dist/{composables-BXklV5ii.js → composables-C3dpXQN5.js} +228 -146
  172. package/dist/composables-C3dpXQN5.js.map +1 -0
  173. package/dist/index.d.ts +12 -3
  174. package/dist/index.js +6 -5
  175. package/dist/install.d.ts +7 -2
  176. package/dist/install.js +2 -2
  177. package/dist/install.js.map +1 -1
  178. package/dist/stores/auth.d.ts +1 -1
  179. package/dist/stores/index.js +1 -1
  180. package/dist/stores/settings.d.ts +4 -1
  181. package/dist/styles.css +5255 -5654
  182. package/dist/templates/adapters.d.ts +43 -0
  183. package/dist/templates/builders.d.ts +63 -0
  184. package/dist/templates/catalog.d.ts +188 -0
  185. package/dist/templates/componentBindings.d.ts +58 -0
  186. package/dist/templates/controlSchemas.d.ts +25 -0
  187. package/dist/templates/index.d.ts +15 -0
  188. package/dist/templates/index.js +2 -0
  189. package/dist/templates/lookup.d.ts +4 -0
  190. package/dist/templates/packs.d.ts +18 -0
  191. package/dist/templates/presets.d.ts +90 -0
  192. package/dist/templates/types.d.ts +531 -0
  193. package/dist/templates-50NPjaxL.js +9333 -0
  194. package/dist/templates-50NPjaxL.js.map +1 -0
  195. package/dist/types/components.d.ts +62 -1
  196. package/dist/types/form-builder.d.ts +6 -8
  197. package/dist/types/index.d.ts +2 -2
  198. package/dist/types/platform.d.ts +8 -1
  199. package/dist/useScheduleDrag-D4oWdh41.js +4371 -0
  200. package/dist/useScheduleDrag-D4oWdh41.js.map +1 -0
  201. package/dist/utils/formModelSync.d.ts +5 -0
  202. package/dist/utils/items.d.ts +8 -0
  203. package/dist/utils/options.d.ts +6 -0
  204. package/dist/utils/pluginIcon.d.ts +9 -0
  205. package/package.json +7 -2
  206. package/src/__tests__/components/ActionItem.test.ts +99 -0
  207. package/src/__tests__/components/AppAvatarMenu.test.ts +27 -0
  208. package/src/__tests__/components/AppPageSelector.test.ts +134 -0
  209. package/src/__tests__/components/AppPillNav.test.ts +78 -0
  210. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  211. package/src/__tests__/components/AppSidebar.test.ts +370 -0
  212. package/src/__tests__/components/AppToastContainer.test.ts +48 -0
  213. package/src/__tests__/components/AppTopBar.test.ts +414 -13
  214. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  215. package/src/__tests__/components/BaseSelect.test.ts +21 -0
  216. package/src/__tests__/components/BaseTabs.test.ts +25 -0
  217. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  218. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +153 -0
  219. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +161 -0
  220. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +281 -0
  221. package/src/__tests__/components/BioTemplateRenderer.test.ts +71 -0
  222. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  223. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  224. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  225. package/src/__tests__/components/ControlWorkspaceView.test.ts +1031 -0
  226. package/src/__tests__/components/DataFrame.test.ts +11 -0
  227. package/src/__tests__/components/DatePicker.test.ts +45 -0
  228. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  229. package/src/__tests__/components/DropdownButton.test.ts +23 -0
  230. package/src/__tests__/components/EmptyState.test.ts +23 -0
  231. package/src/__tests__/components/ExperimentPopover.test.ts +56 -0
  232. package/src/__tests__/components/FormBuilder.test.ts +296 -0
  233. package/src/__tests__/components/FormCompatibility.test.ts +94 -0
  234. package/src/__tests__/components/GroupAssigner.test.ts +30 -0
  235. package/src/__tests__/components/GroupingModal.test.ts +73 -0
  236. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  237. package/src/__tests__/components/PluginIcon.test.ts +119 -0
  238. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  239. package/src/__tests__/components/ReagentList.test.ts +82 -0
  240. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  241. package/src/__tests__/components/SampleSelector.test.ts +60 -0
  242. package/src/__tests__/components/SegmentedControl.test.ts +24 -0
  243. package/src/__tests__/components/SettingsButton.test.ts +44 -0
  244. package/src/__tests__/components/SettingsModal.test.ts +296 -0
  245. package/src/__tests__/components/TagsInput.test.ts +75 -0
  246. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  247. package/src/__tests__/components/TimePicker.test.ts +38 -0
  248. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +122 -0
  249. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  250. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +99 -0
  251. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  252. package/src/__tests__/composables/useControlSchema.test.ts +919 -0
  253. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  254. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  255. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  256. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  257. package/src/__tests__/composables/useExperimentData.test.ts +4 -0
  258. package/src/__tests__/composables/useExperimentSave.test.ts +203 -8
  259. package/src/__tests__/composables/useExperimentSelector.test.ts +164 -0
  260. package/src/__tests__/composables/useForm.test.ts +58 -0
  261. package/src/__tests__/composables/useFormBuilder.test.ts +77 -0
  262. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  263. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  264. package/src/__tests__/composables/usePluginClient.test.ts +444 -0
  265. package/src/__tests__/composables/usePluginConfig.test.ts +5 -0
  266. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  267. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  268. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  269. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  270. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  271. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  272. package/src/__tests__/composables/useTheme.test.ts +91 -0
  273. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  274. package/src/__tests__/docs/frontendDocsCatalog.test.ts +229 -0
  275. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  276. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  277. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  278. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  279. package/src/__tests__/templates/templates.test.ts +1043 -0
  280. package/src/components/ActionItem.vue +82 -0
  281. package/src/components/AppAvatarMenu.vue +15 -69
  282. package/src/components/AppLayout.story.vue +25 -25
  283. package/src/components/AppPageSelector.vue +63 -94
  284. package/src/components/AppPillNav.vue +44 -39
  285. package/src/components/AppPluginSwitcher.vue +41 -145
  286. package/src/components/AppSidebar.story.vue +94 -0
  287. package/src/components/AppSidebar.vue +187 -12
  288. package/src/components/{ToastNotification.story.vue → AppToastContainer.story.vue} +6 -6
  289. package/src/components/AppToastContainer.vue +62 -0
  290. package/src/components/AppTopBar.story.vue +7 -30
  291. package/src/components/AppTopBar.vue +283 -84
  292. package/src/components/BaseModal.vue +3 -5
  293. package/src/components/BaseRadioGroup.vue +7 -3
  294. package/src/components/BaseSelect.vue +11 -7
  295. package/src/components/BaseTabs.vue +6 -4
  296. package/src/components/BatchProgressList.vue +5 -8
  297. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  298. package/src/components/BioTemplateExperimentWorkspaceView.vue +337 -0
  299. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  300. package/src/components/BioTemplatePackWorkspaceView.vue +176 -0
  301. package/src/components/BioTemplatePresetWorkspaceView.story.vue +151 -0
  302. package/src/components/BioTemplatePresetWorkspaceView.vue +392 -0
  303. package/src/components/BioTemplateRenderer.story.vue +57 -0
  304. package/src/components/BioTemplateRenderer.vue +269 -0
  305. package/src/components/Breadcrumb.vue +14 -8
  306. package/src/components/CalendarGridPanel.vue +120 -0
  307. package/src/components/ConcentrationInput.vue +27 -64
  308. package/src/components/ControlWorkspaceView.story.vue +336 -0
  309. package/src/components/ControlWorkspaceView.vue +347 -0
  310. package/src/components/DataFrame.vue +34 -50
  311. package/src/components/DatePicker.vue +59 -192
  312. package/src/components/DateTimePicker.vue +50 -171
  313. package/src/components/DropdownButton.vue +14 -32
  314. package/src/components/EmptyState.vue +4 -2
  315. package/src/components/ExperimentPopover.vue +5 -22
  316. package/src/components/FormBuilder.vue +124 -27
  317. package/src/components/FormFieldRenderer.vue +15 -38
  318. package/src/components/FormSection.vue +20 -73
  319. package/src/components/GroupAssigner.vue +24 -56
  320. package/src/components/GroupingModal.story.vue +3 -3
  321. package/src/components/GroupingModal.vue +30 -391
  322. package/src/components/MultiSelect.vue +17 -12
  323. package/src/components/PlateMapEditor.vue +3 -8
  324. package/src/components/PluginIcon.story.vue +71 -0
  325. package/src/components/PluginIcon.vue +68 -0
  326. package/src/components/ProtocolStepEditor.vue +13 -22
  327. package/src/components/ReagentList.vue +25 -33
  328. package/src/components/SampleHierarchyTree.vue +12 -23
  329. package/src/components/SampleSelector.vue +42 -122
  330. package/src/components/SegmentedControl.vue +7 -3
  331. package/src/components/SettingsButton.story.vue +1 -1
  332. package/src/components/SettingsButton.vue +15 -27
  333. package/src/components/SettingsModal.story.vue +337 -45
  334. package/src/components/SettingsModal.vue +344 -66
  335. package/src/components/TagsInput.vue +29 -14
  336. package/src/components/ThemeToggle.vue +9 -7
  337. package/src/components/TimePicker.vue +19 -41
  338. package/src/components/ToastNotification.vue +4 -57
  339. package/src/components/Tooltip.vue +7 -12
  340. package/src/components/WellEditPopup.vue +3 -8
  341. package/src/components/WellPlate.vue +4 -10
  342. package/src/components/index.ts +12 -1
  343. package/src/components/internal/FormFieldRendererInternal.vue +50 -0
  344. package/src/components/internal/FormSectionRenderer.vue +78 -0
  345. package/src/composables/index.ts +212 -0
  346. package/src/composables/platformContextHelpers.ts +74 -0
  347. package/src/composables/useBioTemplateComponents.ts +93 -0
  348. package/src/composables/useBioTemplateControls.ts +41 -0
  349. package/src/composables/useBioTemplatePackWorkspace.ts +181 -0
  350. package/src/composables/useBioTemplatePresetWorkspace.ts +337 -0
  351. package/src/composables/useBioTemplateWorkspace.ts +139 -0
  352. package/src/composables/useCalendarGrid.ts +140 -0
  353. package/src/composables/useControlSchema.ts +1274 -0
  354. package/src/composables/useDebouncedWatch.ts +119 -0
  355. package/src/composables/useDropdownState.ts +83 -0
  356. package/src/composables/useEventListener.ts +111 -0
  357. package/src/composables/useExpansionSet.ts +117 -0
  358. package/src/composables/useExperimentData.ts +20 -11
  359. package/src/composables/useExperimentSave.ts +202 -50
  360. package/src/composables/useExperimentSelector.ts +86 -72
  361. package/src/composables/useForm.ts +49 -4
  362. package/src/composables/useFormBuilder.ts +93 -42
  363. package/src/composables/useGroupAssignment.ts +148 -0
  364. package/src/composables/useListSelection.ts +158 -0
  365. package/src/composables/usePluginApi.ts +7 -14
  366. package/src/composables/usePluginClient.ts +425 -0
  367. package/src/composables/usePluginConfig.ts +34 -13
  368. package/src/composables/useRequestSyncState.ts +126 -0
  369. package/src/composables/useSampleGroups.ts +126 -0
  370. package/src/composables/useSelectionLimit.ts +57 -0
  371. package/src/composables/useSortedItems.ts +118 -0
  372. package/src/composables/useTemplateCollection.ts +229 -0
  373. package/src/composables/useTextSearch.ts +60 -0
  374. package/src/composables/useTheme.ts +2 -28
  375. package/src/composables/useTimeUtils.ts +26 -2
  376. package/src/composables/useWellPlateEditor.ts +13 -9
  377. package/src/index.ts +228 -4
  378. package/src/install.ts +11 -4
  379. package/src/stores/settings.ts +13 -9
  380. package/src/styles/components/app-page-selector.css +23 -0
  381. package/src/styles/components/app-pill-nav.css +8 -2
  382. package/src/styles/components/app-top-bar.css +35 -2
  383. package/src/styles/components/button.css +3 -7
  384. package/src/styles/components/concentration-input.css +3 -142
  385. package/src/styles/components/dropdown-button.css +4 -4
  386. package/src/styles/components/empty-state.css +0 -16
  387. package/src/styles/components/input.css +4 -5
  388. package/src/styles/components/number-input.css +3 -3
  389. package/src/styles/components/plugin-icon.css +38 -0
  390. package/src/styles/components/segmented-control.css +4 -7
  391. package/src/styles/components/settings-button.css +3 -66
  392. package/src/styles/components/settings-modal.css +184 -0
  393. package/src/styles/components/tabs.css +1 -2
  394. package/src/styles/components/textarea.css +4 -5
  395. package/src/styles/components/theme-toggle.css +3 -66
  396. package/src/styles/components/unit-input.css +3 -3
  397. package/src/styles/index.css +0 -1
  398. package/src/templates/adapters.ts +785 -0
  399. package/src/templates/builders.ts +2149 -0
  400. package/src/templates/catalog.ts +245 -0
  401. package/src/templates/componentBindings.ts +615 -0
  402. package/src/templates/controlSchemas.ts +718 -0
  403. package/src/templates/index.ts +314 -0
  404. package/src/templates/lookup.ts +18 -0
  405. package/src/templates/packs.ts +156 -0
  406. package/src/templates/presets.ts +146 -0
  407. package/src/templates/types.ts +668 -0
  408. package/src/types/components.ts +80 -1
  409. package/src/types/form-builder.ts +7 -2
  410. package/src/types/index.ts +17 -0
  411. package/src/types/platform.ts +8 -1
  412. package/src/utils/formModelSync.ts +52 -0
  413. package/src/utils/items.ts +28 -0
  414. package/src/utils/options.ts +23 -0
  415. package/src/utils/pluginIcon.ts +30 -0
  416. package/dist/auth-DsI0rQ7_.js.map +0 -1
  417. package/dist/components-CzbQQPCb.js.map +0 -1
  418. package/dist/composables-BXklV5ii.js.map +0 -1
  419. package/dist/useScheduleDrag-CxBeqYcu.js +0 -7181
  420. package/dist/useScheduleDrag-CxBeqYcu.js.map +0 -1
  421. package/src/styles/components/grouping-modal.css +0 -323
@@ -34,13 +34,18 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
34
34
  version: string;
35
35
  description?: string | undefined;
36
36
  icon?: string | undefined;
37
+ color?: string | undefined;
37
38
  route_prefix: string;
38
39
  api_prefix: string;
39
40
  nav_items?: {
40
- id: string;
41
+ id?: string | undefined;
41
42
  label: string;
42
43
  path: string;
43
44
  icon?: string | undefined;
45
+ description?: string | undefined;
46
+ requiresAuth?: boolean | undefined;
47
+ requiresAdmin?: boolean | undefined;
48
+ requiresFeature?: string | undefined;
44
49
  children?: /*elided*/ any[] | undefined;
45
50
  }[] | undefined;
46
51
  settings?: import('..').PluginSettings | undefined;
@@ -56,7 +61,9 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
56
61
  theme: "light" | "dark" | "system";
57
62
  allowedExperimentTypes?: string[] | null | undefined;
58
63
  features?: {
64
+ admin?: boolean | undefined;
59
65
  experiments?: boolean | undefined;
66
+ samples?: boolean | undefined;
60
67
  passkey?: boolean | undefined;
61
68
  multiUser?: boolean | undefined;
62
69
  } | undefined;
@@ -68,13 +75,18 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
68
75
  version: string;
69
76
  description?: string | undefined;
70
77
  icon?: string | undefined;
78
+ color?: string | undefined;
71
79
  route_prefix: string;
72
80
  api_prefix: string;
73
81
  nav_items?: {
74
- id: string;
82
+ id?: string | undefined;
75
83
  label: string;
76
84
  path: string;
77
85
  icon?: string | undefined;
86
+ description?: string | undefined;
87
+ requiresAuth?: boolean | undefined;
88
+ requiresAdmin?: boolean | undefined;
89
+ requiresFeature?: string | undefined;
78
90
  children?: /*elided*/ any[] | undefined;
79
91
  }[] | undefined;
80
92
  settings?: import('..').PluginSettings | undefined;
@@ -90,7 +102,9 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
90
102
  theme: "light" | "dark" | "system";
91
103
  allowedExperimentTypes?: string[] | null | undefined;
92
104
  features?: {
105
+ admin?: boolean | undefined;
93
106
  experiments?: boolean | undefined;
107
+ samples?: boolean | undefined;
94
108
  passkey?: boolean | undefined;
95
109
  multiUser?: boolean | undefined;
96
110
  } | undefined;
@@ -102,13 +116,18 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
102
116
  version: string;
103
117
  description?: string | undefined;
104
118
  icon?: string | undefined;
119
+ color?: string | undefined;
105
120
  route_prefix: string;
106
121
  api_prefix: string;
107
122
  nav_items?: {
108
- id: string;
123
+ id?: string | undefined;
109
124
  label: string;
110
125
  path: string;
111
126
  icon?: string | undefined;
127
+ description?: string | undefined;
128
+ requiresAuth?: boolean | undefined;
129
+ requiresAdmin?: boolean | undefined;
130
+ requiresFeature?: string | undefined;
112
131
  children?: /*elided*/ any[] | undefined;
113
132
  }[] | undefined;
114
133
  settings?: import('..').PluginSettings | undefined;
@@ -121,7 +140,9 @@ export declare function usePlatformContext(options?: PlatformContextOptions): {
121
140
  } | undefined>;
122
141
  theme: import('vue').ComputedRef<"light" | "dark" | "system">;
123
142
  features: import('vue').ComputedRef<{
143
+ admin?: boolean | undefined;
124
144
  experiments?: boolean | undefined;
145
+ samples?: boolean | undefined;
125
146
  passkey?: boolean | undefined;
126
147
  multiUser?: boolean | undefined;
127
148
  } | undefined>;
@@ -6,24 +6,17 @@ export interface UsePluginApiOptions {
6
6
  fallbackPrefix?: string;
7
7
  }
8
8
  /**
9
- * Pre-configured API client for plugins.
9
+ * Legacy plugin API client resolving the plugin base URL from VITE_API_PREFIX or a fallback prefix.
10
10
  *
11
- * Resolves the base URL in priority order:
12
- * 1. `import.meta.env.VITE_API_PREFIX` (build-time env override)
13
- * 2. `fallbackPrefix` option (plugin's route prefix)
14
- * 3. `'/api'` (default)
11
+ * @deprecated Use `useGeneratedPluginClient()` from `mint sdk generate` for new
12
+ * plugin frontends. This helper remains as a compatibility shim for older
13
+ * plugins that still hand-wire API prefixes.
15
14
  *
16
- * Eliminates the repeated pattern across plugins:
15
+ * Migration shape for generated plugins:
17
16
  * ```ts
18
- * const API_BASE = import.meta.env.VITE_API_PREFIX || '/api/my-plugin'
19
- * const api = useApi({ baseUrl: API_BASE })
20
- * ```
17
+ * import { useGeneratedPluginClient } from '../generated/mint-plugin'
21
18
  *
22
- * @example
23
- * ```ts
24
- * const api = usePluginApi({ fallbackPrefix: '/api/drp' })
25
- * const data = await api.get('/sessions')
19
+ * const pluginClient = useGeneratedPluginClient()
26
20
  * ```
27
21
  */
28
- /** Pre-configured API client resolving the plugin base URL from VITE_API_PREFIX or a fallback prefix. */
29
22
  export declare function usePluginApi(options?: UsePluginApiOptions): import('./useApi').UseApiReturn;
@@ -0,0 +1,109 @@
1
+ import { ComputedRef, Ref } from 'vue';
2
+ export type PluginHttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete';
3
+ export interface PluginEndpointContract {
4
+ name: string;
5
+ method: PluginHttpMethod;
6
+ path: string;
7
+ pathParams?: string[];
8
+ queryParams?: PluginEndpointParamContract[];
9
+ requestType?: string | null;
10
+ responseType?: string | null;
11
+ }
12
+ export interface PluginEndpointParamContract {
13
+ name: string;
14
+ fieldName: string;
15
+ type?: string;
16
+ required?: boolean;
17
+ }
18
+ export interface PluginNavItemContract {
19
+ path: string;
20
+ label: string;
21
+ id?: string;
22
+ icon?: string;
23
+ description?: string;
24
+ requiresAuth?: boolean;
25
+ requiresAdmin?: boolean;
26
+ requiresFeature?: string;
27
+ }
28
+ export interface PluginContract {
29
+ schemaVersion: number;
30
+ plugin: {
31
+ name?: string;
32
+ packageName?: string;
33
+ version?: string;
34
+ description?: string;
35
+ routesPrefix: string;
36
+ apiPrefix: string;
37
+ type: 'analysis' | 'experiment-design' | string;
38
+ analysisType?: string;
39
+ icon?: string;
40
+ color?: string;
41
+ navItems?: PluginNavItemContract[];
42
+ capabilities?: Record<string, unknown>;
43
+ };
44
+ endpoints: PluginEndpointContract[];
45
+ hash: string;
46
+ }
47
+ export interface PluginEndpointDefinition {
48
+ method: PluginHttpMethod;
49
+ path: string;
50
+ pathParams?: string[];
51
+ queryParams?: PluginEndpointParamDefinition[];
52
+ hasBody?: boolean;
53
+ }
54
+ export type PluginEndpointParamDefinition = string | {
55
+ name: string;
56
+ fieldName?: string;
57
+ type?: string;
58
+ required?: boolean;
59
+ };
60
+ export interface CreatePluginClientOptions {
61
+ endpoints: Record<string, PluginEndpointDefinition>;
62
+ baseUrl?: string;
63
+ }
64
+ export interface BuildPluginEndpointUrlOptions {
65
+ /** Override the generated or platform-injected API base URL. */
66
+ baseUrl?: string;
67
+ /** Return only the endpoint path and query string instead of base URL + path. */
68
+ includeBaseUrl?: boolean;
69
+ }
70
+ export interface UseCurrentExperimentOptions {
71
+ apiBaseUrl?: string;
72
+ immediate?: boolean;
73
+ }
74
+ export interface UseCurrentExperimentReturn<TExperiment = unknown> {
75
+ /** Current experiment id resolved from platform injection or URL conventions. */
76
+ experimentId: ComputedRef<number | undefined>;
77
+ /** Whether a current experiment id is available. */
78
+ hasExperiment: ComputedRef<boolean>;
79
+ /** Current experiment payload, if injected or successfully fetched. */
80
+ experiment: Ref<TExperiment | undefined>;
81
+ /** Whether the current experiment is currently loading. */
82
+ isLoading: Ref<boolean>;
83
+ /** Error message from the last failed current-experiment fetch, or null. */
84
+ error: Ref<string | null>;
85
+ /** Timestamp of the last successful current-experiment fetch, or null. */
86
+ lastLoadedAt: Ref<Date | null>;
87
+ /** Return the current experiment id or throw a clear SDK error when absent. */
88
+ requireExperimentId: () => number;
89
+ /** Fetch a specific experiment id, defaulting to the current experiment id. */
90
+ fetch: (experimentId?: number) => Promise<TExperiment | undefined>;
91
+ /** Refetch the currently resolved experiment id. */
92
+ refresh: () => Promise<TExperiment | undefined>;
93
+ }
94
+ export type PluginEndpointCaller = (payload?: unknown) => Promise<unknown>;
95
+ export type GeneratedPluginClient = Record<string, (...args: any[]) => Promise<any>>;
96
+ /** Resolve the runtime plugin API base URL from env, explicit options, platform injection, or contract metadata. */
97
+ export declare function resolvePluginBaseUrl(contract: PluginContract, explicitBaseUrl?: string): string;
98
+ /** Build the concrete URL for a generated plugin endpoint without making a request. */
99
+ export declare function buildPluginEndpointUrl(contract: PluginContract, endpoint: PluginEndpointDefinition, payload?: unknown, options?: BuildPluginEndpointUrlOptions): string;
100
+ /** Create a typed plugin API client from a generated MINT plugin contract. */
101
+ export declare function createPluginClient<TClient extends object = GeneratedPluginClient>(contract: PluginContract, options: CreatePluginClientOptions): TClient;
102
+ /** Return a generated plugin client from setup code with a stable typed identity. */
103
+ export declare function usePluginClient<TClient>(client: TClient): TClient;
104
+ /** Read plugin settings exposed through the platform context. */
105
+ export declare function usePluginSettings<TSettings = Record<string, unknown>>(): {
106
+ settings: ComputedRef<TSettings | undefined>;
107
+ };
108
+ /** Read and optionally load the current platform experiment for integrated plugin views. */
109
+ export declare function useCurrentExperiment<TExperiment = unknown>(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
  };