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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. package/README.md +218 -6
  2. package/dist/__tests__/components/ActionItem.test.d.ts +1 -0
  3. package/dist/__tests__/components/AppAvatarMenu.test.d.ts +1 -0
  4. package/dist/__tests__/components/AppPageSelector.test.d.ts +1 -0
  5. package/dist/__tests__/components/AppPillNav.test.d.ts +1 -0
  6. package/dist/__tests__/components/AppPluginSwitcher.test.d.ts +1 -0
  7. package/dist/__tests__/components/AppToastContainer.test.d.ts +1 -0
  8. package/dist/__tests__/components/BaseRadioGroup.test.d.ts +1 -0
  9. package/dist/__tests__/components/BaseSelect.test.d.ts +1 -0
  10. package/dist/__tests__/components/BaseTabs.test.d.ts +1 -0
  11. package/dist/__tests__/components/BatchProgressList.test.d.ts +1 -0
  12. package/dist/__tests__/components/BioTemplateExperimentWorkspaceView.test.d.ts +1 -0
  13. package/dist/__tests__/components/BioTemplatePackWorkspaceView.test.d.ts +1 -0
  14. package/dist/__tests__/components/BioTemplatePresetWorkspaceView.test.d.ts +1 -0
  15. package/dist/__tests__/components/BioTemplateRenderer.test.d.ts +1 -0
  16. package/dist/__tests__/components/Breadcrumb.test.d.ts +1 -0
  17. package/dist/__tests__/components/CalendarGridPanel.test.d.ts +1 -0
  18. package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
  19. package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
  20. package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
  21. package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
  22. package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
  23. package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
  24. package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
  25. package/dist/__tests__/components/FormCompatibility.test.d.ts +1 -0
  26. package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
  27. package/dist/__tests__/components/GroupingModal.test.d.ts +1 -0
  28. package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
  29. package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
  30. package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
  31. package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
  32. package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
  33. package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
  34. package/dist/__tests__/components/SettingsButton.test.d.ts +1 -0
  35. package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
  36. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  37. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  38. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  39. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  40. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  41. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  42. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  43. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  44. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  45. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  46. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  47. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  48. package/dist/__tests__/composables/useExperimentData.test.d.ts +1 -0
  49. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  50. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  51. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  52. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  53. package/dist/__tests__/composables/usePluginConfig.test.d.ts +1 -0
  54. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  55. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  56. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  57. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  58. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  59. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  60. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  61. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  62. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  63. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  64. package/dist/{auth-DsI0rQ7_.js → auth-QQj2kkze.js} +12 -5
  65. package/dist/auth-QQj2kkze.js.map +1 -0
  66. package/dist/components/ActionItem.vue.d.ts +32 -0
  67. package/dist/components/AppAvatarMenu.vue.d.ts +2 -7
  68. package/dist/components/AppPageSelector.vue.d.ts +3 -6
  69. package/dist/components/AppPillNav.vue.d.ts +2 -2
  70. package/dist/components/AppSidebar.vue.d.ts +56 -3
  71. package/dist/components/AppToastContainer.vue.d.ts +2 -0
  72. package/dist/components/AppTopBar.vue.d.ts +41 -10
  73. package/dist/components/BaseButton.vue.d.ts +1 -1
  74. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  75. package/dist/components/BaseInput.vue.d.ts +2 -2
  76. package/dist/components/BasePill.vue.d.ts +2 -2
  77. package/dist/components/BaseRadioGroup.vue.d.ts +3 -3
  78. package/dist/components/BaseSelect.vue.d.ts +3 -3
  79. package/dist/components/BaseTabs.vue.d.ts +2 -2
  80. package/dist/components/BaseTextarea.vue.d.ts +1 -1
  81. package/dist/components/BaseToggle.vue.d.ts +1 -1
  82. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +117 -0
  83. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +92 -0
  84. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +82 -0
  85. package/dist/components/BioTemplateRenderer.vue.d.ts +29 -0
  86. package/dist/components/Breadcrumb.vue.d.ts +2 -2
  87. package/dist/components/Calendar.vue.d.ts +1 -1
  88. package/dist/components/CalendarGridPanel.vue.d.ts +25 -0
  89. package/dist/components/CollapsibleCard.vue.d.ts +1 -1
  90. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  91. package/dist/components/ConfirmDialog.vue.d.ts +2 -2
  92. package/dist/components/ControlWorkspaceView.vue.d.ts +130 -0
  93. package/dist/components/DatePicker.vue.d.ts +1 -1
  94. package/dist/components/DateTimePicker.vue.d.ts +3 -3
  95. package/dist/components/Divider.vue.d.ts +1 -1
  96. package/dist/components/DropdownButton.vue.d.ts +3 -3
  97. package/dist/components/EmptyState.vue.d.ts +1 -2
  98. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  99. package/dist/components/ExperimentTimeline.vue.d.ts +2 -2
  100. package/dist/components/FileUploader.vue.d.ts +1 -1
  101. package/dist/components/FitPanel.vue.d.ts +1 -1
  102. package/dist/components/FormActions.vue.d.ts +4 -4
  103. package/dist/components/FormBuilder.vue.d.ts +22 -8
  104. package/dist/components/FormFieldRenderer.vue.d.ts +7 -10
  105. package/dist/components/FormSection.vue.d.ts +11 -24
  106. package/dist/components/FormulaInput.vue.d.ts +2 -2
  107. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  108. package/dist/components/MultiSelect.vue.d.ts +3 -3
  109. package/dist/components/NumberInput.vue.d.ts +1 -1
  110. package/dist/components/ProgressBar.vue.d.ts +1 -1
  111. package/dist/components/ProtocolStepEditor.vue.d.ts +3 -1
  112. package/dist/components/RackEditor.vue.d.ts +2 -2
  113. package/dist/components/SampleLegend.vue.d.ts +2 -2
  114. package/dist/components/ScheduleCalendar.vue.d.ts +2 -2
  115. package/dist/components/SegmentedControl.vue.d.ts +2 -2
  116. package/dist/components/SequenceInput.vue.d.ts +3 -3
  117. package/dist/components/SettingsButton.vue.d.ts +2 -2
  118. package/dist/components/SettingsModal.vue.d.ts +13 -5
  119. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  120. package/dist/components/TagsInput.vue.d.ts +3 -2
  121. package/dist/components/TimePicker.vue.d.ts +3 -3
  122. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  123. package/dist/components/UnitInput.vue.d.ts +2 -2
  124. package/dist/components/WellPlate.vue.d.ts +8 -8
  125. package/dist/components/index.d.ts +11 -1
  126. package/dist/components/index.js +3 -3
  127. package/dist/components/internal/FormFieldRendererInternal.vue.d.ts +31 -0
  128. package/dist/components/internal/FormSectionRenderer.vue.d.ts +43 -0
  129. package/dist/{components-_XqPEhP9.js → components-D_Sr0adg.js} +7290 -6518
  130. package/dist/components-D_Sr0adg.js.map +1 -0
  131. package/dist/composables/index.d.ts +21 -2
  132. package/dist/composables/index.js +4 -3
  133. package/dist/composables/platformContextHelpers.d.ts +14 -0
  134. package/dist/composables/useBioTemplateComponents.d.ts +20 -0
  135. package/dist/composables/useBioTemplateControls.d.ts +6 -0
  136. package/dist/composables/useBioTemplatePackWorkspace.d.ts +45 -0
  137. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +74 -0
  138. package/dist/composables/useBioTemplateWorkspace.d.ts +50 -0
  139. package/dist/composables/useCalendarGrid.d.ts +26 -0
  140. package/dist/composables/useControlSchema.d.ts +321 -0
  141. package/dist/composables/useDebouncedWatch.d.ts +20 -0
  142. package/dist/composables/useDropdownState.d.ts +19 -0
  143. package/dist/composables/useEventListener.d.ts +13 -0
  144. package/dist/composables/useExpansionSet.d.ts +21 -0
  145. package/dist/composables/useExperimentData.d.ts +10 -0
  146. package/dist/composables/useExperimentSave.d.ts +31 -2
  147. package/dist/composables/useExperimentSelector.d.ts +20 -0
  148. package/dist/composables/useForm.d.ts +2 -0
  149. package/dist/composables/useGroupAssignment.d.ts +31 -0
  150. package/dist/composables/useListSelection.d.ts +35 -0
  151. package/dist/composables/usePlatformContext.d.ts +21 -3
  152. package/dist/composables/usePluginApi.d.ts +7 -14
  153. package/dist/composables/usePluginClient.d.ts +109 -0
  154. package/dist/composables/usePluginConfig.d.ts +12 -0
  155. package/dist/composables/useRequestSyncState.d.ts +34 -0
  156. package/dist/composables/useSampleGroups.d.ts +32 -0
  157. package/dist/composables/useSelectionLimit.d.ts +17 -0
  158. package/dist/composables/useSortedItems.d.ts +32 -0
  159. package/dist/composables/useTemplateCollection.d.ts +58 -0
  160. package/dist/composables/useTextSearch.d.ts +18 -0
  161. package/dist/composables/useTimeUtils.d.ts +8 -0
  162. package/dist/{composables-tiZqLu1M.js → composables-C3dpXQN5.js} +228 -146
  163. package/dist/composables-C3dpXQN5.js.map +1 -0
  164. package/dist/index.d.ts +12 -3
  165. package/dist/index.js +6 -5
  166. package/dist/install.d.ts +7 -2
  167. package/dist/install.js +2 -2
  168. package/dist/install.js.map +1 -1
  169. package/dist/stores/index.js +1 -1
  170. package/dist/stores/settings.d.ts +4 -1
  171. package/dist/styles.css +5235 -5977
  172. package/dist/templates/adapters.d.ts +43 -0
  173. package/dist/templates/builders.d.ts +63 -0
  174. package/dist/templates/catalog.d.ts +188 -0
  175. package/dist/templates/componentBindings.d.ts +58 -0
  176. package/dist/templates/controlSchemas.d.ts +25 -0
  177. package/dist/templates/index.d.ts +15 -0
  178. package/dist/templates/index.js +2 -0
  179. package/dist/templates/lookup.d.ts +4 -0
  180. package/dist/templates/packs.d.ts +18 -0
  181. package/dist/templates/presets.d.ts +90 -0
  182. package/dist/templates/types.d.ts +531 -0
  183. package/dist/templates-50NPjaxL.js +9333 -0
  184. package/dist/templates-50NPjaxL.js.map +1 -0
  185. package/dist/types/components.d.ts +26 -4
  186. package/dist/types/form-builder.d.ts +6 -8
  187. package/dist/types/index.d.ts +2 -2
  188. package/dist/types/platform.d.ts +7 -1
  189. package/dist/useScheduleDrag-D4oWdh41.js +4371 -0
  190. package/dist/useScheduleDrag-D4oWdh41.js.map +1 -0
  191. package/dist/utils/formModelSync.d.ts +5 -0
  192. package/dist/utils/items.d.ts +8 -0
  193. package/dist/utils/options.d.ts +6 -0
  194. package/dist/utils/pluginIcon.d.ts +9 -0
  195. package/package.json +7 -2
  196. package/src/__tests__/components/ActionItem.test.ts +99 -0
  197. package/src/__tests__/components/AppAvatarMenu.test.ts +27 -0
  198. package/src/__tests__/components/AppPageSelector.test.ts +134 -0
  199. package/src/__tests__/components/AppPillNav.test.ts +78 -0
  200. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  201. package/src/__tests__/components/AppSidebar.test.ts +370 -0
  202. package/src/__tests__/components/AppToastContainer.test.ts +48 -0
  203. package/src/__tests__/components/AppTopBar.test.ts +383 -0
  204. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  205. package/src/__tests__/components/BaseSelect.test.ts +21 -0
  206. package/src/__tests__/components/BaseTabs.test.ts +25 -0
  207. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  208. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +153 -0
  209. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +161 -0
  210. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +281 -0
  211. package/src/__tests__/components/BioTemplateRenderer.test.ts +71 -0
  212. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  213. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  214. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  215. package/src/__tests__/components/ControlWorkspaceView.test.ts +1031 -0
  216. package/src/__tests__/components/DataFrame.test.ts +11 -0
  217. package/src/__tests__/components/DatePicker.test.ts +45 -0
  218. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  219. package/src/__tests__/components/DropdownButton.test.ts +23 -0
  220. package/src/__tests__/components/EmptyState.test.ts +23 -0
  221. package/src/__tests__/components/ExperimentPopover.test.ts +56 -0
  222. package/src/__tests__/components/FormBuilder.test.ts +296 -0
  223. package/src/__tests__/components/FormCompatibility.test.ts +94 -0
  224. package/src/__tests__/components/GroupAssigner.test.ts +30 -0
  225. package/src/__tests__/components/GroupingModal.test.ts +73 -0
  226. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  227. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  228. package/src/__tests__/components/ReagentList.test.ts +82 -0
  229. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  230. package/src/__tests__/components/SampleSelector.test.ts +60 -0
  231. package/src/__tests__/components/SegmentedControl.test.ts +24 -0
  232. package/src/__tests__/components/SettingsButton.test.ts +44 -0
  233. package/src/__tests__/components/SettingsModal.test.ts +296 -0
  234. package/src/__tests__/components/TagsInput.test.ts +75 -0
  235. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  236. package/src/__tests__/components/TimePicker.test.ts +38 -0
  237. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +122 -0
  238. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  239. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +99 -0
  240. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  241. package/src/__tests__/composables/useControlSchema.test.ts +919 -0
  242. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  243. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  244. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  245. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  246. package/src/__tests__/composables/useExperimentData.test.ts +4 -0
  247. package/src/__tests__/composables/useExperimentSave.test.ts +203 -8
  248. package/src/__tests__/composables/useExperimentSelector.test.ts +164 -0
  249. package/src/__tests__/composables/useForm.test.ts +58 -0
  250. package/src/__tests__/composables/useFormBuilder.test.ts +77 -0
  251. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  252. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  253. package/src/__tests__/composables/usePluginClient.test.ts +444 -0
  254. package/src/__tests__/composables/usePluginConfig.test.ts +5 -0
  255. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  256. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  257. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  258. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  259. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  260. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  261. package/src/__tests__/composables/useTheme.test.ts +91 -0
  262. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  263. package/src/__tests__/docs/frontendDocsCatalog.test.ts +229 -0
  264. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  265. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  266. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  267. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  268. package/src/__tests__/templates/templates.test.ts +1043 -0
  269. package/src/components/ActionItem.vue +82 -0
  270. package/src/components/AppAvatarMenu.vue +15 -69
  271. package/src/components/AppLayout.story.vue +25 -25
  272. package/src/components/AppPageSelector.vue +63 -94
  273. package/src/components/AppPillNav.vue +44 -39
  274. package/src/components/AppPluginSwitcher.vue +41 -145
  275. package/src/components/AppSidebar.story.vue +94 -0
  276. package/src/components/AppSidebar.vue +187 -12
  277. package/src/components/{ToastNotification.story.vue → AppToastContainer.story.vue} +6 -6
  278. package/src/components/AppToastContainer.vue +62 -0
  279. package/src/components/AppTopBar.story.vue +7 -30
  280. package/src/components/AppTopBar.vue +251 -57
  281. package/src/components/BaseModal.vue +3 -5
  282. package/src/components/BaseRadioGroup.vue +7 -3
  283. package/src/components/BaseSelect.vue +11 -7
  284. package/src/components/BaseTabs.vue +6 -4
  285. package/src/components/BatchProgressList.vue +5 -8
  286. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  287. package/src/components/BioTemplateExperimentWorkspaceView.vue +337 -0
  288. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  289. package/src/components/BioTemplatePackWorkspaceView.vue +176 -0
  290. package/src/components/BioTemplatePresetWorkspaceView.story.vue +151 -0
  291. package/src/components/BioTemplatePresetWorkspaceView.vue +392 -0
  292. package/src/components/BioTemplateRenderer.story.vue +57 -0
  293. package/src/components/BioTemplateRenderer.vue +269 -0
  294. package/src/components/Breadcrumb.vue +14 -8
  295. package/src/components/CalendarGridPanel.vue +120 -0
  296. package/src/components/ConcentrationInput.vue +27 -64
  297. package/src/components/ControlWorkspaceView.story.vue +336 -0
  298. package/src/components/ControlWorkspaceView.vue +347 -0
  299. package/src/components/DataFrame.vue +34 -50
  300. package/src/components/DatePicker.vue +59 -192
  301. package/src/components/DateTimePicker.vue +50 -171
  302. package/src/components/DropdownButton.vue +14 -32
  303. package/src/components/EmptyState.vue +4 -2
  304. package/src/components/ExperimentPopover.vue +5 -22
  305. package/src/components/FormBuilder.vue +124 -27
  306. package/src/components/FormFieldRenderer.vue +15 -38
  307. package/src/components/FormSection.vue +20 -73
  308. package/src/components/GroupAssigner.vue +24 -56
  309. package/src/components/GroupingModal.story.vue +3 -3
  310. package/src/components/GroupingModal.vue +30 -391
  311. package/src/components/MultiSelect.vue +17 -12
  312. package/src/components/PlateMapEditor.vue +3 -8
  313. package/src/components/PluginIcon.vue +2 -22
  314. package/src/components/ProtocolStepEditor.vue +13 -22
  315. package/src/components/ReagentList.vue +25 -33
  316. package/src/components/SampleHierarchyTree.vue +12 -23
  317. package/src/components/SampleSelector.vue +42 -122
  318. package/src/components/SegmentedControl.vue +7 -3
  319. package/src/components/SettingsButton.story.vue +1 -1
  320. package/src/components/SettingsButton.vue +15 -27
  321. package/src/components/SettingsModal.story.vue +1 -1
  322. package/src/components/SettingsModal.vue +120 -29
  323. package/src/components/TagsInput.vue +29 -14
  324. package/src/components/ThemeToggle.vue +9 -7
  325. package/src/components/TimePicker.vue +19 -41
  326. package/src/components/ToastNotification.vue +4 -57
  327. package/src/components/Tooltip.vue +7 -12
  328. package/src/components/WellEditPopup.vue +3 -8
  329. package/src/components/WellPlate.vue +4 -10
  330. package/src/components/index.ts +11 -1
  331. package/src/components/internal/FormFieldRendererInternal.vue +50 -0
  332. package/src/components/internal/FormSectionRenderer.vue +78 -0
  333. package/src/composables/index.ts +212 -0
  334. package/src/composables/platformContextHelpers.ts +74 -0
  335. package/src/composables/useBioTemplateComponents.ts +93 -0
  336. package/src/composables/useBioTemplateControls.ts +41 -0
  337. package/src/composables/useBioTemplatePackWorkspace.ts +181 -0
  338. package/src/composables/useBioTemplatePresetWorkspace.ts +337 -0
  339. package/src/composables/useBioTemplateWorkspace.ts +139 -0
  340. package/src/composables/useCalendarGrid.ts +140 -0
  341. package/src/composables/useControlSchema.ts +1274 -0
  342. package/src/composables/useDebouncedWatch.ts +119 -0
  343. package/src/composables/useDropdownState.ts +83 -0
  344. package/src/composables/useEventListener.ts +111 -0
  345. package/src/composables/useExpansionSet.ts +117 -0
  346. package/src/composables/useExperimentData.ts +20 -11
  347. package/src/composables/useExperimentSave.ts +202 -50
  348. package/src/composables/useExperimentSelector.ts +86 -72
  349. package/src/composables/useForm.ts +49 -4
  350. package/src/composables/useFormBuilder.ts +93 -42
  351. package/src/composables/useGroupAssignment.ts +148 -0
  352. package/src/composables/useListSelection.ts +158 -0
  353. package/src/composables/usePluginApi.ts +7 -14
  354. package/src/composables/usePluginClient.ts +425 -0
  355. package/src/composables/usePluginConfig.ts +34 -13
  356. package/src/composables/useRequestSyncState.ts +126 -0
  357. package/src/composables/useSampleGroups.ts +126 -0
  358. package/src/composables/useSelectionLimit.ts +57 -0
  359. package/src/composables/useSortedItems.ts +118 -0
  360. package/src/composables/useTemplateCollection.ts +229 -0
  361. package/src/composables/useTextSearch.ts +60 -0
  362. package/src/composables/useTheme.ts +2 -28
  363. package/src/composables/useTimeUtils.ts +26 -2
  364. package/src/composables/useWellPlateEditor.ts +13 -9
  365. package/src/index.ts +224 -4
  366. package/src/install.ts +11 -4
  367. package/src/stores/settings.ts +13 -9
  368. package/src/styles/components/app-page-selector.css +23 -0
  369. package/src/styles/components/app-pill-nav.css +7 -0
  370. package/src/styles/components/app-top-bar.css +34 -0
  371. package/src/styles/components/concentration-input.css +3 -142
  372. package/src/styles/components/empty-state.css +0 -16
  373. package/src/styles/components/settings-button.css +3 -66
  374. package/src/styles/components/theme-toggle.css +3 -66
  375. package/src/styles/index.css +0 -1
  376. package/src/templates/adapters.ts +785 -0
  377. package/src/templates/builders.ts +2149 -0
  378. package/src/templates/catalog.ts +245 -0
  379. package/src/templates/componentBindings.ts +615 -0
  380. package/src/templates/controlSchemas.ts +718 -0
  381. package/src/templates/index.ts +314 -0
  382. package/src/templates/lookup.ts +18 -0
  383. package/src/templates/packs.ts +156 -0
  384. package/src/templates/presets.ts +146 -0
  385. package/src/templates/types.ts +668 -0
  386. package/src/types/components.ts +41 -4
  387. package/src/types/form-builder.ts +7 -2
  388. package/src/types/index.ts +14 -0
  389. package/src/types/platform.ts +7 -1
  390. package/src/utils/formModelSync.ts +52 -0
  391. package/src/utils/items.ts +28 -0
  392. package/src/utils/options.ts +23 -0
  393. package/src/utils/pluginIcon.ts +30 -0
  394. package/dist/auth-DsI0rQ7_.js.map +0 -1
  395. package/dist/components-_XqPEhP9.js.map +0 -1
  396. package/dist/composables-tiZqLu1M.js.map +0 -1
  397. package/dist/useScheduleDrag-CA9sGNJG.js +0 -7181
  398. package/dist/useScheduleDrag-CA9sGNJG.js.map +0 -1
  399. package/src/styles/components/grouping-modal.css +0 -323
@@ -1,7 +1,10 @@
1
1
  <script setup lang="ts">
2
2
  /** Combined date and time picker with a dropdown calendar, time slots, and 12/24 h format support. */
3
- import { ref, computed, watch, onMounted, onUnmounted, nextTick } from 'vue'
4
- import { generateTimeSlots, formatTime, parseTime } from '../composables/useTimeUtils'
3
+ import { computed, watch, nextTick } from 'vue'
4
+ import { useCalendarGrid, type CalendarGridDay } from '../composables/useCalendarGrid'
5
+ import { useDropdownState } from '../composables/useDropdownState'
6
+ import { formatTime, formatTimeSlot, generateTimeSlots, toMinutes } from '../composables/useTimeUtils'
7
+ import CalendarGridPanel from './CalendarGridPanel.vue'
5
8
 
6
9
  interface Props {
7
10
  modelValue?: string
@@ -32,8 +35,20 @@ const emit = defineEmits<{
32
35
  'update:modelValue': [value: string | undefined]
33
36
  }>()
34
37
 
35
- const isOpen = ref(false)
36
- const containerRef = ref<HTMLDivElement>()
38
+ const { isOpen, rootRef, close, toggle } = useDropdownState()
39
+ const {
40
+ weekDays,
41
+ monthYear,
42
+ calendarDays,
43
+ formatDateValue,
44
+ setCurrentMonthFromDate,
45
+ prevMonth,
46
+ nextMonth,
47
+ } = useCalendarGrid({
48
+ min: () => props.min,
49
+ max: () => props.max,
50
+ locale: () => props.locale,
51
+ })
37
52
 
38
53
  // Parse model value into date and time parts
39
54
  const selectedDate = computed(() => {
@@ -44,10 +59,7 @@ const selectedDate = computed(() => {
44
59
 
45
60
  const selectedDateStr = computed(() => {
46
61
  if (!selectedDate.value) return null
47
- const y = selectedDate.value.getFullYear()
48
- const m = String(selectedDate.value.getMonth() + 1).padStart(2, '0')
49
- const d = String(selectedDate.value.getDate()).padStart(2, '0')
50
- return `${y}-${m}-${d}`
62
+ return formatDateValue(selectedDate.value)
51
63
  })
52
64
 
53
65
  const selectedTimeStr = computed(() => {
@@ -70,196 +82,89 @@ const displayValue = computed(() => {
70
82
  return `${dateStr} ${timeStr}`
71
83
  })
72
84
 
73
- // Calendar state
74
- const currentMonth = ref(new Date())
75
- const weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
76
-
77
- const calendarDays = computed(() => {
78
- const year = currentMonth.value.getFullYear()
79
- const month = currentMonth.value.getMonth()
80
- const firstDay = new Date(year, month, 1)
81
- const lastDay = new Date(year, month + 1, 0)
82
-
83
- const days: { date: Date; isCurrentMonth: boolean; isDisabled: boolean }[] = []
84
-
85
- const startPadding = firstDay.getDay()
86
- for (let i = startPadding - 1; i >= 0; i--) {
87
- const date = new Date(year, month, -i)
88
- days.push({ date, isCurrentMonth: false, isDisabled: isDateDisabled(date) })
89
- }
90
-
91
- for (let i = 1; i <= lastDay.getDate(); i++) {
92
- const date = new Date(year, month, i)
93
- days.push({ date, isCurrentMonth: true, isDisabled: isDateDisabled(date) })
94
- }
95
-
96
- const endPadding = 42 - days.length
97
- for (let i = 1; i <= endPadding; i++) {
98
- const date = new Date(year, month + 1, i)
99
- days.push({ date, isCurrentMonth: false, isDisabled: isDateDisabled(date) })
100
- }
101
-
102
- return days
103
- })
104
-
105
85
  // Time slots
106
86
  const timeSlots = computed(() => {
107
87
  return generateTimeSlots('00:00', '23:59', props.timeStep)
108
88
  })
109
89
 
110
- const monthYear = computed(() => {
111
- return currentMonth.value.toLocaleDateString(props.locale, {
112
- year: 'numeric',
113
- month: 'long',
114
- })
115
- })
116
-
117
- function isDateDisabled(date: Date): boolean {
118
- if (props.min) {
119
- const minDate = new Date(props.min)
120
- minDate.setHours(0, 0, 0, 0)
121
- const check = new Date(date)
122
- check.setHours(0, 0, 0, 0)
123
- if (check < minDate) return true
124
- }
125
- if (props.max) {
126
- const maxDate = new Date(props.max)
127
- maxDate.setHours(23, 59, 59, 999)
128
- const check = new Date(date)
129
- check.setHours(23, 59, 59, 999)
130
- if (check > maxDate) return true
131
- }
132
- return false
133
- }
134
-
135
90
  function isTimeDisabled(time: string): boolean {
136
91
  if (!selectedDateStr.value) return false
137
- const { hour, minute } = parseTime(time)
92
+ const timeMinutes = toMinutes(time)
138
93
 
139
94
  if (props.min) {
140
95
  const minDate = new Date(props.min)
141
- if (selectedDateStr.value === formatDateStr(minDate)) {
96
+ if (selectedDateStr.value === formatDateValue(minDate)) {
142
97
  const minMin = minDate.getHours() * 60 + minDate.getMinutes()
143
- if (hour * 60 + minute < minMin) return true
98
+ if (timeMinutes < minMin) return true
144
99
  }
145
100
  }
146
101
  if (props.max) {
147
102
  const maxDate = new Date(props.max)
148
- if (selectedDateStr.value === formatDateStr(maxDate)) {
103
+ if (selectedDateStr.value === formatDateValue(maxDate)) {
149
104
  const maxMin = maxDate.getHours() * 60 + maxDate.getMinutes()
150
- if (hour * 60 + minute > maxMin) return true
105
+ if (timeMinutes > maxMin) return true
151
106
  }
152
107
  }
153
108
  return false
154
109
  }
155
110
 
156
- function formatDateStr(d: Date): string {
157
- const y = d.getFullYear()
158
- const m = String(d.getMonth() + 1).padStart(2, '0')
159
- const day = String(d.getDate()).padStart(2, '0')
160
- return `${y}-${m}-${day}`
161
- }
162
-
163
- function isSameDay(a: Date, b: Date | null): boolean {
164
- if (!b) return false
165
- return a.toDateString() === b.toDateString()
166
- }
167
-
168
- function isToday(date: Date): boolean {
169
- return date.toDateString() === new Date().toDateString()
170
- }
171
-
172
- function selectDate(day: { date: Date; isDisabled: boolean }) {
111
+ function selectDate(day: CalendarGridDay) {
173
112
  if (day.isDisabled || props.disabled) return
174
- const dateStr = formatDateStr(day.date)
113
+ const dateStr = formatDateValue(day.date)
175
114
  const timeStr = selectedTimeStr.value || '09:00'
176
115
  emit('update:modelValue', `${dateStr}T${timeStr}`)
177
116
  }
178
117
 
179
118
  function selectTime(time: string) {
180
119
  if (isTimeDisabled(time)) return
181
- const dateStr = selectedDateStr.value || formatDateStr(new Date())
120
+ const dateStr = selectedDateStr.value || formatDateValue(new Date())
182
121
  emit('update:modelValue', `${dateStr}T${time}`)
183
122
  }
184
123
 
185
- function prevMonth() {
186
- currentMonth.value = new Date(
187
- currentMonth.value.getFullYear(),
188
- currentMonth.value.getMonth() - 1,
189
- 1,
190
- )
191
- }
192
-
193
- function nextMonth() {
194
- currentMonth.value = new Date(
195
- currentMonth.value.getFullYear(),
196
- currentMonth.value.getMonth() + 1,
197
- 1,
198
- )
199
- }
200
-
201
124
  function goToNow() {
202
125
  const now = new Date()
203
- currentMonth.value = new Date(now.getFullYear(), now.getMonth(), 1)
204
- const dateStr = formatDateStr(now)
126
+ setCurrentMonthFromDate(now)
127
+ const dateStr = formatDateValue(now)
205
128
  const timeStr = formatTime(now.getHours(), now.getMinutes())
206
129
  emit('update:modelValue', `${dateStr}T${timeStr}`)
207
- isOpen.value = false
130
+ close()
208
131
  }
209
132
 
210
133
  function goToToday() {
211
134
  const today = new Date()
212
- currentMonth.value = new Date(today.getFullYear(), today.getMonth(), 1)
213
- const dateStr = formatDateStr(today)
135
+ setCurrentMonthFromDate(today)
136
+ const dateStr = formatDateValue(today)
214
137
  const timeStr = selectedTimeStr.value || '09:00'
215
138
  emit('update:modelValue', `${dateStr}T${timeStr}`)
216
139
  }
217
140
 
218
141
  function clear() {
219
142
  emit('update:modelValue', undefined)
220
- isOpen.value = false
143
+ close()
221
144
  }
222
145
 
223
146
  function toggleDropdown() {
224
147
  if (props.disabled) return
225
- isOpen.value = !isOpen.value
226
- }
227
-
228
- function handleClickOutside(event: MouseEvent) {
229
- if (containerRef.value && !containerRef.value.contains(event.target as Node)) {
230
- isOpen.value = false
231
- }
148
+ toggle()
232
149
  }
233
150
 
234
151
  watch(isOpen, (open) => {
235
152
  if (open && selectedDate.value) {
236
- currentMonth.value = new Date(
237
- selectedDate.value.getFullYear(),
238
- selectedDate.value.getMonth(),
239
- 1,
240
- )
153
+ setCurrentMonthFromDate(selectedDate.value)
241
154
  nextTick(() => {
242
155
  // Scroll time grid to selected time
243
- const grid = containerRef.value?.querySelector('.mint-datetime-picker__time-grid')
244
- const active = containerRef.value?.querySelector('.mint-datetime-picker__time-chip--active')
156
+ const grid = rootRef.value?.querySelector('.mint-datetime-picker__time-grid')
157
+ const active = rootRef.value?.querySelector('.mint-datetime-picker__time-chip--active')
245
158
  if (grid && active) {
246
159
  active.scrollIntoView({ block: 'center' })
247
160
  }
248
161
  })
249
162
  }
250
163
  })
251
-
252
- onMounted(() => {
253
- document.addEventListener('click', handleClickOutside)
254
- })
255
-
256
- onUnmounted(() => {
257
- document.removeEventListener('click', handleClickOutside)
258
- })
259
164
  </script>
260
165
 
261
166
  <template>
262
- <div ref="containerRef" class="mint-datetime-picker">
167
+ <div ref="rootRef" class="mint-datetime-picker">
263
168
  <div class="mint-datetime-picker__input-wrapper">
264
169
  <div class="mint-datetime-picker__icon-calendar">
265
170
  <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -305,42 +210,16 @@ onUnmounted(() => {
305
210
  >
306
211
  <!-- Calendar section -->
307
212
  <div class="mint-datetime-picker__calendar-section">
308
- <div class="mint-date-picker__header">
309
- <button type="button" class="mint-date-picker__nav-btn" aria-label="Previous month" @click="prevMonth">
310
- <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
311
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
312
- </svg>
313
- </button>
314
- <span class="mint-date-picker__month-year">{{ monthYear }}</span>
315
- <button type="button" class="mint-date-picker__nav-btn" aria-label="Next month" @click="nextMonth">
316
- <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
317
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
318
- </svg>
319
- </button>
320
- </div>
321
-
322
- <div class="mint-date-picker__weekdays">
323
- <div v-for="day in weekDays" :key="day" class="mint-date-picker__weekday">{{ day }}</div>
324
- </div>
325
-
326
- <div class="mint-date-picker__grid">
327
- <button
328
- v-for="(day, index) in calendarDays"
329
- :key="index"
330
- type="button"
331
- :disabled="day.isDisabled"
332
- :class="[
333
- 'mint-date-picker__day',
334
- !day.isCurrentMonth ? 'mint-date-picker__day--other-month' : '',
335
- day.isDisabled ? 'mint-date-picker__day--disabled' : '',
336
- isSameDay(day.date, selectedDate) ? 'mint-date-picker__day--selected' : '',
337
- isToday(day.date) && !isSameDay(day.date, selectedDate) ? 'mint-date-picker__day--today' : '',
338
- ]"
339
- @click="selectDate(day)"
340
- >
341
- {{ day.date.getDate() }}
342
- </button>
343
- </div>
213
+ <CalendarGridPanel
214
+ :week-days="weekDays"
215
+ :month-year="monthYear"
216
+ :days="calendarDays"
217
+ :selected-date="selectedDate"
218
+ :locale="locale"
219
+ @previous-month="prevMonth"
220
+ @next-month="nextMonth"
221
+ @select="selectDate"
222
+ />
344
223
  </div>
345
224
 
346
225
  <!-- Divider -->
@@ -362,7 +241,7 @@ onUnmounted(() => {
362
241
  ]"
363
242
  @click="selectTime(time)"
364
243
  >
365
- {{ timeFormat === '12h' ? formatTime(parseTime(time).hour, parseTime(time).minute, '12h') : time }}
244
+ {{ formatTimeSlot(time, timeFormat) }}
366
245
  </button>
367
246
  </div>
368
247
  </div>
@@ -1,7 +1,9 @@
1
1
  <script setup lang="ts">
2
2
  /** Button that opens a dropdown menu for selecting one option from a list. */
3
- import { ref, computed, onMounted, onUnmounted } from 'vue'
4
- import type { SelectOption, ButtonVariant, ButtonSize } from '../types'
3
+ import { computed } from 'vue'
4
+ import { useDropdownState } from '../composables/useDropdownState'
5
+ import type { SelectOption, SelectOptionInput, ButtonVariant, ButtonSize } from '../types'
6
+ import { normalizeOptionInput } from '../utils/options'
5
7
 
6
8
  /**
7
9
  * DropdownButton - Button-style select with dropdown menu for option selection.
@@ -22,7 +24,7 @@ interface Props {
22
24
  /** Selected option value */
23
25
  modelValue?: string | number
24
26
  /** Available options */
25
- options: SelectOption<string | number>[]
27
+ options: SelectOptionInput<string | number>[]
26
28
  /** Placeholder text when no option is selected */
27
29
  placeholder?: string
28
30
  /** Button style variant */
@@ -51,52 +53,32 @@ const emit = defineEmits<{
51
53
  select: [option: SelectOption<string | number>]
52
54
  }>()
53
55
 
54
- const isOpen = ref(false)
55
- const containerRef = ref<HTMLDivElement>()
56
+ const { isOpen, rootRef, close, toggle: toggleDropdown } = useDropdownState()
57
+ const normalizedOptions = computed<SelectOption<string | number>[]>(() =>
58
+ props.options.map(normalizeOptionInput)
59
+ )
56
60
 
57
61
  const selectedLabel = computed(() => {
58
62
  if (props.modelValue === undefined) return props.placeholder ?? 'Select...'
59
- const found = props.options.find(o => o.value === props.modelValue)
63
+ const found = normalizedOptions.value.find(o => o.value === props.modelValue)
60
64
  return found?.label ?? String(props.modelValue)
61
65
  })
62
66
 
63
67
  function toggle() {
64
68
  if (props.disabled || props.loading) return
65
- isOpen.value = !isOpen.value
69
+ toggleDropdown()
66
70
  }
67
71
 
68
72
  function selectOption(option: SelectOption<string | number>) {
69
73
  if (option.disabled) return
70
74
  emit('update:modelValue', option.value)
71
75
  emit('select', option)
72
- isOpen.value = false
76
+ close()
73
77
  }
74
-
75
- function handleClickOutside(event: MouseEvent) {
76
- if (containerRef.value && !containerRef.value.contains(event.target as Node)) {
77
- isOpen.value = false
78
- }
79
- }
80
-
81
- function handleKeydown(event: KeyboardEvent) {
82
- if (event.key === 'Escape') {
83
- isOpen.value = false
84
- }
85
- }
86
-
87
- onMounted(() => {
88
- document.addEventListener('click', handleClickOutside)
89
- document.addEventListener('keydown', handleKeydown)
90
- })
91
-
92
- onUnmounted(() => {
93
- document.removeEventListener('click', handleClickOutside)
94
- document.removeEventListener('keydown', handleKeydown)
95
- })
96
78
  </script>
97
79
 
98
80
  <template>
99
- <div ref="containerRef" class="mint-dropdown-button">
81
+ <div ref="rootRef" class="mint-dropdown-button">
100
82
  <button
101
83
  type="button"
102
84
  :disabled="disabled || loading"
@@ -139,7 +121,7 @@ onUnmounted(() => {
139
121
  :aria-activedescendant="modelValue !== undefined ? `mint-dropdown-option-${modelValue}` : undefined"
140
122
  >
141
123
  <li
142
- v-for="option in options"
124
+ v-for="option in normalizedOptions"
143
125
  :id="`mint-dropdown-option-${option.value}`"
144
126
  :key="String(option.value)"
145
127
  role="option"
@@ -1,5 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  /** Empty-state placeholder with icon badge, headline, description, default slot, and optional CTA button. */
3
+ import BaseButton from './BaseButton.vue'
4
+
3
5
  interface Props {
4
6
  title?: string
5
7
  description?: string
@@ -57,9 +59,9 @@ const defaultIconPaths = [
57
59
  <slot />
58
60
  </div>
59
61
  <div v-if="actionLabel" class="mint-empty-state__action">
60
- <button class="mint-empty-state__button" @click="emit('action')">
62
+ <BaseButton @click="emit('action')">
61
63
  {{ actionLabel }}
62
- </button>
64
+ </BaseButton>
63
65
  </div>
64
66
  </div>
65
67
  </template>
@@ -1,6 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  /** Floating popover showing the active experiment with save, detach, and select actions. */
3
- import { ref, watch, onMounted, onUnmounted } from 'vue'
3
+ import { ref, watch, onUnmounted } from 'vue'
4
+ import { useDropdownState } from '../composables/useDropdownState'
4
5
  import ConfirmDialog from './ConfirmDialog.vue'
5
6
 
6
7
  interface Props {
@@ -32,19 +33,12 @@ const emit = defineEmits<{
32
33
  detach: []
33
34
  }>()
34
35
 
35
- const isOpen = ref(false)
36
- const popoverRef = ref<HTMLElement | null>(null)
36
+ const { isOpen, rootRef: popoverRef, close, toggle } = useDropdownState({
37
+ closeOnEscape: false,
38
+ })
37
39
  const showSuccess = ref(false)
38
40
  const showConfirm = ref(false)
39
41
 
40
- function toggle() {
41
- isOpen.value = !isOpen.value
42
- }
43
-
44
- function close() {
45
- isOpen.value = false
46
- }
47
-
48
42
  function handleSelect() {
49
43
  emit('select')
50
44
  close()
@@ -69,12 +63,6 @@ function handleDetach() {
69
63
  close()
70
64
  }
71
65
 
72
- function handleClickOutside(event: MouseEvent) {
73
- if (popoverRef.value && !popoverRef.value.contains(event.target as Node)) {
74
- close()
75
- }
76
- }
77
-
78
66
  let successTimer: ReturnType<typeof setTimeout> | null = null
79
67
 
80
68
  // Show success state when saveSuccessMessage changes from empty to a value
@@ -89,12 +77,7 @@ watch(() => props.saveSuccessMessage, (msg) => {
89
77
  }
90
78
  })
91
79
 
92
- onMounted(() => {
93
- document.addEventListener('click', handleClickOutside)
94
- })
95
-
96
80
  onUnmounted(() => {
97
- document.removeEventListener('click', handleClickOutside)
98
81
  if (successTimer) clearTimeout(successTimer)
99
82
  })
100
83