@morscherlab/mint-sdk 1.2.0-beta.2 → 1.2.0-beta.20

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 (493) hide show
  1. package/README.md +65 -5
  2. package/dist/{ExperimentPopover-tLwJ7XF4.js → ExperimentPopover-CJdNlCZb.js} +24 -15
  3. package/dist/ExperimentPopover-CJdNlCZb.js.map +1 -0
  4. package/dist/{ExperimentSelectorModal-DyPAUCLw.js → ExperimentSelectorModal-DCXmwKNS.js} +5 -5
  5. package/dist/ExperimentSelectorModal-DCXmwKNS.js.map +1 -0
  6. package/dist/{SettingsModal-BgKY93zh.js → SettingsModal-BYR20I4c.js} +5 -8
  7. package/dist/SettingsModal-BYR20I4c.js.map +1 -0
  8. package/dist/{EmptyState-p90quq8Z.js → Skeleton-BAF3CKY7.js} +111 -93
  9. package/dist/Skeleton-BAF3CKY7.js.map +1 -0
  10. package/dist/__tests__/components/DataStates.test.d.ts +1 -0
  11. package/dist/__tests__/components/ExperimentTimeline.test.d.ts +1 -0
  12. package/dist/__tests__/components/FileBrowserModal.test.d.ts +1 -0
  13. package/dist/__tests__/components/FilePicker.state.test.d.ts +1 -0
  14. package/dist/__tests__/components/FilePicker.test.d.ts +1 -0
  15. package/dist/__tests__/components/PlotlyChart.test.d.ts +1 -0
  16. package/dist/__tests__/components/PluginWorkspaceView.internal.test.d.ts +1 -0
  17. package/dist/__tests__/components/SecretInput.test.d.ts +1 -0
  18. package/dist/__tests__/components/WellEditPopupInternal.test.d.ts +1 -0
  19. package/dist/__tests__/components/iconButtonIconSizing.test.d.ts +1 -0
  20. package/dist/__tests__/composables/useFileBrowser.test.d.ts +1 -0
  21. package/dist/__tests__/composables/useListReorder.test.d.ts +1 -0
  22. package/dist/__tests__/composables/usePlatformFilePickerAdapter.test.d.ts +1 -0
  23. package/dist/__tests__/composables/usePluginConfig.test.d.ts +15 -0
  24. package/dist/__tests__/styles/cssTokens.test.d.ts +1 -0
  25. package/dist/apiErrors.d.ts +26 -0
  26. package/dist/components/ActionMenu.vue.d.ts +1 -1
  27. package/dist/components/AppAvatarMenu.vue.d.ts +4 -0
  28. package/dist/components/AppPluginSwitcher.vue.d.ts +2 -0
  29. package/dist/components/AppSidebar.vue.d.ts +1 -1
  30. package/dist/components/AuditTrail.vue.d.ts +13 -0
  31. package/dist/components/AutoGroupModal.vue.d.ts +1 -1
  32. package/dist/components/BaseInput.vue.d.ts +1 -1
  33. package/dist/components/BaseSelect.vue.d.ts +1 -1
  34. package/dist/components/BaseTextarea.vue.d.ts +1 -1
  35. package/dist/components/BatchProgressList.vue.d.ts +17 -0
  36. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +4 -4
  37. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +2 -2
  38. package/dist/components/ConcentrationInput.vue.d.ts +1 -1
  39. package/dist/components/DataFrame.vue.d.ts +14 -2
  40. package/dist/components/DatePicker.vue.d.ts +2 -2
  41. package/dist/components/DateTimePicker.vue.d.ts +3 -1
  42. package/dist/components/DropdownButton.vue.d.ts +2 -0
  43. package/dist/components/ExperimentDataViewer.vue.d.ts +26 -1
  44. package/dist/components/ExperimentPopover.vue.d.ts +1 -0
  45. package/dist/components/ExperimentTimeline.vue.d.ts +29 -1
  46. package/dist/components/FileBrowserModal.vue.d.ts +99 -0
  47. package/dist/components/FilePicker.vue.d.ts +32 -0
  48. package/dist/components/FileUploader.vue.d.ts +5 -2
  49. package/dist/components/FitPanel.vue.d.ts +1 -1
  50. package/dist/components/FormulaInput.vue.d.ts +1 -1
  51. package/dist/components/GeneratedPlotlyResult.vue.d.ts +1 -3
  52. package/dist/components/JobsStatusTray.vue.d.ts +9 -2
  53. package/dist/components/LcmsSequenceTable.vue.d.ts +29 -1
  54. package/dist/components/MobileSupportGate.vue.d.ts +1 -1
  55. package/dist/components/MoleculeInput.vue.d.ts +1 -1
  56. package/dist/components/NumberInput.vue.d.ts +1 -1
  57. package/dist/components/PlotlyChart.vue.d.ts +59 -0
  58. package/dist/components/PluginWorkspaceView.props.d.ts +29 -1
  59. package/dist/components/PluginWorkspaceView.vue.d.ts +5 -5
  60. package/dist/components/ProgressBar.vue.d.ts +1 -1
  61. package/dist/components/ProtocolStepEditor.vue.d.ts +1 -0
  62. package/dist/components/ReagentList.vue.d.ts +29 -1
  63. package/dist/components/ResourceCard.vue.d.ts +1 -1
  64. package/dist/components/SampleHierarchyTree.vue.d.ts +29 -1
  65. package/dist/components/SampleLegend.vue.d.ts +1 -1
  66. package/dist/components/SampleSelector.drag.d.ts +13 -0
  67. package/dist/components/SampleSelector.tree.d.ts +2 -0
  68. package/dist/components/SampleSelector.vue.d.ts +35 -2
  69. package/dist/components/ScheduleCalendar.vue.d.ts +20 -0
  70. package/dist/components/SecretInput.vue.d.ts +28 -0
  71. package/dist/components/SequenceInput.vue.d.ts +1 -1
  72. package/dist/components/SettingsModal.vue.d.ts +1 -1
  73. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +2 -1
  74. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  75. package/dist/components/TagsInput.vue.d.ts +1 -1
  76. package/dist/components/TimePicker.vue.d.ts +2 -1
  77. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  78. package/dist/components/UnitInput.vue.d.ts +1 -1
  79. package/dist/components/WellPlate.geometry.d.ts +15 -0
  80. package/dist/components/WellPlate.interaction.d.ts +13 -0
  81. package/dist/components/WellPlate.vue.d.ts +30 -1
  82. package/dist/components/fileBrowserPresentation.d.ts +10 -0
  83. package/dist/components/index.d.ts +13 -0
  84. package/dist/components/index.js +8 -8
  85. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -0
  86. package/dist/components/internal/DataStateInternal.vue.d.ts +43 -0
  87. package/dist/components/internal/FileBrowserDialogInternal.vue.d.ts +34 -0
  88. package/dist/components/internal/FileBrowserListingInternal.vue.d.ts +25 -0
  89. package/dist/components/internal/FileBrowserToolbarInternal.vue.d.ts +26 -0
  90. package/dist/components/internal/FilePickerPreviewInternal.vue.d.ts +18 -0
  91. package/dist/components/internal/FilePickerTreeInternal.vue.d.ts +31 -0
  92. package/dist/components/internal/WellEditPopupInternal.vue.d.ts +3 -1
  93. package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +23 -0
  94. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +70 -0
  95. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +43 -0
  96. package/dist/{components-DkHddRMl.js → components-DIum5hkx.js} +5882 -3200
  97. package/dist/components-DIum5hkx.js.map +1 -0
  98. package/dist/composables/controlSchemaTypes.d.ts +34 -0
  99. package/dist/composables/filePicker/localFiles.d.ts +3 -0
  100. package/dist/composables/filePicker/usePickerNavigation.d.ts +96 -0
  101. package/dist/composables/filePicker/usePickerSelection.d.ts +31 -0
  102. package/dist/composables/filePicker/validation.d.ts +5 -0
  103. package/dist/composables/flattenWorkspaceBindings.d.ts +61 -0
  104. package/dist/composables/index.d.ts +11 -2
  105. package/dist/composables/index.js +10 -10
  106. package/dist/composables/pluginWorkspaceModel.d.ts +164 -0
  107. package/dist/composables/useApi.d.ts +14 -7
  108. package/dist/composables/useAsync.d.ts +5 -1
  109. package/dist/composables/useBioTemplateWorkspace.d.ts +4 -20
  110. package/dist/composables/useCommandHistory.d.ts +5 -1
  111. package/dist/composables/useDropdownState.d.ts +18 -2
  112. package/dist/composables/useEventStream.d.ts +9 -0
  113. package/dist/composables/useFileBrowser.d.ts +55 -0
  114. package/dist/composables/useFilePicker.d.ts +189 -0
  115. package/dist/composables/useFocusTrap.d.ts +21 -0
  116. package/dist/composables/useGeneratedAnalysis.d.ts +3 -1
  117. package/dist/composables/useJobsStatusTray.d.ts +25 -1
  118. package/dist/composables/useListReorder.d.ts +90 -0
  119. package/dist/composables/useMenuKeyboard.d.ts +29 -0
  120. package/dist/composables/useOptimisticMutation.d.ts +5 -1
  121. package/dist/composables/usePlatformFilePickerAdapter.d.ts +11 -0
  122. package/dist/composables/usePluginClient.d.ts +2 -0
  123. package/dist/composables/usePluginConfig.d.ts +27 -0
  124. package/dist/composables/usePluginWorkspace.d.ts +51 -0
  125. package/dist/composables/useRequestSyncState.d.ts +42 -2
  126. package/dist/composables/useResourceCrud.d.ts +5 -1
  127. package/dist/composables/useRovingFocus.d.ts +24 -0
  128. package/dist/composables/useScheduleDrag.d.ts +1 -0
  129. package/dist/composables/useWellPainting.d.ts +5 -1
  130. package/dist/composables/useWellPlateAdapter.d.ts +5 -1
  131. package/dist/composables/useWellPlateValidation.d.ts +5 -1
  132. package/dist/composables/workspaceRecipes.d.ts +188 -0
  133. package/dist/{composables-C_i90sGS.js → composables-mFXsTA4g.js} +502 -86
  134. package/dist/composables-mFXsTA4g.js.map +1 -0
  135. package/dist/{useApi-J6zFkHmn.js → errors-BLuqMee5.js} +179 -16
  136. package/dist/errors-BLuqMee5.js.map +1 -0
  137. package/dist/{experiment-Cq145oEW.js → experiment-CVDRAnqp.js} +3 -8
  138. package/dist/experiment-CVDRAnqp.js.map +1 -0
  139. package/dist/{experiment-utils-CLnzPPq5.js → experiment-utils-CV2Wza3z.js} +70 -51
  140. package/dist/experiment-utils-CV2Wza3z.js.map +1 -0
  141. package/dist/index.d.ts +2 -0
  142. package/dist/index.js +15 -15
  143. package/dist/install.js +2 -7
  144. package/dist/install.js.map +1 -1
  145. package/dist/permissions.d.ts +42 -1
  146. package/dist/permissions.js +20 -10
  147. package/dist/permissions.js.map +1 -1
  148. package/dist/stores/auth.d.ts +6 -0
  149. package/dist/stores/index.d.ts +1 -1
  150. package/dist/stores/index.js +3 -3
  151. package/dist/stores/settings.d.ts +31 -1
  152. package/dist/styles.css +15135 -32397
  153. package/dist/templates/builderReadUtils.d.ts +1 -1
  154. package/dist/templates/index.js +2 -4
  155. package/dist/{templates-DsP51i-S.js → templates-CmGfmBRA.js} +303 -106
  156. package/dist/templates-CmGfmBRA.js.map +1 -0
  157. package/dist/types/auth.d.ts +1 -0
  158. package/dist/types/fileBrowserTypes.d.ts +77 -0
  159. package/dist/types/filePicker.d.ts +77 -0
  160. package/dist/types/form-builder.d.ts +1 -1
  161. package/dist/types/index.d.ts +2 -0
  162. package/dist/{useControlSchema-BDx2Olha.js → useControlSchema-DldpxNOP.js} +499 -1162
  163. package/dist/useControlSchema-DldpxNOP.js.map +1 -0
  164. package/dist/{useDropdownState-DSb3BC3N.js → useDropdownState-C7hRiVQf.js} +22 -6
  165. package/dist/useDropdownState-C7hRiVQf.js.map +1 -0
  166. package/dist/{useExperimentSelector-CV4iNfMS.js → useExperimentSelector-CEcIaueJ.js} +4 -4
  167. package/dist/{useExperimentSelector-CV4iNfMS.js.map → useExperimentSelector-CEcIaueJ.js.map} +1 -1
  168. package/dist/{useFormBuilder-BLxG3BOX.js → useFormBuilder-z5L_dUIy.js} +2 -2
  169. package/dist/{useFormBuilder-BLxG3BOX.js.map → useFormBuilder-z5L_dUIy.js.map} +1 -1
  170. package/dist/utils/color.d.ts +13 -0
  171. package/dist/utils/errors.d.ts +9 -0
  172. package/dist/utils/pluginSecrets.d.ts +53 -0
  173. package/dist/utils/records.d.ts +4 -0
  174. package/dist/{useProtocolTemplates-CS_SQl6U.js → validation-uwoJGEb6.js} +811 -212
  175. package/dist/validation-uwoJGEb6.js.map +1 -0
  176. package/package.json +1 -1
  177. package/src/__tests__/apiErrors.test.ts +81 -0
  178. package/src/__tests__/components/ActionMenu.test.ts +94 -0
  179. package/src/__tests__/components/AppAvatarMenu.test.ts +123 -0
  180. package/src/__tests__/components/BaseTabs.test.ts +67 -0
  181. package/src/__tests__/components/DataFrame.test.ts +183 -11
  182. package/src/__tests__/components/DataStates.test.ts +176 -0
  183. package/src/__tests__/components/DatePicker.test.ts +76 -0
  184. package/src/__tests__/components/DateTimePicker.test.ts +36 -0
  185. package/src/__tests__/components/DropdownButton.test.ts +134 -0
  186. package/src/__tests__/components/ExperimentPopover.test.ts +30 -0
  187. package/src/__tests__/components/ExperimentTimeline.test.ts +63 -0
  188. package/src/__tests__/components/FileBrowserModal.test.ts +460 -0
  189. package/src/__tests__/components/FilePicker.state.test.ts +287 -0
  190. package/src/__tests__/components/FilePicker.test.ts +487 -0
  191. package/src/__tests__/components/GeneratedPlotlyResult.test.ts +52 -5
  192. package/src/__tests__/components/GroupAssigner.test.ts +53 -0
  193. package/src/__tests__/components/LcmsSequenceTable.test.ts +22 -0
  194. package/src/__tests__/components/PlotlyChart.test.ts +305 -0
  195. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +230 -0
  196. package/src/__tests__/components/RackEditor.test.ts +35 -0
  197. package/src/__tests__/components/ReagentList.test.ts +64 -2
  198. package/src/__tests__/components/RetiredStyles.test.ts +31 -0
  199. package/src/__tests__/components/SampleSelector.drag.test.ts +51 -1
  200. package/src/__tests__/components/ScheduleCalendar.test.ts +63 -0
  201. package/src/__tests__/components/SecretInput.test.ts +87 -0
  202. package/src/__tests__/components/SegmentedControl.test.ts +107 -0
  203. package/src/__tests__/components/TimePicker.test.ts +61 -0
  204. package/src/__tests__/components/WellEditPopupInternal.test.ts +108 -0
  205. package/src/__tests__/components/WellPlate.interaction.test.ts +59 -0
  206. package/src/__tests__/components/iconButtonIconSizing.test.ts +18 -0
  207. package/src/__tests__/composables/useApi.test.ts +92 -9
  208. package/src/__tests__/composables/useAuth.test.ts +2 -0
  209. package/src/__tests__/composables/useDropdownState.test.ts +58 -1
  210. package/src/__tests__/composables/useFileBrowser.test.ts +305 -0
  211. package/src/__tests__/composables/useGeneratedAnalysis.test.ts +7 -2
  212. package/src/__tests__/composables/useListReorder.test.ts +145 -0
  213. package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +67 -0
  214. package/src/__tests__/composables/usePluginClient.test.ts +143 -0
  215. package/src/__tests__/composables/usePluginConfig.test.ts +497 -0
  216. package/src/__tests__/composables/useRequestSyncState.test.ts +140 -0
  217. package/src/__tests__/docs/frontendDocsCatalog.test.ts +39 -7
  218. package/src/__tests__/stores/settings.test.ts +71 -1
  219. package/src/__tests__/styles/cssTokens.test.ts +131 -0
  220. package/src/__tests__/utils/permissions.test.ts +68 -0
  221. package/src/apiErrors.ts +85 -0
  222. package/src/components/ActionMenu.vue +45 -88
  223. package/src/components/AlertBox.vue +0 -4
  224. package/src/components/AppAvatarMenu.vue +26 -7
  225. package/src/components/AppLayout.vue +0 -4
  226. package/src/components/AppPluginSwitcher.story.vue +87 -0
  227. package/src/components/AppPluginSwitcher.vue +2 -5
  228. package/src/components/AppSidebar.vue +0 -4
  229. package/src/components/AppToastContainer.vue +6 -8
  230. package/src/components/AppTopBar.vue +0 -4
  231. package/src/components/ArtifactSaveDialog.vue +0 -4
  232. package/src/components/ArtifactSelectorModal.vue +0 -4
  233. package/src/components/AuditTrail.story.vue +18 -0
  234. package/src/components/AuditTrail.vue +27 -7
  235. package/src/components/AutoGroupModal.vue +0 -4
  236. package/src/components/Avatar.vue +0 -4
  237. package/src/components/BaseButton.vue +0 -4
  238. package/src/components/BaseCheckbox.vue +0 -4
  239. package/src/components/BaseInput.vue +0 -4
  240. package/src/components/BaseModal.vue +8 -60
  241. package/src/components/BasePill.vue +0 -4
  242. package/src/components/BaseRadioGroup.vue +0 -4
  243. package/src/components/BaseSelect.vue +0 -4
  244. package/src/components/BaseSlider.vue +0 -4
  245. package/src/components/BaseTabs.vue +26 -5
  246. package/src/components/BaseTextarea.vue +0 -4
  247. package/src/components/BaseToggle.vue +0 -4
  248. package/src/components/BatchProgressList.story.vue +18 -0
  249. package/src/components/BatchProgressList.vue +32 -4
  250. package/src/components/BioTemplateExperimentWorkspaceView.vue +10 -21
  251. package/src/components/BioTemplatePackWorkspaceView.vue +11 -15
  252. package/src/components/BioTemplatePresetWorkspaceView.vue +8 -13
  253. package/src/components/Breadcrumb.vue +0 -4
  254. package/src/components/Calendar.vue +0 -4
  255. package/src/components/ChartContainer.story.vue +1 -1
  256. package/src/components/ChartContainer.vue +0 -4
  257. package/src/components/ChemicalFormula.vue +0 -4
  258. package/src/components/CollapsibleCard.vue +0 -4
  259. package/src/components/ColorSlider.vue +0 -4
  260. package/src/components/ComponentBindingRenderer.vue +1 -3
  261. package/src/components/ConcentrationInput.vue +0 -4
  262. package/src/components/ConfirmDialog.vue +0 -4
  263. package/src/components/ControlWorkspaceView.vue +11 -22
  264. package/src/components/DataFrame.story.vue +14 -0
  265. package/src/components/DataFrame.vue +97 -23
  266. package/src/components/DatePicker.vue +73 -27
  267. package/src/components/DateTimePicker.vue +45 -17
  268. package/src/components/Divider.vue +0 -4
  269. package/src/components/DoseCalculator.vue +0 -4
  270. package/src/components/DoseDesignWorkspaceView.vue +6 -25
  271. package/src/components/DropdownButton.vue +24 -6
  272. package/src/components/EmptyState.vue +0 -4
  273. package/src/components/ExperimentCodeBadge.vue +0 -4
  274. package/src/components/ExperimentDataViewer.story.vue +3 -0
  275. package/src/components/ExperimentDataViewer.vue +33 -13
  276. package/src/components/ExperimentPopover.vue +12 -7
  277. package/src/components/ExperimentSelectorModal.vue +0 -4
  278. package/src/components/ExperimentTimeline.story.vue +18 -0
  279. package/src/components/ExperimentTimeline.vue +81 -75
  280. package/src/components/FileBrowserModal.story.vue +203 -0
  281. package/src/components/FileBrowserModal.vue +384 -0
  282. package/src/components/FilePicker.story.vue +44 -0
  283. package/src/components/FilePicker.vue +284 -0
  284. package/src/components/FileUploader.vue +32 -18
  285. package/src/components/FitPanel.vue +0 -4
  286. package/src/components/FormActions.story.vue +96 -0
  287. package/src/components/FormActions.vue +0 -4
  288. package/src/components/FormBuilder.vue +0 -4
  289. package/src/components/FormField.vue +0 -4
  290. package/src/components/FormulaInput.vue +0 -4
  291. package/src/components/GeneratedPathInput.story.vue +68 -0
  292. package/src/components/GeneratedPlotlyResult.story.vue +96 -0
  293. package/src/components/GeneratedPlotlyResult.vue +34 -69
  294. package/src/components/GeneratedPluginView.story.vue +145 -0
  295. package/src/components/GeneratedPluginView.vue +10 -10
  296. package/src/components/GeneratedResultRenderer.story.vue +117 -0
  297. package/src/components/GeneratedResultRenderer.vue +4 -9
  298. package/src/components/GroupAssigner.vue +67 -5
  299. package/src/components/IconButton.vue +0 -4
  300. package/src/components/InstrumentAlertLog.vue +0 -4
  301. package/src/components/InstrumentStateBadge.vue +0 -4
  302. package/src/components/InstrumentStatusCard.vue +0 -4
  303. package/src/components/JobsStatusTray.vue +16 -5
  304. package/src/components/LcmsSequenceTable.vue +81 -50
  305. package/src/components/LoadingSpinner.vue +0 -4
  306. package/src/components/MobileSupportGate.vue +0 -4
  307. package/src/components/MoleculeInput.vue +0 -4
  308. package/src/components/MultiSelect.vue +0 -4
  309. package/src/components/NumberInput.vue +0 -4
  310. package/src/components/PlateMapEditor.vue +3 -14
  311. package/src/components/PlotlyChart.story.vue +61 -0
  312. package/src/components/PlotlyChart.vue +233 -0
  313. package/src/components/PluginIcon.vue +0 -4
  314. package/src/components/PluginWorkspaceView.props.ts +38 -0
  315. package/src/components/PluginWorkspaceView.vue +53 -224
  316. package/src/components/ProgressBar.vue +0 -4
  317. package/src/components/ProtocolStepEditor.vue +2 -4
  318. package/src/components/RackEditor.vue +51 -70
  319. package/src/components/ReagentEditor.vue +0 -4
  320. package/src/components/ReagentList.story.vue +18 -0
  321. package/src/components/ReagentList.vue +127 -82
  322. package/src/components/ResourceCard.vue +0 -4
  323. package/src/components/RuntimeUpdateNotice.story.vue +49 -0
  324. package/src/components/RuntimeUpdateNotice.vue +4 -4
  325. package/src/components/SampleHierarchyTree.story.vue +18 -0
  326. package/src/components/SampleHierarchyTree.vue +32 -9
  327. package/src/components/SampleLegend.vue +2 -8
  328. package/src/components/SampleSelector.drag.ts +51 -0
  329. package/src/components/SampleSelector.story.vue +6 -0
  330. package/src/components/SampleSelector.tree.ts +2 -0
  331. package/src/components/SampleSelector.vue +49 -10
  332. package/src/components/SampleSelectorGroupNode.vue +19 -0
  333. package/src/components/ScheduleCalendar.story.vue +6 -0
  334. package/src/components/ScheduleCalendar.vue +82 -7
  335. package/src/components/ScientificNumber.vue +0 -4
  336. package/src/components/SecretInput.story.vue +79 -0
  337. package/src/components/SecretInput.vue +150 -0
  338. package/src/components/SectionCard.vue +0 -4
  339. package/src/components/SegmentedControl.vue +50 -7
  340. package/src/components/SequenceInput.vue +0 -4
  341. package/src/components/SequenceProgressBar.story.vue +110 -0
  342. package/src/components/SequenceProgressBar.vue +0 -4
  343. package/src/components/SettingsModal.vue +0 -4
  344. package/src/components/Skeleton.vue +0 -4
  345. package/src/components/SmartGroupFieldRecipe.vue +8 -6
  346. package/src/components/SmartGroupManual.vue +0 -4
  347. package/src/components/StatusIndicator.vue +0 -4
  348. package/src/components/StepWizard.vue +0 -4
  349. package/src/components/TagsInput.vue +4 -6
  350. package/src/components/ThemeToggle.vue +0 -4
  351. package/src/components/TimePicker.vue +36 -7
  352. package/src/components/TimeRangeInput.vue +0 -4
  353. package/src/components/Tooltip.story.vue +3 -3
  354. package/src/components/Tooltip.vue +0 -4
  355. package/src/components/UnitInput.vue +0 -4
  356. package/src/components/WellPlate.geometry.ts +60 -1
  357. package/src/components/WellPlate.interaction.ts +44 -0
  358. package/src/components/WellPlate.story.vue +8 -0
  359. package/src/components/WellPlate.vue +53 -7
  360. package/src/components/fileBrowserPresentation.ts +39 -0
  361. package/src/components/index.ts +14 -0
  362. package/src/components/internal/AppTopBarPageSelectorInternal.vue +2 -5
  363. package/src/components/internal/AppTopBarPillNavInternal.vue +0 -4
  364. package/src/components/internal/DataStateInternal.vue +74 -0
  365. package/src/components/internal/FileBrowserDialogInternal.vue +75 -0
  366. package/src/components/internal/FileBrowserListingInternal.vue +197 -0
  367. package/src/components/internal/FileBrowserToolbarInternal.vue +136 -0
  368. package/src/components/internal/FilePickerPreviewInternal.vue +100 -0
  369. package/src/components/internal/FilePickerTreeInternal.vue +238 -0
  370. package/src/components/internal/FormSectionRenderer.vue +0 -4
  371. package/src/components/internal/WellEditPopupInternal.vue +20 -5
  372. package/src/components/internal/WorkspaceControlsInternal.vue +20 -0
  373. package/src/components/internal/WorkspaceShellInternal.vue +125 -0
  374. package/src/components/internal/WorkspaceSidebarInternal.vue +82 -0
  375. package/src/composables/controlSchemaTypes.ts +34 -0
  376. package/src/composables/experimentDesignData.ts +1 -3
  377. package/src/composables/filePicker/localFiles.ts +58 -0
  378. package/src/composables/filePicker/usePickerNavigation.ts +220 -0
  379. package/src/composables/filePicker/usePickerSelection.ts +259 -0
  380. package/src/composables/filePicker/validation.ts +41 -0
  381. package/src/composables/flattenWorkspaceBindings.ts +104 -0
  382. package/src/composables/formBuilderRegistry.ts +5 -0
  383. package/src/composables/index.ts +50 -0
  384. package/src/composables/pluginWorkspaceModel.ts +182 -0
  385. package/src/composables/useApi.ts +57 -13
  386. package/src/composables/useAsync.ts +5 -1
  387. package/src/composables/useAuth.ts +3 -0
  388. package/src/composables/useBioTemplatePackWorkspace.ts +15 -9
  389. package/src/composables/useBioTemplatePresetWorkspace.ts +14 -15
  390. package/src/composables/useBioTemplateWorkspace.ts +18 -43
  391. package/src/composables/useCommandHistory.ts +5 -1
  392. package/src/composables/useDropdownState.ts +35 -5
  393. package/src/composables/useEventStream.ts +14 -2
  394. package/src/composables/useFileBrowser.ts +314 -0
  395. package/src/composables/useFileImport.ts +2 -7
  396. package/src/composables/useFilePicker.ts +366 -0
  397. package/src/composables/useFocusTrap.ts +91 -0
  398. package/src/composables/useGeneratedAnalysis.ts +32 -27
  399. package/src/composables/useJobsStatusTray.ts +184 -17
  400. package/src/composables/useListReorder.story.vue +143 -0
  401. package/src/composables/useListReorder.ts +242 -0
  402. package/src/composables/useMenuKeyboard.ts +90 -0
  403. package/src/composables/useOptimisticMutation.ts +6 -16
  404. package/src/composables/usePlatformFilePickerAdapter.ts +104 -0
  405. package/src/composables/usePluginClient.ts +50 -4
  406. package/src/composables/usePluginConfig.ts +252 -0
  407. package/src/composables/usePluginWorkspace.ts +208 -0
  408. package/src/composables/useRackEditor.ts +2 -11
  409. package/src/composables/useRequestSyncState.ts +98 -28
  410. package/src/composables/useResourceCrud.ts +6 -16
  411. package/src/composables/useRovingFocus.ts +66 -0
  412. package/src/composables/useScheduleDrag.ts +37 -0
  413. package/src/composables/useWellPainting.ts +10 -30
  414. package/src/composables/useWellPlateAdapter.ts +5 -1
  415. package/src/composables/useWellPlateEditor.ts +1 -11
  416. package/src/composables/useWellPlateValidation.ts +5 -1
  417. package/src/composables/workspaceRecipes.ts +267 -0
  418. package/src/index.ts +19 -0
  419. package/src/permissions.ts +48 -9
  420. package/src/stores/auth.ts +1 -0
  421. package/src/stores/experiment.ts +2 -7
  422. package/src/stores/index.ts +9 -1
  423. package/src/stores/settings.ts +93 -1
  424. package/src/styles/components/audit-trail.css +5 -5
  425. package/src/styles/components/batch-progress-list.css +7 -0
  426. package/src/styles/components/color-slider.css +2 -2
  427. package/src/styles/components/data-state.css +30 -0
  428. package/src/styles/components/dataframe.css +29 -35
  429. package/src/styles/components/experiment-data-viewer.css +4 -4
  430. package/src/styles/components/experiment-timeline.css +3 -30
  431. package/src/styles/components/file-browser-modal.css +489 -0
  432. package/src/styles/components/file-picker.css +502 -0
  433. package/src/styles/components/form-builder.css +5 -5
  434. package/src/styles/components/icon-button.css +9 -0
  435. package/src/styles/components/lcms-sequence-table.css +16 -1
  436. package/src/styles/components/multi-select.css +1 -1
  437. package/src/styles/components/reagent-list.css +38 -31
  438. package/src/styles/components/sample-hierarchy-tree.css +5 -19
  439. package/src/styles/components/sample-selector.css +9 -2
  440. package/src/styles/components/schedule-calendar.css +8 -0
  441. package/src/styles/components/scientific-number.css +1 -1
  442. package/src/styles/components/secret-input.css +60 -0
  443. package/src/styles/components/well-plate.css +8 -0
  444. package/src/styles/index.css +12 -0
  445. package/src/styles/variables.css +29 -0
  446. package/src/templates/builderPresetControls.ts +1 -1
  447. package/src/templates/builderReadUtils.ts +1 -3
  448. package/src/templates/componentPlateHelpers.ts +3 -1
  449. package/src/templates/componentTargetResolvers.ts +1 -3
  450. package/src/templates/controlSchemaTargets.ts +1 -3
  451. package/src/templates/doseResponseAdapters.ts +2 -13
  452. package/src/templates/elisaAssayCollectionBuilder.ts +2 -2
  453. package/src/templates/plateMapBuilder.ts +2 -2
  454. package/src/templates/qpcrPlateBuilder.ts +1 -1
  455. package/src/templates/templateValidators.ts +1 -1
  456. package/src/templates/timeCourseBuilder.ts +2 -2
  457. package/src/templates/wellPlateScreenCollectionBuilder.ts +2 -2
  458. package/src/types/auth.ts +1 -0
  459. package/src/types/fileBrowserTypes.ts +85 -0
  460. package/src/types/filePicker.ts +72 -0
  461. package/src/types/form-builder.ts +1 -0
  462. package/src/types/index.ts +14 -0
  463. package/src/utils/color.ts +51 -0
  464. package/src/utils/errors.ts +29 -0
  465. package/src/utils/formModelSync.ts +1 -3
  466. package/src/utils/pluginIcon.ts +1 -3
  467. package/src/utils/pluginSecrets.ts +102 -0
  468. package/src/utils/records.ts +9 -0
  469. package/dist/EmptyState-p90quq8Z.js.map +0 -1
  470. package/dist/ExperimentPopover-tLwJ7XF4.js.map +0 -1
  471. package/dist/ExperimentSelectorModal-DyPAUCLw.js.map +0 -1
  472. package/dist/SettingsModal-BgKY93zh.js.map +0 -1
  473. package/dist/components-DkHddRMl.js.map +0 -1
  474. package/dist/composables/autoGroupConstants.d.ts +0 -1
  475. package/dist/composables/autoGroupGrouping.d.ts +0 -3
  476. package/dist/composables/useAutoGroupInputSources.d.ts +0 -32
  477. package/dist/composables-C_i90sGS.js.map +0 -1
  478. package/dist/experiment-Cq145oEW.js.map +0 -1
  479. package/dist/experiment-utils-CLnzPPq5.js.map +0 -1
  480. package/dist/templates/builderDefaults.d.ts +0 -1
  481. package/dist/templates/plateGeometry.d.ts +0 -4
  482. package/dist/templates-DsP51i-S.js.map +0 -1
  483. package/dist/useApi-J6zFkHmn.js.map +0 -1
  484. package/dist/useControlSchema-BDx2Olha.js.map +0 -1
  485. package/dist/useDropdownState-DSb3BC3N.js.map +0 -1
  486. package/dist/useProtocolTemplates-CS_SQl6U.js.map +0 -1
  487. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +0 -127
  488. package/src/composables/autoGroupConstants.ts +0 -4
  489. package/src/composables/autoGroupGrouping.ts +0 -148
  490. package/src/composables/useAutoGroupInputSources.ts +0 -147
  491. package/src/templates/builderDefaults.ts +0 -11
  492. package/src/templates/plateGeometry.ts +0 -62
  493. /package/dist/__tests__/{composables/useAutoGroupInputSources.test.d.ts → apiErrors.test.d.ts} +0 -0
@@ -1,6 +1,7 @@
1
1
  import axios, { type AxiosInstance, type AxiosRequestConfig, type InternalAxiosRequestConfig } from 'axios'
2
2
  import { useSettingsStore } from '../stores/settings'
3
3
  import { useAuthStore } from '../stores/auth'
4
+ import { MintApiError, mintApiErrorFromResponse } from '../apiErrors'
4
5
 
5
6
  let apiClientInstance: AxiosInstance | null = null
6
7
  let interceptorAttached = false
@@ -8,11 +9,13 @@ let interceptorAttached = false
8
9
  interface MintAxiosRequestConfig extends AxiosRequestConfig {
9
10
  _mintSkipAuth?: boolean
10
11
  _mintAuthToken?: string
12
+ _mintTypedErrors?: boolean
11
13
  }
12
14
 
13
15
  interface MintInternalAxiosRequestConfig extends InternalAxiosRequestConfig {
14
16
  _mintSkipAuth?: boolean
15
17
  _mintAuthToken?: string
18
+ _mintTypedErrors?: boolean
16
19
  }
17
20
 
18
21
  type MutableHeaders = Record<string, unknown> & {
@@ -103,14 +106,27 @@ function getAuthorizationHeader(headers: AxiosRequestConfig['headers']): unknown
103
106
  return key ? bag[key] : undefined
104
107
  }
105
108
 
106
- /** Raised when an authenticated SDK request is rejected because the login is no longer valid. */
107
- export class AuthenticationRequiredError extends Error {
108
- readonly code = 'AUTHENTICATION_REQUIRED'
109
- readonly status = 401
110
-
111
- constructor(readonly cause?: unknown) {
112
- super('Authentication required. Please sign in again.')
113
- this.name = 'AuthenticationRequiredError'
109
+ /**
110
+ * Raised when an authenticated SDK request is rejected because the login is no
111
+ * longer valid. It is also a `MintApiError` (status 401), so typed-error callers
112
+ * and `instanceof AuthenticationRequiredError` callers both recognise it.
113
+ */
114
+ export class AuthenticationRequiredError extends MintApiError {
115
+ override readonly name: string = 'AuthenticationRequiredError'
116
+ declare readonly code: 'AUTHENTICATION_REQUIRED'
117
+ declare readonly status: 401
118
+
119
+ constructor(cause?: unknown, envelope?: MintApiError) {
120
+ super(
121
+ 'Authentication required. Please sign in again.',
122
+ 'AUTHENTICATION_REQUIRED',
123
+ 401,
124
+ envelope?.requestId ?? null,
125
+ envelope?.details ?? null,
126
+ envelope?.detail,
127
+ envelope?.body ?? null,
128
+ cause,
129
+ )
114
130
  }
115
131
  }
116
132
 
@@ -118,12 +134,13 @@ export class AuthenticationRequiredError extends Error {
118
134
  export function authenticationRequiredError(
119
135
  cause: unknown,
120
136
  rejectedToken?: string,
137
+ envelope?: MintApiError,
121
138
  ): AuthenticationRequiredError {
122
139
  const currentAuthStore = useAuthStore()
123
140
  if (rejectedToken && currentAuthStore.token === rejectedToken) {
124
141
  currentAuthStore.clearToken()
125
142
  }
126
- return new AuthenticationRequiredError(cause)
143
+ return new AuthenticationRequiredError(cause, envelope)
127
144
  }
128
145
 
129
146
  function getApiClient(): AxiosInstance {
@@ -141,6 +158,8 @@ export interface ApiClientOptions {
141
158
  baseUrl?: string
142
159
  timeout?: number
143
160
  withAuth?: boolean
161
+ /** Normalize failed responses into MintApiError. Generated clients enable this by default. */
162
+ typedErrors?: boolean
144
163
  }
145
164
 
146
165
  export interface UseApiReturn {
@@ -187,11 +206,35 @@ export function useApi(options: ApiClientOptions = {}): UseApiReturn {
187
206
  })
188
207
  apiClient.interceptors.response.use(
189
208
  (response) => response,
190
- (error: unknown) => {
191
- if (axios.isAxiosError(error) && error.response?.status === 401) {
209
+ async (error: unknown) => {
210
+ if (axios.isAxiosError(error) && error.response) {
192
211
  const request = error.config as MintInternalAxiosRequestConfig | undefined
193
- if (request?._mintSkipAuth !== true) {
194
- return Promise.reject(authenticationRequiredError(error, request?._mintAuthToken))
212
+ if (request?._mintTypedErrors) {
213
+ let payload: unknown = error.response.data
214
+ if (payload instanceof Blob) {
215
+ try {
216
+ payload = JSON.parse(await payload.text())
217
+ } catch {
218
+ // Keep non-JSON download errors available as the original body.
219
+ }
220
+ }
221
+ const typed = mintApiErrorFromResponse(
222
+ error.response.status,
223
+ payload,
224
+ {
225
+ requestId: String(error.response.headers?.['x-request-id'] ?? '') || null,
226
+ cause: error,
227
+ },
228
+ )
229
+ if (error.response.status === 401 && request._mintSkipAuth !== true) {
230
+ return Promise.reject(authenticationRequiredError(error, request._mintAuthToken, typed))
231
+ }
232
+ return Promise.reject(typed)
233
+ }
234
+ if (error.response.status === 401) {
235
+ if (request?._mintSkipAuth !== true) {
236
+ return Promise.reject(authenticationRequiredError(error, request?._mintAuthToken))
237
+ }
195
238
  }
196
239
  }
197
240
  return Promise.reject(error)
@@ -213,6 +256,7 @@ export function useApi(options: ApiClientOptions = {}): UseApiReturn {
213
256
  const base: MintAxiosRequestConfig = {
214
257
  baseURL: getBaseUrl(),
215
258
  timeout: options.timeout ?? settingsStore.requestTimeout,
259
+ _mintTypedErrors: options.typedErrors,
216
260
  ...config,
217
261
  }
218
262
  // Strip auth header if explicitly disabled
@@ -165,7 +165,11 @@ function defaultTransformError(error: unknown): AsyncError {
165
165
  * const handleSubmit = () => submit(new FormData(formRef.value))
166
166
  * ```
167
167
  */
168
- /** Wraps an async function with reactive loading, error, and success state plus optional auto-execute. */
168
+ /**
169
+ * Wraps an async function with reactive loading, error, and success state plus optional auto-execute.
170
+ *
171
+ * @deprecated Unused by the MINT platform and scheduled for removal in MINT 1.3; use `useRequestSyncState()` instead.
172
+ */
169
173
  export function useAsync<T>(
170
174
  asyncFn: (...args: unknown[]) => Promise<T>,
171
175
  options: UseAsyncOptions<T> = {}
@@ -93,6 +93,7 @@ export function useAuth(): UseAuthReturn {
93
93
  passkey_enabled: boolean
94
94
  passkey_registered?: boolean
95
95
  registration_enabled?: boolean
96
+ database_mode?: string
96
97
  access?: {
97
98
  experiment_visibility_mode?: 'open' | 'restricted'
98
99
  experimentVisibilityMode?: 'open' | 'restricted'
@@ -104,6 +105,7 @@ export function useAuth(): UseAuthReturn {
104
105
  passkeyEnabled: response.data.passkey_enabled,
105
106
  passkeyRegistered: response.data.passkey_registered ?? false,
106
107
  registrationEnabled: response.data.registration_enabled ?? false,
108
+ databaseMode: response.data.database_mode ?? 'none',
107
109
  experimentVisibilityMode:
108
110
  response.data.access?.experiment_visibility_mode
109
111
  ?? response.data.access?.experimentVisibilityMode
@@ -119,6 +121,7 @@ export function useAuth(): UseAuthReturn {
119
121
  passkeyEnabled: false,
120
122
  passkeyRegistered: false,
121
123
  registrationEnabled: false,
124
+ databaseMode: 'none',
122
125
  experimentVisibilityMode: 'open',
123
126
  }
124
127
  }
@@ -27,6 +27,9 @@ import {
27
27
  type BioTemplateWorkspaceBindings,
28
28
  type UseBioTemplateWorkspaceReturn,
29
29
  } from './useBioTemplateWorkspace'
30
+ import {
31
+ liftWorkspaceComponentBindings,
32
+ } from './flattenWorkspaceBindings'
30
33
  import type {
31
34
  BioTemplateComponentBinding,
32
35
  BioTemplateComponentBindingsById,
@@ -120,14 +123,17 @@ export function useBioTemplatePackWorkspace(
120
123
  const pillNav = computed(() => workspace.value.pillNav)
121
124
  const topBarSettings = computed(() => workspace.value.topBarSettings)
122
125
  const bindings = computed(() => workspace.value.bindings)
123
- const componentBindings = computed(() => workspace.value.componentBindings)
124
- const componentBindingsById = computed(() => workspace.value.componentBindingsById)
125
- const componentImports = computed(() => workspace.value.componentImports)
126
- const componentProps = computed(() => workspace.value.componentProps)
127
- const componentPropsById = computed(() => workspace.value.componentPropsById)
128
- const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent)
129
- const componentSnippets = computed(() => workspace.value.componentSnippets)
130
- const componentUsage = computed(() => workspace.value.componentUsage)
126
+ const {
127
+ componentBindings,
128
+ componentBindingsById,
129
+ componentImports,
130
+ componentProps,
131
+ componentPropsById,
132
+ componentPropsByComponent,
133
+ componentSnippets,
134
+ componentUsage,
135
+ getComponentProps: getWorkspaceComponentProps,
136
+ } = liftWorkspaceComponentBindings(workspace)
131
137
 
132
138
  watch(collection, value => {
133
139
  workspaceRef.value = createWorkspace(value)
@@ -181,7 +187,7 @@ export function useBioTemplatePackWorkspace(
181
187
  componentPropsByComponent,
182
188
  componentSnippets,
183
189
  componentUsage,
184
- getComponentProps: (component, options) => workspace.value.getComponentProps(component, options),
190
+ getComponentProps: getWorkspaceComponentProps,
185
191
  applyCollection,
186
192
  resetToDefaultCollection,
187
193
  save: templateCollection.save,
@@ -34,6 +34,9 @@ import {
34
34
  type BioTemplateRendererBinding,
35
35
  type UseBioTemplateWorkspaceReturn,
36
36
  } from './useBioTemplateWorkspace'
37
+ import {
38
+ liftWorkspaceComponentBindings,
39
+ } from './flattenWorkspaceBindings'
37
40
  import type {
38
41
  BioTemplateComponentBinding,
39
42
  BioTemplateComponentBindingsById,
@@ -138,14 +141,17 @@ export function useBioTemplatePresetWorkspace(
138
141
  const collection = templateCollection.templateCollection
139
142
  const workspace = computed(() => useBioTemplateWorkspace(collection.value, resolvedControlOptions))
140
143
  const renderer = computed<BioTemplateRendererBinding>(() => ({ target: collection.value }))
141
- const componentBindings = computed(() => workspace.value.componentBindings)
142
- const componentBindingsById = computed(() => workspace.value.componentBindingsById)
143
- const componentImports = computed(() => workspace.value.componentImports)
144
- const componentProps = computed(() => workspace.value.componentProps)
145
- const componentPropsById = computed(() => workspace.value.componentPropsById)
146
- const componentPropsByComponent = computed(() => workspace.value.componentPropsByComponent)
147
- const componentSnippets = computed(() => workspace.value.componentSnippets)
148
- const componentUsage = computed(() => workspace.value.componentUsage)
144
+ const {
145
+ componentBindings,
146
+ componentBindingsById,
147
+ componentImports,
148
+ componentProps,
149
+ componentPropsById,
150
+ componentPropsByComponent,
151
+ componentSnippets,
152
+ componentUsage,
153
+ getComponentProps,
154
+ } = liftWorkspaceComponentBindings(workspace)
149
155
  const form = reactive({
150
156
  ...controls.form,
151
157
  modelValue: controlValues.value,
@@ -179,13 +185,6 @@ export function useBioTemplatePresetWorkspace(
179
185
  ...topBarSettings,
180
186
  }))
181
187
 
182
- function getComponentProps(
183
- component: string,
184
- options?: Parameters<UseBioTemplateWorkspaceReturn['getComponentProps']>[1],
185
- ) {
186
- return workspace.value.getComponentProps(component, options)
187
- }
188
-
189
188
  const bindings: BioTemplatePresetWorkspaceBindings = {
190
189
  renderer,
191
190
  form,
@@ -21,16 +21,12 @@ import {
21
21
  } from './useBioTemplateControls'
22
22
  import {
23
23
  useBioTemplateComponents,
24
- type BioTemplateComponentBinding,
25
- type BioTemplateComponentBindingsById,
26
- type BioTemplateComponentImport,
27
- type BioTemplateComponentPropsByComponent,
28
- type BioTemplateComponentPropsBinding,
29
- type BioTemplateComponentPropsById,
30
- type BioTemplateComponentSnippet,
31
- type BioTemplateComponentUsage,
32
24
  type UseBioTemplateComponentsReturn,
33
25
  } from './useBioTemplateComponents'
26
+ import {
27
+ flattenWorkspaceComponentBindings,
28
+ type BioTemplateWorkspaceComponentBindings,
29
+ } from './flattenWorkspaceBindings'
34
30
 
35
31
  export type BioTemplateWorkspaceTarget = BioTemplateControlTarget
36
32
 
@@ -38,24 +34,16 @@ export interface BioTemplateRendererBinding {
38
34
  target: BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope
39
35
  }
40
36
 
41
- export interface BioTemplateWorkspaceBindings {
37
+ export interface BioTemplateWorkspaceBindings extends BioTemplateWorkspaceComponentBindings {
42
38
  renderer: BioTemplateRendererBinding | null
43
39
  form: ControlWorkspaceFormBinding
44
40
  sidebar: ControlWorkspaceSidebarBinding
45
41
  topBar: UseControlWorkspaceReturn<BioTemplateControlSchema>['bindings']['topBar']
46
42
  topBarSettings: ControlWorkspaceTopBarSettingsBinding
47
43
  pillNav: ControlWorkspacePillNavBinding
48
- componentBindings: BioTemplateComponentBinding[]
49
- componentBindingsById: BioTemplateComponentBindingsById
50
- componentProps: BioTemplateComponentPropsBinding[]
51
- componentPropsById: BioTemplateComponentPropsById
52
- componentPropsByComponent: BioTemplateComponentPropsByComponent
53
- componentSnippets: BioTemplateComponentSnippet[]
54
- componentUsage: BioTemplateComponentUsage | null
55
- getComponentProps: UseBioTemplateComponentsReturn['getComponentProps']
56
44
  }
57
45
 
58
- export interface UseBioTemplateWorkspaceReturn {
46
+ export interface UseBioTemplateWorkspaceReturn extends BioTemplateWorkspaceComponentBindings {
59
47
  target: BioTemplateWorkspaceTarget
60
48
  controls: UseControlSchemaReturn<BioTemplateControlSchema>
61
49
  workspace: UseControlWorkspaceReturn<BioTemplateControlSchema>
@@ -70,15 +58,6 @@ export interface UseBioTemplateWorkspaceReturn {
70
58
  topBarSettings: ControlWorkspaceTopBarSettingsBinding
71
59
  bindings: BioTemplateWorkspaceBindings
72
60
  renderer: BioTemplateRendererBinding | null
73
- componentBindings: BioTemplateComponentBinding[]
74
- componentBindingsById: BioTemplateComponentBindingsById
75
- componentImports: BioTemplateComponentImport[]
76
- componentProps: BioTemplateComponentPropsBinding[]
77
- componentPropsById: BioTemplateComponentPropsById
78
- componentPropsByComponent: BioTemplateComponentPropsByComponent
79
- componentSnippets: BioTemplateComponentSnippet[]
80
- componentUsage: BioTemplateComponentUsage | null
81
- getComponentProps: UseBioTemplateComponentsReturn['getComponentProps']
82
61
  }
83
62
 
84
63
  /** One-stop wiring for BioTemplateRenderer, FormBuilder, AppSidebar, and template-aware SDK components. */
@@ -90,21 +69,25 @@ export function useBioTemplateWorkspace(
90
69
  const workspace = useControlWorkspace(controls.controls, options)
91
70
  const components = useBioTemplateComponents(target)
92
71
  const renderer = isTemplateObjectTarget(target) ? { target } : null
93
- const bindings: BioTemplateWorkspaceBindings = {
94
- renderer,
95
- form: workspace.bindings.form,
96
- sidebar: workspace.bindings.sidebar,
97
- topBar: workspace.bindings.topBar,
98
- topBarSettings: workspace.bindings.topBarSettings,
99
- pillNav: workspace.bindings.pillNav,
72
+ const componentBindings = flattenWorkspaceComponentBindings({
100
73
  componentBindings: components.bindings,
101
74
  componentBindingsById: components.componentBindingsById,
75
+ componentImports: components.imports,
102
76
  componentProps: components.componentProps,
103
77
  componentPropsById: components.componentPropsById,
104
78
  componentPropsByComponent: components.componentPropsByComponent,
105
79
  componentSnippets: components.snippets,
106
80
  componentUsage: components.usage,
107
81
  getComponentProps: components.getComponentProps,
82
+ })
83
+ const bindings: BioTemplateWorkspaceBindings = {
84
+ renderer,
85
+ form: workspace.bindings.form,
86
+ sidebar: workspace.bindings.sidebar,
87
+ topBar: workspace.bindings.topBar,
88
+ topBarSettings: workspace.bindings.topBarSettings,
89
+ pillNav: workspace.bindings.pillNav,
90
+ ...componentBindings,
108
91
  }
109
92
 
110
93
  return {
@@ -122,15 +105,7 @@ export function useBioTemplateWorkspace(
122
105
  topBarSettings: workspace.topBarSettings,
123
106
  bindings,
124
107
  renderer,
125
- componentBindings: components.bindings,
126
- componentBindingsById: components.componentBindingsById,
127
- componentImports: components.imports,
128
- componentProps: components.componentProps,
129
- componentPropsById: components.componentPropsById,
130
- componentPropsByComponent: components.componentPropsByComponent,
131
- componentSnippets: components.snippets,
132
- componentUsage: components.usage,
133
- getComponentProps: components.getComponentProps,
108
+ ...componentBindings,
134
109
  }
135
110
  }
136
111
 
@@ -31,7 +31,11 @@ export interface UseCommandHistoryReturn<TCommand extends CommandHistoryCommand
31
31
  clear: () => void
32
32
  }
33
33
 
34
- /** Generic command-stack state for plugin editors with undo/redo controls. */
34
+ /**
35
+ * Generic command-stack state for plugin editors with undo/redo controls.
36
+ *
37
+ * @deprecated Unused by the MINT platform and scheduled for removal in MINT 1.3; keep command stacks plugin-local.
38
+ */
35
39
  export function useCommandHistory<TCommand extends CommandHistoryCommand = CommandHistoryCommand>(
36
40
  options: UseCommandHistoryOptions = {},
37
41
  ): UseCommandHistoryReturn<TCommand> {
@@ -1,10 +1,18 @@
1
- import { ref, type Ref } from 'vue'
1
+ import { nextTick, ref, type Ref } from 'vue'
2
2
  import { useEventListener } from './useEventListener'
3
3
 
4
4
  export interface UseDropdownStateOptions {
5
5
  closeOnOutsideClick?: boolean
6
6
  closeOnEscape?: boolean
7
+ /** Close the panel when the page scrolls or the viewport resizes. Default `false`. */
8
+ closeOnScroll?: boolean
7
9
  insideRefs?: Array<Ref<HTMLElement | null>>
10
+ /**
11
+ * Element focus returns to when the panel closes with `close(true)` (Escape).
12
+ * Pass one when the trigger lives outside `rootRef`; otherwise bind the
13
+ * returned `triggerRef` to the trigger element.
14
+ */
15
+ triggerRef?: Ref<HTMLElement | null>
8
16
  onOpen?: () => void
9
17
  onClose?: () => void
10
18
  }
@@ -12,19 +20,29 @@ export interface UseDropdownStateOptions {
12
20
  export interface UseDropdownStateReturn {
13
21
  isOpen: Ref<boolean>
14
22
  rootRef: Ref<HTMLElement | null>
23
+ /** Bind to the trigger element so Escape can return focus to it. */
24
+ triggerRef: Ref<HTMLElement | null>
15
25
  open: () => void
16
- close: () => void
26
+ /** Closes the panel; `returnFocus` moves focus back to `triggerRef`. */
27
+ close: (returnFocus?: boolean) => void
17
28
  toggle: () => void
18
29
  handleClickOutside: (event: MouseEvent) => void
19
30
  handleKeydown: (event: KeyboardEvent) => void
20
31
  }
21
32
 
22
- /** Shared disclosure state for dropdown-style SDK components. */
33
+ /**
34
+ * Shared disclosure state for dropdown-style SDK components: open/close state,
35
+ * outside-click and Escape closing, optional scroll/resize closing, and focus
36
+ * return to the trigger. `close(returnFocus)` mirrors `useMenuKeyboard`'s
37
+ * contract, so the two compose directly.
38
+ */
23
39
  export function useDropdownState(options: UseDropdownStateOptions = {}): UseDropdownStateReturn {
24
40
  const isOpen = ref(false)
25
41
  const rootRef = ref<HTMLElement | null>(null)
42
+ const triggerRef = options.triggerRef ?? ref<HTMLElement | null>(null)
26
43
  const closeOnOutsideClick = options.closeOnOutsideClick ?? true
27
44
  const closeOnEscape = options.closeOnEscape ?? true
45
+ const closeOnScroll = options.closeOnScroll ?? false
28
46
 
29
47
  function open(): void {
30
48
  if (isOpen.value) return
@@ -32,10 +50,13 @@ export function useDropdownState(options: UseDropdownStateOptions = {}): UseDrop
32
50
  options.onOpen?.()
33
51
  }
34
52
 
35
- function close(): void {
53
+ function close(returnFocus = false): void {
36
54
  if (!isOpen.value) return
37
55
  isOpen.value = false
38
56
  options.onClose?.()
57
+ if (returnFocus) {
58
+ void nextTick(() => triggerRef.value?.focus())
59
+ }
39
60
  }
40
61
 
41
62
  function toggle(): void {
@@ -60,20 +81,29 @@ export function useDropdownState(options: UseDropdownStateOptions = {}): UseDrop
60
81
 
61
82
  function handleKeydown(event: KeyboardEvent): void {
62
83
  if (closeOnEscape && event.key === 'Escape') {
63
- close()
84
+ close(true)
64
85
  }
65
86
  }
66
87
 
88
+ function handleViewportChange(): void {
89
+ if (isOpen.value) close()
90
+ }
91
+
67
92
  if (closeOnOutsideClick) {
68
93
  useEventListener(() => document, 'click', handleClickOutside)
69
94
  }
70
95
  if (closeOnEscape) {
71
96
  useEventListener(() => document, 'keydown', handleKeydown)
72
97
  }
98
+ if (closeOnScroll) {
99
+ useEventListener(() => window, 'scroll', handleViewportChange, true)
100
+ useEventListener(() => window, 'resize', handleViewportChange)
101
+ }
73
102
 
74
103
  return {
75
104
  isOpen,
76
105
  rootRef,
106
+ triggerRef,
77
107
  open,
78
108
  close,
79
109
  toggle,
@@ -7,6 +7,7 @@ import {
7
7
  shallowRef,
8
8
  type Ref,
9
9
  } from 'vue'
10
+ import { tryUseSettingsStore } from '../stores/settings'
10
11
 
11
12
  export type EventStreamTransport = (
12
13
  input: RequestInfo | URL,
@@ -26,7 +27,16 @@ export interface EventStreamOptions<TData = string> {
26
27
  headers?: HeadersInit
27
28
  credentials?: RequestCredentials
28
29
  immediate?: boolean
30
+ /**
31
+ * Reconnect after a dropped stream. Left unset, it follows the platform's
32
+ * `wsAutoReconnect` setting, defaulting to `true` without a settings store.
33
+ */
29
34
  reconnect?: boolean
35
+ /**
36
+ * Delay before the first reconnect attempt. Left unset, it follows the
37
+ * platform's `wsReconnectInterval` setting, defaulting to 2000 ms without a
38
+ * settings store. A server-sent `retry:` field still overrides it.
39
+ */
30
40
  reconnectDelayMs?: number
31
41
  parseJson?: boolean
32
42
  shouldReconnect?: (cause?: unknown) => boolean
@@ -114,7 +124,9 @@ export function useEventStream<TData = string>(
114
124
  let controller: AbortController | null = null
115
125
  let reader: ReadableStreamDefaultReader<Uint8Array> | null = null
116
126
  let reconnectTimer: ReturnType<typeof setTimeout> | null = null
117
- let reconnectDelayMs = options.reconnectDelayMs ?? 2_000
127
+ const settings = tryUseSettingsStore()
128
+ const reconnectEnabled = options.reconnect ?? settings?.wsAutoReconnect ?? true
129
+ let reconnectDelayMs = options.reconnectDelayMs ?? settings?.wsReconnectInterval ?? 2_000
118
130
  let stopped = true
119
131
  let generation = 0
120
132
 
@@ -135,7 +147,7 @@ export function useEventStream<TData = string>(
135
147
 
136
148
  function scheduleReconnect(connectionGeneration: number, cause?: unknown): void {
137
149
  if (stopped || generation !== connectionGeneration) return
138
- if (options.reconnect === false || options.shouldReconnect?.(cause) === false) {
150
+ if (!reconnectEnabled || options.shouldReconnect?.(cause) === false) {
139
151
  stopped = true
140
152
  return
141
153
  }