@morscherlab/mint-sdk 1.3.9 → 1.4.0-beta.2

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 (966) hide show
  1. package/README.md +152 -177
  2. package/dist/ActionMenu-CScINahU.js +445 -0
  3. package/dist/ActionMenu-CScINahU.js.map +1 -0
  4. package/dist/AppSidebar-BmiiPfz9.js +3514 -0
  5. package/dist/AppSidebar-BmiiPfz9.js.map +1 -0
  6. package/dist/{experiment-utils-DTANyVKV.js → BaseModal-DfRIuVoj.js} +74 -149
  7. package/dist/BaseModal-DfRIuVoj.js.map +1 -0
  8. package/dist/ConfirmDialog-CJ7hqYUP.js +102 -0
  9. package/dist/ConfirmDialog-CJ7hqYUP.js.map +1 -0
  10. package/dist/ExperimentPopover-C4sGw-is.js +359 -0
  11. package/dist/ExperimentPopover-C4sGw-is.js.map +1 -0
  12. package/dist/ExperimentSelectorModal-D-9z7cNx.js +527 -0
  13. package/dist/ExperimentSelectorModal-D-9z7cNx.js.map +1 -0
  14. package/dist/SegmentedControl-DERBN-Xd.js +129 -0
  15. package/dist/SegmentedControl-DERBN-Xd.js.map +1 -0
  16. package/dist/SettingsModal-CSLE31yg.js +666 -0
  17. package/dist/SettingsModal-CSLE31yg.js.map +1 -0
  18. package/dist/analysisArtifactTypes-Cy3D0Ipg.js.map +1 -1
  19. package/dist/auth-SliLnFre.js +65 -0
  20. package/dist/auth-SliLnFre.js.map +1 -0
  21. package/dist/components/ActionMenu.vue.d.ts +1 -1
  22. package/dist/components/AdductText.vue.d.ts +1 -1
  23. package/dist/components/AlertBox.vue.d.ts +3 -3
  24. package/dist/components/AppContainer.vue.d.ts +1 -1
  25. package/dist/components/AppSidebar.vue.d.ts +14 -94
  26. package/dist/components/AppTopBar.vue.d.ts +16 -70
  27. package/dist/components/ArtifactSaveDialog.vue.d.ts +4 -4
  28. package/dist/components/ArtifactSelectorModal.vue.d.ts +4 -4
  29. package/dist/components/AuditTrail.vue.d.ts +2 -2
  30. package/dist/components/BaseButton.vue.d.ts +11 -4
  31. package/dist/components/BaseCheckbox.vue.d.ts +9 -3
  32. package/dist/components/BaseInput.vue.d.ts +13 -9
  33. package/dist/components/BaseModal.vue.d.ts +4 -4
  34. package/dist/components/BasePill.vue.d.ts +15 -8
  35. package/dist/components/BaseRadioGroup.vue.d.ts +2 -2
  36. package/dist/components/BaseSelect.vue.d.ts +51 -19
  37. package/dist/components/BaseTabs.vue.d.ts +6 -5
  38. package/dist/components/BatchProgressList.vue.d.ts +2 -2
  39. package/dist/components/ChartContainer.vue.d.ts +2 -2
  40. package/dist/components/ChemicalFormula.vue.d.ts +2 -2
  41. package/dist/components/CollapsibleCard.vue.d.ts +3 -3
  42. package/dist/components/ComponentBindingRenderer.vue.d.ts +2 -3
  43. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  44. package/dist/components/ConfirmDialog.vue.d.ts +8 -7
  45. package/dist/components/DataFrame.vue.d.ts +32 -74
  46. package/dist/components/DatePicker.vue.d.ts +24 -2
  47. package/dist/components/DoseCalculator.vue.d.ts +1 -1
  48. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +1 -1
  49. package/dist/components/EmptyState.vue.d.ts +3 -2
  50. package/dist/components/ExperimentSelectorModal.vue.d.ts +3 -3
  51. package/dist/components/FormBuilder.vue.d.ts +17 -74
  52. package/dist/components/FormulaInput.vue.d.ts +2 -2
  53. package/dist/components/GeneratedPluginView.vue.d.ts +1 -1
  54. package/dist/components/GeneratedResultRenderer.vue.d.ts +5 -1
  55. package/dist/components/{StatusIndicator.vue.d.ts → InstrumentStatusPanels.vue.d.ts} +8 -9
  56. package/dist/components/JobsStatusTray.vue.d.ts +2 -9
  57. package/dist/components/LoadingSpinner.vue.d.ts +3 -3
  58. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  59. package/dist/components/NumberInput.vue.d.ts +19 -5
  60. package/dist/components/PlateEditor.vue.d.ts +11 -61
  61. package/dist/components/PlotlyChart.vue.d.ts +2 -2
  62. package/dist/components/PluginIcon.vue.d.ts +5 -1
  63. package/dist/components/PluginWorkspaceView.controls.d.ts +2 -9
  64. package/dist/components/PluginWorkspaceView.navigation.d.ts +1 -7
  65. package/dist/components/PluginWorkspaceView.props.d.ts +18 -137
  66. package/dist/components/PluginWorkspaceView.shell.d.ts +2 -10
  67. package/dist/components/PluginWorkspaceView.vue.d.ts +14 -84
  68. package/dist/components/PresenceAvatars.vue.d.ts +31 -0
  69. package/dist/components/ProgressBar.vue.d.ts +3 -2
  70. package/dist/components/ProtocolStep.presentation.d.ts +0 -1
  71. package/dist/components/SampleHierarchyTree.vue.d.ts +3 -3
  72. package/dist/components/SampleSelector.vue.d.ts +3 -3
  73. package/dist/components/ScheduleCalendar.vue.d.ts +1 -1
  74. package/dist/components/ScientificNumber.vue.d.ts +1 -1
  75. package/dist/components/SecretInput.vue.d.ts +2 -2
  76. package/dist/components/SegmentedControl.vue.d.ts +2 -2
  77. package/dist/components/SequenceInput.vue.d.ts +2 -2
  78. package/dist/components/SettingsModal.vue.d.ts +12 -20
  79. package/dist/components/SmartGroup.types.d.ts +0 -1
  80. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +1 -1
  81. package/dist/components/StaleFormBanner.vue.d.ts +20 -0
  82. package/dist/components/TagsInput.vue.d.ts +4 -3
  83. package/dist/components/TimeRangeInput.vue.d.ts +2 -2
  84. package/dist/components/VersionConflictDialog.vue.d.ts +24 -0
  85. package/dist/components/WellPlate.geometry.d.ts +0 -6
  86. package/dist/components/WellPlate.rendering.d.ts +0 -2
  87. package/dist/components/WellPlate.vue.d.ts +7 -52
  88. package/dist/components/index.d.ts +0 -90
  89. package/dist/components/{AutoGroupModal.adapter.d.ts → internal/AutoGroupModalInternal.adapter.d.ts} +6 -6
  90. package/dist/components/{AutoGroupModal.vue.d.ts → internal/AutoGroupModalInternal.vue.d.ts} +6 -6
  91. package/dist/components/{BaseToggle.vue.d.ts → internal/CheckboxSwitchInternal.vue.d.ts} +2 -2
  92. package/dist/components/internal/DatePickerDateInternal.vue.d.ts +22 -0
  93. package/dist/components/{DateTimePicker.vue.d.ts → internal/DatePickerDateTimeInternal.vue.d.ts} +2 -2
  94. package/dist/components/{TimePicker.vue.d.ts → internal/DatePickerTimeInternal.vue.d.ts} +3 -3
  95. package/dist/components/internal/FilePickerListInternal.vue.d.ts +2 -2
  96. package/dist/components/internal/FormSchemaInternal.vue.d.ts +95 -0
  97. package/dist/components/{UnitInput.vue.d.ts → internal/NumberUnitInputInternal.vue.d.ts} +6 -14
  98. package/dist/components/internal/PlateEditorBindingInternal.vue.d.ts +3 -2
  99. package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +3 -3
  100. package/dist/components/{MultiSelect.vue.d.ts → internal/SelectMultipleInternal.vue.d.ts} +11 -8
  101. package/dist/components/{SearchableSelect.vue.d.ts → internal/SelectSearchableInternal.vue.d.ts} +5 -2
  102. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +1 -15
  103. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +4 -4
  104. package/dist/{composables → components/internal}/autoGroup/classKey.d.ts +1 -1
  105. package/dist/{composables → components/internal}/autoGroup/classify.d.ts +1 -1
  106. package/dist/{composables → components/internal}/autoGroup/columns.d.ts +1 -1
  107. package/dist/{composables → components/internal}/autoGroup/compose.d.ts +1 -1
  108. package/dist/{composables → components/internal}/autoGroup/cooccurrence.d.ts +1 -1
  109. package/dist/{composables → components/internal}/autoGroup/csv-shim.d.ts +1 -1
  110. package/dist/{composables → components/internal}/autoGroup/fingerprint.d.ts +1 -1
  111. package/dist/{composables → components/internal}/autoGroup/template.d.ts +1 -1
  112. package/dist/{composables → components/internal}/autoGroup/tokenLength.d.ts +1 -1
  113. package/dist/components/internal/generatedJobsApi.d.ts +1 -1
  114. package/dist/{composables → components/internal}/useAutoGroup.d.ts +9 -18
  115. package/dist/composables/componentSpecs.d.ts +41 -0
  116. package/dist/composables/controlComponentBindings.d.ts +6 -0
  117. package/dist/composables/controlSchemaAdapters.d.ts +28 -2
  118. package/dist/composables/controlSchemaDoseDesign.d.ts +1 -1
  119. package/dist/composables/controlSchemaModel.d.ts +1 -1
  120. package/dist/composables/controlSchemaTypes.d.ts +35 -23
  121. package/dist/composables/{usePluginClient.d.ts → createClient.d.ts} +20 -49
  122. package/dist/composables/{useEventStream.d.ts → eventStream.d.ts} +2 -2
  123. package/dist/composables/experiment-utils.d.ts +1 -6
  124. package/dist/composables/index.d.ts +6 -59
  125. package/dist/composables/platformContextHelpers.d.ts +0 -11
  126. package/dist/composables/pluginEndpointBuilder.d.ts +2 -2
  127. package/dist/composables/pluginWorkspaceModel.d.ts +14 -97
  128. package/dist/composables/useApi.d.ts +1 -3
  129. package/dist/composables/useAppExperiment.d.ts +1 -1
  130. package/dist/composables/{useAnalysisArtifacts.d.ts → useArtifacts.d.ts} +6 -6
  131. package/dist/composables/useExperiment.d.ts +30 -0
  132. package/dist/composables/useFilePicker.d.ts +2 -2
  133. package/dist/composables/useJobCenter.d.ts +63 -0
  134. package/dist/composables/{useGeneratedAnalysis.d.ts → useJobsEndpoint.d.ts} +22 -23
  135. package/dist/composables/useMenuKeyboard.d.ts +1 -1
  136. package/dist/composables/usePlatform.d.ts +63 -0
  137. package/dist/composables/usePluginWorkspace.d.ts +6 -11
  138. package/dist/composables/usePresence.d.ts +41 -0
  139. package/dist/composables/useRackEditor.d.ts +2 -2
  140. package/dist/composables/useRealtime.d.ts +71 -0
  141. package/dist/composables/{useRequestSyncState.d.ts → useRequest.d.ts} +12 -17
  142. package/dist/composables/useToast.d.ts +7 -5
  143. package/dist/composables/useVersionedSave.d.ts +76 -0
  144. package/dist/controlSchemaModel-CP5-_nAj.js +95 -0
  145. package/dist/controlSchemaModel-CP5-_nAj.js.map +1 -0
  146. package/dist/data-C2PwI_dn.js +3811 -0
  147. package/dist/data-C2PwI_dn.js.map +1 -0
  148. package/dist/data.d.ts +32 -0
  149. package/dist/data.js +10 -0
  150. package/dist/deprecatedRootExports.d.ts +191 -0
  151. package/dist/experiment-43OJtH7R.js +673 -0
  152. package/dist/experiment-43OJtH7R.js.map +1 -0
  153. package/dist/experimentStatus-BZmU4czV.js +60 -0
  154. package/dist/experimentStatus-BZmU4czV.js.map +1 -0
  155. package/dist/host.d.ts +10 -0
  156. package/dist/host.js +26 -0
  157. package/dist/host.js.map +1 -0
  158. package/dist/index.d.ts +1 -12
  159. package/dist/index.js +65 -277
  160. package/dist/index.js.map +1 -1
  161. package/dist/install-DAID6c2-.js +668 -0
  162. package/dist/install-DAID6c2-.js.map +1 -0
  163. package/dist/install.d.ts +2 -1
  164. package/dist/install.js +1 -21
  165. package/dist/instrument.d.ts +0 -6
  166. package/dist/lab-DLwRl_Ql.js +7513 -0
  167. package/dist/lab-DLwRl_Ql.js.map +1 -0
  168. package/dist/lab.d.ts +42 -0
  169. package/dist/lab.js +4 -0
  170. package/dist/permissions.d.ts +0 -4
  171. package/dist/permissions.js +1 -20
  172. package/dist/permissions.js.map +1 -1
  173. package/dist/records-BzTcxekG.js +3070 -0
  174. package/dist/records-BzTcxekG.js.map +1 -0
  175. package/dist/runtime-D6gVat6r.js +1495 -0
  176. package/dist/runtime-D6gVat6r.js.map +1 -0
  177. package/dist/runtime.d.ts +25 -0
  178. package/dist/runtime.js +8 -0
  179. package/dist/shell-5ju97nOS.js +197 -0
  180. package/dist/shell-5ju97nOS.js.map +1 -0
  181. package/dist/shell.d.ts +16 -0
  182. package/dist/shell.js +8 -0
  183. package/dist/stores/auth.d.ts +13 -35
  184. package/dist/stores/experiment.d.ts +4 -0
  185. package/dist/stores/index.js +2 -2
  186. package/dist/styles.css +12030 -14845
  187. package/dist/types/analysisArtifactTypes.d.ts +1 -1
  188. package/dist/types/auth.d.ts +0 -8
  189. package/dist/types/componentLabTypes.d.ts +98 -34
  190. package/dist/types/componentWorkflowTypes.d.ts +0 -27
  191. package/dist/types/components.d.ts +145 -74
  192. package/dist/types/form-builder.d.ts +4 -0
  193. package/dist/types/generated/platformContext.d.ts +52 -0
  194. package/dist/types/generated-ui.d.ts +2 -2
  195. package/dist/types/index.d.ts +4 -5
  196. package/dist/types/instrument.d.ts +41 -0
  197. package/dist/types/platform.d.ts +20 -58
  198. package/dist/useDebouncedWatch-BPwyl6eS.js +73 -0
  199. package/dist/useDebouncedWatch-BPwyl6eS.js.map +1 -0
  200. package/dist/useExpansionSet-CvoNMZJi.js +68 -0
  201. package/dist/useExpansionSet-CvoNMZJi.js.map +1 -0
  202. package/dist/useExperimentSamples-CxcnxZ8h.js +366 -0
  203. package/dist/useExperimentSamples-CxcnxZ8h.js.map +1 -0
  204. package/dist/useListReorder-CcbEYxX-.js +5462 -0
  205. package/dist/useListReorder-CcbEYxX-.js.map +1 -0
  206. package/dist/useRackEditor-BD5NIo5s.js +5916 -0
  207. package/dist/useRackEditor-BD5NIo5s.js.map +1 -0
  208. package/dist/useRealtime-PalKue84.js +696 -0
  209. package/dist/useRealtime-PalKue84.js.map +1 -0
  210. package/dist/useRequest-D5JDfsgZ.js +76 -0
  211. package/dist/useRequest-D5JDfsgZ.js.map +1 -0
  212. package/dist/utils/color.d.ts +0 -5
  213. package/dist/{composables/useDoseCalculator.d.ts → utils/dose.d.ts} +10 -13
  214. package/dist/utils/experimentStatus.d.ts +9 -0
  215. package/dist/{composables/useChemicalFormula.d.ts → utils/formula.d.ts} +3 -6
  216. package/dist/utils/integrationHost.d.ts +18 -0
  217. package/dist/utils/plotlyTemplate.d.ts +2 -0
  218. package/dist/utils/pluginSecrets.d.ts +12 -12
  219. package/dist/utils/presenceAvatars.d.ts +30 -0
  220. package/dist/utils/records.d.ts +0 -2
  221. package/dist/{composables/useTimeUtils.d.ts → utils/time.d.ts} +0 -18
  222. package/package.json +20 -17
  223. package/src/__tests__/components/ActionMenu.test.ts +0 -13
  224. package/src/__tests__/components/AlertBox.test.ts +1 -1
  225. package/src/__tests__/components/AppSidebar.test.ts +119 -167
  226. package/src/__tests__/components/AppToastContainer.test.ts +2 -2
  227. package/src/__tests__/components/AppTopBar.test.ts +181 -176
  228. package/src/__tests__/components/ArtifactSaveDialog.test.ts +5 -3
  229. package/src/__tests__/components/ArtifactSelectorModal.test.ts +6 -4
  230. package/src/__tests__/components/AuditTrail.test.ts +1 -1
  231. package/src/__tests__/components/AutoGroupModal.adapter.test.ts +1 -1
  232. package/src/__tests__/components/AutoGroupModal.anatomy.test.ts +2 -2
  233. package/src/__tests__/components/AutoGroupModal.wiring.test.ts +2 -2
  234. package/src/__tests__/components/BaseButton.test.ts +51 -0
  235. package/src/__tests__/components/{BaseToggle.test.ts → BaseCheckbox.switch.test.ts} +8 -6
  236. package/src/__tests__/components/BaseInput.test.ts +13 -34
  237. package/src/__tests__/components/BaseModal.test.ts +6 -6
  238. package/src/__tests__/components/BasePill.test.ts +33 -39
  239. package/src/__tests__/components/{MultiSelect.test.ts → BaseSelect.multiple.test.ts} +16 -7
  240. package/src/__tests__/components/{SearchableSelect.test.ts → BaseSelect.searchable.test.ts} +19 -9
  241. package/src/__tests__/components/BaseSelect.test.ts +10 -0
  242. package/src/__tests__/components/BaseTabs.test.ts +13 -13
  243. package/src/__tests__/components/CollapsibleCard.test.ts +1 -1
  244. package/src/__tests__/components/ComponentBindingRenderer.test.ts +25 -73
  245. package/src/__tests__/components/ConcentrationInput.test.ts +3 -3
  246. package/src/__tests__/components/ConfirmDialog.test.ts +23 -0
  247. package/src/__tests__/components/DataFrame.test.ts +140 -142
  248. package/src/__tests__/components/DataStates.test.ts +6 -22
  249. package/src/__tests__/components/{DateTimePicker.test.ts → DatePicker.datetime.test.ts} +9 -7
  250. package/src/__tests__/components/{TimePicker.test.ts → DatePicker.time.test.ts} +18 -17
  251. package/src/__tests__/components/DoseCalculator.test.ts +12 -7
  252. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +6 -6
  253. package/src/__tests__/components/ExperimentSelectorModal.test.ts +15 -15
  254. package/src/__tests__/components/FormBuilder.test.ts +49 -167
  255. package/src/__tests__/components/FormSchemaInternal.test.ts +91 -0
  256. package/src/__tests__/components/GeneratedPathInput.test.ts +18 -13
  257. package/src/__tests__/components/GeneratedPluginView.test.ts +38 -24
  258. package/src/__tests__/components/GeneratedResultRenderer.test.ts +6 -4
  259. package/src/__tests__/components/InstrumentStatusPanels.test.ts +79 -0
  260. package/src/__tests__/components/JobsStatusTray.test.ts +4 -4
  261. package/src/__tests__/components/NumberInput.test.ts +28 -0
  262. package/src/__tests__/components/{UnitInput.test.ts → NumberInput.units.test.ts} +6 -6
  263. package/src/__tests__/components/PlateEditor.test.ts +108 -108
  264. package/src/__tests__/components/PlateEditorBindingInternal.test.ts +13 -13
  265. package/src/__tests__/components/PlotlyChart.test.ts +1 -1
  266. package/src/__tests__/components/PluginIcon.test.ts +9 -4
  267. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +16 -29
  268. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +28 -34
  269. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +4 -19
  270. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +1 -6
  271. package/src/__tests__/components/PluginWorkspaceView.test.ts +176 -155
  272. package/src/__tests__/components/PresenceAvatars.test.ts +90 -0
  273. package/src/__tests__/components/ProtocolStep.presentation.test.ts +1 -3
  274. package/src/__tests__/components/ProtocolStepEditor.test.ts +10 -11
  275. package/src/__tests__/components/ProtocolStepParameterField.test.ts +8 -7
  276. package/src/__tests__/components/ResourcePickerListInternal.test.ts +2 -2
  277. package/src/__tests__/components/RetiredStyles.test.ts +0 -18
  278. package/src/__tests__/components/SampleSelector.test.ts +17 -17
  279. package/src/__tests__/components/SecretInput.test.ts +14 -19
  280. package/src/__tests__/components/SettingsModal.test.ts +76 -84
  281. package/src/__tests__/components/StaleFormBanner.test.ts +48 -0
  282. package/src/__tests__/components/ThemeToggle.test.ts +1 -1
  283. package/src/__tests__/components/WellPlate.decoration.test.ts +10 -8
  284. package/src/__tests__/components/WellPlate.interaction.test.ts +6 -7
  285. package/src/__tests__/components/WellPlate.keyboard.test.ts +2 -2
  286. package/src/__tests__/components/deprecationTags.test.ts +90 -0
  287. package/src/__tests__/composables/analysisArtifactTarget.test.ts +1 -12
  288. package/src/__tests__/composables/autoGroup/classKey.test.ts +1 -1
  289. package/src/__tests__/composables/autoGroup/classify.test.ts +1 -1
  290. package/src/__tests__/composables/autoGroup/columns.test.ts +1 -1
  291. package/src/__tests__/composables/autoGroup/compose.test.ts +1 -1
  292. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +1 -1
  293. package/src/__tests__/composables/autoGroup/fieldEdits.test.ts +1 -1
  294. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +1 -1
  295. package/src/__tests__/composables/autoGroup/golden.test.ts +1 -1
  296. package/src/__tests__/composables/autoGroup/groupByOrder.test.ts +1 -1
  297. package/src/__tests__/composables/autoGroup/groupTree.test.ts +1 -1
  298. package/src/__tests__/composables/autoGroup/integration.test.ts +1 -1
  299. package/src/__tests__/composables/autoGroup/template.test.ts +1 -1
  300. package/src/__tests__/composables/autoGroup/tokenLength.test.ts +1 -1
  301. package/src/__tests__/composables/autoGroup/tokenize.test.ts +1 -1
  302. package/src/__tests__/composables/{usePluginClient.test.ts → createClient.test.ts} +84 -222
  303. package/src/__tests__/composables/{useEventStream.test.ts → eventStream.test.ts} +6 -6
  304. package/src/__tests__/composables/experiment-utils.test.ts +13 -14
  305. package/src/__tests__/composables/useApi.test.ts +32 -21
  306. package/src/__tests__/composables/useAppExperiment.test.ts +19 -2
  307. package/src/__tests__/composables/{useAnalysisArtifacts.test.ts → useArtifacts.test.ts} +19 -27
  308. package/src/__tests__/composables/useAutoGroup.test.ts +3 -13
  309. package/src/__tests__/composables/useControlSchema.test.ts +41 -99
  310. package/src/__tests__/composables/useExperiment.test.ts +63 -0
  311. package/src/__tests__/composables/useFileBrowser.test.ts +4 -6
  312. package/src/__tests__/composables/{useJobsStatusTray.test.ts → useJobCenter.test.ts} +31 -31
  313. package/src/__tests__/composables/{useGeneratedAnalysis.test.ts → useJobsEndpoint.test.ts} +213 -139
  314. package/src/__tests__/composables/usePlatform.test.ts +102 -0
  315. package/src/__tests__/composables/usePresence.test.ts +164 -0
  316. package/src/__tests__/composables/useRackEditor.test.ts +2 -2
  317. package/src/__tests__/composables/useRealtime.test.ts +196 -0
  318. package/src/__tests__/composables/{useRequestSyncState.test.ts → useRequest.test.ts} +32 -47
  319. package/src/__tests__/composables/useVersionedSave.test.ts +194 -0
  320. package/src/__tests__/docs/extractDocsComponents.test.ts +36 -0
  321. package/src/__tests__/docs/extractDocsParsing.test.ts +2 -2
  322. package/src/__tests__/docs/extractDocsTheme.test.ts +1 -46
  323. package/src/__tests__/docs/frontendDocsCatalog.test.ts +164 -84
  324. package/src/__tests__/styles/baseControlsRules.test.ts +1 -1
  325. package/src/__tests__/styles/darkModeRules.test.ts +0 -6
  326. package/src/__tests__/{composables/useChemicalFormula.test.ts → utils/formula.test.ts} +3 -5
  327. package/src/__tests__/utils/permissions.test.ts +1 -36
  328. package/src/__tests__/utils/plotlyTemplate.test.ts +16 -1
  329. package/src/__tests__/{composables/useTimeUtils.test.ts → utils/time.test.ts} +2 -9
  330. package/src/components/ActionMenu.vue +7 -13
  331. package/src/components/AlertBox.story.vue +25 -25
  332. package/src/components/AlertBox.vue +8 -8
  333. package/src/components/AppLayout.story.vue +33 -44
  334. package/src/components/AppLayout.vue +1 -1
  335. package/src/components/AppSidebar.story.vue +40 -73
  336. package/src/components/AppSidebar.vue +66 -147
  337. package/src/components/AppToastContainer.story.vue +1 -1
  338. package/src/components/AppTopBar.story.vue +51 -100
  339. package/src/components/AppTopBar.vue +74 -198
  340. package/src/components/ArtifactSaveDialog.story.vue +9 -9
  341. package/src/components/ArtifactSaveDialog.vue +23 -26
  342. package/src/components/ArtifactSelectorModal.story.vue +4 -4
  343. package/src/components/ArtifactSelectorModal.vue +10 -10
  344. package/src/components/AuditTrail.story.vue +4 -4
  345. package/src/components/AuditTrail.vue +3 -3
  346. package/src/components/Avatar.story.vue +2 -3
  347. package/src/components/Avatar.vue +1 -2
  348. package/src/components/BaseButton.story.vue +25 -0
  349. package/src/components/BaseButton.vue +39 -10
  350. package/src/components/BaseCheckbox.story.vue +2 -2
  351. package/src/components/{BaseToggle.story.vue → BaseCheckbox.switch.story.vue} +22 -19
  352. package/src/components/BaseCheckbox.vue +39 -7
  353. package/src/components/BaseInput.story.vue +3 -15
  354. package/src/components/{BaseTextarea.story.vue → BaseInput.textarea.story.vue} +14 -10
  355. package/src/components/BaseInput.vue +53 -26
  356. package/src/components/BaseModal.story.vue +11 -11
  357. package/src/components/BaseModal.vue +8 -8
  358. package/src/components/BasePill.story.vue +48 -28
  359. package/src/components/BasePill.vue +22 -11
  360. package/src/components/BaseRadioGroup.story.vue +4 -4
  361. package/src/components/BaseRadioGroup.vue +3 -3
  362. package/src/components/{MultiSelect.story.vue → BaseSelect.multiple.story.vue} +20 -14
  363. package/src/components/{SearchableSelect.story.vue → BaseSelect.searchable.story.vue} +4 -4
  364. package/src/components/BaseSelect.story.vue +2 -2
  365. package/src/components/BaseSelect.vue +117 -22
  366. package/src/components/BaseTabs.story.vue +20 -20
  367. package/src/components/BaseTabs.vue +17 -9
  368. package/src/components/BatchProgressList.vue +3 -3
  369. package/src/components/ChartContainer.story.vue +8 -13
  370. package/src/components/ChartContainer.vue +3 -3
  371. package/src/components/ChemicalFormula.vue +1 -2
  372. package/src/components/CollapsibleCard.vue +5 -4
  373. package/src/components/ComponentBindingRenderer.story.vue +0 -29
  374. package/src/components/ComponentBindingRenderer.vue +15 -39
  375. package/src/components/ConcentrationInput.story.vue +2 -2
  376. package/src/components/ConcentrationInput.vue +9 -9
  377. package/src/components/ConfirmDialog.story.vue +21 -21
  378. package/src/components/ConfirmDialog.vue +15 -14
  379. package/src/components/DataFrame.story.vue +28 -40
  380. package/src/components/DataFrame.vue +112 -128
  381. package/src/components/{DateTimePicker.story.vue → DatePicker.datetime.story.vue} +19 -14
  382. package/src/components/DatePicker.story.vue +2 -2
  383. package/src/components/{TimePicker.story.vue → DatePicker.time.story.vue} +15 -12
  384. package/src/components/DatePicker.vue +82 -220
  385. package/src/components/DoseCalculator.vue +13 -19
  386. package/src/components/DoseCalculatorVolumeField.vue +6 -6
  387. package/src/components/EmptyState.story.vue +17 -17
  388. package/src/components/EmptyState.vue +5 -4
  389. package/src/components/ExperimentPopover.story.vue +1 -1
  390. package/src/components/ExperimentPopover.vue +4 -4
  391. package/src/components/ExperimentSelectorModal.story.vue +5 -5
  392. package/src/components/ExperimentSelectorModal.vue +11 -13
  393. package/src/components/FilePicker.vue +1 -1
  394. package/src/components/FormBuilder.story.vue +9 -4
  395. package/src/components/FormBuilder.vue +46 -253
  396. package/src/components/FormField.story.vue +1 -2
  397. package/src/components/FormulaInput.story.vue +2 -2
  398. package/src/components/FormulaInput.vue +5 -6
  399. package/src/components/GeneratedPathInput.vue +8 -9
  400. package/src/components/GeneratedPluginView.story.vue +1 -1
  401. package/src/components/GeneratedPluginView.vue +23 -22
  402. package/src/components/GeneratedResultRenderer.vue +16 -17
  403. package/src/components/InstrumentStatusPanels.story.vue +64 -0
  404. package/src/components/InstrumentStatusPanels.vue +133 -0
  405. package/src/components/JobsStatusTray.story.vue +2 -2
  406. package/src/components/JobsStatusTray.vue +4 -19
  407. package/src/components/LoadingSpinner.story.vue +11 -11
  408. package/src/components/LoadingSpinner.vue +6 -4
  409. package/src/components/MoleculeInput.story.vue +2 -2
  410. package/src/components/MoleculeInput.vue +3 -3
  411. package/src/components/NumberInput.story.vue +55 -15
  412. package/src/components/NumberInput.vue +80 -18
  413. package/src/components/PlateEditor.story.vue +51 -43
  414. package/src/components/PlateEditor.vue +97 -128
  415. package/src/components/PlotlyChart.story.vue +1 -1
  416. package/src/components/PlotlyChart.vue +6 -4
  417. package/src/components/PluginIcon.story.vue +9 -6
  418. package/src/components/PluginIcon.vue +7 -2
  419. package/src/components/PluginWorkspaceView.controls.ts +9 -29
  420. package/src/components/PluginWorkspaceView.navigation.ts +2 -23
  421. package/src/components/PluginWorkspaceView.props.ts +17 -151
  422. package/src/components/PluginWorkspaceView.shell.ts +13 -24
  423. package/src/components/PluginWorkspaceView.story.vue +64 -62
  424. package/src/components/PluginWorkspaceView.vue +21 -78
  425. package/src/components/PresenceAvatars.story.vue +75 -0
  426. package/src/components/PresenceAvatars.vue +114 -0
  427. package/src/components/ProgressBar.story.vue +7 -7
  428. package/src/components/ProgressBar.vue +4 -3
  429. package/src/components/ProtocolStep.presentation.ts +0 -11
  430. package/src/components/ProtocolStepEditor.vue +6 -5
  431. package/src/components/ProtocolStepParameterField.vue +15 -12
  432. package/src/components/SampleSelector.colors.ts +1 -1
  433. package/src/components/SampleSelector.vue +6 -6
  434. package/src/components/ScheduleCalendar.vue +4 -4
  435. package/src/components/SecretInput.story.vue +1 -1
  436. package/src/components/SecretInput.vue +16 -25
  437. package/src/components/SegmentedControl.story.vue +7 -7
  438. package/src/components/SegmentedControl.vue +5 -3
  439. package/src/components/SequenceInput.story.vue +2 -2
  440. package/src/components/SequenceInput.vue +3 -3
  441. package/src/components/SettingsModal.story.vue +13 -14
  442. package/src/components/SettingsModal.vue +29 -47
  443. package/src/components/SmartGroup.types.ts +4 -6
  444. package/src/components/SmartGroupFieldRecipe.vue +7 -5
  445. package/src/components/StaleFormBanner.story.vue +90 -0
  446. package/src/components/StaleFormBanner.vue +83 -0
  447. package/src/components/TagsInput.story.vue +7 -7
  448. package/src/components/TagsInput.vue +7 -6
  449. package/src/components/ThemeToggle.vue +5 -30
  450. package/src/components/TimeRangeInput.story.vue +1 -1
  451. package/src/components/TimeRangeInput.vue +10 -8
  452. package/src/components/VersionConflictDialog.story.vue +60 -0
  453. package/src/components/VersionConflictDialog.vue +79 -0
  454. package/src/components/WellPlate.geometry.ts +0 -38
  455. package/src/components/WellPlate.rendering.ts +0 -13
  456. package/src/components/WellPlate.story.vue +61 -50
  457. package/src/components/WellPlate.vue +61 -87
  458. package/src/components/index.ts +3 -105
  459. package/src/components/{AutoGroupModal.adapter.ts → internal/AutoGroupModalInternal.adapter.ts} +8 -8
  460. package/src/components/{AutoGroupModal.vue → internal/AutoGroupModalInternal.vue} +23 -23
  461. package/src/components/{BaseToggle.vue → internal/CheckboxSwitchInternal.vue} +8 -8
  462. package/src/components/internal/DataStateInternal.vue +1 -1
  463. package/src/components/internal/DatePickerDateInternal.vue +243 -0
  464. package/src/components/{DateTimePicker.vue → internal/DatePickerDateTimeInternal.vue} +9 -9
  465. package/src/components/{TimePicker.vue → internal/DatePickerTimeInternal.vue} +7 -7
  466. package/src/components/internal/FilePickerListInternal.vue +8 -14
  467. package/src/components/{FormActions.vue → internal/FormActionsInternal.vue} +2 -2
  468. package/src/components/internal/FormFieldRendererInternal.vue +1 -1
  469. package/src/components/internal/FormSchemaInternal.vue +253 -0
  470. package/src/components/{UnitInput.vue → internal/NumberUnitInputInternal.vue} +28 -28
  471. package/src/components/internal/PlateEditorBindingInternal.vue +8 -7
  472. package/src/components/internal/ResourcePickerListInternal.vue +4 -4
  473. package/src/components/{MultiSelect.vue → internal/SelectMultipleInternal.vue} +21 -15
  474. package/src/components/{SearchableSelect.vue → internal/SelectSearchableInternal.vue} +24 -8
  475. package/src/components/internal/WellEditPopupInternal.vue +4 -9
  476. package/src/components/internal/WorkspaceShellInternal.vue +3 -36
  477. package/src/components/internal/WorkspaceSidebarInternal.vue +4 -25
  478. package/src/{composables → components/internal}/autoGroup/classKey.ts +1 -1
  479. package/src/{composables → components/internal}/autoGroup/classify.ts +1 -1
  480. package/src/{composables → components/internal}/autoGroup/columns.ts +1 -1
  481. package/src/{composables → components/internal}/autoGroup/compose.ts +3 -3
  482. package/src/{composables → components/internal}/autoGroup/cooccurrence.ts +1 -1
  483. package/src/{composables → components/internal}/autoGroup/csv-shim.ts +1 -1
  484. package/src/{composables → components/internal}/autoGroup/fingerprint.ts +1 -1
  485. package/src/{composables → components/internal}/autoGroup/index.ts +1 -2
  486. package/src/{composables → components/internal}/autoGroup/template.ts +1 -1
  487. package/src/{composables → components/internal}/autoGroup/tokenLength.ts +1 -1
  488. package/src/components/internal/generatedJobsApi.ts +1 -1
  489. package/src/{composables → components/internal}/useAutoGroup.ts +3 -57
  490. package/src/composables/componentSpecs.ts +62 -0
  491. package/src/composables/controlComponentBindings.ts +7 -0
  492. package/src/composables/controlSchemaAdapters.ts +45 -7
  493. package/src/composables/controlSchemaDoseDesign.ts +16 -5
  494. package/src/composables/controlSchemaModel.ts +1 -1
  495. package/src/composables/controlSchemaTypes.ts +31 -22
  496. package/src/composables/{usePluginClient.ts → createClient.ts} +52 -190
  497. package/src/composables/{useEventStream.ts → eventStream.ts} +3 -3
  498. package/src/composables/experiment-utils.ts +1 -39
  499. package/src/composables/formBuilderRegistry.ts +6 -12
  500. package/src/composables/index.ts +16 -480
  501. package/src/composables/platformContextHelpers.ts +0 -57
  502. package/src/composables/pluginEndpointBuilder.ts +8 -10
  503. package/src/composables/pluginWorkspaceModel.ts +14 -105
  504. package/src/composables/useApi.ts +18 -30
  505. package/src/composables/useAppExperiment.ts +6 -5
  506. package/src/composables/{useAnalysisArtifacts.ts → useArtifacts.ts} +18 -19
  507. package/src/composables/useControlSchema.ts +5 -9
  508. package/src/composables/useControlWorkspace.ts +4 -7
  509. package/src/composables/useExperiment.ts +49 -0
  510. package/src/composables/useExperimentData.ts +4 -4
  511. package/src/composables/useExperimentSelector.ts +5 -5
  512. package/src/composables/useFileBrowser.ts +5 -13
  513. package/src/composables/useFilePicker.ts +2 -2
  514. package/src/composables/useFormBuilder.ts +3 -4
  515. package/src/composables/useJobCenter.ts +324 -0
  516. package/src/composables/{useGeneratedAnalysis.ts → useJobsEndpoint.ts} +53 -67
  517. package/src/composables/useMenuKeyboard.ts +1 -1
  518. package/src/composables/usePlatform.ts +95 -0
  519. package/src/composables/usePlatformFilePickerAdapter.ts +2 -1
  520. package/src/composables/usePluginWorkspace.ts +62 -107
  521. package/src/composables/usePresence.ts +110 -0
  522. package/src/composables/useRackEditor.ts +3 -3
  523. package/src/composables/useRealtime.ts +194 -0
  524. package/src/composables/{useRequestSyncState.ts → useRequest.ts} +25 -48
  525. package/src/composables/useScheduleCalendarLayout.ts +1 -1
  526. package/src/composables/useToast.ts +14 -11
  527. package/src/composables/useVersionedSave.ts +165 -0
  528. package/src/data.ts +130 -0
  529. package/src/deprecatedRootExports.ts +226 -0
  530. package/src/generated/schema.ts +1 -0
  531. package/src/host.ts +27 -0
  532. package/src/index.ts +2 -71
  533. package/src/install.ts +15 -2
  534. package/src/instrument.ts +1 -6
  535. package/src/lab.ts +128 -0
  536. package/src/permissions.ts +0 -27
  537. package/src/runtime.ts +145 -0
  538. package/src/shell.ts +103 -0
  539. package/src/stores/auth.ts +26 -162
  540. package/src/stores/experiment.ts +27 -1
  541. package/src/styles/components/action-menu.css +0 -5
  542. package/src/styles/components/alert-box.css +18 -0
  543. package/src/styles/components/app-top-bar.css +7 -48
  544. package/src/styles/components/button.css +12 -0
  545. package/src/styles/components/checkbox.css +1 -1
  546. package/src/styles/components/collapsible-card.css +1 -1
  547. package/src/styles/components/confirm-dialog.css +18 -2
  548. package/src/styles/components/empty-state.css +4 -2
  549. package/src/styles/components/file-picker.css +1 -1
  550. package/src/styles/components/icon-button.css +1 -1
  551. package/src/styles/components/loading-spinner.css +9 -12
  552. package/src/styles/components/multi-select.css +6 -1
  553. package/src/styles/components/pill.css +40 -35
  554. package/src/styles/components/plugin-icon.css +9 -0
  555. package/src/styles/components/presence-avatars.css +194 -0
  556. package/src/styles/components/progress-bar.css +2 -0
  557. package/src/styles/components/searchable-select.css +3 -0
  558. package/src/styles/components/smart-group.css +1 -6
  559. package/src/styles/components/textarea.css +1 -1
  560. package/src/styles/components/toggle.css +2 -2
  561. package/src/styles/components/version-conflict.css +122 -0
  562. package/src/styles/components/well-plate.css +0 -7
  563. package/src/styles/index.css +2 -11
  564. package/src/styles/variables.css +1 -527
  565. package/src/types/analysisArtifactTypes.ts +1 -1
  566. package/src/types/auth.ts +0 -10
  567. package/src/types/componentLabTypes.ts +103 -53
  568. package/src/types/componentWorkflowTypes.ts +2 -33
  569. package/src/types/components.ts +148 -114
  570. package/src/types/form-builder.ts +4 -0
  571. package/src/types/generated/platformContext.ts +59 -0
  572. package/src/types/generated-ui.ts +2 -2
  573. package/src/types/index.ts +15 -53
  574. package/src/types/instrument.ts +27 -0
  575. package/src/types/platform.ts +25 -89
  576. package/src/utils/color.ts +1 -12
  577. package/src/utils/dose.ts +335 -0
  578. package/src/utils/experimentStatus.ts +43 -0
  579. package/src/utils/formula.ts +292 -0
  580. package/src/utils/integrationHost.ts +27 -0
  581. package/src/utils/plotlyTemplate.ts +6 -0
  582. package/src/utils/pluginSecrets.ts +23 -23
  583. package/src/utils/presenceAvatars.ts +53 -0
  584. package/src/utils/records.ts +0 -5
  585. package/src/{composables/useTimeUtils.ts → utils/time.ts} +0 -21
  586. package/dist/ResourcePickerListInternal-CFAw4vTZ.js +0 -605
  587. package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +0 -1
  588. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +0 -1
  589. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +0 -1
  590. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +0 -1
  591. package/dist/__tests__/composables/useChemicalFormula.test.d.ts +0 -1
  592. package/dist/__tests__/composables/useEventStream.test.d.ts +0 -1
  593. package/dist/__tests__/composables/useExperimentSave.test.d.ts +0 -1
  594. package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +0 -1
  595. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +0 -1
  596. package/dist/__tests__/composables/useJobsStatusTray.test.d.ts +0 -1
  597. package/dist/__tests__/composables/useMobileSupportGate.test.d.ts +0 -1
  598. package/dist/__tests__/composables/usePlatformContext.test.d.ts +0 -1
  599. package/dist/__tests__/composables/usePluginClient.test.d.ts +0 -1
  600. package/dist/__tests__/composables/usePresenceHeartbeat.test.d.ts +0 -1
  601. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +0 -1
  602. package/dist/__tests__/composables/useRuntimeAlignment.test.d.ts +0 -1
  603. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +0 -1
  604. package/dist/__tests__/composables/useTimeUtils.test.d.ts +0 -1
  605. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +0 -1
  606. package/dist/__tests__/templates/templates.test.d.ts +0 -1
  607. package/dist/__tests__/templates/templatesDeprecation.test.d.ts +0 -1
  608. package/dist/__tests__/utils/lcms.test.d.ts +0 -1
  609. package/dist/__tests__/utils/rack.test.d.ts +0 -1
  610. package/dist/components/AppAvatarMenu.vue.d.ts +0 -47
  611. package/dist/components/AppTopBar.navigation.d.ts +0 -10
  612. package/dist/components/BaseTextarea.vue.d.ts +0 -31
  613. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +0 -112
  614. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +0 -86
  615. package/dist/components/BioTemplatePresetWorkspaceView.vue.d.ts +0 -80
  616. package/dist/components/BioTemplateRenderer.vue.d.ts +0 -30
  617. package/dist/components/ControlWorkspaceView.vue.d.ts +0 -138
  618. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +0 -140
  619. package/dist/components/ExperimentDataViewer.vue.d.ts +0 -54
  620. package/dist/components/ExperimentTimeline.vue.d.ts +0 -70
  621. package/dist/components/FitPanel.vue.d.ts +0 -56
  622. package/dist/components/GroupAssigner.vue.d.ts +0 -26
  623. package/dist/components/IconButton.vue.d.ts +0 -30
  624. package/dist/components/MobileSupportGate.vue.d.ts +0 -32
  625. package/dist/components/ReagentEditor.vue.d.ts +0 -31
  626. package/dist/components/ReagentList.presentation.d.ts +0 -17
  627. package/dist/components/ReagentList.vue.d.ts +0 -58
  628. package/dist/components/SampleLegend.vue.d.ts +0 -33
  629. package/dist/components/SmartGroupModal.vue.d.ts +0 -29
  630. package/dist/components/index.js +0 -5
  631. package/dist/components-BOA5e7kb.js +0 -23137
  632. package/dist/components-BOA5e7kb.js.map +0 -1
  633. package/dist/composables/flattenWorkspaceBindings.d.ts +0 -61
  634. package/dist/composables/index.js +0 -7
  635. package/dist/composables/useBioTemplateComponents.d.ts +0 -34
  636. package/dist/composables/useBioTemplateControls.d.ts +0 -10
  637. package/dist/composables/useBioTemplatePackWorkspace.d.ts +0 -56
  638. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +0 -79
  639. package/dist/composables/useBioTemplateWorkspace.d.ts +0 -39
  640. package/dist/composables/useExperimentSave.d.ts +0 -69
  641. package/dist/composables/useGroupAssignment.d.ts +0 -35
  642. package/dist/composables/useJobsStatusTray.d.ts +0 -87
  643. package/dist/composables/useMobileSupportGate.d.ts +0 -14
  644. package/dist/composables/usePlatformContext.d.ts +0 -218
  645. package/dist/composables/usePresenceHeartbeat.d.ts +0 -49
  646. package/dist/composables/useRuntimeAlignment.d.ts +0 -44
  647. package/dist/composables/useTemplateCollection.d.ts +0 -62
  648. package/dist/composables/workspaceRecipes.d.ts +0 -189
  649. package/dist/composables-izSQH8Ky.js +0 -591
  650. package/dist/composables-izSQH8Ky.js.map +0 -1
  651. package/dist/experiment-D49y_Kro.js +0 -459
  652. package/dist/experiment-D49y_Kro.js.map +0 -1
  653. package/dist/experiment-utils-DTANyVKV.js.map +0 -1
  654. package/dist/install.js.map +0 -1
  655. package/dist/lcms.d.ts +0 -38
  656. package/dist/settings-BG6v13Zq.js +0 -341
  657. package/dist/settings-BG6v13Zq.js.map +0 -1
  658. package/dist/tailwind.preset.d.ts +0 -63
  659. package/dist/tailwind.preset.js +0 -71
  660. package/dist/tailwind.preset.js.map +0 -1
  661. package/dist/templates/adapters.d.ts +0 -19
  662. package/dist/templates/assayLookups.d.ts +0 -3
  663. package/dist/templates/assayMatrixAdapters.d.ts +0 -13
  664. package/dist/templates/assayMatrixBuilder.d.ts +0 -3
  665. package/dist/templates/assayNormalizers.d.ts +0 -4
  666. package/dist/templates/builderIdUtils.d.ts +0 -4
  667. package/dist/templates/builderPresetControls.d.ts +0 -11
  668. package/dist/templates/builderReadUtils.d.ts +0 -8
  669. package/dist/templates/builders.d.ts +0 -26
  670. package/dist/templates/calibrationCurveAdapters.d.ts +0 -7
  671. package/dist/templates/calibrationCurveBuilder.d.ts +0 -3
  672. package/dist/templates/calibrationNormalizers.d.ts +0 -5
  673. package/dist/templates/catalog.d.ts +0 -192
  674. package/dist/templates/componentBindingCatalog.d.ts +0 -25
  675. package/dist/templates/componentBindingHelpers.d.ts +0 -17
  676. package/dist/templates/componentBindings.d.ts +0 -97
  677. package/dist/templates/componentDoseResponseProps.d.ts +0 -3
  678. package/dist/templates/componentGenericProps.d.ts +0 -8
  679. package/dist/templates/componentPlateHelpers.d.ts +0 -11
  680. package/dist/templates/componentPlateMapProps.d.ts +0 -3
  681. package/dist/templates/componentPropsFactory.d.ts +0 -3
  682. package/dist/templates/componentQpcrPlateProps.d.ts +0 -3
  683. package/dist/templates/componentTargetResolvers.d.ts +0 -5
  684. package/dist/templates/componentTemplateProps.d.ts +0 -3
  685. package/dist/templates/controlSchemaClone.d.ts +0 -4
  686. package/dist/templates/controlSchemaConstants.d.ts +0 -10
  687. package/dist/templates/controlSchemaMerge.d.ts +0 -3
  688. package/dist/templates/controlSchemaTargets.d.ts +0 -17
  689. package/dist/templates/controlSchemaTypes.d.ts +0 -4
  690. package/dist/templates/controlSchemas.d.ts +0 -34
  691. package/dist/templates/defaultBioTemplateBuilder.d.ts +0 -3
  692. package/dist/templates/doseResponseAdapters.d.ts +0 -6
  693. package/dist/templates/doseResponseBuilder.d.ts +0 -3
  694. package/dist/templates/elisaAssayCollectionBuilder.d.ts +0 -3
  695. package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +0 -3
  696. package/dist/templates/flowCytometryPanelBuilder.d.ts +0 -3
  697. package/dist/templates/flowNormalizers.d.ts +0 -8
  698. package/dist/templates/flowPanelAdapters.d.ts +0 -7
  699. package/dist/templates/index.d.ts +0 -15
  700. package/dist/templates/index.js +0 -2
  701. package/dist/templates/instrumentRunAdapterHelpers.d.ts +0 -8
  702. package/dist/templates/instrumentRunAdapters.d.ts +0 -19
  703. package/dist/templates/instrumentRunBuilder.d.ts +0 -3
  704. package/dist/templates/lcmsBatchCollectionBuilder.d.ts +0 -3
  705. package/dist/templates/lookup.d.ts +0 -4
  706. package/dist/templates/packs.d.ts +0 -21
  707. package/dist/templates/plateMapAdapters.d.ts +0 -5
  708. package/dist/templates/plateMapBuilder.d.ts +0 -3
  709. package/dist/templates/presetControlSchemas.d.ts +0 -534
  710. package/dist/templates/presets.d.ts +0 -106
  711. package/dist/templates/protocolAdapters.d.ts +0 -9
  712. package/dist/templates/protocolNormalizers.d.ts +0 -6
  713. package/dist/templates/protocolStepsBuilder.d.ts +0 -3
  714. package/dist/templates/qpcrAdapters.d.ts +0 -9
  715. package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +0 -3
  716. package/dist/templates/qpcrPlateBuilder.d.ts +0 -3
  717. package/dist/templates/reagentAdapters.d.ts +0 -9
  718. package/dist/templates/reagentListBuilder.d.ts +0 -3
  719. package/dist/templates/runNormalizers.d.ts +0 -10
  720. package/dist/templates/sampleNormalizers.d.ts +0 -4
  721. package/dist/templates/samplePrepAdapters.d.ts +0 -7
  722. package/dist/templates/samplePrepBuilder.d.ts +0 -3
  723. package/dist/templates/sampleSheetAdapters.d.ts +0 -9
  724. package/dist/templates/sampleSheetBuilder.d.ts +0 -3
  725. package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +0 -3
  726. package/dist/templates/targetedMetabolomicsHelpers.d.ts +0 -5
  727. package/dist/templates/templateAdapterTypes.d.ts +0 -48
  728. package/dist/templates/templateControlSchemas.d.ts +0 -400
  729. package/dist/templates/templateCreateOptions.d.ts +0 -165
  730. package/dist/templates/templateEnvelopes.d.ts +0 -17
  731. package/dist/templates/templatePackCollectionBuilder.d.ts +0 -3
  732. package/dist/templates/templatePresetCollectionBuilder.d.ts +0 -20
  733. package/dist/templates/templateQpcrTypes.d.ts +0 -42
  734. package/dist/templates/templateValidators.d.ts +0 -25
  735. package/dist/templates/timeCourseAdapters.d.ts +0 -9
  736. package/dist/templates/timeCourseBuilder.d.ts +0 -3
  737. package/dist/templates/types.d.ts +0 -304
  738. package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +0 -3
  739. package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +0 -3
  740. package/dist/templates-B2DB0MCM.js +0 -12304
  741. package/dist/templates-B2DB0MCM.js.map +0 -1
  742. package/dist/utils/rack.d.ts +0 -63
  743. package/dist/validation-C_eH_vIg.js +0 -7999
  744. package/dist/validation-C_eH_vIg.js.map +0 -1
  745. package/src/__tests__/components/AppAvatarMenu.test.ts +0 -186
  746. package/src/__tests__/components/AppTopBar.navigation.test.ts +0 -68
  747. package/src/__tests__/components/AppTopBarPresence.test.ts +0 -47
  748. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +0 -159
  749. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +0 -192
  750. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +0 -307
  751. package/src/__tests__/components/BioTemplateRenderer.test.ts +0 -96
  752. package/src/__tests__/components/ControlWorkspaceView.test.ts +0 -1100
  753. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +0 -183
  754. package/src/__tests__/components/ExperimentTimeline.test.ts +0 -108
  755. package/src/__tests__/components/FitPanel.test.ts +0 -96
  756. package/src/__tests__/components/GroupAssigner.test.ts +0 -101
  757. package/src/__tests__/components/MobileSupportGate.test.ts +0 -120
  758. package/src/__tests__/components/ReagentList.presentation.test.ts +0 -73
  759. package/src/__tests__/components/ReagentList.test.ts +0 -167
  760. package/src/__tests__/components/SampleLegend.test.ts +0 -18
  761. package/src/__tests__/components/SmartGroupModal.test.ts +0 -69
  762. package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +0 -58
  763. package/src/__tests__/components/iconButtonIconSizing.test.ts +0 -18
  764. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +0 -125
  765. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +0 -199
  766. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +0 -104
  767. package/src/__tests__/composables/useExperimentSave.test.ts +0 -542
  768. package/src/__tests__/composables/useGroupAssignment.test.ts +0 -73
  769. package/src/__tests__/composables/useMobileSupportGate.test.ts +0 -74
  770. package/src/__tests__/composables/usePlatformContext.test.ts +0 -148
  771. package/src/__tests__/composables/usePresenceHeartbeat.test.ts +0 -164
  772. package/src/__tests__/composables/useRuntimeAlignment.test.ts +0 -145
  773. package/src/__tests__/composables/useTemplateCollection.test.ts +0 -147
  774. package/src/__tests__/docs/extractDocsTemplates.test.ts +0 -53
  775. package/src/__tests__/fixtures/templates/dose-response.json +0 -81
  776. package/src/__tests__/fixtures/templates/plate-map.json +0 -54
  777. package/src/__tests__/fixtures/templates/qpcr-plate.json +0 -96
  778. package/src/__tests__/fixtures/templates/sample-sheet.json +0 -71
  779. package/src/__tests__/templates/templates.test.ts +0 -1235
  780. package/src/__tests__/templates/templatesDeprecation.test.ts +0 -78
  781. package/src/__tests__/utils/lcms.test.ts +0 -73
  782. package/src/__tests__/utils/rack.test.ts +0 -120
  783. package/src/components/AppAvatarMenu.story.vue +0 -155
  784. package/src/components/AppAvatarMenu.vue +0 -154
  785. package/src/components/AppTopBar.navigation.ts +0 -60
  786. package/src/components/AutoGroupModal.story.vue +0 -458
  787. package/src/components/BaseTextarea.vue +0 -58
  788. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +0 -123
  789. package/src/components/BioTemplateExperimentWorkspaceView.vue +0 -339
  790. package/src/components/BioTemplatePackWorkspaceView.story.vue +0 -107
  791. package/src/components/BioTemplatePackWorkspaceView.vue +0 -180
  792. package/src/components/BioTemplatePresetWorkspaceView.story.vue +0 -163
  793. package/src/components/BioTemplatePresetWorkspaceView.vue +0 -403
  794. package/src/components/BioTemplateRenderer.story.vue +0 -57
  795. package/src/components/BioTemplateRenderer.vue +0 -64
  796. package/src/components/ControlWorkspaceView.story.vue +0 -347
  797. package/src/components/ControlWorkspaceView.vue +0 -370
  798. package/src/components/DoseDesignWorkspaceView.story.vue +0 -77
  799. package/src/components/DoseDesignWorkspaceView.vue +0 -243
  800. package/src/components/ExperimentDataViewer.story.vue +0 -177
  801. package/src/components/ExperimentDataViewer.vue +0 -313
  802. package/src/components/ExperimentTimeline.story.vue +0 -208
  803. package/src/components/ExperimentTimeline.vue +0 -383
  804. package/src/components/FitPanel.story.vue +0 -191
  805. package/src/components/FitPanel.vue +0 -168
  806. package/src/components/FormActions.story.vue +0 -96
  807. package/src/components/GroupAssigner.story.vue +0 -83
  808. package/src/components/GroupAssigner.vue +0 -319
  809. package/src/components/IconButton.story.vue +0 -140
  810. package/src/components/IconButton.vue +0 -69
  811. package/src/components/MobileSupportGate.story.vue +0 -52
  812. package/src/components/MobileSupportGate.vue +0 -111
  813. package/src/components/ReagentEditor.story.vue +0 -153
  814. package/src/components/ReagentEditor.vue +0 -414
  815. package/src/components/ReagentList.presentation.ts +0 -106
  816. package/src/components/ReagentList.story.vue +0 -155
  817. package/src/components/ReagentList.vue +0 -438
  818. package/src/components/SampleLegend.story.vue +0 -91
  819. package/src/components/SampleLegend.vue +0 -121
  820. package/src/components/SmartGroupModal.story.vue +0 -61
  821. package/src/components/SmartGroupModal.vue +0 -61
  822. package/src/components/StatusIndicator.story.vue +0 -99
  823. package/src/components/StatusIndicator.vue +0 -36
  824. package/src/components/UnitInput.story.vue +0 -194
  825. package/src/composables/flattenWorkspaceBindings.ts +0 -104
  826. package/src/composables/useBioTemplateComponents.ts +0 -117
  827. package/src/composables/useBioTemplateControls.ts +0 -45
  828. package/src/composables/useBioTemplatePackWorkspace.ts +0 -201
  829. package/src/composables/useBioTemplatePresetWorkspace.ts +0 -329
  830. package/src/composables/useBioTemplateWorkspace.ts +0 -120
  831. package/src/composables/useChemicalFormula.ts +0 -301
  832. package/src/composables/useDoseCalculator.ts +0 -370
  833. package/src/composables/useExperimentSave.ts +0 -348
  834. package/src/composables/useGroupAssignment.ts +0 -152
  835. package/src/composables/useJobsStatusTray.ts +0 -493
  836. package/src/composables/useMobileSupportGate.ts +0 -80
  837. package/src/composables/usePlatformContext.ts +0 -299
  838. package/src/composables/usePresenceHeartbeat.ts +0 -201
  839. package/src/composables/useRuntimeAlignment.ts +0 -184
  840. package/src/composables/useTemplateCollection.ts +0 -233
  841. package/src/composables/workspaceRecipes.ts +0 -268
  842. package/src/lcms.ts +0 -119
  843. package/src/styles/components/app-avatar-menu.css +0 -121
  844. package/src/styles/components/experiment-data-viewer.css +0 -138
  845. package/src/styles/components/experiment-timeline.css +0 -572
  846. package/src/styles/components/fit-panel.css +0 -153
  847. package/src/styles/components/group-assigner.css +0 -198
  848. package/src/styles/components/mobile-support-gate.css +0 -117
  849. package/src/styles/components/reagent-editor.css +0 -501
  850. package/src/styles/components/reagent-list.css +0 -408
  851. package/src/styles/components/sample-legend.css +0 -212
  852. package/src/styles/components/status-indicator.css +0 -66
  853. package/src/styles/components/theme-toggle.css +0 -6
  854. package/src/tailwind.preset.ts +0 -66
  855. package/src/templates/adapters.ts +0 -141
  856. package/src/templates/assayLookups.ts +0 -33
  857. package/src/templates/assayMatrixAdapters.ts +0 -85
  858. package/src/templates/assayMatrixBuilder.ts +0 -60
  859. package/src/templates/assayNormalizers.ts +0 -34
  860. package/src/templates/builderIdUtils.ts +0 -20
  861. package/src/templates/builderPresetControls.ts +0 -166
  862. package/src/templates/builderReadUtils.ts +0 -55
  863. package/src/templates/builders.ts +0 -122
  864. package/src/templates/calibrationCurveAdapters.ts +0 -62
  865. package/src/templates/calibrationCurveBuilder.ts +0 -100
  866. package/src/templates/calibrationNormalizers.ts +0 -60
  867. package/src/templates/catalog.ts +0 -249
  868. package/src/templates/componentBindingCatalog.ts +0 -90
  869. package/src/templates/componentBindingHelpers.ts +0 -93
  870. package/src/templates/componentBindings.ts +0 -279
  871. package/src/templates/componentDoseResponseProps.ts +0 -41
  872. package/src/templates/componentGenericProps.ts +0 -77
  873. package/src/templates/componentPlateHelpers.ts +0 -52
  874. package/src/templates/componentPlateMapProps.ts +0 -34
  875. package/src/templates/componentPropsFactory.ts +0 -21
  876. package/src/templates/componentQpcrPlateProps.ts +0 -27
  877. package/src/templates/componentTargetResolvers.ts +0 -67
  878. package/src/templates/componentTemplateProps.ts +0 -78
  879. package/src/templates/controlSchemaClone.ts +0 -32
  880. package/src/templates/controlSchemaConstants.ts +0 -11
  881. package/src/templates/controlSchemaMerge.ts +0 -40
  882. package/src/templates/controlSchemaTargets.ts +0 -85
  883. package/src/templates/controlSchemaTypes.ts +0 -20
  884. package/src/templates/controlSchemas.ts +0 -113
  885. package/src/templates/defaultBioTemplateBuilder.ts +0 -125
  886. package/src/templates/doseResponseAdapters.ts +0 -36
  887. package/src/templates/doseResponseBuilder.ts +0 -45
  888. package/src/templates/elisaAssayCollectionBuilder.ts +0 -63
  889. package/src/templates/flowCytometryAssayCollectionBuilder.ts +0 -42
  890. package/src/templates/flowCytometryPanelBuilder.ts +0 -54
  891. package/src/templates/flowNormalizers.ts +0 -58
  892. package/src/templates/flowPanelAdapters.ts +0 -61
  893. package/src/templates/index.ts +0 -330
  894. package/src/templates/instrumentRunAdapterHelpers.ts +0 -94
  895. package/src/templates/instrumentRunAdapters.ts +0 -174
  896. package/src/templates/instrumentRunBuilder.ts +0 -98
  897. package/src/templates/lcmsBatchCollectionBuilder.ts +0 -39
  898. package/src/templates/lookup.ts +0 -18
  899. package/src/templates/packs.ts +0 -166
  900. package/src/templates/plateMapAdapters.ts +0 -38
  901. package/src/templates/plateMapBuilder.ts +0 -44
  902. package/src/templates/presetControlSchemas.ts +0 -258
  903. package/src/templates/presets.ts +0 -183
  904. package/src/templates/protocolAdapters.ts +0 -73
  905. package/src/templates/protocolNormalizers.ts +0 -37
  906. package/src/templates/protocolStepsBuilder.ts +0 -37
  907. package/src/templates/qpcrAdapters.ts +0 -108
  908. package/src/templates/qpcrExpressionCollectionBuilder.ts +0 -34
  909. package/src/templates/qpcrPlateBuilder.ts +0 -97
  910. package/src/templates/reagentAdapters.ts +0 -81
  911. package/src/templates/reagentListBuilder.ts +0 -31
  912. package/src/templates/runNormalizers.ts +0 -63
  913. package/src/templates/sampleNormalizers.ts +0 -58
  914. package/src/templates/samplePrepAdapters.ts +0 -66
  915. package/src/templates/samplePrepBuilder.ts +0 -52
  916. package/src/templates/sampleSheetAdapters.ts +0 -79
  917. package/src/templates/sampleSheetBuilder.ts +0 -24
  918. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +0 -80
  919. package/src/templates/targetedMetabolomicsHelpers.ts +0 -102
  920. package/src/templates/templateAdapterTypes.ts +0 -58
  921. package/src/templates/templateControlSchemas.ts +0 -320
  922. package/src/templates/templateCreateOptions.ts +0 -208
  923. package/src/templates/templateEnvelopes.ts +0 -145
  924. package/src/templates/templatePackCollectionBuilder.ts +0 -24
  925. package/src/templates/templatePresetCollectionBuilder.ts +0 -141
  926. package/src/templates/templateQpcrTypes.ts +0 -48
  927. package/src/templates/templateValidators.ts +0 -426
  928. package/src/templates/timeCourseAdapters.ts +0 -77
  929. package/src/templates/timeCourseBuilder.ts +0 -65
  930. package/src/templates/types.ts +0 -493
  931. package/src/templates/wellPlateScreenCollectionBuilder.ts +0 -37
  932. package/src/templates/westernBlotAssayCollectionBuilder.ts +0 -69
  933. package/src/utils/rack.ts +0 -225
  934. /package/dist/__tests__/components/{AppAvatarMenu.test.d.ts → BaseButton.test.d.ts} +0 -0
  935. /package/dist/__tests__/components/{AppTopBar.navigation.test.d.ts → BaseCheckbox.switch.test.d.ts} +0 -0
  936. /package/dist/__tests__/components/{AppTopBarPresence.test.d.ts → BaseSelect.multiple.test.d.ts} +0 -0
  937. /package/dist/__tests__/components/{BaseToggle.test.d.ts → BaseSelect.searchable.test.d.ts} +0 -0
  938. /package/dist/__tests__/components/{BioTemplateExperimentWorkspaceView.test.d.ts → ConfirmDialog.test.d.ts} +0 -0
  939. /package/dist/__tests__/components/{BioTemplatePackWorkspaceView.test.d.ts → DatePicker.datetime.test.d.ts} +0 -0
  940. /package/dist/__tests__/components/{BioTemplatePresetWorkspaceView.test.d.ts → DatePicker.time.test.d.ts} +0 -0
  941. /package/dist/__tests__/components/{BioTemplateRenderer.test.d.ts → FormSchemaInternal.test.d.ts} +0 -0
  942. /package/dist/__tests__/components/{ControlWorkspaceView.test.d.ts → InstrumentStatusPanels.test.d.ts} +0 -0
  943. /package/dist/__tests__/components/{DateTimePicker.test.d.ts → NumberInput.units.test.d.ts} +0 -0
  944. /package/dist/__tests__/components/{DoseDesignWorkspaceView.test.d.ts → PresenceAvatars.test.d.ts} +0 -0
  945. /package/dist/__tests__/components/{ExperimentTimeline.test.d.ts → StaleFormBanner.test.d.ts} +0 -0
  946. /package/dist/__tests__/components/{FitPanel.test.d.ts → deprecationTags.test.d.ts} +0 -0
  947. /package/dist/__tests__/{components/GroupAssigner.test.d.ts → composables/createClient.test.d.ts} +0 -0
  948. /package/dist/__tests__/{components/MobileSupportGate.test.d.ts → composables/eventStream.test.d.ts} +0 -0
  949. /package/dist/__tests__/{components/MultiSelect.test.d.ts → composables/useArtifacts.test.d.ts} +0 -0
  950. /package/dist/__tests__/{components/ReagentList.presentation.test.d.ts → composables/useExperiment.test.d.ts} +0 -0
  951. /package/dist/__tests__/{components/ReagentList.test.d.ts → composables/useJobCenter.test.d.ts} +0 -0
  952. /package/dist/__tests__/{components/SampleLegend.test.d.ts → composables/useJobsEndpoint.test.d.ts} +0 -0
  953. /package/dist/__tests__/{components/SearchableSelect.test.d.ts → composables/usePlatform.test.d.ts} +0 -0
  954. /package/dist/__tests__/{components/SmartGroupModal.test.d.ts → composables/usePresence.test.d.ts} +0 -0
  955. /package/dist/__tests__/{components/TimePicker.test.d.ts → composables/useRealtime.test.d.ts} +0 -0
  956. /package/dist/__tests__/{components/UnitInput.test.d.ts → composables/useRequest.test.d.ts} +0 -0
  957. /package/dist/__tests__/{components/WellPlate.sampleTypeIndicator.test.d.ts → composables/useVersionedSave.test.d.ts} +0 -0
  958. /package/dist/__tests__/{components/iconButtonIconSizing.test.d.ts → utils/formula.test.d.ts} +0 -0
  959. /package/dist/__tests__/{composables/useAnalysisArtifacts.test.d.ts → utils/time.test.d.ts} +0 -0
  960. /package/dist/components/{FormActions.vue.d.ts → internal/FormActionsInternal.vue.d.ts} +0 -0
  961. /package/dist/{composables → components/internal}/autoGroup/colors.d.ts +0 -0
  962. /package/dist/{composables → components/internal}/autoGroup/index.d.ts +0 -0
  963. /package/dist/{composables → components/internal}/autoGroup/tokenize.d.ts +0 -0
  964. /package/src/{composables → components/internal}/autoGroup/colors.ts +0 -0
  965. /package/src/{composables → components/internal}/autoGroup/tokenize.ts +0 -0
  966. /package/src/{composables → components/internal}/autoGroup/vocab.json +0 -0
@@ -5,25 +5,23 @@ import { createPinia } from 'pinia'
5
5
  import AppTopBar from '../../components/AppTopBar.vue'
6
6
  import ExperimentPopover from '../../components/ExperimentPopover.vue'
7
7
  import ExperimentSelectorModal from '../../components/ExperimentSelectorModal.vue'
8
- import { usePlatformContext } from '../../composables/usePlatformContext'
8
+ import { usePlatform } from '../../composables/usePlatform'
9
9
  import { APP_EXPERIMENT_KEY, type AppExperimentState } from '../../composables/useAppExperiment'
10
10
  import { defineControlModel, defineControls } from '../../composables/useControlSchema'
11
11
  import ThemeToggle from '../../components/ThemeToggle.vue'
12
12
  import SettingsModal from '../../components/SettingsModal.vue'
13
13
  import type { TopBarSettingsConfig } from '../../types/components'
14
14
 
15
- // Mock the usePlatformContext composable
16
- vi.mock('../../composables/usePlatformContext', () => ({
17
- usePlatformContext: vi.fn(() => ({
18
- isIntegrated: computed(() => false),
19
- context: ref({ isIntegrated: false, theme: 'system' }),
15
+ // Mock the usePlatform composable
16
+ vi.mock('../../composables/usePlatform', () => ({
17
+ usePlatform: vi.fn(() => ({
18
+ integrated: computed(() => false),
19
+ isAdmin: computed(() => true),
20
+ can: () => true,
20
21
  plugin: computed(() => undefined),
21
22
  user: computed(() => undefined),
22
23
  theme: computed(() => 'system' as const),
23
24
  features: computed(() => undefined),
24
- navigate: vi.fn(),
25
- notify: vi.fn(),
26
- sendToPlatform: vi.fn(),
27
25
  })),
28
26
  }))
29
27
 
@@ -117,19 +115,19 @@ describe('AppTopBar', () => {
117
115
  })
118
116
  })
119
117
 
120
- describe('showThemeToggle prop', () => {
121
- it('should not render ThemeToggle when showThemeToggle is false', () => {
118
+ describe('spec.themeToggle', () => {
119
+ it('should not render ThemeToggle when spec.themeToggle is false', () => {
122
120
  const wrapper = createWrapper({
121
+ spec: { themeToggle: false },
123
122
  title: 'Test App',
124
- showThemeToggle: false,
125
123
  })
126
124
  expect(wrapper.findComponent(ThemeToggle).exists()).toBe(false)
127
125
  })
128
126
 
129
- it('should render ThemeToggle when showThemeToggle is true', () => {
127
+ it('should render ThemeToggle when spec.themeToggle is true', () => {
130
128
  const wrapper = createWrapper({
129
+ spec: { themeToggle: true },
131
130
  title: 'Test App',
132
- showThemeToggle: true,
133
131
  })
134
132
  const themeToggle = wrapper.findComponent(ThemeToggle)
135
133
  expect(themeToggle.exists()).toBe(true)
@@ -137,8 +135,8 @@ describe('AppTopBar', () => {
137
135
 
138
136
  it('should pass size="sm" to ThemeToggle', () => {
139
137
  const wrapper = createWrapper({
138
+ spec: { themeToggle: true },
140
139
  title: 'Test App',
141
- showThemeToggle: true,
142
140
  })
143
141
  const themeToggle = wrapper.findComponent(ThemeToggle)
144
142
  expect(themeToggle.props('size')).toBe('sm')
@@ -146,36 +144,48 @@ describe('AppTopBar', () => {
146
144
 
147
145
  it('should render ThemeToggle in right section', () => {
148
146
  const wrapper = createWrapper({
147
+ spec: { themeToggle: true },
149
148
  title: 'Test App',
150
- showThemeToggle: true,
151
149
  })
152
150
  const rightSection = wrapper.find('.mint-topbar__right')
153
151
  expect(rightSection.findComponent(ThemeToggle).exists()).toBe(true)
154
152
  })
155
153
  })
156
154
 
157
- describe('showSettings prop', () => {
158
- it('should not render settings button when showSettings is false', () => {
155
+ describe('spec.settings', () => {
156
+ it('should not render settings button when spec.settings is false', () => {
159
157
  const wrapper = createWrapper({
158
+ spec: { settings: false },
160
159
  title: 'Test App',
161
- showSettings: false,
162
160
  })
163
161
  expect(wrapper.find('.mint-topbar__settings-btn').exists()).toBe(false)
164
162
  })
165
163
 
166
- it('should render settings button when showSettings is true', () => {
164
+ it('should render settings button when spec.settings is set', () => {
167
165
  const wrapper = createWrapper({
166
+ spec: { settings: {} },
168
167
  title: 'Test App',
169
- showSettings: true,
170
168
  })
171
169
  const settingsBtn = wrapper.find('.mint-topbar__settings-btn')
172
170
  expect(settingsBtn.exists()).toBe(true)
173
171
  })
174
172
 
173
+ it('should follow a spec.settings getter', async () => {
174
+ const canConfigure = ref(true)
175
+ const wrapper = createWrapper({
176
+ spec: { settings: () => (canConfigure.value ? {} : false) },
177
+ title: 'Test App',
178
+ })
179
+ canConfigure.value = false
180
+ await wrapper.vm.$nextTick()
181
+
182
+ expect(wrapper.find('.mint-topbar__settings-btn').exists()).toBe(false)
183
+ })
184
+
175
185
  it('should render SettingsModal after settings is opened', async () => {
176
186
  const wrapper = createWrapper({
187
+ spec: { settings: {} },
177
188
  title: 'Test App',
178
- showSettings: true,
179
189
  })
180
190
  expect(wrapper.findComponent(SettingsModal).exists()).toBe(false)
181
191
 
@@ -185,8 +195,8 @@ describe('AppTopBar', () => {
185
195
 
186
196
  it('should have aria-label on settings button', () => {
187
197
  const wrapper = createWrapper({
198
+ spec: { settings: {} },
188
199
  title: 'Test App',
189
- showSettings: true,
190
200
  })
191
201
  const settingsBtn = wrapper.find('.mint-topbar__settings-btn')
192
202
  expect(settingsBtn.attributes('aria-label')).toBe('Open settings')
@@ -194,8 +204,8 @@ describe('AppTopBar', () => {
194
204
 
195
205
  it('should render settings icon SVG', () => {
196
206
  const wrapper = createWrapper({
207
+ spec: { settings: {} },
197
208
  title: 'Test App',
198
- showSettings: true,
199
209
  })
200
210
  const settingsBtn = wrapper.find('.mint-topbar__settings-btn')
201
211
  const icon = settingsBtn.find('.mint-topbar__settings-icon')
@@ -207,34 +217,33 @@ describe('AppTopBar', () => {
207
217
  describe('settings button interaction', () => {
208
218
  it('should open SettingsModal when settings button is clicked', async () => {
209
219
  const wrapper = createWrapper({
220
+ spec: { settings: {} },
210
221
  title: 'Test App',
211
- showSettings: true,
212
222
  })
213
223
 
214
224
  const settingsModal = await openSettingsModal(wrapper)
215
- expect(settingsModal.props('modelValue')).toBe(true)
225
+ expect(settingsModal.props('open')).toBe(true)
216
226
  })
217
227
 
218
228
  it('should not mount SettingsModal while closed', () => {
219
229
  const wrapper = createWrapper({
230
+ spec: { settings: {} },
220
231
  title: 'Test App',
221
- showSettings: true,
222
232
  })
223
233
 
224
234
  expect(wrapper.findComponent(SettingsModal).exists()).toBe(false)
225
235
  })
226
236
  })
227
237
 
228
- describe('settingsConfig prop', () => {
238
+ describe('spec.settings config', () => {
229
239
  it('should pass title to SettingsModal', async () => {
230
240
  const settingsConfig: TopBarSettingsConfig = {
231
241
  title: 'Custom Settings',
232
242
  }
233
243
 
234
244
  const wrapper = createWrapper({
245
+ spec: { settings: settingsConfig },
235
246
  title: 'Test App',
236
- showSettings: true,
237
- settingsConfig,
238
247
  })
239
248
 
240
249
  const settingsModal = await openSettingsModal(wrapper)
@@ -250,9 +259,8 @@ describe('AppTopBar', () => {
250
259
  }
251
260
 
252
261
  const wrapper = createWrapper({
262
+ spec: { settings: settingsConfig },
253
263
  title: 'Test App',
254
- showSettings: true,
255
- settingsConfig,
256
264
  })
257
265
 
258
266
  const settingsModal = await openSettingsModal(wrapper)
@@ -261,12 +269,13 @@ describe('AppTopBar', () => {
261
269
 
262
270
  it('should normalize shorthand settings tabs for SettingsModal', async () => {
263
271
  const wrapper = createWrapper({
264
- title: 'Test App',
265
- showSettings: true,
266
- settingsConfig: {
267
- tabs: ['General', 'Advanced'],
268
- showAppearance: false,
272
+ spec: {
273
+ settings: {
274
+ tabs: ['General', 'Advanced'],
275
+ showAppearance: false,
276
+ },
269
277
  },
278
+ title: 'Test App',
270
279
  })
271
280
 
272
281
  const settingsModal = await openSettingsModal(wrapper)
@@ -301,21 +310,22 @@ describe('AppTopBar', () => {
301
310
  }
302
311
  const settingsConfig: TopBarSettingsConfig = {
303
312
  showAppearance: false,
304
- schema,
313
+ spec: schema,
305
314
  values: { threshold: 0.25, method: 'linear', externalContext: 'experiment-1' },
306
315
  }
307
316
 
308
317
  const wrapper = createWrapper({
318
+ spec: { settings: settingsConfig },
309
319
  title: 'Test App',
310
- showSettings: true,
311
- settingsConfig,
312
320
  })
313
321
 
314
322
  await openSettingsModal(wrapper)
315
323
  await wrapper.setProps({
316
- settingsConfig: {
317
- ...settingsConfig,
318
- values: { threshold: 0.75, method: 'logistic', externalContext: 'experiment-2' },
324
+ spec: {
325
+ settings: {
326
+ ...settingsConfig,
327
+ values: { threshold: 0.75, method: 'logistic', externalContext: 'experiment-2' },
328
+ },
319
329
  },
320
330
  })
321
331
  await waitForAsyncComponents(wrapper)
@@ -324,7 +334,7 @@ describe('AppTopBar', () => {
324
334
  expect((wrapper.find('select').element as HTMLSelectElement).value).toBe('logistic')
325
335
  })
326
336
 
327
- it('should render compact controls in SettingsModal', async () => {
337
+ it('should pass a control model built from controls to SettingsModal', async () => {
328
338
  const controls = defineControls({
329
339
  threshold: {
330
340
  label: 'Threshold',
@@ -333,19 +343,19 @@ describe('AppTopBar', () => {
333
343
  sectionLabel: 'Parameters',
334
344
  },
335
345
  })
346
+ const model = defineControlModel({ controls })
336
347
  const settingsConfig: TopBarSettingsConfig = {
337
348
  showAppearance: false,
338
- controls,
349
+ spec: model,
339
350
  }
340
351
 
341
352
  const wrapper = createWrapper({
353
+ spec: { settings: settingsConfig },
342
354
  title: 'Test App',
343
- showSettings: true,
344
- settingsConfig,
345
355
  })
346
356
 
347
357
  const settingsModal = await openSettingsModal(wrapper)
348
- expect(settingsModal.props('controls')).toStrictEqual(controls)
358
+ expect(settingsModal.props('spec')).toStrictEqual(model)
349
359
  expect(wrapper.text()).toContain('Threshold')
350
360
  expect((wrapper.find('input').element as HTMLInputElement).value).toBe('0.25')
351
361
  })
@@ -363,17 +373,16 @@ describe('AppTopBar', () => {
363
373
  })
364
374
  const settingsConfig: TopBarSettingsConfig = {
365
375
  showAppearance: false,
366
- model,
376
+ spec: model,
367
377
  }
368
378
 
369
379
  const wrapper = createWrapper({
380
+ spec: { settings: settingsConfig },
370
381
  title: 'Test App',
371
- showSettings: true,
372
- settingsConfig,
373
382
  })
374
383
 
375
384
  const settingsModal = await openSettingsModal(wrapper)
376
- expect(settingsModal.props('model')).toStrictEqual(model)
385
+ expect(settingsModal.props('spec')).toStrictEqual(model)
377
386
  expect(wrapper.text()).toContain('Threshold')
378
387
  expect((wrapper.find('input').element as HTMLInputElement).value).toBe('0.25')
379
388
  })
@@ -384,9 +393,8 @@ describe('AppTopBar', () => {
384
393
  }
385
394
 
386
395
  const wrapper = createWrapper({
396
+ spec: { settings: settingsConfig },
387
397
  title: 'Test App',
388
- showSettings: true,
389
- settingsConfig,
390
398
  })
391
399
 
392
400
  const settingsModal = await openSettingsModal(wrapper)
@@ -399,9 +407,8 @@ describe('AppTopBar', () => {
399
407
  }
400
408
 
401
409
  const wrapper = createWrapper({
410
+ spec: { settings: settingsConfig },
402
411
  title: 'Test App',
403
- showSettings: true,
404
- settingsConfig,
405
412
  })
406
413
 
407
414
  const settingsModal = await openSettingsModal(wrapper)
@@ -410,9 +417,8 @@ describe('AppTopBar', () => {
410
417
 
411
418
  it('should default showAppearance to true when not specified', async () => {
412
419
  const wrapper = createWrapper({
420
+ spec: { settings: {} },
413
421
  title: 'Test App',
414
- showSettings: true,
415
- settingsConfig: {},
416
422
  })
417
423
 
418
424
  const settingsModal = await openSettingsModal(wrapper)
@@ -425,9 +431,8 @@ describe('AppTopBar', () => {
425
431
  }
426
432
 
427
433
  const wrapper = createWrapper({
434
+ spec: { settings: settingsConfig },
428
435
  title: 'Test App',
429
- showSettings: true,
430
- settingsConfig,
431
436
  })
432
437
 
433
438
  const settingsModal = await openSettingsModal(wrapper)
@@ -436,8 +441,8 @@ describe('AppTopBar', () => {
436
441
 
437
442
  it('should use default size when not specified', async () => {
438
443
  const wrapper = createWrapper({
444
+ spec: { settings: {} },
439
445
  title: 'Test App',
440
- showSettings: true,
441
446
  })
442
447
 
443
448
  const settingsModal = await openSettingsModal(wrapper)
@@ -453,9 +458,8 @@ describe('AppTopBar', () => {
453
458
  }
454
459
 
455
460
  const wrapper = createWrapper({
461
+ spec: { settings: settingsConfig },
456
462
  title: 'Test App',
457
- showSettings: true,
458
- settingsConfig,
459
463
  }, {
460
464
  'settings-tab-general': '<div class="custom-tab-content">Custom General Tab</div>',
461
465
  })
@@ -466,12 +470,13 @@ describe('AppTopBar', () => {
466
470
 
467
471
  it('should forward shorthand settings-tab slots to SettingsModal', async () => {
468
472
  const wrapper = createWrapper({
469
- title: 'Test App',
470
- showSettings: true,
471
- settingsConfig: {
472
- tabs: ['General'],
473
- showAppearance: false,
473
+ spec: {
474
+ settings: {
475
+ tabs: ['General'],
476
+ showAppearance: false,
477
+ },
474
478
  },
479
+ title: 'Test App',
475
480
  }, {
476
481
  'settings-tab-General': '<div>General Content</div>',
477
482
  })
@@ -489,9 +494,8 @@ describe('AppTopBar', () => {
489
494
  }
490
495
 
491
496
  const wrapper = createWrapper({
497
+ spec: { settings: settingsConfig },
492
498
  title: 'Test App',
493
- showSettings: true,
494
- settingsConfig,
495
499
  }, {
496
500
  'settings-tab-general': '<div>General Content</div>',
497
501
  'settings-tab-advanced': '<div>Advanced Content</div>',
@@ -504,8 +508,8 @@ describe('AppTopBar', () => {
504
508
 
505
509
  it('should forward settings-appearance slot', async () => {
506
510
  const wrapper = createWrapper({
511
+ spec: { settings: {} },
507
512
  title: 'Test App',
508
- showSettings: true,
509
513
  }, {
510
514
  'settings-appearance': '<div class="custom-appearance">Custom Appearance</div>',
511
515
  })
@@ -515,25 +519,36 @@ describe('AppTopBar', () => {
515
519
  })
516
520
  })
517
521
 
518
- describe('showStandaloneLabel prop', () => {
519
- it('should show standalone badge when showStandaloneLabel is true (default)', () => {
522
+ describe('spec.standaloneLabel visibility', () => {
523
+ it('should show standalone badge by default', () => {
520
524
  const wrapper = createWrapper({
521
525
  title: 'Test App',
522
- showStandaloneLabel: true,
523
526
  })
524
527
  expect(wrapper.find('.mint-topbar__standalone-badge').exists()).toBe(true)
525
528
  })
526
529
 
527
- it('should hide standalone badge when showStandaloneLabel is false', () => {
530
+ it('should hide standalone badge when spec.standaloneLabel is false', () => {
528
531
  const wrapper = createWrapper({
532
+ spec: { standaloneLabel: false },
529
533
  title: 'Test App',
530
- showStandaloneLabel: false,
534
+ })
535
+ expect(wrapper.find('.mint-topbar__standalone-badge').exists()).toBe(false)
536
+ })
537
+
538
+ it('should hide standalone badge when spec.standaloneLabel is false and an app experiment is provided', () => {
539
+ const wrapper = mount(AppTopBar, {
540
+ props: { title: 'Test App', spec: { standaloneLabel: false } },
541
+ global: {
542
+ plugins: [createPinia()],
543
+ provide: { [APP_EXPERIMENT_KEY as symbol]: {} as AppExperimentState },
544
+ stubs: { 'router-link': { template: '<a><slot /></a>' } },
545
+ },
531
546
  })
532
547
  expect(wrapper.find('.mint-topbar__standalone-badge').exists()).toBe(false)
533
548
  })
534
549
  })
535
550
 
536
- describe('standaloneLabel prop', () => {
551
+ describe('spec.standaloneLabel text', () => {
537
552
  it('should display default "Standalone" label', () => {
538
553
  const wrapper = createWrapper({
539
554
  title: 'Test App',
@@ -544,8 +559,8 @@ describe('AppTopBar', () => {
544
559
 
545
560
  it('should display custom standalone label', () => {
546
561
  const wrapper = createWrapper({
562
+ spec: { standaloneLabel: 'Demo Mode' },
547
563
  title: 'Test App',
548
- standaloneLabel: 'Demo Mode',
549
564
  })
550
565
  const badge = wrapper.find('.mint-topbar__standalone-badge')
551
566
  expect(badge.text()).toBe('Demo Mode')
@@ -553,8 +568,8 @@ describe('AppTopBar', () => {
553
568
 
554
569
  it('should support empty string as label', () => {
555
570
  const wrapper = createWrapper({
571
+ spec: { standaloneLabel: '' },
556
572
  title: 'Test App',
557
- standaloneLabel: '',
558
573
  })
559
574
  const badge = wrapper.find('.mint-topbar__standalone-badge')
560
575
  expect(badge.text()).toBe('')
@@ -568,7 +583,6 @@ describe('AppTopBar', () => {
568
583
  // The component code correctly checks isStandalone computed property
569
584
  const wrapper = createWrapper({
570
585
  title: 'Test App',
571
- showStandaloneLabel: true,
572
586
  })
573
587
 
574
588
  // In non-integrated mode (default mock), badge should be visible
@@ -578,9 +592,10 @@ describe('AppTopBar', () => {
578
592
 
579
593
  describe('combined features', () => {
580
594
  it('does not bind an experiment when the integrated plugin is static', async () => {
581
- vi.mocked(usePlatformContext).mockReturnValueOnce({
582
- isIntegrated: computed(() => true),
583
- context: ref({ isIntegrated: true, theme: 'system' }),
595
+ vi.mocked(usePlatform).mockReturnValueOnce({
596
+ integrated: computed(() => true),
597
+ isAdmin: computed(() => true),
598
+ can: () => true,
584
599
  plugin: computed(() => ({
585
600
  id: 'hmdb',
586
601
  name: 'HMDB',
@@ -588,13 +603,12 @@ describe('AppTopBar', () => {
588
603
  route_prefix: '/hmdb',
589
604
  api_prefix: '/api/hmdb',
590
605
  plugin_type: 'static',
606
+ display_name: 'HMDB',
607
+ settings_api: 'platform' as const,
591
608
  })),
592
609
  user: computed(() => undefined),
593
610
  theme: computed(() => 'system' as const),
594
611
  features: computed(() => undefined),
595
- navigate: vi.fn(),
596
- notify: vi.fn(),
597
- sendToPlatform: vi.fn(),
598
612
  })
599
613
  const wrapper = mount(AppTopBar, {
600
614
  props: { title: 'HMDB' },
@@ -618,16 +632,14 @@ describe('AppTopBar', () => {
618
632
  })
619
633
 
620
634
  it('passes injected app experiment bindings to the popover and selector modal', async () => {
621
- vi.mocked(usePlatformContext).mockReturnValueOnce({
622
- isIntegrated: computed(() => true),
623
- context: ref({ isIntegrated: true, theme: 'system' }),
635
+ vi.mocked(usePlatform).mockReturnValueOnce({
636
+ integrated: computed(() => true),
637
+ isAdmin: computed(() => true),
638
+ can: () => true,
624
639
  plugin: computed(() => undefined),
625
640
  user: computed(() => undefined),
626
641
  theme: computed(() => 'system' as const),
627
642
  features: computed(() => undefined),
628
- navigate: vi.fn(),
629
- notify: vi.fn(),
630
- sendToPlatform: vi.fn(),
631
643
  })
632
644
  const appExperiment: AppExperimentState = {
633
645
  experimentName: computed(() => 'Dose response'),
@@ -657,7 +669,7 @@ describe('AppTopBar', () => {
657
669
  saveSuccessMessage: 'Saved',
658
670
  })),
659
671
  selectorModal: computed(() => ({
660
- modelValue: true,
672
+ open: true,
661
673
  currentExperimentId: 12,
662
674
  })),
663
675
  openModal: vi.fn(),
@@ -697,16 +709,15 @@ describe('AppTopBar', () => {
697
709
  saveSuccessMessage: 'Saved',
698
710
  })
699
711
  expect(wrapper.findComponent(ExperimentSelectorModal).props()).toMatchObject({
700
- modelValue: true,
712
+ open: true,
701
713
  currentExperimentId: 12,
702
714
  })
703
715
  })
704
716
 
705
717
  it('should render ThemeToggle and settings button together', () => {
706
718
  const wrapper = createWrapper({
719
+ spec: { themeToggle: true, settings: {} },
707
720
  title: 'Test App',
708
- showThemeToggle: true,
709
- showSettings: true,
710
721
  })
711
722
 
712
723
  expect(wrapper.findComponent(ThemeToggle).exists()).toBe(true)
@@ -715,11 +726,8 @@ describe('AppTopBar', () => {
715
726
 
716
727
  it('should render standalone badge, ThemeToggle, and settings button together', () => {
717
728
  const wrapper = createWrapper({
729
+ spec: { themeToggle: true, standaloneLabel: 'Offline', settings: {} },
718
730
  title: 'Test App',
719
- showThemeToggle: true,
720
- showSettings: true,
721
- showStandaloneLabel: true,
722
- standaloneLabel: 'Offline',
723
731
  })
724
732
 
725
733
  expect(wrapper.find('.mint-topbar__standalone-badge').exists()).toBe(true)
@@ -730,11 +738,9 @@ describe('AppTopBar', () => {
730
738
 
731
739
  it('should maintain existing topbar functionality with new features', () => {
732
740
  const wrapper = createWrapper({
741
+ spec: { themeToggle: true, settings: {} },
733
742
  title: 'My Plugin',
734
743
  subtitle: 'Version 1.0',
735
- showThemeToggle: true,
736
- showSettings: true,
737
- showStandaloneLabel: true,
738
744
  })
739
745
 
740
746
  // Verify title and subtitle still render
@@ -749,10 +755,8 @@ describe('AppTopBar', () => {
749
755
 
750
756
  it('should render all elements in correct order in right section', () => {
751
757
  const wrapper = createWrapper({
758
+ spec: { themeToggle: true, settings: {} },
752
759
  title: 'Test App',
753
- showThemeToggle: true,
754
- showSettings: true,
755
- showStandaloneLabel: true,
756
760
  }, {
757
761
  actions: '<button class="custom-action">Action</button>',
758
762
  })
@@ -784,19 +788,21 @@ describe('AppTopBar', () => {
784
788
 
785
789
  it('composes page selector, pill nav, theme, and settings controls', () => {
786
790
  const wrapper = createWrapper({
791
+ spec: {
792
+ themeToggle: true,
793
+ pills: [
794
+ { id: 'overview', label: 'Overview' },
795
+ { id: 'details', label: 'Details' },
796
+ ],
797
+ settings: {},
798
+ },
799
+ pill: 'overview',
787
800
  title: 'Dashboard',
788
801
  pageSelector: [
789
802
  { id: 'dashboard', label: 'Dashboard' },
790
803
  { id: 'settings', label: 'Settings' },
791
804
  ],
792
805
  currentPageSelectorId: 'dashboard',
793
- pillNav: [
794
- { id: 'overview', label: 'Overview' },
795
- { id: 'details', label: 'Details' },
796
- ],
797
- currentPillId: 'overview',
798
- showThemeToggle: true,
799
- showSettings: true,
800
806
  })
801
807
 
802
808
  expect(wrapper.find('.mint-page-selector__label').text()).toBe('Dashboard')
@@ -812,11 +818,13 @@ describe('AppTopBar', () => {
812
818
  it('renders pill nav items with icon metadata', async () => {
813
819
  const runIcon = 'M8 5v14l11-7z'
814
820
  const wrapper = createWrapper({
815
- pillNav: [
816
- { id: 'analysis', label: 'Run', icon: runIcon },
817
- { id: 'results', label: 'Results' },
818
- ],
819
- currentPillId: 'analysis',
821
+ spec: {
822
+ pills: [
823
+ { id: 'analysis', label: 'Run', icon: runIcon },
824
+ { id: 'results', label: 'Results' },
825
+ ],
826
+ },
827
+ pill: 'analysis',
820
828
  })
821
829
 
822
830
  const pills = wrapper.findAll('.mint-pill-nav__item')
@@ -829,6 +837,17 @@ describe('AppTopBar', () => {
829
837
  expect(wrapper.emitted('pill-select')?.[0][0]).toMatchObject({ id: 'results', label: 'Results' })
830
838
  })
831
839
 
840
+ it('emits update:pill with the id of the selected pill', async () => {
841
+ const wrapper = createWrapper({
842
+ spec: { pills: ['Run', 'Results'] },
843
+ pill: 'Run',
844
+ })
845
+
846
+ await wrapper.findAll('.mint-pill-nav__item')[1].trigger('click')
847
+
848
+ expect(wrapper.emitted('update:pill')).toEqual([['Results']])
849
+ })
850
+
832
851
  it('uses shared dropdown state for the page selector menu', async () => {
833
852
  const wrapper = createWrapper({
834
853
  pageSelector: [
@@ -893,11 +912,10 @@ describe('AppTopBar', () => {
893
912
  })
894
913
 
895
914
  describe('edge cases', () => {
896
- it('should handle empty settingsConfig object', async () => {
915
+ it('should handle empty spec.settings object', async () => {
897
916
  const wrapper = createWrapper({
917
+ spec: { settings: {} },
898
918
  title: 'Test App',
899
- showSettings: true,
900
- settingsConfig: {},
901
919
  })
902
920
 
903
921
  const settingsModal = await openSettingsModal(wrapper)
@@ -908,15 +926,14 @@ describe('AppTopBar', () => {
908
926
  expect(settingsModal.props('size')).toBe('lg')
909
927
  })
910
928
 
911
- it('should handle settingsConfig with only some fields', async () => {
929
+ it('should handle spec.settings with only some fields', async () => {
912
930
  const settingsConfig: TopBarSettingsConfig = {
913
931
  title: 'Partial Config',
914
932
  }
915
933
 
916
934
  const wrapper = createWrapper({
935
+ spec: { settings: settingsConfig },
917
936
  title: 'Test App',
918
- showSettings: true,
919
- settingsConfig,
920
937
  })
921
938
 
922
939
  const settingsModal = await openSettingsModal(wrapper)
@@ -930,8 +947,8 @@ describe('AppTopBar', () => {
930
947
 
931
948
  it('should handle standalone label with special characters', () => {
932
949
  const wrapper = createWrapper({
950
+ spec: { standaloneLabel: '🚀 Preview' },
933
951
  title: 'Test App',
934
- standaloneLabel: '🚀 Preview',
935
952
  })
936
953
 
937
954
  const badge = wrapper.find('.mint-topbar__standalone-badge')
@@ -941,8 +958,8 @@ describe('AppTopBar', () => {
941
958
  it('should handle very long standalone label', () => {
942
959
  const longLabel = 'This is a very long standalone mode label text'
943
960
  const wrapper = createWrapper({
961
+ spec: { standaloneLabel: longLabel },
944
962
  title: 'Test App',
945
- standaloneLabel: longLabel,
946
963
  })
947
964
 
948
965
  const badge = wrapper.find('.mint-topbar__standalone-badge')
@@ -951,7 +968,7 @@ describe('AppTopBar', () => {
951
968
  })
952
969
 
953
970
  describe('type safety', () => {
954
- it('should accept valid settingsConfig with all fields', async () => {
971
+ it('should accept valid spec.settings with all fields', async () => {
955
972
  const settingsConfig: TopBarSettingsConfig = {
956
973
  title: 'Complete Settings',
957
974
  tabs: [
@@ -963,9 +980,8 @@ describe('AppTopBar', () => {
963
980
  }
964
981
 
965
982
  const wrapper = createWrapper({
983
+ spec: { settings: settingsConfig },
966
984
  title: 'Test App',
967
- showSettings: true,
968
- settingsConfig,
969
985
  })
970
986
 
971
987
  expect((await openSettingsModal(wrapper)).exists()).toBe(true)
@@ -976,9 +992,8 @@ describe('AppTopBar', () => {
976
992
 
977
993
  for (const size of sizes) {
978
994
  const wrapper = createWrapper({
995
+ spec: { settings: { size } },
979
996
  title: 'Test App',
980
- showSettings: true,
981
- settingsConfig: { size },
982
997
  })
983
998
 
984
999
  const settingsModal = await openSettingsModal(wrapper)
@@ -997,16 +1012,14 @@ describe('AppTopBar', () => {
997
1012
  features: undefined as unknown,
998
1013
  }
999
1014
  const merged = { ...defaults, ...overrides }
1000
- vi.mocked(usePlatformContext).mockReturnValue({
1001
- isIntegrated: computed(() => merged.isIntegrated as boolean),
1002
- context: ref({ isIntegrated: merged.isIntegrated as boolean, theme: merged.theme }),
1015
+ vi.mocked(usePlatform).mockReturnValue({
1016
+ integrated: computed(() => merged.isIntegrated as boolean),
1017
+ isAdmin: computed(() => true),
1018
+ can: () => true,
1003
1019
  plugin: computed(() => merged.plugin as any),
1004
1020
  user: computed(() => merged.user as any),
1005
1021
  theme: computed(() => merged.theme as any),
1006
1022
  features: computed(() => merged.features as any),
1007
- navigate: vi.fn(),
1008
- notify: vi.fn(),
1009
- sendToPlatform: vi.fn(),
1010
1023
  })
1011
1024
  }
1012
1025
 
@@ -1045,7 +1058,7 @@ describe('AppTopBar', () => {
1045
1058
  expect(wrapper.find('.mint-topbar__identity').exists()).toBe(true)
1046
1059
  })
1047
1060
 
1048
- it('should pass plugin.color to PluginIcon as tone', () => {
1061
+ it('should pass plugin.color to PluginIcon as color', () => {
1049
1062
  const iconPath = 'M13 10V3L4 14h7v7l9-11h-7z'
1050
1063
  mockPlatformCtx({
1051
1064
  isIntegrated: true,
@@ -1058,7 +1071,7 @@ describe('AppTopBar', () => {
1058
1071
 
1059
1072
  const wrapper = createWrapper({ title: 'Test App' })
1060
1073
 
1061
- expect(wrapper.findComponent({ name: 'PluginIcon' }).props('tone')).toBe('#22C55E')
1074
+ expect(wrapper.findComponent({ name: 'PluginIcon' }).props('color')).toBe('#22C55E')
1062
1075
  })
1063
1076
 
1064
1077
  it('should ignore the custom icon slot when integrated', () => {
@@ -1124,44 +1137,34 @@ describe('AppTopBar', () => {
1124
1137
  expect(wrapper.findComponent({ name: 'PluginIcon' }).exists()).toBe(true)
1125
1138
  })
1126
1139
 
1127
- it('uses platform plugin nav metadata as the page selector when pageSelector is omitted', async () => {
1128
- const previousPath = window.location.pathname
1129
- window.history.pushState({}, '', '/test/analysis')
1140
+ it('should hand the platform page selector an element when pageSelector is omitted', () => {
1141
+ const unmount = vi.fn()
1142
+ const mountPageSelector = vi.fn((_element: HTMLElement) => unmount)
1143
+ const integratedWindow = window as Window & { __MINT_INTEGRATION__?: unknown }
1144
+ integratedWindow.__MINT_INTEGRATION__ = { mountPageSelector, bindExperimentStore: vi.fn() }
1130
1145
  try {
1131
- const pluginIcon = 'M13 10V3L4 14h7v7l9-11h-7z'
1132
- const analysisIcon = 'M4 19h16M7 16V8m5 8V4m5 12v-6'
1133
1146
  mockPlatformCtx({
1134
1147
  isIntegrated: true,
1135
1148
  plugin: {
1136
1149
  id: 'test',
1137
1150
  name: 'Dose Designer',
1138
1151
  version: '1.0',
1139
- icon: pluginIcon,
1140
1152
  route_prefix: '/test',
1141
1153
  api_prefix: '/api/test',
1142
1154
  nav_items: [
1143
1155
  { path: '/', label: 'Dashboard' },
1144
- { path: '/analysis', label: 'Analysis', icon: analysisIcon },
1156
+ { path: '/analysis', label: 'Analysis' },
1145
1157
  ],
1146
1158
  },
1147
1159
  })
1148
1160
 
1149
1161
  const wrapper = createWrapper()
1150
- await wrapper.get('.mint-page-selector__trigger').trigger('click')
1151
-
1152
- expect(wrapper.get('.mint-page-selector__label').text()).toBe('Analysis')
1153
- expect(wrapper.findAll('.mint-page-selector__item-label').map(item => item.text())).toEqual([
1154
- 'Dashboard',
1155
- 'Analysis',
1156
- ])
1157
- expect(wrapper.find('.mint-page-selector__item-hint').exists()).toBe(false)
1158
- const dropdownIcons = wrapper
1159
- .findAllComponents({ name: 'PluginIcon' })
1160
- .filter(icon => icon.classes().includes('mint-page-selector__metadata-icon'))
1161
- expect(dropdownIcons.map(icon => icon.props('icon'))).toEqual([pluginIcon, analysisIcon])
1162
- expect(wrapper.findAll('.mint-page-selector__item')[1].classes()).toContain('mint-page-selector__item--active')
1162
+ const host = wrapper.get('.mint-topbar__platform-page-selector').element
1163
+ wrapper.unmount()
1164
+
1165
+ expect([mountPageSelector.mock.calls[0]?.[0], unmount.mock.calls.length]).toEqual([host, 1])
1163
1166
  } finally {
1164
- window.history.pushState({}, '', previousPath)
1167
+ delete integratedWindow.__MINT_INTEGRATION__
1165
1168
  }
1166
1169
  })
1167
1170
 
@@ -1285,10 +1288,10 @@ describe('AppTopBar', () => {
1285
1288
  ])
1286
1289
  })
1287
1290
 
1288
- it('accepts string shorthand for pillNav', async () => {
1291
+ it('accepts string shorthand for spec.pills', async () => {
1289
1292
  const wrapper = createWrapper({
1290
- currentPillId: 'Run',
1291
- pillNav: ['Run', 'Results'],
1293
+ spec: { pills: ['Run', 'Results'] },
1294
+ pill: 'Run',
1292
1295
  })
1293
1296
 
1294
1297
  expect(wrapper.findAll('.mint-pill-nav__item').map(item => item.text())).toEqual([
@@ -1303,20 +1306,22 @@ describe('AppTopBar', () => {
1303
1306
  ])
1304
1307
  })
1305
1308
 
1306
- it('emits pill-option-select for pillNav dropdown children', async () => {
1309
+ it('emits pill-option-select for spec.pills dropdown children', async () => {
1307
1310
  const wrapper = createWrapper({
1308
- currentPillId: 'pca',
1309
- pillNav: [
1310
- { id: 'charts', label: 'Charts' },
1311
- {
1312
- id: 'visualize',
1313
- label: 'Visualize',
1314
- children: [
1315
- { id: 'pca', label: 'PCA', description: 'Principal component analysis' },
1316
- { id: 'heatmap', label: 'Heatmap', description: 'Metabolite heatmap' },
1317
- ],
1318
- },
1319
- ],
1311
+ spec: {
1312
+ pills: [
1313
+ { id: 'charts', label: 'Charts' },
1314
+ {
1315
+ id: 'visualize',
1316
+ label: 'Visualize',
1317
+ children: [
1318
+ { id: 'pca', label: 'PCA', description: 'Principal component analysis' },
1319
+ { id: 'heatmap', label: 'Heatmap', description: 'Metabolite heatmap' },
1320
+ ],
1321
+ },
1322
+ ],
1323
+ },
1324
+ pill: 'pca',
1320
1325
  })
1321
1326
 
1322
1327
  await wrapper.findAll('.mint-pill-nav__item')[1].trigger('click')