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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/README.md +225 -6
  2. package/dist/__tests__/components/ActionItem.test.d.ts +1 -0
  3. package/dist/__tests__/components/AppAvatarMenu.test.d.ts +1 -0
  4. package/dist/__tests__/components/AppPageSelector.test.d.ts +1 -0
  5. package/dist/__tests__/components/AppPillNav.test.d.ts +1 -0
  6. package/dist/__tests__/components/AppPluginSwitcher.test.d.ts +1 -0
  7. package/dist/__tests__/components/AppToastContainer.test.d.ts +1 -0
  8. package/dist/__tests__/components/BaseRadioGroup.test.d.ts +1 -0
  9. package/dist/__tests__/components/BaseSelect.test.d.ts +1 -0
  10. package/dist/__tests__/components/BaseTabs.test.d.ts +1 -0
  11. package/dist/__tests__/components/BatchProgressList.test.d.ts +1 -0
  12. package/dist/__tests__/components/BioTemplateExperimentWorkspaceView.test.d.ts +1 -0
  13. package/dist/__tests__/components/BioTemplatePackWorkspaceView.test.d.ts +1 -0
  14. package/dist/__tests__/components/BioTemplatePresetWorkspaceView.test.d.ts +1 -0
  15. package/dist/__tests__/components/BioTemplateRenderer.test.d.ts +1 -0
  16. package/dist/__tests__/components/Breadcrumb.test.d.ts +1 -0
  17. package/dist/__tests__/components/CalendarGridPanel.test.d.ts +1 -0
  18. package/dist/__tests__/components/ComponentBindingRenderer.test.d.ts +1 -0
  19. package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
  20. package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
  21. package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
  22. package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
  23. package/dist/__tests__/components/DoseDesignWorkspaceView.test.d.ts +1 -0
  24. package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
  25. package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
  26. package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
  27. package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
  28. package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
  29. package/dist/__tests__/components/PluginWorkspaceView.test.d.ts +1 -0
  30. package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
  31. package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
  32. package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
  33. package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
  34. package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
  35. package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
  36. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  37. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  38. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  39. package/dist/__tests__/composables/experiment-utils.test.d.ts +1 -0
  40. package/dist/__tests__/composables/useApi.test.d.ts +1 -0
  41. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  42. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  43. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  44. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  45. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  46. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  47. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  48. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  49. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  50. package/dist/__tests__/composables/useExperimentData.test.d.ts +1 -0
  51. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  52. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  53. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  54. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  55. package/dist/__tests__/composables/usePluginConfig.test.d.ts +1 -0
  56. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  57. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  58. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  59. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  60. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  61. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  62. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  63. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  64. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  65. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  66. package/dist/{auth-DsI0rQ7_.js → auth-QQj2kkze.js} +12 -5
  67. package/dist/auth-QQj2kkze.js.map +1 -0
  68. package/dist/components/AppAvatarMenu.vue.d.ts +2 -7
  69. package/dist/components/AppContainer.vue.d.ts +1 -1
  70. package/dist/components/AppLayout.vue.d.ts +20 -1
  71. package/dist/components/AppSidebar.vue.d.ts +111 -6
  72. package/dist/components/AppTopBar.vue.d.ts +35 -22
  73. package/dist/components/BaseButton.vue.d.ts +1 -1
  74. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  75. package/dist/components/BaseInput.vue.d.ts +2 -2
  76. package/dist/components/BasePill.vue.d.ts +2 -2
  77. package/dist/components/BaseRadioGroup.vue.d.ts +3 -3
  78. package/dist/components/BaseSelect.vue.d.ts +3 -3
  79. package/dist/components/BaseTabs.vue.d.ts +2 -2
  80. package/dist/components/BaseTextarea.vue.d.ts +1 -1
  81. package/dist/components/BaseToggle.vue.d.ts +1 -1
  82. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +119 -0
  83. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +93 -0
  84. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +87 -0
  85. package/dist/components/BioTemplateRenderer.vue.d.ts +29 -0
  86. package/dist/components/Breadcrumb.vue.d.ts +2 -2
  87. package/dist/components/Calendar.vue.d.ts +1 -1
  88. package/dist/components/CollapsibleCard.vue.d.ts +1 -1
  89. package/dist/components/ComponentBindingRenderer.vue.d.ts +44 -0
  90. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  91. package/dist/components/ConfirmDialog.vue.d.ts +2 -2
  92. package/dist/components/ControlWorkspaceView.vue.d.ts +147 -0
  93. package/dist/components/DatePicker.vue.d.ts +1 -1
  94. package/dist/components/DateTimePicker.vue.d.ts +3 -3
  95. package/dist/components/Divider.vue.d.ts +1 -1
  96. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +149 -0
  97. package/dist/components/DropdownButton.vue.d.ts +3 -3
  98. package/dist/components/EmptyState.vue.d.ts +1 -2
  99. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  100. package/dist/components/ExperimentTimeline.vue.d.ts +2 -2
  101. package/dist/components/FileUploader.vue.d.ts +1 -1
  102. package/dist/components/FitPanel.vue.d.ts +1 -1
  103. package/dist/components/FormActions.vue.d.ts +4 -4
  104. package/dist/components/FormBuilder.vue.d.ts +31 -17
  105. package/dist/components/FormulaInput.vue.d.ts +2 -2
  106. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  107. package/dist/components/MultiSelect.vue.d.ts +3 -3
  108. package/dist/components/NumberInput.vue.d.ts +1 -1
  109. package/dist/components/PlateMapEditor.vue.d.ts +1 -1
  110. package/dist/components/PluginWorkspaceView.vue.d.ts +310 -0
  111. package/dist/components/ProgressBar.vue.d.ts +1 -1
  112. package/dist/components/ProtocolStepEditor.vue.d.ts +3 -1
  113. package/dist/components/RackEditor.vue.d.ts +2 -2
  114. package/dist/components/SampleLegend.vue.d.ts +2 -2
  115. package/dist/components/ScheduleCalendar.vue.d.ts +2 -2
  116. package/dist/components/SegmentedControl.vue.d.ts +2 -2
  117. package/dist/components/SequenceInput.vue.d.ts +3 -3
  118. package/dist/components/SettingsModal.vue.d.ts +14 -6
  119. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  120. package/dist/components/TagsInput.vue.d.ts +3 -2
  121. package/dist/components/TimePicker.vue.d.ts +3 -3
  122. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  123. package/dist/components/UnitInput.vue.d.ts +2 -2
  124. package/dist/components/WellPlate.vue.d.ts +6 -6
  125. package/dist/components/index.d.ts +9 -8
  126. package/dist/components/index.js +3 -3
  127. package/dist/components/{SettingsButton.vue.d.ts → internal/ActionItemInternal.vue.d.ts} +11 -9
  128. package/dist/components/{AppPageSelector.vue.d.ts → internal/AppPageSelectorInternal.vue.d.ts} +3 -6
  129. package/dist/components/{AppPillNav.vue.d.ts → internal/AppPillNavInternal.vue.d.ts} +4 -2
  130. package/dist/components/internal/CalendarGridPanelInternal.vue.d.ts +25 -0
  131. package/dist/components/{FormFieldRenderer.vue.d.ts → internal/FormFieldRendererInternal.vue.d.ts} +2 -2
  132. package/dist/components/{FormSection.vue.d.ts → internal/FormSectionRenderer.vue.d.ts} +7 -7
  133. package/dist/components/{WellEditPopup.vue.d.ts → internal/WellEditPopupInternal.vue.d.ts} +1 -1
  134. package/dist/{components-_XqPEhP9.js → components-BkGF4B4y.js} +9760 -8471
  135. package/dist/components-BkGF4B4y.js.map +1 -0
  136. package/dist/composables/experiment-utils.d.ts +8 -0
  137. package/dist/composables/index.d.ts +22 -5
  138. package/dist/composables/index.js +4 -3
  139. package/dist/composables/platformContextHelpers.d.ts +14 -0
  140. package/dist/composables/useAppExperiment.d.ts +31 -2
  141. package/dist/composables/useBioTemplateComponents.d.ts +22 -0
  142. package/dist/composables/useBioTemplateControls.d.ts +6 -0
  143. package/dist/composables/useBioTemplatePackWorkspace.d.ts +46 -0
  144. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +75 -0
  145. package/dist/composables/useBioTemplateWorkspace.d.ts +51 -0
  146. package/dist/composables/useCalendarGrid.d.ts +26 -0
  147. package/dist/composables/useControlSchema.d.ts +343 -0
  148. package/dist/composables/useDebouncedWatch.d.ts +20 -0
  149. package/dist/composables/useDropdownState.d.ts +19 -0
  150. package/dist/composables/useEventListener.d.ts +13 -0
  151. package/dist/composables/useExpansionSet.d.ts +21 -0
  152. package/dist/composables/useExperimentData.d.ts +10 -0
  153. package/dist/composables/useExperimentSave.d.ts +31 -2
  154. package/dist/composables/useExperimentSelector.d.ts +20 -0
  155. package/dist/composables/useForm.d.ts +2 -0
  156. package/dist/composables/useGroupAssignment.d.ts +31 -0
  157. package/dist/composables/useListSelection.d.ts +35 -0
  158. package/dist/composables/usePlatformContext.d.ts +21 -3
  159. package/dist/composables/usePluginClient.d.ts +112 -0
  160. package/dist/composables/usePluginConfig.d.ts +12 -0
  161. package/dist/composables/useRequestSyncState.d.ts +34 -0
  162. package/dist/composables/useSampleGroups.d.ts +32 -0
  163. package/dist/composables/useSelectionLimit.d.ts +17 -0
  164. package/dist/composables/useSortedItems.d.ts +32 -0
  165. package/dist/composables/useTemplateCollection.d.ts +58 -0
  166. package/dist/composables/useTextSearch.d.ts +18 -0
  167. package/dist/composables/useTimeUtils.d.ts +8 -0
  168. package/dist/{composables-tiZqLu1M.js → composables-CHsME9H1.js} +240 -146
  169. package/dist/composables-CHsME9H1.js.map +1 -0
  170. package/dist/index.d.ts +6 -4
  171. package/dist/index.js +6 -5
  172. package/dist/install.d.ts +7 -2
  173. package/dist/install.js +2 -2
  174. package/dist/install.js.map +1 -1
  175. package/dist/stores/index.js +1 -1
  176. package/dist/stores/settings.d.ts +4 -1
  177. package/dist/styles.css +4746 -5514
  178. package/dist/templates/adapters.d.ts +43 -0
  179. package/dist/templates/builders.d.ts +63 -0
  180. package/dist/templates/catalog.d.ts +188 -0
  181. package/dist/templates/componentBindings.d.ts +71 -0
  182. package/dist/templates/controlSchemas.d.ts +25 -0
  183. package/dist/templates/index.d.ts +15 -0
  184. package/dist/templates/index.js +2 -0
  185. package/dist/templates/lookup.d.ts +4 -0
  186. package/dist/templates/packs.d.ts +18 -0
  187. package/dist/templates/presets.d.ts +90 -0
  188. package/dist/templates/types.d.ts +531 -0
  189. package/dist/templates-B5jmTWuk.js +9388 -0
  190. package/dist/templates-B5jmTWuk.js.map +1 -0
  191. package/dist/types/components.d.ts +26 -23
  192. package/dist/types/form-builder.d.ts +6 -8
  193. package/dist/types/index.d.ts +2 -2
  194. package/dist/types/platform.d.ts +7 -1
  195. package/dist/useScheduleDrag-BgzpQT53.js +4414 -0
  196. package/dist/useScheduleDrag-BgzpQT53.js.map +1 -0
  197. package/dist/utils/formModelSync.d.ts +5 -0
  198. package/dist/utils/items.d.ts +8 -0
  199. package/dist/utils/options.d.ts +6 -0
  200. package/dist/utils/pluginIcon.d.ts +9 -0
  201. package/package.json +7 -2
  202. package/src/__tests__/components/ActionItem.test.ts +99 -0
  203. package/src/__tests__/components/AppAvatarMenu.test.ts +27 -0
  204. package/src/__tests__/components/AppLayout.test.ts +44 -0
  205. package/src/__tests__/components/AppPageSelector.test.ts +134 -0
  206. package/src/__tests__/components/AppPillNav.test.ts +125 -0
  207. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  208. package/src/__tests__/components/AppSidebar.test.ts +496 -0
  209. package/src/__tests__/components/AppToastContainer.test.ts +37 -0
  210. package/src/__tests__/components/AppTopBar.test.ts +455 -9
  211. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  212. package/src/__tests__/components/BaseSelect.test.ts +21 -0
  213. package/src/__tests__/components/BaseTabs.test.ts +25 -0
  214. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  215. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +159 -0
  216. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +175 -0
  217. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +306 -0
  218. package/src/__tests__/components/BioTemplateRenderer.test.ts +71 -0
  219. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  220. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  221. package/src/__tests__/components/ComponentBindingRenderer.test.ts +161 -0
  222. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  223. package/src/__tests__/components/ControlWorkspaceView.test.ts +1102 -0
  224. package/src/__tests__/components/DataFrame.test.ts +11 -0
  225. package/src/__tests__/components/DatePicker.test.ts +45 -0
  226. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  227. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +185 -0
  228. package/src/__tests__/components/DropdownButton.test.ts +23 -0
  229. package/src/__tests__/components/EmptyState.test.ts +23 -0
  230. package/src/__tests__/components/ExperimentPopover.test.ts +56 -0
  231. package/src/__tests__/components/FormBuilder.test.ts +296 -0
  232. package/src/__tests__/components/GroupAssigner.test.ts +30 -0
  233. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  234. package/src/__tests__/components/PluginWorkspaceView.test.ts +548 -0
  235. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  236. package/src/__tests__/components/ReagentList.test.ts +82 -0
  237. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  238. package/src/__tests__/components/SampleSelector.test.ts +60 -0
  239. package/src/__tests__/components/SegmentedControl.test.ts +24 -0
  240. package/src/__tests__/components/SettingsModal.test.ts +296 -0
  241. package/src/__tests__/components/TagsInput.test.ts +75 -0
  242. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  243. package/src/__tests__/components/TimePicker.test.ts +38 -0
  244. package/src/__tests__/composables/experiment-utils.test.ts +30 -0
  245. package/src/__tests__/composables/useApi.test.ts +30 -0
  246. package/src/__tests__/composables/useAppExperiment.test.ts +100 -1
  247. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +125 -0
  248. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  249. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +104 -0
  250. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  251. package/src/__tests__/composables/useControlSchema.test.ts +1033 -0
  252. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  253. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  254. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  255. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  256. package/src/__tests__/composables/useExperimentData.test.ts +4 -0
  257. package/src/__tests__/composables/useExperimentSave.test.ts +203 -8
  258. package/src/__tests__/composables/useExperimentSelector.test.ts +164 -0
  259. package/src/__tests__/composables/useForm.test.ts +58 -0
  260. package/src/__tests__/composables/useFormBuilder.test.ts +77 -0
  261. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  262. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  263. package/src/__tests__/composables/usePluginClient.test.ts +541 -0
  264. package/src/__tests__/composables/usePluginConfig.test.ts +5 -0
  265. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  266. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  267. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  268. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  269. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  270. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  271. package/src/__tests__/composables/useTheme.test.ts +91 -0
  272. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  273. package/src/__tests__/docs/frontendDocsCatalog.test.ts +324 -0
  274. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  275. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  276. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  277. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  278. package/src/__tests__/templates/templates.test.ts +1055 -0
  279. package/src/components/AppAvatarMenu.vue +15 -69
  280. package/src/components/AppLayout.story.vue +64 -25
  281. package/src/components/AppLayout.vue +83 -2
  282. package/src/components/AppPluginSwitcher.vue +41 -145
  283. package/src/components/AppSidebar.story.vue +203 -1
  284. package/src/components/AppSidebar.vue +320 -25
  285. package/src/components/{ToastNotification.story.vue → AppToastContainer.story.vue} +6 -6
  286. package/src/components/{ToastNotification.vue → AppToastContainer.vue} +1 -1
  287. package/src/components/AppTopBar.story.vue +7 -33
  288. package/src/components/AppTopBar.vue +104 -300
  289. package/src/components/BaseModal.vue +3 -5
  290. package/src/components/BaseRadioGroup.vue +7 -3
  291. package/src/components/BaseSelect.vue +11 -7
  292. package/src/components/BaseTabs.vue +6 -4
  293. package/src/components/BatchProgressList.vue +5 -8
  294. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  295. package/src/components/BioTemplateExperimentWorkspaceView.vue +343 -0
  296. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  297. package/src/components/BioTemplatePackWorkspaceView.vue +177 -0
  298. package/src/components/BioTemplatePresetWorkspaceView.story.vue +163 -0
  299. package/src/components/BioTemplatePresetWorkspaceView.vue +401 -0
  300. package/src/components/BioTemplateRenderer.story.vue +57 -0
  301. package/src/components/BioTemplateRenderer.vue +57 -0
  302. package/src/components/Breadcrumb.vue +14 -8
  303. package/src/components/ComponentBindingRenderer.story.vue +57 -0
  304. package/src/components/ComponentBindingRenderer.vue +308 -0
  305. package/src/components/ConcentrationInput.vue +27 -64
  306. package/src/components/ControlWorkspaceView.story.vue +347 -0
  307. package/src/components/ControlWorkspaceView.vue +378 -0
  308. package/src/components/DataFrame.vue +34 -50
  309. package/src/components/DatePicker.vue +59 -192
  310. package/src/components/DateTimePicker.vue +50 -171
  311. package/src/components/DoseDesignWorkspaceView.story.vue +77 -0
  312. package/src/components/DoseDesignWorkspaceView.vue +255 -0
  313. package/src/components/DropdownButton.vue +14 -32
  314. package/src/components/EmptyState.vue +4 -2
  315. package/src/components/ExperimentPopover.vue +7 -28
  316. package/src/components/ExperimentSelectorModal.vue +6 -5
  317. package/src/components/FormBuilder.story.vue +190 -0
  318. package/src/components/FormBuilder.vue +124 -27
  319. package/src/components/GroupAssigner.vue +24 -56
  320. package/src/components/MultiSelect.vue +17 -12
  321. package/src/components/PlateMapEditor.vue +3 -8
  322. package/src/components/PluginIcon.vue +2 -22
  323. package/src/components/PluginWorkspaceView.story.vue +334 -0
  324. package/src/components/PluginWorkspaceView.vue +708 -0
  325. package/src/components/ProtocolStepEditor.vue +13 -22
  326. package/src/components/ReagentList.vue +25 -33
  327. package/src/components/SampleHierarchyTree.vue +12 -23
  328. package/src/components/SampleSelector.vue +42 -122
  329. package/src/components/SegmentedControl.vue +7 -3
  330. package/src/components/SettingsModal.story.vue +88 -1
  331. package/src/components/SettingsModal.vue +120 -29
  332. package/src/components/TagsInput.vue +29 -14
  333. package/src/components/ThemeToggle.vue +9 -7
  334. package/src/components/TimePicker.vue +19 -41
  335. package/src/components/Tooltip.vue +7 -12
  336. package/src/components/WellPlate.vue +6 -12
  337. package/src/components/index.ts +9 -8
  338. package/src/components/internal/ActionItemInternal.vue +82 -0
  339. package/src/components/internal/AppPageSelectorInternal.vue +128 -0
  340. package/src/components/internal/AppPillNavInternal.vue +194 -0
  341. package/src/components/internal/CalendarGridPanelInternal.vue +120 -0
  342. package/src/components/{FormFieldRenderer.vue → internal/FormFieldRendererInternal.vue} +4 -12
  343. package/src/components/{FormSection.vue → internal/FormSectionRenderer.vue} +6 -18
  344. package/src/components/{WellEditPopup.vue → internal/WellEditPopupInternal.vue} +5 -10
  345. package/src/composables/experiment-utils.ts +26 -0
  346. package/src/composables/index.ts +229 -3
  347. package/src/composables/platformContextHelpers.ts +74 -0
  348. package/src/composables/useApi.ts +9 -2
  349. package/src/composables/useAppExperiment.ts +85 -13
  350. package/src/composables/useBioTemplateComponents.ts +105 -0
  351. package/src/composables/useBioTemplateControls.ts +41 -0
  352. package/src/composables/useBioTemplatePackWorkspace.ts +185 -0
  353. package/src/composables/useBioTemplatePresetWorkspace.ts +326 -0
  354. package/src/composables/useBioTemplateWorkspace.ts +141 -0
  355. package/src/composables/useCalendarGrid.ts +140 -0
  356. package/src/composables/useControlSchema.ts +1362 -0
  357. package/src/composables/useDebouncedWatch.ts +119 -0
  358. package/src/composables/useDropdownState.ts +83 -0
  359. package/src/composables/useEventListener.ts +111 -0
  360. package/src/composables/useExpansionSet.ts +117 -0
  361. package/src/composables/useExperimentData.ts +20 -11
  362. package/src/composables/useExperimentSave.ts +202 -50
  363. package/src/composables/useExperimentSelector.ts +86 -72
  364. package/src/composables/useForm.ts +49 -4
  365. package/src/composables/useFormBuilder.ts +93 -42
  366. package/src/composables/useGroupAssignment.ts +148 -0
  367. package/src/composables/useListSelection.ts +158 -0
  368. package/src/composables/usePluginClient.ts +466 -0
  369. package/src/composables/usePluginConfig.ts +34 -13
  370. package/src/composables/useRequestSyncState.ts +126 -0
  371. package/src/composables/useSampleGroups.ts +126 -0
  372. package/src/composables/useSelectionLimit.ts +57 -0
  373. package/src/composables/useSortedItems.ts +118 -0
  374. package/src/composables/useTemplateCollection.ts +229 -0
  375. package/src/composables/useTextSearch.ts +60 -0
  376. package/src/composables/useTheme.ts +2 -28
  377. package/src/composables/useTimeUtils.ts +26 -2
  378. package/src/composables/useWellPlateEditor.ts +13 -9
  379. package/src/index.ts +11 -348
  380. package/src/install.ts +11 -4
  381. package/src/stores/settings.ts +13 -9
  382. package/src/styles/components/app-layout.css +82 -0
  383. package/src/styles/components/app-page-selector.css +23 -0
  384. package/src/styles/components/app-pill-nav.css +77 -0
  385. package/src/styles/components/app-sidebar.css +119 -0
  386. package/src/styles/components/app-top-bar.css +0 -201
  387. package/src/styles/components/concentration-input.css +3 -142
  388. package/src/styles/components/empty-state.css +0 -16
  389. package/src/styles/components/theme-toggle.css +3 -66
  390. package/src/styles/index.css +0 -2
  391. package/src/templates/adapters.ts +785 -0
  392. package/src/templates/builders.ts +2149 -0
  393. package/src/templates/catalog.ts +245 -0
  394. package/src/templates/componentBindings.ts +653 -0
  395. package/src/templates/controlSchemas.ts +718 -0
  396. package/src/templates/index.ts +318 -0
  397. package/src/templates/lookup.ts +18 -0
  398. package/src/templates/packs.ts +156 -0
  399. package/src/templates/presets.ts +146 -0
  400. package/src/templates/types.ts +668 -0
  401. package/src/types/components.ts +39 -27
  402. package/src/types/form-builder.ts +7 -2
  403. package/src/types/index.ts +13 -3
  404. package/src/types/platform.ts +7 -1
  405. package/src/utils/formModelSync.ts +52 -0
  406. package/src/utils/items.ts +28 -0
  407. package/src/utils/options.ts +23 -0
  408. package/src/utils/pluginIcon.ts +30 -0
  409. package/dist/__tests__/composables/usePluginApi.test.d.ts +0 -13
  410. package/dist/auth-DsI0rQ7_.js.map +0 -1
  411. package/dist/components/GroupingModal.vue.d.ts +0 -12
  412. package/dist/components-_XqPEhP9.js.map +0 -1
  413. package/dist/composables/usePluginApi.d.ts +0 -29
  414. package/dist/composables-tiZqLu1M.js.map +0 -1
  415. package/dist/useScheduleDrag-CA9sGNJG.js +0 -7181
  416. package/dist/useScheduleDrag-CA9sGNJG.js.map +0 -1
  417. package/src/__tests__/composables/usePluginApi.test.ts +0 -81
  418. package/src/components/AppPageSelector.vue +0 -159
  419. package/src/components/AppPillNav.vue +0 -66
  420. package/src/components/GroupingModal.story.vue +0 -52
  421. package/src/components/GroupingModal.vue +0 -422
  422. package/src/components/SettingsButton.story.vue +0 -58
  423. package/src/components/SettingsButton.vue +0 -76
  424. package/src/composables/usePluginApi.ts +0 -39
  425. package/src/styles/components/grouping-modal.css +0 -323
  426. package/src/styles/components/settings-button.css +0 -94
  427. /package/dist/components/{ToastNotification.vue.d.ts → AppToastContainer.vue.d.ts} +0 -0
@@ -0,0 +1,708 @@
1
+ <script setup lang="ts">
2
+ /** Standard plugin workspace shell that combines AppLayout, AppTopBar, and AppSidebar with LEAF-style defaults. */
3
+ import { computed, reactive, ref, useSlots, watch } from 'vue'
4
+ import type {
5
+ AccountMenuItem,
6
+ ExperimentSummary,
7
+ PageSelectorItem,
8
+ PageSelectorItemInput,
9
+ PillNavItem,
10
+ PillNavItemInput,
11
+ PluginSwitcherInfo,
12
+ PluginSwitcherPlugin,
13
+ SidebarToolSection,
14
+ TopBarSettingsConfig,
15
+ PillNavOption,
16
+ TopBarVariant,
17
+ } from '../types'
18
+ import type { FormEnhancements, FormSchema } from '../types/form-builder'
19
+ import type {
20
+ ControlComponentBinding,
21
+ ControlComponentBindingsById,
22
+ ControlComponentBindingsConfig,
23
+ ControlComponentPropsByIdMap,
24
+ ControlComponentPropsMap,
25
+ ControlModel,
26
+ ControlModelBinding,
27
+ ControlSchema,
28
+ ControlWorkspaceOptions,
29
+ } from '../composables/useControlSchema'
30
+ import {
31
+ controlValuesToComponentBindings,
32
+ controlValuesToComponentBindingsById,
33
+ controlValuesToComponentProps,
34
+ controlsToViewItems,
35
+ defineControlModel,
36
+ getDefaultControlView,
37
+ getControlDefaults,
38
+ mergeControlWorkspaceOptions,
39
+ } from '../composables/useControlSchema'
40
+ import {
41
+ useAppExperiment,
42
+ type AppExperimentRecord,
43
+ } from '../composables/useAppExperiment'
44
+ import AppLayout from './AppLayout.vue'
45
+ import AppSidebar from './AppSidebar.vue'
46
+ import AppTopBar from './AppTopBar.vue'
47
+
48
+ type SidebarVariant = 'default' | 'analysis'
49
+
50
+ interface Props {
51
+ /** App or plugin title shown in the top bar. */
52
+ title?: string
53
+ /** Secondary copy shown under the title. */
54
+ subtitle?: string
55
+ /** Top bar visual treatment. */
56
+ topBarVariant?: TopBarVariant
57
+ /** Home link used by the top bar brand icon. */
58
+ homePath?: string
59
+ /** Show the default MINT logo when no icon/logo slot is provided. */
60
+ showLogo?: boolean
61
+ /** Preferred route-level page selector entries. */
62
+ pageSelector?: PageSelectorItemInput[]
63
+ /** Active page selector id. Defaults to activeView. */
64
+ currentPageSelectorId?: string
65
+ /** Optional plugin switcher shown in the left navigation position. */
66
+ pluginSwitcher?: PluginSwitcherInfo
67
+ /** Preferred centered navigation for local modes inside the current route. */
68
+ pillNav?: PillNavItemInput[]
69
+ /** Active centered pill id. Defaults to activeView. */
70
+ currentPillId?: string
71
+ /** Show the theme toggle button. */
72
+ showThemeToggle?: boolean
73
+ /** Show the settings button and modal. */
74
+ showSettings?: boolean
75
+ /** Built-in settings modal configuration. */
76
+ settingsConfig?: TopBarSettingsConfig
77
+ /** Show the standalone badge when not integrated into the platform. */
78
+ showStandaloneLabel?: boolean
79
+ /** Custom standalone badge label. */
80
+ standaloneLabel?: string
81
+ /** Account dropdown entries. */
82
+ accountMenu?: AccountMenuItem[]
83
+ /** Show the notifications icon button. */
84
+ showNotifications?: boolean
85
+ /** Draw a notification dot on the notifications icon. */
86
+ hasNotificationDot?: boolean
87
+ /** Show the classic admin shortcut. */
88
+ showAdmin?: boolean
89
+ /** Route used by the classic admin shortcut. */
90
+ adminPath?: string
91
+ /** Show the classic profile button when accountMenu is not provided. */
92
+ showProfile?: boolean
93
+ /** Classic profile display name. */
94
+ userName?: string
95
+ /** Explicit classic profile initial. */
96
+ userInitial?: string
97
+ /** Classic profile email. */
98
+ userEmail?: string
99
+ /** Enable the built-in AppTopBar experiment popover and selector flow. */
100
+ experimentShell?: boolean
101
+ /** Current experiment mirrored into the AppTopBar experiment chip when experimentShell is enabled. */
102
+ experiment?: AppExperimentRecord | null
103
+ /** Save handler used by the AppTopBar experiment chip. Return a message to flash success. */
104
+ experimentSave?: () => string | null | Promise<string | null>
105
+ /** Disable the experiment save action. */
106
+ experimentSaveDisabled?: boolean
107
+ /** Tooltip shown when the experiment save action is disabled. */
108
+ experimentSaveDisabledMessage?: string
109
+
110
+ /** Active workspace view used by top bar navigation and sidebar panels. */
111
+ activeView?: string
112
+ /** Initial active view when activeView is uncontrolled. */
113
+ defaultActiveView?: string
114
+ /** Map of view IDs to sidebar tool sections. */
115
+ panels?: Record<string, SidebarToolSection[]>
116
+ /** Optional FormBuilder schemas keyed by section ID. */
117
+ forms?: Record<string, FormSchema>
118
+ /** Sidebar chrome title. */
119
+ sidebarTitle?: string
120
+ /** Sidebar chrome subtitle. */
121
+ sidebarSubtitle?: string
122
+ /** Optional compact badge/count rendered in the sidebar header. */
123
+ sidebarBadge?: string | number
124
+ /** AppSidebar visual preset. `analysis` matches the LEAF-style MINT analysis sidebar language. */
125
+ sidebarVariant?: SidebarVariant
126
+ /** Sidebar CSS width. Defaults to AppSidebar's variant width. */
127
+ sidebarWidth?: string
128
+ /** Sidebar position in AppLayout. */
129
+ sidebarPosition?: 'left' | 'right'
130
+ /** Convert the sidebar into an SDK-owned mobile overlay below the AppLayout breakpoint. */
131
+ responsiveSidebar?: boolean
132
+ /** Render the sidebar shell even when no panel matches the active view. */
133
+ showSidebarWhenEmpty?: boolean
134
+ /** Disable the built-in sidebar surface entirely. */
135
+ showSidebar?: boolean
136
+ /** DOM id for the AppSidebar scrollable content area. Use with route/tab-owned Teleport sidebars. */
137
+ sidebarContentId?: string
138
+ /** Compact AppSidebar density. */
139
+ dense?: boolean
140
+ /** Show a built-in collapse/expand button in the sidebar chrome. Defaults to AppSidebar's variant behavior. */
141
+ sidebarCollapsible?: boolean
142
+ /** Sidebar width when collapsed. */
143
+ sidebarCollapsedWidth?: string
144
+ /** Accessible label for the sidebar collapse action. */
145
+ sidebarCollapseButtonLabel?: string
146
+ /** Accessible label for the sidebar expand action. */
147
+ sidebarExpandButtonLabel?: string
148
+ /** Floating AppLayout style. */
149
+ floating?: boolean
150
+ /** Optional compact control model for generated sidebar forms. */
151
+ model?: ControlModel | ControlModelBinding
152
+ /** Compact control schema for generated sidebar forms. */
153
+ controls?: ControlSchema
154
+ /** Options passed to compact control schema generation. */
155
+ controlOptions?: ControlWorkspaceOptions
156
+ /** Optional SDK component bindings exposed to the default slot with resolved props. */
157
+ componentBindings?: ControlComponentBindingsConfig
158
+ /** Optional mapping from workspace values to component props exposed to the default slot. */
159
+ componentProps?: ControlComponentPropsMap
160
+ /** Optional named mappings from workspace values to component props exposed to the default slot. */
161
+ componentPropsById?: ControlComponentPropsByIdMap
162
+ /** Shared values for auto-rendered sidebar forms. Supports default v-model. */
163
+ modelValue?: Record<string, unknown>
164
+ /** Shared values for auto-rendered sidebar forms. */
165
+ values?: Record<string, unknown>
166
+ /** Runtime FormBuilder enhancements for auto-rendered sidebar forms. */
167
+ formEnhancements?: FormEnhancements<Record<string, unknown>>
168
+ /** Show submit/cancel actions inside auto-rendered sidebar forms. */
169
+ showFormActions?: boolean
170
+ /** Loading/saving state for auto-rendered sidebar forms. */
171
+ formLoading?: boolean
172
+ /** Disabled state for auto-rendered sidebar forms. */
173
+ formDisabled?: boolean
174
+ /** Readonly state for auto-rendered sidebar forms. */
175
+ formReadonly?: boolean
176
+ /** Size passed to auto-rendered sidebar forms. */
177
+ formSize?: 'sm' | 'md' | 'lg'
178
+ /** Controlled sidebar collapsed state. */
179
+ sidebarCollapsed?: boolean
180
+ /** Initial sidebar collapsed state when uncontrolled. */
181
+ defaultSidebarCollapsed?: boolean
182
+ /** Accessible label for the mobile sidebar toggle. */
183
+ sidebarToggleLabel?: string
184
+ /** Accessible label used when the mobile sidebar is open. */
185
+ sidebarCloseLabel?: string
186
+ }
187
+
188
+ const props = withDefaults(defineProps<Props>(), {
189
+ title: 'Workspace',
190
+ subtitle: undefined,
191
+ topBarVariant: 'card',
192
+ homePath: '/',
193
+ showLogo: true,
194
+ pageSelector: undefined,
195
+ currentPageSelectorId: undefined,
196
+ pluginSwitcher: undefined,
197
+ pillNav: undefined,
198
+ currentPillId: undefined,
199
+ showThemeToggle: false,
200
+ showSettings: false,
201
+ settingsConfig: undefined,
202
+ showStandaloneLabel: true,
203
+ standaloneLabel: 'Standalone',
204
+ accountMenu: undefined,
205
+ showNotifications: false,
206
+ hasNotificationDot: false,
207
+ showAdmin: false,
208
+ adminPath: '/admin',
209
+ showProfile: false,
210
+ userName: undefined,
211
+ userInitial: undefined,
212
+ userEmail: undefined,
213
+ experimentShell: false,
214
+ experiment: undefined,
215
+ experimentSave: undefined,
216
+ experimentSaveDisabled: false,
217
+ experimentSaveDisabledMessage: undefined,
218
+ activeView: undefined,
219
+ defaultActiveView: undefined,
220
+ panels: () => ({}),
221
+ forms: () => ({}),
222
+ sidebarTitle: undefined,
223
+ sidebarSubtitle: undefined,
224
+ sidebarBadge: undefined,
225
+ sidebarVariant: 'analysis',
226
+ sidebarWidth: undefined,
227
+ sidebarPosition: 'left',
228
+ responsiveSidebar: true,
229
+ showSidebarWhenEmpty: false,
230
+ showSidebar: true,
231
+ sidebarContentId: undefined,
232
+ dense: true,
233
+ sidebarCollapsible: undefined,
234
+ sidebarCollapsedWidth: '3rem',
235
+ sidebarCollapseButtonLabel: 'Collapse sidebar',
236
+ sidebarExpandButtonLabel: 'Expand sidebar',
237
+ floating: true,
238
+ model: undefined,
239
+ controls: undefined,
240
+ controlOptions: () => ({}),
241
+ componentBindings: undefined,
242
+ componentProps: undefined,
243
+ componentPropsById: undefined,
244
+ modelValue: undefined,
245
+ values: undefined,
246
+ formEnhancements: undefined,
247
+ showFormActions: false,
248
+ formLoading: false,
249
+ formDisabled: false,
250
+ formReadonly: false,
251
+ formSize: 'sm',
252
+ sidebarCollapsed: undefined,
253
+ defaultSidebarCollapsed: false,
254
+ sidebarToggleLabel: 'Open workspace sidebar',
255
+ sidebarCloseLabel: 'Close workspace sidebar',
256
+ })
257
+
258
+ const emit = defineEmits<{
259
+ 'update:activeView': [value: string]
260
+ 'page-selector-select': [page: PageSelectorItem]
261
+ 'pill-select': [item: PillNavItem]
262
+ 'pill-option-select': [option: PillNavOption, item: PillNavItem]
263
+ 'plugin-switcher-select': [plugin: PluginSwitcherPlugin]
264
+ 'plugin-switcher-install': []
265
+ 'account-menu-select': [item: AccountMenuItem]
266
+ 'sign-out': []
267
+ 'notifications-click': []
268
+ 'settings-values-change': [data: Record<string, unknown>]
269
+ 'profile-click': []
270
+ 'admin-click': []
271
+ 'experiment-select': [experiment: ExperimentSummary]
272
+ 'experiment-detach': []
273
+ 'update:modelValue': [values: Record<string, unknown>]
274
+ 'update:values': [values: Record<string, unknown>]
275
+ 'update:sidebarCollapsed': [value: boolean]
276
+ 'update:toggle': [sectionId: string, value: boolean]
277
+ 'form-submit': [sectionId: string, values: Record<string, unknown>]
278
+ 'form-cancel': [sectionId: string]
279
+ }>()
280
+
281
+ interface PluginWorkspaceSlotProps {
282
+ activeView: string
283
+ setActiveView: (viewId: string) => void
284
+ values: Record<string, unknown>
285
+ componentBindings: ControlComponentBinding[]
286
+ componentBindingsById: ControlComponentBindingsById
287
+ componentProps: Record<string, unknown>
288
+ componentPropsById: Record<string, Record<string, unknown>>
289
+ }
290
+
291
+ type ForwardedSlotProps = Record<string, unknown>
292
+
293
+ defineSlots<{
294
+ default?: (props: PluginWorkspaceSlotProps) => unknown
295
+ topbar?: (props: PluginWorkspaceSlotProps) => unknown
296
+ sidebar?: (props: PluginWorkspaceSlotProps) => unknown
297
+ icon?: (props: ForwardedSlotProps) => unknown
298
+ logo?: (props: ForwardedSlotProps) => unknown
299
+ 'page-selector-icon'?: (props: ForwardedSlotProps) => unknown
300
+ 'page-selector-item-icon'?: (props: ForwardedSlotProps) => unknown
301
+ nav?: (props: ForwardedSlotProps) => unknown
302
+ center?: (props: ForwardedSlotProps) => unknown
303
+ actions?: (props: ForwardedSlotProps) => unknown
304
+ 'account-menu-items'?: (props: ForwardedSlotProps) => unknown
305
+ 'account-menu-item-icon'?: (props: ForwardedSlotProps) => unknown
306
+ 'settings-appearance'?: (props: ForwardedSlotProps) => unknown
307
+ header?: (props: ForwardedSlotProps) => unknown
308
+ collapsed?: (props: ForwardedSlotProps) => unknown
309
+ footer?: (props: ForwardedSlotProps) => unknown
310
+ }>()
311
+
312
+ const topBarForwardedSlots = new Set([
313
+ 'icon',
314
+ 'logo',
315
+ 'page-selector-icon',
316
+ 'page-selector-item-icon',
317
+ 'nav',
318
+ 'center',
319
+ 'actions',
320
+ 'account-menu-items',
321
+ 'account-menu-item-icon',
322
+ 'settings-appearance',
323
+ ])
324
+
325
+ const sidebarForwardedSlots = new Set([
326
+ 'header',
327
+ 'collapsed',
328
+ 'footer',
329
+ ])
330
+
331
+ const slots = useSlots()
332
+ const internalActiveView = ref(props.defaultActiveView)
333
+
334
+ if (props.experimentShell) {
335
+ useAppExperiment({
336
+ experiment: computed(() => props.experiment),
337
+ onSelect: experiment => emit('experiment-select', experiment),
338
+ onSave: props.experimentSave,
339
+ onDetach: () => emit('experiment-detach'),
340
+ saveDisabled: computed(() => props.experimentSaveDisabled),
341
+ saveDisabledMessage: computed(() => props.experimentSaveDisabledMessage),
342
+ })
343
+ }
344
+
345
+ const topBarSlotNames = computed<string[]>(() =>
346
+ Object.keys(slots).filter(name =>
347
+ topBarForwardedSlots.has(name) || name.startsWith('settings-tab-'),
348
+ ),
349
+ )
350
+
351
+ const sidebarSlotNames = computed<string[]>(() =>
352
+ Object.keys(slots).filter(name =>
353
+ sidebarForwardedSlots.has(name) || name.startsWith('section-'),
354
+ ),
355
+ )
356
+
357
+ const resolvedModel = computed<ControlModelBinding | undefined>(() => {
358
+ if (props.model === undefined) return undefined
359
+ return isControlModelBinding(props.model) ? props.model : defineControlModel(props.model)
360
+ })
361
+
362
+ const resolvedControls = computed<ControlSchema | undefined>(() =>
363
+ props.controls ?? resolvedModel.value?.controls,
364
+ )
365
+
366
+ const resolvedControlOptions = computed<ControlWorkspaceOptions>(() =>
367
+ mergeControlWorkspaceOptions(resolvedModel.value?.controlOptions ?? {}, props.controlOptions),
368
+ )
369
+
370
+ const externalControlValues = computed(() => props.modelValue ?? props.values)
371
+ const internalControlValues = reactive<Record<string, unknown>>({})
372
+ let syncingControlValues = false
373
+
374
+ const generatedControlDefaults = computed<Record<string, unknown>>(() => {
375
+ if (!resolvedControls.value) return {}
376
+ return {
377
+ ...getControlDefaults(resolvedControls.value),
378
+ ...(resolvedControlOptions.value.initialValues ?? {}),
379
+ }
380
+ })
381
+
382
+ syncResolvedControlValues()
383
+
384
+ watch(
385
+ [generatedControlDefaults, externalControlValues],
386
+ syncResolvedControlValues,
387
+ { deep: true },
388
+ )
389
+
390
+ watch(
391
+ internalControlValues,
392
+ () => {
393
+ if (syncingControlValues) return
394
+ emitControlValues()
395
+ },
396
+ { deep: true, flush: 'sync' },
397
+ )
398
+
399
+ const resolvedComponentBindings = computed(() =>
400
+ controlValuesToComponentBindings(
401
+ internalControlValues,
402
+ props.componentBindings ?? resolvedModel.value?.componentBindings,
403
+ ),
404
+ )
405
+
406
+ const resolvedComponentBindingsById = computed(() =>
407
+ controlValuesToComponentBindingsById(
408
+ internalControlValues,
409
+ props.componentBindings ?? resolvedModel.value?.componentBindings,
410
+ ),
411
+ )
412
+
413
+ const resolvedComponentProps = computed(() => {
414
+ const mapping = props.componentProps ?? resolvedModel.value?.componentProps
415
+ return mapping === undefined ? {} : controlValuesToComponentProps(internalControlValues, mapping)
416
+ })
417
+
418
+ const resolvedComponentPropsById = computed(() => {
419
+ const mappings = props.componentPropsById ?? resolvedModel.value?.componentPropsById
420
+ if (mappings === undefined) return {}
421
+
422
+ return Object.fromEntries(
423
+ Object.entries(mappings).map(([id, mapping]) => [
424
+ id,
425
+ controlValuesToComponentProps(internalControlValues, mapping),
426
+ ]),
427
+ )
428
+ })
429
+
430
+ const generatedPillNav = computed<PillNavItem[]>(() => {
431
+ if (!resolvedControls.value) return []
432
+ return controlsToViewItems(resolvedControls.value, resolvedControlOptions.value)
433
+ })
434
+
435
+ const generatedDefaultView = computed(() => {
436
+ if (!resolvedControls.value) return ''
437
+ return getDefaultControlView(resolvedControls.value, resolvedControlOptions.value)
438
+ })
439
+
440
+ const resolvedPillNav = computed<PillNavItemInput[] | undefined>(() => {
441
+ if (props.pillNav !== undefined) return props.pillNav
442
+ return generatedPillNav.value.length > 0 ? generatedPillNav.value : undefined
443
+ })
444
+
445
+ const firstConfiguredViewId = computed(() =>
446
+ props.defaultActiveView
447
+ ?? firstItemId(props.pillNav)
448
+ ?? generatedDefaultView.value
449
+ ?? firstItemId(props.pageSelector)
450
+ ?? Object.keys(props.panels)[0]
451
+ ?? '',
452
+ )
453
+
454
+ const resolvedActiveView = computed({
455
+ get: () =>
456
+ props.activeView
457
+ ?? props.currentPillId
458
+ ?? props.currentPageSelectorId
459
+ ?? internalActiveView.value
460
+ ?? firstConfiguredViewId.value,
461
+ set: (value: string) => {
462
+ internalActiveView.value = value
463
+ emit('update:activeView', value)
464
+ },
465
+ })
466
+
467
+ const resolvedCurrentPillId = computed(() => props.currentPillId ?? resolvedActiveView.value)
468
+ const resolvedCurrentPageSelectorId = computed(() => props.currentPageSelectorId ?? resolvedActiveView.value)
469
+
470
+ const hasSidebarSurface = computed(() => {
471
+ if (!props.showSidebar) return false
472
+ return (
473
+ Object.keys(props.panels).length > 0
474
+ || Object.keys(props.forms).length > 0
475
+ || props.model !== undefined
476
+ || props.controls !== undefined
477
+ || props.showSidebarWhenEmpty
478
+ || props.sidebarContentId !== undefined
479
+ || props.sidebarTitle !== undefined
480
+ || props.sidebarSubtitle !== undefined
481
+ || props.sidebarBadge !== undefined
482
+ || Boolean(slots.sidebar)
483
+ || sidebarSlotNames.value.length > 0
484
+ )
485
+ })
486
+
487
+ function firstItemId(items?: readonly (string | { id: string })[]): string | undefined {
488
+ const item = items?.[0]
489
+ if (item === undefined) return undefined
490
+ return typeof item === 'string' ? item : item.id
491
+ }
492
+
493
+ function isControlModelBinding(model: ControlModel | ControlModelBinding): model is ControlModelBinding {
494
+ return 'controls' in model && 'controlOptions' in model
495
+ }
496
+
497
+ function setActiveView(viewId: string) {
498
+ resolvedActiveView.value = viewId
499
+ }
500
+
501
+ function handlePageSelectorSelect(page: PageSelectorItem) {
502
+ setActiveView(page.id)
503
+ emit('page-selector-select', page)
504
+ }
505
+
506
+ function handlePillSelect(item: PillNavItem) {
507
+ setActiveView(item.id)
508
+ emit('pill-select', item)
509
+ }
510
+
511
+ function handlePillOptionSelect(option: PillNavOption, item: PillNavItem) {
512
+ emit('pill-option-select', option, item)
513
+ }
514
+
515
+ function handleToggle(sectionId: string, value: boolean) {
516
+ emit('update:toggle', sectionId, value)
517
+ }
518
+
519
+ function handleControlValuesUpdate(values: Record<string, unknown>) {
520
+ syncingControlValues = true
521
+ replaceControlValues({
522
+ ...generatedControlDefaults.value,
523
+ ...values,
524
+ })
525
+ syncingControlValues = false
526
+ emitControlValues()
527
+ }
528
+
529
+ function handleFormSubmit(sectionId: string, values: Record<string, unknown>) {
530
+ emit('form-submit', sectionId, values)
531
+ }
532
+
533
+ function handleFormCancel(sectionId: string) {
534
+ emit('form-cancel', sectionId)
535
+ }
536
+
537
+ function syncResolvedControlValues() {
538
+ syncingControlValues = true
539
+ replaceControlValues({
540
+ ...generatedControlDefaults.value,
541
+ ...(externalControlValues.value === undefined ? internalControlValues : externalControlValues.value),
542
+ })
543
+ syncingControlValues = false
544
+ }
545
+
546
+ function replaceControlValues(values: Record<string, unknown>) {
547
+ for (const key of Object.keys(internalControlValues)) {
548
+ if (!(key in values)) {
549
+ delete internalControlValues[key]
550
+ }
551
+ }
552
+ Object.assign(internalControlValues, values)
553
+ }
554
+
555
+ function emitControlValues() {
556
+ const nextValues = { ...internalControlValues }
557
+ emit('update:modelValue', nextValues)
558
+ emit('update:values', nextValues)
559
+ }
560
+
561
+ </script>
562
+
563
+ <template>
564
+ <AppLayout
565
+ class="mint-plugin-workspace-view"
566
+ :sidebar-position="sidebarPosition"
567
+ :sidebar-width="sidebarWidth"
568
+ :floating="floating"
569
+ :responsive-sidebar="responsiveSidebar"
570
+ :sidebar-toggle-label="sidebarToggleLabel"
571
+ :sidebar-close-label="sidebarCloseLabel"
572
+ >
573
+ <template #topbar>
574
+ <slot
575
+ name="topbar"
576
+ :active-view="resolvedActiveView"
577
+ :set-active-view="setActiveView"
578
+ :values="internalControlValues"
579
+ :component-bindings="resolvedComponentBindings"
580
+ :component-bindings-by-id="resolvedComponentBindingsById"
581
+ :component-props="resolvedComponentProps"
582
+ :component-props-by-id="resolvedComponentPropsById"
583
+ >
584
+ <AppTopBar
585
+ :title="title"
586
+ :subtitle="subtitle"
587
+ :variant="topBarVariant"
588
+ :home-path="homePath"
589
+ :show-logo="showLogo"
590
+ :page-selector="pageSelector"
591
+ :current-page-selector-id="resolvedCurrentPageSelectorId"
592
+ :plugin-switcher="pluginSwitcher"
593
+ :pill-nav="resolvedPillNav"
594
+ :current-pill-id="resolvedCurrentPillId"
595
+ :show-theme-toggle="showThemeToggle"
596
+ :show-settings="showSettings"
597
+ :settings-config="settingsConfig"
598
+ :show-standalone-label="showStandaloneLabel"
599
+ :standalone-label="standaloneLabel"
600
+ :account-menu="accountMenu"
601
+ :show-notifications="showNotifications"
602
+ :has-notification-dot="hasNotificationDot"
603
+ :show-admin="showAdmin"
604
+ :admin-path="adminPath"
605
+ :show-profile="showProfile"
606
+ :user-name="userName"
607
+ :user-initial="userInitial"
608
+ :user-email="userEmail"
609
+ @page-selector-select="handlePageSelectorSelect"
610
+ @pill-select="handlePillSelect"
611
+ @pill-option-select="handlePillOptionSelect"
612
+ @plugin-switcher-select="emit('plugin-switcher-select', $event)"
613
+ @plugin-switcher-install="emit('plugin-switcher-install')"
614
+ @account-menu-select="emit('account-menu-select', $event)"
615
+ @sign-out="emit('sign-out')"
616
+ @notifications-click="emit('notifications-click')"
617
+ @settings-values-change="emit('settings-values-change', $event)"
618
+ @profile-click="emit('profile-click')"
619
+ @admin-click="emit('admin-click')"
620
+ >
621
+ <template
622
+ v-for="slotName in topBarSlotNames"
623
+ :key="slotName"
624
+ #[slotName]="slotProps"
625
+ >
626
+ <!-- @vue-ignore dynamic SDK slot forwarding for AppTopBar passthrough slots -->
627
+ <slot
628
+ :name="slotName"
629
+ v-bind="slotProps ?? {}"
630
+ />
631
+ </template>
632
+ </AppTopBar>
633
+ </slot>
634
+ </template>
635
+
636
+ <template v-if="hasSidebarSurface" #sidebar>
637
+ <slot
638
+ name="sidebar"
639
+ :active-view="resolvedActiveView"
640
+ :set-active-view="setActiveView"
641
+ :values="internalControlValues"
642
+ :component-bindings="resolvedComponentBindings"
643
+ :component-bindings-by-id="resolvedComponentBindingsById"
644
+ :component-props="resolvedComponentProps"
645
+ :component-props-by-id="resolvedComponentPropsById"
646
+ >
647
+ <AppSidebar
648
+ :title="sidebarTitle"
649
+ :subtitle="sidebarSubtitle"
650
+ :badge="sidebarBadge"
651
+ :variant="sidebarVariant"
652
+ :panels="panels"
653
+ :active-view="resolvedActiveView"
654
+ :floating="false"
655
+ :dense="dense"
656
+ :width="sidebarWidth"
657
+ :side="sidebarPosition"
658
+ :forms="forms"
659
+ :content-id="sidebarContentId"
660
+ :show-when-empty="showSidebarWhenEmpty || sidebarContentId !== undefined"
661
+ :model="model"
662
+ :controls="controls"
663
+ :control-options="controlOptions"
664
+ :values="internalControlValues"
665
+ :form-enhancements="formEnhancements"
666
+ :show-form-actions="showFormActions"
667
+ :form-loading="formLoading"
668
+ :form-disabled="formDisabled"
669
+ :form-readonly="formReadonly"
670
+ :form-size="formSize"
671
+ :collapsible="sidebarCollapsible"
672
+ :collapsed="sidebarCollapsed"
673
+ :default-collapsed="defaultSidebarCollapsed"
674
+ :collapsed-width="sidebarCollapsedWidth"
675
+ :collapse-button-label="sidebarCollapseButtonLabel"
676
+ :expand-button-label="sidebarExpandButtonLabel"
677
+ @update:model-value="handleControlValuesUpdate"
678
+ @update:collapsed="emit('update:sidebarCollapsed', $event)"
679
+ @update:toggle="handleToggle"
680
+ @form-submit="handleFormSubmit"
681
+ @form-cancel="handleFormCancel"
682
+ >
683
+ <template
684
+ v-for="slotName in sidebarSlotNames"
685
+ :key="slotName"
686
+ #[slotName]="slotProps"
687
+ >
688
+ <!-- @vue-ignore dynamic SDK slot forwarding for AppSidebar section-* passthrough slots -->
689
+ <slot
690
+ :name="slotName"
691
+ v-bind="slotProps ?? {}"
692
+ />
693
+ </template>
694
+ </AppSidebar>
695
+ </slot>
696
+ </template>
697
+
698
+ <slot
699
+ :active-view="resolvedActiveView"
700
+ :set-active-view="setActiveView"
701
+ :values="internalControlValues"
702
+ :component-bindings="resolvedComponentBindings"
703
+ :component-bindings-by-id="resolvedComponentBindingsById"
704
+ :component-props="resolvedComponentProps"
705
+ :component-props-by-id="resolvedComponentPropsById"
706
+ />
707
+ </AppLayout>
708
+ </template>